@serve.zone/dcrouter 34.6.0 → 34.7.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/dist_ts/00_commitinfo_data.js +1 -1
- package/dist_ts/classes.dcrouter.d.ts +7 -0
- package/dist_ts/classes.dcrouter.js +5 -4
- package/dist_ts/email/classes.coremail-gateway.manager.d.ts +23 -9
- package/dist_ts/email/classes.coremail-gateway.manager.js +55 -14
- package/dist_ts/email/coremail-gateway-runtime.d.ts +5 -2
- package/dist_ts/email/coremail-gateway-runtime.js +14 -10
- package/dist_ts/opsserver/classes.coremail-gateway-server.d.ts +35 -0
- package/dist_ts/opsserver/classes.coremail-gateway-server.js +91 -0
- package/dist_ts/opsserver/classes.opsserver.d.ts +5 -2
- package/dist_ts/opsserver/classes.opsserver.js +14 -3
- package/dist_ts/plugins.d.ts +3 -0
- package/dist_ts/plugins.js +8 -1
- package/dist_ts_web/00_commitinfo_data.js +1 -1
- package/package.json +5 -1
- package/readme.md +19 -3
- package/ts/00_commitinfo_data.ts +1 -1
- package/ts/classes.dcrouter.ts +12 -3
- package/ts/email/classes.coremail-gateway.manager.ts +102 -37
- package/ts/email/coremail-gateway-runtime.ts +21 -14
- package/ts/opsserver/classes.coremail-gateway-server.ts +104 -0
- package/ts/opsserver/classes.opsserver.ts +16 -2
- package/ts/plugins.ts +12 -0
- package/ts_web/00_commitinfo_data.ts +1 -1
|
@@ -7,6 +7,7 @@ import * as interfaces from '../../dist_ts_interfaces/index.js';
|
|
|
7
7
|
import { McpManager } from './classes.mcpmanager.js';
|
|
8
8
|
import { createLogStreamAuthorizationAdapter } from './helpers/logstream-auth.js';
|
|
9
9
|
import { WorkloadMailServer } from './classes.workload-mail-server.js';
|
|
10
|
+
import { CoreMailGatewayServer } from './classes.coremail-gateway-server.js';
|
|
10
11
|
export class OpsServer {
|
|
11
12
|
dcRouterRef;
|
|
12
13
|
server;
|
|
@@ -52,6 +53,8 @@ export class OpsServer {
|
|
|
52
53
|
// Detach the edges start() adds to the dcRouter's main typedrouter, which outlives this server.
|
|
53
54
|
dcRouterEdgeDisposers = [];
|
|
54
55
|
workloadMailServer;
|
|
56
|
+
/** The CoreMail gateway listener (wire 9) while it runs; absent unless configured. */
|
|
57
|
+
coreMailGatewayServer;
|
|
55
58
|
/** The port the Ops server listens on from its completed start until its stop begins. */
|
|
56
59
|
listeningPort;
|
|
57
60
|
constructor(dcRouterRefArg) {
|
|
@@ -59,8 +62,8 @@ export class OpsServer {
|
|
|
59
62
|
}
|
|
60
63
|
/**
|
|
61
64
|
* The Ops server's socket once its start completed: typedserver binds every address (`0.0.0.0`)
|
|
62
|
-
* and refuses `start()` on an address another socket holds. The workload mail
|
|
63
|
-
* 127.0.0.1 only and
|
|
65
|
+
* and refuses `start()` on an address another socket holds. The workload mail and CoreMail
|
|
66
|
+
* gateway listeners bind 127.0.0.1 only and are never public, so they are not listed.
|
|
64
67
|
*/
|
|
65
68
|
getListeningSockets() {
|
|
66
69
|
return this.listeningPort === undefined
|
|
@@ -91,6 +94,10 @@ export class OpsServer {
|
|
|
91
94
|
this.workloadMailServer = new WorkloadMailServer(this.dcRouterRef.options.workloadMailServer, () => this.dcRouterRef.workAppMailManager);
|
|
92
95
|
await this.workloadMailServer.start();
|
|
93
96
|
}
|
|
97
|
+
if (this.dcRouterRef.options.coreMailGatewayServer) {
|
|
98
|
+
this.coreMailGatewayServer = new CoreMailGatewayServer(this.dcRouterRef.options.coreMailGatewayServer, this.dcRouterRef.coreMailGatewayManager);
|
|
99
|
+
await this.coreMailGatewayServer.start();
|
|
100
|
+
}
|
|
94
101
|
}
|
|
95
102
|
catch (startError) {
|
|
96
103
|
// Nobody stops a server whose start failed (ServiceManager rolls back only the services that
|
|
@@ -209,6 +216,10 @@ export class OpsServer {
|
|
|
209
216
|
await this.workloadMailServer?.stop();
|
|
210
217
|
this.workloadMailServer = undefined;
|
|
211
218
|
}),
|
|
219
|
+
attempt(async () => {
|
|
220
|
+
await this.coreMailGatewayServer?.stop();
|
|
221
|
+
this.coreMailGatewayServer = undefined;
|
|
222
|
+
}),
|
|
212
223
|
attempt(() => this.server?.stop()),
|
|
213
224
|
attempt(() => this.logsHandler?.cleanup()),
|
|
214
225
|
]);
|
|
@@ -241,4 +252,4 @@ export class OpsServer {
|
|
|
241
252
|
throw new AggregateError(failures, 'Ops server cleanup failed');
|
|
242
253
|
}
|
|
243
254
|
}
|
|
244
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5vcHNzZXJ2ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi90cy9vcHNzZXJ2ZXIvY2xhc3Nlcy5vcHNzZXJ2ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxLQUFLLE9BQU8sTUFBTSxlQUFlLENBQUM7QUFDekMsT0FBTyxLQUFLLEtBQUssTUFBTSxhQUFhLENBQUM7QUFDckMsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ3RELE9BQU8sS0FBSyxRQUFRLE1BQU0scUJBQXFCLENBQUM7QUFDaEQsT0FBTyxFQUFFLGlDQUFpQyxFQUE0QixNQUFNLGtDQUFrQyxDQUFDO0FBQy9HLE9BQU8sS0FBSyxVQUFVLE1BQU0sOEJBQThCLENBQUM7QUFDM0QsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ3JELE9BQU8sRUFBRSxtQ0FBbUMsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQ2xGLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBR3ZFLE1BQU0sT0FBTyxTQUFTO0lBQ2IsV0FBVyxDQUFXO0lBQ3RCLE1BQU0sQ0FBMkQ7SUFFeEUsMkZBQTJGO0lBQ3BGLFdBQVcsR0FBRyxJQUFJLE9BQU8sQ0FBQyxZQUFZLENBQUMsV0FBVyxFQUFFLENBQUM7SUFFNUQsOEVBQThFO0lBQ3ZFLFVBQVUsR0FBRyxJQUFJLE9BQU8sQ0FBQyxZQUFZLENBQUMsV0FBVyxFQUE0RSxDQUFDO0lBQzlILFdBQVcsR0FBRyxJQUFJLE9BQU8sQ0FBQyxZQUFZLENBQUMsV0FBVyxFQUE0RSxDQUFDO0lBRXRJLG9CQUFvQjtJQUNiLFlBQVksQ0FBeUI7SUFDckMsZUFBZSxDQUE0QjtJQUMxQyxhQUFhLENBQTBCO0lBQ3ZDLFdBQVcsQ0FBd0I7SUFDbkMsZUFBZSxDQUE0QjtJQUMzQyxZQUFZLENBQXlCO0lBQ3JDLGFBQWEsQ0FBMEI7SUFDdkMsZUFBZSxD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
|
|
255
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5vcHNzZXJ2ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi90cy9vcHNzZXJ2ZXIvY2xhc3Nlcy5vcHNzZXJ2ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxLQUFLLE9BQU8sTUFBTSxlQUFlLENBQUM7QUFDekMsT0FBTyxLQUFLLEtBQUssTUFBTSxhQUFhLENBQUM7QUFDckMsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ3RELE9BQU8sS0FBSyxRQUFRLE1BQU0scUJBQXFCLENBQUM7QUFDaEQsT0FBTyxFQUFFLGlDQUFpQyxFQUE0QixNQUFNLGtDQUFrQyxDQUFDO0FBQy9HLE9BQU8sS0FBSyxVQUFVLE1BQU0sOEJBQThCLENBQUM7QUFDM0QsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ3JELE9BQU8sRUFBRSxtQ0FBbUMsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQ2xGLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBQ3ZFLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLHNDQUFzQyxDQUFDO0FBRzdFLE1BQU0sT0FBTyxTQUFTO0lBQ2IsV0FBVyxDQUFXO0lBQ3RCLE1BQU0sQ0FBMkQ7SUFFeEUsMkZBQTJGO0lBQ3BGLFdBQVcsR0FBRyxJQUFJLE9BQU8sQ0FBQyxZQUFZLENBQUMsV0FBVyxFQUFFLENBQUM7SUFFNUQsOEVBQThFO0lBQ3ZFLFVBQVUsR0FBRyxJQUFJLE9BQU8sQ0FBQyxZQUFZLENBQUMsV0FBVyxFQUE0RSxDQUFDO0lBQzlILFdBQVcsR0FBRyxJQUFJLE9BQU8sQ0FBQyxZQUFZLENBQUMsV0FBVyxFQUE0RSxDQUFDO0lBRXRJLG9CQUFvQjtJQUNiLFlBQVksQ0FBeUI7SUFDckMsZUFBZSxDQUE0QjtJQUMxQyxhQUFhLENBQTBCO0lBQ3ZDLFdBQVcsQ0FBd0I7SUFDbkMsZUFBZSxDQUE0QjtJ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
|
package/dist_ts/plugins.d.ts
CHANGED
|
@@ -22,6 +22,9 @@ import * as typedrequestInterfaces from '@api.global/typedrequest-interfaces';
|
|
|
22
22
|
import * as typedserver from '@api.global/typedserver';
|
|
23
23
|
import * as typedsocket from '@api.global/typedsocket';
|
|
24
24
|
export { typedrequest, typedrequestInterfaces, typedserver, typedsocket, };
|
|
25
|
+
import * as typedrequestCoreMail from '@api.global/typedrequest-coremail';
|
|
26
|
+
import * as typedserverCoreMail from '@api.global/typedserver-coremail';
|
|
27
|
+
export { typedrequestCoreMail, typedserverCoreMail, };
|
|
25
28
|
import * as idpSdkServer from '@idp.global/sdk/server';
|
|
26
29
|
export { idpSdkServer, };
|
|
27
30
|
import * as smartdata from '@lossless.org/client/nosqldb';
|
package/dist_ts/plugins.js
CHANGED
|
@@ -25,6 +25,13 @@ import * as typedrequestInterfaces from '@api.global/typedrequest-interfaces';
|
|
|
25
25
|
import * as typedserver from '@api.global/typedserver';
|
|
26
26
|
import * as typedsocket from '@api.global/typedsocket';
|
|
27
27
|
export { typedrequest, typedrequestInterfaces, typedserver, typedsocket, };
|
|
28
|
+
// The CoreMail gateway listener's wire (Linus ruling 70, L1 and L2): TypedServer 16 with its
|
|
29
|
+
// TypedSocket 10 (wire major 9) and the TypedRequest 9 copy that TypedServer resolves, under aliases
|
|
30
|
+
// only `CoreMailGatewayServer` and the gateway handlers it serves use. Everything else stays on the
|
|
31
|
+
// TypedSocket 8 packages above.
|
|
32
|
+
import * as typedrequestCoreMail from '@api.global/typedrequest-coremail';
|
|
33
|
+
import * as typedserverCoreMail from '@api.global/typedserver-coremail';
|
|
34
|
+
export { typedrequestCoreMail, typedserverCoreMail, };
|
|
28
35
|
// @idp.global scope
|
|
29
36
|
import * as idpSdkServer from '@idp.global/sdk/server';
|
|
30
37
|
export { idpSdkServer, };
|
|
@@ -76,4 +83,4 @@ import ipaddr from 'ipaddr.js';
|
|
|
76
83
|
import * as uuid from 'uuid';
|
|
77
84
|
import webpush from 'web-push';
|
|
78
85
|
export { argon2, bson, lruCache, ipaddr, uuid, webpush, };
|
|
79
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
86
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2lucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3RzL3BsdWdpbnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYztBQUNkLE9BQU8sS0FBSyxHQUFHLE1BQU0sVUFBVSxDQUFDO0FBQ2hDLE9BQU8sS0FBSyxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBQzlCLE9BQU8sS0FBSyxNQUFNLE1BQU0sYUFBYSxDQUFDO0FBQ3RDLE9BQU8sS0FBSyxJQUFJLE1BQU0sV0FBVyxDQUFDO0FBQ2xDLE9BQU8sS0FBSyxLQUFLLE1BQU0sWUFBWSxDQUFDO0FBQ3BDLE9BQU8sS0FBSyxHQUFHLE1BQU0sVUFBVSxDQUFDO0FBQ2hDLE9BQU8sS0FBSyxNQUFNLE1BQU0sYUFBYSxDQUFDO0FBQ3RDLE9BQU8sS0FBSyxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBQzlCLE9BQU8sS0FBSyxJQUFJLE1BQU0sV0FBVyxDQUFDO0FBQ2xDLE9BQU8sS0FBSyxNQUFNLE1BQU0sYUFBYSxDQUFDO0FBQ3RDLE9BQU8sS0FBSyxHQUFHLE1BQU0sVUFBVSxDQUFDO0FBQ2hDLE9BQU8sS0FBSyxJQUFJLE1BQU0sV0FBVyxDQUFDO0FBQ2xDLE9BQU8sS0FBSyxHQUFHLE1BQU0sVUFBVSxDQUFDO0FBQ2hDLE9BQU8sS0FBSyxjQUFjLE1BQU0sc0JBQXNCLENBQUM7QUFFdkQsT0FBTyxFQUNMLEdBQUcsRUFDSCxFQUFFLEVBQ0YsTUFBTSxFQUNOLElBQUksRUFDSixLQUFLLEVBQ0wsR0FBRyxFQUNILE1BQU0sRUFDTixFQUFFLEVBQ0YsSUFBSSxFQUNKLE1BQU0sRUFDTixHQUFHLEVBQ0gsSUFBSSxFQUNKLEdBQUcsRUFDSCxjQUFjLEdBQ2YsQ0FBQTtBQUVELG9CQUFvQjtBQUNwQixPQUFPLEtBQUssWUFBWSxNQUFNLGlCQUFpQixDQUFDO0FBQ2hELE9BQU8sS0FBSyxtQkFBbUIsTUFBTSx3QkFBd0IsQ0FBQztBQUM5RCxPQUFPLEtBQUssYUFBYSxNQUFNLDJC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
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
*/
|
|
4
4
|
export const commitinfo = {
|
|
5
5
|
name: '@serve.zone/dcrouter',
|
|
6
|
-
version: '34.
|
|
6
|
+
version: '34.7.0',
|
|
7
7
|
description: 'A multifaceted routing service handling mail and SMS delivery functions.'
|
|
8
8
|
};
|
|
9
9
|
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMDBfY29tbWl0aW5mb19kYXRhLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vdHNfd2ViLzAwX2NvbW1pdGluZm9fZGF0YS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7R0FFRztBQUNILE1BQU0sQ0FBQyxNQUFNLFVBQVUsR0FBRztJQUN4QixJQUFJLEVBQUUsc0JBQXNCO0lBQzVCLE9BQU8sRUFBRSxRQUFRO0lBQ2pCLFdBQVcsRUFBRSwwRUFBMEU7Q0FDeEYsQ0FBQSJ9
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@serve.zone/dcrouter",
|
|
3
3
|
"private": false,
|
|
4
|
-
"version": "34.
|
|
4
|
+
"version": "34.7.0",
|
|
5
5
|
"description": "A multifaceted routing service handling mail and SMS delivery functions.",
|
|
6
6
|
"type": "module",
|
|
7
7
|
"bin": {
|
|
@@ -15,6 +15,8 @@
|
|
|
15
15
|
"author": "Task Venture Capital GmbH",
|
|
16
16
|
"license": "MIT",
|
|
17
17
|
"devDependencies": {
|
|
18
|
+
"@api.global/typedrequest-coremail-client": "npm:@api.global/typedrequest@9.1.0",
|
|
19
|
+
"@api.global/typedsocket-coremail-client": "npm:@api.global/typedsocket@9.0.2",
|
|
18
20
|
"@git.zone/tsdeno": "^1.15.0",
|
|
19
21
|
"@git.zone/tsdocker": "^3.14.0",
|
|
20
22
|
"@git.zone/tsrepo": "^2.1.0",
|
|
@@ -29,8 +31,10 @@
|
|
|
29
31
|
},
|
|
30
32
|
"dependencies": {
|
|
31
33
|
"@api.global/typedrequest": "8.0.4",
|
|
34
|
+
"@api.global/typedrequest-coremail": "npm:@api.global/typedrequest@9.2.2",
|
|
32
35
|
"@api.global/typedrequest-interfaces": "7.1.0",
|
|
33
36
|
"@api.global/typedserver": "13.0.2",
|
|
37
|
+
"@api.global/typedserver-coremail": "npm:@api.global/typedserver@16.0.2",
|
|
34
38
|
"@api.global/typedsocket": "8.5.0",
|
|
35
39
|
"@apiclient.xyz/cloudflare": "^8.0.2",
|
|
36
40
|
"@aws-sdk/client-s3": "^3.1111.0",
|
package/readme.md
CHANGED
|
@@ -1172,11 +1172,27 @@ order, so the producer canonicalises the string before sending it.
|
|
|
1172
1172
|
|
|
1173
1173
|
| Setting | Owner | Canonical form |
|
|
1174
1174
|
| --- | --- | --- |
|
|
1175
|
-
| `gateway.endpointUrl` (in CoreMail's desired state) | producer | `wss://<
|
|
1175
|
+
| `gateway.endpointUrl` (in CoreMail's desired state) | producer | `wss://<gateway-host>/` — **with** the trailing slash |
|
|
1176
1176
|
| `transferOrigin` (in the peer above) | producer | `https://<coremail-host>` — origin only, **no** trailing slash |
|
|
1177
1177
|
|
|
1178
|
-
`endpointUrl`
|
|
1179
|
-
|
|
1178
|
+
Which host `endpointUrl` names depends on CoreMail's TypedSocket major, because
|
|
1179
|
+
the TypedSocket handshake refuses a peer of another wire:
|
|
1180
|
+
|
|
1181
|
+
- CoreMail up to 32 (TypedSocket 8) dials dcrouter's ops server port
|
|
1182
|
+
(`opsServerPort`, default `3000`) — the same TypedSocket surface
|
|
1183
|
+
platformclient's `MAIL_TYPED_URL` reaches.
|
|
1184
|
+
- CoreMail 33 and later (TypedSocket 9; wire 9 is shared by TypedSocket 9 and 10)
|
|
1185
|
+
dials the CoreMail gateway listener, `IDcRouterOptions.coreMailGatewayServer`.
|
|
1186
|
+
It is disabled when the option is absent. The option has `port` and a nonempty
|
|
1187
|
+
exact `hostnames` list; it always binds `127.0.0.1` and serves its socket at `/`,
|
|
1188
|
+
so the operator routes one hub hostname to that port and lists the same hostname
|
|
1189
|
+
in `hostnames` (other hosts, other paths, HTTP and browser Origins are answered
|
|
1190
|
+
`404`). In OCI mode the option goes into the `DCROUTER_CONFIG_PATH` JSON. The
|
|
1191
|
+
listener serves the three gateway calls and nothing else: no Ops, admin or
|
|
1192
|
+
workload mail methods. It authenticates with the CoreMail credential behind the
|
|
1193
|
+
same per-credential-id attempt limit as the ops surface and adds no source-address
|
|
1194
|
+
check. The ops server keeps serving CoreMail on TypedSocket 8 alongside it.
|
|
1195
|
+
|
|
1180
1196
|
`transferOrigin` is CoreMail's own HTTPS origin, from which dcrouter fetches and
|
|
1181
1197
|
to which it uploads message bytes; dcrouter returns it verbatim during
|
|
1182
1198
|
authentication and CoreMail refuses the session unless it matches its own desired
|
package/ts/00_commitinfo_data.ts
CHANGED
package/ts/classes.dcrouter.ts
CHANGED
|
@@ -25,6 +25,7 @@ import { createApplicationMigrationRunner } from '../ts_migrations/index.js';
|
|
|
25
25
|
|
|
26
26
|
import { OpsServer } from './opsserver/index.js';
|
|
27
27
|
import type { IWorkloadMailServerOptions } from './opsserver/classes.workload-mail-server.js';
|
|
28
|
+
import type { ICoreMailGatewayServerOptions } from './opsserver/classes.coremail-gateway-server.js';
|
|
28
29
|
import { MetricsManager, OpsEventManager } from './monitoring/index.js';
|
|
29
30
|
import { RadiusServer, type IRadiusServerConfig } from './radius/index.js';
|
|
30
31
|
import { RemoteIngressHubLifecycle, RemoteIngressManager, TunnelManager, buildEdgeOnlyDerivationRoutes } from './remoteingress/index.js';
|
|
@@ -230,6 +231,13 @@ export interface IDcRouterOptions {
|
|
|
230
231
|
/** Disabled unless explicitly configured; loopback-only, separately routed two-operation mail API. */
|
|
231
232
|
workloadMailServer?: IWorkloadMailServerOptions;
|
|
232
233
|
|
|
234
|
+
/**
|
|
235
|
+
* Disabled unless explicitly configured; loopback-only listener that serves the CoreMail gateway,
|
|
236
|
+
* and nothing else, to CoreMail on TypedSocket 9 or 10, behind one hub hostname route (Linus
|
|
237
|
+
* ruling 70, L2). The Ops server keeps serving the gateway on TypedSocket 8.
|
|
238
|
+
*/
|
|
239
|
+
coreMailGatewayServer?: ICoreMailGatewayServerOptions;
|
|
240
|
+
|
|
233
241
|
/** Optional OpsServer account authentication settings. */
|
|
234
242
|
adminAuth?: {
|
|
235
243
|
/** Optional idp.global password-authentication URL override. Defaults to the SDK's hosted https://app.idp.global endpoint. Can also be set through DCROUTER_IDP_GLOBAL_URL. */
|
|
@@ -479,9 +487,10 @@ export class DcRouter {
|
|
|
479
487
|
store: new CoreMailGatewayStore(),
|
|
480
488
|
runtime: createCoreMailGatewayRuntime(this),
|
|
481
489
|
});
|
|
482
|
-
// CoreMail connects as a TypedSocket client to the ops
|
|
483
|
-
// serves this router through the OpsServer's own chain.
|
|
484
|
-
// keeps the manager independent of OpsServer construction.
|
|
490
|
+
// CoreMail on TypedSocket 8 connects as a TypedSocket client to the ops
|
|
491
|
+
// surface, which serves this router through the OpsServer's own chain.
|
|
492
|
+
// Registering here keeps the manager independent of OpsServer construction.
|
|
493
|
+
// CoreMail on wire 9 connects to the `coreMailGatewayServer` listener instead.
|
|
485
494
|
this.typedrouter.addTypedRouter(this.coreMailGatewayManager.typedrouter);
|
|
486
495
|
this.smtpAccountManager = new SmtpAccountManager(this);
|
|
487
496
|
this.acceptedEmailSpool = new AcceptedEmailSpool(this);
|
|
@@ -67,6 +67,19 @@ interface ICoreMailPeerLike {
|
|
|
67
67
|
context: { state: Record<string, unknown> };
|
|
68
68
|
}
|
|
69
69
|
|
|
70
|
+
/**
|
|
71
|
+
* A CoreMail connection on one of the sockets the gateway is served on: the Ops
|
|
72
|
+
* server's TypedSocket 8 or the CoreMail gateway listener's wire 9. A request to
|
|
73
|
+
* CoreMail goes out on the socket the connection belongs to.
|
|
74
|
+
*/
|
|
75
|
+
export interface ICoreMailGatewayConnection {
|
|
76
|
+
peer: ICoreMailPeerLike;
|
|
77
|
+
fire<T extends plugins.typedrequestInterfaces.ITypedRequest>(
|
|
78
|
+
methodArg: T['method'],
|
|
79
|
+
requestArg: T['request'],
|
|
80
|
+
): Promise<T['response']>;
|
|
81
|
+
}
|
|
82
|
+
|
|
70
83
|
interface ICoreMailQueueItemLike {
|
|
71
84
|
id: string;
|
|
72
85
|
status: 'pending' | 'processing' | 'delivered' | 'failed' | 'deferred';
|
|
@@ -87,11 +100,8 @@ export interface ICoreMailGatewayRuntime {
|
|
|
87
100
|
idempotencyKeyArg: string,
|
|
88
101
|
): Promise<string>;
|
|
89
102
|
getQueueItem(queueItemIdArg: string): ICoreMailQueueItemLike | undefined;
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
methodArg: T['method'],
|
|
93
|
-
connectionArg: unknown,
|
|
94
|
-
): { fire(requestArg: T['request']): Promise<T['response']> };
|
|
103
|
+
/** The connection with this routing tag on any socket the gateway is served on. */
|
|
104
|
+
findConnection(tagArg: string): Promise<ICoreMailGatewayConnection | undefined>;
|
|
95
105
|
}
|
|
96
106
|
|
|
97
107
|
export interface ICoreMailGatewayManagerOptions {
|
|
@@ -121,14 +131,41 @@ export class CoreMailInboundRefusedError extends Error {
|
|
|
121
131
|
}
|
|
122
132
|
}
|
|
123
133
|
|
|
134
|
+
/**
|
|
135
|
+
* The contract error a gateway request is refused with. It is definitive
|
|
136
|
+
* unless it names when to retry: CoreMail takes a non-retryable
|
|
137
|
+
* `AUTHENTICATION_FAILED` as the verdict on its credential and stops
|
|
138
|
+
* connecting with it.
|
|
139
|
+
*/
|
|
124
140
|
const contractError = (
|
|
125
141
|
codeArg: TErrorCode,
|
|
126
|
-
|
|
142
|
+
retryAfterMsArg?: number,
|
|
127
143
|
): plugins.typedrequest.TypedResponseError =>
|
|
128
|
-
new plugins.typedrequest.TypedResponseError(
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
144
|
+
new plugins.typedrequest.TypedResponseError(
|
|
145
|
+
'CoreMail gateway request rejected.',
|
|
146
|
+
(retryAfterMsArg === undefined
|
|
147
|
+
? { code: codeArg, retryable: false }
|
|
148
|
+
: { code: codeArg, retryable: true, retryAfterMs: retryAfterMsArg }
|
|
149
|
+
) satisfies plugins.servezoneInterfaces.data.ICoreMailErrorData,
|
|
150
|
+
);
|
|
151
|
+
|
|
152
|
+
/**
|
|
153
|
+
* Answers a wire-9 request with the handler's own contract refusal: TypedRequest 9
|
|
154
|
+
* answers an error of another class, TypedRequest 8's `TypedResponseError`
|
|
155
|
+
* included, as an internal error without its `errorData`.
|
|
156
|
+
*/
|
|
157
|
+
const onCoreMailGatewayWire = <TRequest, TResponse>(
|
|
158
|
+
handlerArg: (requestArg: TRequest, toolsArg: unknown) => Promise<TResponse>,
|
|
159
|
+
) => async (requestArg: TRequest, toolsArg?: unknown): Promise<TResponse> => {
|
|
160
|
+
try {
|
|
161
|
+
return await handlerArg(requestArg, toolsArg);
|
|
162
|
+
} catch (error: unknown) {
|
|
163
|
+
if (error instanceof plugins.typedrequest.TypedResponseError) {
|
|
164
|
+
throw new plugins.typedrequestCoreMail.TypedResponseError(error.errorText, error.errorData);
|
|
165
|
+
}
|
|
166
|
+
throw error;
|
|
167
|
+
}
|
|
168
|
+
};
|
|
132
169
|
|
|
133
170
|
const toTimestamp = (valueArg: Date | number | undefined): number | undefined => {
|
|
134
171
|
if (valueArg === undefined) return undefined;
|
|
@@ -146,6 +183,7 @@ const toTimestamp = (valueArg: Date | number | undefined): number | undefined =>
|
|
|
146
183
|
* `…CompleteInboundHandoff` and `…CompleteOutboundHandoff` back on the peer.
|
|
147
184
|
*/
|
|
148
185
|
export class CoreMailGatewayManager {
|
|
186
|
+
/** The gateway's handlers on TypedSocket 8, which the Ops server serves. */
|
|
149
187
|
public typedrouter = new plugins.typedrequest.TypedRouter();
|
|
150
188
|
|
|
151
189
|
private readonly store: ICoreMailGatewayStore;
|
|
@@ -184,7 +222,7 @@ export class CoreMailGatewayManager {
|
|
|
184
222
|
this.verifyCredential = optionsArg.verifyCredential
|
|
185
223
|
?? (async (hashArg, secretArg) => await plugins.argon2.verify(hashArg, secretArg));
|
|
186
224
|
this.enqueueRetryDelaysMs = optionsArg.enqueueRetryDelaysMs ?? [1_000, 5_000, 15_000];
|
|
187
|
-
this.
|
|
225
|
+
this.registerGatewayHandlers(this.typedrouter);
|
|
188
226
|
}
|
|
189
227
|
|
|
190
228
|
// -------------------------------------------------------- peer provisioning
|
|
@@ -274,31 +312,52 @@ export class CoreMailGatewayManager {
|
|
|
274
312
|
|
|
275
313
|
// ---------------------------------------------------------------- handlers
|
|
276
314
|
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
315
|
+
/**
|
|
316
|
+
* Registers the gateway's three handlers on the router it is handed (Linus
|
|
317
|
+
* rulings 39, 3f, and 70, L2): this manager's `typedrouter` (TypedSocket 8,
|
|
318
|
+
* served by the Ops server) and the CoreMail gateway listener's router (wire 9,
|
|
319
|
+
* `CoreMailGatewayServer`). Both run the same handler bodies, and the session
|
|
320
|
+
* an authentication sets lives on the peer of the socket it arrived on.
|
|
321
|
+
*/
|
|
322
|
+
public registerGatewayHandlers(
|
|
323
|
+
routerArg: plugins.typedrequest.TypedRouter | plugins.typedrequestCoreMail.TypedRouter,
|
|
324
|
+
): void {
|
|
325
|
+
const authenticate = async (dataArg: TReq_Authenticate['request'], toolsArg: unknown) =>
|
|
326
|
+
await this.authenticate(this.requirePeer(toolsArg), dataArg);
|
|
327
|
+
const prepareOutboundHandoff = async (
|
|
328
|
+
dataArg: TReq_PrepareOutboundHandoff['request'],
|
|
329
|
+
toolsArg: unknown,
|
|
330
|
+
) => await this.prepareOutboundHandoff(this.requireSession(this.requirePeer(toolsArg)), dataArg);
|
|
331
|
+
const getOutboundStatus = async (dataArg: TReq_GetOutboundStatus['request'], toolsArg: unknown) =>
|
|
332
|
+
await this.getOutboundStatus(this.requireSession(this.requirePeer(toolsArg)), dataArg);
|
|
333
|
+
|
|
334
|
+
if (routerArg instanceof plugins.typedrequestCoreMail.TypedRouter) {
|
|
335
|
+
routerArg.addTypedHandler(new plugins.typedrequestCoreMail.TypedHandler<TReq_Authenticate>(
|
|
280
336
|
'coreMailGatewayAuthenticate',
|
|
281
|
-
|
|
282
|
-
)
|
|
283
|
-
|
|
284
|
-
this.typedrouter.addTypedHandler(
|
|
285
|
-
new plugins.typedrequest.TypedHandler<TReq_PrepareOutboundHandoff>(
|
|
337
|
+
onCoreMailGatewayWire(authenticate),
|
|
338
|
+
));
|
|
339
|
+
routerArg.addTypedHandler(new plugins.typedrequestCoreMail.TypedHandler<TReq_PrepareOutboundHandoff>(
|
|
286
340
|
'coreMailGatewayPrepareOutboundHandoff',
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
),
|
|
291
|
-
),
|
|
292
|
-
);
|
|
293
|
-
this.typedrouter.addTypedHandler(
|
|
294
|
-
new plugins.typedrequest.TypedHandler<TReq_GetOutboundStatus>(
|
|
341
|
+
onCoreMailGatewayWire(prepareOutboundHandoff),
|
|
342
|
+
));
|
|
343
|
+
routerArg.addTypedHandler(new plugins.typedrequestCoreMail.TypedHandler<TReq_GetOutboundStatus>(
|
|
295
344
|
'coreMailGatewayGetOutboundStatus',
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
345
|
+
onCoreMailGatewayWire(getOutboundStatus),
|
|
346
|
+
));
|
|
347
|
+
return;
|
|
348
|
+
}
|
|
349
|
+
routerArg.addTypedHandler(new plugins.typedrequest.TypedHandler<TReq_Authenticate>(
|
|
350
|
+
'coreMailGatewayAuthenticate',
|
|
351
|
+
authenticate,
|
|
352
|
+
));
|
|
353
|
+
routerArg.addTypedHandler(new plugins.typedrequest.TypedHandler<TReq_PrepareOutboundHandoff>(
|
|
354
|
+
'coreMailGatewayPrepareOutboundHandoff',
|
|
355
|
+
prepareOutboundHandoff,
|
|
356
|
+
));
|
|
357
|
+
routerArg.addTypedHandler(new plugins.typedrequest.TypedHandler<TReq_GetOutboundStatus>(
|
|
358
|
+
'coreMailGatewayGetOutboundStatus',
|
|
359
|
+
getOutboundStatus,
|
|
360
|
+
));
|
|
302
361
|
}
|
|
303
362
|
|
|
304
363
|
private requirePeer(toolsArg: unknown): ICoreMailPeerLike {
|
|
@@ -320,8 +379,9 @@ export class CoreMailGatewayManager {
|
|
|
320
379
|
|
|
321
380
|
/**
|
|
322
381
|
* Every gateway method other than the handshake requires an authenticated
|
|
323
|
-
* CoreMail session on this exact connection. The
|
|
324
|
-
* shared with other client types
|
|
382
|
+
* CoreMail session on this exact connection. The Ops TypedSocket surface is
|
|
383
|
+
* shared with other client types and the gateway listener takes any peer that
|
|
384
|
+
* reaches it, so presence on a socket proves nothing.
|
|
325
385
|
*/
|
|
326
386
|
private requireSession(peerArg: ICoreMailPeerLike): ICoreMailGatewaySession {
|
|
327
387
|
const session = peerArg.data.get(coreMailGatewaySessionKey) as
|
|
@@ -353,7 +413,12 @@ export class CoreMailGatewayManager {
|
|
|
353
413
|
bucket.refilledAt += intervals * 1_000;
|
|
354
414
|
}
|
|
355
415
|
if (bucket.tokens < 1) {
|
|
356
|
-
|
|
416
|
+
// A spent budget says nothing about the credential, so the refusal is
|
|
417
|
+
// retryable once the next token refills.
|
|
418
|
+
throw contractError(
|
|
419
|
+
'AUTHENTICATION_FAILED',
|
|
420
|
+
Math.max(1, Math.ceil(bucket.refilledAt + 1_000 - now)),
|
|
421
|
+
);
|
|
357
422
|
}
|
|
358
423
|
bucket.tokens -= 1;
|
|
359
424
|
}
|
|
@@ -929,7 +994,7 @@ export class CoreMailGatewayManager {
|
|
|
929
994
|
if (!connection || !session || session.coreMailServiceId !== coreMailServiceIdArg) {
|
|
930
995
|
throw new Error('No authenticated CoreMail gateway peer is connected');
|
|
931
996
|
}
|
|
932
|
-
return await
|
|
997
|
+
return await connection.fire<T>(methodArg, requestArg);
|
|
933
998
|
}
|
|
934
999
|
|
|
935
1000
|
private async isPeerConnected(coreMailServiceIdArg: string): Promise<boolean> {
|
|
@@ -1,13 +1,26 @@
|
|
|
1
1
|
import * as plugins from '../plugins.js';
|
|
2
2
|
import type { DcRouter } from '../classes.dcrouter.js';
|
|
3
|
-
import type {
|
|
3
|
+
import type {
|
|
4
|
+
ICoreMailGatewayConnection,
|
|
5
|
+
ICoreMailGatewayRuntime,
|
|
6
|
+
} from './classes.coremail-gateway.manager.js';
|
|
7
|
+
|
|
8
|
+
/** A CoreMail connection on a TypedSocket 8 server, with requests bound to that socket. */
|
|
9
|
+
export const toCoreMailGatewayConnection = (
|
|
10
|
+
typedsocketArg: plugins.typedsocket.TypedSocket,
|
|
11
|
+
connectionArg: plugins.typedsocket.ISmartServeConnectionWrapper,
|
|
12
|
+
): ICoreMailGatewayConnection => ({
|
|
13
|
+
peer: connectionArg.peer,
|
|
14
|
+
fire: async (methodArg, requestArg) =>
|
|
15
|
+
await typedsocketArg.createTypedRequest(methodArg, connectionArg).fire(requestArg),
|
|
16
|
+
});
|
|
4
17
|
|
|
5
18
|
/**
|
|
6
19
|
* Binds the CoreMail gateway manager to the live dcrouter runtime.
|
|
7
20
|
*
|
|
8
21
|
* Everything the manager needs from dcrouter passes through this adapter, so
|
|
9
22
|
* the manager stays testable against a stub and dcrouter keeps ownership of
|
|
10
|
-
* the smartmta server and the
|
|
23
|
+
* the smartmta server and the sockets the gateway is served on.
|
|
11
24
|
*/
|
|
12
25
|
export const createCoreMailGatewayRuntime = (
|
|
13
26
|
dcRouterArg: DcRouter,
|
|
@@ -28,20 +41,14 @@ export const createCoreMailGatewayRuntime = (
|
|
|
28
41
|
|
|
29
42
|
getQueueItem: (queueItemIdArg) => dcRouterArg.emailServer?.getQueueItem(queueItemIdArg),
|
|
30
43
|
|
|
44
|
+
// The CoreMail gateway listener first: a CoreMail on TypedSocket 9 or 10 can
|
|
45
|
+
// reach only that one. A CoreMail on TypedSocket 8 reaches only the Ops server.
|
|
31
46
|
findConnection: async (tagArg) => {
|
|
47
|
+
const listenerConnection = await dcRouterArg.opsServer?.coreMailGatewayServer?.findConnection(tagArg);
|
|
48
|
+
if (listenerConnection) return listenerConnection;
|
|
32
49
|
const typedsocket = dcRouterArg.opsServer?.server?.typedserver?.typedsocket;
|
|
33
50
|
if (!typedsocket) return undefined;
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
createRequest: (methodArg, connectionArg) => {
|
|
38
|
-
const typedsocket = dcRouterArg.opsServer?.server?.typedserver?.typedsocket;
|
|
39
|
-
if (!typedsocket) {
|
|
40
|
-
throw new Error('OpsServer TypedSocket is not available for CoreMail gateway requests');
|
|
41
|
-
}
|
|
42
|
-
return typedsocket.createTypedRequest(
|
|
43
|
-
methodArg as never,
|
|
44
|
-
connectionArg as plugins.typedsocket.ISmartServeConnectionWrapper,
|
|
45
|
-
) as never;
|
|
51
|
+
const connection = await typedsocket.findTargetConnectionByTag(tagArg);
|
|
52
|
+
return connection ? toCoreMailGatewayConnection(typedsocket, connection) : undefined;
|
|
46
53
|
},
|
|
47
54
|
});
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
import * as plugins from '../plugins.js';
|
|
2
|
+
import type {
|
|
3
|
+
CoreMailGatewayManager,
|
|
4
|
+
ICoreMailGatewayConnection,
|
|
5
|
+
} from '../email/classes.coremail-gateway.manager.js';
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* The one path the listener serves. The URL CoreMail dials, Cloudly's
|
|
9
|
+
* `coreMailGatewayEndpointUrl`, is a bare wss origin, so the socket sits at the
|
|
10
|
+
* root of the hub hostname that routes to this listener.
|
|
11
|
+
*/
|
|
12
|
+
export const COREMAIL_GATEWAY_SOCKET_PATH = '/';
|
|
13
|
+
|
|
14
|
+
/** Opt-in loopback listener (Linus ruling 70, L2). Its hub hostname route is the operator's. */
|
|
15
|
+
export interface ICoreMailGatewayServerOptions {
|
|
16
|
+
/** Port on 127.0.0.1; 0 asks the OS for one. */
|
|
17
|
+
port: number;
|
|
18
|
+
/** Hostnames of the hub route that forwards to this port; any other Host is answered 404. */
|
|
19
|
+
hostnames: readonly string[];
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
type TCoreMailGatewayTypedServer = plugins.typedserverCoreMail.TypedServer;
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* The CoreMail gateway on wire 9 (TypedSocket 9 and 10), separate from the Ops
|
|
26
|
+
* server, which keeps serving it on TypedSocket 8. It serves the gateway's
|
|
27
|
+
* three handlers and nothing else: no Ops router, admin or workload mail, no
|
|
28
|
+
* HTTP RPC, no client tags and no built-in methods. Authentication is the
|
|
29
|
+
* gateway's own, the CoreMail credential behind the per-credential-id attempt
|
|
30
|
+
* limiter; the listener adds no source check.
|
|
31
|
+
*/
|
|
32
|
+
export class CoreMailGatewayServer {
|
|
33
|
+
private server?: TCoreMailGatewayTypedServer;
|
|
34
|
+
/** Peers are looked up only between a completed start and the beginning of stop. */
|
|
35
|
+
private serving = false;
|
|
36
|
+
|
|
37
|
+
constructor(
|
|
38
|
+
private readonly options: ICoreMailGatewayServerOptions,
|
|
39
|
+
private readonly manager: Pick<CoreMailGatewayManager, 'registerGatewayHandlers'>,
|
|
40
|
+
) {}
|
|
41
|
+
|
|
42
|
+
public get listeningPort(): number | null {
|
|
43
|
+
return this.server?.listeningPort ?? null;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
public async start(): Promise<void> {
|
|
47
|
+
if (this.server) throw new Error('CoreMail gateway server already started');
|
|
48
|
+
if (!Number.isInteger(this.options.port) || this.options.port < 0 || this.options.port > 65535) {
|
|
49
|
+
throw new Error('CoreMail gateway port must be an integer from 0 to 65535');
|
|
50
|
+
}
|
|
51
|
+
const router = new plugins.typedrequestCoreMail.TypedRouter();
|
|
52
|
+
this.manager.registerGatewayHandlers(router);
|
|
53
|
+
const server = new plugins.typedserverCoreMail.TypedServer({
|
|
54
|
+
port: this.options.port,
|
|
55
|
+
listenHostname: '127.0.0.1',
|
|
56
|
+
cors: false,
|
|
57
|
+
surfaces: [{
|
|
58
|
+
name: 'coremail-gateway',
|
|
59
|
+
match: { hostnames: this.options.hostnames, pathPrefixes: [COREMAIL_GATEWAY_SOCKET_PATH] },
|
|
60
|
+
websocketTypedRouter: router,
|
|
61
|
+
typedRequestPath: false,
|
|
62
|
+
includeBuiltinTypedHandlers: false,
|
|
63
|
+
healthzEndpoint: false,
|
|
64
|
+
cors: false,
|
|
65
|
+
requestAdmission: () => new Response('Not Found', { status: 404 }),
|
|
66
|
+
websocketAdmission: (contextArg) => (
|
|
67
|
+
contextArg.url.pathname === COREMAIL_GATEWAY_SOCKET_PATH
|
|
68
|
+
&& !contextArg.url.search
|
|
69
|
+
&& !contextArg.request.headers.has('origin')
|
|
70
|
+
) ? true : new Response('Not Found', { status: 404 }),
|
|
71
|
+
}],
|
|
72
|
+
});
|
|
73
|
+
this.server = server;
|
|
74
|
+
try {
|
|
75
|
+
await server.start();
|
|
76
|
+
} catch (error) {
|
|
77
|
+
try { await this.stop(); } catch (cleanupError) {
|
|
78
|
+
throw new AggregateError([error, cleanupError], 'CoreMail gateway startup and cleanup failed');
|
|
79
|
+
}
|
|
80
|
+
throw error;
|
|
81
|
+
}
|
|
82
|
+
this.serving = true;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
/** The CoreMail connection with this routing tag on this listener, requests bound to its socket. */
|
|
86
|
+
public async findConnection(tagArg: string): Promise<ICoreMailGatewayConnection | undefined> {
|
|
87
|
+
const server = this.server;
|
|
88
|
+
if (!server || !this.serving) return undefined;
|
|
89
|
+
const connection = await server.typedsocket.findTargetConnectionByTag(tagArg);
|
|
90
|
+
if (!connection) return undefined;
|
|
91
|
+
return {
|
|
92
|
+
peer: connection.peer,
|
|
93
|
+
fire: async (methodArg, requestArg) =>
|
|
94
|
+
await server.typedsocket.createTypedRequest(methodArg, connection).fire(requestArg),
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
public async stop(): Promise<void> {
|
|
99
|
+
this.serving = false;
|
|
100
|
+
const server = this.server;
|
|
101
|
+
await server?.stop();
|
|
102
|
+
if (this.server === server) this.server = undefined;
|
|
103
|
+
}
|
|
104
|
+
}
|