@noego/wood 0.4.6 → 0.4.7
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/bin/wood.js +6 -1
- package/dist/client/app_env.cjs +39 -0
- package/dist/client/app_env.cjs.map +1 -0
- package/dist/client/app_env.d.cts +7 -0
- package/dist/client/app_env.d.ts +7 -0
- package/dist/client/app_env.js +14 -0
- package/dist/client/app_env.js.map +1 -0
- package/dist/client/index.cjs +33 -9
- package/dist/client/index.cjs.map +1 -1
- package/dist/client/index.d.cts +5 -1
- package/dist/client/index.d.ts +5 -1
- package/dist/client/index.js +32 -9
- package/dist/client/index.js.map +1 -1
- package/dist/codegen/channel_map_generator.cjs +102 -0
- package/dist/codegen/channel_map_generator.cjs.map +1 -0
- package/dist/codegen/channel_map_generator.d.cts +6 -0
- package/dist/codegen/channel_map_generator.d.ts +6 -0
- package/dist/codegen/channel_map_generator.js +78 -0
- package/dist/codegen/channel_map_generator.js.map +1 -0
- package/dist/codegen/controller_registration_generator.cjs +6 -1
- package/dist/codegen/controller_registration_generator.cjs.map +1 -1
- package/dist/codegen/controller_registration_generator.js +6 -1
- package/dist/codegen/controller_registration_generator.js.map +1 -1
- package/dist/codegen/generated_file_notice.cjs +40 -0
- package/dist/codegen/generated_file_notice.cjs.map +1 -0
- package/dist/codegen/generated_file_notice.d.cts +3 -0
- package/dist/codegen/generated_file_notice.d.ts +3 -0
- package/dist/codegen/generated_file_notice.js +16 -0
- package/dist/codegen/generated_file_notice.js.map +1 -0
- package/dist/codegen/index.cjs +3 -0
- package/dist/codegen/index.cjs.map +1 -1
- package/dist/codegen/index.d.cts +1 -0
- package/dist/codegen/index.d.ts +1 -0
- package/dist/codegen/index.js +2 -0
- package/dist/codegen/index.js.map +1 -1
- package/dist/codegen/preload_generator.cjs +97 -1
- package/dist/codegen/preload_generator.cjs.map +1 -1
- package/dist/codegen/preload_generator.js +97 -1
- package/dist/codegen/preload_generator.js.map +1 -1
- package/dist/codegen/renderer_app_generator.cjs +6 -1
- package/dist/codegen/renderer_app_generator.cjs.map +1 -1
- package/dist/codegen/renderer_app_generator.js +6 -1
- package/dist/codegen/renderer_app_generator.js.map +1 -1
- package/dist/codegen/renderer_controller_registration_generator.cjs +6 -1
- package/dist/codegen/renderer_controller_registration_generator.cjs.map +1 -1
- package/dist/codegen/renderer_controller_registration_generator.js +6 -1
- package/dist/codegen/renderer_controller_registration_generator.js.map +1 -1
- package/dist/codegen/renderer_view_manifest_generator.cjs +6 -1
- package/dist/codegen/renderer_view_manifest_generator.cjs.map +1 -1
- package/dist/codegen/renderer_view_manifest_generator.js +6 -1
- package/dist/codegen/renderer_view_manifest_generator.js.map +1 -1
- package/dist/codegen/runtime_generator.cjs +6 -1
- package/dist/codegen/runtime_generator.cjs.map +1 -1
- package/dist/codegen/runtime_generator.js +6 -1
- package/dist/codegen/runtime_generator.js.map +1 -1
- package/dist/codegen/test_mock_generator.cjs +5 -1
- package/dist/codegen/test_mock_generator.cjs.map +1 -1
- package/dist/codegen/test_mock_generator.js +5 -1
- package/dist/codegen/test_mock_generator.js.map +1 -1
- package/dist/codegen/type_generator.cjs +6 -1
- package/dist/codegen/type_generator.cjs.map +1 -1
- package/dist/codegen/type_generator.js +6 -1
- package/dist/codegen/type_generator.js.map +1 -1
- package/dist/index.cjs +19 -6
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +7 -1
- package/dist/index.d.ts +7 -1
- package/dist/index.js +13 -1
- package/dist/index.js.map +1 -1
- package/dist/main/index.cjs +133 -55
- package/dist/main/index.cjs.map +1 -1
- package/dist/main/index.d.cts +30 -2
- package/dist/main/index.d.ts +30 -2
- package/dist/main/index.js +134 -55
- package/dist/main/index.js.map +1 -1
- package/dist/main/renderer_trace_drain_coordinator.cjs +127 -0
- package/dist/main/renderer_trace_drain_coordinator.cjs.map +1 -0
- package/dist/main/renderer_trace_drain_coordinator.d.cts +46 -0
- package/dist/main/renderer_trace_drain_coordinator.d.ts +46 -0
- package/dist/main/renderer_trace_drain_coordinator.js +101 -0
- package/dist/main/renderer_trace_drain_coordinator.js.map +1 -0
- package/dist/router/wood_router.cjs +9 -1
- package/dist/router/wood_router.cjs.map +1 -1
- package/dist/router/wood_router.d.cts +1 -1
- package/dist/router/wood_router.d.ts +1 -1
- package/dist/router/wood_router.js +9 -1
- package/dist/router/wood_router.js.map +1 -1
- package/dist/runtime/app_env.cjs +52 -0
- package/dist/runtime/app_env.cjs.map +1 -0
- package/dist/runtime/app_env.d.cts +10 -0
- package/dist/runtime/app_env.d.ts +10 -0
- package/dist/runtime/app_env.js +18 -0
- package/dist/runtime/app_env.js.map +1 -0
- package/dist/runtime/index.cjs +9 -2
- package/dist/runtime/index.cjs.map +1 -1
- package/dist/runtime/index.d.cts +5 -1
- package/dist/runtime/index.d.ts +5 -1
- package/dist/runtime/index.js +9 -1
- package/dist/runtime/index.js.map +1 -1
- 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.map +1 -1
- package/dist/runtime/renderer_trace_batch_receiver_registry.cjs +50 -0
- package/dist/runtime/renderer_trace_batch_receiver_registry.cjs.map +1 -0
- package/dist/runtime/renderer_trace_batch_receiver_registry.d.cts +10 -0
- package/dist/runtime/renderer_trace_batch_receiver_registry.d.ts +10 -0
- package/dist/runtime/renderer_trace_batch_receiver_registry.js +24 -0
- package/dist/runtime/renderer_trace_batch_receiver_registry.js.map +1 -0
- package/dist/runtime/runtime.cjs +75 -57
- package/dist/runtime/runtime.cjs.map +1 -1
- package/dist/runtime/runtime.d.cts +8 -1
- package/dist/runtime/runtime.d.ts +8 -1
- package/dist/runtime/runtime.js +80 -58
- package/dist/runtime/runtime.js.map +1 -1
- package/dist/testing/browser.cjs +540 -11
- package/dist/testing/browser.cjs.map +1 -1
- package/dist/testing/browser.d.cts +219 -3
- package/dist/testing/browser.d.ts +219 -3
- package/dist/testing/browser.js +540 -11
- package/dist/testing/browser.js.map +1 -1
- package/dist/testing/create_controller_harness.d.cts +1 -1
- package/dist/testing/create_controller_harness.d.ts +1 -1
- package/dist/testing/index.cjs +13 -0
- package/dist/testing/index.cjs.map +1 -1
- package/dist/testing/index.d.cts +7 -2
- package/dist/testing/index.d.ts +7 -2
- package/dist/testing/index.js +14 -0
- package/dist/testing/index.js.map +1 -1
- package/dist/trace-testing/index.d.cts +1 -1
- package/dist/trace-testing/index.d.ts +1 -1
- package/dist/trace-testing/trace_recorder.d.cts +1 -1
- package/dist/trace-testing/trace_recorder.d.ts +1 -1
- package/dist/trace-transport/index.cjs +32 -0
- package/dist/trace-transport/index.cjs.map +1 -0
- package/dist/trace-transport/index.d.cts +6 -0
- package/dist/trace-transport/index.d.ts +6 -0
- package/dist/trace-transport/index.js +7 -0
- package/dist/trace-transport/index.js.map +1 -0
- package/dist/trace_hub-Cob54qRx.d.cts +56 -0
- package/dist/trace_hub-Cob54qRx.d.ts +56 -0
- package/dist/tracing/index.cjs +14 -0
- package/dist/tracing/index.cjs.map +1 -1
- package/dist/tracing/index.d.cts +7 -1
- package/dist/tracing/index.d.ts +7 -1
- package/dist/tracing/index.js +12 -0
- package/dist/tracing/index.js.map +1 -1
- package/dist/tracing/renderer_trace_batch_host.cjs +80 -0
- package/dist/tracing/renderer_trace_batch_host.cjs.map +1 -0
- package/dist/tracing/renderer_trace_batch_host.d.cts +16 -0
- package/dist/tracing/renderer_trace_batch_host.d.ts +16 -0
- package/dist/tracing/renderer_trace_batch_host.js +56 -0
- package/dist/tracing/renderer_trace_batch_host.js.map +1 -0
- package/dist/tracing/renderer_trace_batch_transport.cjs +313 -0
- package/dist/tracing/renderer_trace_batch_transport.cjs.map +1 -0
- package/dist/tracing/renderer_trace_batch_transport.d.cts +53 -0
- package/dist/tracing/renderer_trace_batch_transport.d.ts +53 -0
- package/dist/tracing/renderer_trace_batch_transport.js +292 -0
- package/dist/tracing/renderer_trace_batch_transport.js.map +1 -0
- package/dist/tracing/trace_commit_writer.cjs +159 -0
- package/dist/tracing/trace_commit_writer.cjs.map +1 -0
- package/dist/tracing/trace_commit_writer.d.cts +97 -0
- package/dist/tracing/trace_commit_writer.d.ts +97 -0
- package/dist/tracing/trace_commit_writer.js +135 -0
- package/dist/tracing/trace_commit_writer.js.map +1 -0
- package/dist/tracing/trace_hub.cjs +58 -3
- package/dist/tracing/trace_hub.cjs.map +1 -1
- package/dist/tracing/trace_hub.d.cts +2 -46
- package/dist/tracing/trace_hub.d.ts +2 -46
- package/dist/tracing/trace_hub.js +56 -3
- package/dist/tracing/trace_hub.js.map +1 -1
- package/dist/tracing/trace_provider.cjs +42 -12
- package/dist/tracing/trace_provider.cjs.map +1 -1
- package/dist/tracing/trace_provider.d.cts +15 -1
- package/dist/tracing/trace_provider.d.ts +15 -1
- package/dist/tracing/trace_provider.js +43 -12
- package/dist/tracing/trace_provider.js.map +1 -1
- package/dist/tracing/types/wood_trace_batch.types.cjs +17 -0
- package/dist/tracing/types/wood_trace_batch.types.cjs.map +1 -0
- package/dist/tracing/types/wood_trace_batch.types.d.cts +124 -0
- package/dist/tracing/types/wood_trace_batch.types.d.ts +124 -0
- package/dist/tracing/types/wood_trace_batch.types.js +1 -0
- package/dist/tracing/types/wood_trace_batch.types.js.map +1 -0
- package/dist/tracing/types/wood_trace_sink.types.cjs +17 -0
- package/dist/tracing/types/wood_trace_sink.types.cjs.map +1 -0
- package/dist/tracing/types/wood_trace_sink.types.d.cts +2 -0
- package/dist/tracing/types/wood_trace_sink.types.d.ts +2 -0
- package/dist/tracing/types/wood_trace_sink.types.js +1 -0
- package/dist/tracing/types/wood_trace_sink.types.js.map +1 -0
- package/dist/tracing/wood_trace_batch_contract.cjs +229 -0
- package/dist/tracing/wood_trace_batch_contract.cjs.map +1 -0
- package/dist/tracing/wood_trace_batch_contract.d.cts +23 -0
- package/dist/tracing/wood_trace_batch_contract.d.ts +23 -0
- package/dist/tracing/wood_trace_batch_contract.js +205 -0
- package/dist/tracing/wood_trace_batch_contract.js.map +1 -0
- package/dist/transport/build_transport_bridge.cjs +62 -0
- package/dist/transport/build_transport_bridge.cjs.map +1 -0
- package/dist/transport/build_transport_bridge.d.cts +29 -0
- package/dist/transport/build_transport_bridge.d.ts +29 -0
- package/dist/transport/build_transport_bridge.js +38 -0
- package/dist/transport/build_transport_bridge.js.map +1 -0
- package/dist/transport/in_process_router_transport.cjs +41 -0
- package/dist/transport/in_process_router_transport.cjs.map +1 -0
- package/dist/transport/in_process_router_transport.d.cts +31 -0
- package/dist/transport/in_process_router_transport.d.ts +31 -0
- package/dist/transport/in_process_router_transport.js +17 -0
- package/dist/transport/in_process_router_transport.js.map +1 -0
- package/dist/transport/index.cjs +42 -0
- package/dist/transport/index.cjs.map +1 -0
- package/dist/transport/index.d.cts +8 -0
- package/dist/transport/index.d.ts +8 -0
- package/dist/transport/index.js +19 -0
- package/dist/transport/index.js.map +1 -0
- package/dist/transport/loopback_remote_transport.cjs +270 -0
- package/dist/transport/loopback_remote_transport.cjs.map +1 -0
- package/dist/transport/loopback_remote_transport.d.cts +49 -0
- package/dist/transport/loopback_remote_transport.d.ts +49 -0
- package/dist/transport/loopback_remote_transport.js +237 -0
- package/dist/transport/loopback_remote_transport.js.map +1 -0
- package/dist/transport/loopback_serialization.cjs +116 -0
- package/dist/transport/loopback_serialization.cjs.map +1 -0
- package/dist/transport/loopback_serialization.d.cts +28 -0
- package/dist/transport/loopback_serialization.d.ts +28 -0
- package/dist/transport/loopback_serialization.js +91 -0
- package/dist/transport/loopback_serialization.js.map +1 -0
- package/dist/transport/transport_contract_suite.cjs +110 -0
- package/dist/transport/transport_contract_suite.cjs.map +1 -0
- package/dist/transport/transport_contract_suite.d.cts +23 -0
- package/dist/transport/transport_contract_suite.d.ts +23 -0
- package/dist/transport/transport_contract_suite.js +85 -0
- package/dist/transport/transport_contract_suite.js.map +1 -0
- package/dist/transport/wood_rpc_transport.cjs +17 -0
- package/dist/transport/wood_rpc_transport.cjs.map +1 -0
- package/dist/transport/wood_rpc_transport.d.cts +44 -0
- package/dist/transport/wood_rpc_transport.d.ts +44 -0
- package/dist/transport/wood_rpc_transport.js +1 -0
- package/dist/transport/wood_rpc_transport.js.map +1 -0
- package/docs/browser-testing.md +139 -1
- package/package.json +22 -3
- package/src/components/NavigationShell.browser.test.ts +236 -0
- package/src/components/NavigationShell.svelte +162 -49
package/bin/wood.js
CHANGED
|
@@ -253,7 +253,12 @@ function generateMainAppCode() {
|
|
|
253
253
|
const outDirValue = String(config.outDir || 'out').replace(/\\/g, '/').replace(/'/g, "\\'");
|
|
254
254
|
const traceTransport = mainSection.traceTransport === 'messageport' ? 'messageport' : null;
|
|
255
255
|
|
|
256
|
-
const code = `// AUTO-GENERATED by @noego/wood -- do not edit
|
|
256
|
+
const code = `// AUTO-GENERATED by @noego/wood -- do not edit.
|
|
257
|
+
//
|
|
258
|
+
// Changes here are overwritten by \`wood dev\` and \`wood build\`.
|
|
259
|
+
// Update the source files that feed Wood codegen instead.
|
|
260
|
+
// To change main-process boot wiring, controllers, middleware, windows, or trace transport,
|
|
261
|
+
// edit wood.config.yml and the referenced main-process source files.
|
|
257
262
|
import type { StartWoodMainOptions, WoodMainAppBootResult } from '@noego/wood/main';
|
|
258
263
|
import appBootModule from '${appBootImport}';
|
|
259
264
|
import mainBootModule from '${mainEntryImport}';
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
var app_env_exports = {};
|
|
20
|
+
__export(app_env_exports, {
|
|
21
|
+
getWoodAppEnv: () => getWoodAppEnv,
|
|
22
|
+
setWoodAppEnv: () => setWoodAppEnv
|
|
23
|
+
});
|
|
24
|
+
module.exports = __toCommonJS(app_env_exports);
|
|
25
|
+
const CLIENT_APP_ENV_SYMBOL = /* @__PURE__ */ Symbol.for("@noego/wood.client.app-env");
|
|
26
|
+
function setWoodAppEnv(value) {
|
|
27
|
+
if (value === "dev" || value === "local" || value === "packaged") {
|
|
28
|
+
globalThis[CLIENT_APP_ENV_SYMBOL] = value;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
function getWoodAppEnv() {
|
|
32
|
+
return globalThis[CLIENT_APP_ENV_SYMBOL] ?? "packaged";
|
|
33
|
+
}
|
|
34
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
35
|
+
0 && (module.exports = {
|
|
36
|
+
getWoodAppEnv,
|
|
37
|
+
setWoodAppEnv
|
|
38
|
+
});
|
|
39
|
+
//# sourceMappingURL=app_env.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/client/app_env.ts"],"sourcesContent":["import type { WoodAppEnv } from '../runtime/app_env.js';\n\nexport type { WoodAppEnv };\n\n// Stored on globalThis because this module is loaded twice at runtime: once in\n// wood's bundled dist (startWood) and once as raw source via the Svelte\n// component exports (NavigationShell); a module-local variable would not be shared.\nconst CLIENT_APP_ENV_SYMBOL = Symbol.for('@noego/wood.client.app-env');\n\ntype GlobalWithAppEnv = typeof globalThis & { [CLIENT_APP_ENV_SYMBOL]?: WoodAppEnv };\n\nexport function setWoodAppEnv(value: unknown): void {\n if (value === 'dev' || value === 'local' || value === 'packaged') {\n (globalThis as GlobalWithAppEnv)[CLIENT_APP_ENV_SYMBOL] = value;\n }\n}\n\n/** Environment tier of the running app, resolved by the main process during startWood boot. */\nexport function getWoodAppEnv(): WoodAppEnv {\n return (globalThis as GlobalWithAppEnv)[CLIENT_APP_ENV_SYMBOL] ?? 'packaged';\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAOA,MAAM,wBAAwB,uBAAO,IAAI,4BAA4B;AAI9D,SAAS,cAAc,OAAsB;AAClD,MAAI,UAAU,SAAS,UAAU,WAAW,UAAU,YAAY;AAChE,IAAC,WAAgC,qBAAqB,IAAI;AAAA,EAC5D;AACF;AAGO,SAAS,gBAA4B;AAC1C,SAAQ,WAAgC,qBAAqB,KAAK;AACpE;","names":[]}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { WoodAppEnv } from '../runtime/app_env.cjs';
|
|
2
|
+
|
|
3
|
+
declare function setWoodAppEnv(value: unknown): void;
|
|
4
|
+
/** Environment tier of the running app, resolved by the main process during startWood boot. */
|
|
5
|
+
declare function getWoodAppEnv(): WoodAppEnv;
|
|
6
|
+
|
|
7
|
+
export { WoodAppEnv, getWoodAppEnv, setWoodAppEnv };
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { WoodAppEnv } from '../runtime/app_env.js';
|
|
2
|
+
|
|
3
|
+
declare function setWoodAppEnv(value: unknown): void;
|
|
4
|
+
/** Environment tier of the running app, resolved by the main process during startWood boot. */
|
|
5
|
+
declare function getWoodAppEnv(): WoodAppEnv;
|
|
6
|
+
|
|
7
|
+
export { WoodAppEnv, getWoodAppEnv, setWoodAppEnv };
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
const CLIENT_APP_ENV_SYMBOL = /* @__PURE__ */ Symbol.for("@noego/wood.client.app-env");
|
|
2
|
+
function setWoodAppEnv(value) {
|
|
3
|
+
if (value === "dev" || value === "local" || value === "packaged") {
|
|
4
|
+
globalThis[CLIENT_APP_ENV_SYMBOL] = value;
|
|
5
|
+
}
|
|
6
|
+
}
|
|
7
|
+
function getWoodAppEnv() {
|
|
8
|
+
return globalThis[CLIENT_APP_ENV_SYMBOL] ?? "packaged";
|
|
9
|
+
}
|
|
10
|
+
export {
|
|
11
|
+
getWoodAppEnv,
|
|
12
|
+
setWoodAppEnv
|
|
13
|
+
};
|
|
14
|
+
//# sourceMappingURL=app_env.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/client/app_env.ts"],"sourcesContent":["import type { WoodAppEnv } from '../runtime/app_env.js';\n\nexport type { WoodAppEnv };\n\n// Stored on globalThis because this module is loaded twice at runtime: once in\n// wood's bundled dist (startWood) and once as raw source via the Svelte\n// component exports (NavigationShell); a module-local variable would not be shared.\nconst CLIENT_APP_ENV_SYMBOL = Symbol.for('@noego/wood.client.app-env');\n\ntype GlobalWithAppEnv = typeof globalThis & { [CLIENT_APP_ENV_SYMBOL]?: WoodAppEnv };\n\nexport function setWoodAppEnv(value: unknown): void {\n if (value === 'dev' || value === 'local' || value === 'packaged') {\n (globalThis as GlobalWithAppEnv)[CLIENT_APP_ENV_SYMBOL] = value;\n }\n}\n\n/** Environment tier of the running app, resolved by the main process during startWood boot. */\nexport function getWoodAppEnv(): WoodAppEnv {\n return (globalThis as GlobalWithAppEnv)[CLIENT_APP_ENV_SYMBOL] ?? 'packaged';\n}\n"],"mappings":"AAOA,MAAM,wBAAwB,uBAAO,IAAI,4BAA4B;AAI9D,SAAS,cAAc,OAAsB;AAClD,MAAI,UAAU,SAAS,UAAU,WAAW,UAAU,YAAY;AAChE,IAAC,WAAgC,qBAAqB,IAAI;AAAA,EAC5D;AACF;AAGO,SAAS,gBAA4B;AAC1C,SAAQ,WAAgC,qBAAqB,KAAK;AACpE;","names":[]}
|
package/dist/client/index.cjs
CHANGED
|
@@ -38,6 +38,7 @@ __export(client_exports, {
|
|
|
38
38
|
getIpc: () => import_ipc.getIpc,
|
|
39
39
|
getNavigation: () => import_navigation.getNavigation,
|
|
40
40
|
getWindowControls: () => getWindowControls,
|
|
41
|
+
getWoodAppEnv: () => import_app_env2.getWoodAppEnv,
|
|
41
42
|
setRendererTraceTransport: () => import_tracing.setRendererTraceTransport,
|
|
42
43
|
startWood: () => startWood
|
|
43
44
|
});
|
|
@@ -47,6 +48,8 @@ var import_reflect_metadata = require("reflect-metadata");
|
|
|
47
48
|
var import_ioc = require("@noego/ioc");
|
|
48
49
|
var import_navigation = require("../navigation/index.js");
|
|
49
50
|
var import_ipc = require("../ipc/index.js");
|
|
51
|
+
var import_app_env = require("./app_env.js");
|
|
52
|
+
var import_app_env2 = require("./app_env.js");
|
|
50
53
|
var import_tracing = require("../tracing/index.js");
|
|
51
54
|
var import_tracing2 = require("../tracing/index.js");
|
|
52
55
|
const CLIENT_CONTAINER_SYMBOL = /* @__PURE__ */ Symbol.for("@noego/wood.client.container");
|
|
@@ -322,6 +325,9 @@ class RendererLogger {
|
|
|
322
325
|
error(message, context) {
|
|
323
326
|
this.log("error", message, context);
|
|
324
327
|
}
|
|
328
|
+
logAt(level, rawMessage, context) {
|
|
329
|
+
this.log(level, rawMessage, context);
|
|
330
|
+
}
|
|
325
331
|
log(level, rawMessage, context) {
|
|
326
332
|
const message = stringifyLogMessage(rawMessage);
|
|
327
333
|
let bridge;
|
|
@@ -403,32 +409,49 @@ function resolveTarget(target) {
|
|
|
403
409
|
}
|
|
404
410
|
return target;
|
|
405
411
|
}
|
|
412
|
+
function configureRendererTraceTransport(config) {
|
|
413
|
+
const globalObj = globalThis;
|
|
414
|
+
if (config?.rendererTraceBatchEnabled) {
|
|
415
|
+
const batchGlobal = globalObj.__NOEGO_WOOD_TRACE_BATCH__;
|
|
416
|
+
if (batchGlobal && typeof batchGlobal.send === "function") {
|
|
417
|
+
const sender = batchGlobal.send.bind(batchGlobal);
|
|
418
|
+
(0, import_tracing.setRendererTraceTransport)((payload) => {
|
|
419
|
+
sender(payload);
|
|
420
|
+
});
|
|
421
|
+
return;
|
|
422
|
+
}
|
|
423
|
+
}
|
|
424
|
+
const traceGlobal = globalObj.__NOEGO_TRACE__;
|
|
425
|
+
if (traceGlobal && typeof traceGlobal.send === "function") {
|
|
426
|
+
const sender = traceGlobal.send.bind(traceGlobal);
|
|
427
|
+
(0, import_tracing.setRendererTraceTransport)((payload) => sender(payload));
|
|
428
|
+
}
|
|
429
|
+
}
|
|
406
430
|
async function startWood(mountRoot, target) {
|
|
407
431
|
const container = getContainer();
|
|
408
432
|
(0, import_navigation.getNavigation)();
|
|
409
|
-
|
|
410
|
-
const traceGlobal = globalThis.__NOEGO_TRACE__;
|
|
411
|
-
if (traceGlobal && typeof traceGlobal.send === "function") {
|
|
412
|
-
const sender = traceGlobal.send.bind(traceGlobal);
|
|
413
|
-
(0, import_tracing.setRendererTraceTransport)((payload) => sender(payload));
|
|
414
|
-
}
|
|
415
|
-
} catch {
|
|
416
|
-
}
|
|
433
|
+
let rendererTraceConfig = null;
|
|
417
434
|
try {
|
|
418
435
|
const bridge = resolveWoodBridge();
|
|
419
436
|
if (typeof bridge.__woodConfig === "function") {
|
|
420
437
|
const config = await bridge.__woodConfig();
|
|
438
|
+
rendererTraceConfig = config;
|
|
439
|
+
(0, import_app_env.setWoodAppEnv)(config?.appEnv);
|
|
421
440
|
const traceConfiguration = container.instance ? await container.instance(import_tracing.TraceProviderConfiguration) : null;
|
|
422
441
|
if (typeof config?.rendererTraceEnabled === "boolean") {
|
|
423
442
|
traceConfiguration?.configureEnabled(config.rendererTraceEnabled);
|
|
424
443
|
}
|
|
425
444
|
const level = config?.rendererTraceMinLevel;
|
|
426
|
-
if (
|
|
445
|
+
if (typeof level === "string" && level.trim().length > 0) {
|
|
427
446
|
traceConfiguration?.configureMinLevel(level);
|
|
428
447
|
}
|
|
429
448
|
}
|
|
430
449
|
} catch {
|
|
431
450
|
}
|
|
451
|
+
try {
|
|
452
|
+
configureRendererTraceTransport(rendererTraceConfig);
|
|
453
|
+
} catch {
|
|
454
|
+
}
|
|
432
455
|
return mountRoot(resolveTarget(target));
|
|
433
456
|
}
|
|
434
457
|
function createSvelteBoot(mountRoot) {
|
|
@@ -456,6 +479,7 @@ function createSvelteBoot(mountRoot) {
|
|
|
456
479
|
getIpc,
|
|
457
480
|
getNavigation,
|
|
458
481
|
getWindowControls,
|
|
482
|
+
getWoodAppEnv,
|
|
459
483
|
setRendererTraceTransport,
|
|
460
484
|
startWood
|
|
461
485
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/client/index.ts"],"sourcesContent":["import './global_polyfill.cjs';\nimport 'reflect-metadata';\nimport { Container } from '@noego/ioc';\nimport {\n Navigation,\n getNavigation,\n clearNavigationForTests as clearNavigationSingletonForTests,\n} from '../navigation/index.js';\nimport { Ipc, getIpc } from '../ipc/index.js';\nimport {\n TraceProviderConfiguration,\n clearTraceHubForTests,\n emitRendererTrace,\n setRendererTraceTransport,\n} from '../tracing/index.js';\nexport type {\n ControllerEvents,\n ControllerInput,\n ControllerLifecycle,\n ControllerState,\n PageController,\n} from './controller_contract.js';\n\nconst CLIENT_CONTAINER_SYMBOL = Symbol.for('@noego/wood.client.container');\nconst CLIENT_APP_SYMBOL = Symbol.for('@noego/wood.client.app');\nconst CLIENT_WINDOW_CONTROLS_SYMBOL = Symbol.for('@noego/wood.client.window-controls');\nconst CLIENT_LOGGER_REGISTRY_SYMBOL = Symbol.for('@noego/wood.client.logger-registry');\nconst INTERNAL_BRIDGE_GLOBAL_KEY = '__NOEGO_WOOD_BRIDGE__';\n\nexport const WOOD_INTERNAL_BRIDGE_KEY = INTERNAL_BRIDGE_GLOBAL_KEY;\n\nexport interface WoodRpcManifestEntry {\n channel: string;\n controller: string;\n action: string;\n path: string[];\n hasInput: boolean;\n}\n\ntype WoodBridgeRpcFunction = (data?: unknown) => Promise<unknown>;\ntype WoodBridgeLike = Record<string, unknown> & {\n __rpcManifest?: WoodRpcManifestEntry[];\n __window?: {\n current?: () => Promise<unknown>;\n open?: (windowId: string, options?: Record<string, unknown>) => Promise<unknown>;\n close?: (windowId?: string) => Promise<unknown>;\n focus?: (windowId: string) => Promise<unknown>;\n minimize?: (windowId?: string) => Promise<unknown>;\n maximize?: (windowId?: string) => Promise<unknown>;\n };\n __log?: (\n level: string,\n logger: string,\n message: string,\n context?: unknown,\n ) => void;\n __woodConfig?: () => Promise<unknown>;\n __trace?: (event: unknown) => void;\n};\n\ntype GlobalWithClientContainer = typeof globalThis & {\n [CLIENT_CONTAINER_SYMBOL]?: any;\n};\n\ntype GlobalWithClientApp = typeof globalThis & {\n [CLIENT_APP_SYMBOL]?: object;\n};\n\ntype GlobalWithWindowControls = typeof globalThis & {\n [CLIENT_WINDOW_CONTROLS_SYMBOL]?: WindowControls;\n};\n\ntype GlobalWithLoggerRegistry = typeof globalThis & {\n [CLIENT_LOGGER_REGISTRY_SYMBOL]?: Map<string, RendererLogger>;\n};\n\ninterface WoodContainerRegistration {\n registerFunction?(\n token: any,\n resolver: (...args: any[]) => unknown,\n options?: Record<string, unknown>,\n ): void;\n}\n\nexport class App {\n [controllerName: string]: unknown;\n}\n\nfunction resolveWoodBridge(): WoodBridgeLike {\n const globalObj = globalThis as typeof globalThis & {\n [INTERNAL_BRIDGE_GLOBAL_KEY]?: unknown;\n wood?: unknown;\n window?: {\n [INTERNAL_BRIDGE_GLOBAL_KEY]?: unknown;\n wood?: unknown;\n };\n };\n\n const bridge = globalObj[INTERNAL_BRIDGE_GLOBAL_KEY]\n ?? globalObj.window?.[INTERNAL_BRIDGE_GLOBAL_KEY]\n ?? globalObj.wood\n ?? globalObj.window?.wood;\n if (!bridge || typeof bridge !== 'object') {\n throw new Error(\n `Wood bridge is not available on globalThis.${INTERNAL_BRIDGE_GLOBAL_KEY}.`,\n );\n }\n\n return bridge as WoodBridgeLike;\n}\n\nfunction resolveRpcManifest(bridge: WoodBridgeLike): WoodRpcManifestEntry[] {\n const manifest = bridge.__rpcManifest;\n if (!Array.isArray(manifest)) {\n throw new Error(\n 'Wood bridge is missing \"__rpcManifest\". Regenerate preload with the latest @noego/wood.',\n );\n }\n\n return manifest;\n}\n\nfunction resolveBridgeFunction(\n bridge: WoodBridgeLike,\n pathSegments: string[],\n operationKey: string,\n): WoodBridgeRpcFunction {\n let current: unknown = bridge;\n\n for (const segment of pathSegments) {\n if (!current || typeof current !== 'object') {\n throw new Error(\n `Wood bridge operation \"${operationKey}\" is missing path \"${pathSegments.join('.')}\".`,\n );\n }\n current = (current as Record<string, unknown>)[segment];\n }\n\n if (typeof current !== 'function') {\n throw new Error(\n `Wood bridge path \"${pathSegments.join('.')}\" for \"${operationKey}\" is not callable.`,\n );\n }\n\n return current as WoodBridgeRpcFunction;\n}\n\nfunction assertSerializable(value: unknown, operationKey: string): void {\n if (typeof structuredClone !== 'function') {\n return;\n }\n\n try {\n structuredClone(value);\n } catch (error) {\n const reason = error instanceof Error ? error.message : String(error);\n throw new Error(\n `App RPC \"${operationKey}\" payload is not serializable: ${reason}`,\n );\n }\n}\n\nfunction extractTraceConversationId(value: unknown): number | string | undefined {\n if (!value || typeof value !== 'object' || Array.isArray(value)) {\n return undefined;\n }\n\n const record = value as Record<string, unknown>;\n if (typeof record.conversationId === 'number' || typeof record.conversationId === 'string') {\n return record.conversationId;\n }\n if (typeof record.threadId === 'number' || typeof record.threadId === 'string') {\n return record.threadId;\n }\n\n return undefined;\n}\n\nfunction validateManifestEntry(entry: WoodRpcManifestEntry, index: number): void {\n if (!entry.channel || !entry.controller || !entry.action) {\n throw new Error(`Invalid Wood RPC manifest entry at index ${index}.`);\n }\n if (!Array.isArray(entry.path) || entry.path.length === 0) {\n throw new Error(\n `Invalid Wood RPC manifest path for \"${entry.controller}.${entry.action}\".`,\n );\n }\n}\n\nfunction createAppInstance(): App {\n const bridge = resolveWoodBridge();\n const manifest = resolveRpcManifest(bridge);\n const app: Record<string, Record<string, (...args: unknown[]) => Promise<unknown>>> = {};\n\n manifest.forEach((entry, index) => {\n validateManifestEntry(entry, index);\n\n const operationKey = `${entry.controller}.${entry.action}`;\n const invoke = resolveBridgeFunction(bridge, entry.path, operationKey);\n\n if (!app[entry.controller]) {\n app[entry.controller] = {};\n }\n\n if (app[entry.controller][entry.action]) {\n throw new Error(\n `Duplicate RPC action \"${operationKey}\" in Wood manifest. Actions must be unique per controller.`,\n );\n }\n\n app[entry.controller][entry.action] = (...args: unknown[]): Promise<unknown> => {\n if (entry.hasInput) {\n if (args.length !== 1) {\n throw new Error(\n `App RPC \"${operationKey}\" expects exactly one payload argument.`,\n );\n }\n assertSerializable(args[0], operationKey);\n const conversationId = extractTraceConversationId(args[0]);\n emitRendererTrace('debug', {\n source: 'wood.client.app',\n type: 'rpc.request',\n ...(conversationId !== undefined ? { conversationId } : {}),\n payload: {\n operationKey,\n channel: entry.channel,\n hasInput: entry.hasInput,\n },\n });\n return invoke(args[0])\n .then((result) => {\n emitRendererTrace('debug', {\n source: 'wood.client.app',\n type: 'rpc.response',\n ...(conversationId !== undefined ? { conversationId } : {}),\n payload: {\n operationKey,\n channel: entry.channel,\n outcome: 'ok',\n },\n });\n return result;\n })\n .catch((error) => {\n emitRendererTrace('error', {\n source: 'wood.client.app',\n type: 'rpc.response',\n message: error instanceof Error ? error.message : String(error),\n ...(conversationId !== undefined ? { conversationId } : {}),\n payload: {\n operationKey,\n channel: entry.channel,\n outcome: 'error',\n },\n });\n throw error;\n });\n }\n\n if (args.length !== 0) {\n throw new Error(\n `App RPC \"${operationKey}\" expects no arguments.`,\n );\n }\n\n emitRendererTrace('debug', {\n source: 'wood.client.app',\n type: 'rpc.request',\n payload: {\n operationKey,\n channel: entry.channel,\n hasInput: entry.hasInput,\n },\n });\n return invoke()\n .then((result) => {\n emitRendererTrace('debug', {\n source: 'wood.client.app',\n type: 'rpc.response',\n payload: {\n operationKey,\n channel: entry.channel,\n outcome: 'ok',\n },\n });\n return result;\n })\n .catch((error) => {\n emitRendererTrace('error', {\n source: 'wood.client.app',\n type: 'rpc.response',\n message: error instanceof Error ? error.message : String(error),\n payload: {\n operationKey,\n channel: entry.channel,\n outcome: 'error',\n },\n });\n throw error;\n });\n };\n });\n\n return app as unknown as App;\n}\n\nexport function getApp<TApp extends object = App>(): TApp {\n const globalObj = globalThis as GlobalWithClientApp;\n if (!globalObj[CLIENT_APP_SYMBOL]) {\n globalObj[CLIENT_APP_SYMBOL] = createAppInstance();\n }\n return globalObj[CLIENT_APP_SYMBOL] as TApp;\n}\n\n/** Test-only helper to clear the client App singleton. */\nexport function clearClientAppForTests(): void {\n const globalObj = globalThis as GlobalWithClientApp;\n delete globalObj[CLIENT_APP_SYMBOL];\n}\n\nfunction resolveWindowControlsBridgeMethod<T>(\n method: keyof NonNullable<WoodBridgeLike['__window']>,\n): T {\n const bridge = resolveWoodBridge();\n const fn = bridge.__window?.[method];\n if (typeof fn !== 'function') {\n throw new Error(`Wood bridge does not expose \"__window.${String(method)}\".`);\n }\n return fn as unknown as T;\n}\n\nexport class WindowControls {\n async open(windowId: string, options?: Record<string, unknown>): Promise<void> {\n const open = resolveWindowControlsBridgeMethod<\n (id: string, opts?: Record<string, unknown>) => Promise<unknown>\n >('open');\n await open(windowId, options);\n }\n\n async close(windowId?: string): Promise<void> {\n const close = resolveWindowControlsBridgeMethod<\n (id?: string) => Promise<unknown>\n >('close');\n await close(windowId);\n }\n\n async focus(windowId: string): Promise<void> {\n const focus = resolveWindowControlsBridgeMethod<\n (id: string) => Promise<unknown>\n >('focus');\n await focus(windowId);\n }\n\n async minimize(windowId?: string): Promise<void> {\n const minimize = resolveWindowControlsBridgeMethod<\n (id?: string) => Promise<unknown>\n >('minimize');\n await minimize(windowId);\n }\n\n async maximize(windowId?: string): Promise<void> {\n const maximize = resolveWindowControlsBridgeMethod<\n (id?: string) => Promise<unknown>\n >('maximize');\n await maximize(windowId);\n }\n}\n\nexport function getWindowControls(): WindowControls {\n const globalObj = globalThis as GlobalWithWindowControls;\n if (!globalObj[CLIENT_WINDOW_CONTROLS_SYMBOL]) {\n globalObj[CLIENT_WINDOW_CONTROLS_SYMBOL] = new WindowControls();\n }\n return globalObj[CLIENT_WINDOW_CONTROLS_SYMBOL] as WindowControls;\n}\n\n/** Test-only helper to clear the client WindowControls singleton. */\nexport function clearClientWindowControlsForTests(): void {\n const globalObj = globalThis as GlobalWithWindowControls;\n delete globalObj[CLIENT_WINDOW_CONTROLS_SYMBOL];\n}\n\ntype RendererLogLevel = 'debug' | 'info' | 'warn' | 'error';\n\nfunction stringifyLogMessage(message: unknown): string {\n if (typeof message === 'string') return message;\n if (message instanceof Error) return message.message;\n return String(message);\n}\n\nfunction writeConsole(level: RendererLogLevel, logger: string, message: string, context?: unknown): void {\n const prefix = `[${logger}] ${message}`;\n switch (level) {\n case 'debug':\n console.debug(prefix, context);\n return;\n case 'warn':\n console.warn(prefix, context);\n return;\n case 'error':\n console.error(prefix, context);\n return;\n default:\n console.info(prefix, context);\n }\n}\n\nclass RendererLogger {\n constructor(private readonly loggerName: string) {}\n\n debug(message: unknown, context?: unknown): void {\n this.log('debug', message, context);\n }\n\n info(message: unknown, context?: unknown): void {\n this.log('info', message, context);\n }\n\n warn(message: unknown, context?: unknown): void {\n this.log('warn', message, context);\n }\n\n error(message: unknown, context?: unknown): void {\n this.log('error', message, context);\n }\n\n private log(level: RendererLogLevel, rawMessage: unknown, context?: unknown): void {\n const message = stringifyLogMessage(rawMessage);\n\n let bridge: WoodBridgeLike;\n try {\n bridge = resolveWoodBridge();\n } catch {\n writeConsole(level, this.loggerName, message, context);\n return;\n }\n\n if (typeof bridge.__log !== 'function') {\n writeConsole(level, this.loggerName, message, context);\n return;\n }\n\n try {\n bridge.__log(level, this.loggerName, message, context);\n } catch {\n writeConsole(level, this.loggerName, message, context);\n }\n }\n}\n\ntype RendererLoggerShape = {\n debug(message: unknown, context?: unknown): void;\n info(message: unknown, context?: unknown): void;\n warn(message: unknown, context?: unknown): void;\n error(message: unknown, context?: unknown): void;\n};\n\nexport function createLogger(name: string): RendererLoggerShape {\n const loggerName = name.trim() || 'renderer';\n const globalObj = globalThis as GlobalWithLoggerRegistry;\n if (!globalObj[CLIENT_LOGGER_REGISTRY_SYMBOL]) {\n globalObj[CLIENT_LOGGER_REGISTRY_SYMBOL] = new Map<string, RendererLogger>();\n }\n\n const existing = globalObj[CLIENT_LOGGER_REGISTRY_SYMBOL]?.get(loggerName);\n if (existing) return existing;\n\n const logger = new RendererLogger(loggerName);\n globalObj[CLIENT_LOGGER_REGISTRY_SYMBOL]?.set(loggerName, logger);\n return logger;\n}\n\n/** Test-only helper to clear client logger singletons. */\nexport function clearClientLoggersForTests(): void {\n const globalObj = globalThis as GlobalWithLoggerRegistry;\n delete globalObj[CLIENT_LOGGER_REGISTRY_SYMBOL];\n}\n\nfunction registerClientBuiltins(container: WoodContainerRegistration): void {\n if (typeof container.registerFunction !== 'function') {\n return;\n }\n\n const traceConfiguration = new TraceProviderConfiguration();\n traceConfiguration.configureRuntime('renderer');\n\n container.registerFunction(Navigation, () => getNavigation());\n container.registerFunction(App, () => getApp());\n container.registerFunction(Ipc, () => getIpc());\n container.registerFunction(WindowControls, () => getWindowControls());\n container.registerFunction(TraceProviderConfiguration, () => traceConfiguration);\n}\n\nfunction createClientContainerInstance(): any {\n const container = new Container();\n registerClientBuiltins(container as WoodContainerRegistration);\n return container;\n}\n\n/**\n * Return a process-global client container instance.\n *\n * - First call creates the container and stores it on a symbol.\n * - Later calls return the same container instance.\n */\nexport function getContainer(): any {\n const globalObj = globalThis as GlobalWithClientContainer;\n if (!globalObj[CLIENT_CONTAINER_SYMBOL]) {\n globalObj[CLIENT_CONTAINER_SYMBOL] = createClientContainerInstance();\n }\n return globalObj[CLIENT_CONTAINER_SYMBOL];\n}\n\n/** Test-only helper to clear the client container singleton. */\nexport function clearClientContainerForTests(): void {\n const globalObj = globalThis as GlobalWithClientContainer;\n delete globalObj[CLIENT_CONTAINER_SYMBOL];\n}\n\n/** Test-only helper to clear the client navigation singleton. */\nexport function clearClientNavigationForTests(): void {\n clearNavigationSingletonForTests();\n}\n\n/** Clamp a menu position so it stays within viewport bounds. */\nexport function clampMenuPosition(\n x: number,\n y: number,\n menuWidth: number,\n menuHeight: number,\n): { x: number; y: number } {\n const vw = typeof window !== 'undefined' ? window.innerWidth : Infinity;\n const vh = typeof window !== 'undefined' ? window.innerHeight : Infinity;\n return {\n x: Math.min(x, Math.max(0, vw - menuWidth)),\n y: Math.min(y, Math.max(0, vh - menuHeight)),\n };\n}\n\nfunction resolveTarget(target: Element | null): Element {\n if (!target) {\n throw new Error('Missing renderer mount target');\n }\n return target;\n}\n\n/**\n * Start a Wood renderer app by mounting it to a target element.\n * Usage:\n * import { app } from './generated/app.cjs';\n * startWood(app, document.getElementById('app'));\n */\nexport async function startWood<T>(\n mountRoot: (target: Element) => T,\n target: Element | null,\n): Promise<T> {\n // Ensure container singleton exists and registers built-in client tokens.\n const container = getContainer();\n // Ensure navigation singleton exists at first client boot.\n getNavigation();\n\n // Auto-detect MessagePort-based trace transport\n try {\n const traceGlobal = (globalThis as Record<string, unknown>).__NOEGO_TRACE__ as\n | { send?: (data: unknown) => void }\n | undefined;\n if (traceGlobal && typeof traceGlobal.send === 'function') {\n const sender = traceGlobal.send.bind(traceGlobal);\n setRendererTraceTransport((payload: unknown) => sender(payload));\n }\n } catch {\n // MessagePort trace transport not available; IPC fallback remains active.\n }\n\n // Fetch framework config from the main process and apply renderer trace\n // controls before the first render.\n try {\n const bridge = resolveWoodBridge();\n if (typeof bridge.__woodConfig === 'function') {\n const config = await bridge.__woodConfig() as {\n rendererTraceEnabled?: boolean;\n rendererTraceMinLevel?: string;\n } | null;\n const traceConfiguration = container.instance\n ? await container.instance(TraceProviderConfiguration)\n : null;\n if (typeof config?.rendererTraceEnabled === 'boolean') {\n traceConfiguration?.configureEnabled(config.rendererTraceEnabled);\n }\n const level = config?.rendererTraceMinLevel;\n if (level === 'debug' || level === 'info' || level === 'warn' || level === 'error') {\n traceConfiguration?.configureMinLevel(level);\n }\n }\n } catch {\n // Config fetch is best-effort; fall back to defaults.\n }\n\n return mountRoot(resolveTarget(target));\n}\n\n/**\n * Backward-compatible helper that returns a target-aware boot function.\n * Usage:\n * const boot = createSvelteBoot(app);\n * const mounted = boot(document.getElementById('app'));\n */\nexport function createSvelteBoot<T>(\n mountRoot: (target: Element) => T,\n) {\n return (target: Element | null): T => mountRoot(resolveTarget(target));\n}\n\nexport { getNavigation };\nexport { Ipc, getIpc };\nexport { clearTraceHubForTests };\nexport { setRendererTraceTransport };\nexport { TraceProvider, TraceProviderConfiguration } from '../tracing/index.js';\nexport type {\n FrameworkTracer,\n TraceEvent,\n TraceInput,\n TraceLevel,\n TraceProcess,\n TraceProviderMode,\n TraceRuntime,\n TraceWaitOptions,\n} from '../tracing/index.js';\n"],"mappings":"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","names":["import_tracing","clearNavigationSingletonForTests"]}
|
|
1
|
+
{"version":3,"sources":["../../src/client/index.ts"],"sourcesContent":["import './global_polyfill.cjs';\nimport 'reflect-metadata';\nimport { Container } from '@noego/ioc';\nimport {\n Navigation,\n getNavigation,\n clearNavigationForTests as clearNavigationSingletonForTests,\n} from '../navigation/index.js';\nimport { Ipc, getIpc } from '../ipc/index.js';\nimport { setWoodAppEnv } from './app_env.js';\nexport { getWoodAppEnv, type WoodAppEnv } from './app_env.js';\nimport {\n TraceProviderConfiguration,\n clearTraceHubForTests,\n emitRendererTrace,\n setRendererTraceTransport,\n} from '../tracing/index.js';\nexport type {\n ControllerEvents,\n ControllerInput,\n ControllerLifecycle,\n ControllerState,\n PageController,\n} from './controller_contract.js';\n\nconst CLIENT_CONTAINER_SYMBOL = Symbol.for('@noego/wood.client.container');\nconst CLIENT_APP_SYMBOL = Symbol.for('@noego/wood.client.app');\nconst CLIENT_WINDOW_CONTROLS_SYMBOL = Symbol.for('@noego/wood.client.window-controls');\nconst CLIENT_LOGGER_REGISTRY_SYMBOL = Symbol.for('@noego/wood.client.logger-registry');\nconst INTERNAL_BRIDGE_GLOBAL_KEY = '__NOEGO_WOOD_BRIDGE__';\n\nexport const WOOD_INTERNAL_BRIDGE_KEY = INTERNAL_BRIDGE_GLOBAL_KEY;\n\nexport interface WoodRpcManifestEntry {\n channel: string;\n controller: string;\n action: string;\n path: string[];\n hasInput: boolean;\n}\n\ntype WoodBridgeRpcFunction = (data?: unknown) => Promise<unknown>;\ntype WoodBridgeLike = Record<string, unknown> & {\n __rpcManifest?: WoodRpcManifestEntry[];\n __window?: {\n current?: () => Promise<unknown>;\n open?: (windowId: string, options?: Record<string, unknown>) => Promise<unknown>;\n close?: (windowId?: string) => Promise<unknown>;\n focus?: (windowId: string) => Promise<unknown>;\n minimize?: (windowId?: string) => Promise<unknown>;\n maximize?: (windowId?: string) => Promise<unknown>;\n };\n __log?: (\n level: string,\n logger: string,\n message: string,\n context?: unknown,\n ) => void;\n __woodConfig?: () => Promise<unknown>;\n __trace?: (event: unknown) => void;\n};\n\ntype GlobalWithClientContainer = typeof globalThis & {\n [CLIENT_CONTAINER_SYMBOL]?: any;\n};\n\ntype GlobalWithClientApp = typeof globalThis & {\n [CLIENT_APP_SYMBOL]?: object;\n};\n\ntype GlobalWithWindowControls = typeof globalThis & {\n [CLIENT_WINDOW_CONTROLS_SYMBOL]?: WindowControls;\n};\n\ntype GlobalWithLoggerRegistry = typeof globalThis & {\n [CLIENT_LOGGER_REGISTRY_SYMBOL]?: Map<string, RendererLogger>;\n};\n\ninterface WoodContainerRegistration {\n registerFunction?(\n token: any,\n resolver: (...args: any[]) => unknown,\n options?: Record<string, unknown>,\n ): void;\n}\n\nexport class App {\n [controllerName: string]: unknown;\n}\n\nfunction resolveWoodBridge(): WoodBridgeLike {\n const globalObj = globalThis as typeof globalThis & {\n [INTERNAL_BRIDGE_GLOBAL_KEY]?: unknown;\n wood?: unknown;\n window?: {\n [INTERNAL_BRIDGE_GLOBAL_KEY]?: unknown;\n wood?: unknown;\n };\n };\n\n const bridge = globalObj[INTERNAL_BRIDGE_GLOBAL_KEY]\n ?? globalObj.window?.[INTERNAL_BRIDGE_GLOBAL_KEY]\n ?? globalObj.wood\n ?? globalObj.window?.wood;\n if (!bridge || typeof bridge !== 'object') {\n throw new Error(\n `Wood bridge is not available on globalThis.${INTERNAL_BRIDGE_GLOBAL_KEY}.`,\n );\n }\n\n return bridge as WoodBridgeLike;\n}\n\nfunction resolveRpcManifest(bridge: WoodBridgeLike): WoodRpcManifestEntry[] {\n const manifest = bridge.__rpcManifest;\n if (!Array.isArray(manifest)) {\n throw new Error(\n 'Wood bridge is missing \"__rpcManifest\". Regenerate preload with the latest @noego/wood.',\n );\n }\n\n return manifest;\n}\n\nfunction resolveBridgeFunction(\n bridge: WoodBridgeLike,\n pathSegments: string[],\n operationKey: string,\n): WoodBridgeRpcFunction {\n let current: unknown = bridge;\n\n for (const segment of pathSegments) {\n if (!current || typeof current !== 'object') {\n throw new Error(\n `Wood bridge operation \"${operationKey}\" is missing path \"${pathSegments.join('.')}\".`,\n );\n }\n current = (current as Record<string, unknown>)[segment];\n }\n\n if (typeof current !== 'function') {\n throw new Error(\n `Wood bridge path \"${pathSegments.join('.')}\" for \"${operationKey}\" is not callable.`,\n );\n }\n\n return current as WoodBridgeRpcFunction;\n}\n\nfunction assertSerializable(value: unknown, operationKey: string): void {\n if (typeof structuredClone !== 'function') {\n return;\n }\n\n try {\n structuredClone(value);\n } catch (error) {\n const reason = error instanceof Error ? error.message : String(error);\n throw new Error(\n `App RPC \"${operationKey}\" payload is not serializable: ${reason}`,\n );\n }\n}\n\nfunction extractTraceConversationId(value: unknown): number | string | undefined {\n if (!value || typeof value !== 'object' || Array.isArray(value)) {\n return undefined;\n }\n\n const record = value as Record<string, unknown>;\n if (typeof record.conversationId === 'number' || typeof record.conversationId === 'string') {\n return record.conversationId;\n }\n if (typeof record.threadId === 'number' || typeof record.threadId === 'string') {\n return record.threadId;\n }\n\n return undefined;\n}\n\nfunction validateManifestEntry(entry: WoodRpcManifestEntry, index: number): void {\n if (!entry.channel || !entry.controller || !entry.action) {\n throw new Error(`Invalid Wood RPC manifest entry at index ${index}.`);\n }\n if (!Array.isArray(entry.path) || entry.path.length === 0) {\n throw new Error(\n `Invalid Wood RPC manifest path for \"${entry.controller}.${entry.action}\".`,\n );\n }\n}\n\nfunction createAppInstance(): App {\n const bridge = resolveWoodBridge();\n const manifest = resolveRpcManifest(bridge);\n const app: Record<string, Record<string, (...args: unknown[]) => Promise<unknown>>> = {};\n\n manifest.forEach((entry, index) => {\n validateManifestEntry(entry, index);\n\n const operationKey = `${entry.controller}.${entry.action}`;\n const invoke = resolveBridgeFunction(bridge, entry.path, operationKey);\n\n if (!app[entry.controller]) {\n app[entry.controller] = {};\n }\n\n if (app[entry.controller][entry.action]) {\n throw new Error(\n `Duplicate RPC action \"${operationKey}\" in Wood manifest. Actions must be unique per controller.`,\n );\n }\n\n app[entry.controller][entry.action] = (...args: unknown[]): Promise<unknown> => {\n if (entry.hasInput) {\n if (args.length !== 1) {\n throw new Error(\n `App RPC \"${operationKey}\" expects exactly one payload argument.`,\n );\n }\n assertSerializable(args[0], operationKey);\n const conversationId = extractTraceConversationId(args[0]);\n emitRendererTrace('debug', {\n source: 'wood.client.app',\n type: 'rpc.request',\n ...(conversationId !== undefined ? { conversationId } : {}),\n payload: {\n operationKey,\n channel: entry.channel,\n hasInput: entry.hasInput,\n },\n });\n return invoke(args[0])\n .then((result) => {\n emitRendererTrace('debug', {\n source: 'wood.client.app',\n type: 'rpc.response',\n ...(conversationId !== undefined ? { conversationId } : {}),\n payload: {\n operationKey,\n channel: entry.channel,\n outcome: 'ok',\n },\n });\n return result;\n })\n .catch((error) => {\n emitRendererTrace('error', {\n source: 'wood.client.app',\n type: 'rpc.response',\n message: error instanceof Error ? error.message : String(error),\n ...(conversationId !== undefined ? { conversationId } : {}),\n payload: {\n operationKey,\n channel: entry.channel,\n outcome: 'error',\n },\n });\n throw error;\n });\n }\n\n if (args.length !== 0) {\n throw new Error(\n `App RPC \"${operationKey}\" expects no arguments.`,\n );\n }\n\n emitRendererTrace('debug', {\n source: 'wood.client.app',\n type: 'rpc.request',\n payload: {\n operationKey,\n channel: entry.channel,\n hasInput: entry.hasInput,\n },\n });\n return invoke()\n .then((result) => {\n emitRendererTrace('debug', {\n source: 'wood.client.app',\n type: 'rpc.response',\n payload: {\n operationKey,\n channel: entry.channel,\n outcome: 'ok',\n },\n });\n return result;\n })\n .catch((error) => {\n emitRendererTrace('error', {\n source: 'wood.client.app',\n type: 'rpc.response',\n message: error instanceof Error ? error.message : String(error),\n payload: {\n operationKey,\n channel: entry.channel,\n outcome: 'error',\n },\n });\n throw error;\n });\n };\n });\n\n return app as unknown as App;\n}\n\nexport function getApp<TApp extends object = App>(): TApp {\n const globalObj = globalThis as GlobalWithClientApp;\n if (!globalObj[CLIENT_APP_SYMBOL]) {\n globalObj[CLIENT_APP_SYMBOL] = createAppInstance();\n }\n return globalObj[CLIENT_APP_SYMBOL] as TApp;\n}\n\n/** Test-only helper to clear the client App singleton. */\nexport function clearClientAppForTests(): void {\n const globalObj = globalThis as GlobalWithClientApp;\n delete globalObj[CLIENT_APP_SYMBOL];\n}\n\nfunction resolveWindowControlsBridgeMethod<T>(\n method: keyof NonNullable<WoodBridgeLike['__window']>,\n): T {\n const bridge = resolveWoodBridge();\n const fn = bridge.__window?.[method];\n if (typeof fn !== 'function') {\n throw new Error(`Wood bridge does not expose \"__window.${String(method)}\".`);\n }\n return fn as unknown as T;\n}\n\nexport class WindowControls {\n async open(windowId: string, options?: Record<string, unknown>): Promise<void> {\n const open = resolveWindowControlsBridgeMethod<\n (id: string, opts?: Record<string, unknown>) => Promise<unknown>\n >('open');\n await open(windowId, options);\n }\n\n async close(windowId?: string): Promise<void> {\n const close = resolveWindowControlsBridgeMethod<\n (id?: string) => Promise<unknown>\n >('close');\n await close(windowId);\n }\n\n async focus(windowId: string): Promise<void> {\n const focus = resolveWindowControlsBridgeMethod<\n (id: string) => Promise<unknown>\n >('focus');\n await focus(windowId);\n }\n\n async minimize(windowId?: string): Promise<void> {\n const minimize = resolveWindowControlsBridgeMethod<\n (id?: string) => Promise<unknown>\n >('minimize');\n await minimize(windowId);\n }\n\n async maximize(windowId?: string): Promise<void> {\n const maximize = resolveWindowControlsBridgeMethod<\n (id?: string) => Promise<unknown>\n >('maximize');\n await maximize(windowId);\n }\n}\n\nexport function getWindowControls(): WindowControls {\n const globalObj = globalThis as GlobalWithWindowControls;\n if (!globalObj[CLIENT_WINDOW_CONTROLS_SYMBOL]) {\n globalObj[CLIENT_WINDOW_CONTROLS_SYMBOL] = new WindowControls();\n }\n return globalObj[CLIENT_WINDOW_CONTROLS_SYMBOL] as WindowControls;\n}\n\n/** Test-only helper to clear the client WindowControls singleton. */\nexport function clearClientWindowControlsForTests(): void {\n const globalObj = globalThis as GlobalWithWindowControls;\n delete globalObj[CLIENT_WINDOW_CONTROLS_SYMBOL];\n}\n\ntype RendererLogLevel = 'debug' | 'info' | 'warn' | 'error' | (string & {});\n\nfunction stringifyLogMessage(message: unknown): string {\n if (typeof message === 'string') return message;\n if (message instanceof Error) return message.message;\n return String(message);\n}\n\nfunction writeConsole(level: RendererLogLevel, logger: string, message: string, context?: unknown): void {\n const prefix = `[${logger}] ${message}`;\n switch (level) {\n case 'debug':\n console.debug(prefix, context);\n return;\n case 'warn':\n console.warn(prefix, context);\n return;\n case 'error':\n console.error(prefix, context);\n return;\n default:\n console.info(prefix, context);\n }\n}\n\nclass RendererLogger {\n constructor(private readonly loggerName: string) {}\n\n debug(message: unknown, context?: unknown): void {\n this.log('debug', message, context);\n }\n\n info(message: unknown, context?: unknown): void {\n this.log('info', message, context);\n }\n\n warn(message: unknown, context?: unknown): void {\n this.log('warn', message, context);\n }\n\n error(message: unknown, context?: unknown): void {\n this.log('error', message, context);\n }\n\n logAt(level: RendererLogLevel, rawMessage: unknown, context?: unknown): void {\n this.log(level, rawMessage, context);\n }\n\n private log(level: RendererLogLevel, rawMessage: unknown, context?: unknown): void {\n const message = stringifyLogMessage(rawMessage);\n\n let bridge: WoodBridgeLike;\n try {\n bridge = resolveWoodBridge();\n } catch {\n writeConsole(level, this.loggerName, message, context);\n return;\n }\n\n if (typeof bridge.__log !== 'function') {\n writeConsole(level, this.loggerName, message, context);\n return;\n }\n\n try {\n bridge.__log(level, this.loggerName, message, context);\n } catch {\n writeConsole(level, this.loggerName, message, context);\n }\n }\n}\n\ntype RendererLoggerShape = {\n logAt(level: RendererLogLevel, message: unknown, context?: unknown): void;\n debug(message: unknown, context?: unknown): void;\n info(message: unknown, context?: unknown): void;\n warn(message: unknown, context?: unknown): void;\n error(message: unknown, context?: unknown): void;\n};\n\nexport function createLogger(name: string): RendererLoggerShape {\n const loggerName = name.trim() || 'renderer';\n const globalObj = globalThis as GlobalWithLoggerRegistry;\n if (!globalObj[CLIENT_LOGGER_REGISTRY_SYMBOL]) {\n globalObj[CLIENT_LOGGER_REGISTRY_SYMBOL] = new Map<string, RendererLogger>();\n }\n\n const existing = globalObj[CLIENT_LOGGER_REGISTRY_SYMBOL]?.get(loggerName);\n if (existing) return existing;\n\n const logger = new RendererLogger(loggerName);\n globalObj[CLIENT_LOGGER_REGISTRY_SYMBOL]?.set(loggerName, logger);\n return logger;\n}\n\n/** Test-only helper to clear client logger singletons. */\nexport function clearClientLoggersForTests(): void {\n const globalObj = globalThis as GlobalWithLoggerRegistry;\n delete globalObj[CLIENT_LOGGER_REGISTRY_SYMBOL];\n}\n\nfunction registerClientBuiltins(container: WoodContainerRegistration): void {\n if (typeof container.registerFunction !== 'function') {\n return;\n }\n\n const traceConfiguration = new TraceProviderConfiguration();\n traceConfiguration.configureRuntime('renderer');\n\n container.registerFunction(Navigation, () => getNavigation());\n container.registerFunction(App, () => getApp());\n container.registerFunction(Ipc, () => getIpc());\n container.registerFunction(WindowControls, () => getWindowControls());\n container.registerFunction(TraceProviderConfiguration, () => traceConfiguration);\n}\n\nfunction createClientContainerInstance(): any {\n const container = new Container();\n registerClientBuiltins(container as WoodContainerRegistration);\n return container;\n}\n\n/**\n * Return a process-global client container instance.\n *\n * - First call creates the container and stores it on a symbol.\n * - Later calls return the same container instance.\n */\nexport function getContainer(): any {\n const globalObj = globalThis as GlobalWithClientContainer;\n if (!globalObj[CLIENT_CONTAINER_SYMBOL]) {\n globalObj[CLIENT_CONTAINER_SYMBOL] = createClientContainerInstance();\n }\n return globalObj[CLIENT_CONTAINER_SYMBOL];\n}\n\n/** Test-only helper to clear the client container singleton. */\nexport function clearClientContainerForTests(): void {\n const globalObj = globalThis as GlobalWithClientContainer;\n delete globalObj[CLIENT_CONTAINER_SYMBOL];\n}\n\n/** Test-only helper to clear the client navigation singleton. */\nexport function clearClientNavigationForTests(): void {\n clearNavigationSingletonForTests();\n}\n\n/** Clamp a menu position so it stays within viewport bounds. */\nexport function clampMenuPosition(\n x: number,\n y: number,\n menuWidth: number,\n menuHeight: number,\n): { x: number; y: number } {\n const vw = typeof window !== 'undefined' ? window.innerWidth : Infinity;\n const vh = typeof window !== 'undefined' ? window.innerHeight : Infinity;\n return {\n x: Math.min(x, Math.max(0, vw - menuWidth)),\n y: Math.min(y, Math.max(0, vh - menuHeight)),\n };\n}\n\nfunction resolveTarget(target: Element | null): Element {\n if (!target) {\n throw new Error('Missing renderer mount target');\n }\n return target;\n}\n\ntype RendererTraceBootstrapConfiguration = {\n rendererTraceEnabled?: boolean;\n rendererTraceMinLevel?: string;\n rendererTraceBatchEnabled?: boolean;\n appEnv?: string;\n};\n\nfunction configureRendererTraceTransport(config: RendererTraceBootstrapConfiguration | null): void {\n const globalObj = globalThis as Record<string, unknown>;\n if (config?.rendererTraceBatchEnabled) {\n const batchGlobal = globalObj.__NOEGO_WOOD_TRACE_BATCH__ as\n | { send?: (data: unknown) => unknown }\n | undefined;\n if (batchGlobal && typeof batchGlobal.send === 'function') {\n const sender = batchGlobal.send.bind(batchGlobal);\n setRendererTraceTransport((payload: unknown) => {\n sender(payload);\n });\n return;\n }\n }\n\n const traceGlobal = globalObj.__NOEGO_TRACE__ as\n | { send?: (data: unknown) => void }\n | undefined;\n if (traceGlobal && typeof traceGlobal.send === 'function') {\n const sender = traceGlobal.send.bind(traceGlobal);\n setRendererTraceTransport((payload: unknown) => sender(payload));\n }\n}\n\n/**\n * Start a Wood renderer app by mounting it to a target element.\n * Usage:\n * import { app } from './generated/app.cjs';\n * startWood(app, document.getElementById('app'));\n */\nexport async function startWood<T>(\n mountRoot: (target: Element) => T,\n target: Element | null,\n): Promise<T> {\n // Ensure container singleton exists and registers built-in client tokens.\n const container = getContainer();\n // Ensure navigation singleton exists at first client boot.\n getNavigation();\n\n // Fetch framework config from the main process and apply renderer trace\n // controls before the first render.\n let rendererTraceConfig: RendererTraceBootstrapConfiguration | null = null;\n try {\n const bridge = resolveWoodBridge();\n if (typeof bridge.__woodConfig === 'function') {\n const config = await bridge.__woodConfig() as RendererTraceBootstrapConfiguration | null;\n rendererTraceConfig = config;\n setWoodAppEnv(config?.appEnv);\n const traceConfiguration = container.instance\n ? await container.instance(TraceProviderConfiguration)\n : null;\n if (typeof config?.rendererTraceEnabled === 'boolean') {\n traceConfiguration?.configureEnabled(config.rendererTraceEnabled);\n }\n const level = config?.rendererTraceMinLevel;\n if (typeof level === 'string' && level.trim().length > 0) {\n traceConfiguration?.configureMinLevel(level);\n }\n }\n } catch {\n // Config fetch is best-effort; fall back to defaults.\n }\n\n try {\n configureRendererTraceTransport(rendererTraceConfig);\n } catch {\n // Trace transport selection is best-effort; the internal IPC bridge remains available.\n }\n\n return mountRoot(resolveTarget(target));\n}\n\n/**\n * Backward-compatible helper that returns a target-aware boot function.\n * Usage:\n * const boot = createSvelteBoot(app);\n * const mounted = boot(document.getElementById('app'));\n */\nexport function createSvelteBoot<T>(\n mountRoot: (target: Element) => T,\n) {\n return (target: Element | null): T => mountRoot(resolveTarget(target));\n}\n\nexport { getNavigation };\nexport { Ipc, getIpc };\nexport { clearTraceHubForTests };\nexport { setRendererTraceTransport };\nexport { TraceProvider, TraceProviderConfiguration } from '../tracing/index.js';\nexport type {\n FrameworkTracer,\n TraceEvent,\n TraceInput,\n TraceLevel,\n TraceProcess,\n TraceProviderMode,\n TraceRuntime,\n TraceWaitOptions,\n} from '../tracing/index.js';\n"],"mappings":"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","names":["import_app_env","import_tracing","clearNavigationSingletonForTests"]}
|
package/dist/client/index.d.cts
CHANGED
|
@@ -1,9 +1,11 @@
|
|
|
1
1
|
export { getNavigation } from '../navigation/index.cjs';
|
|
2
2
|
export { Ipc, getIpc } from '../ipc/index.cjs';
|
|
3
|
-
export {
|
|
3
|
+
export { getWoodAppEnv } from './app_env.cjs';
|
|
4
|
+
export { a as TraceEvent, b as TraceInput, c as TraceLevel, d as TraceProcess, f as TraceWaitOptions, i as clearTraceHubForTests, k as setRendererTraceTransport } from '../trace_hub-Cob54qRx.cjs';
|
|
4
5
|
export { FrameworkTracer, TraceProvider, TraceProviderConfiguration, TraceProviderMode, TraceRuntime } from '../tracing/trace_provider.cjs';
|
|
5
6
|
export { ControllerEvents, ControllerInput, ControllerState, PageController } from './controller_contract.cjs';
|
|
6
7
|
export { ControllerLifecycle } from '../controller/controller_lifecycle.cjs';
|
|
8
|
+
export { WoodAppEnv } from '../runtime/app_env.cjs';
|
|
7
9
|
import '../ipc/shared.cjs';
|
|
8
10
|
import 'rxjs';
|
|
9
11
|
import '@noego/ioc';
|
|
@@ -32,7 +34,9 @@ declare class WindowControls {
|
|
|
32
34
|
declare function getWindowControls(): WindowControls;
|
|
33
35
|
/** Test-only helper to clear the client WindowControls singleton. */
|
|
34
36
|
declare function clearClientWindowControlsForTests(): void;
|
|
37
|
+
type RendererLogLevel = 'debug' | 'info' | 'warn' | 'error' | (string & {});
|
|
35
38
|
type RendererLoggerShape = {
|
|
39
|
+
logAt(level: RendererLogLevel, message: unknown, context?: unknown): void;
|
|
36
40
|
debug(message: unknown, context?: unknown): void;
|
|
37
41
|
info(message: unknown, context?: unknown): void;
|
|
38
42
|
warn(message: unknown, context?: unknown): void;
|
package/dist/client/index.d.ts
CHANGED
|
@@ -1,9 +1,11 @@
|
|
|
1
1
|
export { getNavigation } from '../navigation/index.js';
|
|
2
2
|
export { Ipc, getIpc } from '../ipc/index.js';
|
|
3
|
-
export {
|
|
3
|
+
export { getWoodAppEnv } from './app_env.js';
|
|
4
|
+
export { a as TraceEvent, b as TraceInput, c as TraceLevel, d as TraceProcess, f as TraceWaitOptions, i as clearTraceHubForTests, k as setRendererTraceTransport } from '../trace_hub-Cob54qRx.js';
|
|
4
5
|
export { FrameworkTracer, TraceProvider, TraceProviderConfiguration, TraceProviderMode, TraceRuntime } from '../tracing/trace_provider.js';
|
|
5
6
|
export { ControllerEvents, ControllerInput, ControllerState, PageController } from './controller_contract.js';
|
|
6
7
|
export { ControllerLifecycle } from '../controller/controller_lifecycle.js';
|
|
8
|
+
export { WoodAppEnv } from '../runtime/app_env.js';
|
|
7
9
|
import '../ipc/shared.js';
|
|
8
10
|
import 'rxjs';
|
|
9
11
|
import '@noego/ioc';
|
|
@@ -32,7 +34,9 @@ declare class WindowControls {
|
|
|
32
34
|
declare function getWindowControls(): WindowControls;
|
|
33
35
|
/** Test-only helper to clear the client WindowControls singleton. */
|
|
34
36
|
declare function clearClientWindowControlsForTests(): void;
|
|
37
|
+
type RendererLogLevel = 'debug' | 'info' | 'warn' | 'error' | (string & {});
|
|
35
38
|
type RendererLoggerShape = {
|
|
39
|
+
logAt(level: RendererLogLevel, message: unknown, context?: unknown): void;
|
|
36
40
|
debug(message: unknown, context?: unknown): void;
|
|
37
41
|
info(message: unknown, context?: unknown): void;
|
|
38
42
|
warn(message: unknown, context?: unknown): void;
|
package/dist/client/index.js
CHANGED
|
@@ -7,6 +7,8 @@ import {
|
|
|
7
7
|
clearNavigationForTests as clearNavigationSingletonForTests
|
|
8
8
|
} from "../navigation/index.js";
|
|
9
9
|
import { Ipc, getIpc } from "../ipc/index.js";
|
|
10
|
+
import { setWoodAppEnv } from "./app_env.js";
|
|
11
|
+
import { getWoodAppEnv } from "./app_env.js";
|
|
10
12
|
import {
|
|
11
13
|
TraceProviderConfiguration,
|
|
12
14
|
clearTraceHubForTests,
|
|
@@ -286,6 +288,9 @@ class RendererLogger {
|
|
|
286
288
|
error(message, context) {
|
|
287
289
|
this.log("error", message, context);
|
|
288
290
|
}
|
|
291
|
+
logAt(level, rawMessage, context) {
|
|
292
|
+
this.log(level, rawMessage, context);
|
|
293
|
+
}
|
|
289
294
|
log(level, rawMessage, context) {
|
|
290
295
|
const message = stringifyLogMessage(rawMessage);
|
|
291
296
|
let bridge;
|
|
@@ -367,32 +372,49 @@ function resolveTarget(target) {
|
|
|
367
372
|
}
|
|
368
373
|
return target;
|
|
369
374
|
}
|
|
375
|
+
function configureRendererTraceTransport(config) {
|
|
376
|
+
const globalObj = globalThis;
|
|
377
|
+
if (config?.rendererTraceBatchEnabled) {
|
|
378
|
+
const batchGlobal = globalObj.__NOEGO_WOOD_TRACE_BATCH__;
|
|
379
|
+
if (batchGlobal && typeof batchGlobal.send === "function") {
|
|
380
|
+
const sender = batchGlobal.send.bind(batchGlobal);
|
|
381
|
+
setRendererTraceTransport((payload) => {
|
|
382
|
+
sender(payload);
|
|
383
|
+
});
|
|
384
|
+
return;
|
|
385
|
+
}
|
|
386
|
+
}
|
|
387
|
+
const traceGlobal = globalObj.__NOEGO_TRACE__;
|
|
388
|
+
if (traceGlobal && typeof traceGlobal.send === "function") {
|
|
389
|
+
const sender = traceGlobal.send.bind(traceGlobal);
|
|
390
|
+
setRendererTraceTransport((payload) => sender(payload));
|
|
391
|
+
}
|
|
392
|
+
}
|
|
370
393
|
async function startWood(mountRoot, target) {
|
|
371
394
|
const container = getContainer();
|
|
372
395
|
getNavigation();
|
|
373
|
-
|
|
374
|
-
const traceGlobal = globalThis.__NOEGO_TRACE__;
|
|
375
|
-
if (traceGlobal && typeof traceGlobal.send === "function") {
|
|
376
|
-
const sender = traceGlobal.send.bind(traceGlobal);
|
|
377
|
-
setRendererTraceTransport((payload) => sender(payload));
|
|
378
|
-
}
|
|
379
|
-
} catch {
|
|
380
|
-
}
|
|
396
|
+
let rendererTraceConfig = null;
|
|
381
397
|
try {
|
|
382
398
|
const bridge = resolveWoodBridge();
|
|
383
399
|
if (typeof bridge.__woodConfig === "function") {
|
|
384
400
|
const config = await bridge.__woodConfig();
|
|
401
|
+
rendererTraceConfig = config;
|
|
402
|
+
setWoodAppEnv(config?.appEnv);
|
|
385
403
|
const traceConfiguration = container.instance ? await container.instance(TraceProviderConfiguration) : null;
|
|
386
404
|
if (typeof config?.rendererTraceEnabled === "boolean") {
|
|
387
405
|
traceConfiguration?.configureEnabled(config.rendererTraceEnabled);
|
|
388
406
|
}
|
|
389
407
|
const level = config?.rendererTraceMinLevel;
|
|
390
|
-
if (
|
|
408
|
+
if (typeof level === "string" && level.trim().length > 0) {
|
|
391
409
|
traceConfiguration?.configureMinLevel(level);
|
|
392
410
|
}
|
|
393
411
|
}
|
|
394
412
|
} catch {
|
|
395
413
|
}
|
|
414
|
+
try {
|
|
415
|
+
configureRendererTraceTransport(rendererTraceConfig);
|
|
416
|
+
} catch {
|
|
417
|
+
}
|
|
396
418
|
return mountRoot(resolveTarget(target));
|
|
397
419
|
}
|
|
398
420
|
function createSvelteBoot(mountRoot) {
|
|
@@ -420,6 +442,7 @@ export {
|
|
|
420
442
|
getIpc,
|
|
421
443
|
getNavigation,
|
|
422
444
|
getWindowControls,
|
|
445
|
+
getWoodAppEnv,
|
|
423
446
|
setRendererTraceTransport,
|
|
424
447
|
startWood
|
|
425
448
|
};
|
package/dist/client/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/client/index.ts"],"sourcesContent":["import './global_polyfill.js';\nimport 'reflect-metadata';\nimport { Container } from '@noego/ioc';\nimport {\n Navigation,\n getNavigation,\n clearNavigationForTests as clearNavigationSingletonForTests,\n} from '../navigation/index.js';\nimport { Ipc, getIpc } from '../ipc/index.js';\nimport {\n TraceProviderConfiguration,\n clearTraceHubForTests,\n emitRendererTrace,\n setRendererTraceTransport,\n} from '../tracing/index.js';\nexport type {\n ControllerEvents,\n ControllerInput,\n ControllerLifecycle,\n ControllerState,\n PageController,\n} from './controller_contract.js';\n\nconst CLIENT_CONTAINER_SYMBOL = Symbol.for('@noego/wood.client.container');\nconst CLIENT_APP_SYMBOL = Symbol.for('@noego/wood.client.app');\nconst CLIENT_WINDOW_CONTROLS_SYMBOL = Symbol.for('@noego/wood.client.window-controls');\nconst CLIENT_LOGGER_REGISTRY_SYMBOL = Symbol.for('@noego/wood.client.logger-registry');\nconst INTERNAL_BRIDGE_GLOBAL_KEY = '__NOEGO_WOOD_BRIDGE__';\n\nexport const WOOD_INTERNAL_BRIDGE_KEY = INTERNAL_BRIDGE_GLOBAL_KEY;\n\nexport interface WoodRpcManifestEntry {\n channel: string;\n controller: string;\n action: string;\n path: string[];\n hasInput: boolean;\n}\n\ntype WoodBridgeRpcFunction = (data?: unknown) => Promise<unknown>;\ntype WoodBridgeLike = Record<string, unknown> & {\n __rpcManifest?: WoodRpcManifestEntry[];\n __window?: {\n current?: () => Promise<unknown>;\n open?: (windowId: string, options?: Record<string, unknown>) => Promise<unknown>;\n close?: (windowId?: string) => Promise<unknown>;\n focus?: (windowId: string) => Promise<unknown>;\n minimize?: (windowId?: string) => Promise<unknown>;\n maximize?: (windowId?: string) => Promise<unknown>;\n };\n __log?: (\n level: string,\n logger: string,\n message: string,\n context?: unknown,\n ) => void;\n __woodConfig?: () => Promise<unknown>;\n __trace?: (event: unknown) => void;\n};\n\ntype GlobalWithClientContainer = typeof globalThis & {\n [CLIENT_CONTAINER_SYMBOL]?: any;\n};\n\ntype GlobalWithClientApp = typeof globalThis & {\n [CLIENT_APP_SYMBOL]?: object;\n};\n\ntype GlobalWithWindowControls = typeof globalThis & {\n [CLIENT_WINDOW_CONTROLS_SYMBOL]?: WindowControls;\n};\n\ntype GlobalWithLoggerRegistry = typeof globalThis & {\n [CLIENT_LOGGER_REGISTRY_SYMBOL]?: Map<string, RendererLogger>;\n};\n\ninterface WoodContainerRegistration {\n registerFunction?(\n token: any,\n resolver: (...args: any[]) => unknown,\n options?: Record<string, unknown>,\n ): void;\n}\n\nexport class App {\n [controllerName: string]: unknown;\n}\n\nfunction resolveWoodBridge(): WoodBridgeLike {\n const globalObj = globalThis as typeof globalThis & {\n [INTERNAL_BRIDGE_GLOBAL_KEY]?: unknown;\n wood?: unknown;\n window?: {\n [INTERNAL_BRIDGE_GLOBAL_KEY]?: unknown;\n wood?: unknown;\n };\n };\n\n const bridge = globalObj[INTERNAL_BRIDGE_GLOBAL_KEY]\n ?? globalObj.window?.[INTERNAL_BRIDGE_GLOBAL_KEY]\n ?? globalObj.wood\n ?? globalObj.window?.wood;\n if (!bridge || typeof bridge !== 'object') {\n throw new Error(\n `Wood bridge is not available on globalThis.${INTERNAL_BRIDGE_GLOBAL_KEY}.`,\n );\n }\n\n return bridge as WoodBridgeLike;\n}\n\nfunction resolveRpcManifest(bridge: WoodBridgeLike): WoodRpcManifestEntry[] {\n const manifest = bridge.__rpcManifest;\n if (!Array.isArray(manifest)) {\n throw new Error(\n 'Wood bridge is missing \"__rpcManifest\". Regenerate preload with the latest @noego/wood.',\n );\n }\n\n return manifest;\n}\n\nfunction resolveBridgeFunction(\n bridge: WoodBridgeLike,\n pathSegments: string[],\n operationKey: string,\n): WoodBridgeRpcFunction {\n let current: unknown = bridge;\n\n for (const segment of pathSegments) {\n if (!current || typeof current !== 'object') {\n throw new Error(\n `Wood bridge operation \"${operationKey}\" is missing path \"${pathSegments.join('.')}\".`,\n );\n }\n current = (current as Record<string, unknown>)[segment];\n }\n\n if (typeof current !== 'function') {\n throw new Error(\n `Wood bridge path \"${pathSegments.join('.')}\" for \"${operationKey}\" is not callable.`,\n );\n }\n\n return current as WoodBridgeRpcFunction;\n}\n\nfunction assertSerializable(value: unknown, operationKey: string): void {\n if (typeof structuredClone !== 'function') {\n return;\n }\n\n try {\n structuredClone(value);\n } catch (error) {\n const reason = error instanceof Error ? error.message : String(error);\n throw new Error(\n `App RPC \"${operationKey}\" payload is not serializable: ${reason}`,\n );\n }\n}\n\nfunction extractTraceConversationId(value: unknown): number | string | undefined {\n if (!value || typeof value !== 'object' || Array.isArray(value)) {\n return undefined;\n }\n\n const record = value as Record<string, unknown>;\n if (typeof record.conversationId === 'number' || typeof record.conversationId === 'string') {\n return record.conversationId;\n }\n if (typeof record.threadId === 'number' || typeof record.threadId === 'string') {\n return record.threadId;\n }\n\n return undefined;\n}\n\nfunction validateManifestEntry(entry: WoodRpcManifestEntry, index: number): void {\n if (!entry.channel || !entry.controller || !entry.action) {\n throw new Error(`Invalid Wood RPC manifest entry at index ${index}.`);\n }\n if (!Array.isArray(entry.path) || entry.path.length === 0) {\n throw new Error(\n `Invalid Wood RPC manifest path for \"${entry.controller}.${entry.action}\".`,\n );\n }\n}\n\nfunction createAppInstance(): App {\n const bridge = resolveWoodBridge();\n const manifest = resolveRpcManifest(bridge);\n const app: Record<string, Record<string, (...args: unknown[]) => Promise<unknown>>> = {};\n\n manifest.forEach((entry, index) => {\n validateManifestEntry(entry, index);\n\n const operationKey = `${entry.controller}.${entry.action}`;\n const invoke = resolveBridgeFunction(bridge, entry.path, operationKey);\n\n if (!app[entry.controller]) {\n app[entry.controller] = {};\n }\n\n if (app[entry.controller][entry.action]) {\n throw new Error(\n `Duplicate RPC action \"${operationKey}\" in Wood manifest. Actions must be unique per controller.`,\n );\n }\n\n app[entry.controller][entry.action] = (...args: unknown[]): Promise<unknown> => {\n if (entry.hasInput) {\n if (args.length !== 1) {\n throw new Error(\n `App RPC \"${operationKey}\" expects exactly one payload argument.`,\n );\n }\n assertSerializable(args[0], operationKey);\n const conversationId = extractTraceConversationId(args[0]);\n emitRendererTrace('debug', {\n source: 'wood.client.app',\n type: 'rpc.request',\n ...(conversationId !== undefined ? { conversationId } : {}),\n payload: {\n operationKey,\n channel: entry.channel,\n hasInput: entry.hasInput,\n },\n });\n return invoke(args[0])\n .then((result) => {\n emitRendererTrace('debug', {\n source: 'wood.client.app',\n type: 'rpc.response',\n ...(conversationId !== undefined ? { conversationId } : {}),\n payload: {\n operationKey,\n channel: entry.channel,\n outcome: 'ok',\n },\n });\n return result;\n })\n .catch((error) => {\n emitRendererTrace('error', {\n source: 'wood.client.app',\n type: 'rpc.response',\n message: error instanceof Error ? error.message : String(error),\n ...(conversationId !== undefined ? { conversationId } : {}),\n payload: {\n operationKey,\n channel: entry.channel,\n outcome: 'error',\n },\n });\n throw error;\n });\n }\n\n if (args.length !== 0) {\n throw new Error(\n `App RPC \"${operationKey}\" expects no arguments.`,\n );\n }\n\n emitRendererTrace('debug', {\n source: 'wood.client.app',\n type: 'rpc.request',\n payload: {\n operationKey,\n channel: entry.channel,\n hasInput: entry.hasInput,\n },\n });\n return invoke()\n .then((result) => {\n emitRendererTrace('debug', {\n source: 'wood.client.app',\n type: 'rpc.response',\n payload: {\n operationKey,\n channel: entry.channel,\n outcome: 'ok',\n },\n });\n return result;\n })\n .catch((error) => {\n emitRendererTrace('error', {\n source: 'wood.client.app',\n type: 'rpc.response',\n message: error instanceof Error ? error.message : String(error),\n payload: {\n operationKey,\n channel: entry.channel,\n outcome: 'error',\n },\n });\n throw error;\n });\n };\n });\n\n return app as unknown as App;\n}\n\nexport function getApp<TApp extends object = App>(): TApp {\n const globalObj = globalThis as GlobalWithClientApp;\n if (!globalObj[CLIENT_APP_SYMBOL]) {\n globalObj[CLIENT_APP_SYMBOL] = createAppInstance();\n }\n return globalObj[CLIENT_APP_SYMBOL] as TApp;\n}\n\n/** Test-only helper to clear the client App singleton. */\nexport function clearClientAppForTests(): void {\n const globalObj = globalThis as GlobalWithClientApp;\n delete globalObj[CLIENT_APP_SYMBOL];\n}\n\nfunction resolveWindowControlsBridgeMethod<T>(\n method: keyof NonNullable<WoodBridgeLike['__window']>,\n): T {\n const bridge = resolveWoodBridge();\n const fn = bridge.__window?.[method];\n if (typeof fn !== 'function') {\n throw new Error(`Wood bridge does not expose \"__window.${String(method)}\".`);\n }\n return fn as unknown as T;\n}\n\nexport class WindowControls {\n async open(windowId: string, options?: Record<string, unknown>): Promise<void> {\n const open = resolveWindowControlsBridgeMethod<\n (id: string, opts?: Record<string, unknown>) => Promise<unknown>\n >('open');\n await open(windowId, options);\n }\n\n async close(windowId?: string): Promise<void> {\n const close = resolveWindowControlsBridgeMethod<\n (id?: string) => Promise<unknown>\n >('close');\n await close(windowId);\n }\n\n async focus(windowId: string): Promise<void> {\n const focus = resolveWindowControlsBridgeMethod<\n (id: string) => Promise<unknown>\n >('focus');\n await focus(windowId);\n }\n\n async minimize(windowId?: string): Promise<void> {\n const minimize = resolveWindowControlsBridgeMethod<\n (id?: string) => Promise<unknown>\n >('minimize');\n await minimize(windowId);\n }\n\n async maximize(windowId?: string): Promise<void> {\n const maximize = resolveWindowControlsBridgeMethod<\n (id?: string) => Promise<unknown>\n >('maximize');\n await maximize(windowId);\n }\n}\n\nexport function getWindowControls(): WindowControls {\n const globalObj = globalThis as GlobalWithWindowControls;\n if (!globalObj[CLIENT_WINDOW_CONTROLS_SYMBOL]) {\n globalObj[CLIENT_WINDOW_CONTROLS_SYMBOL] = new WindowControls();\n }\n return globalObj[CLIENT_WINDOW_CONTROLS_SYMBOL] as WindowControls;\n}\n\n/** Test-only helper to clear the client WindowControls singleton. */\nexport function clearClientWindowControlsForTests(): void {\n const globalObj = globalThis as GlobalWithWindowControls;\n delete globalObj[CLIENT_WINDOW_CONTROLS_SYMBOL];\n}\n\ntype RendererLogLevel = 'debug' | 'info' | 'warn' | 'error';\n\nfunction stringifyLogMessage(message: unknown): string {\n if (typeof message === 'string') return message;\n if (message instanceof Error) return message.message;\n return String(message);\n}\n\nfunction writeConsole(level: RendererLogLevel, logger: string, message: string, context?: unknown): void {\n const prefix = `[${logger}] ${message}`;\n switch (level) {\n case 'debug':\n console.debug(prefix, context);\n return;\n case 'warn':\n console.warn(prefix, context);\n return;\n case 'error':\n console.error(prefix, context);\n return;\n default:\n console.info(prefix, context);\n }\n}\n\nclass RendererLogger {\n constructor(private readonly loggerName: string) {}\n\n debug(message: unknown, context?: unknown): void {\n this.log('debug', message, context);\n }\n\n info(message: unknown, context?: unknown): void {\n this.log('info', message, context);\n }\n\n warn(message: unknown, context?: unknown): void {\n this.log('warn', message, context);\n }\n\n error(message: unknown, context?: unknown): void {\n this.log('error', message, context);\n }\n\n private log(level: RendererLogLevel, rawMessage: unknown, context?: unknown): void {\n const message = stringifyLogMessage(rawMessage);\n\n let bridge: WoodBridgeLike;\n try {\n bridge = resolveWoodBridge();\n } catch {\n writeConsole(level, this.loggerName, message, context);\n return;\n }\n\n if (typeof bridge.__log !== 'function') {\n writeConsole(level, this.loggerName, message, context);\n return;\n }\n\n try {\n bridge.__log(level, this.loggerName, message, context);\n } catch {\n writeConsole(level, this.loggerName, message, context);\n }\n }\n}\n\ntype RendererLoggerShape = {\n debug(message: unknown, context?: unknown): void;\n info(message: unknown, context?: unknown): void;\n warn(message: unknown, context?: unknown): void;\n error(message: unknown, context?: unknown): void;\n};\n\nexport function createLogger(name: string): RendererLoggerShape {\n const loggerName = name.trim() || 'renderer';\n const globalObj = globalThis as GlobalWithLoggerRegistry;\n if (!globalObj[CLIENT_LOGGER_REGISTRY_SYMBOL]) {\n globalObj[CLIENT_LOGGER_REGISTRY_SYMBOL] = new Map<string, RendererLogger>();\n }\n\n const existing = globalObj[CLIENT_LOGGER_REGISTRY_SYMBOL]?.get(loggerName);\n if (existing) return existing;\n\n const logger = new RendererLogger(loggerName);\n globalObj[CLIENT_LOGGER_REGISTRY_SYMBOL]?.set(loggerName, logger);\n return logger;\n}\n\n/** Test-only helper to clear client logger singletons. */\nexport function clearClientLoggersForTests(): void {\n const globalObj = globalThis as GlobalWithLoggerRegistry;\n delete globalObj[CLIENT_LOGGER_REGISTRY_SYMBOL];\n}\n\nfunction registerClientBuiltins(container: WoodContainerRegistration): void {\n if (typeof container.registerFunction !== 'function') {\n return;\n }\n\n const traceConfiguration = new TraceProviderConfiguration();\n traceConfiguration.configureRuntime('renderer');\n\n container.registerFunction(Navigation, () => getNavigation());\n container.registerFunction(App, () => getApp());\n container.registerFunction(Ipc, () => getIpc());\n container.registerFunction(WindowControls, () => getWindowControls());\n container.registerFunction(TraceProviderConfiguration, () => traceConfiguration);\n}\n\nfunction createClientContainerInstance(): any {\n const container = new Container();\n registerClientBuiltins(container as WoodContainerRegistration);\n return container;\n}\n\n/**\n * Return a process-global client container instance.\n *\n * - First call creates the container and stores it on a symbol.\n * - Later calls return the same container instance.\n */\nexport function getContainer(): any {\n const globalObj = globalThis as GlobalWithClientContainer;\n if (!globalObj[CLIENT_CONTAINER_SYMBOL]) {\n globalObj[CLIENT_CONTAINER_SYMBOL] = createClientContainerInstance();\n }\n return globalObj[CLIENT_CONTAINER_SYMBOL];\n}\n\n/** Test-only helper to clear the client container singleton. */\nexport function clearClientContainerForTests(): void {\n const globalObj = globalThis as GlobalWithClientContainer;\n delete globalObj[CLIENT_CONTAINER_SYMBOL];\n}\n\n/** Test-only helper to clear the client navigation singleton. */\nexport function clearClientNavigationForTests(): void {\n clearNavigationSingletonForTests();\n}\n\n/** Clamp a menu position so it stays within viewport bounds. */\nexport function clampMenuPosition(\n x: number,\n y: number,\n menuWidth: number,\n menuHeight: number,\n): { x: number; y: number } {\n const vw = typeof window !== 'undefined' ? window.innerWidth : Infinity;\n const vh = typeof window !== 'undefined' ? window.innerHeight : Infinity;\n return {\n x: Math.min(x, Math.max(0, vw - menuWidth)),\n y: Math.min(y, Math.max(0, vh - menuHeight)),\n };\n}\n\nfunction resolveTarget(target: Element | null): Element {\n if (!target) {\n throw new Error('Missing renderer mount target');\n }\n return target;\n}\n\n/**\n * Start a Wood renderer app by mounting it to a target element.\n * Usage:\n * import { app } from './generated/app.js';\n * startWood(app, document.getElementById('app'));\n */\nexport async function startWood<T>(\n mountRoot: (target: Element) => T,\n target: Element | null,\n): Promise<T> {\n // Ensure container singleton exists and registers built-in client tokens.\n const container = getContainer();\n // Ensure navigation singleton exists at first client boot.\n getNavigation();\n\n // Auto-detect MessagePort-based trace transport\n try {\n const traceGlobal = (globalThis as Record<string, unknown>).__NOEGO_TRACE__ as\n | { send?: (data: unknown) => void }\n | undefined;\n if (traceGlobal && typeof traceGlobal.send === 'function') {\n const sender = traceGlobal.send.bind(traceGlobal);\n setRendererTraceTransport((payload: unknown) => sender(payload));\n }\n } catch {\n // MessagePort trace transport not available; IPC fallback remains active.\n }\n\n // Fetch framework config from the main process and apply renderer trace\n // controls before the first render.\n try {\n const bridge = resolveWoodBridge();\n if (typeof bridge.__woodConfig === 'function') {\n const config = await bridge.__woodConfig() as {\n rendererTraceEnabled?: boolean;\n rendererTraceMinLevel?: string;\n } | null;\n const traceConfiguration = container.instance\n ? await container.instance(TraceProviderConfiguration)\n : null;\n if (typeof config?.rendererTraceEnabled === 'boolean') {\n traceConfiguration?.configureEnabled(config.rendererTraceEnabled);\n }\n const level = config?.rendererTraceMinLevel;\n if (level === 'debug' || level === 'info' || level === 'warn' || level === 'error') {\n traceConfiguration?.configureMinLevel(level);\n }\n }\n } catch {\n // Config fetch is best-effort; fall back to defaults.\n }\n\n return mountRoot(resolveTarget(target));\n}\n\n/**\n * Backward-compatible helper that returns a target-aware boot function.\n * Usage:\n * const boot = createSvelteBoot(app);\n * const mounted = boot(document.getElementById('app'));\n */\nexport function createSvelteBoot<T>(\n mountRoot: (target: Element) => T,\n) {\n return (target: Element | null): T => mountRoot(resolveTarget(target));\n}\n\nexport { getNavigation };\nexport { Ipc, getIpc };\nexport { clearTraceHubForTests };\nexport { setRendererTraceTransport };\nexport { TraceProvider, TraceProviderConfiguration } from '../tracing/index.js';\nexport type {\n FrameworkTracer,\n TraceEvent,\n TraceInput,\n TraceLevel,\n TraceProcess,\n TraceProviderMode,\n TraceRuntime,\n TraceWaitOptions,\n} from '../tracing/index.js';\n"],"mappings":"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","names":["TraceProviderConfiguration"]}
|
|
1
|
+
{"version":3,"sources":["../../src/client/index.ts"],"sourcesContent":["import './global_polyfill.js';\nimport 'reflect-metadata';\nimport { Container } from '@noego/ioc';\nimport {\n Navigation,\n getNavigation,\n clearNavigationForTests as clearNavigationSingletonForTests,\n} from '../navigation/index.js';\nimport { Ipc, getIpc } from '../ipc/index.js';\nimport { setWoodAppEnv } from './app_env.js';\nexport { getWoodAppEnv, type WoodAppEnv } from './app_env.js';\nimport {\n TraceProviderConfiguration,\n clearTraceHubForTests,\n emitRendererTrace,\n setRendererTraceTransport,\n} from '../tracing/index.js';\nexport type {\n ControllerEvents,\n ControllerInput,\n ControllerLifecycle,\n ControllerState,\n PageController,\n} from './controller_contract.js';\n\nconst CLIENT_CONTAINER_SYMBOL = Symbol.for('@noego/wood.client.container');\nconst CLIENT_APP_SYMBOL = Symbol.for('@noego/wood.client.app');\nconst CLIENT_WINDOW_CONTROLS_SYMBOL = Symbol.for('@noego/wood.client.window-controls');\nconst CLIENT_LOGGER_REGISTRY_SYMBOL = Symbol.for('@noego/wood.client.logger-registry');\nconst INTERNAL_BRIDGE_GLOBAL_KEY = '__NOEGO_WOOD_BRIDGE__';\n\nexport const WOOD_INTERNAL_BRIDGE_KEY = INTERNAL_BRIDGE_GLOBAL_KEY;\n\nexport interface WoodRpcManifestEntry {\n channel: string;\n controller: string;\n action: string;\n path: string[];\n hasInput: boolean;\n}\n\ntype WoodBridgeRpcFunction = (data?: unknown) => Promise<unknown>;\ntype WoodBridgeLike = Record<string, unknown> & {\n __rpcManifest?: WoodRpcManifestEntry[];\n __window?: {\n current?: () => Promise<unknown>;\n open?: (windowId: string, options?: Record<string, unknown>) => Promise<unknown>;\n close?: (windowId?: string) => Promise<unknown>;\n focus?: (windowId: string) => Promise<unknown>;\n minimize?: (windowId?: string) => Promise<unknown>;\n maximize?: (windowId?: string) => Promise<unknown>;\n };\n __log?: (\n level: string,\n logger: string,\n message: string,\n context?: unknown,\n ) => void;\n __woodConfig?: () => Promise<unknown>;\n __trace?: (event: unknown) => void;\n};\n\ntype GlobalWithClientContainer = typeof globalThis & {\n [CLIENT_CONTAINER_SYMBOL]?: any;\n};\n\ntype GlobalWithClientApp = typeof globalThis & {\n [CLIENT_APP_SYMBOL]?: object;\n};\n\ntype GlobalWithWindowControls = typeof globalThis & {\n [CLIENT_WINDOW_CONTROLS_SYMBOL]?: WindowControls;\n};\n\ntype GlobalWithLoggerRegistry = typeof globalThis & {\n [CLIENT_LOGGER_REGISTRY_SYMBOL]?: Map<string, RendererLogger>;\n};\n\ninterface WoodContainerRegistration {\n registerFunction?(\n token: any,\n resolver: (...args: any[]) => unknown,\n options?: Record<string, unknown>,\n ): void;\n}\n\nexport class App {\n [controllerName: string]: unknown;\n}\n\nfunction resolveWoodBridge(): WoodBridgeLike {\n const globalObj = globalThis as typeof globalThis & {\n [INTERNAL_BRIDGE_GLOBAL_KEY]?: unknown;\n wood?: unknown;\n window?: {\n [INTERNAL_BRIDGE_GLOBAL_KEY]?: unknown;\n wood?: unknown;\n };\n };\n\n const bridge = globalObj[INTERNAL_BRIDGE_GLOBAL_KEY]\n ?? globalObj.window?.[INTERNAL_BRIDGE_GLOBAL_KEY]\n ?? globalObj.wood\n ?? globalObj.window?.wood;\n if (!bridge || typeof bridge !== 'object') {\n throw new Error(\n `Wood bridge is not available on globalThis.${INTERNAL_BRIDGE_GLOBAL_KEY}.`,\n );\n }\n\n return bridge as WoodBridgeLike;\n}\n\nfunction resolveRpcManifest(bridge: WoodBridgeLike): WoodRpcManifestEntry[] {\n const manifest = bridge.__rpcManifest;\n if (!Array.isArray(manifest)) {\n throw new Error(\n 'Wood bridge is missing \"__rpcManifest\". Regenerate preload with the latest @noego/wood.',\n );\n }\n\n return manifest;\n}\n\nfunction resolveBridgeFunction(\n bridge: WoodBridgeLike,\n pathSegments: string[],\n operationKey: string,\n): WoodBridgeRpcFunction {\n let current: unknown = bridge;\n\n for (const segment of pathSegments) {\n if (!current || typeof current !== 'object') {\n throw new Error(\n `Wood bridge operation \"${operationKey}\" is missing path \"${pathSegments.join('.')}\".`,\n );\n }\n current = (current as Record<string, unknown>)[segment];\n }\n\n if (typeof current !== 'function') {\n throw new Error(\n `Wood bridge path \"${pathSegments.join('.')}\" for \"${operationKey}\" is not callable.`,\n );\n }\n\n return current as WoodBridgeRpcFunction;\n}\n\nfunction assertSerializable(value: unknown, operationKey: string): void {\n if (typeof structuredClone !== 'function') {\n return;\n }\n\n try {\n structuredClone(value);\n } catch (error) {\n const reason = error instanceof Error ? error.message : String(error);\n throw new Error(\n `App RPC \"${operationKey}\" payload is not serializable: ${reason}`,\n );\n }\n}\n\nfunction extractTraceConversationId(value: unknown): number | string | undefined {\n if (!value || typeof value !== 'object' || Array.isArray(value)) {\n return undefined;\n }\n\n const record = value as Record<string, unknown>;\n if (typeof record.conversationId === 'number' || typeof record.conversationId === 'string') {\n return record.conversationId;\n }\n if (typeof record.threadId === 'number' || typeof record.threadId === 'string') {\n return record.threadId;\n }\n\n return undefined;\n}\n\nfunction validateManifestEntry(entry: WoodRpcManifestEntry, index: number): void {\n if (!entry.channel || !entry.controller || !entry.action) {\n throw new Error(`Invalid Wood RPC manifest entry at index ${index}.`);\n }\n if (!Array.isArray(entry.path) || entry.path.length === 0) {\n throw new Error(\n `Invalid Wood RPC manifest path for \"${entry.controller}.${entry.action}\".`,\n );\n }\n}\n\nfunction createAppInstance(): App {\n const bridge = resolveWoodBridge();\n const manifest = resolveRpcManifest(bridge);\n const app: Record<string, Record<string, (...args: unknown[]) => Promise<unknown>>> = {};\n\n manifest.forEach((entry, index) => {\n validateManifestEntry(entry, index);\n\n const operationKey = `${entry.controller}.${entry.action}`;\n const invoke = resolveBridgeFunction(bridge, entry.path, operationKey);\n\n if (!app[entry.controller]) {\n app[entry.controller] = {};\n }\n\n if (app[entry.controller][entry.action]) {\n throw new Error(\n `Duplicate RPC action \"${operationKey}\" in Wood manifest. Actions must be unique per controller.`,\n );\n }\n\n app[entry.controller][entry.action] = (...args: unknown[]): Promise<unknown> => {\n if (entry.hasInput) {\n if (args.length !== 1) {\n throw new Error(\n `App RPC \"${operationKey}\" expects exactly one payload argument.`,\n );\n }\n assertSerializable(args[0], operationKey);\n const conversationId = extractTraceConversationId(args[0]);\n emitRendererTrace('debug', {\n source: 'wood.client.app',\n type: 'rpc.request',\n ...(conversationId !== undefined ? { conversationId } : {}),\n payload: {\n operationKey,\n channel: entry.channel,\n hasInput: entry.hasInput,\n },\n });\n return invoke(args[0])\n .then((result) => {\n emitRendererTrace('debug', {\n source: 'wood.client.app',\n type: 'rpc.response',\n ...(conversationId !== undefined ? { conversationId } : {}),\n payload: {\n operationKey,\n channel: entry.channel,\n outcome: 'ok',\n },\n });\n return result;\n })\n .catch((error) => {\n emitRendererTrace('error', {\n source: 'wood.client.app',\n type: 'rpc.response',\n message: error instanceof Error ? error.message : String(error),\n ...(conversationId !== undefined ? { conversationId } : {}),\n payload: {\n operationKey,\n channel: entry.channel,\n outcome: 'error',\n },\n });\n throw error;\n });\n }\n\n if (args.length !== 0) {\n throw new Error(\n `App RPC \"${operationKey}\" expects no arguments.`,\n );\n }\n\n emitRendererTrace('debug', {\n source: 'wood.client.app',\n type: 'rpc.request',\n payload: {\n operationKey,\n channel: entry.channel,\n hasInput: entry.hasInput,\n },\n });\n return invoke()\n .then((result) => {\n emitRendererTrace('debug', {\n source: 'wood.client.app',\n type: 'rpc.response',\n payload: {\n operationKey,\n channel: entry.channel,\n outcome: 'ok',\n },\n });\n return result;\n })\n .catch((error) => {\n emitRendererTrace('error', {\n source: 'wood.client.app',\n type: 'rpc.response',\n message: error instanceof Error ? error.message : String(error),\n payload: {\n operationKey,\n channel: entry.channel,\n outcome: 'error',\n },\n });\n throw error;\n });\n };\n });\n\n return app as unknown as App;\n}\n\nexport function getApp<TApp extends object = App>(): TApp {\n const globalObj = globalThis as GlobalWithClientApp;\n if (!globalObj[CLIENT_APP_SYMBOL]) {\n globalObj[CLIENT_APP_SYMBOL] = createAppInstance();\n }\n return globalObj[CLIENT_APP_SYMBOL] as TApp;\n}\n\n/** Test-only helper to clear the client App singleton. */\nexport function clearClientAppForTests(): void {\n const globalObj = globalThis as GlobalWithClientApp;\n delete globalObj[CLIENT_APP_SYMBOL];\n}\n\nfunction resolveWindowControlsBridgeMethod<T>(\n method: keyof NonNullable<WoodBridgeLike['__window']>,\n): T {\n const bridge = resolveWoodBridge();\n const fn = bridge.__window?.[method];\n if (typeof fn !== 'function') {\n throw new Error(`Wood bridge does not expose \"__window.${String(method)}\".`);\n }\n return fn as unknown as T;\n}\n\nexport class WindowControls {\n async open(windowId: string, options?: Record<string, unknown>): Promise<void> {\n const open = resolveWindowControlsBridgeMethod<\n (id: string, opts?: Record<string, unknown>) => Promise<unknown>\n >('open');\n await open(windowId, options);\n }\n\n async close(windowId?: string): Promise<void> {\n const close = resolveWindowControlsBridgeMethod<\n (id?: string) => Promise<unknown>\n >('close');\n await close(windowId);\n }\n\n async focus(windowId: string): Promise<void> {\n const focus = resolveWindowControlsBridgeMethod<\n (id: string) => Promise<unknown>\n >('focus');\n await focus(windowId);\n }\n\n async minimize(windowId?: string): Promise<void> {\n const minimize = resolveWindowControlsBridgeMethod<\n (id?: string) => Promise<unknown>\n >('minimize');\n await minimize(windowId);\n }\n\n async maximize(windowId?: string): Promise<void> {\n const maximize = resolveWindowControlsBridgeMethod<\n (id?: string) => Promise<unknown>\n >('maximize');\n await maximize(windowId);\n }\n}\n\nexport function getWindowControls(): WindowControls {\n const globalObj = globalThis as GlobalWithWindowControls;\n if (!globalObj[CLIENT_WINDOW_CONTROLS_SYMBOL]) {\n globalObj[CLIENT_WINDOW_CONTROLS_SYMBOL] = new WindowControls();\n }\n return globalObj[CLIENT_WINDOW_CONTROLS_SYMBOL] as WindowControls;\n}\n\n/** Test-only helper to clear the client WindowControls singleton. */\nexport function clearClientWindowControlsForTests(): void {\n const globalObj = globalThis as GlobalWithWindowControls;\n delete globalObj[CLIENT_WINDOW_CONTROLS_SYMBOL];\n}\n\ntype RendererLogLevel = 'debug' | 'info' | 'warn' | 'error' | (string & {});\n\nfunction stringifyLogMessage(message: unknown): string {\n if (typeof message === 'string') return message;\n if (message instanceof Error) return message.message;\n return String(message);\n}\n\nfunction writeConsole(level: RendererLogLevel, logger: string, message: string, context?: unknown): void {\n const prefix = `[${logger}] ${message}`;\n switch (level) {\n case 'debug':\n console.debug(prefix, context);\n return;\n case 'warn':\n console.warn(prefix, context);\n return;\n case 'error':\n console.error(prefix, context);\n return;\n default:\n console.info(prefix, context);\n }\n}\n\nclass RendererLogger {\n constructor(private readonly loggerName: string) {}\n\n debug(message: unknown, context?: unknown): void {\n this.log('debug', message, context);\n }\n\n info(message: unknown, context?: unknown): void {\n this.log('info', message, context);\n }\n\n warn(message: unknown, context?: unknown): void {\n this.log('warn', message, context);\n }\n\n error(message: unknown, context?: unknown): void {\n this.log('error', message, context);\n }\n\n logAt(level: RendererLogLevel, rawMessage: unknown, context?: unknown): void {\n this.log(level, rawMessage, context);\n }\n\n private log(level: RendererLogLevel, rawMessage: unknown, context?: unknown): void {\n const message = stringifyLogMessage(rawMessage);\n\n let bridge: WoodBridgeLike;\n try {\n bridge = resolveWoodBridge();\n } catch {\n writeConsole(level, this.loggerName, message, context);\n return;\n }\n\n if (typeof bridge.__log !== 'function') {\n writeConsole(level, this.loggerName, message, context);\n return;\n }\n\n try {\n bridge.__log(level, this.loggerName, message, context);\n } catch {\n writeConsole(level, this.loggerName, message, context);\n }\n }\n}\n\ntype RendererLoggerShape = {\n logAt(level: RendererLogLevel, message: unknown, context?: unknown): void;\n debug(message: unknown, context?: unknown): void;\n info(message: unknown, context?: unknown): void;\n warn(message: unknown, context?: unknown): void;\n error(message: unknown, context?: unknown): void;\n};\n\nexport function createLogger(name: string): RendererLoggerShape {\n const loggerName = name.trim() || 'renderer';\n const globalObj = globalThis as GlobalWithLoggerRegistry;\n if (!globalObj[CLIENT_LOGGER_REGISTRY_SYMBOL]) {\n globalObj[CLIENT_LOGGER_REGISTRY_SYMBOL] = new Map<string, RendererLogger>();\n }\n\n const existing = globalObj[CLIENT_LOGGER_REGISTRY_SYMBOL]?.get(loggerName);\n if (existing) return existing;\n\n const logger = new RendererLogger(loggerName);\n globalObj[CLIENT_LOGGER_REGISTRY_SYMBOL]?.set(loggerName, logger);\n return logger;\n}\n\n/** Test-only helper to clear client logger singletons. */\nexport function clearClientLoggersForTests(): void {\n const globalObj = globalThis as GlobalWithLoggerRegistry;\n delete globalObj[CLIENT_LOGGER_REGISTRY_SYMBOL];\n}\n\nfunction registerClientBuiltins(container: WoodContainerRegistration): void {\n if (typeof container.registerFunction !== 'function') {\n return;\n }\n\n const traceConfiguration = new TraceProviderConfiguration();\n traceConfiguration.configureRuntime('renderer');\n\n container.registerFunction(Navigation, () => getNavigation());\n container.registerFunction(App, () => getApp());\n container.registerFunction(Ipc, () => getIpc());\n container.registerFunction(WindowControls, () => getWindowControls());\n container.registerFunction(TraceProviderConfiguration, () => traceConfiguration);\n}\n\nfunction createClientContainerInstance(): any {\n const container = new Container();\n registerClientBuiltins(container as WoodContainerRegistration);\n return container;\n}\n\n/**\n * Return a process-global client container instance.\n *\n * - First call creates the container and stores it on a symbol.\n * - Later calls return the same container instance.\n */\nexport function getContainer(): any {\n const globalObj = globalThis as GlobalWithClientContainer;\n if (!globalObj[CLIENT_CONTAINER_SYMBOL]) {\n globalObj[CLIENT_CONTAINER_SYMBOL] = createClientContainerInstance();\n }\n return globalObj[CLIENT_CONTAINER_SYMBOL];\n}\n\n/** Test-only helper to clear the client container singleton. */\nexport function clearClientContainerForTests(): void {\n const globalObj = globalThis as GlobalWithClientContainer;\n delete globalObj[CLIENT_CONTAINER_SYMBOL];\n}\n\n/** Test-only helper to clear the client navigation singleton. */\nexport function clearClientNavigationForTests(): void {\n clearNavigationSingletonForTests();\n}\n\n/** Clamp a menu position so it stays within viewport bounds. */\nexport function clampMenuPosition(\n x: number,\n y: number,\n menuWidth: number,\n menuHeight: number,\n): { x: number; y: number } {\n const vw = typeof window !== 'undefined' ? window.innerWidth : Infinity;\n const vh = typeof window !== 'undefined' ? window.innerHeight : Infinity;\n return {\n x: Math.min(x, Math.max(0, vw - menuWidth)),\n y: Math.min(y, Math.max(0, vh - menuHeight)),\n };\n}\n\nfunction resolveTarget(target: Element | null): Element {\n if (!target) {\n throw new Error('Missing renderer mount target');\n }\n return target;\n}\n\ntype RendererTraceBootstrapConfiguration = {\n rendererTraceEnabled?: boolean;\n rendererTraceMinLevel?: string;\n rendererTraceBatchEnabled?: boolean;\n appEnv?: string;\n};\n\nfunction configureRendererTraceTransport(config: RendererTraceBootstrapConfiguration | null): void {\n const globalObj = globalThis as Record<string, unknown>;\n if (config?.rendererTraceBatchEnabled) {\n const batchGlobal = globalObj.__NOEGO_WOOD_TRACE_BATCH__ as\n | { send?: (data: unknown) => unknown }\n | undefined;\n if (batchGlobal && typeof batchGlobal.send === 'function') {\n const sender = batchGlobal.send.bind(batchGlobal);\n setRendererTraceTransport((payload: unknown) => {\n sender(payload);\n });\n return;\n }\n }\n\n const traceGlobal = globalObj.__NOEGO_TRACE__ as\n | { send?: (data: unknown) => void }\n | undefined;\n if (traceGlobal && typeof traceGlobal.send === 'function') {\n const sender = traceGlobal.send.bind(traceGlobal);\n setRendererTraceTransport((payload: unknown) => sender(payload));\n }\n}\n\n/**\n * Start a Wood renderer app by mounting it to a target element.\n * Usage:\n * import { app } from './generated/app.js';\n * startWood(app, document.getElementById('app'));\n */\nexport async function startWood<T>(\n mountRoot: (target: Element) => T,\n target: Element | null,\n): Promise<T> {\n // Ensure container singleton exists and registers built-in client tokens.\n const container = getContainer();\n // Ensure navigation singleton exists at first client boot.\n getNavigation();\n\n // Fetch framework config from the main process and apply renderer trace\n // controls before the first render.\n let rendererTraceConfig: RendererTraceBootstrapConfiguration | null = null;\n try {\n const bridge = resolveWoodBridge();\n if (typeof bridge.__woodConfig === 'function') {\n const config = await bridge.__woodConfig() as RendererTraceBootstrapConfiguration | null;\n rendererTraceConfig = config;\n setWoodAppEnv(config?.appEnv);\n const traceConfiguration = container.instance\n ? await container.instance(TraceProviderConfiguration)\n : null;\n if (typeof config?.rendererTraceEnabled === 'boolean') {\n traceConfiguration?.configureEnabled(config.rendererTraceEnabled);\n }\n const level = config?.rendererTraceMinLevel;\n if (typeof level === 'string' && level.trim().length > 0) {\n traceConfiguration?.configureMinLevel(level);\n }\n }\n } catch {\n // Config fetch is best-effort; fall back to defaults.\n }\n\n try {\n configureRendererTraceTransport(rendererTraceConfig);\n } catch {\n // Trace transport selection is best-effort; the internal IPC bridge remains available.\n }\n\n return mountRoot(resolveTarget(target));\n}\n\n/**\n * Backward-compatible helper that returns a target-aware boot function.\n * Usage:\n * const boot = createSvelteBoot(app);\n * const mounted = boot(document.getElementById('app'));\n */\nexport function createSvelteBoot<T>(\n mountRoot: (target: Element) => T,\n) {\n return (target: Element | null): T => mountRoot(resolveTarget(target));\n}\n\nexport { getNavigation };\nexport { Ipc, getIpc };\nexport { clearTraceHubForTests };\nexport { setRendererTraceTransport };\nexport { TraceProvider, TraceProviderConfiguration } from '../tracing/index.js';\nexport type {\n FrameworkTracer,\n TraceEvent,\n TraceInput,\n TraceLevel,\n TraceProcess,\n TraceProviderMode,\n TraceRuntime,\n TraceWaitOptions,\n} from '../tracing/index.js';\n"],"mappings":"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","names":["TraceProviderConfiguration"]}
|