@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,163 @@
1
+ import * as plugins from '../../plugins.js';
2
+ import { requireGatewayMachineAuth, } from '../helpers/gateway-client-auth.js';
3
+ export class WebPushControlHandler {
4
+ opsServerRef;
5
+ typedrouter = new plugins.typedrequest.TypedRouter();
6
+ constructor(opsServerRef) {
7
+ this.opsServerRef = opsServerRef;
8
+ this.opsServerRef.typedrouter.addTypedRouter(this.typedrouter);
9
+ this.registerHandlers();
10
+ }
11
+ registerHandlers() {
12
+ this.typedrouter.addTypedHandler(new plugins.typedrequest.TypedHandler('listWebPushBindings', async (dataArg) => {
13
+ const auth = await this.requireControlAuth(dataArg.auth, 'readWebPush');
14
+ const owner = this.scopeOwnerFilter(auth, dataArg.owner);
15
+ const manager = this.opsServerRef.dcRouterRef.webPushManager;
16
+ return {
17
+ bindings: await manager.listBindings(owner),
18
+ };
19
+ }));
20
+ this.typedrouter.addTypedHandler(new plugins.typedrequest.TypedHandler('syncWebPushBinding', async (dataArg) => {
21
+ try {
22
+ const request = dataArg;
23
+ const auth = await this.requireControlAuth(dataArg.auth, 'manageWebPush');
24
+ this.assertExactOwner(auth, dataArg.binding.owner);
25
+ const result = await this.opsServerRef.dcRouterRef.webPushManager.syncBinding(dataArg.binding, request.controller, auth.userId);
26
+ return {
27
+ success: true,
28
+ binding: result.binding,
29
+ credential: result.credential,
30
+ };
31
+ }
32
+ catch (error) {
33
+ return {
34
+ success: false,
35
+ message: this.safeMessage(error),
36
+ };
37
+ }
38
+ }));
39
+ this.typedrouter.addTypedHandler(new plugins.typedrequest.TypedHandler('deleteWebPushBinding', async (dataArg) => {
40
+ try {
41
+ const request = dataArg;
42
+ const auth = await this.requireControlAuth(dataArg.auth, 'manageWebPush');
43
+ this.assertExactOwner(auth, request.owner);
44
+ return {
45
+ success: await this.opsServerRef.dcRouterRef.webPushManager.deleteBinding({
46
+ ...(request.id !== undefined ? { id: request.id } : {}),
47
+ owner: request.owner,
48
+ controller: request.controller,
49
+ }, auth.userId),
50
+ };
51
+ }
52
+ catch (error) {
53
+ return {
54
+ success: false,
55
+ message: this.safeMessage(error),
56
+ };
57
+ }
58
+ }));
59
+ this.typedrouter.addTypedHandler(new plugins.typedrequest.TypedHandler('rotateWebPushCredential', async (dataArg) => {
60
+ try {
61
+ const auth = await this.requireControlAuth(dataArg.auth, 'manageWebPush');
62
+ const manager = this.opsServerRef.dcRouterRef.webPushManager;
63
+ const binding = await manager.getBindingByCredentialId(dataArg.credentialId);
64
+ if (!binding) {
65
+ throw new plugins.typedrequest.TypedResponseError('Web Push binding not found');
66
+ }
67
+ this.assertExactOwner(auth, this.bindingOwner(binding));
68
+ return {
69
+ success: true,
70
+ credential: await manager.rotateCredential(dataArg.credentialId),
71
+ };
72
+ }
73
+ catch (error) {
74
+ return {
75
+ success: false,
76
+ message: this.safeMessage(error),
77
+ };
78
+ }
79
+ }));
80
+ this.typedrouter.addTypedHandler(new plugins.typedrequest.TypedHandler('rotateWebPushVapidKey', async (dataArg) => {
81
+ try {
82
+ const auth = await this.requireControlAuth(dataArg.auth, 'manageWebPush');
83
+ const binding = await this.requireAuthorizedBinding(auth, dataArg.bindingId);
84
+ return {
85
+ success: true,
86
+ binding: await this.opsServerRef.dcRouterRef.webPushManager.rotateVapidKey(binding.id),
87
+ };
88
+ }
89
+ catch (error) {
90
+ return {
91
+ success: false,
92
+ message: this.safeMessage(error),
93
+ };
94
+ }
95
+ }));
96
+ }
97
+ async requireControlAuth(authArg, capabilityArg) {
98
+ const auth = await requireGatewayMachineAuth(this.opsServerRef, authArg, capabilityArg === 'manageWebPush'
99
+ ? 'gateway-clients:write'
100
+ : 'gateway-clients:read');
101
+ if (auth.isAdmin)
102
+ return auth;
103
+ if (auth.policy?.role !== 'gatewayClient'
104
+ || auth.policy.capabilities?.[capabilityArg] !== true) {
105
+ throw new plugins.typedrequest.TypedResponseError(`token capability missing: ${capabilityArg}`);
106
+ }
107
+ return auth;
108
+ }
109
+ scopeOwnerFilter(authArg, requestedArg) {
110
+ if (authArg.isAdmin)
111
+ return requestedArg || {};
112
+ const gatewayClient = authArg.gatewayClient;
113
+ if (!gatewayClient) {
114
+ throw new plugins.typedrequest.TypedResponseError('gateway-client credential required');
115
+ }
116
+ if (requestedArg?.gatewayClientType !== undefined
117
+ && requestedArg.gatewayClientType !== gatewayClient.type) {
118
+ throw new plugins.typedrequest.TypedResponseError('gateway-client credential cannot access another Web Push owner');
119
+ }
120
+ if (requestedArg?.gatewayClientId !== undefined
121
+ && requestedArg.gatewayClientId !== gatewayClient.id) {
122
+ throw new plugins.typedrequest.TypedResponseError('gateway-client credential cannot access another Web Push owner');
123
+ }
124
+ return {
125
+ gatewayClientType: gatewayClient.type,
126
+ gatewayClientId: gatewayClient.id,
127
+ ...(requestedArg?.appInstanceId !== undefined
128
+ ? { appInstanceId: requestedArg.appInstanceId }
129
+ : {}),
130
+ };
131
+ }
132
+ assertExactOwner(authArg, ownerArg) {
133
+ if (authArg.isAdmin)
134
+ return;
135
+ const gatewayClient = authArg.gatewayClient;
136
+ if (!gatewayClient
137
+ || ownerArg.gatewayClientType !== gatewayClient.type
138
+ || ownerArg.gatewayClientId !== gatewayClient.id) {
139
+ throw new plugins.typedrequest.TypedResponseError('gateway-client credential cannot access another Web Push owner');
140
+ }
141
+ }
142
+ async requireAuthorizedBinding(authArg, bindingIdArg) {
143
+ const binding = await this.opsServerRef.dcRouterRef.webPushManager.getBindingById(bindingIdArg);
144
+ if (!binding) {
145
+ throw new plugins.typedrequest.TypedResponseError('Web Push binding not found');
146
+ }
147
+ this.assertExactOwner(authArg, this.bindingOwner(binding));
148
+ return binding;
149
+ }
150
+ bindingOwner(bindingArg) {
151
+ return {
152
+ gatewayClientType: bindingArg.ownerGatewayClientType,
153
+ gatewayClientId: bindingArg.ownerGatewayClientId,
154
+ appInstanceId: bindingArg.ownerAppInstanceId,
155
+ };
156
+ }
157
+ safeMessage(errorArg) {
158
+ return errorArg instanceof plugins.typedrequest.TypedResponseError
159
+ ? errorArg.message
160
+ : 'Web Push control operation failed';
161
+ }
162
+ }
163
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2VicHVzaC1jb250cm9sLmhhbmRsZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi90cy9vcHNzZXJ2ZXIvaGFuZGxlcnMvd2VicHVzaC1jb250cm9sLmhhbmRsZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLE9BQU8sTUFBTSxrQkFBa0IsQ0FBQztBQUk1QyxPQUFPLEVBQ0wseUJBQXlCLEdBRTFCLE1BQU0sbUNBQW1DLENBQUM7QUFJM0MsTUFBTSxPQUFPLHFCQUFxQjtJQUdJO0lBRjdCLFdBQVcsR0FBRyxJQUFJLE9BQU8sQ0FBQyxZQUFZLENBQUMsV0FBVyxFQUFFLENBQUM7SUFFNUQsWUFBb0MsWUFBdUI7UUFBdkIsaUJBQVksR0FBWixZQUFZLENBQVc7UUFDekQsSUFBSSxDQUFDLFlBQVksQ0FBQyxXQUFXLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUMvRCxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztJQUMxQixDQUFDO0lBRU8sZ0JBQWdCO1FBQ3RCLElBQUksQ0FBQyxXQUFXLENBQUMsZUFBZSxDQUM5QixJQUFJLE9BQU8sQ0FBQyxZQUFZLENBQUMsWUFBWSxDQUduQyxxQkFBcUIsRUFDckIsS0FBSyxFQUFFLE9BQU8sRUFBRSxFQUFFO1lBQ2hCLE1BQU0sSUFBSSxHQUFHLE1BQU0sSUFBSSxDQUFDLGtCQUFrQixDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsYUFBYSxDQUFDLENBQUM7WUFDeEUsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksRUFBRSxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDekQsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxXQUFXLENBQUMsY0FBYyxDQUFDO1lBQzdELE9BQU87Z0JBQ0wsUUFBUSxFQUFFLE1BQU0sT0FBTyxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUM7YUFD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
@@ -2,6 +2,7 @@ import * as dns from 'node:dns';
2
2
  import * as fs from 'node:fs';
3
3
  import * as crypto from 'node:crypto';
4
4
  import * as http from 'node:http';
5
+ import * as https from 'node:https';
5
6
  import * as net from 'node:net';
6
7
  import * as buffer from 'node:buffer';
7
8
  import * as os from 'node:os';
@@ -9,7 +10,7 @@ import * as path from 'node:path';
9
10
  import * as tls from 'node:tls';
10
11
  import * as util from 'node:util';
11
12
  import * as url from 'node:url';
12
- export { dns, fs, crypto, http, net, buffer, os, path, tls, util, url, };
13
+ export { dns, fs, crypto, http, https, net, buffer, os, path, tls, util, url, };
13
14
  import * as servezoneInterfaces from '@serve.zone/interfaces';
14
15
  import * as remoteingress from '@serve.zone/remoteingress';
15
16
  export { servezoneInterfaces, remoteingress, };
@@ -50,5 +51,7 @@ import * as cloudflare from '@apiclient.xyz/cloudflare';
50
51
  export { cloudflare, };
51
52
  import * as tsclass from '@tsclass/tsclass';
52
53
  export { tsclass, };
54
+ import ipaddr from 'ipaddr.js';
53
55
  import * as uuid from 'uuid';
54
- export { uuid, };
56
+ import webpush from 'web-push';
57
+ export { ipaddr, uuid, webpush, };
@@ -3,6 +3,7 @@ import * as dns from 'node:dns';
3
3
  import * as fs from 'node:fs';
4
4
  import * as crypto from 'node:crypto';
5
5
  import * as http from 'node:http';
6
+ import * as https from 'node:https';
6
7
  import * as net from 'node:net';
7
8
  import * as buffer from 'node:buffer';
8
9
  import * as os from 'node:os';
@@ -10,7 +11,7 @@ import * as path from 'node:path';
10
11
  import * as tls from 'node:tls';
11
12
  import * as util from 'node:util';
12
13
  import * as url from 'node:url';
13
- export { dns, fs, crypto, http, net, buffer, os, path, tls, util, url, };
14
+ export { dns, fs, crypto, http, https, net, buffer, os, path, tls, util, url, };
14
15
  // @serve.zone scope
15
16
  import * as servezoneInterfaces from '@serve.zone/interfaces';
16
17
  import * as remoteingress from '@serve.zone/remoteingress';
@@ -57,6 +58,8 @@ export { cloudflare, };
57
58
  import * as tsclass from '@tsclass/tsclass';
58
59
  export { tsclass, };
59
60
  // third party
61
+ import ipaddr from 'ipaddr.js';
60
62
  import * as uuid from 'uuid';
61
- export { uuid, };
62
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2lucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3RzL3BsdWdpbnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYztBQUNkLE9BQU8sS0FBSyxHQUFHLE1BQU0sVUFBVSxDQUFDO0FBQ2hDLE9BQU8sS0FBSyxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBQzlCLE9BQU8sS0FBSyxNQUFNLE1BQU0sYUFBYSxDQUFDO0FBQ3RDLE9BQU8sS0FBSyxJQUFJLE1BQU0sV0FBVyxDQUFDO0FBQ2xDLE9BQU8sS0FBSyxHQUFHLE1BQU0sVUFBVSxDQUFDO0FBQ2hDLE9BQU8sS0FBSyxNQUFNLE1BQU0sYUFBYSxDQUFDO0FBQ3RDLE9BQU8sS0FBSyxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBQzlCLE9BQU8sS0FBSyxJQUFJLE1BQU0sV0FBVyxDQUFDO0FBQ2xDLE9BQU8sS0FBSyxHQUFHLE1BQU0sVUFBVSxDQUFDO0FBQ2hDLE9BQU8sS0FBSyxJQUFJLE1BQU0sV0FBVyxDQUFDO0FBQ2xDLE9BQU8sS0FBSyxHQUFHLE1BQU0sVUFBVSxDQUFDO0FBRWhDLE9BQU8sRUFDTCxHQUFHLEVBQ0gsRUFBRSxFQUNGLE1BQU0sRUFDTixJQUFJLEVBQ0osR0FBRyxFQUNILE1BQU0sRUFDTixFQUFFLEVBQ0YsSUFBSSxFQUNKLEdBQUcsRUFDSCxJQUFJLEVBQ0osR0FBRyxHQUNKLENBQUE7QUFFRCxvQkFBb0I7QUFDcEIsT0FBTyxLQUFLLG1CQUFtQixNQUFNLHdCQUF3QixDQUFDO0FBQzlELE9BQU8sS0FBSyxhQUFhLE1BQU0sMkJBQTJCLENBQUM7QUFFM0QsT0FBTyxFQUNMLG1CQUFtQixFQUNuQixhQUFhLEdBQ2QsQ0FBQTtBQUVELG9CQUFvQjtBQUNwQixPQUFPLEtBQUssWUFBWSxNQUFNLDBCQUEwQixDQUFDO0FBQ3pELE9BQU8sS0FBSyxXQUFXLE1BQU0seUJBQXlCLENBQUM7QUFDdkQsT0FBTyxLQUFLLFdBQVcsTUFBTSx5QkFBeUIsQ0FB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
63
+ import webpush from 'web-push';
64
+ export { ipaddr, uuid, webpush, };
65
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2lucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3RzL3BsdWdpbnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYztBQUNkLE9BQU8sS0FBSyxHQUFHLE1BQU0sVUFBVSxDQUFDO0FBQ2hDLE9BQU8sS0FBSyxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBQzlCLE9BQU8sS0FBSyxNQUFNLE1BQU0sYUFBYSxDQUFDO0FBQ3RDLE9BQU8sS0FBSyxJQUFJLE1BQU0sV0FBVyxDQUFDO0FBQ2xDLE9BQU8sS0FBSyxLQUFLLE1BQU0sWUFBWSxDQUFDO0FBQ3BDLE9BQU8sS0FBSyxHQUFHLE1BQU0sVUFBVSxDQUFDO0FBQ2hDLE9BQU8sS0FBSyxNQUFNLE1BQU0sYUFBYSxDQUFDO0FBQ3RDLE9BQU8sS0FBSyxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBQzlCLE9BQU8sS0FBSyxJQUFJLE1BQU0sV0FBVyxDQUFDO0FBQ2xDLE9BQU8sS0FBSyxHQUFHLE1BQU0sVUFBVSxDQUFDO0FBQ2hDLE9BQU8sS0FBSyxJQUFJLE1BQU0sV0FBVyxDQUFDO0FBQ2xDLE9BQU8sS0FBSyxHQUFHLE1BQU0sVUFBVSxDQUFDO0FBRWhDLE9BQU8sRUFDTCxHQUFHLEVBQ0gsRUFBRSxFQUNGLE1BQU0sRUFDTixJQUFJLEVBQ0osS0FBSyxFQUNMLEdBQUcsRUFDSCxNQUFNLEVBQ04sRUFBRSxFQUNGLElBQUksRUFDSixHQUFHLEVBQ0gsSUFBSSxFQUNKLEdBQUcsR0FDSixDQUFBO0FBRUQsb0JBQW9CO0FBQ3BCLE9BQU8sS0FBSyxtQkFBbUIsTUFBTSx3QkFBd0IsQ0FBQztBQUM5RCxPQUFPLEtBQUssYUFBYSxNQUFNLDJCQUEyQixDQUFDO0FBRTNELE9BQU8sRUFDTCxtQkFBbUIsRUFDbkIsYUFBYSxHQUNkLENBQUE7QUFFRCxvQkFBb0I7QUFDcEIsT0FBTyxLQUFLLFlBQVksTUFBTSwwQkFBMEIsQ0FBQztBQUN6RCxPQUFPLEtBQUssV0FBVyxNQUFNLHlC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
@@ -19,10 +19,14 @@ export function buildEdgeOnlyDerivationRoutes(options) {
19
19
  type: 'forward',
20
20
  targets: [{ host: '127.0.0.1', port: 53 }],
21
21
  },
22
+ ingress: {
23
+ directHub: false,
24
+ smartVpn: false,
25
+ },
22
26
  remoteIngress: {
23
27
  enabled: true,
24
28
  edgeFilter: [REMOTE_INGRESS_DNS_TAG],
25
29
  },
26
30
  }];
27
31
  }
28
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWRnZS1kZXJpdmF0aW9uLXJvdXRlcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3RzL3JlbW90ZWluZ3Jlc3MvZWRnZS1kZXJpdmF0aW9uLXJvdXRlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSwyQ0FBMkMsQ0FBQztBQUVuRjs7Ozs7R0FLRztBQUNILE1BQU0sVUFBVSw2QkFBNkIsQ0FBQyxPQUFvQztJQUNoRixJQUFJLENBQUMsT0FBTyxDQUFDLFlBQVksRUFBRSxNQUFNLEVBQUUsQ0FBQztRQUNsQyxPQUFPLEVBQUUsQ0FBQztJQUNaLENBQUM7SUFDRCxPQUFPLENBQUM7WUFDTixJQUFJLEVBQUUsd0JBQXdCO1lBQzlCLEtBQUssRUFBRTtnQkFDTCxLQUFLLEVBQUUsQ0FBQyxFQUFFLENBQUM7Z0JBQ1gsU0FBUyxFQUFFLEtBQUs7YUFDakI7WUFDRCxNQUFNLEVBQUU7Z0JBQ04sSUFBSSxFQUFFLFNBQVM7Z0JBQ2YsT0FBTyxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFLElBQUksRUFBRSxFQUFFLEVBQUUsQ0FBQzthQUMzQztZQUNELGFBQWEsRUFBRTtnQkFDYixPQUFPLEVBQUUsSUFBSTtnQkFDYixVQUFVLEVBQUUsQ0FBQyxzQkFBc0IsQ0FBQzthQUNyQztTQUNzQixDQUFDLENBQUM7QUFDN0IsQ0FBQyJ9
32
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWRnZS1kZXJpdmF0aW9uLXJvdXRlcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3RzL3JlbW90ZWluZ3Jlc3MvZWRnZS1kZXJpdmF0aW9uLXJvdXRlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSwyQ0FBMkMsQ0FBQztBQUVuRjs7Ozs7R0FLRztBQUNILE1BQU0sVUFBVSw2QkFBNkIsQ0FBQyxPQUFvQztJQUNoRixJQUFJLENBQUMsT0FBTyxDQUFDLFlBQVksRUFBRSxNQUFNLEVBQUUsQ0FBQztRQUNsQyxPQUFPLEVBQUUsQ0FBQztJQUNaLENBQUM7SUFDRCxPQUFPLENBQUM7WUFDTixJQUFJLEVBQUUsd0JBQXdCO1lBQzlCLEtBQUssRUFBRTtnQkFDTCxLQUFLLEVBQUUsQ0FBQyxFQUFFLENBQUM7Z0JBQ1gsU0FBUyxFQUFFLEtBQUs7YUFDakI7WUFDRCxNQUFNLEVBQUU7Z0JBQ04sSUFBSSxFQUFFLFNBQVM7Z0JBQ2YsT0FBTyxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFLElBQUksRUFBRSxFQUFFLEVBQUUsQ0FBQzthQUMzQztZQUNELE9BQU8sRUFBRTtnQkFDUCxTQUFTLEVBQUUsS0FBSztnQkFDaEIsUUFBUSxFQUFFLEtBQUs7YUFDaEI7WUFDRCxhQUFhLEVBQUU7Z0JBQ2IsT0FBTyxFQUFFLElBQUk7Z0JBQ2IsVUFBVSxFQUFFLENBQUMsc0JBQXNCLENBQUM7YUFDckM7U0FDc0IsQ0FBQyxDQUFDO0FBQzdCLENBQUMifQ==
@@ -3,20 +3,24 @@ import type { ISecurityCompiledPolicy } from '../../dist_ts_interfaces/data/secu
3
3
  import type { DcRouter } from '../classes.dcrouter.js';
4
4
  /**
5
5
  * Pure route-policy transformations applied before routes reach SmartProxy:
6
- * per-listener inbound PROXY protocol policies (driven by RemoteIngress and
7
- * VPN) and merging of compiled security policies.
6
+ * route-level trusted ingress authorization, listener-level inbound PROXY
7
+ * protocol policy, and merging of compiled security policies.
8
8
  */
9
9
  export declare class RoutePolicyAugmenter {
10
10
  private dcRouterRef;
11
11
  constructor(dcRouterRef: DcRouter);
12
12
  /**
13
- * Ensure every route on a shared listener carries a compatible
14
- * inboundProxyProtocol policy, deriving defaults from RemoteIngress/VPN.
13
+ * Compile each dcrouter ingress policy into SmartProxy route security, then
14
+ * derive one compatible PROXY protocol mode for every shared listener.
15
+ *
16
+ * The listener mode only controls parsing. Route security remains the
17
+ * authorization boundary, so a direct request cannot fall through to a
18
+ * wildcard route that only permits RemoteIngress or SmartVPN.
15
19
  */
16
20
  applyInboundProxyProtocolPolicies(routes: plugins.smartproxy.IRouteConfig[]): plugins.smartproxy.IRouteConfig[];
17
21
  /** Union blocked IPs/CIDRs across configured and compiled security policies. */
18
22
  mergeSecurityPolicies(...policies: Array<Partial<ISecurityCompiledPolicy> | undefined>): ISecurityCompiledPolicy | undefined;
19
- private getDesiredInboundProxyProtocolPolicy;
23
+ private getAllowedIngressOrigins;
24
+ private getListenerProxyProtocolPolicy;
20
25
  private getInboundProxyListenerKeys;
21
- private mergeInboundProxyProtocolPolicies;
22
26
  }
@@ -1,8 +1,8 @@
1
1
  import * as plugins from '../plugins.js';
2
2
  /**
3
3
  * Pure route-policy transformations applied before routes reach SmartProxy:
4
- * per-listener inbound PROXY protocol policies (driven by RemoteIngress and
5
- * VPN) and merging of compiled security policies.
4
+ * route-level trusted ingress authorization, listener-level inbound PROXY
5
+ * protocol policy, and merging of compiled security policies.
6
6
  */
7
7
  export class RoutePolicyAugmenter {
8
8
  dcRouterRef;
@@ -10,42 +10,53 @@ export class RoutePolicyAugmenter {
10
10
  this.dcRouterRef = dcRouterRef;
11
11
  }
12
12
  /**
13
- * Ensure every route on a shared listener carries a compatible
14
- * inboundProxyProtocol policy, deriving defaults from RemoteIngress/VPN.
13
+ * Compile each dcrouter ingress policy into SmartProxy route security, then
14
+ * derive one compatible PROXY protocol mode for every shared listener.
15
+ *
16
+ * The listener mode only controls parsing. Route security remains the
17
+ * authorization boundary, so a direct request cannot fall through to a
18
+ * wildcard route that only permits RemoteIngress or SmartVPN.
15
19
  */
16
20
  applyInboundProxyProtocolPolicies(routes) {
17
- const policiesByListener = new Map();
18
- for (const route of routes) {
19
- const policy = route.match?.inboundProxyProtocol || this.getDesiredInboundProxyProtocolPolicy(route);
20
- if (!policy) {
21
- continue;
21
+ const routesWithIngressSecurity = routes.map((route) => {
22
+ const allowedOrigins = this.getAllowedIngressOrigins(route);
23
+ if (allowedOrigins.length === 0) {
24
+ throw new Error(`Route '${route.name}' has no enabled ingress path`);
22
25
  }
26
+ return {
27
+ ...route,
28
+ security: {
29
+ ...route.security,
30
+ ingress: {
31
+ allowedOrigins,
32
+ },
33
+ },
34
+ };
35
+ });
36
+ const originsByListener = new Map();
37
+ for (const route of routesWithIngressSecurity) {
38
+ const origins = route.security.ingress.allowedOrigins;
23
39
  for (const listenerKey of this.getInboundProxyListenerKeys(route)) {
24
- const mergedPolicy = this.mergeInboundProxyProtocolPolicies(policiesByListener.get(listenerKey), policy);
25
- if (mergedPolicy) {
26
- policiesByListener.set(listenerKey, mergedPolicy);
40
+ const listenerOrigins = originsByListener.get(listenerKey) || new Set();
41
+ for (const origin of origins) {
42
+ listenerOrigins.add(origin);
27
43
  }
44
+ originsByListener.set(listenerKey, listenerOrigins);
28
45
  }
29
46
  }
30
- if (policiesByListener.size === 0) {
31
- return routes;
32
- }
33
- return routes.map((route) => {
34
- if (route.match?.inboundProxyProtocol) {
35
- return route;
36
- }
37
- let listenerPolicy;
47
+ return routesWithIngressSecurity.map((route) => {
48
+ const listenerOrigins = new Set();
38
49
  for (const listenerKey of this.getInboundProxyListenerKeys(route)) {
39
- listenerPolicy = this.mergeInboundProxyProtocolPolicies(listenerPolicy, policiesByListener.get(listenerKey));
40
- }
41
- if (!listenerPolicy) {
42
- return route;
50
+ for (const origin of originsByListener.get(listenerKey) || []) {
51
+ listenerOrigins.add(origin);
52
+ }
43
53
  }
54
+ const inboundProxyProtocol = this.getListenerProxyProtocolPolicy(listenerOrigins);
44
55
  return {
45
56
  ...route,
46
57
  match: {
47
58
  ...route.match,
48
- inboundProxyProtocol: listenerPolicy,
59
+ inboundProxyProtocol,
49
60
  },
50
61
  };
51
62
  });
@@ -72,19 +83,37 @@ export class RoutePolicyAugmenter {
72
83
  blockedCidrs: [...blockedCidrs].sort(),
73
84
  };
74
85
  }
75
- getDesiredInboundProxyProtocolPolicy(route) {
86
+ getAllowedIngressOrigins(route) {
76
87
  const dcRoute = route;
77
- if (this.dcRouterRef.isRemoteIngressHubEnabled() && dcRoute.remoteIngress?.enabled) {
78
- const ports = plugins.smartproxy.expandPortRange(route.match.ports);
79
- if (ports.some((port) => port === 25 || port === 587)) {
80
- return { mode: 'required' };
81
- }
82
- return { mode: 'optional' };
88
+ const origins = new Set();
89
+ if (dcRoute.ingress) {
90
+ if (dcRoute.ingress.directHub)
91
+ origins.add('direct');
92
+ if (dcRoute.ingress.smartVpn)
93
+ origins.add('smartVpn');
83
94
  }
84
- if (this.dcRouterRef.options.vpnConfig?.enabled) {
85
- return { mode: 'optional' };
95
+ else if (dcRoute.vpnOnly) {
96
+ origins.add('smartVpn');
97
+ }
98
+ else {
99
+ // Compatibility for runtime routes and producers predating the explicit
100
+ // contract. Persisted routes are backfilled by the versioned migration.
101
+ origins.add('direct');
102
+ origins.add('smartVpn');
86
103
  }
87
- return undefined;
104
+ if (dcRoute.remoteIngress?.enabled) {
105
+ origins.add('trustedProxy');
106
+ }
107
+ return [...origins];
108
+ }
109
+ getListenerProxyProtocolPolicy(origins) {
110
+ const allowsDirect = origins.has('direct');
111
+ const allowsProxied = origins.has('trustedProxy') || origins.has('smartVpn');
112
+ if (allowsDirect && allowsProxied)
113
+ return { mode: 'optional' };
114
+ if (allowsProxied)
115
+ return { mode: 'required' };
116
+ return { mode: 'reject' };
88
117
  }
89
118
  getInboundProxyListenerKeys(route) {
90
119
  const ports = plugins.smartproxy.expandPortRange(route.match.ports);
@@ -101,20 +130,5 @@ export class RoutePolicyAugmenter {
101
130
  }
102
131
  return keys;
103
132
  }
104
- mergeInboundProxyProtocolPolicies(current, next) {
105
- if (!current)
106
- return next;
107
- if (!next)
108
- return current;
109
- if (current.mode === 'required')
110
- return current;
111
- if (next.mode === 'required')
112
- return next;
113
- if (current.mode === 'optional')
114
- return current;
115
- if (next.mode === 'optional')
116
- return next;
117
- return current;
118
- }
119
133
  }
120
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5yb3V0ZS1wb2xpY3ktYXVnbWVudGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vdHMvc2VjdXJpdHkvY2xhc3Nlcy5yb3V0ZS1wb2xpY3ktYXVnbWVudGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxPQUFPLE1BQU0sZUFBZSxDQUFDO0FBT3pDOzs7O0dBSUc7QUFDSCxNQUFNLE9BQU8sb0JBQW9CO0lBQ1g7SUFBcEIsWUFBb0IsV0FBcUI7UUFBckIsZ0JBQVcsR0FBWCxXQUFXLENBQVU7SUFBRyxDQUFDO0lBRTdDOzs7T0FHRztJQUNJLGlDQUFpQyxDQUN0QyxNQUF5QztRQUV6QyxNQUFNLGtCQUFrQixHQUFHLElBQUksR0FBRyxFQUF1QyxDQUFDO1FBRTFFLEtBQUssTUFBTSxLQUFLLElBQUksTUFBTSxFQUFFLENBQUM7WUFDM0IsTUFBTSxNQUFNLEdBQUcsS0FBSyxDQUFDLEtBQUssRUFBRSxvQkFBb0IsSUFBSSxJQUFJLENBQUMsb0NBQW9DLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDckcsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO2dCQUNaLFNBQVM7WUFDWCxDQUFDO1lBQ0QsS0FBSyxNQUFNLFdBQVcsSUFBSSxJQUFJLENBQUMsMkJBQTJCLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztnQkFDbEUsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLGlDQUFpQyxDQUN6RCxrQkFBa0IsQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDLEVBQ25DLE1BQU0sQ0FDUCxDQUFDO2dCQUNGLElBQUksWUFBWSxFQUFFLENBQUM7b0JBQ2pCLGtCQUFrQixDQUFDLEdBQUcsQ0FBQyxXQUFXLEVBQUUsWUFBWSxDQUFDLENBQUM7Z0JBQ3BELENBQUM7WUFDSCxDQUFDO1FBQ0gsQ0FBQztRQUVELElBQUksa0JBQWtCLENBQUMsSUFBSSxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ2xDLE9BQU8sTUFBTSxD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
134
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5yb3V0ZS1wb2xpY3ktYXVnbWVudGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vdHMvc2VjdXJpdHkvY2xhc3Nlcy5yb3V0ZS1wb2xpY3ktYXVnbWVudGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxPQUFPLE1BQU0sZUFBZSxDQUFDO0FBVXpDOzs7O0dBSUc7QUFDSCxNQUFNLE9BQU8sb0JBQW9CO0lBQ1g7SUFBcEIsWUFBb0IsV0FBcUI7UUFBckIsZ0JBQVcsR0FBWCxXQUFXLENBQVU7SUFBRyxDQUFDO0lBRTdDOzs7Ozs7O09BT0c7SUFDSSxpQ0FBaUMsQ0FDdEMsTUFBeUM7UUFFekMsTUFBTSx5QkFBeUIsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUU7WUFDckQsTUFBTSxjQUFjLEdBQUcsSUFBSSxDQUFDLHdCQUF3QixDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQzVELElBQUksY0FBYyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztnQkFDaEMsTUFBTSxJQUFJLEtBQUssQ0FBQyxVQUFVLEtBQUssQ0FBQyxJQUFJLCtCQUErQixDQUFDLENBQUM7WUFDdkUsQ0FBQztZQUNELE9BQU87Z0JBQ0wsR0FBRyxLQUFLO2dCQUNSLFFBQVEsRUFBRTtvQkFDUixHQUFHLEtBQUssQ0FBQyxRQUFRO29CQUNqQixPQUFPLEVBQUU7d0JBQ1AsY0FBYztxQkFDZjtpQkFDRjthQUNGLENBQUM7UUFDSixDQUFDLENBQUMsQ0FBQztRQUVILE1BQU0saUJBQWlCLEdBQUcsSUFBSSxHQUFHLEVBQStCLENBQUM7UUFDakUsS0FBSyxNQUFNLEtBQUssSUFBSSx5QkFBeUIsRUFBRSxDQUFDO1lBQzlDLE1BQU0sT0FBTyxHQUFHLEtBQUssQ0FBQyxRQUFTLENBQUMsT0FBUSxDQUFDLGNBQWMsQ0FBQztZQUN4RCxLQUFLLE1BQU0sV0FBVyxJQUFJLElBQUksQ0FBQywyQkFBMkIsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO2dCQUNsRSxNQUFNLGVBQWUsR0FBRyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDLElBQUksSUFBSSxHQUFHLEVBQWtCLENBQUM7Z0JBQ3hGLEtBQUssTUFBTSxNQUFNLElBQUksT0FBTyxFQUFFLENBQUM7b0JBQzdCLGVBQWUsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUM7Z0JBQzlCLENBQUM7Z0JBQ0QsaUJBQWlCLENBQUMsR0FBRyxDQUFDLFdBQVcsRUFBRSxlQUFlLENBQUMsQ0FBQztZQUN0RCxDQUFDO1FBQ0gsQ0FBQztRQUVELE9BQU8seUJBQXlCLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUU7WUFDN0MsTUFBTSxlQUFlLEdBQUcsSUFBSSxHQUFHLEVBQWtCLENBQUM7WUFDbEQsS0FBSyxNQUFNLFdBQVcsSUFBSSxJQUFJLENBQUMsMkJBQTJCLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztnQkFDbEUsS0FBSyxNQUFNLE1BQU0sSUFBSSxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUM7b0JBQzlELGVBQWUsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUM7Z0JBQzlCLENBQUM7WUFDSCxDQUFDO1lBQ0QsTUFBTSxvQkFBb0IsR0FBRyxJQUFJLENBQUMsOEJBQThCLENBQUMsZUFBZSxDQUFDLENBQUM7WUFDbEYsT0FBTztnQkFDTCxHQUFHLEtBQUs7Z0JBQ1IsS0FBSyxFQUFFO29CQUNMLEdBQUcsS0FBSyxDQUFDLEtBQUs7b0JBQ2Qsb0JBQW9CO2lCQUNyQjthQUNGLENBQUM7UUFDSixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxnRkFBZ0Y7SUFDekUscUJBQXFCLENBQzFCLEdBQUcsUUFBNkQ7UUFFaEUsTUFBTSxVQUFVLEdBQUcsSUFBSSxHQUFHLEVBQVUsQ0FBQztRQUNyQyxNQUFNLFlBQVksR0FBRyxJQUFJLEdBQUcsRUFBVSxDQUFDO1FBRXZDLEtBQUssTUFBTSxNQUFNLElBQUksUUFBUSxFQUFFLENBQUM7WUFDOUIsS0FBSyxNQUFNLEVBQUUsSUFBSSxNQUFNLEVBQUUsVUFBVSxJQUFJLEVBQUUsRUFBRSxDQUFDO2dCQUMxQyxJQUFJLEVBQUU7b0JBQUUsVUFBVSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUM3QixDQUFDO1lBQ0QsS0FBSyxNQUFNLElBQUksSUFBSSxNQUFNLEVBQUUsWUFBWSxJQUFJLEVBQUUsRUFBRSxDQUFDO2dCQUM5QyxJQUFJLElBQUk7b0JBQUUsWUFBWSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNuQyxDQUFDO1FBQ0gsQ0FBQztRQUVELElBQUksVUFBVSxDQUFDLElBQUksS0FBSyxDQUFDLElBQUksWUFBWSxDQUFDLElBQUksS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUNyRCxPQUFPLFNBQVMsQ0FBQztRQUNuQixDQUFDO1FBRUQsT0FBTztZQUNMLFVBQVUsRUFBRSxDQUFDLEdBQUcsVUFBVSxDQUFDLENBQUMsSUFBSSxFQUFFO1lBQ2xDLFlBQVksRUFBRSxDQUFDLEdBQUcsWUFBWSxDQUFDLENBQUMsSUFBSSxFQUFFO1NBQ3ZDLENBQUM7SUFDSixDQUFDO0lBRU8sd0JBQXdCLENBQzlCLEtBQXNDO1FBRXRDLE1BQU0sT0FBTyxHQUFHLEtBQTZCLENBQUM7UUFDOUMsTUFBTSxPQUFPLEdBQUcsSUFBSSxHQUFHLEVBQWtCLENBQUM7UUFFMUMsSUFBSSxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDcEIsSUFBSSxPQUFPLENBQUMsT0FBTyxDQUFDLFNBQVM7Z0JBQUUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUNyRCxJQUFJLE9BQU8sQ0FBQyxPQUFPLENBQUMsUUFBUTtnQkFBRSxPQUFPLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ3hELENBQUM7YUFBTSxJQUFJLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUMzQixPQUFPLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQzFCLENBQUM7YUFBTSxDQUFDO1lBQ04sd0VBQXdFO1lBQ3hFLHdFQUF3RTtZQUN4RSxPQUFPLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQ3RCLE9BQU8sQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDMUIsQ0FBQztRQUVELElBQUksT0FBTyxDQUFDLGFBQWEsRUFBRSxPQUFPLEVBQUUsQ0FBQztZQUNuQyxPQUFPLENBQUMsR0FBRyxDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBQzlCLENBQUM7UUFFRCxPQUFPLENBQUMsR0FBRyxPQUFPLENBQUMsQ0FBQztJQUN0QixDQUFDO0lBRU8sOEJBQThCLENBQ3BDLE9BQTRCO1FBRTVCLE1BQU0sWUFBWSxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDM0MsTUFBTSxhQUFhLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxjQUFjLENBQUMsSUFBSSxPQUFPLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBRTdFLElBQUksWUFBWSxJQUFJLGFBQWE7WUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRSxDQUFDO1FBQy9ELElBQUksYUFBYTtZQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLENBQUM7UUFDL0MsT0FBTyxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsQ0FBQztJQUM1QixDQUFDO0lBRU8sMkJBQTJCLENBQUMsS0FBc0M7UUFDeEUsTUFBTSxLQUFLLEdBQUcsT0FBTyxDQUFDLFVBQVUsQ0FBQyxlQUFlLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxLQUFZLENBQWEsQ0FBQztRQUN2RixNQUFNLFVBQVUsR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLFNBQVMsS0FBSyxLQUFLO1lBQ2hELENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQztZQUNULENBQUMsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLFNBQVMsS0FBSyxLQUFLO2dCQUMvQixDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDO2dCQUNoQixDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNkLE1BQU0sSUFBSSxHQUFhLEVBQUUsQ0FBQztRQUMxQixLQUFLLE1BQU0sSUFBSSxJQUFJLEtBQUssRUFBRSxDQUFDO1lBQ3pCLEtBQUssTUFBTSxTQUFTLElBQUksVUFBVSxFQUFFLENBQUM7Z0JBQ25DLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxTQUFTLElBQUksSUFBSSxFQUFFLENBQUMsQ0FBQztZQUNwQyxDQUFDO1FBQ0gsQ0FBQztRQUNELE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztDQUNGIn0=
@@ -0,0 +1,38 @@
1
+ export interface IWebPushKeyRing {
2
+ currentKeyId: string;
3
+ keys: ReadonlyMap<string, Buffer>;
4
+ }
5
+ export interface IWebPushEncryptedEnvelope {
6
+ version: 1;
7
+ algorithm: 'aes-256-gcm';
8
+ keyId: string;
9
+ nonce: string;
10
+ ciphertext: string;
11
+ tag: string;
12
+ }
13
+ export interface IWebPushAadContext {
14
+ gatewayClientId: string;
15
+ appInstanceId: string;
16
+ bindingId: string;
17
+ documentType: string;
18
+ documentId: string;
19
+ }
20
+ export type TWebPushHmacDomain = 'credential' | 'idempotency-key' | 'request' | 'endpoint' | 'topic';
21
+ export declare function parseWebPushKeyRing(rawValueArg: unknown, labelArg: string): IWebPushKeyRing;
22
+ export declare function assertDistinctWebPushKeyRings(encryptionRingArg: IWebPushKeyRing, hmacRingArg: IWebPushKeyRing): void;
23
+ export declare function buildWebPushAad(contextArg: IWebPushAadContext): Buffer;
24
+ export declare function canonicalJson(valueArg: unknown): string;
25
+ export declare class WebPushCrypto {
26
+ private readonly encryptionRing;
27
+ private readonly hmacRing;
28
+ constructor(encryptionRing: IWebPushKeyRing, hmacRing: IWebPushKeyRing);
29
+ get currentEncryptionKeyId(): string;
30
+ get currentHmacKeyId(): string;
31
+ encryptJson(valueArg: unknown, aadContextArg: IWebPushAadContext): IWebPushEncryptedEnvelope;
32
+ decryptJson<T>(envelopeArg: IWebPushEncryptedEnvelope, aadContextArg: IWebPushAadContext): T;
33
+ hmac(domainArg: TWebPushHmacDomain, valueArg: string, keyIdArg?: string): {
34
+ keyId: string;
35
+ digest: string;
36
+ };
37
+ verifyHmac(domainArg: TWebPushHmacDomain, valueArg: string, keyIdArg: string, expectedDigestArg: string): boolean;
38
+ }