@rome-os/app-runtime 0.2.2 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,149 +0,0 @@
1
- // Worker-side RPC client for calling main-process services.
2
- //
3
- // The main process owns live references to ChannelManager, RoutineEngine,
4
- // and related services. Worker processes reach them over Node's child-process
5
- // IPC channel via this client — a replacement for the former HTTP callbacks
6
- // to the internal API.
7
- import { randomUUID } from "node:crypto";
8
- export class WorkerRpcTimeoutError extends Error {
9
- constructor(method, timeoutMs) {
10
- super(`WorkerRPC timeout: ${method} (${timeoutMs}ms)`);
11
- this.name = "WorkerRpcTimeoutError";
12
- }
13
- }
14
- export class WorkerRpcDisconnectError extends Error {
15
- constructor() {
16
- super("WorkerRPC main process disconnected");
17
- this.name = "WorkerRpcDisconnectError";
18
- }
19
- }
20
- const DEFAULT_TIMEOUT_MS = 30_000;
21
- // There may be more than one copy of this module loaded in the same process
22
- // (e.g. when an installed app ships its own physical copy of @rome-os/app-runtime
23
- // under node_modules/, producing a distinct ESM URL from the monorepo source).
24
- // Each copy constructs its own WorkerRpcClient with a distinct `clientId`.
25
- // Every instance installs its own process.on("message") listener; the main
26
- // process echoes `clientId` back on responses, so each listener only resolves
27
- // responses originating from its own pending map. This keeps pending maps
28
- // fully isolated across copies and avoids id-space collisions (nextId starts
29
- // from 1 independently in each copy).
30
- class WorkerRpcClient {
31
- clientId = randomUUID();
32
- pending = new Map();
33
- nextId = 1;
34
- processHandlersInstalled = false;
35
- async call(method, params, options) {
36
- if (!process.send) {
37
- // Main process: no parent IPC channel, but it directly holds the real
38
- // services. If a dispatcher is registered, run the call in-process
39
- // instead of failing. Worker processes always have `process.send` and
40
- // take the IPC path below — the two paths are mutually exclusive.
41
- const dispatcher = getInProcessDispatcher();
42
- if (dispatcher) {
43
- // Enforce the same deadline as the IPC path so both transports share
44
- // identical timeout semantics. Without this, callers like
45
- // AppManagerProxy (which set multi-minute deadlines for
46
- // apps.install/create/uninstall) would hang forever if an in-process
47
- // service operation stalls.
48
- const timeoutMs = options?.timeoutMs ?? DEFAULT_TIMEOUT_MS;
49
- let timer;
50
- const timeout = new Promise((_, reject) => {
51
- timer = setTimeout(() => reject(new WorkerRpcTimeoutError(method, timeoutMs)), timeoutMs);
52
- });
53
- try {
54
- return (await Promise.race([dispatcher(method, params), timeout]));
55
- }
56
- finally {
57
- if (timer)
58
- clearTimeout(timer);
59
- }
60
- }
61
- throw new Error(`WorkerRPC: not running in a Node.js child process (method=${method})`);
62
- }
63
- this.ensureProcessHandlers();
64
- const id = this.nextId++;
65
- const timeoutMs = options?.timeoutMs ?? DEFAULT_TIMEOUT_MS;
66
- return await new Promise((resolve, reject) => {
67
- const timeout = setTimeout(() => {
68
- this.pending.delete(id);
69
- reject(new WorkerRpcTimeoutError(method, timeoutMs));
70
- }, timeoutMs);
71
- this.pending.set(id, {
72
- resolve: (value) => resolve(value),
73
- reject,
74
- timeout,
75
- method,
76
- });
77
- const request = {
78
- type: "rpc_request",
79
- clientId: this.clientId,
80
- id,
81
- method,
82
- params,
83
- };
84
- process.send(request, (err) => {
85
- if (err) {
86
- clearTimeout(timeout);
87
- this.pending.delete(id);
88
- reject(err);
89
- }
90
- });
91
- });
92
- }
93
- handleResponse(message) {
94
- const pending = this.pending.get(message.id);
95
- if (!pending)
96
- return;
97
- clearTimeout(pending.timeout);
98
- this.pending.delete(message.id);
99
- if (message.error !== undefined) {
100
- pending.reject(new Error(message.error));
101
- }
102
- else {
103
- pending.resolve(message.result);
104
- }
105
- }
106
- ensureProcessHandlers() {
107
- if (this.processHandlersInstalled)
108
- return;
109
- this.processHandlersInstalled = true;
110
- process.on("message", (message) => {
111
- if (isWorkerRpcResponse(message) && message.clientId === this.clientId) {
112
- this.handleResponse(message);
113
- }
114
- });
115
- process.on("disconnect", () => {
116
- for (const pending of this.pending.values()) {
117
- clearTimeout(pending.timeout);
118
- pending.reject(new WorkerRpcDisconnectError());
119
- }
120
- this.pending.clear();
121
- });
122
- }
123
- }
124
- let singleton = null;
125
- export function getWorkerRpc() {
126
- if (!singleton) {
127
- singleton = new WorkerRpcClient();
128
- }
129
- return singleton;
130
- }
131
- const IN_PROCESS_DISPATCHER_KEY = Symbol.for("rome.workerRpc.inProcessDispatcher");
132
- /**
133
- * Register (or clear, with `null`) the main-process dispatcher used as a
134
- * fallback when there is no parent IPC channel. Called once during main-process
135
- * wiring with a handler backed by the live WorkerRpcServer.
136
- */
137
- export function setWorkerRpcInProcessDispatcher(dispatcher) {
138
- globalThis[IN_PROCESS_DISPATCHER_KEY] = dispatcher ?? undefined;
139
- }
140
- function getInProcessDispatcher() {
141
- return globalThis[IN_PROCESS_DISPATCHER_KEY];
142
- }
143
- export function isWorkerRpcResponse(message) {
144
- return (typeof message === "object" &&
145
- message !== null &&
146
- message.type === "rpc_response" &&
147
- typeof message.clientId === "string");
148
- }
149
- //# sourceMappingURL=worker-rpc.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"worker-rpc.js","sourceRoot":"","sources":["../src/worker-rpc.ts"],"names":[],"mappings":"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"}