braid-text 0.0.17 → 0.0.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.
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
package/index.js CHANGED
@@ -207,67 +207,8 @@ braid_text.get = async (key, options) => {
207
207
  let resource = (typeof key == 'string') ? await get_resource(key) : key
208
208
 
209
209
  if (!options.subscribe) {
210
- let doc = null
211
- if (options.version || options.parents) {
212
- let frontier = {}
213
- options.version?.forEach((x) => (frontier[x] = true))
214
- options.parents?.forEach((x) => (frontier[x] = true))
215
-
216
- let local_version = []
217
- let [agents, versions, parentss] = parseDT([...resource.doc.toBytes()])
218
- for (let i = 0; i < versions.length; i++) {
219
- if (frontier[versions[i].join("-")]) {
220
- local_version.push(i)
221
- }
222
- }
223
- local_version = new Uint32Array(local_version)
224
-
225
- let after_versions = {}
226
- let [_, after_versions_array, __] = parseDT([...resource.doc.getPatchSince(local_version)])
227
- for (let v of after_versions_array) after_versions[v.join("-")] = true
228
-
229
- let new_doc = new Doc()
230
- let op_runs = resource.doc.getOpsSince([])
231
- let i = 0
232
- op_runs.forEach((op_run) => {
233
- let parents = parentss[i].map((x) => x.join("-"))
234
- let start = op_run.start
235
- let end = start + 1
236
- let content = op_run.content?.[0]
237
-
238
- let len = op_run.end - op_run.start
239
- let base_i = i
240
- for (let j = 1; j <= len; j++) {
241
- let I = base_i + j
242
- if (
243
- j == len ||
244
- parentss[I].length != 1 ||
245
- parentss[I][0][0] != versions[I - 1][0] ||
246
- parentss[I][0][1] != versions[I - 1][1] ||
247
- versions[I][0] != versions[I - 1][0] ||
248
- versions[I][1] != versions[I - 1][1] + 1
249
- ) {
250
- for (; i < I; i++) {
251
- let version = versions[i].join("-")
252
- if (!after_versions[version]) {
253
- new_doc.mergeBytes(
254
- OpLog_create_bytes(
255
- version,
256
- parentss[i].map((x) => x.join("-")),
257
- content ? start + (i - base_i) : start,
258
- content?.[0]
259
- )
260
- )
261
- }
262
- if (op_run.content) content = content.slice(1)
263
- }
264
- content = ""
265
- }
266
- if (op_run.content) content += op_run.content[j]
267
- }
268
- })
269
- doc = new_doc
270
- } else doc = resource.doc
210
+ let doc = resource.doc
211
+ if (options.version || options.parents) doc = dt_get(doc, options.version || options.parents)
271
212
 
272
213
  return {
273
214
  version: doc.getRemoteVersion().map((x) => x.join("-")),
@@ -361,10 +302,17 @@ braid_text.put = async (key, options) => {
361
302
 
362
303
  let resource = (typeof key == 'string') ? await get_resource(key) : key
363
304
 
305
+ let parents = resource.doc.getRemoteVersion().map((x) => x.join("-"))
306
+ let og_parents = options.parents || parents
307
+
308
+ let max_pos = count_code_points(v_eq(parents, og_parents) ?
309
+ resource.doc.get() :
310
+ dt_get(resource.doc, og_parents).get())
311
+
364
312
  if (body != null) {
365
313
  patches = [{
366
314
  unit: 'text',
367
- range: `[0:${count_code_points(resource.doc.get())}]`,
315
+ range: `[0:${max_pos}]`,
368
316
  content: body
369
317
  }]
370
318
  }
@@ -377,7 +325,6 @@ braid_text.put = async (key, options) => {
377
325
  })).sort((a, b) => a.range[0] - b.range[0])
378
326
 
379
327
  // validate patch positions
380
- let max_pos = resource.doc.get().length
381
328
  let must_be_at_least = 0
382
329
  for (let p of patches) {
383
330
  if (p.range[0] < must_be_at_least || p.range[0] > max_pos) throw new Error(`invalid patch range position: ${p.range[0]}`)
@@ -398,8 +345,6 @@ braid_text.put = async (key, options) => {
398
345
 
399
346
  v = `${v[0]}-${v[1] + 1 - change_count}`
400
347
 
401
- let parents = resource.doc.getRemoteVersion().map((x) => x.join("-"))
402
- let og_parents = options.parents || parents
403
348
  let ps = og_parents
404
349
 
405
350
  let v_before = resource.doc.getLocalVersion()
@@ -755,6 +700,66 @@ async function file_sync(key, process_delta, get_init) {
755
700
  //////////////////////////////////////////////////////////////////
756
701
  //////////////////////////////////////////////////////////////////
757
702
 
703
+ function dt_get(doc, version) {
704
+ let frontier = {}
705
+ version.forEach((x) => (frontier[x] = true))
706
+
707
+ let local_version = []
708
+ let [agents, versions, parentss] = parseDT([...doc.toBytes()])
709
+ for (let i = 0; i < versions.length; i++) {
710
+ if (frontier[versions[i].join("-")]) {
711
+ local_version.push(i)
712
+ }
713
+ }
714
+ local_version = new Uint32Array(local_version)
715
+
716
+ let after_versions = {}
717
+ let [_, after_versions_array, __] = parseDT([...doc.getPatchSince(local_version)])
718
+ for (let v of after_versions_array) after_versions[v.join("-")] = true
719
+
720
+ let new_doc = new Doc()
721
+ let op_runs = doc.getOpsSince([])
722
+ let i = 0
723
+ op_runs.forEach((op_run) => {
724
+ let parents = parentss[i].map((x) => x.join("-"))
725
+ let start = op_run.start
726
+ let end = start + 1
727
+ let content = op_run.content?.[0]
728
+
729
+ let len = op_run.end - op_run.start
730
+ let base_i = i
731
+ for (let j = 1; j <= len; j++) {
732
+ let I = base_i + j
733
+ if (
734
+ j == len ||
735
+ parentss[I].length != 1 ||
736
+ parentss[I][0][0] != versions[I - 1][0] ||
737
+ parentss[I][0][1] != versions[I - 1][1] ||
738
+ versions[I][0] != versions[I - 1][0] ||
739
+ versions[I][1] != versions[I - 1][1] + 1
740
+ ) {
741
+ for (; i < I; i++) {
742
+ let version = versions[i].join("-")
743
+ if (!after_versions[version]) {
744
+ new_doc.mergeBytes(
745
+ OpLog_create_bytes(
746
+ version,
747
+ parentss[i].map((x) => x.join("-")),
748
+ content ? start + (i - base_i) : start,
749
+ content?.[0]
750
+ )
751
+ )
752
+ }
753
+ if (op_run.content) content = content.slice(1)
754
+ }
755
+ content = ""
756
+ }
757
+ if (op_run.content) content += op_run.content[j]
758
+ }
759
+ })
760
+ return new_doc
761
+ }
762
+
758
763
  function defrag_dt(doc) {
759
764
  let fresh_doc = new Doc("server")
760
765
  fresh_doc.mergeBytes(doc.toBytes())
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "braid-text",
3
- "version": "0.0.17",
3
+ "version": "0.0.18",
4
4
  "description": "Library for collaborative text over http using braid.",
5
5
  "author": "Braid Working Group",
6
6
  "repository": "braid-org/braidjs",