posipaki 0.8.0 → 0.9.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/index.d.ts +34 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +84 -2
- package/dist/index.js.map +1 -1
- package/dist/pipe.d.ts +1 -1
- package/dist/{process-DF-plv-v.d.ts → process-n7WVg0pj.d.ts} +12 -3
- package/dist/process-n7WVg0pj.d.ts.map +1 -0
- package/dist/supervisor.d.ts +1 -1
- package/dist/util-Cw64MseZ.js.map +1 -1
- package/dist/xfetch.d.ts +5 -1
- package/dist/xfetch.d.ts.map +1 -1
- package/dist/xfetch.js +21 -3
- package/dist/xfetch.js.map +1 -1
- package/package.json +1 -1
- package/dist/process-DF-plv-v.d.ts.map +0 -1
package/dist/index.d.ts
CHANGED
|
@@ -1,7 +1,39 @@
|
|
|
1
|
-
import { a as runDispatchAsync, c as ExitMessage, d as ProcessCtx, f as ProcessFn, i as AsyncProcess, l as Message, n as spawn, o as spawnAsync, p as SupervisorState, r as runDispatch, s as AsyncProcessFn, t as Process, u as PipeState } from "./process-
|
|
1
|
+
import { a as runDispatchAsync, c as ExitMessage, d as ProcessCtx, f as ProcessFn, i as AsyncProcess, l as Message, n as spawn, o as spawnAsync, p as SupervisorState, r as runDispatch, s as AsyncProcessFn, t as Process, u as PipeState } from "./process-n7WVg0pj.js";
|
|
2
2
|
|
|
3
3
|
//#region src/adapters.d.ts
|
|
4
4
|
declare function asyncify<A, S, IM extends Message, OM extends Message>(fn: ProcessFn<A, S, IM, OM>): AsyncProcessFn<A, S, IM, OM>;
|
|
5
5
|
//#endregion
|
|
6
|
-
|
|
6
|
+
//#region src/actor-types.d.ts
|
|
7
|
+
interface ActorDefinition<Args, ExposedState, InMsg extends Message, OutMsg extends Message> {
|
|
8
|
+
fn: AsyncProcessFn<Args, ExposedState, InMsg, OutMsg>;
|
|
9
|
+
config: ActorConfig<Args, any, ExposedState, InMsg, OutMsg>;
|
|
10
|
+
}
|
|
11
|
+
interface ActorConfig<Args, InternalState, ExposedState, InMsg extends Message, OutMsg extends Message> {
|
|
12
|
+
initialState: InternalState | ((args: Args) => InternalState);
|
|
13
|
+
expose?: (internalState: InternalState) => ExposedState;
|
|
14
|
+
onStart?: (this: ActorContext<Args, InternalState, InMsg, OutMsg>, args: Args) => void | Promise<void>;
|
|
15
|
+
onStopRequested?: (this: ActorContext<Args, InternalState, InMsg, OutMsg>) => void | Promise<void>;
|
|
16
|
+
onEnd?: (this: ActorContext<Args, InternalState, InMsg, OutMsg>, reason?: unknown) => void | Promise<void>;
|
|
17
|
+
handlers: { [K in InMsg["type"]]?: (this: ActorContext<Args, InternalState, InMsg, OutMsg>, msg: Extract<InMsg, {
|
|
18
|
+
type: K;
|
|
19
|
+
}>) => void | Promise<void> };
|
|
20
|
+
onUnhandled?: (this: ActorContext<Args, InternalState, InMsg, OutMsg>, msg: InMsg) => void | Promise<void>;
|
|
21
|
+
onChildExit?: (this: ActorContext<Args, InternalState, InMsg, OutMsg>, name: string, reason: ExitMessage) => void | Promise<void>;
|
|
22
|
+
}
|
|
23
|
+
interface ActorContext<Args, InternalState, InMsg extends Message, OutMsg extends Message> {
|
|
24
|
+
state: InternalState;
|
|
25
|
+
name: string;
|
|
26
|
+
id: symbol;
|
|
27
|
+
emit: (msg: OutMsg) => void;
|
|
28
|
+
agreeToStop: () => void;
|
|
29
|
+
exit: (reason?: unknown) => void;
|
|
30
|
+
$child: Record<string, AsyncProcess<unknown, unknown, Message, Message>>;
|
|
31
|
+
fork<A, S, IM extends Message, OM extends Message>(fn: AsyncProcessFn<A, S, IM, OM> | ActorDefinition<A, S, IM, OM>, name: string, args?: A): AsyncProcess<A, S, IM, OM>;
|
|
32
|
+
ctx: ProcessCtx<Args, InternalState, InMsg, OutMsg>;
|
|
33
|
+
}
|
|
34
|
+
//#endregion
|
|
35
|
+
//#region src/define-actor.d.ts
|
|
36
|
+
declare function defineActor<Args, InternalState, ExposedState = InternalState, InMsg extends Message = Message, OutMsg extends Message = Message>(config: ActorConfig<Args, InternalState, ExposedState, InMsg, OutMsg>): ActorDefinition<Args, ExposedState, InMsg, OutMsg>;
|
|
37
|
+
//#endregion
|
|
38
|
+
export { type ActorConfig, type ActorContext, type ActorDefinition, AsyncProcess, type AsyncProcessFn, type ExitMessage, type Message, type PipeState, Process, type ProcessCtx, type ProcessFn, type SupervisorState, asyncify, defineActor, runDispatch, runDispatchAsync, spawn, spawnAsync };
|
|
7
39
|
//# 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"],"mappings":";;;iBAEgB,QAAA,kBAA0B,OAAA,aAAoB,OAAA,EAC5D,EAAA,EAAI,SAAA,CAAU,CAAA,EAAG,CAAA,EAAG,EAAA,EAAI,EAAA,IACvB,cAAA,CAAe,CAAA,EAAG,CAAA,EAAG,EAAA,EAAI,EAAA"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","names":[],"sources":["../src/adapters.ts","../src/actor-types.ts","../src/define-actor.ts"],"mappings":";;;iBAEgB,QAAA,kBAA0B,OAAA,aAAoB,OAAA,EAC5D,EAAA,EAAI,SAAA,CAAU,CAAA,EAAG,CAAA,EAAG,EAAA,EAAI,EAAA,IACvB,cAAA,CAAe,CAAA,EAAG,CAAA,EAAG,EAAA,EAAI,EAAA;;;UCKX,eAAA,mCAGD,OAAA,iBACC,OAAA;EAEf,EAAA,EAAI,cAAA,CAAe,IAAA,EAAM,YAAA,EAAc,KAAA,EAAO,MAAA;EAC9C,MAAA,EAAQ,WAAA,CAAY,IAAA,OAAW,YAAA,EAAc,KAAA,EAAO,MAAA;AAAA;AAAA,UAGrC,WAAA,kDAID,OAAA,iBACC,OAAA;EAEf,YAAA,EAAc,aAAA,KAAkB,IAAA,EAAM,IAAA,KAAS,aAAA;EAC/C,MAAA,IAAU,aAAA,EAAe,aAAA,KAAkB,YAAA;EAE3C,OAAA,IACE,IAAA,EAAM,YAAA,CAAa,IAAA,EAAM,aAAA,EAAe,KAAA,EAAO,MAAA,GAC/C,IAAA,EAAM,IAAA,YACI,OAAA;EAEZ,eAAA,IACE,IAAA,EAAM,YAAA,CAAa,IAAA,EAAM,aAAA,EAAe,KAAA,EAAO,MAAA,aACrC,OAAA;EAEZ,KAAA,IACE,IAAA,EAAM,YAAA,CAAa,IAAA,EAAM,aAAA,EAAe,KAAA,EAAO,MAAA,GAC/C,MAAA,sBACU,OAAA;EAEZ,QAAA,UACQ,KAAA,aACJ,IAAA,EAAM,YAAA,CAAa,IAAA,EAAM,aAAA,EAAe,KAAA,EAAO,MAAA,GAC/C,GAAA,EAAK,OAAA,CAAQ,KAAA;IAAS,IAAA,EAAM,CAAA;EAAA,cAClB,OAAA;EAGd,WAAA,IACE,IAAA,EAAM,YAAA,CAAa,IAAA,EAAM,aAAA,EAAe,KAAA,EAAO,MAAA,GAC/C,GAAA,EAAK,KAAA,YACK,OAAA;EAEZ,WAAA,IACE,IAAA,EAAM,YAAA,CAAa,IAAA,EAAM,aAAA,EAAe,KAAA,EAAO,MAAA,GAC/C,IAAA,UACA,MAAA,EAAQ,WAAA,YACE,OAAA;AAAA;AAAA,UAGG,YAAA,oCAGD,OAAA,iBACC,OAAA;EAEf,KAAA,EAAO,aAAA;EACP,IAAA;EACA,EAAA;EAEA,IAAA,GAAO,GAAA,EAAK,MAAA;EACZ,WAAA;EACA,IAAA,GAAO,MAAA;EAEP,MAAA,EAAQ,MAAA,SAAe,YAAA,mBAA+B,OAAA,EAAS,OAAA;EAE/D,IAAA,kBAAsB,OAAA,aAAoB,OAAA,EACxC,EAAA,EAAI,cAAA,CAAe,CAAA,EAAG,CAAA,EAAG,EAAA,EAAI,EAAA,IAAM,eAAA,CAAgB,CAAA,EAAG,CAAA,EAAG,EAAA,EAAI,EAAA,GAC7D,IAAA,UACA,IAAA,GAAO,CAAA,GACN,YAAA,CAAa,CAAA,EAAG,CAAA,EAAG,EAAA,EAAI,EAAA;EAE1B,GAAA,EAAK,UAAA,CAAW,IAAA,EAAM,aAAA,EAAe,KAAA,EAAO,MAAA;AAAA;;;iBChE9B,WAAA,qCAGC,aAAA,gBACD,OAAA,GAAU,OAAA,iBACT,OAAA,GAAU,OAAA,EAEzB,MAAA,EAAQ,WAAA,CAAY,IAAA,EAAM,aAAA,EAAe,YAAA,EAAc,KAAA,EAAO,MAAA,IAC7D,eAAA,CAAgB,IAAA,EAAM,YAAA,EAAc,KAAA,EAAO,MAAA"}
|
package/dist/index.js
CHANGED
|
@@ -59,6 +59,7 @@ var AsyncProcess = class AsyncProcess {
|
|
|
59
59
|
start(arg0) {
|
|
60
60
|
const ctx = {
|
|
61
61
|
pname: this.pname,
|
|
62
|
+
id: this.id,
|
|
62
63
|
fork: this.fork.bind(this),
|
|
63
64
|
forkSync: this.forkSync.bind(this),
|
|
64
65
|
send: this.send.bind(this),
|
|
@@ -84,7 +85,9 @@ var AsyncProcess = class AsyncProcess {
|
|
|
84
85
|
this.toAllChildren({ type: "STOP" });
|
|
85
86
|
this.toParent({
|
|
86
87
|
type: "EXIT",
|
|
87
|
-
pid: this.id
|
|
88
|
+
pid: this.id,
|
|
89
|
+
fromName: this.pname,
|
|
90
|
+
fromId: this.id
|
|
88
91
|
});
|
|
89
92
|
}
|
|
90
93
|
}
|
|
@@ -236,6 +239,85 @@ var Process = class extends AsyncProcess {
|
|
|
236
239
|
}
|
|
237
240
|
};
|
|
238
241
|
//#endregion
|
|
242
|
+
//#region src/define-actor.ts
|
|
243
|
+
function defineActor(config) {
|
|
244
|
+
const fn = async function* (ctx, args) {
|
|
245
|
+
let done = false;
|
|
246
|
+
let exitReason;
|
|
247
|
+
let stopRequested = false;
|
|
248
|
+
const rawState = typeof config.initialState === "function" ? config.initialState(args) : config.initialState;
|
|
249
|
+
const exposedState = config.expose ? config.expose(rawState) : rawState;
|
|
250
|
+
const self = {
|
|
251
|
+
state: rawState,
|
|
252
|
+
name: ctx.pname,
|
|
253
|
+
id: ctx.id,
|
|
254
|
+
emit(msg) {
|
|
255
|
+
ctx.toParent({
|
|
256
|
+
...msg,
|
|
257
|
+
fromName: ctx.pname,
|
|
258
|
+
fromId: ctx.id
|
|
259
|
+
});
|
|
260
|
+
},
|
|
261
|
+
agreeToStop() {
|
|
262
|
+
exitReason = "stopped";
|
|
263
|
+
done = true;
|
|
264
|
+
},
|
|
265
|
+
exit(reason) {
|
|
266
|
+
exitReason = reason;
|
|
267
|
+
done = true;
|
|
268
|
+
},
|
|
269
|
+
$child: {},
|
|
270
|
+
fork(childFn, name, childArgs) {
|
|
271
|
+
const resolved = typeof childFn === "function" ? childFn : childFn.fn;
|
|
272
|
+
const child = ctx.fork(resolved, name)(childArgs);
|
|
273
|
+
self.$child[name] = child;
|
|
274
|
+
return child;
|
|
275
|
+
},
|
|
276
|
+
ctx
|
|
277
|
+
};
|
|
278
|
+
yield exposedState;
|
|
279
|
+
if (config.onStart) await config.onStart.call(self, args);
|
|
280
|
+
yield* runDispatchAsync(ctx.pname, async (msg) => {
|
|
281
|
+
if (msg.type === "STOP") {
|
|
282
|
+
if (config.onStopRequested) {
|
|
283
|
+
await config.onStopRequested.call(self);
|
|
284
|
+
if (!done) stopRequested = true;
|
|
285
|
+
} else {
|
|
286
|
+
exitReason = "stopped";
|
|
287
|
+
done = true;
|
|
288
|
+
}
|
|
289
|
+
return;
|
|
290
|
+
}
|
|
291
|
+
if (stopRequested && !done) {
|
|
292
|
+
if (config.onStopRequested) {
|
|
293
|
+
await config.onStopRequested.call(self);
|
|
294
|
+
if (!done) stopRequested = true;
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
if (msg.type === "EXIT") {
|
|
298
|
+
const exitMsg = msg;
|
|
299
|
+
const childName = exitMsg.fromName;
|
|
300
|
+
if (childName && self.$child[childName]) {
|
|
301
|
+
delete self.$child[childName];
|
|
302
|
+
if (config.onChildExit) await config.onChildExit.call(self, childName, exitMsg);
|
|
303
|
+
return;
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
if (msg.type !== "STOP") {
|
|
307
|
+
const handler = config.handlers[msg.type];
|
|
308
|
+
if (handler) await handler.call(self, msg);
|
|
309
|
+
else if (config.onUnhandled) await config.onUnhandled.call(self, msg);
|
|
310
|
+
}
|
|
311
|
+
if (done) return;
|
|
312
|
+
}, () => done);
|
|
313
|
+
if (config.onEnd) await config.onEnd.call(self, exitReason ?? "done");
|
|
314
|
+
};
|
|
315
|
+
return {
|
|
316
|
+
fn,
|
|
317
|
+
config
|
|
318
|
+
};
|
|
319
|
+
}
|
|
320
|
+
//#endregion
|
|
239
321
|
//#region src/index.ts
|
|
240
322
|
/**
|
|
241
323
|
* Posipaki — Erlang-inspired lightweight actor processes built on
|
|
@@ -245,6 +327,6 @@ var Process = class extends AsyncProcess {
|
|
|
245
327
|
* @module
|
|
246
328
|
*/
|
|
247
329
|
//#endregion
|
|
248
|
-
export { AsyncProcess, Process, asyncify, runDispatch, runDispatchAsync, spawn, spawnAsync };
|
|
330
|
+
export { AsyncProcess, Process, asyncify, defineActor, runDispatch, runDispatchAsync, spawn, spawnAsync };
|
|
249
331
|
|
|
250
332
|
//# 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/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 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. */\ntype AsyncProcessGenerator<ProcessState, InMessage> = AsyncGenerator<\n ProcessState | null,\n void,\n InMessage\n>;\n\ntype NotifyFn = () => void;\n\n// ---- runDispatchAsync -------------------------------------------------------\n\ntype AsyncReducer<M> = (msg: M) => Promise<void>;\ntype ReadyFn = () => boolean;\n\n/**\n * Async equivalent of `runDispatch`. Loops, yielding `null` and feeding\n * each incoming message to an `async` reducer. Exits when `readyFn()`\n * returns true.\n */\nexport async function* runDispatchAsync<M>(\n name: string,\n fn: AsyncReducer<M>,\n readyFn: ReadyFn = () => false,\n debugLevel = false,\n): AsyncGenerator<null, void, M> {\n let msg: M;\n while (!readyFn()) {\n msg = yield null;\n debugLog(debugLevel, \"msg\", name, \" <- \", msg);\n await fn(msg);\n }\n}\n\n// ---- AsyncProcess -----------------------------------------------------------\n\ntype ProcessMessageCb<M> = (msg: M) => void;\n\nconst noop = () => null;\n\n/**\n * A process driven by an async generator. Functionally identical to\n * {@link Process} but supports `await` inside reducers.\n *\n * Messages are processed **one at a time** — if a tick is already\n * in-flight, new messages are buffered and processed when the current\n * tick completes.\n */\nexport class AsyncProcess<\n Args,\n State,\n InMessage extends Message,\n OutMessage extends Message,\n> {\n pgenerator: AsyncProcessFn<Args, State, InMessage, OutMessage>;\n pname: string;\n toParent: ProcessMessageCb<OutMessage>;\n id: symbol;\n state: State | null;\n\n private current: AsyncProcessGenerator<State, InMessage> | null = null;\n private buffer: Array<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<OutMessage> | undefined,\n ) {\n this.pgenerator = fn;\n this.pname = pname;\n this.toParent = toParent || (noop as ProcessMessageCb<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 ctx: ProcessCtx<Args, State, InMessage, OutMessage> = {\n pname: this.pname,\n fork: this.fork.bind(this),\n forkSync: this.forkSync.bind(this),\n send: this.send.bind(this),\n toParent: this.toParent,\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. The second .next() sends no\n // message — it just consumes the _watchExit wrapper's own\n // yield, not the user's generator.\n this._eatResult(this.current!.next({ type: \"__ADVANCE__\" } as any));\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\" } as Message);\n this.toParent({\n type: \"EXIT\",\n pid: this.id,\n } 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<ChildOM>,\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 msg: InMessage | undefined;\n let ret: IteratorResult<State | null, void> | null = null;\n while ((msg = this.buffer.shift()) !== undefined) {\n ret = await this._safeNext(msg);\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 msg: InMessage,\n ): Promise<IteratorResult<State | null, void> | null> {\n try {\n return await this.current!.next(msg);\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 this.children.forEach((p) => p.send(msg));\n }\n\n /** Enqueue a message. Processing is async (microtask). */\n send(msg: InMessage): void {\n this.buffer.push(msg);\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 private fromChild(msg: InMessage): void {\n if (msg.type === \"EXIT\") {\n this.children = this.children.filter(\n (p) => p.id !== (msg as unknown as ExitMessage).pid,\n );\n }\n this.send(msg);\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<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, ExitMessage, ProcessFn } from \"./types.js\";\n\nexport type { Message, ProcessFn, ProcessCtx } from \"./types.js\";\nexport { runDispatch } from \"./util.js\";\n\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: 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\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: 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","/**\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, ExitMessage, ProcessFn, ProcessCtx,\n AsyncProcessFn, PipeState, SupervisorState,\n} from \"./types\"\n"],"mappings":"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"}
|
|
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 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. */\ntype AsyncProcessGenerator<ProcessState, InMessage> = AsyncGenerator<\n ProcessState | null,\n void,\n InMessage\n>;\n\ntype NotifyFn = () => void;\n\n// ---- runDispatchAsync -------------------------------------------------------\n\ntype AsyncReducer<M> = (msg: M) => Promise<void>;\ntype ReadyFn = () => boolean;\n\n/**\n * Async equivalent of `runDispatch`. Loops, yielding `null` and feeding\n * each incoming message to an `async` reducer. Exits when `readyFn()`\n * returns true.\n */\nexport async function* runDispatchAsync<M>(\n name: string,\n fn: AsyncReducer<M>,\n readyFn: ReadyFn = () => false,\n debugLevel = false,\n): AsyncGenerator<null, void, M> {\n let msg: M;\n while (!readyFn()) {\n msg = yield null;\n debugLog(debugLevel, \"msg\", name, \" <- \", msg);\n await fn(msg);\n }\n}\n\n// ---- AsyncProcess -----------------------------------------------------------\n\ntype ProcessMessageCb<M> = (msg: M) => void;\n\nconst noop = () => null;\n\n/**\n * A process driven by an async generator. Functionally identical to\n * {@link Process} but supports `await` inside reducers.\n *\n * Messages are processed **one at a time** — if a tick is already\n * in-flight, new messages are buffered and processed when the current\n * tick completes.\n */\nexport class AsyncProcess<\n Args,\n State,\n InMessage extends Message,\n OutMessage extends Message,\n> {\n pgenerator: AsyncProcessFn<Args, State, InMessage, OutMessage>;\n pname: string;\n toParent: ProcessMessageCb<OutMessage>;\n id: symbol;\n state: State | null;\n\n private current: AsyncProcessGenerator<State, InMessage> | null = null;\n private buffer: Array<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<OutMessage> | undefined,\n ) {\n this.pgenerator = fn;\n this.pname = pname;\n this.toParent = toParent || (noop as ProcessMessageCb<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 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 send: this.send.bind(this),\n toParent: this.toParent,\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. The second .next() sends no\n // message — it just consumes the _watchExit wrapper's own\n // yield, not the user's generator.\n this._eatResult(this.current!.next({ type: \"__ADVANCE__\" } as any));\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\" } as Message);\n this.toParent({\n type: \"EXIT\",\n pid: this.id,\n fromName: this.pname,\n fromId: this.id,\n } 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<ChildOM>,\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 msg: InMessage | undefined;\n let ret: IteratorResult<State | null, void> | null = null;\n while ((msg = this.buffer.shift()) !== undefined) {\n ret = await this._safeNext(msg);\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 msg: InMessage,\n ): Promise<IteratorResult<State | null, void> | null> {\n try {\n return await this.current!.next(msg);\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 this.children.forEach((p) => p.send(msg));\n }\n\n /** Enqueue a message. Processing is async (microtask). */\n send(msg: InMessage): void {\n this.buffer.push(msg);\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 private fromChild(msg: InMessage): void {\n if (msg.type === \"EXIT\") {\n this.children = this.children.filter(\n (p) => p.id !== (msg as unknown as ExitMessage).pid,\n );\n }\n this.send(msg);\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<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, ExitMessage, ProcessFn } from \"./types.js\";\n\nexport type { Message, ProcessFn, ProcessCtx } from \"./types.js\";\nexport { runDispatch } from \"./util.js\";\n\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: 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\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: 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 } from \"./process.async.js\";\nimport type { AsyncProcessFn, Message, ProcessCtx, ExitMessage } from \"./types.js\";\nimport type { AsyncProcess } from \"./process.async.js\";\nimport type {\n ActorDefinition,\n ActorConfig,\n ActorContext,\n} from \"./actor-types.js\";\n\n// ═══════════════════════════════════════════════════════════════════════════════\n// Implementation\n// ═══════════════════════════════════════════════════════════════════════════════\n\nexport function defineActor<\n Args,\n InternalState,\n ExposedState = InternalState,\n InMsg extends Message = Message,\n OutMsg extends Message = Message,\n>(\n config: ActorConfig<Args, InternalState, ExposedState, InMsg, OutMsg>,\n): ActorDefinition<Args, ExposedState, InMsg, OutMsg> {\n\n const fn: AsyncProcessFn<Args, ExposedState, InMsg, OutMsg> =\n async function* (ctx, args) {\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 = typeof config.initialState === \"function\"\n ? (config.initialState as (args: Args) => InternalState)(args)\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<Args, InternalState, InMsg, OutMsg> = {\n state: rawState,\n name: ctx.pname,\n id: ctx.id,\n emit(msg) {\n ctx.toParent({\n ...msg,\n fromName: ctx.pname,\n fromId: ctx.id,\n } as OutMsg);\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<unknown, unknown, Message, Message>;\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(\n ctx.pname,\n async (msg: InMsg) => {\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 exitMsg = msg as unknown as ExitMessage;\n const childName = exitMsg.fromName;\n\n if (childName && self.$child[childName]) {\n // Recognized child — consume EXIT here.\n delete self.$child[childName];\n if (config.onChildExit) {\n await config.onChildExit.call(self, childName, exitMsg);\n }\n return;\n }\n // Unrecognized EXIT — fall through to handlers/onUnhandled.\n }\n\n // ── Named handlers ──────────────────────────────────────────\n if (msg.type !== \"STOP\") {\n const handler = (config.handlers as Record<string, ((msg: InMsg) => void | Promise<void>) | undefined>)[msg.type];\n if (handler) {\n await handler.call(self, msg);\n } else if (config.onUnhandled) {\n await config.onUnhandled.call(self, msg);\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,\n config,\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, ExitMessage, ProcessFn, ProcessCtx,\n AsyncProcessFn, PipeState, SupervisorState,\n} from \"./types\"\n\nexport { defineActor } from \"./define-actor.js\"\nexport type { ActorDefinition, ActorConfig, ActorContext } from \"./actor-types.js\"\n"],"mappings":";;AAEA,SAAgB,SACd,IAC8B;CAC9B,OAAO,iBAAiB,KAAK,MAAM;EACjC,OAAO,GAAG,KAAK,IAAI;CACrB;AACF;;;;;;;;ACyBA,gBAAuB,iBACrB,MACA,IACA,gBAAyB,OACzB,aAAa,OACkB;CAC/B,IAAI;CACJ,OAAO,CAAC,QAAQ,GAAG;EACjB,MAAM,MAAM;EACZ,SAAS,YAAY,OAAO,MAAM,QAAQ,GAAG;EAC7C,MAAM,GAAG,GAAG;CACd;AACF;AAMA,MAAM,aAAa;;;;;;;;;AAUnB,IAAa,eAAb,MAAa,aAKX;CAoBA,YACE,IACA,OACA,UACA;iBAjBgE;gBAC/B,CAAC;kBACI;kBAEtC,CAAC;qBACoC,CAAC;mBAEX;yBACM;qBACkB;EASnD,KAAK,aAAa;EAClB,KAAK,QAAQ;EACb,KAAK,WAAW,YAAa;EAC7B,KAAK,KAAK,OAAO,KAAK;EACtB,KAAK,QAAQ;EACb,KAAK,aAAa,WAAW;EAC7B,KAAK,SAAS,WAAW;EACzB,KAAK,gBAAgB,KAAK,OAAO;CACnC;;CAGA,QAAuB;EACrB,OAAO,KAAK,OAAO;CACrB;;;;;CAQA,MAAM,MAAY;EAChB,MAAM,MAAsD;GAC1D,OAAO,KAAK;GACV,IAAI,KAAK;GACX,MAAM,KAAK,KAAK,KAAK,IAAI;GACzB,UAAU,KAAK,SAAS,KAAK,IAAI;GACjC,MAAM,KAAK,KAAK,KAAK,IAAI;GACzB,UAAU,KAAK;EACjB;EAEA,KAAK,UAAU,KAAK,WAAW,KAAK,IAAI;EACxC,KAAU,QAAQ,KAAK,EAAE,MAAM,QAA4C;GACzE,KAAK,QAAQ,IAAI,SAAS;GAC1B,KAAK,cAAc;GACnB,IAAI,IAAI,MAAM;IACZ,KAAK,WAAW,QAAQ;IACxB;GACF;GAMA,KAAK,WAAW,KAAK,QAAS,KAAK,EAAE,MAAM,cAAc,CAAQ,CAAC;EACpE,CAAC;EACD,OAAO;CACT;;CAGA,OAAe,WACb,KACA,MACyC;EACzC,IAAI;GACF,OAAO,KAAK,WAAW,KAAK,IAAI;EAClC,UAAU;GACR,KAAK,cAAc,EAAE,MAAM,OAAO,CAAY;GAC9C,KAAK,SAAS;IACZ,MAAM;IACN,KAAK,KAAK;IACV,UAAU,KAAK;IACf,QAAQ,KAAK;GACf,CAA0B;EAC5B;CACF;CAIA,KACE,IACA,OAGyD;EACzD,QAAQ,SAAoB;GAC1B,MAAM,QAAQ,IAAI,aAChB,IACA,OACA,KAAK,UAAU,KAAK,IAAI,CAC1B;GACA,KAAK,SAAS,KACZ,KACF;GACA,MAAM,MAAM,IAAI;GAChB,OAAO;EACT;CACF;CAEA,SAME,IACA,OAGyD;EACzD,OAAO,KAAK,KAAK,SAAS,EAAE,GAAG,KAAK;CACtC;CAIA,MAAgB,QAAuB;EACrC,IAAI,CAAC,KAAK,WAAW,KAAK,iBAAiB;EAE3C,KAAK,kBAAkB;EACvB,IAAI;GACF,IAAI;GACJ,IAAI,MAAiD;GACrD,QAAQ,MAAM,KAAK,OAAO,MAAM,OAAO,KAAA,GAAW;IAChD,MAAM,MAAM,KAAK,UAAU,GAAG;IAC9B,IAAI,CAAC,OAAO,IAAI,MAAM;GACxB;GACA,KAAK,OAAO;GACZ,KAAK,WAAW,GAAG;EACrB,SAAS,GAAG;GACV,KAAK,cAAc,CAAC;GACpB,KAAK,cAAc;EACrB,UAAU;GACR,KAAK,kBAAkB;EACzB;CACF;;CAGA,MAAc,UACZ,KACoD;EACpD,IAAI;GACF,OAAO,MAAM,KAAK,QAAS,KAAK,GAAG;EACrC,SAAS,GAAG;GACV,KAAK,cAAc,CAAC;GACpB,KAAK,cAAc;GACnB,OAAO;IAAE,MAAM;IAAM,OAAO,KAAA;GAAU;EACxC;CACF;CAEA,WACE,KAIM;EACN,IAAI,CAAC,KAAK;EACV,QAAQ,QAAQ,GAAG,EAAE,MAAM,MAAM;GAC/B,IAAI,EAAE,MACJ,KAAK,WAAW,QAAQ;EAE5B,CAAC;CACH;;CAGA,cAAc,KAAoB;EAChC,KAAK,SAAS,SAAS,MAAM,EAAE,KAAK,GAAG,CAAC;CAC1C;;CAGA,KAAK,KAAsB;EACzB,KAAK,OAAO,KAAK,GAAG;EACpB,KAAK,cAAc;CACrB;;;;;;CAOA,OAAa;EACX,KAAK,UAAU,MAAM;EACrB,KAAK,WAAW;CAClB;CAEA,gBAA8B;EAC5B,IAAI,KAAK,WAAW;EAEpB,KAAK,UAAU,OAAO;EACtB,KAAK,WAAW,YAAY;GAC1B,KAAK,WAAW;GAChB,KAAU,MAAM;EAClB,CAAC;CACH;CAIA,SAAe;EACb,KAAK,YAAY,SAAS,MAAM,EAAE,CAAC;CACrC;CAEA,IAAI,eAAwB;EAC1B,OAAO,KAAK,YAAY,SAAS;CACnC;CAEA,UAAU,GAAyB;EACjC,KAAK,YAAY,KAAK,CAAC;EACvB,aAAa;GACX,MAAM,MAAM,KAAK,YAAY,QAAQ,CAAC;GACtC,IAAI,MAAM,GAAG;GACb,KAAK,YAAY,OAAO,KAAK,CAAC;EAChC;CACF;CAIA,QAAc;EACZ,KAAK,UAAU,OAAO;EACtB,KAAK,WAAW;EAChB,KAAK,YAAY;CACnB;CAEA,SAAe;EACb,KAAK,YAAY;EACjB,KAAK,cAAc;CACrB;;;;;CAQA,OAAsB;EACpB,OAAO,IAAI,SAAe,SAAS,WAAW;GAC5C,KAAK,cAAc;GAEnB,KAAK,WAAW,QAAQ,WAChB;IACJ,KAAK,cAAc;IACnB,QAAQ;GACV,IACC,MAAM;IACL,KAAK,cAAc;IACnB,OAAO,CAAC;GACV,CACF;EACF,CAAC;CACH;CAIA,UAAkB,KAAsB;EACtC,IAAI,IAAI,SAAS,QACf,KAAK,WAAW,KAAK,SAAS,QAC3B,MAAM,EAAE,OAAQ,IAA+B,GAClD;EAEF,KAAK,KAAK,GAAG;CACf;AACF;;;;;AAQA,SAAgB,WAMd,IACA,OACA,UACkE;CAClE,QAAQ,SAAe;EACrB,MAAM,OAAO,IAAI,aACf,IACA,OACA,QACF;EACA,KAAK,MAAM,IAAI;EACf,OAAO;CACT;AACF;;;ACxWA,SAAgB,MAMd,IACA,OACA,IACiC;CACjC,QAAQ,MAAS,IAAI,QAAQ,IAAI,OAAO,EAAE,EAAE,MAAM,CAAC;AACrD;AAEA,IAAM,UAAN,cAKU,aAA2B;CACnC,YACE,IACA,OACA,IACA;EACA,MAAM,SAAS,EAAE,GAAG,OAAO,EAAE;CAC/B;CAEA,MAAM,GAAM;EACV,MAAM,MAAM,CAAC;EACb,OAAO;CACT;CACA,OAAsB;EACpB,OAAO,MAAM,MAAM;CACrB;AACF;;;ACrBA,SAAgB,YAOd,QACoD;CAEpD,MAAM,KACJ,iBAAiB,KAAK,MAAM;EAC1B,IAAI,OAAO;EACX,IAAI;EACJ,IAAI,gBAAgB;EAGpB,MAAM,WAA0B,OAAO,OAAO,iBAAiB,aAC1D,OAAO,aAA+C,IAAI,IAC3D,OAAO;EAGX,MAAM,eAA6B,OAAO,SACtC,OAAO,OAAO,QAAQ,IACtB;EAGJ,MAAM,OAAyD;GAC7D,OAAO;GACP,MAAM,IAAI;GACV,IAAI,IAAI;GACR,KAAK,KAAK;IACR,IAAI,SAAS;KACX,GAAG;KACH,UAAU,IAAI;KACd,QAAQ,IAAI;IACd,CAAW;GACb;GACA,cAAc;IACZ,aAAa;IACb,OAAO;GACT;GACA,KAAK,QAAQ;IACX,aAAa;IACb,OAAO;GACT;GACA,QAAQ,CAAC;GACT,KAAK,SAAS,MAAM,WAAW;IAE7B,MAAM,WAAW,OAAO,YAAY,aAAa,UAAU,QAAQ;IACnE,MAAM,QAAQ,IAAI,KAAK,UAAU,IAAI,EAAE,SAAU;IACjD,KAAK,OAAO,QAAQ;IACpB,OAAO;GACT;GACA;EACF;EAGA,MAAM;EAGN,IAAI,OAAO,SACT,MAAM,OAAO,QAAQ,KAAK,MAAM,IAAI;EAItC,OAAO,iBACL,IAAI,OACJ,OAAO,QAAe;GAEpB,IAAI,IAAI,SAAS,QAAQ;IACvB,IAAI,OAAO,iBAAiB;KAC1B,MAAM,OAAO,gBAAgB,KAAK,IAAI;KACtC,IAAI,CAAC,MACH,gBAAgB;IAEpB,OAAO;KAEL,aAAa;KACb,OAAO;IACT;IACA;GACF;GAGA,IAAI,iBAAiB,CAAC;QAChB,OAAO,iBAAiB;KAC1B,MAAM,OAAO,gBAAgB,KAAK,IAAI;KACtC,IAAI,CAAC,MACH,gBAAgB;IAEpB;;GAIF,IAAI,IAAI,SAAS,QAAQ;IACvB,MAAM,UAAU;IAChB,MAAM,YAAY,QAAQ;IAE1B,IAAI,aAAa,KAAK,OAAO,YAAY;KAEvC,OAAO,KAAK,OAAO;KACnB,IAAI,OAAO,aACT,MAAM,OAAO,YAAY,KAAK,MAAM,WAAW,OAAO;KAExD;IACF;GAEF;GAGA,IAAI,IAAI,SAAS,QAAQ;IACvB,MAAM,UAAW,OAAO,SAAgF,IAAI;IAC5G,IAAI,SACF,MAAM,QAAQ,KAAK,MAAM,GAAG;SACvB,IAAI,OAAO,aAChB,MAAM,OAAO,YAAY,KAAK,MAAM,GAAG;GAG3C;GAEA,IAAI,MAAM;EACZ,SACM,IACR;EAGA,IAAI,OAAO,OACT,MAAM,OAAO,MAAM,KAAK,MAAM,cAAc,MAAM;CAEtD;CAEF,OAAO;EACL;EACA;CACF;AACF"}
|
package/dist/pipe.d.ts
CHANGED
|
@@ -4,10 +4,18 @@
|
|
|
4
4
|
interface Message {
|
|
5
5
|
type: string;
|
|
6
6
|
}
|
|
7
|
-
/** Message emitted by a process to its parent when it terminates.
|
|
7
|
+
/** Message emitted by a process to its parent when it terminates.
|
|
8
|
+
*
|
|
9
|
+
* `fromId` and `pid` carry the same symbol value. `fromName` is the
|
|
10
|
+
* process name (same as `ctx.pname`). These fields mirror what
|
|
11
|
+
* `this.emit()` / `ctx.toParent()` stamp on normal messages, so
|
|
12
|
+
* callers can identify the sender of any child message — application
|
|
13
|
+
* or EXIT — by reading `msg.fromName` or `msg.fromId`. */
|
|
8
14
|
type ExitMessage = {
|
|
9
|
-
type: "EXIT";
|
|
15
|
+
type: "EXIT"; /** @deprecated Use {@link fromId} instead. */
|
|
10
16
|
pid: symbol;
|
|
17
|
+
fromName: string;
|
|
18
|
+
fromId: symbol;
|
|
11
19
|
};
|
|
12
20
|
type ProcessFn<Args, State, InMessage extends Message, OutMessage extends Message> = (ctx: ProcessCtx<Args, State, InMessage, OutMessage>, args: Args) => Generator<State | null, void, InMessage>;
|
|
13
21
|
type AsyncProcessFn<Args, State, InMessage extends Message, OutMessage extends Message> = (ctx: ProcessCtx<Args, State, InMessage, OutMessage>, args: Args) => AsyncGenerator<State | null, void, InMessage>;
|
|
@@ -17,6 +25,7 @@ type ProcessMessageCb$1<M> = (msg: M) => void;
|
|
|
17
25
|
/** Context injected into every running process. */
|
|
18
26
|
type ProcessCtx<Args, State, IM extends Message, OM extends Message> = {
|
|
19
27
|
pname: string;
|
|
28
|
+
id: symbol;
|
|
20
29
|
send: (msg: IM) => void;
|
|
21
30
|
toParent: ProcessMessageCb$1<OM>;
|
|
22
31
|
} & Pick<AsyncProcess<Args, State, IM, OM>, "fork" | "forkSync">;
|
|
@@ -138,4 +147,4 @@ declare class Process<A, S, IM extends Message, OM extends Message> extends Asyn
|
|
|
138
147
|
}
|
|
139
148
|
//#endregion
|
|
140
149
|
export { runDispatchAsync as a, ExitMessage as c, ProcessCtx as d, ProcessFn as f, AsyncProcess as i, Message as l, spawn as n, spawnAsync as o, SupervisorState as p, runDispatch as r, AsyncProcessFn as s, Process as t, PipeState as u };
|
|
141
|
-
//# sourceMappingURL=process-
|
|
150
|
+
//# sourceMappingURL=process-n7WVg0pj.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"process-n7WVg0pj.d.ts","names":[],"sources":["../src/types.ts","../src/process.async.ts","../src/util.ts","../src/process.ts"],"mappings":"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"}
|
package/dist/supervisor.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { c as ExitMessage, d as ProcessCtx, f as ProcessFn, t as Process } from "./process-
|
|
1
|
+
import { c as ExitMessage, d as ProcessCtx, f as ProcessFn, t as Process } from "./process-n7WVg0pj.js";
|
|
2
2
|
|
|
3
3
|
//#region src/supervisor.d.ts
|
|
4
4
|
type SupMsg = ExitMessage | RunMsg | StopMsg | ErrorMsg | OkMsg;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"util-Cw64MseZ.js","names":[],"sources":["../src/util.ts"],"sourcesContent":["import type { ExitMessage } from \"./types.js\";\nexport function debugLog(level: boolean, ...args: Array<unknown>) {\n if (level) {\n console.log(...args);\n }\n}\n\ntype ReducerClosure<M> = (msg: M) => void;\ntype ReadyFn = () => boolean;\ntype NotifyFn = () => void;\n\n/**\n * Generator helper that loops, yielding `null` and feeding incoming\n * messages to `fn` until `readyFn()` returns true. Used inside\n * process generators to build the main message loop.\n */\nfunction* runDispatch<M>(\n name: string,\n fn: ReducerClosure<M>,\n readyFn: ReadyFn = () => false,\n debugLevel = false,\n): Generator<null, void, M> {\n let msg: M;\n while (!readyFn()) {\n msg = yield null;\n debugLog(debugLevel, \"msg\", name, \" <- \", msg);\n fn(msg);\n }\n}\n\n/**\n * Wrap a process generator so that on completion it sends STOP to\n * all children and EXIT to the parent. Useful for custom process\n * wrappers that need lifecycle management without extending\n * AsyncProcess.\n */\nfunction watchExit<\n A,\n S,\n IM extends { type: string },\n OM extends { type: string } | ExitMessage,\n>(\n proc: {\n toAllChildren: (m: { type: string }) => void;\n toParent: (m: OM) => void;\n id: symbol;\n },\n gen: (ctx: any, args: A) => Generator<S | null, void, IM>,\n): (ctx: any, args: A) => Generator<S | null, void, IM> {\n return function* (ctx, args) {\n try {\n yield* gen(ctx, args);\n } finally {\n proc.toAllChildren({ type: \"STOP\" });\n proc.toParent({
|
|
1
|
+
{"version":3,"file":"util-Cw64MseZ.js","names":[],"sources":["../src/util.ts"],"sourcesContent":["import type { ExitMessage } from \"./types.js\";\nexport function debugLog(level: boolean, ...args: Array<unknown>) {\n if (level) {\n console.log(...args);\n }\n}\n\ntype ReducerClosure<M> = (msg: M) => void;\ntype ReadyFn = () => boolean;\ntype NotifyFn = () => void;\n\n/**\n * Generator helper that loops, yielding `null` and feeding incoming\n * messages to `fn` until `readyFn()` returns true. Used inside\n * process generators to build the main message loop.\n */\nfunction* runDispatch<M>(\n name: string,\n fn: ReducerClosure<M>,\n readyFn: ReadyFn = () => false,\n debugLevel = false,\n): Generator<null, void, M> {\n let msg: M;\n while (!readyFn()) {\n msg = yield null;\n debugLog(debugLevel, \"msg\", name, \" <- \", msg);\n fn(msg);\n }\n}\n\n/**\n * Wrap a process generator so that on completion it sends STOP to\n * all children and EXIT to the parent. Useful for custom process\n * wrappers that need lifecycle management without extending\n * AsyncProcess.\n */\nfunction watchExit<\n A,\n S,\n IM extends { type: string },\n OM extends { type: string } | ExitMessage,\n>(\n proc: {\n toAllChildren: (m: { type: string }) => void;\n toParent: (m: OM) => void;\n id: symbol;\n pname: string;\n },\n gen: (ctx: any, args: A) => Generator<S | null, void, IM>,\n): (ctx: any, args: A) => Generator<S | null, void, IM> {\n return function* (ctx, args) {\n try {\n yield* gen(ctx, args);\n } finally {\n proc.toAllChildren({ type: \"STOP\" });\n proc.toParent({\n type: \"EXIT\",\n pid: proc.id,\n fromName: proc.pname,\n fromId: proc.id,\n } as OM);\n }\n };\n}\n\ntype DeferCb = () => void;\ntype Defer = (fn: DeferCb) => unknown;\ntype Cancel = (taskId: any) => void;\ntype WindowGlobal = {\n setImmediate?: Defer;\n clearImmediate?: Cancel;\n requestIdleCallback?: Defer;\n cancelIdleCallback?: Cancel;\n setTimeout: Defer;\n clearTimeout: Cancel;\n};\n\n/** Handle to a scheduled (but not yet executed) callback. */\nexport type DeferredCall = {\n cancel: () => void;\n flush: () => void;\n};\n/** Schedule a function to run on the next microtask. Returns an\n * object with `cancel()` and `flush()` methods. */\nfunction defer(fn: DeferCb): DeferredCall {\n const g = globalThis as WindowGlobal;\n function schedule(deferFn: Defer, cancelFn: Cancel) {\n const taskId = deferFn(fn);\n return () => cancelFn(taskId);\n }\n let cancel: () => void;\n if (g.setImmediate && g.clearImmediate) {\n cancel = schedule(g.setImmediate, g.clearImmediate);\n } else if (g.requestIdleCallback && g.cancelIdleCallback) {\n cancel = schedule(g.requestIdleCallback, g.cancelIdleCallback);\n } else {\n cancel = schedule((f) => setTimeout(f, 0), clearTimeout);\n }\n\n function flush() {\n cancel();\n fn();\n }\n\n return { flush, cancel };\n}\n/** A promise paired with its resolve function — used to signal\n * process completion. */\nexport type Waiter = {\n promise: Promise<void>;\n resolve: NotifyFn;\n};\n/** Create a new {@link Waiter}. */\nfunction makeWaiter(): Waiter {\n let resolve: unknown;\n let promise = new Promise<void>((_resolve) => {\n resolve = _resolve;\n });\n return { promise, resolve: resolve as NotifyFn };\n}\n\nexport { runDispatch, defer, makeWaiter, watchExit };\nexport type { ExitMessage };\n"],"mappings":";AACA,SAAgB,SAAS,OAAgB,GAAG,MAAsB;CAChE,IAAI,OACF,QAAQ,IAAI,GAAG,IAAI;AAEvB;;;;;;AAWA,UAAU,YACR,MACA,IACA,gBAAyB,OACzB,aAAa,OACa;CAC1B,IAAI;CACJ,OAAO,CAAC,QAAQ,GAAG;EACjB,MAAM,MAAM;EACZ,SAAS,YAAY,OAAO,MAAM,QAAQ,GAAG;EAC7C,GAAG,GAAG;CACR;AACF;;;AAwDA,SAAS,MAAM,IAA2B;CACxC,MAAM,IAAI;CACV,SAAS,SAAS,SAAgB,UAAkB;EAClD,MAAM,SAAS,QAAQ,EAAE;EACzB,aAAa,SAAS,MAAM;CAC9B;CACA,IAAI;CACJ,IAAI,EAAE,gBAAgB,EAAE,gBACtB,SAAS,SAAS,EAAE,cAAc,EAAE,cAAc;MAC7C,IAAI,EAAE,uBAAuB,EAAE,oBACpC,SAAS,SAAS,EAAE,qBAAqB,EAAE,kBAAkB;MAE7D,SAAS,UAAU,MAAM,WAAW,GAAG,CAAC,GAAG,YAAY;CAGzD,SAAS,QAAQ;EACf,OAAO;EACP,GAAG;CACL;CAEA,OAAO;EAAE;EAAO;CAAO;AACzB;;AAQA,SAAS,aAAqB;CAC5B,IAAI;CAIJ,OAAO;EAAE,SAAA,IAHS,SAAe,aAAa;GAC5C,UAAU;EACZ,CACe;EAAY;CAAoB;AACjD"}
|
package/dist/xfetch.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { c as ExitMessage, d as ProcessCtx, t as Process } from "./process-
|
|
1
|
+
import { c as ExitMessage, d as ProcessCtx, t as Process } from "./process-n7WVg0pj.js";
|
|
2
2
|
|
|
3
3
|
//#region src/xfetch.d.ts
|
|
4
4
|
/** State of an in-flight or completed fetch. */
|
|
@@ -6,6 +6,8 @@ type FetchState<T> = {
|
|
|
6
6
|
code: "pending" | "loading" | "aborted" | "failed" | "ok";
|
|
7
7
|
data: T | null;
|
|
8
8
|
text: string | null;
|
|
9
|
+
status: number;
|
|
10
|
+
responseHeaders: Record<string, string>;
|
|
9
11
|
};
|
|
10
12
|
/** Arguments for a fetch process. */
|
|
11
13
|
type FetchArgs<T> = {
|
|
@@ -24,6 +26,8 @@ type FetchMessage<T> = {
|
|
|
24
26
|
type: "OK";
|
|
25
27
|
data?: T | null;
|
|
26
28
|
text?: string | null;
|
|
29
|
+
status: number;
|
|
30
|
+
responseHeaders: Record<string, string>;
|
|
27
31
|
} | {
|
|
28
32
|
type: "ERROR" | "LOADING" | "ABORTED" | "STOP";
|
|
29
33
|
} | ExitMessage;
|
package/dist/xfetch.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"xfetch.d.ts","names":[],"sources":["../src/xfetch.ts"],"mappings":";;;;KAOY,UAAA;EACV,IAAA;EACA,IAAA,EAAM,
|
|
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,YAAA,CAAa,IAAA"}
|
package/dist/xfetch.js
CHANGED
|
@@ -3,6 +3,14 @@ import { i as runDispatch } from "./util-Cw64MseZ.js";
|
|
|
3
3
|
function isJsonHelper(res) {
|
|
4
4
|
return res.headers.get("content-type") === "application/json";
|
|
5
5
|
}
|
|
6
|
+
/** Convert a Headers object to a plain Record. */
|
|
7
|
+
function headersToRecord(h) {
|
|
8
|
+
const out = {};
|
|
9
|
+
h.forEach((v, k) => {
|
|
10
|
+
out[k] = v;
|
|
11
|
+
});
|
|
12
|
+
return out;
|
|
13
|
+
}
|
|
6
14
|
/**
|
|
7
15
|
* A fetch wrapper implemented as a process. Supports GET/POST/PUT/PATCH,
|
|
8
16
|
* JSON detection, abort via AbortController, and yields a
|
|
@@ -12,7 +20,9 @@ function* xfetch({ pname, toParent, send }, { method = "GET", url, body, headers
|
|
|
12
20
|
const state = {
|
|
13
21
|
code: "pending",
|
|
14
22
|
data: null,
|
|
15
|
-
text: null
|
|
23
|
+
text: null,
|
|
24
|
+
status: 0,
|
|
25
|
+
responseHeaders: {}
|
|
16
26
|
};
|
|
17
27
|
yield state;
|
|
18
28
|
const controller = new AbortController();
|
|
@@ -30,13 +40,19 @@ function* xfetch({ pname, toParent, send }, { method = "GET", url, body, headers
|
|
|
30
40
|
body: serializedBody,
|
|
31
41
|
headers
|
|
32
42
|
});
|
|
43
|
+
const status = res.status;
|
|
44
|
+
const responseHeaders = headersToRecord(res.headers);
|
|
33
45
|
if (isJsonHelper(res)) toSelf({
|
|
34
46
|
type: "OK",
|
|
35
|
-
data: await res.json()
|
|
47
|
+
data: await res.json(),
|
|
48
|
+
status,
|
|
49
|
+
responseHeaders
|
|
36
50
|
});
|
|
37
51
|
else toSelf({
|
|
38
52
|
type: "OK",
|
|
39
|
-
text: await res.text()
|
|
53
|
+
text: await res.text(),
|
|
54
|
+
status,
|
|
55
|
+
responseHeaders
|
|
40
56
|
});
|
|
41
57
|
} catch (e) {
|
|
42
58
|
if (e instanceof DOMException && e.name === "AbortError") toSelf({ type: "ABORTED" });
|
|
@@ -60,6 +76,8 @@ function* xfetch({ pname, toParent, send }, { method = "GET", url, body, headers
|
|
|
60
76
|
state.code = "ok";
|
|
61
77
|
state.data = msg.data || null;
|
|
62
78
|
state.text = msg.text || null;
|
|
79
|
+
state.status = msg.status;
|
|
80
|
+
state.responseHeaders = msg.responseHeaders;
|
|
63
81
|
}
|
|
64
82
|
}, isDone, false);
|
|
65
83
|
}
|
package/dist/xfetch.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"xfetch.js","names":[],"sources":["../src/xfetch.ts"],"sourcesContent":["import { runDispatch } from \"./util.js\";\nimport type { ExitMessage, ProcessCtx } from \"./types.js\";\nimport type { Process } from \"./process.js\";\n\n// ---- types ------------------------------------------------------------------\n\n/** State of an in-flight or completed fetch. */\nexport type FetchState<T> = {\n code: \"pending\" | \"loading\" | \"aborted\" | \"failed\" | \"ok\";\n data: T | null;\n text: string | null;\n};\n\n/** Arguments for a fetch process. */\nexport type FetchArgs<T> =\n | {\n url: URL;\n method?: \"GET\";\n body?: undefined;\n headers?: Record<string, string>;\n }\n | {\n url: URL;\n method?: \"POST\" | \"PUT\" | \"PATCH\";\n body: T;\n headers?: Record<string, string>;\n };\n\n/** Messages emitted by a fetch process during its lifecycle. */\nexport type FetchMessage<T> =\n | {
|
|
1
|
+
{"version":3,"file":"xfetch.js","names":[],"sources":["../src/xfetch.ts"],"sourcesContent":["import { runDispatch } from \"./util.js\";\nimport type { ExitMessage, ProcessCtx } from \"./types.js\";\nimport type { Process } from \"./process.js\";\n\n// ---- types ------------------------------------------------------------------\n\n/** State of an in-flight or completed fetch. */\nexport type FetchState<T> = {\n code: \"pending\" | \"loading\" | \"aborted\" | \"failed\" | \"ok\";\n data: T | null;\n text: string | null;\n status: number;\n responseHeaders: Record<string, string>;\n};\n\n/** Arguments for a fetch process. */\nexport type FetchArgs<T> =\n | {\n url: URL;\n method?: \"GET\";\n body?: undefined;\n headers?: Record<string, string>;\n }\n | {\n url: URL;\n method?: \"POST\" | \"PUT\" | \"PATCH\";\n body: T;\n headers?: Record<string, string>;\n };\n\n/** Messages emitted by a fetch process during its lifecycle. */\nexport type FetchMessage<T> =\n | {\n type: \"OK\";\n data?: T | null;\n text?: string | null;\n status: number;\n responseHeaders: Record<string, string>;\n }\n | { type: \"ERROR\" | \"LOADING\" | \"ABORTED\" | \"STOP\" }\n | ExitMessage;\n\n/** A process that performs an HTTP fetch. */\nexport type FetchProcess<D> = Process<\n FetchArgs<D>,\n FetchState<D>,\n FetchMessage<D>,\n FetchMessage<D>\n>;\n\n// ---- helpers ----------------------------------------------------------------\n\nfunction isJsonHelper(res: Response): boolean {\n const ct = res.headers.get(\"content-type\");\n return ct === \"application/json\";\n}\n\n/** Convert a Headers object to a plain Record. */\nfunction headersToRecord(h: Headers): Record<string, string> {\n const out: Record<string, string> = {};\n h.forEach((v, k) => {\n out[k] = v;\n });\n return out;\n}\n\n// ---- xfetch -----------------------------------------------------------------\n\n/**\n * A fetch wrapper implemented as a process. Supports GET/POST/PUT/PATCH,\n * JSON detection, abort via AbortController, and yields a\n * {@link FetchState} with the current status.\n */\nfunction* xfetch<Type>(\n {\n pname,\n toParent,\n send,\n }: ProcessCtx<\n FetchArgs<Type>,\n FetchState<Type>,\n FetchMessage<Type>,\n FetchMessage<Type>\n >,\n { method = \"GET\", url, body, headers: callerHeaders }: FetchArgs<Type>,\n): Generator<FetchState<Type> | null, void, FetchMessage<Type>> {\n const state: FetchState<Type> = {\n code: \"pending\",\n data: null,\n text: null,\n status: 0,\n responseHeaders: {},\n };\n yield state;\n\n const controller = new AbortController();\n const signal = controller.signal;\n const toSelf = send;\n\n (async function doRequest() {\n try {\n toSelf({ type: \"LOADING\" });\n const serializedBody =\n method === \"GET\" ? undefined : JSON.stringify(body);\n const headers = new Headers(callerHeaders ?? {});\n if (serializedBody) {\n headers.set(\"content-type\", \"application/json\");\n }\n const res: Response = await fetch(url.href, {\n method,\n signal,\n body: serializedBody,\n headers,\n });\n const status = res.status;\n const responseHeaders = headersToRecord(res.headers);\n if (isJsonHelper(res)) {\n const data = await res.json();\n toSelf({ type: \"OK\", data, status, responseHeaders });\n } else {\n const text = await res.text();\n toSelf({ type: \"OK\", text, status, responseHeaders });\n }\n } catch (e) {\n const isAborted = e instanceof DOMException && e.name === \"AbortError\";\n if (isAborted) {\n toSelf({ type: \"ABORTED\" });\n } else {\n toSelf({ type: \"ERROR\" });\n }\n }\n })();\n\n const isDone = (): boolean =>\n !(state.code === \"pending\" || state.code === \"loading\");\n\n yield* runDispatch<FetchMessage<Type>>(\n pname,\n (msg: FetchMessage<Type>) => {\n if (msg.type === \"STOP\") {\n controller.abort();\n }\n if (msg.type === \"ABORTED\") {\n toParent(msg);\n state.code = \"aborted\";\n }\n if (msg.type === \"ERROR\") {\n toParent(msg);\n state.code = \"failed\";\n }\n if (msg.type === \"LOADING\") {\n state.code = \"loading\";\n }\n if (msg.type === \"OK\") {\n toParent(msg);\n state.code = \"ok\";\n state.data = msg.data || null;\n state.text = msg.text || null;\n state.status = msg.status;\n state.responseHeaders = msg.responseHeaders;\n }\n },\n isDone,\n false,\n );\n}\n\nexport { xfetch };\n"],"mappings":";;AAoDA,SAAS,aAAa,KAAwB;CAE5C,OADW,IAAI,QAAQ,IAAI,cACnB,MAAM;AAChB;;AAGA,SAAS,gBAAgB,GAAoC;CAC3D,MAAM,MAA8B,CAAC;CACrC,EAAE,SAAS,GAAG,MAAM;EAClB,IAAI,KAAK;CACX,CAAC;CACD,OAAO;AACT;;;;;;AASA,UAAU,OACR,EACE,OACA,UACA,QAOF,EAAE,SAAS,OAAO,KAAK,MAAM,SAAS,iBACwB;CAC9D,MAAM,QAA0B;EAC9B,MAAM;EACN,MAAM;EACN,MAAM;EACN,QAAQ;EACR,iBAAiB,CAAC;CACpB;CACA,MAAM;CAEN,MAAM,aAAa,IAAI,gBAAgB;CACvC,MAAM,SAAS,WAAW;CAC1B,MAAM,SAAS;CAEf,CAAC,eAAe,YAAY;EAC1B,IAAI;GACF,OAAO,EAAE,MAAM,UAAU,CAAC;GAC1B,MAAM,iBACJ,WAAW,QAAQ,KAAA,IAAY,KAAK,UAAU,IAAI;GACpD,MAAM,UAAU,IAAI,QAAQ,iBAAiB,CAAC,CAAC;GAC/C,IAAI,gBACF,QAAQ,IAAI,gBAAgB,kBAAkB;GAEhD,MAAM,MAAgB,MAAM,MAAM,IAAI,MAAM;IAC1C;IACA;IACA,MAAM;IACN;GACF,CAAC;GACD,MAAM,SAAS,IAAI;GACnB,MAAM,kBAAkB,gBAAgB,IAAI,OAAO;GACnD,IAAI,aAAa,GAAG,GAElB,OAAO;IAAE,MAAM;IAAM,MAAA,MADF,IAAI,KAAK;IACD;IAAQ;GAAgB,CAAC;QAGpD,OAAO;IAAE,MAAM;IAAM,MAAA,MADF,IAAI,KAAK;IACD;IAAQ;GAAgB,CAAC;EAExD,SAAS,GAAG;GAEV,IADkB,aAAa,gBAAgB,EAAE,SAAS,cAExD,OAAO,EAAE,MAAM,UAAU,CAAC;QAE1B,OAAO,EAAE,MAAM,QAAQ,CAAC;EAE5B;CACF,GAAG;CAEH,MAAM,eACJ,EAAE,MAAM,SAAS,aAAa,MAAM,SAAS;CAE/C,OAAO,YACL,QACC,QAA4B;EAC3B,IAAI,IAAI,SAAS,QACf,WAAW,MAAM;EAEnB,IAAI,IAAI,SAAS,WAAW;GAC1B,SAAS,GAAG;GACZ,MAAM,OAAO;EACf;EACA,IAAI,IAAI,SAAS,SAAS;GACxB,SAAS,GAAG;GACZ,MAAM,OAAO;EACf;EACA,IAAI,IAAI,SAAS,WACf,MAAM,OAAO;EAEf,IAAI,IAAI,SAAS,MAAM;GACrB,SAAS,GAAG;GACZ,MAAM,OAAO;GACb,MAAM,OAAO,IAAI,QAAQ;GACzB,MAAM,OAAO,IAAI,QAAQ;GACzB,MAAM,SAAS,IAAI;GACnB,MAAM,kBAAkB,IAAI;EAC9B;CACF,GACA,QACA,KACF;AACF"}
|
package/package.json
CHANGED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"process-DF-plv-v.d.ts","names":[],"sources":["../src/types.ts","../src/process.async.ts","../src/util.ts","../src/process.ts"],"mappings":"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"}
|