@snap/camera-kit
Version:
Camera Kit Web
69 lines • 3.03 kB
JavaScript
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