overmux 0.0.10 → 0.0.12
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +22 -0
- package/dist/bin.js +145 -58
- package/dist/bin.js.map +1 -1
- package/dist/docs/400-reference/200-configuration.md +54 -4
- package/dist/docs/400-reference/500-server/000-index.md +4 -0
- package/dist/docs/400-reference/500-server/100-resources.md +5 -0
- package/dist/docs/400-reference/500-server/200-operations.md +1 -0
- package/dist/docs/400-reference/500-server/300-streams.md +7 -1
- package/dist/docs/400-reference/500-server/400-notifications.md +4 -0
- package/dist/docs/400-reference/500-server/500-api.md +26 -5
- package/dist/exports/client.d.ts +1 -1
- package/dist/exports/client.d.ts.map +1 -1
- package/dist/exports/client.js +55 -14
- package/dist/exports/client.js.map +1 -1
- package/dist/exports/{index-Dk11nKIv.d.ts → index-C-8Kzrnc.d.ts} +23 -8
- package/dist/exports/index-C-8Kzrnc.d.ts.map +1 -0
- package/dist/exports/index.d.ts +2 -2
- package/dist/exports/index.js +1 -1
- package/dist/exports/index.js.map +1 -1
- package/dist/exports/{notifications-BFAD3QQl.js → notifications-BBKvKZgI.js} +8 -2
- package/dist/exports/{notifications-BFAD3QQl.js.map → notifications-BBKvKZgI.js.map} +1 -1
- package/dist/exports/server.d.ts.map +1 -1
- package/dist/exports/server.js +8 -2
- package/dist/exports/server.js.map +1 -1
- package/dist/internal/server/coordinator/server-child.js +616 -883
- package/dist/internal/server/coordinator/server-child.js.map +1 -1
- package/dist/internal/server/worker-entry.d.ts +1 -0
- package/dist/internal/server/worker-entry.js +728 -0
- package/dist/internal/server/worker-entry.js.map +1 -0
- package/dist/push/THIRD_PARTY_NOTICES.md +30 -0
- package/dist/push/badge.png +0 -0
- package/dist/push/icon.png +0 -0
- package/dist/push/sw.js +88 -0
- package/dist/push/sw.js.map +1 -0
- package/dist/worker-protocol-hXs4FXCH.js +638 -0
- package/dist/worker-protocol-hXs4FXCH.js.map +1 -0
- package/docs/400-reference/200-configuration.md +54 -4
- package/docs/400-reference/500-server/000-index.md +4 -0
- package/docs/400-reference/500-server/100-resources.md +5 -0
- package/docs/400-reference/500-server/200-operations.md +1 -0
- package/docs/400-reference/500-server/300-streams.md +7 -1
- package/docs/400-reference/500-server/400-notifications.md +4 -0
- package/docs/400-reference/500-server/500-api.md +26 -5
- package/package.json +4 -3
- package/src/internal/client/background-notifications.ts +3 -1
- package/src/internal/client/host/hosted-pages/browser-notification-settings.tsx +8 -3
- package/src/internal/client/host/overmux-host.tsx +4 -8
- package/src/internal/client/push-assets/badge.png +0 -0
- package/src/internal/client/push-assets/icon.png +0 -0
- package/src/internal/client/push-service-worker.ts +118 -0
- package/src/internal/client/register-push-worker.ts +63 -0
- package/src/internal/server/coordinator/ipc-protocol.ts +2 -1
- package/src/internal/server/http/operation-handler.ts +3 -0
- package/src/internal/server/http/request-logging.ts +1 -1
- package/src/internal/server/http/routes.ts +47 -2
- package/src/internal/server/protocol-error.ts +19 -0
- package/src/internal/server/runtime/create-runtime.ts +11 -5
- package/src/internal/server/runtime/handler-logger.ts +54 -0
- package/src/internal/server/runtime/runtime-operations.ts +23 -5
- package/src/internal/server/runtime/runtime-resources.ts +158 -88
- package/src/internal/server/runtime/runtime-streams.ts +24 -8
- package/src/internal/server/runtime/worker-capabilities.ts +67 -0
- package/src/internal/server/runtime/worker-connection.ts +549 -0
- package/src/internal/server/runtime/worker-protocol.ts +173 -0
- package/src/internal/server/runtime/worker-runtime.ts +214 -0
- package/src/internal/server/server-logger.ts +25 -37
- package/src/internal/server/server-startup-options.ts +7 -6
- package/src/internal/server/start-application-server.ts +22 -18
- package/src/internal/server/start-overmux-server.ts +2 -2
- package/src/internal/server/websocket-connection.ts +97 -32
- package/src/internal/server/websocket-server.ts +5 -1
- package/src/internal/server/worker-entry.ts +504 -0
- package/src/internal/shared/protocol.ts +3 -3
- package/src/internal/shared/routes.ts +2 -0
- package/src/public/config.ts +15 -23
- package/src/public/handler-logger.ts +7 -0
- package/src/public/index.ts +3 -1
- package/dist/exports/index-Dk11nKIv.d.ts.map +0 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,27 @@
|
|
|
1
1
|
# overmux
|
|
2
2
|
|
|
3
|
+
## 0.0.12
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- [#43](https://github.com/richardgill/overmux/pull/43) [`b392280`](https://github.com/richardgill/overmux/commit/b3922800cfe31ca3d85c76fa3d364d146d96df88) Thanks [@richardgill](https://github.com/richardgill)! - Add structured `context.logger` logging to resource, stream, and operation handlers, with automatic capability and request/session correlation and safe cleanup logging.
|
|
8
|
+
|
|
9
|
+
Replace the top-level `debug` boolean with `logLevel: "debug" | "info" | "warn" | "error"`, defaulting to `"info"` in development and production. Runtime and handler events use the same severity threshold with no lifecycle exceptions; browser console forwarding is enabled only at `"debug"`. Remove `debug` from existing configuration and use `logLevel: "debug"` when investigating. The runtime protocol version increases to reject older browser manifests.
|
|
10
|
+
|
|
11
|
+
- [#46](https://github.com/richardgill/overmux/pull/46) [`053f7b6`](https://github.com/richardgill/overmux/commit/053f7b6cf03050e6499905fc9d71bdf5a9894fde) Thanks [@richardgill](https://github.com/richardgill)! - Isolate each named stream from the shared resource/operation worker. Query, subscription, and derived resources continue to run together with operations; each named stream has its own worker.
|
|
12
|
+
|
|
13
|
+
Remove `context.invalidate` from stream handlers. Resource and operation contexts retain invalidation. Use an operation to mutate data and invalidate resources, or a subscription resource watcher to refresh clients when an external source changes.
|
|
14
|
+
|
|
15
|
+
## 0.0.11
|
|
16
|
+
|
|
17
|
+
### Patch Changes
|
|
18
|
+
|
|
19
|
+
- [#40](https://github.com/richardgill/overmux/pull/40) [`1a8bf22`](https://github.com/richardgill/overmux/commit/1a8bf22fb787b78a0beb8212fa33b074bfb9e9e5) Thanks [@richardgill](https://github.com/richardgill)! - Brand background notifications with the Overmux logo on a light background and a monochrome Android status-bar badge. Ship the notification images with the runtime so they remain available in development and production, including after session expiry.
|
|
20
|
+
|
|
21
|
+
- [#42](https://github.com/richardgill/overmux/pull/42) [`910ca21`](https://github.com/richardgill/overmux/commit/910ca216beeedeb7326baad6625452bb691fc801) Thanks [@richardgill](https://github.com/richardgill)! - Add a synchronous `onBeforeInputEvent` desktop configuration hook for the remote Overmux view and owned native web views, with cancellation before native-view passthrough. Document the hook and Linux Super+C/V configuration in the configuration reference.
|
|
22
|
+
|
|
23
|
+
- [#38](https://github.com/richardgill/overmux/pull/38) [`cfc58d8`](https://github.com/richardgill/overmux/commit/cfc58d8881fa847fc15f7a5a02c2ad5e702ebe02) Thanks [@richardgill](https://github.com/richardgill)! - Fix browser background notifications with a runtime-owned push service worker in development and production. Enable now registers an active worker with bounded failure reporting; notification clicks only navigate within the current origin.
|
|
24
|
+
|
|
3
25
|
## 0.0.10
|
|
4
26
|
|
|
5
27
|
### Patch Changes
|
package/dist/bin.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import { createRequire, findPackageJSON } from "node:module";
|
|
3
|
-
import { createHash } from "node:crypto";
|
|
3
|
+
import { createHash, randomUUID } from "node:crypto";
|
|
4
4
|
import { constants, cpSync, createWriteStream, existsSync, lstatSync, mkdirSync, mkdtempSync, readFileSync, readdirSync, readlinkSync, renameSync, rmSync, statSync, watch, writeFileSync } from "node:fs";
|
|
5
5
|
import { access, open, readFile, readdir, realpath } from "node:fs/promises";
|
|
6
6
|
import { createConnection, isIP } from "node:net";
|
|
@@ -1853,6 +1853,12 @@ var createInstanceIdentity = (instanceId) => ({
|
|
|
1853
1853
|
instanceId: instanceIdSchema$1.parse(instanceId),
|
|
1854
1854
|
deepLinkPrefix: `overmux://${instanceId}`
|
|
1855
1855
|
});
|
|
1856
|
+
var logLevelSchema$1 = z.enum([
|
|
1857
|
+
"debug",
|
|
1858
|
+
"info",
|
|
1859
|
+
"warn",
|
|
1860
|
+
"error"
|
|
1861
|
+
]);
|
|
1856
1862
|
//#endregion
|
|
1857
1863
|
//#region ../shared/dist/node/index.js
|
|
1858
1864
|
var durationPattern = /^([1-9]\d*)(ms|s|m|h|d)$/;
|
|
@@ -1872,6 +1878,12 @@ var durationToMilliseconds = (duration) => {
|
|
|
1872
1878
|
};
|
|
1873
1879
|
var aiContextSnippets = ["package-source", "tech-stack-recommendations"];
|
|
1874
1880
|
var instanceIdSchema = z.string().max(253).regex(/^[a-z0-9](?:[a-z0-9.-]*[a-z0-9])?(?![\s\S])/, "Expected a lowercase instance ID with only ASCII letters, digits, internal dots and hyphens");
|
|
1881
|
+
var logLevelSchema = z.enum([
|
|
1882
|
+
"debug",
|
|
1883
|
+
"info",
|
|
1884
|
+
"warn",
|
|
1885
|
+
"error"
|
|
1886
|
+
]);
|
|
1875
1887
|
var zodTypeSchema = z.custom((value) => value instanceof z.ZodType, "Expected a Zod schema");
|
|
1876
1888
|
var functionSchema = z.custom((value) => typeof value === "function", "Expected a function");
|
|
1877
1889
|
var contractRuntimeSchema = z.object({
|
|
@@ -1937,11 +1949,11 @@ var serverDefinitionRuntimeSchema = z.object({
|
|
|
1937
1949
|
var configDefinitionRuntimeSchema = serverConfigRuntimeSchema.extend({
|
|
1938
1950
|
aiContextSnippets: z.array(z.enum(aiContextSnippets)).optional(),
|
|
1939
1951
|
auth: authConfigRuntimeSchema,
|
|
1940
|
-
|
|
1952
|
+
logLevel: logLevelSchema.optional(),
|
|
1941
1953
|
instanceId: z.union([instanceIdSchema, z.custom((value) => typeof value === "function", "Expected an instance ID or a function of the bound port")]).optional(),
|
|
1942
1954
|
server: serverDefinitionRuntimeSchema,
|
|
1943
1955
|
vite: z.string().min(1).optional()
|
|
1944
|
-
});
|
|
1956
|
+
}).strict();
|
|
1945
1957
|
var resolveLogicalPath = async (path) => {
|
|
1946
1958
|
const logicalPath = resolve(path);
|
|
1947
1959
|
return {
|
|
@@ -2396,9 +2408,9 @@ var backgroundNotificationSubscriptionSchema = z.object({
|
|
|
2396
2408
|
z.object({ publicKey: deliveryKeySchema }).strict();
|
|
2397
2409
|
z.object({ endpoint: backgroundNotificationSubscriptionSchema.shape.endpoint }).strict();
|
|
2398
2410
|
z.object({
|
|
2399
|
-
|
|
2411
|
+
logLevel: logLevelSchema$1,
|
|
2400
2412
|
operations: z.array(z.string().min(1)),
|
|
2401
|
-
protocolVersion: z.literal(
|
|
2413
|
+
protocolVersion: z.literal(11),
|
|
2402
2414
|
resources: z.array(z.string().min(1)),
|
|
2403
2415
|
streams: z.array(z.string().min(1))
|
|
2404
2416
|
});
|
|
@@ -2601,6 +2613,31 @@ var createRuntimeLifecycle = (preparationSignal) => {
|
|
|
2601
2613
|
};
|
|
2602
2614
|
};
|
|
2603
2615
|
//#endregion
|
|
2616
|
+
//#region src/internal/server/runtime/handler-logger.ts
|
|
2617
|
+
var createHandlerLogger = ({ serverLogger, correlation = {}, ...identity }) => {
|
|
2618
|
+
const { correlationId = randomUUID(), ...session } = correlation;
|
|
2619
|
+
const log = (level, event, data) => {
|
|
2620
|
+
try {
|
|
2621
|
+
serverLogger?.log({
|
|
2622
|
+
correlationId,
|
|
2623
|
+
details: {
|
|
2624
|
+
...identity,
|
|
2625
|
+
...session,
|
|
2626
|
+
data
|
|
2627
|
+
},
|
|
2628
|
+
event,
|
|
2629
|
+
level
|
|
2630
|
+
});
|
|
2631
|
+
} catch {}
|
|
2632
|
+
};
|
|
2633
|
+
return {
|
|
2634
|
+
debug: (event, details) => log("debug", event, details),
|
|
2635
|
+
info: (event, details) => log("info", event, details),
|
|
2636
|
+
warn: (event, details) => log("warn", event, details),
|
|
2637
|
+
error: (event, details) => log("error", event, details)
|
|
2638
|
+
};
|
|
2639
|
+
};
|
|
2640
|
+
//#endregion
|
|
2604
2641
|
//#region src/internal/server/runtime/runtime-operations.ts
|
|
2605
2642
|
var OperationValidationError = class extends Error {
|
|
2606
2643
|
phase;
|
|
@@ -2609,18 +2646,25 @@ var OperationValidationError = class extends Error {
|
|
|
2609
2646
|
this.phase = phase;
|
|
2610
2647
|
}
|
|
2611
2648
|
};
|
|
2612
|
-
var createRuntimeOperations = ({ context, definitions, notifications }) => {
|
|
2649
|
+
var createRuntimeOperations = ({ context, definitions, notifications, serverLogger }) => {
|
|
2613
2650
|
const operations = /* @__PURE__ */ new Map();
|
|
2614
2651
|
Object.entries(definitions).forEach(([name, definition]) => {
|
|
2615
2652
|
if (!name) throw new Error("Operation names must not be empty");
|
|
2616
2653
|
operations.set(name, {
|
|
2617
|
-
execute: async (rawInput, signal) => {
|
|
2654
|
+
execute: async (rawInput, signal, correlation) => {
|
|
2618
2655
|
const operationContext = context(signal);
|
|
2619
2656
|
operationContext.signal.throwIfAborted();
|
|
2620
2657
|
const input = definition.input.safeParse(rawInput);
|
|
2621
2658
|
if (!input.success) throw new OperationValidationError("input", input.error);
|
|
2622
2659
|
const rawOutput = await definition.handle(input.data, {
|
|
2623
2660
|
...operationContext,
|
|
2661
|
+
logger: createHandlerLogger({
|
|
2662
|
+
serverLogger,
|
|
2663
|
+
correlation,
|
|
2664
|
+
capabilityKind: "operation",
|
|
2665
|
+
registeredName: name,
|
|
2666
|
+
handler: "handle"
|
|
2667
|
+
}),
|
|
2624
2668
|
notifications
|
|
2625
2669
|
});
|
|
2626
2670
|
operationContext.signal.throwIfAborted();
|
|
@@ -2732,6 +2776,14 @@ var getInvalidatedResourceIds = (graph, resourceId) => {
|
|
|
2732
2776
|
};
|
|
2733
2777
|
//#endregion
|
|
2734
2778
|
//#region src/internal/server/runtime/runtime-resources.ts
|
|
2779
|
+
var parseDependencyInputs = (definitions, graph, id, rawInput, inputs = /* @__PURE__ */ new Map()) => {
|
|
2780
|
+
if (inputs.has(id)) return inputs;
|
|
2781
|
+
inputs.set(id, definitions[id].contract.input.parse(rawInput));
|
|
2782
|
+
graph.dependencies.get(id)?.forEach((dependencyId) => {
|
|
2783
|
+
parseDependencyInputs(definitions, graph, dependencyId, rawInput, inputs);
|
|
2784
|
+
});
|
|
2785
|
+
return inputs;
|
|
2786
|
+
};
|
|
2735
2787
|
var createSubscriptionLifetime = ({ entry, invalidationListeners, lifecycle, signal }) => {
|
|
2736
2788
|
const controller = new AbortController();
|
|
2737
2789
|
const subscriptionSignal = AbortSignal.any([lifecycle.requestSignal(signal), controller.signal]);
|
|
@@ -2743,23 +2795,23 @@ var createSubscriptionLifetime = ({ entry, invalidationListeners, lifecycle, sig
|
|
|
2743
2795
|
}
|
|
2744
2796
|
};
|
|
2745
2797
|
const disposers = [];
|
|
2798
|
+
const subscription = {
|
|
2799
|
+
disposers,
|
|
2800
|
+
dispose: () => {
|
|
2801
|
+
controller.abort(/* @__PURE__ */ new Error("Resource subscription closed"));
|
|
2802
|
+
return release();
|
|
2803
|
+
},
|
|
2804
|
+
refresh: registeredEntry.listener,
|
|
2805
|
+
signal: subscriptionSignal
|
|
2806
|
+
};
|
|
2746
2807
|
const release = lifecycle.track(async () => {
|
|
2747
2808
|
invalidationListeners.delete(registeredEntry);
|
|
2748
2809
|
await lifecycle.disposeAll(disposers);
|
|
2749
2810
|
}, subscriptionSignal);
|
|
2750
|
-
const dispose = () => {
|
|
2751
|
-
controller.abort(/* @__PURE__ */ new Error("Resource subscription closed"));
|
|
2752
|
-
return release();
|
|
2753
|
-
};
|
|
2754
2811
|
invalidationListeners.add(registeredEntry);
|
|
2755
|
-
return
|
|
2756
|
-
dispose,
|
|
2757
|
-
disposers,
|
|
2758
|
-
refresh: registeredEntry.listener,
|
|
2759
|
-
signal: subscriptionSignal
|
|
2760
|
-
};
|
|
2812
|
+
return subscription;
|
|
2761
2813
|
};
|
|
2762
|
-
var createRuntimeResources = ({ definitions, instance, lifecycle }) => {
|
|
2814
|
+
var createRuntimeResources = ({ definitions, instance, lifecycle, serverLogger }) => {
|
|
2763
2815
|
const graph = createResourceDependencyGraph(definitions);
|
|
2764
2816
|
const invalidationListeners = /* @__PURE__ */ new Set();
|
|
2765
2817
|
const resources = /* @__PURE__ */ new Map();
|
|
@@ -2767,11 +2819,11 @@ var createRuntimeResources = ({ definitions, instance, lifecycle }) => {
|
|
|
2767
2819
|
if (lifecycle.signal.aborted) return;
|
|
2768
2820
|
const ids = getInvalidatedResourceIds(graph, id);
|
|
2769
2821
|
invalidationListeners.forEach((entry) => {
|
|
2770
|
-
if (ids.has(entry.resourceId) && (allInputs || isDeepStrictEqual(entry.
|
|
2822
|
+
if (ids.has(entry.resourceId) && (allInputs || isDeepStrictEqual(entry.inputs.get(id), input))) entry.listener();
|
|
2771
2823
|
});
|
|
2772
2824
|
};
|
|
2773
2825
|
const invalidate = (resourceId, input) => {
|
|
2774
|
-
if (!
|
|
2826
|
+
if (!Object.hasOwn(definitions, resourceId)) throw new Error(`Unknown resource ID: ${resourceId}`);
|
|
2775
2827
|
const definition = definitions[resourceId];
|
|
2776
2828
|
const parsedInput = input === void 0 ? void 0 : definition.contract.input.parse(input);
|
|
2777
2829
|
invalidateResource(resourceId, parsedInput, input === void 0);
|
|
@@ -2781,43 +2833,68 @@ var createRuntimeResources = ({ definitions, instance, lifecycle }) => {
|
|
|
2781
2833
|
invalidate,
|
|
2782
2834
|
signal: lifecycle.requestSignal(signal)
|
|
2783
2835
|
});
|
|
2784
|
-
const read =
|
|
2785
|
-
const
|
|
2786
|
-
|
|
2787
|
-
|
|
2788
|
-
|
|
2789
|
-
|
|
2790
|
-
operationSignal.throwIfAborted();
|
|
2791
|
-
return definition.contract.output.parse(rawOutput);
|
|
2836
|
+
const read = (id, rawInput, signal, correlation = { correlationId: randomUUID() }, reads = /* @__PURE__ */ new Map()) => {
|
|
2837
|
+
const existing = reads.get(id);
|
|
2838
|
+
if (existing) return existing;
|
|
2839
|
+
const pending = readDefinition(id, rawInput, signal, correlation, reads);
|
|
2840
|
+
reads.set(id, pending);
|
|
2841
|
+
return pending;
|
|
2792
2842
|
};
|
|
2793
|
-
const
|
|
2794
|
-
signal.throwIfAborted();
|
|
2795
|
-
if (activated.has(id)) return;
|
|
2796
|
-
activated.add(id);
|
|
2843
|
+
const readDefinition = async (id, rawInput, signal, correlation, reads) => {
|
|
2797
2844
|
const definition = definitions[id];
|
|
2845
|
+
const handlerContext = {
|
|
2846
|
+
...context(signal),
|
|
2847
|
+
logger: createHandlerLogger({
|
|
2848
|
+
serverLogger,
|
|
2849
|
+
correlation,
|
|
2850
|
+
capabilityKind: "resource",
|
|
2851
|
+
registeredName: id,
|
|
2852
|
+
handler: "read"
|
|
2853
|
+
})
|
|
2854
|
+
};
|
|
2855
|
+
handlerContext.signal.throwIfAborted();
|
|
2798
2856
|
const input = definition.contract.input.parse(rawInput);
|
|
2799
|
-
|
|
2800
|
-
|
|
2801
|
-
|
|
2802
|
-
|
|
2803
|
-
|
|
2804
|
-
|
|
2805
|
-
|
|
2806
|
-
|
|
2857
|
+
const dependencies = definition.kind === "derived" ? Object.fromEntries(await Promise.all(Object.entries(definition.dependencies).map(async ([name, dependencyId]) => [name, await read(dependencyId, rawInput, handlerContext.signal, correlation, reads)]))) : void 0;
|
|
2858
|
+
handlerContext.signal.throwIfAborted();
|
|
2859
|
+
const output = definition.kind === "derived" ? definition.combine(dependencies) : await definition.read(input, handlerContext);
|
|
2860
|
+
handlerContext.signal.throwIfAborted();
|
|
2861
|
+
return definition.contract.output.parse(output);
|
|
2862
|
+
};
|
|
2863
|
+
const activateSubscriptions = async (inputs, subscription, correlation) => {
|
|
2864
|
+
for (const [id, input] of inputs) {
|
|
2865
|
+
subscription.signal.throwIfAborted();
|
|
2866
|
+
const definition = definitions[id];
|
|
2867
|
+
if (definition.kind === "subscription") {
|
|
2868
|
+
const dispose = await definition.subscribe(input, () => {
|
|
2869
|
+
if (!subscription.signal.aborted) invalidateResource(id, input);
|
|
2870
|
+
}, {
|
|
2871
|
+
...context(subscription.signal),
|
|
2872
|
+
logger: createHandlerLogger({
|
|
2873
|
+
serverLogger,
|
|
2874
|
+
correlation,
|
|
2875
|
+
capabilityKind: "resource",
|
|
2876
|
+
registeredName: id,
|
|
2877
|
+
handler: "subscribe"
|
|
2878
|
+
})
|
|
2879
|
+
});
|
|
2880
|
+
if (typeof dispose !== "function") throw new Error(`Resource ${id} subscribe must return a disposer`);
|
|
2881
|
+
if (subscription.signal.aborted) {
|
|
2882
|
+
await dispose();
|
|
2883
|
+
subscription.signal.throwIfAborted();
|
|
2884
|
+
}
|
|
2885
|
+
subscription.disposers.push(dispose);
|
|
2807
2886
|
}
|
|
2808
|
-
disposers.push(dispose);
|
|
2809
|
-
return;
|
|
2810
2887
|
}
|
|
2811
|
-
if (definition.kind === "derived") for (const dependencyId of graph.dependencies.get(id) ?? []) await activateSubscriptions(dependencyId, rawInput, signal, activated, disposers);
|
|
2812
2888
|
};
|
|
2813
2889
|
Object.keys(definitions).forEach((name) => {
|
|
2814
2890
|
resources.set(name, {
|
|
2815
|
-
read: (
|
|
2816
|
-
subscribe: async (rawInput, listener, signal) => {
|
|
2891
|
+
read: (rawInput, signal, correlation) => read(name, rawInput, signal, correlation),
|
|
2892
|
+
subscribe: async (rawInput, listener, signal, _onError, correlation = { correlationId: randomUUID() }) => {
|
|
2817
2893
|
lifecycle.requestSignal(signal).throwIfAborted();
|
|
2894
|
+
const inputs = parseDependencyInputs(definitions, graph, name, rawInput);
|
|
2818
2895
|
const subscription = createSubscriptionLifetime({
|
|
2819
2896
|
entry: {
|
|
2820
|
-
|
|
2897
|
+
inputs,
|
|
2821
2898
|
listener,
|
|
2822
2899
|
resourceId: name
|
|
2823
2900
|
},
|
|
@@ -2826,7 +2903,7 @@ var createRuntimeResources = ({ definitions, instance, lifecycle }) => {
|
|
|
2826
2903
|
signal
|
|
2827
2904
|
});
|
|
2828
2905
|
try {
|
|
2829
|
-
await activateSubscriptions(
|
|
2906
|
+
await activateSubscriptions(inputs, subscription, correlation);
|
|
2830
2907
|
subscription.signal.throwIfAborted();
|
|
2831
2908
|
subscription.refresh();
|
|
2832
2909
|
subscription.signal.throwIfAborted();
|
|
@@ -2851,11 +2928,11 @@ var createRuntimeResources = ({ definitions, instance, lifecycle }) => {
|
|
|
2851
2928
|
};
|
|
2852
2929
|
//#endregion
|
|
2853
2930
|
//#region src/internal/server/runtime/runtime-streams.ts
|
|
2854
|
-
var createRuntimeStreams = ({
|
|
2931
|
+
var createRuntimeStreams = ({ instance, definitions, lifecycle, serverLogger }) => {
|
|
2855
2932
|
const streams = /* @__PURE__ */ new Map();
|
|
2856
2933
|
Object.entries(definitions).forEach(([name, definition]) => {
|
|
2857
2934
|
if (!name) throw new Error("Stream names must not be empty");
|
|
2858
|
-
streams.set(name, { open: async (rawInput, emit, requestSignal, onError) => {
|
|
2935
|
+
streams.set(name, { open: async (rawInput, emit, requestSignal, onError, correlation) => {
|
|
2859
2936
|
const sessionController = new AbortController();
|
|
2860
2937
|
const sessionSignal = requestSignal ? AbortSignal.any([requestSignal, sessionController.signal]) : sessionController.signal;
|
|
2861
2938
|
const operationSignal = lifecycle.requestSignal(sessionSignal);
|
|
@@ -2874,7 +2951,14 @@ var createRuntimeStreams = ({ context, definitions, lifecycle }) => {
|
|
|
2874
2951
|
if (opened) onError?.(cause);
|
|
2875
2952
|
};
|
|
2876
2953
|
const session = await definition.open(input, {
|
|
2877
|
-
|
|
2954
|
+
instance,
|
|
2955
|
+
logger: createHandlerLogger({
|
|
2956
|
+
serverLogger,
|
|
2957
|
+
correlation,
|
|
2958
|
+
capabilityKind: "stream",
|
|
2959
|
+
registeredName: name,
|
|
2960
|
+
handler: "open"
|
|
2961
|
+
}),
|
|
2878
2962
|
emit: (message) => {
|
|
2879
2963
|
if (operationSignal.aborted) return;
|
|
2880
2964
|
try {
|
|
@@ -2921,32 +3005,35 @@ var createRuntimeStreams = ({ context, definitions, lifecycle }) => {
|
|
|
2921
3005
|
};
|
|
2922
3006
|
//#endregion
|
|
2923
3007
|
//#region src/internal/server/runtime/create-runtime.ts
|
|
2924
|
-
var createRuntime = async ({ config,
|
|
3008
|
+
var createRuntime = async ({ config, notifications = { send: async () => void 0 }, signal, serverLogger }) => {
|
|
2925
3009
|
const lifecycle = createRuntimeLifecycle(signal);
|
|
2926
3010
|
const instance = createRuntimeInstance(config.instanceId ?? defaultInstanceId);
|
|
2927
3011
|
try {
|
|
2928
3012
|
const resources = createRuntimeResources({
|
|
2929
3013
|
definitions: config.server.resources ?? {},
|
|
2930
3014
|
instance: instance.context,
|
|
2931
|
-
lifecycle
|
|
3015
|
+
lifecycle,
|
|
3016
|
+
serverLogger
|
|
2932
3017
|
});
|
|
2933
3018
|
const context = resources.context;
|
|
2934
3019
|
const operations = createRuntimeOperations({
|
|
2935
3020
|
context,
|
|
2936
3021
|
definitions: config.server.operations ?? {},
|
|
2937
|
-
notifications
|
|
3022
|
+
notifications,
|
|
3023
|
+
serverLogger
|
|
2938
3024
|
});
|
|
2939
3025
|
const streams = createRuntimeStreams({
|
|
2940
|
-
context,
|
|
3026
|
+
instance: instance.context,
|
|
2941
3027
|
definitions: config.server.streams ?? {},
|
|
2942
|
-
lifecycle
|
|
3028
|
+
lifecycle,
|
|
3029
|
+
serverLogger
|
|
2943
3030
|
});
|
|
2944
3031
|
lifecycle.signal.throwIfAborted();
|
|
2945
3032
|
lifecycle.completePreparation();
|
|
2946
3033
|
const manifest = {
|
|
2947
|
-
|
|
3034
|
+
logLevel: serverLogger?.logLevel ?? config.logLevel ?? "info",
|
|
2948
3035
|
operations: [...operations.names],
|
|
2949
|
-
protocolVersion:
|
|
3036
|
+
protocolVersion: 11,
|
|
2950
3037
|
resources: [...resources.names],
|
|
2951
3038
|
streams: [...streams.names]
|
|
2952
3039
|
};
|
|
@@ -3165,7 +3252,7 @@ var errorMessage = (cause) => cause instanceof Error ? cause.message : String(ca
|
|
|
3165
3252
|
var childOptionsSchema = z.object({
|
|
3166
3253
|
configAliases: z.record(z.string(), z.string()).optional(),
|
|
3167
3254
|
configPath: z.string(),
|
|
3168
|
-
|
|
3255
|
+
logLevel: logLevelSchema$1.optional(),
|
|
3169
3256
|
developmentWebTarget: z.url().optional(),
|
|
3170
3257
|
host: z.string().optional(),
|
|
3171
3258
|
port: z.number().int().min(0).max(65535).optional(),
|