From 44020541e881e4086d0415d4f2986bd0da532c43 Mon Sep 17 00:00:00 2001 From: qaz741wsd856 Date: Mon, 27 Apr 2026 10:38:48 +0800 Subject: [PATCH] refactor: make notifyUserVaultSync and notifyUserLogout functions non-blocking by using waitUntil --- src/durable/notifications-hub.ts | 14 ++++++------- src/handlers/attachments.ts | 14 ++++++------- src/handlers/ciphers.ts | 36 ++++++++++++++++---------------- src/handlers/devices.ts | 6 +++--- src/handlers/folders.ts | 14 ++++++------- src/handlers/import.ts | 2 +- src/handlers/sends-private.ts | 16 +++++++------- src/handlers/sends-public.ts | 8 +++---- src/handlers/sends-shared.ts | 6 +++--- 9 files changed, 58 insertions(+), 58 deletions(-) diff --git a/src/durable/notifications-hub.ts b/src/durable/notifications-hub.ts index 6d582e3..8c5dcf0 100644 --- a/src/durable/notifications-hub.ts +++ b/src/durable/notifications-hub.ts @@ -1,4 +1,4 @@ -import { DurableObject } from 'cloudflare:workers'; +import { DurableObject, waitUntil } from 'cloudflare:workers'; import type { Env } from '../types'; const SIGNALR_RECORD_SEPARATOR = 0x1e; @@ -362,21 +362,21 @@ export class NotificationsHub extends DurableObject { } } -export async function notifyUserVaultSync( +export function notifyUserVaultSync( env: Env, userId: string, revisionDate: string, contextId?: string | null -): Promise { - return notifyUserUpdate(env, userId, SIGNALR_UPDATE_TYPE_SYNC_VAULT, revisionDate, contextId ?? null, null); +): void { + waitUntil(notifyUserUpdate(env, userId, SIGNALR_UPDATE_TYPE_SYNC_VAULT, revisionDate, contextId ?? null, null)); } -export async function notifyUserLogout( +export function notifyUserLogout( env: Env, userId: string, targetDeviceIdentifier?: string | null -): Promise { - return notifyUserUpdate(env, userId, SIGNALR_UPDATE_TYPE_LOG_OUT, new Date().toISOString(), null, targetDeviceIdentifier ?? null); +): void { + waitUntil(notifyUserUpdate(env, userId, SIGNALR_UPDATE_TYPE_LOG_OUT, new Date().toISOString(), null, targetDeviceIdentifier ?? null)); } export async function getOnlineUserDevices(env: Env, userId: string): Promise { diff --git a/src/handlers/attachments.ts b/src/handlers/attachments.ts index 14a3810..b7a2b2c 100644 --- a/src/handlers/attachments.ts +++ b/src/handlers/attachments.ts @@ -21,13 +21,13 @@ import { putBlobObject, } from '../services/blob-store'; -async function notifyVaultSyncForRequest( +function notifyVaultSyncForRequest( request: Request, env: Env, userId: string, revisionDate: string -): Promise { - await notifyUserVaultSync(env, userId, revisionDate, readActingDeviceIdentifier(request)); +): void { + notifyUserVaultSync(env, userId, revisionDate, readActingDeviceIdentifier(request)); } // Format file size to human readable @@ -93,7 +93,7 @@ async function processAttachmentUpload( const revisionInfo = await storage.updateCipherRevisionDate(cipherId); if (revisionInfo) { - await notifyVaultSyncForRequest(request, env, revisionInfo.userId, revisionInfo.revisionDate); + notifyVaultSyncForRequest(request, env, revisionInfo.userId, revisionInfo.revisionDate); } return new Response(null, { status: 201 }); @@ -153,7 +153,7 @@ export async function handleCreateAttachment( // Update cipher revision date const revisionInfo = await storage.updateCipherRevisionDate(cipherId); if (revisionInfo) { - await notifyVaultSyncForRequest(request, env, revisionInfo.userId, revisionInfo.revisionDate); + notifyVaultSyncForRequest(request, env, revisionInfo.userId, revisionInfo.revisionDate); } // Get updated cipher for response @@ -324,7 +324,7 @@ export async function handleUpdateAttachmentMetadata( await storage.saveAttachment(attachment); const revisionInfo = await storage.updateCipherRevisionDate(cipherId); if (revisionInfo) { - await notifyVaultSyncForRequest(request, env, revisionInfo.userId, revisionInfo.revisionDate); + notifyVaultSyncForRequest(request, env, revisionInfo.userId, revisionInfo.revisionDate); } return jsonResponse({ @@ -432,7 +432,7 @@ export async function handleDeleteAttachment( // Update cipher revision date const revisionInfo = await storage.updateCipherRevisionDate(cipherId); if (revisionInfo) { - await notifyVaultSyncForRequest(request, env, revisionInfo.userId, revisionInfo.revisionDate); + notifyVaultSyncForRequest(request, env, revisionInfo.userId, revisionInfo.revisionDate); } // Get updated cipher for response diff --git a/src/handlers/ciphers.ts b/src/handlers/ciphers.ts index 9e7f148..8c09026 100644 --- a/src/handlers/ciphers.ts +++ b/src/handlers/ciphers.ts @@ -24,13 +24,13 @@ function normalizeOptionalId(value: unknown): string | null { return normalized ? normalized : null; } -async function notifyVaultSyncForRequest( +function notifyVaultSyncForRequest( request: Request, env: Env, userId: string, revisionDate: string -): Promise { - await notifyUserVaultSync(env, userId, revisionDate, readActingDeviceIdentifier(request)); +): void { + notifyUserVaultSync(env, userId, revisionDate, readActingDeviceIdentifier(request)); } function getAliasedProp(source: any, aliases: string[]): { present: boolean; value: any } { @@ -304,7 +304,7 @@ export async function handleCreateCipher(request: Request, env: Env, userId: str await storage.saveCipher(cipher); const revisionDate = await storage.updateRevisionDate(userId); - await notifyVaultSyncForRequest(request, env, userId, revisionDate); + notifyVaultSyncForRequest(request, env, userId, revisionDate); return jsonResponse( cipherToResponse(cipher, []), @@ -398,7 +398,7 @@ export async function handleUpdateCipher(request: Request, env: Env, userId: str await storage.saveCipher(cipher); const revisionDate = await storage.updateRevisionDate(userId); - await notifyVaultSyncForRequest(request, env, userId, revisionDate); + notifyVaultSyncForRequest(request, env, userId, revisionDate); const attachments = await storage.getAttachmentsByCipher(cipher.id); return jsonResponse( @@ -421,7 +421,7 @@ export async function handleDeleteCipher(request: Request, env: Env, userId: str syncCipherComputedAliases(cipher); await storage.saveCipher(cipher); const revisionDate = await storage.updateRevisionDate(userId); - await notifyVaultSyncForRequest(request, env, userId, revisionDate); + notifyVaultSyncForRequest(request, env, userId, revisionDate); return jsonResponse( cipherToResponse(cipher, []) @@ -445,7 +445,7 @@ export async function handleDeleteCipherCompat(request: Request, env: Env, userI await deleteAllAttachmentsForCipher(env, id); await storage.deleteCipher(id, userId); const revisionDate = await storage.updateRevisionDate(userId); - await notifyVaultSyncForRequest(request, env, userId, revisionDate); + notifyVaultSyncForRequest(request, env, userId, revisionDate); return new Response(null, { status: 204 }); } @@ -466,7 +466,7 @@ export async function handlePermanentDeleteCipher(request: Request, env: Env, us await storage.deleteCipher(id, userId); const revisionDate = await storage.updateRevisionDate(userId); - await notifyVaultSyncForRequest(request, env, userId, revisionDate); + notifyVaultSyncForRequest(request, env, userId, revisionDate); return new Response(null, { status: 204 }); } @@ -485,7 +485,7 @@ export async function handleRestoreCipher(request: Request, env: Env, userId: st syncCipherComputedAliases(cipher); await storage.saveCipher(cipher); const revisionDate = await storage.updateRevisionDate(userId); - await notifyVaultSyncForRequest(request, env, userId, revisionDate); + notifyVaultSyncForRequest(request, env, userId, revisionDate); return jsonResponse( cipherToResponse(cipher, []) @@ -524,7 +524,7 @@ export async function handlePartialUpdateCipher(request: Request, env: Env, user await storage.saveCipher(cipher); const revisionDate = await storage.updateRevisionDate(userId); - await notifyVaultSyncForRequest(request, env, userId, revisionDate); + notifyVaultSyncForRequest(request, env, userId, revisionDate); return jsonResponse( cipherToResponse(cipher, []) @@ -554,7 +554,7 @@ export async function handleBulkMoveCiphers(request: Request, env: Env, userId: const revisionDate = await storage.bulkMoveCiphers(body.ids, folderId, userId); if (revisionDate) { - await notifyVaultSyncForRequest(request, env, userId, revisionDate); + notifyVaultSyncForRequest(request, env, userId, revisionDate); } return new Response(null, { status: 204 }); @@ -600,7 +600,7 @@ export async function handleArchiveCipher(request: Request, env: Env, userId: st normalizeCipherForStorage(cipher); await storage.saveCipher(cipher); const revisionDate = await storage.updateRevisionDate(userId); - await notifyVaultSyncForRequest(request, env, userId, revisionDate); + notifyVaultSyncForRequest(request, env, userId, revisionDate); const attachments = await storage.getAttachmentsByCipher(cipher.id); return jsonResponse( @@ -622,7 +622,7 @@ export async function handleUnarchiveCipher(request: Request, env: Env, userId: normalizeCipherForStorage(cipher); await storage.saveCipher(cipher); const revisionDate = await storage.updateRevisionDate(userId); - await notifyVaultSyncForRequest(request, env, userId, revisionDate); + notifyVaultSyncForRequest(request, env, userId, revisionDate); const attachments = await storage.getAttachmentsByCipher(cipher.id); return jsonResponse( @@ -648,7 +648,7 @@ export async function handleBulkArchiveCiphers(request: Request, env: Env, userI const revisionDate = await storage.bulkArchiveCiphers(ids, userId); if (revisionDate) { - await notifyVaultSyncForRequest(request, env, userId, revisionDate); + notifyVaultSyncForRequest(request, env, userId, revisionDate); } return buildCipherListResponse(request, storage, userId, ids); @@ -672,7 +672,7 @@ export async function handleBulkUnarchiveCiphers(request: Request, env: Env, use const revisionDate = await storage.bulkUnarchiveCiphers(ids, userId); if (revisionDate) { - await notifyVaultSyncForRequest(request, env, userId, revisionDate); + notifyVaultSyncForRequest(request, env, userId, revisionDate); } return buildCipherListResponse(request, storage, userId, ids); @@ -695,7 +695,7 @@ export async function handleBulkDeleteCiphers(request: Request, env: Env, userId const revisionDate = await storage.bulkSoftDeleteCiphers(body.ids, userId); if (revisionDate) { - await notifyVaultSyncForRequest(request, env, userId, revisionDate); + notifyVaultSyncForRequest(request, env, userId, revisionDate); } return new Response(null, { status: 204 }); @@ -718,7 +718,7 @@ export async function handleBulkRestoreCiphers(request: Request, env: Env, userI const revisionDate = await storage.bulkRestoreCiphers(body.ids, userId); if (revisionDate) { - await notifyVaultSyncForRequest(request, env, userId, revisionDate); + notifyVaultSyncForRequest(request, env, userId, revisionDate); } return new Response(null, { status: 204 }); @@ -750,7 +750,7 @@ export async function handleBulkPermanentDeleteCiphers(request: Request, env: En const revisionDate = await storage.bulkDeleteCiphers(ids, userId); if (revisionDate) { - await notifyVaultSyncForRequest(request, env, userId, revisionDate); + notifyVaultSyncForRequest(request, env, userId, revisionDate); } return new Response(null, { status: 204 }); diff --git a/src/handlers/devices.ts b/src/handlers/devices.ts index 77e5269..b11406e 100644 --- a/src/handlers/devices.ts +++ b/src/handlers/devices.ts @@ -284,7 +284,7 @@ export async function handleDeleteDevice( await storage.deleteRefreshTokensByDevice(userId, normalized); const deleted = await storage.deleteDevice(userId, normalized); if (deleted) { - await notifyUserLogout(env, userId, normalized); + notifyUserLogout(env, userId, normalized); } return jsonResponse({ success: deleted }); } @@ -327,7 +327,7 @@ export async function handleDeleteAllDevices(request: Request, env: Env, userId: user.securityStamp = generateUUID(); user.updatedAt = new Date().toISOString(); await storage.saveUser(user); - await notifyUserLogout(env, userId, null); + notifyUserLogout(env, userId, null); return jsonResponse({ success: true, removedTrusted, removedSessions: removedSessions ?? 0, removedDevices }); } @@ -458,7 +458,7 @@ export async function handleDeactivateDevice( await storage.deleteRefreshTokensByDevice(userId, normalized); const deleted = await storage.deleteDevice(userId, normalized); if (deleted) { - await notifyUserLogout(env, userId, normalized); + notifyUserLogout(env, userId, normalized); } return jsonResponse({ success: deleted }); } diff --git a/src/handlers/folders.ts b/src/handlers/folders.ts index b82dd2b..411c0d1 100644 --- a/src/handlers/folders.ts +++ b/src/handlers/folders.ts @@ -6,13 +6,13 @@ import { readActingDeviceIdentifier } from '../utils/device'; import { generateUUID } from '../utils/uuid'; import { parsePagination, encodeContinuationToken } from '../utils/pagination'; -async function notifyVaultSyncForRequest( +function notifyVaultSyncForRequest( request: Request, env: Env, userId: string, revisionDate: string -): Promise { - await notifyUserVaultSync(env, userId, revisionDate, readActingDeviceIdentifier(request)); +): void { + notifyUserVaultSync(env, userId, revisionDate, readActingDeviceIdentifier(request)); } // Convert internal folder to API response format @@ -88,7 +88,7 @@ export async function handleCreateFolder(request: Request, env: Env, userId: str await storage.saveFolder(folder); const revisionDate = await storage.updateRevisionDate(userId); - await notifyVaultSyncForRequest(request, env, userId, revisionDate); + notifyVaultSyncForRequest(request, env, userId, revisionDate); return jsonResponse(folderToResponse(folder), 200); } @@ -116,7 +116,7 @@ export async function handleUpdateFolder(request: Request, env: Env, userId: str await storage.saveFolder(folder); const revisionDate = await storage.updateRevisionDate(userId); - await notifyVaultSyncForRequest(request, env, userId, revisionDate); + notifyVaultSyncForRequest(request, env, userId, revisionDate); return jsonResponse(folderToResponse(folder)); } @@ -133,7 +133,7 @@ export async function handleDeleteFolder(request: Request, env: Env, userId: str await storage.clearFolderFromCiphers(userId, id); await storage.deleteFolder(id, userId); const revisionDate = await storage.updateRevisionDate(userId); - await notifyVaultSyncForRequest(request, env, userId, revisionDate); + notifyVaultSyncForRequest(request, env, userId, revisionDate); return new Response(null, { status: 204 }); } @@ -156,7 +156,7 @@ export async function handleBulkDeleteFolders(request: Request, env: Env, userId const revisionDate = await storage.bulkDeleteFolders(ids, userId); if (revisionDate) { - await notifyVaultSyncForRequest(request, env, userId, revisionDate); + notifyVaultSyncForRequest(request, env, userId, revisionDate); } return new Response(null, { status: 204 }); diff --git a/src/handlers/import.ts b/src/handlers/import.ts index bfaa1a9..c6a08fa 100644 --- a/src/handlers/import.ts +++ b/src/handlers/import.ts @@ -289,7 +289,7 @@ export async function handleCiphersImport(request: Request, env: Env, userId: st // Update revision date const revisionDate = await storage.updateRevisionDate(userId); - await notifyUserVaultSync(env, userId, revisionDate, readActingDeviceIdentifier(request)); + notifyUserVaultSync(env, userId, revisionDate, readActingDeviceIdentifier(request)); if (returnCipherMap) { return jsonResponse({ diff --git a/src/handlers/sends-private.ts b/src/handlers/sends-private.ts index ced00e4..8686acc 100644 --- a/src/handlers/sends-private.ts +++ b/src/handlers/sends-private.ts @@ -76,7 +76,7 @@ async function processSendFileUpload( const storage = new StorageService(env.DB); const revisionDate = await storage.updateRevisionDate(send.userId); - await notifyVaultSyncForRequest(request, env, send.userId, revisionDate); + notifyVaultSyncForRequest(request, env, send.userId, revisionDate); return new Response(null, { status: 201 }); } @@ -226,7 +226,7 @@ export async function handleCreateSend(request: Request, env: Env, userId: strin await storage.saveSend(send); const revisionDate = await storage.updateRevisionDate(userId); - await notifyVaultSyncForRequest(request, env, userId, revisionDate); + notifyVaultSyncForRequest(request, env, userId, revisionDate); return jsonResponse(sendToResponse(send)); } @@ -349,7 +349,7 @@ export async function handleCreateFileSendV2(request: Request, env: Env, userId: await storage.saveSend(send); const revisionDate = await storage.updateRevisionDate(userId); - await notifyVaultSyncForRequest(request, env, userId, revisionDate); + notifyVaultSyncForRequest(request, env, userId, revisionDate); const jwtSecret = getSafeJwtSecret(env); if (!jwtSecret) { return errorResponse('Server configuration error', 500); @@ -596,7 +596,7 @@ export async function handleUpdateSend(request: Request, env: Env, userId: strin send.updatedAt = new Date().toISOString(); await storage.saveSend(send); const revisionDate = await storage.updateRevisionDate(userId); - await notifyVaultSyncForRequest(request, env, userId, revisionDate); + notifyVaultSyncForRequest(request, env, userId, revisionDate); return jsonResponse(sendToResponse(send)); } @@ -619,7 +619,7 @@ export async function handleDeleteSend(request: Request, env: Env, userId: strin await storage.deleteSend(sendId, userId); const revisionDate = await storage.updateRevisionDate(userId); - await notifyVaultSyncForRequest(request, env, userId, revisionDate); + notifyVaultSyncForRequest(request, env, userId, revisionDate); return new Response(null, { status: 200 }); } @@ -650,7 +650,7 @@ export async function handleBulkDeleteSends(request: Request, env: Env, userId: const revisionDate = await storage.bulkDeleteSends(body.ids, userId); if (revisionDate) { - await notifyVaultSyncForRequest(request, env, userId, revisionDate); + notifyVaultSyncForRequest(request, env, userId, revisionDate); } return new Response(null, { status: 200 }); @@ -668,7 +668,7 @@ export async function handleRemoveSendPassword(request: Request, env: Env, userI send.updatedAt = new Date().toISOString(); await storage.saveSend(send); const revisionDate = await storage.updateRevisionDate(userId); - await notifyVaultSyncForRequest(request, env, userId, revisionDate); + notifyVaultSyncForRequest(request, env, userId, revisionDate); return jsonResponse(sendToResponse(send)); } @@ -686,7 +686,7 @@ export async function handleRemoveSendAuth(request: Request, env: Env, userId: s send.updatedAt = new Date().toISOString(); await storage.saveSend(send); const revisionDate = await storage.updateRevisionDate(userId); - await notifyVaultSyncForRequest(request, env, userId, revisionDate); + notifyVaultSyncForRequest(request, env, userId, revisionDate); return jsonResponse(sendToResponse(send)); } diff --git a/src/handlers/sends-public.ts b/src/handlers/sends-public.ts index 7537d53..064fbce 100644 --- a/src/handlers/sends-public.ts +++ b/src/handlers/sends-public.ts @@ -89,7 +89,7 @@ export async function handleAccessSend(request: Request, env: Env, accessId: str } send.accessCount += 1; const revisionDate = await storage.updateRevisionDate(send.userId); - await notifyVaultSyncForRequest(request, env, send.userId, revisionDate); + notifyVaultSyncForRequest(request, env, send.userId, revisionDate); } const creatorIdentifier = await getCreatorIdentifier(storage, send); @@ -162,7 +162,7 @@ export async function handleAccessSendFile( } send.accessCount += 1; const revisionDate = await storage.updateRevisionDate(send.userId); - await notifyVaultSyncForRequest(request, env, send.userId, revisionDate); + notifyVaultSyncForRequest(request, env, send.userId, revisionDate); const token = await createSendFileDownloadToken(send.id, fileId, secret); const url = new URL(request.url); @@ -202,7 +202,7 @@ export async function handleAccessSendV2(request: Request, env: Env): Promise { - await notifyUserVaultSync(env, userId, revisionDate, readActingDeviceIdentifier(request)); +): void { + notifyUserVaultSync(env, userId, revisionDate, readActingDeviceIdentifier(request)); } export function getAliasedProp(source: unknown, aliases: string[]): { present: boolean; value: unknown } {