posipaki 0.12.1 → 0.13.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/hooks.d.ts +1 -1
- package/dist/index.d.ts +2 -2
- package/dist/index.js +7 -0
- package/dist/index.js.map +1 -1
- package/dist/pipe.d.ts +1 -1
- package/dist/{process-EN3wesFn.d.ts → process-DSljemNS.d.ts} +2 -2
- package/dist/{process-EN3wesFn.d.ts.map → process-DSljemNS.d.ts.map} +1 -1
- package/dist/supervisor.d.ts +2 -2
- package/dist/{types-DtMr5eDs.d.ts → types-DW-t7vov.d.ts} +3 -2
- package/dist/{types-DtMr5eDs.d.ts.map → types-DW-t7vov.d.ts.map} +1 -1
- package/dist/xfetch.d.ts +2 -2
- package/package.json +9 -9
package/dist/hooks.d.ts
CHANGED
package/dist/index.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { a as ProcessCtx, c as SenderOrigin, d as WithSender, f as WithoutSender, h as spawnAsync, i as PipeState, l as StopMessage, m as runDispatchAsync, n as ExitMessage, o as ProcessFn, p as AsyncProcess, r as Message, s as SenderInfo, t as AsyncProcessFn, u as SupervisorState } from "./types-
|
|
1
|
+
import { a as ProcessCtx, c as SenderOrigin, d as WithSender, f as WithoutSender, h as spawnAsync, i as PipeState, l as StopMessage, m as runDispatchAsync, n as ExitMessage, o as ProcessFn, p as AsyncProcess, r as Message, s as SenderInfo, t as AsyncProcessFn, u as SupervisorState } from "./types-DW-t7vov.js";
|
|
2
2
|
import { ActorDecorated as ActorDecorated$1, ActorPlugin as ActorPlugin$1, HookRegistry, HookResult as HookResult$1, OnChildExitHook, OnEmitHook, OnEndHook, OnErrorHook, OnMessageHook, OnStartHook as OnStartHook$1, OnStopRequestedHook, PluginTransform as PluginTransform$1, stopPropagation } from "./hooks.js";
|
|
3
|
-
import { n as spawn, r as runDispatch, t as Process } from "./process-
|
|
3
|
+
import { n as spawn, r as runDispatch, t as Process } from "./process-DSljemNS.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
|
@@ -329,6 +329,7 @@ function defineActor(config) {
|
|
|
329
329
|
},
|
|
330
330
|
ctx
|
|
331
331
|
};
|
|
332
|
+
const decorated = /* @__PURE__ */ new Map();
|
|
332
333
|
const ctxAny = ctx;
|
|
333
334
|
ctxAny.onMessage = (fn) => {
|
|
334
335
|
_hooks.onMessage.push(fn);
|
|
@@ -351,6 +352,11 @@ function defineActor(config) {
|
|
|
351
352
|
ctxAny.onEnd = (fn) => {
|
|
352
353
|
_hooks.onEnd.push(fn);
|
|
353
354
|
};
|
|
355
|
+
ctxAny.decorate = (key, value) => {
|
|
356
|
+
if (key in self) throw new Error(`decorate: key "${key}" conflicts with built-in`);
|
|
357
|
+
if (decorated.has(key)) throw new Error(`decorate: key "${key}" already decorated`);
|
|
358
|
+
decorated.set(key, value);
|
|
359
|
+
};
|
|
354
360
|
const resolvedPlugs = getResolvedPlugins(fn) ?? (config.plugins ? typeof config.plugins === "function" ? config.plugins([]) : config.plugins : []);
|
|
355
361
|
for (const p of resolvedPlugs) {
|
|
356
362
|
let _err = null;
|
|
@@ -371,6 +377,7 @@ function defineActor(config) {
|
|
|
371
377
|
if (h.onEnd) _hooks.onEnd.push((reason) => h.onEnd.call(self, reason));
|
|
372
378
|
if (h.onError) _hooks.onError.push((err) => h.onError.call(self, err));
|
|
373
379
|
}
|
|
380
|
+
for (const [key, value] of decorated) self[key] = value;
|
|
374
381
|
yield exposedState;
|
|
375
382
|
if (config.onStart) await config.onStart.call(self, args);
|
|
376
383
|
for (const fn of _hooks.onStart) try {
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["withPlugins"],"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 ProcessCtx,\n AsyncProcessFn,\n ProcessFn,\n Fork,\n} from \"./types.js\";\nimport { asyncify } from \"./adapters.js\";\n\n// ---- types ------------------------------------------------------------------\n\n/** An async iterator over process state. Receives `WithSender<InMessage>`. */\ntype AsyncProcessGenerator<ProcessState, InMessage extends Message> =\n AsyncGenerator<ProcessState | null, void, WithSender<InMessage>>;\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> {\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>> = [];\n private nextTick: DeferredCall | null = null;\n private children: Array<AsyncProcess<unknown, unknown, Message, Message>> =\n [];\n private subscribers: Array<NotifyFn> = [];\n private exitWaiter: Waiter;\n private _isPaused: boolean = false;\n private _tickInProgress: boolean = false;\n private _exitReject: ((e: unknown) => void) | null = null;\n private _ready!: Waiter;\n private _resolveReady!: () => 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 = toParent || (noop as ProcessMessageCb<WithSender<OutMessage>>);\n this.id = Symbol(pname);\n this.state = null;\n this.exitWaiter = makeWaiter();\n this._ready = makeWaiter();\n this._resolveReady = this._ready.resolve;\n }\n\n /** Promise that resolves once the initial state is available. */\n ready(): Promise<void> {\n return this._ready.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) {\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 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._watchExit(ctx, arg0);\n void this.current.next().then((ret: IteratorResult<State | null, void>) => {\n this.state = ret.value ?? null;\n this._resolveReady();\n if (ret.done) {\n this.exitWaiter.resolve();\n return;\n }\n // Advance past the initial yield so the _watchExit generator\n // runs its finally block (EXIT/STOP) and the inner generator\n // enters its dispatch loop.\n const advance: WithSender<InMessage> = [\n { type: \"__ADVANCE__\" } as InMessage,\n { fromName: \"__internal__\", fromId: Symbol(\"__internal__\") } as SenderInfo,\n ];\n this._eatResult(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 *_watchExit(\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<ChildArgs, ChildState, ChildIM, ChildOM>(\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<unknown, unknown, Message, Message>,\n );\n child.start(args);\n return child;\n };\n }\n\n forkSync<\n ChildArgs,\n ChildState,\n ChildIM extends Message,\n ChildOM extends Message,\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 _tick(): Promise<void> {\n if (!this.current || this._tickInProgress) return;\n\n this._tickInProgress = true;\n try {\n let msgAndSender: WithSender<InMessage> | undefined;\n let ret: IteratorResult<State | null, void> | null = null;\n while ((msgAndSender = this.buffer.shift()) !== undefined) {\n ret = await this._safeNext(msgAndSender);\n if (!ret || ret.done) break;\n }\n this.notify();\n this._eatResult(ret);\n } catch (e) {\n this._exitReject?.(e);\n this._exitReject = null;\n } finally {\n this._tickInProgress = false;\n }\n }\n\n /** Call `.next()` and redirect unhandled rejections. */\n private async _safeNext(\n msgAndSender: WithSender<InMessage>,\n ): Promise<IteratorResult<State | null, void> | null> {\n try {\n return await this.current!.next(msgAndSender);\n } catch (e) {\n this._exitReject?.(e);\n this._exitReject = null;\n return { done: true, value: undefined };\n }\n }\n\n private _eatResult(\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, from: SenderInfo): void;\n /** Enqueue a pre-stamped message (internal: fromChild, toAllChildren). */\n send(msgAndSender: WithSender<InMessage>): void;\n send(msgOrTuple: InMessage | WithSender<InMessage>, from?: SenderInfo): void {\n if (from !== undefined) {\n this.buffer.push([msgOrTuple as InMessage, from]);\n } else {\n this.buffer.push(msgOrTuple as WithSender<InMessage>);\n }\n this._scheduleTick();\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 _scheduleTick(): void {\n if (this._isPaused) return;\n\n this.nextTick?.cancel();\n this.nextTick = defer(() => {\n this.nextTick = null;\n void this._tick();\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._isPaused = true;\n }\n\n resume(): void {\n this._isPaused = false;\n this._scheduleTick();\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._exitReject = reject;\n\n this.exitWaiter.promise.then(\n () => {\n this._exitReject = null;\n resolve();\n },\n (e) => {\n this._exitReject = 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>): 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}\n\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) as Process<A, S, IM, OM>;\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._tick();\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//\n// See docs/proposals/define-actor-proposal.md for the full design.\n\nimport { runDispatchAsync, spawnAsync } from \"./process.async.js\";\nimport type {\n SenderInfo,\n WithSender,\n AsyncProcessFn,\n Message,\n ExitMessage,\n ProcessCtx,\n} from \"./types.js\";\nimport type { AsyncProcess } from \"./process.async.js\";\nimport type {\n ActorDefinition,\n ActorConfig,\n ActorContext,\n MethodOptions,\n ActorMessages,\n HandlerOptions,\n HandlerFn,\n} from \"./actor-types.js\";\nimport { HookRegistry, stopPropagation, STOP_SENTINEL } from \"./hooks.js\";\nimport type { ActorPlugin, PluginTransform } from \"./hooks.js\";\nimport type { HookResult, OnMessageHook, OnEmitHook, OnChildExitHook, OnStartHook, OnStopRequestedHook, OnEndHook, OnErrorHook } from \"./hooks.js\";\n\n// ═══════════════════════════════════════════════════════════════════════════════\n// Implementation\n// ═══════════════════════════════════════════════════════════════════════════════\n\nexport function defineMessages<\n OutMsg extends Message = Message,\n>(): ActorMessages<OutMsg> {\n return undefined as unknown as ActorMessages<OutMsg>;\n}\n\nexport function defineActor<\n Args,\n InternalState,\n ExposedState,\n InMsg extends Message,\n OutMsg extends Message,\n Methods extends MethodOptions,\n Handlers extends HandlerOptions<InMsg>,\n>(\n config: ActorConfig<\n Args,\n InternalState,\n ExposedState,\n InMsg,\n OutMsg,\n Methods,\n Handlers\n >,\n): ActorDefinition<Args, ExposedState, InMsg, OutMsg, Handlers> {\n // ── internal helpers ──────────────────────────────────────────────\n\n /** Extract __resolvedPlugins from an async process function\n * (set by the parent's fork() for plugin inheritance). */\n const getResolvedPlugins = (f: unknown): ActorPlugin[] | undefined => {\n const withPlugins = f as { __resolvedPlugins?: ActorPlugin[] };\n return withPlugins.__resolvedPlugins;\n };\n\n /** Stash resolved plugins on a function for the child to read. */\n const stashPlugins = (f: unknown, plugs: ActorPlugin[]): void => {\n (f as { __resolvedPlugins?: ActorPlugin[] }).__resolvedPlugins = plugs;\n };\n\n // Internal generator receives WithSender<InMsg> so sender identity\n // is directly accessible in the dispatch loop with zero casts.\n const fn = async function* (\n ctx: ProcessCtx<Args, ExposedState, InMsg, OutMsg>,\n args: Args,\n ): AsyncGenerator<ExposedState | null, void, WithSender<InMsg>> {\n let done = false;\n let exitReason: unknown;\n let stopRequested = false;\n\n // Resolve internal state — literal or function of args.\n const rawState: InternalState =\n typeof config.initialState === \"function\"\n ? (\n config.initialState as (\n args: Args,\n ictx: typeof ctx,\n ) => InternalState\n )(args, ctx)\n : config.initialState;\n\n // Apply expose if provided, otherwise identity.\n const exposedState: ExposedState = config.expose\n ? config.expose(rawState)\n : (rawState as unknown as ExposedState);\n\n // ── hooks ──────────────────────────────────────────────────────────\n const _hooks = new HookRegistry<any, any, any>();\n\n // Build the actor context.\n const self: ActorContext<\n Args,\n InternalState,\n InMsg,\n OutMsg,\n Methods,\n Handlers\n > = {\n ...((config.methods || {}) as Methods),\n state: rawState,\n name: ctx.pname,\n id: ctx.id,\n emit(msg) {\n // Fire onEmit hooks before the actual emit.\n for (const fn of _hooks.onEmit) {\n try { fn(msg); } catch { /* ignore — errors bubble through onError */ }\n }\n ctx.toParent(msg);\n },\n agreeToStop() {\n exitReason = \"stopped\";\n done = true;\n },\n exit(reason) {\n exitReason = reason;\n done = true;\n },\n $child: {},\n // ── hook registration ─────────────────────────────────────\n onMessage: (fn: OnMessageHook<any>) => { _hooks.onMessage.push(fn); },\n onEmit: (fn: OnEmitHook<any>) => { _hooks.onEmit.push(fn); },\n onChildExit: (fn: OnChildExitHook) => { _hooks.onChildExit.push(fn); },\n onStopRequested: (fn: OnStopRequestedHook) => { _hooks.onStopRequested.push(fn); },\n onError: (fn: OnErrorHook) => { _hooks.onError.push(fn); },\n fork(childFn, name, childArgs) {\n // Unwrap ActorDefinition, derive name.\n const resolved = typeof childFn === \"function\" ? childFn : childFn.fn;\n const childDef: ActorDefinition<unknown, unknown, Message, Message, HandlerOptions<Message>> | null =\n typeof childFn === \"object\" ? childFn : null;\n const childName = name\n ?? childDef?.name\n ?? `child-${Object.keys(self.$child).length}`;\n\n // ── plugin inheritance ───────────────────────────────────────\n // Resolve parent's installed plugins.\n const parentPlugs: ActorPlugin[] = config.plugins\n ? (typeof config.plugins === \"function\" ? config.plugins([]) : config.plugins)\n : [];\n\n // Merge with child's raw config.\n const childRaw: ActorPlugin[] | PluginTransform | undefined = (childDef as { _pluginsRaw?: ActorPlugin[] | PluginTransform })?._pluginsRaw;\n let childPlugs: ActorPlugin[];\n if (!childRaw) {\n childPlugs = [...parentPlugs];\n } else if (Array.isArray(childRaw)) {\n childPlugs = [...childRaw];\n } else {\n childPlugs = childRaw(parentPlugs);\n }\n\n // Stash resolved list on the child's config before fork.\n stashPlugins(resolved, childPlugs);\n\n // Build tree-prefixed name: parent:child\n const treeName = `${ctx.pname}:${childName}`;\n const child = ctx.fork(resolved, treeName)(childArgs!);\n // Store under the resolved name for $child lookup and EXIT matching.\n self.$child[child.pname] = child as unknown as AsyncProcess<\n unknown,\n unknown,\n Message,\n Message\n >;\n return child;\n },\n ctx,\n };\n\n\n // ── wire hook registration onto ctx (for plugin install) ──────\n const ctxAny = ctx as Record<string, unknown>;\n ctxAny.onMessage = (fn: OnMessageHook<InMsg>) => { _hooks.onMessage.push(fn); };\n ctxAny.onEmit = (fn: OnEmitHook<OutMsg>) => { _hooks.onEmit.push(fn); };\n ctxAny.onChildExit = (fn: OnChildExitHook) => { _hooks.onChildExit.push(fn); };\n ctxAny.onStart = (fn: OnStartHook<ExposedState>) => { _hooks.onStart.push(fn); };\n ctxAny.onStopRequested = (fn: OnStopRequestedHook) => { _hooks.onStopRequested.push(fn); };\n ctxAny.onError = (fn: OnErrorHook) => { _hooks.onError.push(fn); };\n ctxAny.onEnd = (fn: OnEndHook) => { _hooks.onEnd.push(fn); };\n\n // ── install plugins ──────────────────────────────────────────────\n // On child actors, __resolvedPlugins is set by the parent's fork().\n // On root actors, use config.plugins directly.\n const resolvedPlugs = getResolvedPlugins(fn)\n ?? (config.plugins\n ? (typeof config.plugins === \"function\" ? config.plugins([]) : config.plugins)\n : []);\n\n for (const p of resolvedPlugs) {\n let _err: unknown = null;\n try {\n await p.install(ctx);\n } catch (e) {\n _err = e;\n }\n // Also catch sync throws from non-async install functions.\n if (_err) {\n console.error(`[${ctx.pname}] plugin \"${p.name}\" install failed:`, _err);\n }\n }\n\n // ── register config.hooks (after plugins, so plugins fire first) ─\n if (config.hooks) {\n const h = config.hooks;\n if (h.onStart) _hooks.onStart.push((state) => h.onStart!.call(self, state));\n if (h.onMessage) _hooks.onMessage.push((msg, sender) => h.onMessage!.call(self, msg, sender));\n if (h.onEmit) _hooks.onEmit.push((msg) => h.onEmit!.call(self, msg));\n if (h.onChildExit) _hooks.onChildExit.push((name) => h.onChildExit!.call(self, name));\n if (h.onStopRequested) _hooks.onStopRequested.push(() => h.onStopRequested!.call(self));\n if (h.onEnd) _hooks.onEnd.push((reason) => h.onEnd!.call(self, reason));\n if (h.onError) _hooks.onError.push((err) => h.onError!.call(self, err));\n }\n\n // Yield the exposed state — external consumers see this.\n yield exposedState;\n\n // Call onStart with args.\n if (config.onStart) {\n await config.onStart.call(self, args);\n }\n\n // Fire hooks.onStart after the actor's own onStart.\n for (const fn of _hooks.onStart) {\n try { await fn(exposedState); } catch (e) { /* error handled by onStart body */ }\n }\n\n // Dispatch loop..\n yield* runDispatchAsync<WithSender<InMsg | ExitMessage>>(\n ctx.pname,\n async (stamped) => {\n const [msg, sender] = stamped;\n\n // ── Built-in STOP handling ──────────────────────────────────\n if (msg.type === \"STOP\") {\n for (const fn of _hooks.onStopRequested) {\n try { await fn(); } catch {}\n }\n if (config.onStopRequested) {\n await config.onStopRequested.call(self);\n if (!done) {\n stopRequested = true;\n }\n } else {\n // Default: agree immediately.\n exitReason = \"stopped\";\n done = true;\n }\n return;\n }\n\n // ── Re-offer deferred STOP ──────────────────────────────────\n if (stopRequested && !done) {\n if (config.onStopRequested) {\n await config.onStopRequested.call(self);\n if (!done) {\n stopRequested = true;\n }\n }\n }\n\n // ── Built-in EXIT handling ──────────────────────────────────\n if (msg.type === \"EXIT\") {\n const childName = sender.fromName;\n\n if (childName && self.$child[childName]) {\n // Recognized child — consume EXIT here.\n delete self.$child[childName];\n }\n for (const fn of _hooks.onChildExit) {\n try { await fn(childName); } catch {}\n }\n if (config.onChildExit) {\n await config.onChildExit.call(self, childName, msg as ExitMessage);\n }\n // Unrecognized EXIT — fall through to handlers/onUnhandled.\n }\n\n // ── onMessage hooks ────────────────────────────────────────\n let hookStopped = false;\n if (msg.type !== \"STOP\" && msg.type !== \"EXIT\") {\n for (const fn of _hooks.onMessage) {\n try {\n const result: HookResult = await fn(msg, sender);\n if (result === STOP_SENTINEL) { hookStopped = true; break; }\n } catch (e) {\n // Error in hook: fire onError hooks, then continue.\n for (const errFn of _hooks.onError) {\n try { errFn(e); } catch {}\n }\n }\n }\n }\n\n // ── Named handlers ──────────────────────────────────────────\n if (msg.type !== \"STOP\" && !hookStopped) {\n const handler = config.handlers[\n msg.type as keyof Handlers\n ] as HandlerFn<InMsg>;\n if (handler) {\n try {\n await handler.call(self, msg as InMsg, sender);\n } catch (e) {\n for (const fn of _hooks.onError) {\n try { fn(e); } catch {}\n }\n throw e; // rethrow to trigger exit\n }\n } else if (config.onUnhandled) {\n try {\n await config.onUnhandled.call(self, msg as InMsg, sender);\n } catch (e) {\n for (const fn of _hooks.onError) {\n try { fn(e); } catch {}\n }\n throw e; // rethrow to trigger exit\n }\n }\n // No onUnhandled: silently drop.\n }\n\n if (done) return;\n },\n () => done,\n );\n\n // Fire hooks.onEnd before the actor's onEnd.\n for (const fn of _hooks.onEnd) {\n try { await fn(exitReason ?? \"done\"); } catch {}\n }\n\n // Call onEnd.\n if (config.onEnd) {\n await config.onEnd.call(self, exitReason ?? \"done\");\n }\n };\n\n return {\n fn: fn as AsyncProcessFn<Args, ExposedState, InMsg, OutMsg>,\n name: config.name,\n _pluginsRaw: config.plugins,\n config: config as unknown as ActorConfig<\n Args,\n InternalState,\n ExposedState,\n InMsg,\n OutMsg,\n {},\n Handlers\n >,\n spawn(args: Args) {\n return spawnAsync(\n fn as AsyncProcessFn<Args, ExposedState, InMsg, OutMsg>,\n config.name ?? \"actor\",\n )(args);\n },\n spawnAsChild(\n ctx: ProcessCtx<any, any, any, any>,\n args: Args,\n name?: string,\n ) {\n return ctx.fork(\n fn as AsyncProcessFn<Args, ExposedState, InMsg, OutMsg>,\n name ?? config.name ?? 'child',\n )(args);\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\";\nimport { runDispatch } from \"./util\";\nimport { AsyncProcess, spawnAsync, runDispatchAsync } from \"./process.async\";\nimport { asyncify } from \"./adapters\";\n\nexport { Process, spawn, runDispatch };\nexport { AsyncProcess, spawnAsync, runDispatchAsync, asyncify };\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\";\n\nexport { defineActor, defineMessages } from \"./define-actor.js\";\nexport type {\n ActorDefinition,\n ActorConfig,\n ActorContext,\n MethodOptions,\n HandlerOptions,\n HandlerFn,\n} from \"./actor-types.js\";\n\n// ── hooks ─────────────────────────────────────────────────────────────────\n\nexport { stopPropagation, HookRegistry } from \"./hooks.js\";\nexport type {\n HookResult,\n OnStartHook,\n OnMessageHook,\n OnEmitHook,\n OnChildExitHook,\n OnStopRequestedHook,\n OnEndHook,\n OnErrorHook,\n ActorPlugin,\n ActorDecorated,\n PluginTransform,\n} from \"./hooks.js\";\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","names":["withPlugins"],"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 ProcessCtx,\n AsyncProcessFn,\n ProcessFn,\n Fork,\n} from \"./types.js\";\nimport { asyncify } from \"./adapters.js\";\n\n// ---- types ------------------------------------------------------------------\n\n/** An async iterator over process state. Receives `WithSender<InMessage>`. */\ntype AsyncProcessGenerator<ProcessState, InMessage extends Message> =\n AsyncGenerator<ProcessState | null, void, WithSender<InMessage>>;\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> {\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>> = [];\n private nextTick: DeferredCall | null = null;\n private children: Array<AsyncProcess<unknown, unknown, Message, Message>> =\n [];\n private subscribers: Array<NotifyFn> = [];\n private exitWaiter: Waiter;\n private _isPaused: boolean = false;\n private _tickInProgress: boolean = false;\n private _exitReject: ((e: unknown) => void) | null = null;\n private _ready!: Waiter;\n private _resolveReady!: () => 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 = toParent || (noop as ProcessMessageCb<WithSender<OutMessage>>);\n this.id = Symbol(pname);\n this.state = null;\n this.exitWaiter = makeWaiter();\n this._ready = makeWaiter();\n this._resolveReady = this._ready.resolve;\n }\n\n /** Promise that resolves once the initial state is available. */\n ready(): Promise<void> {\n return this._ready.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) {\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 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._watchExit(ctx, arg0);\n void this.current.next().then((ret: IteratorResult<State | null, void>) => {\n this.state = ret.value ?? null;\n this._resolveReady();\n if (ret.done) {\n this.exitWaiter.resolve();\n return;\n }\n // Advance past the initial yield so the _watchExit generator\n // runs its finally block (EXIT/STOP) and the inner generator\n // enters its dispatch loop.\n const advance: WithSender<InMessage> = [\n { type: \"__ADVANCE__\" } as InMessage,\n { fromName: \"__internal__\", fromId: Symbol(\"__internal__\") } as SenderInfo,\n ];\n this._eatResult(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 *_watchExit(\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<ChildArgs, ChildState, ChildIM, ChildOM>(\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<unknown, unknown, Message, Message>,\n );\n child.start(args);\n return child;\n };\n }\n\n forkSync<\n ChildArgs,\n ChildState,\n ChildIM extends Message,\n ChildOM extends Message,\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 _tick(): Promise<void> {\n if (!this.current || this._tickInProgress) return;\n\n this._tickInProgress = true;\n try {\n let msgAndSender: WithSender<InMessage> | undefined;\n let ret: IteratorResult<State | null, void> | null = null;\n while ((msgAndSender = this.buffer.shift()) !== undefined) {\n ret = await this._safeNext(msgAndSender);\n if (!ret || ret.done) break;\n }\n this.notify();\n this._eatResult(ret);\n } catch (e) {\n this._exitReject?.(e);\n this._exitReject = null;\n } finally {\n this._tickInProgress = false;\n }\n }\n\n /** Call `.next()` and redirect unhandled rejections. */\n private async _safeNext(\n msgAndSender: WithSender<InMessage>,\n ): Promise<IteratorResult<State | null, void> | null> {\n try {\n return await this.current!.next(msgAndSender);\n } catch (e) {\n this._exitReject?.(e);\n this._exitReject = null;\n return { done: true, value: undefined };\n }\n }\n\n private _eatResult(\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, from: SenderInfo): void;\n /** Enqueue a pre-stamped message (internal: fromChild, toAllChildren). */\n send(msgAndSender: WithSender<InMessage>): void;\n send(msgOrTuple: InMessage | WithSender<InMessage>, from?: SenderInfo): void {\n if (from !== undefined) {\n this.buffer.push([msgOrTuple as InMessage, from]);\n } else {\n this.buffer.push(msgOrTuple as WithSender<InMessage>);\n }\n this._scheduleTick();\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 _scheduleTick(): void {\n if (this._isPaused) return;\n\n this.nextTick?.cancel();\n this.nextTick = defer(() => {\n this.nextTick = null;\n void this._tick();\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._isPaused = true;\n }\n\n resume(): void {\n this._isPaused = false;\n this._scheduleTick();\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._exitReject = reject;\n\n this.exitWaiter.promise.then(\n () => {\n this._exitReject = null;\n resolve();\n },\n (e) => {\n this._exitReject = 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>): 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}\n\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) as Process<A, S, IM, OM>;\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._tick();\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//\n// See docs/proposals/define-actor-proposal.md for the full design.\n\nimport { runDispatchAsync, spawnAsync } from \"./process.async.js\";\nimport type {\n SenderInfo,\n WithSender,\n AsyncProcessFn,\n Message,\n ExitMessage,\n ProcessCtx,\n} from \"./types.js\";\nimport type { AsyncProcess } from \"./process.async.js\";\nimport type {\n ActorDefinition,\n ActorConfig,\n ActorContext,\n MethodOptions,\n ActorMessages,\n HandlerOptions,\n HandlerFn,\n} from \"./actor-types.js\";\nimport { HookRegistry, stopPropagation, STOP_SENTINEL } from \"./hooks.js\";\nimport type { ActorPlugin, PluginTransform } from \"./hooks.js\";\nimport type { HookResult, OnMessageHook, OnEmitHook, OnChildExitHook, OnStartHook, OnStopRequestedHook, OnEndHook, OnErrorHook } from \"./hooks.js\";\n\n// ═══════════════════════════════════════════════════════════════════════════════\n// Implementation\n// ═══════════════════════════════════════════════════════════════════════════════\n\nexport function defineMessages<\n OutMsg extends Message = Message,\n>(): ActorMessages<OutMsg> {\n return undefined as unknown as ActorMessages<OutMsg>;\n}\n\nexport function defineActor<\n Args,\n InternalState,\n ExposedState,\n InMsg extends Message,\n OutMsg extends Message,\n Methods extends MethodOptions,\n Handlers extends HandlerOptions<InMsg>,\n>(\n config: ActorConfig<\n Args,\n InternalState,\n ExposedState,\n InMsg,\n OutMsg,\n Methods,\n Handlers\n >,\n): ActorDefinition<Args, ExposedState, InMsg, OutMsg, Handlers> {\n // ── internal helpers ──────────────────────────────────────────────\n\n /** Extract __resolvedPlugins from an async process function\n * (set by the parent's fork() for plugin inheritance). */\n const getResolvedPlugins = (f: unknown): ActorPlugin[] | undefined => {\n const withPlugins = f as { __resolvedPlugins?: ActorPlugin[] };\n return withPlugins.__resolvedPlugins;\n };\n\n /** Stash resolved plugins on a function for the child to read. */\n const stashPlugins = (f: unknown, plugs: ActorPlugin[]): void => {\n (f as { __resolvedPlugins?: ActorPlugin[] }).__resolvedPlugins = plugs;\n };\n\n // Internal generator receives WithSender<InMsg> so sender identity\n // is directly accessible in the dispatch loop with zero casts.\n const fn = async function* (\n ctx: ProcessCtx<Args, ExposedState, InMsg, OutMsg>,\n args: Args,\n ): AsyncGenerator<ExposedState | null, void, WithSender<InMsg>> {\n let done = false;\n let exitReason: unknown;\n let stopRequested = false;\n\n // Resolve internal state — literal or function of args.\n const rawState: InternalState =\n typeof config.initialState === \"function\"\n ? (\n config.initialState as (\n args: Args,\n ictx: typeof ctx,\n ) => InternalState\n )(args, ctx)\n : config.initialState;\n\n // Apply expose if provided, otherwise identity.\n const exposedState: ExposedState = config.expose\n ? config.expose(rawState)\n : (rawState as unknown as ExposedState);\n\n // ── hooks ──────────────────────────────────────────────────────────\n const _hooks = new HookRegistry<any, any, any>();\n\n // Build the actor context.\n const self: ActorContext<\n Args,\n InternalState,\n InMsg,\n OutMsg,\n Methods,\n Handlers\n > = {\n ...((config.methods || {}) as Methods),\n state: rawState,\n name: ctx.pname,\n id: ctx.id,\n emit(msg) {\n // Fire onEmit hooks before the actual emit.\n for (const fn of _hooks.onEmit) {\n try { fn(msg); } catch { /* ignore — errors bubble through onError */ }\n }\n ctx.toParent(msg);\n },\n agreeToStop() {\n exitReason = \"stopped\";\n done = true;\n },\n exit(reason) {\n exitReason = reason;\n done = true;\n },\n $child: {},\n // ── hook registration ─────────────────────────────────────\n onMessage: (fn: OnMessageHook<any>) => { _hooks.onMessage.push(fn); },\n onEmit: (fn: OnEmitHook<any>) => { _hooks.onEmit.push(fn); },\n onChildExit: (fn: OnChildExitHook) => { _hooks.onChildExit.push(fn); },\n onStopRequested: (fn: OnStopRequestedHook) => { _hooks.onStopRequested.push(fn); },\n onError: (fn: OnErrorHook) => { _hooks.onError.push(fn); },\n fork(childFn, name, childArgs) {\n // Unwrap ActorDefinition, derive name.\n const resolved = typeof childFn === \"function\" ? childFn : childFn.fn;\n const childDef: ActorDefinition<unknown, unknown, Message, Message, HandlerOptions<Message>> | null =\n typeof childFn === \"object\" ? childFn : null;\n const childName = name\n ?? childDef?.name\n ?? `child-${Object.keys(self.$child).length}`;\n\n // ── plugin inheritance ───────────────────────────────────────\n // Resolve parent's installed plugins.\n const parentPlugs: ActorPlugin[] = config.plugins\n ? (typeof config.plugins === \"function\" ? config.plugins([]) : config.plugins)\n : [];\n\n // Merge with child's raw config.\n const childRaw: ActorPlugin[] | PluginTransform | undefined = (childDef as { _pluginsRaw?: ActorPlugin[] | PluginTransform })?._pluginsRaw;\n let childPlugs: ActorPlugin[];\n if (!childRaw) {\n childPlugs = [...parentPlugs];\n } else if (Array.isArray(childRaw)) {\n childPlugs = [...childRaw];\n } else {\n childPlugs = childRaw(parentPlugs);\n }\n\n // Stash resolved list on the child's config before fork.\n stashPlugins(resolved, childPlugs);\n\n // Build tree-prefixed name: parent:child\n const treeName = `${ctx.pname}:${childName}`;\n const child = ctx.fork(resolved, treeName)(childArgs!);\n // Store under the resolved name for $child lookup and EXIT matching.\n self.$child[child.pname] = child as unknown as AsyncProcess<\n unknown,\n unknown,\n Message,\n Message\n >;\n return child;\n },\n ctx,\n };\n\n\n // ── wire hook registration + decorate onto ctx (for plugin install) ─\n const decorated = new Map<string, unknown>();\n const ctxAny = ctx as Record<string, unknown>;\n ctxAny.onMessage = (fn: OnMessageHook<InMsg>) => { _hooks.onMessage.push(fn); };\n ctxAny.onEmit = (fn: OnEmitHook<OutMsg>) => { _hooks.onEmit.push(fn); };\n ctxAny.onChildExit = (fn: OnChildExitHook) => { _hooks.onChildExit.push(fn); };\n ctxAny.onStart = (fn: OnStartHook<ExposedState>) => { _hooks.onStart.push(fn); };\n ctxAny.onStopRequested = (fn: OnStopRequestedHook) => { _hooks.onStopRequested.push(fn); };\n ctxAny.onError = (fn: OnErrorHook) => { _hooks.onError.push(fn); };\n ctxAny.onEnd = (fn: OnEndHook) => { _hooks.onEnd.push(fn); };\n ctxAny.decorate = (key: string, value: unknown) => {\n if (key in self) throw new Error(`decorate: key \"${key}\" conflicts with built-in`);\n if (decorated.has(key)) throw new Error(`decorate: key \"${key}\" already decorated`);\n decorated.set(key, value);\n };\n\n // ── install plugins ──────────────────────────────────────────────\n // On child actors, __resolvedPlugins is set by the parent's fork().\n // On root actors, use config.plugins directly.\n const resolvedPlugs = getResolvedPlugins(fn)\n ?? (config.plugins\n ? (typeof config.plugins === \"function\" ? config.plugins([]) : config.plugins)\n : []);\n\n for (const p of resolvedPlugs) {\n let _err: unknown = null;\n try {\n await p.install(ctx);\n } catch (e) {\n _err = e;\n }\n // Also catch sync throws from non-async install functions.\n if (_err) {\n console.error(`[${ctx.pname}] plugin \"${p.name}\" install failed:`, _err);\n }\n }\n\n // ── register config.hooks (after plugins, so plugins fire first) ─\n if (config.hooks) {\n const h = config.hooks;\n if (h.onStart) _hooks.onStart.push((state) => h.onStart!.call(self, state));\n if (h.onMessage) _hooks.onMessage.push((msg, sender) => h.onMessage!.call(self, msg, sender));\n if (h.onEmit) _hooks.onEmit.push((msg) => h.onEmit!.call(self, msg));\n if (h.onChildExit) _hooks.onChildExit.push((name) => h.onChildExit!.call(self, name));\n if (h.onStopRequested) _hooks.onStopRequested.push(() => h.onStopRequested!.call(self));\n if (h.onEnd) _hooks.onEnd.push((reason) => h.onEnd!.call(self, reason));\n if (h.onError) _hooks.onError.push((err) => h.onError!.call(self, err));\n }\n\n // ── merge decorated properties onto self ───────────────────────\n for (const [key, value] of decorated) {\n (self as Record<string, unknown>)[key] = value;\n }\n\n // Yield the exposed state — external consumers see this.\n yield exposedState;\n\n // Call onStart with args.\n if (config.onStart) {\n await config.onStart.call(self, args);\n }\n\n // Fire hooks.onStart after the actor's own onStart.\n for (const fn of _hooks.onStart) {\n try { await fn(exposedState); } catch (e) { /* error handled by onStart body */ }\n }\n\n // Dispatch loop..\n yield* runDispatchAsync<WithSender<InMsg | ExitMessage>>(\n ctx.pname,\n async (stamped) => {\n const [msg, sender] = stamped;\n\n // ── Built-in STOP handling ──────────────────────────────────\n if (msg.type === \"STOP\") {\n for (const fn of _hooks.onStopRequested) {\n try { await fn(); } catch {}\n }\n if (config.onStopRequested) {\n await config.onStopRequested.call(self);\n if (!done) {\n stopRequested = true;\n }\n } else {\n // Default: agree immediately.\n exitReason = \"stopped\";\n done = true;\n }\n return;\n }\n\n // ── Re-offer deferred STOP ──────────────────────────────────\n if (stopRequested && !done) {\n if (config.onStopRequested) {\n await config.onStopRequested.call(self);\n if (!done) {\n stopRequested = true;\n }\n }\n }\n\n // ── Built-in EXIT handling ──────────────────────────────────\n if (msg.type === \"EXIT\") {\n const childName = sender.fromName;\n\n if (childName && self.$child[childName]) {\n // Recognized child — consume EXIT here.\n delete self.$child[childName];\n }\n for (const fn of _hooks.onChildExit) {\n try { await fn(childName); } catch {}\n }\n if (config.onChildExit) {\n await config.onChildExit.call(self, childName, msg as ExitMessage);\n }\n // Unrecognized EXIT — fall through to handlers/onUnhandled.\n }\n\n // ── onMessage hooks ────────────────────────────────────────\n let hookStopped = false;\n if (msg.type !== \"STOP\" && msg.type !== \"EXIT\") {\n for (const fn of _hooks.onMessage) {\n try {\n const result: HookResult = await fn(msg, sender);\n if (result === STOP_SENTINEL) { hookStopped = true; break; }\n } catch (e) {\n // Error in hook: fire onError hooks, then continue.\n for (const errFn of _hooks.onError) {\n try { errFn(e); } catch {}\n }\n }\n }\n }\n\n // ── Named handlers ──────────────────────────────────────────\n if (msg.type !== \"STOP\" && !hookStopped) {\n const handler = config.handlers[\n msg.type as keyof Handlers\n ] as HandlerFn<InMsg>;\n if (handler) {\n try {\n await handler.call(self, msg as InMsg, sender);\n } catch (e) {\n for (const fn of _hooks.onError) {\n try { fn(e); } catch {}\n }\n throw e; // rethrow to trigger exit\n }\n } else if (config.onUnhandled) {\n try {\n await config.onUnhandled.call(self, msg as InMsg, sender);\n } catch (e) {\n for (const fn of _hooks.onError) {\n try { fn(e); } catch {}\n }\n throw e; // rethrow to trigger exit\n }\n }\n // No onUnhandled: silently drop.\n }\n\n if (done) return;\n },\n () => done,\n );\n\n // Fire hooks.onEnd before the actor's onEnd.\n for (const fn of _hooks.onEnd) {\n try { await fn(exitReason ?? \"done\"); } catch {}\n }\n\n // Call onEnd.\n if (config.onEnd) {\n await config.onEnd.call(self, exitReason ?? \"done\");\n }\n };\n\n return {\n fn: fn as AsyncProcessFn<Args, ExposedState, InMsg, OutMsg>,\n name: config.name,\n _pluginsRaw: config.plugins,\n config: config as unknown as ActorConfig<\n Args,\n InternalState,\n ExposedState,\n InMsg,\n OutMsg,\n {},\n Handlers\n >,\n spawn(args: Args) {\n return spawnAsync(\n fn as AsyncProcessFn<Args, ExposedState, InMsg, OutMsg>,\n config.name ?? \"actor\",\n )(args);\n },\n spawnAsChild(\n ctx: ProcessCtx<any, any, any, any>,\n args: Args,\n name?: string,\n ) {\n return ctx.fork(\n fn as AsyncProcessFn<Args, ExposedState, InMsg, OutMsg>,\n name ?? config.name ?? 'child',\n )(args);\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\";\nimport { runDispatch } from \"./util\";\nimport { AsyncProcess, spawnAsync, runDispatchAsync } from \"./process.async\";\nimport { asyncify } from \"./adapters\";\n\nexport { Process, spawn, runDispatch };\nexport { AsyncProcess, spawnAsync, runDispatchAsync, asyncify };\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\";\n\nexport { defineActor, defineMessages } from \"./define-actor.js\";\nexport type {\n ActorDefinition,\n ActorConfig,\n ActorContext,\n MethodOptions,\n HandlerOptions,\n HandlerFn,\n} from \"./actor-types.js\";\n\n// ── hooks ─────────────────────────────────────────────────────────────────\n\nexport { stopPropagation, HookRegistry } from \"./hooks.js\";\nexport type {\n HookResult,\n OnStartHook,\n OnMessageHook,\n OnEmitHook,\n OnChildExitHook,\n OnStopRequestedHook,\n OnEndHook,\n OnErrorHook,\n ActorPlugin,\n ActorDecorated,\n PluginTransform,\n} from \"./hooks.js\";\n"],"mappings":"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"}
|
package/dist/pipe.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { d as WithSender, n as ExitMessage, o as ProcessFn, p as AsyncProcess, r as Message } from "./types-
|
|
1
|
+
import { d as WithSender, n as ExitMessage, o as ProcessFn, p as AsyncProcess, r as Message } from "./types-DW-t7vov.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-
|
|
33
|
+
//# sourceMappingURL=process-DSljemNS.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"process-
|
|
1
|
+
{"version":3,"file":"process-DSljemNS.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"}
|
package/dist/supervisor.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { a as ProcessCtx, d as WithSender, n as ExitMessage, o as ProcessFn } from "./types-
|
|
2
|
-
import { t as Process } from "./process-
|
|
1
|
+
import { a as ProcessCtx, d as WithSender, n as ExitMessage, o as ProcessFn } from "./types-DW-t7vov.js";
|
|
2
|
+
import { t as Process } from "./process-DSljemNS.js";
|
|
3
3
|
|
|
4
4
|
//#region src/supervisor.d.ts
|
|
5
5
|
type SupMsg = ExitMessage | RunMsg | StopMsg | ErrorMsg | OkMsg;
|
|
@@ -130,7 +130,8 @@ type ProcessCtx<Args, State, IM extends Message, OM extends Message> = {
|
|
|
130
130
|
onStart?: (fn: (state: State) => void | Promise<void>) => void; /** Register an onStopRequested hook. */
|
|
131
131
|
onStopRequested?: (fn: () => void | Promise<void>) => void; /** Register an onError hook. */
|
|
132
132
|
onError?: (fn: (err: unknown) => void) => void; /** Register an onEnd hook. Fires before the process exits. */
|
|
133
|
-
onEnd?: (fn: (reason: unknown) => void | Promise<void>) => void;
|
|
133
|
+
onEnd?: (fn: (reason: unknown) => void | Promise<void>) => void; /** Register a decorated property. Throws if key conflicts. */
|
|
134
|
+
decorate?: (key: string, value: unknown) => void;
|
|
134
135
|
} & Pick<AsyncProcess<Args, State, IM, OM>, "fork" | "forkSync">;
|
|
135
136
|
/** State yielded by the pipe process. */
|
|
136
137
|
interface PipeState<Params, Result> {
|
|
@@ -145,4 +146,4 @@ interface SupervisorState {
|
|
|
145
146
|
}
|
|
146
147
|
//#endregion
|
|
147
148
|
export { ProcessCtx as a, SenderOrigin as c, WithSender as d, WithoutSender as f, spawnAsync as h, PipeState as i, StopMessage as l, runDispatchAsync as m, ExitMessage as n, ProcessFn as o, AsyncProcess as p, Message as r, SenderInfo as s, AsyncProcessFn as t, SupervisorState as u };
|
|
148
|
-
//# sourceMappingURL=types-
|
|
149
|
+
//# sourceMappingURL=types-DW-t7vov.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types-
|
|
1
|
+
{"version":3,"file":"types-DW-t7vov.d.ts","names":[],"sources":["../src/process.async.ts","../src/types.ts"],"mappings":"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"}
|
package/dist/xfetch.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { a as ProcessCtx, d as WithSender, n as ExitMessage } from "./types-
|
|
2
|
-
import { t as Process } from "./process-
|
|
1
|
+
import { a as ProcessCtx, d as WithSender, n as ExitMessage } from "./types-DW-t7vov.js";
|
|
2
|
+
import { t as Process } from "./process-DSljemNS.js";
|
|
3
3
|
|
|
4
4
|
//#region src/xfetch.d.ts
|
|
5
5
|
/** State of an in-flight or completed fetch. */
|
package/package.json
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
{
|
|
2
2
|
"type": "module",
|
|
3
3
|
"name": "posipaki",
|
|
4
|
-
"version": "0.
|
|
5
|
-
"main": "./
|
|
6
|
-
"types": "./
|
|
4
|
+
"version": "0.13.0",
|
|
5
|
+
"main": "./src/index.ts",
|
|
6
|
+
"types": "./src/index.ts",
|
|
7
7
|
"files": [
|
|
8
8
|
"dist"
|
|
9
9
|
],
|
|
@@ -22,12 +22,12 @@
|
|
|
22
22
|
},
|
|
23
23
|
"exports": {
|
|
24
24
|
".": {
|
|
25
|
-
"types": "./
|
|
26
|
-
"default": "./
|
|
25
|
+
"types": "./src/index.ts",
|
|
26
|
+
"default": "./src/index.ts"
|
|
27
27
|
},
|
|
28
28
|
"./xfetch": {
|
|
29
|
-
"types": "./
|
|
30
|
-
"default": "./
|
|
29
|
+
"types": "./src/xfetch.ts",
|
|
30
|
+
"default": "./src/xfetch.ts"
|
|
31
31
|
},
|
|
32
32
|
"./plugins/debug-logger": {
|
|
33
33
|
"types": "./dist/plugins/debug-logger.d.ts",
|
|
@@ -42,8 +42,8 @@
|
|
|
42
42
|
"default": "./dist/plugins/rbac.js"
|
|
43
43
|
},
|
|
44
44
|
"./hooks": {
|
|
45
|
-
"types": "./
|
|
46
|
-
"default": "./
|
|
45
|
+
"types": "./src/hooks.ts",
|
|
46
|
+
"default": "./src/hooks.ts"
|
|
47
47
|
}
|
|
48
48
|
}
|
|
49
49
|
}
|