posipaki 0.6.2 → 0.6.4
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 +2 -3
- package/dist/index.js +165 -3
- package/dist/index.js.map +1 -1
- package/dist/pipe.d.ts +22 -0
- package/dist/pipe.d.ts.map +1 -0
- package/dist/pipe.js +49 -0
- package/dist/pipe.js.map +1 -0
- package/dist/process-BlUe6Luh.d.ts +100 -0
- package/dist/process-BlUe6Luh.d.ts.map +1 -0
- package/dist/supervisor.d.ts +45 -0
- package/dist/supervisor.d.ts.map +1 -0
- package/dist/supervisor.js +53 -0
- package/dist/supervisor.js.map +1 -0
- package/dist/util-5PSJsovA.js +64 -0
- package/dist/util-5PSJsovA.js.map +1 -0
- package/package.json +13 -15
- package/dist/process.d.ts +0 -47
- package/dist/process.js +0 -130
- package/dist/process.js.map +0 -1
- package/dist/util.d.ts +0 -23
- package/dist/util.js +0 -51
- package/dist/util.js.map +0 -1
- package/dist/xfetch.d.ts +0 -30
- package/dist/xfetch.js +0 -78
- package/dist/xfetch.js.map +0 -1
- package/src/index.ts +0 -4
- package/src/process.ts +0 -181
- package/src/util.ts +0 -86
- package/src/xfetch.ts +0 -103
package/dist/process.d.ts
DELETED
|
@@ -1,47 +0,0 @@
|
|
|
1
|
-
import { ExitMessage } from './util';
|
|
2
|
-
export interface Message {
|
|
3
|
-
type: string;
|
|
4
|
-
}
|
|
5
|
-
type ProcessGenerator<ProcessState, InMessage> = Generator<ProcessState | null, void, InMessage>;
|
|
6
|
-
type Fork = <ChildArgs, ChildState, InMessage extends Message, OutMessage extends Message>(fn: ProcessFn<ChildArgs, ChildState, InMessage, OutMessage>, pname: string) => (args: ChildArgs) => Process<ChildArgs, ChildState, InMessage, OutMessage>;
|
|
7
|
-
export type ProcessFn<Args, State, InMessage, OutMessage> = (ctx: ProcessCtx<InMessage, OutMessage>, args: Args) => ProcessGenerator<State, InMessage>;
|
|
8
|
-
type ProcessMessageCb<M> = (msg: M) => void;
|
|
9
|
-
export type ProcessCtx<IM, OM> = {
|
|
10
|
-
pname: string;
|
|
11
|
-
fork: Fork;
|
|
12
|
-
send: (msg: IM) => void;
|
|
13
|
-
toParent: ProcessMessageCb<OM>;
|
|
14
|
-
};
|
|
15
|
-
type NotifyFn = () => void;
|
|
16
|
-
export declare function spawn<Args, State, InMessage extends Message = Message, OutMessage extends Message = ExitMessage>(fn: ProcessFn<Args, State, InMessage, OutMessage>, pname: string, toParent?: ProcessMessageCb<OutMessage>): (args: Args) => Process<Args, State, InMessage, OutMessage>;
|
|
17
|
-
declare class Process<Args, State, InMessage extends Message, OutMessage extends Message> {
|
|
18
|
-
pgenerator: ProcessFn<Args, State, InMessage, OutMessage>;
|
|
19
|
-
pname: string;
|
|
20
|
-
toParent: ProcessMessageCb<OutMessage>;
|
|
21
|
-
id: Symbol;
|
|
22
|
-
state: State | null;
|
|
23
|
-
private current;
|
|
24
|
-
private buffer;
|
|
25
|
-
private nextTick;
|
|
26
|
-
private children;
|
|
27
|
-
private subscribers;
|
|
28
|
-
private exitWaiter;
|
|
29
|
-
private _isPaused;
|
|
30
|
-
constructor(fn: ProcessFn<Args, State, InMessage, OutMessage>, pname: string, toParent: ProcessMessageCb<OutMessage> | undefined);
|
|
31
|
-
start(arg0: Args): void;
|
|
32
|
-
fork<ChildArgs, ChildState, ChildIM extends Message, ChildOM extends Message>(fn: ProcessFn<ChildArgs, ChildState, ChildIM, ChildOM>, pname: string): (args: ChildArgs) => Process<ChildArgs, ChildState, ChildIM, ChildOM>;
|
|
33
|
-
_tick(): void;
|
|
34
|
-
_eatResult(ret: IteratorResult<State | null, void> | null): void;
|
|
35
|
-
toAllChildren(msg: Message): void;
|
|
36
|
-
send(msg: InMessage): void;
|
|
37
|
-
tick(): void;
|
|
38
|
-
_scheduleTick(): void;
|
|
39
|
-
notify(): void;
|
|
40
|
-
get isListenedTo(): boolean;
|
|
41
|
-
subscribe(f: NotifyFn): () => void;
|
|
42
|
-
pause(): void;
|
|
43
|
-
resume(): void;
|
|
44
|
-
wait(): Promise<void>;
|
|
45
|
-
fromChild(msg: InMessage): void;
|
|
46
|
-
}
|
|
47
|
-
export default Process;
|
package/dist/process.js
DELETED
|
@@ -1,130 +0,0 @@
|
|
|
1
|
-
import { watchExit, defer, makeWaiter } from './util';
|
|
2
|
-
;
|
|
3
|
-
export function spawn(fn, pname, toParent) {
|
|
4
|
-
return (args) => {
|
|
5
|
-
const process = new Process(fn, pname, toParent);
|
|
6
|
-
process.start(args);
|
|
7
|
-
return process;
|
|
8
|
-
};
|
|
9
|
-
}
|
|
10
|
-
const noop = () => null;
|
|
11
|
-
class Process {
|
|
12
|
-
constructor(fn, pname, toParent) {
|
|
13
|
-
this._isPaused = false;
|
|
14
|
-
this.pgenerator = fn;
|
|
15
|
-
this.pname = pname;
|
|
16
|
-
this.toParent = toParent || noop;
|
|
17
|
-
this.id = Symbol(pname);
|
|
18
|
-
this.current = null;
|
|
19
|
-
this.state = null;
|
|
20
|
-
this.buffer = [];
|
|
21
|
-
this.nextTick = null;
|
|
22
|
-
this.children = [];
|
|
23
|
-
this.subscribers = [];
|
|
24
|
-
this.exitWaiter = makeWaiter();
|
|
25
|
-
}
|
|
26
|
-
start(arg0) {
|
|
27
|
-
const ctx = {
|
|
28
|
-
pname: this.pname,
|
|
29
|
-
fork: this.fork.bind(this),
|
|
30
|
-
send: this.send.bind(this),
|
|
31
|
-
toParent: this.toParent,
|
|
32
|
-
};
|
|
33
|
-
const task = watchExit(this)(ctx, arg0);
|
|
34
|
-
this.current = task;
|
|
35
|
-
let ret = task.next();
|
|
36
|
-
this.state = ret.value || null;
|
|
37
|
-
this._eatResult(task.next());
|
|
38
|
-
}
|
|
39
|
-
fork(fn, pname) {
|
|
40
|
-
return (args) => {
|
|
41
|
-
// not enough typescript power in this one
|
|
42
|
-
const fromChild = this.fromChild.bind(this);
|
|
43
|
-
const child = new Process(fn, pname, fromChild);
|
|
44
|
-
// we don't keep track of what is happening down there
|
|
45
|
-
this.children.push(child);
|
|
46
|
-
child.start(args);
|
|
47
|
-
return child;
|
|
48
|
-
};
|
|
49
|
-
}
|
|
50
|
-
_tick() {
|
|
51
|
-
if (!this.current) {
|
|
52
|
-
return;
|
|
53
|
-
}
|
|
54
|
-
let msg;
|
|
55
|
-
let ret = null;
|
|
56
|
-
while (msg = this.buffer.shift()) {
|
|
57
|
-
ret = this.current.next(msg);
|
|
58
|
-
if (ret.done) {
|
|
59
|
-
break;
|
|
60
|
-
}
|
|
61
|
-
}
|
|
62
|
-
this.notify();
|
|
63
|
-
this._eatResult(ret);
|
|
64
|
-
}
|
|
65
|
-
_eatResult(ret) {
|
|
66
|
-
if (ret && ret.done) {
|
|
67
|
-
this.exitWaiter.resolve();
|
|
68
|
-
}
|
|
69
|
-
}
|
|
70
|
-
toAllChildren(msg) {
|
|
71
|
-
this.children.forEach(p => p.send(msg));
|
|
72
|
-
}
|
|
73
|
-
send(msg) {
|
|
74
|
-
this.buffer.push(msg);
|
|
75
|
-
this._scheduleTick();
|
|
76
|
-
}
|
|
77
|
-
tick() {
|
|
78
|
-
var _a;
|
|
79
|
-
(_a = this.nextTick) === null || _a === void 0 ? void 0 : _a.flush();
|
|
80
|
-
this.nextTick = null;
|
|
81
|
-
}
|
|
82
|
-
_scheduleTick() {
|
|
83
|
-
var _a;
|
|
84
|
-
if (this._isPaused) {
|
|
85
|
-
return;
|
|
86
|
-
}
|
|
87
|
-
(_a = this.nextTick) === null || _a === void 0 ? void 0 : _a.cancel();
|
|
88
|
-
this.nextTick = defer(() => {
|
|
89
|
-
this.nextTick = null;
|
|
90
|
-
this._tick();
|
|
91
|
-
});
|
|
92
|
-
}
|
|
93
|
-
notify() {
|
|
94
|
-
this.subscribers.forEach((f) => f());
|
|
95
|
-
}
|
|
96
|
-
get isListenedTo() {
|
|
97
|
-
return this.subscribers.length > 0;
|
|
98
|
-
}
|
|
99
|
-
subscribe(f) {
|
|
100
|
-
this.subscribers.push(f);
|
|
101
|
-
return () => {
|
|
102
|
-
const idx = this.subscribers.indexOf(f);
|
|
103
|
-
if (idx < 0) {
|
|
104
|
-
return;
|
|
105
|
-
}
|
|
106
|
-
this.subscribers.splice(idx, 1);
|
|
107
|
-
};
|
|
108
|
-
}
|
|
109
|
-
pause() {
|
|
110
|
-
var _a;
|
|
111
|
-
(_a = this.nextTick) === null || _a === void 0 ? void 0 : _a.cancel();
|
|
112
|
-
this.nextTick = null;
|
|
113
|
-
this._isPaused = true;
|
|
114
|
-
}
|
|
115
|
-
resume() {
|
|
116
|
-
this._isPaused = false;
|
|
117
|
-
this._scheduleTick();
|
|
118
|
-
}
|
|
119
|
-
wait() {
|
|
120
|
-
return this.exitWaiter.promise;
|
|
121
|
-
}
|
|
122
|
-
fromChild(msg) {
|
|
123
|
-
if (msg.type === 'EXIT') {
|
|
124
|
-
this.children = this.children.filter(p => p.id !== msg.pid);
|
|
125
|
-
}
|
|
126
|
-
this.send(msg);
|
|
127
|
-
}
|
|
128
|
-
}
|
|
129
|
-
export default Process;
|
|
130
|
-
//# sourceMappingURL=process.js.map
|
package/dist/process.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"process.js","sourceRoot":"","sources":["../src/process.ts"],"names":[],"mappings":"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"}
|
package/dist/util.d.ts
DELETED
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
import type Process from './process.js';
|
|
2
|
-
import type { ProcessCtx, Message } from './process.js';
|
|
3
|
-
type ReducerClosure<M> = (msg: M) => void;
|
|
4
|
-
type ReadyFn = () => boolean;
|
|
5
|
-
type NotifyFn = () => void;
|
|
6
|
-
declare function runDispatch<M>(name: string, fn: ReducerClosure<M>, readyFn?: ReadyFn, debugLevel?: boolean): Generator<null, void, M>;
|
|
7
|
-
export type ExitMessage = {
|
|
8
|
-
type: 'EXIT';
|
|
9
|
-
pid: Symbol;
|
|
10
|
-
};
|
|
11
|
-
declare function watchExit<Args, State, InMessage extends Message, OutMessage extends (Message | ExitMessage)>(process: Process<Args, State, InMessage, OutMessage>): (ctx: ProcessCtx<InMessage, OutMessage>, arg0: Args) => Generator<State | null, void, InMessage>;
|
|
12
|
-
type DeferCb = () => void;
|
|
13
|
-
export type DeferredCall = {
|
|
14
|
-
cancel: () => void;
|
|
15
|
-
flush: () => void;
|
|
16
|
-
};
|
|
17
|
-
declare function defer(fn: DeferCb): DeferredCall;
|
|
18
|
-
export type Waiter = {
|
|
19
|
-
promise: Promise<void>;
|
|
20
|
-
resolve: NotifyFn;
|
|
21
|
-
};
|
|
22
|
-
declare function makeWaiter(): Waiter;
|
|
23
|
-
export { runDispatch, watchExit, defer, makeWaiter };
|
package/dist/util.js
DELETED
|
@@ -1,51 +0,0 @@
|
|
|
1
|
-
function debugLog(level, ...args) {
|
|
2
|
-
if (level) {
|
|
3
|
-
console.log(...args);
|
|
4
|
-
}
|
|
5
|
-
}
|
|
6
|
-
function* runDispatch(name, fn, readyFn = () => false, debugLevel = false) {
|
|
7
|
-
let msg;
|
|
8
|
-
while (!readyFn()) {
|
|
9
|
-
msg = yield null;
|
|
10
|
-
debugLog(debugLevel, 'msg', name, ' <- ', msg);
|
|
11
|
-
fn(msg);
|
|
12
|
-
}
|
|
13
|
-
}
|
|
14
|
-
function watchExit(process) {
|
|
15
|
-
return function* (ctx, arg0) {
|
|
16
|
-
yield* process.pgenerator(ctx, arg0);
|
|
17
|
-
process.toAllChildren({ type: 'STOP' });
|
|
18
|
-
process.toParent({ type: 'EXIT', pid: process.id });
|
|
19
|
-
};
|
|
20
|
-
}
|
|
21
|
-
function defer(fn) {
|
|
22
|
-
const g = globalThis;
|
|
23
|
-
function schedule(deferFn, cancelFn) {
|
|
24
|
-
const taskId = deferFn(fn);
|
|
25
|
-
return () => cancelFn(taskId);
|
|
26
|
-
}
|
|
27
|
-
let cancel;
|
|
28
|
-
if (g.setImmediate && g.clearImmediate) {
|
|
29
|
-
cancel = schedule(g.setImmediate, g.clearImmediate);
|
|
30
|
-
}
|
|
31
|
-
else if (g.requestIdleCallback && g.cancelIdleCallback) {
|
|
32
|
-
cancel = schedule(g.requestIdleCallback, g.cancelIdleCallback);
|
|
33
|
-
}
|
|
34
|
-
else {
|
|
35
|
-
cancel = schedule((f) => setTimeout(f, 0), clearTimeout);
|
|
36
|
-
}
|
|
37
|
-
function flush() {
|
|
38
|
-
cancel();
|
|
39
|
-
fn();
|
|
40
|
-
}
|
|
41
|
-
return { flush, cancel };
|
|
42
|
-
}
|
|
43
|
-
function makeWaiter() {
|
|
44
|
-
let resolve;
|
|
45
|
-
let promise = new Promise(_resolve => {
|
|
46
|
-
resolve = _resolve;
|
|
47
|
-
});
|
|
48
|
-
return { promise, resolve: resolve };
|
|
49
|
-
}
|
|
50
|
-
export { runDispatch, watchExit, defer, makeWaiter };
|
|
51
|
-
//# sourceMappingURL=util.js.map
|
package/dist/util.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"util.js","sourceRoot":"","sources":["../src/util.ts"],"names":[],"mappings":"AAGA,SAAS,QAAQ,CAAC,KAAc,EAAE,GAAG,IAAoB;IACvD,IAAI,KAAK,EAAE;QACT,OAAO,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC;KACtB;AACH,CAAC;AAMD,QAAQ,CAAC,CAAC,WAAW,CAAI,IAAY,EAAE,EAAsB,EAAE,UAAmB,GAAE,EAAE,CAAC,KAAK,EAAE,UAAU,GAAG,KAAK;IAC9G,IAAI,GAAM,CAAC;IACX,OAAM,CAAC,OAAO,EAAE,EAAE;QAChB,GAAG,GAAG,MAAM,IAAI,CAAC;QACjB,QAAQ,CAAC,UAAU,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,CAAC,CAAC;QAC/C,EAAE,CAAC,GAAG,CAAC,CAAC;KACT;AACH,CAAC;AAOD,SAAS,SAAS,CAAqF,OAAoD;IACzJ,OAAO,QAAQ,CAAC,EAAE,GAAsC,EAAE,IAAU;QAClE,KAAK,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QACrC,OAAO,CAAC,aAAa,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;QACxC,OAAO,CAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,CAAC,EAAE,EAAe,CAAC,CAAC;IACnE,CAAC,CAAA;AACH,CAAC;AAkBD,SAAS,KAAK,CAAC,EAAW;IACxB,MAAM,CAAC,GAAG,UAA0B,CAAC;IACrC,SAAS,QAAQ,CAAC,OAAc,EAAE,QAAgB;QAChD,MAAM,MAAM,GAAG,OAAO,CAAC,EAAE,CAAC,CAAC;QAC3B,OAAO,GAAE,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IAC/B,CAAC;IACD,IAAI,MAAkB,CAAC;IACvB,IAAI,CAAC,CAAC,YAAY,IAAI,CAAC,CAAC,cAAc,EAAE;QACtC,MAAM,GAAG,QAAQ,CAAC,CAAC,CAAC,YAAY,EAAE,CAAC,CAAC,cAAc,CAAC,CAAC;KACrD;SAAM,IAAI,CAAC,CAAC,mBAAmB,IAAI,CAAC,CAAC,kBAAkB,EAAE;QACxD,MAAM,GAAG,QAAQ,CAAC,CAAC,CAAC,mBAAmB,EAAE,CAAC,CAAC,kBAAkB,CAAC,CAAC;KAChE;SAAM;QACL,MAAM,GAAG,QAAQ,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,YAAY,CAAC,CAAC;KAC1D;IAED,SAAS,KAAK;QACZ,MAAM,EAAE,CAAC;QACT,EAAE,EAAE,CAAC;IACP,CAAC;IAED,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;AAC3B,CAAC;AAKD,SAAS,UAAU;IACjB,IAAI,OAAgB,CAAC;IACrB,IAAI,OAAO,GAAG,IAAI,OAAO,CAAO,QAAQ,CAAC,EAAE;QACzC,OAAO,GAAG,QAAQ,CAAC;IACrB,CAAC,CAAC,CAAC;IACH,OAAO,EAAC,OAAO,EAAE,OAAO,EAAE,OAAmB,EAAC,CAAC;AACjD,CAAC;AAED,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC"}
|
package/dist/xfetch.d.ts
DELETED
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
import { ExitMessage } from './util.js';
|
|
2
|
-
import type Process from './process.js';
|
|
3
|
-
import type { ProcessCtx } from './process.js';
|
|
4
|
-
export type FetchState<T> = {
|
|
5
|
-
code: 'pending' | 'loading' | 'aborted' | 'failed' | 'ok';
|
|
6
|
-
data: T | null;
|
|
7
|
-
text: string | null;
|
|
8
|
-
};
|
|
9
|
-
type FetchArgsGet = {
|
|
10
|
-
url: URL;
|
|
11
|
-
method?: 'GET';
|
|
12
|
-
body?: undefined;
|
|
13
|
-
};
|
|
14
|
-
type FetchArgsSend<T> = {
|
|
15
|
-
url: URL;
|
|
16
|
-
method?: 'POST' | 'PUT' | 'PATCH';
|
|
17
|
-
body: T;
|
|
18
|
-
};
|
|
19
|
-
export type FetchArgs<T> = FetchArgsGet | FetchArgsSend<T>;
|
|
20
|
-
export type FetchMessage<T> = {
|
|
21
|
-
type: 'OK';
|
|
22
|
-
data?: T | null;
|
|
23
|
-
text?: string | null;
|
|
24
|
-
} | {
|
|
25
|
-
type: 'ERROR' | 'LOADING' | 'ABORTED' | 'STOP';
|
|
26
|
-
} | ExitMessage;
|
|
27
|
-
type FetchGenerator<T, M> = Generator<FetchState<T> | null, void, M>;
|
|
28
|
-
export type FetchProcess<D> = Process<FetchArgs<D>, FetchState<D>, FetchMessage<D>, FetchMessage<D>>;
|
|
29
|
-
declare function xfetch<Type>({ pname, toParent, send }: ProcessCtx<FetchMessage<Type>, FetchMessage<Type>>, { method, url, body }: FetchArgs<Type>): FetchGenerator<Type, FetchMessage<Type>>;
|
|
30
|
-
export { xfetch };
|
package/dist/xfetch.js
DELETED
|
@@ -1,78 +0,0 @@
|
|
|
1
|
-
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
2
|
-
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
3
|
-
return new (P || (P = Promise))(function (resolve, reject) {
|
|
4
|
-
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
5
|
-
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
6
|
-
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
7
|
-
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
8
|
-
});
|
|
9
|
-
};
|
|
10
|
-
import { runDispatch } from './util.js';
|
|
11
|
-
function isJsonHelper(res) {
|
|
12
|
-
const ct = res.headers.get('content-type');
|
|
13
|
-
return ct === 'application/json';
|
|
14
|
-
}
|
|
15
|
-
function* xfetch({ pname, toParent, send }, { method = 'GET', url, body }) {
|
|
16
|
-
const state = { code: 'pending', data: null, text: null };
|
|
17
|
-
yield state;
|
|
18
|
-
const controller = new AbortController();
|
|
19
|
-
const signal = controller.signal;
|
|
20
|
-
const toSelf = send;
|
|
21
|
-
(function do_request() {
|
|
22
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
23
|
-
try {
|
|
24
|
-
toSelf({ type: 'LOADING' });
|
|
25
|
-
const serializedBody = method === 'GET' ? undefined : JSON.stringify(body);
|
|
26
|
-
const headers = new Headers({});
|
|
27
|
-
if (serializedBody) {
|
|
28
|
-
headers.set('content-type', 'application/json');
|
|
29
|
-
}
|
|
30
|
-
;
|
|
31
|
-
const res = yield fetch(url.href, { method, signal, body: serializedBody, headers });
|
|
32
|
-
if (isJsonHelper(res)) {
|
|
33
|
-
const data = yield res.json();
|
|
34
|
-
toSelf({ type: 'OK', data });
|
|
35
|
-
}
|
|
36
|
-
else {
|
|
37
|
-
const text = yield res.text();
|
|
38
|
-
toSelf({ type: 'OK', text });
|
|
39
|
-
}
|
|
40
|
-
}
|
|
41
|
-
catch (e) {
|
|
42
|
-
const isAborted = (e instanceof DOMException && e.name === 'AbortError');
|
|
43
|
-
if (isAborted) {
|
|
44
|
-
toSelf({ type: 'ABORTED' });
|
|
45
|
-
}
|
|
46
|
-
else {
|
|
47
|
-
//console.log('e', e);
|
|
48
|
-
toSelf({ type: 'ERROR' });
|
|
49
|
-
}
|
|
50
|
-
}
|
|
51
|
-
});
|
|
52
|
-
})();
|
|
53
|
-
const isDone = () => !(state.code === 'pending' || state.code === 'loading');
|
|
54
|
-
yield* runDispatch(pname, (msg) => {
|
|
55
|
-
if (msg.type === 'STOP') {
|
|
56
|
-
controller.abort();
|
|
57
|
-
}
|
|
58
|
-
if (msg.type === 'ABORTED') {
|
|
59
|
-
toParent(msg);
|
|
60
|
-
state.code = 'aborted';
|
|
61
|
-
}
|
|
62
|
-
if (msg.type === 'ERROR') {
|
|
63
|
-
toParent(msg);
|
|
64
|
-
state.code = 'failed';
|
|
65
|
-
}
|
|
66
|
-
if (msg.type === 'LOADING') {
|
|
67
|
-
state.code = 'loading';
|
|
68
|
-
}
|
|
69
|
-
if (msg.type === 'OK') {
|
|
70
|
-
toParent(msg);
|
|
71
|
-
state.code = 'ok';
|
|
72
|
-
state.data = msg.data || null;
|
|
73
|
-
state.text = msg.text || null;
|
|
74
|
-
}
|
|
75
|
-
}, isDone, true);
|
|
76
|
-
}
|
|
77
|
-
export { xfetch };
|
|
78
|
-
//# sourceMappingURL=xfetch.js.map
|
package/dist/xfetch.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"xfetch.js","sourceRoot":"","sources":["../src/xfetch.ts"],"names":[],"mappings":"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"}
|
package/src/index.ts
DELETED
package/src/process.ts
DELETED
|
@@ -1,181 +0,0 @@
|
|
|
1
|
-
import { ExitMessage, watchExit, Waiter, defer, DeferredCall, makeWaiter } from './util';
|
|
2
|
-
|
|
3
|
-
export interface Message {
|
|
4
|
-
type: string;
|
|
5
|
-
};
|
|
6
|
-
|
|
7
|
-
type ProcessGenerator<ProcessState, InMessage> = Generator<ProcessState | null, void, InMessage>;
|
|
8
|
-
type Fork = <ChildArgs, ChildState, InMessage extends Message, OutMessage extends Message>(fn : ProcessFn<ChildArgs, ChildState, InMessage, OutMessage>, pname : string) => (args: ChildArgs) => Process<ChildArgs, ChildState, InMessage, OutMessage>;
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
export type ProcessFn<Args, State, InMessage, OutMessage> = (ctx: ProcessCtx<InMessage, OutMessage>, args: Args) => ProcessGenerator<State, InMessage>;
|
|
12
|
-
type ProcessMessageCb<M> = (msg: M) => void;
|
|
13
|
-
|
|
14
|
-
export type ProcessCtx<IM, OM> = {
|
|
15
|
-
pname: string,
|
|
16
|
-
fork: Fork,
|
|
17
|
-
send: (msg: IM) => void,
|
|
18
|
-
toParent: ProcessMessageCb<OM>,
|
|
19
|
-
};
|
|
20
|
-
|
|
21
|
-
type NotifyFn = () => void;
|
|
22
|
-
type UnsubscibeFn = () => void;
|
|
23
|
-
|
|
24
|
-
export function spawn<Args, State, InMessage extends Message=Message, OutMessage extends Message=ExitMessage>(fn: ProcessFn<Args, State, InMessage, OutMessage>, pname: string, toParent?: ProcessMessageCb<OutMessage>) {
|
|
25
|
-
return (args: Args): Process<Args, State, InMessage, OutMessage> => {
|
|
26
|
-
const process = new Process<Args, State, InMessage, OutMessage>(fn, pname, toParent);
|
|
27
|
-
process.start(args);
|
|
28
|
-
return process;
|
|
29
|
-
};
|
|
30
|
-
}
|
|
31
|
-
const noop = ()=> null;
|
|
32
|
-
|
|
33
|
-
class Process<Args, State, InMessage extends Message, OutMessage extends Message> {
|
|
34
|
-
pgenerator: ProcessFn<Args, State, InMessage, OutMessage>;
|
|
35
|
-
pname: string;
|
|
36
|
-
toParent: ProcessMessageCb<OutMessage>;
|
|
37
|
-
id: Symbol;
|
|
38
|
-
state: State | null;
|
|
39
|
-
|
|
40
|
-
private current: ProcessGenerator<State, InMessage> | null;
|
|
41
|
-
private buffer: Array<InMessage>;
|
|
42
|
-
private nextTick: DeferredCall | null;
|
|
43
|
-
private children: Array<Process<unknown, unknown, Message, Message>>;
|
|
44
|
-
private subscribers: Array<NotifyFn>;
|
|
45
|
-
private exitWaiter: Waiter;
|
|
46
|
-
private _isPaused: boolean = false;
|
|
47
|
-
|
|
48
|
-
constructor(fn: ProcessFn<Args, State, InMessage, OutMessage>, pname: string, toParent: ProcessMessageCb<OutMessage> | undefined) {
|
|
49
|
-
this.pgenerator = fn;
|
|
50
|
-
this.pname = pname;
|
|
51
|
-
this.toParent = toParent || noop;
|
|
52
|
-
this.id = Symbol(pname);
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
this.current = null;
|
|
56
|
-
this.state = null;
|
|
57
|
-
this.buffer = [];
|
|
58
|
-
this.nextTick = null;
|
|
59
|
-
|
|
60
|
-
this.children = [];
|
|
61
|
-
this.subscribers = [];
|
|
62
|
-
this.exitWaiter = makeWaiter();
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
start(arg0: Args) {
|
|
66
|
-
const ctx: ProcessCtx<InMessage, OutMessage> = {
|
|
67
|
-
pname: this.pname,
|
|
68
|
-
fork: this.fork.bind(this),
|
|
69
|
-
send: this.send.bind(this),
|
|
70
|
-
toParent: this.toParent,
|
|
71
|
-
};
|
|
72
|
-
const task = watchExit<Args, State, InMessage, OutMessage>(this)(ctx, arg0);
|
|
73
|
-
this.current = task;
|
|
74
|
-
let ret = task.next();
|
|
75
|
-
this.state = ret.value || null;
|
|
76
|
-
this._eatResult(task.next());
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
fork<ChildArgs, ChildState, ChildIM extends Message, ChildOM extends Message> (fn : ProcessFn<ChildArgs, ChildState, ChildIM, ChildOM>, pname : string) {
|
|
80
|
-
return (args: ChildArgs): Process<ChildArgs, ChildState, ChildIM, ChildOM> => {
|
|
81
|
-
// not enough typescript power in this one
|
|
82
|
-
const fromChild = this.fromChild.bind(this) as unknown;
|
|
83
|
-
const child = new Process<ChildArgs, ChildState, ChildIM, ChildOM>(fn, pname, fromChild as ProcessMessageCb<ChildOM>);
|
|
84
|
-
// we don't keep track of what is happening down there
|
|
85
|
-
this.children.push(child as unknown as Process<unknown, unknown, Message, Message>);
|
|
86
|
-
child.start(args);
|
|
87
|
-
return child;
|
|
88
|
-
}
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
_tick () {
|
|
92
|
-
if (!this.current) {
|
|
93
|
-
return;
|
|
94
|
-
}
|
|
95
|
-
let msg: InMessage | undefined;
|
|
96
|
-
let ret: IteratorResult<State | null, void> | null = null;
|
|
97
|
-
while(msg = this.buffer.shift()) {
|
|
98
|
-
ret = this.current.next(msg);
|
|
99
|
-
if (ret.done) {
|
|
100
|
-
break;
|
|
101
|
-
}
|
|
102
|
-
}
|
|
103
|
-
this.notify();
|
|
104
|
-
this._eatResult(ret);
|
|
105
|
-
}
|
|
106
|
-
|
|
107
|
-
_eatResult(ret: IteratorResult<State | null, void> | null) {
|
|
108
|
-
if (ret && ret.done) {
|
|
109
|
-
this.exitWaiter.resolve();
|
|
110
|
-
}
|
|
111
|
-
}
|
|
112
|
-
|
|
113
|
-
toAllChildren(msg: Message) {
|
|
114
|
-
this.children.forEach(p => p.send(msg));
|
|
115
|
-
}
|
|
116
|
-
|
|
117
|
-
send(msg: InMessage) {
|
|
118
|
-
this.buffer.push(msg);
|
|
119
|
-
this._scheduleTick();
|
|
120
|
-
}
|
|
121
|
-
|
|
122
|
-
tick() {
|
|
123
|
-
this.nextTick?.flush();
|
|
124
|
-
this.nextTick = null;
|
|
125
|
-
}
|
|
126
|
-
|
|
127
|
-
_scheduleTick() {
|
|
128
|
-
if (this._isPaused) {
|
|
129
|
-
return;
|
|
130
|
-
}
|
|
131
|
-
|
|
132
|
-
this.nextTick?.cancel();
|
|
133
|
-
this.nextTick = defer(()=> {
|
|
134
|
-
this.nextTick = null;
|
|
135
|
-
this._tick()
|
|
136
|
-
});
|
|
137
|
-
}
|
|
138
|
-
|
|
139
|
-
notify() {
|
|
140
|
-
this.subscribers.forEach((f) => f());
|
|
141
|
-
}
|
|
142
|
-
|
|
143
|
-
get isListenedTo() {
|
|
144
|
-
return this.subscribers.length > 0;
|
|
145
|
-
}
|
|
146
|
-
|
|
147
|
-
subscribe(f: NotifyFn) {
|
|
148
|
-
this.subscribers.push(f);
|
|
149
|
-
return () => {
|
|
150
|
-
const idx = this.subscribers.indexOf(f);
|
|
151
|
-
if (idx < 0) {
|
|
152
|
-
return;
|
|
153
|
-
}
|
|
154
|
-
this.subscribers.splice(idx, 1);
|
|
155
|
-
}
|
|
156
|
-
}
|
|
157
|
-
|
|
158
|
-
pause() {
|
|
159
|
-
this.nextTick?.cancel();
|
|
160
|
-
this.nextTick = null;
|
|
161
|
-
this._isPaused = true;
|
|
162
|
-
}
|
|
163
|
-
|
|
164
|
-
resume() {
|
|
165
|
-
this._isPaused = false;
|
|
166
|
-
this._scheduleTick();
|
|
167
|
-
}
|
|
168
|
-
|
|
169
|
-
wait() {
|
|
170
|
-
return this.exitWaiter.promise;
|
|
171
|
-
}
|
|
172
|
-
|
|
173
|
-
fromChild(msg: InMessage) {
|
|
174
|
-
if (msg.type === 'EXIT') {
|
|
175
|
-
this.children = this.children.filter(p=> p.id !== (msg as unknown as ExitMessage).pid);
|
|
176
|
-
}
|
|
177
|
-
this.send(msg);
|
|
178
|
-
}
|
|
179
|
-
}
|
|
180
|
-
|
|
181
|
-
export default Process;
|
package/src/util.ts
DELETED
|
@@ -1,86 +0,0 @@
|
|
|
1
|
-
import type Process from './process.js';
|
|
2
|
-
import type { ProcessCtx, Message } from './process.js';
|
|
3
|
-
|
|
4
|
-
function debugLog(level: boolean, ...args: Array<unknown>) {
|
|
5
|
-
if (level) {
|
|
6
|
-
console.log(...args);
|
|
7
|
-
}
|
|
8
|
-
}
|
|
9
|
-
|
|
10
|
-
type ReducerClosure<M> = (msg: M) => void;
|
|
11
|
-
type ReadyFn = () => boolean;
|
|
12
|
-
type NotifyFn = () => void;
|
|
13
|
-
|
|
14
|
-
function* runDispatch<M>(name: string, fn : ReducerClosure<M>, readyFn: ReadyFn = ()=> false, debugLevel = false) : Generator<null, void, M> {
|
|
15
|
-
let msg: M;
|
|
16
|
-
while(!readyFn()) {
|
|
17
|
-
msg = yield null;
|
|
18
|
-
debugLog(debugLevel, 'msg', name, ' <- ', msg);
|
|
19
|
-
fn(msg);
|
|
20
|
-
}
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
export type ExitMessage = {
|
|
24
|
-
type: 'EXIT';
|
|
25
|
-
pid: Symbol;
|
|
26
|
-
};
|
|
27
|
-
|
|
28
|
-
function watchExit<Args, State, InMessage extends Message, OutMessage extends (Message | ExitMessage)>(process: Process<Args, State, InMessage, OutMessage>) {
|
|
29
|
-
return function* (ctx: ProcessCtx<InMessage, OutMessage>, arg0: Args) {
|
|
30
|
-
yield* process.pgenerator(ctx, arg0);
|
|
31
|
-
process.toAllChildren({ type: 'STOP' });
|
|
32
|
-
process.toParent({ type: 'EXIT', pid: process.id} as OutMessage);
|
|
33
|
-
}
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
type DeferCb = () => void;
|
|
37
|
-
type Defer = (fn: DeferCb) => unknown;
|
|
38
|
-
type Cancel = (taskId: any)=> void;
|
|
39
|
-
type WindowGlobal = {
|
|
40
|
-
setImmediate?: Defer,
|
|
41
|
-
clearImmediate?: Cancel,
|
|
42
|
-
requestIdleCallback?: Defer,
|
|
43
|
-
cancelIdleCallback?: Cancel,
|
|
44
|
-
setTimeout: Defer,
|
|
45
|
-
clearTimeout: Cancel,
|
|
46
|
-
};
|
|
47
|
-
|
|
48
|
-
export type DeferredCall = {
|
|
49
|
-
cancel: ()=> void,
|
|
50
|
-
flush: () => void,
|
|
51
|
-
};
|
|
52
|
-
function defer(fn: DeferCb) : DeferredCall {
|
|
53
|
-
const g = globalThis as WindowGlobal;
|
|
54
|
-
function schedule(deferFn: Defer, cancelFn: Cancel) {
|
|
55
|
-
const taskId = deferFn(fn);
|
|
56
|
-
return ()=> cancelFn(taskId);
|
|
57
|
-
}
|
|
58
|
-
let cancel : ()=> void;
|
|
59
|
-
if (g.setImmediate && g.clearImmediate) {
|
|
60
|
-
cancel = schedule(g.setImmediate, g.clearImmediate);
|
|
61
|
-
} else if (g.requestIdleCallback && g.cancelIdleCallback) {
|
|
62
|
-
cancel = schedule(g.requestIdleCallback, g.cancelIdleCallback);
|
|
63
|
-
} else {
|
|
64
|
-
cancel = schedule((f) => setTimeout(f, 0), clearTimeout);
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
function flush() {
|
|
68
|
-
cancel();
|
|
69
|
-
fn();
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
return { flush, cancel };
|
|
73
|
-
}
|
|
74
|
-
export type Waiter = {
|
|
75
|
-
promise: Promise<void>;
|
|
76
|
-
resolve: NotifyFn;
|
|
77
|
-
};
|
|
78
|
-
function makeWaiter() : Waiter {
|
|
79
|
-
let resolve: unknown;
|
|
80
|
-
let promise = new Promise<void>(_resolve => {
|
|
81
|
-
resolve = _resolve;
|
|
82
|
-
});
|
|
83
|
-
return {promise, resolve: resolve as NotifyFn};
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
export { runDispatch, watchExit, defer, makeWaiter };
|