braid-text 0.2.16 → 0.2.17
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 +32 -1
- package/package.json +1 -1
- package/test/test.js +37 -7
package/index.js
CHANGED
|
@@ -577,6 +577,34 @@ braid_text.put = async (key, options) => {
|
|
|
577
577
|
await resource.db_delta(resource.doc.getPatchSince(v_before))
|
|
578
578
|
}
|
|
579
579
|
|
|
580
|
+
braid_text.revert = async (key, actor, seq) => {
|
|
581
|
+
var resource = (typeof key == 'string') ? await get_resource(key) : key
|
|
582
|
+
|
|
583
|
+
// get version without actor-seq,
|
|
584
|
+
// and update actor_seqs
|
|
585
|
+
var v = []
|
|
586
|
+
for (var [a, s] of Object.entries(resource.actor_seqs)) {
|
|
587
|
+
if (a !== actor) v.push(`${a}-${s}`)
|
|
588
|
+
else {
|
|
589
|
+
if (s < seq) return // nothing to do
|
|
590
|
+
else if (seq > 0) {
|
|
591
|
+
v.push(`${a}-${seq - 1}`)
|
|
592
|
+
resource.actor_seqs[actor] = seq - 1
|
|
593
|
+
} else delete resource.actor_seqs[actor]
|
|
594
|
+
}
|
|
595
|
+
}
|
|
596
|
+
|
|
597
|
+
// revert dt
|
|
598
|
+
var old_doc = resource.doc
|
|
599
|
+
resource.doc = dt_get(resource.doc, v)
|
|
600
|
+
old_doc.free()
|
|
601
|
+
|
|
602
|
+
resource.val = resource.doc.get()
|
|
603
|
+
|
|
604
|
+
// save it
|
|
605
|
+
await resource.db_delta()
|
|
606
|
+
}
|
|
607
|
+
|
|
580
608
|
braid_text.list = async () => {
|
|
581
609
|
try {
|
|
582
610
|
if (braid_text.db_folder) {
|
|
@@ -742,7 +770,8 @@ async function file_sync(key, process_delta, get_init) {
|
|
|
742
770
|
return {
|
|
743
771
|
change: async (bytes) => {
|
|
744
772
|
await (chain = chain.then(async () => {
|
|
745
|
-
|
|
773
|
+
if (!bytes) currentSize = threshold
|
|
774
|
+
else currentSize += bytes.length + 4 // we account for the extra 4 bytes for uint32
|
|
746
775
|
const filename = `${braid_text.db_folder}/${encoded}.${currentNumber}`
|
|
747
776
|
if (currentSize < threshold) {
|
|
748
777
|
if (braid_text.verbose) console.log(`appending to db..`)
|
|
@@ -1742,4 +1771,6 @@ braid_text.dt_get_patches = dt_get_patches
|
|
|
1742
1771
|
braid_text.dt_parse = dt_parse
|
|
1743
1772
|
braid_text.dt_create_bytes = dt_create_bytes
|
|
1744
1773
|
|
|
1774
|
+
braid_text.decode_version = decode_version
|
|
1775
|
+
|
|
1745
1776
|
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')
|
|
@@ -196,12 +232,6 @@ function getRandomCharacter() {
|
|
|
196
232
|
return characters[randomIndex];
|
|
197
233
|
}
|
|
198
234
|
|
|
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
235
|
/////////
|
|
206
236
|
|
|
207
237
|
// the next two functions added by me
|