@dudousxd/nestjs-diagnostics 0.2.1 → 0.2.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,28 @@
1
1
  # @dudousxd/nestjs-diagnostics
2
2
 
3
+ ## 0.2.3
4
+
5
+ ### Patch Changes
6
+
7
+ - [`a37a2cd`](https://github.com/DavideCarvalho/nestjs-diagnostics/commit/a37a2cd8320188fc158ff34645eddbedad1968cd) - perf: keep the emit envelope monomorphic on the hot path — build it with a stable key set (traceId always present) instead of a conditional spread, avoiding a throwaway intermediate object per emit (~30% faster envelope build).
8
+
9
+ ## 0.2.2
10
+
11
+ ### Patch Changes
12
+
13
+ - [#4](https://github.com/DavideCarvalho/nestjs-diagnostics/pull/4) [`2d9b817`](https://github.com/DavideCarvalho/nestjs-diagnostics/commit/2d9b817158b058e0c6413acfa8c2b3acd3728a6a) Thanks [@DavideCarvalho](https://github.com/DavideCarvalho)! - Make `emit()`/`getChannel()` ~11x cheaper on the hot path by memoizing the
14
+ resolved channel per `(lib, event)` pair. Previously every call re-built the
15
+ `aviary:<lib>:<event>` string, re-looked-up the node channel, and re-checked the
16
+ registry — ~174 ns/op even when nobody was subscribed. Now the first call for a
17
+ pair pays that cost and every subsequent call is two `Map.get`s returning the same
18
+ channel object (~16 ns/op; the no-subscriber path allocates nothing). The
19
+ consumer-side pattern of caching the channel and gating on `hasSubscribers` before
20
+ calling `emit` (~4 ns/op) stays the cheapest and remains recommended.
21
+
22
+ No API or behavior change: channel identity, registry discovery
23
+ (`registeredChannels`/`onChannelRegistered`), `hasSubscribers` gating,
24
+ `opts.traceId` precedence, and never-throw are all unchanged.
25
+
3
26
  ## 0.2.1
4
27
 
5
28
  ### Patch Changes
package/dist/channel.d.ts CHANGED
@@ -13,6 +13,10 @@ export declare function channelName(lib: string, event: string): string;
13
13
  * `.hasSubscribers` is the cheap gate before building an envelope. Touching the
14
14
  * channel also records its name in the {@link registerChannel registry} so a
15
15
  * generic observer can discover it.
16
+ *
17
+ * Memoized via {@link channelCache}: only the first call for a `(lib, event)`
18
+ * pair builds the name, resolves the channel, and registers it; subsequent calls
19
+ * return the cached object after two map lookups.
16
20
  */
17
21
  export declare function getChannel(lib: string, event: string): Channel;
18
22
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"channel.d.ts","sourceRoot":"","sources":["../src/channel.ts"],"names":[],"mappings":"AAAA,OAA4B,EAAE,KAAK,OAAO,EAAE,MAAM,0BAA0B,CAAC;AAG7E,OAAO,KAAK,EAAmB,WAAW,EAAE,MAAM,YAAY,CAAC;AAE/D,gEAAgE;AAChE,eAAO,MAAM,cAAc,WAAW,CAAC;AAEvC;;;GAGG;AACH,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAE9D;AAED;;;;;;GAMG;AACH,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAK9D;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,WAAW,GAAG,IAAI,CAgB3F"}
1
+ {"version":3,"file":"channel.d.ts","sourceRoot":"","sources":["../src/channel.ts"],"names":[],"mappings":"AAAA,OAA4B,EAAE,KAAK,OAAO,EAAE,MAAM,0BAA0B,CAAC;AAG7E,OAAO,KAAK,EAAmB,WAAW,EAAE,MAAM,YAAY,CAAC;AAE/D,gEAAgE;AAChE,eAAO,MAAM,cAAc,WAAW,CAAC;AAEvC;;;GAGG;AACH,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAE9D;AAqBD;;;;;;;;;;GAUG;AACH,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAc9D;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,WAAW,GAAG,IAAI,CAU3F"}
package/dist/channel.js CHANGED
@@ -1,6 +1,6 @@
1
1
  import diagnostics_channel from 'node:diagnostics_channel';
2
2
  import { resolveTraceId } from './context-accessor.js';
3
- import { registerChannel } from './registry.js';
3
+ import { onRegistryReset, registerChannel } from './registry.js';
4
4
  /** The prefix all channels created by this convention share. */
5
5
  export const CHANNEL_PREFIX = 'aviary';
6
6
  /**
@@ -10,17 +10,49 @@ export const CHANNEL_PREFIX = 'aviary';
10
10
  export function channelName(lib, event) {
11
11
  return `${CHANNEL_PREFIX}:${lib}:${event}`;
12
12
  }
13
+ /**
14
+ * Per-`(lib, event)` cache of the resolved {@link Channel}, keyed by `lib` then
15
+ * `event`. The first {@link getChannel}/{@link emit} for a pair pays the string
16
+ * concat + `diagnostics_channel.channel()` lookup + registry insert; every call
17
+ * after that is a pair of `Map.get`s and returns the SAME object — no string is
18
+ * allocated on the steady state. A nested map (rather than one keyed by the full
19
+ * `aviary:<lib>:<event>` name) is what lets us skip the concat entirely.
20
+ *
21
+ * Node already returns a process-stable {@link Channel} per name, so caching it
22
+ * here changes nothing observable: `getChannel(a,b)` still returns
23
+ * `diagnostics_channel.channel('aviary:a:b')`. The registry is still fed exactly
24
+ * once per pair (on the cache miss), so discovery is unchanged.
25
+ */
26
+ const channelCache = new Map();
27
+ // Drop the memo cache whenever the registry is reset (test-only), so the next
28
+ // getChannel re-registers every channel. See onRegistryReset in registry.ts.
29
+ onRegistryReset(() => channelCache.clear());
13
30
  /**
14
31
  * The memoized `node:diagnostics_channel` for a `<lib>`/`<event>` pair. Node
15
32
  * returns the same {@link Channel} object for the same name, so reading
16
33
  * `.hasSubscribers` is the cheap gate before building an envelope. Touching the
17
34
  * channel also records its name in the {@link registerChannel registry} so a
18
35
  * generic observer can discover it.
36
+ *
37
+ * Memoized via {@link channelCache}: only the first call for a `(lib, event)`
38
+ * pair builds the name, resolves the channel, and registers it; subsequent calls
39
+ * return the cached object after two map lookups.
19
40
  */
20
41
  export function getChannel(lib, event) {
42
+ let byEvent = channelCache.get(lib);
43
+ if (byEvent !== undefined) {
44
+ const cached = byEvent.get(event);
45
+ if (cached !== undefined)
46
+ return cached;
47
+ }
48
+ else {
49
+ byEvent = new Map();
50
+ channelCache.set(lib, byEvent);
51
+ }
21
52
  const name = channelName(lib, event);
22
53
  const channel = diagnostics_channel.channel(name);
23
54
  registerChannel(name);
55
+ byEvent.set(event, channel);
24
56
  return channel;
25
57
  }
26
58
  /**
@@ -44,13 +76,7 @@ export function emit(lib, event, payload, opts) {
44
76
  return;
45
77
  try {
46
78
  const traceId = opts?.traceId ?? resolveTraceId();
47
- const envelope = {
48
- ts: Date.now(),
49
- lib,
50
- event,
51
- ...(traceId !== undefined ? { traceId } : {}),
52
- payload,
53
- };
79
+ const envelope = { ts: Date.now(), lib, event, traceId, payload };
54
80
  channel.publish(envelope);
55
81
  }
56
82
  catch {
@@ -1 +1 @@
1
- {"version":3,"file":"channel.js","sourceRoot":"","sources":["../src/channel.ts"],"names":[],"mappings":"AAAA,OAAO,mBAAqC,MAAM,0BAA0B,CAAC;AAC7E,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAGhD,gEAAgE;AAChE,MAAM,CAAC,MAAM,cAAc,GAAG,QAAQ,CAAC;AAEvC;;;GAGG;AACH,MAAM,UAAU,WAAW,CAAC,GAAW,EAAE,KAAa;IACpD,OAAO,GAAG,cAAc,IAAI,GAAG,IAAI,KAAK,EAAE,CAAC;AAC7C,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,UAAU,CAAC,GAAW,EAAE,KAAa;IACnD,MAAM,IAAI,GAAG,WAAW,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IACrC,MAAM,OAAO,GAAG,mBAAmB,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IAClD,eAAe,CAAC,IAAI,CAAC,CAAC;IACtB,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;;;;;;;;;;;;;GAcG;AACH,MAAM,UAAU,IAAI,CAAC,GAAW,EAAE,KAAa,EAAE,OAAgB,EAAE,IAAkB;IACnF,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IACvC,IAAI,CAAC,OAAO,CAAC,cAAc;QAAE,OAAO;IACpC,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,IAAI,EAAE,OAAO,IAAI,cAAc,EAAE,CAAC;QAClD,MAAM,QAAQ,GAAoB;YAChC,EAAE,EAAE,IAAI,CAAC,GAAG,EAAE;YACd,GAAG;YACH,KAAK;YACL,GAAG,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC7C,OAAO;SACR,CAAC;QACF,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IAC5B,CAAC;IAAC,MAAM,CAAC;QACP,yDAAyD;IAC3D,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"channel.js","sourceRoot":"","sources":["../src/channel.ts"],"names":[],"mappings":"AAAA,OAAO,mBAAqC,MAAM,0BAA0B,CAAC;AAC7E,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAGjE,gEAAgE;AAChE,MAAM,CAAC,MAAM,cAAc,GAAG,QAAQ,CAAC;AAEvC;;;GAGG;AACH,MAAM,UAAU,WAAW,CAAC,GAAW,EAAE,KAAa;IACpD,OAAO,GAAG,cAAc,IAAI,GAAG,IAAI,KAAK,EAAE,CAAC;AAC7C,CAAC;AAED;;;;;;;;;;;;GAYG;AACH,MAAM,YAAY,GAAG,IAAI,GAAG,EAAgC,CAAC;AAE7D,8EAA8E;AAC9E,6EAA6E;AAC7E,eAAe,CAAC,GAAG,EAAE,CAAC,YAAY,CAAC,KAAK,EAAE,CAAC,CAAC;AAE5C;;;;;;;;;;GAUG;AACH,MAAM,UAAU,UAAU,CAAC,GAAW,EAAE,KAAa;IACnD,IAAI,OAAO,GAAG,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACpC,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;QAC1B,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QAClC,IAAI,MAAM,KAAK,SAAS;YAAE,OAAO,MAAM,CAAC;IAC1C,CAAC;SAAM,CAAC;QACN,OAAO,GAAG,IAAI,GAAG,EAAmB,CAAC;QACrC,YAAY,CAAC,GAAG,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;IACjC,CAAC;IACD,MAAM,IAAI,GAAG,WAAW,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IACrC,MAAM,OAAO,GAAG,mBAAmB,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IAClD,eAAe,CAAC,IAAI,CAAC,CAAC;IACtB,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IAC5B,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;;;;;;;;;;;;;GAcG;AACH,MAAM,UAAU,IAAI,CAAC,GAAW,EAAE,KAAa,EAAE,OAAgB,EAAE,IAAkB;IACnF,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IACvC,IAAI,CAAC,OAAO,CAAC,cAAc;QAAE,OAAO;IACpC,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,IAAI,EAAE,OAAO,IAAI,cAAc,EAAE,CAAC;QAClD,MAAM,QAAQ,GAAoB,EAAE,EAAE,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC;QACnF,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IAC5B,CAAC;IAAC,MAAM,CAAC;QACP,yDAAyD;IAC3D,CAAC;AACH,CAAC"}
@@ -31,6 +31,11 @@ export declare function registeredChannels(): string[];
31
31
  * ```
32
32
  */
33
33
  export declare function onChannelRegistered(cb: (name: string) => void): () => void;
34
+ /**
35
+ * Register a callback run by {@link resetRegistry}. Used internally by
36
+ * {@link getChannel}'s memo cache; not part of the public contract.
37
+ */
38
+ export declare function onRegistryReset(cb: () => void): void;
34
39
  /**
35
40
  * Test-only: forget every registered channel and listener. Not part of the
36
41
  * public contract — exposed so suites can assert registration in isolation.
@@ -1 +1 @@
1
- {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../src/registry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AA6BH;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAUlD;AAED,4EAA4E;AAC5E,wBAAgB,kBAAkB,IAAI,MAAM,EAAE,CAE7C;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,mBAAmB,CAAC,EAAE,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,GAAG,MAAM,IAAI,CAK1E;AAED;;;GAGG;AACH,wBAAgB,aAAa,IAAI,IAAI,CAGpC"}
1
+ {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../src/registry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AA6BH;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAUlD;AAED,4EAA4E;AAC5E,wBAAgB,kBAAkB,IAAI,MAAM,EAAE,CAE7C;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,mBAAmB,CAAC,EAAE,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,GAAG,MAAM,IAAI,CAK1E;AAYD;;;GAGG;AACH,wBAAgB,eAAe,CAAC,EAAE,EAAE,MAAM,IAAI,GAAG,IAAI,CAEpD;AAED;;;GAGG;AACH,wBAAgB,aAAa,IAAI,IAAI,CAUpC"}
package/dist/registry.js CHANGED
@@ -58,6 +58,22 @@ export function onChannelRegistered(cb) {
58
58
  listeners.delete(cb);
59
59
  };
60
60
  }
61
+ /**
62
+ * Hooks run by {@link resetRegistry} so other modules can drop registry-derived
63
+ * caches in lockstep. {@link getChannel} memoizes channels and only registers a
64
+ * name on a cache MISS; if `resetRegistry` cleared `channels` without clearing
65
+ * that cache, an already-cached channel would never re-register and would vanish
66
+ * from discovery. Registering its cache-clear here keeps the test-only reset
67
+ * exact: after a reset, the next `getChannel`/`emit` re-registers every channel.
68
+ */
69
+ const resetHooks = new Set();
70
+ /**
71
+ * Register a callback run by {@link resetRegistry}. Used internally by
72
+ * {@link getChannel}'s memo cache; not part of the public contract.
73
+ */
74
+ export function onRegistryReset(cb) {
75
+ resetHooks.add(cb);
76
+ }
61
77
  /**
62
78
  * Test-only: forget every registered channel and listener. Not part of the
63
79
  * public contract — exposed so suites can assert registration in isolation.
@@ -65,5 +81,13 @@ export function onChannelRegistered(cb) {
65
81
  export function resetRegistry() {
66
82
  channels.clear();
67
83
  listeners.clear();
84
+ for (const hook of resetHooks) {
85
+ try {
86
+ hook();
87
+ }
88
+ catch {
89
+ // A misbehaving reset hook must never break the reset itself.
90
+ }
91
+ }
68
92
  }
69
93
  //# sourceMappingURL=registry.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"registry.js","sourceRoot":"","sources":["../src/registry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAoBH,MAAM,YAAY,GAAG,MAAM,CAAC,GAAG,CAAC,uCAAuC,CAAC,CAAC;AACzE,MAAM,WAAW,GAAG,UAA+D,CAAC;AACpF,MAAM,QAAQ,GAAa,WAAW,CAAC,YAAY,CAAC,IAAI;IACtD,QAAQ,EAAE,IAAI,GAAG,EAAU;IAC3B,SAAS,EAAE,IAAI,GAAG,EAA0B;CAC7C,CAAC;AACF,WAAW,CAAC,YAAY,CAAC,GAAG,QAAQ,CAAC;AACrC,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,GAAG,QAAQ,CAAC;AAEzC;;;;;GAKG;AACH,MAAM,UAAU,eAAe,CAAC,IAAY;IAC1C,IAAI,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC;QAAE,OAAO;IAC/B,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACnB,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;QACjC,IAAI,CAAC;YACH,QAAQ,CAAC,IAAI,CAAC,CAAC;QACjB,CAAC;QAAC,MAAM,CAAC;YACP,0DAA0D;QAC5D,CAAC;IACH,CAAC;AACH,CAAC;AAED,4EAA4E;AAC5E,MAAM,UAAU,kBAAkB;IAChC,OAAO,CAAC,GAAG,QAAQ,CAAC,CAAC;AACvB,CAAC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,mBAAmB,CAAC,EAA0B;IAC5D,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAClB,OAAO,GAAG,EAAE;QACV,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IACvB,CAAC,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,aAAa;IAC3B,QAAQ,CAAC,KAAK,EAAE,CAAC;IACjB,SAAS,CAAC,KAAK,EAAE,CAAC;AACpB,CAAC"}
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../src/registry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAoBH,MAAM,YAAY,GAAG,MAAM,CAAC,GAAG,CAAC,uCAAuC,CAAC,CAAC;AACzE,MAAM,WAAW,GAAG,UAA+D,CAAC;AACpF,MAAM,QAAQ,GAAa,WAAW,CAAC,YAAY,CAAC,IAAI;IACtD,QAAQ,EAAE,IAAI,GAAG,EAAU;IAC3B,SAAS,EAAE,IAAI,GAAG,EAA0B;CAC7C,CAAC;AACF,WAAW,CAAC,YAAY,CAAC,GAAG,QAAQ,CAAC;AACrC,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,GAAG,QAAQ,CAAC;AAEzC;;;;;GAKG;AACH,MAAM,UAAU,eAAe,CAAC,IAAY;IAC1C,IAAI,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC;QAAE,OAAO;IAC/B,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACnB,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;QACjC,IAAI,CAAC;YACH,QAAQ,CAAC,IAAI,CAAC,CAAC;QACjB,CAAC;QAAC,MAAM,CAAC;YACP,0DAA0D;QAC5D,CAAC;IACH,CAAC;AACH,CAAC;AAED,4EAA4E;AAC5E,MAAM,UAAU,kBAAkB;IAChC,OAAO,CAAC,GAAG,QAAQ,CAAC,CAAC;AACvB,CAAC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,mBAAmB,CAAC,EAA0B;IAC5D,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAClB,OAAO,GAAG,EAAE;QACV,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IACvB,CAAC,CAAC;AACJ,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,GAAG,IAAI,GAAG,EAAc,CAAC;AAEzC;;;GAGG;AACH,MAAM,UAAU,eAAe,CAAC,EAAc;IAC5C,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;AACrB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,aAAa;IAC3B,QAAQ,CAAC,KAAK,EAAE,CAAC;IACjB,SAAS,CAAC,KAAK,EAAE,CAAC;IAClB,KAAK,MAAM,IAAI,IAAI,UAAU,EAAE,CAAC;QAC9B,IAAI,CAAC;YACH,IAAI,EAAE,CAAC;QACT,CAAC;QAAC,MAAM,CAAC;YACP,8DAA8D;QAChE,CAAC;IACH,CAAC;AACH,CAAC"}
package/dist/types.d.ts CHANGED
@@ -12,8 +12,12 @@ export interface DiagnosticEvent<TPayload = unknown> {
12
12
  lib: string;
13
13
  /** The event name, e.g. `'invoice-paid'` — the `<event>` in `aviary:<lib>:<event>`. */
14
14
  event: string;
15
- /** Trace id for the current request, when resolvable from a context accessor. */
16
- traceId?: string;
15
+ /**
16
+ * Trace id for the current request, when resolvable from a context accessor.
17
+ * Always present on the emitted envelope as a stable-shape key (monomorphic);
18
+ * `undefined` when unresolved. Serializes identically to an absent key.
19
+ */
20
+ traceId?: string | undefined;
17
21
  /** The library-defined payload. Opaque to this package and to observers. */
18
22
  payload: TPayload;
19
23
  }
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,MAAM,WAAW,eAAe,CAAC,QAAQ,GAAG,OAAO;IACjD,8EAA8E;IAC9E,EAAE,EAAE,MAAM,CAAC;IACX,sFAAsF;IACtF,GAAG,EAAE,MAAM,CAAC;IACZ,uFAAuF;IACvF,KAAK,EAAE,MAAM,CAAC;IACd,iFAAiF;IACjF,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,4EAA4E;IAC5E,OAAO,EAAE,QAAQ,CAAC;CACnB;AAED,mCAAmC;AACnC,MAAM,WAAW,WAAW;IAC1B;;;;OAIG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,MAAM,WAAW,eAAe,CAAC,QAAQ,GAAG,OAAO;IACjD,8EAA8E;IAC9E,EAAE,EAAE,MAAM,CAAC;IACX,sFAAsF;IACtF,GAAG,EAAE,MAAM,CAAC;IACZ,uFAAuF;IACvF,KAAK,EAAE,MAAM,CAAC;IACd;;;;OAIG;IACH,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC7B,4EAA4E;IAC5E,OAAO,EAAE,QAAQ,CAAC;CACnB;AAED,mCAAmC;AACnC,MAAM,WAAW,WAAW;IAC1B;;;;OAIG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dudousxd/nestjs-diagnostics",
3
- "version": "0.2.1",
3
+ "version": "0.2.3",
4
4
  "description": "A standard convention for @dudousxd/nestjs-* libs to emit observability events over node:diagnostics_channel.",
5
5
  "license": "MIT",
6
6
  "repository": {