trpc-chrome
Version:
tRPC adapter for Web Extensions
76 lines • 3.45 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.chromeLink = void 0;
const client_1 = require("@trpc/client");
const observable_1 = require("@trpc/server/observable");
const chromeLink = (opts) => {
return (runtime) => {
const { port } = opts;
return ({ op }) => {
return (0, observable_1.observable)((observer) => {
const listeners = [];
const { id, type, path } = op;
try {
const input = runtime.transformer.serialize(op.input);
const onDisconnect = () => {
observer.error(new client_1.TRPCClientError('Port disconnected prematurely'));
};
port.onDisconnect.addListener(onDisconnect);
listeners.push(() => port.onDisconnect.removeListener(onDisconnect));
const onMessage = (message) => {
if (!('trpc' in message))
return;
const { trpc } = message;
if (!trpc)
return;
if (!('id' in trpc) || trpc.id === null || trpc.id === undefined)
return;
if (id !== trpc.id)
return;
if ('error' in trpc) {
const error = runtime.transformer.deserialize(trpc.error);
observer.error(client_1.TRPCClientError.from(Object.assign(Object.assign({}, trpc), { error })));
return;
}
observer.next({
result: Object.assign(Object.assign({}, trpc.result), ((!trpc.result.type || trpc.result.type === 'data') && {
type: 'data',
data: runtime.transformer.deserialize(trpc.result.data),
})),
});
if (type !== 'subscription' || trpc.result.type === 'stopped') {
observer.complete();
}
};
port.onMessage.addListener(onMessage);
listeners.push(() => port.onMessage.removeListener(onMessage));
port.postMessage({
trpc: {
id,
jsonrpc: undefined,
method: type,
params: { path, input },
},
});
}
catch (cause) {
observer.error(new client_1.TRPCClientError(cause instanceof Error ? cause.message : 'Unknown error'));
}
return () => {
listeners.forEach((unsub) => unsub());
if (type === 'subscription') {
port.postMessage({
trpc: {
id,
jsonrpc: undefined,
method: 'subscription.stop',
},
});
}
};
});
};
};
};
exports.chromeLink = chromeLink;
//# sourceMappingURL=index.js.map