braid-text 0.0.28 → 0.0.29

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 (3) hide show
  1. package/index.js +45 -4
  2. package/package.json +1 -1
  3. package/test.js +37 -21
package/index.js CHANGED
@@ -5,6 +5,7 @@ let fs = require("fs")
5
5
 
6
6
  let braid_text = {
7
7
  db_folder: './braid-text-db',
8
+ length_cache_size: 10,
8
9
  cache: {}
9
10
  }
10
11
 
@@ -301,10 +302,10 @@ braid_text.put = async (key, options) => {
301
302
  let parents = resource.doc.getRemoteVersion().map((x) => x.join("-")).sort()
302
303
  let og_parents = options_parents || parents
303
304
 
304
- let max_pos = count_code_points(v_eq(parents, og_parents) ?
305
- resource.doc.get() :
306
- dt_get(resource.doc, og_parents).get())
307
-
305
+ let max_pos = resource.length_cache.get('' + og_parents) ??
306
+ (v_eq(parents, og_parents) ? resource.doc.len() :
307
+ dt_get(resource.doc, og_parents).len())
308
+
308
309
  if (body != null) {
309
310
  patches = [{
310
311
  unit: 'text',
@@ -400,6 +401,10 @@ braid_text.put = async (key, options) => {
400
401
  }
401
402
  resource.actor_seqs[v[0]] = v[1]
402
403
 
404
+ resource.length_cache.put(`${v[0]}-${v[1]}`, patches.reduce((a, b) =>
405
+ a + (b.content.length ? b.content.length : -(b.range[1] - b.range[0])),
406
+ max_pos))
407
+
403
408
  v = `${v[0]}-${v[1] + 1 - change_count}`
404
409
 
405
410
  let ps = og_parents
@@ -581,6 +586,8 @@ async function get_resource(key) {
581
586
 
582
587
  resource.val = resource.doc.get()
583
588
 
589
+ resource.length_cache = createSimpleCache(braid_text.length_cache_size)
590
+
584
591
  done(resource)
585
592
  })
586
593
  return await cache[key]
@@ -1513,6 +1520,40 @@ function validate_patch(x) {
1513
1520
  if (typeof x.content !== 'string') throw new Error(`invalid patch content: must be a string`)
1514
1521
  }
1515
1522
 
1523
+ function createSimpleCache(size) {
1524
+ const maxSize = size
1525
+ const cache = new Map()
1526
+
1527
+ return {
1528
+ put(key, value) {
1529
+ if (cache.has(key)) {
1530
+ // If the key already exists, update its value and move it to the end
1531
+ cache.delete(key)
1532
+ cache.set(key, value)
1533
+ } else {
1534
+ // If the cache is full, remove the oldest entry
1535
+ if (cache.size >= maxSize) {
1536
+ const oldestKey = cache.keys().next().value
1537
+ cache.delete(oldestKey)
1538
+ }
1539
+ // Add the new key-value pair
1540
+ cache.set(key, value)
1541
+ }
1542
+ },
1543
+
1544
+ get(key) {
1545
+ if (!cache.has(key)) {
1546
+ return null
1547
+ }
1548
+ // Move the accessed item to the end (most recently used)
1549
+ const value = cache.get(key)
1550
+ cache.delete(key)
1551
+ cache.set(key, value)
1552
+ return value
1553
+ },
1554
+ }
1555
+ }
1556
+
1516
1557
  braid_text.encode_filename = encode_filename
1517
1558
  braid_text.decode_filename = decode_filename
1518
1559
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "braid-text",
3
- "version": "0.0.28",
3
+ "version": "0.0.29",
4
4
  "description": "Library for collaborative text over http using braid.",
5
5
  "author": "Braid Working Group",
6
6
  "repository": "braid-org/braidjs",
package/test.js CHANGED
@@ -9,10 +9,10 @@ async function main() {
9
9
 
10
10
  let og_log = console.log
11
11
  console.log = () => {}
12
- for (let t = 0; t < 50000; t++) {
12
+ for (let t = 0; t < 10000; t++) {
13
13
  let seed = base + t
14
- // for (let t = 0; t < 1; t++) {
15
- // let seed = 7271846
14
+ // for (let t = 0; t < 10; t++) {
15
+ // let seed = 1188661 + t
16
16
 
17
17
  og_log(`t = ${t}, seed = ${seed}, best_n = ${best_n} @ ${best_seed}`)
18
18
  Math.randomSeed(seed)
@@ -24,9 +24,19 @@ async function main() {
24
24
  // 1. create a bunch of edits to a dt
25
25
  let doc = new Doc('server')
26
26
 
27
+ let middle_doc = null
28
+
29
+ if (!middle_doc && (Math.random() < 1/n || n == 0)) {
30
+ middle_doc = Doc.fromBytes(doc.toBytes())
31
+ }
27
32
  for (let i = 0; i < n; i++) {
28
33
  make_random_edit(doc)
34
+
35
+ if (!middle_doc && (Math.random() < 1/n || i == n - 1)) {
36
+ middle_doc = Doc.fromBytes(doc.toBytes())
37
+ }
29
38
  }
39
+ if (!middle_doc) throw 'bad'
30
40
 
31
41
  // 2. let x = the resulting string
32
42
  let x = doc.get()
@@ -49,37 +59,43 @@ async function main() {
49
59
  }
50
60
 
51
61
  // 5. test dt_get
52
- let z = dt_get(doc, doc.getRemoteVersion().map(x => x.join('-'))).get()
53
- console.log('z = ' + z)
54
- console.log(x == z)
55
- if (x != z && n < best_n) {
62
+ let middle_v = middle_doc.getRemoteVersion().map(x => x.join('-'))
63
+ let new_middle_doc = dt_get(doc, middle_v)
64
+ console.log('new_middle_doc = ' + new_middle_doc.get())
65
+ if (middle_doc.get() != new_middle_doc.get() && n < best_n) {
56
66
  best_n = n
57
67
  best_seed = seed
58
68
  }
59
69
 
60
70
  // 6. test dt_get_patches(doc, version)
61
71
  if (true) {
62
- let [_agents, versions, _parentss] = dt_parse([...doc.toBytes()])
63
- let v = []
64
- for (let i = 0; i < versions.length; i++)
65
- if (Math.random() > 0.5) v.push(versions[i].join('-'))
66
-
67
- console.log(`v:${v}`)
68
-
69
- let temp_doc = dt_get(doc, v)
70
- console.log(`temp_doc1:${temp_doc.get()}`)
71
-
72
- let updates = dt_get_patches(doc, v)
72
+ let updates = dt_get_patches(doc, middle_v)
73
73
  console.log(`updates:`, updates)
74
74
 
75
- apply_updates(temp_doc, updates)
76
- console.log(`temp_doc2:${temp_doc.get()}`)
77
- if (temp_doc.get() != doc.get() && n < best_n) {
75
+ apply_updates(middle_doc, updates)
76
+ console.log(`middle_doc2:${middle_doc.get()}`)
77
+ if (middle_doc.get() != doc.get() && n < best_n) {
78
78
  best_n = n
79
79
  best_seed = seed
80
80
  }
81
81
  }
82
+
83
+ // 7. try applying a patch that's out of range..
84
+ // if (true) {
85
+ // let agent = Math.random().toString(36).slice(2)
86
+ // let parents = doc.getRemoteVersion().map(x => x.join('-'))
87
+ // let len = doc.len()
88
+ // let args = [`${agent}-0`, parents, len + 1, 'c']
89
+ // console.log('ARGS:', args)
90
+ // try {
91
+ // doc.mergeBytes(dt_create_bytes(...args))
92
+ // } catch (e) {
93
+ // console.log(`EEEE = ${e}`)
94
+ // }
95
+ // console.log('did that..')
96
+ // }
82
97
  } catch (e) {
98
+ if (console.log == og_log) throw e
83
99
  if (n < best_n) {
84
100
  best_n = n
85
101
  best_seed = seed