@livequery/rpc 2.0.92 → 2.0.96

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.
@@ -0,0 +1,36 @@
1
+ import { catchError, EMPTY, finalize, from, lastValueFrom, mergeMap, Observable, of, Subject, Subscriber, tap } from "rxjs";
2
+ export const LimitConcurrency = (limit = 1) => (target, propertyKey, descriptor) => {
3
+ const originalMethod = descriptor.value;
4
+ const sj = new Subject();
5
+ sj.pipe(mergeMap(async ({ args, o }) => {
6
+ try {
7
+ const result = await originalMethod.apply(target, args);
8
+ const observable = result instanceof Promise ? from(result) : (result instanceof Observable ? result : of(result));
9
+ await lastValueFrom(observable.pipe(tap(data => o.next(data)), catchError(e => {
10
+ o.error(e);
11
+ return EMPTY;
12
+ }), finalize(() => o.complete())), { defaultValue: null });
13
+ }
14
+ catch (e) {
15
+ o.error(e);
16
+ }
17
+ }, limit)).subscribe();
18
+ const ovf = (...args) => {
19
+ const o = new Observable(o => {
20
+ sj.next({ args, o });
21
+ });
22
+ return Object.assign(o, {
23
+ async then(resolve, reject) {
24
+ try {
25
+ const r = await lastValueFrom(o, { defaultValue: null });
26
+ resolve(r);
27
+ }
28
+ catch (e) {
29
+ reject(e);
30
+ }
31
+ }
32
+ });
33
+ };
34
+ return ovf;
35
+ };
36
+ //# sourceMappingURL=LimitConcurrency.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LimitConcurrency.js","sourceRoot":"","sources":["../src/LimitConcurrency.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,aAAa,EAAE,QAAQ,EAAE,UAAU,EAAE,EAAE,EAAE,OAAO,EAAE,UAAU,EAAE,GAAG,EAAE,MAAM,MAAM,CAAA;AAI3H,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAA6C,QAAgB,CAAC,EAAE,EAAE,CAAC,CAAC,MAAW,EAAE,WAAmB,EAAE,UAAsC,EAAE,EAAE;IAC5K,MAAM,cAAc,GAAG,UAAU,CAAC,KAAU,CAAA;IAC5C,MAAM,EAAE,GAAG,IAAI,OAAO,EAAqC,CAAA;IAC3D,EAAE,CAAC,IAAI,CACH,QAAQ,CAAC,KAAK,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,EAAE,EAAE;QAC3B,IAAI,CAAC;YACD,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,KAAK,CAAC,MAAM,EAAE,IAAI,CAAC,CAAA;YACvD,MAAM,UAAU,GAAG,MAAM,YAAY,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,YAAY,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAA;YAClH,MAAM,aAAa,CAAC,UAAU,CAAC,IAAI,CAC/B,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,EACzB,UAAU,CAAC,CAAC,CAAC,EAAE;gBACX,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;gBACV,OAAO,KAAK,CAAA;YAChB,CAAC,CAAC,EACF,QAAQ,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAC/B,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC,CAAA;QAC9B,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACT,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;QACd,CAAC;IACL,CAAC,EAAE,KAAK,CAAC,CACZ,CAAC,SAAS,EAAE,CAAA;IAEb,MAAM,GAAG,GAAG,CAAC,GAAG,IAAW,EAAE,EAAE;QAC3B,MAAM,CAAC,GAAG,IAAI,UAAU,CAAC,CAAC,CAAC,EAAE;YACzB,EAAE,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,CAAA;QACxB,CAAC,CAAC,CAAA;QACF,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE;YACpB,KAAK,CAAC,IAAI,CAAC,OAA6B,EAAE,MAA8B;gBACpE,IAAI,CAAC;oBACD,MAAM,CAAC,GAAG,MAAM,aAAa,CAAC,CAAC,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC,CAAA;oBACxD,OAAO,CAAC,CAAC,CAAC,CAAA;gBACd,CAAC;gBAAC,OAAO,CAAC,EAAE,CAAC;oBACT,MAAM,CAAC,CAAC,CAAC,CAAA;gBACb,CAAC;YACL,CAAC;SACJ,CAAC,CAAA;IACN,CAAC,CAAA;IAED,OAAO,GAAU,CAAA;AACrB,CAAC,CAAA"}
@@ -0,0 +1,4 @@
1
+ import { Subject } from "rxjs";
2
+ export class RpcChannel extends Subject {
3
+ }
4
+ //# sourceMappingURL=RpcChannel.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RpcChannel.js","sourceRoot":"","sources":["../src/RpcChannel.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAA;AAmB9B,MAAM,OAAgB,UAAW,SAAQ,OAAwE;CAEhH"}
@@ -0,0 +1,30 @@
1
+ import { mergeMap, Subject, switchMap } from "rxjs";
2
+ export class RxjsQueue {
3
+ #limit$ = new Subject();
4
+ #task = new Subject();
5
+ constructor(limit) {
6
+ this.#limit$.pipe(switchMap(limit => (this.#task.pipe(mergeMap(async ({ fn, s, r }) => {
7
+ try {
8
+ const data = await fn();
9
+ s(data);
10
+ }
11
+ catch (e) {
12
+ r(e);
13
+ }
14
+ }, limit))))).subscribe();
15
+ limit && limit >= 1 && this.#limit$.next(limit);
16
+ }
17
+ updateLimit(limit) {
18
+ this.#limit$.next(limit);
19
+ }
20
+ run(fn) {
21
+ return new Promise((s, r) => {
22
+ this.#task.next({
23
+ fn,
24
+ s,
25
+ r
26
+ });
27
+ });
28
+ }
29
+ }
30
+ //# sourceMappingURL=RxjsQueue.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RxjsQueue.js","sourceRoot":"","sources":["../src/RxjsQueue.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,MAAM,CAAC;AAIpD,MAAM,OAAO,SAAS;IAElB,OAAO,GAAG,IAAI,OAAO,EAAU,CAAA;IAE/B,KAAK,GAAG,IAAI,OAAO,EAIf,CAAA;IACJ,YAAY,KAAc;QACtB,IAAI,CAAC,OAAO,CAAC,IAAI,CACb,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC,CACf,IAAI,CAAC,KAAK,CAAC,IAAI,CACX,QAAQ,CAAC,KAAK,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE;YAC5B,IAAI,CAAC;gBACD,MAAM,IAAI,GAAG,MAAM,EAAE,EAAE,CAAA;gBACvB,CAAC,CAAC,IAAI,CAAC,CAAA;YACX,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACT,CAAC,CAAC,CAAC,CAAC,CAAA;YACR,CAAC;QACL,CAAC,EAAE,KAAK,CAAC,CACZ,CACJ,CAAC,CACL,CAAC,SAAS,EAAE,CAAA;QACb,KAAK,IAAI,KAAK,IAAI,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;IACnD,CAAC;IAED,WAAW,CAAC,KAAa;QACrB,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;IAC5B,CAAC;IAED,GAAG,CAAC,EAAsB;QACtB,OAAO,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;YACxB,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;gBACZ,EAAE;gBACF,CAAC;gBACD,CAAC;aACJ,CAAC,CAAA;QACN,CAAC,CAAC,CAAA;IACN,CAAC;CACJ"}
@@ -1,11 +1,9 @@
1
- import { Observable } from "rxjs";
2
- import type { RpcChannel } from "./RpcChannel";
3
- import type { WorkerService } from "./WorkerService";
1
+ import type { RpcChannel } from "./RpcChannel.js";
2
+ import type { WorkerService } from "./WorkerService.js";
4
3
  export declare class ServiceLinker {
5
4
  #private;
6
5
  private channel;
7
6
  constructor(channel: RpcChannel);
8
7
  linkService<T>(name: string): WorkerService<T>;
9
- static ready$(services: any): Observable<boolean>;
10
8
  }
11
9
  //# sourceMappingURL=ServiceLinker.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ServiceLinker.d.ts","sourceRoot":"","sources":["../src/ServiceLinker.ts"],"names":[],"mappings":"AAAA,OAAO,EAA8F,UAAU,EAAgB,MAAM,MAAM,CAAC;AAC5I,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAKrD,qBAAa,aAAa;;IAUV,OAAO,CAAC,OAAO;gBAAP,OAAO,EAAE,UAAU;IAkBvC,WAAW,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,GAAG,aAAa,CAAC,CAAC,CAAC;IA6E9C,MAAM,CAAC,MAAM,CAAC,QAAQ,EAAE,GAAG;CAM9B"}
1
+ {"version":3,"file":"ServiceLinker.d.ts","sourceRoot":"","sources":["../src/ServiceLinker.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAKxD,qBAAa,aAAa;;IAUV,OAAO,CAAC,OAAO;gBAAP,OAAO,EAAE,UAAU;IAkBvC,WAAW,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,GAAG,aAAa,CAAC,CAAC,CAAC;CAiFjD"}
@@ -0,0 +1,99 @@
1
+ import { BehaviorSubject, EMPTY, finalize, firstValueFrom, lastValueFrom, merge, Observable, share, Subject, tap } from "rxjs";
2
+ export class ServiceLinker {
3
+ channel;
4
+ #request_id = 1;
5
+ #services = new Map();
6
+ #requests = new Map;
7
+ constructor(channel) {
8
+ this.channel = channel;
9
+ lastValueFrom(merge(this.channel.pipe(tap(e => {
10
+ if (!e.response)
11
+ return;
12
+ const request = this.#requests.get(e.id);
13
+ if (!request)
14
+ return;
15
+ const { completed, data, error } = e.response;
16
+ if (completed || error)
17
+ request.completed = true;
18
+ data && request.o.next(data);
19
+ completed && request.o.complete();
20
+ error && request.o.error(new Error(error));
21
+ }))));
22
+ }
23
+ linkService(name) {
24
+ const cache = this.#services.get(name);
25
+ if (cache)
26
+ return cache;
27
+ const observables = new Map();
28
+ const rpc = (paths, args) => {
29
+ if (paths.length == 0 || paths[0] == '#')
30
+ throw new Error(`Invalid method path: ${paths.join('.')}`);
31
+ const id = this.#request_id++;
32
+ const o = new Subject();
33
+ this.#requests.set(id, { o, completed: false });
34
+ const observable = o.pipe(finalize(() => {
35
+ const request = this.#requests.get(id);
36
+ this.#requests.delete(id);
37
+ if (!request || request.completed)
38
+ return;
39
+ setTimeout(() => {
40
+ this.channel.send({ id: 0, cancel: { id } });
41
+ });
42
+ }));
43
+ setTimeout(() => {
44
+ this.channel.send({
45
+ id,
46
+ request: {
47
+ service: name,
48
+ method: paths,
49
+ args,
50
+ }
51
+ });
52
+ });
53
+ return Object.assign(observable, {
54
+ then(onFulfilled, onRejected) {
55
+ return firstValueFrom(observable, { defaultValue: { data: null } }).then(onFulfilled, onRejected);
56
+ }
57
+ });
58
+ };
59
+ const build = (paths = []) => {
60
+ const fn = (...args) => rpc(paths, args);
61
+ return new Proxy(fn, {
62
+ get: (_, prop) => {
63
+ if (prop == 'then' || typeof prop != 'string')
64
+ return null;
65
+ if (prop == 'pipe' || prop == 'subscribe' || prop == 'getValue') {
66
+ return (...args) => {
67
+ const key = paths.join('.');
68
+ const cache = observables.get(key);
69
+ if (cache)
70
+ return cache;
71
+ const sbj = new BehaviorSubject(null);
72
+ const observable = Object.assign(rpc(paths, args).pipe(share({
73
+ connector: () => sbj,
74
+ resetOnRefCountZero: false,
75
+ resetOnComplete: false,
76
+ resetOnError: false,
77
+ })), {
78
+ getValue: () => sbj.getValue()
79
+ });
80
+ observables.set(key, observable);
81
+ return observable;
82
+ };
83
+ }
84
+ return build([...paths, prop]);
85
+ },
86
+ has(target, prop) {
87
+ if (prop == 'pipe' || prop == 'subscribe' || prop == 'getValue') {
88
+ return true;
89
+ }
90
+ return prop in target;
91
+ }
92
+ });
93
+ };
94
+ const service = build();
95
+ this.#services.set(name, service);
96
+ return service;
97
+ }
98
+ }
99
+ //# sourceMappingURL=ServiceLinker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ServiceLinker.js","sourceRoot":"","sources":["../src/ServiceLinker.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,KAAK,EAAE,QAAQ,EAAE,cAAc,EAAE,aAAa,EAAE,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,MAAM,CAAC;AAO/H,MAAM,OAAO,aAAa;IAUF;IARpB,WAAW,GAAG,CAAC,CAAA;IACf,SAAS,GAAG,IAAI,GAAG,EAAe,CAAA;IAClC,SAAS,GAAG,IAAI,GAGd,CAAA;IAGF,YAAoB,OAAmB;QAAnB,YAAO,GAAP,OAAO,CAAY;QACnC,aAAa,CAAC,KAAK,CACf,IAAI,CAAC,OAAO,CAAC,IAAI,CACb,GAAG,CAAC,CAAC,CAAC,EAAE;YACJ,IAAI,CAAC,CAAC,CAAC,QAAQ;gBAAE,OAAM;YACvB,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAA;YACxC,IAAI,CAAC,OAAO;gBAAE,OAAM;YACpB,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC,QAAQ,CAAA;YAC7C,IAAI,SAAS,IAAI,KAAK;gBAAE,OAAO,CAAC,SAAS,GAAG,IAAI,CAAA;YAChD,IAAI,IAAI,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;YAC5B,SAAS,IAAI,OAAO,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;YAClC,KAAK,IAAI,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,KAAK,CAAC,CAAC,CAAA;QAC9C,CAAC,CAAC,CACL,CACJ,CAAC,CAAA;IAEN,CAAC;IAED,WAAW,CAAI,IAAY;QACvB,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;QACtC,IAAI,KAAK;YAAE,OAAO,KAAK,CAAA;QAEvB,MAAM,WAAW,GAAG,IAAI,GAAG,EAA2B,CAAA;QAEtD,MAAM,GAAG,GAAG,CAAU,KAAe,EAAE,IAAW,EAAyB,EAAE;YACzE,IAAI,KAAK,CAAC,MAAM,IAAI,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,IAAI,GAAG;gBAAE,MAAM,IAAI,KAAK,CAAC,wBAAwB,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;YACpG,MAAM,EAAE,GAAG,IAAI,CAAC,WAAW,EAAE,CAAA;YAC7B,MAAM,CAAC,GAAG,IAAI,OAAO,EAAO,CAAA;YAC5B,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,CAAA;YAC/C,MAAM,UAAU,GAAG,CAAC,CAAC,IAAI,CACrB,QAAQ,CAAC,GAAG,EAAE;gBACV,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;gBACtC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC,CAAA;gBACzB,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,SAAS;oBAAE,OAAM;gBACzC,UAAU,CAAC,GAAG,EAAE;oBACZ,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAA;gBAChD,CAAC,CAAC,CAAA;YACN,CAAC,CAAC,CACL,CAAA;YACD,UAAU,CAAC,GAAG,EAAE;gBACZ,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC;oBACd,EAAE;oBACF,OAAO,EAAE;wBACL,OAAO,EAAE,IAAI;wBACb,MAAM,EAAE,KAAK;wBACb,IAAI;qBACP;iBACJ,CAAC,CAAA;YACN,CAAC,CAAC,CAAA;YACF,OAAO,MAAM,CAAC,MAAM,CAAC,UAAU,EAAE;gBAC7B,IAAI,CAAC,WAAiC,EAAE,UAAiC;oBACrE,OAAO,cAAc,CAAC,UAAU,EAAE,EAAE,YAAY,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,UAAU,CAAC,CAAA;gBACrG,CAAC;aACJ,CAA4B,CAAA;QACjC,CAAC,CAAA;QAED,MAAM,KAAK,GAAG,CAAC,QAAkB,EAAE,EAAE,EAAE;YACnC,MAAM,EAAE,GAAG,CAAC,GAAG,IAAW,EAAE,EAAE,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC,CAAA;YAC/C,OAAO,IAAI,KAAK,CAAC,EAAE,EAAE;gBACjB,GAAG,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE;oBACb,IAAI,IAAI,IAAI,MAAM,IAAI,OAAO,IAAI,IAAI,QAAQ;wBAAE,OAAO,IAAI,CAAA;oBAC1D,IAAI,IAAI,IAAI,MAAM,IAAI,IAAI,IAAI,WAAW,IAAI,IAAI,IAAI,UAAU,EAAE,CAAC;wBAC9D,OAAO,CAAC,GAAG,IAAS,EAAE,EAAE;4BACpB,MAAM,GAAG,GAAG,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;4BAC3B,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;4BAClC,IAAI,KAAK;gCAAE,OAAO,KAAK,CAAA;4BACvB,MAAM,GAAG,GAAG,IAAI,eAAe,CAAC,IAAI,CAAC,CAAA;4BACrC,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,CAC5B,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,IAAI,CACjB,KAAK,CAAC;gCACF,SAAS,EAAE,GAAG,EAAE,CAAC,GAAG;gCACpB,mBAAmB,EAAE,KAAK;gCAC1B,eAAe,EAAE,KAAK;gCACtB,YAAY,EAAE,KAAK;6BACtB,CAAC,CACL,EACD;gCACI,QAAQ,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,QAAQ,EAAE;6BACjC,CACJ,CAAA;4BACD,WAAW,CAAC,GAAG,CAAC,GAAG,EAAE,UAAU,CAAC,CAAA;4BAChC,OAAO,UAAU,CAAA;wBACrB,CAAC,CAAA;oBACL,CAAC;oBACD,OAAO,KAAK,CAAC,CAAC,GAAG,KAAK,EAAE,IAAI,CAAC,CAAC,CAAA;gBAClC,CAAC;gBACD,GAAG,CAAC,MAAM,EAAE,IAAI;oBACZ,IAAI,IAAI,IAAI,MAAM,IAAI,IAAI,IAAI,WAAW,IAAI,IAAI,IAAI,UAAU,EAAE,CAAC;wBAC9D,OAAO,IAAI,CAAA;oBACf,CAAC;oBACD,OAAO,IAAI,IAAI,MAAM,CAAA;gBACzB,CAAC;aACJ,CAAM,CAAA;QACX,CAAC,CAAA;QACD,MAAM,OAAO,GAAG,KAAK,EAAS,CAAA;QAC9B,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,EAAE,OAAO,CAAC,CAAA;QACjC,OAAO,OAAO,CAAA;IAClB,CAAC;CAEJ"}
@@ -1,4 +1,4 @@
1
- import { RpcChannel, type RpcMessage } from "./RpcChannel";
1
+ import { RpcChannel, type RpcMessage } from "./RpcChannel.js";
2
2
  export declare class SharedWorkerChannel extends RpcChannel {
3
3
  #private;
4
4
  private worker?;
@@ -1 +1 @@
1
- {"version":3,"file":"SharedWorkerChannel.d.ts","sourceRoot":"","sources":["../src/SharedWorkerChannel.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,KAAK,UAAU,EAAE,MAAM,cAAc,CAAC;AAI3D,qBAAa,mBAAoB,SAAQ,UAAU;;IAEnC,OAAO,CAAC,MAAM,CAAC;gBAAP,MAAM,CAAC,EAAE,YAAY,YAAA;IA4DzC,IAAI,CAAC,OAAO,EAAE,UAAU,GAAG,IAAI;CAIlC"}
1
+ {"version":3,"file":"SharedWorkerChannel.d.ts","sourceRoot":"","sources":["../src/SharedWorkerChannel.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,KAAK,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAI9D,qBAAa,mBAAoB,SAAQ,UAAU;;IAEnC,OAAO,CAAC,MAAM,CAAC;gBAAP,MAAM,CAAC,EAAE,YAAY,YAAA;IA4DzC,IAAI,CAAC,OAAO,EAAE,UAAU,GAAG,IAAI;CAIlC"}
@@ -0,0 +1,58 @@
1
+ import { catchError, EMPTY, finalize, fromEvent, mergeMap, takeUntil, tap } from "rxjs";
2
+ import { RpcChannel } from "./RpcChannel.js";
3
+ export class SharedWorkerChannel extends RpcChannel {
4
+ worker;
5
+ constructor(worker) {
6
+ super();
7
+ this.worker = worker;
8
+ if (typeof window == 'undefined') {
9
+ this.#initBackground();
10
+ }
11
+ else {
12
+ if (worker) {
13
+ this.#initForegound(worker);
14
+ }
15
+ }
16
+ }
17
+ #initBackground() {
18
+ const me = globalThis;
19
+ fromEvent(me, 'connect').pipe(mergeMap(e => {
20
+ const port = e.ports[0];
21
+ if (!port)
22
+ return EMPTY;
23
+ port.start();
24
+ return fromEvent(port, 'message').pipe(takeUntil(fromEvent(port, 'messageerror')), tap(msg => {
25
+ const respond = (response) => {
26
+ port.postMessage({
27
+ id: msg.data.id,
28
+ response
29
+ });
30
+ };
31
+ this.next({ ...msg.data, respond });
32
+ }), finalize(() => {
33
+ port.close();
34
+ }));
35
+ })).subscribe();
36
+ }
37
+ #initForegound(worker) {
38
+ worker.port.start();
39
+ fromEvent(worker.port, 'message').pipe(takeUntil(fromEvent(worker.port, 'messageerror')), tap(e => {
40
+ const respond = (response) => {
41
+ const msg = {
42
+ id: e.data.id,
43
+ response
44
+ };
45
+ worker.port.postMessage(msg);
46
+ };
47
+ this.next({ ...e.data, respond });
48
+ }), finalize(() => worker.port.close()), catchError(e => {
49
+ return EMPTY;
50
+ })).subscribe();
51
+ }
52
+ send(message) {
53
+ if (!this.worker)
54
+ return;
55
+ this.worker.port.postMessage(message);
56
+ }
57
+ }
58
+ //# sourceMappingURL=SharedWorkerChannel.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SharedWorkerChannel.js","sourceRoot":"","sources":["../src/SharedWorkerChannel.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,EAAE,SAAS,EAAE,GAAG,EAAE,MAAM,MAAM,CAAA;AACvF,OAAO,EAAE,UAAU,EAAmB,MAAM,iBAAiB,CAAC;AAI9D,MAAM,OAAO,mBAAoB,SAAQ,UAAU;IAE3B;IAApB,YAAoB,MAAqB;QACrC,KAAK,EAAE,CAAC;QADQ,WAAM,GAAN,MAAM,CAAe;QAErC,IAAI,OAAO,MAAM,IAAI,WAAW,EAAE,CAAC;YAC/B,IAAI,CAAC,eAAe,EAAE,CAAA;QAC1B,CAAC;aAAM,CAAC;YACJ,IAAI,MAAM,EAAE,CAAC;gBACT,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,CAAA;YAC/B,CAAC;QACL,CAAC;IACL,CAAC;IAGD,eAAe;QACX,MAAM,EAAE,GAAG,UAA4C,CAAA;QACvD,SAAS,CAAe,EAAE,EAAE,SAAS,CAAC,CAAC,IAAI,CACvC,QAAQ,CAAC,CAAC,CAAC,EAAE;YACT,MAAM,IAAI,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;YACvB,IAAI,CAAC,IAAI;gBAAE,OAAO,KAAK,CAAA;YACvB,IAAI,CAAC,KAAK,EAAE,CAAA;YACZ,OAAO,SAAS,CAA2B,IAAI,EAAE,SAAS,CAAC,CAAC,IAAI,CAC5D,SAAS,CAAC,SAAS,CAAC,IAAI,EAAE,cAAc,CAAC,CAAC,EAC1C,GAAG,CAAC,GAAG,CAAC,EAAE;gBACN,MAAM,OAAO,GAAG,CAAC,QAAgC,EAAE,EAAE;oBACjD,IAAI,CAAC,WAAW,CAAC;wBACb,EAAE,EAAE,GAAG,CAAC,IAAI,CAAC,EAAE;wBACf,QAAQ;qBACX,CAAC,CAAA;gBACN,CAAC,CAAA;gBAED,IAAI,CAAC,IAAI,CAAC,EAAE,GAAG,GAAG,CAAC,IAAI,EAAE,OAAO,EAAE,CAAC,CAAA;YACvC,CAAC,CAAC,EACF,QAAQ,CAAC,GAAG,EAAE;gBACV,IAAI,CAAC,KAAK,EAAE,CAAA;YAChB,CAAC,CAAC,CACL,CAAA;QACL,CAAC,CAAC,CACL,CAAC,SAAS,EAAE,CAAA;IACjB,CAAC;IAED,cAAc,CAAC,MAAoB;QAC/B,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,CAAA;QACnB,SAAS,CAA2B,MAAM,CAAC,IAA8B,EAAE,SAAS,CAAC,CAAC,IAAI,CACtF,SAAS,CAAC,SAAS,CAAC,MAAM,CAAC,IAA8B,EAAE,cAAc,CAAC,CAAC,EAC3E,GAAG,CAAC,CAAC,CAAC,EAAE;YACJ,MAAM,OAAO,GAAG,CAAC,QAAgC,EAAE,EAAE;gBACjD,MAAM,GAAG,GAAe;oBACpB,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE;oBACb,QAAQ;iBACX,CAAA;gBACD,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAA;YAChC,CAAC,CAAA;YACD,IAAI,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,OAAO,EAAE,CAAC,CAAA;QACrC,CAAC,CAAC,EACF,QAAQ,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,EACnC,UAAU,CAAC,CAAC,CAAC,EAAE;YACX,OAAO,KAAK,CAAA;QAChB,CAAC,CAAC,CACL,CAAC,SAAS,EAAE,CAAA;IACjB,CAAC;IAED,IAAI,CAAC,OAAmB;QACpB,IAAI,CAAC,IAAI,CAAC,MAAM;YAAE,OAAM;QACxB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,CAAA;IACzC,CAAC;CACJ"}
@@ -0,0 +1,19 @@
1
+ import { BehaviorSubject } from "rxjs";
2
+ export class StorageBehaviorSubject extends BehaviorSubject {
3
+ storage;
4
+ key;
5
+ constructor(storage, key, defaultValue) {
6
+ const value = storage.getItem(key);
7
+ super(value instanceof Promise ? defaultValue : value || defaultValue);
8
+ this.storage = storage;
9
+ this.key = key;
10
+ if (value instanceof Promise) {
11
+ value.then(v => this.next(v ?? defaultValue));
12
+ }
13
+ }
14
+ next(value) {
15
+ super.next(value);
16
+ this.storage.setItem(this.key, value);
17
+ }
18
+ }
19
+ //# sourceMappingURL=StorageBehaviorSubject.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"StorageBehaviorSubject.js","sourceRoot":"","sources":["../src/StorageBehaviorSubject.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,MAAM,CAAA;AAUtC,MAAM,OAAO,sBAA0B,SAAQ,eAAkB;IACzC;IAA2B;IAA/C,YAAoB,OAAiB,EAAU,GAAW,EAAE,YAAe;QACvE,MAAM,KAAK,GAAG,OAAO,CAAC,OAAO,CAAI,GAAG,CAAC,CAAA;QACrC,KAAK,CAAC,KAAK,YAAY,OAAO,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,KAAK,IAAI,YAAY,CAAC,CAAA;QAFtD,YAAO,GAAP,OAAO,CAAU;QAAU,QAAG,GAAH,GAAG,CAAQ;QAGtD,IAAI,KAAK,YAAY,OAAO,EAAE,CAAC;YAC3B,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,YAAY,CAAC,CAAC,CAAA;QACjD,CAAC;IACL,CAAC;IAEQ,IAAI,CAAC,KAAQ;QAClB,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QACjB,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,CAAA;IACzC,CAAC;CACJ"}
@@ -1,4 +1,4 @@
1
- import type { RpcChannel } from "./RpcChannel";
1
+ import type { RpcChannel } from "./RpcChannel.js";
2
2
  export declare class WorkerManager {
3
3
  #private;
4
4
  private channel;
@@ -1 +1 @@
1
- {"version":3,"file":"WorkerManager.d.ts","sourceRoot":"","sources":["../src/WorkerManager.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAM/C,qBAAa,aAAa;;IAoBV,OAAO,CAAC,OAAO;gBAAP,OAAO,EAAE,UAAU;IAoDvC,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG;CAuB3C"}
1
+ {"version":3,"file":"WorkerManager.d.ts","sourceRoot":"","sources":["../src/WorkerManager.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAMlD,qBAAa,aAAa;;IAoBV,OAAO,CAAC,OAAO;gBAAP,OAAO,EAAE,UAAU;IAoDvC,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG;CAQ3C"}
@@ -0,0 +1,73 @@
1
+ import { BehaviorSubject, filter, finalize, map, mergeMap, Subscription } from "rxjs";
2
+ function isObservableLike(value) {
3
+ return !!value && typeof value === 'object' && typeof value.pipe === 'function';
4
+ }
5
+ export class WorkerManager {
6
+ channel;
7
+ #services = new BehaviorSubject(new Map());
8
+ async #call(target, paths, args) {
9
+ const [first, ...rest] = paths;
10
+ if (!first || first == '#')
11
+ throw new Error(`Invalid method path: ${paths.join('.')}`);
12
+ if (rest.length == 0) {
13
+ const prop = target[first];
14
+ if (typeof prop == 'function') {
15
+ return await prop.apply(target, args);
16
+ }
17
+ else {
18
+ return prop;
19
+ }
20
+ }
21
+ return this.#call(target[first], rest, args);
22
+ }
23
+ constructor(channel) {
24
+ this.channel = channel;
25
+ const responses = new Map();
26
+ this.channel.pipe(map(({ id, cancel, request, respond }) => {
27
+ if (cancel) {
28
+ const subscription = responses.get(cancel.id);
29
+ if (subscription) {
30
+ subscription.unsubscribe();
31
+ responses.delete(cancel.id);
32
+ }
33
+ return;
34
+ }
35
+ if (!request)
36
+ return;
37
+ const service = this.#services.getValue().get(request.service);
38
+ if (!service)
39
+ return respond({ error: `Service ${request.service} not found` });
40
+ if (request.method.length == 0 || request.method[0] == '#') {
41
+ respond({ error: `Can not call [${request.service}.${request.method.join('.')}]` });
42
+ return;
43
+ }
44
+ return { request, id, respond, service };
45
+ }), filter(Boolean), map(a => a), mergeMap(async ({ id, request, respond, service }) => {
46
+ try {
47
+ const result = await this.#call(service, request.method, request.args);
48
+ if (isObservableLike(result)) {
49
+ const subscription = result.pipe(finalize(() => {
50
+ responses.delete(id);
51
+ })).subscribe((data) => respond({ data }), (err) => respond({ error: err?.message ?? String(err), completed: true }), () => respond({ completed: true }));
52
+ responses.set(id, subscription);
53
+ }
54
+ else {
55
+ const data = await result;
56
+ respond({ data, completed: true });
57
+ }
58
+ }
59
+ catch (err) {
60
+ respond({
61
+ error: err?.message ?? String(err),
62
+ completed: true
63
+ });
64
+ }
65
+ })).subscribe();
66
+ }
67
+ exposeService(name, service) {
68
+ const services = this.#services.getValue();
69
+ services.set(name, Object.assign(service));
70
+ this.#services.next(services);
71
+ }
72
+ }
73
+ //# sourceMappingURL=WorkerManager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WorkerManager.js","sourceRoot":"","sources":["../src/WorkerManager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=WorkerService.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WorkerService.js","sourceRoot":"","sources":["../src/WorkerService.ts"],"names":[],"mappings":""}
package/dist/index.d.ts CHANGED
@@ -1,9 +1,9 @@
1
- export * from "./RpcChannel";
2
- export * from "./SharedWorkerChannel";
3
- export * from "./ServiceLinker";
4
- export * from "./WorkerService";
5
- export * from './WorkerManager';
6
- export * from './LimitConcurrency';
7
- export * from './StorageBehaviorSubject';
8
- export * from './RxjsQueue';
1
+ export * from "./RpcChannel.js";
2
+ export * from "./SharedWorkerChannel.js";
3
+ export * from "./ServiceLinker.js";
4
+ export * from "./WorkerService.js";
5
+ export * from "./WorkerManager.js";
6
+ export * from "./LimitConcurrency.js";
7
+ export * from "./StorageBehaviorSubject.js";
8
+ export * from "./RxjsQueue.js";
9
9
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAA;AAC5B,cAAc,uBAAuB,CAAA;AACrC,cAAc,iBAAiB,CAAA;AAC/B,cAAc,iBAAiB,CAAA;AAC/B,cAAc,iBAAiB,CAAA;AAC/B,cAAc,oBAAoB,CAAA;AAClC,cAAc,0BAA0B,CAAA;AACxC,cAAc,aAAa,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAA;AAC/B,cAAc,0BAA0B,CAAA;AACxC,cAAc,oBAAoB,CAAA;AAClC,cAAc,oBAAoB,CAAA;AAClC,cAAc,oBAAoB,CAAA;AAClC,cAAc,uBAAuB,CAAA;AACrC,cAAc,6BAA6B,CAAA;AAC3C,cAAc,gBAAgB,CAAA"}