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.
- package/index.js +45 -4
- package/package.json +1 -1
- 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 =
|
|
305
|
-
resource.doc.
|
|
306
|
-
|
|
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
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 <
|
|
12
|
+
for (let t = 0; t < 10000; t++) {
|
|
13
13
|
let seed = base + t
|
|
14
|
-
// for (let t = 0; t <
|
|
15
|
-
// let seed =
|
|
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
|
|
53
|
-
|
|
54
|
-
console.log(
|
|
55
|
-
if (
|
|
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
|
|
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(
|
|
76
|
-
console.log(`
|
|
77
|
-
if (
|
|
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
|