@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.
@@ -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 listener binds
63
- * 127.0.0.1 only and is never public, so it is not listed.
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5vcHNzZXJ2ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi90cy9vcHNzZXJ2ZXIvY2xhc3Nlcy5vcHNzZXJ2ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxLQUFLLE9BQU8sTUFBTSxlQUFlLENBQUM7QUFDekMsT0FBTyxLQUFLLEtBQUssTUFBTSxhQUFhLENBQUM7QUFDckMsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ3RELE9BQU8sS0FBSyxRQUFRLE1BQU0scUJBQXFCLENBQUM7QUFDaEQsT0FBTyxFQUFFLGlDQUFpQyxFQUE0QixNQUFNLGtDQUFrQyxDQUFDO0FBQy9HLE9BQU8sS0FBSyxVQUFVLE1BQU0sOEJBQThCLENBQUM7QUFDM0QsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ3JELE9BQU8sRUFBRSxtQ0FBbUMsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQ2xGLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBQ3ZFLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLHNDQUFzQyxDQUFDO0FBRzdFLE1BQU0sT0FBTyxTQUFTO0lBQ2IsV0FBVyxDQUFXO0lBQ3RCLE1BQU0sQ0FBMkQ7SUFFeEUsMkZBQTJGO0lBQ3BGLFdBQVcsR0FBRyxJQUFJLE9BQU8sQ0FBQyxZQUFZLENBQUMsV0FBVyxFQUFFLENBQUM7SUFFNUQsOEVBQThFO0lBQ3ZFLFVBQVUsR0FBRyxJQUFJLE9BQU8sQ0FBQyxZQUFZLENBQUMsV0FBVyxFQUE0RSxDQUFDO0lBQzlILFdBQVcsR0FBRyxJQUFJLE9BQU8sQ0FBQyxZQUFZLENBQUMsV0FBVyxFQUE0RSxDQUFDO0lBRXRJLG9CQUFvQjtJQUNiLFlBQVksQ0FBeUI7SUFDckMsZUFBZSxDQUE0QjtJQUMxQyxhQUFhLENBQTBCO0lBQ3ZDLFdBQVcsQ0FBd0I7SUFDbkMsZUFBZSxDQUE0QjtJQUMzQyxZQUFZLENBQXlCO0lBQ3JDLGFBQWEsQ0FBMEI7SUFDdkMsZUFBZSxDQUE0QjtJQUMzQyxvQkFBb0IsQ0FBaUM7SUFDckQsa0JBQWtCLENBQStCO0lBQ2pELG9CQUFvQixDQUFpQztJQUNyRCxzQkFBc0IsQ0FBbUM7SUFDekQsZUFBZSxDQUE0QjtJQUMzQyxVQUFVLENBQXVCO0lBQ2pDLG9CQUFvQixDQUFpQztJQUNyRCxvQkFBb0IsQ0FBaUM7SUFDckQsb0JBQW9CLENBQWlDO0lBQ3JELFlBQVksQ0FBeUI7SUFDckMsa0JBQWtCLENBQStCO0lBQ2pELGFBQWEsQ0FBMEI7SUFDdkMsbUJBQW1CLENBQWdDO0lBQ25ELGdCQUFnQixDQUE2QjtJQUM3QyxnQkFBZ0IsQ0FBNkI7SUFDN0MsaUJBQWlCLENBQThCO0lBQy9DLGtCQUFrQixDQUErQjtJQUNqRCxrQkFBa0IsQ0FBK0I7SUFDakQsb0JBQW9CLENBQWlDO0lBQ3JELHFCQUFxQixDQUFrQztJQUN2RCxpQkFBaUIsQ0FBOEI7SUFDL0Msa0JBQWtCLENBQStCO0lBQ2pELGNBQWMsQ0FBMkI7SUFDekMsdUJBQXVCLENBQWM7SUFDckMsNkJBQTZCLENBQWM7SUFDbkQsZ0dBQWdHO0lBQ3hGLHFCQUFxQixHQUFzQixFQUFFLENBQUM7SUFDOUMsa0JBQWtCLENBQXNCO0lBQ2hELHNGQUFzRjtJQUMvRSxxQkFBcUIsQ0FBeUI7SUFDckQseUZBQXlGO0lBQ2pGLGFBQWEsQ0FBVTtJQUUvQixZQUFZLGNBQXdCO1FBQ2xDLElBQUksQ0FBQyxXQUFXLEdBQUcsY0FBYyxDQUFDO0lBQ3BDLENBQUM7SUFFRDs7OztPQUlHO0lBQ0ksbUJBQW1CO1FBQ3hCLE9BQU8sSUFBSSxDQUFDLGFBQWEsS0FBSyxTQUFTO1lBQ3JDLENBQUMsQ0FBQyxFQUFFO1lBQ0osQ0FBQyxDQUFDLENBQUMsRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsYUFBYSxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDO0lBQzNFLENBQUM7SUFFTSxLQUFLLENBQUMsS0FBSztRQUNoQixJQUFJLENBQUM7WUFDSCx5RkFBeUY7WUFDekYsSUFBSSxDQUFDLHFCQUFxQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLFdBQVcsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUM7WUFFL0YsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLE9BQU8sQ0FBQyxXQUFXLENBQUMsY0FBYyxDQUFDLG9CQUFvQixDQUFDO2dCQUN4RSxNQUFNLEVBQUUsV0FBVztnQkFDbkIsU0FBUyxFQUFFLFVBQVUsQ0FBQyxPQUFPO2dCQUM3QixZQUFZLEVBQUUsU0FBUztnQkFDdkIsUUFBUSxFQUFFLEtBQUssQ0FBQyxTQUFTO2dCQUN6QixlQUFlLEVBQUUsS0FBSyxFQUFFLFdBQVcsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLFdBQVcsQ0FBQztnQkFDOUUsaUNBQWlDLEVBQUUsbUNBQW1DLENBQUMsSUFBSSxDQUFDO2FBQzdFLENBQUMsQ0FBQztZQUVILHlEQUF5RDtZQUN6RCxnRUFBZ0U7WUFDaEUsSUFBSSxDQUFDLHFCQUFxQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDO1lBRXRHLGtCQUFrQjtZQUNsQixNQUFNLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztZQUUzQixNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxhQUFhLElBQUksSUFBSSxDQUFDO1lBQzVELE1BQU0sSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDOUIsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUM7WUFDMUIsSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO2dCQUNoRCxJQUFJLENBQUMsa0JBQWtCLEdBQUcsSUFBSSxrQkFBa0IsQ0FDOUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsa0JBQWtCLEVBQzNDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsa0JBQWtCLENBQzFDLENBQUM7Z0JBQ0YsTUFBTSxJQUFJLENBQUMsa0JBQWtCLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDeEMsQ0FBQztZQUNELElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMscUJBQXFCLEVBQUUsQ0FBQztnQkFDbkQsSUFBSSxDQUFDLHFCQUFxQixHQUFHLElBQUkscUJBQXFCLENBQ3BELElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLHFCQUFxQixFQUM5QyxJQUFJLENBQUMsV0FBVyxDQUFDLHNCQUFzQixDQUN4QyxDQUFDO2dCQUNGLE1BQU0sSUFBSSxDQUFDLHFCQUFxQixDQUFDLEtBQUssRUFBRSxDQUFDO1lBQzNDLENBQUM7UUFDSCxDQUFDO1FBQUMsT0FBTyxVQUFVLEVBQUUsQ0FBQztZQUNwQiw2RkFBNkY7WUFDN0YsOERBQThEO1lBQzlELElBQUksQ0FBQztnQkFDSCxNQUFNLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUNwQixDQUFDO1lBQUMsT0FBTyxZQUFZLEVBQUUsQ0FBQztnQkFDdEIsTUFBTSxXQUFXLEdBQUcsVUFBVSxZQUFZLEtBQUssQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDO2dCQUMxRixNQUFNLElBQUksY0FBYyxDQUFDLENBQUMsVUFBVSxFQUFFLFlBQVksQ0FBQyxFQUFFLCtCQUErQixXQUFXLDJCQUEyQixDQUFDLENBQUM7WUFDOUgsQ0FBQztZQUNELE1BQU0sVUFBVSxDQUFDO1FBQ25CLENBQUM7SUFDSCxDQUFDO0lBRUQ7O09BRUc7SUFDSyxLQUFLLENBQUMsYUFBYTtRQUN6Qix1RUFBdUU7UUFDdkUsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLFFBQVEsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDcEQsTUFBTSxJQUFJLENBQUMsWUFBWSxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBRXJDLCtDQUErQztRQUMvQyxJQUFJLENBQUMsV0FBVyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDakQsSUFBSSxDQUFDLFdBQVcsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBRWxELDRFQUE0RTtRQUM1RSxJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksUUFBUSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUMxRCxJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksUUFBUSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN0RCxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksUUFBUSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNsRCxJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksUUFBUSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUMxRCxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksUUFBUSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNwRCxJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksUUFBUSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN0RCxJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksUUFBUSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUMxRCxJQUFJLENBQUMsb0JBQW9CLEdBQUcsSUFBSSxRQUFRLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDcEUsSUFBSSxDQUFDLGtCQUFrQixHQUFHLElBQUksUUFBUSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2hFLElBQUksQ0FBQyxvQkFBb0IsR0FBRyxJQUFJLFFBQVEsQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNwRSxJQUFJLENBQUMsc0JBQXNCLEdBQUcsSUFBSSxRQUFRLENBQUMsc0JBQXNCLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDeEUsSUFBSSxDQUFDLGVBQWUsR0FBRyxJQUFJLFFBQVEsQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDMUQsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLFFBQVEsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDaEQsSUFBSSxDQUFDLG9CQUFvQixHQUFHLElBQUksUUFBUSxDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3BFLElBQUksQ0FBQyxvQkFBb0IsR0FBRyxJQUFJLFFBQVEsQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNwRSxJQUFJLENBQUMsb0JBQW9CLEdBQUcsSUFBSSxRQUFRLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDcEUsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLFFBQVEsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDcEQsSUFBSSxDQUFDLGtCQUFrQixHQUFHLElBQUksUUFBUSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2hFLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxRQUFRLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3RELElBQUksQ0FBQyxtQkFBbUIsR0FBRyxJQUFJLFFBQVEsQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNsRSxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxRQUFRLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDNUQsSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksUUFBUSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzVELElBQUksQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLFFBQVEsQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUM5RCxJQUFJLENBQUMsa0JBQWtCLEdBQUcsSUFBSSxRQUFRLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDaEUsSUFBSSxDQUFDLGtCQUFrQixHQUFHLElBQUksUUFBUSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2hFLElBQUksQ0FBQyxvQkFBb0IsR0FBRyxJQUFJLFFBQVEsQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNwRSxJQUFJLENBQUMscUJBQXFCLEdBQUcsSUFBSSxRQUFRLENBQUMscUJBQXFCLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDdEUsSUFBSSxDQUFDLGlCQUFpQixHQUFHLElBQUksUUFBUSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzlELElBQUksQ0FBQyxrQkFBa0IsR0FBRyxJQUFJLFFBQVEsQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNoRSxJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksUUFBUSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN4RCxJQUFJLENBQUMsdUJBQXVCO1lBQzFCLElBQUksQ0FBQyxXQUFXLENBQUMsa0JBQWtCLEVBQUUsMEJBQTBCLEVBQUUsQ0FBQyxDQUFDLFFBQVEsRUFBRSxFQUFFO2dCQUM3RSxJQUFJLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxjQUFjLEVBQUUsWUFBWSxDQUFDLEVBQUU7b0JBQ3RELFVBQVUsRUFBRSxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUM7b0JBQ3BDLE1BQU0sRUFBRSw0QkFBNEI7aUJBQ3JDLENBQUMsQ0FBQztZQUNMLENBQUMsQ0FBQyxDQUFDO1FBRUwsSUFBSSxDQUFDLDZCQUE2QjtZQUNoQyxJQUFJLENBQUMsV0FBVyxDQUFDLGtCQUFrQixFQUFFLHFCQUFxQixFQUFFLENBQUMsQ0FBQyxRQUFRLEVBQUUsRUFBRTtnQkFDeEUsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFlBQVksRUFBRTtvQkFDcEMsVUFBVSxFQUFFLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQztvQkFDcEMsTUFBTSxFQUFFLFFBQVEsQ0FBQyxNQUFNO2lCQUN4QixDQUFDLENBQUM7WUFDTCxDQUFDLENBQUMsQ0FBQztRQUNMLE9BQU8sQ0FBQyxHQUFHLENBQUMsK0NBQStDLENBQUMsQ0FBQztJQUMvRCxDQUFDO0lBRU8sb0JBQW9CLENBQUMsV0FBNEM7UUFDdkUsTUFBTSxVQUFVLEdBQUcsSUFBSSxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDeEMsV0FBVyxDQUFDLFFBQVEsQ0FDbEIsTUFBTSxFQUNOLEtBQUssRUFDTCxLQUFLLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FDckQsQ0FBQztJQUNKLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNJLGlDQUFpQyxDQUN0QyxTQUEyQyxFQUMzQyxzQkFBMkM7UUFFM0MsTUFBTSxJQUFJLEdBQXdCLEtBQUssRUFBRSxXQUFXLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxFQUFFO1lBQzdFLE1BQU0sc0JBQXNCLEVBQUUsQ0FBQztZQUMvQixPQUFPLE1BQU0saUNBQWlDLENBQUMsSUFBSSxFQUFFLFVBQVUsQ0FBQyxDQUFDO1FBQ25FLENBQUMsQ0FBQztRQUNGLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyx1QkFBdUIsQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDbkUsSUFBSSxDQUFDLGtCQUFrQixDQUFDLHVCQUF1QixDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUNqRSxJQUFJLENBQUMscUJBQXFCLENBQUMsdUJBQXVCLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ3BFLElBQUksQ0FBQyxpQkFBaUIsQ0FBQywwQkFBMEIsQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDckUsQ0FBQztJQUVNLGtCQUFrQixDQUN2QixZQUU4QyxFQUM5QyxVQUFVLEdBQStDLEVBQUU7UUFFM0QsSUFBSSxDQUFDLGVBQWUsRUFBRSxVQUFVLENBQUMsWUFBWSxFQUFFLFVBQVUsQ0FBQyxDQUFDO0lBQzdELENBQUM7SUFFTSxLQUFLLENBQUMsbUNBQW1DO1FBRzlDLE9BQU8sSUFBSSxDQUFDLGVBQWU7WUFDekIsQ0FBQyxDQUFDLE1BQU0sSUFBSSxDQUFDLGVBQWUsQ0FBQywyQkFBMkIsRUFBRTtZQUMxRCxDQUFDLENBQUMsRUFBRSxDQUFDO0lBQ1QsQ0FBQztJQUVNLEtBQUssQ0FBQyxJQUFJO1FBQ2YsSUFBSSxDQUFDLGFBQWEsR0FBRyxTQUFTLENBQUM7UUFDL0IsTUFBTSxRQUFRLEdBQWMsRUFBRSxDQUFDO1FBQy9CLE1BQU0sT0FBTyxHQUFHLEtBQUssRUFBRSxVQUF5QixFQUFpQixFQUFFO1lBQ2pFLElBQUksQ0FBQztnQkFBQyxNQUFNLFVBQVUsRUFBRSxDQUFDO1lBQUMsQ0FBQztZQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7Z0JBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUFDLENBQUM7UUFDckUsQ0FBQyxDQUFDO1FBQ0YsSUFBSSxDQUFDO1lBQ0gsa0ZBQWtGO1lBQ2xGLGtEQUFrRDtZQUNsRCxNQUFNLE9BQU8sQ0FBQyxHQUFHLENBQUM7Z0JBQ2hCLE9BQU8sQ0FBQyxLQUFLLElBQUksRUFBRTtvQkFDakIsTUFBTSxJQUFJLENBQUMsa0JBQWtCLEVBQUUsSUFBSSxFQUFFLENBQUM7b0JBQ3RDLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxTQUFTLENBQUM7Z0JBQ3RDLENBQUMsQ0FBQztnQkFDRixPQUFPLENBQUMsS0FBSyxJQUFJLEVBQUU7b0JBQ2pCLE1BQU0sSUFBSSxDQUFDLHFCQUFxQixFQUFFLElBQUksRUFBRSxDQUFDO29CQUN6QyxJQUFJLENBQUMscUJBQXFCLEdBQUcsU0FBUyxDQUFDO2dCQUN6QyxDQUFDLENBQUM7Z0JBQ0YsT0FBTyxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLENBQUM7Z0JBQ2xDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLE9BQU8sRUFBRSxDQUFDO2FBQzNDLENBQUMsQ0FBQztZQUNILE1BQU0sT0FBTyxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztZQUMvQyxNQUFNLE9BQU8sQ0FBQyxHQUFHLEVBQUU7Z0JBQ2pCLElBQUksQ0FBQyx1QkFBdUIsRUFBRSxFQUFFLENBQUM7Z0JBQ2pDLElBQUksQ0FBQyx1QkFBdUIsR0FBRyxTQUFTLENBQUM7WUFDM0MsQ0FBQyxDQUFDLENBQUM7WUFDSCxNQUFNLE9BQU8sQ0FBQyxHQUFHLEVBQUU7Z0JBQ2pCLElBQUksQ0FBQyw2QkFBNkIsRUFBRSxFQUFFLENBQUM7Z0JBQ3ZDLElBQUksQ0FBQyw2QkFBNkIsR0FBRyxTQUFTLENBQUM7WUFDakQsQ0FBQyxDQUFDLENBQUM7WUFDSCxNQUFNLE9BQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsZUFBZSxFQUFFLE9BQU8sRUFBRSxDQUFDLENBQUM7UUFDdkQsQ0FBQztnQkFBUyxDQUFDO1lBQ1Qsa0ZBQWtGO1lBQ2xGLE1BQU0sU0FBUyxHQUFzQixFQUFFLENBQUM7WUFDeEMsS0FBSyxNQUFNLE1BQU0sSUFBSSxJQUFJLENBQUMscUJBQXFCLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7Z0JBQzFELElBQUksQ0FBQztvQkFBQyxNQUFNLEVBQUUsQ0FBQztnQkFBQyxDQUFDO2dCQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7b0JBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztvQkFBQyxTQUFTLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO2dCQUFDLENBQUM7WUFDbkYsQ0FBQztZQUNELElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxJQUFJLENBQUMsR0FBRyxTQUFTLENBQUMsQ0FBQztRQUNoRCxDQUFDO1FBQ0QsSUFBSSxRQUFRLENBQUMsTUFBTTtZQUFFLE1BQU0sSUFBSSxjQUFjLENBQUMsUUFBUSxFQUFFLDJCQUEyQixDQUFDLENBQUM7SUFDdkYsQ0FBQztDQUNGIn0=
@@ -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';
@@ -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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2lucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3RzL3BsdWdpbnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYztBQUNkLE9BQU8sS0FBSyxHQUFHLE1BQU0sVUFBVSxDQUFDO0FBQ2hDLE9BQU8sS0FBSyxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBQzlCLE9BQU8sS0FBSyxNQUFNLE1BQU0sYUFBYSxDQUFDO0FBQ3RDLE9BQU8sS0FBSyxJQUFJLE1BQU0sV0FBVyxDQUFDO0FBQ2xDLE9BQU8sS0FBSyxLQUFLLE1BQU0sWUFBWSxDQUFDO0FBQ3BDLE9BQU8sS0FBSyxHQUFHLE1BQU0sVUFBVSxDQUFDO0FBQ2hDLE9BQU8sS0FBSyxNQUFNLE1BQU0sYUFBYSxDQUFDO0FBQ3RDLE9BQU8sS0FBSyxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBQzlCLE9BQU8sS0FBSyxJQUFJLE1BQU0sV0FBVyxDQUFDO0FBQ2xDLE9BQU8sS0FBSyxNQUFNLE1BQU0sYUFBYSxDQUFDO0FBQ3RDLE9BQU8sS0FBSyxHQUFHLE1BQU0sVUFBVSxDQUFDO0FBQ2hDLE9BQU8sS0FBSyxJQUFJLE1BQU0sV0FBVyxDQUFDO0FBQ2xDLE9BQU8sS0FBSyxHQUFHLE1BQU0sVUFBVSxDQUFDO0FBQ2hDLE9BQU8sS0FBSyxjQUFjLE1BQU0sc0JBQXNCLENBQUM7QUFFdkQsT0FBTyxFQUNMLEdBQUcsRUFDSCxFQUFFLEVBQ0YsTUFBTSxFQUNOLElBQUksRUFDSixLQUFLLEVBQ0wsR0FBRyxFQUNILE1BQU0sRUFDTixFQUFFLEVBQ0YsSUFBSSxFQUNKLE1BQU0sRUFDTixHQUFHLEVBQ0gsSUFBSSxFQUNKLEdBQUcsRUFDSCxjQUFjLEdBQ2YsQ0FBQTtBQUVELG9CQUFvQjtBQUNwQixPQUFPLEtBQUssWUFBWSxNQUFNLGlCQUFpQixDQUFDO0FBQ2hELE9BQU8sS0FBSyxtQkFBbUIsTUFBTSx3QkFBd0IsQ0FBQztBQUM5RCxPQUFPLEtBQUssYUFBYSxNQUFNLDJCQUEyQixDQUFDO0FBRTNELE9BQU8sRUFDTCxZQUFZLEVBQ1osbUJBQW1CLEVBQ25CLGFBQWEsR0FDZCxDQUFBO0FBRUQsb0JBQW9CO0FBQ3BCLE9BQU8sS0FBSyxZQUFZLE1BQU0sMEJBQTBCLENBQUM7QUFDekQsT0FBTyxLQUFLLHNCQUFzQixNQUFNLHFDQUFxQyxDQUFDO0FBQzlFLE9BQU8sS0FBSyxXQUFXLE1BQU0seUJBQXlCLENBQUM7QUFDdkQsT0FBTyxLQUFLLFdBQVcsTUFBTSx5QkFBeUIsQ0FBQztBQUV2RCxPQUFPLEVBQ0wsWUFBWSxFQUNaLHNCQUFzQixFQUN0QixXQUFXLEVBQ1gsV0FBVyxHQUNaLENBQUE7QUFFRCxvQkFBb0I7QUFDcEIsT0FBTyxLQUFLLFlBQVksTUFBTSx3QkFBd0IsQ0FBQztBQUV2RCxPQUFPLEVBQ0wsWUFBWSxHQUNiLENBQUE7QUFFRCxzQkFBc0I7QUFDdEIsZ0dBQWdHO0FBQ2hHLG1HQUFtRztBQUNuRywyREFBMkQ7QUFDM0QsT0FBTyxLQUFLLFNBQVMsTUFBTSw4QkFBOEIsQ0FBQztBQUMxRCwrRkFBK0Y7QUFDL0YsK0VBQStFO0FBQy9FLE9BQU8sS0FBSyxhQUFhLE1BQU0sb0NBQW9DLENBQUM7QUFFcEUsT0FBTyxFQUNMLFNBQVMsRUFDVCxhQUFhLEdBQ2QsQ0FBQTtBQUVELG9CQUFvQjtBQUNwQixPQUFPLEtBQUssV0FBVyxNQUFNLHlCQUF5QixDQUFDO0FBQ3ZELE9BQU8sS0FBSyxJQUFJLE1BQU0sa0JBQWtCLENBQUM7QUFDekMsT0FBTyxLQUFLLFNBQVMsTUFBTSx1QkFBdUIsQ0FBQztBQUNuRCxPQUFPLEtBQUssY0FBYyxNQUFNLDRCQUE0QixDQUFDO0FBQzdELE9BQU8sS0FBSyxRQUFRLE1BQU0sc0JBQXNCLENBQUM7QUFDakQsT0FBTyxLQUFLLE9BQU8sTUFBTSxxQkFBcUIsQ0FBQztBQUMvQyxPQUFPLEtBQUssVUFBVSxNQUFNLHdCQUF3QixDQUFDO0FBQ3JELE9BQU8sS0FBSyxRQUFRLE1BQU0sc0JBQXNCLENBQUM7QUFDakQsT0FBTyxLQUFLLFFBQVEsTUFBTSxzQkFBc0IsQ0FBQztBQUNqRCxPQUFPLEtBQUssWUFBWSxNQUFNLDBCQUEwQixDQUFDO0FBQ3pELE9BQU8sS0FBSyxRQUFRLE1BQU0sc0JBQXNCLENBQUM7QUFDakQsT0FBTyxLQUFLLFFBQVEsTUFBTSxzQkFBc0IsQ0FBQztBQUNqRCxPQUFPLEtBQUssT0FBTyxNQUFNLHFCQUFxQixDQUFDO0FBQy9DLE9BQU8sS0FBSyxZQUFZLE1BQU0sMEJBQTBCLENBQUM7QUFDekQsT0FBTyxLQUFLLFNBQVMsTUFBTSx1QkFBdUIsQ0FBQztBQUNuRCxPQUFPLEtBQUssVUFBVSxNQUFNLHdCQUF3QixDQUFDO0FBQ3JELE9BQU8sS0FBSyxZQUFZLE1BQU0sMEJBQTBCLENBQUM7QUFDekQsT0FBTyxLQUFLLFFBQVEsTUFBTSxzQkFBc0IsQ0FBQztBQUNqRCxPQUFPLEtBQUssV0FBVyxNQUFNLHlCQUF5QixDQUFDO0FBQ3ZELE9BQU8sS0FBSyxZQUFZLE1BQU0sMEJBQTBCLENBQUM7QUFDekQsT0FBTyxLQUFLLE9BQU8sTUFBTSxxQkFBcUIsQ0FBQztBQUMvQyxPQUFPLEtBQUssV0FBVyxNQUFNLHlCQUF5QixDQUFDO0FBQ3ZELE9BQU8sS0FBSyxVQUFVLE1BQU0sd0JBQXdCLENBQUM7QUFFckQsT0FBTyxFQUFFLFdBQVcsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLGNBQWMsRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLFlBQVksRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxZQUFZLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxZQUFZLEVBQUUsV0FBVyxFQUFFLFlBQVksRUFBRSxPQUFPLEVBQUUsV0FBVyxFQUFFLFFBQVEsRUFBRSxVQUFVLEVBQUUsQ0FBQztBQUtoUixzQkFBc0I7QUFDdEIsT0FBTyxLQUFLLFVBQVUsTUFBTSwyQkFBMkIsQ0FBQztBQUV4RCxPQUFPLEVBQ0wsVUFBVSxHQUNYLENBQUE7QUFFRCxnQkFBZ0I7QUFDaEIsT0FBTyxLQUFLLE9BQU8sTUFBTSxrQkFBa0IsQ0FBQztBQUU1QyxPQUFPLEVBQ0wsT0FBTyxHQUNSLENBQUE7QUFFRCxjQUFjO0FBQ2QsT0FBTyxLQUFLLE1BQU0sTUFBTSxRQUFRLENBQUM7QUFDakMsT0FBTyxLQUFLLElBQUksTUFBTSxNQUFNLENBQUM7QUFDN0IsT0FBTyxLQUFLLFFBQVEsTUFBTSxXQUFXLENBQUM7QUFDdEMsT0FBTyxNQUFNLE1BQU0sV0FBVyxDQUFDO0FBQy9CLE9BQU8sS0FBSyxJQUFJLE1BQU0sTUFBTSxDQUFDO0FBQzdCLE9BQU8sT0FBTyxNQUFNLFVBQVUsQ0FBQztBQUUvQixPQUFPLEVBQ0wsTUFBTSxFQUNOLElBQUksRUFDSixRQUFRLEVBQ1IsTUFBTSxFQUNOLElBQUksRUFDSixPQUFPLEdBQ1IsQ0FBQSJ9
86
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2lucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3RzL3BsdWdpbnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYztBQUNkLE9BQU8sS0FBSyxHQUFHLE1BQU0sVUFBVSxDQUFDO0FBQ2hDLE9BQU8sS0FBSyxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBQzlCLE9BQU8sS0FBSyxNQUFNLE1BQU0sYUFBYSxDQUFDO0FBQ3RDLE9BQU8sS0FBSyxJQUFJLE1BQU0sV0FBVyxDQUFDO0FBQ2xDLE9BQU8sS0FBSyxLQUFLLE1BQU0sWUFBWSxDQUFDO0FBQ3BDLE9BQU8sS0FBSyxHQUFHLE1BQU0sVUFBVSxDQUFDO0FBQ2hDLE9BQU8sS0FBSyxNQUFNLE1BQU0sYUFBYSxDQUFDO0FBQ3RDLE9BQU8sS0FBSyxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBQzlCLE9BQU8sS0FBSyxJQUFJLE1BQU0sV0FBVyxDQUFDO0FBQ2xDLE9BQU8sS0FBSyxNQUFNLE1BQU0sYUFBYSxDQUFDO0FBQ3RDLE9BQU8sS0FBSyxHQUFHLE1BQU0sVUFBVSxDQUFDO0FBQ2hDLE9BQU8sS0FBSyxJQUFJLE1BQU0sV0FBVyxDQUFDO0FBQ2xDLE9BQU8sS0FBSyxHQUFHLE1BQU0sVUFBVSxDQUFDO0FBQ2hDLE9BQU8sS0FBSyxjQUFjLE1BQU0sc0JBQXNCLENBQUM7QUFFdkQsT0FBTyxFQUNMLEdBQUcsRUFDSCxFQUFFLEVBQ0YsTUFBTSxFQUNOLElBQUksRUFDSixLQUFLLEVBQ0wsR0FBRyxFQUNILE1BQU0sRUFDTixFQUFFLEVBQ0YsSUFBSSxFQUNKLE1BQU0sRUFDTixHQUFHLEVBQ0gsSUFBSSxFQUNKLEdBQUcsRUFDSCxjQUFjLEdBQ2YsQ0FBQTtBQUVELG9CQUFvQjtBQUNwQixPQUFPLEtBQUssWUFBWSxNQUFNLGlCQUFpQixDQUFDO0FBQ2hELE9BQU8sS0FBSyxtQkFBbUIsTUFBTSx3QkFBd0IsQ0FBQztBQUM5RCxPQUFPLEtBQUssYUFBYSxNQUFNLDJCQUEyQixDQUFDO0FBRTNELE9BQU8sRUFDTCxZQUFZLEVBQ1osbUJBQW1CLEVBQ25CLGFBQWEsR0FDZCxDQUFBO0FBRUQsb0JBQW9CO0FBQ3BCLE9BQU8sS0FBSyxZQUFZLE1BQU0sMEJBQTBCLENBQUM7QUFDekQsT0FBTyxLQUFLLHNCQUFzQixNQUFNLHFDQUFxQyxDQUFDO0FBQzlFLE9BQU8sS0FBSyxXQUFXLE1BQU0seUJBQXlCLENBQUM7QUFDdkQsT0FBTyxLQUFLLFdBQVcsTUFBTSx5QkFBeUIsQ0FBQztBQUV2RCxPQUFPLEVBQ0wsWUFBWSxFQUNaLHNCQUFzQixFQUN0QixXQUFXLEVBQ1gsV0FBVyxHQUNaLENBQUE7QUFFRCw2RkFBNkY7QUFDN0YscUdBQXFHO0FBQ3JHLG9HQUFvRztBQUNwRyxnQ0FBZ0M7QUFDaEMsT0FBTyxLQUFLLG9CQUFvQixNQUFNLG1DQUFtQyxDQUFDO0FBQzFFLE9BQU8sS0FBSyxtQkFBbUIsTUFBTSxrQ0FBa0MsQ0FBQztBQUV4RSxPQUFPLEVBQ0wsb0JBQW9CLEVBQ3BCLG1CQUFtQixHQUNwQixDQUFBO0FBRUQsb0JBQW9CO0FBQ3BCLE9BQU8sS0FBSyxZQUFZLE1BQU0sd0JBQXdCLENBQUM7QUFFdkQsT0FBTyxFQUNMLFlBQVksR0FDYixDQUFBO0FBRUQsc0JBQXNCO0FBQ3RCLGdHQUFnRztBQUNoRyxtR0FBbUc7QUFDbkcsMkRBQTJEO0FBQzNELE9BQU8sS0FBSyxTQUFTLE1BQU0sOEJBQThCLENBQUM7QUFDMUQsK0ZBQStGO0FBQy9GLCtFQUErRTtBQUMvRSxPQUFPLEtBQUssYUFBYSxNQUFNLG9DQUFvQyxDQUFDO0FBRXBFLE9BQU8sRUFDTCxTQUFTLEVBQ1QsYUFBYSxHQUNkLENBQUE7QUFFRCxvQkFBb0I7QUFDcEIsT0FBTyxLQUFLLFdBQVcsTUFBTSx5QkFBeUIsQ0FBQztBQUN2RCxPQUFPLEtBQUssSUFBSSxNQUFNLGtCQUFrQixDQUFDO0FBQ3pDLE9BQU8sS0FBSyxTQUFTLE1BQU0sdUJBQXVCLENBQUM7QUFDbkQsT0FBTyxLQUFLLGNBQWMsTUFBTSw0QkFBNEIsQ0FBQztBQUM3RCxPQUFPLEtBQUssUUFBUSxNQUFNLHNCQUFzQixDQUFDO0FBQ2pELE9BQU8sS0FBSyxPQUFPLE1BQU0scUJBQXFCLENBQUM7QUFDL0MsT0FBTyxLQUFLLFVBQVUsTUFBTSx3QkFBd0IsQ0FBQztBQUNyRCxPQUFPLEtBQUssUUFBUSxNQUFNLHNCQUFzQixDQUFDO0FBQ2pELE9BQU8sS0FBSyxRQUFRLE1BQU0sc0JBQXNCLENBQUM7QUFDakQsT0FBTyxLQUFLLFlBQVksTUFBTSwwQkFBMEIsQ0FBQztBQUN6RCxPQUFPLEtBQUssUUFBUSxNQUFNLHNCQUFzQixDQUFDO0FBQ2pELE9BQU8sS0FBSyxRQUFRLE1BQU0sc0JBQXNCLENBQUM7QUFDakQsT0FBTyxLQUFLLE9BQU8sTUFBTSxxQkFBcUIsQ0FBQztBQUMvQyxPQUFPLEtBQUssWUFBWSxNQUFNLDBCQUEwQixDQUFDO0FBQ3pELE9BQU8sS0FBSyxTQUFTLE1BQU0sdUJBQXVCLENBQUM7QUFDbkQsT0FBTyxLQUFLLFVBQVUsTUFBTSx3QkFBd0IsQ0FBQztBQUNyRCxPQUFPLEtBQUssWUFBWSxNQUFNLDBCQUEwQixDQUFDO0FBQ3pELE9BQU8sS0FBSyxRQUFRLE1BQU0sc0JBQXNCLENBQUM7QUFDakQsT0FBTyxLQUFLLFdBQVcsTUFBTSx5QkFBeUIsQ0FBQztBQUN2RCxPQUFPLEtBQUssWUFBWSxNQUFNLDBCQUEwQixDQUFDO0FBQ3pELE9BQU8sS0FBSyxPQUFPLE1BQU0scUJBQXFCLENBQUM7QUFDL0MsT0FBTyxLQUFLLFdBQVcsTUFBTSx5QkFBeUIsQ0FBQztBQUN2RCxPQUFPLEtBQUssVUFBVSxNQUFNLHdCQUF3QixDQUFDO0FBRXJELE9BQU8sRUFBRSxXQUFXLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxjQUFjLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxZQUFZLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUUsWUFBWSxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsWUFBWSxFQUFFLFdBQVcsRUFBRSxZQUFZLEVBQUUsT0FBTyxFQUFFLFdBQVcsRUFBRSxRQUFRLEVBQUUsVUFBVSxFQUFFLENBQUM7QUFLaFIsc0JBQXNCO0FBQ3RCLE9BQU8sS0FBSyxVQUFVLE1BQU0sMkJBQTJCLENBQUM7QUFFeEQsT0FBTyxFQUNMLFVBQVUsR0FDWCxDQUFBO0FBRUQsZ0JBQWdCO0FBQ2hCLE9BQU8sS0FBSyxPQUFPLE1BQU0sa0JBQWtCLENBQUM7QUFFNUMsT0FBTyxFQUNMLE9BQU8sR0FDUixDQUFBO0FBRUQsY0FBYztBQUNkLE9BQU8sS0FBSyxNQUFNLE1BQU0sUUFBUSxDQUFDO0FBQ2pDLE9BQU8sS0FBSyxJQUFJLE1BQU0sTUFBTSxDQUFDO0FBQzdCLE9BQU8sS0FBSyxRQUFRLE1BQU0sV0FBVyxDQUFDO0FBQ3RDLE9BQU8sTUFBTSxNQUFNLFdBQVcsQ0FBQztBQUMvQixPQUFPLEtBQUssSUFBSSxNQUFNLE1BQU0sQ0FBQztBQUM3QixPQUFPLE9BQU8sTUFBTSxVQUFVLENBQUM7QUFFL0IsT0FBTyxFQUNMLE1BQU0sRUFDTixJQUFJLEVBQ0osUUFBUSxFQUNSLE1BQU0sRUFDTixJQUFJLEVBQ0osT0FBTyxHQUNSLENBQUEifQ==
@@ -3,7 +3,7 @@
3
3
  */
4
4
  export const commitinfo = {
5
5
  name: '@serve.zone/dcrouter',
6
- version: '34.6.0',
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.6.0",
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://<dcrouter-ops-host>/` — **with** the trailing slash |
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` points at dcrouter's ops server port (`opsServerPort`, default
1179
- `3000`) — the same TypedSocket surface platformclient's `MAIL_TYPED_URL` reaches.
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
@@ -3,6 +3,6 @@
3
3
  */
4
4
  export const commitinfo = {
5
5
  name: '@serve.zone/dcrouter',
6
- version: '34.6.0',
6
+ version: '34.7.0',
7
7
  description: 'A multifaceted routing service handling mail and SMS delivery functions.'
8
8
  }
@@ -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 surface, which
483
- // serves this router through the OpsServer's own chain. Registering here
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
- findConnection(tagArg: string): Promise<{ peer: ICoreMailPeerLike } | undefined>;
91
- createRequest<T extends plugins.typedrequestInterfaces.ITypedRequest>(
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
- retryableArg = false,
142
+ retryAfterMsArg?: number,
127
143
  ): plugins.typedrequest.TypedResponseError =>
128
- new plugins.typedrequest.TypedResponseError('CoreMail gateway request rejected.', {
129
- code: codeArg,
130
- retryable: retryableArg,
131
- } satisfies plugins.servezoneInterfaces.data.ICoreMailErrorData);
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.registerHandlers();
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
- private registerHandlers(): void {
278
- this.typedrouter.addTypedHandler(
279
- new plugins.typedrequest.TypedHandler<TReq_Authenticate>(
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
- async (dataArg, toolsArg) => await this.authenticate(this.requirePeer(toolsArg), dataArg),
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
- async (dataArg, toolsArg) => await this.prepareOutboundHandoff(
288
- this.requireSession(this.requirePeer(toolsArg)),
289
- dataArg,
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
- async (dataArg, toolsArg) => await this.getOutboundStatus(
297
- this.requireSession(this.requirePeer(toolsArg)),
298
- dataArg,
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 ops TypedSocket surface is
324
- * shared with other client types, so presence on the socket proves nothing.
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
- throw contractError('AUTHENTICATION_FAILED');
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 this.runtime.createRequest<T>(methodArg, connection).fire(requestArg);
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 { ICoreMailGatewayRuntime } from './classes.coremail-gateway.manager.js';
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 ops TypedSocket.
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
- return await typedsocket.findTargetConnectionByTag(tagArg as never) as never;
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
+ }