braid-text 0.0.20 → 0.0.22
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/index.js +21 -10
- package/package.json +1 -1
package/index.js
CHANGED
|
@@ -4,7 +4,8 @@ let braidify = require("braid-http").http_server
|
|
|
4
4
|
let fs = require("fs")
|
|
5
5
|
|
|
6
6
|
let braid_text = {
|
|
7
|
-
db_folder: './braid-text-db'
|
|
7
|
+
db_folder: './braid-text-db',
|
|
8
|
+
cache: {}
|
|
8
9
|
}
|
|
9
10
|
|
|
10
11
|
let waiting_puts = 0
|
|
@@ -156,7 +157,7 @@ braid_text.serve = async (req, res, options = {}) => {
|
|
|
156
157
|
|
|
157
158
|
await braid_text.put(resource, { peer, version: req.version, parents: req.parents, patches, body, merge_type })
|
|
158
159
|
|
|
159
|
-
options.put_cb(options.key, resource.
|
|
160
|
+
options.put_cb(options.key, resource.val)
|
|
160
161
|
} catch (e) {
|
|
161
162
|
console.log(`EEE= ${e}:${e.stack}`)
|
|
162
163
|
// we couldn't apply the version, possibly because we're missing its parents,
|
|
@@ -195,8 +196,8 @@ braid_text.serve = async (req, res, options = {}) => {
|
|
|
195
196
|
braid_text.get = async (key, options) => {
|
|
196
197
|
if (!options) {
|
|
197
198
|
// if it doesn't exist already, don't create it in this case
|
|
198
|
-
if (!
|
|
199
|
-
return (await get_resource(key)).
|
|
199
|
+
if (!braid_text.cache[key]) return
|
|
200
|
+
return (await get_resource(key)).val
|
|
200
201
|
}
|
|
201
202
|
|
|
202
203
|
if (options.version) validate_version_array(options.version)
|
|
@@ -339,22 +340,27 @@ braid_text.put = async (key, options) => {
|
|
|
339
340
|
// validate version: make sure we haven't seen it already
|
|
340
341
|
if (v[1] <= (resource.actor_seqs[v[0]] ?? -1)) {
|
|
341
342
|
|
|
343
|
+
if (!options.validate_already_seen_versions) return
|
|
344
|
+
|
|
342
345
|
// if we have seen it already, make sure it's the same as before
|
|
343
346
|
let local_version = OpLog_remote_to_local(resource.doc, og_parents)
|
|
344
347
|
let updates = OpLog_get_patches(resource.doc.getPatchSince(local_version), resource.doc.getOpsSince(local_version))
|
|
345
348
|
|
|
346
349
|
let seen = {}
|
|
347
350
|
for (let u of updates) {
|
|
348
|
-
|
|
351
|
+
u.version = decode_version(u.version)
|
|
352
|
+
u.version[1] += u.end - u.start - 1
|
|
353
|
+
|
|
354
|
+
if (!u.content) {
|
|
349
355
|
// delete
|
|
350
|
-
let v =
|
|
356
|
+
let v = u.version
|
|
351
357
|
for (let i = 0; i < u.end - u.start; i++) {
|
|
352
358
|
let ps = (i < u.end - u.start - 1) ? [`${v[0]}-${v[1] - i - 1}`] : u.parents
|
|
353
359
|
seen[JSON.stringify([v[0], v[1] - i, ps, u.start + i])] = true
|
|
354
360
|
}
|
|
355
361
|
} else {
|
|
356
362
|
// insert
|
|
357
|
-
let v =
|
|
363
|
+
let v = u.version
|
|
358
364
|
let content = [...u.content]
|
|
359
365
|
for (let i = 0; i < content.length; i++) {
|
|
360
366
|
let ps = (i > 0) ? [`${v[0]}-${v[1] - content.length + i}`] : u.parents
|
|
@@ -380,13 +386,14 @@ braid_text.put = async (key, options) => {
|
|
|
380
386
|
}
|
|
381
387
|
// insert
|
|
382
388
|
for (let i = 0; i < p.content?.length ?? 0; i++) {
|
|
389
|
+
let vv = decode_version(v)
|
|
383
390
|
let c = p.content[i]
|
|
384
391
|
|
|
385
392
|
if (!seen[JSON.stringify([vv[0], vv[1], ps, p.range[1] + offset, c])]) throw new Error('invalid update: different from previous update with same version')
|
|
386
393
|
|
|
387
394
|
offset++
|
|
388
395
|
ps = [v]
|
|
389
|
-
v =
|
|
396
|
+
v = vv
|
|
390
397
|
v = `${v[0]}-${v[1] + 1}`
|
|
391
398
|
}
|
|
392
399
|
}
|
|
@@ -528,6 +535,8 @@ braid_text.put = async (key, options) => {
|
|
|
528
535
|
}
|
|
529
536
|
|
|
530
537
|
await resource.db_delta(resource.doc.getPatchSince(v_before))
|
|
538
|
+
|
|
539
|
+
resource.val = resource.doc.get()
|
|
531
540
|
}
|
|
532
541
|
|
|
533
542
|
braid_text.list = async () => {
|
|
@@ -537,12 +546,12 @@ braid_text.list = async () => {
|
|
|
537
546
|
var pages = new Set()
|
|
538
547
|
for (let x of await require('fs').promises.readdir(braid_text.db_folder)) pages.add(decode_filename(x.replace(/\.\w+$/, '')))
|
|
539
548
|
return [...pages.keys()]
|
|
540
|
-
} else return Object.keys(
|
|
549
|
+
} else return Object.keys(braid_text.cache)
|
|
541
550
|
} catch (e) { return [] }
|
|
542
551
|
}
|
|
543
552
|
|
|
544
553
|
async function get_resource(key) {
|
|
545
|
-
let cache =
|
|
554
|
+
let cache = braid_text.cache
|
|
546
555
|
if (!cache[key]) cache[key] = new Promise(async done => {
|
|
547
556
|
let resource = {}
|
|
548
557
|
resource.clients = new Set()
|
|
@@ -573,6 +582,8 @@ async function get_resource(key) {
|
|
|
573
582
|
delete cache[key]
|
|
574
583
|
}
|
|
575
584
|
|
|
585
|
+
resource.val = resource.doc.get()
|
|
586
|
+
|
|
576
587
|
done(resource)
|
|
577
588
|
})
|
|
578
589
|
return await cache[key]
|