- 
                Notifications
    
You must be signed in to change notification settings  - Fork 58
 
Description
My expectation of the way cache should work (it's a little unclear from the docs) is that the cache is a local cache, and @powersync/attachments should manage the size. The full set of current (not-orphaned/archived) data should remain on remote.
In testing, I found that if cacheLimit is set to a low value, e.g., 2, then only 2 items are preserved in (remote) storage.
So the cacheLimit effectively applies to both local and remote files.
Inspecting the source seems to confirm this -
The delete method deletes from both local and remote:
powersync-js/packages/attachments/src/AbstractAttachmentQueue.ts
Lines 224 to 250 in ba72a58
| async delete(record: AttachmentRecord, tx?: Transaction): Promise<void> { | |
| const deleteRecord = async (tx: Transaction) => { | |
| await tx.execute( | |
| `DELETE | |
| FROM ${this.table} | |
| WHERE id = ?`, | |
| [record.id] | |
| ); | |
| }; | |
| if (tx) { | |
| await deleteRecord(tx); | |
| } else { | |
| await this.powersync.writeTransaction(deleteRecord); | |
| } | |
| const localFilePathUri = this.getLocalUri(record.local_uri || this.getLocalFilePathSuffix(record.filename)); | |
| try { | |
| // Delete file on storage | |
| await this.storage.deleteFile(localFilePathUri, { | |
| filename: record.filename | |
| }); | |
| } catch (e) { | |
| this.logger.error(e); | |
| } | |
| } | 
delete() is called from expire() to delete the oldest synced or archived attachment:
powersync-js/packages/attachments/src/AbstractAttachmentQueue.ts
Lines 513 to 531 in ba72a58
| async expireCache() { | |
| const res = await this.powersync.getAll<AttachmentRecord>(`SELECT * FROM ${this.table} | |
| WHERE | |
| state = ${AttachmentState.SYNCED} OR state = ${AttachmentState.ARCHIVED} | |
| ORDER BY | |
| timestamp DESC | |
| LIMIT 100 OFFSET ${this.options.cacheLimit}`); | |
| if (res.length == 0) { | |
| return; | |
| } | |
| this.logger.debug(`Deleting ${res.length} attachments from cache...`); | |
| await this.powersync.writeTransaction(async (tx) => { | |
| for (const record of res) { | |
| await this.delete(record, tx); | |
| } | |
| }); | |
| } | 
Am I missing something here?