@yaagoub/decorators
Version:
Angular decorators
90 lines • 15.8 kB
JavaScript
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==