UNPKG

@connected/client

Version:

The hassle free way to call your server-side code

71 lines 2.71 kB
import find from 'array-find'; import uuid from 'uuid/v4.js'; import DataLoader from 'dataloader'; import JaysonBrowserClient from 'jayson/lib/client/browser/index.js'; import RpcError from './rpc-error.js'; function calculateClientResponse(resolve, err, errors, results) { resolve({ err, errors, successes: results }); } export default class RpcTransfer { rpcClient; dataLoaderMap = new Map(); constructor(urlOrOptions) { let url = '/rpc'; let headers = {}; if (typeof urlOrOptions === 'string') { url = urlOrOptions; } else if (typeof urlOrOptions === 'object') { url = urlOrOptions.url ?? url; headers = urlOrOptions.headers ?? {}; } function serverRequester(request, callback) { const options = { method: 'POST', body: request, headers: { 'Content-Type': 'application/json', ...headers, }, }; fetch(url, options) .then((res) => res.text()) .then((text) => callback(null, text)) .catch((error) => callback(error)); } this.rpcClient = new JaysonBrowserClient(serverRequester, {}); } findDataLoader(group = 'default') { if (this.dataLoaderMap.has(group)) { return this.dataLoaderMap.get(group); } const dataLoader = new DataLoader((requests) => this.batchRequest(requests), { cacheKeyFn: (key) => key.id }); this.dataLoaderMap.set(group, dataLoader); return dataLoader; } request(procName, params, group) { return this.findDataLoader(group).load(this.rpcClient.request(procName, params, uuid())); } batchRequest(requests) { return new Promise((resolve) => { const callback = calculateClientResponse.bind(null, resolve); this.rpcClient.request(requests, callback); }).then(({ err, errors, successes, }) => { if (err) { return requests.map(() => err); } return requests.map((request) => { const errorResult = find(errors, (error) => !!error && error.id === request.id); if (errorResult) { return new RpcError(errorResult.error); } const success = find(successes, (s) => !!s && s.id === request.id); if (success) { return success.result; } return new Error('Message id missing in the response'); }); }); } } //# sourceMappingURL=rpc-transfer.js.map