@interopio/gateway-server 0.14.1 → 0.16.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/changelog.md CHANGED
@@ -2,6 +2,22 @@
2
2
 
3
3
  # Change Log
4
4
 
5
+ ## 0.16.0 (2025-11-14)
6
+ ### Changed
7
+ - bump @interopio/gateway to 0.19.0
8
+ ### Fixed
9
+ - fix: mesh auth config mapping in (gateway-ent) compat mode
10
+
11
+ ## 0.15.0 (2025-11-12)
12
+ ### Changed
13
+ - bump @interopio/gateway to 0.18.0
14
+
15
+ ### Added
16
+ - feat: ping for clients can contain timestamp to measure latency (which is now the default behaviour, when specifying interval as number)
17
+
18
+ ### Fixed
19
+ - fix: metrics publisher config in (gateway-ent) compat mode
20
+
5
21
  ## 0.14.1 (2025-11-04)
6
22
  ### Fixed
7
23
  - fix: log config is not applied in (gateway-ent) compat mode
@@ -1,518 +1,3 @@
1
- "use strict";
2
- var __create = Object.create;
3
- var __defProp = Object.defineProperty;
4
- var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
- var __getOwnPropNames = Object.getOwnPropertyNames;
6
- var __getProtoOf = Object.getPrototypeOf;
7
- var __hasOwnProp = Object.prototype.hasOwnProperty;
8
- var __esm = (fn, res) => function __init() {
9
- return fn && (res = (0, fn[__getOwnPropNames(fn)[0]])(fn = 0)), res;
10
- };
11
- var __export = (target, all) => {
12
- for (var name in all)
13
- __defProp(target, name, { get: all[name], enumerable: true });
14
- };
15
- var __copyProps = (to, from, except, desc) => {
16
- if (from && typeof from === "object" || typeof from === "function") {
17
- for (let key of __getOwnPropNames(from))
18
- if (!__hasOwnProp.call(to, key) && key !== except)
19
- __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
20
- }
21
- return to;
22
- };
23
- var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
24
- // If the importer is in node compatibility mode or this is not an ESM
25
- // file that has been converted to a CommonJS file using a Babel-
26
- // compatible transform (i.e. "__esModule" has not been set), then set
27
- // "default" to the CommonJS "module.exports" for node compatibility.
28
- isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
29
- mod
30
- ));
31
- var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
32
-
33
- // src/logger.ts
34
- function getLogger2(name) {
35
- return GatewayLogging.getLogger(`gateway.server.${name}`);
36
- }
37
- var GatewayLogging;
38
- var init_logger = __esm({
39
- "src/logger.ts"() {
40
- "use strict";
41
- GatewayLogging = __toESM(require("@interopio/gateway/logging/core"), 1);
42
- }
43
- });
44
-
45
- // src/mesh/ws/broker/core.ts
46
- var core_exports = {};
47
- __export(core_exports, {
48
- default: () => core_default
49
- });
50
- function broadcastNodeAdded(nodes, newSocket, newNodeId) {
51
- Object.entries(nodes.nodes).forEach(([nodeId, socket]) => {
52
- if (nodeId !== newNodeId) {
53
- newSocket.send(codec.encode({ type: "node-added", "node-id": newNodeId, "new-node": nodeId }));
54
- socket.send(codec.encode({ type: "node-added", "node-id": nodeId, "new-node": newNodeId }));
55
- }
56
- });
57
- }
58
- function broadcastNodeRemoved(nodes, removedNodeId) {
59
- Object.entries(nodes.nodes).forEach(([nodeId, socket]) => {
60
- if (nodeId !== removedNodeId) {
61
- socket.send(codec.encode({ type: "node-removed", "node-id": nodeId, "removed-node": removedNodeId }));
62
- }
63
- });
64
- }
65
- function onOpen(connectedNodes, logPrefix) {
66
- logger.info(`${logPrefix}connection accepted`);
67
- }
68
- function onClose(connectedNodes, logPrefix, code, reason) {
69
- logger.info(`${logPrefix}connection closed [${code}](${reason})`);
70
- const nodeIds = connectedNodes.sockets[logPrefix];
71
- if (nodeIds) {
72
- delete connectedNodes.sockets[logPrefix];
73
- for (const nodeId of nodeIds) {
74
- delete connectedNodes.nodes[nodeId];
75
- }
76
- for (const nodeId of nodeIds) {
77
- broadcastNodeRemoved(connectedNodes, nodeId);
78
- }
79
- }
80
- }
81
- function processMessage(connectedNodes, socket, key, msg) {
82
- switch (msg.type) {
83
- case "hello": {
84
- const nodeId = msg["node-id"];
85
- connectedNodes.nodes[nodeId] = socket;
86
- connectedNodes.sockets[key] = connectedNodes.sockets[key] ?? [];
87
- connectedNodes.sockets[key].push(nodeId);
88
- logger.info(`[${key}] node ${nodeId} added.`);
89
- broadcastNodeAdded(connectedNodes, socket, nodeId);
90
- break;
91
- }
92
- case "bye": {
93
- const nodeId = msg["node-id"];
94
- delete connectedNodes[nodeId];
95
- logger.info(`[${key}] node ${nodeId} removed.`);
96
- broadcastNodeRemoved(connectedNodes, nodeId);
97
- break;
98
- }
99
- case "data": {
100
- const sourceNodeId = msg.from;
101
- const targetNodeId = msg.to;
102
- if ("all" === targetNodeId) {
103
- Object.entries(connectedNodes.nodes).forEach(([nodeId, socket2]) => {
104
- if (nodeId !== sourceNodeId) {
105
- socket2.send(codec.encode(msg));
106
- }
107
- });
108
- } else {
109
- const socket2 = connectedNodes.nodes[targetNodeId];
110
- if (socket2) {
111
- socket2.send(codec.encode(msg));
112
- } else {
113
- logger.warn(`unable to send to node ${targetNodeId} message ${JSON.stringify(msg)}`);
114
- }
115
- }
116
- break;
117
- }
118
- default: {
119
- logger.warn(`[${key}] ignoring unknown message ${JSON.stringify(msg)}`);
120
- break;
121
- }
122
- }
123
- }
124
- function onMessage(connectedNodes, socket, logPrefix, msg) {
125
- try {
126
- const decoded = codec.decode(msg);
127
- if (logger.enabledFor("debug")) {
128
- logger.debug(`${logPrefix}processing msg ${JSON.stringify(decoded)}`);
129
- }
130
- processMessage(connectedNodes, socket, logPrefix, decoded);
131
- } catch (ex) {
132
- logger.error(`${logPrefix}unable to process message`, ex);
133
- }
134
- }
135
- async function create(environment) {
136
- const connectedNodes = { nodes: {}, sockets: {} };
137
- logger.info(`mesh server is listening`);
138
- return async ({ socket, handshake }) => {
139
- const logPrefix = handshake.logPrefix;
140
- onOpen(connectedNodes, logPrefix);
141
- socket.on("error", (err) => {
142
- logger.error(`${logPrefix}websocket error: ${err}`, err);
143
- });
144
- socket.on("message", (data, _isBinary) => {
145
- if (Array.isArray(data)) {
146
- data = Buffer.concat(data);
147
- }
148
- onMessage(connectedNodes, socket, logPrefix, data);
149
- });
150
- socket.on("close", (code, reason) => {
151
- onClose(connectedNodes, logPrefix, code, reason);
152
- });
153
- };
154
- }
155
- var import_gateway, GatewayEncoders, logger, codec, core_default;
156
- var init_core = __esm({
157
- "src/mesh/ws/broker/core.ts"() {
158
- "use strict";
159
- init_logger();
160
- import_gateway = require("@interopio/gateway");
161
- GatewayEncoders = import_gateway.IOGateway.Encoding;
162
- logger = getLogger2("mesh.ws.broker");
163
- codec = GatewayEncoders.transit({
164
- keywordize: /* @__PURE__ */ new Map([
165
- ["/type", "*"],
166
- ["/message/body/type", "*"],
167
- ["/message/origin", "*"],
168
- ["/message/receiver/type", "*"],
169
- ["/message/source/type", "*"],
170
- ["/message/body/type", "*"]
171
- ])
172
- });
173
- core_default = create;
174
- }
175
- });
176
-
177
- // src/gateway/ent/index.ts
178
- var index_exports = {};
179
- __export(index_exports, {
180
- configure_logging: () => configure_logging,
181
- create: () => create2
182
- });
183
- module.exports = __toCommonJS(index_exports);
184
-
185
- // src/gateway/ent/logging.ts
186
- var import_node_util = require("node:util");
187
- var LogInfoAdapter = class {
188
- #event;
189
- #parsed;
190
- #timestamp;
191
- #output;
192
- constructor(event) {
193
- this.#event = event;
194
- }
195
- parsed() {
196
- if (this.#parsed === void 0) {
197
- let err = void 0;
198
- let vargs = this.#event.data;
199
- if (this.#event.data[0] instanceof Error) {
200
- err = this.#event.data[0];
201
- vargs = vargs.slice(1);
202
- }
203
- const msg = (0, import_node_util.format)(this.#event.message, ...vargs);
204
- this.#parsed = { err, msg };
205
- }
206
- return this.#parsed;
207
- }
208
- get time() {
209
- return this.#event.time;
210
- }
211
- get level() {
212
- return this.#event.level;
213
- }
214
- get namespace() {
215
- return this.#event.name;
216
- }
217
- get file() {
218
- return void 0;
219
- }
220
- get line() {
221
- return void 0;
222
- }
223
- get message() {
224
- return this.parsed().msg;
225
- }
226
- get stacktrace() {
227
- return this.parsed().err;
228
- }
229
- get timestamp() {
230
- if (this.#timestamp === void 0) {
231
- this.#timestamp = this.time.toISOString();
232
- }
233
- return this.#timestamp;
234
- }
235
- get output() {
236
- if (this.#output === void 0) {
237
- const err = this.parsed().err;
238
- const stacktrace = err ? `
239
- ${err.stack ?? err}` : "";
240
- this.#output = `${this.timestamp} ${this.level.toUpperCase()} [${this.namespace}] - ${this.message}${stacktrace}`;
241
- }
242
- return this.#output;
243
- }
244
- };
245
- function toLogConfig(config) {
246
- let level = "info";
247
- if (config?.level) {
248
- if (config.level === "fatal") {
249
- level = "error";
250
- } else if (config.level !== "report") {
251
- level = config.level;
252
- }
253
- }
254
- const result = { level };
255
- const appenderFn = config?.appender;
256
- if (appenderFn) {
257
- result.appender = (event) => {
258
- appenderFn(new LogInfoAdapter(event));
259
- };
260
- }
261
- return result;
262
- }
263
-
264
- // src/gateway/ent/server.ts
265
- var import_gateway_server = require("@interopio/gateway-server");
266
- var ServerDelegate = class {
267
- constructor(config) {
268
- this.config = config;
269
- }
270
- server;
271
- async connect(cb) {
272
- if (!this.server) {
273
- throw new Error(`not started`);
274
- }
275
- const client = await this.server.gateway.connect((c, m) => cb(c, m));
276
- return client;
277
- }
278
- info() {
279
- return this.server?.gateway.info();
280
- }
281
- async start() {
282
- if (!this.server) {
283
- this.server = await import_gateway_server.GatewayServer.Factory(this.config);
284
- }
285
- return this;
286
- }
287
- async stop() {
288
- await this.server?.close();
289
- delete this.server;
290
- return this;
291
- }
292
- };
293
-
294
- // src/gateway/ent/config.ts
295
- function toMetricsFilters(legacy) {
296
- if (legacy) {
297
- const publishers = legacy.publishers.map((publisher) => {
298
- return { identity: publisher.publisher, metrics: publisher.metrics };
299
- });
300
- const non_matched = legacy["non-matched"];
301
- return { publishers, non_matched };
302
- }
303
- }
304
- function toMetricsPublisherConfig(legacy) {
305
- const filters = toMetricsFilters(legacy?.filters);
306
- const conflation = toConflation(legacy?.conflation);
307
- return { ...legacy, filters, conflation };
308
- }
309
- function toConflation(legacy) {
310
- if (legacy) {
311
- return { interval: legacy.interval };
312
- }
313
- }
314
- function toMetricsConfig(legacy) {
315
- const metrics = { publishers: [] };
316
- legacy?.publishers?.forEach((publisher) => {
317
- if (typeof publisher === "string") {
318
- if (publisher === "rest") {
319
- metrics.publishers.push("rest");
320
- if (legacy.rest) {
321
- const conf = { ...legacy.rest };
322
- const userAgent = conf["user-agent"];
323
- delete conf["user-agent"];
324
- const headers = { ...conf.headers, ...userAgent ? { "user-agent": userAgent } : {} };
325
- delete conf.headers;
326
- metrics.rest = {
327
- endpoint: conf.endpoint,
328
- headers,
329
- ...toMetricsPublisherConfig(conf)
330
- };
331
- metrics.rest["publishFn"] ??= "@interopio/gateway-server/metrics/publisher/rest";
332
- }
333
- } else if (publisher === "file") {
334
- metrics.publishers.push("file");
335
- if (legacy.file) {
336
- const conf = { ...legacy.file };
337
- const status = conf["skip-status"] === void 0 ? true : !conf["skip-status"];
338
- delete conf["skip-status"];
339
- metrics.file = {
340
- location: conf.location,
341
- status,
342
- ...toMetricsPublisherConfig(conf)
343
- };
344
- metrics.file["publishFn"] ??= "@interopio/gateway/metrics/publisher/file";
345
- }
346
- } else {
347
- }
348
- } else {
349
- const configuration = { ...publisher.configuration };
350
- const splitSize = configuration["split-size"];
351
- delete configuration["split-size"];
352
- const file = publisher["file"];
353
- const custom = {
354
- split_size: splitSize,
355
- publisher: { file, configuration },
356
- ...toMetricsPublisherConfig(configuration)
357
- };
358
- metrics.publishers.push(custom);
359
- }
360
- });
361
- if (legacy?.filters) {
362
- metrics.filters = toMetricsFilters(legacy?.filters);
363
- }
364
- return metrics;
365
- }
366
- function trimTrailingSlash(url) {
367
- return url?.endsWith("/") ? url.slice(0, -1) : url;
368
- }
369
- function toCluster(legacy) {
370
- if (legacy?.directory) {
371
- const legacyDirectory = legacy.directory;
372
- const config = { endpoint: legacy?.["endpoint"] };
373
- if (legacyDirectory.type === "rest") {
374
- let directory = void 0;
375
- if (config.endpoint === void 0) {
376
- config.endpoint = trimTrailingSlash(legacyDirectory.config?.directory_uri);
377
- } else {
378
- directory = { uri: trimTrailingSlash(legacyDirectory.config?.directory_uri) };
379
- }
380
- if (legacyDirectory.config?.announce_interval) {
381
- directory ??= {};
382
- directory.interval = Number(legacyDirectory.config.announce_interval);
383
- }
384
- if (directory !== void 0) {
385
- config.directory = directory;
386
- }
387
- return config;
388
- } else if (legacyDirectory.type === "static") {
389
- config.directory = { members: legacyDirectory.members ?? [] };
390
- return config;
391
- }
392
- }
393
- }
394
- function toMeshConfig(legacy) {
395
- const mesh = {};
396
- if (legacy?.configuration?.node_id) {
397
- mesh.node = legacy.configuration.node_id;
398
- }
399
- if (legacy?.type === "broker") {
400
- mesh.broker = { endpoint: legacy.broker?.endpoint ?? "<unresolved>" };
401
- }
402
- if (legacy?.type === "p2p") {
403
- const cluster = toCluster(legacy.p2p);
404
- if (cluster) {
405
- mesh.cluster = cluster;
406
- }
407
- }
408
- return mesh;
409
- }
410
- function toAuthenticationConfig(legacy) {
411
- const authentication = { available: [] };
412
- if (legacy?.default) {
413
- authentication.default = legacy.default;
414
- }
415
- const as = legacy?.available;
416
- as.forEach((a) => {
417
- if (a === "basic" || a === "oauth2" || legacy?.[a]?.["authenticator"] !== void 0) {
418
- authentication.available.push(a);
419
- if (legacy?.[a] !== void 0) {
420
- authentication[a] = legacy[a];
421
- }
422
- }
423
- });
424
- return authentication;
425
- }
426
- function toServerConfig(config) {
427
- const gateway = {
428
- route: config.route,
429
- maxConnections: config.limits?.max_connections,
430
- origins: config.security?.origin_filters,
431
- authorize: config["authorize"] ?? { access: "permitted" },
432
- clients: config["clients"] ?? { inactive_seconds: 0, buffer_size: 100 },
433
- contexts: {
434
- lifetime: "retained",
435
- visibility: [
436
- { context: /___channel___.+/, restrictions: "cluster" },
437
- { context: /T42\..+/, restrictions: "local" }
438
- ]
439
- },
440
- methods: {
441
- visibility: [
442
- { method: /T42\..+/, restrictions: "local" }
443
- ]
444
- },
445
- peers: {
446
- visibility: [
447
- { domain: "context", restrictions: "cluster" },
448
- { domain: "agm", restrictions: "local" }
449
- ]
450
- },
451
- metrics: { publishers: [] }
452
- };
453
- if (config.authentication !== void 0) {
454
- if (config.authentication.token_ttl) {
455
- gateway.token = { ttl: config.authentication?.token_ttl };
456
- }
457
- if (config.authentication.available || config.authentication.default) {
458
- gateway.authentication = toAuthenticationConfig(config.authentication);
459
- }
460
- }
461
- if (config["globals"]) {
462
- gateway.globals = config["globals"];
463
- }
464
- if (config["contexts"]) {
465
- gateway.contexts = config["contexts"];
466
- }
467
- if (config["methods"]) {
468
- gateway.methods = config["methods"];
469
- }
470
- if (config["peers"]) {
471
- gateway.peers = config["peers"];
472
- }
473
- if (config.cluster?.enabled) {
474
- gateway.mesh = toMeshConfig(config.cluster);
475
- }
476
- if (config.metrics?.publishers) {
477
- gateway.metrics = toMetricsConfig(config.metrics);
478
- }
479
- return {
480
- port: config.port ?? 3434,
481
- host: config.ip ?? config["host"],
482
- cors: config["cors"] === null ? void 0 : config["cors"] ?? false,
483
- memory: config["memory"],
484
- app: async (configurer) => {
485
- if (config.cluster?.embedded_broker?.enabled === true) {
486
- configurer.socket({
487
- path: config.cluster.embedded_broker.route ?? "/mesh-broker",
488
- options: {
489
- authorize: config.cluster.embedded_broker["authorize"] ?? { access: "permitted" }
490
- },
491
- factory: async (env) => {
492
- if (gateway.mesh?.broker?.endpoint === "<unresolved>") {
493
- gateway.mesh.broker.endpoint = env.endpoint;
494
- }
495
- const delegate = (await Promise.resolve().then(() => (init_core(), core_exports))).default;
496
- return await delegate(env);
497
- }
498
- });
499
- }
500
- },
501
- gateway
502
- };
503
- }
504
-
505
- // src/gateway/ent/index.ts
506
- var import_core = require("@interopio/gateway/logging/core");
507
- function create2(config) {
508
- return new ServerDelegate(toServerConfig(config));
509
- }
510
- function configure_logging(config) {
511
- (0, import_core.configure)(toLogConfig(config));
512
- }
513
- // Annotate the CommonJS export names for ESM import in node:
514
- 0 && (module.exports = {
515
- configure_logging,
516
- create
517
- });
1
+ "use strict";var $=Object.create;var c=Object.defineProperty;var E=Object.getOwnPropertyDescriptor;var P=Object.getOwnPropertyNames;var z=Object.getPrototypeOf,A=Object.prototype.hasOwnProperty;var m=(e,t)=>()=>(e&&(t=e(e=0)),t);var h=(e,t)=>{for(var n in t)c(e,n,{get:t[n],enumerable:!0})},y=(e,t,n,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let i of P(t))!A.call(e,i)&&i!==n&&c(e,i,{get:()=>t[i],enumerable:!(r=E(t,i))||r.enumerable});return e};var F=(e,t,n)=>(n=e!=null?$(z(e)):{},y(t||!e||!e.__esModule?c(n,"default",{value:e,enumerable:!0}):n,e)),R=e=>y(c({},"__esModule",{value:!0}),e);function g(e){return l.getLogger(`gateway.server.${e}`)}var l,C=m(()=>{"use strict";l=F(require("@interopio/gateway/logging/core"),1)});var S={};h(S,{default:()=>q});function T(e,t,n){Object.entries(e.nodes).forEach(([r,i])=>{r!==n&&(t.send(d.encode({type:"node-added","node-id":n,"new-node":r})),i.send(d.encode({type:"node-added","node-id":r,"new-node":n})))})}function k(e,t){Object.entries(e.nodes).forEach(([n,r])=>{n!==t&&r.send(d.encode({type:"node-removed","node-id":n,"removed-node":t}))})}function j(e,t){a.info(`${t}connection accepted`)}function B(e,t,n,r){a.info(`${t}connection closed [${n}](${r})`);let i=e.sockets[t];if(i){delete e.sockets[t];for(let s of i)delete e.nodes[s];for(let s of i)k(e,s)}}function N(e,t,n,r){switch(r.type){case"hello":{let i=r["node-id"];e.nodes[i]=t,e.sockets[n]=e.sockets[n]??[],e.sockets[n].push(i),a.info(`[${n}] node ${i} added.`),T(e,t,i);break}case"bye":{let i=r["node-id"];delete e[i],a.info(`[${n}] node ${i} removed.`),k(e,i);break}case"data":{let i=r.from,s=r.to;if(s==="all")Object.entries(e.nodes).forEach(([o,x])=>{o!==i&&x.send(d.encode(r))});else{let o=e.nodes[s];o?o.send(d.encode(r)):a.warn(`unable to send to node ${s} message ${JSON.stringify(r)}`)}break}default:{a.warn(`[${n}] ignoring unknown message ${JSON.stringify(r)}`);break}}}function D(e,t,n,r){try{let i=d.decode(r);a.enabledFor("debug")&&a.debug(`${n}processing msg ${JSON.stringify(i)}`),N(e,t,n,i)}catch(i){a.error(`${n}unable to process message`,i)}}async function J(e){let t={nodes:{},sockets:{}};return a.info("mesh server is listening"),async({socket:n,handshake:r})=>{let i=r.logPrefix;j(t,i),n.on("error",s=>{a.error(`${i}websocket error: ${s}`,s)}),n.on("message",(s,o)=>{Array.isArray(s)&&(s=Buffer.concat(s)),D(t,n,i,s)}),n.on("close",(s,o)=>{B(t,i,s,o)})}}var G,W,a,d,q,L=m(()=>{"use strict";C();G=require("@interopio/gateway"),W=G.IOGateway.Encoding,a=g("mesh.ws.broker");d=W.transit({keywordize:new Map([["/type","*"],["/message/body/type","*"],["/message/origin","*"],["/message/receiver/type","*"],["/message/source/type","*"],["/message/body/type","*"]])});q=J});var Z={};h(Z,{configure_logging:()=>Y,create:()=>X});module.exports=R(Z);var w=require("node:util"),f=class{#e;#t;#r;#n;constructor(t){this.#e=t}parsed(){if(this.#t===void 0){let t,n=this.#e.data;this.#e.data[0]instanceof Error&&(t=this.#e.data[0],n=n.slice(1));let r=(0,w.format)(this.#e.message,...n);this.#t={err:t,msg:r}}return this.#t}get time(){return this.#e.time}get level(){return this.#e.level}get namespace(){return this.#e.name}get file(){}get line(){}get message(){return this.parsed().msg}get stacktrace(){return this.parsed().err}get timestamp(){return this.#r===void 0&&(this.#r=this.time.toISOString()),this.#r}get output(){if(this.#n===void 0){let t=this.parsed().err,n=t?`
2
+ ${t.stack??t}`:"";this.#n=`${this.timestamp} ${this.level.toUpperCase()} [${this.namespace}] - ${this.message}${n}`}return this.#n}};function b(e){let t="info";e?.level&&(e.level==="fatal"?t="error":e.level!=="report"&&(t=e.level));let n={level:t},r=e?.appender;return r&&(n.appender=i=>{r(new f(i))}),n}var v=require("@interopio/gateway-server"),u=class{constructor(t){this.config=t}server;async connect(t){if(!this.server)throw new Error("not started");return await this.server.gateway.connect((r,i)=>t(r,i))}info(){return this.server?.gateway.info()}async start(){return this.server||(this.server=await v.GatewayServer.Factory(this.config)),this}async stop(){return await this.server?.close(),delete this.server,this}};function I(e){if(e){let t=e.publishers.map(r=>({identity:r.publisher,metrics:r.metrics})),n=e["non-matched"];return{publishers:t,non_matched:n}}}function p(e){let t=I(e?.filters),n=H(e?.conflation),r={...e,filters:t,conflation:n};return t||delete r.filters,n||delete r.conflation,r}function H(e){if(e)return{interval:e.interval}}function K(e){let t={publishers:[]};return e?.publishers?.forEach(n=>{if(typeof n=="string"){if(n==="rest"){if(t.publishers.push("rest"),e.rest){let r={...e.rest},i=r["user-agent"];delete r["user-agent"];let s={...r.headers,...i?{"user-agent":i}:{}};delete r.headers,t.rest={endpoint:r.endpoint,headers:s,...p(r)},t.rest.publishFn??="@interopio/gateway-server/metrics/publisher/rest"}}else if(n==="file"&&(t.publishers.push("file"),e.file)){let r={...e.file},i=r["skip-status"]===void 0?!0:!r["skip-status"];delete r["skip-status"],t.file={location:r.location,status:i,...p(r)},t.file.publishFn??="@interopio/gateway/metrics/publisher/file"}}else{let r={...n},i=r["split-size"];delete r["split-size"];let s=n.publisher?.file,o={split_size:i,publisher:{file:s,configuration:n.publisher?.configuration},context:n.context,...p(r)};o.split_size===void 0&&delete o.split_size,t.publishers.push(o)}}),e?.filters&&(t.filters=I(e?.filters)),t}function O(e){return e?.endsWith("/")?e.slice(0,-1):e}function U(e){if(e?.directory){let t=e.directory,n={endpoint:e?.endpoint};if(t.type==="rest"){let r;if(n.endpoint===void 0?n.endpoint=O(t.config?.directory_uri):r={uri:O(t.config?.directory_uri)},t.config?.announce_interval&&(r??={},r.interval=Number(t.config.announce_interval)),r!==void 0&&(n.directory=r),t.config){let i={...t.config};delete i.directory_uri,delete i.announce_interval,Object.keys(i).length>0&&(n.opts=i)}return n}else if(t.type==="static")return n.directory={members:t.members??[]},n}}function Q(e){let t={auth:{user:null}};if(e?.configuration?.node_id&&(t.node=e.configuration.node_id),e?.configuration?.user&&(t.auth.user=e.configuration?.user),e?.type==="broker"&&(t.broker={endpoint:e.broker?.endpoint??"<unresolved>"}),e?.type==="p2p"){let n=U(e.p2p);n&&(t.cluster=n)}return t}function V(e){let t={available:[]};return e?.default&&(t.default=e.default),(e?.available).forEach(r=>{(r==="basic"||r==="oauth2"||e?.[r]?.authenticator!==void 0)&&(t.available.push(r),e?.[r]!==void 0&&(t[r]=e[r]))}),t}function _(e){let t={route:e.route,maxConnections:e.limits?.max_connections,origins:e.security?.origin_filters,authorize:e.authorize??{access:"permitted"},ping:e.ping,clients:e.clients??{inactive_seconds:0,buffer_size:100},contexts:{lifetime:"retained",visibility:[{context:/___channel___.+/,restrictions:"cluster"},{context:/T42\..+/,restrictions:"local"}]},methods:{visibility:[{method:/T42\..+/,restrictions:"local"}]},peers:{visibility:[{domain:"context",restrictions:"cluster"},{domain:"agm",restrictions:"local"}]},metrics:{publishers:[]}};return e.authentication!==void 0&&(e.authentication.token_ttl&&(t.token={ttl:e.authentication?.token_ttl}),(e.authentication.available||e.authentication.default)&&(t.authentication=V(e.authentication))),e.globals&&(t.globals=e.globals),e.contexts&&(t.contexts=e.contexts),e.methods&&(t.methods=e.methods),e.peers&&(t.peers=e.peers),e.cluster?.enabled&&(t.mesh=Q(e.cluster)),e.metrics?.publishers&&(t.metrics=K(e.metrics)),{port:e.port??3434,host:e.ip??e.host,cors:e.cors===null?void 0:e.cors??!1,memory:e.memory,app:async n=>{e.cluster?.embedded_broker?.enabled===!0&&n.socket({path:e.cluster.embedded_broker.route??"/mesh-broker",options:{authorize:e.cluster.embedded_broker.authorize??{access:"permitted"}},factory:async r=>{t.mesh?.broker?.endpoint==="<unresolved>"&&(t.mesh.broker.endpoint=r.endpoint);let i=(await Promise.resolve().then(()=>(L(),S))).default;return await i(r)}})},gateway:t}}var M=require("@interopio/gateway/logging/core");function X(e){return new u(_(e))}function Y(e){(0,M.configure)(b(e))}0&&(module.exports={configure_logging,create});
518
3
  //# sourceMappingURL=gateway-ent.cjs.map