@cyia/chrome-trpc 1.0.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/client/index.js +210 -0
- package/client/index.js.map +7 -0
- package/client/index.mjs +185 -0
- package/client/index.mjs.map +7 -0
- package/package.json +54 -0
- package/readme.md +192 -0
- package/readme.zh-hans.md +192 -0
- package/server/index.js +352 -0
- package/server/index.js.map +7 -0
- package/server/index.mjs +338 -0
- package/server/index.mjs.map +7 -0
package/server/index.mjs
ADDED
|
@@ -0,0 +1,338 @@
|
|
|
1
|
+
// packages/trpc/server/handleChromeMessage.ts
|
|
2
|
+
import {
|
|
3
|
+
callTRPCProcedure,
|
|
4
|
+
transformTRPCResponse,
|
|
5
|
+
TRPCError as TRPCError2
|
|
6
|
+
} from "@trpc/server";
|
|
7
|
+
import {
|
|
8
|
+
isObservable,
|
|
9
|
+
observableToAsyncIterable
|
|
10
|
+
} from "@trpc/server/observable";
|
|
11
|
+
import { getErrorShape } from "@trpc/server/shared";
|
|
12
|
+
|
|
13
|
+
// packages/trpc/server/utils.ts
|
|
14
|
+
import { TRPCError } from "@trpc/server";
|
|
15
|
+
function getTRPCErrorFromUnknown(cause) {
|
|
16
|
+
if (cause instanceof TRPCError) {
|
|
17
|
+
return cause;
|
|
18
|
+
}
|
|
19
|
+
const error = getErrorFromUnknown(cause);
|
|
20
|
+
const trpcError = new TRPCError({
|
|
21
|
+
code: "INTERNAL_SERVER_ERROR",
|
|
22
|
+
cause: error,
|
|
23
|
+
message: error.message
|
|
24
|
+
});
|
|
25
|
+
trpcError.stack = error.stack;
|
|
26
|
+
return trpcError;
|
|
27
|
+
}
|
|
28
|
+
function getErrorFromUnknown(cause) {
|
|
29
|
+
if (cause instanceof Error) {
|
|
30
|
+
return cause;
|
|
31
|
+
}
|
|
32
|
+
if (typeof cause === "string") {
|
|
33
|
+
return new Error(cause);
|
|
34
|
+
}
|
|
35
|
+
return new Error("Unknown error");
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
// packages/trpc/server/handleChromeMessage.ts
|
|
39
|
+
import {
|
|
40
|
+
isAsyncIterable,
|
|
41
|
+
isTrackedEnvelope,
|
|
42
|
+
iteratorResource,
|
|
43
|
+
run,
|
|
44
|
+
Unpromise
|
|
45
|
+
} from "@trpc/server/unstable-core-do-not-import";
|
|
46
|
+
|
|
47
|
+
// packages/trpc/util/json.ts
|
|
48
|
+
import { SuperJSON } from "superjson";
|
|
49
|
+
import { compress, uncompress } from "snappyjs";
|
|
50
|
+
import { getParser } from "bowser";
|
|
51
|
+
var DefaultSuperJSON = class {
|
|
52
|
+
superJson;
|
|
53
|
+
constructor() {
|
|
54
|
+
this.superJson = new SuperJSON();
|
|
55
|
+
}
|
|
56
|
+
};
|
|
57
|
+
var CompressSuperJSON = class {
|
|
58
|
+
superJson;
|
|
59
|
+
constructor() {
|
|
60
|
+
this.superJson = new SuperJSON();
|
|
61
|
+
}
|
|
62
|
+
};
|
|
63
|
+
var defaultSuperJSON = new DefaultSuperJSON();
|
|
64
|
+
var compressSuperJSON = new CompressSuperJSON();
|
|
65
|
+
function uint8ArrayToBase64(bytes) {
|
|
66
|
+
return btoa(new TextDecoder("iso-8859-1").decode(bytes));
|
|
67
|
+
}
|
|
68
|
+
function base64ToUint8Array(base64) {
|
|
69
|
+
return Uint8Array.from(atob(base64), (c) => c.charCodeAt(0));
|
|
70
|
+
}
|
|
71
|
+
function jsonToUint8Array(obj) {
|
|
72
|
+
return new TextEncoder().encode(JSON.stringify(obj));
|
|
73
|
+
}
|
|
74
|
+
function uint8ArrayToJson(data) {
|
|
75
|
+
return JSON.parse(new TextDecoder().decode(data));
|
|
76
|
+
}
|
|
77
|
+
function initJsonConvert() {
|
|
78
|
+
const useStructuredClone = chrome.runtime.getManifest()["message_serialization"] === "structured_clone" && getParser(navigator.userAgent, navigator.userAgentData).satisfies({
|
|
79
|
+
chrome: ">=148.0.0.0"
|
|
80
|
+
});
|
|
81
|
+
const isApplicable = (v) => v instanceof Uint8Array;
|
|
82
|
+
const defaultConfig = {
|
|
83
|
+
serialize: useStructuredClone ? (v) => v : (v) => uint8ArrayToBase64(v),
|
|
84
|
+
deserialize: useStructuredClone ? (v) => v : (v) => base64ToUint8Array(v),
|
|
85
|
+
isApplicable
|
|
86
|
+
};
|
|
87
|
+
const compressConfig = {
|
|
88
|
+
serialize: useStructuredClone ? (v) => compress(v) : (v) => uint8ArrayToBase64(compress(v)),
|
|
89
|
+
deserialize: useStructuredClone ? (v) => uncompress(v) : (v) => uncompress(base64ToUint8Array(v)),
|
|
90
|
+
isApplicable
|
|
91
|
+
};
|
|
92
|
+
defaultSuperJSON.superJson.registerCustom(
|
|
93
|
+
defaultConfig,
|
|
94
|
+
"0" /* unit8array */
|
|
95
|
+
);
|
|
96
|
+
compressSuperJSON.superJson.registerCustom(
|
|
97
|
+
compressConfig,
|
|
98
|
+
"0" /* unit8array */
|
|
99
|
+
);
|
|
100
|
+
}
|
|
101
|
+
function serialize(object, compress2) {
|
|
102
|
+
if (!compress2) {
|
|
103
|
+
return defaultSuperJSON.superJson.serialize(object);
|
|
104
|
+
}
|
|
105
|
+
const result = compressSuperJSON.superJson.serialize(object);
|
|
106
|
+
result.__compress = true;
|
|
107
|
+
if (result.meta?.values) {
|
|
108
|
+
if (Array.isArray(result.meta?.values)) {
|
|
109
|
+
if (result.meta.values[0][1] === "0" /* unit8array */) {
|
|
110
|
+
return result;
|
|
111
|
+
}
|
|
112
|
+
} else {
|
|
113
|
+
const list = Object.values(result.meta.values);
|
|
114
|
+
if (list.some((item) => Array.isArray(item[0]))) {
|
|
115
|
+
return result;
|
|
116
|
+
} else {
|
|
117
|
+
return uint8ArrayToBase64(jsonToUint8Array(result));
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
return result;
|
|
122
|
+
}
|
|
123
|
+
function deserialize(payload) {
|
|
124
|
+
if (typeof payload === "string") {
|
|
125
|
+
payload = uint8ArrayToJson(base64ToUint8Array(payload));
|
|
126
|
+
}
|
|
127
|
+
return payload.__compress ? compressSuperJSON.superJson.deserialize(payload, { inPlace: true }) : defaultSuperJSON.superJson.deserialize(payload, { inPlace: true });
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
// packages/trpc/server/handleChromeMessage.ts
|
|
131
|
+
async function handleChromeMessage({
|
|
132
|
+
router,
|
|
133
|
+
createContext,
|
|
134
|
+
message,
|
|
135
|
+
subscriptions,
|
|
136
|
+
compressPathObj,
|
|
137
|
+
port
|
|
138
|
+
}) {
|
|
139
|
+
const internalId = message.id;
|
|
140
|
+
if (message.method === "subscription.stop") {
|
|
141
|
+
subscriptions.get(internalId)?.abort();
|
|
142
|
+
subscriptions.delete(internalId);
|
|
143
|
+
return;
|
|
144
|
+
}
|
|
145
|
+
const { type, input: serializedInput, path } = message.operation;
|
|
146
|
+
const id = internalId;
|
|
147
|
+
const input = serializedInput != null ? router._def._config.transformer.input.deserialize(serializedInput) : void 0;
|
|
148
|
+
const ctx = await createContext?.() ?? {};
|
|
149
|
+
const respond = (response) => {
|
|
150
|
+
const message2 = transformTRPCResponse(router._def._config, response);
|
|
151
|
+
if (message2.result && "data" in message2.result) {
|
|
152
|
+
message2.result.data = serialize(
|
|
153
|
+
message2.result.data,
|
|
154
|
+
compressPathObj?.[path]
|
|
155
|
+
);
|
|
156
|
+
}
|
|
157
|
+
port.postMessage(message2);
|
|
158
|
+
};
|
|
159
|
+
try {
|
|
160
|
+
const abortController = new AbortController();
|
|
161
|
+
const result = await callTRPCProcedure({
|
|
162
|
+
ctx,
|
|
163
|
+
path,
|
|
164
|
+
router,
|
|
165
|
+
getRawInput: async () => input,
|
|
166
|
+
type,
|
|
167
|
+
signal: abortController.signal,
|
|
168
|
+
batchIndex: 0
|
|
169
|
+
});
|
|
170
|
+
const isIterableResult = isAsyncIterable(result) || isObservable(result);
|
|
171
|
+
if (type !== "subscription") {
|
|
172
|
+
if (isIterableResult) {
|
|
173
|
+
throw new TRPCError2({
|
|
174
|
+
code: "UNSUPPORTED_MEDIA_TYPE",
|
|
175
|
+
message: `Cannot return an async iterable or observable from a ${type} procedure with WebSockets`
|
|
176
|
+
});
|
|
177
|
+
}
|
|
178
|
+
respond({
|
|
179
|
+
id,
|
|
180
|
+
result: {
|
|
181
|
+
type: "data",
|
|
182
|
+
data: result
|
|
183
|
+
}
|
|
184
|
+
});
|
|
185
|
+
return;
|
|
186
|
+
}
|
|
187
|
+
if (!isIterableResult) {
|
|
188
|
+
throw new TRPCError2({
|
|
189
|
+
message: `Subscription ${path} did not return an observable or a AsyncGenerator`,
|
|
190
|
+
code: "INTERNAL_SERVER_ERROR"
|
|
191
|
+
});
|
|
192
|
+
}
|
|
193
|
+
if (subscriptions.has(internalId)) {
|
|
194
|
+
throw new TRPCError2({
|
|
195
|
+
message: `Duplicate id ${internalId}`,
|
|
196
|
+
code: "BAD_REQUEST"
|
|
197
|
+
});
|
|
198
|
+
}
|
|
199
|
+
const iterable = isObservable(result) ? observableToAsyncIterable(result, abortController.signal) : result;
|
|
200
|
+
run(async () => {
|
|
201
|
+
await using iterator = iteratorResource(iterable);
|
|
202
|
+
const abortPromise = new Promise((resolve) => {
|
|
203
|
+
abortController.signal.onabort = () => resolve("abort");
|
|
204
|
+
});
|
|
205
|
+
let next;
|
|
206
|
+
let result2;
|
|
207
|
+
while (true) {
|
|
208
|
+
next = await Unpromise.race([
|
|
209
|
+
iterator.next().catch(getTRPCErrorFromUnknown),
|
|
210
|
+
abortPromise
|
|
211
|
+
]);
|
|
212
|
+
if (next === "abort") {
|
|
213
|
+
await iterator.return?.();
|
|
214
|
+
break;
|
|
215
|
+
}
|
|
216
|
+
if (next instanceof Error) {
|
|
217
|
+
const error = getTRPCErrorFromUnknown(next);
|
|
218
|
+
respond({
|
|
219
|
+
id,
|
|
220
|
+
error: getErrorShape({
|
|
221
|
+
config: router._def._config,
|
|
222
|
+
error,
|
|
223
|
+
type,
|
|
224
|
+
path,
|
|
225
|
+
input,
|
|
226
|
+
ctx
|
|
227
|
+
})
|
|
228
|
+
});
|
|
229
|
+
break;
|
|
230
|
+
}
|
|
231
|
+
if (next.done) {
|
|
232
|
+
break;
|
|
233
|
+
}
|
|
234
|
+
result2 = {
|
|
235
|
+
type: "data",
|
|
236
|
+
data: next.value
|
|
237
|
+
};
|
|
238
|
+
if (isTrackedEnvelope(next.value)) {
|
|
239
|
+
const [id2, data] = next.value;
|
|
240
|
+
result2.id = id2;
|
|
241
|
+
result2.data = {
|
|
242
|
+
id: id2,
|
|
243
|
+
data
|
|
244
|
+
};
|
|
245
|
+
}
|
|
246
|
+
respond({
|
|
247
|
+
id,
|
|
248
|
+
result: result2
|
|
249
|
+
});
|
|
250
|
+
next = null;
|
|
251
|
+
result2 = null;
|
|
252
|
+
}
|
|
253
|
+
respond({
|
|
254
|
+
id,
|
|
255
|
+
result: {
|
|
256
|
+
type: "stopped"
|
|
257
|
+
}
|
|
258
|
+
});
|
|
259
|
+
subscriptions.delete(internalId);
|
|
260
|
+
}).catch((cause) => {
|
|
261
|
+
const error = getTRPCErrorFromUnknown(cause);
|
|
262
|
+
respond({
|
|
263
|
+
id,
|
|
264
|
+
error: getErrorShape({
|
|
265
|
+
config: router._def._config,
|
|
266
|
+
error,
|
|
267
|
+
type,
|
|
268
|
+
path,
|
|
269
|
+
input,
|
|
270
|
+
ctx
|
|
271
|
+
})
|
|
272
|
+
});
|
|
273
|
+
abortController.abort();
|
|
274
|
+
});
|
|
275
|
+
respond({
|
|
276
|
+
id,
|
|
277
|
+
result: {
|
|
278
|
+
type: "started"
|
|
279
|
+
}
|
|
280
|
+
});
|
|
281
|
+
subscriptions.set(internalId, abortController);
|
|
282
|
+
} catch (cause) {
|
|
283
|
+
const error = getTRPCErrorFromUnknown(cause);
|
|
284
|
+
return respond({
|
|
285
|
+
id,
|
|
286
|
+
error: getErrorShape({
|
|
287
|
+
config: router._def._config,
|
|
288
|
+
error,
|
|
289
|
+
type,
|
|
290
|
+
path,
|
|
291
|
+
input,
|
|
292
|
+
ctx
|
|
293
|
+
})
|
|
294
|
+
});
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
|
|
298
|
+
// packages/trpc/server/createChromeHandler.ts
|
|
299
|
+
var ChromeHandler = class {
|
|
300
|
+
constructor(options) {
|
|
301
|
+
this.options = options;
|
|
302
|
+
this.init();
|
|
303
|
+
}
|
|
304
|
+
options;
|
|
305
|
+
#getWebviewSubscription() {
|
|
306
|
+
return /* @__PURE__ */ new Map();
|
|
307
|
+
}
|
|
308
|
+
init() {
|
|
309
|
+
initJsonConvert();
|
|
310
|
+
chrome.runtime.onConnect.addListener((port) => {
|
|
311
|
+
const fn = (message) => {
|
|
312
|
+
handleChromeMessage({
|
|
313
|
+
router: this.options.router,
|
|
314
|
+
createContext: this.options.createContext,
|
|
315
|
+
message: {
|
|
316
|
+
...message,
|
|
317
|
+
operation: {
|
|
318
|
+
...message.operation,
|
|
319
|
+
input: deserialize(message.operation.input)
|
|
320
|
+
}
|
|
321
|
+
},
|
|
322
|
+
subscriptions: this.#getWebviewSubscription(),
|
|
323
|
+
port,
|
|
324
|
+
compressPathObj: this.options.compressPathObj
|
|
325
|
+
});
|
|
326
|
+
};
|
|
327
|
+
port.onMessage.addListener(fn);
|
|
328
|
+
port.onDisconnect.addListener(() => {
|
|
329
|
+
port.onMessage.removeListener(fn);
|
|
330
|
+
});
|
|
331
|
+
});
|
|
332
|
+
}
|
|
333
|
+
};
|
|
334
|
+
var createChromeHandler = (options) => new ChromeHandler(options);
|
|
335
|
+
export {
|
|
336
|
+
createChromeHandler
|
|
337
|
+
};
|
|
338
|
+
//# sourceMappingURL=index.mjs.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../packages/trpc/server/handleChromeMessage.ts", "../../../packages/trpc/server/utils.ts", "../../../packages/trpc/util/json.ts", "../../../packages/trpc/server/createChromeHandler.ts"],
|
|
4
|
+
"sourcesContent": ["import {\n callTRPCProcedure,\n transformTRPCResponse,\n TRPCError,\n} from '@trpc/server';\nimport type { AnyTRPCRouter, inferRouterContext } from '@trpc/server';\nimport type { TRPCResponseMessage, TRPCResultMessage } from '@trpc/server/rpc';\nimport {\n isObservable,\n observableToAsyncIterable,\n} from '@trpc/server/observable';\nimport { getErrorShape } from '@trpc/server/shared';\nimport { getTRPCErrorFromUnknown } from './utils';\nimport { Message } from '../type';\nimport {\n isAsyncIterable,\n isTrackedEnvelope,\n iteratorResource,\n run,\n Unpromise,\n} from '@trpc/server/unstable-core-do-not-import';\nimport { serialize } from '../util/json';\n\nexport async function handleChromeMessage<TRouter extends AnyTRPCRouter>({\n router,\n createContext,\n message,\n subscriptions,\n compressPathObj,\n port,\n}: {\n router: TRouter;\n createContext?: () => Promise<inferRouterContext<TRouter>>;\n message: Message;\n subscriptions: Map<string, AbortController>;\n compressPathObj?: Record<string, boolean>;\n port: chrome.runtime.Port;\n}) {\n const internalId = message.id;\n if (message.method === 'subscription.stop') {\n subscriptions.get(internalId)?.abort();\n subscriptions.delete(internalId);\n return;\n }\n\n const { type, input: serializedInput, path } = message.operation;\n const id = internalId;\n\n const input =\n serializedInput != null\n ? router._def._config.transformer.input.deserialize(serializedInput)\n : undefined;\n\n const ctx = (await createContext?.()) ?? {};\n\n const respond = (response: TRPCResponseMessage) => {\n const message = transformTRPCResponse(router._def._config, response);\n if ((message as any).result && 'data' in (message as any).result) {\n (message as any).result.data = serialize(\n (message as any).result.data,\n compressPathObj?.[path],\n );\n }\n port.postMessage(message);\n };\n try {\n const abortController = new AbortController();\n // 函数请求\n const result = await callTRPCProcedure({\n ctx,\n path,\n router: router,\n getRawInput: async () => input,\n type,\n signal: abortController.signal,\n batchIndex: 0,\n });\n\n const isIterableResult = isAsyncIterable(result) || isObservable(result);\n // 普通的请求\n if (type !== 'subscription') {\n if (isIterableResult) {\n throw new TRPCError({\n code: 'UNSUPPORTED_MEDIA_TYPE',\n message: `Cannot return an async iterable or observable from a ${type} procedure with WebSockets`,\n });\n }\n // send the value as data if the method is not a subscription\n respond({\n id,\n result: {\n type: 'data',\n data: result,\n },\n });\n return;\n }\n\n if (!isIterableResult) {\n throw new TRPCError({\n message: `Subscription ${path} did not return an observable or a AsyncGenerator`,\n code: 'INTERNAL_SERVER_ERROR',\n });\n }\n if (subscriptions.has(internalId)) {\n // duplicate request ids for client\n\n throw new TRPCError({\n message: `Duplicate id ${internalId}`,\n code: 'BAD_REQUEST',\n });\n }\n // 订阅请求\n const iterable = isObservable(result)\n ? observableToAsyncIterable(result, abortController.signal)\n : result;\n\n run(async () => {\n await using iterator = iteratorResource(iterable);\n\n const abortPromise = new Promise<'abort'>((resolve) => {\n abortController.signal.onabort = () => resolve('abort');\n });\n // We need those declarations outside the loop for garbage collection reasons. If they\n // were declared inside, they would not be freed until the next value is present.\n let next:\n | null\n | TRPCError\n | Awaited<typeof abortPromise | ReturnType<(typeof iterator)['next']>>;\n let result: null | TRPCResultMessage<unknown>['result'];\n\n while (true) {\n next = await Unpromise.race([\n iterator.next().catch(getTRPCErrorFromUnknown),\n abortPromise,\n ]);\n\n if (next === 'abort') {\n await iterator.return?.();\n break;\n }\n if (next instanceof Error) {\n const error = getTRPCErrorFromUnknown(next);\n respond({\n id,\n error: getErrorShape({\n config: router._def._config,\n error,\n type,\n path,\n input,\n ctx,\n }),\n });\n break;\n }\n if (next.done) {\n break;\n }\n\n result = {\n type: 'data',\n data: next.value,\n };\n\n if (isTrackedEnvelope(next.value)) {\n const [id, data] = next.value;\n result.id = id;\n result.data = {\n id,\n data,\n };\n }\n\n respond({\n id,\n result,\n });\n\n // free up references for garbage collection\n next = null;\n result = null;\n }\n\n respond({\n id,\n result: {\n type: 'stopped',\n },\n });\n subscriptions.delete(internalId);\n }).catch((cause) => {\n const error = getTRPCErrorFromUnknown(cause);\n respond({\n id,\n error: getErrorShape({\n config: router._def._config,\n error,\n type,\n path,\n input,\n ctx,\n }),\n });\n abortController.abort();\n });\n\n respond({\n id,\n result: {\n type: 'started',\n },\n });\n subscriptions.set(internalId, abortController);\n } catch (cause) {\n const error: TRPCError = getTRPCErrorFromUnknown(cause);\n\n return respond({\n id,\n error: getErrorShape({\n config: router._def._config,\n error,\n type,\n path,\n input,\n ctx,\n }),\n });\n }\n}\n", "import { TRPCError } from '@trpc/server';\n\n// modified from @trpc/server/src/error/utils\nexport function getTRPCErrorFromUnknown(cause: unknown): TRPCError {\n if (cause instanceof TRPCError) {\n return cause;\n }\n\n const error = getErrorFromUnknown(cause);\n const trpcError = new TRPCError({\n code: 'INTERNAL_SERVER_ERROR',\n cause: error,\n message: error.message,\n });\n\n // Inherit stack from error\n trpcError.stack = error.stack;\n\n return trpcError;\n}\n\n// modified from @trpc/server/src/error/utils\nfunction getErrorFromUnknown(cause: unknown): Error {\n if (cause instanceof Error) {\n return cause;\n }\n\n if (typeof cause === 'string') {\n return new Error(cause);\n }\n\n return new Error('Unknown error');\n}\n", "import { SuperJSON, SuperJSONResult } from 'superjson';\nimport { compress, uncompress } from 'snappyjs';\nimport { getParser } from 'bowser';\n\nclass DefaultSuperJSON {\n superJson;\n constructor() {\n this.superJson = new SuperJSON();\n }\n}\n\nclass CompressSuperJSON {\n superJson;\n constructor() {\n this.superJson = new SuperJSON();\n }\n}\n\nconst defaultSuperJSON = new DefaultSuperJSON();\nconst compressSuperJSON = new CompressSuperJSON();\nenum CustomType {\n unit8array = '0',\n}\nfunction uint8ArrayToBase64(bytes: Uint8Array) {\n return btoa(new TextDecoder('iso-8859-1').decode(bytes));\n}\n\nfunction base64ToUint8Array(base64: string) {\n return Uint8Array.from(atob(base64), (c) => c.charCodeAt(0));\n}\n\nfunction jsonToUint8Array(obj: unknown): Uint8Array {\n return new TextEncoder().encode(JSON.stringify(obj));\n}\n\nfunction uint8ArrayToJson<T = unknown>(data: Uint8Array): T {\n return JSON.parse(new TextDecoder().decode(data)) as T;\n}\n\nexport function initJsonConvert() {\n const useStructuredClone =\n chrome.runtime.getManifest()['message_serialization'] ===\n 'structured_clone' &&\n getParser(navigator.userAgent, (navigator as any).userAgentData).satisfies({\n chrome: '>=148.0.0.0',\n });\n const isApplicable = (v: unknown): v is Uint8Array => v instanceof Uint8Array;\n\n const defaultConfig = {\n serialize: useStructuredClone\n ? (v: Uint8Array) => v\n : (v: Uint8Array) => uint8ArrayToBase64(v),\n deserialize: useStructuredClone\n ? (v: any) => v\n : (v: any) => base64ToUint8Array(v),\n isApplicable,\n };\n const compressConfig = {\n serialize: useStructuredClone\n ? (v: Uint8Array) => compress(v)\n : (v: Uint8Array) => uint8ArrayToBase64(compress(v)),\n deserialize: useStructuredClone\n ? (v: any) => uncompress(v)\n : (v: any) => uncompress(base64ToUint8Array(v)),\n isApplicable,\n };\n\n defaultSuperJSON.superJson.registerCustom<Uint8Array, any>(\n defaultConfig,\n CustomType.unit8array,\n );\n compressSuperJSON.superJson.registerCustom<Uint8Array, any>(\n compressConfig,\n CustomType.unit8array,\n );\n}\nexport function serialize(\n object: Parameters<typeof defaultSuperJSON.superJson.serialize>[0],\n compress?: boolean,\n) {\n if (!compress) {\n return defaultSuperJSON.superJson.serialize(object);\n }\n const result = compressSuperJSON.superJson.serialize(object);\n (result as any).__compress = true;\n if (result.meta?.values) {\n if (Array.isArray(result.meta?.values)) {\n if (result.meta.values[0][1] === CustomType.unit8array) {\n return result;\n }\n } else {\n const list = Object.values(result.meta.values);\n if (list.some((item) => Array.isArray(item[0]))) {\n return result;\n } else {\n return uint8ArrayToBase64(jsonToUint8Array(result));\n }\n }\n }\n return result;\n}\nexport function deserialize<T = unknown>(\n payload: SuperJSONResult & { __compress?: boolean },\n): T {\n if (typeof payload === 'string') {\n payload = uint8ArrayToJson(base64ToUint8Array(payload));\n }\n\n return payload.__compress\n ? compressSuperJSON.superJson.deserialize(payload, { inPlace: true })\n : defaultSuperJSON.superJson.deserialize(payload, { inPlace: true });\n}\n", "import type { AnyRouter, inferRouterContext } from '@trpc/server';\nimport { handleChromeMessage } from './handleChromeMessage';\nimport { deserialize, initJsonConvert } from '../util/json';\nimport { Message } from '../type';\n\ntype Awaitable<T> = T | Promise<T>;\ntype ChromHandleOptions<TRouter extends AnyRouter> = {\n createContext?: () => Awaitable<inferRouterContext<TRouter>>;\n router: TRouter;\n compressPathObj?: Record<string, boolean>;\n};\n\nclass ChromeHandler<TRouter extends AnyRouter> {\n #getWebviewSubscription() {\n return new Map();\n }\n constructor(private options: ChromHandleOptions<TRouter>) {\n this.init();\n }\n\n init() {\n initJsonConvert();\n chrome.runtime.onConnect.addListener((port) => {\n const fn: (message: Message, port: chrome.runtime.Port) => void = (\n message,\n ) => {\n handleChromeMessage({\n router: this.options.router,\n createContext: this.options.createContext,\n message: {\n ...message,\n operation: {\n ...message.operation,\n input: deserialize(message.operation.input as any),\n },\n },\n subscriptions: this.#getWebviewSubscription(),\n port,\n compressPathObj: this.options.compressPathObj,\n });\n };\n port.onMessage.addListener(fn);\n port.onDisconnect.addListener(() => {\n port.onMessage.removeListener(fn);\n });\n });\n }\n}\n\nexport const createChromeHandler = <TRouter extends AnyRouter>(\n options: ChromHandleOptions<TRouter>,\n) => new ChromeHandler(options);\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["TRPCError", "compress", "message", "TRPCError", "result", "id"]
|
|
7
|
+
}
|