UNPKG

@yaagoub/decorators

Version:

Angular decorators

90 lines 15.8 kB
import { switchMap, of, catchError, throwError } from 'rxjs'; import { defineBody } from '../helpers/define-body'; import { processResponse } from '../helpers/process-response'; import { InterceptorManager } from '../interceptors/interceptor-manager'; import { fromFetch } from 'rxjs/fetch'; import { resolveResponseType } from '../helpers/resolve-response-type'; import { responseHandlers } from '../helpers/response-handlers'; import { getFromMetadata } from '../metadata/get-from-metadata'; import { formatUrl } from '../helpers/format-url'; import { timeout as rxTimeout, TimeoutError } from 'rxjs'; export function createPetitionObservable({ instance, target, methodName, args }) { const { fromInstance, fromBoth } = getFromMetadata({ instance, target, methodName, args }); const url = formatUrl({ baseUrl: fromBoth.baseUrl ?? '', path: fromInstance.method?.path, queries: fromInstance.queries, paths: fromInstance.paths }); const timeout = fromInstance.timeout?.timeout; const timeoutOperators = timeout ? [rxTimeout(timeout)] : []; const headers = fromBoth.headers; const body = defineBody(fromInstance.body, headers); const withCredentials = fromBoth.withCredentials ?? 'omit'; const initialRequest = { url, method: fromInstance.method?.method, body, headers }; const request$ = InterceptorManager.applyBefore(of(initialRequest), fromInstance.method?.interceptors ?? []); return request$.pipe(switchMap((modifiedRequest) => { const fetchOptions = { method: modifiedRequest.method, headers: modifiedRequest.headers, body: modifiedRequest.body, credentials: withCredentials, }; const response$ = fromFetch(modifiedRequest.url, fetchOptions).pipe(processResponse(timeoutOperators), switchMap((res) => { if (!res.ok) { return res.text().then((body) => { try { body = JSON.parse(body); } catch (e) { } throw { status: res.status, body, statusText: res.statusText, url: modifiedRequest.url }; }); } return responseHandler(res, modifiedRequest, fromInstance); }), catchError(err => { if (err instanceof TimeoutError) { return of({ __error: true, err: { status: 408, statusText: 'Request Timeout', url: modifiedRequest.url, body: '' } }); } return of({ __error: true, err }); })); const interceptors = fromInstance.method?.interceptors ?? []; const final$ = response$.pipe(switchMap(res => { if (res.__error) { const err = res.err; return InterceptorManager.applyAfter(throwError(() => err), interceptors); } return InterceptorManager.applyAfter(of(res), interceptors); })); const allOperators = [...(fromInstance.method?.operators ?? [])]; return allOperators.length ? final$.pipe(processResponse(allOperators)) : final$; })); } function getHeaderValue(headers, key) { if (!headers) return null; if (headers instanceof Headers) { return headers.get(key); } return headers[key] ?? headers[key.toLowerCase()] ?? null; } function responseHandler(res, req, fromInstance) { const contentType = getHeaderValue(res.headers, 'Content-Type') ?? 'application/json'; const acceptHeader = getHeaderValue(req.headers, 'Accept'); const forcedType = fromInstance.method?.responseType ?? fromInstance.responseType; const dynamicType = resolveResponseType(contentType, acceptHeader, forcedType); if (!dynamicType) throw new Error(`Unsupported response type for content-type: ${contentType}`); const handler = responseHandlers[dynamicType]; if (!handler) throw new Error(`No response handler for type: ${dynamicType}`); return handler.handle$(res); } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVxdWVzdC1mYWN0b3J5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9kZWNvcmF0b3JzL3NyYy9odHRwL2NvcmUvcmVxdWVzdC1mYWN0b3J5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQWMsRUFBRSxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDekUsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3BELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUM5RCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQztBQUN6RSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBQ3ZDLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBR3ZFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBRWhFLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUNoRSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDbEQsT0FBTyxFQUFFLE9BQU8sSUFBSSxTQUFTLEVBQUUsWUFBWSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRzFELE1BQU0sVUFBVSx3QkFBd0IsQ0FBVSxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLElBQUksRUFBa0I7SUFFdEcsTUFBTSxFQUFFLFlBQVksRUFBRSxRQUFRLEVBQUUsR0FBRyxlQUFlLENBQUMsRUFBQyxRQUFRLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxJQUFJLEVBQUMsQ0FBQyxDQUFDO0lBRXpGLE1BQU0sR0FBRyxHQUFJLFNBQVMsQ0FBQztRQUNyQixPQUFPLEVBQUUsUUFBUSxDQUFDLE9BQU8sSUFBSSxFQUFFO1FBQy9CLElB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QUFPLEVBQUMsWUFBZ0I7SUFDdkQsTUFBTSxXQUFXLEdBQUcsY0FBYyxDQUFDLEdBQUcsQ0FBQyxPQUFPLEVBQUUsY0FBYyxDQUFDLElBQUksa0JBQWtCLENBQUM7SUFDdEYsTUFBTSxZQUFZLEdBQUcsY0FBYyxDQUFDLEdBQUcsQ0FBQyxPQUFPLEVBQUUsUUFBUSxDQUFDLENBQUM7SUFDM0QsTUFBTSxVQUFVLEdBQUcsWUFBWSxDQUFDLE1BQU0sRUFBRSxZQUFZLElBQUksWUFBWSxDQUFDLFlBQVksQ0FBQztJQUVsRixNQUFNLFdBQVcsR0FBRyxtQkFBbUIsQ0FBQyxXQUFXLEVBQUUsWUFBWSxFQUFFLFVBQVUsQ0FBQyxDQUFDO0lBQy9FLElBQUksQ0FBQyxXQUFXO1FBQUUsTUFBTSxJQUFJLEtBQUssQ0FBQywrQ0FBK0MsV0FBVyxFQUFFLENBQUMsQ0FBQztJQUVoRyxNQUFNLE9BQU8sR0FBRyxnQkFBZ0IsQ0FBQyxXQUE0QyxDQUFDLENBQUM7SUFDL0UsSUFBSSxDQUFDLE9BQU87UUFBRSxNQUFNLElBQUksS0FBSyxDQUFDLGlDQUFpQyxXQUFXLEVBQUUsQ0FBQyxDQUFDO0lBRTlFLE9BQU8sT0FBTyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUM5QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgc3dpdGNoTWFwLCBPYnNlcnZhYmxlLCBvZiwgY2F0Y2hFcnJvciwgdGhyb3dFcnJvciB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgZGVmaW5lQm9keSB9IGZyb20gJy4uL2hlbHBlcnMvZGVmaW5lLWJvZHknO1xuaW1wb3J0IHsgcHJvY2Vzc1Jlc3BvbnNlIH0gZnJvbSAnLi4vaGVscGVycy9wcm9jZXNzLXJlc3BvbnNlJztcbmltcG9ydCB7IEludGVyY2VwdG9yTWFuYWdlciB9IGZyb20gJy4uL2ludGVyY2VwdG9ycy9pbnRlcmNlcHRvci1tYW5hZ2VyJztcbmltcG9ydCB7IGZyb21GZXRjaCB9IGZyb20gJ3J4anMvZmV0Y2gnO1xuaW1wb3J0IHsgcmVzb2x2ZVJlc3BvbnNlVHlwZSB9IGZyb20gJy4uL2hlbHBlcnMvcmVzb2x2ZS1yZXNwb25zZS10eXBlJztcbmltcG9ydCB7IFJlcXVlc3RDb250ZXh0IH0gZnJvbSAnLi4vdHlwZXMvcmVxdWVzdC1jb250ZXh0JztcbmltcG9ydCB7IEh0dHBSZXF1ZXN0IH0gZnJvbSAnLi4vdHlwZXMvaHR0cC1yZXF1ZXN0JztcbmltcG9ydCB7IHJlc3BvbnNlSGFuZGxlcnMgfSBmcm9tICcuLi9oZWxwZXJzL3Jlc3BvbnNlLWhhbmRsZXJzJztcbmltcG9ydCB7IEh0dHBFcnJvciB9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCB7IGdldEZyb21NZXRhZGF0YSB9IGZyb20gJy4uL21ldGFkYXRhL2dldC1mcm9tLW1ldGFkYXRhJztcbmltcG9ydCB7IGZvcm1hdFVybCB9IGZyb20gJy4uL2hlbHBlcnMvZm9ybWF0LXVybCc7XG5pbXBvcnQgeyB0aW1lb3V0IGFzIHJ4VGltZW91dCwgVGltZW91dEVycm9yIH0gZnJvbSAncnhqcyc7XG5cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVBldGl0aW9uT2JzZXJ2YWJsZTxUID0gYW55Pih7IGluc3RhbmNlLCB0YXJnZXQsIG1ldGhvZE5hbWUsIGFyZ3MgfTogUmVxdWVzdENvbnRleHQpOiBPYnNlcnZhYmxlPFQ+IHtcblxuICBjb25zdCB7IGZyb21JbnN0YW5jZSwgZnJvbUJvdGggfSA9IGdldEZyb21NZXRhZGF0YSh7aW5zdGFuY2UsIHRhcmdldCwgbWV0aG9kTmFtZSwgYXJnc30pO1xuXG4gIGNvbnN0IHVybCAgPSBmb3JtYXRVcmwoe1xuICAgIGJhc2VVcmw6IGZyb21Cb3RoLmJhc2VVcmwgPz8gJycsXG4gICAgcGF0aDogZnJvbUluc3RhbmNlLm1ldGhvZD8ucGF0aCEsXG4gICAgcXVlcmllczogZnJvbUluc3RhbmNlLnF1ZXJpZXMsXG4gICAgcGF0aHM6IGZyb21JbnN0YW5jZS5wYXRoc1xuICB9KTtcblxuICBjb25zdCB0aW1lb3V0ID0gZnJvbUluc3RhbmNlLnRpbWVvdXQ/LnRpbWVvdXQ7XG4gIGNvbnN0IHRpbWVvdXRPcGVyYXRvcnMgPSB0aW1lb3V0ID8gW3J4VGltZW91dCh0aW1lb3V0KV0gOiBbXTtcblxuICBjb25zdCBoZWFkZXJzID0gZnJvbUJvdGguaGVhZGVycztcblxuICBjb25zdCBib2R5ID0gZGVmaW5lQm9keShmcm9tSW5zdGFuY2UuYm9keSwgaGVhZGVycyk7XG5cbiAgY29uc3Qgd2l0aENyZWRlbnRpYWxzID0gZnJvbUJvdGgud2l0aENyZWRlbnRpYWxzID8/ICdvbWl0JztcblxuICBjb25zdCBpbml0aWFsUmVxdWVzdDogSHR0cFJlcXVlc3QgPSB7IHVybCwgbWV0aG9kOiBmcm9tSW5zdGFuY2UubWV0aG9kPy5tZXRob2QhLCBib2R5LCBoZWFkZXJzIH07XG5cbiAgY29uc3QgcmVxdWVzdCQgPSBJbnRlcmNlcHRvck1hbmFnZXIuYXBwbHlCZWZvcmUob2YoaW5pdGlhbFJlcXVlc3QpLCBmcm9tSW5zdGFuY2UubWV0aG9kPy5pbnRlcmNlcHRvcnMgPz8gW10pO1xuXG4gIHJldHVybiByZXF1ZXN0JC5waXBlKFxuICAgIHN3aXRjaE1hcCgobW9kaWZpZWRSZXF1ZXN0OiBIdHRwUmVxdWVzdCkgPT4ge1xuICAgICAgY29uc3QgZmV0Y2hPcHRpb25zOiBSZXF1ZXN0SW5pdCA9IHtcbiAgICAgICAgbWV0aG9kOiBtb2RpZmllZFJlcXVlc3QubWV0aG9kLFxuICAgICAgICBoZWFkZXJzOiBtb2RpZmllZFJlcXVlc3QuaGVhZGVycyxcbiAgICAgICAgYm9keTogbW9kaWZpZWRSZXF1ZXN0LmJvZHksXG4gICAgICAgIGNyZWRlbnRpYWxzOiB3aXRoQ3JlZGVudGlhbHMgYXMgYW55LFxuICAgICAgfTtcblxuICAgICAgY29uc3QgcmVzcG9uc2UkID0gZnJvbUZldGNoKG1vZGlmaWVkUmVxdWVzdC51cmwsIGZldGNoT3B0aW9ucykucGlwZShcbiAgICAgICAgcHJvY2Vzc1Jlc3BvbnNlKHRpbWVvdXRPcGVyYXRvcnMpLFxuICAgICAgICBzd2l0Y2hNYXAoKHJlcykgPT4ge1xuICAgICAgICAgIGlmICghcmVzLm9rKSB7XG4gICAgICAgICAgICByZXR1cm4gcmVzLnRleHQoKS50aGVuKChib2R5OmFueSkgPT4ge1xuICAgICAgICAgICAgICB0cnkgeyBib2R5ID0gSlNPTi5wYXJzZShib2R5KSB9IGNhdGNoIChlKSB7fVxuICAgICAgICAgICAgICB0aHJvdyB7IHN0YXR1czogcmVzLnN0YXR1cywgYm9keSwgc3RhdHVzVGV4dDogcmVzLnN0YXR1c1RleHQsIHVybDogbW9kaWZpZWRSZXF1ZXN0LnVybCB9IGFzIEh0dHBFcnJvcjtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiByZXNwb25zZUhhbmRsZXIocmVzLCBtb2RpZmllZFJlcXVlc3QsIGZyb21JbnN0YW5jZSk7XG4gICAgICAgIH0pLFxuICAgICAgICBjYXRjaEVycm9yKGVyciA9PiB7XG4gICAgICAgICAgaWYgKGVyciBpbnN0YW5jZW9mIFRpbWVvdXRFcnJvcikge1xuICAgICAgICAgICAgcmV0dXJuIG9mKHtcbiAgICAgICAgICAgICAgX19lcnJvcjogdHJ1ZSxcbiAgICAgICAgICAgICAgZXJyOiB7XG4gICAgICAgICAgICAgICAgc3RhdHVzOiA0MDgsXG4gICAgICAgICAgICAgICAgc3RhdHVzVGV4dDogJ1JlcXVlc3QgVGltZW91dCcsXG4gICAgICAgICAgICAgICAgdXJsOiBtb2RpZmllZFJlcXVlc3QudXJsLFxuICAgICAgICAgICAgICAgIGJvZHk6ICcnXG4gICAgICAgICAgICAgIH0gYXMgSHR0cEVycm9yXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIG9mKHsgX19lcnJvcjogdHJ1ZSwgZXJyIH0pXG4gICAgICAgIH0pXG4gICAgICApO1xuXG5cbiAgICAgIGNvbnN0IGludGVyY2VwdG9ycyA9IGZyb21JbnN0YW5jZS5tZXRob2Q/LmludGVyY2VwdG9ycyA/PyBbXTtcblxuICAgICAgY29uc3QgZmluYWwkID0gcmVzcG9uc2UkLnBpcGUoXG4gICAgICAgIHN3aXRjaE1hcChyZXMgPT4ge1xuICAgICAgICAgIGlmICgocmVzIGFzIGFueSkuX19lcnJvcikge1xuICAgICAgICAgICAgY29uc3QgZXJyOkh0dHBFcnJvciA9IChyZXMgYXMgYW55KS5lcnI7XG4gICAgICAgICAgICByZXR1cm4gSW50ZXJjZXB0b3JNYW5hZ2VyLmFwcGx5QWZ0ZXIodGhyb3dFcnJvcigoKSA9PiBlcnIpLCBpbnRlcmNlcHRvcnMpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gSW50ZXJjZXB0b3JNYW5hZ2VyLmFwcGx5QWZ0ZXIob2YocmVzKSwgaW50ZXJjZXB0b3JzKTtcbiAgICAgICAgfSlcbiAgICAgICk7XG5cblxuICAgICAgY29uc3QgYWxsT3BlcmF0b3JzID0gWy4uLihmcm9tSW5zdGFuY2UubWV0aG9kPy5vcGVyYXRvcnMgPz8gW10pXTtcbiAgICAgIHJldHVybiBhbGxPcGVyYXRvcnMubGVuZ3RoID8gZmluYWwkLnBpcGUocHJvY2Vzc1Jlc3BvbnNlKGFsbE9wZXJhdG9ycykpIDogZmluYWwkO1xuICAgIH0pXG4gICk7XG59XG5cblxuZnVuY3Rpb24gZ2V0SGVhZGVyVmFsdWUoaGVhZGVyczogSGVhZGVycyB8IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gfCB1bmRlZmluZWQsIGtleTogc3RyaW5nKTogc3RyaW5nIHwgbnVsbCB7XG4gIGlmICghaGVhZGVycykgcmV0dXJuIG51bGw7XG4gIGlmIChoZWFkZXJzIGluc3RhbmNlb2YgSGVhZGVycykge1xuICAgIHJldHVybiBoZWFkZXJzLmdldChrZXkpO1xuICB9XG4gIHJldHVybiBoZWFkZXJzW2tleV0gPz8gaGVhZGVyc1trZXkudG9Mb3dlckNhc2UoKV0gPz8gbnVsbDtcbn1cblxuXG5mdW5jdGlvbiByZXNwb25zZUhhbmRsZXIocmVzOmFueSxyZXE6YW55LGZyb21JbnN0YW5jZTphbnkpOiBPYnNlcnZhYmxlPGFueT4ge1xuICBjb25zdCBjb250ZW50VHlwZSA9IGdldEhlYWRlclZhbHVlKHJlcy5oZWFkZXJzLCAnQ29udGVudC1UeXBlJykgPz8gJ2FwcGxpY2F0aW9uL2pzb24nO1xuICBjb25zdCBhY2NlcHRIZWFkZXIgPSBnZXRIZWFkZXJWYWx1ZShyZXEuaGVhZGVycywgJ0FjY2VwdCcpO1xuICBjb25zdCBmb3JjZWRUeXBlID0gZnJvbUluc3RhbmNlLm1ldGhvZD8ucmVzcG9uc2VUeXBlID8/IGZyb21JbnN0YW5jZS5yZXNwb25zZVR5cGU7XG5cbiAgY29uc3QgZHluYW1pY1R5cGUgPSByZXNvbHZlUmVzcG9uc2VUeXBlKGNvbnRlbnRUeXBlLCBhY2NlcHRIZWFkZXIsIGZvcmNlZFR5cGUpO1xuICBpZiAoIWR5bmFtaWNUeXBlKSB0aHJvdyBuZXcgRXJyb3IoYFVuc3VwcG9ydGVkIHJlc3BvbnNlIHR5cGUgZm9yIGNvbnRlbnQtdHlwZTogJHtjb250ZW50VHlwZX1gKTtcblxuICBjb25zdCBoYW5kbGVyID0gcmVzcG9uc2VIYW5kbGVyc1tkeW5hbWljVHlwZSBhcyBrZXlvZiB0eXBlb2YgcmVzcG9uc2VIYW5kbGVyc107XG4gIGlmICghaGFuZGxlcikgdGhyb3cgbmV3IEVycm9yKGBObyByZXNwb25zZSBoYW5kbGVyIGZvciB0eXBlOiAke2R5bmFtaWNUeXBlfWApO1xuXG4gIHJldHVybiBoYW5kbGVyLmhhbmRsZSQocmVzKTtcbn1cbiJdfQ==