posipaki 0.26.0 → 0.27.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{hooks-rduh9LzW.d.ts → hooks-DL2s94eM.d.ts} +5 -5
- package/dist/hooks-DL2s94eM.d.ts.map +1 -0
- package/dist/hooks.d.ts +1 -1
- package/dist/index.d.ts +13 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -2
- package/dist/pipe.d.ts +1 -2
- package/dist/pipe.d.ts.map +1 -1
- package/dist/pipe.js +12 -10
- package/dist/pipe.js.map +1 -1
- package/dist/plugins/debug-logger.d.ts +2 -3
- package/dist/plugins/debug-logger.d.ts.map +1 -1
- package/dist/plugins/tree-introspection.d.ts +2 -3
- package/dist/plugins/tree-introspection.d.ts.map +1 -1
- package/dist/plugins/tree-introspection.js.map +1 -1
- package/dist/process-B5ZijF-E.d.ts +14 -0
- package/dist/process-B5ZijF-E.d.ts.map +1 -0
- package/dist/remote/index.d.ts +5 -3
- package/dist/remote/index.d.ts.map +1 -1
- package/dist/remote/index.js +76 -32
- package/dist/remote/index.js.map +1 -1
- package/dist/{src-tbH9wapj.js → src-BLzdjrVl.js} +6 -3
- package/dist/{src-tbH9wapj.js.map → src-BLzdjrVl.js.map} +1 -1
- package/dist/supervisor.d.ts +3 -8
- package/dist/supervisor.d.ts.map +1 -1
- package/dist/supervisor.js +2 -4
- package/dist/supervisor.js.map +1 -1
- package/dist/testing/index.d.ts +11 -9
- package/dist/testing/index.d.ts.map +1 -1
- package/dist/testing/index.js +39 -27
- package/dist/testing/index.js.map +1 -1
- package/dist/{types-RfSUSvKp.d.ts → types-B_bUAR9r.d.ts} +1 -3
- package/dist/types-B_bUAR9r.d.ts.map +1 -0
- package/dist/{util-FmOqPdg-.js → util-Brtfgv68.js} +6 -3
- package/dist/util-Brtfgv68.js.map +1 -0
- package/dist/xfetch.d.ts +3 -13
- package/dist/xfetch.d.ts.map +1 -1
- package/dist/xfetch.js +19 -14
- package/dist/xfetch.js.map +1 -1
- package/package.json +4 -12
- package/dist/hooks-rduh9LzW.d.ts.map +0 -1
- package/dist/process-BGFeAuma.d.ts +0 -33
- package/dist/process-BGFeAuma.d.ts.map +0 -1
- package/dist/types-RfSUSvKp.d.ts.map +0 -1
- package/dist/util-FmOqPdg-.js.map +0 -1
|
@@ -1,5 +1,4 @@
|
|
|
1
|
-
import { a as ProcessCtx, m as AsyncProcess, n as ExitMessage, p as AnyProcess, r as Message, s as SenderInfo, t as AsyncProcessFn } from "./types-
|
|
2
|
-
|
|
1
|
+
import { a as ProcessCtx, m as AsyncProcess, n as ExitMessage, p as AnyProcess, r as Message, s as SenderInfo, t as AsyncProcessFn } from "./types-B_bUAR9r.js";
|
|
3
2
|
//#region src/actor-types.d.ts
|
|
4
3
|
type ActorMessages<M extends Message> = {
|
|
5
4
|
__tag_messages: M;
|
|
@@ -10,7 +9,7 @@ interface MethodOptions {
|
|
|
10
9
|
type HandlerFn<InMsg extends Message> = (msg: InMsg, sender: SenderInfo) => void | Promise<void>;
|
|
11
10
|
type HandlerOptions<InMsg extends Message> = Omit<{ [K in InMsg["type"]]: HandlerFn<Extract<InMsg, {
|
|
12
11
|
type: K;
|
|
13
|
-
}
|
|
12
|
+
}>>; }, "STOP">;
|
|
14
13
|
interface ReflectionOptions {}
|
|
15
14
|
type Paired<Priv, Pub> = {
|
|
16
15
|
public: Pub;
|
|
@@ -42,7 +41,8 @@ interface ActorDefinition<Args, InternalState, InMsg extends Message, OutMsg ext
|
|
|
42
41
|
outMessages: ActorMessages<OutMsg> | undefined;
|
|
43
42
|
}
|
|
44
43
|
type ActorConfig<Args, InternalState, InMsg extends Message, OutMsg extends Message, Methods extends MethodOptions, Handlers extends HandlerOptions<InMsg>, ReflectionMethods extends ReflectionOptions> = ThisType<ActorContext<Args, InternalState, InMsg, OutMsg, Methods, Handlers, ReflectionMethods & ActorReflection>> & {
|
|
45
|
-
/** Preferred process name. Used by ctx.fork() when no explicit name is given. */
|
|
44
|
+
/** Preferred process name. Used by ctx.fork() when no explicit name is given. */
|
|
45
|
+
name?: string;
|
|
46
46
|
plugins?: ActorPlugin[] | PluginTransform;
|
|
47
47
|
/** Non-overridable plugins added at spawn time (spawn/fork opts).
|
|
48
48
|
* Set by the framework during assembly, not by user config. @internal */
|
|
@@ -160,4 +160,4 @@ type Hook<T, I extends unknown[], O> = (this: T, ...args: I) => O;
|
|
|
160
160
|
declare function callHook<T, I extends unknown[], O>(fn: Hook<T, I, O> | undefined, eh: ((e: unknown) => unknown) | undefined, thisArg: T, ...args: I): Promise<O | undefined>;
|
|
161
161
|
//#endregion
|
|
162
162
|
export { ReflectionOptions as _, chainHook as a, stopPropagation as b, ActorContext as c, ActorPlugin as d, HandlerFn as f, PluginTransform as g, MethodOptions as h, callHook as i, ActorDefinition as l, HookResult as m, ActorReflection as n, mergeConfigs as o, HandlerOptions as p, Hook as r, ActorConfig as s, ActorDecorated as t, ActorMessages as u, STOP_SENTINEL as v, SpawnedFrom as y };
|
|
163
|
-
//# sourceMappingURL=hooks-
|
|
163
|
+
//# sourceMappingURL=hooks-DL2s94eM.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hooks-DL2s94eM.d.ts","names":[],"sources":["../src/actor-types.ts","../src/hooks.ts"],"mappings":"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"}
|
package/dist/hooks.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { a as chainHook, b as stopPropagation, d as ActorPlugin, g as PluginTransform, i as callHook, m as HookResult, n as ActorReflection, o as mergeConfigs, r as Hook, t as ActorDecorated, v as STOP_SENTINEL } from "./hooks-
|
|
1
|
+
import { a as chainHook, b as stopPropagation, d as ActorPlugin, g as PluginTransform, i as callHook, m as HookResult, n as ActorReflection, o as mergeConfigs, r as Hook, t as ActorDecorated, v as STOP_SENTINEL } from "./hooks-DL2s94eM.js";
|
|
2
2
|
export { ActorDecorated, type ActorPlugin, ActorReflection, Hook, type HookResult, type PluginTransform, STOP_SENTINEL, callHook, chainHook, mergeConfigs, stopPropagation };
|
package/dist/index.d.ts
CHANGED
|
@@ -1,7 +1,16 @@
|
|
|
1
|
-
import { a as ProcessCtx, c as SenderOrigin, d as WithSender, f as WithoutSender, g as spawnAsync, h as runDispatchAsync, i as PipeState, l as StopMessage, m as AsyncProcess, n as ExitMessage, o as ProcessFn, p as AnyProcess, r as Message, s as SenderInfo, t as AsyncProcessFn, u as SupervisorState } from "./types-
|
|
2
|
-
import { _ as ReflectionOptions, a as chainHook, b as stopPropagation, c as ActorContext, d as ActorPlugin, f as HandlerFn, g as PluginTransform, h as MethodOptions, i as callHook, l as ActorDefinition, m as HookResult, n as ActorReflection, o as mergeConfigs, p as HandlerOptions, s as ActorConfig, t as ActorDecorated, u as ActorMessages, y as SpawnedFrom } from "./hooks-
|
|
3
|
-
import { n as spawn,
|
|
4
|
-
|
|
1
|
+
import { a as ProcessCtx, c as SenderOrigin, d as WithSender, f as WithoutSender, g as spawnAsync, h as runDispatchAsync, i as PipeState, l as StopMessage, m as AsyncProcess, n as ExitMessage, o as ProcessFn, p as AnyProcess, r as Message, s as SenderInfo, t as AsyncProcessFn, u as SupervisorState } from "./types-B_bUAR9r.js";
|
|
2
|
+
import { _ as ReflectionOptions, a as chainHook, b as stopPropagation, c as ActorContext, d as ActorPlugin, f as HandlerFn, g as PluginTransform, h as MethodOptions, i as callHook, l as ActorDefinition, m as HookResult, n as ActorReflection, o as mergeConfigs, p as HandlerOptions, s as ActorConfig, t as ActorDecorated, u as ActorMessages, y as SpawnedFrom } from "./hooks-DL2s94eM.js";
|
|
3
|
+
import { n as spawn, t as Process } from "./process-B5ZijF-E.js";
|
|
4
|
+
//#region src/util.d.ts
|
|
5
|
+
type ReducerClosure<M> = (msg: M) => void;
|
|
6
|
+
type ReadyFn = () => boolean;
|
|
7
|
+
/**
|
|
8
|
+
* Generator helper that loops, yielding `null` and feeding incoming
|
|
9
|
+
* messages to `fn` until `readyFn()` returns true. Used inside
|
|
10
|
+
* process generators to build the main message loop.
|
|
11
|
+
*/
|
|
12
|
+
declare function runDispatch<M>(name: string, fn: ReducerClosure<M>, readyFn?: ReadyFn, debugLevel?: boolean): Generator<null, void, M>;
|
|
13
|
+
//#endregion
|
|
5
14
|
//#region src/adapters.d.ts
|
|
6
15
|
declare function asyncify<A, S, IM extends Message, OM extends Message>(fn: ProcessFn<A, S, IM, OM>): AsyncProcessFn<A, S, IM, OM>;
|
|
7
16
|
//#endregion
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","names":[],"sources":["../src/adapters.ts","../src/define-actor.ts"],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","names":[],"sources":["../src/util.ts","../src/adapters.ts","../src/define-actor.ts"],"mappings":";;;;KAOK,eAAe,MAAM,KAAK;KAC1B;;;;;;iBASK,YAAY,GACpB,cACA,IAAI,eAAe,IACnB,UAAS,SACT,uBACC,sBAAsB;;;iBCpBT,SAAS,GAAG,GAAG,WAAW,SAAS,WAAW,SAC5D,IAAI,UAAU,GAAG,GAAG,IAAI,MACvB,eAAe,GAAG,GAAG,IAAI;;;iBCmCZ,eACd,eAAe,UAAU,YACtB,cAAc;iBA4DH,YACd,MACA,eACA,cAAc,SACd,eAAe,SACf,gBAAgB,eAChB,iBAAiB,eAAe,QAChC,0BAA0B,mBAE1B,QAAQ,YACN,MACA,eACA,OACA,QACA,SACA,UACA,qBAED,gBAAgB,MAAM,eAAe,OAAO,QAAQ"}
|
package/dist/index.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { i as runDispatch } from "./util-
|
|
2
|
-
import { a as AsyncProcess, c as asyncify, i as spawn, n as defineMessages, o as runDispatchAsync, r as Process, s as spawnAsync, t as defineActor } from "./src-
|
|
1
|
+
import { i as runDispatch } from "./util-Brtfgv68.js";
|
|
2
|
+
import { a as AsyncProcess, c as asyncify, i as spawn, n as defineMessages, o as runDispatchAsync, r as Process, s as spawnAsync, t as defineActor } from "./src-BLzdjrVl.js";
|
|
3
3
|
import { a as stopPropagation, n as chainHook, r as mergeConfigs, t as callHook } from "./hooks-V-PEPJHv.js";
|
|
4
4
|
export { AsyncProcess, Process, asyncify, callHook, chainHook, defineActor, defineMessages, mergeConfigs, runDispatch, runDispatchAsync, spawn, spawnAsync, stopPropagation };
|
package/dist/pipe.d.ts
CHANGED
|
@@ -1,5 +1,4 @@
|
|
|
1
|
-
import { n as ExitMessage, o as ProcessFn, r as Message } from "./types-
|
|
2
|
-
|
|
1
|
+
import { n as ExitMessage, o as ProcessFn, r as Message } from "./types-B_bUAR9r.js";
|
|
3
2
|
//#region src/pipe.d.ts
|
|
4
3
|
/**
|
|
5
4
|
* State yielded by the pipe process. `params` starts as a copy of the
|
package/dist/pipe.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pipe.d.ts","names":[],"sources":["../src/pipe.ts"],"mappings":"
|
|
1
|
+
{"version":3,"file":"pipe.d.ts","names":[],"sources":["../src/pipe.ts"],"mappings":";;;;;;;UAWiB,UAAU,QAAQ;EACjC,QAAQ;EACR,QAAQ;EACR;;;;;;;iBAQO,KAAK,QAAQ,QACpB,KAAK;EAAqB;GAAkB,SAAS,aACpD,UACD,QACA,UAAU,QAAQ,SAClB,SACA,UAAU"}
|
package/dist/pipe.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { i as runDispatch } from "./util-
|
|
1
|
+
import { i as runDispatch } from "./util-Brtfgv68.js";
|
|
2
2
|
//#region src/pipe.ts
|
|
3
3
|
/**
|
|
4
4
|
* Chain process functions so each runs after the previous one exits.
|
|
@@ -31,15 +31,17 @@ function pipe(fns) {
|
|
|
31
31
|
state.running = false;
|
|
32
32
|
return;
|
|
33
33
|
}
|
|
34
|
-
if (msg.type === "EXIT" && _sender.fromId === task.id)
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
34
|
+
if (msg.type === "EXIT" && _sender.fromId === task.id) {
|
|
35
|
+
if (hasNext()) {
|
|
36
|
+
state.params = {
|
|
37
|
+
...state.params,
|
|
38
|
+
...task.state?.result
|
|
39
|
+
};
|
|
40
|
+
spawnNext();
|
|
41
|
+
} else {
|
|
42
|
+
state.running = false;
|
|
43
|
+
state.result = task.state?.result;
|
|
44
|
+
}
|
|
43
45
|
}
|
|
44
46
|
}, () => !state.running, true);
|
|
45
47
|
};
|
package/dist/pipe.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pipe.js","names":[],"sources":["../src/pipe.ts"],"sourcesContent":["import { runDispatch } from \"./util.js\";\nimport type { ExitMessage } from \"./util.js\";\nimport type { ProcessFn, ProcessCtx } from \"./process.js\";\nimport type { AsyncProcess } from \"./process.async.js\";\nimport type { Message, WithSender } from \"./types.js\";\n\n/**\n * State yielded by the pipe process. `params` starts as a copy of the\n * initial args and is updated after each child exits by merging the\n * child's `state.result` into it.\n */\nexport interface PipeState<Params, Result> {\n params: Params | null;\n result: Result | null;\n running: boolean;\n}\n\n/**\n * Chain process functions so each runs after the previous one exits.\n * The `.state.result` of each completed child is spread into the params\n * of the next.\n */\nfunction pipe<Params, Result>(\n fns: ProcessFn<unknown, { result: object }, Message, Message>[],\n): ProcessFn<\n Params,\n PipeState<Params, Result>,\n Message,\n Message | ExitMessage\n> {\n return function* (\n ctx: ProcessCtx<\n Params,\n PipeState<Params, Result>,\n Message,\n Message | ExitMessage\n >,\n params: Params,\n ) {\n const state: PipeState<Params, Result> = {\n params: { ...params },\n result: null,\n running: false,\n };\n yield state;\n\n const queue = [...fns];\n let task: AsyncProcess<unknown, { result: object }, Message, Message, {}>;\n\n function spawnNext(): void {\n const fn = queue.shift()!;\n task = ctx.forkSync(\n fn,\n `${ctx.pname} [${fn.name || \"<anonymous>\"}]`,\n )(state.params as Params);\n }\n\n function hasNext(): boolean {\n return queue.length > 0;\n }\n\n spawnNext();\n state.running = hasNext();\n\n yield* runDispatch<WithSender<Message | ExitMessage>>(\n ctx.pname,\n (maybe) => {\n const [msg, _sender] = maybe;\n\n if (msg.type === \"STOP\") {\n state.params = null;\n state.running = false;\n return;\n }\n\n if (msg.type === \"EXIT\" && _sender.fromId === task.id) {\n if (hasNext()) {\n state.params = {\n ...state.params!,\n ...task.state?.result,\n } as Params;\n spawnNext();\n } else {\n state.running = false;\n state.result = task.state?.result as Result;\n }\n }\n },\n () => !state.running,\n true,\n );\n };\n}\n\nexport { pipe };\n"],"mappings":";;;;;;;AAsBA,SAAS,KACP,KAMA;CACA,OAAO,WACL,KAMA,QACA;EACA,MAAM,QAAmC;GACvC,QAAQ,EAAE,GAAG,OAAO;GACpB,QAAQ;GACR,SAAS;EACX;EACA,MAAM;EAEN,MAAM,QAAQ,CAAC,GAAG,GAAG;EACrB,IAAI;EAEJ,SAAS,YAAkB;GACzB,MAAM,KAAK,MAAM,MAAM;GACvB,OAAO,IAAI,SACT,IACA,GAAG,IAAI,MAAM,IAAI,GAAG,QAAQ,cAAc,EAC5C,
|
|
1
|
+
{"version":3,"file":"pipe.js","names":[],"sources":["../src/pipe.ts"],"sourcesContent":["import { runDispatch } from \"./util.js\";\nimport type { ExitMessage } from \"./util.js\";\nimport type { ProcessFn, ProcessCtx } from \"./process.js\";\nimport type { AsyncProcess } from \"./process.async.js\";\nimport type { Message, WithSender } from \"./types.js\";\n\n/**\n * State yielded by the pipe process. `params` starts as a copy of the\n * initial args and is updated after each child exits by merging the\n * child's `state.result` into it.\n */\nexport interface PipeState<Params, Result> {\n params: Params | null;\n result: Result | null;\n running: boolean;\n}\n\n/**\n * Chain process functions so each runs after the previous one exits.\n * The `.state.result` of each completed child is spread into the params\n * of the next.\n */\nfunction pipe<Params, Result>(\n fns: ProcessFn<unknown, { result: object }, Message, Message>[],\n): ProcessFn<\n Params,\n PipeState<Params, Result>,\n Message,\n Message | ExitMessage\n> {\n return function* (\n ctx: ProcessCtx<\n Params,\n PipeState<Params, Result>,\n Message,\n Message | ExitMessage\n >,\n params: Params,\n ) {\n const state: PipeState<Params, Result> = {\n params: { ...params },\n result: null,\n running: false,\n };\n yield state;\n\n const queue = [...fns];\n let task: AsyncProcess<unknown, { result: object }, Message, Message, {}>;\n\n function spawnNext(): void {\n const fn = queue.shift()!;\n task = ctx.forkSync(\n fn,\n `${ctx.pname} [${fn.name || \"<anonymous>\"}]`,\n )(state.params as Params);\n }\n\n function hasNext(): boolean {\n return queue.length > 0;\n }\n\n spawnNext();\n state.running = hasNext();\n\n yield* runDispatch<WithSender<Message | ExitMessage>>(\n ctx.pname,\n (maybe) => {\n const [msg, _sender] = maybe;\n\n if (msg.type === \"STOP\") {\n state.params = null;\n state.running = false;\n return;\n }\n\n if (msg.type === \"EXIT\" && _sender.fromId === task.id) {\n if (hasNext()) {\n state.params = {\n ...state.params!,\n ...task.state?.result,\n } as Params;\n spawnNext();\n } else {\n state.running = false;\n state.result = task.state?.result as Result;\n }\n }\n },\n () => !state.running,\n true,\n );\n };\n}\n\nexport { pipe };\n"],"mappings":";;;;;;;AAsBA,SAAS,KACP,KAMA;CACA,OAAO,WACL,KAMA,QACA;EACA,MAAM,QAAmC;GACvC,QAAQ,EAAE,GAAG,OAAO;GACpB,QAAQ;GACR,SAAS;EACX;EACA,MAAM;EAEN,MAAM,QAAQ,CAAC,GAAG,GAAG;EACrB,IAAI;EAEJ,SAAS,YAAkB;GACzB,MAAM,KAAK,MAAM,MAAM;GACvB,OAAO,IAAI,SACT,IACA,GAAG,IAAI,MAAM,IAAI,GAAG,QAAQ,cAAc,EAC5C,CAAC,CAAC,MAAM,MAAgB;EAC1B;EAEA,SAAS,UAAmB;GAC1B,OAAO,MAAM,SAAS;EACxB;EAEA,UAAU;EACV,MAAM,UAAU,QAAQ;EAExB,OAAO,YACL,IAAI,QACH,UAAU;GACT,MAAM,CAAC,KAAK,WAAW;GAEvB,IAAI,IAAI,SAAS,QAAQ;IACvB,MAAM,SAAS;IACf,MAAM,UAAU;IAChB;GACF;GAEA,IAAI,IAAI,SAAS,UAAU,QAAQ,WAAW,KAAK,IAAI;IACrD,IAAI,QAAQ,GAAG;KACb,MAAM,SAAS;MACb,GAAG,MAAM;MACT,GAAG,KAAK,OAAO;KACjB;KACA,UAAU;IACZ,OAAO;KACL,MAAM,UAAU;KAChB,MAAM,SAAS,KAAK,OAAO;IAC7B;GACF;EACF,SACM,CAAC,MAAM,SACb,IACF;CACF;AACF"}
|
|
@@ -1,6 +1,5 @@
|
|
|
1
|
-
import { r as Message } from "../types-
|
|
2
|
-
import { d as ActorPlugin } from "../hooks-
|
|
3
|
-
|
|
1
|
+
import { r as Message } from "../types-B_bUAR9r.js";
|
|
2
|
+
import { d as ActorPlugin } from "../hooks-DL2s94eM.js";
|
|
4
3
|
//#region src/plugins/debug-logger.d.ts
|
|
5
4
|
declare module "../index" {
|
|
6
5
|
interface ActorDecorated {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"debug-logger.d.ts","names":[],"sources":["../../src/plugins/debug-logger.ts"],"mappings":"
|
|
1
|
+
{"version":3,"file":"debug-logger.d.ts","names":[],"sources":["../../src/plugins/debug-logger.ts"],"mappings":";;;;YAKY;IACR,KAAK;;;UAIQ;GACd,oBAAoB;;UAEN;GACd,SAAS;;UAEK;GACd,eAAe;;UAGD;EACf,OAAO;EACP,MAAM;EACN,MAAM;EACN,OAAO;EACP,KAAK;EACL,WAAW;;KAED,iBAAiB,iBAAiB;;;;;;KAOlC,aAAa,KAAK,YAAY;UAEzB;;EAEf;EACA,UAAU;;;EAGV,YAAY;;;;;;;iBAYE,iBAAiB,KAAK,UAAU;;;;;;;;iBAoChC,YAAY,OAAO,kBAAkB"}
|
|
@@ -1,6 +1,5 @@
|
|
|
1
|
-
import { p as AnyProcess } from "../types-
|
|
2
|
-
import { d as ActorPlugin } from "../hooks-
|
|
3
|
-
|
|
1
|
+
import { p as AnyProcess } from "../types-B_bUAR9r.js";
|
|
2
|
+
import { d as ActorPlugin } from "../hooks-DL2s94eM.js";
|
|
4
3
|
//#region src/plugins/tree-introspection.d.ts
|
|
5
4
|
declare module "../index" {
|
|
6
5
|
interface ActorReflection {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tree-introspection.d.ts","names":[],"sources":["../../src/plugins/tree-introspection.ts"],"mappings":"
|
|
1
|
+
{"version":3,"file":"tree-introspection.d.ts","names":[],"sources":["../../src/plugins/tree-introspection.ts"],"mappings":";;;;YAMY;IACR,mBAAmB;IACnB,oBAAoB;IACpB,gBAAgB;IAChB,gBAAgB;;;UAIV;EACR,oBAAoB,oBAAoB;EACxC;EACA,iBAAiB,kBAAkB;EACnC;;UAGe;EACf;EACA;EACA,UAAU;EACV;;iBAac,WAAW"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tree-introspection.js","names":[],"sources":["../../src/plugins/tree-introspection.ts"],"sourcesContent":["import { mergeConfigs } from \"../hooks.js\";\nimport type { ActorPlugin, ActorReflection as AR } from \"../hooks.js\";\nimport { AnyProcessCtx } from \"../types.js\";\nimport type { AnyProcess } from \"../process.async.js\";\n\ndeclare module \"../index\" {\n interface ActorReflection {\n \"inspect.getTree\": TreeReflectionMethods[\"inspect.getTree\"];\n \"inspect.getState\": TreeReflectionMethods[\"inspect.getState\"];\n \"inspect.find\": TreeReflectionMethods[\"inspect.find\"];\n \"inspect.exit\": TreeReflectionMethods[\"inspect.exit\"];\n }\n}\n\ninterface TreeReflectionMethods {\n \"inspect.getTree\": (prefix?: string) => TreeNode;\n \"inspect.getState\": () => unknown;\n \"inspect.find\": (pname: string) => AnyProcess | null;\n \"inspect.exit\": () => void;\n}\n\nexport interface TreeNode {\n pname: string;\n parentName: string | null;\n children: TreeNode[];\n status: \"running\" | \"no introspection\";\n}\n\n/** Depth-first search for a live process by its full `pname`. */\nfunction findProcess(procs: Iterable<AnyProcess>, pname: string): AnyProcess | null {\n for (const proc of procs) {\n if (proc.pname === pname) return proc;\n const found = findProcess(proc.children, pname);\n if (found) return found;\n }\n return null;\n}\n\nexport function inspect(): ActorPlugin {\n return async function inspectPlugin(config) {\n return mergeConfigs(config, {\n $reflectionMethods: {\n ...config.$reflectionMethods,\n \"inspect.getTree\": function (prefix?: string) {\n const children: TreeNode[] = [];\n for (const child of this.ctx.children) {\n const cr = child.$reflection as AR;\n if (typeof cr[\"inspect.getTree\"] === \"function\") {\n const sub = cr[\"inspect.getTree\"](prefix) as TreeNode;\n if (!prefix || sub.pname.startsWith(prefix)) children.push(sub);\n } else {\n const n = child.pname;\n if (!prefix || n.startsWith(prefix))\n children.push({\n pname: n,\n parentName: this.name,\n children: [],\n status: \"no introspection\",\n });\n }\n }\n const selfCtx = this.ctx as AnyProcessCtx;\n return {\n pname: selfCtx.pname,\n parentName: selfCtx.parentName,\n children,\n status: \"running\" as const,\n } satisfies TreeNode;\n },\n \"inspect.getState\": function () {\n const state = this.state as unknown;\n return state;\n },\n \"inspect.find\": function (pname: string) {\n const selfCtx = this.ctx as AnyProcessCtx;\n return findProcess(selfCtx.children, pname);\n },\n \"inspect.exit\": function () {\n this.exit(\"inspector\");\n },\n },\n });\n };\n}\n"],"mappings":";;;AA6BA,SAAS,YAAY,OAA6B,OAAkC;CAClF,KAAK,MAAM,QAAQ,OAAO;EACxB,IAAI,KAAK,UAAU,OAAO,OAAO;EACjC,MAAM,QAAQ,YAAY,KAAK,UAAU,KAAK;EAC9C,IAAI,OAAO,OAAO;CACpB;CACA,OAAO;AACT;AAEA,SAAgB,UAAuB;CACrC,OAAO,eAAe,cAAc,QAAQ;EAC1C,OAAO,aAAa,QAAQ,EAC1B,oBAAoB;GAClB,GAAG,OAAO;GACV,mBAAmB,SAAU,QAAiB;IAC5C,MAAM,WAAuB,CAAC;IAC9B,KAAK,MAAM,SAAS,KAAK,IAAI,UAAU;KACrC,MAAM,KAAK,MAAM;KACjB,IAAI,OAAO,GAAG,uBAAuB,YAAY;MAC/C,MAAM,MAAM,GAAG,
|
|
1
|
+
{"version":3,"file":"tree-introspection.js","names":[],"sources":["../../src/plugins/tree-introspection.ts"],"sourcesContent":["import { mergeConfigs } from \"../hooks.js\";\nimport type { ActorPlugin, ActorReflection as AR } from \"../hooks.js\";\nimport { AnyProcessCtx } from \"../types.js\";\nimport type { AnyProcess } from \"../process.async.js\";\n\ndeclare module \"../index\" {\n interface ActorReflection {\n \"inspect.getTree\": TreeReflectionMethods[\"inspect.getTree\"];\n \"inspect.getState\": TreeReflectionMethods[\"inspect.getState\"];\n \"inspect.find\": TreeReflectionMethods[\"inspect.find\"];\n \"inspect.exit\": TreeReflectionMethods[\"inspect.exit\"];\n }\n}\n\ninterface TreeReflectionMethods {\n \"inspect.getTree\": (prefix?: string) => TreeNode;\n \"inspect.getState\": () => unknown;\n \"inspect.find\": (pname: string) => AnyProcess | null;\n \"inspect.exit\": () => void;\n}\n\nexport interface TreeNode {\n pname: string;\n parentName: string | null;\n children: TreeNode[];\n status: \"running\" | \"no introspection\";\n}\n\n/** Depth-first search for a live process by its full `pname`. */\nfunction findProcess(procs: Iterable<AnyProcess>, pname: string): AnyProcess | null {\n for (const proc of procs) {\n if (proc.pname === pname) return proc;\n const found = findProcess(proc.children, pname);\n if (found) return found;\n }\n return null;\n}\n\nexport function inspect(): ActorPlugin {\n return async function inspectPlugin(config) {\n return mergeConfigs(config, {\n $reflectionMethods: {\n ...config.$reflectionMethods,\n \"inspect.getTree\": function (prefix?: string) {\n const children: TreeNode[] = [];\n for (const child of this.ctx.children) {\n const cr = child.$reflection as AR;\n if (typeof cr[\"inspect.getTree\"] === \"function\") {\n const sub = cr[\"inspect.getTree\"](prefix) as TreeNode;\n if (!prefix || sub.pname.startsWith(prefix)) children.push(sub);\n } else {\n const n = child.pname;\n if (!prefix || n.startsWith(prefix))\n children.push({\n pname: n,\n parentName: this.name,\n children: [],\n status: \"no introspection\",\n });\n }\n }\n const selfCtx = this.ctx as AnyProcessCtx;\n return {\n pname: selfCtx.pname,\n parentName: selfCtx.parentName,\n children,\n status: \"running\" as const,\n } satisfies TreeNode;\n },\n \"inspect.getState\": function () {\n const state = this.state as unknown;\n return state;\n },\n \"inspect.find\": function (pname: string) {\n const selfCtx = this.ctx as AnyProcessCtx;\n return findProcess(selfCtx.children, pname);\n },\n \"inspect.exit\": function () {\n this.exit(\"inspector\");\n },\n },\n });\n };\n}\n"],"mappings":";;;AA6BA,SAAS,YAAY,OAA6B,OAAkC;CAClF,KAAK,MAAM,QAAQ,OAAO;EACxB,IAAI,KAAK,UAAU,OAAO,OAAO;EACjC,MAAM,QAAQ,YAAY,KAAK,UAAU,KAAK;EAC9C,IAAI,OAAO,OAAO;CACpB;CACA,OAAO;AACT;AAEA,SAAgB,UAAuB;CACrC,OAAO,eAAe,cAAc,QAAQ;EAC1C,OAAO,aAAa,QAAQ,EAC1B,oBAAoB;GAClB,GAAG,OAAO;GACV,mBAAmB,SAAU,QAAiB;IAC5C,MAAM,WAAuB,CAAC;IAC9B,KAAK,MAAM,SAAS,KAAK,IAAI,UAAU;KACrC,MAAM,KAAK,MAAM;KACjB,IAAI,OAAO,GAAG,uBAAuB,YAAY;MAC/C,MAAM,MAAM,GAAG,kBAAkB,CAAC,MAAM;MACxC,IAAI,CAAC,UAAU,IAAI,MAAM,WAAW,MAAM,GAAG,SAAS,KAAK,GAAG;KAChE,OAAO;MACL,MAAM,IAAI,MAAM;MAChB,IAAI,CAAC,UAAU,EAAE,WAAW,MAAM,GAChC,SAAS,KAAK;OACZ,OAAO;OACP,YAAY,KAAK;OACjB,UAAU,CAAC;OACX,QAAQ;MACV,CAAC;KACL;IACF;IACA,MAAM,UAAU,KAAK;IACrB,OAAO;KACL,OAAO,QAAQ;KACf,YAAY,QAAQ;KACpB;KACA,QAAQ;IACV;GACF;GACA,oBAAoB,WAAY;IAE9B,OADc,KAAK;GAErB;GACA,gBAAgB,SAAU,OAAe;IACvC,MAAM,UAAU,KAAK;IACrB,OAAO,YAAY,QAAQ,UAAU,KAAK;GAC5C;GACA,gBAAgB,WAAY;IAC1B,KAAK,KAAK,WAAW;GACvB;EACF,EACF,CAAC;CACH;AACF"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { m as AsyncProcess, n as ExitMessage, o as ProcessFn, r as Message, s as SenderInfo } from "./types-B_bUAR9r.js";
|
|
2
|
+
//#region src/process.d.ts
|
|
3
|
+
/** @deprecated Use {@link spawnAsync} instead. */
|
|
4
|
+
declare function spawn<A, S, IM extends Message = Message, OM extends Message = ExitMessage>(fn: ProcessFn<A, S, IM, OM>, pname: string, tp?: (m: OM, from: SenderInfo) => void): (a: A) => Process<A, S, IM, OM>;
|
|
5
|
+
/** @deprecated Use {@link AsyncProcess} instead. Sync processes are
|
|
6
|
+
* wrapped via asyncify internally; spawnAsync handles both. */
|
|
7
|
+
declare class Process<A, S, IM extends Message, OM extends Message> extends AsyncProcess<A, S, IM, OM, {}> {
|
|
8
|
+
constructor(fn: ProcessFn<A, S, IM, OM>, pname: string, tp?: (m: OM, from: SenderInfo) => void);
|
|
9
|
+
start(a: A): this;
|
|
10
|
+
tick(): Promise<void>;
|
|
11
|
+
}
|
|
12
|
+
//#endregion
|
|
13
|
+
export { spawn as n, Process as t };
|
|
14
|
+
//# sourceMappingURL=process-B5ZijF-E.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"process-B5ZijF-E.d.ts","names":[],"sources":["../src/process.ts"],"mappings":";;;iBAQgB,MACd,GACA,GACA,WAAW,UAAU,SACrB,WAAW,UAAU,aAErB,IAAI,UAAU,GAAG,GAAG,IAAI,KACxB,eACA,MAAM,GAAG,IAAI,MAAM,uBACjB,GAAG,MAAM,QAAQ,GAAG,GAAG,IAAI;;;cAMzB,QACJ,GACA,GACA,WAAW,SACX,WAAW,iBACH,aAAa,GAAG,GAAG,IAAI;EAC/B,YACE,IAAI,UAAU,GAAG,GAAG,IAAI,KACxB,eACA,MAAM,GAAG,IAAI,MAAM;EAKrB,MAAM,GAAG;EAIT,QAAQ"}
|
package/dist/remote/index.d.ts
CHANGED
|
@@ -1,7 +1,6 @@
|
|
|
1
|
-
import { r as Message, t as AsyncProcessFn } from "../types-
|
|
2
|
-
import { _ as ReflectionOptions, h as MethodOptions, l as ActorDefinition, p as HandlerOptions } from "../hooks-
|
|
1
|
+
import { r as Message, t as AsyncProcessFn } from "../types-B_bUAR9r.js";
|
|
2
|
+
import { _ as ReflectionOptions, h as MethodOptions, l as ActorDefinition, p as HandlerOptions } from "../hooks-DL2s94eM.js";
|
|
3
3
|
import { FileHandle } from "node:fs/promises";
|
|
4
|
-
|
|
5
4
|
//#region src/remote/child.d.ts
|
|
6
5
|
declare function makeSender(fromName: string, parentName: string | null, parentId: symbol | null): {
|
|
7
6
|
fromName: string;
|
|
@@ -57,8 +56,10 @@ declare class FifoUtf8NlineTransport {
|
|
|
57
56
|
private writeFd;
|
|
58
57
|
private rl;
|
|
59
58
|
private rs;
|
|
59
|
+
private ws;
|
|
60
60
|
private pvtOnMessage;
|
|
61
61
|
private closed;
|
|
62
|
+
private closingPromise;
|
|
62
63
|
private pvtError;
|
|
63
64
|
private pvtWriter;
|
|
64
65
|
private constructor();
|
|
@@ -94,6 +95,7 @@ declare class FifoUtf8NlineTransport {
|
|
|
94
95
|
get lastError(): Error | null;
|
|
95
96
|
send(line: string): Promise<void>;
|
|
96
97
|
close(): Promise<void>;
|
|
98
|
+
private pvtClose;
|
|
97
99
|
}
|
|
98
100
|
//#endregion
|
|
99
101
|
//#region src/remote/protocol.d.ts
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","names":[],"sources":["../../src/remote/child.ts","../../src/remote/host.ts","../../src/remote/define.ts","../../src/remote/fifo.ts","../../src/remote/protocol.ts"],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","names":[],"sources":["../../src/remote/child.ts","../../src/remote/host.ts","../../src/remote/define.ts","../../src/remote/fifo.ts","../../src/remote/protocol.ts"],"mappings":";;;;iBAQgB,WACd,kBACA,2BACA;EACG;EAAkB;;iBASD,SAAS,MAAM,OAAO,cAAc,SAAS,eAAe,SAChF,IAAI,eAAe,MAAM,OAAO,OAAO,UACtC;;;UCNc,oBAAoB,OAAO;EAC1C;EACA,MAAM;EACN;;UAGe,YACf,iBACA,cAAc,UAAU,SACxB,eAAe,UAAU;WAEhB,OAAO;EAChB,SAAS;EACT,KAAK,KAAK;EACV,QAAQ;IAAU;IAAqB,OAAO;;EAC9C,UAAU,UAAU,KAAK;;;KAIf,UACV,iBACA,cAAc,UAAU,SACxB,eAAe,UAAU,YACtB,MAAM,wBAAwB,QAAQ,YAAY,OAAO,OAAO;iBAI/C,YACpB,iBACA,cAAc,UAAU,SACxB,eAAe,UAAU,SACzB,OAAO,yBACP,MAAM,oBAAoB,QAAQ,QAAQ,YAAY,OAAO,OAAO;;cA0HzD,eAAY,uBAZ+D;;cAe3E,gBAAa,uBAf8D;;;;;iBAqBxE,iBAAiB,qBAAqB;cAUzC,yBAAgB;;;UC1KZ;EACf;EACA,YAAY;;UAGG,kBACf,MACA,OACA,cAAc,SACd,eAAe,SACf,0BAA0B;EAE1B,OAAO,gBAAgB,MAAM,OAAO,OAAO,QAAQ;EACnD,iBAAiB;EACjB;;iBASc,kBACd,MACA,OACA,cAAc,SACd,eAAe,SACf,gBAAgB,eAChB,iBAAiB,eAAe,QAChC,mBAAmB,mBAEnB,OAAO,gBAAgB,MAAM,OAAO,OAAO,QAAQ,aACnD,aACA,OAAM,qBACL,kBAAkB,MAAM,OAAO,OAAO,QAAQ;;;cC9CpC;UACH;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UAED;iBA8Cc;iBAKA;SAKd,QAAQ,QAAQ,YAAY,SAAS,aAAa;UAMjD;;;;;;;;;SAYD,aACL,kBACA;IACG,WAAW,QAAQ;;;;;;;;;;;SAqBX,QAAQ,kBAAkB,oBAAoB,QAAQ;MAU/D;EAKJ,UAAU,UAAU;EASpB,mBAAmB;MAMf;MAIA,aAAa;EAIX,KAAK,eAAe;EAQpB,SAAS;UAMD;;;;cCrKH;iBAEG,OAAO,aAAa;iBAIpB,OAAO,eAAe;iBAMtB,QAAQ,KAAK,0BAA0B;EAAS;;iBAGhD,OAAO,KAAK,0BAA0B;EAAS,OAAO;;iBAGtD,QAAQ,KAAK,0BAA0B;EAAS,QAAQ;;iBAGxD,MAAM,KAAK,0BAA0B;EAAS;IAAQ;IAAc;IAAkB;;;iBAGtF,OAAO,KAAK,0BAA0B;EAAS;IAAS;IAAc"}
|
package/dist/remote/index.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { s as spawnAsync, t as defineActor } from "../src-
|
|
1
|
+
import { s as spawnAsync, t as defineActor } from "../src-BLzdjrVl.js";
|
|
2
2
|
import { a as stopPropagation } from "../hooks-V-PEPJHv.js";
|
|
3
3
|
import { open, unlink } from "node:fs/promises";
|
|
4
|
-
import { createReadStream } from "node:fs";
|
|
4
|
+
import { createReadStream, createWriteStream } from "node:fs";
|
|
5
5
|
import * as readline from "node:readline";
|
|
6
6
|
import { execSync, spawn } from "node:child_process";
|
|
7
7
|
import { createHash, randomUUID } from "node:crypto";
|
|
@@ -28,26 +28,35 @@ var FifoUtf8NlineTransport = class FifoUtf8NlineTransport {
|
|
|
28
28
|
if (this.pvtOnMessage && !this.closed) this.pvtOnMessage(line);
|
|
29
29
|
});
|
|
30
30
|
this.rl.on("close", () => {
|
|
31
|
-
this.
|
|
31
|
+
this.close();
|
|
32
32
|
});
|
|
33
33
|
this.rs.on("error", (err) => {
|
|
34
34
|
this.pvtError = err;
|
|
35
|
-
|
|
36
|
-
});
|
|
37
|
-
this.rl.on("error", (err) => {
|
|
38
|
-
this.pvtError = err;
|
|
39
|
-
if (!this.closed) this.closed = true;
|
|
35
|
+
this.close();
|
|
40
36
|
});
|
|
41
37
|
} else {
|
|
42
38
|
this.rs = null;
|
|
43
39
|
this.rl = null;
|
|
44
40
|
}
|
|
41
|
+
if (this.writeFd) {
|
|
42
|
+
this.ws = createWriteStream("", {
|
|
43
|
+
fd: this.writeFd.fd,
|
|
44
|
+
encoding: "utf-8",
|
|
45
|
+
autoclose: false
|
|
46
|
+
});
|
|
47
|
+
this.ws.on("error", (err) => {
|
|
48
|
+
this.pvtError = err;
|
|
49
|
+
this.close();
|
|
50
|
+
});
|
|
51
|
+
} else this.ws = null;
|
|
45
52
|
}
|
|
46
53
|
static async openReader(path) {
|
|
47
|
-
|
|
54
|
+
const readFd = await open(path, "r");
|
|
55
|
+
return new FifoUtf8NlineTransport({ readFd });
|
|
48
56
|
}
|
|
49
57
|
static async openWriter(path) {
|
|
50
|
-
|
|
58
|
+
const writeFd = await open(path, "w");
|
|
59
|
+
return new FifoUtf8NlineTransport({ writeFd });
|
|
51
60
|
}
|
|
52
61
|
static fromFds(readFd, writeFd) {
|
|
53
62
|
return new FifoUtf8NlineTransport({
|
|
@@ -115,19 +124,45 @@ var FifoUtf8NlineTransport = class FifoUtf8NlineTransport {
|
|
|
115
124
|
if (this.closed) throw new Error("FifoUtf8NlineTransport: closed");
|
|
116
125
|
if (this.writeFd === null) throw new Error("FifoUtf8NlineTransport: not a writer");
|
|
117
126
|
if (!line.endsWith("\n")) line += "\n";
|
|
118
|
-
await this.
|
|
127
|
+
await this.ws.write(line);
|
|
119
128
|
}
|
|
120
129
|
async close() {
|
|
121
|
-
|
|
130
|
+
this.closingPromise = this.closingPromise || this.pvtClose();
|
|
131
|
+
await this.closingPromise;
|
|
122
132
|
this.closed = true;
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
133
|
+
}
|
|
134
|
+
async pvtClose() {
|
|
135
|
+
await Promise.resolve();
|
|
136
|
+
if (this.rl) {
|
|
137
|
+
this.rl.close();
|
|
138
|
+
this.rl = null;
|
|
139
|
+
}
|
|
140
|
+
if (this.rs) {
|
|
141
|
+
this.rs.destroy();
|
|
142
|
+
this.rs = null;
|
|
143
|
+
}
|
|
144
|
+
if (this.ws) {
|
|
145
|
+
await new Promise(async (resolve) => {
|
|
146
|
+
try {
|
|
147
|
+
await this.ws.end("", resolve);
|
|
148
|
+
} catch {
|
|
149
|
+
resolve();
|
|
150
|
+
}
|
|
151
|
+
});
|
|
152
|
+
this.ws = null;
|
|
153
|
+
}
|
|
154
|
+
if (this.readFd) {
|
|
155
|
+
try {
|
|
156
|
+
await this.readFd.close();
|
|
157
|
+
} catch {}
|
|
158
|
+
this.readFd = null;
|
|
159
|
+
}
|
|
160
|
+
if (this.writeFd) {
|
|
161
|
+
try {
|
|
162
|
+
await this.writeFd.close();
|
|
163
|
+
} catch {}
|
|
164
|
+
this.writeFd = null;
|
|
165
|
+
}
|
|
131
166
|
if (this.pvtWriter) await this.pvtWriter.close();
|
|
132
167
|
}
|
|
133
168
|
};
|
|
@@ -192,18 +227,28 @@ async function runChild(fn) {
|
|
|
192
227
|
ctx.parentId = parentId;
|
|
193
228
|
return yield* fn(ctx, args);
|
|
194
229
|
};
|
|
195
|
-
const proc = spawnAsync(wrappedFn, "remote"
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
230
|
+
const proc = spawnAsync(wrappedFn, "remote")(initArgs);
|
|
231
|
+
proc.subscribe("message", async (msg, sender) => {
|
|
232
|
+
try {
|
|
233
|
+
const encodedMsg = encode("$msg", {
|
|
234
|
+
fromName: sender.fromName,
|
|
235
|
+
body: msg
|
|
236
|
+
});
|
|
237
|
+
await transport.send(encodedMsg);
|
|
238
|
+
} catch (e) {
|
|
239
|
+
console.error("Error sending out the message");
|
|
240
|
+
}
|
|
241
|
+
});
|
|
242
|
+
proc.subscribe("state", async () => {
|
|
243
|
+
try {
|
|
244
|
+
const encodedState = encode("$state", proc.state);
|
|
245
|
+
await transport.send(encodedState);
|
|
246
|
+
} catch (e) {
|
|
247
|
+
console.error("Error sending out the message", e);
|
|
248
|
+
}
|
|
249
|
+
});
|
|
202
250
|
await proc.ready();
|
|
203
251
|
await transport.send(encode("$state", proc.state));
|
|
204
|
-
proc.subscribe(() => {
|
|
205
|
-
transport.send(encode("$state", proc.state)).catch(() => {});
|
|
206
|
-
});
|
|
207
252
|
transport.onMessage((line) => {
|
|
208
253
|
const msg = decode(line);
|
|
209
254
|
if (isMsg(msg)) {
|
|
@@ -219,7 +264,7 @@ async function runChild(fn) {
|
|
|
219
264
|
code,
|
|
220
265
|
state: proc.state
|
|
221
266
|
}));
|
|
222
|
-
transport.close();
|
|
267
|
+
await transport.close();
|
|
223
268
|
process.exit(code);
|
|
224
269
|
};
|
|
225
270
|
proc.wait().then(() => shutdown(0), (err) => {
|
|
@@ -316,7 +361,6 @@ async function spawnRemote(opts) {
|
|
|
316
361
|
send(msg) {
|
|
317
362
|
const from = opts.parentName ?? "host";
|
|
318
363
|
transport.send(encode("$msg", {
|
|
319
|
-
type: msg.type,
|
|
320
364
|
fromName: from,
|
|
321
365
|
body: msg
|
|
322
366
|
}));
|
package/dist/remote/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":[],"sources":["../../src/remote/fifo.ts","../../src/remote/protocol.ts","../../src/remote/child.ts","../../src/remote/host.ts","../../src/remote/define.ts"],"sourcesContent":["// ── FIFO transport ─────────────────────────────────────────────────────────\n//\n// Newline-delimited UTF-8 over named fifos. Strict handler lifecycle:\n// onMessage() throws if a handler is already set; call removeHandler() first.\n\nimport { open, type FileHandle } from \"node:fs/promises\";\nimport { createReadStream, type ReadStream } from \"node:fs\";\nimport * as readline from \"node:readline\";\n\nexport class FifoUtf8NlineTransport {\n private readFd: FileHandle | null;\n private writeFd: FileHandle | null;\n private rl: readline.Interface | null;\n private rs: ReadStream | null;\n private pvtOnMessage: ((line: string) => void) | null = null;\n private closed = false;\n private pvtError: Error | null = null;\n private pvtWriter: FifoUtf8NlineTransport | null = null;\n\n private constructor(opts: {\n readFd?: FileHandle;\n writeFd?: FileHandle;\n }) {\n this.readFd = opts.readFd ?? null;\n this.writeFd = opts.writeFd ?? null;\n\n if (this.readFd) {\n this.rs = createReadStream(\"\", {\n fd: this.readFd.fd,\n encoding: \"utf-8\",\n autoClose: false,\n });\n this.rl = readline.createInterface({ input: this.rs });\n\n this.rl.on(\"line\", (line) => {\n if (this.pvtOnMessage && !this.closed) this.pvtOnMessage(line);\n });\n\n this.rl.on(\"close\", () => { this.closed = true; });\n\n this.rs.on(\"error\", (err: Error) => {\n this.pvtError = err;\n if (!this.closed) this.closed = true;\n });\n\n this.rl.on(\"error\", (err: Error) => {\n this.pvtError = err;\n if (!this.closed) this.closed = true;\n });\n } else {\n this.rs = null;\n this.rl = null;\n }\n }\n\n // ── factories ──────────────────────────────────────────────────────────\n\n private static async openReader(path: string): Promise<FifoUtf8NlineTransport> {\n const readFd = await open(path, \"r\");\n return new FifoUtf8NlineTransport({ readFd });\n }\n\n private static async openWriter(path: string): Promise<FifoUtf8NlineTransport> {\n const writeFd = await open(path, \"w\");\n return new FifoUtf8NlineTransport({ writeFd });\n }\n\n static fromFds(readFd: FileHandle, writeFd: FileHandle): FifoUtf8NlineTransport {\n return new FifoUtf8NlineTransport({ readFd, writeFd });\n }\n\n // ── bidirectional connection ───────────────────────────────────────────\n\n private attachWriter(w: FifoUtf8NlineTransport): void {\n this.pvtWriter = w;\n }\n\n /**\n * Start opening a bidirectional connection. Opens readPath for reading\n * in the background, returns a promise. The caller should do whatever\n * setup is needed to unblock the read (e.g. spawn a process that opens\n * readPath for writing), then await the returned transport.\n *\n * Once the read completes, writePath is opened for writing automatically.\n */\n static beginConnect(\n readPath: string,\n writePath: string,\n ): { transport: Promise<FifoUtf8NlineTransport> } {\n const readerPromise = FifoUtf8NlineTransport.openReader(readPath);\n\n const transport = readerPromise.then(async (reader) => {\n const writer = await FifoUtf8NlineTransport.openWriter(writePath);\n reader.attachWriter(writer);\n return reader;\n });\n\n return { transport };\n }\n\n /**\n * Open a bidirectional connection. Opens writePath for writing first\n * (unblocking the peer's read), starts reading readPath in the\n * background, then awaits both.\n *\n * Use this when you are the side that responds to the peer's beginConnect\n * (i.e. you don't need to interleave any setup between the read and write\n * opens).\n */\n static async connect(\n readPath: string,\n writePath: string,\n ): Promise<FifoUtf8NlineTransport> {\n const readerPromise = FifoUtf8NlineTransport.openReader(readPath);\n const writer = await FifoUtf8NlineTransport.openWriter(writePath);\n const reader = await readerPromise;\n reader.attachWriter(writer);\n return reader;\n }\n\n // ── public API ─────────────────────────────────────────────────────────\n\n get canSend(): boolean {\n if (this.pvtWriter) return this.pvtWriter.canSend;\n return this.writeFd !== null && !this.closed;\n }\n\n onMessage(handler: (line: string) => void): void {\n if (this.closed) throw new Error(\"FifoUtf8NlineTransport: closed\");\n if (this.readFd === null) throw new Error(\"FifoUtf8NlineTransport: not a reader\");\n if (this.pvtOnMessage !== null) {\n throw new Error(\"FifoUtf8NlineTransport: handler already set — call removeHandler() first\");\n }\n this.pvtOnMessage = handler;\n }\n\n removeHandler(): ((line: string) => void) | null {\n const prev = this.pvtOnMessage;\n this.pvtOnMessage = null;\n return prev;\n }\n\n get hasHandler(): boolean {\n return this.pvtOnMessage !== null;\n }\n\n get lastError(): Error | null {\n return this.pvtError;\n }\n\n async send(line: string): Promise<void> {\n if (this.pvtWriter) return this.pvtWriter.send(line);\n if (this.closed) throw new Error(\"FifoUtf8NlineTransport: closed\");\n if (this.writeFd === null) throw new Error(\"FifoUtf8NlineTransport: not a writer\");\n if (!line.endsWith(\"\\n\")) line += \"\\n\";\n await this.writeFd.write(line);\n }\n\n async close(): Promise<void> {\n if (this.closed) return;\n this.closed = true;\n if (this.rl) this.rl.close();\n if (this.rs) this.rs.destroy();\n if (this.readFd) { try { await this.readFd.close(); } catch {} }\n if (this.writeFd) { try { await this.writeFd.close(); } catch {} }\n if (this.pvtWriter) { await this.pvtWriter.close(); }\n }\n}\n","// ── Wire protocol ──────────────────────────────────────────────────────────\n//\n// NDJSON wire protocol: one JSON object per line.\n// child → host: $proto, $state, $msg, $exit\n// host → child: $init, $msg\n\nexport const PROTO_VERSION = \"ndjson.v1\";\n\nexport function encode(key: string, value: unknown): string {\n return JSON.stringify({ [key]: value }) + \"\\n\";\n}\n\nexport function decode(line: string): Record<string, unknown> {\n return JSON.parse(line);\n}\n\n// ── type guards ──────────────────────────────────────────────────────────\n\nexport function isProto(msg: Record<string, unknown>): msg is { $proto: string } {\n return \"$proto\" in msg;\n}\nexport function isInit(msg: Record<string, unknown>): msg is { $init: Record<string, unknown> } {\n return \"$init\" in msg;\n}\nexport function isState(msg: Record<string, unknown>): msg is { $state: Record<string, unknown> } {\n return \"$state\" in msg;\n}\nexport function isMsg(msg: Record<string, unknown>): msg is { $msg: { type: string; fromName: string; body: unknown } } {\n return \"$msg\" in msg;\n}\nexport function isExit(msg: Record<string, unknown>): msg is { $exit: { code: number; state: unknown } } {\n return \"$exit\" in msg;\n}\n","// ── Child-side adapter ─────────────────────────────────────────────────────\n//\n// Wraps a posipaki actor in a CLI process that speaks the wire protocol over\n// two unidirectional named fifos.\n\nimport type { AsyncProcessFn, Message } from \"../types.js\";\nimport { FifoUtf8NlineTransport } from \"./fifo.js\";\n\nexport function makeSender(\n fromName: string,\n parentName: string | null,\n parentId: symbol | null,\n): { fromName: string; fromId: symbol } {\n if (parentId && fromName === parentName) {\n return { fromName, fromId: parentId };\n }\n return { fromName, fromId: Symbol() };\n}\nimport { encode, decode, isInit, isMsg, PROTO_VERSION } from \"./protocol.js\";\nimport { spawnAsync } from \"../index.js\";\n\nexport async function runChild<\n Args,\n State,\n InMsg extends Message,\n OutMsg extends Message,\n>(fn: AsyncProcessFn<Args, State, InMsg, OutMsg>): Promise<void> {\n const fifoIn = process.argv\n .find((a) => a.startsWith(\"--fifo-in=\"))\n ?.slice(\"--fifo-in=\".length);\n const fifoOut = process.argv\n .find((a) => a.startsWith(\"--fifo-out=\"))\n ?.slice(\"--fifo-out=\".length);\n\n if (!fifoIn || !fifoOut) {\n console.error(\"child: --fifo-in=<path> and --fifo-out=<path> required\");\n process.exit(1);\n }\n\n const transport = await FifoUtf8NlineTransport.connect(fifoOut, fifoIn);\n\n // 1. Send protocol version\n await transport.send(encode(\"$proto\", PROTO_VERSION));\n\n // 2. Wait for $init\n const initMsg = await new Promise<Record<string, unknown>>((resolve) => {\n transport.onMessage((line) => {\n const msg = decode(line);\n if (isInit(msg)) resolve(msg.$init);\n });\n });\n transport.removeHandler();\n\n const parentName = (initMsg.parentName as string) ?? null;\n const parentIdName = (initMsg.parentIdName as string) ?? null;\n const parentId = parentIdName ? Symbol.for(parentIdName) : null;\n const { parentName: _pn, parentIdName: _pid, ...initArgs } = initMsg;\n\n // 3. Spawn the actor\n const wrappedFn: typeof fn = async function* (ctx, args) {\n (ctx as Record<string, unknown>).parentName = parentName;\n (ctx as Record<string, unknown>).parentId = parentId;\n return yield* fn(ctx, args);\n };\n\n const proc = spawnAsync(wrappedFn, \"remote\", (msg, sender) => {\n transport\n .send(\n encode(\"$msg\", {\n type: msg.type,\n fromName: sender.fromName,\n body: msg,\n }),\n )\n .catch(() => {});\n })(initArgs as unknown as Args);\n await proc.ready();\n\n // 4. Send initial state\n await transport.send(encode(\"$state\", proc.state as Record<string, unknown>));\n\n // 5. Subscribe to state changes\n proc.subscribe(() => {\n transport\n .send(encode(\"$state\", proc.state as Record<string, unknown>))\n .catch(() => {});\n });\n\n // 6. Forward incoming messages to the actor\n transport.onMessage((line) => {\n const msg = decode(line);\n if (isMsg(msg)) {\n const { fromName, body } = msg.$msg;\n proc.send(body as InMsg, { fromName, fromId: Symbol() });\n }\n });\n\n // 7. On actor exit, send $exit\n const shutdown = async (code: number) => {\n await transport.send(encode(\"$exit\", { code, state: proc.state }));\n transport.close();\n process.exit(code);\n };\n proc.wait().then(\n () => shutdown(0),\n (err: unknown) => {\n console.error(\"child actor error:\", err);\n shutdown(1);\n },\n );\n}\n","// ── Host-side adapter ──────────────────────────────────────────────────────\n//\n// commandConnector: spawns a child process and bridges the wire protocol.\n// Connector wrappers (bunConnector, nodeConnector, defaultConnector) produce\n// the command array from a script path.\n\nimport { spawn, execSync, type ChildProcess } from \"node:child_process\";\nimport { randomUUID } from \"node:crypto\";\nimport { tmpdir } from \"node:os\";\nimport { join } from \"node:path\";\nimport { unlink } from \"node:fs/promises\";\nimport { FifoUtf8NlineTransport } from \"./fifo.js\";\nimport { encode, decode, isProto, isState, isMsg, isExit, PROTO_VERSION } from \"./protocol.js\";\nimport type { Message } from \"../types.js\";\n\n// ── types ──────────────────────────────────────────────────────────────────\n\nexport interface CommandSpawnOptions<Args = Record<string, unknown>> {\n command: string[];\n args: Args;\n parentName?: string;\n}\n\nexport interface RemoteProxy<\n State = unknown,\n InMsg extends Message = Message,\n OutMsg extends Message = Message,\n> {\n readonly state: State;\n ready(): Promise<void>;\n send(msg: InMsg): void;\n wait(): Promise<{ code: number | null; state: State }>;\n onMessage(handler: (msg: OutMsg) => void): void;\n}\n\n/** A connector takes a command and returns a RemoteProxy. */\nexport type Connector<\n State = unknown,\n InMsg extends Message = Message,\n OutMsg extends Message = Message,\n> = (opts: CommandSpawnOptions) => Promise<RemoteProxy<State, InMsg, OutMsg>>;\n\n// ── commandConnector ───────────────────────────────────────────────────────\n\nexport async function spawnRemote<\n State = unknown,\n InMsg extends Message = Message,\n OutMsg extends Message = Message,\n Args = Record<string, unknown>,\n>(\n opts: CommandSpawnOptions<Args>,\n): Promise<RemoteProxy<State, InMsg, OutMsg>> {\n const basePath = join(tmpdir(), `posipaki-${randomUUID()}`);\n\n execSync(`mkfifo \"${basePath}.in\"`);\n execSync(`mkfifo \"${basePath}.out\"`);\n\n const setup = FifoUtf8NlineTransport.beginConnect(basePath + \".in\", basePath + \".out\");\n\n const childCmd = [\n ...opts.command,\n `--fifo-in=${basePath + \".in\"}`,\n `--fifo-out=${basePath + \".out\"}`,\n ];\n const childProc: ChildProcess = spawn(childCmd[0], childCmd.slice(1), {\n cwd: process.cwd(),\n stdio: [\"inherit\", \"inherit\", \"inherit\"],\n });\n\n const transport = await setup.transport;\n\n // ── handshake ───────────────────────────────────────────────────────\n const protoLine = await new Promise<string>((resolve) => {\n transport.onMessage((line) => resolve(line));\n });\n const protoMsg = decode(protoLine);\n if (!isProto(protoMsg) || protoMsg.$proto !== PROTO_VERSION) {\n throw new Error(`unsupported protocol: ${protoLine.slice(0, 50)}`);\n }\n transport.removeHandler();\n\n await transport.send(encode(\"$init\", {\n ...opts.args as Record<string, unknown>,\n parentName: opts.parentName ?? \"host\",\n parentIdName: opts.parentName ?? \"host\",\n }));\n\n let currentState: Record<string, unknown> = {};\n await new Promise<void>((resolve) => {\n transport.onMessage((line) => {\n const msg = decode(line);\n if (isState(msg)) {\n Object.assign(currentState, msg.$state as Record<string, unknown>);\n resolve();\n }\n });\n });\n transport.removeHandler();\n\n // ── persistent handler ──────────────────────────────────────────────\n let msgHandler: ((msg: OutMsg) => void) | null = null;\n let exitResolver: ((value: { code: number | null; state: State }) => void) | null = null;\n const exitPromise = new Promise<{ code: number | null; state: State }>((resolve) => {\n exitResolver = resolve;\n });\n\n transport.onMessage((line) => {\n const msg = decode(line);\n if (isState(msg)) {\n Object.assign(currentState, msg.$state as Record<string, unknown>);\n } else if (isMsg(msg)) {\n msgHandler?.(msg.$msg.body as OutMsg);\n } else if (isExit(msg)) {\n if (exitResolver) {\n exitResolver({ code: msg.$exit.code, state: msg.$exit.state as State });\n exitResolver = null;\n }\n cleanup();\n }\n });\n\n // ── cleanup ─────────────────────────────────────────────────────────\n let cleaned = false;\n const cleanup = () => {\n if (cleaned) return;\n cleaned = true;\n transport.close();\n unlink(basePath + \".in\").catch(() => {});\n unlink(basePath + \".out\").catch(() => {});\n };\n\n childProc.on(\"exit\", (code) => {\n if (exitResolver) {\n exitResolver({ code, state: currentState as State });\n exitResolver = null;\n }\n cleanup();\n });\n\n return {\n get state(): State { return currentState as State; },\n async ready() {},\n send(msg: InMsg) {\n const from = opts.parentName ?? \"host\";\n transport.send(encode(\"$msg\", { type: msg.type, fromName: from, body: msg }));\n },\n async wait() { return exitPromise; },\n onMessage(handler: (msg: OutMsg) => void) { msgHandler = handler; },\n };\n}\n\n// ── connector wrappers ─────────────────────────────────────────────────────\n\nfunction scriptConnector(\n runner: string,\n runnerArgs: string[],\n): (scriptPath: string) => Connector {\n return (scriptPath: string) => {\n return ((opts: CommandSpawnOptions) => {\n return commandConnector({\n ...opts,\n command: [runner, ...runnerArgs, scriptPath, ...opts.command],\n });\n }) as Connector;\n };\n}\n\n/** Spawn via `bun run <script>`. */\nexport const bunConnector = scriptConnector(\"bun\", [\"run\"]);\n\n/** Spawn via `node <script>`. */\nexport const nodeConnector = scriptConnector(\"node\", []);\n\n/**\n * Auto-detect: prefers `bun run` if the script is a .ts file and bun is\n * the current runtime, otherwise falls back to `node`.\n */\nexport function defaultConnector(scriptPath: string): Connector {\n // Check if we're running under bun\n const isBun = typeof (globalThis as any).Bun !== \"undefined\";\n const isTs = scriptPath.endsWith(\".ts\");\n if (isBun && isTs) return bunConnector(scriptPath);\n return nodeConnector(scriptPath);\n}\n\n// ── alias ───────────────────────────────────────────────────────────────────\n\nexport const commandConnector = spawnRemote;\n","// ── defineRemoteActor ──────────────────────────────────────────────────────\n//\n// Wraps an ActorDefinition so that when spawned, it runs in a child process\n// over two named fifos. Returns { actor, runRemoteRoot, isRemoteRoot }.\n//\n// Uses defineActor's setup hook to spawn the remote child before the first\n// yield, so proc.ready() shows the live remote state — same as local spawn.\n\nimport { fileURLToPath } from \"node:url\";\nimport { createHash } from \"node:crypto\";\nimport type { Message } from \"../types.js\";\nimport type {\n HandlerOptions,\n MethodOptions,\n ReflectionOptions,\n} from \"../actor-types.js\";\nimport { defineActor } from \"../define-actor.js\";\nimport { stopPropagation } from \"../hooks.js\";\nimport type { HookResult } from \"../hooks.js\";\nimport { runChild } from \"./child.js\";\nimport { type Connector, defaultConnector } from \"./host.js\";\nimport type { RemoteProxy } from \"./host.js\";\nimport type { ActorDefinition } from \"../actor-types.js\";\n\nexport interface RemoteActorOptions {\n manual?: boolean;\n connector?: Connector;\n}\n\nexport interface RemoteActorBundle<\n Args,\n State,\n InMsg extends Message,\n OutMsg extends Message,\n ReflectionMethods extends ReflectionOptions,\n> {\n actor: ActorDefinition<Args, State, InMsg, OutMsg, ReflectionMethods>;\n runRemoteRoot(): Promise<void>;\n isRemoteRoot: boolean;\n}\n\nfunction pathHash(path: string): string {\n return createHash(\"sha256\").update(path).digest(\"hex\").slice(0, 12);\n}\n\nconst MARKER_PREFIX = \"--remote=\";\n\nexport function defineRemoteActor<\n Args,\n State,\n InMsg extends Message,\n OutMsg extends Message,\n Methods extends MethodOptions,\n Handlers extends HandlerOptions<InMsg>,\n Reflection extends ReflectionOptions,\n>(\n actor: ActorDefinition<Args, State, InMsg, OutMsg, Reflection>,\n url: string,\n opts: RemoteActorOptions = {},\n): RemoteActorBundle<Args, State, InMsg, OutMsg, Reflection> {\n const scriptPath = fileURLToPath(url);\n const marker = `${MARKER_PREFIX}${pathHash(scriptPath)}`;\n const isRemoteRoot = !opts.manual && process.argv.includes(marker);\n\n if (isRemoteRoot) {\n runChild(actor.fn);\n }\n\n const proxyDef = defineActor<\n Args,\n { public: State; private: { remote: RemoteProxy<State, InMsg, OutMsg> } },\n InMsg,\n OutMsg,\n Methods,\n Handlers,\n Reflection\n >({\n name: actor.name ?? \"actor\",\n inMessages: actor.inMessages,\n outMessages: actor.outMessages,\n handlers: {} as unknown as Handlers,\n async setup(args: Args) {\n const connect = opts.connector ?? defaultConnector(scriptPath);\n const remote = (await connect({\n command: [marker],\n args: args as Record<string, unknown>,\n })) as RemoteProxy<State, InMsg, OutMsg>;\n remote.onMessage((msg: OutMsg) => {\n this.emit(msg);\n });\n return {\n public: remote.state,\n private: { remote },\n };\n },\n async onMessage(msg: InMsg): Promise<HookResult> {\n this.state.private.remote?.send(msg);\n return stopPropagation();\n },\n async onStopRequested() {\n if (this.state.private.remote) {\n this.state.private.remote.send({ type: \"STOP\" } as InMsg);\n await this.state.private.remote.wait();\n }\n this.agreeToStop();\n },\n });\n\n return {\n actor: proxyDef as ActorDefinition<Args, State, InMsg, OutMsg, Reflection>,\n runRemoteRoot() {\n return runChild(actor.fn);\n },\n isRemoteRoot,\n };\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","names":[],"sources":["../../src/remote/fifo.ts","../../src/remote/protocol.ts","../../src/remote/child.ts","../../src/remote/host.ts","../../src/remote/define.ts"],"sourcesContent":["// ── FIFO transport ─────────────────────────────────────────────────────────\n//\n// Newline-delimited UTF-8 over named fifos. Strict handler lifecycle:\n// onMessage() throws if a handler is already set; call removeHandler() first.\n\nimport { open, type FileHandle } from \"node:fs/promises\";\nimport { createReadStream, createWriteStream, type ReadStream, type WriteStream } from \"node:fs\";\nimport * as readline from \"node:readline\";\n\nexport class FifoUtf8NlineTransport {\n private readFd: FileHandle | null;\n private writeFd: FileHandle | null;\n private rl: readline.Interface | null;\n private rs: ReadStream | null;\n private ws: WriteSteeam | null;\n private pvtOnMessage: ((line: string) => void) | null = null;\n private closed = false;\n private closingPromise: Promise<void> | null;\n private pvtError: Error | null = null;\n private pvtWriter: FifoUtf8NlineTransport | null = null;\n\n private constructor(opts: { readFd?: FileHandle; writeFd?: FileHandle }) {\n this.readFd = opts.readFd ?? null;\n this.writeFd = opts.writeFd ?? null;\n\n if (this.readFd) {\n this.rs = createReadStream(\"\", {\n fd: this.readFd.fd,\n encoding: \"utf-8\",\n autoClose: false,\n });\n this.rl = readline.createInterface({ input: this.rs });\n\n this.rl.on(\"line\", (line) => {\n if (this.pvtOnMessage && !this.closed) this.pvtOnMessage(line);\n });\n\n this.rl.on(\"close\", () => {\n this.close();\n });\n\n this.rs.on(\"error\", (err: Error) => {\n this.pvtError = err;\n this.close();\n });\n } else {\n this.rs = null;\n this.rl = null;\n }\n\n if (this.writeFd) {\n this.ws = createWriteStream(\"\", {\n fd: this.writeFd.fd,\n encoding: \"utf-8\",\n autoclose: false,\n });\n this.ws.on(\"error\", (err: Error) => {\n this.pvtError = err;\n this.close();\n });\n } else {\n this.ws = null;\n }\n }\n\n // ── factories ──────────────────────────────────────────────────────────\n\n private static async openReader(path: string): Promise<FifoUtf8NlineTransport> {\n const readFd = await open(path, \"r\");\n return new FifoUtf8NlineTransport({ readFd });\n }\n\n private static async openWriter(path: string): Promise<FifoUtf8NlineTransport> {\n const writeFd = await open(path, \"w\");\n return new FifoUtf8NlineTransport({ writeFd });\n }\n\n static fromFds(readFd: FileHandle, writeFd: FileHandle): FifoUtf8NlineTransport {\n return new FifoUtf8NlineTransport({ readFd, writeFd });\n }\n\n // ── bidirectional connection ───────────────────────────────────────────\n\n private attachWriter(w: FifoUtf8NlineTransport): void {\n this.pvtWriter = w;\n }\n\n /**\n * Start opening a bidirectional connection. Opens readPath for reading\n * in the background, returns a promise. The caller should do whatever\n * setup is needed to unblock the read (e.g. spawn a process that opens\n * readPath for writing), then await the returned transport.\n *\n * Once the read completes, writePath is opened for writing automatically.\n */\n static beginConnect(\n readPath: string,\n writePath: string,\n ): { transport: Promise<FifoUtf8NlineTransport> } {\n const readerPromise = FifoUtf8NlineTransport.openReader(readPath);\n\n const transport = readerPromise.then(async (reader) => {\n const writer = await FifoUtf8NlineTransport.openWriter(writePath);\n reader.attachWriter(writer);\n return reader;\n });\n\n return { transport };\n }\n\n /**\n * Open a bidirectional connection. Opens writePath for writing first\n * (unblocking the peer's read), starts reading readPath in the\n * background, then awaits both.\n *\n * Use this when you are the side that responds to the peer's beginConnect\n * (i.e. you don't need to interleave any setup between the read and write\n * opens).\n */\n static async connect(readPath: string, writePath: string): Promise<FifoUtf8NlineTransport> {\n const readerPromise = FifoUtf8NlineTransport.openReader(readPath);\n const writer = await FifoUtf8NlineTransport.openWriter(writePath);\n const reader = await readerPromise;\n reader.attachWriter(writer);\n return reader;\n }\n\n // ── public API ─────────────────────────────────────────────────────────\n\n get canSend(): boolean {\n if (this.pvtWriter) return this.pvtWriter.canSend;\n return this.writeFd !== null && !this.closed;\n }\n\n onMessage(handler: (line: string) => void): void {\n if (this.closed) throw new Error(\"FifoUtf8NlineTransport: closed\");\n if (this.readFd === null) throw new Error(\"FifoUtf8NlineTransport: not a reader\");\n if (this.pvtOnMessage !== null) {\n throw new Error(\"FifoUtf8NlineTransport: handler already set — call removeHandler() first\");\n }\n this.pvtOnMessage = handler;\n }\n\n removeHandler(): ((line: string) => void) | null {\n const prev = this.pvtOnMessage;\n this.pvtOnMessage = null;\n return prev;\n }\n\n get hasHandler(): boolean {\n return this.pvtOnMessage !== null;\n }\n\n get lastError(): Error | null {\n return this.pvtError;\n }\n\n async send(line: string): Promise<void> {\n if (this.pvtWriter) return this.pvtWriter.send(line);\n if (this.closed) throw new Error(\"FifoUtf8NlineTransport: closed\");\n if (this.writeFd === null) throw new Error(\"FifoUtf8NlineTransport: not a writer\");\n if (!line.endsWith(\"\\n\")) line += \"\\n\";\n await this.ws.write(line);\n }\n\n async close(): Promise<void> {\n this.closingPromise = this.closingPromise || this.pvtClose();\n await this.closingPromise;\n this.closed = true;\n }\n\n private async pvtClose(): Promise<void> {\n // tranfser control back to caller\n // so they can capture the promise reference\n // and prevent reentry\n await Promise.resolve();\n\n if (this.rl) {\n this.rl.close();\n this.rl = null;\n }\n if (this.rs) {\n this.rs.destroy();\n this.rs = null;\n }\n if (this.ws) {\n await new Promise(async (resolve) => {\n try {\n await this.ws.end(\"\", resolve);\n } catch {\n resolve();\n }\n });\n this.ws = null;\n }\n\n if (this.readFd) {\n try {\n await this.readFd.close();\n } catch {}\n this.readFd = null;\n }\n if (this.writeFd) {\n try {\n await this.writeFd.close();\n } catch {}\n this.writeFd = null;\n }\n if (this.pvtWriter) {\n await this.pvtWriter.close();\n }\n }\n}\n","// ── Wire protocol ──────────────────────────────────────────────────────────\n//\n// NDJSON wire protocol: one JSON object per line.\n// child → host: $proto, $state, $msg, $exit\n// host → child: $init, $msg\n\nexport const PROTO_VERSION = \"ndjson.v1\";\n\nexport function encode(key: string, value: unknown): string {\n return JSON.stringify({ [key]: value }) + \"\\n\";\n}\n\nexport function decode(line: string): Record<string, unknown> {\n return JSON.parse(line);\n}\n\n// ── type guards ──────────────────────────────────────────────────────────\n\nexport function isProto(msg: Record<string, unknown>): msg is { $proto: string } {\n return \"$proto\" in msg;\n}\nexport function isInit(msg: Record<string, unknown>): msg is { $init: Record<string, unknown> } {\n return \"$init\" in msg;\n}\nexport function isState(msg: Record<string, unknown>): msg is { $state: Record<string, unknown> } {\n return \"$state\" in msg;\n}\nexport function isMsg(msg: Record<string, unknown>): msg is { $msg: { type: string; fromName: string; body: unknown } } {\n return \"$msg\" in msg;\n}\nexport function isExit(msg: Record<string, unknown>): msg is { $exit: { code: number; state: unknown } } {\n return \"$exit\" in msg;\n}\n","// ── Child-side adapter ─────────────────────────────────────────────────────\n//\n// Wraps a posipaki actor in a CLI process that speaks the wire protocol over\n// two unidirectional named fifos.\n\nimport type { AsyncProcessFn, Message } from \"../types.js\";\nimport { FifoUtf8NlineTransport } from \"./fifo.js\";\n\nexport function makeSender(\n fromName: string,\n parentName: string | null,\n parentId: symbol | null,\n): { fromName: string; fromId: symbol } {\n if (parentId && fromName === parentName) {\n return { fromName, fromId: parentId };\n }\n return { fromName, fromId: Symbol() };\n}\nimport { encode, decode, isInit, isMsg, PROTO_VERSION } from \"./protocol.js\";\nimport { spawnAsync } from \"../index.js\";\n\nexport async function runChild<Args, State, InMsg extends Message, OutMsg extends Message>(\n fn: AsyncProcessFn<Args, State, InMsg, OutMsg>,\n): Promise<void> {\n const fifoIn = process.argv.find((a) => a.startsWith(\"--fifo-in=\"))?.slice(\"--fifo-in=\".length);\n const fifoOut = process.argv\n .find((a) => a.startsWith(\"--fifo-out=\"))\n ?.slice(\"--fifo-out=\".length);\n\n if (!fifoIn || !fifoOut) {\n console.error(\"child: --fifo-in=<path> and --fifo-out=<path> required\");\n process.exit(1);\n }\n\n const transport = await FifoUtf8NlineTransport.connect(fifoOut, fifoIn);\n\n // 1. Send protocol version\n await transport.send(encode(\"$proto\", PROTO_VERSION));\n\n // 2. Wait for $init\n const initMsg = await new Promise<Record<string, unknown>>((resolve) => {\n transport.onMessage((line) => {\n const msg = decode(line);\n if (isInit(msg)) resolve(msg.$init);\n });\n });\n transport.removeHandler();\n\n const parentName = (initMsg.parentName as string) ?? null;\n const parentIdName = (initMsg.parentIdName as string) ?? null;\n const parentId = parentIdName ? Symbol.for(parentIdName) : null;\n const { parentName: _pn, parentIdName: _pid, ...initArgs } = initMsg;\n\n const wrappedFn: typeof fn = async function* (ctx, args) {\n (ctx as Record<string, unknown>).parentName = parentName;\n (ctx as Record<string, unknown>).parentId = parentId;\n return yield* fn(ctx, args);\n };\n\n const proc = spawnAsync(wrappedFn, \"remote\")(initArgs as unknown as Args);\n proc.subscribe(\"message\", async (msg, sender) => {\n try {\n const encodedMsg = encode(\"$msg\", {\n fromName: sender.fromName,\n body: msg,\n });\n await transport.send(encodedMsg);\n } catch (e) {\n console.error(\"Error sending out the message\");\n }\n });\n\n proc.subscribe(\"state\", async () => {\n try {\n const encodedState = encode(\"$state\", proc.state as Record<string, unknown>);\n await transport.send(encodedState);\n } catch (e) {\n console.error(\"Error sending out the message\", e);\n }\n });\n\n await proc.ready();\n\n await transport.send(encode(\"$state\", proc.state as Record<string, unknown>));\n\n // 6. Forward incoming messages to the actor\n transport.onMessage((line) => {\n const msg = decode(line);\n if (isMsg(msg)) {\n const { fromName, body } = msg.$msg;\n proc.send(body as InMsg, { fromName, fromId: Symbol() });\n }\n });\n\n // 7. On actor exit, send $exit\n const shutdown = async (code: number) => {\n await transport.send(encode(\"$exit\", { code, state: proc.state }));\n await transport.close();\n process.exit(code);\n };\n proc.wait().then(\n () => shutdown(0),\n (err: unknown) => {\n console.error(\"child actor error:\", err);\n shutdown(1);\n },\n );\n}\n","// ── Host-side adapter ──────────────────────────────────────────────────────\n//\n// commandConnector: spawns a child process and bridges the wire protocol.\n// Connector wrappers (bunConnector, nodeConnector, defaultConnector) produce\n// the command array from a script path.\n\nimport { spawn, execSync, type ChildProcess } from \"node:child_process\";\nimport { randomUUID } from \"node:crypto\";\nimport { tmpdir } from \"node:os\";\nimport { join } from \"node:path\";\nimport { unlink } from \"node:fs/promises\";\nimport { FifoUtf8NlineTransport } from \"./fifo.js\";\nimport { encode, decode, isProto, isState, isMsg, isExit, PROTO_VERSION } from \"./protocol.js\";\nimport type { Message } from \"../types.js\";\n\n// ── types ──────────────────────────────────────────────────────────────────\n\nexport interface CommandSpawnOptions<Args = Record<string, unknown>> {\n command: string[];\n args: Args;\n parentName?: string;\n}\n\nexport interface RemoteProxy<\n State = unknown,\n InMsg extends Message = Message,\n OutMsg extends Message = Message,\n> {\n readonly state: State;\n ready(): Promise<void>;\n send(msg: InMsg): void;\n wait(): Promise<{ code: number | null; state: State }>;\n onMessage(handler: (msg: OutMsg) => void): void;\n}\n\n/** A connector takes a command and returns a RemoteProxy. */\nexport type Connector<\n State = unknown,\n InMsg extends Message = Message,\n OutMsg extends Message = Message,\n> = (opts: CommandSpawnOptions) => Promise<RemoteProxy<State, InMsg, OutMsg>>;\n\n// ── commandConnector ───────────────────────────────────────────────────────\n\nexport async function spawnRemote<\n State = unknown,\n InMsg extends Message = Message,\n OutMsg extends Message = Message,\n Args = Record<string, unknown>,\n>(opts: CommandSpawnOptions<Args>): Promise<RemoteProxy<State, InMsg, OutMsg>> {\n const basePath = join(tmpdir(), `posipaki-${randomUUID()}`);\n\n execSync(`mkfifo \"${basePath}.in\"`);\n execSync(`mkfifo \"${basePath}.out\"`);\n\n const setup = FifoUtf8NlineTransport.beginConnect(basePath + \".in\", basePath + \".out\");\n\n const childCmd = [\n ...opts.command,\n `--fifo-in=${basePath + \".in\"}`,\n `--fifo-out=${basePath + \".out\"}`,\n ];\n const childProc: ChildProcess = spawn(childCmd[0], childCmd.slice(1), {\n cwd: process.cwd(),\n stdio: [\"inherit\", \"inherit\", \"inherit\"],\n });\n\n const transport = await setup.transport;\n\n // ── handshake ───────────────────────────────────────────────────────\n const protoLine = await new Promise<string>((resolve) => {\n transport.onMessage((line) => resolve(line));\n });\n const protoMsg = decode(protoLine);\n if (!isProto(protoMsg) || protoMsg.$proto !== PROTO_VERSION) {\n throw new Error(`unsupported protocol: ${protoLine.slice(0, 50)}`);\n }\n transport.removeHandler();\n\n await transport.send(\n encode(\"$init\", {\n ...(opts.args as Record<string, unknown>),\n parentName: opts.parentName ?? \"host\",\n parentIdName: opts.parentName ?? \"host\",\n }),\n );\n\n let currentState: Record<string, unknown> = {};\n await new Promise<void>((resolve) => {\n transport.onMessage((line) => {\n const msg = decode(line);\n if (isState(msg)) {\n Object.assign(currentState, msg.$state as Record<string, unknown>);\n resolve();\n }\n });\n });\n transport.removeHandler();\n\n // ── persistent handler ──────────────────────────────────────────────\n let msgHandler: ((msg: OutMsg) => void) | null = null;\n let exitResolver: ((value: { code: number | null; state: State }) => void) | null = null;\n const exitPromise = new Promise<{ code: number | null; state: State }>((resolve) => {\n exitResolver = resolve;\n });\n\n transport.onMessage((line) => {\n const msg = decode(line);\n if (isState(msg)) {\n Object.assign(currentState, msg.$state as Record<string, unknown>);\n } else if (isMsg(msg)) {\n msgHandler?.(msg.$msg.body as OutMsg);\n } else if (isExit(msg)) {\n if (exitResolver) {\n exitResolver({ code: msg.$exit.code, state: msg.$exit.state as State });\n exitResolver = null;\n }\n cleanup();\n }\n });\n\n // ── cleanup ─────────────────────────────────────────────────────────\n let cleaned = false;\n const cleanup = () => {\n if (cleaned) return;\n cleaned = true;\n transport.close();\n unlink(basePath + \".in\").catch(() => {});\n unlink(basePath + \".out\").catch(() => {});\n };\n\n childProc.on(\"exit\", (code) => {\n if (exitResolver) {\n exitResolver({ code, state: currentState as State });\n exitResolver = null;\n }\n cleanup();\n });\n\n return {\n get state(): State {\n return currentState as State;\n },\n async ready() {},\n send(msg: InMsg) {\n const from = opts.parentName ?? \"host\";\n transport.send(encode(\"$msg\", { fromName: from, body: msg }));\n },\n async wait() {\n return exitPromise;\n },\n onMessage(handler: (msg: OutMsg) => void) {\n msgHandler = handler;\n },\n };\n}\n\n// ── connector wrappers ─────────────────────────────────────────────────────\n\nfunction scriptConnector(runner: string, runnerArgs: string[]): (scriptPath: string) => Connector {\n return (scriptPath: string) => {\n return ((opts: CommandSpawnOptions) => {\n return commandConnector({\n ...opts,\n command: [runner, ...runnerArgs, scriptPath, ...opts.command],\n });\n }) as Connector;\n };\n}\n\n/** Spawn via `bun run <script>`. */\nexport const bunConnector = scriptConnector(\"bun\", [\"run\"]);\n\n/** Spawn via `node <script>`. */\nexport const nodeConnector = scriptConnector(\"node\", []);\n\n/**\n * Auto-detect: prefers `bun run` if the script is a .ts file and bun is\n * the current runtime, otherwise falls back to `node`.\n */\nexport function defaultConnector(scriptPath: string): Connector {\n // Check if we're running under bun\n const isBun = typeof (globalThis as any).Bun !== \"undefined\";\n const isTs = scriptPath.endsWith(\".ts\");\n if (isBun && isTs) return bunConnector(scriptPath);\n return nodeConnector(scriptPath);\n}\n\n// ── alias ───────────────────────────────────────────────────────────────────\n\nexport const commandConnector = spawnRemote;\n","// ── defineRemoteActor ──────────────────────────────────────────────────────\n//\n// Wraps an ActorDefinition so that when spawned, it runs in a child process\n// over two named fifos. Returns { actor, runRemoteRoot, isRemoteRoot }.\n//\n// Uses defineActor's setup hook to spawn the remote child before the first\n// yield, so proc.ready() shows the live remote state — same as local spawn.\n\nimport { fileURLToPath } from \"node:url\";\nimport { createHash } from \"node:crypto\";\nimport type { Message } from \"../types.js\";\nimport type { HandlerOptions, MethodOptions, ReflectionOptions } from \"../actor-types.js\";\nimport { defineActor } from \"../define-actor.js\";\nimport { stopPropagation } from \"../hooks.js\";\nimport type { HookResult } from \"../hooks.js\";\nimport { runChild } from \"./child.js\";\nimport { type Connector, defaultConnector } from \"./host.js\";\nimport type { RemoteProxy } from \"./host.js\";\nimport type { ActorDefinition } from \"../actor-types.js\";\n\nexport interface RemoteActorOptions {\n manual?: boolean;\n connector?: Connector;\n}\n\nexport interface RemoteActorBundle<\n Args,\n State,\n InMsg extends Message,\n OutMsg extends Message,\n ReflectionMethods extends ReflectionOptions,\n> {\n actor: ActorDefinition<Args, State, InMsg, OutMsg, ReflectionMethods>;\n runRemoteRoot(): Promise<void>;\n isRemoteRoot: boolean;\n}\n\nfunction pathHash(path: string): string {\n return createHash(\"sha256\").update(path).digest(\"hex\").slice(0, 12);\n}\n\nconst MARKER_PREFIX = \"--remote=\";\n\nexport function defineRemoteActor<\n Args,\n State,\n InMsg extends Message,\n OutMsg extends Message,\n Methods extends MethodOptions,\n Handlers extends HandlerOptions<InMsg>,\n Reflection extends ReflectionOptions,\n>(\n actor: ActorDefinition<Args, State, InMsg, OutMsg, Reflection>,\n url: string,\n opts: RemoteActorOptions = {},\n): RemoteActorBundle<Args, State, InMsg, OutMsg, Reflection> {\n const scriptPath = fileURLToPath(url);\n const marker = `${MARKER_PREFIX}${pathHash(scriptPath)}`;\n const isRemoteRoot = !opts.manual && process.argv.includes(marker);\n\n if (isRemoteRoot) {\n runChild(actor.fn);\n }\n\n const proxyDef = defineActor<\n Args,\n { public: State; private: { remote: RemoteProxy<State, InMsg, OutMsg> } },\n InMsg,\n OutMsg,\n Methods,\n Handlers,\n Reflection\n >({\n name: actor.name ?? \"actor\",\n inMessages: actor.inMessages,\n outMessages: actor.outMessages,\n handlers: {} as unknown as Handlers,\n async setup(args: Args) {\n const connect = opts.connector ?? defaultConnector(scriptPath);\n const remote = (await connect({\n command: [marker],\n args: args as Record<string, unknown>,\n })) as RemoteProxy<State, InMsg, OutMsg>;\n remote.onMessage((msg: OutMsg) => {\n this.emit(msg);\n });\n return {\n public: remote.state,\n private: { remote },\n };\n },\n async onMessage(msg: InMsg): Promise<HookResult> {\n this.state.private.remote?.send(msg);\n return stopPropagation();\n },\n async onStopRequested() {\n if (this.state.private.remote) {\n this.state.private.remote.send({ type: \"STOP\" } as InMsg);\n await this.state.private.remote.wait();\n }\n this.agreeToStop();\n },\n });\n\n return {\n actor: proxyDef as ActorDefinition<Args, State, InMsg, OutMsg, Reflection>,\n runRemoteRoot() {\n return runChild(actor.fn);\n },\n isRemoteRoot,\n };\n}\n"],"mappings":"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"}
|