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.
Files changed (3) hide show
  1. package/index.js +35 -1
  2. package/package.json +1 -1
  3. 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
- currentSize += bytes.length + 4 // we account for the extra 4 bytes for uint32
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "braid-text",
3
- "version": "0.2.16",
3
+ "version": "0.2.18",
4
4
  "description": "Library for collaborative text over http using braid.",
5
5
  "author": "Braid Working Group",
6
6
  "repository": "braid-org/braid-text",
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 = 7630348
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