UNPKG

fusion-plugin-rpc

Version:

Fetch data on the server and client with an RPC style interface.

125 lines (114 loc) 14.8 kB
/** Copyright (c) 2018 Uber Technologies, Inc. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. * * */ /* eslint-env browser */ import { createPlugin, memoize } from 'fusion-core'; import { UniversalEventsToken } from 'fusion-plugin-universal-events'; import { I18nToken } from 'fusion-plugin-i18n'; import { FetchToken } from 'fusion-tokens'; import { RPCHandlersConfigToken, RPCQueryParamsToken } from './tokens.js'; import { formatApiPath } from './utils.js'; const statKey = 'rpc:method-client'; class RPC { constructor({ fetch, emitter, rpcConfig, queryParams }) { this.fetch = fetch; this.config = rpcConfig || {}; this.emitter = emitter; this.queryParams = queryParams; this.apiPath = formatApiPath(rpcConfig && rpcConfig.apiPath ? rpcConfig.apiPath : 'api'); } request(rpcId, args, headers, options) { if (!this.fetch) { throw new Error('fusion-plugin-rpc requires `fetch`'); } if (!this.emitter) { throw new Error('Missing emitter registered to UniversalEventsToken'); } const fetch = this.fetch; const emitter = this.emitter; const apiPath = this.apiPath; const startTime = Date.now(); const queryParams = this.queryParams.length > 0 ? `?${this.queryParams.map(([k, v]) => `${encodeURIComponent(k)}=${encodeURIComponent(v)}`).join('&')}` : ''; return fetch(`${apiPath}${rpcId}${queryParams}`, args instanceof FormData ? { ...options, method: 'POST', headers: { // Content-Type will be set automatically ...(headers || {}) }, body: args } : { ...options, method: 'POST', // $FlowFixMe headers: { 'Content-Type': 'application/json', ...(headers || {}) }, body: JSON.stringify(args || {}) }).then(r => r.json()).then(args => { const { status, data } = args; if (status === 'success') { emitter.emit(statKey, { method: rpcId, status: 'success', timing: Date.now() - startTime }); return data; } else { emitter.emit(statKey, { method: rpcId, error: data, status: 'failure', timing: Date.now() - startTime }); return Promise.reject(data ? data : {}); } }); } } const pluginFactory = () => createPlugin({ deps: { fetch: FetchToken, emitter: UniversalEventsToken, i18n: I18nToken.optional, rpcConfig: RPCHandlersConfigToken.optional, queryParams: RPCQueryParamsToken.optional }, provides: deps => { const { fetch = window.fetch, emitter, rpcConfig, i18n, queryParams } = deps; return { from: memoize(ctx => { const queryParamsValue = queryParams && queryParams.from(ctx) || []; const locale = i18n && i18n.from(ctx).locale || ''; const localeCode = typeof locale === 'string' ? locale : locale.code; if (localeCode) { queryParamsValue.push(['localeCode', localeCode]); } return new RPC({ fetch, emitter, rpcConfig, queryParams: queryParamsValue }); }) }; } }); export default false && pluginFactory(); //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNyYy9icm93c2VyLmpzIl0sIm5hbWVzIjpbImNyZWF0ZVBsdWdpbiIsIm1lbW9pemUiLCJVbml2ZXJzYWxFdmVudHNUb2tlbiIsIkkxOG5Ub2tlbiIsIkZldGNoVG9rZW4iLCJSUENIYW5kbGVyc0NvbmZpZ1Rva2VuIiwiUlBDUXVlcnlQYXJhbXNUb2tlbiIsImZvcm1hdEFwaVBhdGgiLCJzdGF0S2V5IiwiUlBDIiwiY29uc3RydWN0b3IiLCJmZXRjaCIsImVtaXR0ZXIiLCJycGNDb25maWciLCJxdWVyeVBhcmFtcyIsImNvbmZpZyIsImFwaVBhdGgiLCJyZXF1ZXN0IiwicnBjSWQiLCJhcmdzIiwiaGVhZGVycyIsIm9wdGlvbnMiLCJFcnJvciIsInN0YXJ0VGltZSIsIkRhdGUiLCJub3ciLCJsZW5ndGgiLCJtYXAiLCJrIiwidiIsImVuY29kZVVSSUNvbXBvbmVudCIsImpvaW4iLCJGb3JtRGF0YSIsIm1ldGhvZCIsImJvZHkiLCJKU09OIiwic3RyaW5naWZ5IiwidGhlbiIsInIiLCJqc29uIiwic3RhdHVzIiwiZGF0YSIsImVtaXQiLCJ0aW1pbmciLCJlcnJvciIsIlByb21pc2UiLCJyZWplY3QiLCJwbHVnaW5GYWN0b3J5IiwiZGVwcyIsImkxOG4iLCJvcHRpb25hbCIsInByb3ZpZGVzIiwid2luZG93IiwiZnJvbSIsImN0eCIsInF1ZXJ5UGFyYW1zVmFsdWUiLCJsb2NhbGUiLCJsb2NhbGVDb2RlIiwiY29kZSIsInB1c2giXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBRUEsU0FBUUEsWUFBUixFQUFzQkMsT0FBdEIsUUFBa0QsYUFBbEQ7QUFDQSxTQUFRQyxvQkFBUixRQUFtQyxnQ0FBbkM7QUFDQSxTQUFRQyxTQUFSLFFBQXdCLG9CQUF4QjtBQUNBLFNBQVFDLFVBQVIsUUFBeUIsZUFBekI7QUFHQSxTQUVFQyxzQkFGRixFQUdFQyxtQkFIRixRQUlPLGFBSlA7QUFNQSxTQUFRQyxhQUFSLFFB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QUFJLENBQUNJLElBQUwsQ0FBVUMsR0FBVixFQUFlRSxNQUF4QixJQUFtQyxFQUFsRDtBQUNBLGNBQU1DLFVBQVUsR0FBRyxPQUFPRCxNQUFQLEtBQWtCLFFBQWxCLEdBQTZCQSxNQUE3QixHQUFzQ0EsTUFBTSxDQUFDRSxJQUFoRTs7QUFDQSxZQUFJRCxVQUFKLEVBQWdCO0FBQ2RGLFVBQUFBLGdCQUFnQixDQUFDSSxJQUFqQixDQUFzQixDQUFDLFlBQUQsRUFBZUYsVUFBZixDQUF0QjtBQUNEOztBQUNELGVBQU8sSUFBSWhELEdBQUosQ0FBUTtBQUNiRSxVQUFBQSxLQURhO0FBRWJDLFVBQUFBLE9BRmE7QUFHYkMsVUFBQUEsU0FIYTtBQUliQyxVQUFBQSxXQUFXLEVBQUV5QztBQUpBLFNBQVIsQ0FBUDtBQU1ELE9BYlk7QUFEUixLQUFQO0FBZ0JEO0FBakNVLENBQUQsQ0FEZDs7QUFxQ0EsZUFBaUIsU0FBZVIsYUFBYSxFQUE3QyIsInNvdXJjZXNDb250ZW50IjpbIi8qKiBDb3B5cmlnaHQgKGMpIDIwMTggVWJlciBUZWNobm9sb2dpZXMsIEluYy5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbiAqXG4gKiBAZmxvd1xuICovXG5cbi8qIGVzbGludC1lbnYgYnJvd3NlciAqL1xuXG5pbXBvcnQge2NyZWF0ZVBsdWdpbiwgbWVtb2l6ZSwgdHlwZSBDb250ZXh0fSBmcm9tICdmdXNpb24tY29yZSc7XG5pbXBvcnQge1VuaXZlcnNhbEV2ZW50c1Rva2VufSBmcm9tICdmdXNpb24tcGx1Z2luLXVuaXZlcnNhbC1ldmVudHMnO1xuaW1wb3J0IHtJMThuVG9rZW59IGZyb20gJ2Z1c2lvbi1wbHVnaW4taTE4bic7XG5pbXBvcnQge0ZldGNoVG9rZW59IGZyb20gJ2Z1c2lvbi10b2tlbnMnO1xuaW1wb3J0IHR5cGUge0ZldGNofSBmcm9tICdmdXNpb24tdG9rZW5zJztcblxuaW1wb3J0IHtcbiAgdHlwZSBIYW5kbGVyVHlwZSxcbiAgUlBDSGFuZGxlcnNDb25maWdUb2tlbixcbiAgUlBDUXVlcnlQYXJhbXNUb2tlbixcbn0gZnJvbSAnLi90b2tlbnMuanMnO1xuaW1wb3J0IHR5cGUge1JQQ1BsdWdpblR5cGUsIElFbWl0dGVyLCBSUENDb25maWdUeXBlfSBmcm9tICcuL3R5cGVzLmpzJztcbmltcG9ydCB7Zm9ybWF0QXBpUGF0aH0gZnJvbSAnLi91dGlscy5qcyc7XG5cbnR5cGUgSW5pdGlhbGl6YXRpb25PcHRzID0ge1xuICBmZXRjaDogRmV0Y2gsXG4gIGVtaXR0ZXI6IElFbWl0dGVyLFxuICBxdWVyeVBhcmFtczogQXJyYXk8W3N0cmluZywgc3RyaW5nXT4sXG4gIHJwY0NvbmZpZzogP1JQQ0NvbmZpZ1R5cGUsXG59O1xuXG5jb25zdCBzdGF0S2V5ID0gJ3JwYzptZXRob2QtY2xpZW50JztcblxuY2xhc3MgUlBDIHtcbiAgY3R4OiA/Q29udGV4dDtcbiAgZW1pdHRlcjogP0lFbWl0dGVyO1xuICBoYW5kbGVyczogP0hhbmRsZXJUeXBlO1xuICBxdWVyeVBhcmFtczogQXJyYXk8W3N0cmluZywgc3RyaW5nXT47XG4gIGZldGNoOiA/RmV0Y2g7XG4gIGNvbmZpZzogP1JQQ0NvbmZpZ1R5cGU7XG4gIGFwaVBhdGg6IHN0cmluZztcbiAgY29uc3RydWN0b3Ioe2ZldGNoLCBlbWl0dGVyLCBycGNDb25maWcsIHF1ZXJ5UGFyYW1zfTogSW5pdGlhbGl6YXRpb25PcHRzKSB7XG4gICAgdGhpcy5mZXRjaCA9IGZldGNoO1xuICAgIHRoaXMuY29uZmlnID0gcnBjQ29uZmlnIHx8IHt9O1xuICAgIHRoaXMuZW1pdHRlciA9IGVtaXR0ZXI7XG4gICAgdGhpcy5xdWVyeVBhcmFtcyA9IHF1ZXJ5UGFyYW1zO1xuXG4gICAgdGhpcy5hcGlQYXRoID0gZm9ybWF0QXBpUGF0aChcbiAgICAgIHJwY0NvbmZpZyAmJiBycGNDb25maWcuYXBpUGF0aCA/IHJwY0NvbmZpZy5hcGlQYXRoIDogJ2FwaSdcbiAgICApO1xuICB9XG5cbiAgcmVxdWVzdDxUQXJncywgVFJlc3VsdD4oXG4gICAgcnBjSWQ6IHN0cmluZyxcbiAgICBhcmdzOiBUQXJncyxcbiAgICBoZWFkZXJzOiA/e1tzdHJpbmddOiBzdHJpbmd9LFxuICAgIG9wdGlvbnM6ID9SZXF1ZXN0T3B0aW9uc1xuICApOiBQcm9taXNlPFRSZXN1bHQ+IHtcbiAgICBpZiAoIXRoaXMuZmV0Y2gpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignZnVzaW9uLXBsdWdpbi1ycGMgcmVxdWlyZXMgYGZldGNoYCcpO1xuICAgIH1cbiAgICBpZiAoIXRoaXMuZW1pdHRlcikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdNaXNzaW5nIGVtaXR0ZXIgcmVnaXN0ZXJlZCB0byBVbml2ZXJzYWxFdmVudHNUb2tlbicpO1xuICAgIH1cbiAgICBjb25zdCBmZXRjaCA9IHRoaXMuZmV0Y2g7XG4gICAgY29uc3QgZW1pdHRlciA9IHRoaXMuZW1pdHRlcjtcbiAgICBjb25zdCBhcGlQYXRoID0gdGhpcy5hcGlQYXRoO1xuXG4gICAgY29uc3Qgc3RhcnRUaW1lID0gRGF0ZS5ub3coKTtcbiAgICBjb25zdCBxdWVyeVBhcmFtcyA9XG4gICAgICB0aGlzLnF1ZXJ5UGFyYW1zLmxlbmd0aCA+IDBcbiAgICAgICAgPyBgPyR7dGhpcy5xdWVyeVBhcmFtc1xuICAgICAgICAgICAgLm1hcChcbiAgICAgICAgICAgICAgKFtrLCB2XSkgPT4gYCR7ZW5jb2RlVVJJQ29tcG9uZW50KGspfT0ke2VuY29kZVVSSUNvbXBvbmVudCh2KX1gXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAuam9pbignJicpfWBcbiAgICAgICAgOiAnJztcblxuICAgIHJldHVybiBmZXRjaChcbiAgICAgIGAke2FwaVBhdGh9JHtycGNJZH0ke3F1ZXJ5UGFyYW1zfWAsXG4gICAgICBhcmdzIGluc3RhbmNlb2YgRm9ybURhdGFcbiAgICAgICAgPyB7XG4gICAgICAgICAgICAuLi5vcHRpb25zLFxuICAgICAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgICAgIC8vIENvbnRlbnQtVHlwZSB3aWxsIGJlIHNldCBhdXRvbWF0aWNhbGx5XG4gICAgICAgICAgICAgIC4uLihoZWFkZXJzIHx8IHt9KSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBib2R5OiBhcmdzLFxuICAgICAgICAgIH1cbiAgICAgICAgOiB7XG4gICAgICAgICAgICAuLi5vcHRpb25zLFxuICAgICAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgICAgICAvLyAkRmxvd0ZpeE1lXG4gICAgICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgICAgICAgIC4uLihoZWFkZXJzIHx8IHt9KSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeShhcmdzIHx8IHt9KSxcbiAgICAgICAgICB9XG4gICAgKVxuICAgICAgLnRoZW4oKHIpID0+IHIuanNvbigpKVxuICAgICAgLnRoZW4oKGFyZ3MpID0+IHtcbiAgICAgICAgY29uc3Qge3N0YXR1cywgZGF0YX0gPSBhcmdzO1xuICAgICAgICBpZiAoc3RhdHVzID09PSAnc3VjY2VzcycpIHtcbiAgICAgICAgICBlbWl0dGVyLmVtaXQoc3RhdEtleSwge1xuICAgICAgICAgICAgbWV0aG9kOiBycGNJZCxcbiAgICAgICAgICAgIHN0YXR1czogJ3N1Y2Nlc3MnLFxuICAgICAgICAgICAgdGltaW5nOiBEYXRlLm5vdygpIC0gc3RhcnRUaW1lLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHJldHVybiBkYXRhO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGVtaXR0ZXIuZW1pdChzdGF0S2V5LCB7XG4gICAgICAgICAgICBtZXRob2Q6IHJwY0lkLFxuICAgICAgICAgICAgZXJyb3I6IGRhdGEsXG4gICAgICAgICAgICBzdGF0dXM6ICdmYWlsdXJlJyxcbiAgICAgICAgICAgIHRpbWluZzogRGF0ZS5ub3coKSAtIHN0YXJ0VGltZSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoZGF0YSA/IGRhdGEgOiB7fSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICB9XG59XG5cbmNvbnN0IHBsdWdpbkZhY3Rvcnk6ICgpID0+IFJQQ1BsdWdpblR5cGUgPSAoKSA9PlxuICBjcmVhdGVQbHVnaW4oe1xuICAgIGRlcHM6IHtcbiAgICAgIGZldGNoOiBGZXRjaFRva2VuLFxuICAgICAgZW1pdHRlcjogVW5pdmVyc2FsRXZlbnRzVG9rZW4sXG4gICAgICBpMThuOiBJMThuVG9rZW4ub3B0aW9uYWwsXG4gICAgICBycGNDb25maWc6IFJQQ0hhbmRsZXJzQ29uZmlnVG9rZW4ub3B0aW9uYWwsXG4gICAgICBxdWVyeVBhcmFtczogUlBDUXVlcnlQYXJhbXNUb2tlbi5vcHRpb25hbCxcbiAgICB9LFxuICAgIHByb3ZpZGVzOiAoZGVwcykgPT4ge1xuICAgICAgY29uc3Qge1xuICAgICAgICBmZXRjaCA9IHdpbmRvdy5mZXRjaCxcbiAgICAgICAgZW1pdHRlcixcbiAgICAgICAgcnBjQ29uZmlnLFxuICAgICAgICBpMThuLFxuICAgICAgICBxdWVyeVBhcmFtcyxcbiAgICAgIH0gPSBkZXBzO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBmcm9tOiBtZW1vaXplKChjdHgpID0+IHtcbiAgICAgICAgICBjb25zdCBxdWVyeVBhcmFtc1ZhbHVlID0gKHF1ZXJ5UGFyYW1zICYmIHF1ZXJ5UGFyYW1zLmZyb20oY3R4KSkgfHwgW107XG4gICAgICAgICAgY29uc3QgbG9jYWxlID0gKGkxOG4gJiYgaTE4bi5mcm9tKGN0eCkubG9jYWxlKSB8fCAnJztcbiAgICAgICAgICBjb25zdCBsb2NhbGVDb2RlID0gdHlwZW9mIGxvY2FsZSA9PT0gJ3N0cmluZycgPyBsb2NhbGUgOiBsb2NhbGUuY29kZTtcbiAgICAgICAgICBpZiAobG9jYWxlQ29kZSkge1xuICAgICAgICAgICAgcXVlcnlQYXJhbXNWYWx1ZS5wdXNoKFsnbG9jYWxlQ29kZScsIGxvY2FsZUNvZGVdKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIG5ldyBSUEMoe1xuICAgICAgICAgICAgZmV0Y2gsXG4gICAgICAgICAgICBlbWl0dGVyLFxuICAgICAgICAgICAgcnBjQ29uZmlnLFxuICAgICAgICAgICAgcXVlcnlQYXJhbXM6IHF1ZXJ5UGFyYW1zVmFsdWUsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pLFxuICAgICAgfTtcbiAgICB9LFxuICB9KTtcblxuZXhwb3J0IGRlZmF1bHQgKChfX0JST1dTRVJfXyAmJiBwbHVnaW5GYWN0b3J5KCk6IGFueSk6IFJQQ1BsdWdpblR5cGUpO1xuIl19