braid-text 0.2.16 → 0.2.18
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 +35 -1
- package/package.json +1 -1
- package/test/test.js +40 -7
package/index.js
CHANGED
|
@@ -577,6 +577,37 @@ braid_text.put = async (key, options) => {
|
|
|
577
577
|
await resource.db_delta(resource.doc.getPatchSince(v_before))
|
|
578
578
|
}
|
|
579
579
|
|
|
580
|
+
// currently version must be an array with exactly one element, e.g. ["abc-1"]
|
|
581
|
+
braid_text.revert = async (key, version) => {
|
|
582
|
+
var resource = (typeof key == 'string') ? await get_resource(key) : key
|
|
583
|
+
|
|
584
|
+
var [actor, seq] = decode_version(version[0])
|
|
585
|
+
|
|
586
|
+
// get version without actor-seq,
|
|
587
|
+
// and update actor_seqs
|
|
588
|
+
var v = []
|
|
589
|
+
for (var [a, s] of Object.entries(resource.actor_seqs)) {
|
|
590
|
+
if (a !== actor) v.push(`${a}-${s}`)
|
|
591
|
+
else {
|
|
592
|
+
if (s < seq) return // nothing to do
|
|
593
|
+
else if (seq > 0) {
|
|
594
|
+
v.push(`${a}-${seq - 1}`)
|
|
595
|
+
resource.actor_seqs[actor] = seq - 1
|
|
596
|
+
} else delete resource.actor_seqs[actor]
|
|
597
|
+
}
|
|
598
|
+
}
|
|
599
|
+
|
|
600
|
+
// revert dt
|
|
601
|
+
var old_doc = resource.doc
|
|
602
|
+
resource.doc = dt_get(resource.doc, v)
|
|
603
|
+
old_doc.free()
|
|
604
|
+
|
|
605
|
+
resource.val = resource.doc.get()
|
|
606
|
+
|
|
607
|
+
// save it
|
|
608
|
+
await resource.db_delta()
|
|
609
|
+
}
|
|
610
|
+
|
|
580
611
|
braid_text.list = async () => {
|
|
581
612
|
try {
|
|
582
613
|
if (braid_text.db_folder) {
|
|
@@ -742,7 +773,8 @@ async function file_sync(key, process_delta, get_init) {
|
|
|
742
773
|
return {
|
|
743
774
|
change: async (bytes) => {
|
|
744
775
|
await (chain = chain.then(async () => {
|
|
745
|
-
|
|
776
|
+
if (!bytes) currentSize = threshold
|
|
777
|
+
else currentSize += bytes.length + 4 // we account for the extra 4 bytes for uint32
|
|
746
778
|
const filename = `${braid_text.db_folder}/${encoded}.${currentNumber}`
|
|
747
779
|
if (currentSize < threshold) {
|
|
748
780
|
if (braid_text.verbose) console.log(`appending to db..`)
|
|
@@ -1742,4 +1774,6 @@ braid_text.dt_get_patches = dt_get_patches
|
|
|
1742
1774
|
braid_text.dt_parse = dt_parse
|
|
1743
1775
|
braid_text.dt_create_bytes = dt_create_bytes
|
|
1744
1776
|
|
|
1777
|
+
braid_text.decode_version = decode_version
|
|
1778
|
+
|
|
1745
1779
|
module.exports = braid_text
|
package/package.json
CHANGED
package/test/test.js
CHANGED
|
@@ -12,18 +12,43 @@ process.on("uncaughtException", (x) =>
|
|
|
12
12
|
|
|
13
13
|
braid_text.db_folder = null
|
|
14
14
|
|
|
15
|
+
async function test_revert() {
|
|
16
|
+
braid_text.db_folder = './braid-text-db'
|
|
17
|
+
var key = Math.random().toString(36).slice(2)
|
|
18
|
+
await braid_text.put(key, {version: ['a-0'], body: 'A'})
|
|
19
|
+
await braid_text.put(key, {version: ['a-1'], parents: ['a-0'], patches: [{range: '[1:1]', content: 'B'}]})
|
|
20
|
+
await braid_text.revert(key, ['a-1'])
|
|
21
|
+
delete braid_text.cache[key]
|
|
22
|
+
var {version, body} = await braid_text.get(key, {})
|
|
23
|
+
if (version[0] != 'a-0') throw new Error('revert error: wrong version')
|
|
24
|
+
if (body != 'A') throw new Error('revert error: wrong text')
|
|
25
|
+
|
|
26
|
+
await braid_text.put(key, {version: ['b-0'], parents: ['a-0'], patches: [{range: '[1:1]', content: 'C'}]})
|
|
27
|
+
if ('AC' !== await braid_text.get(key)) throw new Error('revert error: wrong text')
|
|
28
|
+
await braid_text.revert(key, ['b-0'])
|
|
29
|
+
if ('A' !== await braid_text.get(key)) throw new Error('revert error: wrong text')
|
|
30
|
+
delete braid_text.cache[key]
|
|
31
|
+
var {version, body} = await braid_text.get(key, {})
|
|
32
|
+
if (version[0] != 'a-0') throw new Error('revert error: wrong version')
|
|
33
|
+
if (body != 'A') throw new Error('revert error: wrong text')
|
|
34
|
+
|
|
35
|
+
braid_text.db_folder = null
|
|
36
|
+
}
|
|
37
|
+
|
|
15
38
|
async function main() {
|
|
16
39
|
let best_seed = NaN
|
|
17
40
|
let best_n = Infinity
|
|
18
41
|
let base = Math.floor(Math.random() * 10000000)
|
|
19
42
|
let st = Date.now()
|
|
20
43
|
|
|
44
|
+
await test_revert()
|
|
45
|
+
|
|
21
46
|
let og_log = console.log
|
|
22
47
|
console.log = () => {}
|
|
23
48
|
for (let t = 0; t < 10000; t++) {
|
|
24
49
|
let seed = base + t
|
|
25
50
|
// for (let t = 0; t < 1; t++) {
|
|
26
|
-
// let seed =
|
|
51
|
+
// let seed = 7375800
|
|
27
52
|
|
|
28
53
|
og_log(`t = ${t}, seed = ${seed}, best_n = ${best_n} @ ${best_seed}`)
|
|
29
54
|
Math.randomSeed(seed)
|
|
@@ -53,6 +78,11 @@ async function main() {
|
|
|
53
78
|
let dt_to_braid = async (doc, key) => {
|
|
54
79
|
await braid_text.get(key, {})
|
|
55
80
|
for (let x of dt_get_patches(doc)) {
|
|
81
|
+
var resource = await braid_text.get_resource(key)
|
|
82
|
+
var [actor, seq] = braid_text.decode_version(x.version)
|
|
83
|
+
var pre_seq = resource.actor_seqs[actor]
|
|
84
|
+
var old_text = await braid_text.get(key)
|
|
85
|
+
|
|
56
86
|
console.log(`x = `, x)
|
|
57
87
|
let y = {
|
|
58
88
|
merge_type: 'dt',
|
|
@@ -67,6 +97,12 @@ async function main() {
|
|
|
67
97
|
await braid_text.put(key, y)
|
|
68
98
|
y.validate_already_seen_versions = true
|
|
69
99
|
await braid_text.put(key, y)
|
|
100
|
+
|
|
101
|
+
// test revert
|
|
102
|
+
await braid_text.revert(key, [`${actor}-${(pre_seq ?? -1) + 1}`])
|
|
103
|
+
var new_text = await braid_text.get(key)
|
|
104
|
+
if (old_text !== new_text) throw new Error('revert failed!')
|
|
105
|
+
await braid_text.put(key, y)
|
|
70
106
|
}
|
|
71
107
|
}
|
|
72
108
|
await dt_to_braid(doc, 'doc')
|
|
@@ -135,6 +171,9 @@ function make_random_edit(doc) {
|
|
|
135
171
|
}
|
|
136
172
|
base_seq++
|
|
137
173
|
|
|
174
|
+
// try skipping some seqs.. to see if it breaks..
|
|
175
|
+
base_seq += Math.floor(Math.random() * 5)
|
|
176
|
+
|
|
138
177
|
console.log({agents, versions, include_versions})
|
|
139
178
|
|
|
140
179
|
let parent_doc = dt_get(doc, include_versions)
|
|
@@ -196,12 +235,6 @@ function getRandomCharacter() {
|
|
|
196
235
|
return characters[randomIndex];
|
|
197
236
|
}
|
|
198
237
|
|
|
199
|
-
function decode_version(v) {
|
|
200
|
-
let m = v.match(/^(.*)-(\d+)$/s)
|
|
201
|
-
if (!m) throw new Error(`invalid actor-seq version: ${v}`)
|
|
202
|
-
return [m[1], parseInt(m[2])]
|
|
203
|
-
}
|
|
204
|
-
|
|
205
238
|
/////////
|
|
206
239
|
|
|
207
240
|
// the next two functions added by me
|