@noego/wood 0.4.0 → 0.4.2

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 (85) hide show
  1. package/README.md +100 -2
  2. package/dist/client/global_polyfill.d.cts +1 -2
  3. package/dist/client/global_polyfill.d.ts +1 -2
  4. package/dist/client/index.cjs.map +1 -1
  5. package/dist/client/index.d.cts +1 -1
  6. package/dist/client/index.d.ts +1 -1
  7. package/dist/client/index.js.map +1 -1
  8. package/dist/index.cjs +0 -4
  9. package/dist/index.cjs.map +1 -1
  10. package/dist/index.d.cts +1 -1
  11. package/dist/index.d.ts +1 -1
  12. package/dist/index.js +0 -4
  13. package/dist/index.js.map +1 -1
  14. package/dist/main/index.cjs +16 -2
  15. package/dist/main/index.cjs.map +1 -1
  16. package/dist/main/index.js +16 -2
  17. package/dist/main/index.js.map +1 -1
  18. package/dist/runtime/runtime.cjs +4 -4
  19. package/dist/runtime/runtime.cjs.map +1 -1
  20. package/dist/runtime/runtime.d.cts +2 -1
  21. package/dist/runtime/runtime.d.ts +2 -1
  22. package/dist/runtime/runtime.js +8 -5
  23. package/dist/runtime/runtime.js.map +1 -1
  24. package/dist/testing/browser.cjs +224 -32
  25. package/dist/testing/browser.cjs.map +1 -1
  26. package/dist/testing/browser.d.cts +18 -1
  27. package/dist/testing/browser.d.ts +18 -1
  28. package/dist/testing/browser.js +226 -32
  29. package/dist/testing/browser.js.map +1 -1
  30. package/dist/testing/create_controller_harness.cjs +3 -1
  31. package/dist/testing/create_controller_harness.cjs.map +1 -1
  32. package/dist/testing/create_controller_harness.d.cts +4 -2
  33. package/dist/testing/create_controller_harness.d.ts +4 -2
  34. package/dist/testing/create_controller_harness.js +3 -1
  35. package/dist/testing/create_controller_harness.js.map +1 -1
  36. package/dist/testing/index.cjs +3 -3
  37. package/dist/testing/index.cjs.map +1 -1
  38. package/dist/testing/index.d.cts +6 -4
  39. package/dist/testing/index.d.ts +6 -4
  40. package/dist/testing/index.js +2 -2
  41. package/dist/testing/index.js.map +1 -1
  42. package/dist/trace-testing/index.cjs +39 -0
  43. package/dist/trace-testing/index.cjs.map +1 -0
  44. package/dist/trace-testing/index.d.cts +6 -0
  45. package/dist/trace-testing/index.d.ts +6 -0
  46. package/dist/trace-testing/index.js +19 -0
  47. package/dist/trace-testing/index.js.map +1 -0
  48. package/dist/trace-testing/trace_assertions.cjs +29 -0
  49. package/dist/trace-testing/trace_assertions.cjs.map +1 -0
  50. package/dist/trace-testing/trace_assertions.d.cts +1 -0
  51. package/dist/trace-testing/trace_assertions.d.ts +1 -0
  52. package/dist/trace-testing/trace_assertions.js +7 -0
  53. package/dist/trace-testing/trace_assertions.js.map +1 -0
  54. package/dist/trace-testing/trace_query.cjs +33 -0
  55. package/dist/trace-testing/trace_query.cjs.map +1 -0
  56. package/dist/trace-testing/trace_query.d.cts +1 -0
  57. package/dist/trace-testing/trace_query.d.ts +1 -0
  58. package/dist/trace-testing/trace_query.js +11 -0
  59. package/dist/trace-testing/trace_query.js.map +1 -0
  60. package/dist/trace-testing/trace_recorder.cjs +50 -0
  61. package/dist/trace-testing/trace_recorder.cjs.map +1 -0
  62. package/dist/trace-testing/trace_recorder.d.cts +12 -0
  63. package/dist/trace-testing/trace_recorder.d.ts +12 -0
  64. package/dist/trace-testing/trace_recorder.js +32 -0
  65. package/dist/trace-testing/trace_recorder.js.map +1 -0
  66. package/dist/tracing/index.cjs +0 -4
  67. package/dist/tracing/index.cjs.map +1 -1
  68. package/dist/tracing/index.d.cts +1 -1
  69. package/dist/tracing/index.d.ts +1 -1
  70. package/dist/tracing/index.js +1 -5
  71. package/dist/tracing/index.js.map +1 -1
  72. package/dist/tracing/trace_hub.cjs +19 -86
  73. package/dist/tracing/trace_hub.cjs.map +1 -1
  74. package/dist/tracing/trace_hub.d.cts +11 -16
  75. package/dist/tracing/trace_hub.d.ts +11 -16
  76. package/dist/tracing/trace_hub.js +19 -74
  77. package/dist/tracing/trace_hub.js.map +1 -1
  78. package/dist/tracing/trace_provider.cjs +0 -6
  79. package/dist/tracing/trace_provider.cjs.map +1 -1
  80. package/dist/tracing/trace_provider.d.cts +1 -3
  81. package/dist/tracing/trace_provider.d.ts +1 -3
  82. package/dist/tracing/trace_provider.js +0 -7
  83. package/dist/tracing/trace_provider.js.map +1 -1
  84. package/docs/browser-testing.md +84 -0
  85. package/package.json +8 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/tracing/trace_hub.ts"],"sourcesContent":["import { Observable, Subject, Subscription } from 'rxjs';\nimport { share } from 'rxjs/operators';\n\nexport type TraceLevel = 'debug' | 'info' | 'warn' | 'error';\nexport type TraceProcess = 'main' | 'renderer' | 'test';\n\nexport type TraceInput = {\n source: string;\n type: string;\n message?: string;\n conversationId?: number | string;\n payload?: Record<string, unknown>;\n};\n\nexport type TraceEvent = TraceInput & {\n level: TraceLevel;\n process: TraceProcess;\n timestamp: string;\n traceSeq: number;\n};\n\nexport type TraceDispatchResult = {\n ok: boolean;\n forwarded: boolean;\n};\n\nexport type TraceCaptureOptions = {\n maxEvents?: number;\n};\n\nexport type TraceWaitOptions = {\n timeoutMs?: number;\n};\n\nconst TRACE_HUB_SYMBOL = Symbol.for('@noego/wood.trace.hub');\n\nconst LEVEL_ORDER: Record<TraceLevel, number> = {\n debug: 0,\n info: 1,\n warn: 2,\n error: 3,\n};\n\nlet rendererMinLevel: TraceLevel = 'debug';\nlet rendererEnabled = false;\nlet customRendererTraceTransport: ((payload: unknown) => void) | null = null;\n\ntype PendingWaiter = {\n predicate: (event: TraceEvent) => boolean;\n resolve: (event: TraceEvent) => void;\n reject: (error: Error) => void;\n timeoutId?: ReturnType<typeof setTimeout>;\n};\n\ntype GlobalWithTraceHub = typeof globalThis & {\n [TRACE_HUB_SYMBOL]?: TraceHub;\n};\n\ntype TraceBridgeLike = Record<string, unknown> & {\n __trace?: (payload: unknown) => void;\n};\n\ntype GlobalWithTraceBridge = typeof globalThis & {\n __NOEGO_WOOD_BRIDGE__?: unknown;\n wood?: unknown;\n window?: {\n __NOEGO_WOOD_BRIDGE__?: unknown;\n wood?: unknown;\n };\n};\n\nfunction normalizeTraceInput(raw: unknown): TraceInput {\n const input = (raw ?? {}) as Partial<TraceInput> & Record<string, unknown>;\n const source = typeof input.source === 'string' && input.source.trim().length > 0\n ? input.source\n : 'unknown';\n const type = typeof input.type === 'string' && input.type.trim().length > 0\n ? input.type\n : 'unknown';\n const message = typeof input.message === 'string' ? input.message : undefined;\n const conversationId = typeof input.conversationId === 'number' || typeof input.conversationId === 'string'\n ? input.conversationId\n : undefined;\n const payload = isRecord(input.payload) ? { ...input.payload } : undefined;\n\n return {\n source,\n type,\n ...(message ? { message } : {}),\n ...(conversationId !== undefined ? { conversationId } : {}),\n ...(payload ? { payload } : {}),\n };\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction resolveTraceBridge(): TraceBridgeLike | null {\n const globalObj = globalThis as GlobalWithTraceBridge;\n const bridge = globalObj.__NOEGO_WOOD_BRIDGE__\n ?? globalObj.window?.__NOEGO_WOOD_BRIDGE__\n ?? globalObj.wood\n ?? globalObj.window?.wood;\n if (!bridge || typeof bridge !== 'object') {\n return null;\n }\n return bridge as TraceBridgeLike;\n}\n\nexport class TraceCapture {\n private readonly buffer: TraceEvent[] = [];\n private readonly pending = new Set<PendingWaiter>();\n private readonly maxEvents: number;\n private subscription: Subscription;\n\n constructor(\n source$: Observable<TraceEvent>,\n options: TraceCaptureOptions = {},\n ) {\n this.maxEvents = Math.max(1, options.maxEvents ?? 1000);\n this.subscription = source$.subscribe((event) => {\n this.buffer.push(event);\n if (this.buffer.length > this.maxEvents) {\n this.buffer.splice(0, this.buffer.length - this.maxEvents);\n }\n for (const waiter of Array.from(this.pending)) {\n if (!waiter.predicate(event)) {\n continue;\n }\n if (waiter.timeoutId) {\n clearTimeout(waiter.timeoutId);\n }\n this.pending.delete(waiter);\n waiter.resolve(event);\n }\n });\n }\n\n events(): TraceEvent[] {\n return [...this.buffer];\n }\n\n async waitFor(\n predicate: (event: TraceEvent) => boolean,\n options: TraceWaitOptions = {},\n ): Promise<TraceEvent> {\n const existing = this.buffer.find(predicate);\n if (existing) {\n return existing;\n }\n\n return new Promise<TraceEvent>((resolve, reject) => {\n const waiter: PendingWaiter = {\n predicate,\n resolve,\n reject,\n };\n const timeoutMs = options.timeoutMs ?? 5000;\n waiter.timeoutId = setTimeout(() => {\n this.pending.delete(waiter);\n reject(new Error(`Timed out waiting for trace event after ${timeoutMs}ms`));\n }, timeoutMs);\n this.pending.add(waiter);\n });\n }\n\n async writeArtifact(targetPath: string): Promise<void> {\n const [{ mkdir, writeFile }, pathModule] = await Promise.all([\n import('node:fs/promises'),\n import('node:path'),\n ]);\n await mkdir(pathModule.dirname(targetPath), { recursive: true });\n const lines = this.buffer.map((event) => JSON.stringify(event)).join('\\n');\n await writeFile(targetPath, `${lines}${lines.length > 0 ? '\\n' : ''}`, 'utf8');\n }\n\n stop(): void {\n for (const waiter of this.pending) {\n if (waiter.timeoutId) {\n clearTimeout(waiter.timeoutId);\n }\n waiter.reject(new Error('Trace capture stopped before predicate matched'));\n }\n this.pending.clear();\n this.subscription.unsubscribe();\n }\n}\n\nclass TraceHub {\n private readonly subject = new Subject<TraceEvent>();\n private readonly shared$ = this.subject.asObservable().pipe(share());\n private nextTraceSeq = 1;\n private minLevels: Record<TraceProcess, TraceLevel> = {\n main: 'debug',\n renderer: 'debug',\n test: 'debug',\n };\n\n get events$(): Observable<TraceEvent> {\n return this.shared$;\n }\n\n setMinLevel(process: TraceProcess, level: TraceLevel): void {\n this.minLevels[process] = level;\n }\n\n publish(process: TraceProcess, level: TraceLevel, input: unknown): TraceEvent {\n const normalized = normalizeTraceInput(input);\n const event: TraceEvent = {\n ...normalized,\n level,\n process,\n timestamp: new Date().toISOString(),\n traceSeq: this.nextTraceSeq++,\n };\n if (LEVEL_ORDER[level] >= LEVEL_ORDER[this.minLevels[process]]) {\n this.subject.next(event);\n }\n return event;\n }\n\n capture(options: TraceCaptureOptions = {}): TraceCapture {\n return new TraceCapture(this.events$, options);\n }\n}\n\nfunction getGlobalTraceHub(): TraceHub {\n const globalObj = globalThis as GlobalWithTraceHub;\n if (!globalObj[TRACE_HUB_SYMBOL]) {\n globalObj[TRACE_HUB_SYMBOL] = new TraceHub();\n }\n return globalObj[TRACE_HUB_SYMBOL] as TraceHub;\n}\n\nexport function getTraceEvents$(): Observable<TraceEvent> {\n return getGlobalTraceHub().events$;\n}\n\nexport function setMainTraceMinLevel(level: TraceLevel): void {\n getGlobalTraceHub().setMinLevel('main', level);\n}\n\nexport function setRendererTraceMinLevel(level: TraceLevel): void {\n rendererMinLevel = level;\n getGlobalTraceHub().setMinLevel('renderer', level);\n}\n\nexport function setRendererTraceEnabled(enabled: boolean): void {\n rendererEnabled = enabled;\n}\n\nexport function publishMainTrace(level: TraceLevel, input: unknown): TraceEvent {\n return getGlobalTraceHub().publish('main', level, input);\n}\n\nexport function publishTestTrace(process: TraceProcess, level: TraceLevel, input: unknown): TraceEvent {\n return getGlobalTraceHub().publish(process, level, input);\n}\n\nexport function dispatchRendererTracePayload(rawPayload: unknown): TraceDispatchResult {\n const payload = (rawPayload ?? {}) as Partial<TraceInput> & { level?: TraceLevel };\n const level = payload.level === 'debug' || payload.level === 'info' || payload.level === 'warn' || payload.level === 'error'\n ? payload.level\n : 'info';\n getGlobalTraceHub().publish('renderer', level, payload);\n return {\n ok: true,\n forwarded: true,\n };\n}\n\nexport function setRendererTraceTransport(fn: ((payload: unknown) => void) | null): void {\n customRendererTraceTransport = fn;\n}\n\nexport function emitRendererTrace(level: TraceLevel, input: TraceInput): void {\n if (!rendererEnabled) {\n return;\n }\n if (LEVEL_ORDER[level] < LEVEL_ORDER[rendererMinLevel]) {\n return;\n }\n const normalized = { ...normalizeTraceInput(input), level };\n\n if (customRendererTraceTransport) {\n try {\n customRendererTraceTransport(normalized);\n return;\n } catch {\n // Fall through to bridge.__trace\n }\n }\n\n const bridge = resolveTraceBridge();\n if (!bridge || typeof bridge.__trace !== 'function') {\n return;\n }\n try {\n bridge.__trace(normalized);\n } catch {\n // Tracing is observational and must never break the caller.\n }\n}\n\nexport function createTraceCapture(options: TraceCaptureOptions = {}): TraceCapture {\n return getGlobalTraceHub().capture(options);\n}\n\nexport function clearTraceHubForTests(): void {\n const globalObj = globalThis as GlobalWithTraceHub;\n delete globalObj[TRACE_HUB_SYMBOL];\n rendererMinLevel = 'debug';\n rendererEnabled = false;\n customRendererTraceTransport = null;\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../src/tracing/trace_hub.ts"],"sourcesContent":["import { Observable, Subject } from 'rxjs';\nimport { share } from 'rxjs/operators';\n\nexport type TraceLevel = 'debug' | 'info' | 'warn' | 'error';\nexport type TraceProcess = 'main' | 'renderer' | 'test';\n\nexport type TraceInput = {\n source: string;\n type: string;\n message?: string;\n conversationId?: number | string;\n payload?: Record<string, unknown>;\n windowId?: string;\n webContentsId?: number;\n routeKey?: string;\n harnessId?: string;\n};\n\nexport type TraceEvent = TraceInput & {\n level: TraceLevel;\n process: TraceProcess;\n timestamp: string;\n traceSeq: number;\n};\n\nexport type TraceDispatchResult = {\n ok: boolean;\n forwarded: boolean;\n};\n\nexport type TraceRuntimeContext = {\n windowId?: string;\n webContentsId?: number;\n routeKey?: string;\n harnessId?: string;\n};\n\nexport type TraceWaitOptions = {\n timeoutMs?: number;\n};\n\nconst TRACE_HUB_SYMBOL = Symbol.for('@noego/wood.trace.hub');\n\nconst LEVEL_ORDER: Record<TraceLevel, number> = {\n debug: 0,\n info: 1,\n warn: 2,\n error: 3,\n};\n\nlet rendererMinLevel: TraceLevel = 'debug';\nlet rendererEnabled = false;\nlet customRendererTraceTransport: ((payload: unknown) => void) | null = null;\n\ntype GlobalWithTraceHub = typeof globalThis & {\n [TRACE_HUB_SYMBOL]?: TraceHub;\n};\n\ntype TraceBridgeLike = Record<string, unknown> & {\n __trace?: (payload: unknown) => void;\n};\n\ntype GlobalWithTraceBridge = typeof globalThis & {\n __NOEGO_WOOD_BRIDGE__?: unknown;\n wood?: unknown;\n window?: {\n __NOEGO_WOOD_BRIDGE__?: unknown;\n wood?: unknown;\n };\n};\n\nfunction normalizeTraceInput(raw: unknown): TraceInput {\n const input = (raw ?? {}) as Partial<TraceInput> & Record<string, unknown>;\n const source = typeof input.source === 'string' && input.source.trim().length > 0\n ? input.source\n : 'unknown';\n const type = typeof input.type === 'string' && input.type.trim().length > 0\n ? input.type\n : 'unknown';\n const message = typeof input.message === 'string' ? input.message : undefined;\n const conversationId = typeof input.conversationId === 'number' || typeof input.conversationId === 'string'\n ? input.conversationId\n : undefined;\n const windowId = typeof input.windowId === 'string' && input.windowId.trim().length > 0\n ? input.windowId\n : undefined;\n const webContentsId = typeof input.webContentsId === 'number' && Number.isFinite(input.webContentsId)\n ? input.webContentsId\n : undefined;\n const routeKey = typeof input.routeKey === 'string' && input.routeKey.trim().length > 0\n ? input.routeKey\n : undefined;\n const harnessId = typeof input.harnessId === 'string' && input.harnessId.trim().length > 0\n ? input.harnessId\n : undefined;\n const payload = isRecord(input.payload) ? { ...input.payload } : undefined;\n\n return {\n source,\n type,\n ...(message ? { message } : {}),\n ...(conversationId !== undefined ? { conversationId } : {}),\n ...(windowId !== undefined ? { windowId } : {}),\n ...(webContentsId !== undefined ? { webContentsId } : {}),\n ...(routeKey !== undefined ? { routeKey } : {}),\n ...(harnessId !== undefined ? { harnessId } : {}),\n ...(payload ? { payload } : {}),\n };\n}\n\nfunction mergeTraceRuntimeContext(input: unknown, context: TraceRuntimeContext | undefined): TraceInput {\n if (!context) {\n return normalizeTraceInput(input);\n }\n return normalizeTraceInput({\n ...(isRecord(input) ? input : {}),\n ...context,\n });\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction resolveTraceBridge(): TraceBridgeLike | null {\n const globalObj = globalThis as GlobalWithTraceBridge;\n const bridge = globalObj.__NOEGO_WOOD_BRIDGE__\n ?? globalObj.window?.__NOEGO_WOOD_BRIDGE__\n ?? globalObj.wood\n ?? globalObj.window?.wood;\n if (!bridge || typeof bridge !== 'object') {\n return null;\n }\n return bridge as TraceBridgeLike;\n}\n\nclass TraceHub {\n private readonly subject = new Subject<TraceEvent>();\n private readonly shared$ = this.subject.asObservable().pipe(share());\n private nextTraceSeq = 1;\n private minLevels: Record<TraceProcess, TraceLevel> = {\n main: 'debug',\n renderer: 'debug',\n test: 'debug',\n };\n\n get events$(): Observable<TraceEvent> {\n return this.shared$;\n }\n\n setMinLevel(process: TraceProcess, level: TraceLevel): void {\n this.minLevels[process] = level;\n }\n\n publish(process: TraceProcess, level: TraceLevel, input: unknown): TraceEvent {\n const normalized = normalizeTraceInput(input);\n const event: TraceEvent = {\n ...normalized,\n level,\n process,\n timestamp: new Date().toISOString(),\n traceSeq: this.nextTraceSeq++,\n };\n if (LEVEL_ORDER[level] >= LEVEL_ORDER[this.minLevels[process]]) {\n this.subject.next(event);\n }\n return event;\n }\n}\n\nfunction getGlobalTraceHub(): TraceHub {\n const globalObj = globalThis as GlobalWithTraceHub;\n if (!globalObj[TRACE_HUB_SYMBOL]) {\n globalObj[TRACE_HUB_SYMBOL] = new TraceHub();\n }\n return globalObj[TRACE_HUB_SYMBOL] as TraceHub;\n}\n\nexport function getTraceEvents$(): Observable<TraceEvent> {\n return getGlobalTraceHub().events$;\n}\n\nexport function setMainTraceMinLevel(level: TraceLevel): void {\n getGlobalTraceHub().setMinLevel('main', level);\n}\n\nexport function setRendererTraceMinLevel(level: TraceLevel): void {\n rendererMinLevel = level;\n getGlobalTraceHub().setMinLevel('renderer', level);\n}\n\nexport function setRendererTraceEnabled(enabled: boolean): void {\n rendererEnabled = enabled;\n}\n\nexport function publishMainTrace(level: TraceLevel, input: unknown): TraceEvent {\n return getGlobalTraceHub().publish('main', level, input);\n}\n\nexport function publishTestTrace(process: TraceProcess, level: TraceLevel, input: unknown): TraceEvent {\n return getGlobalTraceHub().publish(process, level, input);\n}\n\nexport function dispatchRendererTracePayload(\n rawPayload: unknown,\n context?: TraceRuntimeContext,\n): TraceDispatchResult {\n const payload = (rawPayload ?? {}) as Partial<TraceInput> & { level?: TraceLevel };\n const level = payload.level === 'debug' || payload.level === 'info' || payload.level === 'warn' || payload.level === 'error'\n ? payload.level\n : 'info';\n getGlobalTraceHub().publish('renderer', level, mergeTraceRuntimeContext(payload, context));\n return {\n ok: true,\n forwarded: true,\n };\n}\n\nexport function setRendererTraceTransport(fn: ((payload: unknown) => void) | null): void {\n customRendererTraceTransport = fn;\n}\n\nexport function emitRendererTrace(level: TraceLevel, input: TraceInput): void {\n if (!rendererEnabled) {\n return;\n }\n if (LEVEL_ORDER[level] < LEVEL_ORDER[rendererMinLevel]) {\n return;\n }\n const normalized = { ...normalizeTraceInput(input), level };\n\n if (customRendererTraceTransport) {\n try {\n customRendererTraceTransport(normalized);\n return;\n } catch {\n // Fall through to bridge.__trace\n }\n }\n\n const bridge = resolveTraceBridge();\n if (!bridge || typeof bridge.__trace !== 'function') {\n return;\n }\n try {\n bridge.__trace(normalized);\n } catch {\n // Tracing is observational and must never break the caller.\n }\n}\n\nexport function clearTraceHubForTests(): void {\n const globalObj = globalThis as GlobalWithTraceHub;\n delete globalObj[TRACE_HUB_SYMBOL];\n rendererMinLevel = 'debug';\n rendererEnabled = false;\n customRendererTraceTransport = null;\n}\n"],"mappings":"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","names":[]}
@@ -8,6 +8,10 @@ type TraceInput = {
8
8
  message?: string;
9
9
  conversationId?: number | string;
10
10
  payload?: Record<string, unknown>;
11
+ windowId?: string;
12
+ webContentsId?: number;
13
+ routeKey?: string;
14
+ harnessId?: string;
11
15
  };
12
16
  type TraceEvent = TraceInput & {
13
17
  level: TraceLevel;
@@ -19,33 +23,24 @@ type TraceDispatchResult = {
19
23
  ok: boolean;
20
24
  forwarded: boolean;
21
25
  };
22
- type TraceCaptureOptions = {
23
- maxEvents?: number;
26
+ type TraceRuntimeContext = {
27
+ windowId?: string;
28
+ webContentsId?: number;
29
+ routeKey?: string;
30
+ harnessId?: string;
24
31
  };
25
32
  type TraceWaitOptions = {
26
33
  timeoutMs?: number;
27
34
  };
28
- declare class TraceCapture {
29
- private readonly buffer;
30
- private readonly pending;
31
- private readonly maxEvents;
32
- private subscription;
33
- constructor(source$: Observable<TraceEvent>, options?: TraceCaptureOptions);
34
- events(): TraceEvent[];
35
- waitFor(predicate: (event: TraceEvent) => boolean, options?: TraceWaitOptions): Promise<TraceEvent>;
36
- writeArtifact(targetPath: string): Promise<void>;
37
- stop(): void;
38
- }
39
35
  declare function getTraceEvents$(): Observable<TraceEvent>;
40
36
  declare function setMainTraceMinLevel(level: TraceLevel): void;
41
37
  declare function setRendererTraceMinLevel(level: TraceLevel): void;
42
38
  declare function setRendererTraceEnabled(enabled: boolean): void;
43
39
  declare function publishMainTrace(level: TraceLevel, input: unknown): TraceEvent;
44
40
  declare function publishTestTrace(process: TraceProcess, level: TraceLevel, input: unknown): TraceEvent;
45
- declare function dispatchRendererTracePayload(rawPayload: unknown): TraceDispatchResult;
41
+ declare function dispatchRendererTracePayload(rawPayload: unknown, context?: TraceRuntimeContext): TraceDispatchResult;
46
42
  declare function setRendererTraceTransport(fn: ((payload: unknown) => void) | null): void;
47
43
  declare function emitRendererTrace(level: TraceLevel, input: TraceInput): void;
48
- declare function createTraceCapture(options?: TraceCaptureOptions): TraceCapture;
49
44
  declare function clearTraceHubForTests(): void;
50
45
 
51
- export { TraceCapture, type TraceCaptureOptions, type TraceDispatchResult, type TraceEvent, type TraceInput, type TraceLevel, type TraceProcess, type TraceWaitOptions, clearTraceHubForTests, createTraceCapture, dispatchRendererTracePayload, emitRendererTrace, getTraceEvents$, publishMainTrace, publishTestTrace, setMainTraceMinLevel, setRendererTraceEnabled, setRendererTraceMinLevel, setRendererTraceTransport };
46
+ export { type TraceDispatchResult, type TraceEvent, type TraceInput, type TraceLevel, type TraceProcess, type TraceRuntimeContext, type TraceWaitOptions, clearTraceHubForTests, dispatchRendererTracePayload, emitRendererTrace, getTraceEvents$, publishMainTrace, publishTestTrace, setMainTraceMinLevel, setRendererTraceEnabled, setRendererTraceMinLevel, setRendererTraceTransport };
@@ -8,6 +8,10 @@ type TraceInput = {
8
8
  message?: string;
9
9
  conversationId?: number | string;
10
10
  payload?: Record<string, unknown>;
11
+ windowId?: string;
12
+ webContentsId?: number;
13
+ routeKey?: string;
14
+ harnessId?: string;
11
15
  };
12
16
  type TraceEvent = TraceInput & {
13
17
  level: TraceLevel;
@@ -19,33 +23,24 @@ type TraceDispatchResult = {
19
23
  ok: boolean;
20
24
  forwarded: boolean;
21
25
  };
22
- type TraceCaptureOptions = {
23
- maxEvents?: number;
26
+ type TraceRuntimeContext = {
27
+ windowId?: string;
28
+ webContentsId?: number;
29
+ routeKey?: string;
30
+ harnessId?: string;
24
31
  };
25
32
  type TraceWaitOptions = {
26
33
  timeoutMs?: number;
27
34
  };
28
- declare class TraceCapture {
29
- private readonly buffer;
30
- private readonly pending;
31
- private readonly maxEvents;
32
- private subscription;
33
- constructor(source$: Observable<TraceEvent>, options?: TraceCaptureOptions);
34
- events(): TraceEvent[];
35
- waitFor(predicate: (event: TraceEvent) => boolean, options?: TraceWaitOptions): Promise<TraceEvent>;
36
- writeArtifact(targetPath: string): Promise<void>;
37
- stop(): void;
38
- }
39
35
  declare function getTraceEvents$(): Observable<TraceEvent>;
40
36
  declare function setMainTraceMinLevel(level: TraceLevel): void;
41
37
  declare function setRendererTraceMinLevel(level: TraceLevel): void;
42
38
  declare function setRendererTraceEnabled(enabled: boolean): void;
43
39
  declare function publishMainTrace(level: TraceLevel, input: unknown): TraceEvent;
44
40
  declare function publishTestTrace(process: TraceProcess, level: TraceLevel, input: unknown): TraceEvent;
45
- declare function dispatchRendererTracePayload(rawPayload: unknown): TraceDispatchResult;
41
+ declare function dispatchRendererTracePayload(rawPayload: unknown, context?: TraceRuntimeContext): TraceDispatchResult;
46
42
  declare function setRendererTraceTransport(fn: ((payload: unknown) => void) | null): void;
47
43
  declare function emitRendererTrace(level: TraceLevel, input: TraceInput): void;
48
- declare function createTraceCapture(options?: TraceCaptureOptions): TraceCapture;
49
44
  declare function clearTraceHubForTests(): void;
50
45
 
51
- export { TraceCapture, type TraceCaptureOptions, type TraceDispatchResult, type TraceEvent, type TraceInput, type TraceLevel, type TraceProcess, type TraceWaitOptions, clearTraceHubForTests, createTraceCapture, dispatchRendererTracePayload, emitRendererTrace, getTraceEvents$, publishMainTrace, publishTestTrace, setMainTraceMinLevel, setRendererTraceEnabled, setRendererTraceMinLevel, setRendererTraceTransport };
46
+ export { type TraceDispatchResult, type TraceEvent, type TraceInput, type TraceLevel, type TraceProcess, type TraceRuntimeContext, type TraceWaitOptions, clearTraceHubForTests, dispatchRendererTracePayload, emitRendererTrace, getTraceEvents$, publishMainTrace, publishTestTrace, setMainTraceMinLevel, setRendererTraceEnabled, setRendererTraceMinLevel, setRendererTraceTransport };
@@ -16,15 +16,32 @@ function normalizeTraceInput(raw) {
16
16
  const type = typeof input.type === "string" && input.type.trim().length > 0 ? input.type : "unknown";
17
17
  const message = typeof input.message === "string" ? input.message : void 0;
18
18
  const conversationId = typeof input.conversationId === "number" || typeof input.conversationId === "string" ? input.conversationId : void 0;
19
+ const windowId = typeof input.windowId === "string" && input.windowId.trim().length > 0 ? input.windowId : void 0;
20
+ const webContentsId = typeof input.webContentsId === "number" && Number.isFinite(input.webContentsId) ? input.webContentsId : void 0;
21
+ const routeKey = typeof input.routeKey === "string" && input.routeKey.trim().length > 0 ? input.routeKey : void 0;
22
+ const harnessId = typeof input.harnessId === "string" && input.harnessId.trim().length > 0 ? input.harnessId : void 0;
19
23
  const payload = isRecord(input.payload) ? { ...input.payload } : void 0;
20
24
  return {
21
25
  source,
22
26
  type,
23
27
  ...message ? { message } : {},
24
28
  ...conversationId !== void 0 ? { conversationId } : {},
29
+ ...windowId !== void 0 ? { windowId } : {},
30
+ ...webContentsId !== void 0 ? { webContentsId } : {},
31
+ ...routeKey !== void 0 ? { routeKey } : {},
32
+ ...harnessId !== void 0 ? { harnessId } : {},
25
33
  ...payload ? { payload } : {}
26
34
  };
27
35
  }
36
+ function mergeTraceRuntimeContext(input, context) {
37
+ if (!context) {
38
+ return normalizeTraceInput(input);
39
+ }
40
+ return normalizeTraceInput({
41
+ ...isRecord(input) ? input : {},
42
+ ...context
43
+ });
44
+ }
28
45
  function isRecord(value) {
29
46
  return typeof value === "object" && value !== null && !Array.isArray(value);
30
47
  }
@@ -36,70 +53,6 @@ function resolveTraceBridge() {
36
53
  }
37
54
  return bridge;
38
55
  }
39
- class TraceCapture {
40
- constructor(source$, options = {}) {
41
- this.buffer = [];
42
- this.pending = /* @__PURE__ */ new Set();
43
- this.maxEvents = Math.max(1, options.maxEvents ?? 1e3);
44
- this.subscription = source$.subscribe((event) => {
45
- this.buffer.push(event);
46
- if (this.buffer.length > this.maxEvents) {
47
- this.buffer.splice(0, this.buffer.length - this.maxEvents);
48
- }
49
- for (const waiter of Array.from(this.pending)) {
50
- if (!waiter.predicate(event)) {
51
- continue;
52
- }
53
- if (waiter.timeoutId) {
54
- clearTimeout(waiter.timeoutId);
55
- }
56
- this.pending.delete(waiter);
57
- waiter.resolve(event);
58
- }
59
- });
60
- }
61
- events() {
62
- return [...this.buffer];
63
- }
64
- async waitFor(predicate, options = {}) {
65
- const existing = this.buffer.find(predicate);
66
- if (existing) {
67
- return existing;
68
- }
69
- return new Promise((resolve, reject) => {
70
- const waiter = {
71
- predicate,
72
- resolve,
73
- reject
74
- };
75
- const timeoutMs = options.timeoutMs ?? 5e3;
76
- waiter.timeoutId = setTimeout(() => {
77
- this.pending.delete(waiter);
78
- reject(new Error(`Timed out waiting for trace event after ${timeoutMs}ms`));
79
- }, timeoutMs);
80
- this.pending.add(waiter);
81
- });
82
- }
83
- async writeArtifact(targetPath) {
84
- const [{ mkdir, writeFile }, pathModule] = await Promise.all([
85
- import("node:fs/promises"),
86
- import("node:path")
87
- ]);
88
- await mkdir(pathModule.dirname(targetPath), { recursive: true });
89
- const lines = this.buffer.map((event) => JSON.stringify(event)).join("\n");
90
- await writeFile(targetPath, `${lines}${lines.length > 0 ? "\n" : ""}`, "utf8");
91
- }
92
- stop() {
93
- for (const waiter of this.pending) {
94
- if (waiter.timeoutId) {
95
- clearTimeout(waiter.timeoutId);
96
- }
97
- waiter.reject(new Error("Trace capture stopped before predicate matched"));
98
- }
99
- this.pending.clear();
100
- this.subscription.unsubscribe();
101
- }
102
- }
103
56
  class TraceHub {
104
57
  constructor() {
105
58
  this.subject = new Subject();
@@ -131,9 +84,6 @@ class TraceHub {
131
84
  }
132
85
  return event;
133
86
  }
134
- capture(options = {}) {
135
- return new TraceCapture(this.events$, options);
136
- }
137
87
  }
138
88
  function getGlobalTraceHub() {
139
89
  const globalObj = globalThis;
@@ -161,10 +111,10 @@ function publishMainTrace(level, input) {
161
111
  function publishTestTrace(process, level, input) {
162
112
  return getGlobalTraceHub().publish(process, level, input);
163
113
  }
164
- function dispatchRendererTracePayload(rawPayload) {
114
+ function dispatchRendererTracePayload(rawPayload, context) {
165
115
  const payload = rawPayload ?? {};
166
116
  const level = payload.level === "debug" || payload.level === "info" || payload.level === "warn" || payload.level === "error" ? payload.level : "info";
167
- getGlobalTraceHub().publish("renderer", level, payload);
117
+ getGlobalTraceHub().publish("renderer", level, mergeTraceRuntimeContext(payload, context));
168
118
  return {
169
119
  ok: true,
170
120
  forwarded: true
@@ -197,9 +147,6 @@ function emitRendererTrace(level, input) {
197
147
  } catch {
198
148
  }
199
149
  }
200
- function createTraceCapture(options = {}) {
201
- return getGlobalTraceHub().capture(options);
202
- }
203
150
  function clearTraceHubForTests() {
204
151
  const globalObj = globalThis;
205
152
  delete globalObj[TRACE_HUB_SYMBOL];
@@ -208,9 +155,7 @@ function clearTraceHubForTests() {
208
155
  customRendererTraceTransport = null;
209
156
  }
210
157
  export {
211
- TraceCapture,
212
158
  clearTraceHubForTests,
213
- createTraceCapture,
214
159
  dispatchRendererTracePayload,
215
160
  emitRendererTrace,
216
161
  getTraceEvents$,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/tracing/trace_hub.ts"],"sourcesContent":["import { Observable, Subject, Subscription } from 'rxjs';\nimport { share } from 'rxjs/operators';\n\nexport type TraceLevel = 'debug' | 'info' | 'warn' | 'error';\nexport type TraceProcess = 'main' | 'renderer' | 'test';\n\nexport type TraceInput = {\n source: string;\n type: string;\n message?: string;\n conversationId?: number | string;\n payload?: Record<string, unknown>;\n};\n\nexport type TraceEvent = TraceInput & {\n level: TraceLevel;\n process: TraceProcess;\n timestamp: string;\n traceSeq: number;\n};\n\nexport type TraceDispatchResult = {\n ok: boolean;\n forwarded: boolean;\n};\n\nexport type TraceCaptureOptions = {\n maxEvents?: number;\n};\n\nexport type TraceWaitOptions = {\n timeoutMs?: number;\n};\n\nconst TRACE_HUB_SYMBOL = Symbol.for('@noego/wood.trace.hub');\n\nconst LEVEL_ORDER: Record<TraceLevel, number> = {\n debug: 0,\n info: 1,\n warn: 2,\n error: 3,\n};\n\nlet rendererMinLevel: TraceLevel = 'debug';\nlet rendererEnabled = false;\nlet customRendererTraceTransport: ((payload: unknown) => void) | null = null;\n\ntype PendingWaiter = {\n predicate: (event: TraceEvent) => boolean;\n resolve: (event: TraceEvent) => void;\n reject: (error: Error) => void;\n timeoutId?: ReturnType<typeof setTimeout>;\n};\n\ntype GlobalWithTraceHub = typeof globalThis & {\n [TRACE_HUB_SYMBOL]?: TraceHub;\n};\n\ntype TraceBridgeLike = Record<string, unknown> & {\n __trace?: (payload: unknown) => void;\n};\n\ntype GlobalWithTraceBridge = typeof globalThis & {\n __NOEGO_WOOD_BRIDGE__?: unknown;\n wood?: unknown;\n window?: {\n __NOEGO_WOOD_BRIDGE__?: unknown;\n wood?: unknown;\n };\n};\n\nfunction normalizeTraceInput(raw: unknown): TraceInput {\n const input = (raw ?? {}) as Partial<TraceInput> & Record<string, unknown>;\n const source = typeof input.source === 'string' && input.source.trim().length > 0\n ? input.source\n : 'unknown';\n const type = typeof input.type === 'string' && input.type.trim().length > 0\n ? input.type\n : 'unknown';\n const message = typeof input.message === 'string' ? input.message : undefined;\n const conversationId = typeof input.conversationId === 'number' || typeof input.conversationId === 'string'\n ? input.conversationId\n : undefined;\n const payload = isRecord(input.payload) ? { ...input.payload } : undefined;\n\n return {\n source,\n type,\n ...(message ? { message } : {}),\n ...(conversationId !== undefined ? { conversationId } : {}),\n ...(payload ? { payload } : {}),\n };\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction resolveTraceBridge(): TraceBridgeLike | null {\n const globalObj = globalThis as GlobalWithTraceBridge;\n const bridge = globalObj.__NOEGO_WOOD_BRIDGE__\n ?? globalObj.window?.__NOEGO_WOOD_BRIDGE__\n ?? globalObj.wood\n ?? globalObj.window?.wood;\n if (!bridge || typeof bridge !== 'object') {\n return null;\n }\n return bridge as TraceBridgeLike;\n}\n\nexport class TraceCapture {\n private readonly buffer: TraceEvent[] = [];\n private readonly pending = new Set<PendingWaiter>();\n private readonly maxEvents: number;\n private subscription: Subscription;\n\n constructor(\n source$: Observable<TraceEvent>,\n options: TraceCaptureOptions = {},\n ) {\n this.maxEvents = Math.max(1, options.maxEvents ?? 1000);\n this.subscription = source$.subscribe((event) => {\n this.buffer.push(event);\n if (this.buffer.length > this.maxEvents) {\n this.buffer.splice(0, this.buffer.length - this.maxEvents);\n }\n for (const waiter of Array.from(this.pending)) {\n if (!waiter.predicate(event)) {\n continue;\n }\n if (waiter.timeoutId) {\n clearTimeout(waiter.timeoutId);\n }\n this.pending.delete(waiter);\n waiter.resolve(event);\n }\n });\n }\n\n events(): TraceEvent[] {\n return [...this.buffer];\n }\n\n async waitFor(\n predicate: (event: TraceEvent) => boolean,\n options: TraceWaitOptions = {},\n ): Promise<TraceEvent> {\n const existing = this.buffer.find(predicate);\n if (existing) {\n return existing;\n }\n\n return new Promise<TraceEvent>((resolve, reject) => {\n const waiter: PendingWaiter = {\n predicate,\n resolve,\n reject,\n };\n const timeoutMs = options.timeoutMs ?? 5000;\n waiter.timeoutId = setTimeout(() => {\n this.pending.delete(waiter);\n reject(new Error(`Timed out waiting for trace event after ${timeoutMs}ms`));\n }, timeoutMs);\n this.pending.add(waiter);\n });\n }\n\n async writeArtifact(targetPath: string): Promise<void> {\n const [{ mkdir, writeFile }, pathModule] = await Promise.all([\n import('node:fs/promises'),\n import('node:path'),\n ]);\n await mkdir(pathModule.dirname(targetPath), { recursive: true });\n const lines = this.buffer.map((event) => JSON.stringify(event)).join('\\n');\n await writeFile(targetPath, `${lines}${lines.length > 0 ? '\\n' : ''}`, 'utf8');\n }\n\n stop(): void {\n for (const waiter of this.pending) {\n if (waiter.timeoutId) {\n clearTimeout(waiter.timeoutId);\n }\n waiter.reject(new Error('Trace capture stopped before predicate matched'));\n }\n this.pending.clear();\n this.subscription.unsubscribe();\n }\n}\n\nclass TraceHub {\n private readonly subject = new Subject<TraceEvent>();\n private readonly shared$ = this.subject.asObservable().pipe(share());\n private nextTraceSeq = 1;\n private minLevels: Record<TraceProcess, TraceLevel> = {\n main: 'debug',\n renderer: 'debug',\n test: 'debug',\n };\n\n get events$(): Observable<TraceEvent> {\n return this.shared$;\n }\n\n setMinLevel(process: TraceProcess, level: TraceLevel): void {\n this.minLevels[process] = level;\n }\n\n publish(process: TraceProcess, level: TraceLevel, input: unknown): TraceEvent {\n const normalized = normalizeTraceInput(input);\n const event: TraceEvent = {\n ...normalized,\n level,\n process,\n timestamp: new Date().toISOString(),\n traceSeq: this.nextTraceSeq++,\n };\n if (LEVEL_ORDER[level] >= LEVEL_ORDER[this.minLevels[process]]) {\n this.subject.next(event);\n }\n return event;\n }\n\n capture(options: TraceCaptureOptions = {}): TraceCapture {\n return new TraceCapture(this.events$, options);\n }\n}\n\nfunction getGlobalTraceHub(): TraceHub {\n const globalObj = globalThis as GlobalWithTraceHub;\n if (!globalObj[TRACE_HUB_SYMBOL]) {\n globalObj[TRACE_HUB_SYMBOL] = new TraceHub();\n }\n return globalObj[TRACE_HUB_SYMBOL] as TraceHub;\n}\n\nexport function getTraceEvents$(): Observable<TraceEvent> {\n return getGlobalTraceHub().events$;\n}\n\nexport function setMainTraceMinLevel(level: TraceLevel): void {\n getGlobalTraceHub().setMinLevel('main', level);\n}\n\nexport function setRendererTraceMinLevel(level: TraceLevel): void {\n rendererMinLevel = level;\n getGlobalTraceHub().setMinLevel('renderer', level);\n}\n\nexport function setRendererTraceEnabled(enabled: boolean): void {\n rendererEnabled = enabled;\n}\n\nexport function publishMainTrace(level: TraceLevel, input: unknown): TraceEvent {\n return getGlobalTraceHub().publish('main', level, input);\n}\n\nexport function publishTestTrace(process: TraceProcess, level: TraceLevel, input: unknown): TraceEvent {\n return getGlobalTraceHub().publish(process, level, input);\n}\n\nexport function dispatchRendererTracePayload(rawPayload: unknown): TraceDispatchResult {\n const payload = (rawPayload ?? {}) as Partial<TraceInput> & { level?: TraceLevel };\n const level = payload.level === 'debug' || payload.level === 'info' || payload.level === 'warn' || payload.level === 'error'\n ? payload.level\n : 'info';\n getGlobalTraceHub().publish('renderer', level, payload);\n return {\n ok: true,\n forwarded: true,\n };\n}\n\nexport function setRendererTraceTransport(fn: ((payload: unknown) => void) | null): void {\n customRendererTraceTransport = fn;\n}\n\nexport function emitRendererTrace(level: TraceLevel, input: TraceInput): void {\n if (!rendererEnabled) {\n return;\n }\n if (LEVEL_ORDER[level] < LEVEL_ORDER[rendererMinLevel]) {\n return;\n }\n const normalized = { ...normalizeTraceInput(input), level };\n\n if (customRendererTraceTransport) {\n try {\n customRendererTraceTransport(normalized);\n return;\n } catch {\n // Fall through to bridge.__trace\n }\n }\n\n const bridge = resolveTraceBridge();\n if (!bridge || typeof bridge.__trace !== 'function') {\n return;\n }\n try {\n bridge.__trace(normalized);\n } catch {\n // Tracing is observational and must never break the caller.\n }\n}\n\nexport function createTraceCapture(options: TraceCaptureOptions = {}): TraceCapture {\n return getGlobalTraceHub().capture(options);\n}\n\nexport function clearTraceHubForTests(): void {\n const globalObj = globalThis as GlobalWithTraceHub;\n delete globalObj[TRACE_HUB_SYMBOL];\n rendererMinLevel = 'debug';\n rendererEnabled = false;\n customRendererTraceTransport = null;\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../src/tracing/trace_hub.ts"],"sourcesContent":["import { Observable, Subject } from 'rxjs';\nimport { share } from 'rxjs/operators';\n\nexport type TraceLevel = 'debug' | 'info' | 'warn' | 'error';\nexport type TraceProcess = 'main' | 'renderer' | 'test';\n\nexport type TraceInput = {\n source: string;\n type: string;\n message?: string;\n conversationId?: number | string;\n payload?: Record<string, unknown>;\n windowId?: string;\n webContentsId?: number;\n routeKey?: string;\n harnessId?: string;\n};\n\nexport type TraceEvent = TraceInput & {\n level: TraceLevel;\n process: TraceProcess;\n timestamp: string;\n traceSeq: number;\n};\n\nexport type TraceDispatchResult = {\n ok: boolean;\n forwarded: boolean;\n};\n\nexport type TraceRuntimeContext = {\n windowId?: string;\n webContentsId?: number;\n routeKey?: string;\n harnessId?: string;\n};\n\nexport type TraceWaitOptions = {\n timeoutMs?: number;\n};\n\nconst TRACE_HUB_SYMBOL = Symbol.for('@noego/wood.trace.hub');\n\nconst LEVEL_ORDER: Record<TraceLevel, number> = {\n debug: 0,\n info: 1,\n warn: 2,\n error: 3,\n};\n\nlet rendererMinLevel: TraceLevel = 'debug';\nlet rendererEnabled = false;\nlet customRendererTraceTransport: ((payload: unknown) => void) | null = null;\n\ntype GlobalWithTraceHub = typeof globalThis & {\n [TRACE_HUB_SYMBOL]?: TraceHub;\n};\n\ntype TraceBridgeLike = Record<string, unknown> & {\n __trace?: (payload: unknown) => void;\n};\n\ntype GlobalWithTraceBridge = typeof globalThis & {\n __NOEGO_WOOD_BRIDGE__?: unknown;\n wood?: unknown;\n window?: {\n __NOEGO_WOOD_BRIDGE__?: unknown;\n wood?: unknown;\n };\n};\n\nfunction normalizeTraceInput(raw: unknown): TraceInput {\n const input = (raw ?? {}) as Partial<TraceInput> & Record<string, unknown>;\n const source = typeof input.source === 'string' && input.source.trim().length > 0\n ? input.source\n : 'unknown';\n const type = typeof input.type === 'string' && input.type.trim().length > 0\n ? input.type\n : 'unknown';\n const message = typeof input.message === 'string' ? input.message : undefined;\n const conversationId = typeof input.conversationId === 'number' || typeof input.conversationId === 'string'\n ? input.conversationId\n : undefined;\n const windowId = typeof input.windowId === 'string' && input.windowId.trim().length > 0\n ? input.windowId\n : undefined;\n const webContentsId = typeof input.webContentsId === 'number' && Number.isFinite(input.webContentsId)\n ? input.webContentsId\n : undefined;\n const routeKey = typeof input.routeKey === 'string' && input.routeKey.trim().length > 0\n ? input.routeKey\n : undefined;\n const harnessId = typeof input.harnessId === 'string' && input.harnessId.trim().length > 0\n ? input.harnessId\n : undefined;\n const payload = isRecord(input.payload) ? { ...input.payload } : undefined;\n\n return {\n source,\n type,\n ...(message ? { message } : {}),\n ...(conversationId !== undefined ? { conversationId } : {}),\n ...(windowId !== undefined ? { windowId } : {}),\n ...(webContentsId !== undefined ? { webContentsId } : {}),\n ...(routeKey !== undefined ? { routeKey } : {}),\n ...(harnessId !== undefined ? { harnessId } : {}),\n ...(payload ? { payload } : {}),\n };\n}\n\nfunction mergeTraceRuntimeContext(input: unknown, context: TraceRuntimeContext | undefined): TraceInput {\n if (!context) {\n return normalizeTraceInput(input);\n }\n return normalizeTraceInput({\n ...(isRecord(input) ? input : {}),\n ...context,\n });\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction resolveTraceBridge(): TraceBridgeLike | null {\n const globalObj = globalThis as GlobalWithTraceBridge;\n const bridge = globalObj.__NOEGO_WOOD_BRIDGE__\n ?? globalObj.window?.__NOEGO_WOOD_BRIDGE__\n ?? globalObj.wood\n ?? globalObj.window?.wood;\n if (!bridge || typeof bridge !== 'object') {\n return null;\n }\n return bridge as TraceBridgeLike;\n}\n\nclass TraceHub {\n private readonly subject = new Subject<TraceEvent>();\n private readonly shared$ = this.subject.asObservable().pipe(share());\n private nextTraceSeq = 1;\n private minLevels: Record<TraceProcess, TraceLevel> = {\n main: 'debug',\n renderer: 'debug',\n test: 'debug',\n };\n\n get events$(): Observable<TraceEvent> {\n return this.shared$;\n }\n\n setMinLevel(process: TraceProcess, level: TraceLevel): void {\n this.minLevels[process] = level;\n }\n\n publish(process: TraceProcess, level: TraceLevel, input: unknown): TraceEvent {\n const normalized = normalizeTraceInput(input);\n const event: TraceEvent = {\n ...normalized,\n level,\n process,\n timestamp: new Date().toISOString(),\n traceSeq: this.nextTraceSeq++,\n };\n if (LEVEL_ORDER[level] >= LEVEL_ORDER[this.minLevels[process]]) {\n this.subject.next(event);\n }\n return event;\n }\n}\n\nfunction getGlobalTraceHub(): TraceHub {\n const globalObj = globalThis as GlobalWithTraceHub;\n if (!globalObj[TRACE_HUB_SYMBOL]) {\n globalObj[TRACE_HUB_SYMBOL] = new TraceHub();\n }\n return globalObj[TRACE_HUB_SYMBOL] as TraceHub;\n}\n\nexport function getTraceEvents$(): Observable<TraceEvent> {\n return getGlobalTraceHub().events$;\n}\n\nexport function setMainTraceMinLevel(level: TraceLevel): void {\n getGlobalTraceHub().setMinLevel('main', level);\n}\n\nexport function setRendererTraceMinLevel(level: TraceLevel): void {\n rendererMinLevel = level;\n getGlobalTraceHub().setMinLevel('renderer', level);\n}\n\nexport function setRendererTraceEnabled(enabled: boolean): void {\n rendererEnabled = enabled;\n}\n\nexport function publishMainTrace(level: TraceLevel, input: unknown): TraceEvent {\n return getGlobalTraceHub().publish('main', level, input);\n}\n\nexport function publishTestTrace(process: TraceProcess, level: TraceLevel, input: unknown): TraceEvent {\n return getGlobalTraceHub().publish(process, level, input);\n}\n\nexport function dispatchRendererTracePayload(\n rawPayload: unknown,\n context?: TraceRuntimeContext,\n): TraceDispatchResult {\n const payload = (rawPayload ?? {}) as Partial<TraceInput> & { level?: TraceLevel };\n const level = payload.level === 'debug' || payload.level === 'info' || payload.level === 'warn' || payload.level === 'error'\n ? payload.level\n : 'info';\n getGlobalTraceHub().publish('renderer', level, mergeTraceRuntimeContext(payload, context));\n return {\n ok: true,\n forwarded: true,\n };\n}\n\nexport function setRendererTraceTransport(fn: ((payload: unknown) => void) | null): void {\n customRendererTraceTransport = fn;\n}\n\nexport function emitRendererTrace(level: TraceLevel, input: TraceInput): void {\n if (!rendererEnabled) {\n return;\n }\n if (LEVEL_ORDER[level] < LEVEL_ORDER[rendererMinLevel]) {\n return;\n }\n const normalized = { ...normalizeTraceInput(input), level };\n\n if (customRendererTraceTransport) {\n try {\n customRendererTraceTransport(normalized);\n return;\n } catch {\n // Fall through to bridge.__trace\n }\n }\n\n const bridge = resolveTraceBridge();\n if (!bridge || typeof bridge.__trace !== 'function') {\n return;\n }\n try {\n bridge.__trace(normalized);\n } catch {\n // Tracing is observational and must never break the caller.\n }\n}\n\nexport function clearTraceHubForTests(): void {\n const globalObj = globalThis as GlobalWithTraceHub;\n delete globalObj[TRACE_HUB_SYMBOL];\n rendererMinLevel = 'debug';\n rendererEnabled = false;\n customRendererTraceTransport = null;\n}\n"],"mappings":"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","names":[]}
@@ -41,9 +41,6 @@ class FrameworkTracer {
41
41
  extend(context) {
42
42
  return new ContextualTracer(this, context);
43
43
  }
44
- capture(options = {}) {
45
- return (0, import_trace_hub.createTraceCapture)(options);
46
- }
47
44
  }
48
45
  class ContextualTracer extends FrameworkTracer {
49
46
  constructor(parent, context) {
@@ -231,9 +228,6 @@ let TraceProvider = class extends FrameworkTracer {
231
228
  error(event) {
232
229
  this.resolveImplementation().error(event);
233
230
  }
234
- capture(options = {}) {
235
- return this.resolveImplementation().capture(options);
236
- }
237
231
  resolveImplementation() {
238
232
  const mode = this.configuration.getMode();
239
233
  if (mode === "test") {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/tracing/trace_provider.ts"],"sourcesContent":["import { Component, Inject, LoadAs, Provider, SCOPED_CONTAINER, type IContainer } from '@noego/ioc';\nimport type { Observable } from 'rxjs';\nimport {\n createTraceCapture,\n emitRendererTrace,\n getTraceEvents$,\n publishMainTrace,\n publishTestTrace,\n setMainTraceMinLevel,\n setRendererTraceEnabled,\n setRendererTraceMinLevel,\n type TraceCapture,\n type TraceCaptureOptions,\n type TraceEvent,\n type TraceInput,\n type TraceLevel,\n type TraceProcess,\n} from './trace_hub.js';\n\nexport type TraceProviderMode = 'live' | 'test';\nexport type TraceRuntime = 'main' | 'renderer' | 'test';\nexport type TraceContext = Partial<TraceInput>;\n\nexport abstract class FrameworkTracer {\n abstract readonly mode: TraceProviderMode;\n abstract readonly process: TraceProcess;\n abstract readonly events$: Observable<TraceEvent>;\n abstract debug(event: TraceInput): void;\n abstract info(event: TraceInput): void;\n abstract warn(event: TraceInput): void;\n abstract error(event: TraceInput): void;\n\n extend(context: TraceContext): FrameworkTracer {\n return new ContextualTracer(this, context);\n }\n\n capture(options: TraceCaptureOptions = {}): TraceCapture {\n return createTraceCapture(options);\n }\n}\n\nclass ContextualTracer extends FrameworkTracer {\n constructor(\n private readonly parent: FrameworkTracer,\n private readonly context: TraceContext,\n ) {\n super();\n }\n\n get mode(): TraceProviderMode {\n return this.parent.mode;\n }\n\n get process(): TraceProcess {\n return this.parent.process;\n }\n\n get events$(): Observable<TraceEvent> {\n return this.parent.events$;\n }\n\n debug(event: TraceInput): void {\n this.parent.debug(this.mergeEvent(event));\n }\n\n info(event: TraceInput): void {\n this.parent.info(this.mergeEvent(event));\n }\n\n warn(event: TraceInput): void {\n this.parent.warn(this.mergeEvent(event));\n }\n\n error(event: TraceInput): void {\n this.parent.error(this.mergeEvent(event));\n }\n\n private mergeEvent(event: TraceInput): TraceInput {\n return {\n ...this.context,\n ...event,\n };\n }\n}\n\n@Component({ scope: LoadAs.Singleton })\nexport class TraceProviderConfiguration {\n private mode: TraceProviderMode = 'live';\n private runtime: TraceRuntime = 'main';\n private minLevel: TraceLevel = 'debug';\n private enabled: boolean | null = null;\n\n configureMode(mode: TraceProviderMode): void {\n this.mode = mode;\n }\n\n configureRuntime(runtime: TraceRuntime): void {\n this.runtime = runtime;\n this.applyRuntimeConfiguration();\n }\n\n configureMinLevel(level: TraceLevel): void {\n this.minLevel = level;\n this.applyRuntimeConfiguration();\n }\n\n configureEnabled(enabled: boolean): void {\n this.enabled = enabled;\n this.applyRuntimeConfiguration();\n }\n\n getMode(): TraceProviderMode {\n return this.mode;\n }\n\n getRuntime(): TraceRuntime {\n return this.runtime;\n }\n\n getMinLevel(): TraceLevel {\n return this.minLevel;\n }\n\n getEnabled(): boolean {\n return this.enabled ?? (this.runtime === 'renderer' ? false : true);\n }\n\n private applyRuntimeConfiguration(): void {\n if (this.runtime === 'renderer') {\n setRendererTraceEnabled(this.getEnabled());\n setRendererTraceMinLevel(this.minLevel);\n return;\n }\n\n setMainTraceMinLevel(this.minLevel);\n }\n}\n\n@Component({ scope: LoadAs.Singleton })\nexport class MainTracer extends FrameworkTracer {\n readonly mode = 'live' as const;\n readonly process = 'main' as const;\n readonly events$ = getTraceEvents$();\n\n debug(event: TraceInput): void {\n publishMainTrace('debug', event);\n }\n\n info(event: TraceInput): void {\n publishMainTrace('info', event);\n }\n\n warn(event: TraceInput): void {\n publishMainTrace('warn', event);\n }\n\n error(event: TraceInput): void {\n publishMainTrace('error', event);\n }\n}\n\n@Component({ scope: LoadAs.Singleton })\nexport class RendererTracer extends FrameworkTracer {\n readonly mode = 'live' as const;\n readonly process = 'renderer' as const;\n readonly events$ = getTraceEvents$();\n\n debug(event: TraceInput): void {\n emitRendererTrace('debug', event);\n }\n\n info(event: TraceInput): void {\n emitRendererTrace('info', event);\n }\n\n warn(event: TraceInput): void {\n emitRendererTrace('warn', event);\n }\n\n error(event: TraceInput): void {\n emitRendererTrace('error', event);\n }\n}\n\n@Component({ scope: LoadAs.Singleton })\nexport class TestTracer extends FrameworkTracer {\n readonly mode = 'test' as const;\n readonly events$ = getTraceEvents$();\n\n constructor(\n @Inject(TraceProviderConfiguration) private readonly configuration: TraceProviderConfiguration,\n ) {\n super();\n }\n\n get process(): TraceProcess {\n const runtime = this.configuration.getRuntime();\n if (runtime === 'renderer') return 'renderer';\n if (runtime === 'main') return 'main';\n return 'test';\n }\n\n debug(event: TraceInput): void {\n this.publish('debug', event);\n }\n\n info(event: TraceInput): void {\n this.publish('info', event);\n }\n\n warn(event: TraceInput): void {\n this.publish('warn', event);\n }\n\n error(event: TraceInput): void {\n this.publish('error', event);\n }\n\n private publish(level: TraceLevel, event: TraceInput): void {\n publishTestTrace(this.process, level, event);\n }\n}\n\n@Provider()\nexport class TraceProvider extends FrameworkTracer {\n constructor(\n @Inject(TraceProviderConfiguration) private readonly configuration: TraceProviderConfiguration,\n @Inject(SCOPED_CONTAINER) private readonly container: IContainer,\n ) {\n super();\n }\n\n get mode(): TraceProviderMode {\n return this.resolveImplementation().mode;\n }\n\n get process(): TraceProcess {\n return this.resolveImplementation().process;\n }\n\n get events$(): Observable<TraceEvent> {\n return this.resolveImplementation().events$;\n }\n\n debug(event: TraceInput): void {\n this.resolveImplementation().debug(event);\n }\n\n info(event: TraceInput): void {\n this.resolveImplementation().info(event);\n }\n\n warn(event: TraceInput): void {\n this.resolveImplementation().warn(event);\n }\n\n error(event: TraceInput): void {\n this.resolveImplementation().error(event);\n }\n\n capture(options: TraceCaptureOptions = {}): TraceCapture {\n return this.resolveImplementation().capture(options);\n }\n\n private resolveImplementation(): FrameworkTracer {\n const mode = this.configuration.getMode();\n if (mode === 'test') {\n return this.resolveSync(TestTracer);\n }\n\n if (this.configuration.getRuntime() === 'renderer') {\n return this.resolveSync(RendererTracer);\n }\n\n return this.resolveSync(MainTracer);\n }\n\n private resolveSync<T>(token: new (...args: any[]) => T): T {\n const resolved = this.container.instance<T, true>(token);\n if (resolved instanceof Promise) {\n throw new Error(`${token.name} must resolve synchronously`);\n }\n return resolved;\n }\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../src/tracing/trace_provider.ts"],"sourcesContent":["import { Component, Inject, LoadAs, Provider, SCOPED_CONTAINER, type IContainer } from '@noego/ioc';\nimport type { Observable } from 'rxjs';\nimport {\n emitRendererTrace,\n getTraceEvents$,\n publishMainTrace,\n publishTestTrace,\n setMainTraceMinLevel,\n setRendererTraceEnabled,\n setRendererTraceMinLevel,\n type TraceEvent,\n type TraceInput,\n type TraceLevel,\n type TraceProcess,\n} from './trace_hub.js';\n\nexport type TraceProviderMode = 'live' | 'test';\nexport type TraceRuntime = 'main' | 'renderer' | 'test';\nexport type TraceContext = Partial<TraceInput>;\n\nexport abstract class FrameworkTracer {\n abstract readonly mode: TraceProviderMode;\n abstract readonly process: TraceProcess;\n abstract readonly events$: Observable<TraceEvent>;\n abstract debug(event: TraceInput): void;\n abstract info(event: TraceInput): void;\n abstract warn(event: TraceInput): void;\n abstract error(event: TraceInput): void;\n\n extend(context: TraceContext): FrameworkTracer {\n return new ContextualTracer(this, context);\n }\n}\n\nclass ContextualTracer extends FrameworkTracer {\n constructor(\n private readonly parent: FrameworkTracer,\n private readonly context: TraceContext,\n ) {\n super();\n }\n\n get mode(): TraceProviderMode {\n return this.parent.mode;\n }\n\n get process(): TraceProcess {\n return this.parent.process;\n }\n\n get events$(): Observable<TraceEvent> {\n return this.parent.events$;\n }\n\n debug(event: TraceInput): void {\n this.parent.debug(this.mergeEvent(event));\n }\n\n info(event: TraceInput): void {\n this.parent.info(this.mergeEvent(event));\n }\n\n warn(event: TraceInput): void {\n this.parent.warn(this.mergeEvent(event));\n }\n\n error(event: TraceInput): void {\n this.parent.error(this.mergeEvent(event));\n }\n\n private mergeEvent(event: TraceInput): TraceInput {\n return {\n ...this.context,\n ...event,\n };\n }\n}\n\n@Component({ scope: LoadAs.Singleton })\nexport class TraceProviderConfiguration {\n private mode: TraceProviderMode = 'live';\n private runtime: TraceRuntime = 'main';\n private minLevel: TraceLevel = 'debug';\n private enabled: boolean | null = null;\n\n configureMode(mode: TraceProviderMode): void {\n this.mode = mode;\n }\n\n configureRuntime(runtime: TraceRuntime): void {\n this.runtime = runtime;\n this.applyRuntimeConfiguration();\n }\n\n configureMinLevel(level: TraceLevel): void {\n this.minLevel = level;\n this.applyRuntimeConfiguration();\n }\n\n configureEnabled(enabled: boolean): void {\n this.enabled = enabled;\n this.applyRuntimeConfiguration();\n }\n\n getMode(): TraceProviderMode {\n return this.mode;\n }\n\n getRuntime(): TraceRuntime {\n return this.runtime;\n }\n\n getMinLevel(): TraceLevel {\n return this.minLevel;\n }\n\n getEnabled(): boolean {\n return this.enabled ?? (this.runtime === 'renderer' ? false : true);\n }\n\n private applyRuntimeConfiguration(): void {\n if (this.runtime === 'renderer') {\n setRendererTraceEnabled(this.getEnabled());\n setRendererTraceMinLevel(this.minLevel);\n return;\n }\n\n setMainTraceMinLevel(this.minLevel);\n }\n}\n\n@Component({ scope: LoadAs.Singleton })\nexport class MainTracer extends FrameworkTracer {\n readonly mode = 'live' as const;\n readonly process = 'main' as const;\n readonly events$ = getTraceEvents$();\n\n debug(event: TraceInput): void {\n publishMainTrace('debug', event);\n }\n\n info(event: TraceInput): void {\n publishMainTrace('info', event);\n }\n\n warn(event: TraceInput): void {\n publishMainTrace('warn', event);\n }\n\n error(event: TraceInput): void {\n publishMainTrace('error', event);\n }\n}\n\n@Component({ scope: LoadAs.Singleton })\nexport class RendererTracer extends FrameworkTracer {\n readonly mode = 'live' as const;\n readonly process = 'renderer' as const;\n readonly events$ = getTraceEvents$();\n\n debug(event: TraceInput): void {\n emitRendererTrace('debug', event);\n }\n\n info(event: TraceInput): void {\n emitRendererTrace('info', event);\n }\n\n warn(event: TraceInput): void {\n emitRendererTrace('warn', event);\n }\n\n error(event: TraceInput): void {\n emitRendererTrace('error', event);\n }\n}\n\n@Component({ scope: LoadAs.Singleton })\nexport class TestTracer extends FrameworkTracer {\n readonly mode = 'test' as const;\n readonly events$ = getTraceEvents$();\n\n constructor(\n @Inject(TraceProviderConfiguration) private readonly configuration: TraceProviderConfiguration,\n ) {\n super();\n }\n\n get process(): TraceProcess {\n const runtime = this.configuration.getRuntime();\n if (runtime === 'renderer') return 'renderer';\n if (runtime === 'main') return 'main';\n return 'test';\n }\n\n debug(event: TraceInput): void {\n this.publish('debug', event);\n }\n\n info(event: TraceInput): void {\n this.publish('info', event);\n }\n\n warn(event: TraceInput): void {\n this.publish('warn', event);\n }\n\n error(event: TraceInput): void {\n this.publish('error', event);\n }\n\n private publish(level: TraceLevel, event: TraceInput): void {\n publishTestTrace(this.process, level, event);\n }\n}\n\n@Provider()\nexport class TraceProvider extends FrameworkTracer {\n constructor(\n @Inject(TraceProviderConfiguration) private readonly configuration: TraceProviderConfiguration,\n @Inject(SCOPED_CONTAINER) private readonly container: IContainer,\n ) {\n super();\n }\n\n get mode(): TraceProviderMode {\n return this.resolveImplementation().mode;\n }\n\n get process(): TraceProcess {\n return this.resolveImplementation().process;\n }\n\n get events$(): Observable<TraceEvent> {\n return this.resolveImplementation().events$;\n }\n\n debug(event: TraceInput): void {\n this.resolveImplementation().debug(event);\n }\n\n info(event: TraceInput): void {\n this.resolveImplementation().info(event);\n }\n\n warn(event: TraceInput): void {\n this.resolveImplementation().warn(event);\n }\n\n error(event: TraceInput): void {\n this.resolveImplementation().error(event);\n }\n\n private resolveImplementation(): FrameworkTracer {\n const mode = this.configuration.getMode();\n if (mode === 'test') {\n return this.resolveSync(TestTracer);\n }\n\n if (this.configuration.getRuntime() === 'renderer') {\n return this.resolveSync(RendererTracer);\n }\n\n return this.resolveSync(MainTracer);\n }\n\n private resolveSync<T>(token: new (...args: any[]) => T): T {\n const resolved = this.container.instance<T, true>(token);\n if (resolved instanceof Promise) {\n throw new Error(`${token.name} must resolve synchronously`);\n }\n return resolved;\n }\n}\n"],"mappings":"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","names":[]}
@@ -1,4 +1,4 @@
1
- import { TraceProcess, TraceEvent, TraceInput, TraceCaptureOptions, TraceCapture, TraceLevel } from './trace_hub.cjs';
1
+ import { TraceProcess, TraceEvent, TraceInput, TraceLevel } from './trace_hub.cjs';
2
2
  import { IContainer } from '@noego/ioc';
3
3
  import { Observable } from 'rxjs';
4
4
 
@@ -14,7 +14,6 @@ declare abstract class FrameworkTracer {
14
14
  abstract warn(event: TraceInput): void;
15
15
  abstract error(event: TraceInput): void;
16
16
  extend(context: TraceContext): FrameworkTracer;
17
- capture(options?: TraceCaptureOptions): TraceCapture;
18
17
  }
19
18
  declare class TraceProviderConfiguration {
20
19
  private mode;
@@ -72,7 +71,6 @@ declare class TraceProvider extends FrameworkTracer {
72
71
  info(event: TraceInput): void;
73
72
  warn(event: TraceInput): void;
74
73
  error(event: TraceInput): void;
75
- capture(options?: TraceCaptureOptions): TraceCapture;
76
74
  private resolveImplementation;
77
75
  private resolveSync;
78
76
  }
@@ -1,4 +1,4 @@
1
- import { TraceProcess, TraceEvent, TraceInput, TraceCaptureOptions, TraceCapture, TraceLevel } from './trace_hub.js';
1
+ import { TraceProcess, TraceEvent, TraceInput, TraceLevel } from './trace_hub.js';
2
2
  import { IContainer } from '@noego/ioc';
3
3
  import { Observable } from 'rxjs';
4
4
 
@@ -14,7 +14,6 @@ declare abstract class FrameworkTracer {
14
14
  abstract warn(event: TraceInput): void;
15
15
  abstract error(event: TraceInput): void;
16
16
  extend(context: TraceContext): FrameworkTracer;
17
- capture(options?: TraceCaptureOptions): TraceCapture;
18
17
  }
19
18
  declare class TraceProviderConfiguration {
20
19
  private mode;
@@ -72,7 +71,6 @@ declare class TraceProvider extends FrameworkTracer {
72
71
  info(event: TraceInput): void;
73
72
  warn(event: TraceInput): void;
74
73
  error(event: TraceInput): void;
75
- capture(options?: TraceCaptureOptions): TraceCapture;
76
74
  private resolveImplementation;
77
75
  private resolveSync;
78
76
  }
@@ -11,7 +11,6 @@ var __decorateClass = (decorators, target, key, kind) => {
11
11
  var __decorateParam = (index, decorator) => (target, key) => decorator(target, key, index);
12
12
  import { Component, Inject, LoadAs, Provider, SCOPED_CONTAINER } from "@noego/ioc";
13
13
  import {
14
- createTraceCapture,
15
14
  emitRendererTrace,
16
15
  getTraceEvents$,
17
16
  publishMainTrace,
@@ -24,9 +23,6 @@ class FrameworkTracer {
24
23
  extend(context) {
25
24
  return new ContextualTracer(this, context);
26
25
  }
27
- capture(options = {}) {
28
- return createTraceCapture(options);
29
- }
30
26
  }
31
27
  class ContextualTracer extends FrameworkTracer {
32
28
  constructor(parent, context) {
@@ -214,9 +210,6 @@ let TraceProvider = class extends FrameworkTracer {
214
210
  error(event) {
215
211
  this.resolveImplementation().error(event);
216
212
  }
217
- capture(options = {}) {
218
- return this.resolveImplementation().capture(options);
219
- }
220
213
  resolveImplementation() {
221
214
  const mode = this.configuration.getMode();
222
215
  if (mode === "test") {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/tracing/trace_provider.ts"],"sourcesContent":["import { Component, Inject, LoadAs, Provider, SCOPED_CONTAINER, type IContainer } from '@noego/ioc';\nimport type { Observable } from 'rxjs';\nimport {\n createTraceCapture,\n emitRendererTrace,\n getTraceEvents$,\n publishMainTrace,\n publishTestTrace,\n setMainTraceMinLevel,\n setRendererTraceEnabled,\n setRendererTraceMinLevel,\n type TraceCapture,\n type TraceCaptureOptions,\n type TraceEvent,\n type TraceInput,\n type TraceLevel,\n type TraceProcess,\n} from './trace_hub.js';\n\nexport type TraceProviderMode = 'live' | 'test';\nexport type TraceRuntime = 'main' | 'renderer' | 'test';\nexport type TraceContext = Partial<TraceInput>;\n\nexport abstract class FrameworkTracer {\n abstract readonly mode: TraceProviderMode;\n abstract readonly process: TraceProcess;\n abstract readonly events$: Observable<TraceEvent>;\n abstract debug(event: TraceInput): void;\n abstract info(event: TraceInput): void;\n abstract warn(event: TraceInput): void;\n abstract error(event: TraceInput): void;\n\n extend(context: TraceContext): FrameworkTracer {\n return new ContextualTracer(this, context);\n }\n\n capture(options: TraceCaptureOptions = {}): TraceCapture {\n return createTraceCapture(options);\n }\n}\n\nclass ContextualTracer extends FrameworkTracer {\n constructor(\n private readonly parent: FrameworkTracer,\n private readonly context: TraceContext,\n ) {\n super();\n }\n\n get mode(): TraceProviderMode {\n return this.parent.mode;\n }\n\n get process(): TraceProcess {\n return this.parent.process;\n }\n\n get events$(): Observable<TraceEvent> {\n return this.parent.events$;\n }\n\n debug(event: TraceInput): void {\n this.parent.debug(this.mergeEvent(event));\n }\n\n info(event: TraceInput): void {\n this.parent.info(this.mergeEvent(event));\n }\n\n warn(event: TraceInput): void {\n this.parent.warn(this.mergeEvent(event));\n }\n\n error(event: TraceInput): void {\n this.parent.error(this.mergeEvent(event));\n }\n\n private mergeEvent(event: TraceInput): TraceInput {\n return {\n ...this.context,\n ...event,\n };\n }\n}\n\n@Component({ scope: LoadAs.Singleton })\nexport class TraceProviderConfiguration {\n private mode: TraceProviderMode = 'live';\n private runtime: TraceRuntime = 'main';\n private minLevel: TraceLevel = 'debug';\n private enabled: boolean | null = null;\n\n configureMode(mode: TraceProviderMode): void {\n this.mode = mode;\n }\n\n configureRuntime(runtime: TraceRuntime): void {\n this.runtime = runtime;\n this.applyRuntimeConfiguration();\n }\n\n configureMinLevel(level: TraceLevel): void {\n this.minLevel = level;\n this.applyRuntimeConfiguration();\n }\n\n configureEnabled(enabled: boolean): void {\n this.enabled = enabled;\n this.applyRuntimeConfiguration();\n }\n\n getMode(): TraceProviderMode {\n return this.mode;\n }\n\n getRuntime(): TraceRuntime {\n return this.runtime;\n }\n\n getMinLevel(): TraceLevel {\n return this.minLevel;\n }\n\n getEnabled(): boolean {\n return this.enabled ?? (this.runtime === 'renderer' ? false : true);\n }\n\n private applyRuntimeConfiguration(): void {\n if (this.runtime === 'renderer') {\n setRendererTraceEnabled(this.getEnabled());\n setRendererTraceMinLevel(this.minLevel);\n return;\n }\n\n setMainTraceMinLevel(this.minLevel);\n }\n}\n\n@Component({ scope: LoadAs.Singleton })\nexport class MainTracer extends FrameworkTracer {\n readonly mode = 'live' as const;\n readonly process = 'main' as const;\n readonly events$ = getTraceEvents$();\n\n debug(event: TraceInput): void {\n publishMainTrace('debug', event);\n }\n\n info(event: TraceInput): void {\n publishMainTrace('info', event);\n }\n\n warn(event: TraceInput): void {\n publishMainTrace('warn', event);\n }\n\n error(event: TraceInput): void {\n publishMainTrace('error', event);\n }\n}\n\n@Component({ scope: LoadAs.Singleton })\nexport class RendererTracer extends FrameworkTracer {\n readonly mode = 'live' as const;\n readonly process = 'renderer' as const;\n readonly events$ = getTraceEvents$();\n\n debug(event: TraceInput): void {\n emitRendererTrace('debug', event);\n }\n\n info(event: TraceInput): void {\n emitRendererTrace('info', event);\n }\n\n warn(event: TraceInput): void {\n emitRendererTrace('warn', event);\n }\n\n error(event: TraceInput): void {\n emitRendererTrace('error', event);\n }\n}\n\n@Component({ scope: LoadAs.Singleton })\nexport class TestTracer extends FrameworkTracer {\n readonly mode = 'test' as const;\n readonly events$ = getTraceEvents$();\n\n constructor(\n @Inject(TraceProviderConfiguration) private readonly configuration: TraceProviderConfiguration,\n ) {\n super();\n }\n\n get process(): TraceProcess {\n const runtime = this.configuration.getRuntime();\n if (runtime === 'renderer') return 'renderer';\n if (runtime === 'main') return 'main';\n return 'test';\n }\n\n debug(event: TraceInput): void {\n this.publish('debug', event);\n }\n\n info(event: TraceInput): void {\n this.publish('info', event);\n }\n\n warn(event: TraceInput): void {\n this.publish('warn', event);\n }\n\n error(event: TraceInput): void {\n this.publish('error', event);\n }\n\n private publish(level: TraceLevel, event: TraceInput): void {\n publishTestTrace(this.process, level, event);\n }\n}\n\n@Provider()\nexport class TraceProvider extends FrameworkTracer {\n constructor(\n @Inject(TraceProviderConfiguration) private readonly configuration: TraceProviderConfiguration,\n @Inject(SCOPED_CONTAINER) private readonly container: IContainer,\n ) {\n super();\n }\n\n get mode(): TraceProviderMode {\n return this.resolveImplementation().mode;\n }\n\n get process(): TraceProcess {\n return this.resolveImplementation().process;\n }\n\n get events$(): Observable<TraceEvent> {\n return this.resolveImplementation().events$;\n }\n\n debug(event: TraceInput): void {\n this.resolveImplementation().debug(event);\n }\n\n info(event: TraceInput): void {\n this.resolveImplementation().info(event);\n }\n\n warn(event: TraceInput): void {\n this.resolveImplementation().warn(event);\n }\n\n error(event: TraceInput): void {\n this.resolveImplementation().error(event);\n }\n\n capture(options: TraceCaptureOptions = {}): TraceCapture {\n return this.resolveImplementation().capture(options);\n }\n\n private resolveImplementation(): FrameworkTracer {\n const mode = this.configuration.getMode();\n if (mode === 'test') {\n return this.resolveSync(TestTracer);\n }\n\n if (this.configuration.getRuntime() === 'renderer') {\n return this.resolveSync(RendererTracer);\n }\n\n return this.resolveSync(MainTracer);\n }\n\n private resolveSync<T>(token: new (...args: any[]) => T): T {\n const resolved = this.container.instance<T, true>(token);\n if (resolved instanceof Promise) {\n throw new Error(`${token.name} must resolve synchronously`);\n }\n return resolved;\n }\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../src/tracing/trace_provider.ts"],"sourcesContent":["import { Component, Inject, LoadAs, Provider, SCOPED_CONTAINER, type IContainer } from '@noego/ioc';\nimport type { Observable } from 'rxjs';\nimport {\n emitRendererTrace,\n getTraceEvents$,\n publishMainTrace,\n publishTestTrace,\n setMainTraceMinLevel,\n setRendererTraceEnabled,\n setRendererTraceMinLevel,\n type TraceEvent,\n type TraceInput,\n type TraceLevel,\n type TraceProcess,\n} from './trace_hub.js';\n\nexport type TraceProviderMode = 'live' | 'test';\nexport type TraceRuntime = 'main' | 'renderer' | 'test';\nexport type TraceContext = Partial<TraceInput>;\n\nexport abstract class FrameworkTracer {\n abstract readonly mode: TraceProviderMode;\n abstract readonly process: TraceProcess;\n abstract readonly events$: Observable<TraceEvent>;\n abstract debug(event: TraceInput): void;\n abstract info(event: TraceInput): void;\n abstract warn(event: TraceInput): void;\n abstract error(event: TraceInput): void;\n\n extend(context: TraceContext): FrameworkTracer {\n return new ContextualTracer(this, context);\n }\n}\n\nclass ContextualTracer extends FrameworkTracer {\n constructor(\n private readonly parent: FrameworkTracer,\n private readonly context: TraceContext,\n ) {\n super();\n }\n\n get mode(): TraceProviderMode {\n return this.parent.mode;\n }\n\n get process(): TraceProcess {\n return this.parent.process;\n }\n\n get events$(): Observable<TraceEvent> {\n return this.parent.events$;\n }\n\n debug(event: TraceInput): void {\n this.parent.debug(this.mergeEvent(event));\n }\n\n info(event: TraceInput): void {\n this.parent.info(this.mergeEvent(event));\n }\n\n warn(event: TraceInput): void {\n this.parent.warn(this.mergeEvent(event));\n }\n\n error(event: TraceInput): void {\n this.parent.error(this.mergeEvent(event));\n }\n\n private mergeEvent(event: TraceInput): TraceInput {\n return {\n ...this.context,\n ...event,\n };\n }\n}\n\n@Component({ scope: LoadAs.Singleton })\nexport class TraceProviderConfiguration {\n private mode: TraceProviderMode = 'live';\n private runtime: TraceRuntime = 'main';\n private minLevel: TraceLevel = 'debug';\n private enabled: boolean | null = null;\n\n configureMode(mode: TraceProviderMode): void {\n this.mode = mode;\n }\n\n configureRuntime(runtime: TraceRuntime): void {\n this.runtime = runtime;\n this.applyRuntimeConfiguration();\n }\n\n configureMinLevel(level: TraceLevel): void {\n this.minLevel = level;\n this.applyRuntimeConfiguration();\n }\n\n configureEnabled(enabled: boolean): void {\n this.enabled = enabled;\n this.applyRuntimeConfiguration();\n }\n\n getMode(): TraceProviderMode {\n return this.mode;\n }\n\n getRuntime(): TraceRuntime {\n return this.runtime;\n }\n\n getMinLevel(): TraceLevel {\n return this.minLevel;\n }\n\n getEnabled(): boolean {\n return this.enabled ?? (this.runtime === 'renderer' ? false : true);\n }\n\n private applyRuntimeConfiguration(): void {\n if (this.runtime === 'renderer') {\n setRendererTraceEnabled(this.getEnabled());\n setRendererTraceMinLevel(this.minLevel);\n return;\n }\n\n setMainTraceMinLevel(this.minLevel);\n }\n}\n\n@Component({ scope: LoadAs.Singleton })\nexport class MainTracer extends FrameworkTracer {\n readonly mode = 'live' as const;\n readonly process = 'main' as const;\n readonly events$ = getTraceEvents$();\n\n debug(event: TraceInput): void {\n publishMainTrace('debug', event);\n }\n\n info(event: TraceInput): void {\n publishMainTrace('info', event);\n }\n\n warn(event: TraceInput): void {\n publishMainTrace('warn', event);\n }\n\n error(event: TraceInput): void {\n publishMainTrace('error', event);\n }\n}\n\n@Component({ scope: LoadAs.Singleton })\nexport class RendererTracer extends FrameworkTracer {\n readonly mode = 'live' as const;\n readonly process = 'renderer' as const;\n readonly events$ = getTraceEvents$();\n\n debug(event: TraceInput): void {\n emitRendererTrace('debug', event);\n }\n\n info(event: TraceInput): void {\n emitRendererTrace('info', event);\n }\n\n warn(event: TraceInput): void {\n emitRendererTrace('warn', event);\n }\n\n error(event: TraceInput): void {\n emitRendererTrace('error', event);\n }\n}\n\n@Component({ scope: LoadAs.Singleton })\nexport class TestTracer extends FrameworkTracer {\n readonly mode = 'test' as const;\n readonly events$ = getTraceEvents$();\n\n constructor(\n @Inject(TraceProviderConfiguration) private readonly configuration: TraceProviderConfiguration,\n ) {\n super();\n }\n\n get process(): TraceProcess {\n const runtime = this.configuration.getRuntime();\n if (runtime === 'renderer') return 'renderer';\n if (runtime === 'main') return 'main';\n return 'test';\n }\n\n debug(event: TraceInput): void {\n this.publish('debug', event);\n }\n\n info(event: TraceInput): void {\n this.publish('info', event);\n }\n\n warn(event: TraceInput): void {\n this.publish('warn', event);\n }\n\n error(event: TraceInput): void {\n this.publish('error', event);\n }\n\n private publish(level: TraceLevel, event: TraceInput): void {\n publishTestTrace(this.process, level, event);\n }\n}\n\n@Provider()\nexport class TraceProvider extends FrameworkTracer {\n constructor(\n @Inject(TraceProviderConfiguration) private readonly configuration: TraceProviderConfiguration,\n @Inject(SCOPED_CONTAINER) private readonly container: IContainer,\n ) {\n super();\n }\n\n get mode(): TraceProviderMode {\n return this.resolveImplementation().mode;\n }\n\n get process(): TraceProcess {\n return this.resolveImplementation().process;\n }\n\n get events$(): Observable<TraceEvent> {\n return this.resolveImplementation().events$;\n }\n\n debug(event: TraceInput): void {\n this.resolveImplementation().debug(event);\n }\n\n info(event: TraceInput): void {\n this.resolveImplementation().info(event);\n }\n\n warn(event: TraceInput): void {\n this.resolveImplementation().warn(event);\n }\n\n error(event: TraceInput): void {\n this.resolveImplementation().error(event);\n }\n\n private resolveImplementation(): FrameworkTracer {\n const mode = this.configuration.getMode();\n if (mode === 'test') {\n return this.resolveSync(TestTracer);\n }\n\n if (this.configuration.getRuntime() === 'renderer') {\n return this.resolveSync(RendererTracer);\n }\n\n return this.resolveSync(MainTracer);\n }\n\n private resolveSync<T>(token: new (...args: any[]) => T): T {\n const resolved = this.container.instance<T, true>(token);\n if (resolved instanceof Promise) {\n throw new Error(`${token.name} must resolve synchronously`);\n }\n return resolved;\n }\n}\n"],"mappings":"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","names":[]}