mirror of
https://github.com/shuaiplus/nodewarden.git
synced 2026-08-05 06:50:10 +00:00
36 lines
1.0 KiB
TypeScript
36 lines
1.0 KiB
TypeScript
type ShouldRunPeriodicCleanup = (lastRunAt: number, intervalMs: number) => boolean;
|
|
|
|
export async function consumeTotpLoginCounter(
|
|
db: D1Database,
|
|
shouldRunPeriodicCleanup: ShouldRunPeriodicCleanup,
|
|
lastCleanupAt: number,
|
|
cleanupIntervalMs: number,
|
|
userId: string,
|
|
timeCounter: number,
|
|
consumedAtMs: number,
|
|
markerTtlMs: number
|
|
): Promise<{ consumed: boolean; cleanedUpAt: number | null }> {
|
|
let cleanedUpAt: number | null = null;
|
|
|
|
if (shouldRunPeriodicCleanup(lastCleanupAt, cleanupIntervalMs)) {
|
|
await db
|
|
.prepare('DELETE FROM totp_login_replays WHERE consumed_at < ?')
|
|
.bind(consumedAtMs - markerTtlMs)
|
|
.run();
|
|
cleanedUpAt = consumedAtMs;
|
|
}
|
|
|
|
const result = await db
|
|
.prepare(
|
|
'INSERT INTO totp_login_replays(user_id, time_counter, consumed_at) VALUES(?, ?, ?) ' +
|
|
'ON CONFLICT(user_id, time_counter) DO NOTHING'
|
|
)
|
|
.bind(userId, timeCounter, consumedAtMs)
|
|
.run();
|
|
|
|
return {
|
|
consumed: (result.meta.changes ?? 0) > 0,
|
|
cleanedUpAt,
|
|
};
|
|
}
|