swarpc
Version:
Full type-safe RPC library for service worker -- move things off of the UI thread with ease!
89 lines (88 loc) • 3 kB
JavaScript
export function isPayloadInitialize(payload) {
if (typeof payload !== "object")
return false;
if (payload === null)
return false;
if (!("by" in payload))
return false;
if (!("nodeId" in payload))
return false;
if (!("functionName" in payload))
return false;
if (!("localStorageData" in payload))
return false;
if (!("isInitializeRequest" in payload))
return false;
if (payload.by !== "sw&rpc")
return false;
if (payload.functionName !== "#initialize")
return false;
if (payload.isInitializeRequest !== true)
return false;
if (typeof payload.nodeId !== "string")
return false;
if (typeof payload.localStorageData !== "object")
return false;
if (payload.localStorageData === null)
return false;
return true;
}
export function isPayloadHeader(procedures, payload) {
if (typeof payload !== "object")
return false;
if (payload === null)
return false;
if (!("by" in payload))
return false;
if (!("requestId" in payload))
return false;
if (!("functionName" in payload))
return false;
if (payload.by !== "sw&rpc")
return false;
if (typeof payload.requestId !== "string")
return false;
if (typeof payload.functionName !== "string")
return false;
if (!Object.keys(procedures).includes(payload.functionName))
return false;
return true;
}
export function validatePayloadCore(procedure, payload) {
if (typeof payload !== "object")
throw new Error("payload is not an object");
if (payload === null)
throw new Error("payload is null");
if ("input" in payload) {
const input = procedure.input["~standard"].validate(payload.input);
if ("value" in input)
return { input: input.value };
}
if ("progress" in payload) {
const progress = procedure.progress["~standard"].validate(payload.progress);
if ("value" in progress)
return { progress: progress.value };
}
if ("result" in payload) {
const result = procedure.success["~standard"].validate(payload.result);
if ("value" in result)
return { result: result.value };
}
if ("abort" in payload &&
typeof payload.abort === "object" &&
payload.abort !== null &&
"reason" in payload.abort &&
typeof payload.abort.reason === "string") {
return { abort: { reason: payload.abort.reason } };
}
if ("error" in payload &&
typeof payload.error === "object" &&
payload.error !== null &&
"message" in payload.error &&
typeof payload.error.message === "string") {
return { error: { message: payload.error.message } };
}
throw new Error("invalid payload");
}
export const zImplementations = Symbol("SWARPC implementations");
export const zProcedures = Symbol("SWARPC procedures");