@livequery/rpc 2.0.139 → 2.0.141
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/README.md +2 -1
- package/dist/RpcChannel.d.ts +3 -0
- package/dist/RpcChannel.d.ts.map +1 -1
- package/dist/RpcChannel.js.map +1 -1
- package/dist/ServiceLinker.d.ts.map +1 -1
- package/dist/ServiceLinker.js +9 -2
- package/dist/ServiceLinker.js.map +1 -1
- package/dist/SharedWorkerChannel.d.ts.map +1 -1
- package/dist/SharedWorkerChannel.js +5 -1
- package/dist/SharedWorkerChannel.js.map +1 -1
- package/dist/WorkerManager.d.ts.map +1 -1
- package/dist/WorkerManager.js +23 -9
- package/dist/WorkerManager.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -245,8 +245,9 @@ export * from "./RxjsQueue.js"
|
|
|
245
245
|
- Service paths beginning with `#` are invalid.
|
|
246
246
|
- Worker streams are detected by checking for a `pipe()` method.
|
|
247
247
|
- Falsy values such as `0`, `false`, `""`, and `null` are valid RPC payloads.
|
|
248
|
-
- Errors are propagated to the client as `Error(message)
|
|
248
|
+
- Errors are propagated to the client as `Error(message)`, with the worker-side `stack` preserved on the error for debugging.
|
|
249
249
|
- There is no built-in readiness API in `ServiceLinker`.
|
|
250
|
+
- When a connection (port) drops, the channel emits `{ disconnect: true, connection_id }` so the `WorkerManager` releases any streaming subscriptions owned by that connection.
|
|
250
251
|
|
|
251
252
|
## Development
|
|
252
253
|
|
package/dist/RpcChannel.d.ts
CHANGED
|
@@ -9,14 +9,17 @@ export type RpcMessage = {
|
|
|
9
9
|
cancel?: {
|
|
10
10
|
id: number;
|
|
11
11
|
};
|
|
12
|
+
disconnect?: boolean;
|
|
12
13
|
response?: Partial<{
|
|
13
14
|
data: any;
|
|
14
15
|
error: string;
|
|
16
|
+
stack: string;
|
|
15
17
|
completed: boolean;
|
|
16
18
|
}>;
|
|
17
19
|
};
|
|
18
20
|
export declare abstract class RpcChannel extends Subject<RpcMessage & {
|
|
19
21
|
respond: (msg: RpcMessage['response']) => void;
|
|
22
|
+
connection_id?: string;
|
|
20
23
|
}> {
|
|
21
24
|
abstract send(message: RpcMessage): void;
|
|
22
25
|
}
|
package/dist/RpcChannel.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RpcChannel.d.ts","sourceRoot":"","sources":["../src/RpcChannel.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAA;AAG9B,MAAM,MAAM,UAAU,GAAG;IACrB,EAAE,EAAE,MAAM,CAAA;IACV,OAAO,CAAC,EAAE;QACN,OAAO,EAAE,MAAM,CAAA;QACf,MAAM,EAAE,MAAM,EAAE,CAAA;QAChB,IAAI,EAAE,GAAG,EAAE,CAAA;KACd,CAAA;IACD,MAAM,CAAC,EAAE;QAAE,EAAE,EAAE,MAAM,CAAA;KAAE,CAAA;
|
|
1
|
+
{"version":3,"file":"RpcChannel.d.ts","sourceRoot":"","sources":["../src/RpcChannel.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAA;AAG9B,MAAM,MAAM,UAAU,GAAG;IACrB,EAAE,EAAE,MAAM,CAAA;IACV,OAAO,CAAC,EAAE;QACN,OAAO,EAAE,MAAM,CAAA;QACf,MAAM,EAAE,MAAM,EAAE,CAAA;QAChB,IAAI,EAAE,GAAG,EAAE,CAAA;KACd,CAAA;IACD,MAAM,CAAC,EAAE;QAAE,EAAE,EAAE,MAAM,CAAA;KAAE,CAAA;IAGvB,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB,QAAQ,CAAC,EAAE,OAAO,CAAC;QACf,IAAI,EAAE,GAAG,CAAA;QACT,KAAK,EAAE,MAAM,CAAA;QACb,KAAK,EAAE,MAAM,CAAA;QACb,SAAS,EAAE,OAAO,CAAA;KACrB,CAAC,CAAA;CACL,CAAA;AAGD,8BAAsB,UAAW,SAAQ,OAAO,CAAC,UAAU,GAAG;IAC1D,OAAO,EAAE,CAAC,GAAG,EAAE,UAAU,CAAC,UAAU,CAAC,KAAK,IAAI,CAAA;IAG9C,aAAa,CAAC,EAAE,MAAM,CAAA;CACzB,CAAC;IACE,QAAQ,CAAC,IAAI,CAAC,OAAO,EAAE,UAAU,GAAG,IAAI;CAC3C"}
|
package/dist/RpcChannel.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RpcChannel.js","sourceRoot":"","sources":["../src/RpcChannel.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAA;
|
|
1
|
+
{"version":3,"file":"RpcChannel.js","sourceRoot":"","sources":["../src/RpcChannel.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAA;AAuB9B,MAAM,OAAgB,UAAW,SAAQ,OAKvC;CAED"}
|
|
@@ -1 +1 @@
|
|
|
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;
|
|
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;IAsBvC,WAAW,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,GAAG,aAAa,CAAC,CAAC,CAAC;CAiFjD"}
|
package/dist/ServiceLinker.js
CHANGED
|
@@ -12,12 +12,19 @@ export class ServiceLinker {
|
|
|
12
12
|
const request = this.#requests.get(e.id);
|
|
13
13
|
if (!request)
|
|
14
14
|
return;
|
|
15
|
-
const { completed, data, error } = e.response;
|
|
15
|
+
const { completed, data, error, stack } = e.response;
|
|
16
16
|
if (completed || error)
|
|
17
17
|
request.completed = true;
|
|
18
18
|
if ("data" in e.response)
|
|
19
19
|
request.o.next(data);
|
|
20
|
-
|
|
20
|
+
if (error) {
|
|
21
|
+
const err = new Error(error);
|
|
22
|
+
// Surface the worker-side stack for debugging instead of the (useless)
|
|
23
|
+
// foreground stack pointing at this rxjs callback.
|
|
24
|
+
if (stack)
|
|
25
|
+
err.stack = stack;
|
|
26
|
+
request.o.error(err);
|
|
27
|
+
}
|
|
21
28
|
completed && !error && request.o.complete();
|
|
22
29
|
})).subscribe();
|
|
23
30
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ServiceLinker.js","sourceRoot":"","sources":["../src/ServiceLinker.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,QAAQ,EAAE,cAAc,EAAE,UAAU,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,MAAM,CAAC;AAOlG,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,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;
|
|
1
|
+
{"version":3,"file":"ServiceLinker.js","sourceRoot":"","sources":["../src/ServiceLinker.ts"],"names":[],"mappings":"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"}
|
|
@@ -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,iBAAiB,CAAC;AAI9D,qBAAa,mBAAoB,SAAQ,UAAU;;
|
|
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;;IAInC,OAAO,CAAC,MAAM,CAAC;gBAAP,MAAM,CAAC,EAAE,YAAY,YAAA;IA+DzC,IAAI,CAAC,OAAO,EAAE,UAAU,GAAG,IAAI;CAIlC"}
|
|
@@ -2,6 +2,7 @@ import { catchError, EMPTY, finalize, fromEvent, mergeMap, takeUntil, tap } from
|
|
|
2
2
|
import { RpcChannel } from "./RpcChannel.js";
|
|
3
3
|
export class SharedWorkerChannel extends RpcChannel {
|
|
4
4
|
worker;
|
|
5
|
+
#connection_seq = 0;
|
|
5
6
|
constructor(worker) {
|
|
6
7
|
super();
|
|
7
8
|
this.worker = worker;
|
|
@@ -21,6 +22,7 @@ export class SharedWorkerChannel extends RpcChannel {
|
|
|
21
22
|
if (!port)
|
|
22
23
|
return EMPTY;
|
|
23
24
|
port.start();
|
|
25
|
+
const connection_id = `c${this.#connection_seq++}`;
|
|
24
26
|
return fromEvent(port, 'message').pipe(takeUntil(fromEvent(port, 'messageerror')), tap(msg => {
|
|
25
27
|
const respond = (response) => {
|
|
26
28
|
port.postMessage({
|
|
@@ -28,8 +30,10 @@ export class SharedWorkerChannel extends RpcChannel {
|
|
|
28
30
|
response
|
|
29
31
|
});
|
|
30
32
|
};
|
|
31
|
-
this.next({ ...msg.data, respond });
|
|
33
|
+
this.next({ ...msg.data, respond, connection_id });
|
|
32
34
|
}), finalize(() => {
|
|
35
|
+
// Notify the manager so it can drop subscriptions for this connection.
|
|
36
|
+
this.next({ id: 0, disconnect: true, connection_id, respond: () => undefined });
|
|
33
37
|
port.close();
|
|
34
38
|
}));
|
|
35
39
|
})).subscribe();
|
|
@@ -1 +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;
|
|
1
|
+
{"version":3,"file":"SharedWorkerChannel.js","sourceRoot":"","sources":["../src/SharedWorkerChannel.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"WorkerManager.d.ts","sourceRoot":"","sources":["../src/WorkerManager.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"WorkerManager.d.ts","sourceRoot":"","sources":["../src/WorkerManager.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAUlD,qBAAa,aAAa;;IAqBV,OAAO,CAAC,OAAO;gBAAP,OAAO,EAAE,UAAU;IA8DvC,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG;CAQ3C"}
|
package/dist/WorkerManager.js
CHANGED
|
@@ -2,12 +2,15 @@ import { BehaviorSubject, filter, finalize, map, mergeMap, Subscription } from "
|
|
|
2
2
|
function isObservableLike(value) {
|
|
3
3
|
return !!value && typeof value === 'object' && typeof value.pipe === 'function';
|
|
4
4
|
}
|
|
5
|
+
// Prototype-chain props that must never be reachable via a client-supplied method
|
|
6
|
+
// path — blocks `['constructor','constructor']` (Function constructor) and friends.
|
|
7
|
+
const FORBIDDEN_PROPS = new Set(['constructor', 'prototype', '__proto__']);
|
|
5
8
|
export class WorkerManager {
|
|
6
9
|
channel;
|
|
7
10
|
#services = new BehaviorSubject(new Map());
|
|
8
11
|
async #call(target, paths, args) {
|
|
9
12
|
const [first, ...rest] = paths;
|
|
10
|
-
if (!first || first == '#')
|
|
13
|
+
if (!first || first == '#' || FORBIDDEN_PROPS.has(first))
|
|
11
14
|
throw new Error(`Invalid method path: ${paths.join('.')}`);
|
|
12
15
|
if (target == null)
|
|
13
16
|
throw new Error(`Invalid method path: ${paths.join('.')}`);
|
|
@@ -25,11 +28,21 @@ export class WorkerManager {
|
|
|
25
28
|
constructor(channel) {
|
|
26
29
|
this.channel = channel;
|
|
27
30
|
const responses = new Map();
|
|
28
|
-
this.channel.pipe(map(({ id, cancel, request, respond }) => {
|
|
31
|
+
this.channel.pipe(map(({ id, cancel, request, respond, disconnect, connection_id }) => {
|
|
32
|
+
if (disconnect) {
|
|
33
|
+
// A connection dropped — release every streaming subscription it owned.
|
|
34
|
+
for (const [response_id, entry] of responses) {
|
|
35
|
+
if (entry.connection_id !== connection_id)
|
|
36
|
+
continue;
|
|
37
|
+
entry.subscription.unsubscribe();
|
|
38
|
+
responses.delete(response_id);
|
|
39
|
+
}
|
|
40
|
+
return;
|
|
41
|
+
}
|
|
29
42
|
if (cancel) {
|
|
30
|
-
const
|
|
31
|
-
if (
|
|
32
|
-
subscription.unsubscribe();
|
|
43
|
+
const entry = responses.get(cancel.id);
|
|
44
|
+
if (entry) {
|
|
45
|
+
entry.subscription.unsubscribe();
|
|
33
46
|
responses.delete(cancel.id);
|
|
34
47
|
}
|
|
35
48
|
return;
|
|
@@ -43,15 +56,15 @@ export class WorkerManager {
|
|
|
43
56
|
respond({ error: `Can not call [${request.service}.${request.method.join('.')}]` });
|
|
44
57
|
return;
|
|
45
58
|
}
|
|
46
|
-
return { request, id, respond, service };
|
|
47
|
-
}), filter(Boolean), map(a => a), mergeMap(async ({ id, request, respond, service }) => {
|
|
59
|
+
return { request, id, respond, service, connection_id };
|
|
60
|
+
}), filter(Boolean), map(a => a), mergeMap(async ({ id, request, respond, service, connection_id }) => {
|
|
48
61
|
try {
|
|
49
62
|
const result = await this.#call(service, request.method, request.args);
|
|
50
63
|
if (isObservableLike(result)) {
|
|
51
64
|
const subscription = result.pipe(finalize(() => {
|
|
52
65
|
responses.delete(id);
|
|
53
|
-
})).subscribe((data) => respond({ data }), (err) => respond({ error: err?.message ?? String(err), completed: true }), () => respond({ completed: true }));
|
|
54
|
-
responses.set(id, subscription);
|
|
66
|
+
})).subscribe((data) => respond({ data }), (err) => respond({ error: err?.message ?? String(err), stack: err?.stack, completed: true }), () => respond({ completed: true }));
|
|
67
|
+
responses.set(id, { subscription, connection_id });
|
|
55
68
|
}
|
|
56
69
|
else {
|
|
57
70
|
const data = await result;
|
|
@@ -61,6 +74,7 @@ export class WorkerManager {
|
|
|
61
74
|
catch (err) {
|
|
62
75
|
respond({
|
|
63
76
|
error: err?.message ?? String(err),
|
|
77
|
+
stack: err?.stack,
|
|
64
78
|
completed: true
|
|
65
79
|
});
|
|
66
80
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"WorkerManager.js","sourceRoot":"","sources":["../src/WorkerManager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,MAAM,CAAC;AAGtF,SAAS,gBAAgB,CAAC,KAAc;IACpC,OAAO,CAAC,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,OAAQ,KAAa,CAAC,IAAI,KAAK,UAAU,CAAA;AAC5F,CAAC;AAED,MAAM,OAAO,aAAa;IAqBF;IAnBpB,SAAS,GAAG,IAAI,eAAe,CAAC,IAAI,GAAG,EAAe,CAAC,CAAA;IAIvD,KAAK,CAAC,KAAK,CAAI,MAAW,EAAE,KAAe,EAAE,IAAW;QACpD,MAAM,CAAC,KAAK,EAAE,GAAG,IAAI,CAAC,GAAG,KAAK,CAAA;QAC9B,IAAI,CAAC,KAAK,IAAI,KAAK,IAAI,GAAG;YAAE,MAAM,IAAI,KAAK,CAAC,wBAAwB,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;
|
|
1
|
+
{"version":3,"file":"WorkerManager.js","sourceRoot":"","sources":["../src/WorkerManager.ts"],"names":[],"mappings":"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"}
|