Changeset View
Changeset View
Standalone View
Standalone View
keyserver/src/push/utils.js
Show All 22 Lines | |||||
} from './providers.js'; | } from './providers.js'; | ||||
import type { | import type { | ||||
TargetedAPNsNotification, | TargetedAPNsNotification, | ||||
TargetedAndroidNotification, | TargetedAndroidNotification, | ||||
TargetedWebNotification, | TargetedWebNotification, | ||||
TargetedWNSNotification, | TargetedWNSNotification, | ||||
} from './types.js'; | } from './types.js'; | ||||
import { dbQuery, SQL } from '../database/database.js'; | import { dbQuery, SQL } from '../database/database.js'; | ||||
import { upload } from '../services/blob.js'; | import { upload, assignHolder } from '../services/blob.js'; | ||||
const fcmTokenInvalidationErrors = new Set([ | const fcmTokenInvalidationErrors = new Set([ | ||||
'messaging/registration-token-not-registered', | 'messaging/registration-token-not-registered', | ||||
'messaging/invalid-registration-token', | 'messaging/invalid-registration-token', | ||||
]); | ]); | ||||
const fcmMaxNotificationPayloadByteSize = 4000; | const fcmMaxNotificationPayloadByteSize = 4000; | ||||
const apnTokenInvalidationErrorCode = 410; | const apnTokenInvalidationErrorCode = 410; | ||||
const apnBadRequestErrorCode = 400; | const apnBadRequestErrorCode = 400; | ||||
▲ Show 20 Lines • Show All 352 Lines • ▼ Show 20 Lines | try { | ||||
invariant(wnsID, 'Missing WNS ID'); | invariant(wnsID, 'Missing WNS ID'); | ||||
return { wnsID }; | return { wnsID }; | ||||
} catch (err) { | } catch (err) { | ||||
return { error: err }; | return { error: err }; | ||||
} | } | ||||
} | } | ||||
async function blobServiceUpload(payload: string): Promise< | async function blobServiceUpload( | ||||
payload: string, | |||||
numberOfHolders: number, | |||||
): Promise< | |||||
| { | | { | ||||
+blobHolders: $ReadOnlyArray<string>, | |||||
+blobHash: string, | +blobHash: string, | ||||
+encryptionKey: string, | +encryptionKey: string, | ||||
} | } | ||||
| { +blobUploadError: string }, | | { +blobUploadError: string }, | ||||
> { | > { | ||||
const blobHolder = uuid.v4(); | const blobHolders = Array.from({ length: numberOfHolders }, () => uuid.v4()); | ||||
try { | try { | ||||
const { encryptionKey, encryptedPayload, encryptedPayloadHash } = | const { encryptionKey, encryptedPayload, encryptedPayloadHash } = | ||||
await encryptBlobPayload(payload); | await encryptBlobPayload(payload); | ||||
await upload(encryptedPayload, { | const [blobHolder, ...additionalHolders] = blobHolders; | ||||
const uploadPromise = upload(encryptedPayload, { | |||||
hash: encryptedPayloadHash, | hash: encryptedPayloadHash, | ||||
holder: blobHolder, | holder: blobHolder, | ||||
}); | }); | ||||
const additionalHoldersPromises = additionalHolders.map(holder => | |||||
assignHolder({ hash: encryptedPayloadHash, holder }), | |||||
); | |||||
await Promise.all([uploadPromise, Promise.all(additionalHoldersPromises)]); | |||||
return { | return { | ||||
blobHash: encryptedPayloadHash, | blobHash: encryptedPayloadHash, | ||||
blobHolders, | |||||
encryptionKey, | encryptionKey, | ||||
}; | }; | ||||
} catch (e) { | } catch (e) { | ||||
return { | return { | ||||
blobUploadError: e.message, | blobUploadError: e.message, | ||||
}; | }; | ||||
} | } | ||||
} | } | ||||
Show All 12 Lines |