UNPKG

resig.js

Version:

Universal reactive signal library with complete platform features: signals, animations, CRDTs, scheduling, DOM integration. Works identically across React, SolidJS, Svelte, Vue, and Qwik.

364 lines 30.5 kB
"use strict"; /** * CRDT (Conflict-free Replicated Data Types) Core Primitives * Following categorical design principles with commutative monoid laws */ Object.defineProperty(exports, "__esModule", { value: true }); exports.reactiveLWWRegister = exports.reactiveORSet = exports.reactivePNCounter = exports.reactiveGCounter = exports.orSet = exports.lwwRegister = exports.gSet = exports.pnCounter = exports.gCounter = exports.compareTimestamps = exports.timestamp = void 0; const signal_1 = require("../core/signal"); const timestamp = (nodeId = Math.random().toString(36)) => ({ time: Date.now(), nodeId, }); exports.timestamp = timestamp; const compareTimestamps = (a, b) => { if (a.time !== b.time) return a.time - b.time; return a.nodeId.localeCompare(b.nodeId); }; exports.compareTimestamps = compareTimestamps; const gCounter = (nodeId = Math.random().toString(36)) => { const counters = new Map(); counters.set(nodeId, 0); const instance = { value: () => Array.from(counters.values()).reduce((sum, val) => sum + val, 0), increment: (amount = 1) => { const current = counters.get(nodeId) || 0; counters.set(nodeId, current + amount); }, merge: (other) => { if (other && typeof other === 'object' && other.counters) { for (const [id, value] of Object.entries(other.counters)) { const current = counters.get(id) || 0; counters.set(id, Math.max(current, value)); } } }, clone: () => { const cloned = (0, exports.gCounter)(nodeId); cloned.merge({ counters: Object.fromEntries(counters) }); return cloned; }, toJSON: () => ({ type: 'GCounter', counters: Object.fromEntries(counters), }), fromJSON: (json) => { if (json.type === 'GCounter' && json.counters) { counters.clear(); for (const [id, value] of Object.entries(json.counters)) { counters.set(id, value); } } }, }; return instance; }; exports.gCounter = gCounter; const pnCounter = (nodeId = Math.random().toString(36)) => { const positive = (0, exports.gCounter)(nodeId); const negative = (0, exports.gCounter)(nodeId); const instance = { value: () => positive.value() - negative.value(), increment: (amount = 1) => positive.increment(amount), decrement: (amount = 1) => negative.increment(amount), merge: (other) => { if (other && typeof other === 'object') { if (other.positive) positive.merge(other.positive); if (other.negative) negative.merge(other.negative); } }, clone: () => { const cloned = (0, exports.pnCounter)(nodeId); cloned.merge({ positive: positive.toJSON(), negative: negative.toJSON(), }); return cloned; }, toJSON: () => ({ type: 'PNCounter', positive: positive.toJSON(), negative: negative.toJSON(), }), fromJSON: (json) => { if (json.type === 'PNCounter') { if (json.positive) positive.fromJSON(json.positive); if (json.negative) negative.fromJSON(json.negative); } }, }; return instance; }; exports.pnCounter = pnCounter; const gSet = () => { const elements = new Set(); const instance = { value: () => new Set(elements), add: (element) => elements.add(element), has: (element) => elements.has(element), merge: (other) => { if (other && typeof other === 'object' && other.elements) { for (const element of other.elements) { elements.add(element); } } }, clone: () => { const cloned = (0, exports.gSet)(); cloned.merge({ elements: Array.from(elements) }); return cloned; }, toJSON: () => ({ type: 'GSet', elements: Array.from(elements) }), fromJSON: (json) => { if (json.type === 'GSet' && Array.isArray(json.elements)) { elements.clear(); for (const element of json.elements) { elements.add(element); } } }, }; return instance; }; exports.gSet = gSet; const lwwRegister = (nodeId = Math.random().toString(36), initialValue) => { let value = initialValue; let ts = initialValue !== undefined ? (0, exports.timestamp)(nodeId) : undefined; const instance = { value: () => value, getTimestamp: () => ts, set: (newValue) => { value = newValue; ts = (0, exports.timestamp)(nodeId); }, merge: (other) => { if (other && typeof other === 'object' && other.timestamp) { const otherTs = other.timestamp; if (!ts || (0, exports.compareTimestamps)(otherTs, ts) > 0) { value = other.value; ts = otherTs; } } }, clone: () => { const cloned = (0, exports.lwwRegister)(nodeId); if (ts) { cloned.merge({ value, timestamp: ts }); } return cloned; }, toJSON: () => ({ type: 'LWWRegister', value, timestamp: ts }), fromJSON: (json) => { if (json.type === 'LWWRegister') { value = json.value; ts = json.timestamp; } }, }; return instance; }; exports.lwwRegister = lwwRegister; const orSet = (nodeId = Math.random().toString(36)) => { const added = new Map(); const removed = new Map(); const generateTag = () => `${nodeId}-${Date.now()}-${Math.random()}`; const instance = { value: () => { const result = new Set(); const addedEntries = Array.from(added.entries()); for (const [element, addTags] of addedEntries) { const removeTags = removed.get(element) || new Set(); // Element is in the set if it has add tags not in remove tags if (Array.from(addTags).some((tag) => !removeTags.has(tag))) { result.add(element); } } return result; }, add: (element) => { if (!added.has(element)) { added.set(element, new Set()); } added.get(element).add(generateTag()); }, remove: (element) => { const addTags = added.get(element); if (addTags) { if (!removed.has(element)) { removed.set(element, new Set()); } const removeTags = removed.get(element); const addTagsArray = Array.from(addTags); for (const tag of addTagsArray) { removeTags.add(tag); } } }, has: (element) => instance.value().has(element), merge: (other) => { if (other && typeof other === 'object') { // Merge added tags if (other.added) { for (const [element, tags] of Object.entries(other.added)) { if (!added.has(element)) { added.set(element, new Set()); } const currentTags = added.get(element); for (const tag of tags) { currentTags.add(tag); } } } // Merge removed tags if (other.removed) { for (const [element, tags] of Object.entries(other.removed)) { if (!removed.has(element)) { removed.set(element, new Set()); } const currentTags = removed.get(element); for (const tag of tags) { currentTags.add(tag); } } } } }, clone: () => { const cloned = (0, exports.orSet)(nodeId); cloned.merge({ added: Object.fromEntries(Array.from(added.entries()).map(([k, v]) => [k, Array.from(v)])), removed: Object.fromEntries(Array.from(removed.entries()).map(([k, v]) => [k, Array.from(v)])), }); return cloned; }, toJSON: () => ({ type: 'ORSet', added: Object.fromEntries(Array.from(added.entries()).map(([k, v]) => [k, Array.from(v)])), removed: Object.fromEntries(Array.from(removed.entries()).map(([k, v]) => [k, Array.from(v)])), }), fromJSON: (json) => { if (json.type === 'ORSet') { if (json.added) { added.clear(); for (const [element, tags] of Object.entries(json.added)) { added.set(element, new Set(tags)); } } if (json.removed) { removed.clear(); for (const [element, tags] of Object.entries(json.removed)) { removed.set(element, new Set(tags)); } } } }, }; return instance; }; exports.orSet = orSet; // Reactive G-Counter const reactiveGCounter = (nodeId) => { const crdt = (0, exports.gCounter)(nodeId); const sig = (0, signal_1.signal)(crdt.value()); // Create wrapper with reactive methods const reactiveWrapper = { ...crdt, increment: (amount) => { crdt.increment(amount); sig._set(crdt.value()); }, merge: (other) => { crdt.merge(other); sig._set(crdt.value()); }, }; return { crdt: reactiveWrapper, signal: sig, subscribe: sig.subscribe, }; }; exports.reactiveGCounter = reactiveGCounter; // Reactive PN-Counter const reactivePNCounter = (nodeId) => { const crdt = (0, exports.pnCounter)(nodeId); const sig = (0, signal_1.signal)(crdt.value()); // Create wrapper with reactive methods const reactiveWrapper = { ...crdt, increment: (amount) => { crdt.increment(amount); sig._set(crdt.value()); }, decrement: (amount) => { crdt.decrement(amount); sig._set(crdt.value()); }, merge: (other) => { crdt.merge(other); sig._set(crdt.value()); }, }; return { crdt: reactiveWrapper, signal: sig, subscribe: sig.subscribe, }; }; exports.reactivePNCounter = reactivePNCounter; // Reactive OR-Set const reactiveORSet = (nodeId) => { const crdt = (0, exports.orSet)(nodeId); const sig = (0, signal_1.signal)(crdt.value()); // Create wrapper with reactive methods const reactiveWrapper = { ...crdt, add: (element) => { crdt.add(element); sig._set(crdt.value()); }, remove: (element) => { crdt.remove(element); sig._set(crdt.value()); }, merge: (other) => { crdt.merge(other); sig._set(crdt.value()); }, }; return { crdt: reactiveWrapper, signal: sig, subscribe: sig.subscribe, }; }; exports.reactiveORSet = reactiveORSet; // Reactive LWW-Register const reactiveLWWRegister = (nodeId, initialValue) => { const crdt = (0, exports.lwwRegister)(nodeId, initialValue); const sig = (0, signal_1.signal)(crdt.value()); // Create wrapper with reactive methods const reactiveWrapper = { ...crdt, set: (value) => { crdt.set(value); sig._set(crdt.value()); }, merge: (other) => { crdt.merge(other); sig._set(crdt.value()); }, }; return { crdt: reactiveWrapper, signal: sig, subscribe: sig.subscribe, }; }; exports.reactiveLWWRegister = reactiveLWWRegister; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvY3JkdC9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7OztHQUdHOzs7QUFFSCwyQ0FBZ0Q7QUFpQnpDLE1BQU0sU0FBUyxHQUFHLENBQ3ZCLFNBQWlCLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLEVBQ2hDLEVBQUUsQ0FBQyxDQUFDO0lBQ2YsSUFBSSxFQUFFLElBQUksQ0FBQyxHQUFHLEVBQUU7SUFDaEIsTUFBTTtDQUNQLENBQUMsQ0FBQztBQUxVLFFBQUEsU0FBUyxhQUtuQjtBQUVJLE1BQU0saUJBQWlCLEdBQUcsQ0FBQyxDQUFZLEVBQUUsQ0FBWSxFQUFVLEVBQUU7SUFDdEUsSUFBSSxDQUFDLENBQUMsSUFBSSxLQUFLLENBQUMsQ0FBQyxJQUFJO1FBQUUsT0FBTyxDQUFDLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUM7SUFDOUMsT0FBTyxDQUFDLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUM7QUFDMUMsQ0FBQyxDQUFDO0FBSFcsUUFBQSxpQkFBaUIscUJBRzVCO0FBZUssTUFBTSxRQUFRLEdBQUcsQ0FDdEIsU0FBaUIsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsRUFDakMsRUFBRTtJQUNaLE1BQU0sUUFBUSxHQUFHLElBQUksR0FBRyxFQUFrQixDQUFDO0lBQzNDLFFBQVEsQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBRXhCLE1BQU0sUUFBUSxHQUFhO1FBQ3pCLEtBQUssRUFBRSxHQUFHLEVBQUUsQ0FDVixLQUFLLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUFD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