@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 +16 -0
- package/dist/gateway-ent.cjs +2 -517
- package/dist/gateway-ent.cjs.map +3 -3
- package/dist/gateway-ent.js +2 -485
- package/dist/gateway-ent.js.map +3 -3
- package/dist/index.cjs +2 -3312
- package/dist/index.cjs.map +4 -4
- package/dist/index.js +2 -3281
- package/dist/index.js.map +4 -4
- package/dist/metrics/publisher/rest.cjs +1 -71
- package/dist/metrics/publisher/rest.cjs.map +3 -3
- package/dist/metrics/publisher/rest.js +1 -34
- package/dist/metrics/publisher/rest.js.map +3 -3
- package/dist/web/test.js +2 -1394
- package/dist/web/test.js.map +2 -2
- package/package.json +3 -3
- package/readme.md +5 -1
- package/types/web/server.d.ts +1 -1
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
|
package/dist/gateway-ent.cjs
CHANGED
|
@@ -1,518 +1,3 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var
|
|
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
|