UNPKG

crux-wrapper

Version:

A React provider for your crux application

92 lines 2.78 kB
class Logger { log; constructor(log) { this.log = log; } baseLog(entity) { return { name: entity.constructor.name, at: performance.now(), }; } createEffectLog(id, effect) { const baseLog = this.baseLog(effect); return { ...this.baseLog(effect), type: "effect", id: `${baseLog.name}-${id}-${baseLog.at}`, }; } logEvent(entity) { this.log({ ...this.baseLog(entity), type: "event", }); } finishEffectLog(effectLog) { this.log({ ...effectLog, time: performance.now() - effectLog.at, }); } logResponse(effectId, entity) { this.log({ ...this.baseLog(entity), type: "response", to: effectId, }); } } export function createSender(apiRef, onEffect, serializer, log) { const logger = log && new Logger(log); function getApi() { if (!apiRef.value) { throw new Error("Core not initialized. Call init() first."); } return apiRef.value; } async function handleEffect(rawEffects) { const effects = serializer.deserializeEffects(rawEffects); await Promise.all(effects.map(async ({ id, effect }) => { const effectLog = logger?.createEffectLog(id, effect); const view = async () => { const api = await getApi(); return serializer.deserializeView(await api.view()); }; const respondInternal = (response) => { logger?.logResponse(effectLog?.id, response); return respond(id, response); }; const response = await onEffect(effect, { respond: respondInternal, send, view, }); logger?.finishEffectLog(effectLog); if (response) { await respond(id, response); } })); } async function exhaust(sendPayload) { const effects = await sendPayload(); return handleEffect(effects); } function send(event) { logger?.logEvent(event); return exhaust(async () => (await getApi()).process_event(serializer.serialize(event))); } function respond(id, response) { return exhaust(async () => (await getApi()).handle_response(id, serializer.serialize(response))); } return { send(event) { if (!apiRef.value) { throw new Error("Core not initialized. Call init() first."); } return send(event); }, handleEffect, }; } //# sourceMappingURL=eventSender.js.map