crux-wrapper
Version:
A React provider for your crux application
92 lines • 2.78 kB
JavaScript
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