UNPKG

@snap/camera-kit

Version:
69 lines 3.03 kB
import { catchError, map, merge, retry, Subject, takeUntil, tap } from "rxjs"; import { forActions } from "@snap/state-management"; function callCancellationHandler(cancellationHandlers, ...keys) { var _a; for (const key of keys) { (_a = cancellationHandlers.get(key)) === null || _a === void 0 ? void 0 : _a(); cancellationHandlers.delete(key); } } function handleLensApplicationEnd(lensRequestState, ...lensIds) { for (const lensId of lensIds) { const state = lensRequestState.get(lensId); if (state) { callCancellationHandler(state.cancellationHandlers, ...state.cancellationHandlers.keys()); lensRequestState.delete(lensId); } } } export function createUriRequestProcessor({ uri, lensState, sessionState, createLensRequestState, processRequest, processInternalError, }) { const uriRequests = new Subject(); const uriCancelRequests = new Subject(); const lensRequestState = new Map(); const lensTurnOffEvents = lensState.events.pipe(forActions("turnedOff"), tap(([action]) => handleLensApplicationEnd(lensRequestState, action.data.id))); const uriRequestEvents = uriRequests.pipe(map(({ request, lens, reply }) => { if (!lensRequestState.has(lens.id)) { const custom = createLensRequestState === null || createLensRequestState === void 0 ? void 0 : createLensRequestState(request, lens); const state = { cancellationHandlers: new Map(), custom: custom, }; lensRequestState.set(lens.id, state); } const requestState = lensRequestState.get(lens.id); return { request, reply, lens, state: requestState.custom, setCancellationHandler: (fn) => { requestState.cancellationHandlers.set(request.identifier, fn); }, }; }), tap(processRequest)); const uriCancelRequestEvents = uriCancelRequests.pipe(tap((uriRequest) => { var _a; const cancellationHandlers = (_a = lensRequestState.get(uriRequest.lens.id)) === null || _a === void 0 ? void 0 : _a.cancellationHandlers; if (cancellationHandlers) { callCancellationHandler(cancellationHandlers, uriRequest.request.requestId); } })); merge(lensTurnOffEvents, uriRequestEvents, uriCancelRequestEvents) .pipe(catchError((error, sourcePipe) => { processInternalError(error); return sourcePipe; }), retry(), takeUntil(sessionState.events.pipe(forActions("destroy")))) .subscribe({ complete: () => handleLensApplicationEnd(lensRequestState, ...lensRequestState.keys()), }); return { uri, handleRequest(request, reply, lens) { uriRequests.next({ request, reply, lens }); }, cancelRequest(request, lens) { uriCancelRequests.next({ request, lens }); }, }; } //# sourceMappingURL=uriRequestProcessor.js.map