posipaki 0.20.3 → 0.21.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 (39) hide show
  1. package/dist/{hooks-Q4l5ggDj.js → hooks-V-PEPJHv.js} +2 -2
  2. package/dist/hooks-V-PEPJHv.js.map +1 -0
  3. package/dist/{hooks-_rD3UIok.d.ts → hooks-fgRvVnDj.d.ts} +6 -4
  4. package/dist/hooks-fgRvVnDj.d.ts.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.js +3 -3
  9. package/dist/pipe.d.ts +1 -1
  10. package/dist/pipe.js +1 -1
  11. package/dist/plugins/debug-logger.d.ts +2 -2
  12. package/dist/plugins/debug-logger.js +1 -1
  13. package/dist/plugins/tree-introspection.d.ts +1 -1
  14. package/dist/plugins/tree-introspection.js +2 -2
  15. package/dist/plugins/tree-introspection.js.map +1 -1
  16. package/dist/{process-CSv4_HdZ.d.ts → process-CECMMHyR.d.ts} +2 -2
  17. package/dist/process-CECMMHyR.d.ts.map +1 -0
  18. package/dist/remote/index.d.ts +2 -2
  19. package/dist/remote/index.js +2 -2
  20. package/dist/{src--3MW7Bgq.js → src-DeIF0clC.js} +33 -6
  21. package/dist/src-DeIF0clC.js.map +1 -0
  22. package/dist/supervisor.d.ts +2 -2
  23. package/dist/supervisor.js +1 -1
  24. package/dist/testing/index.d.ts +2 -2
  25. package/dist/testing/index.js +3 -3
  26. package/dist/testing/index.js.map +1 -1
  27. package/dist/{types-D4ZgiRY9.d.ts → types-DYAxWeSM.d.ts} +12 -3
  28. package/dist/types-DYAxWeSM.d.ts.map +1 -0
  29. package/dist/{util-DsfVKxTT.js → util-FmOqPdg-.js} +17 -3
  30. package/dist/util-FmOqPdg-.js.map +1 -0
  31. package/dist/xfetch.d.ts +2 -2
  32. package/dist/xfetch.js +1 -1
  33. package/package.json +1 -1
  34. package/dist/hooks-Q4l5ggDj.js.map +0 -1
  35. package/dist/hooks-_rD3UIok.d.ts.map +0 -1
  36. package/dist/process-CSv4_HdZ.d.ts.map +0 -1
  37. package/dist/src--3MW7Bgq.js.map +0 -1
  38. package/dist/types-D4ZgiRY9.d.ts.map +0 -1
  39. package/dist/util-DsfVKxTT.js.map +0 -1
@@ -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 WithSender,\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: WithSender<OutMsg>) => 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":";;AAsOA,MAAa,gBAAgB,OAAO,0BAA0B;;AAG9D,MAAa,wBAA8C;;;;;;;;;;;;;;;;;ACpL3D,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"}
@@ -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-D4ZgiRY9.js";
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-DYAxWeSM.js";
2
2
 
3
3
  //#region src/actor-types.d.ts
4
4
  type ActorMessages<M extends Message> = {
@@ -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>;
@@ -93,6 +94,7 @@ type ActorContext<Args, InternalState, InMsg extends Message, OutMsg extends Mes
93
94
  $child: Record<string, AnyProcess>;
94
95
  fork<A, S, IM extends Message, OM extends InMsg, R extends ReflectionOptions>(actor: ActorDefinition<A, S, IM, OM, R>, args?: A, opts?: {
95
96
  name?: string;
97
+ addPlugins?: ActorPlugin[];
96
98
  }): Promise<AsyncProcess<A, HidePrivate<S>, IM, OM, R & ActorReflection>>;
97
99
  ctx: ProcessCtx<Args, HidePrivate<InternalState>, InMsg, OutMsg>;
98
100
  };
@@ -138,7 +140,7 @@ declare function chainHook<TThis, TArgs extends unknown[]>(existing: ((this: TTh
138
140
  * Typical use in a plugin:
139
141
  * return mergeConfigs(cfg, {
140
142
  * onStart() { this.log.info('starting'); },
141
- * onEnd() { this.log.info('stopping'); },
143
+ * beforeEnd() { this.log.info('stopping'); },
142
144
  * });
143
145
  *
144
146
  * @param base - the existing config (ActorConfig)
@@ -150,4 +152,4 @@ type Hook<T, I extends unknown[], O> = (this: T, ...args: I) => O;
150
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>;
151
153
  //#endregion
152
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 };
153
- //# sourceMappingURL=hooks-_rD3UIok.d.ts.map
155
+ //# sourceMappingURL=hooks-fgRvVnDj.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hooks-fgRvVnDj.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-_rD3UIok.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-fgRvVnDj.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-D4ZgiRY9.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-_rD3UIok.js";
3
- import { n as spawn, r as runDispatch, t as Process } from "./process-CSv4_HdZ.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-DYAxWeSM.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-fgRvVnDj.js";
3
+ import { n as spawn, r as runDispatch, t as Process } from "./process-CECMMHyR.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>;
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--3MW7Bgq.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-DeIF0clC.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-D4ZgiRY9.js";
1
+ import { n as ExitMessage, o as ProcessFn, r as Message } from "./types-DYAxWeSM.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-D4ZgiRY9.js";
2
- import { d as ActorPlugin } from "../hooks-_rD3UIok.js";
1
+ import { r as Message } from "../types-DYAxWeSM.js";
2
+ import { d as ActorPlugin } from "../hooks-fgRvVnDj.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-_rD3UIok.js";
1
+ import { d as ActorPlugin } from "../hooks-fgRvVnDj.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) {
@@ -6,7 +6,7 @@ function inspect() {
6
6
  ...config.$reflectionMethods,
7
7
  "inspect.getTree": function(prefix) {
8
8
  const children = [];
9
- for (const child of Object.values(this.$child)) {
9
+ for (const child of this.ctx.children) {
10
10
  const cr = child.$reflection;
11
11
  if (typeof cr["inspect.getTree"] === "function") {
12
12
  const sub = cr["inspect.getTree"](prefix);
@@ -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\";\n\ndeclare module \"../index\" {\n interface ActorReflection {\n \"inspect.getTree\": TreeReflectionMethods[\"inspect.getTree\"];\n \"inspect.getState\": TreeReflectionMethods[\"inspect.getState\"];\n \"inspect.stop\": TreeReflectionMethods[\"inspect.stop\"];\n }\n}\n\ninterface TreeReflectionMethods {\n \"inspect.getTree\": (prefix?: string) => TreeNode;\n \"inspect.getState\": () => unknown;\n \"inspect.stop\": () => void;\n}\n\nexport interface TreeNode {\n pname: string;\n parentName: string | null;\n children: TreeNode[];\n status: \"running\" | \"no introspection\";\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 Object.values(this.$child)) {\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.stop\": function () {\n this.exit(\"inspector\");\n },\n },\n });\n };\n}\n"],"mappings":";;AAyBA,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,OAAO,OAAO,KAAK,MAAM,GAAG;KAC9C,MAAM,KAAK,MAAM;KACjB,IAAI,OAAO,GAAG,uBAAuB,YAAY;MAC/C,MAAM,MAAM,GAAG,mBAAmB,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,WAAY;IAC1B,KAAK,KAAK,WAAW;GACvB;EACF,EACF,CAAC;CACH;AACF"}
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\";\n\ndeclare module \"../index\" {\n interface ActorReflection {\n \"inspect.getTree\": TreeReflectionMethods[\"inspect.getTree\"];\n \"inspect.getState\": TreeReflectionMethods[\"inspect.getState\"];\n \"inspect.stop\": TreeReflectionMethods[\"inspect.stop\"];\n }\n}\n\ninterface TreeReflectionMethods {\n \"inspect.getTree\": (prefix?: string) => TreeNode;\n \"inspect.getState\": () => unknown;\n \"inspect.stop\": () => void;\n}\n\nexport interface TreeNode {\n pname: string;\n parentName: string | null;\n children: TreeNode[];\n status: \"running\" | \"no introspection\";\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.stop\": function () {\n this.exit(\"inspector\");\n },\n },\n });\n };\n}\n"],"mappings":";;AAyBA,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,mBAAmB,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,WAAY;IAC1B,KAAK,KAAK,WAAW;GACvB;EACF,EACF,CAAC;CACH;AACF"}
@@ -1,4 +1,4 @@
1
- import { d as WithSender, m as AsyncProcess, n as ExitMessage, o as ProcessFn, r as Message } from "./types-D4ZgiRY9.js";
1
+ import { d as WithSender, m as AsyncProcess, n as ExitMessage, o as ProcessFn, r as Message } from "./types-DYAxWeSM.js";
2
2
 
3
3
  //#region src/util.d.ts
4
4
  type ReducerClosure<M> = (msg: M) => void;
@@ -30,4 +30,4 @@ declare class Process<A, S, IM extends Message, OM extends Message> extends Asyn
30
30
  }
31
31
  //#endregion
32
32
  export { spawn as n, runDispatch as r, Process as t };
33
- //# sourceMappingURL=process-CSv4_HdZ.d.ts.map
33
+ //# sourceMappingURL=process-CECMMHyR.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"process-CECMMHyR.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,UAAA,CAAW,EAAA,cAClB,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,UAAA,CAAW,EAAA;EAKtB,KAAA,CAAM,CAAA,EAAG,CAAA;EAIT,IAAA,IAAQ,OAAA;AAAA"}
@@ -1,5 +1,5 @@
1
- import { r as Message, t as AsyncProcessFn } from "../types-D4ZgiRY9.js";
2
- import { _ as ReflectionOptions, h as MethodOptions, l as ActorDefinition, p as HandlerOptions } from "../hooks-_rD3UIok.js";
1
+ import { r as Message, t as AsyncProcessFn } from "../types-DYAxWeSM.js";
2
+ import { _ as ReflectionOptions, h as MethodOptions, l as ActorDefinition, p as HandlerOptions } from "../hooks-fgRvVnDj.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--3MW7Bgq.js";
2
- import { a as stopPropagation } from "../hooks-Q4l5ggDj.js";
1
+ import { s as spawnAsync, t as defineActor } from "../src-DeIF0clC.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";
@@ -1,5 +1,5 @@
1
- import { n as defer, r as makeWaiter, t as debugLog } from "./util-DsfVKxTT.js";
2
- import { i as STOP_SENTINEL, t as callHook } from "./hooks-Q4l5ggDj.js";
1
+ import { a as withTimeout, n as defer, r as makeWaiter, t as debugLog } from "./util-FmOqPdg-.js";
2
+ import { i as STOP_SENTINEL, t as callHook } from "./hooks-V-PEPJHv.js";
3
3
  //#region src/adapters.ts
4
4
  function asyncify(fn) {
5
5
  return async function* (ctx, args) {
@@ -22,6 +22,8 @@ async function* runDispatchAsync(name, fn, readyFn = () => false, debugLevel = f
22
22
  }
23
23
  }
24
24
  const noop = () => null;
25
+ /** How long a parent waits for a child to stop before continuing shutdown. */
26
+ const CHILD_STOP_TIMEOUT_MS = 1e3;
25
27
  /**
26
28
  * A process driven by an async generator. Functionally identical to
27
29
  * {@link Process} but supports `await` inside reducers.
@@ -37,6 +39,7 @@ var AsyncProcess = class AsyncProcess {
37
39
  this.buffer = [];
38
40
  this.nextTick = null;
39
41
  this.children = [];
42
+ this.orphans = [];
40
43
  this.subscribers = [];
41
44
  this.pvtIsPaused = false;
42
45
  this.pvtTickInProgress = false;
@@ -70,6 +73,8 @@ var AsyncProcess = class AsyncProcess {
70
73
  parentId: parentId ?? null,
71
74
  fork: this.fork.bind(this),
72
75
  forkSync: this.forkSync.bind(this),
76
+ children: this.children,
77
+ orphans: this.orphans,
73
78
  sendSelf: (msg) => {
74
79
  this.send([msg, selfCtx]);
75
80
  },
@@ -99,7 +104,22 @@ var AsyncProcess = class AsyncProcess {
99
104
  yield* this.pgenerator(ctx, arg0);
100
105
  } finally {
101
106
  this.toAllChildren({ type: "STOP" });
102
- ctx.toParent({ type: "EXIT" });
107
+ const orphans = [...this.orphans];
108
+ const stopPromises = this.children.map(async (child) => {
109
+ try {
110
+ await withTimeout(child.wait(), CHILD_STOP_TIMEOUT_MS, "childStop");
111
+ } catch (e) {
112
+ if (e?.message !== "Timeout:childStop") throw e;
113
+ orphans.push(child);
114
+ console.warn(`posipaki: child "${child.pname}" did not stop within ${CHILD_STOP_TIMEOUT_MS}ms; continuing shutdown`);
115
+ }
116
+ });
117
+ await Promise.all(stopPromises);
118
+ ctx.toParent({
119
+ type: "EXIT",
120
+ orphans
121
+ });
122
+ if (ctx.afterExit) await ctx.afterExit();
103
123
  }
104
124
  }
105
125
  fork(fn, pname) {
@@ -224,7 +244,11 @@ var AsyncProcess = class AsyncProcess {
224
244
  * sender provenance (stamped by the child's `ctx.toParent` wrapper). */
225
245
  fromChild(msgAndSender) {
226
246
  const [msg, sender] = msgAndSender;
227
- if (msg.type === "EXIT") this.children = this.children.filter((p) => p.id !== sender.fromId);
247
+ if (msg.type === "EXIT") {
248
+ this.children = this.children.filter((p) => p.id !== sender.fromId);
249
+ const orphans = msg.orphans;
250
+ if (orphans && orphans.length > 0) this.orphans.push(...orphans);
251
+ }
228
252
  this.send(msgAndSender);
229
253
  }
230
254
  };
@@ -340,6 +364,9 @@ function defineActor(config) {
340
364
  }
341
365
  };
342
366
  actorCtxMap.set(ctx.id, self);
367
+ ctx.afterExit = async () => {
368
+ await callHook(assembly.afterEnd, assembly.onError, self, exitReason);
369
+ };
343
370
  for (const [k, v] of decorated) self[k] = v;
344
371
  await callHook(assembly.beforeStart, assembly.onError, self);
345
372
  if (assembly.setup) rawState = await assembly.setup.call(self, args);
@@ -368,7 +395,7 @@ function defineActor(config) {
368
395
  }
369
396
  if (msg.type !== "STOP" && !hookStopped) await callHook((assembly.handlers || {})[msg.type] || assembly.onUnhandled, assembly.onError, self, msg, sender);
370
397
  }, () => done);
371
- await callHook(assembly.onEnd, assembly.onError, self, exitReason);
398
+ await callHook(assembly.beforeEnd, assembly.onError, self, exitReason);
372
399
  };
373
400
  }
374
401
  function attachReflection(proc, reflectionMethods) {
@@ -410,4 +437,4 @@ function defineActor(config) {
410
437
  //#endregion
411
438
  export { AsyncProcess as a, asyncify as c, spawn as i, defineMessages as n, runDispatchAsync as o, Process as r, spawnAsync as s, defineActor as t };
412
439
 
413
- //# sourceMappingURL=src--3MW7Bgq.js.map
440
+ //# sourceMappingURL=src-DeIF0clC.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"src-DeIF0clC.js","names":[],"sources":["../src/adapters.ts","../src/process.async.ts","../src/process.ts","../src/define-actor.ts","../src/index.ts"],"sourcesContent":["import type { ProcessFn, AsyncProcessFn, Message } from \"./types.js\"\n\nexport function asyncify<A, S, IM extends Message, OM extends Message>(\n fn: ProcessFn<A, S, IM, OM>,\n): AsyncProcessFn<A, S, IM, OM> {\n return async function* (ctx, args) {\n yield* fn(ctx, args) as any\n }\n}\n","import { defer, makeWaiter, debugLog, withTimeout } from \"./util.js\";\nimport type { DeferredCall, Waiter } from \"./util.js\";\nimport type {\n Message,\n WithSender,\n SenderInfo,\n ExitMessage,\n StopMessage,\n ProcessCtx,\n AsyncProcessFn,\n ProcessFn,\n} from \"./types.js\";\nimport { asyncify } from \"./adapters.js\";\n\n// ---- types ------------------------------------------------------------------\n\n/** An async iterator over process state. Receives `WithSender<InMessage | StopMessage>`. */\ntype AsyncProcessGenerator<\n ProcessState,\n InMessage extends Message,\n> = AsyncGenerator<\n ProcessState | null,\n void,\n WithSender<InMessage | StopMessage>\n>;\n\ntype NotifyFn = () => void;\n\n// ---- runDispatchAsync -------------------------------------------------------\n\ntype AsyncReducer<M> = (msg: M) => Promise<void>;\ntype ReadyFn = () => boolean;\n\n/**\n * Async equivalent of `runDispatch`. Loops, yielding `null` and feeding\n * each incoming message to an `async` reducer. Exits when `readyFn()`\n * returns true.\n */\nexport async function* runDispatchAsync<M>(\n name: string,\n fn: AsyncReducer<M>,\n readyFn: ReadyFn = () => false,\n debugLevel = false,\n): AsyncGenerator<null, void, M> {\n let msg: M;\n while (!readyFn()) {\n msg = yield null;\n debugLog(debugLevel, \"msg\", name, \" <- \", msg);\n await fn(msg);\n }\n}\n\n// ---- AsyncProcess -----------------------------------------------------------\n\ntype ProcessMessageCb<M> = (msg: M) => void;\n\nconst noop = () => null;\n\n/** How long a parent waits for a child to stop before continuing shutdown. */\nconst CHILD_STOP_TIMEOUT_MS = 1_000;\n\n/**\n * A process driven by an async generator. Functionally identical to\n * {@link Process} but supports `await` inside reducers.\n *\n * Messages are processed **one at a time** — if a tick is already\n * in-flight, new messages are buffered and processed when the current\n * tick completes.\n */\nexport class AsyncProcess<\n Args,\n State,\n InMessage extends Message,\n OutMessage extends Message,\n ReflectionMethods extends object,\n> {\n /** Reflection methods. Empty by default — defineActor fills in configured methods. */\n $reflection: ReflectionMethods = {} as ReflectionMethods;\n pgenerator: AsyncProcessFn<Args, State, InMessage, OutMessage>;\n pname: string;\n /** Called for every message sent via `ctx.toParent`. Receives `WithSender<OutMessage>`. */\n toParent: ProcessMessageCb<WithSender<OutMessage>>;\n id: symbol;\n state: State | null;\n\n private current: AsyncProcessGenerator<State, InMessage> | null = null;\n /** Every buffered message carries sender provenance. */\n private buffer: Array<WithSender<InMessage | StopMessage>> = [];\n private nextTick: DeferredCall | null = null;\n /** Child processes forked from this one (any fork method). */\n children: Array<\n AsyncProcess<unknown, unknown, Message, Message, {}>\n > = [];\n /** Children inherited from a child that exited (see ctx-orphans proposal). */\n orphans: Array<\n AsyncProcess<unknown, unknown, Message, Message, {}>\n > = [];\n private subscribers: Array<NotifyFn> = [];\n private exitWaiter: Waiter;\n private pvtIsPaused: boolean = false;\n private pvtTickInProgress: boolean = false;\n private pvtExitReject: ((e: unknown) => void) | null = null;\n private pvtReady!: Waiter;\n private pvtResolveReady!: () => void;\n\n constructor(\n fn: AsyncProcessFn<Args, State, InMessage, OutMessage>,\n pname: string,\n toParent: ProcessMessageCb<WithSender<OutMessage>> | undefined,\n ) {\n this.pgenerator = fn;\n this.pname = pname;\n this.toParent =\n toParent || (noop as ProcessMessageCb<WithSender<OutMessage>>);\n this.id = Symbol(pname);\n this.state = null;\n this.exitWaiter = makeWaiter();\n this.pvtReady = makeWaiter();\n this.pvtResolveReady = this.pvtReady.resolve;\n }\n\n /** Promise that resolves once the initial state is available. */\n ready(): Promise<void> {\n return this.pvtReady.promise;\n }\n\n // ---- lifecycle ------------------------------------------------------------\n\n /**\n * Kick off the async generator. The first `yield` sets the initial\n * state; for async generators this happens in a microtask.\n */\n start(arg0: Args, parentName?: string | null, parentId?: symbol | null) {\n const selfCtx: SenderInfo = { fromName: this.pname, fromId: this.id };\n\n const ctx: ProcessCtx<Args, State, InMessage, OutMessage | ExitMessage> = {\n pname: this.pname,\n id: this.id,\n parentName: parentName ?? null,\n parentId: parentId ?? null,\n fork: this.fork.bind(this),\n forkSync: this.forkSync.bind(this),\n children: this.children,\n orphans: this.orphans,\n sendSelf: (msg) => {\n this.send([msg, selfCtx]);\n },\n toParent: (msg) => {\n this.toParent([msg, selfCtx] as WithSender<OutMessage>);\n },\n };\n\n this.current = this.pvtWatchExit(ctx, arg0);\n void this.current.next().then((ret: IteratorResult<State | null, void>) => {\n this.state = ret.value ?? null;\n this.pvtResolveReady();\n if (ret.done) {\n this.exitWaiter.resolve();\n return;\n }\n // Advance past the initial yield so the pvtWatchExit generator\n // runs its finally block (EXIT/STOP) and the inner generator\n // enters its dispatch loop.\n const advance: WithSender<InMessage | StopMessage> = [\n { type: \"__ADVANCE__\" } as InMessage,\n {\n fromName: \"__internal__\",\n fromId: Symbol(\"__internal__\"),\n } as SenderInfo,\n ];\n this.pvtEatResult(this.current!.next(advance));\n });\n return this;\n }\n\n /** Wrap the user's generator so EXIT/STOP logic fires on completion. */\n private async *pvtWatchExit(\n ctx: ProcessCtx<Args, State, InMessage, OutMessage | ExitMessage>,\n arg0: Args,\n ): AsyncProcessGenerator<State, InMessage> {\n try {\n yield* this.pgenerator(ctx, arg0);\n } finally {\n // Cascade: STOP every child and await its generator stopping.\n this.toAllChildren({ type: \"STOP\" });\n\n const orphans: Array<AnyProcess> = [...this.orphans];\n const stopPromises = this.children.map(async (child) => {\n try {\n const ret = await withTimeout(child.wait(), CHILD_STOP_TIMEOUT_MS, 'childStop');\n } catch (e) {\n if ((e as Error)?.message !== 'Timeout:childStop') {\n throw e;\n }\n\n orphans.push(child);\n console.warn(\n `posipaki: child \"${child.pname}\" did not stop within ${CHILD_STOP_TIMEOUT_MS}ms; continuing shutdown`,\n );\n }\n });\n\n await Promise.all(stopPromises);\n // Hand surviving children and inherited orphans up to the parent for adoption (see ctx-orphans proposal).\n // In-process only.\n ctx.toParent({ type: \"EXIT\", orphans });\n if (ctx.afterExit) await ctx.afterExit();\n }\n }\n\n // ---- fork -----------------------------------------------------------------\n\n fork<ChildArgs, ChildState, ChildIM extends Message, ChildOM extends Message>(\n fn: AsyncProcessFn<ChildArgs, ChildState, ChildIM, ChildOM>,\n pname: string,\n ): (\n args: ChildArgs,\n ) => AsyncProcess<ChildArgs, ChildState, ChildIM, ChildOM, {}> {\n return (args: ChildArgs) => {\n const child = new AsyncProcess<\n ChildArgs,\n ChildState,\n ChildIM,\n ChildOM,\n {}\n >(\n fn,\n pname,\n this.fromChild.bind(this) as unknown as ProcessMessageCb<\n WithSender<ChildOM>\n >,\n );\n this.children.push(\n child as unknown as AsyncProcess<\n unknown,\n unknown,\n Message,\n Message,\n {}\n >,\n );\n child.start(args, this.pname, this.id);\n return child;\n };\n }\n\n forkSync<\n ChildArgs,\n ChildState,\n ChildIM extends Message,\n ChildOM extends InMessage,\n >(\n fn: ProcessFn<ChildArgs, ChildState, ChildIM, ChildOM>,\n pname: string,\n ): (\n args: ChildArgs,\n ) => AsyncProcess<ChildArgs, ChildState, ChildIM, ChildOM, {}> {\n return this.fork(asyncify(fn), pname);\n }\n\n // ---- message processing ---------------------------------------------------\n\n protected async pvtTick(): Promise<void> {\n if (!this.current || this.pvtTickInProgress) return;\n\n this.pvtTickInProgress = true;\n try {\n let msgAndSender: WithSender<InMessage | StopMessage> | undefined;\n let ret: IteratorResult<State | null, void> | null = null;\n while ((msgAndSender = this.buffer.shift()) !== undefined) {\n ret = await this.pvtSafeNext(msgAndSender);\n if (!ret || ret.done) break;\n }\n this.notify();\n this.pvtEatResult(ret);\n } catch (e) {\n this.pvtExitReject?.(e);\n this.pvtExitReject = null;\n } finally {\n this.pvtTickInProgress = false;\n }\n }\n\n /** Call `.next()` and redirect unhandled rejections. */\n private async pvtSafeNext(\n msgAndSender: WithSender<InMessage | StopMessage>,\n ): Promise<IteratorResult<State | null, void> | null> {\n try {\n return await this.current!.next(msgAndSender);\n } catch (e) {\n this.pvtExitReject?.(e);\n this.pvtExitReject = null;\n return { done: true, value: undefined };\n }\n }\n\n private pvtEatResult(\n ret:\n | IteratorResult<State | null, void>\n | Promise<IteratorResult<State | null, void>>\n | null,\n ): void {\n if (!ret) return;\n Promise.resolve(ret).then((r) => {\n if (r.done) {\n this.exitWaiter.resolve();\n }\n });\n }\n\n /** Broadcast a message to all children. */\n toAllChildren(msg: Message): void {\n const stamp: SenderInfo = { fromName: this.pname, fromId: this.id };\n this.children.forEach((p) => p.send([msg, stamp] as WithSender<Message>));\n }\n\n /** Stamp and enqueue a message from a named sender (external API). */\n send(msg: InMessage | StopMessage, from?: SenderInfo): void;\n /** Enqueue a pre-stamped message (internal: fromChild, toAllChildren). */\n send(msgAndSender: WithSender<InMessage | StopMessage>): void;\n send(\n msgOrTuple: InMessage | StopMessage | WithSender<InMessage | StopMessage>,\n from?: SenderInfo,\n ): void {\n if (\"type\" in msgOrTuple) {\n this.buffer.push([\n msgOrTuple as InMessage | StopMessage,\n from as SenderInfo,\n ]);\n } else {\n this.buffer.push(msgOrTuple as WithSender<InMessage | StopMessage>);\n }\n this.pvtScheduleTick();\n }\n\n /**\n * Synchronously flush the buffer. For sync processes use {@link Process.tick};\n * for async processes this is **not guaranteed** to process everything\n * immediately if reducers contain `await`. Prefer `send()` + `await proc.wait()`.\n */\n tick(): void {\n this.nextTick?.flush();\n this.nextTick = null;\n }\n\n private pvtScheduleTick(): void {\n if (this.pvtIsPaused) return;\n\n this.nextTick?.cancel();\n this.nextTick = defer(() => {\n this.nextTick = null;\n void this.pvtTick();\n });\n }\n\n // ---- subscribers ----------------------------------------------------------\n\n notify(): void {\n this.subscribers.forEach((f) => f());\n }\n\n get isListenedTo(): boolean {\n return this.subscribers.length > 0;\n }\n\n subscribe(f: NotifyFn): () => void {\n this.subscribers.push(f);\n return () => {\n const idx = this.subscribers.indexOf(f);\n if (idx < 0) return;\n this.subscribers.splice(idx, 1);\n };\n }\n\n // ---- pause / resume -------------------------------------------------------\n\n pause(): void {\n this.nextTick?.cancel();\n this.nextTick = null;\n this.pvtIsPaused = true;\n }\n\n resume(): void {\n this.pvtIsPaused = false;\n this.pvtScheduleTick();\n }\n\n // ---- waiting --------------------------------------------------------------\n\n /**\n * Returns a promise that resolves when the generator completes, or\n * rejects if an unhandled error occurs during message processing.\n */\n wait(): Promise<void> {\n return new Promise<void>((resolve, reject) => {\n this.pvtExitReject = reject;\n\n this.exitWaiter.promise.then(\n () => {\n this.pvtExitReject = null;\n resolve();\n },\n (e) => {\n this.pvtExitReject = null;\n reject(e);\n },\n );\n });\n }\n\n // ---- child messages -------------------------------------------------------\n\n /** Relays a child's message to this process. The message already carries\n * sender provenance (stamped by the child's `ctx.toParent` wrapper). */\n private fromChild(msgAndSender: WithSender<InMessage | StopMessage>): void {\n const [msg, sender] = msgAndSender;\n if (msg.type === \"EXIT\") {\n // sender.fromId === child's id (set by child's ctx.toParent wrapper)\n this.children = this.children.filter((p) => p.id !== sender.fromId);\n const orphans = (msg as ExitMessage).orphans;\n if (orphans && orphans.length > 0) {\n this.orphans.push(...orphans);\n }\n }\n this.send(msgAndSender);\n }\n}\nexport type AnyProcess = AsyncProcess<unknown, unknown, Message, Message, {}>;\n// ---- spawnAsync -------------------------------------------------------------\n\n/**\n * Spawn a new async process. Accepts both sync and async process\n * functions — sync ones are automatically wrapped with {@link asyncify}.\n */\nexport function spawnAsync<\n Args,\n State,\n InMessage extends Message = Message,\n OutMessage extends Message = ExitMessage,\n>(\n fn: AsyncProcessFn<Args, State, InMessage, OutMessage>,\n pname: string,\n toParent?: ProcessMessageCb<WithSender<OutMessage>>,\n): (args: Args) => AsyncProcess<Args, State, InMessage, OutMessage, {}> {\n return (args: Args) => {\n const proc = new AsyncProcess<Args, State, InMessage, OutMessage, {}>(\n fn,\n pname,\n toParent,\n );\n proc.start(args);\n return proc;\n };\n}\n","import { AsyncProcess } from \"./process.async.js\";\nimport { asyncify } from \"./adapters.js\";\nimport type { Message, WithSender, ExitMessage, ProcessFn } from \"./types.js\";\n\nexport type { Message, ProcessFn, ProcessCtx } from \"./types.js\";\nexport { runDispatch } from \"./util.js\";\n\n/** @deprecated Use {@link spawnAsync} instead. */\nexport function spawn<\n A,\n S,\n IM extends Message = Message,\n OM extends Message = ExitMessage,\n>(\n fn: ProcessFn<A, S, IM, OM>,\n pname: string,\n tp?: (m: WithSender<OM>) => void,\n): (a: A) => Process<A, S, IM, OM> {\n return (a: A) => new Process(fn, pname, tp).start(a);\n}\n\n/** @deprecated Use {@link AsyncProcess} instead. Sync processes are\n * wrapped via asyncify internally; spawnAsync handles both. */\nclass Process<\n A,\n S,\n IM extends Message,\n OM extends Message,\n> extends AsyncProcess<A, S, IM, OM, {}> {\n constructor(\n fn: ProcessFn<A, S, IM, OM>,\n pname: string,\n tp?: (m: WithSender<OM>) => void,\n ) {\n super(asyncify(fn), pname, tp);\n }\n\n start(a: A) {\n super.start(a);\n return this;\n }\n tick(): Promise<void> {\n return super.pvtTick();\n }\n}\n\nexport { Process };\n","// ── defineActor — high-level actor wrapper ───────────────────────────────────\n//\n// Compiles a declarative config into an AsyncProcessFn. Built on top of\n// the existing runDispatchAsync / spawnAsync primitives.\n//\nimport {\n type AsyncProcess,\n runDispatchAsync,\n spawnAsync,\n AnyProcess,\n} from \"./process.async.js\";\nimport type {\n WithSender,\n AsyncProcessFn,\n Message,\n ExitMessage,\n ProcessCtx,\n} from \"./types.js\";\nimport type {\n ActorDefinition,\n ActorConfig,\n ActorContext,\n MethodOptions,\n ActorMessages,\n HandlerOptions,\n HandlerFn,\n ReflectionOptions,\n AnyConfig,\n HidePrivate,\n} from \"./actor-types.js\";\nimport { STOP_SENTINEL } from \"./actor-types.js\";\nimport {\n ActorDecorated,\n type ActorPlugin,\n ActorReflection,\n callHook,\n} from \"./hooks.js\";\n\nexport function defineMessages<\n OutMsg extends Message = Message,\n>(): ActorMessages<OutMsg> {\n return undefined as unknown as ActorMessages<OutMsg>;\n}\n\nfunction hidePrivate<T>(value: T): HidePrivate<T> {\n if (\n value &&\n typeof value === \"object\" &&\n \"private\" in value &&\n \"public\" in value\n ) {\n return value.public as HidePrivate<T>;\n }\n return value as HidePrivate<T>;\n}\n\nfunction resolvePlugins(\n raw: ActorPlugin[] | ((parents: ActorPlugin[]) => ActorPlugin[]) | undefined,\n parentPlugins?: ActorPlugin[],\n addPlugins?: ActorPlugin[],\n): ActorPlugin[] {\n const resolved =\n !raw ? (parentPlugins ? [...parentPlugins] : [])\n : Array.isArray(raw) ? [...raw]\n : raw(parentPlugins ?? []);\n\n const combined = addPlugins ? [...resolved, ...addPlugins] : resolved;\n\n // Deduplicate by function name\n const seen = new Set<string>();\n return combined.filter((p) => {\n const name = p.name;\n if (!name) {\n console.warn(\"posipaki: plugin has no name, dedup won't work\");\n return true;\n }\n if (seen.has(name)) return false;\n seen.add(name);\n return true;\n });\n}\n\nasync function assembleActor<C>(config: C, plugins: ActorPlugin[], addPlugins?: ActorPlugin[]): Promise<C> {\n // Work with the default ActorPlugin type internally, cast back on return\n let cur = config as AnyConfig;\n for (const p of plugins) {\n try {\n cur = await p(cur);\n } catch (e: unknown) {\n console.error(\n `[assembleActor] plugin \"${p.name || \"?\"}\" failed:`,\n e,\n );\n }\n }\n cur.resolvedPlugins = plugins;\n if (addPlugins) cur.addPlugins = addPlugins;\n return cur as C;\n}\n\nexport function defineActor<\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>(\n config: ActorConfig<\n Args,\n InternalState,\n InMsg,\n OutMsg,\n Methods,\n Handlers,\n ReflectionMethods\n >,\n): ActorDefinition<Args, InternalState, InMsg, OutMsg, ReflectionMethods> {\n const actorCtxMap = new Map<\n symbol,\n ActorContext<\n Args,\n InternalState,\n InMsg,\n OutMsg,\n Methods,\n Handlers,\n ReflectionMethods\n >\n >();\n\n function makeRuntime(\n assembly: ActorConfig<\n Args,\n InternalState,\n InMsg,\n OutMsg,\n Methods,\n Handlers,\n ReflectionMethods\n >,\n ): AsyncProcessFn<Args, HidePrivate<InternalState>, InMsg, OutMsg> {\n return async function* (\n ctx,\n args,\n ): AsyncGenerator<\n HidePrivate<InternalState | null>,\n void,\n WithSender<InMsg>\n > {\n let done = false;\n let exitReason: unknown;\n let rawState: InternalState = undefined as unknown as InternalState;\n\n const decorated = new Map();\n const self: ActorContext<\n Args,\n InternalState,\n InMsg,\n OutMsg,\n Methods,\n Handlers,\n ReflectionMethods & ActorReflection\n > = {\n ctx,\n ...((assembly.methods || {}) as Methods),\n ...((assembly.$decorate || {}) as ActorDecorated),\n reflection: {} as ReflectionMethods & ActorReflection,\n state: rawState,\n name: ctx.pname,\n id: ctx.id,\n async emit(msg: OutMsg) {\n await callHook(assembly.onEmit, undefined, self, msg, {\n fromName: ctx.pname,\n fromId: ctx.id,\n });\n ctx.toParent(msg);\n },\n agreeToStop() {\n exitReason = \"stopped\";\n done = true;\n },\n exit(reason: unknown) {\n exitReason = reason;\n done = true;\n },\n $child: {} as Record<string, AnyProcess>,\n decorators: {},\n fork: async <\n A,\n S,\n IM extends Message,\n OM extends InMsg,\n R extends ReflectionOptions,\n >(\n childActor: ActorDefinition<A, S, IM, OM, R>,\n childArgs?: A,\n forkOpts?: { name?: string; addPlugins?: ActorPlugin[] },\n ): Promise<AsyncProcess<A, HidePrivate<S>, IM, OM, R & ActorReflection>> => {\n let child: AsyncProcess<A, HidePrivate<S>, IM, OM, R & ActorReflection>;\n const childName =\n forkOpts?.name ??\n childActor?.name ??\n `child-${Object.keys(self.$child).length}`;\n const treeName = `${ctx.pname}:${childName}`;\n const childAddPlugins = [\n ...(assembly.addPlugins || []),\n ...(forkOpts?.addPlugins || []),\n ];\n child = await childActor.spawnAsChild(\n ctx,\n childArgs!,\n {\n name: treeName,\n parentPlugins: assembly.resolvedPlugins || [],\n ...(childAddPlugins.length ? { addPlugins: childAddPlugins } : {}),\n },\n );\n self.$child[child.pname] = child as unknown as AnyProcess;\n return child;\n },\n };\n actorCtxMap.set(ctx.id, self);\n ctx.afterExit = async () => {\n await callHook(assembly.afterEnd, assembly.onError, self, exitReason);\n };\n\n for (const [k, v] of decorated) {\n (self as Record<string, unknown>)[k] = v;\n }\n\n await callHook(\n assembly.beforeStart,\n assembly.onError,\n self as ActorContext<\n Args,\n never, // state not set yet\n InMsg,\n OutMsg,\n Methods,\n Handlers,\n ReflectionMethods & ActorReflection\n >,\n );\n\n if (assembly.setup) {\n rawState = await assembly.setup.call(\n self as ActorContext<\n Args,\n never, // break inference cycle here\n InMsg,\n OutMsg,\n Methods,\n Handlers,\n ReflectionMethods & ActorReflection\n >,\n args,\n );\n } else {\n rawState = null as InternalState;\n }\n self.state = rawState;\n yield hidePrivate(rawState);\n await callHook(assembly.afterStart, assembly.onError, self);\n\n yield* runDispatchAsync<WithSender<InMsg | ExitMessage>>(\n ctx.pname,\n async (stamped) => {\n const [msg, sender] = stamped;\n if (msg.type === \"STOP\") {\n if (assembly.onStopRequested) {\n await callHook(assembly.onStopRequested, assembly.onError, self);\n // Hook may call agreeToStop(). If not, actor keeps running.\n } else {\n exitReason = \"stopped\";\n done = true;\n }\n return;\n }\n if (msg.type === \"EXIT\") {\n const childName = sender.fromName;\n if (childName && self.$child[childName]) {\n delete self.$child[childName];\n }\n await callHook(\n assembly.onChildExit,\n assembly.onError,\n self,\n childName,\n msg as ExitMessage,\n );\n }\n let hookStopped = false;\n if (\n msg.type !== \"STOP\" &&\n msg.type !== \"EXIT\" &&\n assembly.onMessage\n ) {\n const result = await callHook(\n assembly.onMessage,\n assembly.onError,\n self,\n msg as InMsg,\n sender,\n );\n if (result === STOP_SENTINEL) hookStopped = true;\n }\n if (msg.type !== \"STOP\" && !hookStopped) {\n const handler =\n ((assembly.handlers || ({} as Handlers))[\n msg.type as keyof Handlers\n ] as HandlerFn<InMsg>) || assembly.onUnhandled;\n\n await callHook(\n handler,\n assembly.onError,\n self,\n msg as InMsg,\n sender,\n );\n }\n },\n () => done,\n );\n\n await callHook(assembly.beforeEnd, assembly.onError, self, exitReason);\n };\n }\n\n type ReflectableProcess = {\n id: symbol;\n $reflection: Record<string, Function>;\n };\n function attachReflection(\n proc: ReflectableProcess,\n reflectionMethods: ReflectionMethods | undefined,\n ): void {\n if (!reflectionMethods) return;\n const self = actorCtxMap.get(proc.id);\n const refl = proc.$reflection as Record<string, Function>;\n for (const [k, m] of Object.entries(reflectionMethods)) {\n refl[k] = m.bind(self);\n }\n }\n\n return {\n fn: makeRuntime(config),\n name: config.name,\n pvtPluginsRaw: config.plugins,\n inMessages: config.inMessages,\n outMessages: config.outMessages,\n async spawn(\n args: Args,\n opts?: {\n name?: string;\n toParent?: (msg: WithSender<OutMsg>) => void;\n addPlugins?: ActorPlugin[];\n },\n ): Promise<\n AsyncProcess<\n Args,\n HidePrivate<InternalState>,\n InMsg,\n OutMsg,\n ReflectionMethods & ActorReflection\n >\n > {\n const plugs = resolvePlugins(config.plugins, undefined, opts?.addPlugins);\n const assembly = await assembleActor(config, plugs, opts?.addPlugins);\n const runtime = makeRuntime(assembly);\n const proc = spawnAsync(runtime, opts?.name ?? assembly.name ?? \"actor\", opts?.toParent)(args);\n attachReflection(proc, assembly.$reflectionMethods as ReflectionMethods);\n return proc as AsyncProcess<\n Args,\n HidePrivate<InternalState>,\n InMsg,\n OutMsg,\n ReflectionMethods & ActorReflection\n >;\n },\n async spawnAsChild(\n ctx: ProcessCtx<unknown, unknown, OutMsg, Message>,\n args: Args,\n opts?: {\n name?: string;\n parentPlugins?: ActorPlugin[];\n addPlugins?: ActorPlugin[];\n },\n ) {\n const plugs = resolvePlugins(config.plugins, opts?.parentPlugins, opts?.addPlugins);\n const assembly = await assembleActor(config, plugs, opts?.addPlugins);\n const runtime = makeRuntime(assembly);\n const proc = ctx.fork(runtime, opts?.name ?? assembly.name ?? \"child\")(args);\n attachReflection(proc, assembly.$reflectionMethods as ReflectionMethods);\n return proc as AsyncProcess<\n Args,\n HidePrivate<InternalState>,\n InMsg,\n OutMsg,\n ReflectionMethods & ActorReflection\n >;\n },\n };\n}\n","/**\n * Posipaki — Erlang-inspired lightweight actor processes built on\n * generator functions. Processes communicate via message-passing,\n * can fork children, and expose their state reactively.\n *\n * @module\n */\n\nimport { Process, spawn } from \"./process.js\";\nimport { runDispatch } from \"./util.js\";\nimport { AsyncProcess, spawnAsync, runDispatchAsync } from \"./process.async.js\";\nimport { asyncify } from \"./adapters.js\";\n\nexport { Process, spawn, runDispatch };\nexport { AsyncProcess, spawnAsync, runDispatchAsync, asyncify };\nexport type { AnyProcess } from \"./process.async.js\";\n\nexport type {\n Message,\n WithSender,\n WithoutSender,\n ExitMessage,\n StopMessage,\n ProcessFn,\n ProcessCtx,\n AsyncProcessFn,\n PipeState,\n SupervisorState,\n SenderOrigin,\n SenderInfo,\n} from \"./types.js\";\n\nexport { defineActor, defineMessages } from \"./define-actor.js\";\nexport type {\n ActorDefinition,\n SpawnedFrom,\n ActorConfig,\n ActorContext,\n MethodOptions,\n HandlerOptions,\n HandlerFn,\n} from \"./actor-types.js\";\n\n// ── hooks ─────────────────────────────────────────────────────────────────\n\nexport { stopPropagation, mergeConfigs, chainHook, callHook } from \"./hooks.js\";\nexport type {\n HookResult,\n ActorPlugin,\n ActorDecorated,\n ActorReflection,\n PluginTransform,\n} from \"./hooks.js\";\n"],"mappings":"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"}
@@ -1,5 +1,5 @@
1
- import { a as ProcessCtx, d as WithSender, n as ExitMessage, o as ProcessFn } from "./types-D4ZgiRY9.js";
2
- import { t as Process } from "./process-CSv4_HdZ.js";
1
+ import { a as ProcessCtx, d as WithSender, n as ExitMessage, o as ProcessFn } from "./types-DYAxWeSM.js";
2
+ import { t as Process } from "./process-CECMMHyR.js";
3
3
 
4
4
  //#region src/supervisor.d.ts
5
5
  type SupMsg = ExitMessage | RunMsg | StopMsg | ErrorMsg | OkMsg;
@@ -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/supervisor.ts
3
3
  /**
4
4
  * A supervisor process. Call `attach` to send it `RUN` messages —
@@ -1,5 +1,5 @@
1
- import { r as Message } from "../types-D4ZgiRY9.js";
2
- import { d as ActorPlugin } from "../hooks-_rD3UIok.js";
1
+ import { r as Message } from "../types-DYAxWeSM.js";
2
+ import { d as ActorPlugin } from "../hooks-fgRvVnDj.js";
3
3
 
4
4
  //#region src/testing/msg-matcher.d.ts
5
5
  type Matcher<M extends Message> = (msg: M, history: M[]) => boolean;
@@ -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/testing/msg-matcher.ts
4
4
  function shallowMatch(msg, spec) {
@@ -56,7 +56,7 @@ function createCollector(filter, opts) {
56
56
  messages.push(msg);
57
57
  checkAndNotify();
58
58
  },
59
- onEnd() {
59
+ beforeEnd() {
60
60
  const ws = waiters.splice(0);
61
61
  for (const w of ws) w({
62
62
  ok: false,
@@ -85,7 +85,7 @@ function createRootTracker() {
85
85
  beforeStart() {
86
86
  roots.add(this.ctx);
87
87
  },
88
- onEnd() {
88
+ afterEnd() {
89
89
  roots.delete(this.ctx);
90
90
  }
91
91
  });
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../../src/testing/msg-matcher.ts","../../src/testing/test-plugin.ts"],"sourcesContent":["// ── Message Matcher ──────────────────────────────────────────────────────\n//\n// Canonical form: `fn(msg, history) => boolean`. `msg` is the just-arrived\n// message (also the last element of `history`); `history` is the full\n// accumulated list *including* `msg`.\n//\n// Two shortcuts:\n// - a message literal `{ type: \"X\" }` → matches the latest message\n// - a list `[{...}, {...}]` → matches the tail of history,\n// in order, from oldest to newest\n\nimport type { Message } from \"../types.js\";\n\nexport type Matcher<M extends Message> = (msg: M, history: M[]) => boolean;\n\nexport type MatchSpec<M extends Message> =\n | Matcher<M>\n | Partial<M>\n | Array<Partial<M>>;\n\nfunction shallowMatch<M extends Message>(msg: M, spec: Partial<M>): boolean {\n for (const key of Object.keys(spec) as Array<keyof M>) {\n if (msg[key] !== spec[key]) return false;\n }\n return true;\n}\n\n/** Convert a matcher spec to a canonical matcher function. */\nexport function toMatcher<M extends Message>(spec: MatchSpec<M>): Matcher<M> {\n if (typeof spec === \"function\") return spec as Matcher<M>;\n\n if (Array.isArray(spec)) {\n // Sequence: the tail of history must equal `spec`, in order.\n return (_msg, history) => {\n if (history.length < spec.length) return false;\n const tail = history.slice(-spec.length);\n return spec.every((s, i) => shallowMatch(tail[i], s));\n };\n }\n\n // Single literal: the latest message must shallow-match.\n return (msg) => shallowMatch(msg, spec);\n}\n","// ── Test Plugins ─────────────────────────────────────────────────────────\n//\n// createCollector: per-actor message collector plugin.\n// createRootTracker: global process tracker for cleanup.\n\nimport { mergeConfigs, type ActorPlugin } from \"../hooks.js\";\nimport type { Message, StopMessage, SenderInfo, ProcessCtx } from \"../types.js\";\nimport { toMatcher, type MatchSpec } from \"./msg-matcher.js\";\nimport { pnameMatch } from \"./pname-match.js\";\n\n// ── types ────────────────────────────────────────────────────────────────\n\nexport interface MatchResult {\n ok: boolean;\n detail?: string;\n}\n\nexport interface Collector<M extends Message> {\n plugin: ActorPlugin;\n messages: M[];\n resolved(): Promise<MatchResult>;\n next(filter: MatchSpec<M>): Promise<MatchResult>;\n reset(filter?: MatchSpec<M>): void;\n}\n\nexport interface RootTracker {\n plugin: ActorPlugin;\n stopAll(): Promise<void>;\n}\n\n// ── createCollector ──────────────────────────────────────────────────────\n\nexport function createCollector<M extends Message>(\n filter: MatchSpec<M>,\n opts?: { scope?: string | string[] },\n): Collector<M> {\n const messages: M[] = [];\n let matcher = toMatcher(filter);\n // Captured from the root's beforeStart; used as the default scope.\n let defaultScope: string[] = [];\n // The plugin is installed on the root first (spawn assembles before any\n // child is forked), so the first install's beforeStart is the root.\n let installed = false;\n let waiters: Array<(result: MatchResult) => void> = [];\n\n function scopePatterns(): string[] {\n if (opts?.scope === undefined) return defaultScope;\n return Array.isArray(opts.scope) ? opts.scope : [opts.scope];\n }\n\n function checkAndNotify() {\n const last = messages[messages.length - 1];\n if (last !== undefined && matcher(last, messages)) {\n const ws = waiters.splice(0);\n for (const w of ws) w({ ok: true });\n }\n }\n\n function resolved(): Promise<MatchResult> {\n return new Promise((resolve) => {\n const last = messages[messages.length - 1];\n if (last !== undefined && matcher(last, messages)) {\n resolve({ ok: true });\n return;\n }\n waiters.push(resolve);\n });\n }\n\n const collectorPlugin: ActorPlugin = (config) => {\n const isRoot = !installed;\n installed = true;\n return mergeConfigs(config, {\n beforeStart() {\n if (isRoot) defaultScope = [this.name];\n },\n onEmit(msg: Message, sender: SenderInfo) {\n if (!pnameMatch(sender.fromName, scopePatterns())) return;\n messages.push(msg as M);\n checkAndNotify();\n },\n onEnd() {\n const ws = waiters.splice(0);\n for (const w of ws) w({ ok: false, detail: \"actor exited before match\" });\n },\n });\n };\n\n // Named function so framework deduplication works.\n Object.defineProperty(collectorPlugin, \"name\", { value: \"messageCollector\" });\n\n return {\n plugin: collectorPlugin,\n messages,\n resolved,\n next(nextFilter) {\n matcher = toMatcher(nextFilter);\n return resolved();\n },\n reset(newFilter) {\n if (newFilter) matcher = toMatcher(newFilter);\n },\n };\n}\n\n// ── createRootTracker ────────────────────────────────────────────────────\n\nexport function createRootTracker(): RootTracker {\n const roots = new Set<{ sendSelf: (msg: StopMessage) => void }>();\n\n const rootTrackerPlugin: ActorPlugin = (config) =>\n mergeConfigs(config, {\n beforeStart(this: { ctx: ProcessCtx<unknown, unknown, Message, Message> }) {\n roots.add(this.ctx);\n },\n onEnd(this: { ctx: ProcessCtx<unknown, unknown, Message, Message> }) {\n roots.delete(this.ctx);\n },\n });\n\n Object.defineProperty(rootTrackerPlugin, \"name\", { value: \"rootTracker\" });\n\n return {\n plugin: rootTrackerPlugin,\n async stopAll() {\n for (const root of roots) {\n try {\n root.sendSelf({ type: \"STOP\" });\n } catch {}\n }\n roots.clear();\n },\n };\n}\n"],"mappings":";;;AAoBA,SAAS,aAAgC,KAAQ,MAA2B;CAC1E,KAAK,MAAM,OAAO,OAAO,KAAK,IAAI,GAChC,IAAI,IAAI,SAAS,KAAK,MAAM,OAAO;CAErC,OAAO;AACT;;AAGA,SAAgB,UAA6B,MAAgC;CAC3E,IAAI,OAAO,SAAS,YAAY,OAAO;CAEvC,IAAI,MAAM,QAAQ,IAAI,GAEpB,QAAQ,MAAM,YAAY;EACxB,IAAI,QAAQ,SAAS,KAAK,QAAQ,OAAO;EACzC,MAAM,OAAO,QAAQ,MAAM,CAAC,KAAK,MAAM;EACvC,OAAO,KAAK,OAAO,GAAG,MAAM,aAAa,KAAK,IAAI,CAAC,CAAC;CACtD;CAIF,QAAQ,QAAQ,aAAa,KAAK,IAAI;AACxC;;;ACVA,SAAgB,gBACd,QACA,MACc;CACd,MAAM,WAAgB,CAAC;CACvB,IAAI,UAAU,UAAU,MAAM;CAE9B,IAAI,eAAyB,CAAC;CAG9B,IAAI,YAAY;CAChB,IAAI,UAAgD,CAAC;CAErD,SAAS,gBAA0B;EACjC,IAAI,MAAM,UAAU,KAAA,GAAW,OAAO;EACtC,OAAO,MAAM,QAAQ,KAAK,KAAK,IAAI,KAAK,QAAQ,CAAC,KAAK,KAAK;CAC7D;CAEA,SAAS,iBAAiB;EACxB,MAAM,OAAO,SAAS,SAAS,SAAS;EACxC,IAAI,SAAS,KAAA,KAAa,QAAQ,MAAM,QAAQ,GAAG;GACjD,MAAM,KAAK,QAAQ,OAAO,CAAC;GAC3B,KAAK,MAAM,KAAK,IAAI,EAAE,EAAE,IAAI,KAAK,CAAC;EACpC;CACF;CAEA,SAAS,WAAiC;EACxC,OAAO,IAAI,SAAS,YAAY;GAC9B,MAAM,OAAO,SAAS,SAAS,SAAS;GACxC,IAAI,SAAS,KAAA,KAAa,QAAQ,MAAM,QAAQ,GAAG;IACjD,QAAQ,EAAE,IAAI,KAAK,CAAC;IACpB;GACF;GACA,QAAQ,KAAK,OAAO;EACtB,CAAC;CACH;CAEA,MAAM,mBAAgC,WAAW;EAC/C,MAAM,SAAS,CAAC;EAChB,YAAY;EACZ,OAAO,aAAa,QAAQ;GAC1B,cAAc;IACZ,IAAI,QAAQ,eAAe,CAAC,KAAK,IAAI;GACvC;GACA,OAAO,KAAc,QAAoB;IACvC,IAAI,CAAC,WAAW,OAAO,UAAU,cAAc,CAAC,GAAG;IACnD,SAAS,KAAK,GAAQ;IACtB,eAAe;GACjB;GACA,QAAQ;IACN,MAAM,KAAK,QAAQ,OAAO,CAAC;IAC3B,KAAK,MAAM,KAAK,IAAI,EAAE;KAAE,IAAI;KAAO,QAAQ;IAA4B,CAAC;GAC1E;EACF,CAAC;CACH;CAGA,OAAO,eAAe,iBAAiB,QAAQ,EAAE,OAAO,mBAAmB,CAAC;CAE5E,OAAO;EACL,QAAQ;EACR;EACA;EACA,KAAK,YAAY;GACf,UAAU,UAAU,UAAU;GAC9B,OAAO,SAAS;EAClB;EACA,MAAM,WAAW;GACf,IAAI,WAAW,UAAU,UAAU,SAAS;EAC9C;CACF;AACF;AAIA,SAAgB,oBAAiC;CAC/C,MAAM,wBAAQ,IAAI,IAA8C;CAEhE,MAAM,qBAAkC,WACtC,aAAa,QAAQ;EACnB,cAA2E;GACzE,MAAM,IAAI,KAAK,GAAG;EACpB;EACA,QAAqE;GACnE,MAAM,OAAO,KAAK,GAAG;EACvB;CACF,CAAC;CAEH,OAAO,eAAe,mBAAmB,QAAQ,EAAE,OAAO,cAAc,CAAC;CAEzE,OAAO;EACL,QAAQ;EACR,MAAM,UAAU;GACd,KAAK,MAAM,QAAQ,OACjB,IAAI;IACF,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;GAChC,QAAQ,CAAC;GAEX,MAAM,MAAM;EACd;CACF;AACF"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../src/testing/msg-matcher.ts","../../src/testing/test-plugin.ts"],"sourcesContent":["// ── Message Matcher ──────────────────────────────────────────────────────\n//\n// Canonical form: `fn(msg, history) => boolean`. `msg` is the just-arrived\n// message (also the last element of `history`); `history` is the full\n// accumulated list *including* `msg`.\n//\n// Two shortcuts:\n// - a message literal `{ type: \"X\" }` → matches the latest message\n// - a list `[{...}, {...}]` → matches the tail of history,\n// in order, from oldest to newest\n\nimport type { Message } from \"../types.js\";\n\nexport type Matcher<M extends Message> = (msg: M, history: M[]) => boolean;\n\nexport type MatchSpec<M extends Message> =\n | Matcher<M>\n | Partial<M>\n | Array<Partial<M>>;\n\nfunction shallowMatch<M extends Message>(msg: M, spec: Partial<M>): boolean {\n for (const key of Object.keys(spec) as Array<keyof M>) {\n if (msg[key] !== spec[key]) return false;\n }\n return true;\n}\n\n/** Convert a matcher spec to a canonical matcher function. */\nexport function toMatcher<M extends Message>(spec: MatchSpec<M>): Matcher<M> {\n if (typeof spec === \"function\") return spec as Matcher<M>;\n\n if (Array.isArray(spec)) {\n // Sequence: the tail of history must equal `spec`, in order.\n return (_msg, history) => {\n if (history.length < spec.length) return false;\n const tail = history.slice(-spec.length);\n return spec.every((s, i) => shallowMatch(tail[i], s));\n };\n }\n\n // Single literal: the latest message must shallow-match.\n return (msg) => shallowMatch(msg, spec);\n}\n","// ── Test Plugins ─────────────────────────────────────────────────────────\n//\n// createCollector: per-actor message collector plugin.\n// createRootTracker: global process tracker for cleanup.\n\nimport { mergeConfigs, type ActorPlugin } from \"../hooks.js\";\nimport type { Message, StopMessage, SenderInfo, ProcessCtx } from \"../types.js\";\nimport { toMatcher, type MatchSpec } from \"./msg-matcher.js\";\nimport { pnameMatch } from \"./pname-match.js\";\n\n// ── types ────────────────────────────────────────────────────────────────\n\nexport interface MatchResult {\n ok: boolean;\n detail?: string;\n}\n\nexport interface Collector<M extends Message> {\n plugin: ActorPlugin;\n messages: M[];\n resolved(): Promise<MatchResult>;\n next(filter: MatchSpec<M>): Promise<MatchResult>;\n reset(filter?: MatchSpec<M>): void;\n}\n\nexport interface RootTracker {\n plugin: ActorPlugin;\n stopAll(): Promise<void>;\n}\n\n// ── createCollector ──────────────────────────────────────────────────────\n\nexport function createCollector<M extends Message>(\n filter: MatchSpec<M>,\n opts?: { scope?: string | string[] },\n): Collector<M> {\n const messages: M[] = [];\n let matcher = toMatcher(filter);\n // Captured from the root's beforeStart; used as the default scope.\n let defaultScope: string[] = [];\n // The plugin is installed on the root first (spawn assembles before any\n // child is forked), so the first install's beforeStart is the root.\n let installed = false;\n let waiters: Array<(result: MatchResult) => void> = [];\n\n function scopePatterns(): string[] {\n if (opts?.scope === undefined) return defaultScope;\n return Array.isArray(opts.scope) ? opts.scope : [opts.scope];\n }\n\n function checkAndNotify() {\n const last = messages[messages.length - 1];\n if (last !== undefined && matcher(last, messages)) {\n const ws = waiters.splice(0);\n for (const w of ws) w({ ok: true });\n }\n }\n\n function resolved(): Promise<MatchResult> {\n return new Promise((resolve) => {\n const last = messages[messages.length - 1];\n if (last !== undefined && matcher(last, messages)) {\n resolve({ ok: true });\n return;\n }\n waiters.push(resolve);\n });\n }\n\n const collectorPlugin: ActorPlugin = (config) => {\n const isRoot = !installed;\n installed = true;\n return mergeConfigs(config, {\n beforeStart() {\n if (isRoot) defaultScope = [this.name];\n },\n onEmit(msg: Message, sender: SenderInfo) {\n if (!pnameMatch(sender.fromName, scopePatterns())) return;\n messages.push(msg as M);\n checkAndNotify();\n },\n beforeEnd() {\n const ws = waiters.splice(0);\n for (const w of ws) w({ ok: false, detail: \"actor exited before match\" });\n },\n });\n };\n\n // Named function so framework deduplication works.\n Object.defineProperty(collectorPlugin, \"name\", { value: \"messageCollector\" });\n\n return {\n plugin: collectorPlugin,\n messages,\n resolved,\n next(nextFilter) {\n matcher = toMatcher(nextFilter);\n return resolved();\n },\n reset(newFilter) {\n if (newFilter) matcher = toMatcher(newFilter);\n },\n };\n}\n\n// ── createRootTracker ────────────────────────────────────────────────────\n\nexport function createRootTracker(): RootTracker {\n const roots = new Set<{ sendSelf: (msg: StopMessage) => void }>();\n\n const rootTrackerPlugin: ActorPlugin = (config) =>\n mergeConfigs(config, {\n beforeStart(this: { ctx: ProcessCtx<unknown, unknown, Message, Message> }) {\n roots.add(this.ctx);\n },\n afterEnd(this: { ctx: ProcessCtx<unknown, unknown, Message, Message> }) {\n roots.delete(this.ctx);\n },\n });\n\n Object.defineProperty(rootTrackerPlugin, \"name\", { value: \"rootTracker\" });\n\n return {\n plugin: rootTrackerPlugin,\n async stopAll() {\n for (const root of roots) {\n try {\n root.sendSelf({ type: \"STOP\" });\n } catch {}\n }\n roots.clear();\n },\n };\n}\n"],"mappings":";;;AAoBA,SAAS,aAAgC,KAAQ,MAA2B;CAC1E,KAAK,MAAM,OAAO,OAAO,KAAK,IAAI,GAChC,IAAI,IAAI,SAAS,KAAK,MAAM,OAAO;CAErC,OAAO;AACT;;AAGA,SAAgB,UAA6B,MAAgC;CAC3E,IAAI,OAAO,SAAS,YAAY,OAAO;CAEvC,IAAI,MAAM,QAAQ,IAAI,GAEpB,QAAQ,MAAM,YAAY;EACxB,IAAI,QAAQ,SAAS,KAAK,QAAQ,OAAO;EACzC,MAAM,OAAO,QAAQ,MAAM,CAAC,KAAK,MAAM;EACvC,OAAO,KAAK,OAAO,GAAG,MAAM,aAAa,KAAK,IAAI,CAAC,CAAC;CACtD;CAIF,QAAQ,QAAQ,aAAa,KAAK,IAAI;AACxC;;;ACVA,SAAgB,gBACd,QACA,MACc;CACd,MAAM,WAAgB,CAAC;CACvB,IAAI,UAAU,UAAU,MAAM;CAE9B,IAAI,eAAyB,CAAC;CAG9B,IAAI,YAAY;CAChB,IAAI,UAAgD,CAAC;CAErD,SAAS,gBAA0B;EACjC,IAAI,MAAM,UAAU,KAAA,GAAW,OAAO;EACtC,OAAO,MAAM,QAAQ,KAAK,KAAK,IAAI,KAAK,QAAQ,CAAC,KAAK,KAAK;CAC7D;CAEA,SAAS,iBAAiB;EACxB,MAAM,OAAO,SAAS,SAAS,SAAS;EACxC,IAAI,SAAS,KAAA,KAAa,QAAQ,MAAM,QAAQ,GAAG;GACjD,MAAM,KAAK,QAAQ,OAAO,CAAC;GAC3B,KAAK,MAAM,KAAK,IAAI,EAAE,EAAE,IAAI,KAAK,CAAC;EACpC;CACF;CAEA,SAAS,WAAiC;EACxC,OAAO,IAAI,SAAS,YAAY;GAC9B,MAAM,OAAO,SAAS,SAAS,SAAS;GACxC,IAAI,SAAS,KAAA,KAAa,QAAQ,MAAM,QAAQ,GAAG;IACjD,QAAQ,EAAE,IAAI,KAAK,CAAC;IACpB;GACF;GACA,QAAQ,KAAK,OAAO;EACtB,CAAC;CACH;CAEA,MAAM,mBAAgC,WAAW;EAC/C,MAAM,SAAS,CAAC;EAChB,YAAY;EACZ,OAAO,aAAa,QAAQ;GAC1B,cAAc;IACZ,IAAI,QAAQ,eAAe,CAAC,KAAK,IAAI;GACvC;GACA,OAAO,KAAc,QAAoB;IACvC,IAAI,CAAC,WAAW,OAAO,UAAU,cAAc,CAAC,GAAG;IACnD,SAAS,KAAK,GAAQ;IACtB,eAAe;GACjB;GACA,YAAY;IACV,MAAM,KAAK,QAAQ,OAAO,CAAC;IAC3B,KAAK,MAAM,KAAK,IAAI,EAAE;KAAE,IAAI;KAAO,QAAQ;IAA4B,CAAC;GAC1E;EACF,CAAC;CACH;CAGA,OAAO,eAAe,iBAAiB,QAAQ,EAAE,OAAO,mBAAmB,CAAC;CAE5E,OAAO;EACL,QAAQ;EACR;EACA;EACA,KAAK,YAAY;GACf,UAAU,UAAU,UAAU;GAC9B,OAAO,SAAS;EAClB;EACA,MAAM,WAAW;GACf,IAAI,WAAW,UAAU,UAAU,SAAS;EAC9C;CACF;AACF;AAIA,SAAgB,oBAAiC;CAC/C,MAAM,wBAAQ,IAAI,IAA8C;CAEhE,MAAM,qBAAkC,WACtC,aAAa,QAAQ;EACnB,cAA2E;GACzE,MAAM,IAAI,KAAK,GAAG;EACpB;EACA,WAAwE;GACtE,MAAM,OAAO,KAAK,GAAG;EACvB;CACF,CAAC;CAEH,OAAO,eAAe,mBAAmB,QAAQ,EAAE,OAAO,cAAc,CAAC;CAEzE,OAAO;EACL,QAAQ;EACR,MAAM,UAAU;GACd,KAAK,MAAM,QAAQ,OACjB,IAAI;IACF,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;GAChC,QAAQ,CAAC;GAEX,MAAM,MAAM;EACd;CACF;AACF"}
@@ -30,7 +30,10 @@ declare class AsyncProcess<Args, State, InMessage extends Message, OutMessage ex
30
30
  /** Every buffered message carries sender provenance. */
31
31
  private buffer;
32
32
  private nextTick;
33
- private children;
33
+ /** Child processes forked from this one (any fork method). */
34
+ children: Array<AsyncProcess<unknown, unknown, Message, Message, {}>>;
35
+ /** Children inherited from a child that exited (see ctx-orphans proposal). */
36
+ orphans: Array<AsyncProcess<unknown, unknown, Message, Message, {}>>;
34
37
  private subscribers;
35
38
  private exitWaiter;
36
39
  private pvtIsPaused;
@@ -109,6 +112,9 @@ type WithoutSender<T extends WithSender<any>> = T[0];
109
112
  * The sender's identity is carried in the {@link SenderInfo} tuple. */
110
113
  type ExitMessage = {
111
114
  type: "EXIT";
115
+ /** Still-running children of the exiting process, handed up to the parent
116
+ * for adoption (in-process only). */
117
+ orphans?: Array<AnyProcess>;
112
118
  };
113
119
  type StopMessage = {
114
120
  type: "STOP";
@@ -129,7 +135,10 @@ type ProcessCtx<Args, State, IM extends Message, OM extends Message> = {
129
135
  parentId: symbol | null;
130
136
  sendSelf: (msg: IM | StopMessage) => void;
131
137
  toParent: ProcessMessageCb<OM>;
132
- } & Pick<AsyncProcess<Args, State, IM, OM, {}>, "fork" | "forkSync">;
138
+ /** Invoked by the runtime after the process emits EXIT to its parent.
139
+ * Best-effort teardown that must not delay the exit signal. */
140
+ afterExit?: () => Promise<void> | void;
141
+ } & Pick<AsyncProcess<Args, State, IM, OM, {}>, "fork" | "forkSync" | "children" | "orphans">;
133
142
  /** State yielded by the pipe process. */
134
143
  interface PipeState<Params, Result> {
135
144
  params: Params | null;
@@ -143,4 +152,4 @@ interface SupervisorState {
143
152
  }
144
153
  //#endregion
145
154
  export { ProcessCtx as a, SenderOrigin as c, WithSender as d, WithoutSender as f, spawnAsync as g, runDispatchAsync as h, PipeState as i, StopMessage as l, AsyncProcess as m, ExitMessage as n, ProcessFn as o, AnyProcess as p, Message as r, SenderInfo as s, AsyncProcessFn as t, SupervisorState as u };
146
- //# sourceMappingURL=types-D4ZgiRY9.d.ts.map
155
+ //# sourceMappingURL=types-DYAxWeSM.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types-DYAxWeSM.d.ts","names":[],"sources":["../src/process.async.ts","../src/types.ts"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- //#region src/util.js
1
+ //#region src/util.ts
2
2
  function debugLog(level, ...args) {
3
3
  if (level) console.log(...args);
4
4
  }
@@ -46,7 +46,21 @@ function makeWaiter() {
46
46
  resolve
47
47
  };
48
48
  }
49
+ /** Resolve after `ms` milliseconds. */
50
+ function sleep(ms) {
51
+ return new Promise((resolve) => setTimeout(resolve, ms));
52
+ }
53
+ const TIMEOUT_SENTINEL = Symbol.for("__timeout__posipaki_internal");
54
+ async function timeout(ms) {
55
+ await sleep(ms);
56
+ return TIMEOUT_SENTINEL;
57
+ }
58
+ async function withTimeout(promise, ms, kind) {
59
+ const result = await Promise.race([promise, timeout(ms)]);
60
+ if (result === TIMEOUT_SENTINEL) throw Error("Timeout:" + kind);
61
+ return result;
62
+ }
49
63
  //#endregion
50
- export { runDispatch as i, defer as n, makeWaiter as r, debugLog as t };
64
+ export { withTimeout as a, runDispatch as i, defer as n, makeWaiter as r, debugLog as t };
51
65
 
52
- //# sourceMappingURL=util-DsfVKxTT.js.map
66
+ //# sourceMappingURL=util-FmOqPdg-.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"util-FmOqPdg-.js","names":[],"sources":["../src/util.ts"],"sourcesContent":["import type { ExitMessage } from \"./types.js\";\nexport function debugLog(level: boolean, ...args: Array<unknown>) {\n if (level) {\n console.log(...args);\n }\n}\n\ntype ReducerClosure<M> = (msg: M) => void;\ntype ReadyFn = () => boolean;\ntype NotifyFn = () => void;\n\n/**\n * Generator helper that loops, yielding `null` and feeding incoming\n * messages to `fn` until `readyFn()` returns true. Used inside\n * process generators to build the main message loop.\n */\nfunction* runDispatch<M>(\n name: string,\n fn: ReducerClosure<M>,\n readyFn: ReadyFn = () => false,\n debugLevel = false,\n): Generator<null, void, M> {\n let msg: M;\n while (!readyFn()) {\n msg = yield null;\n debugLog(debugLevel, \"msg\", name, \" <- \", msg);\n fn(msg);\n }\n}\n\n/**\n* @deprecated Use AsyncProcess._watchExit instead.\n *\n * Wrap a process generator so that on completion it sends STOP to\n * all children and EXIT to the parent. Useful for custom process\n * wrappers that need lifecycle management without extending\n * AsyncProcess.\n */\nfunction watchExit<\n A,\n S,\n IM extends { type: string },\n OM extends { type: string } | ExitMessage,\n>(\n proc: {\n toAllChildren: (m: { type: string }) => void;\n toParent: (m: OM) => void;\n id: symbol;\n pname: string;\n },\n gen: (ctx: any, args: A) => Generator<S | null, void, IM>,\n): (ctx: any, args: A) => Generator<S | null, void, IM> {\n return function* (ctx, args) {\n try {\n yield* gen(ctx, args);\n } finally {\n proc.toAllChildren({ type: \"STOP\" });\n proc.toParent({\n type: \"EXIT\",\n } as OM);\n }\n };\n}\n\ntype DeferCb = () => void;\ntype Defer = (fn: DeferCb) => unknown;\ntype Cancel = (taskId: any) => void;\ntype WindowGlobal = {\n setImmediate?: Defer;\n clearImmediate?: Cancel;\n requestIdleCallback?: Defer;\n cancelIdleCallback?: Cancel;\n setTimeout: Defer;\n clearTimeout: Cancel;\n};\n\n/** Handle to a scheduled (but not yet executed) callback. */\nexport type DeferredCall = {\n cancel: () => void;\n flush: () => void;\n};\n/** Schedule a function to run on the next microtask. Returns an\n * object with `cancel()` and `flush()` methods. */\nfunction defer(fn: DeferCb): DeferredCall {\n const g = globalThis as WindowGlobal;\n function schedule(deferFn: Defer, cancelFn: Cancel) {\n const taskId = deferFn(fn);\n return () => cancelFn(taskId);\n }\n let cancel: () => void;\n if (g.setImmediate && g.clearImmediate) {\n cancel = schedule(g.setImmediate, g.clearImmediate);\n } else if (g.requestIdleCallback && g.cancelIdleCallback) {\n cancel = schedule(g.requestIdleCallback, g.cancelIdleCallback);\n } else {\n cancel = schedule((f) => setTimeout(f, 0), clearTimeout);\n }\n\n function flush() {\n cancel();\n fn();\n }\n\n return { flush, cancel };\n}\n/** A promise paired with its resolve function — used to signal\n * process completion. */\nexport type Waiter = {\n promise: Promise<void>;\n resolve: NotifyFn;\n};\n/** Create a new {@link Waiter}. */\nfunction makeWaiter(): Waiter {\n let resolve: unknown;\n let promise = new Promise<void>((_resolve) => {\n resolve = _resolve;\n });\n return { promise, resolve: resolve as NotifyFn };\n}\n\n/** Resolve after `ms` milliseconds. */\nexport function sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nconst TIMEOUT_SENTINEL = Symbol.for('__timeout__posipaki_internal');\nexport async function timeout(ms: number) {\n await sleep(ms);\n return TIMEOUT_SENTINEL;\n}\n\nexport async function withTimeout<O>(promise: Promise<O>, ms: number, kind: string) : Promise<O> {\n const result = await Promise.race([promise, timeout(ms)]);\n if (result === TIMEOUT_SENTINEL) {\n throw Error('Timeout:'+ kind);\n }\n return result as O;\n}\n\nexport { runDispatch, defer, makeWaiter, watchExit };\nexport type { ExitMessage };\n"],"mappings":";AACA,SAAgB,SAAS,OAAgB,GAAG,MAAsB;CAChE,IAAI,OACF,QAAQ,IAAI,GAAG,IAAI;AAEvB;;;;;;AAWA,UAAU,YACR,MACA,IACA,gBAAyB,OACzB,aAAa,OACa;CAC1B,IAAI;CACJ,OAAO,CAAC,QAAQ,GAAG;EACjB,MAAM,MAAM;EACZ,SAAS,YAAY,OAAO,MAAM,QAAQ,GAAG;EAC7C,GAAG,GAAG;CACR;AACF;;;AAuDA,SAAS,MAAM,IAA2B;CACxC,MAAM,IAAI;CACV,SAAS,SAAS,SAAgB,UAAkB;EAClD,MAAM,SAAS,QAAQ,EAAE;EACzB,aAAa,SAAS,MAAM;CAC9B;CACA,IAAI;CACJ,IAAI,EAAE,gBAAgB,EAAE,gBACtB,SAAS,SAAS,EAAE,cAAc,EAAE,cAAc;MAC7C,IAAI,EAAE,uBAAuB,EAAE,oBACpC,SAAS,SAAS,EAAE,qBAAqB,EAAE,kBAAkB;MAE7D,SAAS,UAAU,MAAM,WAAW,GAAG,CAAC,GAAG,YAAY;CAGzD,SAAS,QAAQ;EACf,OAAO;EACP,GAAG;CACL;CAEA,OAAO;EAAE;EAAO;CAAO;AACzB;;AAQA,SAAS,aAAqB;CAC5B,IAAI;CAIJ,OAAO;EAAE,SAAA,IAHS,SAAe,aAAa;GAC5C,UAAU;EACZ,CACe;EAAY;CAAoB;AACjD;;AAGA,SAAgB,MAAM,IAA2B;CAC/C,OAAO,IAAI,SAAS,YAAY,WAAW,SAAS,EAAE,CAAC;AACzD;AAEA,MAAM,mBAAmB,OAAO,IAAI,8BAA8B;AAClE,eAAsB,QAAQ,IAAY;CACxC,MAAM,MAAM,EAAE;CACd,OAAO;AACT;AAEA,eAAsB,YAAe,SAAqB,IAAY,MAA2B;CAC/F,MAAM,SAAS,MAAM,QAAQ,KAAK,CAAC,SAAS,QAAQ,EAAE,CAAC,CAAC;CACxD,IAAI,WAAW,kBACb,MAAM,MAAM,aAAY,IAAI;CAE9B,OAAO;AACT"}
package/dist/xfetch.d.ts CHANGED
@@ -1,5 +1,5 @@
1
- import { a as ProcessCtx, d as WithSender, n as ExitMessage } from "./types-D4ZgiRY9.js";
2
- import { t as Process } from "./process-CSv4_HdZ.js";
1
+ import { a as ProcessCtx, d as WithSender, n as ExitMessage } from "./types-DYAxWeSM.js";
2
+ import { t as Process } from "./process-CECMMHyR.js";
3
3
 
4
4
  //#region src/xfetch.d.ts
5
5
  /** State of an in-flight or completed fetch. */
package/dist/xfetch.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/xfetch.ts
3
3
  function isJsonHelper(res) {
4
4
  return res.headers.get("content-type") === "application/json";
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "type": "module",
3
3
  "name": "posipaki",
4
- "version": "0.20.3",
4
+ "version": "0.21.0",
5
5
  "main": "./dist/index.js",
6
6
  "types": "./dist/index.d.ts",
7
7
  "files": [
@@ -1 +0,0 @@
1
- {"version":3,"file":"hooks-Q4l5ggDj.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 WithSender,\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: WithSender<OutMsg>) => 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 onEnd?: (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 },\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 * onEnd() { 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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"hooks-_rD3UIok.d.ts","names":[],"sources":["../src/actor-types.ts","../src/hooks.ts"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"process-CSv4_HdZ.d.ts","names":["level","args","Array","M","msg","name","ReducerClosure","fn","ReadyFn","readyFn","debugLevel","Generator","A","S","IM","type","OM","ExitMessage","toAllChildren","m","toParent","id","pname","proc","ctx","gen","cancel","flush","DeferCb","DeferredCall","promise","Promise","resolve","NotifyFn","Waiter"],"sources":["../src/util.d.ts","../src/process.ts"],"mappings":";;;KAEK,cAAA,OAAqBI,GAAAA,EAAK,CAAC;AAAA,KAC3B,OAAA;;;;;;iBAOY,WAAA,IAAeC,IAAAA,UAAcE,EAAAA,EAAI,cAAA,CAAe,CAAA,GAAIE,OAAAA,GAAU,OAAA,EAASC,UAAAA,aAAuB,SAAA,aAAsB,CAAA;AARrG;AAAA;;;;AACpB;AACC;;;;;iBCIG,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,UAAA,CAAW,EAAA,cAClB,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,UAAA,CAAW,EAAA;EAKtB,KAAA,CAAM,CAAA,EAAG,CAAA;EAIT,IAAA,IAAQ,OAAA;AAAA"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"src--3MW7Bgq.js","names":[],"sources":["../src/adapters.ts","../src/process.async.ts","../src/process.ts","../src/define-actor.ts","../src/index.ts"],"sourcesContent":["import type { ProcessFn, AsyncProcessFn, Message } from \"./types.js\"\n\nexport function asyncify<A, S, IM extends Message, OM extends Message>(\n fn: ProcessFn<A, S, IM, OM>,\n): AsyncProcessFn<A, S, IM, OM> {\n return async function* (ctx, args) {\n yield* fn(ctx, args) as any\n }\n}\n","import { defer, makeWaiter, debugLog } from \"./util.js\";\nimport type { DeferredCall, Waiter } from \"./util.js\";\nimport type {\n Message,\n WithSender,\n SenderInfo,\n ExitMessage,\n StopMessage,\n ProcessCtx,\n AsyncProcessFn,\n ProcessFn,\n} from \"./types.js\";\nimport { asyncify } from \"./adapters.js\";\n\n// ---- types ------------------------------------------------------------------\n\n/** An async iterator over process state. Receives `WithSender<InMessage | StopMessage>`. */\ntype AsyncProcessGenerator<\n ProcessState,\n InMessage extends Message,\n> = AsyncGenerator<\n ProcessState | null,\n void,\n WithSender<InMessage | StopMessage>\n>;\n\ntype NotifyFn = () => void;\n\n// ---- runDispatchAsync -------------------------------------------------------\n\ntype AsyncReducer<M> = (msg: M) => Promise<void>;\ntype ReadyFn = () => boolean;\n\n/**\n * Async equivalent of `runDispatch`. Loops, yielding `null` and feeding\n * each incoming message to an `async` reducer. Exits when `readyFn()`\n * returns true.\n */\nexport async function* runDispatchAsync<M>(\n name: string,\n fn: AsyncReducer<M>,\n readyFn: ReadyFn = () => false,\n debugLevel = false,\n): AsyncGenerator<null, void, M> {\n let msg: M;\n while (!readyFn()) {\n msg = yield null;\n debugLog(debugLevel, \"msg\", name, \" <- \", msg);\n await fn(msg);\n }\n}\n\n// ---- AsyncProcess -----------------------------------------------------------\n\ntype ProcessMessageCb<M> = (msg: M) => void;\n\nconst noop = () => null;\n\n/**\n * A process driven by an async generator. Functionally identical to\n * {@link Process} but supports `await` inside reducers.\n *\n * Messages are processed **one at a time** — if a tick is already\n * in-flight, new messages are buffered and processed when the current\n * tick completes.\n */\nexport class AsyncProcess<\n Args,\n State,\n InMessage extends Message,\n OutMessage extends Message,\n ReflectionMethods extends object,\n> {\n /** Reflection methods. Empty by default — defineActor fills in configured methods. */\n $reflection: ReflectionMethods = {} as ReflectionMethods;\n pgenerator: AsyncProcessFn<Args, State, InMessage, OutMessage>;\n pname: string;\n /** Called for every message sent via `ctx.toParent`. Receives `WithSender<OutMessage>`. */\n toParent: ProcessMessageCb<WithSender<OutMessage>>;\n id: symbol;\n state: State | null;\n\n private current: AsyncProcessGenerator<State, InMessage> | null = null;\n /** Every buffered message carries sender provenance. */\n private buffer: Array<WithSender<InMessage | StopMessage>> = [];\n private nextTick: DeferredCall | null = null;\n private children: Array<\n AsyncProcess<unknown, unknown, Message, Message, {}>\n > = [];\n private subscribers: Array<NotifyFn> = [];\n private exitWaiter: Waiter;\n private pvtIsPaused: boolean = false;\n private pvtTickInProgress: boolean = false;\n private pvtExitReject: ((e: unknown) => void) | null = null;\n private pvtReady!: Waiter;\n private pvtResolveReady!: () => void;\n\n constructor(\n fn: AsyncProcessFn<Args, State, InMessage, OutMessage>,\n pname: string,\n toParent: ProcessMessageCb<WithSender<OutMessage>> | undefined,\n ) {\n this.pgenerator = fn;\n this.pname = pname;\n this.toParent =\n toParent || (noop as ProcessMessageCb<WithSender<OutMessage>>);\n this.id = Symbol(pname);\n this.state = null;\n this.exitWaiter = makeWaiter();\n this.pvtReady = makeWaiter();\n this.pvtResolveReady = this.pvtReady.resolve;\n }\n\n /** Promise that resolves once the initial state is available. */\n ready(): Promise<void> {\n return this.pvtReady.promise;\n }\n\n // ---- lifecycle ------------------------------------------------------------\n\n /**\n * Kick off the async generator. The first `yield` sets the initial\n * state; for async generators this happens in a microtask.\n */\n start(arg0: Args, parentName?: string | null, parentId?: symbol | null) {\n const selfCtx: SenderInfo = { fromName: this.pname, fromId: this.id };\n\n const ctx: ProcessCtx<Args, State, InMessage, OutMessage> = {\n pname: this.pname,\n id: this.id,\n parentName: parentName ?? null,\n parentId: parentId ?? null,\n fork: this.fork.bind(this),\n forkSync: this.forkSync.bind(this),\n sendSelf: (msg) => {\n this.send([msg, selfCtx]);\n },\n toParent: (msg) => {\n this.toParent([msg, selfCtx] as WithSender<OutMessage>);\n },\n };\n\n this.current = this.pvtWatchExit(ctx, arg0);\n void this.current.next().then((ret: IteratorResult<State | null, void>) => {\n this.state = ret.value ?? null;\n this.pvtResolveReady();\n if (ret.done) {\n this.exitWaiter.resolve();\n return;\n }\n // Advance past the initial yield so the pvtWatchExit generator\n // runs its finally block (EXIT/STOP) and the inner generator\n // enters its dispatch loop.\n const advance: WithSender<InMessage | StopMessage> = [\n { type: \"__ADVANCE__\" } as InMessage,\n {\n fromName: \"__internal__\",\n fromId: Symbol(\"__internal__\"),\n } as SenderInfo,\n ];\n this.pvtEatResult(this.current!.next(advance));\n });\n return this;\n }\n\n /** Wrap the user's generator so EXIT/STOP logic fires on completion. */\n private async *pvtWatchExit(\n ctx: ProcessCtx<Args, State, InMessage, OutMessage>,\n arg0: Args,\n ): AsyncProcessGenerator<State, InMessage> {\n try {\n yield* this.pgenerator(ctx, arg0);\n } finally {\n this.toAllChildren({ type: \"STOP\" });\n // ctx.toParent stamps sender info into a WithSender tuple\n ctx.toParent({ type: \"EXIT\" } as unknown as OutMessage);\n }\n }\n\n // ---- fork -----------------------------------------------------------------\n\n fork<ChildArgs, ChildState, ChildIM extends Message, ChildOM extends Message>(\n fn: AsyncProcessFn<ChildArgs, ChildState, ChildIM, ChildOM>,\n pname: string,\n ): (\n args: ChildArgs,\n ) => AsyncProcess<ChildArgs, ChildState, ChildIM, ChildOM, {}> {\n return (args: ChildArgs) => {\n const child = new AsyncProcess<\n ChildArgs,\n ChildState,\n ChildIM,\n ChildOM,\n {}\n >(\n fn,\n pname,\n this.fromChild.bind(this) as unknown as ProcessMessageCb<\n WithSender<ChildOM>\n >,\n );\n this.children.push(\n child as unknown as AsyncProcess<\n unknown,\n unknown,\n Message,\n Message,\n {}\n >,\n );\n child.start(args, this.pname, this.id);\n return child;\n };\n }\n\n forkSync<\n ChildArgs,\n ChildState,\n ChildIM extends Message,\n ChildOM extends InMessage,\n >(\n fn: ProcessFn<ChildArgs, ChildState, ChildIM, ChildOM>,\n pname: string,\n ): (\n args: ChildArgs,\n ) => AsyncProcess<ChildArgs, ChildState, ChildIM, ChildOM, {}> {\n return this.fork(asyncify(fn), pname);\n }\n\n // ---- message processing ---------------------------------------------------\n\n protected async pvtTick(): Promise<void> {\n if (!this.current || this.pvtTickInProgress) return;\n\n this.pvtTickInProgress = true;\n try {\n let msgAndSender: WithSender<InMessage | StopMessage> | undefined;\n let ret: IteratorResult<State | null, void> | null = null;\n while ((msgAndSender = this.buffer.shift()) !== undefined) {\n ret = await this.pvtSafeNext(msgAndSender);\n if (!ret || ret.done) break;\n }\n this.notify();\n this.pvtEatResult(ret);\n } catch (e) {\n this.pvtExitReject?.(e);\n this.pvtExitReject = null;\n } finally {\n this.pvtTickInProgress = false;\n }\n }\n\n /** Call `.next()` and redirect unhandled rejections. */\n private async pvtSafeNext(\n msgAndSender: WithSender<InMessage | StopMessage>,\n ): Promise<IteratorResult<State | null, void> | null> {\n try {\n return await this.current!.next(msgAndSender);\n } catch (e) {\n this.pvtExitReject?.(e);\n this.pvtExitReject = null;\n return { done: true, value: undefined };\n }\n }\n\n private pvtEatResult(\n ret:\n | IteratorResult<State | null, void>\n | Promise<IteratorResult<State | null, void>>\n | null,\n ): void {\n if (!ret) return;\n Promise.resolve(ret).then((r) => {\n if (r.done) {\n this.exitWaiter.resolve();\n }\n });\n }\n\n /** Broadcast a message to all children. */\n toAllChildren(msg: Message): void {\n const stamp: SenderInfo = { fromName: this.pname, fromId: this.id };\n this.children.forEach((p) => p.send([msg, stamp] as WithSender<Message>));\n }\n\n /** Stamp and enqueue a message from a named sender (external API). */\n send(msg: InMessage | StopMessage, from?: SenderInfo): void;\n /** Enqueue a pre-stamped message (internal: fromChild, toAllChildren). */\n send(msgAndSender: WithSender<InMessage | StopMessage>): void;\n send(\n msgOrTuple: InMessage | StopMessage | WithSender<InMessage | StopMessage>,\n from?: SenderInfo,\n ): void {\n if (\"type\" in msgOrTuple) {\n this.buffer.push([\n msgOrTuple as InMessage | StopMessage,\n from as SenderInfo,\n ]);\n } else {\n this.buffer.push(msgOrTuple as WithSender<InMessage | StopMessage>);\n }\n this.pvtScheduleTick();\n }\n\n /**\n * Synchronously flush the buffer. For sync processes use {@link Process.tick};\n * for async processes this is **not guaranteed** to process everything\n * immediately if reducers contain `await`. Prefer `send()` + `await proc.wait()`.\n */\n tick(): void {\n this.nextTick?.flush();\n this.nextTick = null;\n }\n\n private pvtScheduleTick(): void {\n if (this.pvtIsPaused) return;\n\n this.nextTick?.cancel();\n this.nextTick = defer(() => {\n this.nextTick = null;\n void this.pvtTick();\n });\n }\n\n // ---- subscribers ----------------------------------------------------------\n\n notify(): void {\n this.subscribers.forEach((f) => f());\n }\n\n get isListenedTo(): boolean {\n return this.subscribers.length > 0;\n }\n\n subscribe(f: NotifyFn): () => void {\n this.subscribers.push(f);\n return () => {\n const idx = this.subscribers.indexOf(f);\n if (idx < 0) return;\n this.subscribers.splice(idx, 1);\n };\n }\n\n // ---- pause / resume -------------------------------------------------------\n\n pause(): void {\n this.nextTick?.cancel();\n this.nextTick = null;\n this.pvtIsPaused = true;\n }\n\n resume(): void {\n this.pvtIsPaused = false;\n this.pvtScheduleTick();\n }\n\n // ---- waiting --------------------------------------------------------------\n\n /**\n * Returns a promise that resolves when the generator completes, or\n * rejects if an unhandled error occurs during message processing.\n */\n wait(): Promise<void> {\n return new Promise<void>((resolve, reject) => {\n this.pvtExitReject = reject;\n\n this.exitWaiter.promise.then(\n () => {\n this.pvtExitReject = null;\n resolve();\n },\n (e) => {\n this.pvtExitReject = null;\n reject(e);\n },\n );\n });\n }\n\n // ---- child messages -------------------------------------------------------\n\n /** Relays a child's message to this process. The message already carries\n * sender provenance (stamped by the child's `ctx.toParent` wrapper). */\n private fromChild(msgAndSender: WithSender<InMessage | StopMessage>): void {\n const [msg, sender] = msgAndSender;\n if (msg.type === \"EXIT\") {\n // sender.fromId === child's id (set by child's ctx.toParent wrapper)\n this.children = this.children.filter((p) => p.id !== sender.fromId);\n }\n this.send(msgAndSender);\n }\n}\nexport type AnyProcess = AsyncProcess<unknown, unknown, Message, Message, {}>;\n// ---- spawnAsync -------------------------------------------------------------\n\n/**\n * Spawn a new async process. Accepts both sync and async process\n * functions — sync ones are automatically wrapped with {@link asyncify}.\n */\nexport function spawnAsync<\n Args,\n State,\n InMessage extends Message = Message,\n OutMessage extends Message = ExitMessage,\n>(\n fn: AsyncProcessFn<Args, State, InMessage, OutMessage>,\n pname: string,\n toParent?: ProcessMessageCb<WithSender<OutMessage>>,\n): (args: Args) => AsyncProcess<Args, State, InMessage, OutMessage, {}> {\n return (args: Args) => {\n const proc = new AsyncProcess<Args, State, InMessage, OutMessage, {}>(\n fn,\n pname,\n toParent,\n );\n proc.start(args);\n return proc;\n };\n}\n","import { AsyncProcess } from \"./process.async.js\";\nimport { asyncify } from \"./adapters.js\";\nimport type { Message, WithSender, ExitMessage, ProcessFn } from \"./types.js\";\n\nexport type { Message, ProcessFn, ProcessCtx } from \"./types.js\";\nexport { runDispatch } from \"./util.js\";\n\n/** @deprecated Use {@link spawnAsync} instead. */\nexport function spawn<\n A,\n S,\n IM extends Message = Message,\n OM extends Message = ExitMessage,\n>(\n fn: ProcessFn<A, S, IM, OM>,\n pname: string,\n tp?: (m: WithSender<OM>) => void,\n): (a: A) => Process<A, S, IM, OM> {\n return (a: A) => new Process(fn, pname, tp).start(a);\n}\n\n/** @deprecated Use {@link AsyncProcess} instead. Sync processes are\n * wrapped via asyncify internally; spawnAsync handles both. */\nclass Process<\n A,\n S,\n IM extends Message,\n OM extends Message,\n> extends AsyncProcess<A, S, IM, OM, {}> {\n constructor(\n fn: ProcessFn<A, S, IM, OM>,\n pname: string,\n tp?: (m: WithSender<OM>) => void,\n ) {\n super(asyncify(fn), pname, tp);\n }\n\n start(a: A) {\n super.start(a);\n return this;\n }\n tick(): Promise<void> {\n return super.pvtTick();\n }\n}\n\nexport { Process };\n","// ── defineActor — high-level actor wrapper ───────────────────────────────────\n//\n// Compiles a declarative config into an AsyncProcessFn. Built on top of\n// the existing runDispatchAsync / spawnAsync primitives.\n//\nimport {\n type AsyncProcess,\n runDispatchAsync,\n spawnAsync,\n AnyProcess,\n} from \"./process.async.js\";\nimport type {\n WithSender,\n AsyncProcessFn,\n Message,\n ExitMessage,\n ProcessCtx,\n} from \"./types.js\";\nimport type {\n ActorDefinition,\n ActorConfig,\n ActorContext,\n MethodOptions,\n ActorMessages,\n HandlerOptions,\n HandlerFn,\n ReflectionOptions,\n AnyConfig,\n HidePrivate,\n} from \"./actor-types.js\";\nimport { STOP_SENTINEL } from \"./actor-types.js\";\nimport {\n ActorDecorated,\n type ActorPlugin,\n ActorReflection,\n callHook,\n} from \"./hooks.js\";\n\nexport function defineMessages<\n OutMsg extends Message = Message,\n>(): ActorMessages<OutMsg> {\n return undefined as unknown as ActorMessages<OutMsg>;\n}\n\nfunction hidePrivate<T>(value: T): HidePrivate<T> {\n if (\n value &&\n typeof value === \"object\" &&\n \"private\" in value &&\n \"public\" in value\n ) {\n return value.public as HidePrivate<T>;\n }\n return value as HidePrivate<T>;\n}\n\nfunction resolvePlugins(\n raw: ActorPlugin[] | ((parents: ActorPlugin[]) => ActorPlugin[]) | undefined,\n parentPlugins?: ActorPlugin[],\n addPlugins?: ActorPlugin[],\n): ActorPlugin[] {\n const resolved =\n !raw ? (parentPlugins ? [...parentPlugins] : [])\n : Array.isArray(raw) ? [...raw]\n : raw(parentPlugins ?? []);\n\n const combined = addPlugins ? [...resolved, ...addPlugins] : resolved;\n\n // Deduplicate by function name\n const seen = new Set<string>();\n return combined.filter((p) => {\n const name = p.name;\n if (!name) {\n console.warn(\"posipaki: plugin has no name, dedup won't work\");\n return true;\n }\n if (seen.has(name)) return false;\n seen.add(name);\n return true;\n });\n}\n\nasync function assembleActor<C>(config: C, plugins: ActorPlugin[], addPlugins?: ActorPlugin[]): Promise<C> {\n // Work with the default ActorPlugin type internally, cast back on return\n let cur = config as AnyConfig;\n for (const p of plugins) {\n try {\n cur = await p(cur);\n } catch (e: unknown) {\n console.error(\n `[assembleActor] plugin \"${p.name || \"?\"}\" failed:`,\n e,\n );\n }\n }\n cur.resolvedPlugins = plugins;\n if (addPlugins) cur.addPlugins = addPlugins;\n return cur as C;\n}\n\nexport function defineActor<\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>(\n config: ActorConfig<\n Args,\n InternalState,\n InMsg,\n OutMsg,\n Methods,\n Handlers,\n ReflectionMethods\n >,\n): ActorDefinition<Args, InternalState, InMsg, OutMsg, ReflectionMethods> {\n const actorCtxMap = new Map<\n symbol,\n ActorContext<\n Args,\n InternalState,\n InMsg,\n OutMsg,\n Methods,\n Handlers,\n ReflectionMethods\n >\n >();\n\n function makeRuntime(\n assembly: ActorConfig<\n Args,\n InternalState,\n InMsg,\n OutMsg,\n Methods,\n Handlers,\n ReflectionMethods\n >,\n ): AsyncProcessFn<Args, HidePrivate<InternalState>, InMsg, OutMsg> {\n return async function* (\n ctx,\n args,\n ): AsyncGenerator<\n HidePrivate<InternalState | null>,\n void,\n WithSender<InMsg>\n > {\n let done = false;\n let exitReason: unknown;\n let rawState: InternalState = undefined as unknown as InternalState;\n\n const decorated = new Map();\n const self: ActorContext<\n Args,\n InternalState,\n InMsg,\n OutMsg,\n Methods,\n Handlers,\n ReflectionMethods & ActorReflection\n > = {\n ctx,\n ...((assembly.methods || {}) as Methods),\n ...((assembly.$decorate || {}) as ActorDecorated),\n reflection: {} as ReflectionMethods & ActorReflection,\n state: rawState,\n name: ctx.pname,\n id: ctx.id,\n async emit(msg: OutMsg) {\n await callHook(assembly.onEmit, undefined, self, msg, {\n fromName: ctx.pname,\n fromId: ctx.id,\n });\n ctx.toParent(msg);\n },\n agreeToStop() {\n exitReason = \"stopped\";\n done = true;\n },\n exit(reason: unknown) {\n exitReason = reason;\n done = true;\n },\n $child: {} as Record<string, AnyProcess>,\n decorators: {},\n fork: async <\n A,\n S,\n IM extends Message,\n OM extends InMsg,\n R extends ReflectionOptions,\n >(\n childActor: ActorDefinition<A, S, IM, OM, R>,\n childArgs?: A,\n forkOpts?: { name?: string; addPlugins?: ActorPlugin[] },\n ): Promise<AsyncProcess<A, HidePrivate<S>, IM, OM, R & ActorReflection>> => {\n let child: AsyncProcess<A, HidePrivate<S>, IM, OM, R & ActorReflection>;\n const childName =\n forkOpts?.name ??\n childActor?.name ??\n `child-${Object.keys(self.$child).length}`;\n const treeName = `${ctx.pname}:${childName}`;\n const childAddPlugins = [\n ...(assembly.addPlugins || []),\n ...(forkOpts?.addPlugins || []),\n ];\n child = await childActor.spawnAsChild(\n ctx,\n childArgs!,\n {\n name: treeName,\n parentPlugins: assembly.resolvedPlugins || [],\n ...(childAddPlugins.length ? { addPlugins: childAddPlugins } : {}),\n },\n );\n self.$child[child.pname] = child as unknown as AnyProcess;\n return child;\n },\n };\n actorCtxMap.set(ctx.id, self);\n\n for (const [k, v] of decorated) {\n (self as Record<string, unknown>)[k] = v;\n }\n\n await callHook(\n assembly.beforeStart,\n assembly.onError,\n self as ActorContext<\n Args,\n never, // state not set yet\n InMsg,\n OutMsg,\n Methods,\n Handlers,\n ReflectionMethods & ActorReflection\n >,\n );\n\n if (assembly.setup) {\n rawState = await assembly.setup.call(\n self as ActorContext<\n Args,\n never, // break inference cycle here\n InMsg,\n OutMsg,\n Methods,\n Handlers,\n ReflectionMethods & ActorReflection\n >,\n args,\n );\n } else {\n rawState = null as InternalState;\n }\n self.state = rawState;\n yield hidePrivate(rawState);\n await callHook(assembly.afterStart, assembly.onError, self);\n\n yield* runDispatchAsync<WithSender<InMsg | ExitMessage>>(\n ctx.pname,\n async (stamped) => {\n const [msg, sender] = stamped;\n if (msg.type === \"STOP\") {\n if (assembly.onStopRequested) {\n await callHook(assembly.onStopRequested, assembly.onError, self);\n // Hook may call agreeToStop(). If not, actor keeps running.\n } else {\n exitReason = \"stopped\";\n done = true;\n }\n return;\n }\n if (msg.type === \"EXIT\") {\n const childName = sender.fromName;\n if (childName && self.$child[childName]) {\n delete self.$child[childName];\n }\n await callHook(\n assembly.onChildExit,\n assembly.onError,\n self,\n childName,\n msg as ExitMessage,\n );\n }\n let hookStopped = false;\n if (\n msg.type !== \"STOP\" &&\n msg.type !== \"EXIT\" &&\n assembly.onMessage\n ) {\n const result = await callHook(\n assembly.onMessage,\n assembly.onError,\n self,\n msg as InMsg,\n sender,\n );\n if (result === STOP_SENTINEL) hookStopped = true;\n }\n if (msg.type !== \"STOP\" && !hookStopped) {\n const handler =\n ((assembly.handlers || ({} as Handlers))[\n msg.type as keyof Handlers\n ] as HandlerFn<InMsg>) || assembly.onUnhandled;\n\n await callHook(\n handler,\n assembly.onError,\n self,\n msg as InMsg,\n sender,\n );\n }\n },\n () => done,\n );\n\n await callHook(assembly.onEnd, assembly.onError, self, exitReason);\n };\n }\n\n type ReflectableProcess = {\n id: symbol;\n $reflection: Record<string, Function>;\n };\n function attachReflection(\n proc: ReflectableProcess,\n reflectionMethods: ReflectionMethods | undefined,\n ): void {\n if (!reflectionMethods) return;\n const self = actorCtxMap.get(proc.id);\n const refl = proc.$reflection as Record<string, Function>;\n for (const [k, m] of Object.entries(reflectionMethods)) {\n refl[k] = m.bind(self);\n }\n }\n\n return {\n fn: makeRuntime(config),\n name: config.name,\n pvtPluginsRaw: config.plugins,\n inMessages: config.inMessages,\n outMessages: config.outMessages,\n async spawn(\n args: Args,\n opts?: {\n name?: string;\n toParent?: (msg: WithSender<OutMsg>) => void;\n addPlugins?: ActorPlugin[];\n },\n ): Promise<\n AsyncProcess<\n Args,\n HidePrivate<InternalState>,\n InMsg,\n OutMsg,\n ReflectionMethods & ActorReflection\n >\n > {\n const plugs = resolvePlugins(config.plugins, undefined, opts?.addPlugins);\n const assembly = await assembleActor(config, plugs, opts?.addPlugins);\n const runtime = makeRuntime(assembly);\n const proc = spawnAsync(runtime, opts?.name ?? assembly.name ?? \"actor\", opts?.toParent)(args);\n attachReflection(proc, assembly.$reflectionMethods as ReflectionMethods);\n return proc as AsyncProcess<\n Args,\n HidePrivate<InternalState>,\n InMsg,\n OutMsg,\n ReflectionMethods & ActorReflection\n >;\n },\n async spawnAsChild(\n ctx: ProcessCtx<unknown, unknown, OutMsg, Message>,\n args: Args,\n opts?: {\n name?: string;\n parentPlugins?: ActorPlugin[];\n addPlugins?: ActorPlugin[];\n },\n ) {\n const plugs = resolvePlugins(config.plugins, opts?.parentPlugins, opts?.addPlugins);\n const assembly = await assembleActor(config, plugs, opts?.addPlugins);\n const runtime = makeRuntime(assembly);\n const proc = ctx.fork(runtime, opts?.name ?? assembly.name ?? \"child\")(args);\n attachReflection(proc, assembly.$reflectionMethods as ReflectionMethods);\n return proc as AsyncProcess<\n Args,\n HidePrivate<InternalState>,\n InMsg,\n OutMsg,\n ReflectionMethods & ActorReflection\n >;\n },\n };\n}\n","/**\n * Posipaki — Erlang-inspired lightweight actor processes built on\n * generator functions. Processes communicate via message-passing,\n * can fork children, and expose their state reactively.\n *\n * @module\n */\n\nimport { Process, spawn } from \"./process.js\";\nimport { runDispatch } from \"./util.js\";\nimport { AsyncProcess, spawnAsync, runDispatchAsync } from \"./process.async.js\";\nimport { asyncify } from \"./adapters.js\";\n\nexport { Process, spawn, runDispatch };\nexport { AsyncProcess, spawnAsync, runDispatchAsync, asyncify };\nexport type { AnyProcess } from \"./process.async.js\";\n\nexport type {\n Message,\n WithSender,\n WithoutSender,\n ExitMessage,\n StopMessage,\n ProcessFn,\n ProcessCtx,\n AsyncProcessFn,\n PipeState,\n SupervisorState,\n SenderOrigin,\n SenderInfo,\n} from \"./types.js\";\n\nexport { defineActor, defineMessages } from \"./define-actor.js\";\nexport type {\n ActorDefinition,\n SpawnedFrom,\n ActorConfig,\n ActorContext,\n MethodOptions,\n HandlerOptions,\n HandlerFn,\n} from \"./actor-types.js\";\n\n// ── hooks ─────────────────────────────────────────────────────────────────\n\nexport { stopPropagation, mergeConfigs, chainHook, callHook } from \"./hooks.js\";\nexport type {\n HookResult,\n ActorPlugin,\n ActorDecorated,\n ActorReflection,\n PluginTransform,\n} from \"./hooks.js\";\n"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"types-D4ZgiRY9.d.ts","names":[],"sources":["../src/process.async.ts","../src/types.ts"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"util-DsfVKxTT.js","names":[],"sources":["../src/util.js"],"sourcesContent":["export function debugLog(level, ...args) {\n if (level) {\n console.log(...args);\n }\n}\n/**\n * Generator helper that loops, yielding `null` and feeding incoming\n * messages to `fn` until `readyFn()` returns true. Used inside\n * process generators to build the main message loop.\n */\nfunction* runDispatch(name, fn, readyFn = () => false, debugLevel = false) {\n let msg;\n while (!readyFn()) {\n msg = yield null;\n debugLog(debugLevel, \"msg\", name, \" <- \", msg);\n fn(msg);\n }\n}\n/**\n* @deprecated Use AsyncProcess._watchExit instead.\n *\n * Wrap a process generator so that on completion it sends STOP to\n * all children and EXIT to the parent. Useful for custom process\n * wrappers that need lifecycle management without extending\n * AsyncProcess.\n */\nfunction watchExit(proc, gen) {\n return function* (ctx, args) {\n try {\n yield* gen(ctx, args);\n }\n finally {\n proc.toAllChildren({ type: \"STOP\" });\n proc.toParent({\n type: \"EXIT\",\n });\n }\n };\n}\n/** Schedule a function to run on the next microtask. Returns an\n * object with `cancel()` and `flush()` methods. */\nfunction defer(fn) {\n const g = globalThis;\n function schedule(deferFn, cancelFn) {\n const taskId = deferFn(fn);\n return () => cancelFn(taskId);\n }\n let cancel;\n if (g.setImmediate && g.clearImmediate) {\n cancel = schedule(g.setImmediate, g.clearImmediate);\n }\n else if (g.requestIdleCallback && g.cancelIdleCallback) {\n cancel = schedule(g.requestIdleCallback, g.cancelIdleCallback);\n }\n else {\n cancel = schedule((f) => setTimeout(f, 0), clearTimeout);\n }\n function flush() {\n cancel();\n fn();\n }\n return { flush, cancel };\n}\n/** Create a new {@link Waiter}. */\nfunction makeWaiter() {\n let resolve;\n let promise = new Promise((_resolve) => {\n resolve = _resolve;\n });\n return { promise, resolve: resolve };\n}\nexport { runDispatch, defer, makeWaiter, watchExit };\n//# sourceMappingURL=util.js.map"],"mappings":";AAAA,SAAgB,SAAS,OAAO,GAAG,MAAM;CACrC,IAAI,OACA,QAAQ,IAAI,GAAG,IAAI;AAE3B;;;;;;AAMA,UAAU,YAAY,MAAM,IAAI,gBAAgB,OAAO,aAAa,OAAO;CACvE,IAAI;CACJ,OAAO,CAAC,QAAQ,GAAG;EACf,MAAM,MAAM;EACZ,SAAS,YAAY,OAAO,MAAM,QAAQ,GAAG;EAC7C,GAAG,GAAG;CACV;AACJ;;;AAwBA,SAAS,MAAM,IAAI;CACf,MAAM,IAAI;CACV,SAAS,SAAS,SAAS,UAAU;EACjC,MAAM,SAAS,QAAQ,EAAE;EACzB,aAAa,SAAS,MAAM;CAChC;CACA,IAAI;CACJ,IAAI,EAAE,gBAAgB,EAAE,gBACpB,SAAS,SAAS,EAAE,cAAc,EAAE,cAAc;MAEjD,IAAI,EAAE,uBAAuB,EAAE,oBAChC,SAAS,SAAS,EAAE,qBAAqB,EAAE,kBAAkB;MAG7D,SAAS,UAAU,MAAM,WAAW,GAAG,CAAC,GAAG,YAAY;CAE3D,SAAS,QAAQ;EACb,OAAO;EACP,GAAG;CACP;CACA,OAAO;EAAE;EAAO;CAAO;AAC3B;;AAEA,SAAS,aAAa;CAClB,IAAI;CAIJ,OAAO;EAAE,SAAA,IAHS,SAAS,aAAa;GACpC,UAAU;EACd,CACe;EAAY;CAAQ;AACvC"}