json-crdt-repo
Version:
JSON CRDT server and syncing local-first browser client
63 lines (62 loc) • 2.32 kB
JavaScript
;
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;