@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.
- package/README.md +31 -0
- package/dist/client/index.cjs +18 -11
- package/dist/client/index.cjs.map +1 -1
- package/dist/client/index.d.cts +21 -1
- package/dist/client/index.d.ts +21 -1
- package/dist/client/index.js +17 -11
- package/dist/client/index.js.map +1 -1
- package/dist/codegen/renderer_app_generator.cjs +2 -9
- package/dist/codegen/renderer_app_generator.cjs.map +1 -1
- package/dist/codegen/renderer_app_generator.js +2 -9
- package/dist/codegen/renderer_app_generator.js.map +1 -1
- package/dist/controller/cleanup.cjs +39 -0
- package/dist/controller/cleanup.cjs.map +1 -0
- package/dist/controller/cleanup.d.cts +4 -0
- package/dist/controller/cleanup.d.ts +4 -0
- package/dist/controller/cleanup.js +15 -0
- package/dist/controller/cleanup.js.map +1 -0
- package/dist/controller/controller_lifecycle.cjs +26 -2
- package/dist/controller/controller_lifecycle.cjs.map +1 -1
- package/dist/controller/controller_lifecycle.d.cts +3 -1
- package/dist/controller/controller_lifecycle.d.ts +3 -1
- package/dist/controller/controller_lifecycle.js +24 -1
- package/dist/controller/controller_lifecycle.js.map +1 -1
- package/dist/frontend/frontend_lifecycle.cjs +5 -7
- package/dist/frontend/frontend_lifecycle.cjs.map +1 -1
- package/dist/frontend/frontend_lifecycle.d.cts +1 -14
- package/dist/frontend/frontend_lifecycle.d.ts +1 -14
- package/dist/frontend/frontend_lifecycle.js +5 -7
- package/dist/frontend/frontend_lifecycle.js.map +1 -1
- package/dist/frontend/frontend_surface.cjs +130 -104
- package/dist/frontend/frontend_surface.cjs.map +1 -1
- package/dist/frontend/frontend_surface.js +131 -105
- package/dist/frontend/frontend_surface.js.map +1 -1
- package/dist/frontend/work_registry.cjs +29 -4
- package/dist/frontend/work_registry.cjs.map +1 -1
- package/dist/frontend/work_registry.d.cts +2 -0
- package/dist/frontend/work_registry.d.ts +2 -0
- package/dist/frontend/work_registry.js +29 -4
- package/dist/frontend/work_registry.js.map +1 -1
- package/dist/index.d.cts +2 -0
- package/dist/index.d.ts +2 -0
- package/dist/ipc/index.cjs +6 -2
- package/dist/ipc/index.cjs.map +1 -1
- package/dist/ipc/index.d.cts +9 -0
- package/dist/ipc/index.d.ts +9 -0
- package/dist/ipc/index.js +6 -2
- package/dist/ipc/index.js.map +1 -1
- package/dist/main/index.cjs +53 -35
- package/dist/main/index.cjs.map +1 -1
- package/dist/main/index.d.cts +11 -2
- package/dist/main/index.d.ts +11 -2
- package/dist/main/index.js +56 -40
- package/dist/main/index.js.map +1 -1
- package/dist/main/startup_failure_handler.cjs +67 -0
- package/dist/main/startup_failure_handler.cjs.map +1 -0
- package/dist/main/startup_failure_handler.d.cts +16 -0
- package/dist/main/startup_failure_handler.d.ts +16 -0
- package/dist/main/startup_failure_handler.js +43 -0
- package/dist/main/startup_failure_handler.js.map +1 -0
- package/dist/router/index.d.cts +3 -0
- package/dist/router/index.d.ts +3 -0
- package/dist/router/wood_router.cjs +204 -123
- package/dist/router/wood_router.cjs.map +1 -1
- package/dist/router/wood_router.d.cts +20 -0
- package/dist/router/wood_router.d.ts +20 -0
- package/dist/router/wood_router.js +206 -125
- package/dist/router/wood_router.js.map +1 -1
- package/dist/runtime/index.cjs +13 -0
- package/dist/runtime/index.cjs.map +1 -1
- package/dist/runtime/index.d.cts +8 -4
- package/dist/runtime/index.d.ts +8 -4
- package/dist/runtime/index.js +8 -0
- package/dist/runtime/index.js.map +1 -1
- package/dist/runtime/renderer_config_extension.cjs +1 -2
- package/dist/runtime/renderer_config_extension.cjs.map +1 -1
- package/dist/runtime/renderer_config_extension.d.cts +1 -1
- package/dist/runtime/renderer_config_extension.d.ts +1 -1
- package/dist/runtime/renderer_config_extension.js +1 -2
- package/dist/runtime/renderer_config_extension.js.map +1 -1
- package/dist/runtime/renderer_log_dispatcher.cjs +2 -0
- package/dist/runtime/renderer_log_dispatcher.cjs.map +1 -1
- package/dist/runtime/renderer_log_dispatcher.d.cts +1 -1
- package/dist/runtime/renderer_log_dispatcher.d.ts +1 -1
- package/dist/runtime/renderer_log_dispatcher.js +1 -0
- package/dist/runtime/renderer_log_dispatcher.js.map +1 -1
- package/dist/runtime/runtime.cjs +107 -57
- package/dist/runtime/runtime.cjs.map +1 -1
- package/dist/runtime/runtime.d.cts +12 -0
- package/dist/runtime/runtime.d.ts +12 -0
- package/dist/runtime/runtime.js +110 -59
- package/dist/runtime/runtime.js.map +1 -1
- package/dist/runtime/runtime_module.cjs +58 -0
- package/dist/runtime/runtime_module.cjs.map +1 -0
- package/dist/runtime/runtime_module.d.cts +22 -0
- package/dist/runtime/runtime_module.d.ts +22 -0
- package/dist/runtime/runtime_module.js +30 -0
- package/dist/runtime/runtime_module.js.map +1 -0
- package/dist/testing/create_controller_harness.d.cts +3 -0
- package/dist/testing/create_controller_harness.d.ts +3 -0
- package/dist/testing/create_router_bridge.d.cts +3 -0
- package/dist/testing/create_router_bridge.d.ts +3 -0
- package/dist/testing/create_test_router.d.cts +3 -0
- package/dist/testing/create_test_router.d.ts +3 -0
- package/dist/testing/index.cjs +3 -0
- package/dist/testing/index.cjs.map +1 -1
- package/dist/testing/index.d.cts +6 -1
- package/dist/testing/index.d.ts +6 -1
- package/dist/testing/index.js +2 -0
- package/dist/testing/index.js.map +1 -1
- package/dist/testing/registration_only_root.cjs +168 -0
- package/dist/testing/registration_only_root.cjs.map +1 -0
- package/dist/testing/registration_only_root.d.cts +46 -0
- package/dist/testing/registration_only_root.d.ts +46 -0
- package/dist/testing/registration_only_root.js +141 -0
- package/dist/testing/registration_only_root.js.map +1 -0
- package/dist/testing/test_wood_config.cjs +382 -70
- package/dist/testing/test_wood_config.cjs.map +1 -1
- package/dist/testing/test_wood_config.d.cts +25 -1
- package/dist/testing/test_wood_config.d.ts +25 -1
- package/dist/testing/test_wood_config.js +388 -71
- package/dist/testing/test_wood_config.js.map +1 -1
- package/dist/testing/wood_dom_animation.cjs +213 -0
- package/dist/testing/wood_dom_animation.cjs.map +1 -0
- package/dist/testing/wood_dom_animation.d.cts +89 -0
- package/dist/testing/wood_dom_animation.d.ts +89 -0
- package/dist/testing/wood_dom_animation.js +185 -0
- package/dist/testing/wood_dom_animation.js.map +1 -0
- package/dist/testing/wood_env_renderer.cjs +81 -32
- package/dist/testing/wood_env_renderer.cjs.map +1 -1
- package/dist/testing/wood_env_renderer.d.cts +32 -1
- package/dist/testing/wood_env_renderer.d.ts +32 -1
- package/dist/testing/wood_env_renderer.js +84 -32
- package/dist/testing/wood_env_renderer.js.map +1 -1
- package/dist/transport/in_process_router_transport.d.cts +3 -0
- package/dist/transport/in_process_router_transport.d.ts +3 -0
- package/dist/transport/index.d.cts +3 -0
- package/dist/transport/index.d.ts +3 -0
- package/package.json +8 -6
- package/src/components/NavigationShell.svelte +12 -7
- package/src/controller/cleanup.ts +8 -0
- package/src/controller/controller_lifecycle.ts +24 -0
- 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
|
|
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
|
|
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\
|
|
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 };
|
|
@@ -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\
|
|
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":[]}
|
package/dist/runtime/runtime.cjs
CHANGED
|
@@ -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.
|
|
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
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
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
|
-
|
|
96
|
-
|
|
97
|
-
container
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
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 (
|
|
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.
|