posipaki 0.5.2 → 0.5.5

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/process.d.ts CHANGED
@@ -3,7 +3,7 @@ export interface Message {
3
3
  type: string;
4
4
  }
5
5
  type ProcessGenerator<ProcessState, InMessage> = Generator<ProcessState | null, void, InMessage>;
6
- type Fork = <ChildArgs, ChildState, InMessage extends Message, OutMessage extends ExitMessage>(fn: ProcessFn<ChildArgs, ChildState, InMessage, OutMessage>, pname: string) => (args: ChildArgs) => Process<ChildArgs, ChildState, InMessage, OutMessage>;
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
7
  export type ProcessFn<Args, State, InMessage, OutMessage> = (ctx: ProcessCtx<InMessage, OutMessage>, args: Args) => ProcessGenerator<State, InMessage>;
8
8
  type ProcessMessageCb<M> = (msg: M) => void;
9
9
  export type ProcessCtx<IM, OM> = {
@@ -13,8 +13,8 @@ export type ProcessCtx<IM, OM> = {
13
13
  toParent: ProcessMessageCb<OM>;
14
14
  };
15
15
  type NotifyFn = () => void;
16
- export declare function spawn<Args, State, InMessage extends Message = Message, OutMessage extends ExitMessage = 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 ExitMessage> {
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
18
  pgenerator: ProcessFn<Args, State, InMessage, OutMessage>;
19
19
  pname: string;
20
20
  toParent: ProcessMessageCb<OutMessage>;
@@ -27,7 +27,7 @@ declare class Process<Args, State, InMessage extends Message, OutMessage extends
27
27
  private exitWaiter;
28
28
  constructor(fn: ProcessFn<Args, State, InMessage, OutMessage>, pname: string, toParent: ProcessMessageCb<OutMessage> | undefined);
29
29
  start(arg0: Args): void;
30
- fork<ChildArgs, ChildState, ChildIM extends Message, ChildOM extends ExitMessage>(fn: ProcessFn<ChildArgs, ChildState, ChildIM, ChildOM>, pname: string): (args: ChildArgs) => Process<ChildArgs, ChildState, ChildIM, ChildOM>;
30
+ fork<ChildArgs, ChildState, ChildIM extends Message, ChildOM extends Message>(fn: ProcessFn<ChildArgs, ChildState, ChildIM, ChildOM>, pname: string): (args: ChildArgs) => Process<ChildArgs, ChildState, ChildIM, ChildOM>;
31
31
  _tick(ret: IteratorResult<State | null, void> | null): void;
32
32
  toAllChildren(msg: Message): void;
33
33
  send(msg: InMessage): void;
@@ -1 +1 @@
1
- {"version":3,"file":"process.js","sourceRoot":"","sources":["../src/process.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"process.js","sourceRoot":"","sources":["../src/process.ts"],"names":[],"mappings":"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"}
package/dist/util.d.ts CHANGED
@@ -1,14 +1,14 @@
1
- import type Process from './process';
2
- import type { ProcessCtx, Message } from './process';
3
- type ReducerClosure = (msg: Message) => void;
1
+ import type Process from './process.js';
2
+ import type { ProcessCtx, Message } from './process.js';
3
+ type ReducerClosure<M> = (msg: M) => void;
4
4
  type ReadyFn = () => boolean;
5
5
  type NotifyFn = () => void;
6
- declare function runDispatch(name: string, fn: ReducerClosure, readyFn?: ReadyFn, debugLevel?: boolean): Generator<null, void, Message>;
6
+ declare function runDispatch<M>(name: string, fn: ReducerClosure<M>, readyFn?: ReadyFn, debugLevel?: boolean): Generator<null, void, M>;
7
7
  export type ExitMessage = {
8
8
  type: 'EXIT';
9
9
  pid: Symbol;
10
10
  };
11
- declare function watchExit<Args, State, InMessage extends Message, OutMessage extends ExitMessage>(process: Process<Args, State, InMessage, OutMessage>): (ctx: ProcessCtx<InMessage, OutMessage>, arg0: Args) => Generator<State | null, void, InMessage>;
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
12
  type DeferCb = () => void;
13
13
  declare function defer(fn: DeferCb): void;
14
14
  export type Waiter = {
package/dist/util.js.map CHANGED
@@ -1 +1 @@
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,CAAC,IAAY,EAAE,EAAmB,EAAE,UAAmB,GAAE,EAAE,CAAC,KAAK,EAAE,UAAU,GAAG,KAAK;IACxG,IAAI,GAAY,CAAC;IACjB,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,CAAyE,OAAoD;IAC7I,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;AAQD,SAAS,KAAK,CAAC,EAAW;IACxB,MAAM,CAAC,GAAG,UAA0B,CAAC;IACrC,MAAM,QAAQ,GAAG,CAAC,CAAC,CAAC,YAAY,IAAI,mBAAmB,CAAU,CAAC;IAClE,QAAQ,CAAC,EAAE,CAAC,CAAC;AACf,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"}
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;AAQD,SAAS,KAAK,CAAC,EAAW;IACxB,MAAM,CAAC,GAAG,UAA0B,CAAC;IACrC,MAAM,QAAQ,GAAG,CAAC,CAAC,CAAC,YAAY,IAAI,mBAAmB,CAAU,CAAC;IAClE,QAAQ,CAAC,EAAE,CAAC,CAAC;AACf,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 CHANGED
@@ -1,4 +1,6 @@
1
- import type { ProcessCtx } from './process';
1
+ import { ExitMessage } from './util.js';
2
+ import type Process from './process.js';
3
+ import type { ProcessCtx } from './process.js';
2
4
  export type FetchState<T> = {
3
5
  code: 'pending' | 'loading' | 'aborted' | 'failed' | 'ok';
4
6
  data: T | null;
@@ -16,10 +18,13 @@ type FetchArgsSend<T> = {
16
18
  };
17
19
  export type FetchArgs<T> = FetchArgsGet | FetchArgsSend<T>;
18
20
  export type FetchMessage<T> = {
19
- type: string;
21
+ type: 'OK';
20
22
  data?: T | null;
21
23
  text?: string | null;
22
- };
24
+ } | {
25
+ type: 'ERROR' | 'LOADING' | 'ABORTED' | 'STOP';
26
+ } | ExitMessage;
23
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>>;
24
29
  declare function xfetch<Type>({ pname, toParent, send }: ProcessCtx<FetchMessage<Type>, FetchMessage<Type>>, { method, url, body }: FetchArgs<Type>): FetchGenerator<Type, FetchMessage<Type>>;
25
30
  export { xfetch };
@@ -1 +1 @@
1
- {"version":3,"file":"xfetch.js","sourceRoot":"","sources":["../src/xfetch.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"xfetch.js","sourceRoot":"","sources":["../src/xfetch.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,11 +1,12 @@
1
1
  {
2
2
  "type": "module",
3
3
  "name": "posipaki",
4
- "version": "0.5.2",
4
+ "version": "0.5.5",
5
5
  "main": "./dist/index.js",
6
6
  "types": "./dist/index.d.ts",
7
7
  "scripts": {
8
- "build": "tsc"
8
+ "build": "tsc",
9
+ "test": "jest"
9
10
  },
10
11
  "files": [
11
12
  "dist/*js",
@@ -14,6 +15,11 @@
14
15
  "src/*ts"
15
16
  ],
16
17
  "devDependencies": {
17
- "typescript": "^4.4.3"
18
+ "@babel/parser": "^7.22.5",
19
+ "@babel/types": "^7.22.5",
20
+ "@types/jest": "^29.5.2",
21
+ "jest": "^29.5.0",
22
+ "ts-jest": "^29.1.0",
23
+ "typescript": "^5.1.3"
18
24
  }
19
25
  }
package/src/index.ts CHANGED
@@ -1,4 +1,4 @@
1
- import Process, { spawn, Message, ProcessCtx, ProcessFn } from './process.js';
2
- import { ExitMessage, runDispatch } from './util.js';
1
+ import Process, { spawn, Message, ProcessCtx, ProcessFn } from './process';
2
+ import { ExitMessage, runDispatch } from './util';
3
3
 
4
4
  export { Process, spawn, runDispatch, Message, ExitMessage, ProcessCtx, ProcessFn }
package/src/process.ts CHANGED
@@ -1,11 +1,11 @@
1
- import { ExitMessage, watchExit, Waiter, defer, makeWaiter } from './util.js';
1
+ import { ExitMessage, watchExit, Waiter, defer, DeferredCall, makeWaiter } from './util';
2
2
 
3
3
  export interface Message {
4
4
  type: string;
5
5
  };
6
6
 
7
7
  type ProcessGenerator<ProcessState, InMessage> = Generator<ProcessState | null, void, InMessage>;
8
- type Fork = <ChildArgs, ChildState, InMessage extends Message, OutMessage extends ExitMessage>(fn : ProcessFn<ChildArgs, ChildState, InMessage, OutMessage>, pname : string) => (args: ChildArgs) => Process<ChildArgs, ChildState, InMessage, OutMessage>;
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
9
 
10
10
 
11
11
  export type ProcessFn<Args, State, InMessage, OutMessage> = (ctx: ProcessCtx<InMessage, OutMessage>, args: Args) => ProcessGenerator<State, InMessage>;
@@ -21,7 +21,7 @@ export type ProcessCtx<IM, OM> = {
21
21
  type NotifyFn = () => void;
22
22
  type UnsubscibeFn = () => void;
23
23
 
24
- export function spawn<Args, State, InMessage extends Message=Message, OutMessage extends ExitMessage=ExitMessage>(fn: ProcessFn<Args, State, InMessage, OutMessage>, pname: string, toParent?: ProcessMessageCb<OutMessage>) {
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
25
  return (args: Args): Process<Args, State, InMessage, OutMessage> => {
26
26
  const process = new Process<Args, State, InMessage, OutMessage>(fn, pname, toParent);
27
27
  process.start(args);
@@ -30,7 +30,7 @@ export function spawn<Args, State, InMessage extends Message=Message, OutMessage
30
30
  }
31
31
  const noop = ()=> null;
32
32
 
33
- class Process<Args, State, InMessage extends Message, OutMessage extends ExitMessage> {
33
+ class Process<Args, State, InMessage extends Message, OutMessage extends Message> {
34
34
  pgenerator: ProcessFn<Args, State, InMessage, OutMessage>;
35
35
  pname: string;
36
36
  toParent: ProcessMessageCb<OutMessage>;
@@ -39,7 +39,8 @@ class Process<Args, State, InMessage extends Message, OutMessage extends ExitMes
39
39
 
40
40
  private current: ProcessGenerator<State, InMessage> | null;
41
41
  private buffer: Array<InMessage>;
42
- private children: Array<Process<unknown, unknown, Message, ExitMessage>>;
42
+ private nextTick: DeferredCall | null;
43
+ private children: Array<Process<unknown, unknown, Message, Message>>;
43
44
  private subscribers: Array<NotifyFn>;
44
45
  private exitWaiter: Waiter;
45
46
 
@@ -53,6 +54,7 @@ class Process<Args, State, InMessage extends Message, OutMessage extends ExitMes
53
54
  this.current = null;
54
55
  this.state = null;
55
56
  this.buffer = [];
57
+ this.nextTick = null;
56
58
 
57
59
  this.children = [];
58
60
  this.subscribers = [];
@@ -70,31 +72,38 @@ class Process<Args, State, InMessage extends Message, OutMessage extends ExitMes
70
72
  this.current = task;
71
73
  let ret = task.next();
72
74
  this.state = ret.value || null;
73
- this._tick(task.next());
75
+ this._eatResult(task.next());
74
76
  }
75
77
 
76
- fork<ChildArgs, ChildState, ChildIM extends Message, ChildOM extends ExitMessage> (fn : ProcessFn<ChildArgs, ChildState, ChildIM, ChildOM>, pname : string) {
78
+ fork<ChildArgs, ChildState, ChildIM extends Message, ChildOM extends Message> (fn : ProcessFn<ChildArgs, ChildState, ChildIM, ChildOM>, pname : string) {
77
79
  return (args: ChildArgs): Process<ChildArgs, ChildState, ChildIM, ChildOM> => {
78
80
  // not enough typescript power in this one
79
81
  const fromChild = this.fromChild.bind(this) as unknown;
80
82
  const child = new Process<ChildArgs, ChildState, ChildIM, ChildOM>(fn, pname, fromChild as ProcessMessageCb<ChildOM>);
81
83
  // we don't keep track of what is happening down there
82
- this.children.push(child as unknown as Process<unknown, unknown, Message, ExitMessage>);
84
+ this.children.push(child as unknown as Process<unknown, unknown, Message, Message>);
83
85
  child.start(args);
84
86
  return child;
85
87
  }
86
88
  }
87
89
 
88
- _tick (ret: IteratorResult<State | null, void> | null) {
90
+ _tick () {
89
91
  if (!this.current) {
90
92
  return;
91
93
  }
92
-
93
94
  let msg: InMessage | undefined;
95
+ let ret: IteratorResult<State | null, void> | null = null;
94
96
  while(msg = this.buffer.shift()) {
95
- this._tick(this.current.next(msg));
97
+ ret = this.current.next(msg);
98
+ if (ret.done) {
99
+ break;
100
+ }
96
101
  }
97
102
  this.notify();
103
+ this._eatResult(ret);
104
+ }
105
+
106
+ _eatResult(ret: IteratorResult<State | null, void> | null) {
98
107
  if (ret && ret.done) {
99
108
  this.exitWaiter.resolve();
100
109
  }
@@ -106,7 +115,19 @@ class Process<Args, State, InMessage extends Message, OutMessage extends ExitMes
106
115
 
107
116
  send(msg: InMessage) {
108
117
  this.buffer.push(msg);
109
- defer(()=> this._tick(null));
118
+ this._scheduleTick();
119
+ }
120
+
121
+ tick() {
122
+ this.nextTick?.flush();
123
+ }
124
+
125
+ _scheduleTick() {
126
+ this.nextTick?.cancel();
127
+ this.nextTick = defer(()=> {
128
+ this.nextTick = null;
129
+ this._tick()
130
+ });
110
131
  }
111
132
 
112
133
  notify() {
package/src/util.ts CHANGED
@@ -1,5 +1,5 @@
1
- import type Process from './process';
2
- import type { ProcessCtx, Message } from './process';
1
+ import type Process from './process.js';
2
+ import type { ProcessCtx, Message } from './process.js';
3
3
 
4
4
  function debugLog(level: boolean, ...args: Array<unknown>) {
5
5
  if (level) {
@@ -7,12 +7,12 @@ function debugLog(level: boolean, ...args: Array<unknown>) {
7
7
  }
8
8
  }
9
9
 
10
- type ReducerClosure = (msg: Message) => void;
10
+ type ReducerClosure<M> = (msg: M) => void;
11
11
  type ReadyFn = () => boolean;
12
12
  type NotifyFn = () => void;
13
13
 
14
- function* runDispatch(name: string, fn : ReducerClosure, readyFn: ReadyFn = ()=> false, debugLevel = false) : Generator<null, void, Message> {
15
- let msg: Message;
14
+ function* runDispatch<M>(name: string, fn : ReducerClosure<M>, readyFn: ReadyFn = ()=> false, debugLevel = false) : Generator<null, void, M> {
15
+ let msg: M;
16
16
  while(!readyFn()) {
17
17
  msg = yield null;
18
18
  debugLog(debugLevel, 'msg', name, ' <- ', msg);
@@ -25,7 +25,7 @@ export type ExitMessage = {
25
25
  pid: Symbol;
26
26
  };
27
27
 
28
- function watchExit<Args, State, InMessage extends Message, OutMessage extends ExitMessage>(process: Process<Args, State, InMessage, OutMessage>) {
28
+ function watchExit<Args, State, InMessage extends Message, OutMessage extends (Message | ExitMessage)>(process: Process<Args, State, InMessage, OutMessage>) {
29
29
  return function* (ctx: ProcessCtx<InMessage, OutMessage>, arg0: Args) {
30
30
  yield* process.pgenerator(ctx, arg0);
31
31
  process.toAllChildren({ type: 'STOP' });
@@ -34,15 +34,42 @@ function watchExit<Args, State, InMessage extends Message, OutMessage extends Ex
34
34
  }
35
35
 
36
36
  type DeferCb = () => void;
37
- type Defer = (fn: DeferCb) => void;
37
+ type Defer = (fn: DeferCb) => unknown;
38
+ type Cancel = (taskId: any)=> void;
38
39
  type WindowGlobal = {
39
- setImmediate?: Defer
40
+ setImmediate?: Defer,
41
+ clearImmediate?: Cancel,
42
+ requestIdleCallback?: Defer,
43
+ cancelIdleCallback?: Cancel,
44
+ setTimeout: Defer,
45
+ clearTimeout: Cancel,
40
46
  };
41
47
 
42
- function defer(fn: DeferCb) {
48
+ export type DeferredCall = {
49
+ cancel: ()=> void,
50
+ flush: () => void,
51
+ };
52
+ function defer(fn: DeferCb) : DeferredCall {
43
53
  const g = globalThis as WindowGlobal;
44
- const setDefer = (g.setImmediate || requestIdleCallback) as Defer;
45
- setDefer(fn);
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 };
46
73
  }
47
74
  export type Waiter = {
48
75
  promise: Promise<void>;
package/src/xfetch.ts CHANGED
@@ -1,5 +1,6 @@
1
- import { runDispatch } from './util.js';
2
- import type { ProcessCtx, Message } from './process';
1
+ import { ExitMessage, runDispatch } from './util.js';
2
+ import type Process from './process.js';
3
+ import type { ProcessCtx, Message } from './process.js';
3
4
 
4
5
  function isJsonHelper(res : Response) {
5
6
  const ct = res.headers.get('content-type');
@@ -24,13 +25,18 @@ type FetchArgsSend<T> = {
24
25
  export type FetchArgs<T> = FetchArgsGet | FetchArgsSend<T>;
25
26
 
26
27
  export type FetchMessage<T> = {
27
- type: string,
28
+ type: 'OK',
28
29
  data?: T | null,
29
30
  text?: string | null,
30
- };
31
+ }
32
+ | { type: 'ERROR' | 'LOADING' | 'ABORTED' | 'STOP' }
33
+ | ExitMessage;
31
34
 
32
35
  type FetchGenerator<T, M> = Generator<FetchState<T> | null, void, M>;
33
36
 
37
+ export type FetchProcess<D> = Process<FetchArgs<D>, FetchState<D>, FetchMessage<D>, FetchMessage<D>>;
38
+
39
+
34
40
  function* xfetch<Type>({ pname, toParent, send } : ProcessCtx<FetchMessage<Type>, FetchMessage<Type>>, { method='GET', url, body } : FetchArgs<Type>) : FetchGenerator<Type, FetchMessage<Type>> {
35
41
  const state: FetchState<Type> = { code: 'pending', data: null, text: null };
36
42
  yield state;
@@ -69,7 +75,7 @@ function* xfetch<Type>({ pname, toParent, send } : ProcessCtx<FetchMessage<Type>
69
75
 
70
76
  const isDone = ()=> !(state.code === 'pending' || state.code === 'loading')
71
77
 
72
- yield* runDispatch(pname, (msg : FetchMessage<Type>)=> {
78
+ yield* runDispatch<FetchMessage<Type>>(pname, (msg : FetchMessage<Type>)=> {
73
79
  if (msg.type === 'STOP') {
74
80
  controller.abort();
75
81
  }