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.
Files changed (2) hide show
  1. package/index.js +21 -10
  2. 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.doc.get())
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 (!get_resource.cache?.[key]) return
199
- return (await get_resource(key)).doc.get()
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
- if (u.start != u.end) {
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 = decode_version(u.version)
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 = decode_version(u.version)
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 = decode_version(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(get_resource.cache)
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 = get_resource.cache || (get_resource.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]
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "braid-text",
3
- "version": "0.0.20",
3
+ "version": "0.0.22",
4
4
  "description": "Library for collaborative text over http using braid.",
5
5
  "author": "Braid Working Group",
6
6
  "repository": "braid-org/braidjs",