UNPKG

@v4fire/core

Version:
179 lines (178 loc) 7.35 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); var _exportNames = {}; exports.default = createProviderEngine; var _abortable = _interopRequireDefault(require("../../../../core/promise/abortable")); var _url = require("../../../../core/url"); var _data = _interopRequireWildcard(require("../../../../core/data")); var _response = _interopRequireDefault(require("../../../../core/request/response")); var _const = require("../../../../core/request/engines/provider/const"); Object.keys(_const).forEach(function (key) { if (key === "default" || key === "__esModule") return; if (Object.prototype.hasOwnProperty.call(_exportNames, key)) return; if (key in exports && exports[key] === _const[key]) return; Object.defineProperty(exports, key, { enumerable: true, get: function () { return _const[key]; } }); }); var _interface = require("../../../../core/request/engines/provider/interface"); Object.keys(_interface).forEach(function (key) { if (key === "default" || key === "__esModule") return; if (Object.prototype.hasOwnProperty.call(_exportNames, key)) return; if (key in exports && exports[key] === _interface[key]) return; Object.defineProperty(exports, key, { enumerable: true, get: function () { return _interface[key]; } }); }); function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); } function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; } function createProviderEngine(src, methodsMapping = {}) { dataProviderEngine.pendingCache = false; return dataProviderEngine; function dataProviderEngine(params) { const p = Object.cast(Object.select(params, _const.availableParams)), provider = getProviderInstance(src, p.meta); const defaultRequestMethods = _data.methodProperties.reduceRight((carry, key) => { const method = provider[key]; if (Object.isTruly(method)) { carry[method] = key.replace('Method', ''); } return carry; }, {}); methodsMapping = { ...defaultRequestMethods, ...methodsMapping }; const requestPromise = new _abortable.default(async (resolve, reject, onAbort) => { await new Promise(r => { setImmediate(r); }); p.parent = requestPromise; let { providerMethod } = p.meta; const isSimpleRequest = providerMethod === undefined, getProviderMethod = key => key in methodsMapping ? methodsMapping[key] : key; providerMethod = getProviderMethod(isSimpleRequest ? p.method : providerMethod); if (providerMethod == null || !Object.isFunction(provider[providerMethod])) { throw new ReferenceError('A provider method is not found at the data provider instance'); } const requestMethod = provider[`${providerMethod}Method`] ?? 'post'; let body = _data.queryMethods[requestMethod] != null ? p.query : p.body, urlProp = `base-${providerMethod}-URL`.camelize(false); if (!Object.isTruly(provider[urlProp])) { urlProp = _data.urlProperties[0]; } const providerToRequest = isSimpleRequest ? createMixedProvider(provider, { [urlProp]: p.url.replace(_data.globalOpts.api ?? '', '') }) : provider; if (Object.isDictionary(body)) { body = Object.mixin({ withNonEnumerables: true }, {}, body); } const req = providerToRequest[providerMethod](body, p); onAbort(reason => { req.abort(reason); }); const registeredEvents = Object.createDict(); params.emitter.on('newListener', event => { if (registeredEvents[event]) { return; } registeredEvents[event] = true; req.emitter.on(event, e => params.emitter.emit(event, e)); }); params.emitter.emit('drainListeners'); let providerResObj; try { providerResObj = await req; } catch (err) { reject(err); return; } const providerResponse = providerResObj.response, getResponse = () => providerResObj.data; getResponse[Symbol.asyncIterator] = () => { const type = providerResponse.sourceResponseType; if (!(`${type}Stream` in providerResponse)) { return providerResponse[Symbol.asyncIterator](); } const stream = providerResponse.decodeStream(); return { [Symbol.asyncIterator]() { return this; }, async next() { const { done, value } = await stream.next(); return { done, value: { data: value } }; } }; }; return resolve(new _response.default(getResponse, { url: providerResponse.url, redirected: providerResponse.redirected, parent: params.parent, important: providerResponse.important, okStatuses: providerResponse.okStatuses, noContentStatuses: providerResponse.noContentStatuses, status: providerResponse.status, statusText: providerResponse.statusText, headers: providerResponse.headers, responseType: 'object', forceResponseType: true, decoder: params.decoders, streamDecoder: params.streamDecoders, jsonReviver: params.jsonReviver })); }, params.parent); return requestPromise; } } function getProviderInstance(src, meta) { if (Object.isString(src)) { const provider = _data.providers[src]; if (provider == null) { throw new ReferenceError(`A provider "${src}" is not registered`); } src = provider; } let provider; if (src instanceof _data.default) { provider = src; } else { provider = new src(); } if (meta?.provider != null) { return createMixedProvider(provider, Object.cast(meta.provider)); } return provider; } function createMixedProvider(base, modifier = {}) { const mixedProvider = Object.create(base); _data.urlProperties.forEach(key => { if (base[key] == null && modifier[key] == null) { mixedProvider[key] = undefined; } else { mixedProvider[key] = (0, _url.concatURLs)(base[key], modifier[key]); } }); return mixedProvider; }