@composed-di/observability 0.5.0-alpha → 0.7.0-alpha

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.
Files changed (40) hide show
  1. package/dist/cli.js.map +1 -1
  2. package/dist/dashboardClient.d.ts +17 -11
  3. package/dist/dashboardClient.d.ts.map +1 -1
  4. package/dist/dashboardClient.js +28 -11
  5. package/dist/dashboardClient.js.map +1 -1
  6. package/dist/dashboardEventListener.d.ts +27 -8
  7. package/dist/dashboardEventListener.d.ts.map +1 -1
  8. package/dist/dashboardEventListener.js +38 -16
  9. package/dist/dashboardEventListener.js.map +1 -1
  10. package/dist/dashboardHtml.d.ts +6 -0
  11. package/dist/dashboardHtml.d.ts.map +1 -1
  12. package/dist/dashboardHtml.js +618 -98
  13. package/dist/dashboardHtml.js.map +1 -1
  14. package/dist/dashboardInstrumentation.d.ts +44 -0
  15. package/dist/dashboardInstrumentation.d.ts.map +1 -0
  16. package/dist/dashboardInstrumentation.js +119 -0
  17. package/dist/dashboardInstrumentation.js.map +1 -0
  18. package/dist/dashboardServer.d.ts +12 -8
  19. package/dist/dashboardServer.d.ts.map +1 -1
  20. package/dist/dashboardServer.js +52 -14
  21. package/dist/dashboardServer.js.map +1 -1
  22. package/dist/events.d.ts +20 -1
  23. package/dist/events.d.ts.map +1 -1
  24. package/dist/events.js +1 -1
  25. package/dist/index.d.ts +1 -1
  26. package/dist/index.d.ts.map +1 -1
  27. package/dist/index.js +1 -1
  28. package/dist/index.js.map +1 -1
  29. package/dist/moduleGraph.d.ts.map +1 -1
  30. package/dist/moduleGraph.js.map +1 -1
  31. package/package.json +24 -23
  32. package/src/cli.ts +19 -19
  33. package/src/dashboardClient.ts +94 -83
  34. package/src/dashboardHtml.ts +620 -100
  35. package/src/dashboardInstrumentation.ts +153 -0
  36. package/src/dashboardServer.ts +183 -148
  37. package/src/events.ts +55 -35
  38. package/src/index.ts +5 -5
  39. package/src/moduleGraph.ts +9 -9
  40. package/src/dashboardEventListener.ts +0 -104
package/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";;;;;;;;;;;;AACA;;;;;;GAMG;AACH,uDAAqD;AAErD,SAAS,QAAQ,CAAC,IAAY;IAC5B,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IACzC,OAAO,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;AAC1D,CAAC;AAED,SAAe,IAAI;;;QACjB,MAAM,IAAI,GAAG,MAAM,CAAC,MAAA,MAAA,QAAQ,CAAC,QAAQ,CAAC,mCAAI,OAAO,CAAC,GAAG,CAAC,IAAI,mCAAI,IAAI,CAAC,CAAC;QACpE,MAAM,IAAI,GAAG,MAAA,QAAQ,CAAC,QAAQ,CAAC,mCAAI,WAAW,CAAC;QAC/C,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,IAAI,GAAG,CAAC,IAAI,IAAI,GAAG,KAAK,EAAE,CAAC;YACxD,OAAO,CAAC,KAAK,CAAC,iBAAiB,MAAA,QAAQ,CAAC,QAAQ,CAAC,mCAAI,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;YACzE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,MAAM,SAAS,GAAG,IAAI,kCAAgB,EAAE,CAAC;QACzC,MAAM,GAAG,GAAG,MAAM,SAAS,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QAC/C,OAAO,CAAC,GAAG,CAAC,sCAAsC,GAAG,EAAE,CAAC,CAAC;QACzD,OAAO,CAAC,GAAG,CACT,4FAA4F,CAC7F,CAAC;QAEF,MAAM,QAAQ,GAAG,GAAS,EAAE;YAC1B,MAAM,SAAS,CAAC,KAAK,EAAE,CAAC;YACxB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC,CAAA,CAAC;QACF,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;QAC/B,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;IAClC,CAAC;CAAA;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;IACrB,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IACrB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";;;;;;;;;;;;AACA;;;;;;GAMG;AACH,uDAAoD;AAEpD,SAAS,QAAQ,CAAC,IAAY;IAC5B,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;IACxC,OAAO,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAA;AACzD,CAAC;AAED,SAAe,IAAI;;;QACjB,MAAM,IAAI,GAAG,MAAM,CAAC,MAAA,MAAA,QAAQ,CAAC,QAAQ,CAAC,mCAAI,OAAO,CAAC,GAAG,CAAC,IAAI,mCAAI,IAAI,CAAC,CAAA;QACnE,MAAM,IAAI,GAAG,MAAA,QAAQ,CAAC,QAAQ,CAAC,mCAAI,WAAW,CAAA;QAC9C,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,IAAI,GAAG,CAAC,IAAI,IAAI,GAAG,KAAK,EAAE,CAAC;YACxD,OAAO,CAAC,KAAK,CAAC,iBAAiB,MAAA,QAAQ,CAAC,QAAQ,CAAC,mCAAI,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAA;YACxE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;QACjB,CAAC;QAED,MAAM,SAAS,GAAG,IAAI,kCAAgB,EAAE,CAAA;QACxC,MAAM,GAAG,GAAG,MAAM,SAAS,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,CAAA;QAC9C,OAAO,CAAC,GAAG,CAAC,sCAAsC,GAAG,EAAE,CAAC,CAAA;QACxD,OAAO,CAAC,GAAG,CACT,4FAA4F,CAC7F,CAAA;QAED,MAAM,QAAQ,GAAG,GAAS,EAAE;YAC1B,MAAM,SAAS,CAAC,KAAK,EAAE,CAAA;YACvB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;QACjB,CAAC,CAAA,CAAA;QACD,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAA;QAC9B,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAA;IACjC,CAAC;CAAA;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;IACrB,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAA;IACpB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;AACjB,CAAC,CAAC,CAAA"}
@@ -1,6 +1,6 @@
1
1
  import { ServiceModule } from '@composed-di/core';
2
- import { DashboardEventListener } from './dashboardEventListener';
3
- export interface DashboardClientOptions {
2
+ import { DashboardInstrumentation, DashboardInstrumentationOptions } from './dashboardInstrumentation';
3
+ export interface DashboardClientOptions extends DashboardInstrumentationOptions {
4
4
  /** Base URL of the standalone dashboard server, e.g. "http://localhost:4321". */
5
5
  url: string;
6
6
  /** How long to buffer events before exporting a batch. Default 250ms. */
@@ -19,22 +19,28 @@ export interface DashboardClientOptions {
19
19
  * Exports service observability to a standalone dashboard server, the way
20
20
  * an OpenTelemetry SDK exports spans to a collector.
21
21
  *
22
- * The application owns only this client: pass `client.listener` to
23
- * `ServiceModule.from`, then `attach` the module to register its dependency
24
- * graph with the server. Span events are buffered and shipped in batches;
25
- * export failures are retried on the next flush and never affect the
26
- * application.
22
+ * The application owns only this client: wrap the factories with this
23
+ * client's `instrumentation.instrument()`, then `attach` the module to
24
+ * register its dependency graph with the server. Span events are buffered
25
+ * and shipped in batches; export failures are retried on the next flush
26
+ * and never affect the application.
27
27
  *
28
28
  * @example
29
29
  * ```ts
30
30
  * const client = new DashboardClient({ url: 'http://localhost:4321' });
31
- * const module = ServiceModule.from(factories, client.listener);
31
+ * const module = ServiceModule.from(
32
+ * client.instrumentation.instrument(factories, {
33
+ * // Show call arguments and results in the dashboard; leave these
34
+ * // off when values may contain secrets.
35
+ * capture: { arguments: true, results: true },
36
+ * }),
37
+ * );
32
38
  * client.attach(module);
33
39
  * ```
34
40
  */
35
41
  export declare class DashboardClient {
36
- /** Pass this as the second argument to ServiceModule.from. */
37
- readonly listener: DashboardEventListener;
42
+ /** Call `.instrument()` on this to wrap the factories composing the module. */
43
+ readonly instrumentation: DashboardInstrumentation;
38
44
  private readonly url;
39
45
  private readonly flushIntervalMs;
40
46
  private readonly maxBatchSize;
@@ -48,7 +54,7 @@ export declare class DashboardClient {
48
54
  private exporting;
49
55
  private warned;
50
56
  private closed;
51
- constructor({ url, flushIntervalMs, maxBatchSize, maxQueueSize, onError, }: DashboardClientOptions);
57
+ constructor({ url, flushIntervalMs, maxBatchSize, maxQueueSize, onError, ...instrumentationOptions }: DashboardClientOptions);
52
58
  /**
53
59
  * Registers the module's dependency graph with the dashboard server.
54
60
  */
@@ -1 +1 @@
1
- {"version":3,"file":"dashboardClient.d.ts","sourceRoot":"","sources":["../src/dashboardClient.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAClD,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAIlE,MAAM,WAAW,sBAAsB;IACrC,iFAAiF;IACjF,GAAG,EAAE,MAAM,CAAC;IACZ,yEAAyE;IACzE,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,yEAAyE;IACzE,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,qFAAqF;IACrF,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB;;;OAGG;IACH,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;CAClC;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,qBAAa,eAAe;IAC1B,8DAA8D;IAC9D,QAAQ,CAAC,QAAQ,yBAAgC;IAEjD,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAS;IAC7B,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAS;IACzC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAS;IACtC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAS;IACtC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAyB;IAEjD,OAAO,CAAC,KAAK,CAAmB;IAChC,OAAO,CAAC,KAAK,CAA4B;IACzC,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,KAAK,CAA+B;IAC5C,8DAA8D;IAC9D,OAAO,CAAC,SAAS,CAAoC;IACrD,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,MAAM,CAAS;gBAEX,EACV,GAAG,EACH,eAAqB,EACrB,YAAiB,EACjB,YAAmB,EACnB,OAAO,GACR,EAAE,sBAAsB;IAiBzB;;OAEG;IACH,MAAM,CAAC,MAAM,EAAE,aAAa,GAAG,IAAI;IAOnC,8EAA8E;IAC9E,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAKtB,2DAA2D;IACrD,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAS5B,OAAO,CAAC,OAAO;IAaf,OAAO,CAAC,aAAa;YASP,MAAM;IAgCpB,iEAAiE;IACjE,OAAO,CAAC,UAAU;YAMJ,IAAI;CAqBnB"}
1
+ {"version":3,"file":"dashboardClient.d.ts","sourceRoot":"","sources":["../src/dashboardClient.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAA;AACjD,OAAO,EACL,wBAAwB,EACxB,+BAA+B,EAChC,MAAM,4BAA4B,CAAA;AAInC,MAAM,WAAW,sBAAuB,SAAQ,+BAA+B;IAC7E,iFAAiF;IACjF,GAAG,EAAE,MAAM,CAAA;IACX,yEAAyE;IACzE,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,yEAAyE;IACzE,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,qFAAqF;IACrF,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB;;;OAGG;IACH,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAA;CACjC;AAED;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,qBAAa,eAAe;IAC1B,+EAA+E;IAC/E,QAAQ,CAAC,eAAe,EAAE,wBAAwB,CAAA;IAElD,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAQ;IAC5B,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAQ;IACxC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAQ;IACrC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAQ;IACrC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAwB;IAEhD,OAAO,CAAC,KAAK,CAAkB;IAC/B,OAAO,CAAC,KAAK,CAA2B;IACxC,OAAO,CAAC,SAAS,CAAQ;IACzB,OAAO,CAAC,KAAK,CAA8B;IAC3C,8DAA8D;IAC9D,OAAO,CAAC,SAAS,CAAmC;IACpD,OAAO,CAAC,MAAM,CAAQ;IACtB,OAAO,CAAC,MAAM,CAAQ;gBAEV,EACV,GAAG,EACH,eAAqB,EACrB,YAAiB,EACjB,YAAmB,EACnB,OAAO,EACP,GAAG,sBAAsB,EAC1B,EAAE,sBAAsB;IAkBzB;;OAEG;IACH,MAAM,CAAC,MAAM,EAAE,aAAa,GAAG,IAAI;IAOnC,8EAA8E;IAC9E,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAKtB,2DAA2D;IACrD,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAS5B,OAAO,CAAC,OAAO;IAaf,OAAO,CAAC,aAAa;YASP,MAAM;IAgCpB,iEAAiE;IACjE,OAAO,CAAC,UAAU;YAMJ,IAAI;CAqBnB"}
@@ -8,31 +8,47 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
8
8
  step((generator = generator.apply(thisArg, _arguments || [])).next());
9
9
  });
10
10
  };
11
+ var __rest = (this && this.__rest) || function (s, e) {
12
+ var t = {};
13
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
14
+ t[p] = s[p];
15
+ if (s != null && typeof Object.getOwnPropertySymbols === "function")
16
+ for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
17
+ if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
18
+ t[p[i]] = s[p[i]];
19
+ }
20
+ return t;
21
+ };
11
22
  Object.defineProperty(exports, "__esModule", { value: true });
12
23
  exports.DashboardClient = void 0;
13
- const dashboardEventListener_1 = require("./dashboardEventListener");
24
+ const dashboardInstrumentation_1 = require("./dashboardInstrumentation");
14
25
  const moduleGraph_1 = require("./moduleGraph");
15
26
  /**
16
27
  * Exports service observability to a standalone dashboard server, the way
17
28
  * an OpenTelemetry SDK exports spans to a collector.
18
29
  *
19
- * The application owns only this client: pass `client.listener` to
20
- * `ServiceModule.from`, then `attach` the module to register its dependency
21
- * graph with the server. Span events are buffered and shipped in batches;
22
- * export failures are retried on the next flush and never affect the
23
- * application.
30
+ * The application owns only this client: wrap the factories with this
31
+ * client's `instrumentation.instrument()`, then `attach` the module to
32
+ * register its dependency graph with the server. Span events are buffered
33
+ * and shipped in batches; export failures are retried on the next flush
34
+ * and never affect the application.
24
35
  *
25
36
  * @example
26
37
  * ```ts
27
38
  * const client = new DashboardClient({ url: 'http://localhost:4321' });
28
- * const module = ServiceModule.from(factories, client.listener);
39
+ * const module = ServiceModule.from(
40
+ * client.instrumentation.instrument(factories, {
41
+ * // Show call arguments and results in the dashboard; leave these
42
+ * // off when values may contain secrets.
43
+ * capture: { arguments: true, results: true },
44
+ * }),
45
+ * );
29
46
  * client.attach(module);
30
47
  * ```
31
48
  */
32
49
  class DashboardClient {
33
- constructor({ url, flushIntervalMs = 250, maxBatchSize = 64, maxQueueSize = 5000, onError, }) {
34
- /** Pass this as the second argument to ServiceModule.from. */
35
- this.listener = new dashboardEventListener_1.DashboardEventListener();
50
+ constructor(_a) {
51
+ var { url, flushIntervalMs = 250, maxBatchSize = 64, maxQueueSize = 5000, onError } = _a, instrumentationOptions = __rest(_a, ["url", "flushIntervalMs", "maxBatchSize", "maxQueueSize", "onError"]);
36
52
  this.queue = [];
37
53
  this.graph = null;
38
54
  this.graphSent = false;
@@ -41,6 +57,7 @@ class DashboardClient {
41
57
  this.exporting = Promise.resolve();
42
58
  this.warned = false;
43
59
  this.closed = false;
60
+ this.instrumentation = new dashboardInstrumentation_1.DashboardInstrumentation(instrumentationOptions);
44
61
  this.url = url.replace(/\/$/, '');
45
62
  this.flushIntervalMs = flushIntervalMs;
46
63
  this.maxBatchSize = maxBatchSize;
@@ -52,7 +69,7 @@ class DashboardClient {
52
69
  this.warned = true;
53
70
  console.warn(`[composed-di] dashboard export to ${this.url} failed (will keep retrying): ${error.message}`);
54
71
  });
55
- this.listener.subscribe((event) => this.enqueue(event));
72
+ this.instrumentation.subscribe((event) => this.enqueue(event));
56
73
  }
57
74
  /**
58
75
  * Registers the module's dependency graph with the dashboard server.
@@ -1 +1 @@
1
- {"version":3,"file":"dashboardClient.js","sourceRoot":"","sources":["../src/dashboardClient.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"dashboardClient.js","sourceRoot":"","sources":["../src/dashboardClient.ts"],"names":[],"mappings":"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"}
@@ -1,22 +1,40 @@
1
- import type { DisposeContext, EventSpan, InitializeContext, MethodCallContext, ServiceEventListener } from '@composed-di/core';
1
+ import type { DisposeContext, EventSpan, InitializeContext, MethodCallContext, ServiceInstrumentation } from '@composed-di/instrumentation-core';
2
2
  import { SpanEvent } from './events';
3
+ export interface DashboardEventListenerOptions {
4
+ /**
5
+ * Serialize method arguments onto call spans, so the dashboard can show
6
+ * them. On by default — the dashboard is a development tool — but turn
7
+ * this off when arguments may contain secrets, or when events are
8
+ * exported to a dashboard server you don't control.
9
+ */
10
+ captureArguments?: boolean;
11
+ /**
12
+ * Serialize return / resolved values onto call spans. On by default,
13
+ * with the same caveats as `captureArguments`.
14
+ */
15
+ captureResults?: boolean;
16
+ /** Longest serialized value kept; longer ones are truncated. Default 200. */
17
+ maxValueLength?: number;
18
+ }
3
19
  /**
4
20
  * A ServiceEventListener that turns service events into structured
5
21
  * start/end span events for the realtime dashboard.
6
22
  *
7
23
  * - Uses AsyncLocalStorage to link spans to the span that was active when
8
24
  * they started, which lets the dashboard draw cross-service call edges
9
- * (e.g. UserService.getUser -> Database.query). Because a listener does
10
- * not control the invocation of the operation it observes, the context
11
- * is entered with `enterWith` and can outlive the span within the same
12
- * synchronous frame; the dashboard tolerates this, as parents are only
13
- * resolved among still-open spans.
25
+ * (e.g. UserService.getUser -> Database.query). The observed operation
26
+ * is invoked through the span's `run` wrapper, so the context is scoped
27
+ * to the operation and its async continuations.
14
28
  * - Emits events synchronously to subscribers; it never buffers.
15
29
  */
16
- export declare class DashboardEventListener implements ServiceEventListener {
30
+ export declare class DashboardEventListener implements ServiceInstrumentation {
17
31
  private readonly context;
18
32
  private readonly listeners;
19
33
  private nextId;
34
+ private readonly captureArguments;
35
+ private readonly captureResults;
36
+ private readonly maxValueLength;
37
+ constructor({ captureArguments, captureResults, maxValueLength, }?: DashboardEventListenerOptions);
20
38
  /**
21
39
  * Subscribes to span events.
22
40
  *
@@ -25,8 +43,9 @@ export declare class DashboardEventListener implements ServiceEventListener {
25
43
  subscribe(listener: (event: SpanEvent) => void): () => void;
26
44
  onInitialize({ key }: InitializeContext): EventSpan;
27
45
  onDispose({ key }: DisposeContext): EventSpan;
28
- onMethodCall({ key, methodName }: MethodCallContext): EventSpan;
46
+ onMethodCall({ key, functionName, args }: MethodCallContext): EventSpan;
29
47
  private startSpan;
48
+ private serialize;
30
49
  private emit;
31
50
  }
32
51
  //# sourceMappingURL=dashboardEventListener.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"dashboardEventListener.d.ts","sourceRoot":"","sources":["../src/dashboardEventListener.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,cAAc,EACd,SAAS,EACT,iBAAiB,EACjB,iBAAiB,EACjB,oBAAoB,EACrB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,SAAS,EAAY,MAAM,UAAU,CAAC;AAO/C;;;;;;;;;;;;GAYG;AACH,qBAAa,sBAAuB,YAAW,oBAAoB;IACjE,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAwC;IAChE,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAyC;IACnE,OAAO,CAAC,MAAM,CAAK;IAEnB;;;;OAIG;IACH,SAAS,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,SAAS,KAAK,IAAI,GAAG,MAAM,IAAI;IAK3D,YAAY,CAAC,EAAE,GAAG,EAAE,EAAE,iBAAiB,GAAG,SAAS;IAInD,SAAS,CAAC,EAAE,GAAG,EAAE,EAAE,cAAc,GAAG,SAAS;IAI7C,YAAY,CAAC,EAAE,GAAG,EAAE,UAAU,EAAE,EAAE,iBAAiB,GAAG,SAAS;IAI/D,OAAO,CAAC,SAAS;IAwCjB,OAAO,CAAC,IAAI;CAGb"}
1
+ {"version":3,"file":"dashboardEventListener.d.ts","sourceRoot":"","sources":["../src/dashboardEventListener.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,cAAc,EACd,SAAS,EACT,iBAAiB,EACjB,iBAAiB,EACjB,sBAAsB,EACvB,MAAM,mCAAmC,CAAC;AAC3C,OAAO,EAAE,SAAS,EAAY,MAAM,UAAU,CAAC;AAO/C,MAAM,WAAW,6BAA6B;IAC5C;;;;;OAKG;IACH,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAE3B;;;OAGG;IACH,cAAc,CAAC,EAAE,OAAO,CAAC;IAEzB,6EAA6E;IAC7E,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED;;;;;;;;;;GAUG;AACH,qBAAa,sBAAuB,YAAW,sBAAsB;IACnE,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAwC;IAChE,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAyC;IACnE,OAAO,CAAC,MAAM,CAAK;IACnB,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAU;IAC3C,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAU;IACzC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAS;gBAE5B,EACV,gBAAuB,EACvB,cAAqB,EACrB,cAAoB,GACrB,GAAE,6BAAkC;IAMrC;;;;OAIG;IACH,SAAS,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,SAAS,KAAK,IAAI,GAAG,MAAM,IAAI;IAK3D,YAAY,CAAC,EAAE,GAAG,EAAE,EAAE,iBAAiB,GAAG,SAAS;IAInD,SAAS,CAAC,EAAE,GAAG,EAAE,EAAE,cAAc,GAAG,SAAS;IAI7C,YAAY,CAAC,EAAE,GAAG,EAAE,YAAY,EAAE,IAAI,EAAE,EAAE,iBAAiB,GAAG,SAAS;IASvE,OAAO,CAAC,SAAS;IAmDjB,OAAO,CAAC,SAAS;IAYjB,OAAO,CAAC,IAAI;CAGb"}
@@ -9,18 +9,19 @@ const node_perf_hooks_1 = require("node:perf_hooks");
9
9
  *
10
10
  * - Uses AsyncLocalStorage to link spans to the span that was active when
11
11
  * they started, which lets the dashboard draw cross-service call edges
12
- * (e.g. UserService.getUser -> Database.query). Because a listener does
13
- * not control the invocation of the operation it observes, the context
14
- * is entered with `enterWith` and can outlive the span within the same
15
- * synchronous frame; the dashboard tolerates this, as parents are only
16
- * resolved among still-open spans.
12
+ * (e.g. UserService.getUser -> Database.query). The observed operation
13
+ * is invoked through the span's `run` wrapper, so the context is scoped
14
+ * to the operation and its async continuations.
17
15
  * - Emits events synchronously to subscribers; it never buffers.
18
16
  */
19
17
  class DashboardEventListener {
20
- constructor() {
18
+ constructor({ captureArguments = true, captureResults = true, maxValueLength = 200, } = {}) {
21
19
  this.context = new node_async_hooks_1.AsyncLocalStorage();
22
20
  this.listeners = new Set();
23
21
  this.nextId = 1;
22
+ this.captureArguments = captureArguments;
23
+ this.captureResults = captureResults;
24
+ this.maxValueLength = maxValueLength;
24
25
  }
25
26
  /**
26
27
  * Subscribes to span events.
@@ -37,10 +38,10 @@ class DashboardEventListener {
37
38
  onDispose({ key }) {
38
39
  return this.startSpan(key.name, 'dispose', 'dispose');
39
40
  }
40
- onMethodCall({ key, methodName }) {
41
- return this.startSpan(key.name, methodName, 'call');
41
+ onMethodCall({ key, functionName, args }) {
42
+ return this.startSpan(key.name, functionName, 'call', this.captureArguments ? this.serialize(args) : undefined);
42
43
  }
43
- startSpan(service, method, kind) {
44
+ startSpan(service, method, kind, args) {
44
45
  var _a;
45
46
  const id = this.nextId++;
46
47
  const parent = this.context.getStore();
@@ -53,10 +54,11 @@ class DashboardEventListener {
53
54
  method,
54
55
  kind,
55
56
  time: Date.now(),
57
+ args,
56
58
  });
57
59
  const startedAt = node_perf_hooks_1.performance.now();
58
60
  let ended = false;
59
- const end = (error) => {
61
+ const end = (error, result) => {
60
62
  if (ended)
61
63
  return;
62
64
  ended = true;
@@ -66,17 +68,37 @@ class DashboardEventListener {
66
68
  time: Date.now(),
67
69
  durationMs: node_perf_hooks_1.performance.now() - startedAt,
68
70
  error,
71
+ result,
69
72
  });
70
73
  };
71
- // The observed operation runs right after this hook returns, in the
72
- // same synchronous frame, so entering the context here makes this span
73
- // the parent of any spans started inside the operation.
74
- this.context.enterWith({ id });
75
74
  return {
76
- end: () => end(null),
77
- error: (error) => end(errorMessage(error)),
75
+ // Running the operation inside this span's context makes it the
76
+ // parent of any spans started within.
77
+ run: (fn) => this.context.run({ id }, fn),
78
+ end: (outcome) => {
79
+ if (outcome.type === 'failure') {
80
+ end(errorMessage(outcome.error));
81
+ }
82
+ else {
83
+ const capture = kind === 'call' && this.captureResults;
84
+ end(null, capture ? this.serialize(outcome.value) : undefined);
85
+ }
86
+ },
78
87
  };
79
88
  }
89
+ serialize(value) {
90
+ var _a;
91
+ let text;
92
+ try {
93
+ text = (_a = JSON.stringify(value)) !== null && _a !== void 0 ? _a : String(value);
94
+ }
95
+ catch (_b) {
96
+ text = '[unserializable]';
97
+ }
98
+ return text.length > this.maxValueLength
99
+ ? text.slice(0, this.maxValueLength) + '…'
100
+ : text;
101
+ }
80
102
  emit(event) {
81
103
  this.listeners.forEach((listener) => listener(event));
82
104
  }
@@ -1 +1 @@
1
- {"version":3,"file":"dashboardEventListener.js","sourceRoot":"","sources":["../src/dashboardEventListener.ts"],"names":[],"mappings":";;;AAAA,uDAAqD;AACrD,qDAA8C;AAe9C;;;;;;;;;;;;GAYG;AACH,MAAa,sBAAsB;IAAnC;QACmB,YAAO,GAAG,IAAI,oCAAiB,EAAe,CAAC;QAC/C,cAAS,GAAG,IAAI,GAAG,EAA8B,CAAC;QAC3D,WAAM,GAAG,CAAC,CAAC;IAmErB,CAAC;IAjEC;;;;OAIG;IACH,SAAS,CAAC,QAAoC;QAC5C,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC7B,OAAO,GAAG,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IAC/C,CAAC;IAED,YAAY,CAAC,EAAE,GAAG,EAAqB;QACrC,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,EAAE,YAAY,EAAE,YAAY,CAAC,CAAC;IAC9D,CAAC;IAED,SAAS,CAAC,EAAE,GAAG,EAAkB;QAC/B,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;IACxD,CAAC;IAED,YAAY,CAAC,EAAE,GAAG,EAAE,UAAU,EAAqB;QACjD,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,EAAE,UAAU,EAAE,MAAM,CAAC,CAAC;IACtD,CAAC;IAEO,SAAS,CAAC,OAAe,EAAE,MAAc,EAAE,IAAc;;QAC/D,MAAM,EAAE,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;QACzB,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC;QAEvC,IAAI,CAAC,IAAI,CAAC;YACR,IAAI,EAAE,OAAO;YACb,EAAE;YACF,QAAQ,EAAE,MAAA,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,EAAE,mCAAI,IAAI;YAC5B,IAAI,EAAE,GAAG,OAAO,IAAI,MAAM,EAAE;YAC5B,OAAO;YACP,MAAM;YACN,IAAI;YACJ,IAAI,EAAE,IAAI,CAAC,GAAG,EAAE;SACjB,CAAC,CAAC;QAEH,MAAM,SAAS,GAAG,6BAAW,CAAC,GAAG,EAAE,CAAC;QACpC,IAAI,KAAK,GAAG,KAAK,CAAC;QAClB,MAAM,GAAG,GAAG,CAAC,KAAoB,EAAE,EAAE;YACnC,IAAI,KAAK;gBAAE,OAAO;YAClB,KAAK,GAAG,IAAI,CAAC;YACb,IAAI,CAAC,IAAI,CAAC;gBACR,IAAI,EAAE,KAAK;gBACX,EAAE;gBACF,IAAI,EAAE,IAAI,CAAC,GAAG,EAAE;gBAChB,UAAU,EAAE,6BAAW,CAAC,GAAG,EAAE,GAAG,SAAS;gBACzC,KAAK;aACN,CAAC,CAAC;QACL,CAAC,CAAC;QAEF,oEAAoE;QACpE,uEAAuE;QACvE,wDAAwD;QACxD,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;QAE/B,OAAO;YACL,GAAG,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC;YACpB,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,GAAG,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;SAC3C,CAAC;IACJ,CAAC;IAEO,IAAI,CAAC,KAAgB;QAC3B,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;IACxD,CAAC;CACF;AAtED,wDAsEC;AAED,SAAS,YAAY,CAAC,KAAc;IAClC,OAAO,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAChE,CAAC"}
1
+ {"version":3,"file":"dashboardEventListener.js","sourceRoot":"","sources":["../src/dashboardEventListener.ts"],"names":[],"mappings":"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"}
@@ -6,6 +6,12 @@
6
6
  * dependency ranks, dependencies on the left), a stat-tile row, a services
7
7
  * table, and an event log. Service state is shown as a status glyph + word,
8
8
  * never color alone.
9
+ *
10
+ * Visual language: warm paper surfaces, ink text, hairline rules. The orange
11
+ * accent is reserved for live activity (call flashes, active edges,
12
+ * selection); blue means initializing, green means ready. Display type is
13
+ * Poppins and editorial notes are Lora — both resolve to local fonts only
14
+ * (Arial / Georgia fallbacks), keeping the no-CDN contract.
9
15
  */
10
16
  export declare function renderDashboardHtml(): string;
11
17
  //# sourceMappingURL=dashboardHtml.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"dashboardHtml.d.ts","sourceRoot":"","sources":["../src/dashboardHtml.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,wBAAgB,mBAAmB,IAAI,MAAM,CAE5C"}
1
+ {"version":3,"file":"dashboardHtml.d.ts","sourceRoot":"","sources":["../src/dashboardHtml.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,mBAAmB,IAAI,MAAM,CAE5C"}