mirror of
https://github.com/shuaiplus/nodewarden.git
synced 2026-06-20 21:00:41 +00:00
47 lines
1.3 KiB
TypeScript
47 lines
1.3 KiB
TypeScript
type ShouldRunPeriodicCleanup = (lastRunAt: number, intervalMs: number) => boolean;
|
|
|
|
export async function ensureUsedAttachmentDownloadTokenTable(db: D1Database): Promise<void> {
|
|
await db
|
|
.prepare(
|
|
'CREATE TABLE IF NOT EXISTS used_attachment_download_tokens (' +
|
|
'jti TEXT PRIMARY KEY, ' +
|
|
'expires_at INTEGER NOT NULL' +
|
|
')'
|
|
)
|
|
.run();
|
|
}
|
|
|
|
export async function consumeAttachmentDownloadToken(
|
|
db: D1Database,
|
|
shouldRunPeriodicCleanup: ShouldRunPeriodicCleanup,
|
|
lastCleanupAt: number,
|
|
cleanupIntervalMs: number,
|
|
jti: string,
|
|
expUnixSeconds: number
|
|
): Promise<{ consumed: boolean; cleanedUpAt: number | null }> {
|
|
const nowMs = Date.now();
|
|
let cleanedUpAt: number | null = null;
|
|
|
|
if (shouldRunPeriodicCleanup(lastCleanupAt, cleanupIntervalMs)) {
|
|
await db
|
|
.prepare('DELETE FROM used_attachment_download_tokens WHERE expires_at < ?')
|
|
.bind(nowMs)
|
|
.run();
|
|
cleanedUpAt = nowMs;
|
|
}
|
|
|
|
const expiresAtMs = expUnixSeconds * 1000;
|
|
const result = await db
|
|
.prepare(
|
|
'INSERT INTO used_attachment_download_tokens(jti, expires_at) VALUES(?, ?) ' +
|
|
'ON CONFLICT(jti) DO NOTHING'
|
|
)
|
|
.bind(jti, expiresAtMs)
|
|
.run();
|
|
|
|
return {
|
|
consumed: (result.meta.changes ?? 0) > 0,
|
|
cleanedUpAt,
|
|
};
|
|
}
|