fusion-plugin-rpc
Version:
Fetch data on the server and client with an RPC style interface.
125 lines (114 loc) • 14.8 kB
JavaScript
/** 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 true && pluginFactory();
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNyYy9icm93c2VyLmpzIl0sIm5hbWVzIjpbImNyZWF0ZVBsdWdpbiIsIm1lbW9pemUiLCJVbml2ZXJzYWxFdmVudHNUb2tlbiIsIkkxOG5Ub2tlbiIsIkZldGNoVG9rZW4iLCJSUENIYW5kbGVyc0NvbmZpZ1Rva2VuIiwiUlBDUXVlcnlQYXJhbXNUb2tlbiIsImZvcm1hdEFwaVBhdGgiLCJzdGF0S2V5IiwiUlBDIiwiY29uc3RydWN0b3IiLCJmZXRjaCIsImVtaXR0ZXIiLCJycGNDb25maWciLCJxdWVyeVBhcmFtcyIsImNvbmZpZyIsImFwaVBhdGgiLCJyZXF1ZXN0IiwicnBjSWQiLCJhcmdzIiwiaGVhZGVycyIsIm9wdGlvbnMiLCJFcnJvciIsInN0YXJ0VGltZSIsIkRhdGUiLCJub3ciLCJsZW5ndGgiLCJtYXAiLCJrIiwidiIsImVuY29kZVVSSUNvbXBvbmVudCIsImpvaW4iLCJGb3JtRGF0YSIsIm1ldGhvZCIsImJvZHkiLCJKU09OIiwic3RyaW5naWZ5IiwidGhlbiIsInIiLCJqc29uIiwic3RhdHVzIiwiZGF0YSIsImVtaXQiLCJ0aW1pbmciLCJlcnJvciIsIlByb21pc2UiLCJyZWplY3QiLCJwbHVnaW5GYWN0b3J5IiwiZGVwcyIsImkxOG4iLCJvcHRpb25hbCIsInByb3ZpZGVzIiwid2luZG93IiwiZnJvbSIsImN0eCIsInF1ZXJ5UGFyYW1zVmFsdWUiLCJsb2NhbGUiLCJsb2NhbGVDb2RlIiwiY29kZSIsInB1c2giXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBRUEsU0FBUUEsWUFBUixFQUFzQkMsT0FBdEIsUUFBa0QsYUFBbEQ7QUFDQSxTQUFRQyxvQkFBUixRQUFtQyxnQ0FBbkM7QUFDQSxTQUFRQyxTQUFSLFFBQXdCLG9CQUF4QjtBQUNBLFNBQVFDLFVBQVIsUUFBeUIsZUFBekI7QUFHQSxTQUVFQyxzQkFGRixFQUdFQyxtQkFIRixRQUlPLGFBSlA7QUFNQSxTQUFRQyxhQUFSLFFB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QUFJLENBQUNJLElBQUwsQ0FBVUMsR0FBVixFQUFlRSxNQUF4QixJQUFtQyxFQUFsRDtBQUNBLGNBQU1DLFVBQVUsR0FBRyxPQUFPRCxNQUFQLEtBQWtCLFFBQWxCLEdBQTZCQSxNQUE3QixHQUFzQ0EsTUFBTSxDQUFDRSxJQUFoRTs7QUFDQSxZQUFJRCxVQUFKLEVBQWdCO0FBQ2RGLFVBQUFBLGdCQUFnQixDQUFDSSxJQUFqQixDQUFzQixDQUFDLFlBQUQsRUFBZUYsVUFBZixDQUF0QjtBQUNEOztBQUNELGVBQU8sSUFBSWhELEdBQUosQ0FBUTtBQUNiRSxVQUFBQSxLQURhO0FBRWJDLFVBQUFBLE9BRmE7QUFHYkMsVUFBQUEsU0FIYTtBQUliQyxVQUFBQSxXQUFXLEVBQUV5QztBQUpBLFNBQVIsQ0FBUDtBQU1ELE9BYlk7QUFEUixLQUFQO0FBZ0JEO0FBakNVLENBQUQsQ0FEZDs7QUFxQ0EsZUFBaUIsUUFBZVIsYUFBYSxFQUE3QyIsInNvdXJjZXNDb250ZW50IjpbIi8qKiBDb3B5cmlnaHQgKGMpIDIwMTggVWJlciBUZWNobm9sb2dpZXMsIEluYy5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbiAqXG4gKiBAZmxvd1xuICovXG5cbi8qIGVzbGludC1lbnYgYnJvd3NlciAqL1xuXG5pbXBvcnQge2NyZWF0ZVBsdWdpbiwgbWVtb2l6ZSwgdHlwZSBDb250ZXh0fSBmcm9tICdmdXNpb24tY29yZSc7XG5pbXBvcnQge1VuaXZlcnNhbEV2ZW50c1Rva2VufSBmcm9tICdmdXNpb24tcGx1Z2luLXVuaXZlcnNhbC1ldmVudHMnO1xuaW1wb3J0IHtJMThuVG9rZW59IGZyb20gJ2Z1c2lvbi1wbHVnaW4taTE4bic7XG5pbXBvcnQge0ZldGNoVG9rZW59IGZyb20gJ2Z1c2lvbi10b2tlbnMnO1xuaW1wb3J0IHR5cGUge0ZldGNofSBmcm9tICdmdXNpb24tdG9rZW5zJztcblxuaW1wb3J0IHtcbiAgdHlwZSBIYW5kbGVyVHlwZSxcbiAgUlBDSGFuZGxlcnNDb25maWdUb2tlbixcbiAgUlBDUXVlcnlQYXJhbXNUb2tlbixcbn0gZnJvbSAnLi90b2tlbnMuanMnO1xuaW1wb3J0IHR5cGUge1JQQ1BsdWdpblR5cGUsIElFbWl0dGVyLCBSUENDb25maWdUeXBlfSBmcm9tICcuL3R5cGVzLmpzJztcbmltcG9ydCB7Zm9ybWF0QXBpUGF0aH0gZnJvbSAnLi91dGlscy5qcyc7XG5cbnR5cGUgSW5pdGlhbGl6YXRpb25PcHRzID0ge1xuICBmZXRjaDogRmV0Y2gsXG4gIGVtaXR0ZXI6IElFbWl0dGVyLFxuICBxdWVyeVBhcmFtczogQXJyYXk8W3N0cmluZywgc3RyaW5nXT4sXG4gIHJwY0NvbmZpZzogP1JQQ0NvbmZpZ1R5cGUsXG59O1xuXG5jb25zdCBzdGF0S2V5ID0gJ3JwYzptZXRob2QtY2xpZW50JztcblxuY2xhc3MgUlBDIHtcbiAgY3R4OiA/Q29udGV4dDtcbiAgZW1pdHRlcjogP0lFbWl0dGVyO1xuICBoYW5kbGVyczogP0hhbmRsZXJUeXBlO1xuICBxdWVyeVBhcmFtczogQXJyYXk8W3N0cmluZywgc3RyaW5nXT47XG4gIGZldGNoOiA/RmV0Y2g7XG4gIGNvbmZpZzogP1JQQ0NvbmZpZ1R5cGU7XG4gIGFwaVBhdGg6IHN0cmluZztcbiAgY29uc3RydWN0b3Ioe2ZldGNoLCBlbWl0dGVyLCBycGNDb25maWcsIHF1ZXJ5UGFyYW1zfTogSW5pdGlhbGl6YXRpb25PcHRzKSB7XG4gICAgdGhpcy5mZXRjaCA9IGZldGNoO1xuICAgIHRoaXMuY29uZmlnID0gcnBjQ29uZmlnIHx8IHt9O1xuICAgIHRoaXMuZW1pdHRlciA9IGVtaXR0ZXI7XG4gICAgdGhpcy5xdWVyeVBhcmFtcyA9IHF1ZXJ5UGFyYW1zO1xuXG4gICAgdGhpcy5hcGlQYXRoID0gZm9ybWF0QXBpUGF0aChcbiAgICAgIHJwY0NvbmZpZyAmJiBycGNDb25maWcuYXBpUGF0aCA/IHJwY0NvbmZpZy5hcGlQYXRoIDogJ2FwaSdcbiAgICApO1xuICB9XG5cbiAgcmVxdWVzdDxUQXJncywgVFJlc3VsdD4oXG4gICAgcnBjSWQ6IHN0cmluZyxcbiAgICBhcmdzOiBUQXJncyxcbiAgICBoZWFkZXJzOiA/e1tzdHJpbmddOiBzdHJpbmd9LFxuICAgIG9wdGlvbnM6ID9SZXF1ZXN0T3B0aW9uc1xuICApOiBQcm9taXNlPFRSZXN1bHQ+IHtcbiAgICBpZiAoIXRoaXMuZmV0Y2gpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignZnVzaW9uLXBsdWdpbi1ycGMgcmVxdWlyZXMgYGZldGNoYCcpO1xuICAgIH1cbiAgICBpZiAoIXRoaXMuZW1pdHRlcikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdNaXNzaW5nIGVtaXR0ZXIgcmVnaXN0ZXJlZCB0byBVbml2ZXJzYWxFdmVudHNUb2tlbicpO1xuICAgIH1cbiAgICBjb25zdCBmZXRjaCA9IHRoaXMuZmV0Y2g7XG4gICAgY29uc3QgZW1pdHRlciA9IHRoaXMuZW1pdHRlcjtcbiAgICBjb25zdCBhcGlQYXRoID0gdGhpcy5hcGlQYXRoO1xuXG4gICAgY29uc3Qgc3RhcnRUaW1lID0gRGF0ZS5ub3coKTtcbiAgICBjb25zdCBxdWVyeVBhcmFtcyA9XG4gICAgICB0aGlzLnF1ZXJ5UGFyYW1zLmxlbmd0aCA+IDBcbiAgICAgICAgPyBgPyR7dGhpcy5xdWVyeVBhcmFtc1xuICAgICAgICAgICAgLm1hcChcbiAgICAgICAgICAgICAgKFtrLCB2XSkgPT4gYCR7ZW5jb2RlVVJJQ29tcG9uZW50KGspfT0ke2VuY29kZVVSSUNvbXBvbmVudCh2KX1gXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAuam9pbignJicpfWBcbiAgICAgICAgOiAnJztcblxuICAgIHJldHVybiBmZXRjaChcbiAgICAgIGAke2FwaVBhdGh9JHtycGNJZH0ke3F1ZXJ5UGFyYW1zfWAsXG4gICAgICBhcmdzIGluc3RhbmNlb2YgRm9ybURhdGFcbiAgICAgICAgPyB7XG4gICAgICAgICAgICAuLi5vcHRpb25zLFxuICAgICAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgICAgIC8vIENvbnRlbnQtVHlwZSB3aWxsIGJlIHNldCBhdXRvbWF0aWNhbGx5XG4gICAgICAgICAgICAgIC4uLihoZWFkZXJzIHx8IHt9KSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBib2R5OiBhcmdzLFxuICAgICAgICAgIH1cbiAgICAgICAgOiB7XG4gICAgICAgICAgICAuLi5vcHRpb25zLFxuICAgICAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgICAgICAvLyAkRmxvd0ZpeE1lXG4gICAgICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgICAgICAgIC4uLihoZWFkZXJzIHx8IHt9KSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeShhcmdzIHx8IHt9KSxcbiAgICAgICAgICB9XG4gICAgKVxuICAgICAgLnRoZW4oKHIpID0+IHIuanNvbigpKVxuICAgICAgLnRoZW4oKGFyZ3MpID0+IHtcbiAgICAgICAgY29uc3Qge3N0YXR1cywgZGF0YX0gPSBhcmdzO1xuICAgICAgICBpZiAoc3RhdHVzID09PSAnc3VjY2VzcycpIHtcbiAgICAgICAgICBlbWl0dGVyLmVtaXQoc3RhdEtleSwge1xuICAgICAgICAgICAgbWV0aG9kOiBycGNJZCxcbiAgICAgICAgICAgIHN0YXR1czogJ3N1Y2Nlc3MnLFxuICAgICAgICAgICAgdGltaW5nOiBEYXRlLm5vdygpIC0gc3RhcnRUaW1lLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHJldHVybiBkYXRhO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGVtaXR0ZXIuZW1pdChzdGF0S2V5LCB7XG4gICAgICAgICAgICBtZXRob2Q6IHJwY0lkLFxuICAgICAgICAgICAgZXJyb3I6IGRhdGEsXG4gICAgICAgICAgICBzdGF0dXM6ICdmYWlsdXJlJyxcbiAgICAgICAgICAgIHRpbWluZzogRGF0ZS5ub3coKSAtIHN0YXJ0VGltZSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoZGF0YSA/IGRhdGEgOiB7fSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICB9XG59XG5cbmNvbnN0IHBsdWdpbkZhY3Rvcnk6ICgpID0+IFJQQ1BsdWdpblR5cGUgPSAoKSA9PlxuICBjcmVhdGVQbHVnaW4oe1xuICAgIGRlcHM6IHtcbiAgICAgIGZldGNoOiBGZXRjaFRva2VuLFxuICAgICAgZW1pdHRlcjogVW5pdmVyc2FsRXZlbnRzVG9rZW4sXG4gICAgICBpMThuOiBJMThuVG9rZW4ub3B0aW9uYWwsXG4gICAgICBycGNDb25maWc6IFJQQ0hhbmRsZXJzQ29uZmlnVG9rZW4ub3B0aW9uYWwsXG4gICAgICBxdWVyeVBhcmFtczogUlBDUXVlcnlQYXJhbXNUb2tlbi5vcHRpb25hbCxcbiAgICB9LFxuICAgIHByb3ZpZGVzOiAoZGVwcykgPT4ge1xuICAgICAgY29uc3Qge1xuICAgICAgICBmZXRjaCA9IHdpbmRvdy5mZXRjaCxcbiAgICAgICAgZW1pdHRlcixcbiAgICAgICAgcnBjQ29uZmlnLFxuICAgICAgICBpMThuLFxuICAgICAgICBxdWVyeVBhcmFtcyxcbiAgICAgIH0gPSBkZXBzO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBmcm9tOiBtZW1vaXplKChjdHgpID0+IHtcbiAgICAgICAgICBjb25zdCBxdWVyeVBhcmFtc1ZhbHVlID0gKHF1ZXJ5UGFyYW1zICYmIHF1ZXJ5UGFyYW1zLmZyb20oY3R4KSkgfHwgW107XG4gICAgICAgICAgY29uc3QgbG9jYWxlID0gKGkxOG4gJiYgaTE4bi5mcm9tKGN0eCkubG9jYWxlKSB8fCAnJztcbiAgICAgICAgICBjb25zdCBsb2NhbGVDb2RlID0gdHlwZW9mIGxvY2FsZSA9PT0gJ3N0cmluZycgPyBsb2NhbGUgOiBsb2NhbGUuY29kZTtcbiAgICAgICAgICBpZiAobG9jYWxlQ29kZSkge1xuICAgICAgICAgICAgcXVlcnlQYXJhbXNWYWx1ZS5wdXNoKFsnbG9jYWxlQ29kZScsIGxvY2FsZUNvZGVdKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIG5ldyBSUEMoe1xuICAgICAgICAgICAgZmV0Y2gsXG4gICAgICAgICAgICBlbWl0dGVyLFxuICAgICAgICAgICAgcnBjQ29uZmlnLFxuICAgICAgICAgICAgcXVlcnlQYXJhbXM6IHF1ZXJ5UGFyYW1zVmFsdWUsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pLFxuICAgICAgfTtcbiAgICB9LFxuICB9KTtcblxuZXhwb3J0IGRlZmF1bHQgKChfX0JST1dTRVJfXyAmJiBwbHVnaW5GYWN0b3J5KCk6IGFueSk6IFJQQ1BsdWdpblR5cGUpO1xuIl19