@orbitinghail/sqlsync-worker
Version:
SQLSync is a collaborative offline-first wrapper around SQLite. It is designed to synchronize web application state between users, devices, and the edge.
64 lines (52 loc) • 2.18 kB
text/typescript
import * as sha256 from "fast-sha256";
import { SqlValue } from "../sqlsync-wasm/pkg/sqlsync_wasm";
import { Row } from "./types";
// omits the given keys from each member of the union
// https://stackoverflow.com/a/57103940/65872
// biome-ignore lint/suspicious/noExplicitAny: any is required for this type magic to work
export type OmitUnion<T, K extends keyof any> = T extends any ? Omit<T, K> : never;
export type NarrowTaggedEnum<E, T> = E extends { tag: T } ? E : never;
export function assertUnreachable(err: string, x: never): never {
throw new Error(`unreachable: ${err}; got ${JSON.stringify(x)}`);
}
export function initWorker(workerUrl: string | URL): MessagePort {
const type: WorkerType = workerUrl.toString().endsWith(".cjs") ? "classic" : "module";
if (typeof SharedWorker !== "undefined") {
const worker = new SharedWorker(workerUrl, { type });
return worker.port;
}
const worker = new Worker(workerUrl, { type });
// biome-ignore lint/suspicious/noExplicitAny: WebWorker extends MessagePort via duck typing
return worker as any as MessagePort;
}
const UTF8Encoder = new TextEncoder();
export const serializeMutationAsJSON = <M>(mutation: M) => {
const serialized = JSON.stringify(mutation);
return UTF8Encoder.encode(serialized);
};
export function toRows<R extends Row = Row>(columns: string[], rows: SqlValue[][]): R[] {
const out: R[] = [];
for (const row of rows) {
const obj: Row = {};
for (let i = 0; i < columns.length; i++) {
obj[columns[i]] = row[i];
}
out.push(obj as R);
}
return out;
}
export const pendingPromise = <T = undefined>(): [Promise<T>, (v: T) => void] => {
let resolve: (v: T) => void;
const promise = new Promise<T>((r) => {
resolve = r;
});
// biome-ignore lint/style/noNonNullAssertion: we know resolve is defined because the promise constructor runs syncronously
return [promise, resolve!];
};
export const sha256Digest = async (data: Uint8Array): Promise<Uint8Array> => {
if (crypto?.subtle?.digest) {
const hash = await crypto.subtle.digest("SHA-256", data);
return new Uint8Array(hash);
}
return Promise.resolve(sha256.hash(data));
};