@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.
- package/deno.json +1 -1
- package/dist_serve/bundle.js +712 -709
- package/dist_ts/00_commitinfo_data.js +1 -1
- package/dist_ts/classes.dcrouter.d.ts +2 -0
- package/dist_ts/classes.dcrouter.js +23 -1
- package/dist_ts/config/classes.db-seeder.js +9 -1
- package/dist_ts/config/classes.gateway-client-manager.js +3 -1
- package/dist_ts/config/helpers.http-redirects.js +28 -1
- package/dist_ts/config/helpers.special-forwards.js +12 -9
- package/dist_ts/db/documents/classes.cached.email.d.ts +7 -0
- package/dist_ts/db/documents/classes.cached.email.js +52 -2
- package/dist_ts/db/documents/classes.webpush-admission.doc.d.ts +19 -0
- package/dist_ts/db/documents/classes.webpush-admission.doc.js +124 -0
- package/dist_ts/db/documents/classes.webpush-binding.doc.d.ts +65 -0
- package/dist_ts/db/documents/classes.webpush-binding.doc.js +205 -0
- package/dist_ts/db/documents/classes.webpush-spool.doc.d.ts +44 -0
- package/dist_ts/db/documents/classes.webpush-spool.doc.js +277 -0
- package/dist_ts/db/documents/index.d.ts +3 -0
- package/dist_ts/db/documents/index.js +5 -1
- package/dist_ts/email/classes.accepted-email-spool.d.ts +5 -0
- package/dist_ts/email/classes.accepted-email-spool.js +28 -3
- package/dist_ts/email/classes.email-route-builder.js +5 -1
- package/dist_ts/email/classes.workapp-mail-manager.d.ts +5 -1
- package/dist_ts/email/classes.workapp-mail-manager.js +87 -12
- package/dist_ts/index.d.ts +1 -0
- package/dist_ts/index.js +3 -1
- package/dist_ts/opsserver/classes.opsserver.d.ts +2 -0
- package/dist_ts/opsserver/classes.opsserver.js +5 -1
- package/dist_ts/opsserver/handlers/gatewayclient.handler.js +33 -6
- package/dist_ts/opsserver/handlers/index.d.ts +2 -0
- package/dist_ts/opsserver/handlers/index.js +3 -1
- package/dist_ts/opsserver/handlers/webpush-app.handler.d.ts +9 -0
- package/dist_ts/opsserver/handlers/webpush-app.handler.js +66 -0
- package/dist_ts/opsserver/handlers/webpush-control.handler.d.ts +14 -0
- package/dist_ts/opsserver/handlers/webpush-control.handler.js +163 -0
- package/dist_ts/plugins.d.ts +5 -2
- package/dist_ts/plugins.js +6 -3
- package/dist_ts/remoteingress/edge-derivation-routes.js +5 -1
- package/dist_ts/security/classes.route-policy-augmenter.d.ts +10 -6
- package/dist_ts/security/classes.route-policy-augmenter.js +65 -51
- package/dist_ts/webpush/classes.webpush-crypto.d.ts +38 -0
- package/dist_ts/webpush/classes.webpush-crypto.js +231 -0
- package/dist_ts/webpush/classes.webpush-manager.d.ts +153 -0
- package/dist_ts/webpush/classes.webpush-manager.js +2374 -0
- package/dist_ts/webpush/classes.webpush-transport.d.ts +45 -0
- package/dist_ts/webpush/classes.webpush-transport.js +161 -0
- package/dist_ts/webpush/helpers.webpush-endpoint.d.ts +21 -0
- package/dist_ts/webpush/helpers.webpush-endpoint.js +111 -0
- package/dist_ts/webpush/index.d.ts +4 -0
- package/dist_ts/webpush/index.js +5 -0
- package/dist_ts/webpush/webpush-indexes.d.ts +11 -0
- package/dist_ts/webpush/webpush-indexes.js +123 -0
- package/dist_ts_interfaces/data/remoteingress.d.ts +14 -2
- package/dist_ts_interfaces/data/route-management.d.ts +2 -0
- package/dist_ts_interfaces/data/route-management.js +1 -1
- package/dist_ts_migrations/index.js +285 -11
- package/dist_ts_web/00_commitinfo_data.js +1 -1
- package/dist_ts_web/elements/network/ops-view-routes.js +41 -1
- package/dist_ts_web/elements/network/special-forward-dialog.js +2 -2
- package/package.json +14 -10
- package/readme.md +27 -0
- package/third-party-notices.md +37 -0
- package/ts/00_commitinfo_data.ts +1 -1
- package/ts/classes.dcrouter.ts +29 -0
- package/ts/config/classes.db-seeder.ts +8 -0
- package/ts/config/classes.gateway-client-manager.ts +2 -0
- package/ts/config/helpers.http-redirects.ts +31 -1
- package/ts/config/helpers.special-forwards.ts +11 -8
- package/ts/db/documents/classes.cached.email.ts +47 -0
- package/ts/db/documents/classes.webpush-admission.doc.ts +48 -0
- package/ts/db/documents/classes.webpush-binding.doc.ts +147 -0
- package/ts/db/documents/classes.webpush-spool.doc.ts +136 -0
- package/ts/db/documents/index.ts +5 -0
- package/ts/email/classes.accepted-email-spool.ts +41 -2
- package/ts/email/classes.email-route-builder.ts +4 -0
- package/ts/email/classes.workapp-mail-manager.ts +97 -10
- package/ts/index.ts +3 -0
- package/ts/opsserver/classes.opsserver.ts +4 -0
- package/ts/opsserver/handlers/gatewayclient.handler.ts +34 -4
- package/ts/opsserver/handlers/index.ts +2 -0
- package/ts/opsserver/handlers/webpush-app.handler.ts +105 -0
- package/ts/opsserver/handlers/webpush-control.handler.ts +257 -0
- package/ts/plugins.ts +6 -0
- package/ts/remoteingress/edge-derivation-routes.ts +4 -0
- package/ts/security/classes.route-policy-augmenter.ts +70 -57
- package/ts/webpush/classes.webpush-crypto.ts +306 -0
- package/ts/webpush/classes.webpush-manager.ts +3173 -0
- package/ts/webpush/classes.webpush-transport.ts +241 -0
- package/ts/webpush/helpers.webpush-endpoint.ts +150 -0
- package/ts/webpush/index.ts +4 -0
- package/ts/webpush/webpush-indexes.ts +141 -0
- package/ts_web/00_commitinfo_data.ts +1 -1
- package/ts_web/elements/network/ops-view-routes.ts +38 -0
- package/ts_web/elements/network/special-forward-dialog.ts +1 -1
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import * as plugins from '../plugins.js';
|
|
2
|
+
import { type TWebPushDnsLookup } from './helpers.webpush-endpoint.js';
|
|
3
|
+
export interface IWebPushTransportRequest {
|
|
4
|
+
subscription: plugins.webpush.PushSubscription;
|
|
5
|
+
payload: string;
|
|
6
|
+
ttlSeconds: number;
|
|
7
|
+
urgency: plugins.webpush.Urgency;
|
|
8
|
+
topic?: string;
|
|
9
|
+
vapid: {
|
|
10
|
+
subject: string;
|
|
11
|
+
publicKey: string;
|
|
12
|
+
privateKey: string;
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
export interface IWebPushTransportResponse {
|
|
16
|
+
statusCode: number;
|
|
17
|
+
retryAfter?: string;
|
|
18
|
+
}
|
|
19
|
+
export interface IWebPushTransport {
|
|
20
|
+
send(requestArg: IWebPushTransportRequest): Promise<IWebPushTransportResponse>;
|
|
21
|
+
}
|
|
22
|
+
export type TWebPushTransportErrorCode = 'PUSH_DNS_TIMEOUT' | 'PUSH_REQUEST_TIMEOUT' | 'PUSH_RESPONSE_TOO_LARGE' | 'PUSH_RESPONSE_INVALID' | 'PUSH_NETWORK_ERROR';
|
|
23
|
+
export declare class WebPushTransportError extends Error {
|
|
24
|
+
readonly code: TWebPushTransportErrorCode;
|
|
25
|
+
constructor(code: TWebPushTransportErrorCode, optionsArg?: {
|
|
26
|
+
cause?: unknown;
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
export interface IWebPushHttpTransportOptions {
|
|
30
|
+
dnsLookup?: TWebPushDnsLookup;
|
|
31
|
+
dnsTimeoutMs?: number;
|
|
32
|
+
connectTimeoutMs?: number;
|
|
33
|
+
requestTimeoutMs?: number;
|
|
34
|
+
maxResponseBytes?: number;
|
|
35
|
+
}
|
|
36
|
+
export declare class WebPushHttpTransport implements IWebPushTransport {
|
|
37
|
+
private readonly dnsLookup?;
|
|
38
|
+
private readonly dnsTimeoutMs;
|
|
39
|
+
private readonly connectTimeoutMs;
|
|
40
|
+
private readonly requestTimeoutMs;
|
|
41
|
+
private readonly maxResponseBytes;
|
|
42
|
+
constructor(optionsArg?: IWebPushHttpTransportOptions);
|
|
43
|
+
send(requestArg: IWebPushTransportRequest): Promise<IWebPushTransportResponse>;
|
|
44
|
+
private normalizePositiveInteger;
|
|
45
|
+
}
|
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
import * as plugins from '../plugins.js';
|
|
2
|
+
import { createPinnedWebPushAgent, resolveWebPushEndpoint, WebPushEndpointPolicyError, } from './helpers.webpush-endpoint.js';
|
|
3
|
+
export class WebPushTransportError extends Error {
|
|
4
|
+
code;
|
|
5
|
+
constructor(code, optionsArg = {}) {
|
|
6
|
+
super(code, optionsArg);
|
|
7
|
+
this.code = code;
|
|
8
|
+
this.name = 'WebPushTransportError';
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
const normalizeRetryAfter = (valueArg) => {
|
|
12
|
+
if (Array.isArray(valueArg))
|
|
13
|
+
return valueArg[0]?.slice(0, 128);
|
|
14
|
+
return typeof valueArg === 'string' ? valueArg.slice(0, 128) : undefined;
|
|
15
|
+
};
|
|
16
|
+
export class WebPushHttpTransport {
|
|
17
|
+
dnsLookup;
|
|
18
|
+
dnsTimeoutMs;
|
|
19
|
+
connectTimeoutMs;
|
|
20
|
+
requestTimeoutMs;
|
|
21
|
+
maxResponseBytes;
|
|
22
|
+
constructor(optionsArg = {}) {
|
|
23
|
+
this.dnsLookup = optionsArg.dnsLookup;
|
|
24
|
+
this.dnsTimeoutMs = this.normalizePositiveInteger(optionsArg.dnsTimeoutMs, 5_000, 'dnsTimeoutMs');
|
|
25
|
+
this.connectTimeoutMs = this.normalizePositiveInteger(optionsArg.connectTimeoutMs, 10_000, 'connectTimeoutMs');
|
|
26
|
+
this.requestTimeoutMs = this.normalizePositiveInteger(optionsArg.requestTimeoutMs, 15_000, 'requestTimeoutMs');
|
|
27
|
+
this.maxResponseBytes = this.normalizePositiveInteger(optionsArg.maxResponseBytes, 16_384, 'maxResponseBytes');
|
|
28
|
+
}
|
|
29
|
+
async send(requestArg) {
|
|
30
|
+
const sendDeadline = Date.now() + this.requestTimeoutMs;
|
|
31
|
+
let resolved;
|
|
32
|
+
try {
|
|
33
|
+
resolved = await new Promise((resolve, reject) => {
|
|
34
|
+
let settled = false;
|
|
35
|
+
const settle = (errorArg, valueArg) => {
|
|
36
|
+
if (settled)
|
|
37
|
+
return;
|
|
38
|
+
settled = true;
|
|
39
|
+
clearTimeout(timer);
|
|
40
|
+
if (errorArg)
|
|
41
|
+
reject(errorArg);
|
|
42
|
+
else
|
|
43
|
+
resolve(valueArg);
|
|
44
|
+
};
|
|
45
|
+
const timer = setTimeout(() => {
|
|
46
|
+
settle(new WebPushTransportError('PUSH_DNS_TIMEOUT'));
|
|
47
|
+
}, Math.min(this.dnsTimeoutMs, this.requestTimeoutMs));
|
|
48
|
+
resolveWebPushEndpoint(requestArg.subscription.endpoint, this.dnsLookup).then((valueArg) => settle(null, valueArg), (errorArg) => settle(errorArg));
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
catch (error) {
|
|
52
|
+
if (error instanceof WebPushEndpointPolicyError)
|
|
53
|
+
throw error;
|
|
54
|
+
if (error instanceof WebPushTransportError)
|
|
55
|
+
throw error;
|
|
56
|
+
throw new WebPushTransportError('PUSH_NETWORK_ERROR', { cause: error });
|
|
57
|
+
}
|
|
58
|
+
const remainingRequestTimeoutMs = sendDeadline - Date.now();
|
|
59
|
+
if (remainingRequestTimeoutMs <= 0) {
|
|
60
|
+
throw new WebPushTransportError('PUSH_REQUEST_TIMEOUT');
|
|
61
|
+
}
|
|
62
|
+
const agent = createPinnedWebPushAgent(resolved);
|
|
63
|
+
try {
|
|
64
|
+
const requestDetails = plugins.webpush.generateRequestDetails(requestArg.subscription, requestArg.payload, {
|
|
65
|
+
TTL: requestArg.ttlSeconds,
|
|
66
|
+
contentEncoding: 'aes128gcm',
|
|
67
|
+
urgency: requestArg.urgency,
|
|
68
|
+
...(requestArg.topic ? { topic: requestArg.topic } : {}),
|
|
69
|
+
vapidDetails: requestArg.vapid,
|
|
70
|
+
});
|
|
71
|
+
if (requestDetails.method !== 'POST'
|
|
72
|
+
|| requestDetails.endpoint !== requestArg.subscription.endpoint
|
|
73
|
+
|| !Buffer.isBuffer(requestDetails.body)) {
|
|
74
|
+
throw new WebPushTransportError('PUSH_RESPONSE_INVALID');
|
|
75
|
+
}
|
|
76
|
+
return await new Promise((resolve, reject) => {
|
|
77
|
+
let settled = false;
|
|
78
|
+
let requestTimer;
|
|
79
|
+
const settle = (errorArg, responseArg) => {
|
|
80
|
+
if (settled)
|
|
81
|
+
return;
|
|
82
|
+
settled = true;
|
|
83
|
+
if (requestTimer)
|
|
84
|
+
clearTimeout(requestTimer);
|
|
85
|
+
if (errorArg)
|
|
86
|
+
reject(errorArg);
|
|
87
|
+
else
|
|
88
|
+
resolve(responseArg);
|
|
89
|
+
};
|
|
90
|
+
const pushRequest = plugins.https.request({
|
|
91
|
+
protocol: 'https:',
|
|
92
|
+
hostname: resolved.hostname,
|
|
93
|
+
servername: resolved.hostname,
|
|
94
|
+
port: 443,
|
|
95
|
+
path: `${resolved.url.pathname}${resolved.url.search}`,
|
|
96
|
+
method: 'POST',
|
|
97
|
+
headers: requestDetails.headers,
|
|
98
|
+
agent,
|
|
99
|
+
timeout: Math.min(this.connectTimeoutMs, remainingRequestTimeoutMs),
|
|
100
|
+
maxHeaderSize: 16_384,
|
|
101
|
+
setHost: true,
|
|
102
|
+
}, (pushResponse) => {
|
|
103
|
+
let responseBytes = 0;
|
|
104
|
+
pushResponse.on('data', (chunkArg) => {
|
|
105
|
+
responseBytes += Buffer.byteLength(chunkArg);
|
|
106
|
+
if (responseBytes > this.maxResponseBytes) {
|
|
107
|
+
const error = new WebPushTransportError('PUSH_RESPONSE_TOO_LARGE');
|
|
108
|
+
settle(error);
|
|
109
|
+
pushResponse.destroy(error);
|
|
110
|
+
pushRequest.destroy(error);
|
|
111
|
+
}
|
|
112
|
+
});
|
|
113
|
+
pushResponse.once('end', () => {
|
|
114
|
+
const statusCode = pushResponse.statusCode;
|
|
115
|
+
if (!Number.isSafeInteger(statusCode) || statusCode < 100 || statusCode > 599) {
|
|
116
|
+
settle(new WebPushTransportError('PUSH_RESPONSE_INVALID'));
|
|
117
|
+
return;
|
|
118
|
+
}
|
|
119
|
+
settle(null, {
|
|
120
|
+
statusCode: statusCode,
|
|
121
|
+
retryAfter: normalizeRetryAfter(pushResponse.headers['retry-after']),
|
|
122
|
+
});
|
|
123
|
+
});
|
|
124
|
+
pushResponse.once('error', (errorArg) => {
|
|
125
|
+
settle(errorArg instanceof WebPushTransportError
|
|
126
|
+
? errorArg
|
|
127
|
+
: new WebPushTransportError('PUSH_NETWORK_ERROR', { cause: errorArg }));
|
|
128
|
+
});
|
|
129
|
+
});
|
|
130
|
+
pushRequest.once('timeout', () => {
|
|
131
|
+
const error = new WebPushTransportError('PUSH_REQUEST_TIMEOUT');
|
|
132
|
+
settle(error);
|
|
133
|
+
pushRequest.destroy(error);
|
|
134
|
+
});
|
|
135
|
+
pushRequest.once('error', (errorArg) => {
|
|
136
|
+
settle(errorArg instanceof WebPushTransportError
|
|
137
|
+
? errorArg
|
|
138
|
+
: new WebPushTransportError('PUSH_NETWORK_ERROR', { cause: errorArg }));
|
|
139
|
+
});
|
|
140
|
+
requestTimer = setTimeout(() => {
|
|
141
|
+
const error = new WebPushTransportError('PUSH_REQUEST_TIMEOUT');
|
|
142
|
+
settle(error);
|
|
143
|
+
pushRequest.destroy(error);
|
|
144
|
+
}, remainingRequestTimeoutMs);
|
|
145
|
+
requestTimer.unref();
|
|
146
|
+
pushRequest.end(requestDetails.body);
|
|
147
|
+
});
|
|
148
|
+
}
|
|
149
|
+
finally {
|
|
150
|
+
agent.destroy();
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
normalizePositiveInteger(valueArg, defaultArg, labelArg) {
|
|
154
|
+
const value = valueArg ?? defaultArg;
|
|
155
|
+
if (!Number.isSafeInteger(value) || value <= 0) {
|
|
156
|
+
throw new Error(`Web Push transport ${labelArg} must be a positive integer`);
|
|
157
|
+
}
|
|
158
|
+
return value;
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy53ZWJwdXNoLXRyYW5zcG9ydC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3RzL3dlYnB1c2gvY2xhc3Nlcy53ZWJwdXNoLXRyYW5zcG9ydC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssT0FBTyxNQUFNLGVBQWUsQ0FBQztBQUN6QyxPQUFPLEVBQ0wsd0JBQXdCLEVBQ3hCLHNCQUFzQixFQUN0QiwwQkFBMEIsR0FFM0IsTUFBTSwrQkFBK0IsQ0FBQztBQStCdkMsTUFBTSxPQUFPLHFCQUFzQixTQUFRLEtBQUs7SUFFNUI7SUFEbEIsWUFDa0IsSUFBZ0MsRUFDaEQsYUFBa0MsRUFBRTtRQUVwQyxLQUFLLENBQUMsSUFBSSxFQUFFLFVBQVUsQ0FBQyxDQUFDO1FBSFIsU0FBSSxHQUFKLElBQUksQ0FBNEI7UUFJaEQsSUFBSSxDQUFDLElBQUksR0FBRyx1QkFBdUIsQ0FBQztJQUN0QyxDQUFDO0NBQ0Y7QUFVRCxNQUFNLG1CQUFtQixHQUFHLENBQUMsUUFBdUMsRUFBc0IsRUFBRTtJQUMxRixJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDO1FBQUUsT0FBTyxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztJQUMvRCxPQUFPLE9BQU8sUUFBUSxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztBQUMzRSxDQUFDLENBQUM7QUFFRixNQUFNLE9BQU8sb0JBQW9CO0lBQ2QsU0FBUyxDQUFxQjtJQUM5QixZQUFZLENBQVM7SUFDckIsZ0JBQWdCLENBQVM7SUFDekIsZ0JBQWdCLENBQVM7SUFDekIsZ0JBQWdCLENBQVM7SUFFMUMsWUFBbUIsYUFBMkMsRUFBRTtRQUM5RCxJQUFJLENBQUMsU0FBUyxHQUFHLFVBQVUs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
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import * as plugins from '../plugins.js';
|
|
2
|
+
export type TWebPushEndpointPolicyErrorCode = 'ENDPOINT_URL_INVALID' | 'ENDPOINT_SCHEME_INVALID' | 'ENDPOINT_PORT_INVALID' | 'ENDPOINT_AUTHORITY_INVALID' | 'ENDPOINT_FRAGMENT_INVALID' | 'ENDPOINT_IP_LITERAL_FORBIDDEN' | 'ENDPOINT_DNS_EMPTY' | 'ENDPOINT_DNS_UNSAFE';
|
|
3
|
+
export declare class WebPushEndpointPolicyError extends Error {
|
|
4
|
+
readonly code: TWebPushEndpointPolicyErrorCode;
|
|
5
|
+
constructor(code: TWebPushEndpointPolicyErrorCode);
|
|
6
|
+
}
|
|
7
|
+
export interface IWebPushDnsAddress {
|
|
8
|
+
address: string;
|
|
9
|
+
family: number;
|
|
10
|
+
}
|
|
11
|
+
export type TWebPushDnsLookup = (hostnameArg: string) => Promise<IWebPushDnsAddress[]>;
|
|
12
|
+
export interface IWebPushResolvedEndpoint {
|
|
13
|
+
url: URL;
|
|
14
|
+
hostname: string;
|
|
15
|
+
address: string;
|
|
16
|
+
family: 4 | 6;
|
|
17
|
+
}
|
|
18
|
+
export declare function isGloballyRoutableWebPushAddress(addressArg: string): boolean;
|
|
19
|
+
export declare function parseWebPushEndpoint(endpointArg: string): URL;
|
|
20
|
+
export declare function resolveWebPushEndpoint(endpointArg: string, lookupArg?: TWebPushDnsLookup): Promise<IWebPushResolvedEndpoint>;
|
|
21
|
+
export declare function createPinnedWebPushAgent(resolvedArg: IWebPushResolvedEndpoint): InstanceType<typeof plugins.https.Agent>;
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
import * as plugins from '../plugins.js';
|
|
2
|
+
export class WebPushEndpointPolicyError extends Error {
|
|
3
|
+
code;
|
|
4
|
+
constructor(code) {
|
|
5
|
+
super(code);
|
|
6
|
+
this.code = code;
|
|
7
|
+
this.name = 'WebPushEndpointPolicyError';
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
const defaultDnsLookup = async (hostnameArg) => {
|
|
11
|
+
return await plugins.dns.promises.lookup(hostnameArg, {
|
|
12
|
+
all: true,
|
|
13
|
+
verbatim: true,
|
|
14
|
+
});
|
|
15
|
+
};
|
|
16
|
+
export function isGloballyRoutableWebPushAddress(addressArg) {
|
|
17
|
+
const family = plugins.net.isIP(addressArg);
|
|
18
|
+
if (family !== 4 && family !== 6)
|
|
19
|
+
return false;
|
|
20
|
+
try {
|
|
21
|
+
const parsed = plugins.ipaddr.parse(addressArg);
|
|
22
|
+
if (parsed.kind() === 'ipv6'
|
|
23
|
+
&& 'isIPv4MappedAddress' in parsed
|
|
24
|
+
&& parsed.isIPv4MappedAddress())
|
|
25
|
+
return false;
|
|
26
|
+
return parsed.range() === 'unicast';
|
|
27
|
+
}
|
|
28
|
+
catch {
|
|
29
|
+
return false;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
export function parseWebPushEndpoint(endpointArg) {
|
|
33
|
+
if (typeof endpointArg !== 'string' || endpointArg.length === 0 || endpointArg.length > 4096) {
|
|
34
|
+
throw new WebPushEndpointPolicyError('ENDPOINT_URL_INVALID');
|
|
35
|
+
}
|
|
36
|
+
let endpoint;
|
|
37
|
+
try {
|
|
38
|
+
endpoint = new URL(endpointArg);
|
|
39
|
+
}
|
|
40
|
+
catch {
|
|
41
|
+
throw new WebPushEndpointPolicyError('ENDPOINT_URL_INVALID');
|
|
42
|
+
}
|
|
43
|
+
if (endpoint.protocol !== 'https:') {
|
|
44
|
+
throw new WebPushEndpointPolicyError('ENDPOINT_SCHEME_INVALID');
|
|
45
|
+
}
|
|
46
|
+
if (endpoint.port && endpoint.port !== '443') {
|
|
47
|
+
throw new WebPushEndpointPolicyError('ENDPOINT_PORT_INVALID');
|
|
48
|
+
}
|
|
49
|
+
if (endpoint.username || endpoint.password || !endpoint.hostname) {
|
|
50
|
+
throw new WebPushEndpointPolicyError('ENDPOINT_AUTHORITY_INVALID');
|
|
51
|
+
}
|
|
52
|
+
if (endpoint.hash) {
|
|
53
|
+
throw new WebPushEndpointPolicyError('ENDPOINT_FRAGMENT_INVALID');
|
|
54
|
+
}
|
|
55
|
+
const hostname = endpoint.hostname.startsWith('[') && endpoint.hostname.endsWith(']')
|
|
56
|
+
? endpoint.hostname.slice(1, -1)
|
|
57
|
+
: endpoint.hostname;
|
|
58
|
+
if (plugins.net.isIP(hostname) !== 0) {
|
|
59
|
+
throw new WebPushEndpointPolicyError('ENDPOINT_IP_LITERAL_FORBIDDEN');
|
|
60
|
+
}
|
|
61
|
+
return endpoint;
|
|
62
|
+
}
|
|
63
|
+
export async function resolveWebPushEndpoint(endpointArg, lookupArg = defaultDnsLookup) {
|
|
64
|
+
const url = parseWebPushEndpoint(endpointArg);
|
|
65
|
+
const hostname = url.hostname.toLowerCase();
|
|
66
|
+
const answers = await lookupArg(hostname);
|
|
67
|
+
if (!Array.isArray(answers) || answers.length === 0) {
|
|
68
|
+
throw new WebPushEndpointPolicyError('ENDPOINT_DNS_EMPTY');
|
|
69
|
+
}
|
|
70
|
+
const normalized = answers.map((answerArg) => ({
|
|
71
|
+
address: String(answerArg.address || '').trim(),
|
|
72
|
+
family: plugins.net.isIP(String(answerArg.address || '').trim()),
|
|
73
|
+
}));
|
|
74
|
+
if (normalized.some((answerArg) => ((answerArg.family !== 4 && answerArg.family !== 6)
|
|
75
|
+
|| !isGloballyRoutableWebPushAddress(answerArg.address)))) {
|
|
76
|
+
throw new WebPushEndpointPolicyError('ENDPOINT_DNS_UNSAFE');
|
|
77
|
+
}
|
|
78
|
+
const unique = Array.from(new Map(normalized.map((answerArg) => [`${answerArg.family}:${answerArg.address}`, answerArg])).values());
|
|
79
|
+
const selected = unique[0];
|
|
80
|
+
return {
|
|
81
|
+
url,
|
|
82
|
+
hostname,
|
|
83
|
+
address: selected.address,
|
|
84
|
+
family: selected.family,
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
export function createPinnedWebPushAgent(resolvedArg) {
|
|
88
|
+
const lookup = (hostnameArg, optionsArg, callbackArg) => {
|
|
89
|
+
if (hostnameArg.toLowerCase() !== resolvedArg.hostname) {
|
|
90
|
+
const error = new Error('Pinned Web Push agent hostname mismatch');
|
|
91
|
+
error.code = 'EHOSTUNREACH';
|
|
92
|
+
callbackArg(error, '', 0);
|
|
93
|
+
return;
|
|
94
|
+
}
|
|
95
|
+
if (optionsArg.all) {
|
|
96
|
+
callbackArg(null, [{
|
|
97
|
+
address: resolvedArg.address,
|
|
98
|
+
family: resolvedArg.family,
|
|
99
|
+
}]);
|
|
100
|
+
return;
|
|
101
|
+
}
|
|
102
|
+
callbackArg(null, resolvedArg.address, resolvedArg.family);
|
|
103
|
+
};
|
|
104
|
+
return new plugins.https.Agent({
|
|
105
|
+
keepAlive: false,
|
|
106
|
+
maxSockets: 1,
|
|
107
|
+
maxFreeSockets: 0,
|
|
108
|
+
lookup,
|
|
109
|
+
});
|
|
110
|
+
}
|
|
111
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGVscGVycy53ZWJwdXNoLWVuZHBvaW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vdHMvd2VicHVzaC9oZWxwZXJzLndlYnB1c2gtZW5kcG9pbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxLQUFLLE9BQU8sTUFBTSxlQUFlLENBQUM7QUFZekMsTUFBTSxPQUFPLDBCQUEyQixTQUFRLEtBQUs7SUFDaEI7SUFBbkMsWUFBbUMsSUFBcUM7UUFDdEUsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBRHFCLFNBQUksR0FBSixJQUFJLENBQWlDO1FBRXRFLElBQUksQ0FBQyxJQUFJLEdBQUcsNEJBQTRCLENBQUM7SUFDM0MsQ0FBQztDQUNGO0FBa0JELE1BQU0sZ0JBQWdCLEdBQXNCLEtBQUssRUFBRSxXQUFXLEVBQUUsRUFBRTtJQUNoRSxPQUFPLE1BQU0sT0FBTyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLFdBQVcsRUFBRTtRQUNwRCxHQUFHLEVBQUUsSUFBSTtRQUNULFFBQVEsRUFBRSxJQUFJO0tBQ2YsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDO0FBRUYsTUFBTSxVQUFVLGdDQUFnQyxDQUFDLFVBQWtCO0lBQ2pFLE1BQU0sTUFBTSxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQzVDLElBQUksTUFBTSxLQUFLLENBQUMsSUFBSSxNQUFNLEtBQUssQ0FBQztRQUFFLE9BQU8sS0FBSyxDQUFDO0lBQy9DLElBQUksQ0FBQztRQUNILE1BQU0sTUFBTSxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ2hELElBQ0UsTUFBTSxDQUFDLElBQUksRUFBRSxLQUFLLE1BQU07ZUFDckIscUJBQXFCLElBQUksTUFBTTtlQUMvQixNQUFNLENBQUMsbUJBQW1CLEVBQUU7WUFDL0IsT0FBTyxLQUFLLENBQUM7UUFDZixPQUFPLE1BQU0sQ0FBQyxLQUFLLEVBQUUsS0FBSyxTQUFTLENBQUM7SUFDdEMsQ0FBQztJQUFDLE1BQU0sQ0FBQztRQUNQLE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztBQUNILENBQUM7QUFFRCxNQUFNLFVBQVUsb0JBQW9CLENBQUMsV0FBbUI7SUFDdEQsSUFBSSxPQUFPLFdBQVcsS0FBSyxRQUFRLElBQUksV0FBVyxDQUFDLE1BQU0sS0FBSyxDQUFDLElBQUksV0FBVyxDQUFDLE1BQU0sR0FBRyxJQUFJLEVBQUUsQ0FBQztRQUM3RixNQUFNLElBQUksMEJBQTBCLENBQUMsc0JBQXNCLENBQUMsQ0FBQztJQUMvRCxDQUFDO0lBQ0QsSUFBSSxRQUFhLENBQUM7SUFDbEIsSUFBSSxDQUFDO1FBQ0gsUUFBUSxHQUFHLElBQUksR0FBRyxDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQ2xDLENBQUM7SUFBQyxNQUFNLENBQUM7UUFDUCxNQUFNLElBQUksMEJBQTBCLENBQUMsc0JBQXNCLENBQUMsQ0FBQztJQUMvRCxDQUFDO0lBQ0QsSUFBSSxRQUFRLENBQUMsUUFBUSxLQUFLLFFBQVEsRUFBRSxDQUFDO1FBQ25DLE1BQU0sSUFBSSwwQkFBMEIsQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDO0lBQ2xFLENBQUM7SUFDRCxJQUFJLFFBQVEsQ0FBQyxJQUFJLElBQUksUUFBUSxDQUFDLElBQUksS0FBSyxLQUFLLEVBQUUsQ0FBQztRQUM3QyxNQUFNLElBQUksMEJBQTBCLENBQUMsdUJBQXVCLENBQUMsQ0FBQztJQUNoRSxDQUFDO0lBQ0QsSUFBSSxRQUFRLENBQUMsUUFBUSxJQUFJLFFBQVEsQ0FBQyxRQUFRLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDakUsTUFBTSxJQUFJLDBCQUEwQixDQUFDLDRCQUE0QixDQUFDLENBQUM7SUFDckUsQ0FBQztJQUNELElBQUksUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ2xCLE1BQU0sSUFBSSwwQkFBMEIsQ0FBQywyQkFBMkIsQ0FBQyxDQUFDO0lBQ3BFLENBQUM7SUFDRCxNQUFNLFFBQVEsR0FBRyxRQUFRLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsSUFBSSxRQUFRLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUM7UUFDbkYsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUNoQyxDQUFDLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQztJQUN0QixJQUFJLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQ3JDLE1BQU0sSUFBSSwwQkFBMEIsQ0FBQywrQkFBK0IsQ0FBQyxDQUFDO0lBQ3hFLENBQUM7SUFDRCxPQUFPLFFBQVEsQ0FBQztBQUNsQixDQUFDO0FBRUQsTUFBTSxDQUFDLEtBQUssVUFBVSxzQkFBc0IsQ0FDMUMsV0FBbUIsRUFDbkIsWUFBK0IsZ0JBQWdCO0lBRS9DLE1BQU0sR0FBRyxHQUFHLG9CQUFvQixDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQzlDLE1BQU0sUUFBUSxHQUFHLEdBQUcsQ0FBQyxRQUFRLENBQUMsV0FBVyxFQUFFLENBQUM7SUFDNUMsTUFBTSxPQUFPLEdBQUcsTUFBTSxTQUFTLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDMUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLElBQUksT0FBTyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztRQUNwRCxNQUFNLElBQUksMEJBQTBCLENBQUMsb0JBQW9CLENBQUMsQ0FBQztJQUM3RCxDQUFDO0lBQ0QsTUFBTSxVQUFVLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFNBQVMsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUM3QyxPQUFPLEVBQUUsTUFBTSxDQUFDLFNBQVMsQ0FBQyxPQUFPLElBQUksRUFBRSxDQUFDLENBQUMsSUFBSSxFQUFFO1FBQy9DLE1BQU0sRUFBRSxPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLE9BQU8sSUFBSSxFQUFFLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztLQUNqRSxDQUFDLENBQUMsQ0FBQztJQUNKLElBQ0UsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLFNBQVMsRUFBRSxFQUFFLENBQUMsQ0FDN0IsQ0FBQyxTQUFTLENBQUMsTUFBTSxLQUFLLENBQUMsSUFBSSxTQUFTLENBQUMsTUFBTSxLQUFLLENBQUMsQ0FBQztXQUMvQyxDQUFDLGdDQUFnQyxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FDeEQsQ0FBQyxFQUNGLENBQUM7UUFDRCxNQUFNLElBQUksMEJBQTBCLENBQUMscUJBQXFCLENBQUMsQ0FBQztJQUM5RCxDQUFDO0lBQ0QsTUFBTSxNQUFNLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FDdkIsSUFBSSxHQUFHLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDLFNBQVMsRUFBRSxFQUFFLENBQUMsQ0FBQyxHQUFHLFNBQVMsQ0FBQyxNQUFNLElBQUksU0FBUyxDQUFDLE9BQU8sRUFBRSxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FDekcsQ0FBQztJQUNGLE1BQU0sUUFBUSxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQXVDLENBQUM7SUFDakUsT0FBTztRQUNMLEdBQUc7UUFDSCxRQUFRO1FBQ1IsT0FBTyxFQUFFLFFBQVEsQ0FBQyxPQUFPO1FBQ3pCLE1BQU0sRUFBRSxRQUFRLENBQUMsTUFBTTtLQUN4QixDQUFDO0FBQ0osQ0FBQztBQUVELE1BQU0sVUFBVSx3QkFBd0IsQ0FDdEMsV0FBcUM7SUFFckMsTUFBTSxNQUFNLEdBQW1CLENBQUMsV0FBVyxFQUFFLFVBQVUsRUFBRSxXQUFXLEVBQUUsRUFBRTtRQUN0RSxJQUFJLFdBQVcsQ0FBQyxXQUFXLEVBQUUsS0FBSyxXQUFXLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDdkQsTUFBTSxLQUFLLEdBQUcsSUFBSSxLQUFLLENBQUMseUNBQXlDLENBQTBCLENBQUM7WUFDNUYsS0FBSyxDQUFDLElBQUksR0FBRyxjQUFjLENBQUM7WUFDNUIsV0FBVyxDQUFDLEtBQUssRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDMUIsT0FBTztRQUNULENBQUM7UUFDRCxJQUFJLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQztZQUNuQixXQUFXLENBQUMsSUFBSSxFQUFFLENBQUM7b0JBQ2pCLE9BQU8sRUFBRSxXQUFXLENBQUMsT0FBTztvQkFDNUIsTUFBTSxFQUFFLFdBQVcsQ0FBQyxNQUFNO2lCQUMzQixDQUFDLENBQUMsQ0FBQztZQUNKLE9BQU87UUFDVCxDQUFDO1FBQ0QsV0FBVyxDQUFDLElBQUksRUFBRSxXQUFXLENBQUMsT0FBTyxFQUFFLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUM3RCxDQUFDLENBQUM7SUFDRixPQUFPLElBQUksT0FBTyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUM7UUFDN0IsU0FBUyxFQUFFLEtBQUs7UUFDaEIsVUFBVSxFQUFFLENBQUM7UUFDYixjQUFjLEVBQUUsQ0FBQztRQUNqQixNQUFNO0tBQ1AsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyJ9
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export * from './classes.webpush-crypto.js';
|
|
2
|
+
export * from './classes.webpush-manager.js';
|
|
3
|
+
export * from './classes.webpush-transport.js';
|
|
4
|
+
export * from './helpers.webpush-endpoint.js';
|
|
5
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi90cy93ZWJwdXNoL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGNBQWMsNkJBQTZCLENBQUM7QUFDNUMsY0FBYyw4QkFBOEIsQ0FBQztBQUM3QyxjQUFjLGdDQUFnQyxDQUFDO0FBQy9DLGNBQWMsK0JBQStCLENBQUMifQ==
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export type TWebPushIndexCollection = 'WebPushBindingDoc' | 'WebPushAdmissionDoc' | 'WebPushSpoolDoc';
|
|
2
|
+
export interface IWebPushIndexSpecification {
|
|
3
|
+
collection: TWebPushIndexCollection;
|
|
4
|
+
name: string;
|
|
5
|
+
key: Record<string, 1 | -1>;
|
|
6
|
+
unique?: true;
|
|
7
|
+
expireAfterSeconds?: number;
|
|
8
|
+
partialFilterExpression?: Record<string, unknown>;
|
|
9
|
+
}
|
|
10
|
+
export declare const webPushIndexSpecifications: IWebPushIndexSpecification[];
|
|
11
|
+
export declare function getWebPushIndexSpecifications(collectionArg: TWebPushIndexCollection): IWebPushIndexSpecification[];
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
export const webPushIndexSpecifications = [
|
|
2
|
+
{
|
|
3
|
+
collection: 'WebPushBindingDoc',
|
|
4
|
+
name: 'web_push_binding_id_unique',
|
|
5
|
+
key: { id: 1 },
|
|
6
|
+
unique: true,
|
|
7
|
+
},
|
|
8
|
+
{
|
|
9
|
+
collection: 'WebPushBindingDoc',
|
|
10
|
+
name: 'web_push_binding_owner_unique',
|
|
11
|
+
key: {
|
|
12
|
+
ownerGatewayClientType: 1,
|
|
13
|
+
ownerGatewayClientId: 1,
|
|
14
|
+
ownerAppInstanceId: 1,
|
|
15
|
+
},
|
|
16
|
+
unique: true,
|
|
17
|
+
},
|
|
18
|
+
{
|
|
19
|
+
collection: 'WebPushBindingDoc',
|
|
20
|
+
name: 'web_push_binding_credential_unique',
|
|
21
|
+
key: { 'credential.id': 1 },
|
|
22
|
+
unique: true,
|
|
23
|
+
},
|
|
24
|
+
{
|
|
25
|
+
collection: 'WebPushBindingDoc',
|
|
26
|
+
name: 'web_push_binding_previous_credential_lookup',
|
|
27
|
+
key: { 'previousCredentials.id': 1 },
|
|
28
|
+
},
|
|
29
|
+
{
|
|
30
|
+
collection: 'WebPushBindingDoc',
|
|
31
|
+
name: 'web_push_binding_previous_credential_cleanup',
|
|
32
|
+
key: { 'previousCredentials.validUntil': 1 },
|
|
33
|
+
},
|
|
34
|
+
{
|
|
35
|
+
collection: 'WebPushBindingDoc',
|
|
36
|
+
name: 'web_push_binding_rotation_recovery_cleanup',
|
|
37
|
+
key: { 'credentialRotationRecovery.expiresAt': 1 },
|
|
38
|
+
},
|
|
39
|
+
{
|
|
40
|
+
collection: 'WebPushBindingDoc',
|
|
41
|
+
name: 'web_push_binding_vapid_status_cleanup',
|
|
42
|
+
key: { 'vapidKeys.status': 1 },
|
|
43
|
+
},
|
|
44
|
+
{
|
|
45
|
+
collection: 'WebPushBindingDoc',
|
|
46
|
+
name: 'web_push_binding_vapid_retire_after_cleanup',
|
|
47
|
+
key: { 'vapidKeys.retireAfter': 1 },
|
|
48
|
+
},
|
|
49
|
+
{
|
|
50
|
+
collection: 'WebPushBindingDoc',
|
|
51
|
+
name: 'web_push_binding_disabled_cleanup',
|
|
52
|
+
key: { enabled: 1, lifecycleGeneration: 1 },
|
|
53
|
+
},
|
|
54
|
+
{
|
|
55
|
+
collection: 'WebPushBindingDoc',
|
|
56
|
+
name: 'web_push_binding_deleted_cleanup',
|
|
57
|
+
key: { deletedAt: 1, lifecycleGeneration: 1 },
|
|
58
|
+
},
|
|
59
|
+
{
|
|
60
|
+
collection: 'WebPushAdmissionDoc',
|
|
61
|
+
name: 'web_push_admission_binding_unique',
|
|
62
|
+
key: { bindingId: 1, lifecycleGeneration: 1 },
|
|
63
|
+
unique: true,
|
|
64
|
+
},
|
|
65
|
+
{
|
|
66
|
+
collection: 'WebPushAdmissionDoc',
|
|
67
|
+
name: 'web_push_admission_ttl',
|
|
68
|
+
key: { purgeAt: 1 },
|
|
69
|
+
expireAfterSeconds: 0,
|
|
70
|
+
},
|
|
71
|
+
{
|
|
72
|
+
collection: 'WebPushSpoolDoc',
|
|
73
|
+
name: 'web_push_spool_id_unique',
|
|
74
|
+
key: { id: 1 },
|
|
75
|
+
unique: true,
|
|
76
|
+
},
|
|
77
|
+
{
|
|
78
|
+
collection: 'WebPushSpoolDoc',
|
|
79
|
+
name: 'web_push_spool_idempotency_unique',
|
|
80
|
+
key: {
|
|
81
|
+
bindingId: 1,
|
|
82
|
+
lifecycleGeneration: 1,
|
|
83
|
+
credentialId: 1,
|
|
84
|
+
idempotencyKeyDigest: 1,
|
|
85
|
+
},
|
|
86
|
+
unique: true,
|
|
87
|
+
},
|
|
88
|
+
{
|
|
89
|
+
collection: 'WebPushSpoolDoc',
|
|
90
|
+
name: 'web_push_spool_delivery_scan',
|
|
91
|
+
key: { state: 1, nextAttemptAt: 1, leaseExpiresAt: 1 },
|
|
92
|
+
},
|
|
93
|
+
{
|
|
94
|
+
collection: 'WebPushSpoolDoc',
|
|
95
|
+
name: 'web_push_spool_cancellation_scan',
|
|
96
|
+
key: { bindingId: 1, lifecycleGeneration: 1, subscriptionId: 1, state: 1 },
|
|
97
|
+
},
|
|
98
|
+
{
|
|
99
|
+
collection: 'WebPushSpoolDoc',
|
|
100
|
+
name: 'web_push_spool_cancelled_lease_scan',
|
|
101
|
+
key: { state: 1, cancelRequestedAt: 1, leaseExpiresAt: 1, id: 1 },
|
|
102
|
+
},
|
|
103
|
+
{
|
|
104
|
+
collection: 'WebPushSpoolDoc',
|
|
105
|
+
name: 'web_push_spool_lifecycle_drain_scan',
|
|
106
|
+
key: { bindingId: 1, lifecycleGeneration: 1, state: 1, leaseExpiresAt: 1 },
|
|
107
|
+
},
|
|
108
|
+
{
|
|
109
|
+
collection: 'WebPushSpoolDoc',
|
|
110
|
+
name: 'web_push_spool_vapid_retirement_scan',
|
|
111
|
+
key: { bindingId: 1, lifecycleGeneration: 1, vapidKeyId: 1, state: 1 },
|
|
112
|
+
},
|
|
113
|
+
{
|
|
114
|
+
collection: 'WebPushSpoolDoc',
|
|
115
|
+
name: 'web_push_spool_terminal_ttl',
|
|
116
|
+
key: { purgeAt: 1 },
|
|
117
|
+
expireAfterSeconds: 0,
|
|
118
|
+
},
|
|
119
|
+
];
|
|
120
|
+
export function getWebPushIndexSpecifications(collectionArg) {
|
|
121
|
+
return webPushIndexSpecifications.filter((specificationArg) => specificationArg.collection === collectionArg);
|
|
122
|
+
}
|
|
123
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2VicHVzaC1pbmRleGVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vdHMvd2VicHVzaC93ZWJwdXNoLWluZGV4ZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBY0EsTUFBTSxDQUFDLE1BQU0sMEJBQTBCLEdBQWlDO0lBQ3RFO1FBQ0UsVUFBVSxFQUFFLG1CQUFtQjtRQUMvQixJQUFJLEVBQUUsNEJBQTRCO1FBQ2xDLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUU7UUFDZCxNQUFNLEVBQUUsSUFBSTtLQUNiO0lBQ0Q7UUFDRSxVQUFVLEVBQUUsbUJBQW1CO1FBQy9CLElBQUksRUFBRSwrQkFBK0I7UUFDckMsR0FBRyxFQUFFO1lBQ0gsc0JBQXNCLEVBQUUsQ0FBQztZQUN6QixvQkFBb0IsRUFBRSxDQUFDO1lBQ3ZCLGtCQUFrQixFQUFFLENBQUM7U0FDdEI7UUFDRCxNQUFNLEVBQUUsSUFBSTtLQUNiO0lBQ0Q7UUFDRSxVQUFVLEVBQUUsbUJBQW1CO1FBQy9CLElBQUksRUFBRSxvQ0FBb0M7UUFDMUMsR0FBRyxFQUFFLEVBQUUsZUFBZSxFQUFFLENBQUMsRUFBRTtRQUMzQixNQUFNLEVBQUUsSUFBSTtLQUNiO0lBQ0Q7UUFDRSxVQUFVLEVBQUUsbUJBQW1CO1FBQy9CLElBQUksRUFBRSw2Q0FBNkM7UUFDbkQsR0FBRyxFQUFFLEVBQUUsd0JBQXdCLEVBQUUsQ0FBQyxFQUFFO0tBQ3JDO0lBQ0Q7UUFDRSxVQUFVLEVBQUUsbUJBQW1CO1FBQy9CLElBQUksRUFBRSw4Q0FBOEM7UUFDcEQsR0FBRyxFQUFFLEVBQUUsZ0NBQWdDLEVBQUUsQ0FBQyxFQUFFO0tBQzdDO0lBQ0Q7UUFDRSxVQUFVLEVBQUUsbUJBQW1CO1FBQy9CLElBQUksRUFBRSw0Q0FBNEM7UUFDbEQsR0FBRyxFQUFFLEVBQUUsc0NBQXNDLEVBQUUsQ0FBQyxFQUFFO0tBQ25EO0lBQ0Q7UUFDRSxVQUFVLEVBQUUsbUJBQW1CO1FBQy9CLElBQUks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
|
|
@@ -148,14 +148,26 @@ export interface IRouteRemoteIngress {
|
|
|
148
148
|
* When absent, the route applies to all edges. */
|
|
149
149
|
edgeFilter?: string[];
|
|
150
150
|
}
|
|
151
|
+
export interface IRouteIngress {
|
|
152
|
+
/** Accept traffic connected directly to the gateway hub listener. */
|
|
153
|
+
directHub: boolean;
|
|
154
|
+
/** Accept authenticated SmartVPN traffic carrying trusted VPN metadata. */
|
|
155
|
+
smartVpn: boolean;
|
|
156
|
+
}
|
|
151
157
|
/**
|
|
152
158
|
* Extended route config used within dcrouter.
|
|
153
|
-
* Adds
|
|
159
|
+
* Adds explicit ingress path policy and dcrouter compatibility properties to
|
|
160
|
+
* SmartProxy's IRouteConfig.
|
|
154
161
|
* SmartProxy ignores unknown properties at runtime.
|
|
155
162
|
*/
|
|
156
163
|
export type IDcRouterRouteConfig = IRouteConfig & {
|
|
164
|
+
/**
|
|
165
|
+
* Explicit trusted ingress paths. New routes must opt in; direct hub
|
|
166
|
+
* listening is intentionally not a default.
|
|
167
|
+
*/
|
|
168
|
+
ingress?: IRouteIngress;
|
|
157
169
|
remoteIngress?: IRouteRemoteIngress;
|
|
158
|
-
/**
|
|
170
|
+
/** Compatibility policy: only VPN clients whose TargetProfile matches this route get access.
|
|
159
171
|
* Matching is determined by domain overlap, target overlap, or direct routeRef. */
|
|
160
172
|
vpnOnly?: boolean;
|
|
161
173
|
};
|
|
@@ -120,4 +120,4 @@ export function canonicalizeSourceRouteId(routeId) {
|
|
|
120
120
|
const sourceVariantIndex = routeId.indexOf(':source:');
|
|
121
121
|
return sourceVariantIndex === -1 ? routeId : routeId.slice(0, sourceVariantIndex);
|
|
122
122
|
}
|
|
123
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
123
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUtbWFuYWdlbWVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3RzX2ludGVyZmFjZXMvZGF0YS9yb3V0ZS1tYW5hZ2VtZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQXFCQSwrRUFBK0U7QUFDL0UsOEJBQThCO0FBQzlCLCtFQUErRTtBQUUvRSxNQUFNLENBQUMsTUFBTSxjQUFjLEdBQUc7SUFDNUIsR0FBRztJQUNILGFBQWE7SUFDYixjQUFjO0lBQ2QsYUFBYTtJQUNiLFlBQVk7SUFDWixXQUFXO0lBQ1gsb0JBQW9CO0lBQ3BCLHFCQUFxQjtJQUNyQixlQUFlO0lBQ2YsZ0JBQWdCO0lBQ2hCLGFBQWE7SUFDYixjQUFjO0lBQ2QsbUJBQW1CO0lBQ25CLG9CQUFvQjtJQUNwQixhQUFhO0lBQ2IsZUFBZTtJQUNmLFlBQVk7SUFDWixjQUFjO0lBQ2Qsc0JBQXNCO0lBQ3RCLHVCQUF1QjtJQUN2QixzQkFBc0I7SUFDdEIsdUJBQXVCO0lBQ3ZCLGNBQWM7SUFDZCxlQUFlO0lBQ2Ysb0JBQW9CO0lBQ3BCLHFCQUFxQjtJQUNyQixjQUFjO0lBQ2QsZUFBZTtJQUNmLGtCQUFrQjtJQUNsQixtQkFBbUI7SUFDbkIsa0JBQWtCO0lBQ2xCLG1CQUFtQjtJQUNuQixvQkFBb0I7SUFDcEIscUJBQXFCO0lBQ3JCLHFCQUFxQjtJQUNyQixzQkFBc0I7SUFDdEIsVUFBVTtJQUNWLFdBQVc7SUFDWCxhQUFhO0lBQ2IsY0FBYztJQUNkLHNCQUFzQjtJQUN0Qix1QkFBdUI7SUFDdkIsa0JBQWtCO0lBQ2xCLG1CQUFtQjtDQUNYLENBQUM7QUFpRlgsTUFBTSxDQUFDLE1BQU0sZ0JBQWdCLEdBQUc7SUFDOUIsZ0JBQWdCO0lBQ2hCLFFBQVE7SUFDUixhQUFhO0lBQ2IsZ0JBQWdCO0lBQ2hCLEtBQUs7SUFDTCxTQUFTO0NBQ0QsQ0FBQztBQUlYLE1BQU0sQ0FBQyxNQUFNLHlCQUF5QixHQUFvQztJQUN4RSxnQkFBZ0IsRUFBRSxnQkFBZ0I7SUFDbEMsTUFBTSxFQUFFLGVBQWU7SUFDdkIsYUFBYSxFQUFFLGFBQWE7SUFDNUIsZ0JBQWdCLEVBQUUsZ0JBQWdCO0lBQ2xDLEdBQUcsRUFBRSxXQUFXO0lBQ2hCLE9BQU8sRUFBRSxVQUFVO0NBQ3BCLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSwyQkFBMkIsR0FBc0M7SUFDNUUsZ0JBQWdCLEVBQUU7UUFDaEIsb0JBQW9CO1FBQ3BCLDBCQUEwQjtRQUMxQiwyQkFBMkI7UUFDM0IsbUJBQW1CO1FBQ25CLHFCQUFxQjtLQUN0QjtJQUNELE1BQU0sRUFBRTtRQUNOLFdBQVc7UUFDWCxZQUFZO1FBQ1osaUJBQWlCO1FBQ2pCLGdCQUFnQjtRQUNoQixRQUFRO1FBQ1IsUUFBUTtRQUNSLE9BQU87UUFDUCxVQUFVO1FBQ1YsY0FBYztLQUNmO0lBQ0QsYUFBYSxFQUFFLEVBQUU7SUFDakIsZ0JBQWdCLEVBQUU7UUFDaEIsWUFBWTtRQUNaLFNBQVM7UUFDVCxXQUFXO1FBQ1gsUUFBUTtRQUNSLFVBQVU7UUFDVixTQUFTO1FBQ1QsZ0JBQWdCO1FBQ2hCLFlBQVk7UUFDWixlQUFlO1FBQ2YsWUFBWTtRQUNaLFlBQVk7UUFDWixlQUFlO1FBQ2YsYUFBYTtRQUNiLFlBQVk7UUFDWixlQUFlO1FBQ2YsY0FBYztRQUNkLGVBQWU7S0FDaEI7SUFDRCxHQUFHLEVBQUU7UUFDSCxZQUFZO1FBQ1osWUFBWTtLQUNiO0lBQ0QsT0FBTyxFQUFFO1FBQ1AsZ0JBQWdCO1FBQ2hCLDBCQUEwQjtLQUMzQjtDQUNGLENBQUM7QUFtREYsK0VBQStFO0FBQy9FLHVCQUF1QjtBQUN2QiwrRUFBK0U7QUFFL0UsTUFBTSxDQUFDLE1BQU0saUJBQWlCLEdBQUcsQ0FBQyw0QkFBNEIsQ0FBVSxDQUFDO0FBdUZ6RSxnRkFBZ0Y7QUFDaEYsTUFBTSxVQUFVLHlCQUF5QixDQUFDLE9BQWU7SUFDdkQsTUFBTSxrQkFBa0IsR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQ3ZELE9BQU8sa0JBQWtCLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsa0JBQWtCLENBQUMsQ0FBQztBQUNwRixDQUFDIn0=
|