UNPKG

json-crdt-repo

Version:

JSON CRDT server and syncing local-first browser client

63 lines (62 loc) 2.32 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.JsonCrdtRepo = void 0; const browser_level_1 = require("browser-level"); const browser_1 = require("@jsonjoy.com/reactive-rpc/lib/browser"); const DemoServerRemoteHistory_1 = require("./remote/DemoServerRemoteHistory"); const EditSessionFactory_1 = require("./session/EditSessionFactory"); const pubsub_1 = require("./pubsub"); const Locks_1 = require("thingies/lib/Locks"); const LevelLocalRepo_1 = require("./local/level/LevelLocalRepo"); const json_crdt_1 = require("json-joy/lib/json-crdt"); const onLine_1 = require("rx-use/lib/onLine$"); class JsonCrdtRepo { constructor(opts) { this.opts = { name: opts?.name ?? 'json-crdt-repo', wsUrl: opts?.wsUrl ?? 'wss://api.jsonjoy.org/rx', ...opts, }; const client = (0, browser_1.createBinaryClient)(this.opts.wsUrl); const sid = this.readSid(); const clientId = (sid % 0xfffffffe) + 1; this.remote = new DemoServerRemoteHistory_1.DemoServerRemoteHistory(client, clientId); const kv = new browser_level_1.BrowserLevel(this.opts.name, { keyEncoding: 'utf8', valueEncoding: 'view', }); const pubsub = new pubsub_1.PubSubBC(this.opts.name); const locks = new Locks_1.Locks(); const connected$ = onLine_1.onLine$; const repo = new LevelLocalRepo_1.LevelLocalRepo({ kv, locks, sid, rpc: this.remote, pubsub, connected$, }); this.sessions = new EditSessionFactory_1.EditSessionFactory({ repo, sid, }); } readSid() { const ls = window.localStorage; const key = this.opts.name + '-sid'; const value = ls.getItem(key); if (value) return +value; const sid = json_crdt_1.Model.sid(); ls.setItem(key, sid + ''); return sid; } genId() { return 'id-' + Date.now().toString(36) + Math.random().toString(36).slice(2); } make(id = ['default', this.genId()]) { const { session } = this.sessions.make({ id: Array.isArray(id) ? id : ['default', id] }); return session; } } exports.JsonCrdtRepo = JsonCrdtRepo;