@noego/wood 0.5.0 → 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (142) hide show
  1. package/README.md +31 -0
  2. package/dist/client/index.cjs +18 -11
  3. package/dist/client/index.cjs.map +1 -1
  4. package/dist/client/index.d.cts +21 -1
  5. package/dist/client/index.d.ts +21 -1
  6. package/dist/client/index.js +17 -11
  7. package/dist/client/index.js.map +1 -1
  8. package/dist/codegen/renderer_app_generator.cjs +2 -9
  9. package/dist/codegen/renderer_app_generator.cjs.map +1 -1
  10. package/dist/codegen/renderer_app_generator.js +2 -9
  11. package/dist/codegen/renderer_app_generator.js.map +1 -1
  12. package/dist/controller/cleanup.cjs +39 -0
  13. package/dist/controller/cleanup.cjs.map +1 -0
  14. package/dist/controller/cleanup.d.cts +4 -0
  15. package/dist/controller/cleanup.d.ts +4 -0
  16. package/dist/controller/cleanup.js +15 -0
  17. package/dist/controller/cleanup.js.map +1 -0
  18. package/dist/controller/controller_lifecycle.cjs +26 -2
  19. package/dist/controller/controller_lifecycle.cjs.map +1 -1
  20. package/dist/controller/controller_lifecycle.d.cts +3 -1
  21. package/dist/controller/controller_lifecycle.d.ts +3 -1
  22. package/dist/controller/controller_lifecycle.js +24 -1
  23. package/dist/controller/controller_lifecycle.js.map +1 -1
  24. package/dist/frontend/frontend_lifecycle.cjs +5 -7
  25. package/dist/frontend/frontend_lifecycle.cjs.map +1 -1
  26. package/dist/frontend/frontend_lifecycle.d.cts +1 -14
  27. package/dist/frontend/frontend_lifecycle.d.ts +1 -14
  28. package/dist/frontend/frontend_lifecycle.js +5 -7
  29. package/dist/frontend/frontend_lifecycle.js.map +1 -1
  30. package/dist/frontend/frontend_surface.cjs +130 -104
  31. package/dist/frontend/frontend_surface.cjs.map +1 -1
  32. package/dist/frontend/frontend_surface.js +131 -105
  33. package/dist/frontend/frontend_surface.js.map +1 -1
  34. package/dist/frontend/work_registry.cjs +29 -4
  35. package/dist/frontend/work_registry.cjs.map +1 -1
  36. package/dist/frontend/work_registry.d.cts +2 -0
  37. package/dist/frontend/work_registry.d.ts +2 -0
  38. package/dist/frontend/work_registry.js +29 -4
  39. package/dist/frontend/work_registry.js.map +1 -1
  40. package/dist/index.d.cts +2 -0
  41. package/dist/index.d.ts +2 -0
  42. package/dist/ipc/index.cjs +6 -2
  43. package/dist/ipc/index.cjs.map +1 -1
  44. package/dist/ipc/index.d.cts +9 -0
  45. package/dist/ipc/index.d.ts +9 -0
  46. package/dist/ipc/index.js +6 -2
  47. package/dist/ipc/index.js.map +1 -1
  48. package/dist/main/index.cjs +53 -35
  49. package/dist/main/index.cjs.map +1 -1
  50. package/dist/main/index.d.cts +11 -2
  51. package/dist/main/index.d.ts +11 -2
  52. package/dist/main/index.js +56 -40
  53. package/dist/main/index.js.map +1 -1
  54. package/dist/main/startup_failure_handler.cjs +67 -0
  55. package/dist/main/startup_failure_handler.cjs.map +1 -0
  56. package/dist/main/startup_failure_handler.d.cts +16 -0
  57. package/dist/main/startup_failure_handler.d.ts +16 -0
  58. package/dist/main/startup_failure_handler.js +43 -0
  59. package/dist/main/startup_failure_handler.js.map +1 -0
  60. package/dist/router/index.d.cts +3 -0
  61. package/dist/router/index.d.ts +3 -0
  62. package/dist/router/wood_router.cjs +204 -123
  63. package/dist/router/wood_router.cjs.map +1 -1
  64. package/dist/router/wood_router.d.cts +20 -0
  65. package/dist/router/wood_router.d.ts +20 -0
  66. package/dist/router/wood_router.js +206 -125
  67. package/dist/router/wood_router.js.map +1 -1
  68. package/dist/runtime/index.cjs +13 -0
  69. package/dist/runtime/index.cjs.map +1 -1
  70. package/dist/runtime/index.d.cts +8 -4
  71. package/dist/runtime/index.d.ts +8 -4
  72. package/dist/runtime/index.js +8 -0
  73. package/dist/runtime/index.js.map +1 -1
  74. package/dist/runtime/renderer_config_extension.cjs +1 -2
  75. package/dist/runtime/renderer_config_extension.cjs.map +1 -1
  76. package/dist/runtime/renderer_config_extension.d.cts +1 -1
  77. package/dist/runtime/renderer_config_extension.d.ts +1 -1
  78. package/dist/runtime/renderer_config_extension.js +1 -2
  79. package/dist/runtime/renderer_config_extension.js.map +1 -1
  80. package/dist/runtime/renderer_log_dispatcher.cjs +2 -0
  81. package/dist/runtime/renderer_log_dispatcher.cjs.map +1 -1
  82. package/dist/runtime/renderer_log_dispatcher.d.cts +1 -1
  83. package/dist/runtime/renderer_log_dispatcher.d.ts +1 -1
  84. package/dist/runtime/renderer_log_dispatcher.js +1 -0
  85. package/dist/runtime/renderer_log_dispatcher.js.map +1 -1
  86. package/dist/runtime/runtime.cjs +107 -57
  87. package/dist/runtime/runtime.cjs.map +1 -1
  88. package/dist/runtime/runtime.d.cts +12 -0
  89. package/dist/runtime/runtime.d.ts +12 -0
  90. package/dist/runtime/runtime.js +110 -59
  91. package/dist/runtime/runtime.js.map +1 -1
  92. package/dist/runtime/runtime_module.cjs +58 -0
  93. package/dist/runtime/runtime_module.cjs.map +1 -0
  94. package/dist/runtime/runtime_module.d.cts +22 -0
  95. package/dist/runtime/runtime_module.d.ts +22 -0
  96. package/dist/runtime/runtime_module.js +30 -0
  97. package/dist/runtime/runtime_module.js.map +1 -0
  98. package/dist/testing/create_controller_harness.d.cts +3 -0
  99. package/dist/testing/create_controller_harness.d.ts +3 -0
  100. package/dist/testing/create_router_bridge.d.cts +3 -0
  101. package/dist/testing/create_router_bridge.d.ts +3 -0
  102. package/dist/testing/create_test_router.d.cts +3 -0
  103. package/dist/testing/create_test_router.d.ts +3 -0
  104. package/dist/testing/index.cjs +3 -0
  105. package/dist/testing/index.cjs.map +1 -1
  106. package/dist/testing/index.d.cts +6 -1
  107. package/dist/testing/index.d.ts +6 -1
  108. package/dist/testing/index.js +2 -0
  109. package/dist/testing/index.js.map +1 -1
  110. package/dist/testing/registration_only_root.cjs +168 -0
  111. package/dist/testing/registration_only_root.cjs.map +1 -0
  112. package/dist/testing/registration_only_root.d.cts +46 -0
  113. package/dist/testing/registration_only_root.d.ts +46 -0
  114. package/dist/testing/registration_only_root.js +141 -0
  115. package/dist/testing/registration_only_root.js.map +1 -0
  116. package/dist/testing/test_wood_config.cjs +382 -70
  117. package/dist/testing/test_wood_config.cjs.map +1 -1
  118. package/dist/testing/test_wood_config.d.cts +25 -1
  119. package/dist/testing/test_wood_config.d.ts +25 -1
  120. package/dist/testing/test_wood_config.js +388 -71
  121. package/dist/testing/test_wood_config.js.map +1 -1
  122. package/dist/testing/wood_dom_animation.cjs +213 -0
  123. package/dist/testing/wood_dom_animation.cjs.map +1 -0
  124. package/dist/testing/wood_dom_animation.d.cts +89 -0
  125. package/dist/testing/wood_dom_animation.d.ts +89 -0
  126. package/dist/testing/wood_dom_animation.js +185 -0
  127. package/dist/testing/wood_dom_animation.js.map +1 -0
  128. package/dist/testing/wood_env_renderer.cjs +81 -32
  129. package/dist/testing/wood_env_renderer.cjs.map +1 -1
  130. package/dist/testing/wood_env_renderer.d.cts +32 -1
  131. package/dist/testing/wood_env_renderer.d.ts +32 -1
  132. package/dist/testing/wood_env_renderer.js +84 -32
  133. package/dist/testing/wood_env_renderer.js.map +1 -1
  134. package/dist/transport/in_process_router_transport.d.cts +3 -0
  135. package/dist/transport/in_process_router_transport.d.ts +3 -0
  136. package/dist/transport/index.d.cts +3 -0
  137. package/dist/transport/index.d.ts +3 -0
  138. package/package.json +8 -6
  139. package/src/components/NavigationShell.svelte +12 -7
  140. package/src/controller/cleanup.ts +8 -0
  141. package/src/controller/controller_lifecycle.ts +24 -0
  142. package/src/navigation/layout_preservation.ts +45 -0
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/runtime/index.ts"],"sourcesContent":["export { createWoodRoot, getContainer, clearContainerRegistryForTests } from './get_container.js';\nexport type { GetContainerOptions, CreateWoodRootOptions } from './get_container.js';\n\nexport {\n getApplicationRoot,\n setApplicationRoot,\n clearApplicationRootForTests,\n} from './application_root.js';\n\nexport { runtime } from './runtime.js';\nexport type { RuntimeOptions, RuntimeResult, RegisterRuntimeRouter } from './runtime.js';\n\nexport {\n getRendererLogDispatcher,\n clearRendererLogDispatcherForTests,\n} from './renderer_log_dispatcher.js';\nexport type {\n RendererLogLevel,\n RendererLogEntry,\n RendererLogCallback,\n RendererLogDispatchResult,\n} from './renderer_log_dispatcher.js';\n\nexport {\n clearRendererTraceBatchReceiverForTests,\n getRendererTraceBatchReceiver,\n setRendererTraceBatchReceiver,\n} from './renderer_trace_batch_receiver_registry.js';\n\nexport {\n getRendererConfigExtension,\n resolveRendererConfigExtension,\n setRendererConfigExtension,\n} from './renderer_config_extension.js';\nexport type { RendererConfigExtension } from './renderer_config_extension.js';\n\nexport { dispatchRendererTracePayload } from '../tracing/index.js';\nexport type { TraceDispatchResult } from '../tracing/index.js';\n"],"mappings":"AAAA,SAAS,gBAAgB,cAAc,sCAAsC;AAG7E;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAEP,SAAS,eAAe;AAGxB;AAAA,EACE;AAAA,EACA;AAAA,OACK;AAQP;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAEP;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAGP,SAAS,oCAAoC;","names":[]}
1
+ {"version":3,"sources":["../../src/runtime/index.ts"],"sourcesContent":["export { createWoodRoot, getContainer, clearContainerRegistryForTests } from './get_container.js';\nexport type { GetContainerOptions, CreateWoodRootOptions } from './get_container.js';\n\nexport {\n getApplicationRoot,\n setApplicationRoot,\n clearApplicationRootForTests,\n} from './application_root.js';\n\nexport { runtime } from './runtime.js';\nexport type { RuntimeOptions, RuntimeResult, RegisterRuntimeRouter } from './runtime.js';\n\nexport {\n getRendererLogDispatcher,\n RendererLogDispatcher,\n clearRendererLogDispatcherForTests,\n} from './renderer_log_dispatcher.js';\nexport type {\n RendererLogLevel,\n RendererLogEntry,\n RendererLogCallback,\n RendererLogDispatchResult,\n} from './renderer_log_dispatcher.js';\n\nexport {\n clearRendererTraceBatchReceiverForTests,\n getRendererTraceBatchReceiver,\n setRendererTraceBatchReceiver,\n} from './renderer_trace_batch_receiver_registry.js';\n\nexport {\n getRendererConfigExtension,\n resolveRendererConfigExtension,\n setRendererConfigExtension,\n} from './renderer_config_extension.js';\nexport type { RendererConfigExtension } from './renderer_config_extension.js';\n\nexport { dispatchRendererTracePayload } from '../tracing/index.js';\nexport type { TraceDispatchResult } from '../tracing/index.js';\n\nexport { installWoodRuntime, WoodRouter, SchemaValidator, MiddlewareResolver, ControllerResolver } from './runtime_module.js';\nexport type { WoodRuntimeModuleOptions } from './runtime_module.js';\n"],"mappings":"AAAA,SAAS,gBAAgB,cAAc,sCAAsC;AAG7E;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAEP,SAAS,eAAe;AAGxB;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAQP;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAEP;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAGP,SAAS,oCAAoC;AAG7C,SAAS,oBAAoB,YAAY,iBAAiB,oBAAoB,0BAA0B;","names":[]}
@@ -30,8 +30,7 @@ function setRendererConfigExtension(extension) {
30
30
  function getRendererConfigExtension() {
31
31
  return globalThis[EXTENSION_SYMBOL] ?? null;
32
32
  }
33
- async function resolveRendererConfigExtension() {
34
- const extension = getRendererConfigExtension();
33
+ async function resolveRendererConfigExtension(extension = getRendererConfigExtension()) {
35
34
  if (!extension) return {};
36
35
  try {
37
36
  const value = await extension();
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/runtime/renderer_config_extension.ts"],"sourcesContent":["const EXTENSION_SYMBOL = Symbol.for('@noego/wood.runtime.renderer-config-extension');\n\n/**\n * App-supplied provider of extra fields merged into the `__woodConfig` payload\n * the renderer fetches at boot. Lets the main process hand renderers boot-time\n * facts Wood itself knows nothing about — e.g. the loopback port and per-boot\n * token of an external log sink — without a new IPC channel or preload method.\n *\n * Reserved Wood keys (rendererTrace*, appEnv) always win over extension keys.\n */\nexport type RendererConfigExtension = () =>\n | Readonly<Record<string, unknown>>\n | Promise<Readonly<Record<string, unknown>>>;\n\ntype GlobalWithExtension = typeof globalThis & {\n [EXTENSION_SYMBOL]?: RendererConfigExtension | null;\n};\n\nexport function setRendererConfigExtension(extension: RendererConfigExtension | null): void {\n (globalThis as GlobalWithExtension)[EXTENSION_SYMBOL] = extension;\n}\n\nexport function getRendererConfigExtension(): RendererConfigExtension | null {\n return (globalThis as GlobalWithExtension)[EXTENSION_SYMBOL] ?? null;\n}\n\n/**\n * Resolves the extension fields for one `__woodConfig` request. A throwing or\n * malformed extension yields `{}` — config delivery must never fail the\n * renderer boot because of an app-side provider.\n */\nexport async function resolveRendererConfigExtension(): Promise<Record<string, unknown>> {\n const extension = getRendererConfigExtension();\n if (!extension) return {};\n try {\n const value = await extension();\n if (typeof value !== 'object' || value === null || Array.isArray(value)) return {};\n return { ...value };\n } catch {\n return {};\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAAM,mBAAmB,uBAAO,IAAI,+CAA+C;AAkB5E,SAAS,2BAA2B,WAAiD;AAC1F,EAAC,WAAmC,gBAAgB,IAAI;AAC1D;AAEO,SAAS,6BAA6D;AAC3E,SAAQ,WAAmC,gBAAgB,KAAK;AAClE;AAOA,eAAsB,iCAAmE;AACvF,QAAM,YAAY,2BAA2B;AAC7C,MAAI,CAAC,UAAW,QAAO,CAAC;AACxB,MAAI;AACF,UAAM,QAAQ,MAAM,UAAU;AAC9B,QAAI,OAAO,UAAU,YAAY,UAAU,QAAQ,MAAM,QAAQ,KAAK,EAAG,QAAO,CAAC;AACjF,WAAO,EAAE,GAAG,MAAM;AAAA,EACpB,QAAQ;AACN,WAAO,CAAC;AAAA,EACV;AACF;","names":[]}
1
+ {"version":3,"sources":["../../src/runtime/renderer_config_extension.ts"],"sourcesContent":["const EXTENSION_SYMBOL = Symbol.for('@noego/wood.runtime.renderer-config-extension');\n\n/**\n * App-supplied provider of extra fields merged into the `__woodConfig` payload\n * the renderer fetches at boot. Lets the main process hand renderers boot-time\n * facts Wood itself knows nothing about — e.g. the loopback port and per-boot\n * token of an external log sink — without a new IPC channel or preload method.\n *\n * Reserved Wood keys (rendererTrace*, appEnv) always win over extension keys.\n */\nexport type RendererConfigExtension = () =>\n | Readonly<Record<string, unknown>>\n | Promise<Readonly<Record<string, unknown>>>;\n\ntype GlobalWithExtension = typeof globalThis & {\n [EXTENSION_SYMBOL]?: RendererConfigExtension | null;\n};\n\nexport function setRendererConfigExtension(extension: RendererConfigExtension | null): void {\n (globalThis as GlobalWithExtension)[EXTENSION_SYMBOL] = extension;\n}\n\nexport function getRendererConfigExtension(): RendererConfigExtension | null {\n return (globalThis as GlobalWithExtension)[EXTENSION_SYMBOL] ?? null;\n}\n\n/**\n * Resolves the extension fields for one `__woodConfig` request. A throwing or\n * malformed extension yields `{}` — config delivery must never fail the\n * renderer boot because of an app-side provider.\n */\nexport async function resolveRendererConfigExtension(extension: RendererConfigExtension | null = getRendererConfigExtension()): Promise<Record<string, unknown>> {\n if (!extension) return {};\n try {\n const value = await extension();\n if (typeof value !== 'object' || value === null || Array.isArray(value)) return {};\n return { ...value };\n } catch {\n return {};\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAAM,mBAAmB,uBAAO,IAAI,+CAA+C;AAkB5E,SAAS,2BAA2B,WAAiD;AAC1F,EAAC,WAAmC,gBAAgB,IAAI;AAC1D;AAEO,SAAS,6BAA6D;AAC3E,SAAQ,WAAmC,gBAAgB,KAAK;AAClE;AAOA,eAAsB,+BAA+B,YAA4C,2BAA2B,GAAqC;AAC/J,MAAI,CAAC,UAAW,QAAO,CAAC;AACxB,MAAI;AACF,UAAM,QAAQ,MAAM,UAAU;AAC9B,QAAI,OAAO,UAAU,YAAY,UAAU,QAAQ,MAAM,QAAQ,KAAK,EAAG,QAAO,CAAC;AACjF,WAAO,EAAE,GAAG,MAAM;AAAA,EACpB,QAAQ;AACN,WAAO,CAAC;AAAA,EACV;AACF;","names":[]}
@@ -14,6 +14,6 @@ declare function getRendererConfigExtension(): RendererConfigExtension | null;
14
14
  * malformed extension yields `{}` — config delivery must never fail the
15
15
  * renderer boot because of an app-side provider.
16
16
  */
17
- declare function resolveRendererConfigExtension(): Promise<Record<string, unknown>>;
17
+ declare function resolveRendererConfigExtension(extension?: RendererConfigExtension | null): Promise<Record<string, unknown>>;
18
18
 
19
19
  export { type RendererConfigExtension, getRendererConfigExtension, resolveRendererConfigExtension, setRendererConfigExtension };
@@ -14,6 +14,6 @@ declare function getRendererConfigExtension(): RendererConfigExtension | null;
14
14
  * malformed extension yields `{}` — config delivery must never fail the
15
15
  * renderer boot because of an app-side provider.
16
16
  */
17
- declare function resolveRendererConfigExtension(): Promise<Record<string, unknown>>;
17
+ declare function resolveRendererConfigExtension(extension?: RendererConfigExtension | null): Promise<Record<string, unknown>>;
18
18
 
19
19
  export { type RendererConfigExtension, getRendererConfigExtension, resolveRendererConfigExtension, setRendererConfigExtension };
@@ -5,8 +5,7 @@ function setRendererConfigExtension(extension) {
5
5
  function getRendererConfigExtension() {
6
6
  return globalThis[EXTENSION_SYMBOL] ?? null;
7
7
  }
8
- async function resolveRendererConfigExtension() {
9
- const extension = getRendererConfigExtension();
8
+ async function resolveRendererConfigExtension(extension = getRendererConfigExtension()) {
10
9
  if (!extension) return {};
11
10
  try {
12
11
  const value = await extension();
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/runtime/renderer_config_extension.ts"],"sourcesContent":["const EXTENSION_SYMBOL = Symbol.for('@noego/wood.runtime.renderer-config-extension');\n\n/**\n * App-supplied provider of extra fields merged into the `__woodConfig` payload\n * the renderer fetches at boot. Lets the main process hand renderers boot-time\n * facts Wood itself knows nothing about — e.g. the loopback port and per-boot\n * token of an external log sink — without a new IPC channel or preload method.\n *\n * Reserved Wood keys (rendererTrace*, appEnv) always win over extension keys.\n */\nexport type RendererConfigExtension = () =>\n | Readonly<Record<string, unknown>>\n | Promise<Readonly<Record<string, unknown>>>;\n\ntype GlobalWithExtension = typeof globalThis & {\n [EXTENSION_SYMBOL]?: RendererConfigExtension | null;\n};\n\nexport function setRendererConfigExtension(extension: RendererConfigExtension | null): void {\n (globalThis as GlobalWithExtension)[EXTENSION_SYMBOL] = extension;\n}\n\nexport function getRendererConfigExtension(): RendererConfigExtension | null {\n return (globalThis as GlobalWithExtension)[EXTENSION_SYMBOL] ?? null;\n}\n\n/**\n * Resolves the extension fields for one `__woodConfig` request. A throwing or\n * malformed extension yields `{}` — config delivery must never fail the\n * renderer boot because of an app-side provider.\n */\nexport async function resolveRendererConfigExtension(): Promise<Record<string, unknown>> {\n const extension = getRendererConfigExtension();\n if (!extension) return {};\n try {\n const value = await extension();\n if (typeof value !== 'object' || value === null || Array.isArray(value)) return {};\n return { ...value };\n } catch {\n return {};\n }\n}\n"],"mappings":"AAAA,MAAM,mBAAmB,uBAAO,IAAI,+CAA+C;AAkB5E,SAAS,2BAA2B,WAAiD;AAC1F,EAAC,WAAmC,gBAAgB,IAAI;AAC1D;AAEO,SAAS,6BAA6D;AAC3E,SAAQ,WAAmC,gBAAgB,KAAK;AAClE;AAOA,eAAsB,iCAAmE;AACvF,QAAM,YAAY,2BAA2B;AAC7C,MAAI,CAAC,UAAW,QAAO,CAAC;AACxB,MAAI;AACF,UAAM,QAAQ,MAAM,UAAU;AAC9B,QAAI,OAAO,UAAU,YAAY,UAAU,QAAQ,MAAM,QAAQ,KAAK,EAAG,QAAO,CAAC;AACjF,WAAO,EAAE,GAAG,MAAM;AAAA,EACpB,QAAQ;AACN,WAAO,CAAC;AAAA,EACV;AACF;","names":[]}
1
+ {"version":3,"sources":["../../src/runtime/renderer_config_extension.ts"],"sourcesContent":["const EXTENSION_SYMBOL = Symbol.for('@noego/wood.runtime.renderer-config-extension');\n\n/**\n * App-supplied provider of extra fields merged into the `__woodConfig` payload\n * the renderer fetches at boot. Lets the main process hand renderers boot-time\n * facts Wood itself knows nothing about — e.g. the loopback port and per-boot\n * token of an external log sink — without a new IPC channel or preload method.\n *\n * Reserved Wood keys (rendererTrace*, appEnv) always win over extension keys.\n */\nexport type RendererConfigExtension = () =>\n | Readonly<Record<string, unknown>>\n | Promise<Readonly<Record<string, unknown>>>;\n\ntype GlobalWithExtension = typeof globalThis & {\n [EXTENSION_SYMBOL]?: RendererConfigExtension | null;\n};\n\nexport function setRendererConfigExtension(extension: RendererConfigExtension | null): void {\n (globalThis as GlobalWithExtension)[EXTENSION_SYMBOL] = extension;\n}\n\nexport function getRendererConfigExtension(): RendererConfigExtension | null {\n return (globalThis as GlobalWithExtension)[EXTENSION_SYMBOL] ?? null;\n}\n\n/**\n * Resolves the extension fields for one `__woodConfig` request. A throwing or\n * malformed extension yields `{}` — config delivery must never fail the\n * renderer boot because of an app-side provider.\n */\nexport async function resolveRendererConfigExtension(extension: RendererConfigExtension | null = getRendererConfigExtension()): Promise<Record<string, unknown>> {\n if (!extension) return {};\n try {\n const value = await extension();\n if (typeof value !== 'object' || value === null || Array.isArray(value)) return {};\n return { ...value };\n } catch {\n return {};\n }\n}\n"],"mappings":"AAAA,MAAM,mBAAmB,uBAAO,IAAI,+CAA+C;AAkB5E,SAAS,2BAA2B,WAAiD;AAC1F,EAAC,WAAmC,gBAAgB,IAAI;AAC1D;AAEO,SAAS,6BAA6D;AAC3E,SAAQ,WAAmC,gBAAgB,KAAK;AAClE;AAOA,eAAsB,+BAA+B,YAA4C,2BAA2B,GAAqC;AAC/J,MAAI,CAAC,UAAW,QAAO,CAAC;AACxB,MAAI;AACF,UAAM,QAAQ,MAAM,UAAU;AAC9B,QAAI,OAAO,UAAU,YAAY,UAAU,QAAQ,MAAM,QAAQ,KAAK,EAAG,QAAO,CAAC;AACjF,WAAO,EAAE,GAAG,MAAM;AAAA,EACpB,QAAQ;AACN,WAAO,CAAC;AAAA,EACV;AACF;","names":[]}
@@ -18,6 +18,7 @@ var __copyProps = (to, from, except, desc) => {
18
18
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
19
  var renderer_log_dispatcher_exports = {};
20
20
  __export(renderer_log_dispatcher_exports, {
21
+ RendererLogDispatcher: () => RendererLogDispatcher,
21
22
  clearRendererLogDispatcherForTests: () => clearRendererLogDispatcherForTests,
22
23
  getRendererLogDispatcher: () => getRendererLogDispatcher
23
24
  });
@@ -73,6 +74,7 @@ function clearRendererLogDispatcherForTests() {
73
74
  }
74
75
  // Annotate the CommonJS export names for ESM import in node:
75
76
  0 && (module.exports = {
77
+ RendererLogDispatcher,
76
78
  clearRendererLogDispatcherForTests,
77
79
  getRendererLogDispatcher
78
80
  });
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/runtime/renderer_log_dispatcher.ts"],"sourcesContent":["const RENDERER_LOG_DISPATCHER_SYMBOL = Symbol.for('@noego/wood.runtime.renderer-log-dispatcher');\n\nexport type RendererLogLevel = 'debug' | 'info' | 'warn' | 'error' | (string & {});\n\nexport type RendererLogEntry = {\n level: RendererLogLevel;\n logger: string;\n message: string;\n context?: unknown;\n timestamp: string;\n senderId?: number | null;\n};\n\nexport type RendererLogCallback = (entry: RendererLogEntry) => void | Promise<void>;\n\nexport type RendererLogDispatchResult = {\n ok: boolean;\n forwarded: boolean;\n configured: boolean;\n reason?: 'unconfigured' | 'callback-error';\n errorMessage?: string;\n};\n\nclass RendererLogDispatcher {\n private callback: RendererLogCallback | null = null;\n\n setCallback(callback: RendererLogCallback | null): void {\n this.callback = callback;\n }\n\n getCallback(): RendererLogCallback | null {\n return this.callback;\n }\n\n async dispatch(entry: RendererLogEntry): Promise<RendererLogDispatchResult> {\n if (!this.callback) {\n return {\n ok: true,\n forwarded: false,\n configured: false,\n reason: 'unconfigured',\n };\n }\n\n try {\n await this.callback(entry);\n return {\n ok: true,\n forwarded: true,\n configured: true,\n };\n } catch (error) {\n return {\n ok: false,\n forwarded: false,\n configured: true,\n reason: 'callback-error',\n errorMessage: error instanceof Error ? error.message : String(error),\n };\n }\n }\n}\n\ntype GlobalWithRendererLogDispatcher = typeof globalThis & {\n [RENDERER_LOG_DISPATCHER_SYMBOL]?: RendererLogDispatcher;\n};\n\nexport function getRendererLogDispatcher(): RendererLogDispatcher {\n const globalObj = globalThis as GlobalWithRendererLogDispatcher;\n if (!globalObj[RENDERER_LOG_DISPATCHER_SYMBOL]) {\n globalObj[RENDERER_LOG_DISPATCHER_SYMBOL] = new RendererLogDispatcher();\n }\n return globalObj[RENDERER_LOG_DISPATCHER_SYMBOL] as RendererLogDispatcher;\n}\n\nexport function clearRendererLogDispatcherForTests(): void {\n const globalObj = globalThis as GlobalWithRendererLogDispatcher;\n delete globalObj[RENDERER_LOG_DISPATCHER_SYMBOL];\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAAM,iCAAiC,uBAAO,IAAI,6CAA6C;AAuB/F,MAAM,sBAAsB;AAAA,EAA5B;AACE,SAAQ,WAAuC;AAAA;AAAA,EAE/C,YAAY,UAA4C;AACtD,SAAK,WAAW;AAAA,EAClB;AAAA,EAEA,cAA0C;AACxC,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,MAAM,SAAS,OAA6D;AAC1E,QAAI,CAAC,KAAK,UAAU;AAClB,aAAO;AAAA,QACL,IAAI;AAAA,QACJ,WAAW;AAAA,QACX,YAAY;AAAA,QACZ,QAAQ;AAAA,MACV;AAAA,IACF;AAEA,QAAI;AACF,YAAM,KAAK,SAAS,KAAK;AACzB,aAAO;AAAA,QACL,IAAI;AAAA,QACJ,WAAW;AAAA,QACX,YAAY;AAAA,MACd;AAAA,IACF,SAAS,OAAO;AACd,aAAO;AAAA,QACL,IAAI;AAAA,QACJ,WAAW;AAAA,QACX,YAAY;AAAA,QACZ,QAAQ;AAAA,QACR,cAAc,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,MACrE;AAAA,IACF;AAAA,EACF;AACF;AAMO,SAAS,2BAAkD;AAChE,QAAM,YAAY;AAClB,MAAI,CAAC,UAAU,8BAA8B,GAAG;AAC9C,cAAU,8BAA8B,IAAI,IAAI,sBAAsB;AAAA,EACxE;AACA,SAAO,UAAU,8BAA8B;AACjD;AAEO,SAAS,qCAA2C;AACzD,QAAM,YAAY;AAClB,SAAO,UAAU,8BAA8B;AACjD;","names":[]}
1
+ {"version":3,"sources":["../../src/runtime/renderer_log_dispatcher.ts"],"sourcesContent":["const RENDERER_LOG_DISPATCHER_SYMBOL = Symbol.for('@noego/wood.runtime.renderer-log-dispatcher');\n\nexport type RendererLogLevel = 'debug' | 'info' | 'warn' | 'error' | (string & {});\n\nexport type RendererLogEntry = {\n level: RendererLogLevel;\n logger: string;\n message: string;\n context?: unknown;\n timestamp: string;\n senderId?: number | null;\n};\n\nexport type RendererLogCallback = (entry: RendererLogEntry) => void | Promise<void>;\n\nexport type RendererLogDispatchResult = {\n ok: boolean;\n forwarded: boolean;\n configured: boolean;\n reason?: 'unconfigured' | 'callback-error';\n errorMessage?: string;\n};\n\nexport class RendererLogDispatcher {\n private callback: RendererLogCallback | null = null;\n\n setCallback(callback: RendererLogCallback | null): void {\n this.callback = callback;\n }\n\n getCallback(): RendererLogCallback | null {\n return this.callback;\n }\n\n async dispatch(entry: RendererLogEntry): Promise<RendererLogDispatchResult> {\n if (!this.callback) {\n return {\n ok: true,\n forwarded: false,\n configured: false,\n reason: 'unconfigured',\n };\n }\n\n try {\n await this.callback(entry);\n return {\n ok: true,\n forwarded: true,\n configured: true,\n };\n } catch (error) {\n return {\n ok: false,\n forwarded: false,\n configured: true,\n reason: 'callback-error',\n errorMessage: error instanceof Error ? error.message : String(error),\n };\n }\n }\n}\n\ntype GlobalWithRendererLogDispatcher = typeof globalThis & {\n [RENDERER_LOG_DISPATCHER_SYMBOL]?: RendererLogDispatcher;\n};\n\nexport function getRendererLogDispatcher(): RendererLogDispatcher {\n const globalObj = globalThis as GlobalWithRendererLogDispatcher;\n if (!globalObj[RENDERER_LOG_DISPATCHER_SYMBOL]) {\n globalObj[RENDERER_LOG_DISPATCHER_SYMBOL] = new RendererLogDispatcher();\n }\n return globalObj[RENDERER_LOG_DISPATCHER_SYMBOL] as RendererLogDispatcher;\n}\n\nexport function clearRendererLogDispatcherForTests(): void {\n const globalObj = globalThis as GlobalWithRendererLogDispatcher;\n delete globalObj[RENDERER_LOG_DISPATCHER_SYMBOL];\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAAM,iCAAiC,uBAAO,IAAI,6CAA6C;AAuBxF,MAAM,sBAAsB;AAAA,EAA5B;AACL,SAAQ,WAAuC;AAAA;AAAA,EAE/C,YAAY,UAA4C;AACtD,SAAK,WAAW;AAAA,EAClB;AAAA,EAEA,cAA0C;AACxC,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,MAAM,SAAS,OAA6D;AAC1E,QAAI,CAAC,KAAK,UAAU;AAClB,aAAO;AAAA,QACL,IAAI;AAAA,QACJ,WAAW;AAAA,QACX,YAAY;AAAA,QACZ,QAAQ;AAAA,MACV;AAAA,IACF;AAEA,QAAI;AACF,YAAM,KAAK,SAAS,KAAK;AACzB,aAAO;AAAA,QACL,IAAI;AAAA,QACJ,WAAW;AAAA,QACX,YAAY;AAAA,MACd;AAAA,IACF,SAAS,OAAO;AACd,aAAO;AAAA,QACL,IAAI;AAAA,QACJ,WAAW;AAAA,QACX,YAAY;AAAA,QACZ,QAAQ;AAAA,QACR,cAAc,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,MACrE;AAAA,IACF;AAAA,EACF;AACF;AAMO,SAAS,2BAAkD;AAChE,QAAM,YAAY;AAClB,MAAI,CAAC,UAAU,8BAA8B,GAAG;AAC9C,cAAU,8BAA8B,IAAI,IAAI,sBAAsB;AAAA,EACxE;AACA,SAAO,UAAU,8BAA8B;AACjD;AAEO,SAAS,qCAA2C;AACzD,QAAM,YAAY;AAClB,SAAO,UAAU,8BAA8B;AACjD;","names":[]}
@@ -24,4 +24,4 @@ declare class RendererLogDispatcher {
24
24
  declare function getRendererLogDispatcher(): RendererLogDispatcher;
25
25
  declare function clearRendererLogDispatcherForTests(): void;
26
26
 
27
- export { type RendererLogCallback, type RendererLogDispatchResult, type RendererLogEntry, type RendererLogLevel, clearRendererLogDispatcherForTests, getRendererLogDispatcher };
27
+ export { type RendererLogCallback, type RendererLogDispatchResult, RendererLogDispatcher, type RendererLogEntry, type RendererLogLevel, clearRendererLogDispatcherForTests, getRendererLogDispatcher };
@@ -24,4 +24,4 @@ declare class RendererLogDispatcher {
24
24
  declare function getRendererLogDispatcher(): RendererLogDispatcher;
25
25
  declare function clearRendererLogDispatcherForTests(): void;
26
26
 
27
- export { type RendererLogCallback, type RendererLogDispatchResult, type RendererLogEntry, type RendererLogLevel, clearRendererLogDispatcherForTests, getRendererLogDispatcher };
27
+ export { type RendererLogCallback, type RendererLogDispatchResult, RendererLogDispatcher, type RendererLogEntry, type RendererLogLevel, clearRendererLogDispatcherForTests, getRendererLogDispatcher };
@@ -48,6 +48,7 @@ function clearRendererLogDispatcherForTests() {
48
48
  delete globalObj[RENDERER_LOG_DISPATCHER_SYMBOL];
49
49
  }
50
50
  export {
51
+ RendererLogDispatcher,
51
52
  clearRendererLogDispatcherForTests,
52
53
  getRendererLogDispatcher
53
54
  };
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/runtime/renderer_log_dispatcher.ts"],"sourcesContent":["const RENDERER_LOG_DISPATCHER_SYMBOL = Symbol.for('@noego/wood.runtime.renderer-log-dispatcher');\n\nexport type RendererLogLevel = 'debug' | 'info' | 'warn' | 'error' | (string & {});\n\nexport type RendererLogEntry = {\n level: RendererLogLevel;\n logger: string;\n message: string;\n context?: unknown;\n timestamp: string;\n senderId?: number | null;\n};\n\nexport type RendererLogCallback = (entry: RendererLogEntry) => void | Promise<void>;\n\nexport type RendererLogDispatchResult = {\n ok: boolean;\n forwarded: boolean;\n configured: boolean;\n reason?: 'unconfigured' | 'callback-error';\n errorMessage?: string;\n};\n\nclass RendererLogDispatcher {\n private callback: RendererLogCallback | null = null;\n\n setCallback(callback: RendererLogCallback | null): void {\n this.callback = callback;\n }\n\n getCallback(): RendererLogCallback | null {\n return this.callback;\n }\n\n async dispatch(entry: RendererLogEntry): Promise<RendererLogDispatchResult> {\n if (!this.callback) {\n return {\n ok: true,\n forwarded: false,\n configured: false,\n reason: 'unconfigured',\n };\n }\n\n try {\n await this.callback(entry);\n return {\n ok: true,\n forwarded: true,\n configured: true,\n };\n } catch (error) {\n return {\n ok: false,\n forwarded: false,\n configured: true,\n reason: 'callback-error',\n errorMessage: error instanceof Error ? error.message : String(error),\n };\n }\n }\n}\n\ntype GlobalWithRendererLogDispatcher = typeof globalThis & {\n [RENDERER_LOG_DISPATCHER_SYMBOL]?: RendererLogDispatcher;\n};\n\nexport function getRendererLogDispatcher(): RendererLogDispatcher {\n const globalObj = globalThis as GlobalWithRendererLogDispatcher;\n if (!globalObj[RENDERER_LOG_DISPATCHER_SYMBOL]) {\n globalObj[RENDERER_LOG_DISPATCHER_SYMBOL] = new RendererLogDispatcher();\n }\n return globalObj[RENDERER_LOG_DISPATCHER_SYMBOL] as RendererLogDispatcher;\n}\n\nexport function clearRendererLogDispatcherForTests(): void {\n const globalObj = globalThis as GlobalWithRendererLogDispatcher;\n delete globalObj[RENDERER_LOG_DISPATCHER_SYMBOL];\n}\n"],"mappings":"AAAA,MAAM,iCAAiC,uBAAO,IAAI,6CAA6C;AAuB/F,MAAM,sBAAsB;AAAA,EAA5B;AACE,SAAQ,WAAuC;AAAA;AAAA,EAE/C,YAAY,UAA4C;AACtD,SAAK,WAAW;AAAA,EAClB;AAAA,EAEA,cAA0C;AACxC,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,MAAM,SAAS,OAA6D;AAC1E,QAAI,CAAC,KAAK,UAAU;AAClB,aAAO;AAAA,QACL,IAAI;AAAA,QACJ,WAAW;AAAA,QACX,YAAY;AAAA,QACZ,QAAQ;AAAA,MACV;AAAA,IACF;AAEA,QAAI;AACF,YAAM,KAAK,SAAS,KAAK;AACzB,aAAO;AAAA,QACL,IAAI;AAAA,QACJ,WAAW;AAAA,QACX,YAAY;AAAA,MACd;AAAA,IACF,SAAS,OAAO;AACd,aAAO;AAAA,QACL,IAAI;AAAA,QACJ,WAAW;AAAA,QACX,YAAY;AAAA,QACZ,QAAQ;AAAA,QACR,cAAc,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,MACrE;AAAA,IACF;AAAA,EACF;AACF;AAMO,SAAS,2BAAkD;AAChE,QAAM,YAAY;AAClB,MAAI,CAAC,UAAU,8BAA8B,GAAG;AAC9C,cAAU,8BAA8B,IAAI,IAAI,sBAAsB;AAAA,EACxE;AACA,SAAO,UAAU,8BAA8B;AACjD;AAEO,SAAS,qCAA2C;AACzD,QAAM,YAAY;AAClB,SAAO,UAAU,8BAA8B;AACjD;","names":[]}
1
+ {"version":3,"sources":["../../src/runtime/renderer_log_dispatcher.ts"],"sourcesContent":["const RENDERER_LOG_DISPATCHER_SYMBOL = Symbol.for('@noego/wood.runtime.renderer-log-dispatcher');\n\nexport type RendererLogLevel = 'debug' | 'info' | 'warn' | 'error' | (string & {});\n\nexport type RendererLogEntry = {\n level: RendererLogLevel;\n logger: string;\n message: string;\n context?: unknown;\n timestamp: string;\n senderId?: number | null;\n};\n\nexport type RendererLogCallback = (entry: RendererLogEntry) => void | Promise<void>;\n\nexport type RendererLogDispatchResult = {\n ok: boolean;\n forwarded: boolean;\n configured: boolean;\n reason?: 'unconfigured' | 'callback-error';\n errorMessage?: string;\n};\n\nexport class RendererLogDispatcher {\n private callback: RendererLogCallback | null = null;\n\n setCallback(callback: RendererLogCallback | null): void {\n this.callback = callback;\n }\n\n getCallback(): RendererLogCallback | null {\n return this.callback;\n }\n\n async dispatch(entry: RendererLogEntry): Promise<RendererLogDispatchResult> {\n if (!this.callback) {\n return {\n ok: true,\n forwarded: false,\n configured: false,\n reason: 'unconfigured',\n };\n }\n\n try {\n await this.callback(entry);\n return {\n ok: true,\n forwarded: true,\n configured: true,\n };\n } catch (error) {\n return {\n ok: false,\n forwarded: false,\n configured: true,\n reason: 'callback-error',\n errorMessage: error instanceof Error ? error.message : String(error),\n };\n }\n }\n}\n\ntype GlobalWithRendererLogDispatcher = typeof globalThis & {\n [RENDERER_LOG_DISPATCHER_SYMBOL]?: RendererLogDispatcher;\n};\n\nexport function getRendererLogDispatcher(): RendererLogDispatcher {\n const globalObj = globalThis as GlobalWithRendererLogDispatcher;\n if (!globalObj[RENDERER_LOG_DISPATCHER_SYMBOL]) {\n globalObj[RENDERER_LOG_DISPATCHER_SYMBOL] = new RendererLogDispatcher();\n }\n return globalObj[RENDERER_LOG_DISPATCHER_SYMBOL] as RendererLogDispatcher;\n}\n\nexport function clearRendererLogDispatcherForTests(): void {\n const globalObj = globalThis as GlobalWithRendererLogDispatcher;\n delete globalObj[RENDERER_LOG_DISPATCHER_SYMBOL];\n}\n"],"mappings":"AAAA,MAAM,iCAAiC,uBAAO,IAAI,6CAA6C;AAuBxF,MAAM,sBAAsB;AAAA,EAA5B;AACL,SAAQ,WAAuC;AAAA;AAAA,EAE/C,YAAY,UAA4C;AACtD,SAAK,WAAW;AAAA,EAClB;AAAA,EAEA,cAA0C;AACxC,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,MAAM,SAAS,OAA6D;AAC1E,QAAI,CAAC,KAAK,UAAU;AAClB,aAAO;AAAA,QACL,IAAI;AAAA,QACJ,WAAW;AAAA,QACX,YAAY;AAAA,QACZ,QAAQ;AAAA,MACV;AAAA,IACF;AAEA,QAAI;AACF,YAAM,KAAK,SAAS,KAAK;AACzB,aAAO;AAAA,QACL,IAAI;AAAA,QACJ,WAAW;AAAA,QACX,YAAY;AAAA,MACd;AAAA,IACF,SAAS,OAAO;AACd,aAAO;AAAA,QACL,IAAI;AAAA,QACJ,WAAW;AAAA,QACX,YAAY;AAAA,QACZ,QAAQ;AAAA,QACR,cAAc,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,MACrE;AAAA,IACF;AAAA,EACF;AACF;AAMO,SAAS,2BAAkD;AAChE,QAAM,YAAY;AAClB,MAAI,CAAC,UAAU,8BAA8B,GAAG;AAC9C,cAAU,8BAA8B,IAAI,IAAI,sBAAsB;AAAA,EACxE;AACA,SAAO,UAAU,8BAA8B;AACjD;AAEO,SAAS,qCAA2C;AACzD,QAAM,YAAY;AAClB,SAAO,UAAU,8BAA8B;AACjD;","names":[]}
@@ -21,15 +21,17 @@ __export(runtime_exports, {
21
21
  runtime: () => runtime
22
22
  });
23
23
  module.exports = __toCommonJS(runtime_exports);
24
+ var import_renderer_trace_batch_receiver_registry = require("./renderer_trace_batch_receiver_registry.js");
24
25
  var import_logger = require("@noego/logger");
25
26
  var import_wood_router = require("../router/wood_router.cjs");
26
27
  var import_get_container = require("./get_container.cjs");
28
+ var import_ioc = require("@noego/ioc");
29
+ var import_runtime_module = require("./runtime_module.js");
27
30
  var import_tracing = require("../tracing/index.js");
28
31
  var import_tracing2 = require("../tracing/index.js");
29
32
  var import_renderer_log_dispatcher = require("./renderer_log_dispatcher.js");
30
33
  var import_renderer_log_batch_receiver = require("./renderer_log_batch_receiver.js");
31
34
  var import_renderer_config_extension = require("./renderer_config_extension.js");
32
- var import_renderer_trace_batch_receiver_registry = require("./renderer_trace_batch_receiver_registry.js");
33
35
  var import_app_env = require("./app_env.js");
34
36
  const logger = (0, import_logger.getLogger)("wood:runtime");
35
37
  function normalizeRendererLogLevel(level) {
@@ -55,7 +57,6 @@ function coerceRendererLogPayload(rawPayload, event) {
55
57
  }
56
58
  async function runtime(options) {
57
59
  const {
58
- ipcMain,
59
60
  registerRuntime,
60
61
  controllersDir,
61
62
  middlewareDir,
@@ -66,60 +67,110 @@ async function runtime(options) {
66
67
  rendererTraceEnabled = false,
67
68
  rendererTraceMinLevel = "debug"
68
69
  } = options;
69
- const container = options.container ?? (0, import_get_container.getContainer)();
70
- const rendererTraceBatchReceiver = options.rendererTraceBatchReceiver ?? (0, import_renderer_trace_batch_receiver_registry.getRendererTraceBatchReceiver)();
70
+ const container = options.container ?? (0, import_get_container.createWoodRoot)();
71
+ const rendererTraceBatchReceiver = options.rendererTraceBatchReceiver ?? (options.legacyGlobals ? (0, import_renderer_trace_batch_receiver_registry.getRendererTraceBatchReceiver)() : null);
71
72
  const rendererTraceBatchEnabled = rendererTraceBatchReceiver !== null;
72
- const rendererTraceBatchHost = new import_tracing.RendererTraceBatchHost(
73
- rendererTraceBatchReceiver
74
- );
75
- logger.info("runtime start", {
76
- mode,
77
- hasProvidedContainer: !!options.container,
78
- controllersDir,
79
- middlewareDir,
80
- enableRendererLogBridge,
81
- enableRendererTraceBridge,
82
- traceMinLevel: traceMinLevel ?? "debug",
83
- rendererTraceEnabled,
84
- rendererTraceMinLevel,
85
- rendererTraceBatchEnabled
86
- });
87
- const traceSettings = {
88
- enableRendererLogBridge,
89
- enableRendererTraceBridge,
90
- traceMinLevel,
91
- rendererTraceEnabled,
92
- rendererTraceMinLevel,
93
- rendererTraceBatchEnabled
73
+ const handlers = [];
74
+ const listeners = [];
75
+ let router;
76
+ let closing;
77
+ const dispose = (timeoutMs) => closing ?? (closing = (async () => {
78
+ const errors = [];
79
+ for (const channel of handlers.splice(0)) {
80
+ try {
81
+ options.ipcMain.removeHandler?.(channel);
82
+ } catch (error) {
83
+ errors.push(error);
84
+ }
85
+ }
86
+ for (const [channel, listener] of listeners.splice(0)) {
87
+ try {
88
+ if (options.ipcMain.removeListener) options.ipcMain.removeListener(channel, listener);
89
+ else options.ipcMain.removeAllListeners?.(channel);
90
+ } catch (error) {
91
+ errors.push(error);
92
+ }
93
+ }
94
+ let drained = true;
95
+ try {
96
+ await router?.dispose(timeoutMs);
97
+ } catch (error) {
98
+ drained = false;
99
+ errors.push(error);
100
+ }
101
+ if (!options.container && drained) {
102
+ try {
103
+ await import_ioc.ExecutionContext.run(container, () => container.dispose());
104
+ } catch (error) {
105
+ errors.push(error);
106
+ }
107
+ }
108
+ if (errors.length) throw Object.assign(new Error("Wood runtime cleanup failed"), { errors });
109
+ })().catch((error) => {
110
+ closing = void 0;
111
+ throw error;
112
+ }));
113
+ const ipcMain = {
114
+ handle(channel, handler) {
115
+ options.ipcMain.handle(channel, handler);
116
+ handlers.push(channel);
117
+ },
118
+ on(channel, listener) {
119
+ options.ipcMain.on(channel, listener);
120
+ listeners.push([channel, listener]);
121
+ }
94
122
  };
95
- await configureRuntimeTracing(container, traceSettings);
96
- const router = new import_wood_router.WoodRouter({
97
- container,
98
- controllersDir,
99
- middlewareDir,
100
- mode
101
- });
102
- registerRuntime(router);
103
- logger.info("runtime registration complete");
104
- router.validateControllers();
105
- logger.info("runtime controller validation complete");
106
- router.precompileSchemas();
107
- logger.info("runtime schema pre-compilation complete");
108
- registerReservedRuntimeHandlers(router, options, traceSettings, rendererTraceBatchHost);
109
- registerRuntimeObservationBridges(ipcMain, traceSettings, options.resolveRendererTraceContext);
110
- router.registerIpcHandlers(ipcMain);
111
- logger.info("runtime ipc handlers registered", {
112
- channelCount: router.getChannels().length,
113
- enableRendererLogBridge,
114
- enableRendererTraceBridge
115
- });
116
- return { router };
123
+ try {
124
+ (0, import_runtime_module.installWoodRuntime)(container, { controllersDir, middlewareDir, mode, registerRuntime });
125
+ if (!container.isRegistered(import_tracing.RendererTraceBatchHost)) {
126
+ container.registerFunction(import_tracing.RendererTraceBatchHost, () => new import_tracing.RendererTraceBatchHost(rendererTraceBatchReceiver));
127
+ }
128
+ const rendererTraceBatchHost = await import_ioc.ExecutionContext.run(container, () => container.get(import_tracing.RendererTraceBatchHost));
129
+ logger.info("runtime start", {
130
+ mode,
131
+ hasProvidedContainer: !!options.container,
132
+ controllersDir,
133
+ middlewareDir,
134
+ enableRendererLogBridge,
135
+ enableRendererTraceBridge,
136
+ traceMinLevel: traceMinLevel ?? "debug",
137
+ rendererTraceEnabled,
138
+ rendererTraceMinLevel,
139
+ rendererTraceBatchEnabled
140
+ });
141
+ const traceSettings = {
142
+ enableRendererLogBridge,
143
+ enableRendererTraceBridge,
144
+ traceMinLevel,
145
+ rendererTraceEnabled,
146
+ rendererTraceMinLevel,
147
+ rendererTraceBatchEnabled
148
+ };
149
+ await configureRuntimeTracing(container, traceSettings, options.legacyGlobals ?? false);
150
+ router = await import_ioc.ExecutionContext.run(container, () => container.get(import_wood_router.WoodRouter));
151
+ registerReservedRuntimeHandlers(router, options, traceSettings, rendererTraceBatchHost);
152
+ registerRuntimeObservationBridges(ipcMain, traceSettings, options.resolveRendererTraceContext, options.rendererLogDispatcher ?? (options.legacyGlobals ? (0, import_renderer_log_dispatcher.getRendererLogDispatcher)() : new import_renderer_log_dispatcher.RendererLogDispatcher()));
153
+ router.registerIpcHandlers(ipcMain);
154
+ logger.info("runtime ipc handlers registered", {
155
+ channelCount: router.getChannels().length,
156
+ enableRendererLogBridge,
157
+ enableRendererTraceBridge
158
+ });
159
+ return { router, dispose };
160
+ } catch (error) {
161
+ try {
162
+ await dispose();
163
+ } catch (cleanupError) {
164
+ throw Object.assign(new Error("Wood runtime startup and cleanup failed"), { cause: error, errors: [error, cleanupError] });
165
+ }
166
+ throw error;
167
+ }
117
168
  }
118
- async function configureRuntimeTracing(container, settings) {
119
- if (settings.traceMinLevel) {
120
- (0, import_tracing2.setMainTraceMinLevel)(settings.traceMinLevel);
169
+ async function configureRuntimeTracing(container, settings, legacyGlobals) {
170
+ if (legacyGlobals) {
171
+ if (settings.traceMinLevel) (0, import_tracing2.setMainTraceMinLevel)(settings.traceMinLevel);
172
+ (0, import_tracing2.setRendererTraceMinLevel)(settings.rendererTraceMinLevel);
121
173
  }
122
- (0, import_tracing2.setRendererTraceMinLevel)(settings.rendererTraceMinLevel);
123
174
  if (typeof container.instance !== "function") {
124
175
  return;
125
176
  }
@@ -140,7 +191,7 @@ function registerReservedRuntimeHandlers(router, options, settings, rendererTrac
140
191
  );
141
192
  router.registerReservedHandler("__woodConfig", async () => ({
142
193
  // App extension fields first so Wood's reserved keys always win.
143
- ...await (0, import_renderer_config_extension.resolveRendererConfigExtension)(),
194
+ ...await (0, import_renderer_config_extension.resolveRendererConfigExtension)(options.rendererConfigExtension ?? (options.legacyGlobals ? void 0 : null)),
144
195
  rendererTraceEnabled: settings.rendererTraceEnabled,
145
196
  rendererTraceMinLevel: settings.rendererTraceMinLevel,
146
197
  rendererTraceBatchEnabled: settings.rendererTraceBatchEnabled,
@@ -150,9 +201,9 @@ function registerReservedRuntimeHandlers(router, options, settings, rendererTrac
150
201
  return rendererTraceBatchHost.receive(data, options.resolveRendererTraceContext?.(event) ?? {});
151
202
  });
152
203
  }
153
- function registerRuntimeObservationBridges(ipcMain, settings, resolveContext) {
204
+ function registerRuntimeObservationBridges(ipcMain, settings, resolveContext, dispatcher) {
154
205
  if (settings.enableRendererLogBridge) {
155
- registerRendererLogBridge(ipcMain);
206
+ registerRendererLogBridge(ipcMain, dispatcher);
156
207
  }
157
208
  ipcMain.removeAllListeners?.("__trace");
158
209
  if (settings.enableRendererTraceBridge && settings.rendererTraceEnabled) {
@@ -174,8 +225,7 @@ function registerRendererTraceBridge(ipcMain, resolveContext) {
174
225
  });
175
226
  logger.info("renderer trace bridge registered (fire-and-forget)");
176
227
  }
177
- function registerRendererLogBridge(ipcMain) {
178
- const dispatcher = (0, import_renderer_log_dispatcher.getRendererLogDispatcher)();
228
+ function registerRendererLogBridge(ipcMain, dispatcher) {
179
229
  ipcMain.removeAllListeners?.("__log");
180
230
  ipcMain.on("__log", (_event, rawPayload) => {
181
231
  const entry = coerceRendererLogPayload(rawPayload, null);
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/runtime/runtime.ts"],"sourcesContent":["import { getLogger } from '@noego/logger';\nimport { WoodRouter } from '../router/wood_router.cjs';\nimport { getContainer } from './get_container.cjs';\nimport {\n RendererTraceBatchHost,\n TraceProviderConfiguration,\n dispatchRendererTracePayload,\n} from '../tracing/index.js';\nimport {\n setMainTraceMinLevel,\n setRendererTraceMinLevel,\n type TraceLevel,\n type TraceRuntimeContext,\n type WoodTraceBatchReceiver,\n} from '../tracing/index.js';\nimport {\n getRendererLogDispatcher,\n type RendererLogDispatchResult,\n type RendererLogEntry,\n type RendererLogLevel,\n} from './renderer_log_dispatcher.js';\nimport { dispatchRendererLogBatch } from './renderer_log_batch_receiver.js';\nimport { resolveRendererConfigExtension } from './renderer_config_extension.js';\nimport { getRendererTraceBatchReceiver } from './renderer_trace_batch_receiver_registry.js';\nimport { resolveWoodAppEnv, type WoodAppEnv } from './app_env.js';\n\nconst logger = getLogger('wood:runtime');\n\ntype IpcMainLike = {\n handle: (channel: string, handler: (_event: unknown, data: unknown) => Promise<unknown> | unknown) => void;\n on: (channel: string, handler: (_event: unknown, ...args: unknown[]) => void) => void;\n removeHandler?: (channel: string) => void;\n removeAllListeners?: (channel: string) => void;\n};\n\nexport interface RegisterRuntimeRouter {\n registerController(name: string, cls: any): void;\n loadOperations(operations: Map<string, any>): void;\n}\n\nexport interface RuntimeOptions {\n ipcMain: IpcMainLike;\n registerRuntime: (router: RegisterRuntimeRouter) => void;\n container?: any;\n controllersDir: string;\n middlewareDir: string;\n mode?: 'bundled' | 'dev';\n /** Override the resolved app environment tier reported to renderers via __woodConfig. */\n appEnv?: WoodAppEnv;\n enableRendererLogBridge?: boolean;\n enableRendererTraceBridge?: boolean;\n traceMinLevel?: TraceLevel;\n rendererTraceEnabled?: boolean;\n rendererTraceMinLevel?: TraceLevel;\n /** Resolves only with the acknowledgement produced by the downstream durable receiver. */\n rendererTraceBatchReceiver?: WoodTraceBatchReceiver;\n onLoad?: (data: unknown, event?: unknown) => Promise<unknown>;\n onNavigate?: (data: unknown, event?: unknown) => Promise<unknown>;\n onWindow?: (data: unknown, event?: unknown) => Promise<unknown>;\n onDebug?: (data: unknown, event?: unknown) => Promise<unknown>;\n onContextMenu?: (data: unknown, event?: unknown) => Promise<unknown>;\n resolveRendererTraceContext?: (event: unknown) => TraceRuntimeContext | undefined;\n}\n\nexport interface RuntimeResult {\n router: WoodRouter;\n}\n\ntype RendererLogPayload = {\n level: string;\n logger: string;\n message: string;\n context?: unknown;\n};\n\ntype IpcInvokeEventLike = {\n sender?: {\n id?: number;\n };\n};\n\ntype RuntimeReservedHandler = (\n data: unknown,\n event?: unknown,\n) => Promise<unknown>;\n\ntype RuntimeTraceSettings = Readonly<{\n enableRendererLogBridge: boolean;\n enableRendererTraceBridge: boolean;\n traceMinLevel: TraceLevel | undefined;\n rendererTraceEnabled: boolean;\n rendererTraceMinLevel: TraceLevel;\n rendererTraceBatchEnabled: boolean;\n}>;\n\nfunction normalizeRendererLogLevel(level: unknown): RendererLogLevel {\n if (typeof level === 'string') {\n const normalized = level.trim().toLowerCase();\n if (normalized.length > 0) {\n return normalized;\n }\n }\n return 'info';\n}\n\nfunction coerceRendererLogPayload(\n rawPayload: unknown,\n event: unknown,\n): RendererLogEntry {\n const payload = (rawPayload ?? {}) as Partial<RendererLogPayload>;\n const ipcEvent = event as IpcInvokeEventLike;\n\n return {\n level: normalizeRendererLogLevel(payload.level),\n logger: typeof payload.logger === 'string' && payload.logger.trim().length > 0\n ? payload.logger\n : 'renderer',\n message: typeof payload.message === 'string' ? payload.message : '',\n context: payload.context,\n timestamp: new Date().toISOString(),\n senderId: typeof ipcEvent?.sender?.id === 'number' ? ipcEvent.sender.id : null,\n };\n}\n\n/**\n * Boot a bundled-safe Wood runtime using pre-generated static runtime artifacts.\n */\nexport async function runtime(options: RuntimeOptions): Promise<RuntimeResult> {\n const {\n ipcMain,\n registerRuntime,\n controllersDir,\n middlewareDir,\n mode = 'bundled',\n enableRendererLogBridge = true,\n enableRendererTraceBridge = true,\n traceMinLevel,\n rendererTraceEnabled = false,\n rendererTraceMinLevel = 'debug',\n } = options;\n\n const container = options.container ?? getContainer();\n const rendererTraceBatchReceiver = options.rendererTraceBatchReceiver\n ?? getRendererTraceBatchReceiver();\n const rendererTraceBatchEnabled = rendererTraceBatchReceiver !== null;\n const rendererTraceBatchHost = new RendererTraceBatchHost(\n rendererTraceBatchReceiver,\n );\n\n logger.info('runtime start', {\n mode,\n hasProvidedContainer: !!options.container,\n controllersDir,\n middlewareDir,\n enableRendererLogBridge,\n enableRendererTraceBridge,\n traceMinLevel: traceMinLevel ?? 'debug',\n rendererTraceEnabled,\n rendererTraceMinLevel,\n rendererTraceBatchEnabled,\n });\n\n const traceSettings: RuntimeTraceSettings = {\n enableRendererLogBridge,\n enableRendererTraceBridge,\n traceMinLevel,\n rendererTraceEnabled,\n rendererTraceMinLevel,\n rendererTraceBatchEnabled,\n };\n await configureRuntimeTracing(container, traceSettings);\n\n const router = new WoodRouter({\n container,\n controllersDir,\n middlewareDir,\n mode,\n });\n\n registerRuntime(router);\n logger.info('runtime registration complete');\n\n router.validateControllers();\n logger.info('runtime controller validation complete');\n\n router.precompileSchemas();\n logger.info('runtime schema pre-compilation complete');\n\n registerReservedRuntimeHandlers(router, options, traceSettings, rendererTraceBatchHost);\n registerRuntimeObservationBridges(ipcMain, traceSettings, options.resolveRendererTraceContext);\n\n router.registerIpcHandlers(ipcMain);\n logger.info('runtime ipc handlers registered', {\n channelCount: router.getChannels().length,\n enableRendererLogBridge,\n enableRendererTraceBridge,\n });\n\n return { router };\n}\n\nasync function configureRuntimeTracing(\n container: any,\n settings: RuntimeTraceSettings,\n): Promise<void> {\n if (settings.traceMinLevel) {\n setMainTraceMinLevel(settings.traceMinLevel);\n }\n setRendererTraceMinLevel(settings.rendererTraceMinLevel);\n if (typeof container.instance !== 'function') {\n return;\n }\n\n const traceConfiguration = await container.instance(TraceProviderConfiguration);\n traceConfiguration.configureRuntime('main');\n if (settings.traceMinLevel) {\n traceConfiguration.configureMinLevel(settings.traceMinLevel);\n }\n}\n\nfunction registerReservedRuntimeHandlers(\n router: WoodRouter,\n options: RuntimeOptions,\n settings: RuntimeTraceSettings,\n rendererTraceBatchHost: RendererTraceBatchHost,\n): void {\n router.registerReservedHandler('__load', requireRuntimeHandler('__load', 'onLoad', options.onLoad));\n router.registerReservedHandler('__navigate', requireRuntimeHandler('__navigate', 'onNavigate', options.onNavigate));\n router.registerReservedHandler('__window', requireRuntimeHandler('__window', 'onWindow', options.onWindow));\n router.registerReservedHandler('__debug', requireRuntimeHandler('__debug', 'onDebug', options.onDebug));\n router.registerReservedHandler(\n '__contextMenu',\n requireRuntimeHandler('__contextMenu', 'onContextMenu', options.onContextMenu),\n );\n router.registerReservedHandler('__woodConfig', async () => ({\n // App extension fields first so Wood's reserved keys always win.\n ...(await resolveRendererConfigExtension()),\n rendererTraceEnabled: settings.rendererTraceEnabled,\n rendererTraceMinLevel: settings.rendererTraceMinLevel,\n rendererTraceBatchEnabled: settings.rendererTraceBatchEnabled,\n appEnv: options.appEnv ?? await resolveWoodAppEnv(),\n }));\n router.registerReservedHandler('__traceBatch', async (data, event) => {\n return rendererTraceBatchHost.receive(data, options.resolveRendererTraceContext?.(event) ?? {});\n });\n}\n\nfunction registerRuntimeObservationBridges(\n ipcMain: IpcMainLike,\n settings: RuntimeTraceSettings,\n resolveContext: RuntimeOptions['resolveRendererTraceContext'],\n): void {\n if (settings.enableRendererLogBridge) {\n registerRendererLogBridge(ipcMain);\n }\n ipcMain.removeAllListeners?.('__trace');\n if (settings.enableRendererTraceBridge && settings.rendererTraceEnabled) {\n registerRendererTraceBridge(ipcMain, resolveContext);\n }\n}\n\nfunction requireRuntimeHandler(\n channel: string,\n optionName: string,\n handler: RuntimeReservedHandler | undefined,\n): RuntimeReservedHandler {\n return async (data, event) => {\n if (!handler) {\n throw new Error(`Reserved channel \"${channel}\" not configured. Provide runtime({ ${optionName} }).`);\n }\n return handler(data, event);\n };\n}\n\nfunction registerRendererTraceBridge(\n ipcMain: IpcMainLike,\n resolveContext?: (event: unknown) => TraceRuntimeContext | undefined,\n): void {\n ipcMain.removeAllListeners?.('__trace');\n\n ipcMain.on('__trace', (event, rawPayload) => {\n dispatchRendererTracePayload(rawPayload, resolveContext?.(event));\n });\n\n logger.info('renderer trace bridge registered (fire-and-forget)');\n}\n\nfunction registerRendererLogBridge(ipcMain: IpcMainLike): void {\n const dispatcher = getRendererLogDispatcher();\n\n ipcMain.removeAllListeners?.('__log');\n\n ipcMain.on('__log', (_event, rawPayload) => {\n const entry = coerceRendererLogPayload(rawPayload, null);\n void dispatcher.dispatch(entry).then((result) => {\n const typedResult = result as RendererLogDispatchResult;\n if (!typedResult.ok) {\n logger.warn('renderer log dispatch failed', {\n logger: entry.logger,\n messageLength: entry.message.length,\n reason: typedResult.reason ?? null,\n errorMessage: typedResult.errorMessage ?? null,\n });\n }\n });\n });\n\n ipcMain.removeAllListeners?.('__log_batch');\n\n ipcMain.on('__log_batch', (_event, rawPayload) => {\n const result = dispatchRendererLogBatch(rawPayload);\n if (!result.ok) {\n logger.warn('renderer log batch rejected', {\n reason: result.reason ?? null,\n errorMessage: result.errorMessage ?? null,\n });\n }\n });\n\n logger.info('renderer log bridge registered (fire-and-forget)');\n}\n"],"mappings":"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","names":["import_tracing"]}
1
+ {"version":3,"sources":["../../src/runtime/runtime.ts"],"sourcesContent":["import { getRendererTraceBatchReceiver } from './renderer_trace_batch_receiver_registry.js';\nimport { getLogger } from '@noego/logger';\nimport { WoodRouter } from '../router/wood_router.cjs';\nimport { createWoodRoot } from './get_container.cjs';\nimport { ExecutionContext } from '@noego/ioc';\nimport { installWoodRuntime } from './runtime_module.js';\nimport {\n RendererTraceBatchHost,\n TraceProviderConfiguration,\n dispatchRendererTracePayload,\n} from '../tracing/index.js';\nimport {\n setMainTraceMinLevel,\n setRendererTraceMinLevel,\n type TraceLevel,\n type TraceRuntimeContext,\n type WoodTraceBatchReceiver,\n} from '../tracing/index.js';\nimport {\n getRendererLogDispatcher,\n RendererLogDispatcher,\n type RendererLogDispatchResult,\n type RendererLogEntry,\n type RendererLogLevel,\n} from './renderer_log_dispatcher.js';\nimport { dispatchRendererLogBatch } from './renderer_log_batch_receiver.js';\nimport { resolveRendererConfigExtension, type RendererConfigExtension } from './renderer_config_extension.js';\nimport { resolveWoodAppEnv, type WoodAppEnv } from './app_env.js';\n\nconst logger = getLogger('wood:runtime');\n\ntype IpcMainLike = {\n handle: (channel: string, handler: (_event: unknown, data: unknown) => Promise<unknown> | unknown) => void;\n on: (channel: string, handler: (_event: unknown, ...args: unknown[]) => void) => void;\n removeHandler?: (channel: string) => void;\n removeAllListeners?: (channel: string) => void;\n removeListener?: (channel: string, listener: (...args: any[]) => void) => void;\n};\n\nexport interface RegisterRuntimeRouter {\n registerController(name: string, cls: any): void;\n loadOperations(operations: Map<string, any>): void;\n}\n\nexport interface RuntimeOptions {\n ipcMain: IpcMainLike;\n /** Explicit migration adapter for the old process-global observation hooks. */\n legacyGlobals?: boolean;\n rendererLogDispatcher?: RendererLogDispatcher;\n rendererConfigExtension?: RendererConfigExtension;\n registerRuntime: (router: RegisterRuntimeRouter) => void;\n container?: any;\n controllersDir: string;\n middlewareDir: string;\n mode?: 'bundled' | 'dev';\n /** Override the resolved app environment tier reported to renderers via __woodConfig. */\n appEnv?: WoodAppEnv;\n enableRendererLogBridge?: boolean;\n enableRendererTraceBridge?: boolean;\n traceMinLevel?: TraceLevel;\n rendererTraceEnabled?: boolean;\n rendererTraceMinLevel?: TraceLevel;\n /** Resolves only with the acknowledgement produced by the downstream durable receiver. */\n rendererTraceBatchReceiver?: WoodTraceBatchReceiver;\n onLoad?: (data: unknown, event?: unknown) => Promise<unknown>;\n onNavigate?: (data: unknown, event?: unknown) => Promise<unknown>;\n onWindow?: (data: unknown, event?: unknown) => Promise<unknown>;\n onDebug?: (data: unknown, event?: unknown) => Promise<unknown>;\n onContextMenu?: (data: unknown, event?: unknown) => Promise<unknown>;\n resolveRendererTraceContext?: (event: unknown) => TraceRuntimeContext | undefined;\n}\n\nexport interface RuntimeResult {\n router: WoodRouter;\n /** Stop admission, drain operations, remove owned IPC handlers and dispose an internally created root. */\n dispose(timeoutMs?: number): Promise<void>;\n}\n\ntype RendererLogPayload = {\n level: string;\n logger: string;\n message: string;\n context?: unknown;\n};\n\ntype IpcInvokeEventLike = {\n sender?: {\n id?: number;\n };\n};\n\ntype RuntimeReservedHandler = (\n data: unknown,\n event?: unknown,\n) => Promise<unknown>;\n\ntype RuntimeTraceSettings = Readonly<{\n enableRendererLogBridge: boolean;\n enableRendererTraceBridge: boolean;\n traceMinLevel: TraceLevel | undefined;\n rendererTraceEnabled: boolean;\n rendererTraceMinLevel: TraceLevel;\n rendererTraceBatchEnabled: boolean;\n}>;\n\nfunction normalizeRendererLogLevel(level: unknown): RendererLogLevel {\n if (typeof level === 'string') {\n const normalized = level.trim().toLowerCase();\n if (normalized.length > 0) {\n return normalized;\n }\n }\n return 'info';\n}\n\nfunction coerceRendererLogPayload(\n rawPayload: unknown,\n event: unknown,\n): RendererLogEntry {\n const payload = (rawPayload ?? {}) as Partial<RendererLogPayload>;\n const ipcEvent = event as IpcInvokeEventLike;\n\n return {\n level: normalizeRendererLogLevel(payload.level),\n logger: typeof payload.logger === 'string' && payload.logger.trim().length > 0\n ? payload.logger\n : 'renderer',\n message: typeof payload.message === 'string' ? payload.message : '',\n context: payload.context,\n timestamp: new Date().toISOString(),\n senderId: typeof ipcEvent?.sender?.id === 'number' ? ipcEvent.sender.id : null,\n };\n}\n\n/**\n * Boot a bundled-safe Wood runtime using pre-generated static runtime artifacts.\n */\nexport async function runtime(options: RuntimeOptions): Promise<RuntimeResult> {\n const {\n registerRuntime,\n controllersDir,\n middlewareDir,\n mode = 'bundled',\n enableRendererLogBridge = true,\n enableRendererTraceBridge = true,\n traceMinLevel,\n rendererTraceEnabled = false,\n rendererTraceMinLevel = 'debug',\n } = options;\n\n const container = options.container ?? createWoodRoot();\n const rendererTraceBatchReceiver = options.rendererTraceBatchReceiver\n ?? (options.legacyGlobals ? getRendererTraceBatchReceiver() : null);\n const rendererTraceBatchEnabled = rendererTraceBatchReceiver !== null;\n const handlers: string[] = [];\n const listeners: Array<[string, (...args: any[]) => void]> = [];\n let router: WoodRouter | undefined;\n let closing: Promise<void> | undefined;\n const dispose = (timeoutMs?: number): Promise<void> => closing ??= (async () => {\n const errors: unknown[] = [];\n for (const channel of handlers.splice(0)) {\n try { options.ipcMain.removeHandler?.(channel); } catch (error) { errors.push(error); }\n }\n for (const [channel, listener] of listeners.splice(0)) {\n try {\n if (options.ipcMain.removeListener) options.ipcMain.removeListener(channel, listener);\n else options.ipcMain.removeAllListeners?.(channel);\n } catch (error) { errors.push(error); }\n }\n let drained = true;\n try { await router?.dispose(timeoutMs); } catch (error) { drained = false; errors.push(error); }\n // Pending work retains its root after a timeout. The caller can retry disposal.\n if (!options.container && drained) {\n try { await ExecutionContext.run(container, () => container.dispose()); } catch (error) { errors.push(error); }\n }\n if (errors.length) throw Object.assign(new Error('Wood runtime cleanup failed'), { errors });\n })().catch(error => { closing = undefined; throw error; });\n const ipcMain: IpcMainLike = {\n handle(channel, handler) {\n options.ipcMain.handle(channel, handler);\n handlers.push(channel);\n },\n on(channel, listener) {\n options.ipcMain.on(channel, listener);\n listeners.push([channel, listener]);\n },\n };\n try {\n installWoodRuntime(container, { controllersDir, middlewareDir, mode, registerRuntime });\n if (!container.isRegistered(RendererTraceBatchHost)) {\n container.registerFunction(RendererTraceBatchHost, () => new RendererTraceBatchHost(rendererTraceBatchReceiver));\n }\n const rendererTraceBatchHost = await ExecutionContext.run(container, () => container.get(RendererTraceBatchHost)) as RendererTraceBatchHost;\n\n logger.info('runtime start', {\n mode,\n hasProvidedContainer: !!options.container,\n controllersDir,\n middlewareDir,\n enableRendererLogBridge,\n enableRendererTraceBridge,\n traceMinLevel: traceMinLevel ?? 'debug',\n rendererTraceEnabled,\n rendererTraceMinLevel,\n rendererTraceBatchEnabled,\n });\n\n const traceSettings: RuntimeTraceSettings = {\n enableRendererLogBridge,\n enableRendererTraceBridge,\n traceMinLevel,\n rendererTraceEnabled,\n rendererTraceMinLevel,\n rendererTraceBatchEnabled,\n };\n await configureRuntimeTracing(container, traceSettings, options.legacyGlobals ?? false);\n\n router = await ExecutionContext.run(container, () => container.get(WoodRouter)) as WoodRouter;\n\n registerReservedRuntimeHandlers(router, options, traceSettings, rendererTraceBatchHost);\n registerRuntimeObservationBridges(ipcMain, traceSettings, options.resolveRendererTraceContext, options.rendererLogDispatcher ?? (options.legacyGlobals ? getRendererLogDispatcher() : new RendererLogDispatcher()));\n\n router.registerIpcHandlers(ipcMain);\n logger.info('runtime ipc handlers registered', {\n channelCount: router.getChannels().length,\n enableRendererLogBridge,\n enableRendererTraceBridge,\n });\n\n return { router, dispose };\n } catch (error) {\n try { await dispose(); } catch (cleanupError) {\n throw Object.assign(new Error('Wood runtime startup and cleanup failed'), { cause: error, errors: [error, cleanupError] });\n }\n throw error;\n }\n}\n\nasync function configureRuntimeTracing(\n container: any,\n settings: RuntimeTraceSettings,\n legacyGlobals: boolean,\n): Promise<void> {\n if (legacyGlobals) {\n if (settings.traceMinLevel) setMainTraceMinLevel(settings.traceMinLevel);\n setRendererTraceMinLevel(settings.rendererTraceMinLevel);\n }\n if (typeof container.instance !== 'function') {\n return;\n }\n\n const traceConfiguration = await container.instance(TraceProviderConfiguration);\n traceConfiguration.configureRuntime('main');\n if (settings.traceMinLevel) {\n traceConfiguration.configureMinLevel(settings.traceMinLevel);\n }\n}\n\nfunction registerReservedRuntimeHandlers(\n router: WoodRouter,\n options: RuntimeOptions,\n settings: RuntimeTraceSettings,\n rendererTraceBatchHost: RendererTraceBatchHost,\n): void {\n router.registerReservedHandler('__load', requireRuntimeHandler('__load', 'onLoad', options.onLoad));\n router.registerReservedHandler('__navigate', requireRuntimeHandler('__navigate', 'onNavigate', options.onNavigate));\n router.registerReservedHandler('__window', requireRuntimeHandler('__window', 'onWindow', options.onWindow));\n router.registerReservedHandler('__debug', requireRuntimeHandler('__debug', 'onDebug', options.onDebug));\n router.registerReservedHandler(\n '__contextMenu',\n requireRuntimeHandler('__contextMenu', 'onContextMenu', options.onContextMenu),\n );\n router.registerReservedHandler('__woodConfig', async () => ({\n // App extension fields first so Wood's reserved keys always win.\n ...(await resolveRendererConfigExtension(options.rendererConfigExtension ?? (options.legacyGlobals ? undefined : null))),\n rendererTraceEnabled: settings.rendererTraceEnabled,\n rendererTraceMinLevel: settings.rendererTraceMinLevel,\n rendererTraceBatchEnabled: settings.rendererTraceBatchEnabled,\n appEnv: options.appEnv ?? await resolveWoodAppEnv(),\n }));\n router.registerReservedHandler('__traceBatch', async (data, event) => {\n return rendererTraceBatchHost.receive(data, options.resolveRendererTraceContext?.(event) ?? {});\n });\n}\n\nfunction registerRuntimeObservationBridges(\n ipcMain: IpcMainLike,\n settings: RuntimeTraceSettings,\n resolveContext: RuntimeOptions['resolveRendererTraceContext'],\n dispatcher: RendererLogDispatcher,\n): void {\n if (settings.enableRendererLogBridge) {\n registerRendererLogBridge(ipcMain, dispatcher);\n }\n ipcMain.removeAllListeners?.('__trace');\n if (settings.enableRendererTraceBridge && settings.rendererTraceEnabled) {\n registerRendererTraceBridge(ipcMain, resolveContext);\n }\n}\n\nfunction requireRuntimeHandler(\n channel: string,\n optionName: string,\n handler: RuntimeReservedHandler | undefined,\n): RuntimeReservedHandler {\n return async (data, event) => {\n if (!handler) {\n throw new Error(`Reserved channel \"${channel}\" not configured. Provide runtime({ ${optionName} }).`);\n }\n return handler(data, event);\n };\n}\n\nfunction registerRendererTraceBridge(\n ipcMain: IpcMainLike,\n resolveContext?: (event: unknown) => TraceRuntimeContext | undefined,\n): void {\n ipcMain.removeAllListeners?.('__trace');\n\n ipcMain.on('__trace', (event, rawPayload) => {\n dispatchRendererTracePayload(rawPayload, resolveContext?.(event));\n });\n\n logger.info('renderer trace bridge registered (fire-and-forget)');\n}\n\nfunction registerRendererLogBridge(ipcMain: IpcMainLike, dispatcher: RendererLogDispatcher): void {\n\n ipcMain.removeAllListeners?.('__log');\n\n ipcMain.on('__log', (_event, rawPayload) => {\n const entry = coerceRendererLogPayload(rawPayload, null);\n void dispatcher.dispatch(entry).then((result) => {\n const typedResult = result as RendererLogDispatchResult;\n if (!typedResult.ok) {\n logger.warn('renderer log dispatch failed', {\n logger: entry.logger,\n messageLength: entry.message.length,\n reason: typedResult.reason ?? null,\n errorMessage: typedResult.errorMessage ?? null,\n });\n }\n });\n });\n\n ipcMain.removeAllListeners?.('__log_batch');\n\n ipcMain.on('__log_batch', (_event, rawPayload) => {\n const result = dispatchRendererLogBatch(rawPayload);\n if (!result.ok) {\n logger.warn('renderer log batch rejected', {\n reason: result.reason ?? null,\n errorMessage: result.errorMessage ?? null,\n });\n }\n });\n\n logger.info('renderer log bridge registered (fire-and-forget)');\n}\n"],"mappings":"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","names":["import_tracing"]}
@@ -1,9 +1,14 @@
1
1
  import { WoodRouter } from '../router/wood_router.cjs';
2
2
  import { c as TraceLevel, e as TraceRuntimeContext } from '../trace_hub-Cpo_nVze.cjs';
3
3
  import { WoodTraceBatchReceiver } from '../tracing/types/wood_trace_batch.types.cjs';
4
+ import { RendererLogDispatcher } from './renderer_log_dispatcher.cjs';
5
+ import { RendererConfigExtension } from './renderer_config_extension.cjs';
4
6
  import { WoodAppEnv } from './app_env.cjs';
5
7
  import '../types/operations.cjs';
6
8
  import '../types/context.cjs';
9
+ import '../validation/schema_validator.cjs';
10
+ import '../middleware/middleware_resolver.cjs';
11
+ import '../controller/controller_resolver.cjs';
7
12
  import 'rxjs';
8
13
  import '@noego/telemetry/core';
9
14
 
@@ -12,6 +17,7 @@ type IpcMainLike = {
12
17
  on: (channel: string, handler: (_event: unknown, ...args: unknown[]) => void) => void;
13
18
  removeHandler?: (channel: string) => void;
14
19
  removeAllListeners?: (channel: string) => void;
20
+ removeListener?: (channel: string, listener: (...args: any[]) => void) => void;
15
21
  };
16
22
  interface RegisterRuntimeRouter {
17
23
  registerController(name: string, cls: any): void;
@@ -19,6 +25,10 @@ interface RegisterRuntimeRouter {
19
25
  }
20
26
  interface RuntimeOptions {
21
27
  ipcMain: IpcMainLike;
28
+ /** Explicit migration adapter for the old process-global observation hooks. */
29
+ legacyGlobals?: boolean;
30
+ rendererLogDispatcher?: RendererLogDispatcher;
31
+ rendererConfigExtension?: RendererConfigExtension;
22
32
  registerRuntime: (router: RegisterRuntimeRouter) => void;
23
33
  container?: any;
24
34
  controllersDir: string;
@@ -42,6 +52,8 @@ interface RuntimeOptions {
42
52
  }
43
53
  interface RuntimeResult {
44
54
  router: WoodRouter;
55
+ /** Stop admission, drain operations, remove owned IPC handlers and dispose an internally created root. */
56
+ dispose(timeoutMs?: number): Promise<void>;
45
57
  }
46
58
  /**
47
59
  * Boot a bundled-safe Wood runtime using pre-generated static runtime artifacts.
@@ -1,9 +1,14 @@
1
1
  import { WoodRouter } from '../router/wood_router.js';
2
2
  import { c as TraceLevel, e as TraceRuntimeContext } from '../trace_hub-Cpo_nVze.js';
3
3
  import { WoodTraceBatchReceiver } from '../tracing/types/wood_trace_batch.types.js';
4
+ import { RendererLogDispatcher } from './renderer_log_dispatcher.js';
5
+ import { RendererConfigExtension } from './renderer_config_extension.js';
4
6
  import { WoodAppEnv } from './app_env.js';
5
7
  import '../types/operations.js';
6
8
  import '../types/context.js';
9
+ import '../validation/schema_validator.js';
10
+ import '../middleware/middleware_resolver.js';
11
+ import '../controller/controller_resolver.js';
7
12
  import 'rxjs';
8
13
  import '@noego/telemetry/core';
9
14
 
@@ -12,6 +17,7 @@ type IpcMainLike = {
12
17
  on: (channel: string, handler: (_event: unknown, ...args: unknown[]) => void) => void;
13
18
  removeHandler?: (channel: string) => void;
14
19
  removeAllListeners?: (channel: string) => void;
20
+ removeListener?: (channel: string, listener: (...args: any[]) => void) => void;
15
21
  };
16
22
  interface RegisterRuntimeRouter {
17
23
  registerController(name: string, cls: any): void;
@@ -19,6 +25,10 @@ interface RegisterRuntimeRouter {
19
25
  }
20
26
  interface RuntimeOptions {
21
27
  ipcMain: IpcMainLike;
28
+ /** Explicit migration adapter for the old process-global observation hooks. */
29
+ legacyGlobals?: boolean;
30
+ rendererLogDispatcher?: RendererLogDispatcher;
31
+ rendererConfigExtension?: RendererConfigExtension;
22
32
  registerRuntime: (router: RegisterRuntimeRouter) => void;
23
33
  container?: any;
24
34
  controllersDir: string;
@@ -42,6 +52,8 @@ interface RuntimeOptions {
42
52
  }
43
53
  interface RuntimeResult {
44
54
  router: WoodRouter;
55
+ /** Stop admission, drain operations, remove owned IPC handlers and dispose an internally created root. */
56
+ dispose(timeoutMs?: number): Promise<void>;
45
57
  }
46
58
  /**
47
59
  * Boot a bundled-safe Wood runtime using pre-generated static runtime artifacts.