@serve.zone/dcrouter 17.7.1 → 17.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (94) hide show
  1. package/deno.json +1 -1
  2. package/dist_serve/bundle.js +712 -709
  3. package/dist_ts/00_commitinfo_data.js +1 -1
  4. package/dist_ts/classes.dcrouter.d.ts +2 -0
  5. package/dist_ts/classes.dcrouter.js +23 -1
  6. package/dist_ts/config/classes.db-seeder.js +9 -1
  7. package/dist_ts/config/classes.gateway-client-manager.js +3 -1
  8. package/dist_ts/config/helpers.http-redirects.js +28 -1
  9. package/dist_ts/config/helpers.special-forwards.js +12 -9
  10. package/dist_ts/db/documents/classes.cached.email.d.ts +7 -0
  11. package/dist_ts/db/documents/classes.cached.email.js +52 -2
  12. package/dist_ts/db/documents/classes.webpush-admission.doc.d.ts +19 -0
  13. package/dist_ts/db/documents/classes.webpush-admission.doc.js +124 -0
  14. package/dist_ts/db/documents/classes.webpush-binding.doc.d.ts +65 -0
  15. package/dist_ts/db/documents/classes.webpush-binding.doc.js +205 -0
  16. package/dist_ts/db/documents/classes.webpush-spool.doc.d.ts +44 -0
  17. package/dist_ts/db/documents/classes.webpush-spool.doc.js +277 -0
  18. package/dist_ts/db/documents/index.d.ts +3 -0
  19. package/dist_ts/db/documents/index.js +5 -1
  20. package/dist_ts/email/classes.accepted-email-spool.d.ts +5 -0
  21. package/dist_ts/email/classes.accepted-email-spool.js +28 -3
  22. package/dist_ts/email/classes.email-route-builder.js +5 -1
  23. package/dist_ts/email/classes.workapp-mail-manager.d.ts +5 -1
  24. package/dist_ts/email/classes.workapp-mail-manager.js +87 -12
  25. package/dist_ts/index.d.ts +1 -0
  26. package/dist_ts/index.js +3 -1
  27. package/dist_ts/opsserver/classes.opsserver.d.ts +2 -0
  28. package/dist_ts/opsserver/classes.opsserver.js +5 -1
  29. package/dist_ts/opsserver/handlers/gatewayclient.handler.js +33 -6
  30. package/dist_ts/opsserver/handlers/index.d.ts +2 -0
  31. package/dist_ts/opsserver/handlers/index.js +3 -1
  32. package/dist_ts/opsserver/handlers/webpush-app.handler.d.ts +9 -0
  33. package/dist_ts/opsserver/handlers/webpush-app.handler.js +66 -0
  34. package/dist_ts/opsserver/handlers/webpush-control.handler.d.ts +14 -0
  35. package/dist_ts/opsserver/handlers/webpush-control.handler.js +163 -0
  36. package/dist_ts/plugins.d.ts +5 -2
  37. package/dist_ts/plugins.js +6 -3
  38. package/dist_ts/remoteingress/edge-derivation-routes.js +5 -1
  39. package/dist_ts/security/classes.route-policy-augmenter.d.ts +10 -6
  40. package/dist_ts/security/classes.route-policy-augmenter.js +65 -51
  41. package/dist_ts/webpush/classes.webpush-crypto.d.ts +38 -0
  42. package/dist_ts/webpush/classes.webpush-crypto.js +231 -0
  43. package/dist_ts/webpush/classes.webpush-manager.d.ts +153 -0
  44. package/dist_ts/webpush/classes.webpush-manager.js +2374 -0
  45. package/dist_ts/webpush/classes.webpush-transport.d.ts +45 -0
  46. package/dist_ts/webpush/classes.webpush-transport.js +161 -0
  47. package/dist_ts/webpush/helpers.webpush-endpoint.d.ts +21 -0
  48. package/dist_ts/webpush/helpers.webpush-endpoint.js +111 -0
  49. package/dist_ts/webpush/index.d.ts +4 -0
  50. package/dist_ts/webpush/index.js +5 -0
  51. package/dist_ts/webpush/webpush-indexes.d.ts +11 -0
  52. package/dist_ts/webpush/webpush-indexes.js +123 -0
  53. package/dist_ts_interfaces/data/remoteingress.d.ts +14 -2
  54. package/dist_ts_interfaces/data/route-management.d.ts +2 -0
  55. package/dist_ts_interfaces/data/route-management.js +1 -1
  56. package/dist_ts_migrations/index.js +285 -11
  57. package/dist_ts_web/00_commitinfo_data.js +1 -1
  58. package/dist_ts_web/elements/network/ops-view-routes.js +41 -1
  59. package/dist_ts_web/elements/network/special-forward-dialog.js +2 -2
  60. package/package.json +14 -10
  61. package/readme.md +27 -0
  62. package/third-party-notices.md +37 -0
  63. package/ts/00_commitinfo_data.ts +1 -1
  64. package/ts/classes.dcrouter.ts +29 -0
  65. package/ts/config/classes.db-seeder.ts +8 -0
  66. package/ts/config/classes.gateway-client-manager.ts +2 -0
  67. package/ts/config/helpers.http-redirects.ts +31 -1
  68. package/ts/config/helpers.special-forwards.ts +11 -8
  69. package/ts/db/documents/classes.cached.email.ts +47 -0
  70. package/ts/db/documents/classes.webpush-admission.doc.ts +48 -0
  71. package/ts/db/documents/classes.webpush-binding.doc.ts +147 -0
  72. package/ts/db/documents/classes.webpush-spool.doc.ts +136 -0
  73. package/ts/db/documents/index.ts +5 -0
  74. package/ts/email/classes.accepted-email-spool.ts +41 -2
  75. package/ts/email/classes.email-route-builder.ts +4 -0
  76. package/ts/email/classes.workapp-mail-manager.ts +97 -10
  77. package/ts/index.ts +3 -0
  78. package/ts/opsserver/classes.opsserver.ts +4 -0
  79. package/ts/opsserver/handlers/gatewayclient.handler.ts +34 -4
  80. package/ts/opsserver/handlers/index.ts +2 -0
  81. package/ts/opsserver/handlers/webpush-app.handler.ts +105 -0
  82. package/ts/opsserver/handlers/webpush-control.handler.ts +257 -0
  83. package/ts/plugins.ts +6 -0
  84. package/ts/remoteingress/edge-derivation-routes.ts +4 -0
  85. package/ts/security/classes.route-policy-augmenter.ts +70 -57
  86. package/ts/webpush/classes.webpush-crypto.ts +306 -0
  87. package/ts/webpush/classes.webpush-manager.ts +3173 -0
  88. package/ts/webpush/classes.webpush-transport.ts +241 -0
  89. package/ts/webpush/helpers.webpush-endpoint.ts +150 -0
  90. package/ts/webpush/index.ts +4 -0
  91. package/ts/webpush/webpush-indexes.ts +141 -0
  92. package/ts_web/00_commitinfo_data.ts +1 -1
  93. package/ts_web/elements/network/ops-view-routes.ts +38 -0
  94. package/ts_web/elements/network/special-forward-dialog.ts +1 -1
@@ -0,0 +1,231 @@
1
+ import * as plugins from '../plugins.js';
2
+ const KEY_ID_PATTERN = /^[A-Za-z0-9._-]{1,64}$/;
3
+ const BASE64URL_KEY_PATTERN = /^[A-Za-z0-9_-]{43}$/;
4
+ const BASE64URL_VALUE_PATTERN = /^[A-Za-z0-9_-]+$/;
5
+ const KEY_RING_LIMIT = 8;
6
+ const AAD_SCHEMA_VERSION = 1;
7
+ function requirePlainObject(valueArg, labelArg) {
8
+ if (valueArg === null
9
+ || typeof valueArg !== 'object'
10
+ || Array.isArray(valueArg)
11
+ || Object.getPrototypeOf(valueArg) !== Object.prototype) {
12
+ throw new Error(`${labelArg} must be a plain object`);
13
+ }
14
+ return valueArg;
15
+ }
16
+ function decodeBase64UrlExact(valueArg, lengthArg, labelArg) {
17
+ if (typeof valueArg !== 'string' || !BASE64URL_VALUE_PATTERN.test(valueArg)) {
18
+ throw new Error(`${labelArg} must be unpadded base64url`);
19
+ }
20
+ const decoded = Buffer.from(valueArg, 'base64url');
21
+ if (decoded.length !== lengthArg || decoded.toString('base64url') !== valueArg) {
22
+ throw new Error(`${labelArg} has an invalid encoded length`);
23
+ }
24
+ return decoded;
25
+ }
26
+ function parseKeyRingSource(rawValueArg, labelArg) {
27
+ if (typeof rawValueArg === 'string') {
28
+ const trimmed = rawValueArg.trim();
29
+ if (!trimmed) {
30
+ throw new Error(`${labelArg} is empty`);
31
+ }
32
+ const jsonText = trimmed.startsWith('base64Object:')
33
+ ? Buffer.from(trimmed.slice('base64Object:'.length), 'base64').toString('utf8')
34
+ : trimmed;
35
+ try {
36
+ return requirePlainObject(JSON.parse(jsonText), labelArg);
37
+ }
38
+ catch (error) {
39
+ if (error.message.startsWith(`${labelArg} `))
40
+ throw error;
41
+ throw new Error(`${labelArg} must be valid JSON`, { cause: error });
42
+ }
43
+ }
44
+ return requirePlainObject(rawValueArg, labelArg);
45
+ }
46
+ export function parseWebPushKeyRing(rawValueArg, labelArg) {
47
+ const source = parseKeyRingSource(rawValueArg, labelArg);
48
+ const currentKeyId = source.currentKeyId;
49
+ if (typeof currentKeyId !== 'string' || !KEY_ID_PATTERN.test(currentKeyId)) {
50
+ throw new Error(`${labelArg}.currentKeyId is invalid`);
51
+ }
52
+ const rawKeys = requirePlainObject(source.keys, `${labelArg}.keys`);
53
+ const entries = Object.entries(rawKeys);
54
+ if (entries.length === 0 || entries.length > KEY_RING_LIMIT) {
55
+ throw new Error(`${labelArg}.keys must contain 1 to ${KEY_RING_LIMIT} keys`);
56
+ }
57
+ const keys = new Map();
58
+ const fingerprints = new Set();
59
+ for (const [keyId, encodedKey] of entries) {
60
+ if (!KEY_ID_PATTERN.test(keyId)) {
61
+ throw new Error(`${labelArg}.keys contains an invalid key id`);
62
+ }
63
+ if (typeof encodedKey !== 'string' || !BASE64URL_KEY_PATTERN.test(encodedKey)) {
64
+ throw new Error(`${labelArg}.keys.${keyId} must be a 32-byte unpadded base64url key`);
65
+ }
66
+ const key = decodeBase64UrlExact(encodedKey, 32, `${labelArg}.keys.${keyId}`);
67
+ const fingerprint = key.toString('hex');
68
+ if (fingerprints.has(fingerprint)) {
69
+ throw new Error(`${labelArg}.keys must not contain duplicate key material`);
70
+ }
71
+ fingerprints.add(fingerprint);
72
+ keys.set(keyId, key);
73
+ }
74
+ if (!keys.has(currentKeyId)) {
75
+ throw new Error(`${labelArg}.currentKeyId does not name a configured key`);
76
+ }
77
+ return {
78
+ currentKeyId,
79
+ keys,
80
+ };
81
+ }
82
+ export function assertDistinctWebPushKeyRings(encryptionRingArg, hmacRingArg) {
83
+ const encryptionFingerprints = new Set([...encryptionRingArg.keys.values()].map((keyArg) => keyArg.toString('hex')));
84
+ if ([...hmacRingArg.keys.values()]
85
+ .some((keyArg) => encryptionFingerprints.has(keyArg.toString('hex')))) {
86
+ throw new Error('Web Push encryption and HMAC key rings must use distinct key material');
87
+ }
88
+ }
89
+ export function buildWebPushAad(contextArg) {
90
+ for (const [name, value] of Object.entries(contextArg)) {
91
+ if (typeof value !== 'string' || !value.trim()) {
92
+ throw new Error(`Web Push AAD ${name} is missing`);
93
+ }
94
+ }
95
+ return Buffer.from(canonicalJson({
96
+ schemaVersion: AAD_SCHEMA_VERSION,
97
+ gatewayClientId: contextArg.gatewayClientId,
98
+ appInstanceId: contextArg.appInstanceId,
99
+ bindingId: contextArg.bindingId,
100
+ documentType: contextArg.documentType,
101
+ documentId: contextArg.documentId,
102
+ }), 'utf8');
103
+ }
104
+ function canonicalize(valueArg) {
105
+ if (valueArg === null
106
+ || typeof valueArg === 'string'
107
+ || typeof valueArg === 'boolean') {
108
+ return valueArg;
109
+ }
110
+ if (typeof valueArg === 'number') {
111
+ if (!Number.isFinite(valueArg))
112
+ throw new Error('Canonical JSON does not support non-finite numbers');
113
+ return valueArg;
114
+ }
115
+ if (Array.isArray(valueArg)) {
116
+ return valueArg.map((entryArg) => canonicalize(entryArg));
117
+ }
118
+ const value = requirePlainObject(valueArg, 'Canonical JSON value');
119
+ const result = {};
120
+ for (const key of Object.keys(value).sort()) {
121
+ if (value[key] === undefined) {
122
+ throw new Error('Canonical JSON does not support undefined values');
123
+ }
124
+ result[key] = canonicalize(value[key]);
125
+ }
126
+ return result;
127
+ }
128
+ export function canonicalJson(valueArg) {
129
+ return JSON.stringify(canonicalize(valueArg));
130
+ }
131
+ export class WebPushCrypto {
132
+ encryptionRing;
133
+ hmacRing;
134
+ constructor(encryptionRing, hmacRing) {
135
+ this.encryptionRing = encryptionRing;
136
+ this.hmacRing = hmacRing;
137
+ assertDistinctWebPushKeyRings(encryptionRing, hmacRing);
138
+ }
139
+ get currentEncryptionKeyId() {
140
+ return this.encryptionRing.currentKeyId;
141
+ }
142
+ get currentHmacKeyId() {
143
+ return this.hmacRing.currentKeyId;
144
+ }
145
+ encryptJson(valueArg, aadContextArg) {
146
+ const keyId = this.encryptionRing.currentKeyId;
147
+ const key = this.encryptionRing.keys.get(keyId);
148
+ if (!key)
149
+ throw new Error('Current Web Push encryption key is unavailable');
150
+ const nonce = plugins.crypto.randomBytes(12);
151
+ const cipher = plugins.crypto.createCipheriv('aes-256-gcm', key, nonce);
152
+ cipher.setAAD(buildWebPushAad(aadContextArg));
153
+ const ciphertext = Buffer.concat([
154
+ cipher.update(canonicalJson(valueArg), 'utf8'),
155
+ cipher.final(),
156
+ ]);
157
+ const tag = cipher.getAuthTag();
158
+ return {
159
+ version: 1,
160
+ algorithm: 'aes-256-gcm',
161
+ keyId,
162
+ nonce: nonce.toString('base64url'),
163
+ ciphertext: ciphertext.toString('base64url'),
164
+ tag: tag.toString('base64url'),
165
+ };
166
+ }
167
+ decryptJson(envelopeArg, aadContextArg) {
168
+ if (envelopeArg?.version !== 1
169
+ || envelopeArg.algorithm !== 'aes-256-gcm'
170
+ || typeof envelopeArg.keyId !== 'string'
171
+ || !KEY_ID_PATTERN.test(envelopeArg.keyId)) {
172
+ throw new Error('Web Push encrypted envelope is malformed');
173
+ }
174
+ const key = this.encryptionRing.keys.get(envelopeArg.keyId);
175
+ if (!key)
176
+ throw new Error('Web Push encrypted envelope references an unavailable key');
177
+ const nonce = decodeBase64UrlExact(envelopeArg.nonce, 12, 'Web Push envelope nonce');
178
+ const tag = decodeBase64UrlExact(envelopeArg.tag, 16, 'Web Push envelope tag');
179
+ if (typeof envelopeArg.ciphertext !== 'string'
180
+ || !envelopeArg.ciphertext
181
+ || !BASE64URL_VALUE_PATTERN.test(envelopeArg.ciphertext)) {
182
+ throw new Error('Web Push envelope ciphertext is malformed');
183
+ }
184
+ const ciphertext = Buffer.from(envelopeArg.ciphertext, 'base64url');
185
+ if (ciphertext.toString('base64url') !== envelopeArg.ciphertext) {
186
+ throw new Error('Web Push envelope ciphertext is malformed');
187
+ }
188
+ try {
189
+ const decipher = plugins.crypto.createDecipheriv('aes-256-gcm', key, nonce);
190
+ decipher.setAAD(buildWebPushAad(aadContextArg));
191
+ decipher.setAuthTag(tag);
192
+ const plaintext = Buffer.concat([
193
+ decipher.update(ciphertext),
194
+ decipher.final(),
195
+ ]).toString('utf8');
196
+ return JSON.parse(plaintext);
197
+ }
198
+ catch (error) {
199
+ throw new Error('Web Push encrypted envelope authentication failed', { cause: error });
200
+ }
201
+ }
202
+ hmac(domainArg, valueArg, keyIdArg = this.hmacRing.currentKeyId) {
203
+ const key = this.hmacRing.keys.get(keyIdArg);
204
+ if (!key)
205
+ throw new Error('Web Push HMAC key is unavailable');
206
+ const digest = plugins.crypto
207
+ .createHmac('sha256', key)
208
+ .update(`dcrouter:webpush:v1:${domainArg}\0`, 'utf8')
209
+ .update(valueArg, 'utf8')
210
+ .digest('base64url');
211
+ return {
212
+ keyId: keyIdArg,
213
+ digest,
214
+ };
215
+ }
216
+ verifyHmac(domainArg, valueArg, keyIdArg, expectedDigestArg) {
217
+ let actualDigest;
218
+ try {
219
+ actualDigest = this.hmac(domainArg, valueArg, keyIdArg).digest;
220
+ }
221
+ catch {
222
+ return false;
223
+ }
224
+ const actual = Buffer.from(actualDigest, 'base64url');
225
+ const expected = Buffer.from(expectedDigestArg, 'base64url');
226
+ return actual.length === expected.length
227
+ && actual.length > 0
228
+ && plugins.crypto.timingSafeEqual(actual, expected);
229
+ }
230
+ }
231
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy53ZWJwdXNoLWNyeXB0by5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3RzL3dlYnB1c2gvY2xhc3Nlcy53ZWJwdXNoLWNyeXB0by50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssT0FBTyxNQUFNLGVBQWUsQ0FBQztBQStCekMsTUFBTSxjQUFjLEdBQUcsd0JBQXdCLENBQUM7QUFDaEQsTUFBTSxxQkFBcUIsR0FBRyxxQkFBcUIsQ0FBQztBQUNwRCxNQUFNLHVCQUF1QixHQUFHLGtCQUFrQixDQUFDO0FBQ25ELE1BQU0sY0FBYyxHQUFHLENBQUMsQ0FBQztBQUN6QixNQUFNLGtCQUFrQixHQUFHLENBQUMsQ0FBQztBQUU3QixTQUFTLGtCQUFrQixDQUN6QixRQUFpQixFQUNqQixRQUFnQjtJQUVoQixJQUNFLFFBQVEsS0FBSyxJQUFJO1dBQ2QsT0FBTyxRQUFRLEtBQUssUUFBUTtXQUM1QixLQUFLLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQztXQUN2QixNQUFNLENBQUMsY0FBYyxDQUFDLFFBQVEsQ0FBQyxLQUFLLE1BQU0sQ0FBQyxTQUFTLEVBQ3ZELENBQUM7UUFDRCxNQUFNLElBQUksS0FBSyxDQUFDLEdBQUcsUUFBUSx5QkFBeUIsQ0FBQyxDQUFDO0lBQ3hELENBQUM7SUFDRCxPQUFPLFFBQW1DLENBQUM7QUFDN0MsQ0FBQztBQUVELFNBQVMsb0JBQW9CLENBQzNCLFFBQWlCLEVBQ2pCLFNBQWlCLEVBQ2pCLFFBQWdCO0lBRWhCLElBQUksT0FBTyxRQUFRLEtBQUssUUFBUSxJQUFJLENBQUMsdUJBQXVCLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUM7UUFDNUUsTUFBTSxJQUFJLEtBQUssQ0FBQyxHQUFHLFFBQVEsNkJBQTZCLENBQUMsQ0FBQztJQUM1RCxDQUFDO0lBQ0QsTUFBTSxPQUFPLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsV0FBVyxDQUFD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
@@ -0,0 +1,153 @@
1
+ import * as plugins from '../plugins.js';
2
+ import { WebPushBindingDoc, WebPushSpoolDoc, type IWebPushStoredCredential, type TWebPushControllerIntent } from '../db/index.js';
3
+ import { type IWebPushTransport } from './classes.webpush-transport.js';
4
+ type IWebPushBinding = plugins.servezoneInterfaces.data.IWebPushBinding;
5
+ type IWebPushCredentialOneTimeSecret = plugins.servezoneInterfaces.data.IWebPushCredentialOneTimeSecret;
6
+ type IWebPushDeliveryStatus = plugins.servezoneInterfaces.data.IWebPushDeliveryStatus;
7
+ type IWebPushNotificationPayload = plugins.servezoneInterfaces.data.IWebPushNotificationPayload;
8
+ type IWebPushResourceOwner = plugins.servezoneInterfaces.data.IWebPushResourceOwner;
9
+ type IWebPushServiceStatus = plugins.servezoneInterfaces.data.IWebPushServiceStatus;
10
+ type IWebPushSubscription = plugins.servezoneInterfaces.data.IWebPushSubscription;
11
+ type TWebPushBindingSync = plugins.servezoneInterfaces.requests.webpush.TWebPushBindingSync;
12
+ type IWebPushAppCredentialAuth = plugins.servezoneInterfaces.requests.webpush.IWebPushAppCredentialAuth;
13
+ type TWebPushCancellationTarget = plugins.servezoneInterfaces.data.TWebPushCancellationTarget;
14
+ type TWebPushDeliveryState = plugins.servezoneInterfaces.data.TWebPushDeliveryState;
15
+ type TWebPushUrgency = plugins.servezoneInterfaces.data.TWebPushUrgency;
16
+ interface IWebPushQenv {
17
+ getEnvVarOnDemand(nameArg: string): Promise<string | undefined>;
18
+ }
19
+ export interface IWebPushManagerOptions {
20
+ qenv?: IWebPushQenv;
21
+ transport?: IWebPushTransport;
22
+ startWorker?: boolean;
23
+ now?: () => number;
24
+ admissionPolicy?: Partial<IWebPushAdmissionPolicy>;
25
+ }
26
+ export interface IWebPushAdmissionPolicy {
27
+ shortWindowMs: number;
28
+ shortLimit: number;
29
+ longWindowMs: number;
30
+ longLimit: number;
31
+ }
32
+ export interface IWebPushAuthenticatedBinding {
33
+ binding: WebPushBindingDoc;
34
+ credential: IWebPushStoredCredential;
35
+ }
36
+ export interface IWebPushBindingSyncResult {
37
+ binding: IWebPushBinding;
38
+ credential?: IWebPushCredentialOneTimeSecret;
39
+ }
40
+ /**
41
+ * Durable controller ordering token. The controller id and epoch remain stable
42
+ * for an owner, while generation increases for every desired-state mutation.
43
+ */
44
+ export interface IWebPushControllerMutation {
45
+ id: string;
46
+ epoch: string;
47
+ generation: number;
48
+ operationId: string;
49
+ intent: TWebPushControllerIntent;
50
+ }
51
+ export interface IWebPushBindingDelete {
52
+ id?: string;
53
+ owner: IWebPushResourceOwner;
54
+ controller: IWebPushControllerMutation;
55
+ }
56
+ export interface IWebPushEnqueueResult {
57
+ accepted: boolean;
58
+ spoolItemId: string;
59
+ }
60
+ export interface IWebPushCancelResult {
61
+ cancelledCount: number;
62
+ alreadyTerminalCount: number;
63
+ }
64
+ export declare function toPublicWebPushBinding(bindingArg: WebPushBindingDoc): IWebPushBinding;
65
+ export declare function toPublicWebPushDelivery(spoolArg: WebPushSpoolDoc): IWebPushDeliveryStatus;
66
+ export declare function buildWebPushTerminalUpdate(optionsArg: {
67
+ state: Extract<TWebPushDeliveryState, 'pushServiceAccepted' | 'invalidSubscription' | 'failed' | 'expired' | 'cancelled'>;
68
+ now: number;
69
+ pushServiceStatusCode?: number;
70
+ errorCode?: string;
71
+ }): Record<string, unknown>;
72
+ export declare class WebPushManager {
73
+ private readonly qenv;
74
+ private readonly transport;
75
+ private readonly startWorker;
76
+ private readonly now;
77
+ private readonly admissionPolicy;
78
+ private enabled;
79
+ private started;
80
+ private ready;
81
+ private crypto?;
82
+ private vapidSubject?;
83
+ private workerTimer?;
84
+ private activeWorkerCycle?;
85
+ private expiredCredentialOverlapCursor?;
86
+ private expiredCredentialRecoveryCursor?;
87
+ private retiredVapidCursor?;
88
+ private inactiveLifecycleCursor?;
89
+ constructor(optionsArg?: IWebPushManagerOptions);
90
+ get isEnabled(): boolean;
91
+ get isReady(): boolean;
92
+ start(): Promise<void>;
93
+ stop(): Promise<void>;
94
+ getUnavailableServiceStatus(): IWebPushServiceStatus;
95
+ listBindings(ownerFilterArg?: Partial<IWebPushResourceOwner>): Promise<IWebPushBinding[]>;
96
+ getBindingById(idArg: string): Promise<WebPushBindingDoc | null>;
97
+ getBindingByCredentialId(credentialIdArg: string): Promise<WebPushBindingDoc | null>;
98
+ syncBinding(bindingArg: TWebPushBindingSync, controllerArg: IWebPushControllerMutation, createdByArg: string): Promise<IWebPushBindingSyncResult>;
99
+ private resumeControllerSyncReplay;
100
+ deleteBinding(deleteArg: IWebPushBindingDelete, deletedByArg: string): Promise<boolean>;
101
+ private resumeControllerDeleteReplay;
102
+ rotateCredential(credentialIdArg: string): Promise<IWebPushCredentialOneTimeSecret>;
103
+ rotateVapidKey(bindingIdArg: string): Promise<IWebPushBinding>;
104
+ authenticateAppCredential(authArg: IWebPushAppCredentialAuth): Promise<IWebPushAuthenticatedBinding>;
105
+ getServiceStatus(authArg: IWebPushAppCredentialAuth): Promise<IWebPushServiceStatus>;
106
+ enqueue(authArg: IWebPushAppCredentialAuth, requestArg: {
107
+ idempotencyKey: string;
108
+ subscriptionId: string;
109
+ subscription: IWebPushSubscription;
110
+ vapidKeyId: string;
111
+ payload: IWebPushNotificationPayload;
112
+ ttlSeconds?: number;
113
+ urgency?: TWebPushUrgency;
114
+ collapseKey?: string;
115
+ }): Promise<IWebPushEnqueueResult>;
116
+ getDeliveryStatus(authArg: IWebPushAppCredentialAuth, spoolItemIdArg: string): Promise<IWebPushDeliveryStatus | undefined>;
117
+ cancel(authArg: IWebPushAppCredentialAuth, targetArg: TWebPushCancellationTarget): Promise<IWebPushCancelResult>;
118
+ processDueDeliveriesOnce(limitArg?: number): Promise<number>;
119
+ private requirePersistenceReady;
120
+ private requireReady;
121
+ private bindingOwner;
122
+ private assertBindingOwner;
123
+ private credentialHmacValue;
124
+ private createCredential;
125
+ private credentialRotationRecoveryAad;
126
+ private replayCredentialRotation;
127
+ private createVapidKey;
128
+ private spoolAadBase;
129
+ private assertBindingLifecycleActive;
130
+ private reserveAdmission;
131
+ private cancelSpoolIfLifecycleChanged;
132
+ private scrubDeletedBindingLifecycle;
133
+ private cleanupExpiredCredentialOverlaps;
134
+ private cleanupExpiredCredentialRotationRecoveries;
135
+ private cleanupRetiredVapidKeys;
136
+ private runMaintenanceOnce;
137
+ private cleanupInactiveBindingLifecycles;
138
+ private selectBindingMaintenanceBatch;
139
+ private requestBindingLifecyclesBeforeCancellation;
140
+ private drainBindingLifecyclesBefore;
141
+ private waitForBindingLifecyclesBeforeDrain;
142
+ private finishStaleCancelledSending;
143
+ private finishStaleCancelledSendingBefore;
144
+ private cancelWithinBinding;
145
+ private expireDueItems;
146
+ private claimNextItem;
147
+ private processClaimedItem;
148
+ private finishTerminal;
149
+ private deferOrFinish;
150
+ private retryDelayMs;
151
+ private scheduleWorker;
152
+ }
153
+ export {};