posipaki 0.3.4 → 0.5.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/process.d.ts CHANGED
@@ -1,26 +1,23 @@
1
- export type Message = {
1
+ import { ExitMessage } from './util.js';
2
+ export interface Message {
2
3
  type: string;
3
- };
4
- type ExitMessage = {
5
- type: 'EXIT';
6
- pid: Symbol;
7
- };
8
- type ProcessGenerator<ProcessState> = Generator<ProcessState | null, void, Message>;
9
- type Fork = <ChildArgs, ChildState>(fn: ProcessFn<ChildArgs, ChildState>, pname: string) => (args: ChildArgs) => Process<ChildArgs, ChildState>;
10
- export type ProcessFn<Args, State> = (ctx: ProcessCtx, args: Args) => ProcessGenerator<State>;
11
- type ProcessMessageCb = (msg: Message | ExitMessage) => void;
12
- export type ProcessCtx = {
4
+ }
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>;
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> = {
13
10
  pname: string;
14
11
  fork: Fork;
15
- send: (msg: Message) => void;
16
- toParent: ProcessMessageCb;
12
+ send: (msg: IM) => void;
13
+ toParent: ProcessMessageCb<OM>;
17
14
  };
18
15
  type NotifyFn = () => void;
19
- export declare function spawn<Args, State>(fn: ProcessFn<Args, State>, pname: string, toParent?: ProcessMessageCb): (args: Args) => Process<Args, State>;
20
- declare class Process<Args, State> {
21
- pgenerator: ProcessFn<Args, State>;
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> {
18
+ pgenerator: ProcessFn<Args, State, InMessage, OutMessage>;
22
19
  pname: string;
23
- toParent: ProcessMessageCb;
20
+ toParent: ProcessMessageCb<OutMessage>;
24
21
  id: Symbol;
25
22
  state: State | null;
26
23
  private current;
@@ -28,16 +25,16 @@ declare class Process<Args, State> {
28
25
  private children;
29
26
  private subscribers;
30
27
  private exitWaiter;
31
- constructor(fn: ProcessFn<Args, State>, pname: string, toParent: ProcessMessageCb | undefined);
28
+ constructor(fn: ProcessFn<Args, State, InMessage, OutMessage>, pname: string, toParent: ProcessMessageCb<OutMessage> | undefined);
32
29
  start(arg0: Args): void;
33
- fork<ChildArgs, ChildState>(fn: ProcessFn<ChildArgs, ChildState>, pname: string): (args: ChildArgs) => Process<ChildArgs, ChildState>;
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>;
34
31
  _tick(ret: IteratorResult<State | null, void> | null): void;
35
32
  toAllChildren(msg: Message): void;
36
- send(msg: Message): void;
33
+ send(msg: InMessage): void;
37
34
  notify(): void;
38
35
  get isListenedTo(): boolean;
39
36
  subscribe(f: NotifyFn): () => void;
40
37
  wait(): Promise<void>;
41
- fromChild(msg: Message | ExitMessage): void;
38
+ fromChild(msg: InMessage): void;
42
39
  }
43
40
  export default Process;
package/dist/process.js CHANGED
@@ -1,4 +1,5 @@
1
1
  import { watchExit, defer, makeWaiter } from './util.js';
2
+ ;
2
3
  export function spawn(fn, pname, toParent) {
3
4
  return (args) => {
4
5
  const process = new Process(fn, pname, toParent);
@@ -35,7 +36,10 @@ class Process {
35
36
  }
36
37
  fork(fn, pname) {
37
38
  return (args) => {
38
- const child = new Process(fn, pname, this.fromChild.bind(this));
39
+ // not enough typescript power in this one
40
+ const fromChild = this.fromChild.bind(this);
41
+ const child = new Process(fn, pname, fromChild);
42
+ // we don't keep track of what is happening down there
39
43
  this.children.push(child);
40
44
  child.start(args);
41
45
  return child;
@@ -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
@@ -4,7 +4,11 @@ type ReducerClosure = (msg: Message) => void;
4
4
  type ReadyFn = () => boolean;
5
5
  type NotifyFn = () => void;
6
6
  declare function runDispatch(name: string, fn: ReducerClosure, readyFn?: ReadyFn, debugLevel?: boolean): Generator<null, void, Message>;
7
- declare function watchExit<Args, State>(process: Process<Args, State>): (ctx: ProcessCtx, arg0: Args) => Generator<State | null, void, Message>;
7
+ export type ExitMessage = {
8
+ type: 'EXIT';
9
+ pid: Symbol;
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>;
8
12
  type DeferCb = () => void;
9
13
  declare function defer(fn: DeferCb): void;
10
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;AAED,SAAS,SAAS,CAAc,OAA6B;IAC3D,OAAO,QAAQ,CAAC,EAAE,GAAe,EAAE,IAAU;QAC3C,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,EAAC,CAAC,CAAC;IACrD,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,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"}
package/dist/xfetch.d.ts CHANGED
@@ -1,12 +1,25 @@
1
- import type { ProcessCtx, Message } from './process';
1
+ import type { ProcessCtx } from './process';
2
2
  export type FetchState<T> = {
3
3
  code: 'pending' | 'loading' | 'aborted' | 'failed' | 'ok';
4
4
  data: T | null;
5
5
  text: string | null;
6
6
  };
7
- export type FetchArgs = {
7
+ type FetchArgsGet = {
8
8
  url: URL;
9
+ method?: 'GET';
10
+ body?: undefined;
9
11
  };
10
- type FetchGenerator<T> = Generator<FetchState<T> | null, void, Message>;
11
- declare function xfetch<Type>({ pname, toParent, send }: ProcessCtx, { url }: FetchArgs): FetchGenerator<Type>;
12
+ type FetchArgsSend<T> = {
13
+ url: URL;
14
+ method?: 'POST' | 'PUT' | 'PATCH';
15
+ body: T;
16
+ };
17
+ export type FetchArgs<T> = FetchArgsGet | FetchArgsSend<T>;
18
+ type FetchMessage<T> = {
19
+ type: string;
20
+ data?: T | null;
21
+ text?: string | null;
22
+ };
23
+ type FetchGenerator<T, M> = Generator<FetchState<T> | null, void, M>;
24
+ declare function xfetch<Type>({ pname, toParent, send }: ProcessCtx<FetchMessage<Type>, FetchMessage<Type>>, { method, url, body }: FetchArgs<Type>): FetchGenerator<Type, FetchMessage<Type>>;
12
25
  export { xfetch };
package/dist/xfetch.js CHANGED
@@ -12,17 +12,23 @@ function isJsonHelper(res) {
12
12
  const ct = res.headers.get('content-type');
13
13
  return ct === 'application/json';
14
14
  }
15
- function* xfetch({ pname, toParent, send }, { url }) {
15
+ function* xfetch({ pname, toParent, send }, { method = 'GET', url, body }) {
16
16
  const state = { code: 'pending', data: null, text: null };
17
17
  yield state;
18
18
  const controller = new AbortController();
19
19
  const signal = controller.signal;
20
- const toSelf = (msg) => send(msg);
20
+ const toSelf = send;
21
21
  (function do_request() {
22
22
  return __awaiter(this, void 0, void 0, function* () {
23
23
  try {
24
24
  toSelf({ type: 'LOADING' });
25
- const res = yield fetch(url.href, { signal });
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 });
26
32
  if (isJsonHelper(res)) {
27
33
  const data = yield res.json();
28
34
  toSelf({ type: 'OK', data });
@@ -35,11 +41,11 @@ function* xfetch({ pname, toParent, send }, { url }) {
35
41
  catch (e) {
36
42
  const isAborted = (e instanceof DOMException && e.name === 'AbortError');
37
43
  if (isAborted) {
38
- toSelf({ type: 'ABORTED', pname });
44
+ toSelf({ type: 'ABORTED' });
39
45
  }
40
46
  else {
41
47
  //console.log('e', e);
42
- toSelf({ type: 'ERROR', pname });
48
+ toSelf({ type: 'ERROR' });
43
49
  }
44
50
  }
45
51
  });
@@ -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,7 +1,7 @@
1
1
  {
2
2
  "type": "module",
3
3
  "name": "posipaki",
4
- "version": "0.3.4",
4
+ "version": "0.5.0",
5
5
  "main": "./dist/index.js",
6
6
  "types": "./dist/index.d.ts",
7
7
  "scripts": {
package/src/process.ts CHANGED
@@ -1,53 +1,49 @@
1
- import { watchExit, Waiter, defer, makeWaiter } from './util.js';
1
+ import { ExitMessage, watchExit, Waiter, defer, makeWaiter } from './util.js';
2
2
 
3
- export type Message = {
3
+ export interface Message {
4
4
  type: string;
5
5
  };
6
- type ExitMessage = {
7
- type: 'EXIT';
8
- pid: Symbol;
9
- };
10
6
 
11
- type ProcessGenerator<ProcessState> = Generator<ProcessState | null, void, Message>;
12
- type Fork = <ChildArgs, ChildState>(fn : ProcessFn<ChildArgs, ChildState>, pname : string) => (args: ChildArgs) => Process<ChildArgs, ChildState>;
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>;
13
9
 
14
10
 
15
- export type ProcessFn<Args, State> = (ctx: ProcessCtx, args: Args) => ProcessGenerator<State>;
16
- type ProcessMessageCb = (msg: Message | ExitMessage) => void;
11
+ export type ProcessFn<Args, State, InMessage, OutMessage> = (ctx: ProcessCtx<InMessage, OutMessage>, args: Args) => ProcessGenerator<State, InMessage>;
12
+ type ProcessMessageCb<M> = (msg: M) => void;
17
13
 
18
- export type ProcessCtx = {
14
+ export type ProcessCtx<IM, OM> = {
19
15
  pname: string,
20
16
  fork: Fork,
21
- send: (msg: Message) => void,
22
- toParent: ProcessMessageCb,
17
+ send: (msg: IM) => void,
18
+ toParent: ProcessMessageCb<OM>,
23
19
  };
24
20
 
25
21
  type NotifyFn = () => void;
26
22
  type UnsubscibeFn = () => void;
27
23
 
28
- export function spawn<Args, State>(fn: ProcessFn<Args, State>, pname: string, toParent?: ProcessMessageCb) {
29
- return (args: Args): Process<Args, State> => {
30
- const process = new Process(fn, pname, toParent);
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>) {
25
+ return (args: Args): Process<Args, State, InMessage, OutMessage> => {
26
+ const process = new Process<Args, State, InMessage, OutMessage>(fn, pname, toParent);
31
27
  process.start(args);
32
28
  return process;
33
29
  };
34
30
  }
35
31
  const noop = ()=> null;
36
32
 
37
- class Process<Args, State> {
38
- pgenerator: ProcessFn<Args, State>;
33
+ class Process<Args, State, InMessage extends Message, OutMessage extends ExitMessage> {
34
+ pgenerator: ProcessFn<Args, State, InMessage, OutMessage>;
39
35
  pname: string;
40
- toParent: ProcessMessageCb;
36
+ toParent: ProcessMessageCb<OutMessage>;
41
37
  id: Symbol;
42
38
  state: State | null;
43
39
 
44
- private current: ProcessGenerator<State> | null;
45
- private buffer: Array<Message>;
46
- private children: Array<Process<unknown, unknown>>;
40
+ private current: ProcessGenerator<State, InMessage> | null;
41
+ private buffer: Array<InMessage>;
42
+ private children: Array<Process<unknown, unknown, Message, ExitMessage>>;
47
43
  private subscribers: Array<NotifyFn>;
48
44
  private exitWaiter: Waiter;
49
45
 
50
- constructor(fn: ProcessFn<Args, State>, pname: string, toParent: ProcessMessageCb | undefined) {
46
+ constructor(fn: ProcessFn<Args, State, InMessage, OutMessage>, pname: string, toParent: ProcessMessageCb<OutMessage> | undefined) {
51
47
  this.pgenerator = fn;
52
48
  this.pname = pname;
53
49
  this.toParent = toParent || noop;
@@ -64,23 +60,26 @@ class Process<Args, State> {
64
60
  }
65
61
 
66
62
  start(arg0: Args) {
67
- const ctx: ProcessCtx = {
63
+ const ctx: ProcessCtx<InMessage, OutMessage> = {
68
64
  pname: this.pname,
69
65
  fork: this.fork.bind(this),
70
66
  send: this.send.bind(this),
71
67
  toParent: this.toParent,
72
68
  };
73
- const task = watchExit<Args, State>(this)(ctx, arg0);
69
+ const task = watchExit<Args, State, InMessage, OutMessage>(this)(ctx, arg0);
74
70
  this.current = task;
75
71
  let ret = task.next();
76
72
  this.state = ret.value || null;
77
73
  this._tick(task.next());
78
74
  }
79
75
 
80
- fork<ChildArgs, ChildState> (fn : ProcessFn<ChildArgs, ChildState>, pname : string) {
81
- return (args: ChildArgs): Process<ChildArgs, ChildState> => {
82
- const child = new Process<ChildArgs, ChildState>(fn, pname, this.fromChild.bind(this));
83
- this.children.push(child as Process<unknown, unknown>);
76
+ fork<ChildArgs, ChildState, ChildIM extends Message, ChildOM extends ExitMessage> (fn : ProcessFn<ChildArgs, ChildState, ChildIM, ChildOM>, pname : string) {
77
+ return (args: ChildArgs): Process<ChildArgs, ChildState, ChildIM, ChildOM> => {
78
+ // not enough typescript power in this one
79
+ const fromChild = this.fromChild.bind(this) as unknown;
80
+ const child = new Process<ChildArgs, ChildState, ChildIM, ChildOM>(fn, pname, fromChild as ProcessMessageCb<ChildOM>);
81
+ // 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
83
  child.start(args);
85
84
  return child;
86
85
  }
@@ -91,7 +90,7 @@ class Process<Args, State> {
91
90
  return;
92
91
  }
93
92
 
94
- let msg: Message | undefined;
93
+ let msg: InMessage | undefined;
95
94
  while(msg = this.buffer.shift()) {
96
95
  this._tick(this.current.next(msg));
97
96
  }
@@ -105,7 +104,7 @@ class Process<Args, State> {
105
104
  this.children.forEach(p => p.send(msg));
106
105
  }
107
106
 
108
- send(msg: Message) {
107
+ send(msg: InMessage) {
109
108
  this.buffer.push(msg);
110
109
  defer(()=> this._tick(null));
111
110
  }
@@ -133,9 +132,9 @@ class Process<Args, State> {
133
132
  return this.exitWaiter.promise;
134
133
  }
135
134
 
136
- fromChild(msg: Message | ExitMessage) {
135
+ fromChild(msg: InMessage) {
137
136
  if (msg.type === 'EXIT') {
138
- this.children = this.children.filter(p=> p.id !== (msg as ExitMessage).pid);
137
+ this.children = this.children.filter(p=> p.id !== (msg as unknown as ExitMessage).pid);
139
138
  }
140
139
  this.send(msg);
141
140
  }
package/src/util.ts CHANGED
@@ -20,11 +20,16 @@ function* runDispatch(name: string, fn : ReducerClosure, readyFn: ReadyFn = ()=>
20
20
  }
21
21
  }
22
22
 
23
- function watchExit<Args, State>(process: Process<Args, State>) {
24
- return function* (ctx: ProcessCtx, arg0: Args) {
23
+ export type ExitMessage = {
24
+ type: 'EXIT';
25
+ pid: Symbol;
26
+ };
27
+
28
+ function watchExit<Args, State, InMessage extends Message, OutMessage extends ExitMessage>(process: Process<Args, State, InMessage, OutMessage>) {
29
+ return function* (ctx: ProcessCtx<InMessage, OutMessage>, arg0: Args) {
25
30
  yield* process.pgenerator(ctx, arg0);
26
31
  process.toAllChildren({ type: 'STOP' });
27
- process.toParent({ type: 'EXIT', pid: process.id});
32
+ process.toParent({ type: 'EXIT', pid: process.id} as OutMessage);
28
33
  }
29
34
  }
30
35
 
package/src/xfetch.ts CHANGED
@@ -11,30 +11,44 @@ export type FetchState<T> = {
11
11
  data: T | null,
12
12
  text: string | null,
13
13
  };
14
- export type FetchArgs = {
14
+ type FetchArgsGet = {
15
15
  url: URL,
16
+ method?: 'GET',
17
+ body?: undefined,
16
18
  };
19
+ type FetchArgsSend<T> = {
20
+ url: URL,
21
+ method?: 'POST' | 'PUT' | 'PATCH',
22
+ body: T,
23
+ };
24
+ export type FetchArgs<T> = FetchArgsGet | FetchArgsSend<T>;
25
+
17
26
  type FetchMessage<T> = {
18
27
  type: string,
19
28
  data?: T | null,
20
29
  text?: string | null,
21
30
  };
22
31
 
23
- type FetchGenerator<T> = Generator<FetchState<T> | null, void, Message>;
32
+ type FetchGenerator<T, M> = Generator<FetchState<T> | null, void, M>;
24
33
 
25
- function* xfetch<Type>({ pname, toParent, send } : ProcessCtx, { url } : FetchArgs) : FetchGenerator<Type> {
34
+ function* xfetch<Type>({ pname, toParent, send } : ProcessCtx<FetchMessage<Type>, FetchMessage<Type>>, { method='GET', url, body } : FetchArgs<Type>) : FetchGenerator<Type, FetchMessage<Type>> {
26
35
  const state: FetchState<Type> = { code: 'pending', data: null, text: null };
27
36
  yield state;
28
37
 
29
38
  const controller = new AbortController();
30
39
  const signal = controller.signal;
31
40
 
32
- const toSelf = (msg: unknown) => send(msg as Message);
41
+ const toSelf = send;
33
42
 
34
43
  (async function do_request() {
35
44
  try {
36
45
  toSelf({ type: 'LOADING'});
37
- const res: Response = await fetch(url.href, { signal });
46
+ const serializedBody = method === 'GET' ? undefined : JSON.stringify(body);
47
+ const headers = new Headers({});
48
+ if (serializedBody) {
49
+ headers.set('content-type', 'application/json');
50
+ };
51
+ const res: Response = await fetch(url.href, { method, signal, body: serializedBody, headers });
38
52
  if (isJsonHelper(res)) {
39
53
  const data = await res.json();
40
54
  toSelf({ type: 'OK', data });
@@ -45,10 +59,10 @@ function* xfetch<Type>({ pname, toParent, send } : ProcessCtx, { url } : FetchAr
45
59
  } catch (e) {
46
60
  const isAborted = (e instanceof DOMException && e.name === 'AbortError');
47
61
  if (isAborted) {
48
- toSelf({ type: 'ABORTED', pname });
62
+ toSelf({ type: 'ABORTED' });
49
63
  } else {
50
64
  //console.log('e', e);
51
- toSelf({ type: 'ERROR', pname });
65
+ toSelf({ type: 'ERROR' });
52
66
  }
53
67
  }
54
68
  })();