-
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?