diff --git a/.gitignore b/.gitignore index b62cda6..94252e3 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,5 @@ -dist/ +dist/* +!dist/src/ +!dist/src/** node_modules/ .yarn/install-state.gz diff --git a/dist/src/crdt-automerge.d.ts b/dist/src/crdt-automerge.d.ts new file mode 100644 index 0000000..7ae4067 --- /dev/null +++ b/dist/src/crdt-automerge.d.ts @@ -0,0 +1,27 @@ +import * as Automerge from "@automerge/automerge"; +export type CaminoCrdtEncoding = "base64"; +export type CaminoCrdtEnvelope = { + $caminoCrdtType: string; + $caminoCrdtEncoding: CaminoCrdtEncoding; + $caminoCrdtPayload: string; +}; +type AutomergeFieldDoc = { + value: unknown; +}; +export declare const isCaminoCrdtEnvelope: (value: unknown) => value is CaminoCrdtEnvelope; +export declare const loadAutomergeFieldDoc: (value: CaminoCrdtEnvelope, type: string) => Automerge.Doc; +export declare const saveAutomergeFieldDoc: (doc: Automerge.Doc, type: string) => CaminoCrdtEnvelope; +export declare const createAutomergeFieldValue: (value: unknown, type: string) => CaminoCrdtEnvelope; +export declare const normalizeAutomergeFieldValue: (value: unknown, type: string) => CaminoCrdtEnvelope; +export declare const materializeAutomergeFieldValue: (value: CaminoCrdtEnvelope, type: string) => unknown; +export type MergeAutomergeFieldValueParams = { + existing?: unknown; + incoming: unknown; + type: string; +}; +export type MergeAutomergeFieldValueResult = { + stored: CaminoCrdtEnvelope; + materialized: unknown; +}; +export declare const mergeAutomergeFieldValues: ({ existing, incoming, type, }: MergeAutomergeFieldValueParams) => MergeAutomergeFieldValueResult; +export {}; diff --git a/dist/src/crdt-automerge.js b/dist/src/crdt-automerge.js new file mode 100644 index 0000000..cc8c637 --- /dev/null +++ b/dist/src/crdt-automerge.js @@ -0,0 +1,48 @@ +import * as Automerge from "@automerge/automerge"; +const bytesToBase64 = (value) => Buffer.from(value).toString("base64"); +const base64ToBytes = (value) => Buffer.from(value, "base64"); +export const isCaminoCrdtEnvelope = (value) => Boolean(value) && + typeof value === "object" && + !Array.isArray(value) && + typeof value.$caminoCrdtType === + "string" && + typeof value.$caminoCrdtPayload === + "string" && + (value.$caminoCrdtEncoding === + undefined || + value.$caminoCrdtEncoding === + "base64"); +const assertEnvelopeType = (value, type) => { + if (value.$caminoCrdtType !== type) { + throw new Error(`CRDT type mismatch: expected ${type}, got ${value.$caminoCrdtType}`); + } +}; +export const loadAutomergeFieldDoc = (value, type) => { + assertEnvelopeType(value, type); + return Automerge.load(base64ToBytes(value.$caminoCrdtPayload)); +}; +export const saveAutomergeFieldDoc = (doc, type) => ({ + $caminoCrdtType: type, + $caminoCrdtEncoding: "base64", + $caminoCrdtPayload: bytesToBase64(Automerge.save(doc)), +}); +export const createAutomergeFieldValue = (value, type) => saveAutomergeFieldDoc(Automerge.from({ value }), type); +export const normalizeAutomergeFieldValue = (value, type) => { + if (isCaminoCrdtEnvelope(value)) { + return saveAutomergeFieldDoc(loadAutomergeFieldDoc(value, type), type); + } + return createAutomergeFieldValue(value, type); +}; +export const materializeAutomergeFieldValue = (value, type) => loadAutomergeFieldDoc(value, type).value; +export const mergeAutomergeFieldValues = ({ existing, incoming, type, }) => { + const incomingDoc = loadAutomergeFieldDoc(normalizeAutomergeFieldValue(incoming, type), type); + const mergedDoc = existing === undefined || existing === null + ? incomingDoc + : Automerge.merge(loadAutomergeFieldDoc(normalizeAutomergeFieldValue(existing, type), type), incomingDoc); + const stored = saveAutomergeFieldDoc(mergedDoc, type); + return { + stored, + materialized: mergedDoc.value, + }; +}; +//# sourceMappingURL=crdt-automerge.js.map \ No newline at end of file diff --git a/dist/src/crdt-automerge.js.map b/dist/src/crdt-automerge.js.map new file mode 100644 index 0000000..3c29f04 --- /dev/null +++ b/dist/src/crdt-automerge.js.map @@ -0,0 +1 @@ +{"version":3,"file":"crdt-automerge.js","sourceRoot":"","sources":["../../src/crdt-automerge.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/dist/src/field-semantics.d.ts b/dist/src/field-semantics.d.ts new file mode 100644 index 0000000..b5cf85a --- /dev/null +++ b/dist/src/field-semantics.d.ts @@ -0,0 +1,38 @@ +export type UnknownFieldClock = { + kind: "unknown"; +}; +export type RevisionFieldClock = { + kind: "revision"; + revision: bigint; +}; +export type FieldClock = UnknownFieldClock | RevisionFieldClock; +export type CanonicalFieldValue = { + value: T; + clock: FieldClock; +}; +export type PendingFieldWrite = { + clientMutationId: string; + sequence: number; + value: T; +}; +export type RegisterFieldState = { + canonical: CanonicalFieldValue; + visible: T; + pending: PendingFieldWrite[]; + nextPendingSequence: number; +}; +export type FieldApplyResult = { + accepted: boolean; + canonicalChanged: boolean; + pendingChanged: boolean; + visibleChanged: boolean; +}; +export declare const unknownFieldClock: () => FieldClock; +export declare const revisionFieldClock: (revision: string | number | bigint | undefined | null) => FieldClock; +export declare const fieldClockToRevisionString: (clock: FieldClock) => string; +export declare const compareFieldClocks: (left: FieldClock, right: FieldClock) => "older" | "same" | "newer" | "unknown"; +export declare const sameFieldClock: (left: FieldClock, right: FieldClock) => boolean; +export declare const createRegisterFieldState: (initial: CanonicalFieldValue) => RegisterFieldState; +export declare const applyCanonicalFieldValue: (state: RegisterFieldState, incoming: CanonicalFieldValue, clientMutationId?: string) => FieldApplyResult; +export declare const beginLocalFieldWrite: (state: RegisterFieldState, clientMutationId: string, value: T) => FieldApplyResult; +export declare const failLocalFieldWrite: (state: RegisterFieldState, clientMutationId: string) => FieldApplyResult; diff --git a/dist/src/field-semantics.js b/dist/src/field-semantics.js new file mode 100644 index 0000000..0ec3aa5 --- /dev/null +++ b/dist/src/field-semantics.js @@ -0,0 +1,104 @@ +export const unknownFieldClock = () => ({ kind: "unknown" }); +export const revisionFieldClock = (revision) => { + if (typeof revision === "bigint") { + return { kind: "revision", revision }; + } + if (typeof revision === "number" && Number.isInteger(revision) && revision >= 0) { + return { kind: "revision", revision: BigInt(revision) }; + } + if (typeof revision === "string" && /^\d+$/.test(revision)) { + return { kind: "revision", revision: BigInt(revision) }; + } + return unknownFieldClock(); +}; +export const fieldClockToRevisionString = (clock) => clock.kind === "revision" ? clock.revision.toString() : ""; +export const compareFieldClocks = (left, right) => { + if (left.kind === "revision" && right.kind === "revision") { + if (left.revision < right.revision) { + return "older"; + } + if (left.revision > right.revision) { + return "newer"; + } + return "same"; + } + if (left.kind === "unknown" && right.kind === "unknown") { + return "same"; + } + return "unknown"; +}; +export const sameFieldClock = (left, right) => compareFieldClocks(left, right) === "same"; +const shouldAcceptCanonical = (incoming, current) => { + const order = compareFieldClocks(incoming, current); + if (order === "older") { + return false; + } + if (order === "unknown" && current.kind !== "unknown") { + return false; + } + return true; +}; +const latestPendingValue = (state) => state.pending.at(-1)?.value; +const recomputeVisible = (state) => { + const pendingValue = latestPendingValue(state); + return pendingValue === undefined ? state.canonical.value : pendingValue; +}; +export const createRegisterFieldState = (initial) => ({ + canonical: initial, + visible: initial.value, + pending: [], + nextPendingSequence: 1, +}); +export const applyCanonicalFieldValue = (state, incoming, clientMutationId) => { + const visibleBefore = state.visible; + const pendingBefore = state.pending.length; + if (!shouldAcceptCanonical(incoming.clock, state.canonical.clock)) { + return { + accepted: false, + canonicalChanged: false, + pendingChanged: false, + visibleChanged: false, + }; + } + const canonicalChanged = !Object.is(state.canonical.value, incoming.value) || + !sameFieldClock(state.canonical.clock, incoming.clock); + state.canonical = incoming; + if (clientMutationId) { + state.pending = state.pending.filter((entry) => entry.clientMutationId !== clientMutationId); + } + state.visible = recomputeVisible(state); + return { + accepted: true, + canonicalChanged, + pendingChanged: state.pending.length !== pendingBefore, + visibleChanged: !Object.is(state.visible, visibleBefore), + }; +}; +export const beginLocalFieldWrite = (state, clientMutationId, value) => { + const visibleBefore = state.visible; + state.pending.push({ + clientMutationId, + sequence: state.nextPendingSequence++, + value, + }); + state.visible = value; + return { + accepted: true, + canonicalChanged: false, + pendingChanged: true, + visibleChanged: !Object.is(state.visible, visibleBefore), + }; +}; +export const failLocalFieldWrite = (state, clientMutationId) => { + const visibleBefore = state.visible; + const pendingBefore = state.pending.length; + state.pending = state.pending.filter((entry) => entry.clientMutationId !== clientMutationId); + state.visible = recomputeVisible(state); + return { + accepted: true, + canonicalChanged: false, + pendingChanged: state.pending.length !== pendingBefore, + visibleChanged: !Object.is(state.visible, visibleBefore), + }; +}; +//# sourceMappingURL=field-semantics.js.map \ No newline at end of file diff --git a/dist/src/field-semantics.js.map b/dist/src/field-semantics.js.map new file mode 100644 index 0000000..c6f928e --- /dev/null +++ b/dist/src/field-semantics.js.map @@ -0,0 +1 @@ +{"version":3,"file":"field-semantics.js","sourceRoot":"","sources":["../../src/field-semantics.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/dist/src/index.d.ts b/dist/src/index.d.ts new file mode 100644 index 0000000..fabe335 --- /dev/null +++ b/dist/src/index.d.ts @@ -0,0 +1,2 @@ +export * from "./field-semantics.js"; +export * from "./crdt-automerge.js"; diff --git a/dist/src/index.js b/dist/src/index.js new file mode 100644 index 0000000..fed6bd1 --- /dev/null +++ b/dist/src/index.js @@ -0,0 +1,3 @@ +export * from "./field-semantics.js"; +export * from "./crdt-automerge.js"; +//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/dist/src/index.js.map b/dist/src/index.js.map new file mode 100644 index 0000000..71a2b92 --- /dev/null +++ b/dist/src/index.js.map @@ -0,0 +1 @@ +{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,sBAAsB,CAAC;AACrC,cAAc,qBAAqB,CAAC"} \ No newline at end of file