posipaki 0.12.0 → 0.13.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/hooks.d.ts +1 -1
- package/dist/index.d.ts +2 -2
- package/dist/index.js +12 -6
- package/dist/index.js.map +1 -1
- package/dist/pipe.d.ts +1 -1
- package/dist/{process-B1vevrTc.d.ts → process-DSljemNS.d.ts} +2 -2
- package/dist/{process-B1vevrTc.d.ts.map → process-DSljemNS.d.ts.map} +1 -1
- package/dist/supervisor.d.ts +2 -2
- package/dist/{types-Bau9O_vk.d.ts → types-DW-t7vov.d.ts} +5 -4
- package/dist/{types-Bau9O_vk.d.ts.map → types-DW-t7vov.d.ts.map} +1 -1
- package/dist/xfetch.d.ts +2 -2
- package/package.json +9 -9
package/dist/hooks.d.ts
CHANGED
package/dist/index.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { a as ProcessCtx, c as SenderOrigin, d as WithSender, f as WithoutSender, h as spawnAsync, i as PipeState, l as StopMessage, m as runDispatchAsync, n as ExitMessage, o as ProcessFn, p as AsyncProcess, r as Message, s as SenderInfo, t as AsyncProcessFn, u as SupervisorState } from "./types-
|
|
1
|
+
import { a as ProcessCtx, c as SenderOrigin, d as WithSender, f as WithoutSender, h as spawnAsync, i as PipeState, l as StopMessage, m as runDispatchAsync, n as ExitMessage, o as ProcessFn, p as AsyncProcess, r as Message, s as SenderInfo, t as AsyncProcessFn, u as SupervisorState } from "./types-DW-t7vov.js";
|
|
2
2
|
import { ActorDecorated as ActorDecorated$1, ActorPlugin as ActorPlugin$1, HookRegistry, HookResult as HookResult$1, OnChildExitHook, OnEmitHook, OnEndHook, OnErrorHook, OnMessageHook, OnStartHook as OnStartHook$1, OnStopRequestedHook, PluginTransform as PluginTransform$1, stopPropagation } from "./hooks.js";
|
|
3
|
-
import { n as spawn, r as runDispatch, t as Process } from "./process-
|
|
3
|
+
import { n as spawn, r as runDispatch, t as Process } from "./process-DSljemNS.js";
|
|
4
4
|
|
|
5
5
|
//#region src/adapters.d.ts
|
|
6
6
|
declare function asyncify<A, S, IM extends Message, OM extends Message>(fn: ProcessFn<A, S, IM, OM>): AsyncProcessFn<A, S, IM, OM>;
|
package/dist/index.js
CHANGED
|
@@ -101,9 +101,7 @@ var AsyncProcess = class AsyncProcess {
|
|
|
101
101
|
}
|
|
102
102
|
fork(fn, pname) {
|
|
103
103
|
return (args) => {
|
|
104
|
-
const
|
|
105
|
-
const baseName = pname ?? fnConfig?.name ?? `child-${this.children.length}`;
|
|
106
|
-
const child = new AsyncProcess(fn, `${this.pname}:${baseName}`, this.fromChild.bind(this));
|
|
104
|
+
const child = new AsyncProcess(fn, pname, this.fromChild.bind(this));
|
|
107
105
|
this.children.push(child);
|
|
108
106
|
child.start(args);
|
|
109
107
|
return child;
|
|
@@ -316,7 +314,7 @@ function defineActor(config) {
|
|
|
316
314
|
fork(childFn, name, childArgs) {
|
|
317
315
|
const resolved = typeof childFn === "function" ? childFn : childFn.fn;
|
|
318
316
|
const childDef = typeof childFn === "object" ? childFn : null;
|
|
319
|
-
const childName = name ??
|
|
317
|
+
const childName = name ?? childDef?.name ?? `child-${Object.keys(self.$child).length}`;
|
|
320
318
|
const parentPlugs = config.plugins ? typeof config.plugins === "function" ? config.plugins([]) : config.plugins : [];
|
|
321
319
|
const childRaw = childDef?._pluginsRaw;
|
|
322
320
|
let childPlugs;
|
|
@@ -324,12 +322,14 @@ function defineActor(config) {
|
|
|
324
322
|
else if (Array.isArray(childRaw)) childPlugs = [...childRaw];
|
|
325
323
|
else childPlugs = childRaw(parentPlugs);
|
|
326
324
|
stashPlugins(resolved, childPlugs);
|
|
327
|
-
const
|
|
325
|
+
const treeName = `${ctx.pname}:${childName}`;
|
|
326
|
+
const child = ctx.fork(resolved, treeName)(childArgs);
|
|
328
327
|
self.$child[child.pname] = child;
|
|
329
328
|
return child;
|
|
330
329
|
},
|
|
331
330
|
ctx
|
|
332
331
|
};
|
|
332
|
+
const decorated = /* @__PURE__ */ new Map();
|
|
333
333
|
const ctxAny = ctx;
|
|
334
334
|
ctxAny.onMessage = (fn) => {
|
|
335
335
|
_hooks.onMessage.push(fn);
|
|
@@ -352,6 +352,11 @@ function defineActor(config) {
|
|
|
352
352
|
ctxAny.onEnd = (fn) => {
|
|
353
353
|
_hooks.onEnd.push(fn);
|
|
354
354
|
};
|
|
355
|
+
ctxAny.decorate = (key, value) => {
|
|
356
|
+
if (key in self) throw new Error(`decorate: key "${key}" conflicts with built-in`);
|
|
357
|
+
if (decorated.has(key)) throw new Error(`decorate: key "${key}" already decorated`);
|
|
358
|
+
decorated.set(key, value);
|
|
359
|
+
};
|
|
355
360
|
const resolvedPlugs = getResolvedPlugins(fn) ?? (config.plugins ? typeof config.plugins === "function" ? config.plugins([]) : config.plugins : []);
|
|
356
361
|
for (const p of resolvedPlugs) {
|
|
357
362
|
let _err = null;
|
|
@@ -372,6 +377,7 @@ function defineActor(config) {
|
|
|
372
377
|
if (h.onEnd) _hooks.onEnd.push((reason) => h.onEnd.call(self, reason));
|
|
373
378
|
if (h.onError) _hooks.onError.push((err) => h.onError.call(self, err));
|
|
374
379
|
}
|
|
380
|
+
for (const [key, value] of decorated) self[key] = value;
|
|
375
381
|
yield exposedState;
|
|
376
382
|
if (config.onStart) await config.onStart.call(self, args);
|
|
377
383
|
for (const fn of _hooks.onStart) try {
|
|
@@ -452,7 +458,7 @@ function defineActor(config) {
|
|
|
452
458
|
return spawnAsync(fn, config.name ?? "actor")(args);
|
|
453
459
|
},
|
|
454
460
|
spawnAsChild(ctx, args, name) {
|
|
455
|
-
return ctx.fork(fn, name ?? config.name)(args);
|
|
461
|
+
return ctx.fork(fn, name ?? config.name ?? "child")(args);
|
|
456
462
|
}
|
|
457
463
|
};
|
|
458
464
|
}
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
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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"}
|
|
1
|
+
{"version":3,"file":"index.js","names":["withPlugins"],"sources":["../src/adapters.ts","../src/process.async.ts","../src/process.ts","../src/define-actor.ts","../src/index.ts"],"sourcesContent":["import type { ProcessFn, AsyncProcessFn, Message } from \"./types.js\"\n\nexport function asyncify<A, S, IM extends Message, OM extends Message>(\n fn: ProcessFn<A, S, IM, OM>,\n): AsyncProcessFn<A, S, IM, OM> {\n return async function* (ctx, args) {\n yield* fn(ctx, args) as any\n }\n}\n","import { defer, makeWaiter, debugLog } from \"./util.js\";\nimport type { DeferredCall, Waiter } from \"./util.js\";\nimport type {\n Message,\n WithSender,\n SenderInfo,\n ExitMessage,\n ProcessCtx,\n AsyncProcessFn,\n ProcessFn,\n Fork,\n} from \"./types.js\";\nimport { asyncify } from \"./adapters.js\";\n\n// ---- types ------------------------------------------------------------------\n\n/** An async iterator over process state. Receives `WithSender<InMessage>`. */\ntype AsyncProcessGenerator<ProcessState, InMessage extends Message> =\n AsyncGenerator<ProcessState | null, void, WithSender<InMessage>>;\n\ntype NotifyFn = () => void;\n\n// ---- runDispatchAsync -------------------------------------------------------\n\ntype AsyncReducer<M> = (msg: M) => Promise<void>;\ntype ReadyFn = () => boolean;\n\n/**\n * Async equivalent of `runDispatch`. Loops, yielding `null` and feeding\n * each incoming message to an `async` reducer. Exits when `readyFn()`\n * returns true.\n */\nexport async function* runDispatchAsync<M>(\n name: string,\n fn: AsyncReducer<M>,\n readyFn: ReadyFn = () => false,\n debugLevel = false,\n): AsyncGenerator<null, void, M> {\n let msg: M;\n while (!readyFn()) {\n msg = yield null;\n debugLog(debugLevel, \"msg\", name, \" <- \", msg);\n await fn(msg);\n }\n}\n\n// ---- AsyncProcess -----------------------------------------------------------\n\ntype ProcessMessageCb<M> = (msg: M) => void;\n\nconst noop = () => null;\n\n/**\n * A process driven by an async generator. Functionally identical to\n * {@link Process} but supports `await` inside reducers.\n *\n * Messages are processed **one at a time** — if a tick is already\n * in-flight, new messages are buffered and processed when the current\n * tick completes.\n */\nexport class AsyncProcess<\n Args,\n State,\n InMessage extends Message,\n OutMessage extends Message,\n> {\n pgenerator: AsyncProcessFn<Args, State, InMessage, OutMessage>;\n pname: string;\n /** Called for every message sent via `ctx.toParent`. Receives `WithSender<OutMessage>`. */\n toParent: ProcessMessageCb<WithSender<OutMessage>>;\n id: symbol;\n state: State | null;\n\n private current: AsyncProcessGenerator<State, InMessage> | null = null;\n /** Every buffered message carries sender provenance. */\n private buffer: Array<WithSender<InMessage>> = [];\n private nextTick: DeferredCall | null = null;\n private children: Array<AsyncProcess<unknown, unknown, Message, Message>> =\n [];\n private subscribers: Array<NotifyFn> = [];\n private exitWaiter: Waiter;\n private _isPaused: boolean = false;\n private _tickInProgress: boolean = false;\n private _exitReject: ((e: unknown) => void) | null = null;\n private _ready!: Waiter;\n private _resolveReady!: () => void;\n\n constructor(\n fn: AsyncProcessFn<Args, State, InMessage, OutMessage>,\n pname: string,\n toParent: ProcessMessageCb<WithSender<OutMessage>> | undefined,\n ) {\n this.pgenerator = fn;\n this.pname = pname;\n this.toParent = toParent || (noop as ProcessMessageCb<WithSender<OutMessage>>);\n this.id = Symbol(pname);\n this.state = null;\n this.exitWaiter = makeWaiter();\n this._ready = makeWaiter();\n this._resolveReady = this._ready.resolve;\n }\n\n /** Promise that resolves once the initial state is available. */\n ready(): Promise<void> {\n return this._ready.promise;\n }\n\n // ---- lifecycle ------------------------------------------------------------\n\n /**\n * Kick off the async generator. The first `yield` sets the initial\n * state; for async generators this happens in a microtask.\n */\n start(arg0: Args) {\n const selfCtx: SenderInfo = { fromName: this.pname, fromId: this.id };\n\n const ctx: ProcessCtx<Args, State, InMessage, OutMessage> = {\n pname: this.pname,\n id: this.id,\n fork: this.fork.bind(this),\n forkSync: this.forkSync.bind(this),\n sendSelf: (msg) => {\n this.send([msg, selfCtx]);\n },\n toParent: (msg) => {\n this.toParent([msg, selfCtx] as WithSender<OutMessage>);\n },\n };\n\n this.current = this._watchExit(ctx, arg0);\n void this.current.next().then((ret: IteratorResult<State | null, void>) => {\n this.state = ret.value ?? null;\n this._resolveReady();\n if (ret.done) {\n this.exitWaiter.resolve();\n return;\n }\n // Advance past the initial yield so the _watchExit generator\n // runs its finally block (EXIT/STOP) and the inner generator\n // enters its dispatch loop.\n const advance: WithSender<InMessage> = [\n { type: \"__ADVANCE__\" } as InMessage,\n { fromName: \"__internal__\", fromId: Symbol(\"__internal__\") } as SenderInfo,\n ];\n this._eatResult(this.current!.next(advance));\n });\n return this;\n }\n\n /** Wrap the user's generator so EXIT/STOP logic fires on completion. */\n private async *_watchExit(\n ctx: ProcessCtx<Args, State, InMessage, OutMessage>,\n arg0: Args,\n ): AsyncProcessGenerator<State, InMessage> {\n try {\n yield* this.pgenerator(ctx, arg0);\n } finally {\n this.toAllChildren({ type: \"STOP\" });\n // ctx.toParent stamps sender info into a WithSender tuple\n ctx.toParent({ type: \"EXIT\" } as unknown as OutMessage);\n }\n }\n\n // ---- fork -----------------------------------------------------------------\n\n fork<ChildArgs, ChildState, ChildIM extends Message, ChildOM extends Message>(\n fn: AsyncProcessFn<ChildArgs, ChildState, ChildIM, ChildOM>,\n pname: string,\n ): (\n args: ChildArgs,\n ) => AsyncProcess<ChildArgs, ChildState, ChildIM, ChildOM> {\n return (args: ChildArgs) => {\n const child = new AsyncProcess<ChildArgs, ChildState, ChildIM, ChildOM>(\n fn,\n pname,\n this.fromChild.bind(this) as unknown as ProcessMessageCb<\n WithSender<ChildOM>\n >,\n );\n this.children.push(\n child as unknown as AsyncProcess<unknown, unknown, Message, Message>,\n );\n child.start(args);\n return child;\n };\n }\n\n forkSync<\n ChildArgs,\n ChildState,\n ChildIM extends Message,\n ChildOM extends Message,\n >(\n fn: ProcessFn<ChildArgs, ChildState, ChildIM, ChildOM>,\n pname: string,\n ): (\n args: ChildArgs,\n ) => AsyncProcess<ChildArgs, ChildState, ChildIM, ChildOM> {\n return this.fork(asyncify(fn), pname);\n }\n\n // ---- message processing ---------------------------------------------------\n\n protected async _tick(): Promise<void> {\n if (!this.current || this._tickInProgress) return;\n\n this._tickInProgress = true;\n try {\n let msgAndSender: WithSender<InMessage> | undefined;\n let ret: IteratorResult<State | null, void> | null = null;\n while ((msgAndSender = this.buffer.shift()) !== undefined) {\n ret = await this._safeNext(msgAndSender);\n if (!ret || ret.done) break;\n }\n this.notify();\n this._eatResult(ret);\n } catch (e) {\n this._exitReject?.(e);\n this._exitReject = null;\n } finally {\n this._tickInProgress = false;\n }\n }\n\n /** Call `.next()` and redirect unhandled rejections. */\n private async _safeNext(\n msgAndSender: WithSender<InMessage>,\n ): Promise<IteratorResult<State | null, void> | null> {\n try {\n return await this.current!.next(msgAndSender);\n } catch (e) {\n this._exitReject?.(e);\n this._exitReject = null;\n return { done: true, value: undefined };\n }\n }\n\n private _eatResult(\n ret:\n | IteratorResult<State | null, void>\n | Promise<IteratorResult<State | null, void>>\n | null,\n ): void {\n if (!ret) return;\n Promise.resolve(ret).then((r) => {\n if (r.done) {\n this.exitWaiter.resolve();\n }\n });\n }\n\n /** Broadcast a message to all children. */\n toAllChildren(msg: Message): void {\n const stamp: SenderInfo = { fromName: this.pname, fromId: this.id };\n this.children.forEach((p) => p.send([msg, stamp] as WithSender<Message>));\n }\n\n /** Stamp and enqueue a message from a named sender (external API). */\n send(msg: InMessage, from: SenderInfo): void;\n /** Enqueue a pre-stamped message (internal: fromChild, toAllChildren). */\n send(msgAndSender: WithSender<InMessage>): void;\n send(msgOrTuple: InMessage | WithSender<InMessage>, from?: SenderInfo): void {\n if (from !== undefined) {\n this.buffer.push([msgOrTuple as InMessage, from]);\n } else {\n this.buffer.push(msgOrTuple as WithSender<InMessage>);\n }\n this._scheduleTick();\n }\n\n /**\n * Synchronously flush the buffer. For sync processes use {@link Process.tick};\n * for async processes this is **not guaranteed** to process everything\n * immediately if reducers contain `await`. Prefer `send()` + `await proc.wait()`.\n */\n tick(): void {\n this.nextTick?.flush();\n this.nextTick = null;\n }\n\n private _scheduleTick(): void {\n if (this._isPaused) return;\n\n this.nextTick?.cancel();\n this.nextTick = defer(() => {\n this.nextTick = null;\n void this._tick();\n });\n }\n\n // ---- subscribers ----------------------------------------------------------\n\n notify(): void {\n this.subscribers.forEach((f) => f());\n }\n\n get isListenedTo(): boolean {\n return this.subscribers.length > 0;\n }\n\n subscribe(f: NotifyFn): () => void {\n this.subscribers.push(f);\n return () => {\n const idx = this.subscribers.indexOf(f);\n if (idx < 0) return;\n this.subscribers.splice(idx, 1);\n };\n }\n\n // ---- pause / resume -------------------------------------------------------\n\n pause(): void {\n this.nextTick?.cancel();\n this.nextTick = null;\n this._isPaused = true;\n }\n\n resume(): void {\n this._isPaused = false;\n this._scheduleTick();\n }\n\n // ---- waiting --------------------------------------------------------------\n\n /**\n * Returns a promise that resolves when the generator completes, or\n * rejects if an unhandled error occurs during message processing.\n */\n wait(): Promise<void> {\n return new Promise<void>((resolve, reject) => {\n this._exitReject = reject;\n\n this.exitWaiter.promise.then(\n () => {\n this._exitReject = null;\n resolve();\n },\n (e) => {\n this._exitReject = null;\n reject(e);\n },\n );\n });\n }\n\n // ---- child messages -------------------------------------------------------\n\n /** Relays a child's message to this process. The message already carries\n * sender provenance (stamped by the child's `ctx.toParent` wrapper). */\n private fromChild(msgAndSender: WithSender<InMessage>): void {\n const [msg, sender] = msgAndSender;\n if (msg.type === \"EXIT\") {\n // sender.fromId === child's id (set by child's ctx.toParent wrapper)\n this.children = this.children.filter((p) => p.id !== sender.fromId);\n }\n this.send(msgAndSender);\n }\n}\n\n// ---- spawnAsync -------------------------------------------------------------\n\n/**\n * Spawn a new async process. Accepts both sync and async process\n * functions — sync ones are automatically wrapped with {@link asyncify}.\n */\nexport function spawnAsync<\n Args,\n State,\n InMessage extends Message = Message,\n OutMessage extends Message = ExitMessage,\n>(\n fn: AsyncProcessFn<Args, State, InMessage, OutMessage>,\n pname: string,\n toParent?: ProcessMessageCb<WithSender<OutMessage>>,\n): (args: Args) => AsyncProcess<Args, State, InMessage, OutMessage> {\n return (args: Args) => {\n const proc = new AsyncProcess<Args, State, InMessage, OutMessage>(\n fn,\n pname,\n toParent,\n );\n proc.start(args);\n return proc;\n };\n}\n","import { AsyncProcess } from \"./process.async.js\";\nimport { asyncify } from \"./adapters.js\";\nimport type { Message, WithSender, ExitMessage, ProcessFn } from \"./types.js\";\n\nexport type { Message, ProcessFn, ProcessCtx } from \"./types.js\";\nexport { runDispatch } from \"./util.js\";\n\n/** @deprecated Use {@link spawnAsync} instead. */\nexport function spawn<\n A,\n S,\n IM extends Message = Message,\n OM extends Message = ExitMessage,\n>(\n fn: ProcessFn<A, S, IM, OM>,\n pname: string,\n tp?: (m: WithSender<OM>) => void,\n): (a: A) => Process<A, S, IM, OM> {\n return (a: A) => new Process(fn, pname, tp).start(a) as Process<A, S, IM, OM>;\n}\n\n/** @deprecated Use {@link AsyncProcess} instead. Sync processes are\n * wrapped via asyncify internally; spawnAsync handles both. */\nclass Process<\n A,\n S,\n IM extends Message,\n OM extends Message,\n> extends AsyncProcess<A, S, IM, OM> {\n constructor(\n fn: ProcessFn<A, S, IM, OM>,\n pname: string,\n tp?: (m: WithSender<OM>) => void,\n ) {\n super(asyncify(fn), pname, tp);\n }\n\n start(a: A) {\n super.start(a);\n return this;\n }\n tick(): Promise<void> {\n return super._tick();\n }\n}\n\nexport { Process };\n","// ── defineActor — high-level actor wrapper ───────────────────────────────────\n//\n// Compiles a declarative config into an AsyncProcessFn. Built on top of\n// the existing runDispatchAsync / spawnAsync primitives.\n//\n// See docs/proposals/define-actor-proposal.md for the full design.\n\nimport { runDispatchAsync, spawnAsync } from \"./process.async.js\";\nimport type {\n SenderInfo,\n WithSender,\n AsyncProcessFn,\n Message,\n ExitMessage,\n ProcessCtx,\n} from \"./types.js\";\nimport type { AsyncProcess } from \"./process.async.js\";\nimport type {\n ActorDefinition,\n ActorConfig,\n ActorContext,\n MethodOptions,\n ActorMessages,\n HandlerOptions,\n HandlerFn,\n} from \"./actor-types.js\";\nimport { HookRegistry, stopPropagation, STOP_SENTINEL } from \"./hooks.js\";\nimport type { ActorPlugin, PluginTransform } from \"./hooks.js\";\nimport type { HookResult, OnMessageHook, OnEmitHook, OnChildExitHook, OnStartHook, OnStopRequestedHook, OnEndHook, OnErrorHook } from \"./hooks.js\";\n\n// ═══════════════════════════════════════════════════════════════════════════════\n// Implementation\n// ═══════════════════════════════════════════════════════════════════════════════\n\nexport function defineMessages<\n OutMsg extends Message = Message,\n>(): ActorMessages<OutMsg> {\n return undefined as unknown as ActorMessages<OutMsg>;\n}\n\nexport function defineActor<\n Args,\n InternalState,\n ExposedState,\n InMsg extends Message,\n OutMsg extends Message,\n Methods extends MethodOptions,\n Handlers extends HandlerOptions<InMsg>,\n>(\n config: ActorConfig<\n Args,\n InternalState,\n ExposedState,\n InMsg,\n OutMsg,\n Methods,\n Handlers\n >,\n): ActorDefinition<Args, ExposedState, InMsg, OutMsg, Handlers> {\n // ── internal helpers ──────────────────────────────────────────────\n\n /** Extract __resolvedPlugins from an async process function\n * (set by the parent's fork() for plugin inheritance). */\n const getResolvedPlugins = (f: unknown): ActorPlugin[] | undefined => {\n const withPlugins = f as { __resolvedPlugins?: ActorPlugin[] };\n return withPlugins.__resolvedPlugins;\n };\n\n /** Stash resolved plugins on a function for the child to read. */\n const stashPlugins = (f: unknown, plugs: ActorPlugin[]): void => {\n (f as { __resolvedPlugins?: ActorPlugin[] }).__resolvedPlugins = plugs;\n };\n\n // Internal generator receives WithSender<InMsg> so sender identity\n // is directly accessible in the dispatch loop with zero casts.\n const fn = async function* (\n ctx: ProcessCtx<Args, ExposedState, InMsg, OutMsg>,\n args: Args,\n ): AsyncGenerator<ExposedState | null, void, WithSender<InMsg>> {\n let done = false;\n let exitReason: unknown;\n let stopRequested = false;\n\n // Resolve internal state — literal or function of args.\n const rawState: InternalState =\n typeof config.initialState === \"function\"\n ? (\n config.initialState as (\n args: Args,\n ictx: typeof ctx,\n ) => InternalState\n )(args, ctx)\n : config.initialState;\n\n // Apply expose if provided, otherwise identity.\n const exposedState: ExposedState = config.expose\n ? config.expose(rawState)\n : (rawState as unknown as ExposedState);\n\n // ── hooks ──────────────────────────────────────────────────────────\n const _hooks = new HookRegistry<any, any, any>();\n\n // Build the actor context.\n const self: ActorContext<\n Args,\n InternalState,\n InMsg,\n OutMsg,\n Methods,\n Handlers\n > = {\n ...((config.methods || {}) as Methods),\n state: rawState,\n name: ctx.pname,\n id: ctx.id,\n emit(msg) {\n // Fire onEmit hooks before the actual emit.\n for (const fn of _hooks.onEmit) {\n try { fn(msg); } catch { /* ignore — errors bubble through onError */ }\n }\n ctx.toParent(msg);\n },\n agreeToStop() {\n exitReason = \"stopped\";\n done = true;\n },\n exit(reason) {\n exitReason = reason;\n done = true;\n },\n $child: {},\n // ── hook registration ─────────────────────────────────────\n onMessage: (fn: OnMessageHook<any>) => { _hooks.onMessage.push(fn); },\n onEmit: (fn: OnEmitHook<any>) => { _hooks.onEmit.push(fn); },\n onChildExit: (fn: OnChildExitHook) => { _hooks.onChildExit.push(fn); },\n onStopRequested: (fn: OnStopRequestedHook) => { _hooks.onStopRequested.push(fn); },\n onError: (fn: OnErrorHook) => { _hooks.onError.push(fn); },\n fork(childFn, name, childArgs) {\n // Unwrap ActorDefinition, derive name.\n const resolved = typeof childFn === \"function\" ? childFn : childFn.fn;\n const childDef: ActorDefinition<unknown, unknown, Message, Message, HandlerOptions<Message>> | null =\n typeof childFn === \"object\" ? childFn : null;\n const childName = name\n ?? childDef?.name\n ?? `child-${Object.keys(self.$child).length}`;\n\n // ── plugin inheritance ───────────────────────────────────────\n // Resolve parent's installed plugins.\n const parentPlugs: ActorPlugin[] = config.plugins\n ? (typeof config.plugins === \"function\" ? config.plugins([]) : config.plugins)\n : [];\n\n // Merge with child's raw config.\n const childRaw: ActorPlugin[] | PluginTransform | undefined = (childDef as { _pluginsRaw?: ActorPlugin[] | PluginTransform })?._pluginsRaw;\n let childPlugs: ActorPlugin[];\n if (!childRaw) {\n childPlugs = [...parentPlugs];\n } else if (Array.isArray(childRaw)) {\n childPlugs = [...childRaw];\n } else {\n childPlugs = childRaw(parentPlugs);\n }\n\n // Stash resolved list on the child's config before fork.\n stashPlugins(resolved, childPlugs);\n\n // Build tree-prefixed name: parent:child\n const treeName = `${ctx.pname}:${childName}`;\n const child = ctx.fork(resolved, treeName)(childArgs!);\n // Store under the resolved name for $child lookup and EXIT matching.\n self.$child[child.pname] = child as unknown as AsyncProcess<\n unknown,\n unknown,\n Message,\n Message\n >;\n return child;\n },\n ctx,\n };\n\n\n // ── wire hook registration + decorate onto ctx (for plugin install) ─\n const decorated = new Map<string, unknown>();\n const ctxAny = ctx as Record<string, unknown>;\n ctxAny.onMessage = (fn: OnMessageHook<InMsg>) => { _hooks.onMessage.push(fn); };\n ctxAny.onEmit = (fn: OnEmitHook<OutMsg>) => { _hooks.onEmit.push(fn); };\n ctxAny.onChildExit = (fn: OnChildExitHook) => { _hooks.onChildExit.push(fn); };\n ctxAny.onStart = (fn: OnStartHook<ExposedState>) => { _hooks.onStart.push(fn); };\n ctxAny.onStopRequested = (fn: OnStopRequestedHook) => { _hooks.onStopRequested.push(fn); };\n ctxAny.onError = (fn: OnErrorHook) => { _hooks.onError.push(fn); };\n ctxAny.onEnd = (fn: OnEndHook) => { _hooks.onEnd.push(fn); };\n ctxAny.decorate = (key: string, value: unknown) => {\n if (key in self) throw new Error(`decorate: key \"${key}\" conflicts with built-in`);\n if (decorated.has(key)) throw new Error(`decorate: key \"${key}\" already decorated`);\n decorated.set(key, value);\n };\n\n // ── install plugins ──────────────────────────────────────────────\n // On child actors, __resolvedPlugins is set by the parent's fork().\n // On root actors, use config.plugins directly.\n const resolvedPlugs = getResolvedPlugins(fn)\n ?? (config.plugins\n ? (typeof config.plugins === \"function\" ? config.plugins([]) : config.plugins)\n : []);\n\n for (const p of resolvedPlugs) {\n let _err: unknown = null;\n try {\n await p.install(ctx);\n } catch (e) {\n _err = e;\n }\n // Also catch sync throws from non-async install functions.\n if (_err) {\n console.error(`[${ctx.pname}] plugin \"${p.name}\" install failed:`, _err);\n }\n }\n\n // ── register config.hooks (after plugins, so plugins fire first) ─\n if (config.hooks) {\n const h = config.hooks;\n if (h.onStart) _hooks.onStart.push((state) => h.onStart!.call(self, state));\n if (h.onMessage) _hooks.onMessage.push((msg, sender) => h.onMessage!.call(self, msg, sender));\n if (h.onEmit) _hooks.onEmit.push((msg) => h.onEmit!.call(self, msg));\n if (h.onChildExit) _hooks.onChildExit.push((name) => h.onChildExit!.call(self, name));\n if (h.onStopRequested) _hooks.onStopRequested.push(() => h.onStopRequested!.call(self));\n if (h.onEnd) _hooks.onEnd.push((reason) => h.onEnd!.call(self, reason));\n if (h.onError) _hooks.onError.push((err) => h.onError!.call(self, err));\n }\n\n // ── merge decorated properties onto self ───────────────────────\n for (const [key, value] of decorated) {\n (self as Record<string, unknown>)[key] = value;\n }\n\n // Yield the exposed state — external consumers see this.\n yield exposedState;\n\n // Call onStart with args.\n if (config.onStart) {\n await config.onStart.call(self, args);\n }\n\n // Fire hooks.onStart after the actor's own onStart.\n for (const fn of _hooks.onStart) {\n try { await fn(exposedState); } catch (e) { /* error handled by onStart body */ }\n }\n\n // Dispatch loop..\n yield* runDispatchAsync<WithSender<InMsg | ExitMessage>>(\n ctx.pname,\n async (stamped) => {\n const [msg, sender] = stamped;\n\n // ── Built-in STOP handling ──────────────────────────────────\n if (msg.type === \"STOP\") {\n for (const fn of _hooks.onStopRequested) {\n try { await fn(); } catch {}\n }\n if (config.onStopRequested) {\n await config.onStopRequested.call(self);\n if (!done) {\n stopRequested = true;\n }\n } else {\n // Default: agree immediately.\n exitReason = \"stopped\";\n done = true;\n }\n return;\n }\n\n // ── Re-offer deferred STOP ──────────────────────────────────\n if (stopRequested && !done) {\n if (config.onStopRequested) {\n await config.onStopRequested.call(self);\n if (!done) {\n stopRequested = true;\n }\n }\n }\n\n // ── Built-in EXIT handling ──────────────────────────────────\n if (msg.type === \"EXIT\") {\n const childName = sender.fromName;\n\n if (childName && self.$child[childName]) {\n // Recognized child — consume EXIT here.\n delete self.$child[childName];\n }\n for (const fn of _hooks.onChildExit) {\n try { await fn(childName); } catch {}\n }\n if (config.onChildExit) {\n await config.onChildExit.call(self, childName, msg as ExitMessage);\n }\n // Unrecognized EXIT — fall through to handlers/onUnhandled.\n }\n\n // ── onMessage hooks ────────────────────────────────────────\n let hookStopped = false;\n if (msg.type !== \"STOP\" && msg.type !== \"EXIT\") {\n for (const fn of _hooks.onMessage) {\n try {\n const result: HookResult = await fn(msg, sender);\n if (result === STOP_SENTINEL) { hookStopped = true; break; }\n } catch (e) {\n // Error in hook: fire onError hooks, then continue.\n for (const errFn of _hooks.onError) {\n try { errFn(e); } catch {}\n }\n }\n }\n }\n\n // ── Named handlers ──────────────────────────────────────────\n if (msg.type !== \"STOP\" && !hookStopped) {\n const handler = config.handlers[\n msg.type as keyof Handlers\n ] as HandlerFn<InMsg>;\n if (handler) {\n try {\n await handler.call(self, msg as InMsg, sender);\n } catch (e) {\n for (const fn of _hooks.onError) {\n try { fn(e); } catch {}\n }\n throw e; // rethrow to trigger exit\n }\n } else if (config.onUnhandled) {\n try {\n await config.onUnhandled.call(self, msg as InMsg, sender);\n } catch (e) {\n for (const fn of _hooks.onError) {\n try { fn(e); } catch {}\n }\n throw e; // rethrow to trigger exit\n }\n }\n // No onUnhandled: silently drop.\n }\n\n if (done) return;\n },\n () => done,\n );\n\n // Fire hooks.onEnd before the actor's onEnd.\n for (const fn of _hooks.onEnd) {\n try { await fn(exitReason ?? \"done\"); } catch {}\n }\n\n // Call onEnd.\n if (config.onEnd) {\n await config.onEnd.call(self, exitReason ?? \"done\");\n }\n };\n\n return {\n fn: fn as AsyncProcessFn<Args, ExposedState, InMsg, OutMsg>,\n name: config.name,\n _pluginsRaw: config.plugins,\n config: config as unknown as ActorConfig<\n Args,\n InternalState,\n ExposedState,\n InMsg,\n OutMsg,\n {},\n Handlers\n >,\n spawn(args: Args) {\n return spawnAsync(\n fn as AsyncProcessFn<Args, ExposedState, InMsg, OutMsg>,\n config.name ?? \"actor\",\n )(args);\n },\n spawnAsChild(\n ctx: ProcessCtx<any, any, any, any>,\n args: Args,\n name?: string,\n ) {\n return ctx.fork(\n fn as AsyncProcessFn<Args, ExposedState, InMsg, OutMsg>,\n name ?? config.name ?? 'child',\n )(args);\n },\n };\n}\n","/**\n * Posipaki — Erlang-inspired lightweight actor processes built on\n * generator functions. Processes communicate via message-passing,\n * can fork children, and expose their state reactively.\n *\n * @module\n */\n\nimport { Process, spawn } from \"./process\";\nimport { runDispatch } from \"./util\";\nimport { AsyncProcess, spawnAsync, runDispatchAsync } from \"./process.async\";\nimport { asyncify } from \"./adapters\";\n\nexport { Process, spawn, runDispatch };\nexport { AsyncProcess, spawnAsync, runDispatchAsync, asyncify };\n\nexport type {\n Message,\n WithSender,\n WithoutSender,\n ExitMessage,\n StopMessage,\n ProcessFn,\n ProcessCtx,\n AsyncProcessFn,\n PipeState,\n SupervisorState,\n SenderOrigin,\n SenderInfo,\n} from \"./types\";\n\nexport { defineActor, defineMessages } from \"./define-actor.js\";\nexport type {\n ActorDefinition,\n ActorConfig,\n ActorContext,\n MethodOptions,\n HandlerOptions,\n HandlerFn,\n} from \"./actor-types.js\";\n\n// ── hooks ─────────────────────────────────────────────────────────────────\n\nexport { stopPropagation, HookRegistry } from \"./hooks.js\";\nexport type {\n HookResult,\n OnStartHook,\n OnMessageHook,\n OnEmitHook,\n OnChildExitHook,\n OnStopRequestedHook,\n OnEndHook,\n OnErrorHook,\n ActorPlugin,\n ActorDecorated,\n PluginTransform,\n} from \"./hooks.js\";\n"],"mappings":"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"}
|
package/dist/pipe.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { d as WithSender, n as ExitMessage, o as ProcessFn, p as AsyncProcess, r as Message } from "./types-
|
|
1
|
+
import { d as WithSender, n as ExitMessage, o as ProcessFn, p as AsyncProcess, r as Message } from "./types-DW-t7vov.js";
|
|
2
2
|
|
|
3
3
|
//#region src/util.d.ts
|
|
4
4
|
type ReducerClosure<M> = (msg: M) => void;
|
|
@@ -30,4 +30,4 @@ declare class Process<A, S, IM extends Message, OM extends Message> extends Asyn
|
|
|
30
30
|
}
|
|
31
31
|
//#endregion
|
|
32
32
|
export { spawn as n, runDispatch as r, Process as t };
|
|
33
|
-
//# sourceMappingURL=process-
|
|
33
|
+
//# sourceMappingURL=process-DSljemNS.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"process-
|
|
1
|
+
{"version":3,"file":"process-DSljemNS.d.ts","names":[],"sources":["../src/util.ts","../src/process.ts"],"mappings":";;;KAOK,cAAA,OAAqB,GAAA,EAAK,CAAC;AAAA,KAC3B,OAAA;;;;;;iBAQK,WAAA,IACR,IAAA,UACA,EAAA,EAAI,cAAA,CAAe,CAAA,GACnB,OAAA,GAAS,OAAA,EACT,UAAA,aACC,SAAA,aAAsB,CAAA;AAdO;AAAA;;;;AACpB;AACC;;;;;iBCDG,KAAA,kBAGH,OAAA,GAAU,OAAA,aACV,OAAA,GAAU,WAAA,EAErB,EAAA,EAAI,SAAA,CAAU,CAAA,EAAG,CAAA,EAAG,EAAA,EAAI,EAAA,GACxB,KAAA,UACA,EAAA,IAAM,CAAA,EAAG,UAAA,CAAW,EAAA,cAClB,CAAA,EAAG,CAAA,KAAM,OAAA,CAAQ,CAAA,EAAG,CAAA,EAAG,EAAA,EAAI,EAAA;;;cAMzB,OAAA,kBAGO,OAAA,aACA,OAAA,UACH,YAAA,CAAa,CAAA,EAAG,CAAA,EAAG,EAAA,EAAI,EAAA;cAE7B,EAAA,EAAI,SAAA,CAAU,CAAA,EAAG,CAAA,EAAG,EAAA,EAAI,EAAA,GACxB,KAAA,UACA,EAAA,IAAM,CAAA,EAAG,UAAA,CAAW,EAAA;EAKtB,KAAA,CAAM,CAAA,EAAG,CAAA;EAIT,IAAA,IAAQ,OAAA;AAAA"}
|
package/dist/supervisor.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { a as ProcessCtx, d as WithSender, n as ExitMessage, o as ProcessFn } from "./types-
|
|
2
|
-
import { t as Process } from "./process-
|
|
1
|
+
import { a as ProcessCtx, d as WithSender, n as ExitMessage, o as ProcessFn } from "./types-DW-t7vov.js";
|
|
2
|
+
import { t as Process } from "./process-DSljemNS.js";
|
|
3
3
|
|
|
4
4
|
//#region src/supervisor.d.ts
|
|
5
5
|
type SupMsg = ExitMessage | RunMsg | StopMsg | ErrorMsg | OkMsg;
|
|
@@ -46,8 +46,8 @@ declare class AsyncProcess<Args, State, InMessage extends Message, OutMessage ex
|
|
|
46
46
|
start(arg0: Args): this;
|
|
47
47
|
/** Wrap the user's generator so EXIT/STOP logic fires on completion. */
|
|
48
48
|
private _watchExit;
|
|
49
|
-
fork<ChildArgs, ChildState, ChildIM extends Message, ChildOM extends Message>(fn: AsyncProcessFn<ChildArgs, ChildState, ChildIM, ChildOM>, pname
|
|
50
|
-
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>;
|
|
51
51
|
protected _tick(): Promise<void>;
|
|
52
52
|
/** Call `.next()` and redirect unhandled rejections. */
|
|
53
53
|
private _safeNext;
|
|
@@ -130,7 +130,8 @@ type ProcessCtx<Args, State, IM extends Message, OM extends Message> = {
|
|
|
130
130
|
onStart?: (fn: (state: State) => void | Promise<void>) => void; /** Register an onStopRequested hook. */
|
|
131
131
|
onStopRequested?: (fn: () => void | Promise<void>) => void; /** Register an onError hook. */
|
|
132
132
|
onError?: (fn: (err: unknown) => void) => void; /** Register an onEnd hook. Fires before the process exits. */
|
|
133
|
-
onEnd?: (fn: (reason: unknown) => void | Promise<void>) => void;
|
|
133
|
+
onEnd?: (fn: (reason: unknown) => void | Promise<void>) => void; /** Register a decorated property. Throws if key conflicts. */
|
|
134
|
+
decorate?: (key: string, value: unknown) => void;
|
|
134
135
|
} & Pick<AsyncProcess<Args, State, IM, OM>, "fork" | "forkSync">;
|
|
135
136
|
/** State yielded by the pipe process. */
|
|
136
137
|
interface PipeState<Params, Result> {
|
|
@@ -145,4 +146,4 @@ interface SupervisorState {
|
|
|
145
146
|
}
|
|
146
147
|
//#endregion
|
|
147
148
|
export { ProcessCtx as a, SenderOrigin as c, WithSender as d, WithoutSender as f, spawnAsync as h, PipeState as i, StopMessage as l, runDispatchAsync as m, ExitMessage as n, ProcessFn as o, AsyncProcess as p, Message as r, SenderInfo as s, AsyncProcessFn as t, SupervisorState as u };
|
|
148
|
-
//# sourceMappingURL=types-
|
|
149
|
+
//# sourceMappingURL=types-DW-t7vov.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types-
|
|
1
|
+
{"version":3,"file":"types-DW-t7vov.d.ts","names":[],"sources":["../src/process.async.ts","../src/types.ts"],"mappings":"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"}
|
package/dist/xfetch.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { a as ProcessCtx, d as WithSender, n as ExitMessage } from "./types-
|
|
2
|
-
import { t as Process } from "./process-
|
|
1
|
+
import { a as ProcessCtx, d as WithSender, n as ExitMessage } from "./types-DW-t7vov.js";
|
|
2
|
+
import { t as Process } from "./process-DSljemNS.js";
|
|
3
3
|
|
|
4
4
|
//#region src/xfetch.d.ts
|
|
5
5
|
/** State of an in-flight or completed fetch. */
|
package/package.json
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
{
|
|
2
2
|
"type": "module",
|
|
3
3
|
"name": "posipaki",
|
|
4
|
-
"version": "0.
|
|
5
|
-
"main": "./
|
|
6
|
-
"types": "./
|
|
4
|
+
"version": "0.13.0",
|
|
5
|
+
"main": "./src/index.ts",
|
|
6
|
+
"types": "./src/index.ts",
|
|
7
7
|
"files": [
|
|
8
8
|
"dist"
|
|
9
9
|
],
|
|
@@ -22,12 +22,12 @@
|
|
|
22
22
|
},
|
|
23
23
|
"exports": {
|
|
24
24
|
".": {
|
|
25
|
-
"types": "./
|
|
26
|
-
"default": "./
|
|
25
|
+
"types": "./src/index.ts",
|
|
26
|
+
"default": "./src/index.ts"
|
|
27
27
|
},
|
|
28
28
|
"./xfetch": {
|
|
29
|
-
"types": "./
|
|
30
|
-
"default": "./
|
|
29
|
+
"types": "./src/xfetch.ts",
|
|
30
|
+
"default": "./src/xfetch.ts"
|
|
31
31
|
},
|
|
32
32
|
"./plugins/debug-logger": {
|
|
33
33
|
"types": "./dist/plugins/debug-logger.d.ts",
|
|
@@ -42,8 +42,8 @@
|
|
|
42
42
|
"default": "./dist/plugins/rbac.js"
|
|
43
43
|
},
|
|
44
44
|
"./hooks": {
|
|
45
|
-
"types": "./
|
|
46
|
-
"default": "./
|
|
45
|
+
"types": "./src/hooks.ts",
|
|
46
|
+
"default": "./src/hooks.ts"
|
|
47
47
|
}
|
|
48
48
|
}
|
|
49
49
|
}
|