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.
Files changed (3) hide show
  1. package/index.js +32 -1
  2. package/package.json +1 -1
  3. 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
- currentSize += bytes.length + 4 // we account for the extra 4 bytes for uint32
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "braid-text",
3
- "version": "0.2.16",
3
+ "version": "0.2.17",
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')
@@ -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