Include built Camino datatypes artifacts
This commit is contained in:
Vendored
+48
@@ -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
|
||||
Reference in New Issue
Block a user