posipaki 0.11.0 → 0.12.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/README.md +25 -0
- package/dist/hooks.d.ts +48 -0
- package/dist/hooks.d.ts.map +1 -0
- package/dist/hooks.js +20 -0
- package/dist/hooks.js.map +1 -0
- package/dist/index.d.ts +25 -5
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +131 -10
- package/dist/index.js.map +1 -1
- package/dist/pipe.d.ts +1 -1
- package/dist/plugins/debug-logger.d.ts +11 -0
- package/dist/plugins/debug-logger.d.ts.map +1 -0
- package/dist/plugins/debug-logger.js +34 -0
- package/dist/plugins/debug-logger.js.map +1 -0
- package/dist/plugins/rbac.d.ts +10 -0
- package/dist/plugins/rbac.d.ts.map +1 -0
- package/dist/plugins/rbac.js +21 -0
- package/dist/plugins/rbac.js.map +1 -0
- package/dist/plugins/timeout-guard.d.ts +10 -0
- package/dist/plugins/timeout-guard.d.ts.map +1 -0
- package/dist/plugins/timeout-guard.js +24 -0
- package/dist/plugins/timeout-guard.js.map +1 -0
- package/dist/process-B1vevrTc.d.ts +33 -0
- package/dist/process-B1vevrTc.d.ts.map +1 -0
- package/dist/supervisor.d.ts +2 -1
- package/dist/supervisor.d.ts.map +1 -1
- package/dist/{process-BiX7Ena4.d.ts → types-Bau9O_vk.d.ts} +67 -89
- package/dist/types-Bau9O_vk.d.ts.map +1 -0
- package/dist/xfetch.d.ts +2 -1
- package/dist/xfetch.d.ts.map +1 -1
- package/package.json +17 -1
- package/dist/process-BiX7Ena4.d.ts.map +0 -1
package/README.md
CHANGED
|
@@ -40,6 +40,8 @@ const counter = defineActor({
|
|
|
40
40
|
const proc = counter.spawn(null);
|
|
41
41
|
await proc.ready();
|
|
42
42
|
proc.send({ type: "POKE" });
|
|
43
|
+
```
|
|
44
|
+
|
|
43
45
|
|
|
44
46
|
A process can do everything a promise, a stream, or a store can do —
|
|
45
47
|
but it can also fork children, pause/resume, and exit on its own terms.
|
|
@@ -88,6 +90,29 @@ proc.send({ type: "POKE" });
|
|
|
88
90
|
await proc.wait();
|
|
89
91
|
```
|
|
90
92
|
|
|
93
|
+
|
|
94
|
+
## Okay, but what do I use it for?
|
|
95
|
+
|
|
96
|
+
To call the `/chat_complete` endpoint and emit effects (tool calls)
|
|
97
|
+
that the pure function (LLM) produces.
|
|
98
|
+
|
|
99
|
+
Use it on the frontend for things like file upload progress or anything
|
|
100
|
+
that has to be more interactive than a promise but not static enough
|
|
101
|
+
to afford to be a store with the lifetime tied to the app.
|
|
102
|
+
|
|
103
|
+
You can also use it to define components on the server side that have life
|
|
104
|
+
time bounded by incoming request or some kind of a transient state.
|
|
105
|
+
|
|
106
|
+
## How are the messages processed?
|
|
107
|
+
|
|
108
|
+
Actors are loops iterating over the messages you send to their queue (inbox).
|
|
109
|
+
Get the new message, process it, maybe emit something, wait for the next message.
|
|
110
|
+
|
|
111
|
+
This means when you send three messages to a process -- they will be processed serially
|
|
112
|
+
and their results will not produce a race. You can also ask the process to exit
|
|
113
|
+
and it will not produce any messages once it does. This also cascades to their children.
|
|
114
|
+
|
|
115
|
+
|
|
91
116
|
## Features
|
|
92
117
|
|
|
93
118
|
- **Processes** — sync or async, same API
|
package/dist/hooks.d.ts
ADDED
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { a as ProcessCtx, r as Message, s as SenderInfo } from "./types-Bau9O_vk.js";
|
|
2
|
+
|
|
3
|
+
//#region src/hooks.d.ts
|
|
4
|
+
/** Returned by onMessage hooks to prevent further dispatch. */
|
|
5
|
+
declare const STOP_SENTINEL: unique symbol;
|
|
6
|
+
/** Type-safe sentinel for short-circuiting onMessage hooks. */
|
|
7
|
+
declare const stopPropagation: () => typeof STOP_SENTINEL;
|
|
8
|
+
/** Return type of onMessage hooks: void (continue) or sentinel (stop). */
|
|
9
|
+
type HookResult = void | typeof STOP_SENTINEL;
|
|
10
|
+
type OnStartHook<State> = (state: State) => void | Promise<void>;
|
|
11
|
+
type OnMessageHook<InMsg extends Message> = (msg: InMsg, sender: SenderInfo) => HookResult | Promise<HookResult>;
|
|
12
|
+
type OnEmitHook<OutMsg extends Message> = (msg: OutMsg) => void;
|
|
13
|
+
type OnChildExitHook = (name: string) => void | Promise<void>;
|
|
14
|
+
type OnStopRequestedHook = () => void | Promise<void>;
|
|
15
|
+
type OnEndHook = (reason: unknown) => void | Promise<void>;
|
|
16
|
+
type OnErrorHook = (err: unknown) => void;
|
|
17
|
+
declare class HookRegistry<State, InMsg extends Message, OutMsg extends Message> {
|
|
18
|
+
onStart: Array<OnStartHook<State>>;
|
|
19
|
+
onMessage: Array<OnMessageHook<InMsg>>;
|
|
20
|
+
onEmit: Array<OnEmitHook<OutMsg>>;
|
|
21
|
+
onChildExit: Array<OnChildExitHook>;
|
|
22
|
+
onStopRequested: Array<OnStopRequestedHook>;
|
|
23
|
+
onEnd: Array<OnEndHook>;
|
|
24
|
+
onError: Array<OnErrorHook>;
|
|
25
|
+
}
|
|
26
|
+
/** A reusable unit of actor behaviour, installed at fork time. */
|
|
27
|
+
interface ActorPlugin<InMsg extends Message = Message, OutMsg extends Message = Message, State = unknown> {
|
|
28
|
+
name: string;
|
|
29
|
+
install(ctx: ProcessCtx<unknown, State, InMsg, OutMsg>): void | Promise<void>;
|
|
30
|
+
}
|
|
31
|
+
/** Transform parent plugins into child plugins. */
|
|
32
|
+
type PluginTransform = (parentPlugins: ActorPlugin[]) => ActorPlugin[];
|
|
33
|
+
/**
|
|
34
|
+
* Interface that plugins can augment via declaration merging.
|
|
35
|
+
* Plugins ship a .d.ts that adds properties to this interface,
|
|
36
|
+
* making them available on `this` in handlers and methods.
|
|
37
|
+
*
|
|
38
|
+
* Example (in a plugin's .d.ts):
|
|
39
|
+
* declare module 'posipaki' {
|
|
40
|
+
* interface ActorDecorated {
|
|
41
|
+
* log: Logger;
|
|
42
|
+
* }
|
|
43
|
+
* }
|
|
44
|
+
*/
|
|
45
|
+
interface ActorDecorated {}
|
|
46
|
+
//#endregion
|
|
47
|
+
export { ActorDecorated, ActorPlugin, HookRegistry, HookResult, OnChildExitHook, OnEmitHook, OnEndHook, OnErrorHook, OnMessageHook, OnStartHook, OnStopRequestedHook, PluginTransform, STOP_SENTINEL, stopPropagation };
|
|
48
|
+
//# sourceMappingURL=hooks.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hooks.d.ts","names":[],"sources":["../src/hooks.ts"],"mappings":";;;;cAWa,aAAA;AAAb;AAAA,cAGa,eAAA,eAA6B,aAA8B;;KAG5D,UAAA,iBAA2B,aAAa;AAAA,KAIxC,WAAA,WAAsB,KAAA,EAAO,KAAA,YAAiB,OAAO;AAAA,KACrD,aAAA,eAA4B,OAAA,KAAY,GAAA,EAAK,KAAA,EAAO,MAAA,EAAQ,UAAA,KAAe,UAAA,GAAa,OAAA,CAAQ,UAAA;AAAA,KAChG,UAAA,gBAA0B,OAAA,KAAY,GAAA,EAAK,MAAM;AAAA,KACjD,eAAA,IAAmB,IAAA,oBAAwB,OAAO;AAAA,KAClD,mBAAA,gBAAmC,OAAO;AAAA,KAC1C,SAAA,IAAa,MAAA,qBAA2B,OAAO;AAAA,KAC/C,WAAA,IAAe,GAAY;AAAA,cAI1B,YAAA,sBAAkC,OAAA,iBAAwB,OAAA;EACrE,OAAA,EAAS,KAAA,CAAM,WAAA,CAAY,KAAA;EAC3B,SAAA,EAAW,KAAA,CAAM,aAAA,CAAc,KAAA;EAC/B,MAAA,EAAQ,KAAA,CAAM,UAAA,CAAW,MAAA;EACzB,WAAA,EAAa,KAAA,CAAM,eAAA;EACnB,eAAA,EAAiB,KAAA,CAAM,mBAAA;EACvB,KAAA,EAAO,KAAA,CAAM,SAAA;EACb,OAAA,EAAS,KAAA,CAAM,WAAA;AAAA;;UAOA,WAAA,eACD,OAAA,GAAU,OAAA,iBACT,OAAA,GAAU,OAAA;EAGzB,IAAA;EACA,OAAA,CAAQ,GAAA,EAAK,UAAA,UAAoB,KAAA,EAAO,KAAA,EAAO,MAAA,WAAiB,OAAA;AAAA;AA7BlE;AAAA,KAiCY,eAAA,IAAmB,aAAA,EAAe,WAAA,OAAkB,WAAW;;;;;;;;;;;;;UAgB1D,cAAA"}
|
package/dist/hooks.js
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
//#region src/hooks.ts
|
|
2
|
+
/** Returned by onMessage hooks to prevent further dispatch. */
|
|
3
|
+
const STOP_SENTINEL = Symbol("posipaki.stopPropagation");
|
|
4
|
+
/** Type-safe sentinel for short-circuiting onMessage hooks. */
|
|
5
|
+
const stopPropagation = () => STOP_SENTINEL;
|
|
6
|
+
var HookRegistry = class {
|
|
7
|
+
constructor() {
|
|
8
|
+
this.onStart = [];
|
|
9
|
+
this.onMessage = [];
|
|
10
|
+
this.onEmit = [];
|
|
11
|
+
this.onChildExit = [];
|
|
12
|
+
this.onStopRequested = [];
|
|
13
|
+
this.onEnd = [];
|
|
14
|
+
this.onError = [];
|
|
15
|
+
}
|
|
16
|
+
};
|
|
17
|
+
//#endregion
|
|
18
|
+
export { HookRegistry, STOP_SENTINEL, stopPropagation };
|
|
19
|
+
|
|
20
|
+
//# sourceMappingURL=hooks.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hooks.js","names":[],"sources":["../src/hooks.ts"],"sourcesContent":["// ── Lifecycle Hooks ──────────────────────────────────────────────────────\n//\n// Extends ProcessCtx and defineActor with observable lifecycle hooks.\n// Hooks are additive — multiple callbacks can register for the same hook\n// point, and they fire in registration order.\n\nimport type { Message, SenderInfo, ProcessCtx } from './types.js';\n\n// ── stop propagation sentinel ────────────────────────────────────────────\n\n/** Returned by onMessage hooks to prevent further dispatch. */\nexport const STOP_SENTINEL = Symbol('posipaki.stopPropagation');\n\n/** Type-safe sentinel for short-circuiting onMessage hooks. */\nexport const stopPropagation = (): typeof STOP_SENTINEL => STOP_SENTINEL;\n\n/** Return type of onMessage hooks: void (continue) or sentinel (stop). */\nexport type HookResult = void | typeof STOP_SENTINEL;\n\n// ── hook function types ──────────────────────────────────────────────────\n\nexport type OnStartHook<State> = (state: State) => void | Promise<void>;\nexport type OnMessageHook<InMsg extends Message> = (msg: InMsg, sender: SenderInfo) => HookResult | Promise<HookResult>;\nexport type OnEmitHook<OutMsg extends Message> = (msg: OutMsg) => void;\nexport type OnChildExitHook = (name: string) => void | Promise<void>;\nexport type OnStopRequestedHook = () => void | Promise<void>;\nexport type OnEndHook = (reason: unknown) => void | Promise<void>;\nexport type OnErrorHook = (err: unknown) => void;\n\n// ── hook registry ────────────────────────────────────────────────────────\n\nexport class HookRegistry<State, InMsg extends Message, OutMsg extends Message> {\n onStart: Array<OnStartHook<State>> = [];\n onMessage: Array<OnMessageHook<InMsg>> = [];\n onEmit: Array<OnEmitHook<OutMsg>> = [];\n onChildExit: Array<OnChildExitHook> = [];\n onStopRequested: Array<OnStopRequestedHook> = [];\n onEnd: Array<OnEndHook> = [];\n onError: Array<OnErrorHook> = [];\n}\n\n// ── plugin types ─────────────────────────────────────────────────────────\n\n\n/** A reusable unit of actor behaviour, installed at fork time. */\nexport interface ActorPlugin<\n InMsg extends Message = Message,\n OutMsg extends Message = Message,\n State = unknown,\n> {\n name: string;\n install(ctx: ProcessCtx<unknown, State, InMsg, OutMsg>): void | Promise<void>;\n}\n\n/** Transform parent plugins into child plugins. */\nexport type PluginTransform = (parentPlugins: ActorPlugin[]) => ActorPlugin[];\n\n// ── type augmentation (Fastify-style) ────────────────────────────────────\n\n/**\n * Interface that plugins can augment via declaration merging.\n * Plugins ship a .d.ts that adds properties to this interface,\n * making them available on `this` in handlers and methods.\n *\n * Example (in a plugin's .d.ts):\n * declare module 'posipaki' {\n * interface ActorDecorated {\n * log: Logger;\n * }\n * }\n */\nexport interface ActorDecorated {}\n"],"mappings":";;AAWA,MAAa,gBAAgB,OAAO,0BAA0B;;AAG9D,MAAa,wBAA8C;AAiB3D,IAAa,eAAb,MAAgF;;iBACzC,CAAC;mBACG,CAAC;gBACN,CAAC;qBACC,CAAC;yBACO,CAAC;eACrB,CAAC;iBACG,CAAC;;AACjC"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,4 +1,6 @@
|
|
|
1
|
-
import {
|
|
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-Bau9O_vk.js";
|
|
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-B1vevrTc.js";
|
|
2
4
|
|
|
3
5
|
//#region src/adapters.d.ts
|
|
4
6
|
declare function asyncify<A, S, IM extends Message, OM extends Message>(fn: ProcessFn<A, S, IM, OM>): AsyncProcessFn<A, S, IM, OM>;
|
|
@@ -17,14 +19,32 @@ type HandlerOptions<InMsg extends Message> = Omit<{ [K in InMsg["type"]]: Handle
|
|
|
17
19
|
interface ActorDefinition<Args, ExposedState, InMsg extends Message, OutMsg extends Message, Handlers extends HandlerOptions<InMsg>> {
|
|
18
20
|
fn: AsyncProcessFn<Args, ExposedState, InMsg, OutMsg>;
|
|
19
21
|
config: ActorConfig<Args, any, ExposedState, InMsg, OutMsg, {}, Handlers>;
|
|
22
|
+
/** Preferred process name (from config.name). */
|
|
23
|
+
name?: string;
|
|
24
|
+
/** Raw plugin config (array or transform). Resolved at fork time. @internal */
|
|
25
|
+
_pluginsRaw?: ActorPlugin[] | PluginTransform;
|
|
20
26
|
/** Spawn this actor as a standalone process. */
|
|
21
27
|
spawn(args: Args): AsyncProcess<Args, ExposedState, InMsg, OutMsg>;
|
|
22
28
|
/** Spawn this actor as a child of the calling process. */
|
|
23
|
-
spawnAsChild(ctx: ProcessCtx<any, any, any, any>,
|
|
29
|
+
spawnAsChild(ctx: ProcessCtx<any, any, any, any>, args: Args, name?: string): AsyncProcess<Args, ExposedState, InMsg, OutMsg>;
|
|
30
|
+
}
|
|
31
|
+
interface ActorHooksConfig<Args, InternalState, ExposedState, InMsg extends Message, OutMsg extends Message, Methods extends MethodOptions, Handlers extends HandlerOptions<InMsg>> {
|
|
32
|
+
onStart?: OnStartHook<ExposedState>;
|
|
33
|
+
onMessage?: (this: ActorContext<Args, InternalState, InMsg, OutMsg, Methods, Handlers>, msg: InMsg, sender: SenderInfo) => HookResult | Promise<HookResult>;
|
|
34
|
+
onEmit?: (this: ActorContext<Args, InternalState, InMsg, OutMsg, Methods, Handlers>, msg: OutMsg) => void;
|
|
35
|
+
onChildExit?: (this: ActorContext<Args, InternalState, InMsg, OutMsg, Methods, Handlers>, name: string) => void | Promise<void>;
|
|
36
|
+
onStopRequested?: (this: ActorContext<Args, InternalState, InMsg, OutMsg, Methods, Handlers>) => void | Promise<void>;
|
|
37
|
+
onEnd?: (this: ActorContext<Args, InternalState, InMsg, OutMsg, Methods, Handlers>, reason: unknown) => void | Promise<void>;
|
|
38
|
+
onError?: (this: ActorContext<Args, InternalState, InMsg, OutMsg, Methods, Handlers>, err: unknown) => void;
|
|
24
39
|
}
|
|
25
40
|
interface ActorConfig<Args, InternalState, ExposedState, InMsg extends Message, OutMsg extends Message, Methods extends MethodOptions, Handlers extends HandlerOptions<InMsg>> {
|
|
26
41
|
initialState: InternalState | ((this: void, args: Args, ctx: ActorContext<Args, InternalState, InMsg, OutMsg, Methods, Handlers>["ctx"]) => InternalState);
|
|
27
42
|
expose?: (internalState: InternalState) => ExposedState;
|
|
43
|
+
/** Preferred process name. Used by ctx.fork() when no explicit name is given. */
|
|
44
|
+
name?: string;
|
|
45
|
+
hooks?: ActorHooksConfig<Args, InternalState, InMsg, OutMsg, Methods, Handlers>;
|
|
46
|
+
/** Plugins installed at fork time. Array = replace, function = transform parent chain. */
|
|
47
|
+
plugins?: ActorPlugin[] | PluginTransform;
|
|
28
48
|
outMessages?: ActorMessages<OutMsg>;
|
|
29
49
|
inMessages?: ActorMessages<InMsg>;
|
|
30
50
|
onStart?: (this: ActorContext<Args, InternalState, InMsg, OutMsg, Methods, Handlers>, args: Args) => void | Promise<void>;
|
|
@@ -35,7 +55,7 @@ interface ActorConfig<Args, InternalState, ExposedState, InMsg extends Message,
|
|
|
35
55
|
onUnhandled?: (this: ActorContext<Args, InternalState, InMsg, OutMsg, Methods, Handlers>, msg: InMsg, sender: SenderInfo) => void | Promise<void>;
|
|
36
56
|
onChildExit?: (this: ActorContext<Args, InternalState, InMsg, OutMsg, Methods, Handlers>, name: string, reason: ExitMessage) => void | Promise<void>;
|
|
37
57
|
}
|
|
38
|
-
type ActorContext<Args, InternalState, InMsg extends Message, OutMsg extends Message, Methods extends MethodOptions, Handlers extends HandlerOptions<InMsg>> = Methods & {
|
|
58
|
+
type ActorContext<Args, InternalState, InMsg extends Message, OutMsg extends Message, Methods extends MethodOptions, Handlers extends HandlerOptions<InMsg>> = Methods & ActorDecorated & {
|
|
39
59
|
state: InternalState;
|
|
40
60
|
name: string;
|
|
41
61
|
id: symbol;
|
|
@@ -43,7 +63,7 @@ type ActorContext<Args, InternalState, InMsg extends Message, OutMsg extends Mes
|
|
|
43
63
|
agreeToStop: () => void;
|
|
44
64
|
exit: (reason?: unknown) => void;
|
|
45
65
|
$child: Record<string, AsyncProcess<unknown, unknown, Message, Message>>;
|
|
46
|
-
fork<A, S, IM extends Message, OM extends Message, H extends HandlerOptions<IM>>(fn: AsyncProcessFn<A, S, IM, OM> | ActorDefinition<A, S, IM, OM, H>, name
|
|
66
|
+
fork<A, S, IM extends Message, OM extends Message, H extends HandlerOptions<IM>>(fn: AsyncProcessFn<A, S, IM, OM> | ActorDefinition<A, S, IM, OM, H>, name?: string, args?: A): AsyncProcess<A, S, IM, OM>;
|
|
47
67
|
ctx: ProcessCtx<Args, InternalState, InMsg, OutMsg>;
|
|
48
68
|
};
|
|
49
69
|
//#endregion
|
|
@@ -51,5 +71,5 @@ type ActorContext<Args, InternalState, InMsg extends Message, OutMsg extends Mes
|
|
|
51
71
|
declare function defineMessages<OutMsg extends Message = Message>(): ActorMessages<OutMsg>;
|
|
52
72
|
declare function defineActor<Args, InternalState, ExposedState, InMsg extends Message, OutMsg extends Message, Methods extends MethodOptions, Handlers extends HandlerOptions<InMsg>>(config: ActorConfig<Args, InternalState, ExposedState, InMsg, OutMsg, Methods, Handlers>): ActorDefinition<Args, ExposedState, InMsg, OutMsg, Handlers>;
|
|
53
73
|
//#endregion
|
|
54
|
-
export { type ActorConfig, type ActorContext, type ActorDefinition, AsyncProcess, type AsyncProcessFn, type ExitMessage, type HandlerFn, type HandlerOptions, type Message, type MethodOptions, type PipeState, Process, type ProcessCtx, type ProcessFn, type SenderInfo, type SenderOrigin, type StopMessage, type SupervisorState, type WithSender, type WithoutSender, asyncify, defineActor, defineMessages, runDispatch, runDispatchAsync, spawn, spawnAsync };
|
|
74
|
+
export { type ActorConfig, type ActorContext, type ActorDecorated$1 as ActorDecorated, type ActorDefinition, type ActorPlugin$1 as ActorPlugin, AsyncProcess, type AsyncProcessFn, type ExitMessage, type HandlerFn, type HandlerOptions, HookRegistry, type HookResult$1 as HookResult, type Message, type MethodOptions, type OnChildExitHook, type OnEmitHook, type OnEndHook, type OnErrorHook, type OnMessageHook, type OnStartHook$1 as OnStartHook, type OnStopRequestedHook, type PipeState, type PluginTransform$1 as PluginTransform, Process, type ProcessCtx, type ProcessFn, type SenderInfo, type SenderOrigin, type StopMessage, type SupervisorState, type WithSender, type WithoutSender, asyncify, defineActor, defineMessages, runDispatch, runDispatchAsync, spawn, spawnAsync, stopPropagation };
|
|
55
75
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","names":[],"sources":["../src/adapters.ts","../src/actor-types.ts","../src/define-actor.ts"],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","names":[],"sources":["../src/adapters.ts","../src/actor-types.ts","../src/define-actor.ts"],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { i as runDispatch, n as defer, r as makeWaiter, t as debugLog } from "./util-Cw64MseZ.js";
|
|
2
|
+
import { HookRegistry, STOP_SENTINEL, stopPropagation } from "./hooks.js";
|
|
2
3
|
//#region src/adapters.ts
|
|
3
4
|
function asyncify(fn) {
|
|
4
5
|
return async function* (ctx, args) {
|
|
@@ -100,7 +101,9 @@ var AsyncProcess = class AsyncProcess {
|
|
|
100
101
|
}
|
|
101
102
|
fork(fn, pname) {
|
|
102
103
|
return (args) => {
|
|
103
|
-
const
|
|
104
|
+
const fnConfig = fn.config;
|
|
105
|
+
const baseName = pname ?? fnConfig?.name ?? `child-${this.children.length}`;
|
|
106
|
+
const child = new AsyncProcess(fn, `${this.pname}:${baseName}`, this.fromChild.bind(this));
|
|
104
107
|
this.children.push(child);
|
|
105
108
|
child.start(args);
|
|
106
109
|
return child;
|
|
@@ -259,18 +262,31 @@ var Process = class extends AsyncProcess {
|
|
|
259
262
|
//#region src/define-actor.ts
|
|
260
263
|
function defineMessages() {}
|
|
261
264
|
function defineActor(config) {
|
|
265
|
+
/** Extract __resolvedPlugins from an async process function
|
|
266
|
+
* (set by the parent's fork() for plugin inheritance). */
|
|
267
|
+
const getResolvedPlugins = (f) => {
|
|
268
|
+
return f.__resolvedPlugins;
|
|
269
|
+
};
|
|
270
|
+
/** Stash resolved plugins on a function for the child to read. */
|
|
271
|
+
const stashPlugins = (f, plugs) => {
|
|
272
|
+
f.__resolvedPlugins = plugs;
|
|
273
|
+
};
|
|
262
274
|
const fn = async function* (ctx, args) {
|
|
263
275
|
let done = false;
|
|
264
276
|
let exitReason;
|
|
265
277
|
let stopRequested = false;
|
|
266
278
|
const rawState = typeof config.initialState === "function" ? config.initialState(args, ctx) : config.initialState;
|
|
267
279
|
const exposedState = config.expose ? config.expose(rawState) : rawState;
|
|
280
|
+
const _hooks = new HookRegistry();
|
|
268
281
|
const self = {
|
|
269
282
|
...config.methods || {},
|
|
270
283
|
state: rawState,
|
|
271
284
|
name: ctx.pname,
|
|
272
285
|
id: ctx.id,
|
|
273
286
|
emit(msg) {
|
|
287
|
+
for (const fn of _hooks.onEmit) try {
|
|
288
|
+
fn(msg);
|
|
289
|
+
} catch {}
|
|
274
290
|
ctx.toParent(msg);
|
|
275
291
|
},
|
|
276
292
|
agreeToStop() {
|
|
@@ -282,19 +298,91 @@ function defineActor(config) {
|
|
|
282
298
|
done = true;
|
|
283
299
|
},
|
|
284
300
|
$child: {},
|
|
301
|
+
onMessage: (fn) => {
|
|
302
|
+
_hooks.onMessage.push(fn);
|
|
303
|
+
},
|
|
304
|
+
onEmit: (fn) => {
|
|
305
|
+
_hooks.onEmit.push(fn);
|
|
306
|
+
},
|
|
307
|
+
onChildExit: (fn) => {
|
|
308
|
+
_hooks.onChildExit.push(fn);
|
|
309
|
+
},
|
|
310
|
+
onStopRequested: (fn) => {
|
|
311
|
+
_hooks.onStopRequested.push(fn);
|
|
312
|
+
},
|
|
313
|
+
onError: (fn) => {
|
|
314
|
+
_hooks.onError.push(fn);
|
|
315
|
+
},
|
|
285
316
|
fork(childFn, name, childArgs) {
|
|
286
317
|
const resolved = typeof childFn === "function" ? childFn : childFn.fn;
|
|
287
|
-
const
|
|
288
|
-
|
|
318
|
+
const childDef = typeof childFn === "object" ? childFn : null;
|
|
319
|
+
const childName = name ?? (childDef?.name ? childDef.name : void 0);
|
|
320
|
+
const parentPlugs = config.plugins ? typeof config.plugins === "function" ? config.plugins([]) : config.plugins : [];
|
|
321
|
+
const childRaw = childDef?._pluginsRaw;
|
|
322
|
+
let childPlugs;
|
|
323
|
+
if (!childRaw) childPlugs = [...parentPlugs];
|
|
324
|
+
else if (Array.isArray(childRaw)) childPlugs = [...childRaw];
|
|
325
|
+
else childPlugs = childRaw(parentPlugs);
|
|
326
|
+
stashPlugins(resolved, childPlugs);
|
|
327
|
+
const child = ctx.fork(resolved, childName)(childArgs);
|
|
328
|
+
self.$child[child.pname] = child;
|
|
289
329
|
return child;
|
|
290
330
|
},
|
|
291
331
|
ctx
|
|
292
332
|
};
|
|
333
|
+
const ctxAny = ctx;
|
|
334
|
+
ctxAny.onMessage = (fn) => {
|
|
335
|
+
_hooks.onMessage.push(fn);
|
|
336
|
+
};
|
|
337
|
+
ctxAny.onEmit = (fn) => {
|
|
338
|
+
_hooks.onEmit.push(fn);
|
|
339
|
+
};
|
|
340
|
+
ctxAny.onChildExit = (fn) => {
|
|
341
|
+
_hooks.onChildExit.push(fn);
|
|
342
|
+
};
|
|
343
|
+
ctxAny.onStart = (fn) => {
|
|
344
|
+
_hooks.onStart.push(fn);
|
|
345
|
+
};
|
|
346
|
+
ctxAny.onStopRequested = (fn) => {
|
|
347
|
+
_hooks.onStopRequested.push(fn);
|
|
348
|
+
};
|
|
349
|
+
ctxAny.onError = (fn) => {
|
|
350
|
+
_hooks.onError.push(fn);
|
|
351
|
+
};
|
|
352
|
+
ctxAny.onEnd = (fn) => {
|
|
353
|
+
_hooks.onEnd.push(fn);
|
|
354
|
+
};
|
|
355
|
+
const resolvedPlugs = getResolvedPlugins(fn) ?? (config.plugins ? typeof config.plugins === "function" ? config.plugins([]) : config.plugins : []);
|
|
356
|
+
for (const p of resolvedPlugs) {
|
|
357
|
+
let _err = null;
|
|
358
|
+
try {
|
|
359
|
+
await p.install(ctx);
|
|
360
|
+
} catch (e) {
|
|
361
|
+
_err = e;
|
|
362
|
+
}
|
|
363
|
+
if (_err) console.error(`[${ctx.pname}] plugin "${p.name}" install failed:`, _err);
|
|
364
|
+
}
|
|
365
|
+
if (config.hooks) {
|
|
366
|
+
const h = config.hooks;
|
|
367
|
+
if (h.onStart) _hooks.onStart.push((state) => h.onStart.call(self, state));
|
|
368
|
+
if (h.onMessage) _hooks.onMessage.push((msg, sender) => h.onMessage.call(self, msg, sender));
|
|
369
|
+
if (h.onEmit) _hooks.onEmit.push((msg) => h.onEmit.call(self, msg));
|
|
370
|
+
if (h.onChildExit) _hooks.onChildExit.push((name) => h.onChildExit.call(self, name));
|
|
371
|
+
if (h.onStopRequested) _hooks.onStopRequested.push(() => h.onStopRequested.call(self));
|
|
372
|
+
if (h.onEnd) _hooks.onEnd.push((reason) => h.onEnd.call(self, reason));
|
|
373
|
+
if (h.onError) _hooks.onError.push((err) => h.onError.call(self, err));
|
|
374
|
+
}
|
|
293
375
|
yield exposedState;
|
|
294
376
|
if (config.onStart) await config.onStart.call(self, args);
|
|
377
|
+
for (const fn of _hooks.onStart) try {
|
|
378
|
+
await fn(exposedState);
|
|
379
|
+
} catch (e) {}
|
|
295
380
|
yield* runDispatchAsync(ctx.pname, async (stamped) => {
|
|
296
381
|
const [msg, sender] = stamped;
|
|
297
382
|
if (msg.type === "STOP") {
|
|
383
|
+
for (const fn of _hooks.onStopRequested) try {
|
|
384
|
+
await fn();
|
|
385
|
+
} catch {}
|
|
298
386
|
if (config.onStopRequested) {
|
|
299
387
|
await config.onStopRequested.call(self);
|
|
300
388
|
if (!done) stopRequested = true;
|
|
@@ -313,25 +401,58 @@ function defineActor(config) {
|
|
|
313
401
|
if (msg.type === "EXIT") {
|
|
314
402
|
const childName = sender.fromName;
|
|
315
403
|
if (childName && self.$child[childName]) delete self.$child[childName];
|
|
404
|
+
for (const fn of _hooks.onChildExit) try {
|
|
405
|
+
await fn(childName);
|
|
406
|
+
} catch {}
|
|
316
407
|
if (config.onChildExit) await config.onChildExit.call(self, childName, msg);
|
|
317
408
|
}
|
|
318
|
-
|
|
409
|
+
let hookStopped = false;
|
|
410
|
+
if (msg.type !== "STOP" && msg.type !== "EXIT") for (const fn of _hooks.onMessage) try {
|
|
411
|
+
if (await fn(msg, sender) === STOP_SENTINEL) {
|
|
412
|
+
hookStopped = true;
|
|
413
|
+
break;
|
|
414
|
+
}
|
|
415
|
+
} catch (e) {
|
|
416
|
+
for (const errFn of _hooks.onError) try {
|
|
417
|
+
errFn(e);
|
|
418
|
+
} catch {}
|
|
419
|
+
}
|
|
420
|
+
if (msg.type !== "STOP" && !hookStopped) {
|
|
319
421
|
const handler = config.handlers[msg.type];
|
|
320
|
-
if (handler)
|
|
321
|
-
|
|
422
|
+
if (handler) try {
|
|
423
|
+
await handler.call(self, msg, sender);
|
|
424
|
+
} catch (e) {
|
|
425
|
+
for (const fn of _hooks.onError) try {
|
|
426
|
+
fn(e);
|
|
427
|
+
} catch {}
|
|
428
|
+
throw e;
|
|
429
|
+
}
|
|
430
|
+
else if (config.onUnhandled) try {
|
|
431
|
+
await config.onUnhandled.call(self, msg, sender);
|
|
432
|
+
} catch (e) {
|
|
433
|
+
for (const fn of _hooks.onError) try {
|
|
434
|
+
fn(e);
|
|
435
|
+
} catch {}
|
|
436
|
+
throw e;
|
|
437
|
+
}
|
|
322
438
|
}
|
|
323
439
|
if (done) return;
|
|
324
440
|
}, () => done);
|
|
441
|
+
for (const fn of _hooks.onEnd) try {
|
|
442
|
+
await fn(exitReason ?? "done");
|
|
443
|
+
} catch {}
|
|
325
444
|
if (config.onEnd) await config.onEnd.call(self, exitReason ?? "done");
|
|
326
445
|
};
|
|
327
446
|
return {
|
|
328
447
|
fn,
|
|
448
|
+
name: config.name,
|
|
449
|
+
_pluginsRaw: config.plugins,
|
|
329
450
|
config,
|
|
330
451
|
spawn(args) {
|
|
331
|
-
return spawnAsync(fn, "actor")(args);
|
|
452
|
+
return spawnAsync(fn, config.name ?? "actor")(args);
|
|
332
453
|
},
|
|
333
|
-
spawnAsChild(ctx,
|
|
334
|
-
return ctx.fork(fn, name)(args);
|
|
454
|
+
spawnAsChild(ctx, args, name) {
|
|
455
|
+
return ctx.fork(fn, name ?? config.name)(args);
|
|
335
456
|
}
|
|
336
457
|
};
|
|
337
458
|
}
|
|
@@ -345,6 +466,6 @@ function defineActor(config) {
|
|
|
345
466
|
* @module
|
|
346
467
|
*/
|
|
347
468
|
//#endregion
|
|
348
|
-
export { AsyncProcess, Process, asyncify, defineActor, defineMessages, runDispatch, runDispatchAsync, spawn, spawnAsync };
|
|
469
|
+
export { AsyncProcess, HookRegistry, Process, asyncify, defineActor, defineMessages, runDispatch, runDispatchAsync, spawn, spawnAsync, stopPropagation };
|
|
349
470
|
|
|
350
471
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":[],"sources":["../src/adapters.ts","../src/process.async.ts","../src/process.ts","../src/define-actor.ts","../src/index.ts"],"sourcesContent":["import type { ProcessFn, AsyncProcessFn, Message } from \"./types.js\"\n\nexport function asyncify<A, S, IM extends Message, OM extends Message>(\n fn: ProcessFn<A, S, IM, OM>,\n): AsyncProcessFn<A, S, IM, OM> {\n return async function* (ctx, args) {\n yield* fn(ctx, args) as any\n }\n}\n","import { defer, makeWaiter, debugLog } from \"./util.js\";\nimport type { DeferredCall, Waiter } from \"./util.js\";\nimport type {\n Message,\n WithSender,\n SenderInfo,\n ExitMessage,\n 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\";\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 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 // 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 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 fork(childFn, name, childArgs) {\n // Unwrap ActorDefinition, pass to ctx.fork.\n const resolved = typeof childFn === \"function\" ? childFn : childFn.fn;\n const child = ctx.fork(resolved, name)(childArgs!);\n self.$child[name] = child as unknown as AsyncProcess<\n unknown,\n unknown,\n Message,\n Message\n >;\n return child;\n },\n ctx,\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 // 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 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 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 // ── Named handlers ──────────────────────────────────────────\n if (msg.type !== \"STOP\") {\n const handler = config.handlers[\n msg.type as keyof Handlers\n ] as HandlerFn<InMsg>;\n if (handler) {\n await handler.call(self, msg as InMsg, sender);\n } else if (config.onUnhandled) {\n await config.onUnhandled.call(self, msg as InMsg, sender);\n }\n // No onUnhandled: silently drop.\n }\n\n if (done) return;\n },\n () => done,\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 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 \"actor\",\n )(args);\n },\n spawnAsChild(\n ctx: ProcessCtx<any, any, any, any>,\n name: string,\n args: Args,\n ) {\n return ctx.fork(\n fn as AsyncProcessFn<Args, ExposedState, InMsg, OutMsg>,\n name,\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"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","names":["fnWithConfig","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 // Resolve child name: explicit > fn.config.name > fallback\n // Access config.name from an ActorDefinition if present.\n const fnWithConfig = fn as { config?: { name?: string } };\n const fnConfig = fnWithConfig.config;\n const baseName = pname ?? fnConfig?.name ?? `child-${this.children.length}`;\n const childName = `${this.pname}:${baseName}`;\n const child = new AsyncProcess<ChildArgs, ChildState, ChildIM, ChildOM>(\n fn,\n childName,\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 ? childDef.name : undefined);\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 // No child config → inherit all parent plugins.\n childPlugs = [...parentPlugs];\n } else if (Array.isArray(childRaw)) {\n // Array → use exactly these (no inheritance).\n childPlugs = [...childRaw];\n } else {\n // Function → transform parent chain.\n childPlugs = childRaw(parentPlugs);\n }\n\n // Stash resolved list on the child's config before fork.\n stashPlugins(resolved, childPlugs);\n\n const child = ctx.fork(resolved, childName)(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,\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
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { ActorPlugin } from "../hooks.js";
|
|
2
|
+
|
|
3
|
+
//#region src/plugins/debug-logger.d.ts
|
|
4
|
+
interface DebugLoggerOpts {
|
|
5
|
+
level?: 'debug' | 'info';
|
|
6
|
+
skipHeartbeats?: boolean;
|
|
7
|
+
}
|
|
8
|
+
declare function debugLogger(opts?: DebugLoggerOpts): ActorPlugin;
|
|
9
|
+
//#endregion
|
|
10
|
+
export { DebugLoggerOpts, debugLogger };
|
|
11
|
+
//# sourceMappingURL=debug-logger.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"debug-logger.d.ts","names":[],"sources":["../../src/plugins/debug-logger.ts"],"mappings":";;;UAUiB,eAAA;EACf,KAAA;EACA,cAAc;AAAA;AAAA,iBAGA,WAAA,CAAY,IAAA,GAAO,eAAA,GAAkB,WAAW"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
//#region src/plugins/debug-logger.ts
|
|
2
|
+
function debugLogger(opts) {
|
|
3
|
+
const level = opts?.level ?? "debug";
|
|
4
|
+
const skipHbs = opts?.skipHeartbeats ?? true;
|
|
5
|
+
return {
|
|
6
|
+
name: "debugLogger",
|
|
7
|
+
install(ctx) {
|
|
8
|
+
const name = ctx.pname;
|
|
9
|
+
ctx.onMessage?.((msg, sender) => {
|
|
10
|
+
if (skipHbs && msg.type === "HEARTBEAT") return;
|
|
11
|
+
const via = sender ? ` from ${sender.fromName}` : "";
|
|
12
|
+
log(level, `${name} ← ${msg.type}${via}`);
|
|
13
|
+
});
|
|
14
|
+
ctx.onEmit?.((msg) => {
|
|
15
|
+
log(level, `${name} → ${msg.type}`);
|
|
16
|
+
});
|
|
17
|
+
ctx.onChildExit?.((childName) => {
|
|
18
|
+
log(level, `${name}: child ${childName} exited`);
|
|
19
|
+
});
|
|
20
|
+
ctx.onError?.((err) => {
|
|
21
|
+
console.error(`[${name}] error:`, err.message ?? err);
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
};
|
|
25
|
+
}
|
|
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
|
+
//#endregion
|
|
32
|
+
export { debugLogger };
|
|
33
|
+
|
|
34
|
+
//# sourceMappingURL=debug-logger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"debug-logger.js","names":[],"sources":["../../src/plugins/debug-logger.ts"],"sourcesContent":["// ── debugLogger Plugin ───────────────────────────────────────────────────\n//\n// Example plugin: logs every message entering and leaving the actor.\n//\n// Usage:\n// import { debugLogger } from 'posipaki/plugins/debug-logger';\n// const MyActor = defineActor({ plugins: [debugLogger()], ... });\n\nimport type { ActorPlugin } from '../hooks.js';\n\nexport interface DebugLoggerOpts {\n level?: 'debug' | 'info';\n skipHeartbeats?: boolean;\n}\n\nexport function debugLogger(opts?: DebugLoggerOpts): ActorPlugin {\n const level = opts?.level ?? 'debug';\n const skipHbs = opts?.skipHeartbeats ?? true;\n\n return {\n name: 'debugLogger',\n install(ctx: any) {\n const name = ctx.pname;\n\n ctx.onMessage?.((msg: any, sender: any) => {\n if (skipHbs && msg.type === 'HEARTBEAT') return;\n const via = sender ? ` from ${sender.fromName}` : '';\n log(level, `${name} ← ${msg.type}${via}`);\n });\n\n ctx.onEmit?.((msg: any) => {\n log(level, `${name} → ${msg.type}`);\n });\n\n ctx.onChildExit?.((childName: string) => {\n log(level, `${name}: child ${childName} exited`);\n });\n\n ctx.onError?.((err: unknown) => {\n console.error(`[${name}] error:`, (err as Error).message ?? err);\n });\n },\n };\n}\n\nfunction log(level: string, msg: string): void {\n const ts = new Date().toISOString().slice(11, 23);\n const line = `[${ts}] ${msg}`;\n if (level === 'info') console.info(line);\n else console.debug(line);\n}\n"],"mappings":";AAeA,SAAgB,YAAY,MAAqC;CAC/D,MAAM,QAAQ,MAAM,SAAS;CAC7B,MAAM,UAAU,MAAM,kBAAkB;CAExC,OAAO;EACL,MAAM;EACN,QAAQ,KAAU;GAChB,MAAM,OAAO,IAAI;GAEjB,IAAI,aAAa,KAAU,WAAgB;IACzC,IAAI,WAAW,IAAI,SAAS,aAAa;IACzC,MAAM,MAAM,SAAS,SAAS,OAAO,aAAa;IAClD,IAAI,OAAO,GAAG,KAAK,KAAK,IAAI,OAAO,KAAK;GAC1C,CAAC;GAED,IAAI,UAAU,QAAa;IACzB,IAAI,OAAO,GAAG,KAAK,KAAK,IAAI,MAAM;GACpC,CAAC;GAED,IAAI,eAAe,cAAsB;IACvC,IAAI,OAAO,GAAG,KAAK,UAAU,UAAU,QAAQ;GACjD,CAAC;GAED,IAAI,WAAW,QAAiB;IAC9B,QAAQ,MAAM,IAAI,KAAK,WAAY,IAAc,WAAW,GAAG;GACjE,CAAC;EACH;CACF;AACF;AAEA,SAAS,IAAI,OAAe,KAAmB;CAE7C,MAAM,OAAO,qBADF,IAAI,KAAK,GAAE,YAAY,EAAE,MAAM,IAAI,EAC5B,EAAE,IAAI;CACxB,IAAI,UAAU,QAAQ,QAAQ,KAAK,IAAI;MAClC,QAAQ,MAAM,IAAI;AACzB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rbac.d.ts","names":[],"sources":["../../src/plugins/rbac.ts"],"mappings":";;;UAYiB,QAAA;EACf,KAAK;AAAA;AAAA,iBAGS,IAAA,CAAK,IAAA,EAAM,QAAA,GAAW,WAAW"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { stopPropagation } from "../hooks.js";
|
|
2
|
+
//#region src/plugins/rbac.ts
|
|
3
|
+
function rbac(opts) {
|
|
4
|
+
const allowed = new Set(opts.allow);
|
|
5
|
+
return {
|
|
6
|
+
name: "rbac",
|
|
7
|
+
install(ctx) {
|
|
8
|
+
ctx.onMessage?.((msg) => {
|
|
9
|
+
const toolName = msg.toolCall?.function?.name ?? msg.type === "TOOL_EXECUTE" ? msg.toolCall?.function?.name : null;
|
|
10
|
+
if (toolName && !allowed.has(toolName)) {
|
|
11
|
+
console.warn(`[${ctx.pname}] blocked tool: ${toolName}`);
|
|
12
|
+
return stopPropagation();
|
|
13
|
+
}
|
|
14
|
+
});
|
|
15
|
+
}
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
//#endregion
|
|
19
|
+
export { rbac };
|
|
20
|
+
|
|
21
|
+
//# sourceMappingURL=rbac.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rbac.js","names":[],"sources":["../../src/plugins/rbac.ts"],"sourcesContent":["// ── rbac Plugin ──────────────────────────────────────────────────────────\n//\n// Blocks tool execution for tools not in the allowed list.\n// Uses stopPropagation() to prevent handlers from running.\n//\n// Usage:\n// import { rbac } from 'posipaki/plugins/rbac';\n// const MyActor = defineActor({ plugins: [rbac({ allow: ['get_time'] })], ... });\n\nimport type { ActorPlugin } from '../hooks.js';\nimport { stopPropagation } from '../hooks.js';\n\nexport interface RbacOpts {\n allow: string[];\n}\n\nexport function rbac(opts: RbacOpts): ActorPlugin {\n const allowed = new Set(opts.allow);\n\n return {\n name: 'rbac',\n install(ctx: any) {\n ctx.onMessage?.((msg: any) => {\n const toolName = msg.toolCall?.function?.name\n ?? msg.type === 'TOOL_EXECUTE' ? (msg as any).toolCall?.function?.name\n : null;\n\n if (toolName && !allowed.has(toolName)) {\n console.warn(`[${ctx.pname}] blocked tool: ${toolName}`);\n return stopPropagation();\n }\n });\n },\n };\n}\n"],"mappings":";;AAgBA,SAAgB,KAAK,MAA6B;CAChD,MAAM,UAAU,IAAI,IAAI,KAAK,KAAK;CAElC,OAAO;EACL,MAAM;EACN,QAAQ,KAAU;GAChB,IAAI,aAAa,QAAa;IAC5B,MAAM,WAAW,IAAI,UAAU,UAAU,QACpC,IAAI,SAAS,iBAAkB,IAAY,UAAU,UAAU,OAChE;IAEJ,IAAI,YAAY,CAAC,QAAQ,IAAI,QAAQ,GAAG;KACtC,QAAQ,KAAK,IAAI,IAAI,MAAM,kBAAkB,UAAU;KACvD,OAAO,gBAAgB;IACzB;GACF,CAAC;EACH;CACF;AACF"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { ActorPlugin } from "../hooks.js";
|
|
2
|
+
|
|
3
|
+
//#region src/plugins/timeout-guard.d.ts
|
|
4
|
+
interface TimeoutGuardOpts {
|
|
5
|
+
ms: number;
|
|
6
|
+
}
|
|
7
|
+
declare function timeoutGuard(opts: TimeoutGuardOpts): ActorPlugin;
|
|
8
|
+
//#endregion
|
|
9
|
+
export { TimeoutGuardOpts, timeoutGuard };
|
|
10
|
+
//# sourceMappingURL=timeout-guard.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"timeout-guard.d.ts","names":[],"sources":["../../src/plugins/timeout-guard.ts"],"mappings":";;;UAUiB,gBAAA;EACf,EAAE;AAAA;AAAA,iBAGY,YAAA,CAAa,IAAA,EAAM,gBAAA,GAAmB,WAAW"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
//#region src/plugins/timeout-guard.ts
|
|
2
|
+
function timeoutGuard(opts) {
|
|
3
|
+
return {
|
|
4
|
+
name: "timeoutGuard",
|
|
5
|
+
install(ctx) {
|
|
6
|
+
let timer = null;
|
|
7
|
+
const reset = () => {
|
|
8
|
+
if (timer) clearTimeout(timer);
|
|
9
|
+
timer = setTimeout(() => {
|
|
10
|
+
console.error(`[${ctx.pname}] timeout after ${opts.ms}ms — exiting`);
|
|
11
|
+
try {
|
|
12
|
+
process.exit(1);
|
|
13
|
+
} catch {}
|
|
14
|
+
}, opts.ms);
|
|
15
|
+
};
|
|
16
|
+
ctx.onMessage?.(() => reset());
|
|
17
|
+
ctx.onStart?.(() => reset());
|
|
18
|
+
}
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
//#endregion
|
|
22
|
+
export { timeoutGuard };
|
|
23
|
+
|
|
24
|
+
//# sourceMappingURL=timeout-guard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"timeout-guard.js","names":[],"sources":["../../src/plugins/timeout-guard.ts"],"sourcesContent":["// ── timeoutGuard Plugin ──────────────────────────────────────────────────\n//\n// Kills the actor if no message is received within `ms` milliseconds.\n//\n// Usage:\n// import { timeoutGuard } from 'posipaki/plugins/timeout-guard';\n// const MyActor = defineActor({ plugins: [timeoutGuard({ ms: 30_000 })], ... });\n\nimport type { ActorPlugin } from '../hooks.js';\n\nexport interface TimeoutGuardOpts {\n ms: number;\n}\n\nexport function timeoutGuard(opts: TimeoutGuardOpts): ActorPlugin {\n return {\n name: 'timeoutGuard',\n install(ctx: any) {\n let timer: ReturnType<typeof setTimeout> | null = null;\n\n const reset = () => {\n if (timer) clearTimeout(timer);\n timer = setTimeout(() => {\n console.error(`[${ctx.pname}] timeout after ${opts.ms}ms — exiting`);\n try { process.exit(1); } catch {}\n }, opts.ms);\n };\n\n ctx.onMessage?.(() => reset());\n ctx.onStart?.(() => reset());\n },\n };\n}\n"],"mappings":";AAcA,SAAgB,aAAa,MAAqC;CAChE,OAAO;EACL,MAAM;EACN,QAAQ,KAAU;GAChB,IAAI,QAA8C;GAElD,MAAM,cAAc;IAClB,IAAI,OAAO,aAAa,KAAK;IAC7B,QAAQ,iBAAiB;KACvB,QAAQ,MAAM,IAAI,IAAI,MAAM,kBAAkB,KAAK,GAAG,aAAa;KACnE,IAAI;MAAE,QAAQ,KAAK,CAAC;KAAG,QAAQ,CAAC;IAClC,GAAG,KAAK,EAAE;GACZ;GAEA,IAAI,kBAAkB,MAAM,CAAC;GAC7B,IAAI,gBAAgB,MAAM,CAAC;EAC7B;CACF;AACF"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { d as WithSender, n as ExitMessage, o as ProcessFn, p as AsyncProcess, r as Message } from "./types-Bau9O_vk.js";
|
|
2
|
+
|
|
3
|
+
//#region src/util.d.ts
|
|
4
|
+
type ReducerClosure<M> = (msg: M) => void;
|
|
5
|
+
type ReadyFn = () => boolean;
|
|
6
|
+
/**
|
|
7
|
+
* Generator helper that loops, yielding `null` and feeding incoming
|
|
8
|
+
* messages to `fn` until `readyFn()` returns true. Used inside
|
|
9
|
+
* process generators to build the main message loop.
|
|
10
|
+
*/
|
|
11
|
+
declare function runDispatch<M>(name: string, fn: ReducerClosure<M>, readyFn?: ReadyFn, debugLevel?: boolean): Generator<null, void, M>;
|
|
12
|
+
/**
|
|
13
|
+
* @deprecated Use AsyncProcess._watchExit instead.
|
|
14
|
+
*
|
|
15
|
+
* Wrap a process generator so that on completion it sends STOP to
|
|
16
|
+
* all children and EXIT to the parent. Useful for custom process
|
|
17
|
+
* wrappers that need lifecycle management without extending
|
|
18
|
+
* AsyncProcess.
|
|
19
|
+
*/
|
|
20
|
+
//#endregion
|
|
21
|
+
//#region src/process.d.ts
|
|
22
|
+
/** @deprecated Use {@link spawnAsync} instead. */
|
|
23
|
+
declare function spawn<A, S, IM extends Message = Message, OM extends Message = ExitMessage>(fn: ProcessFn<A, S, IM, OM>, pname: string, tp?: (m: WithSender<OM>) => void): (a: A) => Process<A, S, IM, OM>;
|
|
24
|
+
/** @deprecated Use {@link AsyncProcess} instead. Sync processes are
|
|
25
|
+
* wrapped via asyncify internally; spawnAsync handles both. */
|
|
26
|
+
declare class Process<A, S, IM extends Message, OM extends Message> extends AsyncProcess<A, S, IM, OM> {
|
|
27
|
+
constructor(fn: ProcessFn<A, S, IM, OM>, pname: string, tp?: (m: WithSender<OM>) => void);
|
|
28
|
+
start(a: A): this;
|
|
29
|
+
tick(): Promise<void>;
|
|
30
|
+
}
|
|
31
|
+
//#endregion
|
|
32
|
+
export { spawn as n, runDispatch as r, Process as t };
|
|
33
|
+
//# sourceMappingURL=process-B1vevrTc.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"process-B1vevrTc.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,4 +1,5 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { a as ProcessCtx, d as WithSender, n as ExitMessage, o as ProcessFn } from "./types-Bau9O_vk.js";
|
|
2
|
+
import { t as Process } from "./process-B1vevrTc.js";
|
|
2
3
|
|
|
3
4
|
//#region src/supervisor.d.ts
|
|
4
5
|
type SupMsg = ExitMessage | RunMsg | StopMsg | ErrorMsg | OkMsg;
|
package/dist/supervisor.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"supervisor.d.ts","names":[],"sources":["../src/supervisor.ts"],"mappings":"
|
|
1
|
+
{"version":3,"file":"supervisor.d.ts","names":[],"sources":["../src/supervisor.ts"],"mappings":";;;;KAOK,MAAA,GAAS,WAAA,GAAc,MAAA,GAAS,OAAA,GAAU,QAAA,GAAW,KAAA;AAAA,UAEhD,MAAA;EACR,IAAA;EACA,EAAA,EAAI,SAAS;EACb,IAAA;EACA,KAAA;AAAA;AAAA,UAGQ,OAAA;EACR,IAAI;AAAA;AAAA,UAGI,QAAA;EACR,IAAI;AAAA;AAAA,UAGI,KAAA;EACR,IAAA;EAAA,CACC,GAAW;AAAA;AAAA,UAKG,eAAA;EACf,SAAA,EAAW,OAAO;EAClB,KAAA;AAAA;;;;;;;;AApBK;iBAiCG,SAAA;EACN,KAAA;EAAO,QAAA;EAAU;AAAA,GAAQ,UAAA,OAAiB,eAAA,EAAiB,MAAA,EAAQ,MAAA,GACrE,IAAA,IAAO,CAAA,EAAG,eAAA,KAAoB,eAAA,EAC9B,UAAA,aACC,SAAA,CAAU,eAAA,eAA8B,UAAA,CAAW,MAAA;;;;AAjChD;iBAqEG,MAAA,qBACP,UAAA,EAAY,OAAA,WAAkB,MAAA,EAAQ,MAAA,GACtC,EAAA,EAAI,SAAA,CAAU,IAAA,kBACd,KAAA,eACK,IAAA,EAAM,IAAA"}
|
|
@@ -1,66 +1,14 @@
|
|
|
1
|
-
//#region src/types.d.ts
|
|
2
|
-
/** Base message type. All messages must include a `type` field
|
|
3
|
-
* for discrimination in reducers. */
|
|
4
|
-
interface Message {
|
|
5
|
-
type: string;
|
|
6
|
-
}
|
|
7
|
-
/** Sender identity. `fromName` is the process name, `fromId` its symbol. */
|
|
8
|
-
interface SenderInfo {
|
|
9
|
-
fromName: string;
|
|
10
|
-
fromId: symbol;
|
|
11
|
-
}
|
|
12
|
-
/** A message paired with its sender. This is the currency inside the
|
|
13
|
-
* framework — every message in the buffer and every value the generator
|
|
14
|
-
* receives is `WithSender<M>`. */
|
|
15
|
-
type WithSender<M extends Message> = [M, SenderInfo];
|
|
16
|
-
/** Extract the message type from a stamped tuple. */
|
|
17
|
-
type WithoutSender<T extends WithSender<any>> = T[0];
|
|
18
|
-
/** Message emitted by a process to its parent when it terminates.
|
|
19
|
-
* The sender's identity is carried in the {@link SenderInfo} tuple. */
|
|
20
|
-
type ExitMessage = {
|
|
21
|
-
type: "EXIT";
|
|
22
|
-
};
|
|
23
|
-
type StopMessage = {
|
|
24
|
-
type: "STOP";
|
|
25
|
-
};
|
|
26
|
-
type ProcessFn<Args, State, InMessage extends Message, OutMessage extends Message> = (ctx: ProcessCtx<Args, State, InMessage, OutMessage>, args: Args) => Generator<State | null, void, WithSender<InMessage>>;
|
|
27
|
-
type AsyncProcessFn<Args, State, InMessage extends Message, OutMessage extends Message> = (ctx: ProcessCtx<Args, State, InMessage, OutMessage>, args: Args) => AsyncGenerator<State | null, void, WithSender<InMessage>>;
|
|
28
|
-
/** Origin of a message — either a process context or the literal "root"
|
|
29
|
-
* (used by the system harness to inject messages from outside). */
|
|
30
|
-
type SenderOrigin = ProcessCtx<unknown, unknown, Message, Message> | "root";
|
|
31
|
-
type ProcessMessageCb$1<M> = (msg: M) => void;
|
|
32
|
-
/** Fork a child process. Takes a ProcessFn and a name, returns a
|
|
33
|
-
* curried function that accepts the child's initial args. */
|
|
34
|
-
/** Context injected into every running process. */
|
|
35
|
-
type ProcessCtx<Args, State, IM extends Message, OM extends Message> = {
|
|
36
|
-
pname: string;
|
|
37
|
-
id: symbol;
|
|
38
|
-
sendSelf: (msg: IM) => void;
|
|
39
|
-
toParent: ProcessMessageCb$1<OM>;
|
|
40
|
-
} & Pick<AsyncProcess<Args, State, IM, OM>, "fork" | "forkSync">;
|
|
41
|
-
/** State yielded by the pipe process. */
|
|
42
|
-
interface PipeState<Params, Result> {
|
|
43
|
-
params: Params | null;
|
|
44
|
-
result: Result | null;
|
|
45
|
-
running: boolean;
|
|
46
|
-
}
|
|
47
|
-
/** State yielded by the supervisor process. */
|
|
48
|
-
interface SupervisorState {
|
|
49
|
-
processes: any[];
|
|
50
|
-
phase: "wait" | "running" | "stopping";
|
|
51
|
-
}
|
|
52
|
-
//#endregion
|
|
53
1
|
//#region src/process.async.d.ts
|
|
54
2
|
type NotifyFn = () => void;
|
|
55
3
|
type AsyncReducer<M> = (msg: M) => Promise<void>;
|
|
56
|
-
type ReadyFn
|
|
4
|
+
type ReadyFn = () => boolean;
|
|
57
5
|
/**
|
|
58
6
|
* Async equivalent of `runDispatch`. Loops, yielding `null` and feeding
|
|
59
7
|
* each incoming message to an `async` reducer. Exits when `readyFn()`
|
|
60
8
|
* returns true.
|
|
61
9
|
*/
|
|
62
|
-
declare function runDispatchAsync<M>(name: string, fn: AsyncReducer<M>, readyFn?: ReadyFn
|
|
63
|
-
type ProcessMessageCb<M> = (msg: M) => void;
|
|
10
|
+
declare function runDispatchAsync<M>(name: string, fn: AsyncReducer<M>, readyFn?: ReadyFn, debugLevel?: boolean): AsyncGenerator<null, void, M>;
|
|
11
|
+
type ProcessMessageCb$1<M> = (msg: M) => void;
|
|
64
12
|
/**
|
|
65
13
|
* A process driven by an async generator. Functionally identical to
|
|
66
14
|
* {@link Process} but supports `await` inside reducers.
|
|
@@ -73,7 +21,7 @@ declare class AsyncProcess<Args, State, InMessage extends Message, OutMessage ex
|
|
|
73
21
|
pgenerator: AsyncProcessFn<Args, State, InMessage, OutMessage>;
|
|
74
22
|
pname: string;
|
|
75
23
|
/** Called for every message sent via `ctx.toParent`. Receives `WithSender<OutMessage>`. */
|
|
76
|
-
toParent: ProcessMessageCb<WithSender<OutMessage>>;
|
|
24
|
+
toParent: ProcessMessageCb$1<WithSender<OutMessage>>;
|
|
77
25
|
id: symbol;
|
|
78
26
|
state: State | null;
|
|
79
27
|
private current;
|
|
@@ -88,7 +36,7 @@ declare class AsyncProcess<Args, State, InMessage extends Message, OutMessage ex
|
|
|
88
36
|
private _exitReject;
|
|
89
37
|
private _ready;
|
|
90
38
|
private _resolveReady;
|
|
91
|
-
constructor(fn: AsyncProcessFn<Args, State, InMessage, OutMessage>, pname: string, toParent: ProcessMessageCb<WithSender<OutMessage>> | undefined);
|
|
39
|
+
constructor(fn: AsyncProcessFn<Args, State, InMessage, OutMessage>, pname: string, toParent: ProcessMessageCb$1<WithSender<OutMessage>> | undefined);
|
|
92
40
|
/** Promise that resolves once the initial state is available. */
|
|
93
41
|
ready(): Promise<void>;
|
|
94
42
|
/**
|
|
@@ -98,8 +46,8 @@ declare class AsyncProcess<Args, State, InMessage extends Message, OutMessage ex
|
|
|
98
46
|
start(arg0: Args): this;
|
|
99
47
|
/** Wrap the user's generator so EXIT/STOP logic fires on completion. */
|
|
100
48
|
private _watchExit;
|
|
101
|
-
fork<ChildArgs, ChildState, ChildIM extends Message, ChildOM extends Message>(fn: AsyncProcessFn<ChildArgs, ChildState, ChildIM, ChildOM>, pname
|
|
102
|
-
forkSync<ChildArgs, ChildState, ChildIM extends Message, ChildOM extends Message>(fn: ProcessFn<ChildArgs, ChildState, ChildIM, ChildOM>, pname
|
|
49
|
+
fork<ChildArgs, ChildState, ChildIM extends Message, ChildOM extends Message>(fn: AsyncProcessFn<ChildArgs, ChildState, ChildIM, ChildOM>, pname?: string): (args: ChildArgs) => AsyncProcess<ChildArgs, ChildState, ChildIM, ChildOM>;
|
|
50
|
+
forkSync<ChildArgs, ChildState, ChildIM extends Message, ChildOM extends Message>(fn: ProcessFn<ChildArgs, ChildState, ChildIM, ChildOM>, pname?: string): (args: ChildArgs) => AsyncProcess<ChildArgs, ChildState, ChildIM, ChildOM>;
|
|
103
51
|
protected _tick(): Promise<void>;
|
|
104
52
|
/** Call `.next()` and redirect unhandled rejections. */
|
|
105
53
|
private _safeNext;
|
|
@@ -135,36 +83,66 @@ declare class AsyncProcess<Args, State, InMessage extends Message, OutMessage ex
|
|
|
135
83
|
* Spawn a new async process. Accepts both sync and async process
|
|
136
84
|
* functions — sync ones are automatically wrapped with {@link asyncify}.
|
|
137
85
|
*/
|
|
138
|
-
declare function spawnAsync<Args, State, InMessage extends Message = Message, OutMessage extends Message = ExitMessage>(fn: AsyncProcessFn<Args, State, InMessage, OutMessage>, pname: string, toParent?: ProcessMessageCb<WithSender<OutMessage>>): (args: Args) => AsyncProcess<Args, State, InMessage, OutMessage>;
|
|
139
|
-
//#endregion
|
|
140
|
-
//#region src/util.d.ts
|
|
141
|
-
type ReducerClosure<M> = (msg: M) => void;
|
|
142
|
-
type ReadyFn = () => boolean;
|
|
143
|
-
/**
|
|
144
|
-
* Generator helper that loops, yielding `null` and feeding incoming
|
|
145
|
-
* messages to `fn` until `readyFn()` returns true. Used inside
|
|
146
|
-
* process generators to build the main message loop.
|
|
147
|
-
*/
|
|
148
|
-
declare function runDispatch<M>(name: string, fn: ReducerClosure<M>, readyFn?: ReadyFn, debugLevel?: boolean): Generator<null, void, M>;
|
|
149
|
-
/**
|
|
150
|
-
* @deprecated Use AsyncProcess._watchExit instead.
|
|
151
|
-
*
|
|
152
|
-
* Wrap a process generator so that on completion it sends STOP to
|
|
153
|
-
* all children and EXIT to the parent. Useful for custom process
|
|
154
|
-
* wrappers that need lifecycle management without extending
|
|
155
|
-
* AsyncProcess.
|
|
156
|
-
*/
|
|
86
|
+
declare function spawnAsync<Args, State, InMessage extends Message = Message, OutMessage extends Message = ExitMessage>(fn: AsyncProcessFn<Args, State, InMessage, OutMessage>, pname: string, toParent?: ProcessMessageCb$1<WithSender<OutMessage>>): (args: Args) => AsyncProcess<Args, State, InMessage, OutMessage>;
|
|
157
87
|
//#endregion
|
|
158
|
-
//#region src/
|
|
159
|
-
/**
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
88
|
+
//#region src/types.d.ts
|
|
89
|
+
/** Base message type. All messages must include a `type` field
|
|
90
|
+
* for discrimination in reducers. */
|
|
91
|
+
interface Message {
|
|
92
|
+
type: string;
|
|
93
|
+
}
|
|
94
|
+
/** Sender identity. `fromName` is the process name, `fromId` its symbol. */
|
|
95
|
+
interface SenderInfo {
|
|
96
|
+
fromName: string;
|
|
97
|
+
fromId: symbol;
|
|
98
|
+
}
|
|
99
|
+
/** A message paired with its sender. This is the currency inside the
|
|
100
|
+
* framework — every message in the buffer and every value the generator
|
|
101
|
+
* receives is `WithSender<M>`. */
|
|
102
|
+
type WithSender<M extends Message> = [M, SenderInfo];
|
|
103
|
+
/** Extract the message type from a stamped tuple. */
|
|
104
|
+
type WithoutSender<T extends WithSender<any>> = T[0];
|
|
105
|
+
/** Message emitted by a process to its parent when it terminates.
|
|
106
|
+
* The sender's identity is carried in the {@link SenderInfo} tuple. */
|
|
107
|
+
type ExitMessage = {
|
|
108
|
+
type: "EXIT";
|
|
109
|
+
};
|
|
110
|
+
type StopMessage = {
|
|
111
|
+
type: "STOP";
|
|
112
|
+
};
|
|
113
|
+
type ProcessFn<Args, State, InMessage extends Message, OutMessage extends Message> = (ctx: ProcessCtx<Args, State, InMessage, OutMessage>, args: Args) => Generator<State | null, void, WithSender<InMessage>>;
|
|
114
|
+
type AsyncProcessFn<Args, State, InMessage extends Message, OutMessage extends Message> = (ctx: ProcessCtx<Args, State, InMessage, OutMessage>, args: Args) => AsyncGenerator<State | null, void, WithSender<InMessage>>;
|
|
115
|
+
/** Origin of a message — either a process context or the literal "root"
|
|
116
|
+
* (used by the system harness to inject messages from outside). */
|
|
117
|
+
type SenderOrigin = ProcessCtx<unknown, unknown, Message, Message> | "root";
|
|
118
|
+
type ProcessMessageCb<M> = (msg: M) => void;
|
|
119
|
+
/** Fork a child process. Takes a ProcessFn and a name, returns a
|
|
120
|
+
* curried function that accepts the child's initial args. */
|
|
121
|
+
/** Context injected into every running process. */
|
|
122
|
+
type ProcessCtx<Args, State, IM extends Message, OM extends Message> = {
|
|
123
|
+
pname: string;
|
|
124
|
+
id: symbol;
|
|
125
|
+
sendSelf: (msg: IM) => void;
|
|
126
|
+
toParent: ProcessMessageCb<OM>; /** Register an onMessage hook. Return stopPropagation() to short-circuit. */
|
|
127
|
+
onMessage?: (fn: (msg: IM, sender: SenderInfo) => void | Promise<void> | symbol) => void; /** Register an onEmit hook. */
|
|
128
|
+
onEmit?: (fn: (msg: OM) => void) => void; /** Register an onChildExit hook. */
|
|
129
|
+
onChildExit?: (fn: (name: string) => void | Promise<void>) => void; /** Register an onStart hook. */
|
|
130
|
+
onStart?: (fn: (state: State) => void | Promise<void>) => void; /** Register an onStopRequested hook. */
|
|
131
|
+
onStopRequested?: (fn: () => void | Promise<void>) => void; /** Register an onError hook. */
|
|
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;
|
|
134
|
+
} & Pick<AsyncProcess<Args, State, IM, OM>, "fork" | "forkSync">;
|
|
135
|
+
/** State yielded by the pipe process. */
|
|
136
|
+
interface PipeState<Params, Result> {
|
|
137
|
+
params: Params | null;
|
|
138
|
+
result: Result | null;
|
|
139
|
+
running: boolean;
|
|
140
|
+
}
|
|
141
|
+
/** State yielded by the supervisor process. */
|
|
142
|
+
interface SupervisorState {
|
|
143
|
+
processes: any[];
|
|
144
|
+
phase: "wait" | "running" | "stopping";
|
|
167
145
|
}
|
|
168
146
|
//#endregion
|
|
169
|
-
export {
|
|
170
|
-
//# sourceMappingURL=
|
|
147
|
+
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-Bau9O_vk.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types-Bau9O_vk.d.ts","names":[],"sources":["../src/process.async.ts","../src/types.ts"],"mappings":"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"}
|
package/dist/xfetch.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { a as ProcessCtx, d as WithSender, n as ExitMessage } from "./types-Bau9O_vk.js";
|
|
2
|
+
import { t as Process } from "./process-B1vevrTc.js";
|
|
2
3
|
|
|
3
4
|
//#region src/xfetch.d.ts
|
|
4
5
|
/** State of an in-flight or completed fetch. */
|
package/dist/xfetch.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"xfetch.d.ts","names":[],"sources":["../src/xfetch.ts"],"mappings":"
|
|
1
|
+
{"version":3,"file":"xfetch.d.ts","names":[],"sources":["../src/xfetch.ts"],"mappings":";;;;;KAOY,UAAA;EACV,IAAA;EACA,IAAA,EAAM,CAAA;EACN,IAAA;EACA,MAAA;EACA,eAAA,EAAiB,MAAM;AAAA;;KAIb,SAAA;EAEN,GAAA,EAAK,GAAA;EACL,MAAA;EACA,IAAA;EACA,OAAA,GAAU,MAAA;AAAA;EAGV,GAAA,EAAK,GAAA;EACL,MAAA;EACA,IAAA,EAAM,CAAA;EACN,OAAA,GAAU,MAAA;AAAA;;KAIJ,YAAA;EAEN,IAAA;EACA,IAAA,GAAO,CAAA;EACP,IAAA;EACA,MAAA;EACA,eAAA,EAAiB,MAAA;AAAA;EAEjB,IAAA;AAAA,IACF,WAAA;;KAGQ,YAAA,MAAkB,OAAA,CAC5B,SAAA,CAAU,CAAA,GACV,UAAA,CAAW,CAAA,GACX,YAAA,CAAa,CAAA,GACb,YAAA,CAAa,CAAA;;;;;;iBA0BL,MAAA;EAEN,KAAA;EACA,QAAA;EACA;AAAA,GACC,UAAA,CACD,SAAA,CAAU,IAAA,GACV,UAAA,CAAW,IAAA,GACX,YAAA,CAAa,IAAA,GACb,YAAA,CAAa,IAAA;EAEb,MAAA;EAAgB,GAAA;EAAK,IAAA;EAAM,OAAA,EAAS;AAAA,GAAiB,SAAA,CAAU,IAAA,IAChE,SAAA,CAAU,UAAA,CAAW,IAAA,gBAAoB,UAAA,CAAW,YAAA,CAAa,IAAA"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"type": "module",
|
|
3
3
|
"name": "posipaki",
|
|
4
|
-
"version": "0.
|
|
4
|
+
"version": "0.12.0",
|
|
5
5
|
"main": "./dist/index.js",
|
|
6
6
|
"types": "./dist/index.d.ts",
|
|
7
7
|
"files": [
|
|
@@ -28,6 +28,22 @@
|
|
|
28
28
|
"./xfetch": {
|
|
29
29
|
"types": "./dist/xfetch.d.ts",
|
|
30
30
|
"default": "./dist/xfetch.js"
|
|
31
|
+
},
|
|
32
|
+
"./plugins/debug-logger": {
|
|
33
|
+
"types": "./dist/plugins/debug-logger.d.ts",
|
|
34
|
+
"default": "./dist/plugins/debug-logger.js"
|
|
35
|
+
},
|
|
36
|
+
"./plugins/timeout-guard": {
|
|
37
|
+
"types": "./dist/plugins/timeout-guard.d.ts",
|
|
38
|
+
"default": "./dist/plugins/timeout-guard.js"
|
|
39
|
+
},
|
|
40
|
+
"./plugins/rbac": {
|
|
41
|
+
"types": "./dist/plugins/rbac.d.ts",
|
|
42
|
+
"default": "./dist/plugins/rbac.js"
|
|
43
|
+
},
|
|
44
|
+
"./hooks": {
|
|
45
|
+
"types": "./dist/hooks.d.ts",
|
|
46
|
+
"default": "./dist/hooks.js"
|
|
31
47
|
}
|
|
32
48
|
}
|
|
33
49
|
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"process-BiX7Ena4.d.ts","names":[],"sources":["../src/types.ts","../src/process.async.ts","../src/util.ts","../src/process.ts"],"mappings":";AAkBA;;AAAA,UAPiB,OAAA;EACf,IAAI;AAAA;AAgBN;AAAA,UAViB,UAAA;EACf,QAAA;EACA,MAAM;AAAA;;;;KAQI,UAAA,WAAqB,OAAA,KAAY,CAAA,EAAG,UAAA;;KAGpC,aAAA,WAAwB,UAAA,SAAmB,CAAC;;;KAM5C,WAAA;EACV,IAAI;AAAA;AAAA,KAGM,WAAA;EACV,IAAI;AAAA;AAAA,KAKM,SAAA,gCAGQ,OAAA,qBACC,OAAA,KAEnB,GAAA,EAAK,UAAA,CAAW,IAAA,EAAM,KAAA,EAAO,SAAA,EAAW,UAAA,GACxC,IAAA,EAAM,IAAA,KACH,SAAA,CAAU,KAAA,eAAoB,UAAA,CAAW,SAAA;AAAA,KAIlC,cAAA,gCAGQ,OAAA,qBACC,OAAA,KAEnB,GAAA,EAAK,UAAA,CAAW,IAAA,EAAM,KAAA,EAAO,SAAA,EAAW,UAAA,GACxC,IAAA,EAAM,IAAA,KACH,cAAA,CAAe,KAAA,eAAoB,UAAA,CAAW,SAAA;;AApCK;KA0C5C,YAAA,GACR,UAAA,mBAA6B,OAAA,EAAS,OAAA;AAAA,KAKrC,kBAAA,OAAuB,GAAA,EAAK,CAAC;;;;KAyBtB,UAAA,yBAAmC,OAAA,aAAoB,OAAA;EACjE,KAAA;EACA,EAAA;EACA,QAAA,GAAW,GAAA,EAAK,EAAA;EAChB,QAAA,EAAU,kBAAA,CAAiB,EAAA;AAAA,IACzB,IAAA,CAAK,YAAA,CAAa,IAAA,EAAM,KAAA,EAAO,EAAA,EAAI,EAAA;;UAKtB,SAAA;EACf,MAAA,EAAQ,MAAA;EACR,MAAA,EAAQ,MAAM;EACd,OAAA;AAAA;;UAMe,eAAA;EACf,SAAA;EACA,KAAK;AAAA;;;KCzGF,QAAA;AAAA,KAIA,YAAA,OAAmB,GAAA,EAAK,CAAA,KAAM,OAAO;AAAA,KACrC,SAAA;;ADbC;AAMN;;;iBCcuB,gBAAA,IACrB,IAAA,UACA,EAAA,EAAI,YAAA,CAAa,CAAA,GACjB,OAAA,GAAS,SAAA,EACT,UAAA,aACC,cAAA,aAA2B,CAAA;AAAA,KAWzB,gBAAA,OAAuB,GAAA,EAAK,CAAC;ADpBlC;;;;;;;;AAAA,cCgCa,YAAA,gCAGO,OAAA,qBACC,OAAA;EAEnB,UAAA,EAAY,cAAA,CAAe,IAAA,EAAM,KAAA,EAAO,SAAA,EAAW,UAAA;EACnD,KAAA;EDvC8C;ECyC9C,QAAA,EAAU,gBAAA,CAAiB,UAAA,CAAW,UAAA;EACtC,EAAA;EACA,KAAA,EAAO,KAAA;EAAA,QAEC,OAAA;ED1Ce;EAAA,QC4Cf,MAAA;EAAA,QACA,QAAA;EAAA,QACA,QAAA;EAAA,QAEA,WAAA;EAAA,QACA,UAAA;EAAA,QACA,SAAA;EAAA,QACA,eAAA;EAAA,QACA,WAAA;EAAA,QACA,MAAA;EAAA,QACA,aAAA;cAGN,EAAA,EAAI,cAAA,CAAe,IAAA,EAAM,KAAA,EAAO,SAAA,EAAW,UAAA,GAC3C,KAAA,UACA,QAAA,EAAU,gBAAA,CAAiB,UAAA,CAAW,UAAA;EDjD9B;EC8DV,KAAA,IAAS,OAAA;;;AD7DL;AAKN;ECkEE,KAAA,CAAM,IAAA,EAAM,IAAA;EDlEO;EAAA,QCuGJ,UAAA;EAef,IAAA,wCAA4C,OAAA,kBAAyB,OAAA,EACnE,EAAA,EAAI,cAAA,CAAe,SAAA,EAAW,UAAA,EAAY,OAAA,EAAS,OAAA,GACnD,KAAA,YAEA,IAAA,EAAM,SAAA,KACH,YAAA,CAAa,SAAA,EAAW,UAAA,EAAY,OAAA,EAAS,OAAA;EAiBlD,QAAA,wCAGkB,OAAA,kBACA,OAAA,EAEhB,EAAA,EAAI,SAAA,CAAU,SAAA,EAAW,UAAA,EAAY,OAAA,EAAS,OAAA,GAC9C,KAAA,YAEA,IAAA,EAAM,SAAA,KACH,YAAA,CAAa,SAAA,EAAW,UAAA,EAAY,OAAA,EAAS,OAAA;EAAA,UAMlC,KAAA,IAAS,OAAA;EDtJI;EAAA,QC4Kf,SAAA;EAAA,QAYN,UAAA;EDvLF;ECsMN,aAAA,CAAc,GAAA,EAAK,OAAA;EDrMyB;EC2M5C,IAAA,CAAK,GAAA,EAAK,SAAA,EAAW,IAAA,EAAM,UAAA;ED3MxB;EC6MH,IAAA,CAAK,YAAA,EAAc,UAAA,CAAW,SAAA;ED7MlB;;;;;EC4NZ,IAAA;EAAA,QAKQ,aAAA;EAYR,MAAA;EAAA,IAII,YAAA;EAIJ,SAAA,CAAU,CAAA,EAAG,QAAA;EAWb,KAAA;EAMA,MAAA;EDxQA;;;;ECmRA,IAAA,IAAQ,OAAA;EDjRyB;;EAAA,QCsSzB,SAAA;AAAA;ADlSV;;;;AAAA,iBCkTgB,UAAA,gCAGI,OAAA,GAAU,OAAA,qBACT,OAAA,GAAU,WAAA,EAE7B,EAAA,EAAI,cAAA,CAAe,IAAA,EAAM,KAAA,EAAO,SAAA,EAAW,UAAA,GAC3C,KAAA,UACA,QAAA,GAAW,gBAAA,CAAiB,UAAA,CAAW,UAAA,MACrC,IAAA,EAAM,IAAA,KAAS,YAAA,CAAa,IAAA,EAAM,KAAA,EAAO,SAAA,EAAW,UAAA;;;KC/WnD,cAAA,OAAqB,GAAA,EAAK,CAAC;AAAA,KAC3B,OAAA;AFIC;AAMN;;;;AANM,iBEII,WAAA,IACR,IAAA,UACA,EAAA,EAAI,cAAA,CAAe,CAAA,GACnB,OAAA,GAAS,OAAA,EACT,UAAA,aACC,SAAA,aAAsB,CAAA;AFOzB;;;;;;;;;;;iBGpBgB,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;AHC/B;;AAAA,cGKM,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"}
|