posipaki 0.16.0 → 0.16.2
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/index.js +1 -1
- package/dist/plugins/debug-logger.d.ts +16 -3
- package/dist/plugins/debug-logger.d.ts.map +1 -1
- package/dist/plugins/debug-logger.js +38 -13
- package/dist/plugins/debug-logger.js.map +1 -1
- package/dist/remote/index.js +1 -1
- package/dist/{src-4KNZmXeS.js → src-B2jOTwzs.js} +2 -2
- package/dist/src-B2jOTwzs.js.map +1 -0
- package/package.json +1 -1
- package/dist/src-4KNZmXeS.js.map +0 -1
package/dist/index.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
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-
|
|
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-B2jOTwzs.js";
|
|
3
3
|
import { r as stopPropagation, t as HookRegistry } from "./hooks-D5DhD9gu.js";
|
|
4
4
|
export { AsyncProcess, HookRegistry, Process, asyncify, defineActor, defineMessages, runDispatch, runDispatchAsync, spawn, spawnAsync, stopPropagation };
|
|
@@ -1,11 +1,24 @@
|
|
|
1
1
|
import { s as ActorPlugin } from "../hooks-Czj67zNB.js";
|
|
2
2
|
|
|
3
3
|
//#region src/plugins/debug-logger.d.ts
|
|
4
|
+
interface DebugLogFn {
|
|
5
|
+
(message: string, ...args: unknown[]): void;
|
|
6
|
+
}
|
|
7
|
+
interface Logger {
|
|
8
|
+
debug: DebugLogFn;
|
|
9
|
+
info: DebugLogFn;
|
|
10
|
+
warn: DebugLogFn;
|
|
11
|
+
error: DebugLogFn;
|
|
12
|
+
}
|
|
13
|
+
/** Factory: receives an actor name, returns a Logger. */
|
|
14
|
+
type LoggerFactory = (name: string) => Logger;
|
|
4
15
|
interface DebugLoggerOpts {
|
|
5
|
-
|
|
6
|
-
|
|
16
|
+
/** Message types to silence (e.g. ['HEARTBEAT', 'TICK']). Default: none. */
|
|
17
|
+
ignore?: string[];
|
|
18
|
+
/** Logger factory. Default: console-based logger. */
|
|
19
|
+
factory?: LoggerFactory;
|
|
7
20
|
}
|
|
8
21
|
declare function debugLogger(opts?: DebugLoggerOpts): ActorPlugin;
|
|
9
22
|
//#endregion
|
|
10
|
-
export { DebugLoggerOpts, debugLogger };
|
|
23
|
+
export { DebugLogFn, DebugLoggerOpts, Logger, LoggerFactory, debugLogger };
|
|
11
24
|
//# sourceMappingURL=debug-logger.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"debug-logger.d.ts","names":[],"sources":["../../src/plugins/debug-logger.ts"],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"debug-logger.d.ts","names":[],"sources":["../../src/plugins/debug-logger.ts"],"mappings":";;;UAmCiB,UAAA;EAAA,CACd,OAAA,aAAoB,IAAI;AAAA;AAAA,UAGV,MAAA;EACf,KAAA,EAAO,UAAA;EACP,IAAA,EAAM,UAAA;EACN,IAAA,EAAM,UAAA;EACN,KAAA,EAAO,UAAA;AAAA;;KAIG,aAAA,IAAiB,IAAA,aAAiB,MAAM;AAAA,UAInC,eAAA;EATT;EAWN,MAAA;EAViB;EAYjB,OAAA,GAAU,aAAa;AAAA;AAAA,iBAyCT,WAAA,CAAY,IAAA,GAAO,eAAA,GAAkB,WAAW"}
|
|
@@ -1,33 +1,58 @@
|
|
|
1
1
|
//#region src/plugins/debug-logger.ts
|
|
2
|
+
function patterns() {
|
|
3
|
+
const raw = (process.env.DEBUG ?? "").trim();
|
|
4
|
+
if (!raw) return [];
|
|
5
|
+
return raw.split(",").map((p) => p.trim()).filter(Boolean);
|
|
6
|
+
}
|
|
7
|
+
function matches(name, pats) {
|
|
8
|
+
if (pats.length === 0) return false;
|
|
9
|
+
for (const p of pats) {
|
|
10
|
+
if (p === "*") return true;
|
|
11
|
+
if (p.endsWith(":*")) {
|
|
12
|
+
const prefix = p.slice(0, -2);
|
|
13
|
+
if (name === prefix || name.startsWith(prefix + ":")) return true;
|
|
14
|
+
continue;
|
|
15
|
+
}
|
|
16
|
+
if (p === name) return true;
|
|
17
|
+
}
|
|
18
|
+
return false;
|
|
19
|
+
}
|
|
20
|
+
function defaultFactory(name) {
|
|
21
|
+
return {
|
|
22
|
+
debug: (...args) => console.debug(`[${name}]`, ...args),
|
|
23
|
+
info: (...args) => console.info(`[${name}]`, ...args),
|
|
24
|
+
warn: (...args) => console.warn(`[${name}]`, ...args),
|
|
25
|
+
error: (...args) => console.error(`[${name}]`, ...args)
|
|
26
|
+
};
|
|
27
|
+
}
|
|
2
28
|
function debugLogger(opts) {
|
|
3
|
-
const
|
|
4
|
-
const
|
|
29
|
+
const ignoreSet = new Set(opts?.ignore ?? []);
|
|
30
|
+
const factory = opts?.factory ?? defaultFactory;
|
|
5
31
|
return {
|
|
6
32
|
name: "debugLogger",
|
|
7
33
|
install(self) {
|
|
8
34
|
const name = self.name;
|
|
35
|
+
const pats = patterns();
|
|
36
|
+
const log = factory(name);
|
|
37
|
+
self.decorate("log", log);
|
|
38
|
+
if (!matches(name, pats)) return;
|
|
9
39
|
self.hooks.onMessage((msg, sender) => {
|
|
10
|
-
if (
|
|
11
|
-
const via = sender ? ` from ${sender.fromName}` : "";
|
|
12
|
-
log(
|
|
40
|
+
if (ignoreSet.has(msg.type)) return;
|
|
41
|
+
const via = sender?.fromName ? ` from ${sender.fromName}` : "";
|
|
42
|
+
log.debug(`${name} ← ${msg.type}${via}`, msg);
|
|
13
43
|
});
|
|
14
44
|
self.hooks.onEmit((msg) => {
|
|
15
|
-
log(
|
|
45
|
+
log.debug(`${name} → ${msg.type}`, msg);
|
|
16
46
|
});
|
|
17
47
|
self.hooks.onChildExit((childName) => {
|
|
18
|
-
log(
|
|
48
|
+
log.debug(`child ${childName} exited`);
|
|
19
49
|
});
|
|
20
50
|
self.hooks.onError((err) => {
|
|
21
|
-
|
|
51
|
+
log.error(`${err.message ?? err}`);
|
|
22
52
|
});
|
|
23
53
|
}
|
|
24
54
|
};
|
|
25
55
|
}
|
|
26
|
-
function log(level, msg) {
|
|
27
|
-
const line = `[${(/* @__PURE__ */ new Date()).toISOString().slice(11, 23)}] ${msg}`;
|
|
28
|
-
if (level === "info") console.info(line);
|
|
29
|
-
else console.debug(line);
|
|
30
|
-
}
|
|
31
56
|
//#endregion
|
|
32
57
|
export { debugLogger };
|
|
33
58
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"debug-logger.js","names":[],"sources":["../../src/plugins/debug-logger.ts"],"sourcesContent":["// ── debugLogger Plugin ───────────────────────────────────────────────────\n//\n//
|
|
1
|
+
{"version":3,"file":"debug-logger.js","names":[],"sources":["../../src/plugins/debug-logger.ts"],"sourcesContent":["// ── debugLogger Plugin ───────────────────────────────────────────────────\n//\n// Controlled via the DEBUG environment variable.\n//\n// DEBUG format: comma-separated patterns with glob-like subtree matching.\n//\n// DEBUG=* enable all debug logging\n// DEBUG=openai:connector log only the connector actor\n// DEBUG=openai:* log the openai actor and its subtree\n// DEBUG=openai:connector,openai:tools log connector and tools\n//\n// Usage:\n//\n// import { debugLogger } from 'posipaki/plugins/debug-logger';\n// const MyActor = defineActor({\n// plugins: [debugLogger()],\n// ...\n// });\n//\n// The plugin decorates every actor with `this.log` — a logger instance\n// available in handlers, hooks, and lifecycle methods. By default it\n// writes to `console`, but you can supply a custom factory:\n//\n// import { debugLogger } from 'posipaki/plugins/debug-logger';\n// plugins: [debugLogger({ factory: (name) => myCustomLogger(name) })],\n//\n// Message filtering: pass `ignore` to suppress noisy message types.\n//\n// plugins: [debugLogger({ ignore: ['HEARTBEAT', 'TICK'] })],\n//\n\nimport type { ActorPlugin } from '../hooks.js';\n\n// ── Logger interface ────────────────────────────────────────────────────\n\nexport interface DebugLogFn {\n (message: string, ...args: unknown[]): void;\n}\n\nexport interface Logger {\n debug: DebugLogFn;\n info: DebugLogFn;\n warn: DebugLogFn;\n error: DebugLogFn;\n}\n\n/** Factory: receives an actor name, returns a Logger. */\nexport type LoggerFactory = (name: string) => Logger;\n\n// ── options ─────────────────────────────────────────────────────────────\n\nexport interface DebugLoggerOpts {\n /** Message types to silence (e.g. ['HEARTBEAT', 'TICK']). Default: none. */\n ignore?: string[];\n /** Logger factory. Default: console-based logger. */\n factory?: LoggerFactory;\n}\n\n// ── pattern matching ─────────────────────────────────────────────────────\n\nfunction patterns(): string[] {\n const raw = (process.env.DEBUG ?? '').trim();\n if (!raw) return [];\n return raw\n .split(',')\n .map((p) => p.trim())\n .filter(Boolean);\n}\n\nfunction matches(name: string, pats: string[]): boolean {\n if (pats.length === 0) return false;\n for (const p of pats) {\n if (p === '*') return true;\n if (p.endsWith(':*')) {\n const prefix = p.slice(0, -2);\n if (name === prefix || name.startsWith(prefix + ':')) return true;\n continue;\n }\n if (p === name) return true;\n }\n return false;\n}\n\n// ── default logger ──────────────────────────────────────────────────────\n\nfunction defaultFactory(name: string): Logger {\n return {\n debug: (...args: unknown[]) => console.debug(`[${name}]`, ...args),\n info: (...args: unknown[]) => console.info(`[${name}]`, ...args),\n warn: (...args: unknown[]) => console.warn(`[${name}]`, ...args),\n error: (...args: unknown[]) => console.error(`[${name}]`, ...args),\n };\n}\n\n// ── plugin ───────────────────────────────────────────────────────────────\n\nexport function debugLogger(opts?: DebugLoggerOpts): ActorPlugin {\n const ignoreSet = new Set(opts?.ignore ?? []);\n const factory = opts?.factory ?? defaultFactory;\n\n return {\n name: 'debugLogger',\n install(self) {\n const name: string = self.name;\n const pats = patterns();\n const log = factory(name);\n\n // Always decorate so handlers can use this.log.\n self.decorate('log', log);\n\n // Only register hooks if DEBUG patterns match.\n if (!matches(name, pats)) return;\n\n self.hooks.onMessage((msg: any, sender: any) => {\n if (ignoreSet.has(msg.type)) return;\n const via = sender?.fromName ? ` from ${sender.fromName}` : '';\n log.debug(`${name} ← ${msg.type}${via}`, msg);\n });\n\n self.hooks.onEmit((msg: any) => {\n log.debug(`${name} → ${msg.type}`, msg);\n });\n\n self.hooks.onChildExit((childName: string) => {\n log.debug(`child ${childName} exited`);\n });\n\n self.hooks.onError((err: unknown) => {\n log.error(`${(err as Error).message ?? err}`);\n });\n },\n };\n}\n"],"mappings":";AA4DA,SAAS,WAAqB;CAC5B,MAAM,OAAO,QAAQ,IAAI,SAAS,IAAI,KAAK;CAC3C,IAAI,CAAC,KAAK,OAAO,CAAC;CAClB,OAAO,IACJ,MAAM,GAAG,EACT,KAAK,MAAM,EAAE,KAAK,CAAC,EACnB,OAAO,OAAO;AACnB;AAEA,SAAS,QAAQ,MAAc,MAAyB;CACtD,IAAI,KAAK,WAAW,GAAG,OAAO;CAC9B,KAAK,MAAM,KAAK,MAAM;EACpB,IAAI,MAAM,KAAK,OAAO;EACtB,IAAI,EAAE,SAAS,IAAI,GAAG;GACpB,MAAM,SAAS,EAAE,MAAM,GAAG,EAAE;GAC5B,IAAI,SAAS,UAAU,KAAK,WAAW,SAAS,GAAG,GAAG,OAAO;GAC7D;EACF;EACA,IAAI,MAAM,MAAM,OAAO;CACzB;CACA,OAAO;AACT;AAIA,SAAS,eAAe,MAAsB;CAC5C,OAAO;EACL,QAAQ,GAAG,SAAoB,QAAQ,MAAM,IAAI,KAAK,IAAI,GAAG,IAAI;EACjE,OAAO,GAAG,SAAoB,QAAQ,KAAK,IAAI,KAAK,IAAI,GAAG,IAAI;EAC/D,OAAO,GAAG,SAAoB,QAAQ,KAAK,IAAI,KAAK,IAAI,GAAG,IAAI;EAC/D,QAAQ,GAAG,SAAoB,QAAQ,MAAM,IAAI,KAAK,IAAI,GAAG,IAAI;CACnE;AACF;AAIA,SAAgB,YAAY,MAAqC;CAC/D,MAAM,YAAY,IAAI,IAAI,MAAM,UAAU,CAAC,CAAC;CAC5C,MAAM,UAAU,MAAM,WAAW;CAEjC,OAAO;EACL,MAAM;EACN,QAAQ,MAAM;GACZ,MAAM,OAAe,KAAK;GAC1B,MAAM,OAAO,SAAS;GACtB,MAAM,MAAM,QAAQ,IAAI;GAGxB,KAAK,SAAS,OAAO,GAAG;GAGxB,IAAI,CAAC,QAAQ,MAAM,IAAI,GAAG;GAE1B,KAAK,MAAM,WAAW,KAAU,WAAgB;IAC9C,IAAI,UAAU,IAAI,IAAI,IAAI,GAAG;IAC7B,MAAM,MAAM,QAAQ,WAAW,SAAS,OAAO,aAAa;IAC5D,IAAI,MAAM,GAAG,KAAK,KAAK,IAAI,OAAO,OAAO,GAAG;GAC9C,CAAC;GAED,KAAK,MAAM,QAAQ,QAAa;IAC9B,IAAI,MAAM,GAAG,KAAK,KAAK,IAAI,QAAQ,GAAG;GACxC,CAAC;GAED,KAAK,MAAM,aAAa,cAAsB;IAC5C,IAAI,MAAM,SAAS,UAAU,QAAQ;GACvC,CAAC;GAED,KAAK,MAAM,SAAS,QAAiB;IACnC,IAAI,MAAM,GAAI,IAAc,WAAW,KAAK;GAC9C,CAAC;EACH;CACF;AACF"}
|
package/dist/remote/index.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { s as spawnAsync, t as defineActor } from "../src-
|
|
1
|
+
import { s as spawnAsync, t as defineActor } from "../src-B2jOTwzs.js";
|
|
2
2
|
import { r as stopPropagation } from "../hooks-D5DhD9gu.js";
|
|
3
3
|
import { open, unlink } from "node:fs/promises";
|
|
4
4
|
import { createReadStream } from "node:fs";
|
|
@@ -351,7 +351,7 @@ function defineActor(config) {
|
|
|
351
351
|
else childPlugs = childRaw(parentPlugs);
|
|
352
352
|
stashPlugins(resolved, childPlugs);
|
|
353
353
|
const treeName = `${ctx.pname}:${childName}`;
|
|
354
|
-
const child = ctx.fork(resolved, treeName)(childArgs);
|
|
354
|
+
const child = childDef ? childDef.spawnAsChild(ctx, childArgs, treeName) : ctx.fork(resolved, treeName)(childArgs);
|
|
355
355
|
self.$child[child.pname] = child;
|
|
356
356
|
return child;
|
|
357
357
|
}
|
|
@@ -502,4 +502,4 @@ function defineActor(config) {
|
|
|
502
502
|
//#endregion
|
|
503
503
|
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 };
|
|
504
504
|
|
|
505
|
-
//# sourceMappingURL=src-
|
|
505
|
+
//# sourceMappingURL=src-B2jOTwzs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"src-B2jOTwzs.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 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<ProcessState, InMessage extends Message> =\n AsyncGenerator<ProcessState | null, void, WithSender<InMessage | StopMessage>>;\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 = {},\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<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 = 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 { fromName: \"__internal__\", fromId: Symbol(\"__internal__\") } 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<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, this.pname, this.id);\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 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(msgOrTuple: InMessage | StopMessage | WithSender<InMessage | StopMessage>, from?: SenderInfo): void {\n if ('type' in msgOrTuple) {\n this.buffer.push([msgOrTuple as InMessage | StopMessage, from as SenderInfo]);\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}\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.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//\n// See docs/proposals/define-actor-proposal.md for the full design.\n\nimport { runDispatchAsync, spawnAsync } from \"./process.async.js\";\nimport type {\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, STOP_SENTINEL } from \"./hooks.js\";\nimport type { ActorPlugin } 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 ReflectionMethods = {},\n>(\n config: ActorConfig<\n Args,\n InternalState,\n ExposedState,\n InMsg,\n OutMsg,\n Methods,\n Handlers,\n ReflectionMethods\n >,\n): ActorDefinition<Args, ExposedState, InMsg, OutMsg, Handlers, ReflectionMethods> {\n // ── internal helpers ──────────────────────────────────────────────\n\n /** Extract pvtResolvedPlugins from an async process function\n * (set by the parent's fork() for plugin inheritance). */\n // eslint-disable-next-line unicorn/consistent-function-scoping\n const getResolvedPlugins = (f: unknown): ActorPlugin[] | undefined => {\n const withPlugins = f as { pvtResolvedPlugins?: ActorPlugin[] };\n return withPlugins.pvtResolvedPlugins;\n };\n\n /** Stash resolved plugins on a function for the child to read. */\n // eslint-disable-next-line unicorn/consistent-function-scoping\n const stashPlugins = (f: unknown, plugs: ActorPlugin[]): void => {\n (f as { pvtResolvedPlugins?: ActorPlugin[] }).pvtResolvedPlugins = plugs;\n };\n\n // Internal generator receives WithSender<InMsg> so sender identity\n // is directly accessible in the dispatch loop with zero casts.\n // Promise that resolves with the ActorContext after yield.\n // Reflection methods await this so they get the real `this` context.\n const actorCtxMap = new Map<symbol, ActorContext<Args, InternalState, InMsg, OutMsg, Methods, Handlers>>();\n const pvtRegisteredReflection = new Map<symbol, Map<string, Function>>();\n\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 // State resolved below after self is built.\n let rawState: InternalState = undefined as unknown as InternalState;\n let exposedState: ExposedState = undefined as unknown as ExposedState;\n\n // ── hooks ──────────────────────────────────────────────────────────\n const pvtHooks = new HookRegistry<any, any, any>();\n\n const decorated = new Map<string, unknown>();\n\n // Build the actor context.\n const self: ActorContext<\n Args,\n InternalState,\n InMsg,\n OutMsg,\n Methods,\n Handlers\n > = {\n ctx: ctx as ProcessCtx<Args, InternalState, InMsg, OutMsg>,\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 hookFn of pvtHooks.onEmit) {\n try { hookFn(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 // ── registration API ─────────────────────────────────────\n hooks: {\n onMessage: (h: OnMessageHook<any>) => { pvtHooks.onMessage.push(h); },\n onEmit: (h: OnEmitHook<any>) => { pvtHooks.onEmit.push(h); },\n onChildExit: (h: OnChildExitHook) => { pvtHooks.onChildExit.push(h); },\n onStart: (h: OnStartHook<unknown>) => { pvtHooks.onStart.push(h); },\n onStopRequested: (h: OnStopRequestedHook) => { pvtHooks.onStopRequested.push(h); },\n onError: (h: OnErrorHook) => { pvtHooks.onError.push(h); },\n onEnd: (h: OnEndHook) => { pvtHooks.onEnd.push(h); },\n },\n reflection: {\n register(name: string, method: (this: ActorContext<unknown, unknown, Message, Message, MethodOptions, HandlerOptions<Message>>) => unknown) {\n let methods = pvtRegisteredReflection.get(ctx.id);\n if (!methods) {\n methods = new Map();\n pvtRegisteredReflection.set(ctx.id, methods);\n }\n methods.set(`${currentPluginName}.${name}`, method as Function);\n },\n },\n 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 fork(childFn, name, childArgs) {\n // Unwrap ActorDefinition, derive name.\n const resolved = typeof childFn === \"function\" ? childFn : childFn.fn;\n const childDef =\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 = childDef?.pvtPluginsRaw;\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 = childDef\n ? childDef.spawnAsChild(ctx, childArgs!, treeName)\n : 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 \n };\n actorCtxMap.set(ctx.id, self);\n\n // ── install plugins ──────────────────────────────────────────────\n // On child actors, pvtResolvedPlugins 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 let currentPluginName: string | null = null;\n for (const p of resolvedPlugs) {\n let pvtErr: unknown = null;\n currentPluginName = p.name;\n try {\n await p.install(self as unknown as ActorContext<unknown, unknown, Message, Message, MethodOptions, HandlerOptions<Message>>);\n } catch (e) {\n pvtErr = e;\n }\n // Also catch sync throws from non-async install functions.\n if (pvtErr) {\n console.error(`[${ctx.pname}] plugin \"${p.name}\" install failed:`, pvtErr);\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) pvtHooks.onStart.push((state) => h.onStart!.call(self, state));\n if (h.onMessage) pvtHooks.onMessage.push((msg, sender) => h.onMessage!.call(self, msg, sender));\n if (h.onEmit) pvtHooks.onEmit.push((msg) => h.onEmit!.call(self, msg));\n if (h.onChildExit) pvtHooks.onChildExit.push((name) => h.onChildExit!.call(self, name));\n if (h.onStopRequested) pvtHooks.onStopRequested.push(() => h.onStopRequested!.call(self));\n if (h.onEnd) pvtHooks.onEnd.push((reason) => h.onEnd!.call(self, reason));\n if (h.onError) pvtHooks.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 // ── resolve state (setup or initialState) ────────────────────\n if (config.setup) {\n rawState = await config.setup.call(self, args);\n } else if (typeof config.initialState === \"function\") {\n rawState = (config.initialState as (a: Args, ictx: typeof ctx) => InternalState)(args, ctx);\n } else if (config.initialState !== undefined) {\n rawState = config.initialState;\n } else {\n throw new Error(\"ActorConfig: setup() or initialState is required\");\n }\n (self as { state: unknown }).state = rawState;\n exposedState = config.expose\n ? config.expose(rawState)\n : (rawState as unknown as ExposedState);\n\n // Call onStart with args (legacy — use setup() for new code).\n if (config.onStart) {\n await config.onStart.call(self, args);\n exposedState = config.expose\n ? config.expose(rawState)\n : (rawState as unknown as ExposedState);\n }\n\n // Fire hooks.onStart.\n for (const hookFn of pvtHooks.onStart) {\n try { await hookFn(exposedState); } catch {}\n }\n\n yield exposedState;\n\n\n // ── afterStart ──────────────────────────────────────────────────\n if (config.afterStart) { await config.afterStart.call(self); }\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 hookFn of pvtHooks.onStopRequested) {\n try { await hookFn(); } 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 hookFn of pvtHooks.onChildExit) {\n try { await hookFn(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 hookFn of pvtHooks.onMessage) {\n try {\n const result: HookResult = await hookFn(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 pvtHooks.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 hookFn of pvtHooks.onError) {\n try { hookFn(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 hookFn of pvtHooks.onError) {\n try { hookFn(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 hookFn of pvtHooks.onEnd) {\n try { await hookFn(exitReason ?? \"done\"); } catch {}\n }\n\n // Call onEnd.\n if (config.onEnd) {\n await config.onEnd.call(self, exitReason ?? \"done\");\n }\n actorCtxMap.delete(ctx.id);\n pvtRegisteredReflection.delete(ctx.id);\n };\n\n type ReflectableProcess = { id: symbol; $reflection: Record<string, Function> };\n\n function attachReflection(proc: ReflectableProcess): void {\n const merged = new Map<string, Function>();\n if (config.$reflectionMethods) {\n for (const [key, method] of Object.entries(config.$reflectionMethods)) {\n merged.set(key, method as Function);\n }\n }\n const pluginMethods = pvtRegisteredReflection.get(proc.id);\n if (pluginMethods) {\n for (const [key, method] of pluginMethods) {\n merged.set(key, method);\n }\n }\n const refl = proc.$reflection as Record<string, Function>;\n for (const [key, method] of merged) {\n refl[key] = async (...methodArgs: unknown[]) => {\n return method.call(actorCtxMap.get(proc.id)!, ...methodArgs);\n };\n }\n }\n\n return {\n fn: fn as AsyncProcessFn<Args, ExposedState, InMsg, OutMsg>,\n name: config.name,\n pvtPluginsRaw: 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 const proc = spawnAsync(\n fn as AsyncProcessFn<Args, ExposedState, InMsg, OutMsg>,\n config.name ?? \"actor\",\n )(args);\n attachReflection(proc);\n return proc as AsyncProcess<Args, ExposedState, InMsg, OutMsg, ReflectionMethods>;\n },\n spawnAsChild(\n ctx: ProcessCtx<any, any, any, any>,\n args: Args,\n name?: string,\n ) {\n const proc = ctx.fork(\n fn as AsyncProcessFn<Args, ExposedState, InMsg, OutMsg>,\n name ?? config.name ?? 'child',\n )(args);\n attachReflection(proc);\n return proc as AsyncProcess<Args, ExposedState, InMsg, OutMsg, ReflectionMethods>;\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 };\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 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/package.json
CHANGED
package/dist/src-4KNZmXeS.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"src-4KNZmXeS.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 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<ProcessState, InMessage extends Message> =\n AsyncGenerator<ProcessState | null, void, WithSender<InMessage | StopMessage>>;\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 = {},\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<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 = 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 { fromName: \"__internal__\", fromId: Symbol(\"__internal__\") } 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<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, this.pname, this.id);\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 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(msgOrTuple: InMessage | StopMessage | WithSender<InMessage | StopMessage>, from?: SenderInfo): void {\n if ('type' in msgOrTuple) {\n this.buffer.push([msgOrTuple as InMessage | StopMessage, from as SenderInfo]);\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}\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.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//\n// See docs/proposals/define-actor-proposal.md for the full design.\n\nimport { runDispatchAsync, spawnAsync } from \"./process.async.js\";\nimport type {\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, 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 ReflectionMethods = {},\n>(\n config: ActorConfig<\n Args,\n InternalState,\n ExposedState,\n InMsg,\n OutMsg,\n Methods,\n Handlers,\n ReflectionMethods\n >,\n): ActorDefinition<Args, ExposedState, InMsg, OutMsg, Handlers, ReflectionMethods> {\n // ── internal helpers ──────────────────────────────────────────────\n\n /** Extract pvtResolvedPlugins from an async process function\n * (set by the parent's fork() for plugin inheritance). */\n // eslint-disable-next-line unicorn/consistent-function-scoping\n const getResolvedPlugins = (f: unknown): ActorPlugin[] | undefined => {\n const withPlugins = f as { pvtResolvedPlugins?: ActorPlugin[] };\n return withPlugins.pvtResolvedPlugins;\n };\n\n /** Stash resolved plugins on a function for the child to read. */\n // eslint-disable-next-line unicorn/consistent-function-scoping\n const stashPlugins = (f: unknown, plugs: ActorPlugin[]): void => {\n (f as { pvtResolvedPlugins?: ActorPlugin[] }).pvtResolvedPlugins = plugs;\n };\n\n // Internal generator receives WithSender<InMsg> so sender identity\n // is directly accessible in the dispatch loop with zero casts.\n // Promise that resolves with the ActorContext after yield.\n // Reflection methods await this so they get the real `this` context.\n const actorCtxMap = new Map<symbol, ActorContext<Args, InternalState, InMsg, OutMsg, Methods, Handlers>>();\n const pvtRegisteredReflection = new Map<symbol, Map<string, Function>>();\n\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 // State resolved below after self is built.\n let rawState: InternalState = undefined as unknown as InternalState;\n let exposedState: ExposedState = undefined as unknown as ExposedState;\n\n // ── hooks ──────────────────────────────────────────────────────────\n const pvtHooks = new HookRegistry<any, any, any>();\n\n const decorated = new Map<string, unknown>();\n\n // Build the actor context.\n const self: ActorContext<\n Args,\n InternalState,\n InMsg,\n OutMsg,\n Methods,\n Handlers\n > = {\n ctx: ctx as ProcessCtx<Args, InternalState, InMsg, OutMsg>,\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 hookFn of pvtHooks.onEmit) {\n try { hookFn(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 // ── registration API ─────────────────────────────────────\n hooks: {\n onMessage: (h: OnMessageHook<any>) => { pvtHooks.onMessage.push(h); },\n onEmit: (h: OnEmitHook<any>) => { pvtHooks.onEmit.push(h); },\n onChildExit: (h: OnChildExitHook) => { pvtHooks.onChildExit.push(h); },\n onStart: (h: OnStartHook<unknown>) => { pvtHooks.onStart.push(h); },\n onStopRequested: (h: OnStopRequestedHook) => { pvtHooks.onStopRequested.push(h); },\n onError: (h: OnErrorHook) => { pvtHooks.onError.push(h); },\n onEnd: (h: OnEndHook) => { pvtHooks.onEnd.push(h); },\n },\n reflection: {\n register(name: string, method: (this: ActorContext<unknown, unknown, Message, Message, MethodOptions, HandlerOptions<Message>>) => unknown) {\n let methods = pvtRegisteredReflection.get(ctx.id);\n if (!methods) {\n methods = new Map();\n pvtRegisteredReflection.set(ctx.id, methods);\n }\n methods.set(`${currentPluginName}.${name}`, method as Function);\n },\n },\n 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 fork(childFn, name, childArgs) {\n // Unwrap ActorDefinition, derive name.\n const resolved = typeof childFn === \"function\" ? childFn : childFn.fn;\n const childDef =\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 { pvtPluginsRaw?: ActorPlugin[] | PluginTransform })?.pvtPluginsRaw;\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 \n };\n actorCtxMap.set(ctx.id, self);\n\n // ── install plugins ──────────────────────────────────────────────\n // On child actors, pvtResolvedPlugins 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 let currentPluginName: string | null = null;\n for (const p of resolvedPlugs) {\n let pvtErr: unknown = null;\n currentPluginName = p.name;\n try {\n await p.install(self as unknown as ActorContext<unknown, unknown, Message, Message, MethodOptions, HandlerOptions<Message>>);\n } catch (e) {\n pvtErr = e;\n }\n // Also catch sync throws from non-async install functions.\n if (pvtErr) {\n console.error(`[${ctx.pname}] plugin \"${p.name}\" install failed:`, pvtErr);\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) pvtHooks.onStart.push((state) => h.onStart!.call(self, state));\n if (h.onMessage) pvtHooks.onMessage.push((msg, sender) => h.onMessage!.call(self, msg, sender));\n if (h.onEmit) pvtHooks.onEmit.push((msg) => h.onEmit!.call(self, msg));\n if (h.onChildExit) pvtHooks.onChildExit.push((name) => h.onChildExit!.call(self, name));\n if (h.onStopRequested) pvtHooks.onStopRequested.push(() => h.onStopRequested!.call(self));\n if (h.onEnd) pvtHooks.onEnd.push((reason) => h.onEnd!.call(self, reason));\n if (h.onError) pvtHooks.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 // ── resolve state (setup or initialState) ────────────────────\n if (config.setup) {\n rawState = await config.setup.call(self, args);\n } else if (typeof config.initialState === \"function\") {\n rawState = (config.initialState as (a: Args, ictx: typeof ctx) => InternalState)(args, ctx);\n } else if (config.initialState !== undefined) {\n rawState = config.initialState;\n } else {\n throw new Error(\"ActorConfig: setup() or initialState is required\");\n }\n (self as { state: unknown }).state = rawState;\n exposedState = config.expose\n ? config.expose(rawState)\n : (rawState as unknown as ExposedState);\n\n // Call onStart with args (legacy — use setup() for new code).\n if (config.onStart) {\n await config.onStart.call(self, args);\n exposedState = config.expose\n ? config.expose(rawState)\n : (rawState as unknown as ExposedState);\n }\n\n // Fire hooks.onStart.\n for (const hookFn of pvtHooks.onStart) {\n try { await hookFn(exposedState); } catch {}\n }\n\n yield exposedState;\n\n\n // ── afterStart ──────────────────────────────────────────────────\n if (config.afterStart) { await config.afterStart.call(self); }\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 hookFn of pvtHooks.onStopRequested) {\n try { await hookFn(); } 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 hookFn of pvtHooks.onChildExit) {\n try { await hookFn(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 hookFn of pvtHooks.onMessage) {\n try {\n const result: HookResult = await hookFn(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 pvtHooks.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 hookFn of pvtHooks.onError) {\n try { hookFn(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 hookFn of pvtHooks.onError) {\n try { hookFn(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 hookFn of pvtHooks.onEnd) {\n try { await hookFn(exitReason ?? \"done\"); } catch {}\n }\n\n // Call onEnd.\n if (config.onEnd) {\n await config.onEnd.call(self, exitReason ?? \"done\");\n }\n actorCtxMap.delete(ctx.id);\n pvtRegisteredReflection.delete(ctx.id);\n };\n\n type ReflectableProcess = { id: symbol; $reflection: Record<string, Function> };\n\n function attachReflection(proc: ReflectableProcess): void {\n const merged = new Map<string, Function>();\n if (config.$reflectionMethods) {\n for (const [key, method] of Object.entries(config.$reflectionMethods)) {\n merged.set(key, method as Function);\n }\n }\n const pluginMethods = pvtRegisteredReflection.get(proc.id);\n if (pluginMethods) {\n for (const [key, method] of pluginMethods) {\n merged.set(key, method);\n }\n }\n const refl = proc.$reflection as Record<string, Function>;\n for (const [key, method] of merged) {\n refl[key] = async (...methodArgs: unknown[]) => {\n return method.call(actorCtxMap.get(proc.id)!, ...methodArgs);\n };\n }\n }\n\n return {\n fn: fn as AsyncProcessFn<Args, ExposedState, InMsg, OutMsg>,\n name: config.name,\n pvtPluginsRaw: 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 const proc = spawnAsync(\n fn as AsyncProcessFn<Args, ExposedState, InMsg, OutMsg>,\n config.name ?? \"actor\",\n )(args);\n attachReflection(proc);\n return proc as AsyncProcess<Args, ExposedState, InMsg, OutMsg, ReflectionMethods>;\n },\n spawnAsChild(\n ctx: ProcessCtx<any, any, any, any>,\n args: Args,\n name?: string,\n ) {\n const proc = ctx.fork(\n fn as AsyncProcessFn<Args, ExposedState, InMsg, OutMsg>,\n name ?? config.name ?? 'child',\n )(args);\n attachReflection(proc);\n return proc as AsyncProcess<Args, ExposedState, InMsg, OutMsg, ReflectionMethods>;\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 };\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 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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"}
|