eimer 0.1.2 → 0.2.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/README.md +12 -6
- package/dist/cjs/eimer/Eimer.d.ts +9 -5
- package/dist/cjs/eimer/Eimer.d.ts.map +1 -1
- package/dist/cjs/eimer/Eimer.js +28 -10
- package/dist/cjs/eimer/Eimer.js.map +1 -1
- package/dist/cjs/eimer/EimerDependencies.d.ts +2 -0
- package/dist/cjs/eimer/EimerDependencies.d.ts.map +1 -1
- package/dist/cjs/eimer/EimerDependencies.js.map +1 -1
- package/dist/cjs/eimer/EimerMessage.d.ts +4 -1
- package/dist/cjs/eimer/EimerMessage.d.ts.map +1 -1
- package/dist/cjs/eimer/EimerMessage.js +3 -1
- package/dist/cjs/eimer/EimerMessage.js.map +1 -1
- package/dist/cjs/eimer/EimerMessageMeta.d.ts +17 -0
- package/dist/cjs/eimer/EimerMessageMeta.d.ts.map +1 -0
- package/dist/cjs/eimer/EimerMessageMeta.js +3 -0
- package/dist/cjs/eimer/EimerMessageMeta.js.map +1 -0
- package/dist/cjs/eimer/PayloadHandler.d.ts +2 -1
- package/dist/cjs/eimer/PayloadHandler.d.ts.map +1 -1
- package/dist/cjs/eimer/RpcHandler.d.ts +2 -1
- package/dist/cjs/eimer/RpcHandler.d.ts.map +1 -1
- package/dist/cjs/eimer/RpcManager.d.ts +4 -2
- package/dist/cjs/eimer/RpcManager.d.ts.map +1 -1
- package/dist/cjs/eimer/TraceContext.d.ts +13 -0
- package/dist/cjs/eimer/TraceContext.d.ts.map +1 -0
- package/dist/cjs/eimer/TraceContext.js +3 -0
- package/dist/cjs/eimer/TraceContext.js.map +1 -0
- package/dist/cjs/eimer/TraceSpan.d.ts +14 -0
- package/dist/cjs/eimer/TraceSpan.d.ts.map +1 -0
- package/dist/cjs/eimer/TraceSpan.js +3 -0
- package/dist/cjs/eimer/TraceSpan.js.map +1 -0
- package/dist/cjs/eimer/Tracer.d.ts +34 -0
- package/dist/cjs/eimer/Tracer.d.ts.map +1 -0
- package/dist/cjs/eimer/Tracer.js +3 -0
- package/dist/cjs/eimer/Tracer.js.map +1 -0
- package/dist/cjs/eimer/TracerBackend.d.ts +21 -0
- package/dist/cjs/eimer/TracerBackend.d.ts.map +1 -0
- package/dist/cjs/eimer/TracerBackend.js +3 -0
- package/dist/cjs/eimer/TracerBackend.js.map +1 -0
- package/dist/cjs/eimer/index.d.ts +5 -0
- package/dist/cjs/eimer/index.d.ts.map +1 -1
- package/dist/cjs/eimer/index.js +5 -0
- package/dist/cjs/eimer/index.js.map +1 -1
- package/dist/cjs/eimer/now.d.ts +12 -0
- package/dist/cjs/eimer/now.d.ts.map +1 -0
- package/dist/cjs/eimer/now.js +17 -0
- package/dist/cjs/eimer/now.js.map +1 -0
- package/dist/cjs/message-bus/EimerMessageBus.d.ts +3 -2
- package/dist/cjs/message-bus/EimerMessageBus.d.ts.map +1 -1
- package/dist/cjs/message-bus/EimerMessageBus.js +21 -3
- package/dist/cjs/message-bus/EimerMessageBus.js.map +1 -1
- package/dist/cjs/rpc/EimerRpcManager.d.ts +9 -6
- package/dist/cjs/rpc/EimerRpcManager.d.ts.map +1 -1
- package/dist/cjs/rpc/EimerRpcManager.js +31 -9
- package/dist/cjs/rpc/EimerRpcManager.js.map +1 -1
- package/dist/cjs/rpc/EimerRpcRequestMessage.d.ts +2 -1
- package/dist/cjs/rpc/EimerRpcRequestMessage.d.ts.map +1 -1
- package/dist/cjs/rpc/EimerRpcRequestMessage.js +2 -2
- package/dist/cjs/rpc/EimerRpcRequestMessage.js.map +1 -1
- package/dist/cjs/rpc/EimerRpcResponseMessage.d.ts +2 -1
- package/dist/cjs/rpc/EimerRpcResponseMessage.d.ts.map +1 -1
- package/dist/cjs/rpc/EimerRpcResponseMessage.js +2 -2
- package/dist/cjs/rpc/EimerRpcResponseMessage.js.map +1 -1
- package/dist/cjs/tracing/ConsoleLoggingTracerBackend.d.ts +53 -0
- package/dist/cjs/tracing/ConsoleLoggingTracerBackend.d.ts.map +1 -0
- package/dist/cjs/tracing/ConsoleLoggingTracerBackend.js +113 -0
- package/dist/cjs/tracing/ConsoleLoggingTracerBackend.js.map +1 -0
- package/dist/cjs/tracing/EimerLoggerTracerBackend.d.ts +12 -0
- package/dist/cjs/tracing/EimerLoggerTracerBackend.d.ts.map +1 -0
- package/dist/cjs/tracing/EimerLoggerTracerBackend.js +18 -0
- package/dist/cjs/tracing/EimerLoggerTracerBackend.js.map +1 -0
- package/dist/cjs/tracing/EimerNoopTracer.d.ts +17 -0
- package/dist/cjs/tracing/EimerNoopTracer.d.ts.map +1 -0
- package/dist/cjs/tracing/EimerNoopTracer.js +27 -0
- package/dist/cjs/tracing/EimerNoopTracer.js.map +1 -0
- package/dist/cjs/tracing/EimerPublishingTracerBackend.d.ts +17 -0
- package/dist/cjs/tracing/EimerPublishingTracerBackend.d.ts.map +1 -0
- package/dist/cjs/tracing/EimerPublishingTracerBackend.js +20 -0
- package/dist/cjs/tracing/EimerPublishingTracerBackend.js.map +1 -0
- package/dist/cjs/tracing/EimerTraceSubscriber.d.ts +17 -0
- package/dist/cjs/tracing/EimerTraceSubscriber.d.ts.map +1 -0
- package/dist/cjs/tracing/EimerTraceSubscriber.js +23 -0
- package/dist/cjs/tracing/EimerTraceSubscriber.js.map +1 -0
- package/dist/cjs/tracing/EimerTracer.d.ts +21 -0
- package/dist/cjs/tracing/EimerTracer.d.ts.map +1 -0
- package/dist/cjs/tracing/EimerTracer.js +59 -0
- package/dist/cjs/tracing/EimerTracer.js.map +1 -0
- package/dist/cjs/tracing/MemoryTracerBackend.d.ts +14 -0
- package/dist/cjs/tracing/MemoryTracerBackend.d.ts.map +1 -0
- package/dist/cjs/tracing/MemoryTracerBackend.js +24 -0
- package/dist/cjs/tracing/MemoryTracerBackend.js.map +1 -0
- package/dist/cjs/tracing/NoopTracer.d.ts +16 -0
- package/dist/cjs/tracing/NoopTracer.d.ts.map +1 -0
- package/dist/cjs/tracing/NoopTracer.js +27 -0
- package/dist/cjs/tracing/NoopTracer.js.map +1 -0
- package/dist/cjs/tracing/index.d.ts +9 -0
- package/dist/cjs/tracing/index.d.ts.map +1 -0
- package/dist/cjs/tracing/index.js +25 -0
- package/dist/cjs/tracing/index.js.map +1 -0
- package/dist/cjs/tracing/now.d.ts +9 -0
- package/dist/cjs/tracing/now.d.ts.map +1 -0
- package/dist/cjs/tracing/now.js +14 -0
- package/dist/cjs/tracing/now.js.map +1 -0
- package/dist/esm/eimer/Eimer.js +28 -10
- package/dist/esm/eimer/Eimer.js.map +1 -1
- package/dist/esm/eimer/EimerDependencies.js.map +1 -1
- package/dist/esm/eimer/EimerMessage.js +3 -1
- package/dist/esm/eimer/EimerMessage.js.map +1 -1
- package/dist/esm/eimer/EimerMessageMeta.js +2 -0
- package/dist/esm/eimer/EimerMessageMeta.js.map +1 -0
- package/dist/esm/eimer/TraceContext.js +2 -0
- package/dist/esm/eimer/TraceContext.js.map +1 -0
- package/dist/esm/eimer/TraceSpan.js +2 -0
- package/dist/esm/eimer/TraceSpan.js.map +1 -0
- package/dist/esm/eimer/Tracer.js +2 -0
- package/dist/esm/eimer/Tracer.js.map +1 -0
- package/dist/esm/eimer/TracerBackend.js +2 -0
- package/dist/esm/eimer/TracerBackend.js.map +1 -0
- package/dist/esm/eimer/index.js +5 -0
- package/dist/esm/eimer/index.js.map +1 -1
- package/dist/esm/eimer/now.js +14 -0
- package/dist/esm/eimer/now.js.map +1 -0
- package/dist/esm/message-bus/EimerMessageBus.js +21 -3
- package/dist/esm/message-bus/EimerMessageBus.js.map +1 -1
- package/dist/esm/rpc/EimerRpcManager.js +31 -9
- package/dist/esm/rpc/EimerRpcManager.js.map +1 -1
- package/dist/esm/rpc/EimerRpcRequestMessage.js +2 -2
- package/dist/esm/rpc/EimerRpcRequestMessage.js.map +1 -1
- package/dist/esm/rpc/EimerRpcResponseMessage.js +2 -2
- package/dist/esm/rpc/EimerRpcResponseMessage.js.map +1 -1
- package/dist/esm/tracing/ConsoleLoggingTracerBackend.js +109 -0
- package/dist/esm/tracing/ConsoleLoggingTracerBackend.js.map +1 -0
- package/dist/esm/tracing/EimerLoggerTracerBackend.js +14 -0
- package/dist/esm/tracing/EimerLoggerTracerBackend.js.map +1 -0
- package/dist/esm/tracing/EimerNoopTracer.js +23 -0
- package/dist/esm/tracing/EimerNoopTracer.js.map +1 -0
- package/dist/esm/tracing/EimerPublishingTracerBackend.js +16 -0
- package/dist/esm/tracing/EimerPublishingTracerBackend.js.map +1 -0
- package/dist/esm/tracing/EimerTraceSubscriber.js +19 -0
- package/dist/esm/tracing/EimerTraceSubscriber.js.map +1 -0
- package/dist/esm/tracing/EimerTracer.js +55 -0
- package/dist/esm/tracing/EimerTracer.js.map +1 -0
- package/dist/esm/tracing/MemoryTracerBackend.js +20 -0
- package/dist/esm/tracing/MemoryTracerBackend.js.map +1 -0
- package/dist/esm/tracing/NoopTracer.js +30 -0
- package/dist/esm/tracing/NoopTracer.js.map +1 -0
- package/dist/esm/tracing/index.js +9 -0
- package/dist/esm/tracing/index.js.map +1 -0
- package/dist/esm/tracing/now.js +11 -0
- package/dist/esm/tracing/now.js.map +1 -0
- package/package.json +15 -1
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A timestamp (milliseconds since the Unix epoch) suitable for hop/span
|
|
3
|
+
* timing: `performance.now()` is monotonic and higher-resolution than
|
|
4
|
+
* `Date.now()` (important for sub-millisecond IPC hops), and unaffected by
|
|
5
|
+
* wall-clock adjustments (NTP sync, sleep/resume) that can otherwise produce
|
|
6
|
+
* negative durations - but it's relative to each process's own start, so
|
|
7
|
+
* `performance.timeOrigin` is added back in to make it comparable across
|
|
8
|
+
* processes. `performance` is available as a global in the browser, and in
|
|
9
|
+
* Node (backed by `node:perf_hooks`) since Node 16 - no import needed.
|
|
10
|
+
*/
|
|
11
|
+
export declare function now(): number;
|
|
12
|
+
//# sourceMappingURL=now.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"now.d.ts","sourceRoot":"","sources":["../../../src/eimer/now.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,wBAAgB,GAAG,IAAI,MAAM,CAE5B"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.now = now;
|
|
4
|
+
/**
|
|
5
|
+
* A timestamp (milliseconds since the Unix epoch) suitable for hop/span
|
|
6
|
+
* timing: `performance.now()` is monotonic and higher-resolution than
|
|
7
|
+
* `Date.now()` (important for sub-millisecond IPC hops), and unaffected by
|
|
8
|
+
* wall-clock adjustments (NTP sync, sleep/resume) that can otherwise produce
|
|
9
|
+
* negative durations - but it's relative to each process's own start, so
|
|
10
|
+
* `performance.timeOrigin` is added back in to make it comparable across
|
|
11
|
+
* processes. `performance` is available as a global in the browser, and in
|
|
12
|
+
* Node (backed by `node:perf_hooks`) since Node 16 - no import needed.
|
|
13
|
+
*/
|
|
14
|
+
function now() {
|
|
15
|
+
return performance.timeOrigin + performance.now();
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=now.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"now.js","sourceRoot":"","sources":["../../../src/eimer/now.ts"],"names":[],"mappings":";;AAUA,kBAEC;AAZD;;;;;;;;;GASG;AACH,SAAgB,GAAG;IACf,OAAO,WAAW,CAAC,UAAU,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;AACtD,CAAC"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { EimerMessage } from '../eimer/EimerMessage';
|
|
2
1
|
import type { EimerDependencies } from '../eimer/EimerDependencies';
|
|
2
|
+
import type { EimerMessage } from '../eimer/EimerMessage';
|
|
3
3
|
import type { EimerOptions } from '../eimer/EimerOptions';
|
|
4
4
|
import type { MessageBus } from '../eimer/MessageBus';
|
|
5
5
|
import type { MessageHandler } from '../eimer/MessageHandler';
|
|
@@ -8,11 +8,12 @@ import type { Topic } from '../eimer/Topic';
|
|
|
8
8
|
import type { Transport } from '../eimer/Transport';
|
|
9
9
|
export interface EimerMessageBusOptions extends Pick<EimerOptions, "logLevel" | "logModuleName"> {
|
|
10
10
|
}
|
|
11
|
-
export interface EimerMessageBusDependencies extends Pick<EimerDependencies, "logger"> {
|
|
11
|
+
export interface EimerMessageBusDependencies extends Pick<EimerDependencies, "logger" | "tracer"> {
|
|
12
12
|
}
|
|
13
13
|
export declare class EimerMessageBus implements MessageBus {
|
|
14
14
|
private readonly nodeId;
|
|
15
15
|
private logger;
|
|
16
|
+
private readonly tracer;
|
|
16
17
|
private readonly handlers;
|
|
17
18
|
private readonly transports;
|
|
18
19
|
private readonly seenMessages;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"EimerMessageBus.d.ts","sourceRoot":"","sources":["../../../src/message-bus/EimerMessageBus.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"EimerMessageBus.d.ts","sourceRoot":"","sources":["../../../src/message-bus/EimerMessageBus.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AACpE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAC1D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAE1D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAE9D,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAC9C,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AAE5C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAEpD,MAAM,WAAW,sBAAuB,SAAQ,IAAI,CAAC,YAAY,EAAE,UAAU,GAAG,eAAe,CAAC;CAC/F;AAED,MAAM,WAAW,2BAA4B,SAAQ,IAAI,CAAC,iBAAiB,EAAE,QAAQ,GAAG,QAAQ,CAAC;CAChG;AAED,qBAAa,eAAgB,YAAW,UAAU;IAC9C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA8C;IACvE,OAAO,CAAC,QAAQ,CAAC,UAAU,CAA6B;IACxD,OAAO,CAAC,QAAQ,CAAC,YAAY,CAA6B;gBAE9C,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAC,sBAAsB,EAAE,YAAY,CAAC,EAAE,2BAA2B;IAMvG,gBAAgB,CAAC,SAAS,EAAE,SAAS;IASrC,mBAAmB,CAAC,SAAS,EAAE,SAAS;IAMxC,OAAO,CAAC,OAAO,EAAE,YAAY;IAwB7B,SAAS,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,cAAc,GAAG,MAAM,IAAI;IAW5D,WAAW,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,cAAc,GAAG,IAAI;IAWxD,cAAc,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI;IAKlC,QAAQ,IAAI,IAAI;IAUhB,OAAO,CAAC,aAAa;IAuBrB,OAAO,CAAC,sBAAsB;CA0CjC"}
|
|
@@ -3,6 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.EimerMessageBus = void 0;
|
|
4
4
|
const LogLevel_1 = require("../eimer/LogLevel");
|
|
5
5
|
const EimerLogger_1 = require("../logger/EimerLogger");
|
|
6
|
+
const EimerNoopTracer_1 = require("../tracing/EimerNoopTracer");
|
|
6
7
|
class EimerMessageBus {
|
|
7
8
|
constructor(nodeId, options, dependencies) {
|
|
8
9
|
this.handlers = new Map();
|
|
@@ -10,6 +11,7 @@ class EimerMessageBus {
|
|
|
10
11
|
this.seenMessages = new Set(); // @todo: only store the last X message ids and purge the rest
|
|
11
12
|
this.nodeId = nodeId;
|
|
12
13
|
this.logger = dependencies?.logger ?? new EimerLogger_1.EimerLogger(options?.logLevel ?? LogLevel_1.LogLevel.DEBUG, options?.logModuleName ?? 'MessageBus', this.nodeId);
|
|
14
|
+
this.tracer = dependencies?.tracer ?? new EimerNoopTracer_1.EimerNoopTracer();
|
|
13
15
|
}
|
|
14
16
|
connectTransport(transport) {
|
|
15
17
|
this.logger.debug('Connecting transport', { transport });
|
|
@@ -32,7 +34,7 @@ class EimerMessageBus {
|
|
|
32
34
|
});
|
|
33
35
|
// Handle locally first
|
|
34
36
|
this.handleMessage(message);
|
|
35
|
-
// Forward to all transports
|
|
37
|
+
// Forward to all transports
|
|
36
38
|
this.transports.forEach(transport => {
|
|
37
39
|
try {
|
|
38
40
|
transport.send(message);
|
|
@@ -106,14 +108,30 @@ class EimerMessageBus {
|
|
|
106
108
|
// Handle locally first (handleMessage will add to seenMessages)
|
|
107
109
|
this.handleMessage(message);
|
|
108
110
|
// Forward to all other transports (excluding the source transport to prevent loops)
|
|
109
|
-
Array.from(this.transports).filter(otherTransport => otherTransport !== sourceTransport)
|
|
111
|
+
const otherTransports = Array.from(this.transports).filter(otherTransport => otherTransport !== sourceTransport);
|
|
112
|
+
if (otherTransports.length === 0) {
|
|
113
|
+
return;
|
|
114
|
+
}
|
|
115
|
+
let forwardMessage = message;
|
|
116
|
+
if (message.meta?.collectEimerTraces && message.meta?.trace) {
|
|
117
|
+
const relayTrace = this.tracer.startSpan(message.topic, { isEimerTrace: true, node: this.nodeId, component: 'Eimer', op: 'forward' }, message.meta.trace);
|
|
118
|
+
// clone message before forwarding so trace data is kept independent
|
|
119
|
+
forwardMessage = {
|
|
120
|
+
...message,
|
|
121
|
+
meta: { ...message.meta, trace: relayTrace }
|
|
122
|
+
};
|
|
123
|
+
}
|
|
124
|
+
otherTransports.forEach(otherTransport => {
|
|
110
125
|
try {
|
|
111
|
-
otherTransport.send(
|
|
126
|
+
otherTransport.send(forwardMessage);
|
|
112
127
|
}
|
|
113
128
|
catch (error) {
|
|
114
129
|
this.logger.error('Error forwarding message through transport', { error });
|
|
115
130
|
}
|
|
116
131
|
});
|
|
132
|
+
if (message.meta?.collectEimerTraces && message.meta?.trace) {
|
|
133
|
+
this.tracer.endSpan(forwardMessage.meta?.trace?.spanId);
|
|
134
|
+
}
|
|
117
135
|
}
|
|
118
136
|
}
|
|
119
137
|
exports.EimerMessageBus = EimerMessageBus;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"EimerMessageBus.js","sourceRoot":"","sources":["../../../src/message-bus/EimerMessageBus.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"EimerMessageBus.js","sourceRoot":"","sources":["../../../src/message-bus/EimerMessageBus.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { EimerDependencies } from '../eimer/EimerDependencies';
|
|
2
|
+
import type { EimerMessageMeta } from '../eimer/EimerMessageMeta';
|
|
2
3
|
import type { EimerOptions } from '../eimer/EimerOptions';
|
|
3
4
|
import type { MessageBus } from '../eimer/MessageBus';
|
|
4
5
|
import type { NodeId } from '../eimer/NodeId';
|
|
@@ -7,12 +8,12 @@ import type { RpcManager } from '../eimer/RpcManager';
|
|
|
7
8
|
import type { RpcMethod } from '../eimer/RpcMethod';
|
|
8
9
|
export interface EimerRpcManagerOptions extends Pick<EimerOptions, "logLevel" | "logModuleName"> {
|
|
9
10
|
/**
|
|
10
|
-
* timeout
|
|
11
|
+
* timeout, in milliseconds, after which RPC calls are rejected
|
|
11
12
|
* can be overriden for individual RPC calls
|
|
12
13
|
*/
|
|
13
|
-
|
|
14
|
+
timeoutMs?: number;
|
|
14
15
|
}
|
|
15
|
-
export interface EimerRpcManagerDependencies extends Pick<EimerDependencies, "logger" | "idGenerator"> {
|
|
16
|
+
export interface EimerRpcManagerDependencies extends Pick<EimerDependencies, "logger" | "idGenerator" | "tracer"> {
|
|
16
17
|
}
|
|
17
18
|
/**
|
|
18
19
|
* Reference Implementation of `RpcManager`
|
|
@@ -22,10 +23,11 @@ export declare class EimerRpcManager implements RpcManager {
|
|
|
22
23
|
private readonly idGenerator;
|
|
23
24
|
private readonly messageBus;
|
|
24
25
|
private readonly logger;
|
|
26
|
+
private readonly tracer;
|
|
25
27
|
private readonly pendingRequests;
|
|
26
28
|
private readonly handlers;
|
|
27
29
|
private readonly unsubscriberFunctions;
|
|
28
|
-
private
|
|
30
|
+
private timeoutMs;
|
|
29
31
|
private isSubscribedToResponses;
|
|
30
32
|
/**
|
|
31
33
|
*
|
|
@@ -43,10 +45,11 @@ export declare class EimerRpcManager implements RpcManager {
|
|
|
43
45
|
* Call a remote method and await the response (or error)
|
|
44
46
|
* @param method method name
|
|
45
47
|
* @param params parameters for call
|
|
46
|
-
* @param
|
|
48
|
+
* @param timeoutMs timeout for call, in milliseconds
|
|
49
|
+
* @param meta optional metadata
|
|
47
50
|
* @returns
|
|
48
51
|
*/
|
|
49
|
-
call<T>(method: RpcMethod, params?: unknown,
|
|
52
|
+
call<T>(method: RpcMethod, params?: unknown, timeoutMs?: number, meta?: EimerMessageMeta): Promise<T>;
|
|
50
53
|
/**
|
|
51
54
|
* Unregister a handler that was previously registered
|
|
52
55
|
* @param method method name
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"EimerRpcManager.d.ts","sourceRoot":"","sources":["../../../src/rpc/EimerRpcManager.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;
|
|
1
|
+
{"version":3,"file":"EimerRpcManager.d.ts","sourceRoot":"","sources":["../../../src/rpc/EimerRpcManager.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AAEpE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAClE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAG1D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAC9C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAGpD,MAAM,WAAW,sBAAuB,SAAQ,IAAI,CAAC,YAAY,EAAE,UAAU,GAAG,eAAe,CAAC;IAC5F;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,CAAA;CACrB;AAED,MAAM,WAAW,2BAA4B,SAAQ,IAAI,CAAC,iBAAiB,EAAE,QAAQ,GAAG,aAAa,GAAG,QAAQ,CAAC;CAChH;AAED;;GAEG;AACH,qBAAa,eAAgB,YAAW,UAAU;IAC9C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAc;IAC1C,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAa;IACxC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAGhC,OAAO,CAAC,QAAQ,CAAC,eAAe,CAMjB;IAGf,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAyC;IAGlE,OAAO,CAAC,QAAQ,CAAC,qBAAqB,CAAyC;IAG/E,OAAO,CAAC,SAAS,CAAiB;IAElC,OAAO,CAAC,uBAAuB,CAAkB;IAEjD;;;;OAIG;gBACS,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,UAAU,EAAE,OAAO,CAAC,EAAE,sBAAsB,EAAE,YAAY,CAAC,EAAE,2BAA2B;IAShI;;;;OAIG;IACH,eAAe,CAAC,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,UAAU,GAAG,IAAI;IAO7D;;;;;;;OAOG;IACG,IAAI,CAAC,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,CAAC,EAAE,OAAO,EAAE,SAAS,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAAC,CAAC,CAAC;IA+C3G;;;OAGG;IACH,iBAAiB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI;IAU1C;;;;OAIG;IACH,QAAQ,IAAI,IAAI;IAahB;;;;;OAKG;IACH,OAAO,CAAC,qBAAqB;IA2B7B;;;;;OAKG;YACW,oBAAoB;CAwDrC"}
|
|
@@ -8,6 +8,7 @@ const EimerRpcResponsePayload_1 = require("./EimerRpcResponsePayload");
|
|
|
8
8
|
const LogLevel_1 = require("../eimer/LogLevel");
|
|
9
9
|
const EimerIdGenerator_1 = require("../id-generator/EimerIdGenerator");
|
|
10
10
|
const EimerLogger_1 = require("../logger/EimerLogger");
|
|
11
|
+
const EimerNoopTracer_1 = require("../tracing/EimerNoopTracer");
|
|
11
12
|
/**
|
|
12
13
|
* Reference Implementation of `RpcManager`
|
|
13
14
|
*/
|
|
@@ -25,13 +26,14 @@ class EimerRpcManager {
|
|
|
25
26
|
// Stores unsubscriber functions of RPC Handlers, indexed by RPC method name
|
|
26
27
|
this.unsubscriberFunctions = new Map();
|
|
27
28
|
// Timeout for RPC calls, in milliseconds
|
|
28
|
-
this.
|
|
29
|
+
this.timeoutMs = 1000;
|
|
29
30
|
this.isSubscribedToResponses = false;
|
|
30
31
|
this.nodeId = nodeId;
|
|
31
32
|
this.messageBus = messageBus;
|
|
32
|
-
this.
|
|
33
|
+
this.timeoutMs = (options?.timeoutMs !== null && options?.timeoutMs !== undefined) ? options?.timeoutMs : 1000;
|
|
33
34
|
this.idGenerator = dependencies?.idGenerator ?? new EimerIdGenerator_1.EimerIdGenerator();
|
|
34
35
|
this.logger = dependencies?.logger ?? new EimerLogger_1.EimerLogger(options?.logLevel ?? LogLevel_1.LogLevel.DEBUG, options?.logModuleName ?? 'RpcManager', this.nodeId);
|
|
36
|
+
this.tracer = dependencies?.tracer ?? new EimerNoopTracer_1.EimerNoopTracer();
|
|
35
37
|
}
|
|
36
38
|
/**
|
|
37
39
|
* Register a handler for an RPC method call
|
|
@@ -48,26 +50,33 @@ class EimerRpcManager {
|
|
|
48
50
|
* Call a remote method and await the response (or error)
|
|
49
51
|
* @param method method name
|
|
50
52
|
* @param params parameters for call
|
|
51
|
-
* @param
|
|
53
|
+
* @param timeoutMs timeout for call, in milliseconds
|
|
54
|
+
* @param meta optional metadata
|
|
52
55
|
* @returns
|
|
53
56
|
*/
|
|
54
|
-
async call(method, params,
|
|
57
|
+
async call(method, params, timeoutMs, meta) {
|
|
55
58
|
if (!this.isSubscribedToResponses) {
|
|
56
59
|
this.messageBus.subscribe(EimerRpcResponseMessage_1.EimerRpcResponseMessage.TOPIC_PREFIX, this.handleResponseMessage.bind(this));
|
|
57
60
|
this.isSubscribedToResponses = true;
|
|
58
61
|
}
|
|
59
62
|
return new Promise((resolve, reject) => {
|
|
60
63
|
const requestId = method + ':' + this.idGenerator.generateId();
|
|
64
|
+
if (meta?.collectEimerTraces && meta?.trace) {
|
|
65
|
+
meta.trace = this.tracer.startSpan(method, { isEimerTrace: true, node: this.nodeId, component: 'EimerRpcManager', op: 'call' }, meta.trace);
|
|
66
|
+
}
|
|
61
67
|
const timeoutId = setTimeout(() => {
|
|
62
68
|
this.pendingRequests.delete(requestId);
|
|
69
|
+
this.tracer.endSpan(meta?.trace?.spanId, { eimerRpcTimeout: true });
|
|
63
70
|
reject(new Error(`RPC call of ${method} timed out`));
|
|
64
|
-
},
|
|
71
|
+
}, timeoutMs || this.timeoutMs);
|
|
65
72
|
this.pendingRequests.set(requestId, {
|
|
66
73
|
resolve: resolve,
|
|
67
74
|
reject,
|
|
68
|
-
timeout: timeoutId
|
|
75
|
+
timeout: timeoutId,
|
|
76
|
+
method,
|
|
77
|
+
meta
|
|
69
78
|
});
|
|
70
|
-
const requestMessage = new EimerRpcRequestMessage_1.EimerRpcRequestMessage(this.idGenerator.generateId(), this.nodeId, `${EimerRpcRequestMessage_1.EimerRpcRequestMessage.TOPIC_PREFIX}.${method}`, new EimerRpcRequestPayload_1.EimerRpcRequestPayload(requestId, method, params));
|
|
79
|
+
const requestMessage = new EimerRpcRequestMessage_1.EimerRpcRequestMessage(this.idGenerator.generateId(), this.nodeId, `${EimerRpcRequestMessage_1.EimerRpcRequestMessage.TOPIC_PREFIX}.${method}`, new EimerRpcRequestPayload_1.EimerRpcRequestPayload(requestId, method, params), meta);
|
|
71
80
|
this.logger.debug('Publishing RPC request', { requestId, method, params, requestMessage });
|
|
72
81
|
this.messageBus.publish(requestMessage);
|
|
73
82
|
});
|
|
@@ -96,6 +105,9 @@ class EimerRpcManager {
|
|
|
96
105
|
}
|
|
97
106
|
for (const request of this.pendingRequests.values()) {
|
|
98
107
|
request.reject('RPC Manager shutdown');
|
|
108
|
+
if (request?.meta?.collectEimerTraces && request?.meta?.trace) {
|
|
109
|
+
this.tracer.endSpan(request.meta?.trace?.spanId, { eimerRpcShutdown: true });
|
|
110
|
+
}
|
|
99
111
|
}
|
|
100
112
|
this.messageBus.shutdown();
|
|
101
113
|
}
|
|
@@ -118,6 +130,7 @@ class EimerRpcManager {
|
|
|
118
130
|
}
|
|
119
131
|
clearTimeout(pendingRequest.timeout);
|
|
120
132
|
this.pendingRequests.delete(payload.requestId);
|
|
133
|
+
this.tracer.endSpan(pendingRequest.meta?.trace?.spanId);
|
|
121
134
|
if (payload.error) {
|
|
122
135
|
this.logger.debug('Rejecting RPC response', { payload });
|
|
123
136
|
pendingRequest.reject(payload.error);
|
|
@@ -143,17 +156,26 @@ class EimerRpcManager {
|
|
|
143
156
|
this.logger.warn('RPC Callback was called for non-existing handler', { requestId: requestPayload.requestId, method: requestPayload.method });
|
|
144
157
|
return;
|
|
145
158
|
}
|
|
159
|
+
let trace = requestMessage.meta?.trace;
|
|
160
|
+
if (requestMessage.meta?.collectEimerTraces && trace) {
|
|
161
|
+
trace = this.tracer.startSpan(requestPayload.method, { isEimerTrace: true, node: this.nodeId, component: 'EimerRpcManager', op: 'handleRequestMessage' }, trace);
|
|
162
|
+
}
|
|
146
163
|
let responsePayload;
|
|
147
164
|
try {
|
|
148
165
|
this.logger.debug('Calling RPC Handler', { requestId: requestPayload.requestId, method: requestPayload.method, params: requestPayload.params });
|
|
149
|
-
const result = await handler(requestPayload.params);
|
|
166
|
+
const result = await handler(requestPayload.params, trace ? { ...requestMessage.meta, trace } : requestMessage.meta);
|
|
150
167
|
responsePayload = new EimerRpcResponsePayload_1.EimerRpcResponsePayload(requestPayload.requestId, undefined, result);
|
|
151
168
|
}
|
|
152
169
|
catch (error) {
|
|
153
170
|
this.logger.warn('RPC Handler threw error', { requestId: requestPayload.requestId, method: requestPayload.method, error });
|
|
154
171
|
responsePayload = new EimerRpcResponsePayload_1.EimerRpcResponsePayload(requestPayload.requestId, error, undefined);
|
|
155
172
|
}
|
|
156
|
-
|
|
173
|
+
finally {
|
|
174
|
+
if (requestMessage.meta?.collectEimerTraces && trace) {
|
|
175
|
+
this.tracer.endSpan(trace?.spanId);
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
const responseMessage = new EimerRpcResponseMessage_1.EimerRpcResponseMessage(this.idGenerator.generateId(), this.nodeId, EimerRpcResponseMessage_1.EimerRpcResponseMessage.TOPIC_PREFIX, responsePayload, trace ? { ...requestMessage.meta, trace } : requestMessage.meta);
|
|
157
179
|
this.logger.debug('Publishing RPC Response', { requestId: requestPayload.requestId, method: requestPayload.method, responseMessage });
|
|
158
180
|
this.messageBus.publish(responseMessage);
|
|
159
181
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"EimerRpcManager.js","sourceRoot":"","sources":["../../../src/rpc/EimerRpcManager.ts"],"names":[],"mappings":";;;AAAA,qEAAkE;AAClE,qEAAkE;AAClE,uEAAoE;AACpE,uEAAoE;
|
|
1
|
+
{"version":3,"file":"EimerRpcManager.js","sourceRoot":"","sources":["../../../src/rpc/EimerRpcManager.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,6 +3,7 @@ import { EimerMessage } from '../eimer/EimerMessage';
|
|
|
3
3
|
import type { MessageId } from '../eimer/MessageId';
|
|
4
4
|
import type { NodeId } from '../eimer/NodeId';
|
|
5
5
|
import type { Topic } from '../eimer/Topic';
|
|
6
|
+
import type { EimerMessageMeta } from '../eimer/EimerMessageMeta';
|
|
6
7
|
/**
|
|
7
8
|
* RPC Request Message
|
|
8
9
|
*
|
|
@@ -16,7 +17,7 @@ export declare class EimerRpcRequestMessage extends EimerMessage {
|
|
|
16
17
|
*/
|
|
17
18
|
static TOPIC_PREFIX: Topic;
|
|
18
19
|
readonly payload: EimerRpcRequestPayload;
|
|
19
|
-
constructor(id: MessageId, from: NodeId, topic: Topic, payload: EimerRpcRequestPayload);
|
|
20
|
+
constructor(id: MessageId, from: NodeId, topic: Topic, payload: EimerRpcRequestPayload, meta?: EimerMessageMeta);
|
|
20
21
|
/**
|
|
21
22
|
* User-defined Type Guard to ensure the message is an RPC Request
|
|
22
23
|
* Similar to Array.isArray(), this static method can be used to check if a Message is an EimerRpcRequestMessage
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"EimerRpcRequestMessage.d.ts","sourceRoot":"","sources":["../../../src/rpc/EimerRpcRequestMessage.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAElE,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAErD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAC9C,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"EimerRpcRequestMessage.d.ts","sourceRoot":"","sources":["../../../src/rpc/EimerRpcRequestMessage.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAElE,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAErD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAC9C,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AAC5C,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAElE;;;;;GAKG;AACH,qBAAa,sBAAuB,SAAQ,YAAY;IACpD;;;OAGG;IACH,MAAM,CAAC,YAAY,EAAC,KAAK,CAAuB;IAEhD,SAAyB,OAAO,EAAG,sBAAsB,CAAC;gBAGtD,EAAE,EAAE,SAAS,EACb,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,KAAK,EACZ,OAAO,EAAE,sBAAsB,EAC/B,IAAI,CAAC,EAAE,gBAAgB;IAK3B;;;;;OAKG;IACH,MAAM,CAAC,wBAAwB,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,IAAI,sBAAsB;CAS5F"}
|
|
@@ -10,8 +10,8 @@ const EimerMessage_1 = require("../eimer/EimerMessage");
|
|
|
10
10
|
* with its parameters/arguments.
|
|
11
11
|
*/
|
|
12
12
|
class EimerRpcRequestMessage extends EimerMessage_1.EimerMessage {
|
|
13
|
-
constructor(id, from, topic, payload) {
|
|
14
|
-
super(id, from, topic, payload);
|
|
13
|
+
constructor(id, from, topic, payload, meta) {
|
|
14
|
+
super(id, from, topic, payload, meta);
|
|
15
15
|
}
|
|
16
16
|
/**
|
|
17
17
|
* User-defined Type Guard to ensure the message is an RPC Request
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"EimerRpcRequestMessage.js","sourceRoot":"","sources":["../../../src/rpc/EimerRpcRequestMessage.ts"],"names":[],"mappings":";;;AAAA,qEAAkE;AAElE,wDAAqD;
|
|
1
|
+
{"version":3,"file":"EimerRpcRequestMessage.js","sourceRoot":"","sources":["../../../src/rpc/EimerRpcRequestMessage.ts"],"names":[],"mappings":";;;AAAA,qEAAkE;AAElE,wDAAqD;AAOrD;;;;;GAKG;AACH,MAAa,sBAAuB,SAAQ,2BAAY;IASpD,YACI,EAAa,EACb,IAAY,EACZ,KAAY,EACZ,OAA+B,EAC/B,IAAuB;QAEvB,KAAK,CAAC,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;IAC1C,CAAC;IAED;;;;;OAKG;IACH,MAAM,CAAC,wBAAwB,CAAC,OAAqB;QACjD,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,sBAAsB,CAAC,YAAY,CAAC,EAAE,CAAC;YACjE,OAAO,KAAK,CAAC;QACjB,CAAC;QACD,IAAI,CAAC,CAAC,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC,+CAAsB,CAAC,wBAAwB,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;YAC/F,OAAO,KAAK,CAAC;QACjB,CAAC;QACD,OAAO,IAAI,CAAC;IAChB,CAAC;;AAjCL,wDAkCC;AAjCG;;;GAGG;AACI,mCAAY,GAAS,mBAAmB,CAAC"}
|
|
@@ -3,6 +3,7 @@ import { EimerMessage } from "../eimer/EimerMessage";
|
|
|
3
3
|
import type { MessageId } from "../eimer/MessageId";
|
|
4
4
|
import type { NodeId } from "../eimer/NodeId";
|
|
5
5
|
import type { Topic } from "../eimer/Topic";
|
|
6
|
+
import type { EimerMessageMeta } from "../eimer/EimerMessageMeta";
|
|
6
7
|
/**
|
|
7
8
|
* RPC Response Message
|
|
8
9
|
*
|
|
@@ -18,7 +19,7 @@ export declare class EimerRpcResponseMessage extends EimerMessage {
|
|
|
18
19
|
*/
|
|
19
20
|
static TOPIC_PREFIX: string;
|
|
20
21
|
readonly payload: EimerRpcResponsePayload;
|
|
21
|
-
constructor(id: MessageId, from: NodeId, topic: Topic, payload: EimerRpcResponsePayload);
|
|
22
|
+
constructor(id: MessageId, from: NodeId, topic: Topic, payload: EimerRpcResponsePayload, meta?: EimerMessageMeta | undefined);
|
|
22
23
|
/**
|
|
23
24
|
* User-defined Type Guard to ensure the message is an RPC Response
|
|
24
25
|
* Similar to Array.isArray(), this static method can be used to check if a Message is an EimerRpcResponseMessage
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"EimerRpcResponseMessage.d.ts","sourceRoot":"","sources":["../../../src/rpc/EimerRpcResponseMessage.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAAE,MAAM,2BAA2B,CAAC;AAEpE,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAErD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAC9C,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"EimerRpcResponseMessage.d.ts","sourceRoot":"","sources":["../../../src/rpc/EimerRpcResponseMessage.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAAE,MAAM,2BAA2B,CAAC;AAEpE,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAErD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAC9C,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AAC5C,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAElE;;;;;;GAMG;AACH,qBAAa,uBAAwB,SAAQ,YAAY;IACrD;;;;OAIG;IACH,MAAM,CAAC,YAAY,SAAwB;IAE3C,SAAyB,OAAO,EAAG,uBAAuB,CAAC;gBAGvD,EAAE,EAAE,SAAS,EACb,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,KAAK,EACZ,OAAO,EAAE,uBAAuB,EAChC,IAAI,CAAC,EAAE,gBAAgB,GAAG,SAAS;IAKvC;;;;;OAKG;IACH,MAAM,CAAC,yBAAyB,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,IAAI,uBAAuB;CAS9F"}
|
|
@@ -11,8 +11,8 @@ const EimerMessage_1 = require("../eimer/EimerMessage");
|
|
|
11
11
|
* there was one.
|
|
12
12
|
*/
|
|
13
13
|
class EimerRpcResponseMessage extends EimerMessage_1.EimerMessage {
|
|
14
|
-
constructor(id, from, topic, payload) {
|
|
15
|
-
super(id, from, topic, payload);
|
|
14
|
+
constructor(id, from, topic, payload, meta) {
|
|
15
|
+
super(id, from, topic, payload, meta);
|
|
16
16
|
}
|
|
17
17
|
/**
|
|
18
18
|
* User-defined Type Guard to ensure the message is an RPC Response
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"EimerRpcResponseMessage.js","sourceRoot":"","sources":["../../../src/rpc/EimerRpcResponseMessage.ts"],"names":[],"mappings":";;;AAAA,uEAAoE;AAEpE,wDAAqD;
|
|
1
|
+
{"version":3,"file":"EimerRpcResponseMessage.js","sourceRoot":"","sources":["../../../src/rpc/EimerRpcResponseMessage.ts"],"names":[],"mappings":";;;AAAA,uEAAoE;AAEpE,wDAAqD;AAOrD;;;;;;GAMG;AACH,MAAa,uBAAwB,SAAQ,2BAAY;IAUrD,YACI,EAAa,EACb,IAAY,EACZ,KAAY,EACZ,OAAgC,EAChC,IAAmC;QAEnC,KAAK,CAAC,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;IAC1C,CAAC;IAED;;;;;OAKG;IACH,MAAM,CAAC,yBAAyB,CAAC,OAAqB;QAClD,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,uBAAuB,CAAC,YAAY,CAAC,EAAE,CAAC;YAClE,OAAO,KAAK,CAAC;QACjB,CAAC;QACD,IAAI,CAAC,CAAC,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC,iDAAuB,CAAC,yBAAyB,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;YACjG,OAAO,KAAK,CAAC;QACjB,CAAC;QACD,OAAO,IAAI,CAAC;IAChB,CAAC;;AAlCL,0DAmCC;AAlCG;;;;GAIG;AACI,oCAAY,GAAG,oBAAoB,CAAC"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import type { TracerBackend } from '../eimer/TracerBackend';
|
|
2
|
+
import type { TraceSpan } from '../eimer/TraceSpan';
|
|
3
|
+
/**
|
|
4
|
+
* Subset of the `console` API this backend needs, so a fake can be injected
|
|
5
|
+
* in tests instead of spying on the real global `console`.
|
|
6
|
+
*/
|
|
7
|
+
export interface GroupingConsole {
|
|
8
|
+
group(...args: unknown[]): void;
|
|
9
|
+
groupEnd(): void;
|
|
10
|
+
log(...args: unknown[]): void;
|
|
11
|
+
}
|
|
12
|
+
export interface ConsoleLoggingTracerBackendOptions {
|
|
13
|
+
/** milliseconds of inactivity for a `traceId`, measured from the `startedAt` of the last span received for it, before that trace is printed. Default 5000. */
|
|
14
|
+
ttlMs?: number;
|
|
15
|
+
/** how often, in milliseconds, to check for traces that have exceeded `ttlMs`. Default 1000. */
|
|
16
|
+
sweepIntervalMs?: number;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* `TracerBackend` that accumulates spans per `traceId` and prints each trace
|
|
20
|
+
* as a nested `console.group()` tree once it goes quiet, rather than logging
|
|
21
|
+
* every span as it arrives. "Quiet" means no new span has been recorded for
|
|
22
|
+
* that `traceId` for `ttlMs`, measured against the `startedAt` of the most
|
|
23
|
+
* recently received span (not wall-clock arrival time), checked on a
|
|
24
|
+
* `sweepIntervalMs` interval.
|
|
25
|
+
*
|
|
26
|
+
* This is a heuristic: a trace that may not be complete but has not received
|
|
27
|
+
* new spans for longer than `ttlMs` will be printed.
|
|
28
|
+
* Any span for it that arrives afterwards is treated as the start of a new trace
|
|
29
|
+
* and printed as its own, separate group once it too goes quiet.
|
|
30
|
+
*/
|
|
31
|
+
export declare class ConsoleLoggingTracerBackend implements TracerBackend {
|
|
32
|
+
private readonly ttlMs;
|
|
33
|
+
private readonly sweepIntervalMs;
|
|
34
|
+
private readonly console;
|
|
35
|
+
private readonly pendingSpans;
|
|
36
|
+
private readonly lastStartedAt;
|
|
37
|
+
private sweepTimer;
|
|
38
|
+
constructor(options?: ConsoleLoggingTracerBackendOptions, consoleLike?: GroupingConsole);
|
|
39
|
+
handleSpan(span: TraceSpan): void;
|
|
40
|
+
/**
|
|
41
|
+
* Immediately prints any accumulated traces and stops the sweep timer.
|
|
42
|
+
* Called via `Eimer.shutdown()` -> `Tracer.shutdown()` if this backend is
|
|
43
|
+
* plugged into that node's `Tracer`, so no accumulated spans are
|
|
44
|
+
* silently lost and no timer lingers past shutdown.
|
|
45
|
+
*/
|
|
46
|
+
shutdown(): void;
|
|
47
|
+
private ensureSweeping;
|
|
48
|
+
private stopSweeping;
|
|
49
|
+
private sweep;
|
|
50
|
+
private flush;
|
|
51
|
+
private printTrace;
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=ConsoleLoggingTracerBackend.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ConsoleLoggingTracerBackend.d.ts","sourceRoot":"","sources":["../../../src/tracing/ConsoleLoggingTracerBackend.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAC5D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAEpD;;;GAGG;AACH,MAAM,WAAW,eAAe;IAC5B,KAAK,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;IAChC,QAAQ,IAAI,IAAI,CAAC;IACjB,GAAG,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;CACjC;AAED,MAAM,WAAW,kCAAkC;IAC/C,8JAA8J;IAC9J,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,gGAAgG;IAChG,eAAe,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED;;;;;;;;;;;;GAYG;AACH,qBAAa,2BAA4B,YAAW,aAAa;IAC7D,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAS;IAC/B,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAS;IACzC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAkB;IAE1C,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAuC;IACpE,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAkC;IAChE,OAAO,CAAC,UAAU,CAA6C;gBAEnD,OAAO,CAAC,EAAE,kCAAkC,EAAE,WAAW,CAAC,EAAE,eAAe;IAMvF,UAAU,CAAC,IAAI,EAAE,SAAS,GAAG,IAAI;IAQjC;;;;;OAKG;IACH,QAAQ,IAAI,IAAI;IAOhB,OAAO,CAAC,cAAc;IAStB,OAAO,CAAC,YAAY;IAOpB,OAAO,CAAC,KAAK;IAYb,OAAO,CAAC,KAAK;IAUb,OAAO,CAAC,UAAU;CAqCrB"}
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ConsoleLoggingTracerBackend = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* `TracerBackend` that accumulates spans per `traceId` and prints each trace
|
|
6
|
+
* as a nested `console.group()` tree once it goes quiet, rather than logging
|
|
7
|
+
* every span as it arrives. "Quiet" means no new span has been recorded for
|
|
8
|
+
* that `traceId` for `ttlMs`, measured against the `startedAt` of the most
|
|
9
|
+
* recently received span (not wall-clock arrival time), checked on a
|
|
10
|
+
* `sweepIntervalMs` interval.
|
|
11
|
+
*
|
|
12
|
+
* This is a heuristic: a trace that may not be complete but has not received
|
|
13
|
+
* new spans for longer than `ttlMs` will be printed.
|
|
14
|
+
* Any span for it that arrives afterwards is treated as the start of a new trace
|
|
15
|
+
* and printed as its own, separate group once it too goes quiet.
|
|
16
|
+
*/
|
|
17
|
+
class ConsoleLoggingTracerBackend {
|
|
18
|
+
constructor(options, consoleLike) {
|
|
19
|
+
this.pendingSpans = new Map();
|
|
20
|
+
this.lastStartedAt = new Map();
|
|
21
|
+
this.ttlMs = options?.ttlMs ?? 5000;
|
|
22
|
+
this.sweepIntervalMs = options?.sweepIntervalMs ?? 1000;
|
|
23
|
+
this.console = consoleLike ?? console;
|
|
24
|
+
}
|
|
25
|
+
handleSpan(span) {
|
|
26
|
+
const spans = this.pendingSpans.get(span.traceId) ?? [];
|
|
27
|
+
spans.push(span);
|
|
28
|
+
this.pendingSpans.set(span.traceId, spans);
|
|
29
|
+
this.lastStartedAt.set(span.traceId, span.startedAt);
|
|
30
|
+
this.ensureSweeping();
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Immediately prints any accumulated traces and stops the sweep timer.
|
|
34
|
+
* Called via `Eimer.shutdown()` -> `Tracer.shutdown()` if this backend is
|
|
35
|
+
* plugged into that node's `Tracer`, so no accumulated spans are
|
|
36
|
+
* silently lost and no timer lingers past shutdown.
|
|
37
|
+
*/
|
|
38
|
+
shutdown() {
|
|
39
|
+
this.stopSweeping();
|
|
40
|
+
for (const traceId of [...this.pendingSpans.keys()]) {
|
|
41
|
+
this.flush(traceId);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
ensureSweeping() {
|
|
45
|
+
if (this.sweepTimer) {
|
|
46
|
+
return;
|
|
47
|
+
}
|
|
48
|
+
this.sweepTimer = setInterval(() => this.sweep(), this.sweepIntervalMs);
|
|
49
|
+
// Don't let an idle sweep timer keep a Node process alive.
|
|
50
|
+
this.sweepTimer.unref?.();
|
|
51
|
+
}
|
|
52
|
+
stopSweeping() {
|
|
53
|
+
if (this.sweepTimer) {
|
|
54
|
+
clearInterval(this.sweepTimer);
|
|
55
|
+
this.sweepTimer = undefined;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
sweep() {
|
|
59
|
+
const now = Date.now();
|
|
60
|
+
for (const [traceId, startedAt] of this.lastStartedAt) {
|
|
61
|
+
if (now - startedAt >= this.ttlMs) {
|
|
62
|
+
this.flush(traceId);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
if (this.pendingSpans.size === 0) {
|
|
66
|
+
this.stopSweeping();
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
flush(traceId) {
|
|
70
|
+
const spans = this.pendingSpans.get(traceId);
|
|
71
|
+
if (!spans) {
|
|
72
|
+
return;
|
|
73
|
+
}
|
|
74
|
+
this.pendingSpans.delete(traceId);
|
|
75
|
+
this.lastStartedAt.delete(traceId);
|
|
76
|
+
this.printTrace(traceId, spans);
|
|
77
|
+
}
|
|
78
|
+
printTrace(traceId, spans) {
|
|
79
|
+
const byParentSpanId = new Map();
|
|
80
|
+
const spanIds = new Set(spans.map(span => span.spanId));
|
|
81
|
+
for (const span of spans) {
|
|
82
|
+
// Parent spans recorded on other nodes may never reach this
|
|
83
|
+
// backend, so fall back to treating such spans as roots rather
|
|
84
|
+
// than dropping them.
|
|
85
|
+
const parentKey = span.parentSpanId && spanIds.has(span.parentSpanId) ? span.parentSpanId : undefined;
|
|
86
|
+
const siblings = byParentSpanId.get(parentKey) ?? [];
|
|
87
|
+
siblings.push(span);
|
|
88
|
+
byParentSpanId.set(parentKey, siblings);
|
|
89
|
+
}
|
|
90
|
+
const byStartedAt = (a, b) => a.startedAt - b.startedAt;
|
|
91
|
+
const printSpan = (span) => {
|
|
92
|
+
const children = (byParentSpanId.get(span.spanId) ?? []).sort(byStartedAt);
|
|
93
|
+
const label = `${span.name} (${span.durationMs.toFixed(2)}ms)`;
|
|
94
|
+
if (children.length === 0) {
|
|
95
|
+
this.console.log(label, span);
|
|
96
|
+
return;
|
|
97
|
+
}
|
|
98
|
+
this.console.group(label, span);
|
|
99
|
+
for (const child of children) {
|
|
100
|
+
printSpan(child);
|
|
101
|
+
}
|
|
102
|
+
this.console.groupEnd();
|
|
103
|
+
};
|
|
104
|
+
const roots = (byParentSpanId.get(undefined) ?? []).sort(byStartedAt);
|
|
105
|
+
this.console.group(`trace ${traceId} (${spans.length} span${spans.length === 1 ? '' : 's'})`);
|
|
106
|
+
for (const root of roots) {
|
|
107
|
+
printSpan(root);
|
|
108
|
+
}
|
|
109
|
+
this.console.groupEnd();
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
exports.ConsoleLoggingTracerBackend = ConsoleLoggingTracerBackend;
|
|
113
|
+
//# sourceMappingURL=ConsoleLoggingTracerBackend.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ConsoleLoggingTracerBackend.js","sourceRoot":"","sources":["../../../src/tracing/ConsoleLoggingTracerBackend.ts"],"names":[],"mappings":"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"}
|