@livequery/rpc 2.0.150 → 2.0.152
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 +16 -0
- package/dist/WorkerManager.d.ts +15 -0
- package/dist/WorkerManager.d.ts.map +1 -1
- package/dist/WorkerManager.js +30 -6
- package/dist/WorkerManager.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -30,6 +30,22 @@ ServiceLinker -- RpcMessage -------> WorkerManager -> service instance
|
|
|
30
30
|
- `ExtensionChannel` transports messages over `chrome.runtime`.
|
|
31
31
|
- `WorkerService<T>` maps a worker-side service type into the client-side type.
|
|
32
32
|
|
|
33
|
+
## Error Handling
|
|
34
|
+
|
|
35
|
+
When a worker-side service method throws (or rejects), `WorkerManager` converts the thrown value into a structured-clone-safe `{ code, message, stack? }` before it crosses the worker boundary — `postMessage` cannot transfer a class `Error`, and a raw object would otherwise surface as `"[object Object]"`. The client rejects with that shape.
|
|
36
|
+
|
|
37
|
+
The helper is exported for reuse and testing:
|
|
38
|
+
|
|
39
|
+
```ts
|
|
40
|
+
import { serializeError } from "@livequery/rpc"
|
|
41
|
+
|
|
42
|
+
serializeError(new Error("boom")) // → { code: "Error", message: "boom", stack: "…" }
|
|
43
|
+
serializeError({ code: "E_CONN" }) // → { code: "E_CONN", message: '{"code":"E_CONN"}' }
|
|
44
|
+
serializeError("nope") // → { code: "InternalError", message: "nope" }
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
It never throws and always returns string `code`/`message`. `code` is taken from `err.code ?? err.name ?? "InternalError"`; `message` from `err.message`, falling back to a JSON of the error's own fields (or `code` when the value is empty / circular / not serializable).
|
|
48
|
+
|
|
33
49
|
## SharedWorker Example
|
|
34
50
|
|
|
35
51
|
### 1. Define a service
|
package/dist/WorkerManager.d.ts
CHANGED
|
@@ -1,4 +1,19 @@
|
|
|
1
1
|
import type { RpcChannel } from "./RpcChannel.js";
|
|
2
|
+
/**
|
|
3
|
+
* Convert any thrown value into the wire-safe `{ code, message, stack }` shape.
|
|
4
|
+
*
|
|
5
|
+
* Fixes the "[object Object]" bug: the old code did `err?.message || String(err)`,
|
|
6
|
+
* so an error with an EMPTY message (e.g. a backend error `{ code, message: '' }`)
|
|
7
|
+
* fell through to `String(obj)` → "[object Object]". We now never stringify the
|
|
8
|
+
* object blindly — we surface its real fields (code/name, JSON of own props) so
|
|
9
|
+
* the main thread receives something legible. Always returns a structured-clone
|
|
10
|
+
* safe plain object, so postMessage can't throw DataCloneError on a class error.
|
|
11
|
+
*/
|
|
12
|
+
export declare function serializeError(err: any): {
|
|
13
|
+
code: string;
|
|
14
|
+
message: string;
|
|
15
|
+
stack?: string;
|
|
16
|
+
};
|
|
2
17
|
export declare class WorkerManager {
|
|
3
18
|
#private;
|
|
4
19
|
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,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;AAMlD;;;;;;;;;GASG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,GAAG,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAe1F;AAMD,qBAAa,aAAa;;IAmBV,OAAO,CAAC,OAAO;gBAAP,OAAO,EAAE,UAAU;IA0EvC,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG;CAQ3C"}
|
package/dist/WorkerManager.js
CHANGED
|
@@ -2,6 +2,34 @@ 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
|
+
/**
|
|
6
|
+
* Convert any thrown value into the wire-safe `{ code, message, stack }` shape.
|
|
7
|
+
*
|
|
8
|
+
* Fixes the "[object Object]" bug: the old code did `err?.message || String(err)`,
|
|
9
|
+
* so an error with an EMPTY message (e.g. a backend error `{ code, message: '' }`)
|
|
10
|
+
* fell through to `String(obj)` → "[object Object]". We now never stringify the
|
|
11
|
+
* object blindly — we surface its real fields (code/name, JSON of own props) so
|
|
12
|
+
* the main thread receives something legible. Always returns a structured-clone
|
|
13
|
+
* safe plain object, so postMessage can't throw DataCloneError on a class error.
|
|
14
|
+
*/
|
|
15
|
+
export function serializeError(err) {
|
|
16
|
+
if (typeof err === 'string')
|
|
17
|
+
return { code: 'InternalError', message: err };
|
|
18
|
+
if (err && typeof err === 'object') {
|
|
19
|
+
const code = String(err.code ?? err.name ?? 'InternalError');
|
|
20
|
+
const message = (typeof err.message === 'string' && err.message) || (() => {
|
|
21
|
+
try {
|
|
22
|
+
const json = JSON.stringify(err);
|
|
23
|
+
return json && json !== '{}' && json !== '[]' ? json : code;
|
|
24
|
+
}
|
|
25
|
+
catch {
|
|
26
|
+
return code;
|
|
27
|
+
}
|
|
28
|
+
})();
|
|
29
|
+
return { code, message, stack: typeof err.stack === 'string' ? err.stack : undefined };
|
|
30
|
+
}
|
|
31
|
+
return { code: 'InternalError', message: String(err) };
|
|
32
|
+
}
|
|
5
33
|
// Prototype-chain props that must never be reachable via a client-supplied method
|
|
6
34
|
// path — blocks `['constructor','constructor']` (Function constructor) and friends.
|
|
7
35
|
const FORBIDDEN_PROPS = new Set(['constructor', 'prototype', '__proto__']);
|
|
@@ -74,7 +102,7 @@ export class WorkerManager {
|
|
|
74
102
|
const subscription = result.pipe(finalize(() => {
|
|
75
103
|
responses.delete(id);
|
|
76
104
|
})).subscribe((data) => respond({ data }), (error) => respond({
|
|
77
|
-
error,
|
|
105
|
+
error: serializeError(error),
|
|
78
106
|
completed: true
|
|
79
107
|
}), () => respond({ completed: true }));
|
|
80
108
|
responses.set(id, { subscription, connection_id });
|
|
@@ -86,11 +114,7 @@ export class WorkerManager {
|
|
|
86
114
|
}
|
|
87
115
|
catch (err) {
|
|
88
116
|
respond({
|
|
89
|
-
error:
|
|
90
|
-
code: err.code || err.name || 'InternalError',
|
|
91
|
-
message: err?.message || String(err),
|
|
92
|
-
stack: err?.stack
|
|
93
|
-
},
|
|
117
|
+
error: serializeError(err),
|
|
94
118
|
completed: true
|
|
95
119
|
});
|
|
96
120
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"WorkerManager.js","sourceRoot":"","sources":["../src/WorkerManager.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"WorkerManager.js","sourceRoot":"","sources":["../src/WorkerManager.ts"],"names":[],"mappings":"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"}
|