trpc-browser
Version:
tRPC adapters and links for everywhere in the browser
73 lines • 3.44 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.createBaseLink = void 0;
const client_1 = require("@trpc/client");
const observable_1 = require("@trpc/server/observable");
const trpcMessage_1 = require("../../shared/trpcMessage");
const createBaseLink = (methods) => {
return (runtime) => {
return ({ op }) => {
return (0, observable_1.observable)((observer) => {
const listeners = [];
const { id, type, path } = op;
try {
// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
const input = runtime.transformer.serialize(op.input);
const onDisconnect = () => {
observer.error(new client_1.TRPCClientError('Port disconnected prematurely'));
};
methods.addCloseListener(onDisconnect);
listeners.push(() => methods.removeCloseListener(onDisconnect));
const onMessage = (message) => {
if (!(0, trpcMessage_1.isTRPCResponse)(message))
return;
const { trpc } = message;
if (id !== trpc.id)
return;
if ('error' in trpc) {
return observer.error(client_1.TRPCClientError.from(trpc));
}
observer.next({
result: Object.assign(Object.assign({}, trpc.result), ((!trpc.result.type || trpc.result.type === 'data') && {
type: 'data',
// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
data: runtime.transformer.deserialize(trpc.result.data),
})),
});
if (type !== 'subscription' || trpc.result.type === 'stopped') {
observer.complete();
}
};
methods.addMessageListener(onMessage);
listeners.push(() => methods.removeMessageListener(onMessage));
methods.postMessage({
trpc: {
id,
jsonrpc: undefined,
method: type,
// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
params: { path, input },
},
});
}
catch (cause) {
observer.error(new client_1.TRPCClientError(cause instanceof Error ? cause.message : 'Unknown error'));
}
return () => {
if (type === 'subscription') {
methods.postMessage({
trpc: {
id,
jsonrpc: undefined,
method: 'subscription.stop',
},
});
}
listeners.forEach((unsub) => unsub());
};
});
};
};
};
exports.createBaseLink = createBaseLink;
//# sourceMappingURL=base.js.map