posipaki 0.20.4 → 0.22.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.
Files changed (40) hide show
  1. package/dist/{hooks-BD0dawkQ.d.ts → hooks-D6qtxITh.d.ts} +6 -5
  2. package/dist/hooks-D6qtxITh.d.ts.map +1 -0
  3. package/dist/{hooks-Q4l5ggDj.js → hooks-V-PEPJHv.js} +2 -2
  4. package/dist/hooks-V-PEPJHv.js.map +1 -0
  5. package/dist/hooks.d.ts +1 -1
  6. package/dist/hooks.js +1 -1
  7. package/dist/index.d.ts +3 -3
  8. package/dist/index.d.ts.map +1 -1
  9. package/dist/index.js +3 -3
  10. package/dist/pipe.d.ts +1 -1
  11. package/dist/pipe.js +1 -1
  12. package/dist/plugins/debug-logger.d.ts +2 -2
  13. package/dist/plugins/debug-logger.js +1 -1
  14. package/dist/plugins/tree-introspection.d.ts +1 -1
  15. package/dist/plugins/tree-introspection.js +1 -1
  16. package/dist/{process-HHEBygG7.d.ts → process-YKyZJOvg.d.ts} +4 -4
  17. package/dist/process-YKyZJOvg.d.ts.map +1 -0
  18. package/dist/remote/index.d.ts +2 -2
  19. package/dist/remote/index.js +3 -4
  20. package/dist/remote/index.js.map +1 -1
  21. package/dist/{src-BaAtO8cf.js → src-fhiwGw91.js} +172 -29
  22. package/dist/src-fhiwGw91.js.map +1 -0
  23. package/dist/supervisor.d.ts +2 -2
  24. package/dist/supervisor.js +1 -1
  25. package/dist/testing/index.d.ts +2 -2
  26. package/dist/testing/index.js +3 -3
  27. package/dist/testing/index.js.map +1 -1
  28. package/dist/{types-DLNOnoxX.d.ts → types-BzM4YqJj.d.ts} +79 -12
  29. package/dist/types-BzM4YqJj.d.ts.map +1 -0
  30. package/dist/{util-DsfVKxTT.js → util-FmOqPdg-.js} +17 -3
  31. package/dist/util-FmOqPdg-.js.map +1 -0
  32. package/dist/xfetch.d.ts +2 -2
  33. package/dist/xfetch.js +1 -1
  34. package/package.json +1 -1
  35. package/dist/hooks-BD0dawkQ.d.ts.map +0 -1
  36. package/dist/hooks-Q4l5ggDj.js.map +0 -1
  37. package/dist/process-HHEBygG7.d.ts.map +0 -1
  38. package/dist/src-BaAtO8cf.js.map +0 -1
  39. package/dist/types-DLNOnoxX.d.ts.map +0 -1
  40. package/dist/util-DsfVKxTT.js.map +0 -1
@@ -1,4 +1,4 @@
1
- import { a as ProcessCtx, d as WithSender, m as AsyncProcess, n as ExitMessage, p as AnyProcess, r as Message, s as SenderInfo, t as AsyncProcessFn } from "./types-DLNOnoxX.js";
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-BzM4YqJj.js";
2
2
 
3
3
  //#region src/actor-types.d.ts
4
4
  type ActorMessages<M extends Message> = {
@@ -27,7 +27,7 @@ interface ActorDefinition<Args, InternalState, InMsg extends Message, OutMsg ext
27
27
  /** Spawn this actor as a standalone process. */
28
28
  spawn(args: Args, opts?: {
29
29
  name?: string;
30
- toParent?: (msg: WithSender<OutMsg>) => void;
30
+ toParent?: (msg: OutMsg, from: SenderInfo) => void;
31
31
  addPlugins?: ActorPlugin[];
32
32
  }): Promise<AsyncProcess<Args, HidePrivate<InternalState>, InMsg, OutMsg, ReflectionMethods & ActorReflection>>;
33
33
  /** Spawn this actor as a child of the calling process.
@@ -60,7 +60,8 @@ type ActorConfig<Args, InternalState, InMsg extends Message, OutMsg extends Mess
60
60
  setup?: (this: ActorContext<Args, never, InMsg, OutMsg, Methods, Handlers, ReflectionMethods & ActorReflection>, args: Args) => Promise<InternalState> | InternalState;
61
61
  afterStart?: () => void | Promise<void>;
62
62
  onStopRequested?: () => HookResult | Promise<HookResult>;
63
- onEnd?: (reason?: unknown) => HookResult | Promise<HookResult>;
63
+ beforeEnd?: (reason?: unknown) => HookResult | Promise<HookResult>;
64
+ afterEnd?: (reason?: unknown) => HookResult | Promise<HookResult>;
64
65
  onError?: (error?: unknown) => HookResult | Promise<HookResult>;
65
66
  onEmit?: (msg: OutMsg, sender: SenderInfo) => HookResult | Promise<HookResult>;
66
67
  onMessage?: (msg: InMsg, sender: SenderInfo) => HookResult | Promise<HookResult>;
@@ -139,7 +140,7 @@ declare function chainHook<TThis, TArgs extends unknown[]>(existing: ((this: TTh
139
140
  * Typical use in a plugin:
140
141
  * return mergeConfigs(cfg, {
141
142
  * onStart() { this.log.info('starting'); },
142
- * onEnd() { this.log.info('stopping'); },
143
+ * beforeEnd() { this.log.info('stopping'); },
143
144
  * });
144
145
  *
145
146
  * @param base - the existing config (ActorConfig)
@@ -151,4 +152,4 @@ type Hook<T, I extends unknown[], O> = (this: T, ...args: I) => O;
151
152
  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>;
152
153
  //#endregion
153
154
  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 };
154
- //# sourceMappingURL=hooks-BD0dawkQ.d.ts.map
155
+ //# sourceMappingURL=hooks-D6qtxITh.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hooks-D6qtxITh.d.ts","names":[],"sources":["../src/actor-types.ts","../src/hooks.ts"],"mappings":";;;KAiBY,aAAA,WAAwB,OAAA;EAClC,cAAA,EAAgB,CAAC;AAAA;AAAA,UAEF,aAAA;EAAA,CACd,GAAA,WAAc,QAAQ;AAAA;AAAA,KAEb,SAAA,eAAwB,OAAA,KAClC,GAAA,EAAK,KAAA,EACL,MAAA,EAAQ,UAAA,YACE,OAAA;AAAA,KACA,cAAA,eAA6B,OAAA,IAAW,IAAA,SAE1C,KAAA,WAAgB,SAAA,CAAU,OAAA,CAAQ,KAAA;EAAS,IAAA,EAAM,CAAA;AAAA;AAAA,UAK1C,iBAAA;AAAA,KACL,MAAA;EAAsB,MAAA,EAAQ,GAAA;EAAK,OAAA,EAAS,IAAI;AAAA;AAAA,KAChD,WAAA,MACV,CAAA,SAAU,MAAA,qBAA2B,CAAA,aAAc,CAAA;AAAA,KAEzC,WAAA,WAAsB,eAAA,6BAChC,CAAA,SAAU,eAAA,kDACN,YAAA,CAAa,CAAA,EAAG,WAAA,CAAY,CAAA,GAAI,EAAA,EAAI,EAAA,EAAI,CAAA,GAAI,eAAA;AAAA,UAGjC,eAAA,oCAGD,OAAA,iBACC,OAAA,4BACW,iBAAA;EAE1B,EAAA,EAAI,cAAA,CAAe,IAAA,EAAM,WAAA,CAAY,aAAA,GAAgB,KAAA,EAAO,MAAA;EAzB3C;EA2BjB,IAAA;EA9BkC;EAgClC,aAAA,GAAgB,WAAA,KAAgB,eAAA;EA/BhC;EAiCA,KAAA,CACE,IAAA,EAAM,IAAA,EACN,IAAA;IACE,IAAA;IACA,QAAA,IAAY,GAAA,EAAK,MAAA,EAAQ,IAAA,EAAM,UAAA;IAC/B,UAAA,GAAa,WAAA;EAAA,IAEd,OAAA,CACD,YAAA,CACE,IAAA,EACA,WAAA,CAAY,aAAA,GACZ,KAAA,EACA,MAAA,EACA,iBAAA,GAAoB,eAAA;EA3Cd;;;EAiDV,YAAA,aAAyB,OAAA,EACvB,GAAA,EAAK,UAAA,mBAA6B,MAAA,EAAQ,GAAA,GAC1C,IAAA,EAAM,IAAA,EACN,IAAA;IACE,IAAA;IACA,aAAA,GAAgB,WAAA;IAChB,UAAA,GAAa,WAAA;EAAA,IAEd,OAAA,CACD,YAAA,CACE,IAAA,EACA,WAAA,CAAY,aAAA,GACZ,KAAA,EACA,MAAA,EACA,iBAAA,GAAoB,eAAA;EAGxB,UAAA,EAAY,aAAA,CAAc,KAAA;EAC1B,WAAA,EAAa,aAAA,CAAc,MAAA;AAAA;AAAA,KAEjB,WAAA,oCAGI,OAAA,iBACC,OAAA,kBACC,aAAA,mBACC,cAAA,CAAe,KAAA,6BACN,iBAAA,IACxB,QAAA,CACF,YAAA,CACE,IAAA,EACA,aAAA,EACA,KAAA,EACA,MAAA,EACA,OAAA,EACA,QAAA,EACA,iBAAA,GAAoB,eAAA;EArFG,kFAyFzB,IAAA;EACA,OAAA,GAAU,WAAA,KAAgB,eAAA;EAxFvB;;EA2FH,UAAA,GAAa,WAAA;EA3FqB;;;EA+FlC,eAAA,GAAkB,WAAA;EAClB,WAAA,GAAc,aAAA,CAAc,MAAA;EAC5B,UAAA,GAAa,aAAA,CAAc,KAAA;EA5FZ;;;EAiGf,WAAA,IACE,IAAA,EAAM,YAAA,CACJ,IAAA,SAEA,KAAA,EACA,MAAA,EACA,OAAA,EACA,QAAA,EACA,iBAAA,GAAoB,eAAA,aAEZ,OAAA;EACZ,KAAA,IACE,IAAA,EAAM,YAAA,CACJ,IAAA,SAEA,KAAA,EACA,MAAA,EACA,OAAA,EACA,QAAA,EACA,iBAAA,GAAoB,eAAA,GAEtB,IAAA,EAAM,IAAA,KACH,OAAA,CAAQ,aAAA,IAAiB,aAAA;EAC9B,UAAA,gBAA0B,OAAA;EAC1B,eAAA,SAAwB,UAAA,GAAa,OAAA,CAAQ,UAAA;EAC7C,SAAA,IAAa,MAAA,eAAqB,UAAA,GAAa,OAAA,CAAQ,UAAA;EACvD,QAAA,IAAY,MAAA,eAAqB,UAAA,GAAa,OAAA,CAAQ,UAAA;EACtD,OAAA,IAAW,KAAA,eAAoB,UAAA,GAAa,OAAA,CAAQ,UAAA;EACpD,MAAA,IACE,GAAA,EAAK,MAAA,EACL,MAAA,EAAQ,UAAA,KACL,UAAA,GAAa,OAAA,CAAQ,UAAA;EAE1B,SAAA,IACE,GAAA,EAAK,KAAA,EACL,MAAA,EAAQ,UAAA,KACL,UAAA,GAAa,OAAA,CAAQ,UAAA;EAE1B,WAAA,IAAe,GAAA,EAAK,OAAA,EAAS,MAAA,EAAQ,UAAA,YAAsB,OAAA;EAE3D,WAAA,IACE,IAAA,UACA,MAAA,EAAQ,WAAA,KACL,UAAA,GAAa,OAAA,CAAQ,UAAA;EAE1B,QAAA,EAAU,QAAA,GACR,QAAA,CACE,YAAA,CACE,IAAA,EACA,aAAA,EACA,KAAA,EACA,MAAA,EACA,OAAA,EACA,QAAA,EACA,iBAAA,GAAoB,eAAA;EAI1B,OAAA,GAAU,OAAA,GACR,QAAA,CACE,YAAA,CACE,IAAA,EACA,aAAA,EACA,KAAA,EACA,MAAA,EACA,OAAA,EACA,QAAA,EACA,iBAAA,GAAoB,eAAA;EAG1B,kBAAA,GAAqB,iBAAA,GACnB,QAAA,CACE,YAAA,CACE,IAAA,EACA,aAAA,EACA,KAAA,EACA,MAAA,EACA,OAAA,EACA,QAAA,EACA,eAAA,GAAkB,eAAA;EAIxB,SAAA,GAAY,OAAA,CAAQ,cAAA;AAAA;AAAA,KAEV,SAAA,GAAY,WAAA,mBAGtB,OAAA,EACA,OAAA,EACA,aAAA,EACA,cAAA,CAAe,OAAA,GACf,iBAAA;;cAMW,aAAA;;cAGA,eAAA,eAA6B,aAA8B;;KAK5D,UAAA,iBAA2B,aAAa;;KAIxC,WAAA,KAAgB,SAAA,KAAc,MAAA,EAAQ,CAAA,KAAM,CAAA,GAAI,OAAA,CAAQ,CAAA;;KAGxD,eAAA,IAAmB,aAAA,EAAe,WAAA,OAAkB,WAAW;AAAA,KAE/D,YAAA,oCAGI,OAAA,iBACC,OAAA,kBACC,aAAA,mBACC,cAAA,CAAe,KAAA,6BACN,iBAAA,IACxB,OAAA,GACF,cAAA;EACE,KAAA,EAAO,aAAA;EACP,IAAA;EACA,EAAA;EAEA,IAAA,GAAO,GAAA,EAAK,MAAA;EACZ,WAAA;EAEA,UAAA,EAAY,QAAA,CACV,YAAA,CACE,IAAA,EACA,aAAA,EACA,KAAA,EACA,MAAA,EACA,OAAA,EACA,QAAA,EACA,iBAAA,KAGF,iBAAA;EACF,IAAA,GAAO,MAAA;EAEP,MAAA,EAAQ,MAAA,SAAe,UAAA;EAEvB,IAAA,kBAGa,OAAA,aACA,KAAA,YACD,iBAAA,EAEV,KAAA,EAAO,eAAA,CAAgB,CAAA,EAAG,CAAA,EAAG,EAAA,EAAI,EAAA,EAAI,CAAA,GACrC,IAAA,GAAO,CAAA,EACP,IAAA;IACE,IAAA;IACA,UAAA,GAAa,WAAA;EAAA,IAEd,OAAA,CAAQ,YAAA,CAAa,CAAA,EAAG,WAAA,CAAY,CAAA,GAAI,EAAA,EAAI,EAAA,EAAI,CAAA,GAAI,eAAA;EAEvD,GAAA,EAAK,UAAA,CAAW,IAAA,EAAM,WAAA,CAAY,aAAA,GAAgB,KAAA,EAAO,MAAA;AAAA;;;;;;;;;;;AApR1C;AAEnB;;;UCciB,cAAA;AAAA,UACA,eAAA;;;;;;;;;;;;;;;iBAkBD,SAAA,iCACd,QAAA,IACM,IAAA,EAAM,KAAA,KAAU,IAAA,EAAM,KAAA,KAAU,UAAA,GAAa,OAAA,CAAQ,UAAA,gBAE3D,MAAA,GAAS,IAAA,EAAM,KAAA,KAAU,IAAA,EAAM,KAAA,KAAU,UAAA,GAAa,OAAA,CAAQ,UAAA,KAC5D,IAAA,EAAM,KAAA,KAAU,IAAA,EAAM,KAAA,KAAU,UAAA,GAAa,OAAA,CAAQ,UAAA;ADhCtC;AACnB;;;;;;;;;;;;;;;;;AADmB,iBC6DH,YAAA,WAAuB,SAAA,EAAW,IAAA,EAAM,CAAA,EAAG,OAAA,EAAS,OAAA,CAAQ,CAAA,IAAK,CAAA;AAAA,KA6BrE,IAAA,+BAAmC,IAAA,EAAM,CAAA,KAAM,IAAA,EAAM,CAAA,KAAM,CAAA;AAAA,iBAEjD,QAAA,4BACpB,EAAA,EAAI,IAAA,CAAK,CAAA,EAAG,CAAA,EAAG,CAAA,eACf,EAAA,IAAM,CAAA,oCACN,OAAA,EAAS,CAAA,KACN,IAAA,EAAM,CAAA,GACR,OAAA,CAAQ,CAAA"}
@@ -38,7 +38,7 @@ function chainHook(existing, plugin) {
38
38
  * Typical use in a plugin:
39
39
  * return mergeConfigs(cfg, {
40
40
  * onStart() { this.log.info('starting'); },
41
- * onEnd() { this.log.info('stopping'); },
41
+ * beforeEnd() { this.log.info('stopping'); },
42
42
  * });
43
43
  *
44
44
  * @param base - the existing config (ActorConfig)
@@ -69,4 +69,4 @@ async function callHook(fn, eh, thisArg, ...args) {
69
69
  //#endregion
70
70
  export { stopPropagation as a, STOP_SENTINEL as i, chainHook as n, mergeConfigs as r, callHook as t };
71
71
 
72
- //# sourceMappingURL=hooks-Q4l5ggDj.js.map
72
+ //# sourceMappingURL=hooks-V-PEPJHv.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hooks-V-PEPJHv.js","names":[],"sources":["../src/actor-types.ts","../src/hooks.ts"],"sourcesContent":["// ── defineActor types ────────────────────────────────────────────────────────\n//\n// Shared between define-actor.ts (implementation) and consumers that want\n// to reference the config/context/definition shapes without importing the\n// implementation module directly.\n\nimport type {\n SenderInfo,\n AsyncProcessFn,\n Message,\n ProcessCtx,\n ExitMessage,\n} from \"./types.js\";\nimport type { ActorDecorated, ActorReflection } from \"./hooks.js\";\nimport type { AnyProcess, AsyncProcess } from \"./process.async.js\";\n\n// Internal marker do not use\nexport type ActorMessages<M extends Message> = {\n __tag_messages: M;\n};\nexport interface MethodOptions {\n [key: string]: Function;\n}\nexport type HandlerFn<InMsg extends Message> = (\n msg: InMsg,\n sender: SenderInfo,\n) => void | Promise<void>;\nexport type HandlerOptions<InMsg extends Message> = Omit<\n {\n [K in InMsg[\"type\"]]: HandlerFn<Extract<InMsg, { type: K }>>;\n },\n \"STOP\"\n>;\nexport type ReflectionMethod = (...args: unknown[]) => unknown;\nexport interface ReflectionOptions {}\nexport type Paired<Priv, Pub> = { public: Pub; private: Priv };\nexport type HidePrivate<T> =\n T extends Paired<unknown, unknown> ? T[\"public\"] : T;\n\nexport type SpawnedFrom<T extends ActorDefinition<any, any, any, any, any>> =\n T extends ActorDefinition<infer A, infer S, infer IM, infer OM, infer R>\n ? AsyncProcess<A, HidePrivate<S>, IM, OM, R & ActorReflection>\n : never;\n\nexport interface ActorDefinition<\n Args,\n InternalState,\n InMsg extends Message,\n OutMsg extends Message,\n ReflectionMethods extends ReflectionOptions,\n> {\n fn: AsyncProcessFn<Args, HidePrivate<InternalState>, InMsg, OutMsg>;\n /** Preferred process name (from config.name). */\n name?: string;\n /** Raw plugin config (array or transform). Resolved at fork time. @internal */\n pvtPluginsRaw?: ActorPlugin[] | PluginTransform;\n /** Spawn this actor as a standalone process. */\n spawn(\n args: Args,\n opts?: {\n name?: string;\n toParent?: (msg: OutMsg, from: SenderInfo) => void;\n addPlugins?: ActorPlugin[];\n },\n ): Promise<\n AsyncProcess<\n Args,\n HidePrivate<InternalState>,\n InMsg,\n OutMsg,\n ReflectionMethods & ActorReflection\n >\n >;\n /** Spawn this actor as a child of the calling process.\n * `ctx` must be able to fork children that emit `OutMsg` — i.e. the\n * parent's in-message is a supertype of this actor's out-message. */\n spawnAsChild<PMO extends Message>(\n ctx: ProcessCtx<unknown, unknown, OutMsg, PMO>,\n args: Args,\n opts?: {\n name?: string;\n parentPlugins?: ActorPlugin[];\n addPlugins?: ActorPlugin[];\n },\n ): Promise<\n AsyncProcess<\n Args,\n HidePrivate<InternalState>,\n InMsg,\n OutMsg,\n ReflectionMethods & ActorReflection\n >\n >;\n inMessages: ActorMessages<InMsg> | undefined;\n outMessages: ActorMessages<OutMsg> | undefined;\n}\nexport type ActorConfig<\n Args,\n InternalState,\n InMsg extends Message,\n OutMsg extends Message,\n Methods extends MethodOptions,\n Handlers extends HandlerOptions<InMsg>,\n ReflectionMethods extends ReflectionOptions,\n> = ThisType<\n ActorContext<\n Args,\n InternalState,\n InMsg,\n OutMsg,\n Methods,\n Handlers,\n ReflectionMethods & ActorReflection\n >\n> & {\n /** Preferred process name. Used by ctx.fork() when no explicit name is given. */\n name?: string;\n plugins?: ActorPlugin[] | PluginTransform;\n /** Non-overridable plugins added at spawn time (spawn/fork opts).\n * Set by the framework during assembly, not by user config. @internal */\n addPlugins?: ActorPlugin[];\n /** Resolved plugin chain (raw config transformed against parent plugins).\n * Set by the framework during assembly, replacing `plugins` (the raw form).\n * @internal */\n resolvedPlugins?: ActorPlugin[];\n outMessages?: ActorMessages<OutMsg>;\n inMessages?: ActorMessages<InMsg>;\n\n /** Fires once `self` is built, before `setup`. State is not yet set\n * (`this.state` is `never`). Use for registering the process/ctx before\n * any child is forked in `setup`. */\n beforeStart?: (\n this: ActorContext<\n Args,\n never,\n InMsg,\n OutMsg,\n Methods,\n Handlers,\n ReflectionMethods & ActorReflection\n >,\n ) => void | Promise<void>;\n setup?: (\n this: ActorContext<\n Args,\n never,\n InMsg,\n OutMsg,\n Methods,\n Handlers,\n ReflectionMethods & ActorReflection\n >,\n args: Args,\n ) => Promise<InternalState> | InternalState;\n afterStart?: () => void | Promise<void>;\n onStopRequested?: () => HookResult | Promise<HookResult>;\n beforeEnd?: (reason?: unknown) => HookResult | Promise<HookResult>;\n afterEnd?: (reason?: unknown) => HookResult | Promise<HookResult>;\n onError?: (error?: unknown) => HookResult | Promise<HookResult>;\n onEmit?: (\n msg: OutMsg,\n sender: SenderInfo,\n ) => HookResult | Promise<HookResult>;\n\n onMessage?: (\n msg: InMsg,\n sender: SenderInfo,\n ) => HookResult | Promise<HookResult>;\n\n onUnhandled?: (msg: Message, sender: SenderInfo) => void | Promise<void>;\n\n onChildExit?: (\n name: string,\n reason: ExitMessage,\n ) => HookResult | Promise<HookResult>;\n\n handlers: Handlers &\n ThisType<\n ActorContext<\n Args,\n InternalState,\n InMsg,\n OutMsg,\n Methods,\n Handlers,\n ReflectionMethods & ActorReflection\n >\n >;\n\n methods?: Methods &\n ThisType<\n ActorContext<\n Args,\n InternalState,\n InMsg,\n OutMsg,\n Methods,\n Handlers,\n ReflectionMethods & ActorReflection\n >\n >;\n $reflectionMethods?: ReflectionMethods &\n ThisType<\n ActorContext<\n Args,\n InternalState,\n InMsg,\n OutMsg,\n Methods,\n Handlers,\n ActorReflection & ActorReflection\n >\n >;\n // for plugin use only\n $decorate?: Partial<ActorDecorated>;\n};\nexport type AnyConfig = ActorConfig<\n unknown,\n unknown,\n Message,\n Message,\n MethodOptions,\n HandlerOptions<Message>,\n ReflectionOptions\n>;\n\n// ── stop propagation sentinel ────────────────────────────────────────────\n\n/** Returned by onMessage hooks to prevent further dispatch. */\nexport const STOP_SENTINEL = Symbol(\"posipaki.stopPropagation\");\n\n/** Type-safe sentinel for short-circuiting onMessage hooks. */\nexport const stopPropagation = (): typeof STOP_SENTINEL => STOP_SENTINEL;\n\n// ── hook function types ──────────────────────────────────────────────────\n\n/** Return type of onMessage hooks: void (continue) or sentinel (stop). */\nexport type HookResult = void | typeof STOP_SENTINEL;\n// ── plugin types ─────────────────────────────────────────────────────────\n\n/** A reusable unit of actor behaviour. */\nexport type ActorPlugin<C = AnyConfig> = (config: C) => C | Promise<C>;\n\n/** Transform parent plugins into child plugins. */\nexport type PluginTransform = (parentPlugins: ActorPlugin[]) => ActorPlugin[];\n\nexport type ActorContext<\n Args,\n InternalState,\n InMsg extends Message,\n OutMsg extends Message,\n Methods extends MethodOptions,\n Handlers extends HandlerOptions<InMsg>,\n ReflectionMethods extends ReflectionOptions,\n> = Methods &\n ActorDecorated & {\n state: InternalState;\n name: string;\n id: symbol;\n\n emit: (msg: OutMsg) => void;\n agreeToStop: () => void;\n\n reflection: ThisType<\n ActorContext<\n Args,\n InternalState,\n InMsg,\n OutMsg,\n Methods,\n Handlers,\n ReflectionMethods\n >\n > &\n ReflectionMethods;\n exit: (reason?: unknown) => void;\n\n $child: Record<string, AnyProcess>;\n\n fork<\n A,\n S,\n IM extends Message,\n OM extends InMsg,\n R extends ReflectionOptions,\n >(\n actor: ActorDefinition<A, S, IM, OM, R>,\n args?: A,\n opts?: {\n name?: string;\n addPlugins?: ActorPlugin[];\n },\n ): Promise<AsyncProcess<A, HidePrivate<S>, IM, OM, R & ActorReflection>>;\n\n ctx: ProcessCtx<Args, HidePrivate<InternalState>, InMsg, OutMsg>;\n };\n","// ── Lifecycle Hooks ──────────────────────────────────────────────────────\n//\n// Extends ProcessCtx and defineActor with observable lifecycle hooks.\n// Hooks are additive — multiple callbacks can register for the same hook\n// point, and they fire in registration order.\n\nimport { STOP_SENTINEL, stopPropagation } from \"./actor-types.js\";\nimport type {\n HookResult,\n ActorPlugin,\n PluginTransform,\n AnyConfig,\n} from \"./actor-types.js\";\n\n// ── stop propagation sentinel ────────────────────────────────────────────\n\n// Re-exports from actor-types.ts (backward compatibility)\nexport { STOP_SENTINEL, stopPropagation };\nexport type { HookResult, ActorPlugin, PluginTransform };\n\n// ── type augmentation (Fastify-style) ────────────────────────────────────\n\n/**\n * Interface that plugins can augment via declaration merging.\n * Plugins ship a .d.ts that adds properties to this interface,\n * making them available on `this` in handlers and methods.\n *\n * Example (in a plugin's .d.ts):\n * declare module 'posipaki' {\n * interface ActorDecorated {\n * log: Logger;\n * }\n * }\n */\nexport interface ActorDecorated {}\nexport interface ActorReflection {}\n\n// ── chainHook ────────────────────────────────────────────────────────────\n\n/**\n * Compose two lifecycle hooks so that `plugin` fires first.\n *\n * If `plugin` returns the STOP_SENTINEL (via stopPropagation()),\n * `existing` is skipped entirely and the sentinel propagates.\n * Otherwise `existing` fires and its return value is used.\n *\n * Typical use in a plugin:\n * (cfg) => ({ ...cfg, onStart: chainHook(cfg.onStart, myOnStart) })\n *\n * @param existing - the current hook on the config (may be undefined)\n * @param plugin - the new hook to prepend\n * @returns a composed hook suitable for ActorConfig\n */\nexport function chainHook<TThis, TArgs extends unknown[]>(\n existing:\n | ((this: TThis, ...args: TArgs) => HookResult | Promise<HookResult>)\n | undefined,\n plugin: (this: TThis, ...args: TArgs) => HookResult | Promise<HookResult>,\n): (this: TThis, ...args: TArgs) => HookResult | Promise<HookResult> {\n if (!existing) return plugin;\n return async function (this: TThis, ...args: TArgs): Promise<HookResult> {\n const result = await plugin.call(this, ...args);\n if (result === STOP_SENTINEL) return result;\n return await existing.call(this, ...args);\n } as (this: TThis, ...args: TArgs) => HookResult | Promise<HookResult>;\n}\n\n// ── mergeConfigs ─────────────────────────────────────────────────────────\n\n/**\n * Merge an overlay config into a base config, auto-chaining every on* hook.\n *\n * Each key in `overlay` that starts with \"on\" followed by an uppercase\n * letter (onStart, onMessage, onEmit, etc.) is composed via chainHook()\n * so that the overlay hook fires before the base hook, and stopPropagation\n * is respected.\n *\n * Typical use in a plugin:\n * return mergeConfigs(cfg, {\n * onStart() { this.log.info('starting'); },\n * beforeEnd() { this.log.info('stopping'); },\n * });\n *\n * @param base - the existing config (ActorConfig)\n * @param overlay - new hook implementations to prepend\n * @returns a new config with hooks chained\n */\nexport function mergeConfigs<C extends AnyConfig>(base: C, overlay: Partial<C>): C {\n const result = { ...base } as Record<string, unknown>;\n for (const key of Object.keys(overlay as Record<string, unknown>)) {\n const val = (overlay as Record<string, unknown>)[key];\n if (typeof val === \"function\" && /^(on|after|before)[A-Z]/.test(key)) {\n result[key] = chainHook(\n (base as Record<string, unknown>)[key] as (\n this: unknown,\n ...args: unknown[]\n ) => HookResult | Promise<HookResult>,\n val as (\n this: unknown,\n ...args: unknown[]\n ) => HookResult | Promise<HookResult>,\n );\n } else {\n result[key] = val;\n }\n }\n result.$reflectionMethods = {};\n Object.assign(\n result.$reflectionMethods as object,\n \"$reflectionMethods\" in base ? base.$reflectionMethods : {},\n \"$reflectionMethods\" in overlay ? overlay.$reflectionMethods : {},\n );\n\n return result as unknown as C;\n}\n\nexport type Hook<T, I extends unknown[], O> = (this: T, ...args: I) => O;\n\nexport async function callHook<T, I extends unknown[], O>(\n fn: Hook<T, I, O> | undefined,\n eh: ((e: unknown) => unknown) | undefined,\n thisArg: T,\n ...args: I\n): Promise<O | undefined> {\n if (fn) {\n try {\n return await fn.call(thisArg, ...args);\n } catch (e) {\n if (eh) {\n try {\n await eh(e);\n } catch {}\n } else {\n throw e;\n }\n }\n }\n return undefined;\n}\n"],"mappings":";;AAqOA,MAAa,gBAAgB,OAAO,0BAA0B;;AAG9D,MAAa,wBAA8C;;;;;;;;;;;;;;;;;ACnL3D,SAAgB,UACd,UAGA,QACmE;CACnE,IAAI,CAAC,UAAU,OAAO;CACtB,OAAO,eAA6B,GAAG,MAAkC;EACvE,MAAM,SAAS,MAAM,OAAO,KAAK,MAAM,GAAG,IAAI;EAC9C,IAAI,WAAW,eAAe,OAAO;EACrC,OAAO,MAAM,SAAS,KAAK,MAAM,GAAG,IAAI;CAC1C;AACF;;;;;;;;;;;;;;;;;;;AAsBA,SAAgB,aAAkC,MAAS,SAAwB;CACjF,MAAM,SAAS,EAAE,GAAG,KAAK;CACzB,KAAK,MAAM,OAAO,OAAO,KAAK,OAAkC,GAAG;EACjE,MAAM,MAAO,QAAoC;EACjD,IAAI,OAAO,QAAQ,cAAc,0BAA0B,KAAK,GAAG,GACjE,OAAO,OAAO,UACX,KAAiC,MAIlC,GAIF;OAEA,OAAO,OAAO;CAElB;CACA,OAAO,qBAAqB,CAAC;CAC7B,OAAO,OACL,OAAO,oBACP,wBAAwB,OAAO,KAAK,qBAAqB,CAAC,GAC1D,wBAAwB,UAAU,QAAQ,qBAAqB,CAAC,CAClE;CAEA,OAAO;AACT;AAIA,eAAsB,SACpB,IACA,IACA,SACA,GAAG,MACqB;CACxB,IAAI,IACF,IAAI;EACF,OAAO,MAAM,GAAG,KAAK,SAAS,GAAG,IAAI;CACvC,SAAS,GAAG;EACV,IAAI,IACF,IAAI;GACF,MAAM,GAAG,CAAC;EACZ,QAAQ,CAAC;OAET,MAAM;CAEV;AAGJ"}
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-BD0dawkQ.js";
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-D6qtxITh.js";
2
2
  export { ActorDecorated, type ActorPlugin, ActorReflection, Hook, type HookResult, type PluginTransform, STOP_SENTINEL, callHook, chainHook, mergeConfigs, stopPropagation };
package/dist/hooks.js CHANGED
@@ -1,2 +1,2 @@
1
- import { a as stopPropagation, i as STOP_SENTINEL, n as chainHook, r as mergeConfigs, t as callHook } from "./hooks-Q4l5ggDj.js";
1
+ import { a as stopPropagation, i as STOP_SENTINEL, n as chainHook, r as mergeConfigs, t as callHook } from "./hooks-V-PEPJHv.js";
2
2
  export { STOP_SENTINEL, callHook, chainHook, mergeConfigs, stopPropagation };
package/dist/index.d.ts CHANGED
@@ -1,6 +1,6 @@
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-DLNOnoxX.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-BD0dawkQ.js";
3
- import { n as spawn, r as runDispatch, t as Process } from "./process-HHEBygG7.js";
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-BzM4YqJj.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-D6qtxITh.js";
3
+ import { n as spawn, r as runDispatch, t as Process } from "./process-YKyZJOvg.js";
4
4
 
5
5
  //#region src/adapters.d.ts
6
6
  declare function asyncify<A, S, IM extends Message, OM extends Message>(fn: ProcessFn<A, S, IM, OM>): AsyncProcessFn<A, S, IM, OM>;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","names":[],"sources":["../src/adapters.ts","../src/define-actor.ts"],"mappings":";;;;;iBAEgB,QAAA,kBAA0B,OAAA,aAAoB,OAAA,EAC5D,EAAA,EAAI,SAAA,CAAU,CAAA,EAAG,CAAA,EAAG,EAAA,EAAI,EAAA,IACvB,cAAA,CAAe,CAAA,EAAG,CAAA,EAAG,EAAA,EAAI,EAAA;;;iBCkCZ,cAAA,gBACC,OAAA,GAAU,OAAA,KACtB,aAAA,CAAc,MAAA;AAAA,iBA4DH,WAAA,oCAGA,OAAA,iBACC,OAAA,kBACC,aAAA,mBACC,cAAA,CAAe,KAAA,6BACN,iBAAA,EAE1B,MAAA,EAAQ,WAAA,CACN,IAAA,EACA,aAAA,EACA,KAAA,EACA,MAAA,EACA,OAAA,EACA,QAAA,EACA,iBAAA,IAED,eAAA,CAAgB,IAAA,EAAM,aAAA,EAAe,KAAA,EAAO,MAAA,EAAQ,iBAAA"}
1
+ {"version":3,"file":"index.d.ts","names":[],"sources":["../src/adapters.ts","../src/define-actor.ts"],"mappings":";;;;;iBAEgB,QAAA,kBAA0B,OAAA,aAAoB,OAAA,EAC5D,EAAA,EAAI,SAAA,CAAU,CAAA,EAAG,CAAA,EAAG,EAAA,EAAI,EAAA,IACvB,cAAA,CAAe,CAAA,EAAG,CAAA,EAAG,EAAA,EAAI,EAAA;;;iBCmCZ,cAAA,gBACC,OAAA,GAAU,OAAA,KACtB,aAAA,CAAc,MAAA;AAAA,iBA4DH,WAAA,oCAGA,OAAA,iBACC,OAAA,kBACC,aAAA,mBACC,cAAA,CAAe,KAAA,6BACN,iBAAA,EAE1B,MAAA,EAAQ,WAAA,CACN,IAAA,EACA,aAAA,EACA,KAAA,EACA,MAAA,EACA,OAAA,EACA,QAAA,EACA,iBAAA,IAED,eAAA,CAAgB,IAAA,EAAM,aAAA,EAAe,KAAA,EAAO,MAAA,EAAQ,iBAAA"}
package/dist/index.js CHANGED
@@ -1,4 +1,4 @@
1
- import { i as runDispatch } from "./util-DsfVKxTT.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-BaAtO8cf.js";
3
- import { a as stopPropagation, n as chainHook, r as mergeConfigs, t as callHook } from "./hooks-Q4l5ggDj.js";
1
+ import { i as runDispatch } from "./util-FmOqPdg-.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-fhiwGw91.js";
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,4 +1,4 @@
1
- import { n as ExitMessage, o as ProcessFn, r as Message } from "./types-DLNOnoxX.js";
1
+ import { n as ExitMessage, o as ProcessFn, r as Message } from "./types-BzM4YqJj.js";
2
2
 
3
3
  //#region src/pipe.d.ts
4
4
  /**
package/dist/pipe.js CHANGED
@@ -1,4 +1,4 @@
1
- import { i as runDispatch } from "./util-DsfVKxTT.js";
1
+ import { i as runDispatch } from "./util-FmOqPdg-.js";
2
2
  //#region src/pipe.ts
3
3
  /**
4
4
  * Chain process functions so each runs after the previous one exits.
@@ -1,5 +1,5 @@
1
- import { r as Message } from "../types-DLNOnoxX.js";
2
- import { d as ActorPlugin } from "../hooks-BD0dawkQ.js";
1
+ import { r as Message } from "../types-BzM4YqJj.js";
2
+ import { d as ActorPlugin } from "../hooks-D6qtxITh.js";
3
3
 
4
4
  //#region src/plugins/debug-logger.d.ts
5
5
  declare module "../index" {
@@ -1,4 +1,4 @@
1
- import { r as mergeConfigs } from "../hooks-Q4l5ggDj.js";
1
+ import { r as mergeConfigs } from "../hooks-V-PEPJHv.js";
2
2
  import { t as pnameMatch } from "../pname-match-ddweNtrI.js";
3
3
  //#region src/plugins/debug-logger.ts
4
4
  function patterns() {
@@ -1,4 +1,4 @@
1
- import { d as ActorPlugin } from "../hooks-BD0dawkQ.js";
1
+ import { d as ActorPlugin } from "../hooks-D6qtxITh.js";
2
2
 
3
3
  //#region src/plugins/tree-introspection.d.ts
4
4
  declare module "../index" {
@@ -1,4 +1,4 @@
1
- import { r as mergeConfigs } from "../hooks-Q4l5ggDj.js";
1
+ import { r as mergeConfigs } from "../hooks-V-PEPJHv.js";
2
2
  //#region src/plugins/tree-introspection.ts
3
3
  function inspect() {
4
4
  return async function inspectPlugin(config) {
@@ -1,4 +1,4 @@
1
- import { d as WithSender, m as AsyncProcess, n as ExitMessage, o as ProcessFn, r as Message } from "./types-DLNOnoxX.js";
1
+ import { m as AsyncProcess, n as ExitMessage, o as ProcessFn, r as Message, s as SenderInfo } from "./types-BzM4YqJj.js";
2
2
 
3
3
  //#region src/util.d.ts
4
4
  type ReducerClosure<M> = (msg: M) => void;
@@ -20,14 +20,14 @@ declare function runDispatch<M>(name: string, fn: ReducerClosure<M>, readyFn?: R
20
20
  //#endregion
21
21
  //#region src/process.d.ts
22
22
  /** @deprecated Use {@link spawnAsync} instead. */
23
- declare function spawn<A, S, IM extends Message = Message, OM extends Message = ExitMessage>(fn: ProcessFn<A, S, IM, OM>, pname: string, tp?: (m: WithSender<OM>) => void): (a: A) => Process<A, S, IM, OM>;
23
+ 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>;
24
24
  /** @deprecated Use {@link AsyncProcess} instead. Sync processes are
25
25
  * wrapped via asyncify internally; spawnAsync handles both. */
26
26
  declare class Process<A, S, IM extends Message, OM extends Message> extends AsyncProcess<A, S, IM, OM, {}> {
27
- constructor(fn: ProcessFn<A, S, IM, OM>, pname: string, tp?: (m: WithSender<OM>) => void);
27
+ constructor(fn: ProcessFn<A, S, IM, OM>, pname: string, tp?: (m: OM, from: SenderInfo) => void);
28
28
  start(a: A): this;
29
29
  tick(): Promise<void>;
30
30
  }
31
31
  //#endregion
32
32
  export { spawn as n, runDispatch as r, Process as t };
33
- //# sourceMappingURL=process-HHEBygG7.d.ts.map
33
+ //# sourceMappingURL=process-YKyZJOvg.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"process-YKyZJOvg.d.ts","names":[],"sources":["../src/util.ts","../src/process.ts"],"mappings":";;;KAOK,cAAA,OAAqB,GAAA,EAAK,CAAC;AAAA,KAC3B,OAAA;;;;;;iBAQK,WAAA,IACR,IAAA,UACA,EAAA,EAAI,cAAA,CAAe,CAAA,GACnB,OAAA,GAAS,OAAA,EACT,UAAA,aACC,SAAA,aAAsB,CAAA;AAdO;AAAA;;;;AACpB;AACC;;;;;iBCDG,KAAA,kBAGH,OAAA,GAAU,OAAA,aACV,OAAA,GAAU,WAAA,EAErB,EAAA,EAAI,SAAA,CAAU,CAAA,EAAG,CAAA,EAAG,EAAA,EAAI,EAAA,GACxB,KAAA,UACA,EAAA,IAAM,CAAA,EAAG,EAAA,EAAI,IAAA,EAAM,UAAA,aACjB,CAAA,EAAG,CAAA,KAAM,OAAA,CAAQ,CAAA,EAAG,CAAA,EAAG,EAAA,EAAI,EAAA;;;cAMzB,OAAA,kBAGO,OAAA,aACA,OAAA,UACH,YAAA,CAAa,CAAA,EAAG,CAAA,EAAG,EAAA,EAAI,EAAA;cAE7B,EAAA,EAAI,SAAA,CAAU,CAAA,EAAG,CAAA,EAAG,EAAA,EAAI,EAAA,GACxB,KAAA,UACA,EAAA,IAAM,CAAA,EAAG,EAAA,EAAI,IAAA,EAAM,UAAA;EAKrB,KAAA,CAAM,CAAA,EAAG,CAAA;EAIT,IAAA,IAAQ,OAAA;AAAA"}
@@ -1,5 +1,5 @@
1
- import { r as Message, t as AsyncProcessFn } from "../types-DLNOnoxX.js";
2
- import { _ as ReflectionOptions, h as MethodOptions, l as ActorDefinition, p as HandlerOptions } from "../hooks-BD0dawkQ.js";
1
+ import { r as Message, t as AsyncProcessFn } from "../types-BzM4YqJj.js";
2
+ import { _ as ReflectionOptions, h as MethodOptions, l as ActorDefinition, p as HandlerOptions } from "../hooks-D6qtxITh.js";
3
3
  import { FileHandle } from "node:fs/promises";
4
4
 
5
5
  //#region src/remote/child.d.ts
@@ -1,5 +1,5 @@
1
- import { s as spawnAsync, t as defineActor } from "../src-BaAtO8cf.js";
2
- import { a as stopPropagation } from "../hooks-Q4l5ggDj.js";
1
+ import { s as spawnAsync, t as defineActor } from "../src-fhiwGw91.js";
2
+ import { a as stopPropagation } from "../hooks-V-PEPJHv.js";
3
3
  import { open, unlink } from "node:fs/promises";
4
4
  import { createReadStream } from "node:fs";
5
5
  import * as readline from "node:readline";
@@ -192,8 +192,7 @@ async function runChild(fn) {
192
192
  ctx.parentId = parentId;
193
193
  return yield* fn(ctx, args);
194
194
  };
195
- const proc = spawnAsync(wrappedFn, "remote", (msgWithSender) => {
196
- const [msg, sender] = msgWithSender;
195
+ const proc = spawnAsync(wrappedFn, "remote", (msg, sender) => {
197
196
  transport.send(encode("$msg", {
198
197
  type: msg.type,
199
198
  fromName: sender.fromName,
@@ -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\", (msgWithSender) => {\n const [msg, sender] = msgWithSender;\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, 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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"}