braid-text 0.2.69 → 0.2.71

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/test/test.html CHANGED
@@ -28,9 +28,10 @@
28
28
  width: 25px;
29
29
  height: 25px;
30
30
  border: 1px solid #ddd;
31
- }
31
+ }
32
32
  </style>
33
33
  <script src="https://unpkg.com/braid-http@~1.3/braid-http-client.js"></script>
34
+ <script src="./tests.js"></script>
34
35
  <div id="summaryContainer"></div>
35
36
  <div id="testContainer"></div>
36
37
  <script type=module>
@@ -40,7 +41,17 @@ import {
40
41
  Doc,
41
42
  OpLog,
42
43
  } from "https://unpkg.com/diamond-types-web";
43
- var dt_p = init()
44
+
45
+ // Make diamond-types available globally for tests.js
46
+ window.Doc = Doc
47
+ window.OpLog = OpLog
48
+ window.dt_p = init()
49
+
50
+ braid_fetch.enable_multiplex = false
51
+
52
+ // Parse URL parameters for filter
53
+ const urlParams = new URLSearchParams(window.location.search)
54
+ const filterArg = urlParams.get('filter') || urlParams.get('grep')
44
55
 
45
56
  let delay = 0
46
57
 
@@ -54,7 +65,7 @@ function createTestDiv(testName) {
54
65
 
55
66
  function updateTestResult(div, passed, message, got, expected) {
56
67
  div.className = `test ${passed ? "passed" : "failed"}`
57
-
68
+
58
69
  if (passed) {
59
70
  div.querySelector(".result").textContent = message
60
71
  div.querySelector(".result").style.fontSize = message.length > 400 ? 'xx-small' : message.length > 100 ? 'small' : ''
@@ -76,6 +87,11 @@ function updateSummaryBox(box, passed) {
76
87
  }
77
88
 
78
89
  async function runTest(testName, testFunction, expectedResult) {
90
+ // Apply filter if specified
91
+ if (filterArg && !testName.toLowerCase().includes(filterArg.toLowerCase())) {
92
+ return // Skip this test
93
+ }
94
+
79
95
  delay += 70
80
96
 
81
97
  await new Promise(done => setTimeout(done, delay))
@@ -96,2099 +112,7 @@ async function runTest(testName, testFunction, expectedResult) {
96
112
  }
97
113
  }
98
114
 
99
- runTest(
100
- "test subscribe update with body_text",
101
- async () => {
102
- var key = 'test' + Math.random().toString(36).slice(2)
103
-
104
- var r = await braid_fetch(`/${key}`, {
105
- method: 'PUT',
106
- body: 'hi'
107
- })
108
- if (!r.ok) return 'got: ' + r.status
109
-
110
- var r1p = braid_fetch(`/eval`, {
111
- method: 'PUT',
112
- body: `void (async () => {
113
- var x = await new Promise(done => {
114
- braid_text.get(new URL('http://localhost:8889/${key}'), {
115
- subscribe: update => {
116
- if (update.body_text === 'yo') done(update.body_text)
117
- }
118
- })
119
- })
120
- res.end(x)
121
- })()`
122
- })
123
-
124
- var r2 = await braid_fetch(`/${key}`, {
125
- method: 'PUT',
126
- body: 'yo'
127
- })
128
-
129
- var r1 = await r1p
130
- if (!r1.ok) return 'got: ' + r.status
131
-
132
- return await r1.text()
133
- },
134
- 'yo'
135
- )
136
-
137
- runTest(
138
- "test braid_text.sync, key to url, where url breaks",
139
- async () => {
140
- var key = 'test' + Math.random().toString(36).slice(2)
141
-
142
- var r = await braid_fetch(`/eval`, {
143
- method: 'PUT',
144
- body: `void (async () => {
145
- var count = 0
146
- var ops
147
- braid_text.sync('/${key}', new URL('http://localhost:8889/have_error'), ops = {
148
- on_connect: () => {
149
- count++
150
- if (count === 2) {
151
- res.end('it reconnected!')
152
- ops.my_unsync()
153
- }
154
- }
155
- })
156
- })()`
157
- })
158
- return await r.text()
159
-
160
- },
161
- 'it reconnected!'
162
- )
163
-
164
- runTest(
165
- "test braid_text.sync, url to key",
166
- async () => {
167
- var key_a = 'test-a-' + Math.random().toString(36).slice(2)
168
- var key_b = 'test-b-' + Math.random().toString(36).slice(2)
169
-
170
- var r = await braid_fetch(`/${key_a}`, {
171
- method: 'PUT',
172
- body: 'hi'
173
- })
174
- if (!r.ok) return 'got: ' + r.status
175
-
176
- var r = await braid_fetch(`/eval`, {
177
- method: 'PUT',
178
- body: `void (async () => {
179
- braid_text.sync(new URL('http://localhost:8889/${key_a}'), '/${key_b}')
180
- res.end('')
181
- })()`
182
- })
183
- if (!r.ok) return 'got: ' + r.status
184
-
185
- await new Promise(done => setTimeout(done, 100))
186
-
187
- var r = await braid_fetch(`/${key_b}`)
188
- return 'got: ' + (await r.text())
189
- },
190
- 'got: hi'
191
- )
192
-
193
- runTest(
194
- "test braid_text.sync, url to resource",
195
- async () => {
196
- var key_a = 'test-a-' + Math.random().toString(36).slice(2)
197
- var key_b = 'test-b-' + Math.random().toString(36).slice(2)
198
-
199
- var r = await braid_fetch(`/${key_a}`, {
200
- method: 'PUT',
201
- body: 'hi'
202
- })
203
- if (!r.ok) return 'got: ' + r.status
204
-
205
- var r = await braid_fetch(`/eval`, {
206
- method: 'PUT',
207
- body: `void (async () => {
208
- var resource = await braid_text.get_resource('/${key_b}')
209
- braid_text.sync(new URL('http://localhost:8889/${key_a}'), resource)
210
- res.end('')
211
- })()`
212
- })
213
- if (!r.ok) return 'got: ' + r.status
214
-
215
- await new Promise(done => setTimeout(done, 100))
216
-
217
- var r = await braid_fetch(`/${key_b}`)
218
- return 'got: ' + (await r.text())
219
- },
220
- 'got: hi'
221
- )
222
-
223
- runTest(
224
- "test braid_text.sync, with two urls",
225
- async () => {
226
- var key_a = 'test-a-' + Math.random().toString(36).slice(2)
227
- var key_b = 'test-b-' + Math.random().toString(36).slice(2)
228
-
229
- var r = await braid_fetch(`/${key_a}`, {
230
- method: 'PUT',
231
- body: 'hi'
232
- })
233
- if (!r.ok) return 'got: ' + r.status
234
-
235
- var r = await braid_fetch(`/eval`, {
236
- method: 'PUT',
237
- body: `void (async () => {
238
- braid_text.sync(new URL('http://localhost:8889/${key_a}'),
239
- new URL('http://localhost:8889/${key_b}'))
240
- res.end('')
241
- })()`
242
- })
243
- if (!r.ok) return 'got: ' + r.status
244
-
245
- await new Promise(done => setTimeout(done, 100))
246
-
247
- var r = await braid_fetch(`/${key_b}`)
248
- return 'got: ' + (await r.text())
249
- },
250
- 'got: hi'
251
- )
252
-
253
- runTest(
254
- "test braid_text.sync, key to url",
255
- async () => {
256
- var key_a = 'test-a-' + Math.random().toString(36).slice(2)
257
- var key_b = 'test-b-' + Math.random().toString(36).slice(2)
258
-
259
- var r = await braid_fetch(`/${key_a}`, {
260
- method: 'PUT',
261
- body: 'hi'
262
- })
263
- if (!r.ok) return 'got: ' + r.status
264
-
265
- var r = await braid_fetch(`/eval`, {
266
- method: 'PUT',
267
- body: `void (async () => {
268
- braid_text.sync('/${key_a}', new URL('http://localhost:8889/${key_b}'))
269
- res.end('')
270
- })()`
271
- })
272
- if (!r.ok) return 'got: ' + r.status
273
-
274
- await new Promise(done => setTimeout(done, 100))
275
-
276
- var r = await braid_fetch(`/${key_b}`)
277
- return 'got: ' + (await r.text())
278
- },
279
- 'got: hi'
280
- )
281
-
282
- runTest(
283
- "test braid_text.sync, key to url, when HEAD fails",
284
- async () => {
285
- var key_a = 'test-a-' + Math.random().toString(36).slice(2)
286
-
287
- var r = await braid_fetch(`/${key_a}`, {
288
- method: 'PUT',
289
- body: 'hi'
290
- })
291
- if (!r.ok) return 'got: ' + r.status
292
-
293
- var r = await braid_fetch(`/eval`, {
294
- method: 'PUT',
295
- body: `void (async () => {
296
- var count = 0
297
- var ops
298
- braid_text.sync('/${key_a}', new URL('http://localhost:8889/have_error'), ops = {
299
- on_connect: () => {
300
- count++
301
- if (count === 2) {
302
- res.end('it reconnected!')
303
- ops.my_unsync()
304
- }
305
- }
306
- })
307
- })()`
308
- })
309
- if (!r.ok) return 'got: ' + r.status
310
-
311
- return await r.text()
312
- },
313
- 'it reconnected!'
314
- )
315
-
316
- runTest(
317
- "test when remote doesn't have a fork-point that we think they have",
318
- async () => {
319
- var key_a = 'test-a-' + Math.random().toString(36).slice(2)
320
- var key_b = 'test-b-' + Math.random().toString(36).slice(2)
321
- var key_c = 'test-c-' + Math.random().toString(36).slice(2)
322
-
323
- var r = await braid_fetch(`/${key_a}`, {
324
- method: 'PUT',
325
- body: 'hi'
326
- })
327
- if (!r.ok) return 'got: ' + r.status
328
-
329
- var r = await braid_fetch(`/eval`, {
330
- method: 'PUT',
331
- body: `void (async () => {
332
- braid_text.sync('/${key_a}', new URL('http://localhost:8889/${key_b}'))
333
- await new Promise(done => setTimeout(done, 100))
334
- braid_text.sync('/${key_a}', new URL('http://localhost:8889/${key_c}'))
335
- await new Promise(done => setTimeout(done, 100))
336
- res.end('')
337
- })()`
338
- })
339
- if (!r.ok) return 'got: ' + r.status
340
-
341
- return await (await braid_fetch(`/${key_c}`)).text()
342
- },
343
- 'hi'
344
- )
345
-
346
- runTest(
347
- "test when we don't have a fork-point with remote, but they do have a shared version",
348
- async () => {
349
- var key_a = 'test-a-' + Math.random().toString(36).slice(2)
350
- var key_b = 'test-b-' + Math.random().toString(36).slice(2)
351
-
352
- var r = await braid_fetch(`/${key_a}`, {
353
- method: 'PUT',
354
- body: 'hi'
355
- })
356
- if (!r.ok) return 'got: ' + r.status
357
-
358
- var r = await braid_fetch(`/eval`, {
359
- method: 'PUT',
360
- body: `void (async () => {
361
- var ops = {}
362
- braid_text.sync('/${key_a}', '/${key_b}', ops)
363
- await new Promise(done => setTimeout(done, 100))
364
- ops.my_unsync()
365
- res.end('')
366
- })()`
367
- })
368
- if (!r.ok) return 'got: ' + r.status
369
-
370
- var r = await braid_fetch(`/${key_a}`, {
371
- method: 'PUT',
372
- body: 'yo'
373
- })
374
- if (!r.ok) return 'got: ' + r.status
375
-
376
- var r = await braid_fetch(`/eval`, {
377
- method: 'PUT',
378
- body: `void (async () => {
379
- var ops = {}
380
- braid_text.sync('/${key_a}', new URL('http://localhost:8889/${key_b}'), ops)
381
- await new Promise(done => setTimeout(done, 100))
382
- ops.my_unsync()
383
- res.end('')
384
- })()`
385
- })
386
- if (!r.ok) return 'got: ' + r.status
387
-
388
- return await (await braid_fetch(`/${key_b}`)).text()
389
- },
390
- 'yo'
391
- )
392
-
393
- runTest(
394
- "test braid_text.sync, with two keys",
395
- async () => {
396
- var key_a = 'test-a-' + Math.random().toString(36).slice(2)
397
- var key_b = 'test-b-' + Math.random().toString(36).slice(2)
398
-
399
- var r = await braid_fetch(`/${key_a}`, {
400
- method: 'PUT',
401
- body: 'hi'
402
- })
403
- if (!r.ok) return 'got: ' + r.status
404
-
405
- var r = await braid_fetch(`/eval`, {
406
- method: 'PUT',
407
- body: `void (async () => {
408
- braid_text.sync('/${key_a}', '/${key_b}')
409
- res.end('')
410
- })()`
411
- })
412
- if (!r.ok) return 'got: ' + r.status
413
-
414
- await new Promise(done => setTimeout(done, 100))
415
-
416
- var r = await braid_fetch(`/${key_b}`)
417
- return 'got: ' + (await r.text())
418
- },
419
- 'got: hi'
420
- )
421
-
422
- runTest(
423
- "test putting version with multiple event ids, should have error",
424
- async () => {
425
- var key_a = 'test-a-' + Math.random().toString(36).slice(2)
426
-
427
- var r = await braid_fetch(`/${key_a}`, {
428
- method: 'PUT',
429
- version: ['abc-1', 'xyz-2'],
430
- body: 'hi'
431
- })
432
- return '' + (await r.text()).includes('cannot put a version with multiple ids')
433
- },
434
- 'true'
435
- )
436
-
437
- runTest(
438
- "test braid_text.get(url), with no options",
439
- async () => {
440
- var key = 'test-' + Math.random().toString(36).slice(2)
441
- let r = await braid_fetch(`/${key}`, {
442
- method: 'PUT',
443
- body: 'hi'
444
- })
445
- if (!r.ok) return 'got: ' + r.status
446
-
447
- var r1 = await braid_fetch(`/eval`, {
448
- method: 'PUT',
449
- body: `void (async () => {
450
- res.end(await braid_text.get(new URL('http://localhost:8889/${key}')))
451
- })()`
452
- })
453
-
454
- return 'got: ' + (await r1.text())
455
- },
456
- 'got: hi'
457
- )
458
-
459
- runTest(
460
- "test braid_text.get(url), with headers",
461
- async () => {
462
- var key = 'test-' + Math.random().toString(36).slice(2)
463
- let r = await braid_fetch(`/${key}`, {
464
- method: 'PUT',
465
- version: ['xyz-1'],
466
- body: 'hi'
467
- })
468
- if (!r.ok) return 'got: ' + r.status
469
-
470
- var r1 = await braid_fetch(`/eval`, {
471
- method: 'PUT',
472
- body: `void (async () => {
473
- res.end(await braid_text.get(new URL('http://localhost:8889/${key}'), {
474
- headers: {
475
- version: '"xyz-0"'
476
- }
477
- }))
478
- })()`
479
- })
480
-
481
- return 'got: ' + (await r1.text())
482
- },
483
- 'got: h'
484
- )
485
-
486
- runTest(
487
- "test braid_text.get(url), with parents",
488
- async () => {
489
- var key = 'test-' + Math.random().toString(36).slice(2)
490
- let r = await braid_fetch(`/${key}`, {
491
- method: 'PUT',
492
- version: ['xyz-1'],
493
- body: 'hi'
494
- })
495
- if (!r.ok) return 'got: ' + r.status
496
-
497
- var r1 = await braid_fetch(`/eval`, {
498
- method: 'PUT',
499
- body: `void (async () => {
500
- res.end(await braid_text.get(new URL('http://localhost:8889/${key}'), {
501
- parents: ['xyz-0']
502
- }))
503
- })()`
504
- })
505
-
506
- return 'got: ' + (await r1.text())
507
- },
508
- 'got: h'
509
- )
510
-
511
- runTest(
512
- "test braid_text.get(url), with version and peer",
513
- async () => {
514
- var key = 'test-' + Math.random().toString(36).slice(2)
515
- let r = await braid_fetch(`/${key}`, {
516
- method: 'PUT',
517
- version: ['xyz-1'],
518
- body: 'hi'
519
- })
520
- if (!r.ok) return 'got: ' + r.status
521
-
522
- var r1 = await braid_fetch(`/eval`, {
523
- method: 'PUT',
524
- body: `void (async () => {
525
- res.end(await braid_text.get(new URL('http://localhost:8889/${key}'), {
526
- version: ['xyz-0'],
527
- peer: 'xyz'
528
- }))
529
- })()`
530
- })
531
-
532
- return 'got: ' + (await r1.text())
533
- },
534
- 'got: h'
535
- )
536
-
537
- runTest(
538
- "test braid_text.get(url) with subscription",
539
- async () => {
540
- var key = 'test-' + Math.random().toString(36).slice(2)
541
- let r = await braid_fetch(`/${key}`, {
542
- method: 'PUT',
543
- version: ['xyz-1'],
544
- body: 'hi'
545
- })
546
- if (!r.ok) return 'got: ' + r.status
547
-
548
- var r1 = await braid_fetch(`/eval`, {
549
- method: 'PUT',
550
- body: `void (async () => {
551
- var url = new URL('http://localhost:8889/${key}')
552
- var update = await new Promise(done => {
553
- var o = {
554
- subscribe: update => {
555
- braid_text.forget(url, o)
556
- done(update)
557
- }
558
- }
559
- braid_text.get(url, o)
560
- })
561
- res.end(update.body)
562
- })()`
563
- })
564
-
565
- return 'got: ' + (await r1.text())
566
- },
567
- 'got: hi'
568
- )
569
-
570
- runTest(
571
- "test braid_text.put(url), with body",
572
- async () => {
573
- var key = 'test-' + Math.random().toString(36).slice(2)
574
-
575
- var r = await braid_fetch(`/eval`, {
576
- method: 'PUT',
577
- body: `void (async () => {
578
- var r = await braid_text.put(new URL('http://localhost:8889/${key}'),
579
- {body: 'yo'})
580
- res.end('')
581
- })()`
582
- })
583
- if (!r.ok) return 'got: ' + r.status
584
-
585
- let r1 = await braid_fetch(`/${key}`)
586
- return 'got: ' + (await r1.text())
587
- },
588
- 'got: yo'
589
- )
590
-
591
- runTest(
592
- "test braid_text.put(url), with body and headers",
593
- async () => {
594
- var key = 'test-' + Math.random().toString(36).slice(2)
595
-
596
- var r = await braid_fetch(`/eval`, {
597
- method: 'PUT',
598
- body: `void (async () => {
599
- var r = await braid_text.put(new URL('http://localhost:8889/${key}'),
600
- {body: 'yo', headers: {version: '"abc123-1"'}})
601
- res.end('')
602
- })()`
603
- })
604
- if (!r.ok) return 'got: ' + r.status
605
-
606
- let r2 = await braid_fetch(`/${key}`)
607
- return 'got: ' + (await r2.text()) + ' -- version: ' + r2.headers.get('version')
608
- },
609
- 'got: yo -- version: "abc123-1"'
610
- )
611
-
612
- runTest(
613
- "test braid_text.put(url), with body and version and parents",
614
- async () => {
615
- var key = 'test-' + Math.random().toString(36).slice(2)
616
- let r = await braid_fetch(`/${key}`, {
617
- method: 'PUT',
618
- body: 'hi',
619
- version: ['abc-1']
620
- })
621
-
622
- var r1 = await braid_fetch(`/eval`, {
623
- method: 'PUT',
624
- body: `void (async () => {
625
- var r = await braid_text.put(new URL('http://localhost:8889/${key}'),
626
- {body: 'yo', version: ['xyz-3'], parents: ['abc-1']})
627
- res.end('')
628
- })()`
629
- })
630
- if (!r1.ok) return 'got: ' + r1.status
631
-
632
- let r2 = await braid_fetch(`/${key}`)
633
- return 'got: ' + (await r2.text()) + ' -- version: ' + r2.headers.get('version')
634
- },
635
- 'got: yo -- version: "xyz-3"'
636
- )
637
-
638
- runTest(
639
- "test braid_text.put(url), with peer",
640
- async () => {
641
- var key = 'test-' + Math.random().toString(36).slice(2)
642
-
643
- var r1 = await braid_fetch(`/eval`, {
644
- method: 'PUT',
645
- body: `void (async () => {
646
- var r = await braid_text.put(new URL('http://localhost:8889/${key}'),
647
- {body: 'yo', peer: 'xyz', parents: []})
648
- res.end('')
649
- })()`
650
- })
651
- if (!r1.ok) return 'got: ' + r1.status
652
-
653
- let r2 = await braid_fetch(`/${key}`)
654
- return 'got: ' + (await r2.text()) + ' -- version: ' + r2.headers.get('version')
655
- },
656
- 'got: yo -- version: "xyz-1"'
657
- )
658
-
659
- runTest(
660
- "test loading a meta file from disk",
661
- async () => {
662
- var key = 'test-' + Math.random().toString(36).slice(2)
663
-
664
- var r1 = await braid_fetch(`/eval`, {
665
- method: 'PUT',
666
- body: `void (async () => {
667
- var resource = await braid_text.get_resource('/${key}')
668
- resource.meta = { test_meta_info: 42 }
669
- resource.change_meta()
670
-
671
- await new Promise(done => setTimeout(done, 200))
672
-
673
- delete braid_text.cache['/${key}']
674
-
675
- var resource = await braid_text.get_resource('/${key}')
676
- res.end(JSON.stringify(resource.meta))
677
- })()`
678
- })
679
-
680
- return (await r1.text())
681
- },
682
- '{"test_meta_info":42}'
683
- )
684
-
685
- runTest(
686
- "test selection-sharing-prototype PUT and GET",
687
- async () => {
688
- let key = 'test-' + Math.random().toString(36).slice(2)
689
-
690
- let time = Date.now()
691
-
692
- let r = await braid_fetch(`/${key}`, {
693
- method: 'PUT',
694
- body: JSON.stringify({
695
- hello: {
696
- yo: 'hi',
697
- time
698
- }
699
- }),
700
- headers: {
701
- 'selection-sharing-prototype': 'true'
702
- }
703
- })
704
- if (!r.ok) return 'got: ' + r.status
705
-
706
- let r2 = await braid_fetch(`/${key}`, {
707
- method: 'GET',
708
- headers: {
709
- 'selection-sharing-prototype': 'true'
710
- }
711
- })
712
- if (!r2.ok) return 'got: ' + r2.status
713
-
714
- let o = await r2.json()
715
- return o.hello.time === time ? 'times match' : 'bad'
716
- },
717
- 'times match'
718
- )
719
-
720
- runTest(
721
- "test selection-sharing-prototype GET/subscribe",
722
- async () => {
723
- let key = 'test-' + Math.random().toString(36).slice(2)
724
-
725
- var a = new AbortController()
726
- let r = await braid_fetch(`/${key}`, {
727
- method: 'GET',
728
- signal: a.signal,
729
- subscribe: true,
730
- peer: 'abc',
731
- headers: {
732
- 'selection-sharing-prototype': 'true'
733
- }
734
- })
735
- if (!r.ok) return 'got: ' + r.status
736
- var p = new Promise(done => {
737
- r.subscribe(update => {
738
- var body = update.body_text
739
- if (body.length > 2) done(body)
740
- })
741
- })
742
-
743
- var time = Date.now()
744
-
745
- let r2 = await braid_fetch(`/${key}`, {
746
- method: 'PUT',
747
- peer: 'xyz',
748
- body: JSON.stringify({
749
- hello: {
750
- yo: 'hi',
751
- time
752
- }
753
- }),
754
- headers: {
755
- 'selection-sharing-prototype': 'true'
756
- }
757
- })
758
- if (!r2.ok) return 'got: ' + r2.status
759
-
760
- var ret_val = JSON.parse(await p).hello.time === time ? 'times match' : 'bad'
761
-
762
- a.abort()
763
-
764
- return ret_val
765
- },
766
- 'times match'
767
- )
768
-
769
- runTest(
770
- "test selection-sharing-prototype PUT old cursor",
771
- async () => {
772
- let key = 'test-' + Math.random().toString(36).slice(2)
773
-
774
- let time = Date.now()
775
-
776
- let r = await braid_fetch(`/${key}`, {
777
- method: 'PUT',
778
- body: JSON.stringify({
779
- hello: {
780
- yo: 'hi',
781
- time
782
- }
783
- }),
784
- headers: {
785
- 'selection-sharing-prototype': 'true'
786
- }
787
- })
788
- if (!r.ok) return 'got: ' + r.status
789
-
790
- let r3 = await braid_fetch(`/${key}`, {
791
- method: 'PUT',
792
- body: JSON.stringify({
793
- hello: {
794
- yo: 'hoop',
795
- time: time - 5
796
- }
797
- }),
798
- headers: {
799
- 'selection-sharing-prototype': 'true'
800
- }
801
- })
802
- if (!r3.ok) return 'got: ' + r3.status
803
-
804
- let r2 = await braid_fetch(`/${key}`, {
805
- method: 'GET',
806
- headers: {
807
- 'selection-sharing-prototype': 'true'
808
- }
809
- })
810
- if (!r2.ok) return 'got: ' + r2.status
811
-
812
- let o = await r2.json()
813
- return o.hello.yo
814
- },
815
- 'hi'
816
- )
817
-
818
- runTest(
819
- "test selection-sharing-prototype PUT really old cursor",
820
- async () => {
821
- let key = 'test-' + Math.random().toString(36).slice(2)
822
-
823
- let time = Date.now() - 1000 * 60 * 60 * 24
824
-
825
- let r = await braid_fetch(`/${key}`, {
826
- method: 'PUT',
827
- body: JSON.stringify({
828
- hello: {
829
- yo: 'hi',
830
- time
831
- }
832
- }),
833
- headers: {
834
- 'selection-sharing-prototype': 'true'
835
- }
836
- })
837
- if (!r.ok) return 'got: ' + r.status
838
-
839
- let r2 = await braid_fetch(`/${key}`, {
840
- method: 'GET',
841
- headers: {
842
- 'selection-sharing-prototype': 'true'
843
- }
844
- })
845
- if (!r2.ok) return 'got: ' + r2.status
846
-
847
- let o = await r2.json()
848
- return JSON.stringify(o)
849
- },
850
- '{}'
851
- )
852
-
853
- runTest(
854
- "test PUT digest (good)",
855
- async () => {
856
- let key = 'test-' + Math.random().toString(36).slice(2)
857
-
858
- async function get_digest(s) {
859
- var bytes = await crypto.subtle.digest('SHA-256', new TextEncoder().encode(s))
860
- return `sha-256=:${btoa(String.fromCharCode(...new Uint8Array(bytes)))}:`
861
- }
862
-
863
- let r = await braid_fetch(`/${key}`, {
864
- method: 'PUT',
865
- version: ['hi-1'],
866
- parents: [],
867
- body: 'xx',
868
- headers: {
869
- 'Repr-Digest': await get_digest('xx')
870
- }
871
- })
872
- if (!r.ok) return 'got: ' + r.status
873
- return 'ok'
874
- },
875
- 'ok'
876
- )
877
-
878
- runTest(
879
- "test PUT digest (bad)",
880
- async () => {
881
- let key = 'test-' + Math.random().toString(36).slice(2)
882
-
883
- async function get_digest(s) {
884
- var bytes = await crypto.subtle.digest('SHA-256', new TextEncoder().encode(s))
885
- return `sha-256=:${btoa(String.fromCharCode(...new Uint8Array(bytes)))}:`
886
- }
887
-
888
- let r = await braid_fetch(`/${key}`, {
889
- method: 'PUT',
890
- version: ['hi-1'],
891
- parents: [],
892
- body: 'xx',
893
- headers: {
894
- 'Repr-Digest': await get_digest('yy')
895
- }
896
- })
897
- if (!r.ok) return 'got: ' + r.status
898
- return 'ok'
899
- },
900
- 'got: 550'
901
- )
902
-
903
- runTest(
904
- "test subscribing and verifying digests [simpleton]",
905
- async () => {
906
- let key = 'test-' + Math.random().toString(36).slice(2)
907
-
908
- let r = await braid_fetch(`/${key}`, {
909
- method: 'PUT',
910
- version: ['hi-1'],
911
- parents: [],
912
- body: 'xx'
913
- })
914
- if (!r.ok) throw 'got: ' + r.statusCode
915
-
916
- var a = new AbortController()
917
- let r2 = await braid_fetch(`/${key}`, {
918
- signal: a.signal,
919
- version: ['hi-0'],
920
- subscribe: true
921
- })
922
- var parts = []
923
- var p = new Promise(async (done, fail) => {
924
- r2.subscribe(update => {
925
- parts.push(update.extra_headers['repr-digest'])
926
- if (parts.length > 1) {
927
- done()
928
- a.abort()
929
- }
930
- }, fail)
931
- })
932
-
933
- await new Promise(done => setTimeout(done, 300))
934
- let rr = await braid_fetch(`/${key}`, {
935
- method: 'PUT',
936
- version: ['hi-2'],
937
- parents: ['hi-1'],
938
- patches: [{unit: "text", range: "[1:1]", content: "Y"}]
939
- })
940
- if (!rr.ok) throw 'got: ' + rr.statusCode
941
-
942
- await p
943
- return JSON.stringify(parts)
944
- },
945
- '["sha-256=:Xd6JaIf2dUybFb/jpEGuSAbfL96UABMR4IvxEGIuC74=:","sha-256=:77cl3INcGEtczN0zK3eOgW/YWYAOm8ub73LkVcF2/rA=:"]'
946
- )
947
-
948
- runTest(
949
- "test subscribing and verifying digests [dt]",
950
- async () => {
951
- let key = 'test-' + Math.random().toString(36).slice(2)
952
-
953
- let r = await braid_fetch(`/${key}`, {
954
- method: 'PUT',
955
- version: ['hi-1'],
956
- parents: [],
957
- body: 'xx'
958
- })
959
- if (!r.ok) throw 'got: ' + r.statusCode
960
-
961
- var a = new AbortController()
962
- let r2 = await braid_fetch(`/${key}`, {
963
- signal: a.signal,
964
- version: ['hi-0'],
965
- headers: { 'merge-type': 'dt' },
966
- subscribe: true
967
- })
968
- var parts = []
969
- var p = new Promise(async (done, fail) => {
970
- r2.subscribe(update => {
971
- parts.push(update.extra_headers['repr-digest'])
972
- if (parts.length > 1) {
973
- done()
974
- a.abort()
975
- }
976
- }, fail)
977
- })
978
-
979
- await new Promise(done => setTimeout(done, 300))
980
- let rr = await braid_fetch(`/${key}`, {
981
- method: 'PUT',
982
- version: ['hi-2'],
983
- parents: ['hi-1'],
984
- patches: [{unit: "text", range: "[2:2]", content: "Y"}]
985
- })
986
- if (!rr.ok) throw 'got: ' + rr.statusCode
987
-
988
- await p
989
- return JSON.stringify(parts)
990
- },
991
- '["sha-256=:Xd6JaIf2dUybFb/jpEGuSAbfL96UABMR4IvxEGIuC74=:","sha-256=:QknHazou37wCCwv3JXnCoAvXcKszP6xBTxLIiUAETgI=:"]'
992
- )
993
-
994
- runTest(
995
- "test PUTing a version that the server already has",
996
- async () => {
997
- var key = 'test-' + Math.random().toString(36).slice(2)
998
-
999
- var r1 = await braid_fetch(`/${key}`, {
1000
- method: 'PUT',
1001
- version: ['hi-0'],
1002
- parents: [],
1003
- body: 'x'
1004
- })
1005
-
1006
- var r2 = await braid_fetch(`/${key}`, {
1007
- method: 'PUT',
1008
- version: ['hi-0'],
1009
- parents: [],
1010
- body: 'x'
1011
- })
1012
-
1013
- return r1.status + " " + r2.status
1014
- },
1015
- '200 200'
1016
- )
1017
-
1018
- runTest(
1019
- "test validate_already_seen_versions with same version",
1020
- async () => {
1021
- var key = 'test-' + Math.random().toString(36).slice(2)
1022
-
1023
- var r1 = await braid_fetch(`/eval`, {
1024
- method: 'PUT',
1025
- body: `void (async () => {
1026
- var resource = await braid_text.get_resource('/${key}')
1027
-
1028
- var {change_count} = await braid_text.put(resource, { peer: "abc", version: ["hi-2"], parents: [], patches: [{unit: "text", range: "[0:0]", content: "XYZ"}], merge_type: "dt" })
1029
-
1030
- res.end('' + change_count)
1031
- })()`
1032
- })
1033
-
1034
- var r2 = await braid_fetch(`/eval`, {
1035
- method: 'PUT',
1036
- body: `void (async () => {
1037
- var resource = await braid_text.get_resource('/${key}')
1038
-
1039
- var {change_count} = await braid_text.put(resource, { peer: "abc", version: ["hi-2"], parents: [], patches: [{unit: "text", range: "[0:0]", content: "XYZ"}], merge_type: "dt", validate_already_seen_versions: true })
1040
-
1041
- res.end('' + change_count)
1042
- })()`
1043
- })
1044
-
1045
- return (await r1.text()) + " " + (await r2.text())
1046
- },
1047
- '3 3'
1048
- )
1049
-
1050
- runTest(
1051
- "test validate_already_seen_versions with modified version",
1052
- async () => {
1053
- var key = 'test-' + Math.random().toString(36).slice(2)
1054
-
1055
- var r1 = await braid_fetch(`/eval`, {
1056
- method: 'PUT',
1057
- body: `void (async () => {
1058
- var resource = await braid_text.get_resource('/${key}')
1059
-
1060
- var {change_count} = await braid_text.put(resource, { peer: "abc", version: ["hi-2"], parents: [], patches: [{unit: "text", range: "[0:0]", content: "XYZ"}], merge_type: "dt" })
1061
-
1062
- res.end('' + change_count)
1063
- })()`
1064
- })
1065
-
1066
- var r2 = await braid_fetch(`/eval`, {
1067
- method: 'PUT',
1068
- body: `void (async () => {
1069
- var resource = await braid_text.get_resource('/${key}')
1070
-
1071
- try {
1072
- var {change_count} = await braid_text.put(resource, { peer: "abc", version: ["hi-2"], parents: [], patches: [{unit: "text", range: "[0:0]", content: "ABC"}], merge_type: "dt", validate_already_seen_versions: true })
1073
-
1074
- res.end('' + change_count)
1075
- } catch (e) {
1076
- res.end(e.message)
1077
- }
1078
- })()`
1079
- })
1080
-
1081
- return await r2.text()
1082
- },
1083
- 'invalid update: different from previous update with same version'
1084
- )
1085
-
1086
- runTest(
1087
- "test loading a previously saved resource",
1088
- async () => {
1089
- var key = 'test-' + Math.random().toString(36).slice(2)
1090
-
1091
- var f1 = await braid_fetch(`/${key}`, {
1092
- method: 'PUT',
1093
- version: ['hi-2'],
1094
- parents: [],
1095
- body: 'abc'
1096
- })
1097
-
1098
- var f1 = await braid_fetch(`/eval`, {
1099
- method: 'PUT',
1100
- body: `
1101
- delete braid_text.cache['/${key}']
1102
- res.end()
1103
- `
1104
- })
1105
-
1106
- var r = await braid_fetch(`/${key}`)
1107
- return await r.text()
1108
- },
1109
- 'abc'
1110
- )
1111
-
1112
- runTest(
1113
- "test non-contigous ids",
1114
- async () => {
1115
- var key = 'test-' + Math.random().toString(36).slice(2)
1116
-
1117
- var r = await braid_fetch(`/${key}`, {
1118
- method: 'PUT',
1119
- version: ['hi-10'],
1120
- parents: [],
1121
- body: 'abc'
1122
- })
1123
-
1124
- var r = await braid_fetch(`/${key}`, {
1125
- method: 'PUT',
1126
- version: ['hi-20'],
1127
- parents: ['hi-10'],
1128
- body: 'ABC'
1129
- })
1130
-
1131
- var f1 = await braid_fetch(`/eval`, {
1132
- method: 'PUT',
1133
- body: `
1134
- delete braid_text.cache['/${key}']
1135
- res.end()
1136
- `
1137
- })
1138
-
1139
- var r = await braid_fetch(`/${key}`)
1140
- return await r.text()
1141
- },
1142
- 'ABC'
1143
- )
1144
-
1145
- runTest(
1146
- "test when PUT cache/buffer size fails",
1147
- async () => {
1148
- var key = 'test-' + Math.random().toString(36).slice(2)
1149
-
1150
- var f1 = braid_fetch(`/${key}`, {
1151
- method: 'PUT',
1152
- version: ['hi-3000000'],
1153
- parents: ['yo-0'],
1154
- body: 'A'.repeat(3000000)
1155
- })
1156
-
1157
- await new Promise(done => setTimeout(done, 300))
1158
-
1159
- var f2 = braid_fetch(`/${key}`, {
1160
- method: 'PUT',
1161
- version: ['ih-3000000'],
1162
- parents: ['yo-0'],
1163
- body: 'B'.repeat(3000000)
1164
- })
1165
-
1166
- await new Promise(done => setTimeout(done, 300))
1167
-
1168
- var r = await braid_fetch(`/${key}`, {
1169
- method: 'PUT',
1170
- version: ['yo-0'],
1171
- parents: [],
1172
- body: 'x'
1173
- })
1174
- if (!r.ok) throw 'got: ' + r.statusCode
1175
-
1176
- return `f1: ${(await f1).status}, f2: ${(await f2).status}`
1177
- },
1178
- 'f1: 200, f2: 309'
1179
- )
1180
-
1181
- runTest(
1182
- "test multiple patches",
1183
- async () => {
1184
- var key = 'test-' + Math.random().toString(36).slice(2)
1185
-
1186
- var r = await braid_fetch(`/${key}`, {
1187
- method: 'PUT',
1188
- version: ['hi-0'],
1189
- parents: [],
1190
- body: 'A'
1191
- })
1192
- if (!r.ok) throw 'got: ' + r.statusCode
1193
-
1194
- var r = await braid_fetch(`/${key}`, {
1195
- method: 'PUT',
1196
- version: ['yo-1'],
1197
- parents: ['hi-0'],
1198
- patches: [
1199
- {unit: 'text', range: '[0:0]', content: 'C'},
1200
- {unit: 'text', range: '[1:1]', content: 'T'}
1201
- ]
1202
- })
1203
- if (!r.ok) throw 'got: ' + r.statusCode
1204
-
1205
- var r2 = await braid_fetch(`/${key}`)
1206
- return await r2.text()
1207
- },
1208
- 'CAT'
1209
- )
1210
-
1211
- runTest(
1212
- "test PUT after subscribing",
1213
- async () => {
1214
- var key = 'test-' + Math.random().toString(36).slice(2)
1215
-
1216
- var p_done
1217
- var p = new Promise(done => p_done = done)
1218
-
1219
- var a = new AbortController()
1220
- var r = await braid_fetch(`/${key}`, {
1221
- signal: a.signal,
1222
- subscribe: true
1223
- })
1224
- r.subscribe(update => {
1225
- if (update.version[0] === 'hi-0') {
1226
- p_done(update.patches[0].content_text)
1227
- a.abort()
1228
- }
1229
- })
1230
-
1231
- var r = await braid_fetch(`/${key}`, {
1232
- method: 'PUT',
1233
- version: ['hi-0'],
1234
- parents: [],
1235
- body: 'x'
1236
- })
1237
- if (!r.ok) throw 'got: ' + r.statusCode
1238
-
1239
- return await p
1240
- },
1241
- 'x'
1242
- )
1243
-
1244
- runTest(
1245
- "test out-of-order PUTs",
1246
- async () => {
1247
- var key = 'test-' + Math.random().toString(36).slice(2)
1248
-
1249
- var f = braid_fetch(`/${key}`, {
1250
- method: 'PUT',
1251
- version: ['hi-1'],
1252
- parents: ['hi-0'],
1253
- patches: [{unit: 'text', range: '[1:1]', content: 'y'}]
1254
- })
1255
-
1256
- await new Promise(done => setTimeout(done, 500))
1257
-
1258
- var r = await braid_fetch(`/${key}`, {
1259
- method: 'PUT',
1260
- version: ['hi-0'],
1261
- parents: [],
1262
- body: 'x'
1263
- })
1264
-
1265
- if (!r.ok) throw 'got: ' + r.status
1266
-
1267
- r = await f
1268
- if (!r.ok) throw 'got: ' + r.status
1269
-
1270
- var r2 = await braid_fetch(`/${key}`)
1271
- return await r2.text()
1272
- },
1273
- 'xy'
1274
- )
1275
-
1276
- runTest(
1277
- "test out-of-order PUTs (trial two)",
1278
- async () => {
1279
- var key = 'test-' + Math.random().toString(36).slice(2)
1280
-
1281
- var f = braid_fetch(`/${key}`, {
1282
- method: 'PUT',
1283
- version: ['ab-1'],
1284
- parents: ['hi-0'],
1285
- patches: [{unit: 'text', range: '[1:1]', content: 'y'}]
1286
- })
1287
-
1288
- await new Promise(done => setTimeout(done, 500))
1289
-
1290
- var r = await braid_fetch(`/${key}`, {
1291
- method: 'PUT',
1292
- version: ['hi-1'],
1293
- parents: [],
1294
- body: 'xz'
1295
- })
1296
-
1297
- if (!r.ok) throw 'got: ' + r.statusCode
1298
-
1299
- r = await f
1300
- if (!r.ok) throw 'got: ' + r.statusCode
1301
-
1302
- var r2 = await braid_fetch(`/${key}`)
1303
- return await r2.text()
1304
- },
1305
- 'xyz'
1306
- )
1307
-
1308
- runTest(
1309
- "test in-order PUTs",
1310
- async () => {
1311
- var key = 'test-' + Math.random().toString(36).slice(2)
1312
-
1313
- var r = await braid_fetch(`/${key}`, {
1314
- method: 'PUT',
1315
- version: ['hi-0'],
1316
- parents: [],
1317
- body: 'x'
1318
- })
1319
- if (!r.ok) throw 'got: ' + r.statusCode
1320
-
1321
- var r = await braid_fetch(`/${key}`, {
1322
- method: 'PUT',
1323
- version: ['hi-1'],
1324
- parents: ['hi-0'],
1325
- patches: [{unit: 'text', range: '[1:1]', content: 'y'}]
1326
- })
1327
- if (!r.ok) throw 'got: ' + r.statusCode
1328
-
1329
- var r2 = await braid_fetch(`/${key}`)
1330
- return await r2.text()
1331
- },
1332
- 'xy'
1333
- )
1334
-
1335
- runTest(
1336
- "test put with transfer-encoding: dt",
1337
- async () => {
1338
- var key = 'test-' + Math.random().toString(36).slice(2)
1339
- var doc = new Doc('hi')
1340
- doc.ins(0, 'xy')
1341
-
1342
- var bytes = doc.toBytes()
1343
-
1344
- var r1 = await braid_fetch(`/eval`, {
1345
- method: 'PUT',
1346
- body: `void (async () => {
1347
- var key = '/${key}'
1348
-
1349
- var {change_count} = await braid_text.put(key, {
1350
- body: new Uint8Array([${'' + bytes}]),
1351
- transfer_encoding: "dt"
1352
- })
1353
- var {body, version} = await braid_text.get(key, {})
1354
-
1355
- res.end('' + change_count + " " + body + " " + version)
1356
- })()`
1357
- })
1358
-
1359
- return await r1.text()
1360
- },
1361
- '2 xy hi-1'
1362
- )
1363
-
1364
- runTest(
1365
- "test transfer-encoding dt (with parents)",
1366
- async () => {
1367
- await dt_p
1368
- let key = 'test-' + Math.random().toString(36).slice(2)
1369
- var doc = new Doc('hi')
1370
- doc.ins(0, 'x')
1371
-
1372
- let r = await braid_fetch(`/${key}`, {
1373
- method: 'PUT',
1374
- version: ['hi-1'],
1375
- parents: [],
1376
- body: 'xy'
1377
- })
1378
- if (!r.ok) throw 'got: ' + r.statusCode
1379
-
1380
- let r2 = await braid_fetch(`/${key}`, {
1381
- parents: ['hi-0'],
1382
- headers: {
1383
- 'Accept-Transfer-Encoding': 'dt'
1384
- }
1385
- })
1386
-
1387
- doc.mergeBytes([...new Uint8Array(await r2.arrayBuffer())])
1388
- var text = doc.get()
1389
- doc.free()
1390
-
1391
- return r2.headers.get('current-version') + ' ' + r2.headers.get('x-transfer-encoding') + ' ' + text + ' ' + r2.statusText
1392
- },
1393
- '"hi-1" dt xy Multiresponse'
1394
- )
1395
-
1396
- runTest(
1397
- "test transfer-encoding dt",
1398
- async () => {
1399
- await dt_p
1400
- let key = 'test-' + Math.random().toString(36).slice(2)
1401
-
1402
- let r = await braid_fetch(`/${key}`, {
1403
- method: 'PUT',
1404
- version: ['hi-1'],
1405
- parents: [],
1406
- body: 'xy'
1407
- })
1408
- if (!r.ok) throw 'got: ' + r.statusCode
1409
-
1410
- let r2 = await braid_fetch(`/${key}`, {
1411
- headers: {
1412
- 'Accept-Transfer-Encoding': 'dt'
1413
- }
1414
- })
1415
-
1416
- var doc = new Doc('yo')
1417
- doc.mergeBytes([...new Uint8Array(await r2.arrayBuffer())])
1418
- var text = doc.get()
1419
- doc.free()
1420
-
1421
- return r2.headers.get('current-version') + ' ' + r2.headers.get('x-transfer-encoding') + ' ' + text
1422
- },
1423
- '"hi-1" dt xy'
1424
- )
1425
-
1426
- runTest(
1427
- "test GETing old version explicitly with transfer-encoding dt",
1428
- async () => {
1429
- await dt_p
1430
- let key = 'test-' + Math.random().toString(36).slice(2)
1431
-
1432
- let r = await braid_fetch(`/${key}`, {
1433
- method: 'PUT',
1434
- version: ['hi∑-1'],
1435
- parents: [],
1436
- body: 'xy'
1437
- })
1438
- if (!r.ok) throw 'got: ' + r.statusCode
1439
-
1440
- let r2 = await braid_fetch(`/${key}`, {
1441
- version: ['hi∑-0'],
1442
- headers: {
1443
- 'Accept-Transfer-Encoding': 'dt'
1444
- }
1445
- })
1446
-
1447
- var doc = new Doc('yo')
1448
- doc.mergeBytes([...new Uint8Array(await r2.arrayBuffer())])
1449
- var text = doc.get()
1450
- doc.free()
1451
-
1452
- return r2.headers.get('current-version') + ' ' + text + ' ' + JSON.parse(r2.headers.get('current-version'))
1453
- },
1454
- '"hi\\u2211-1" x hi∑-1'
1455
- )
1456
-
1457
- runTest(
1458
- "test GETing current version explicitly with transfer-encoding dt",
1459
- async () => {
1460
- await dt_p
1461
- let key = 'test-' + Math.random().toString(36).slice(2)
1462
-
1463
- let r = await braid_fetch(`/${key}`, {
1464
- method: 'PUT',
1465
- version: ['hi∑-1'],
1466
- parents: [],
1467
- body: 'xy'
1468
- })
1469
- if (!r.ok) throw 'got: ' + r.statusCode
1470
-
1471
- let r2 = await braid_fetch(`/${key}`, {
1472
- version: ['hi∑-1'],
1473
- headers: {
1474
- 'Accept-Transfer-Encoding': 'dt'
1475
- }
1476
- })
1477
-
1478
- var doc = new Doc('yo')
1479
- doc.mergeBytes([...new Uint8Array(await r2.arrayBuffer())])
1480
- var text = doc.get()
1481
- doc.free()
1482
-
1483
- return r2.headers.get('current-version') + ' ' + text + ' ' + JSON.parse(r2.headers.get('current-version'))
1484
- },
1485
- '"hi\\u2211-1" xy hi∑-1'
1486
- )
1487
-
1488
- runTest(
1489
- "test for Current-Version when GETing old version",
1490
- async () => {
1491
- await dt_p
1492
- let key = 'test-' + Math.random().toString(36).slice(2)
1493
-
1494
- let r = await braid_fetch(`/${key}`, {
1495
- method: 'PUT',
1496
- version: ['hi∑-1'],
1497
- parents: [],
1498
- body: 'xy'
1499
- })
1500
- if (!r.ok) throw 'got: ' + r.statusCode
1501
-
1502
- let r2 = await braid_fetch(`/${key}`, {
1503
- version: ['hi∑-0']
1504
- })
1505
-
1506
- var text = await r2.text()
1507
-
1508
- return r2.headers.get('current-version') + ' ' + r2.headers.get('version') + ' ' + text + ' ' + JSON.parse(r2.headers.get('current-version'))
1509
- },
1510
- '"hi\\u2211-1" "hi\\u2211-0" x hi∑-1'
1511
- )
1512
-
1513
- runTest(
1514
- "test HEAD for GET without subscribe",
1515
- async () => {
1516
- await dt_p
1517
- let key = 'test-' + Math.random().toString(36).slice(2)
1518
-
1519
- let r = await braid_fetch(`/${key}`, {
1520
- method: 'PUT',
1521
- version: ['hi∑-1'],
1522
- parents: [],
1523
- body: 'xy'
1524
- })
1525
- if (!r.ok) throw 'got: ' + r.statusCode
1526
-
1527
- let r2 = await braid_fetch(`/${key}`, {
1528
- method: 'HEAD'
1529
- })
1530
-
1531
- var text = await r2.text()
1532
-
1533
- return r2.headers.get('version') + ' ' + JSON.parse(r2.headers.get('version')) + ` text:[${text}]`
1534
- },
1535
- '"hi\\u2211-1" hi∑-1 text:[]'
1536
- )
1537
-
1538
- runTest(
1539
- "test HEAD for GET without subscribe (with transfer-encoding)",
1540
- async () => {
1541
- await dt_p
1542
- let key = 'test-' + Math.random().toString(36).slice(2)
1543
-
1544
- let r = await braid_fetch(`/${key}`, {
1545
- method: 'PUT',
1546
- version: ['hi∑-1'],
1547
- parents: [],
1548
- body: 'xy'
1549
- })
1550
- if (!r.ok) throw 'got: ' + r.statusCode
1551
-
1552
- let r2 = await braid_fetch(`/${key}`, {
1553
- method: 'HEAD',
1554
- headers: {
1555
- 'accept-transfer-encoding': 'dt'
1556
- }
1557
- })
1558
-
1559
- var buf = await r2.arrayBuffer()
1560
-
1561
- return r2.headers.get('current-version') + ' ' + JSON.parse(r2.headers.get('current-version')) + ` buf.byteLength:${buf.byteLength}`
1562
- },
1563
- '"hi\\u2211-1" hi∑-1 buf.byteLength:0'
1564
- )
1565
-
1566
- runTest(
1567
- "test accept-encoding updates(dt) (with parents)",
1568
- async () => {
1569
- await dt_p
1570
- let key = 'test-' + Math.random().toString(36).slice(2)
1571
- var doc = new Doc('hi')
1572
- doc.ins(0, 'x')
1573
-
1574
- let r = await braid_fetch(`/${key}`, {
1575
- method: 'PUT',
1576
- version: ['hi-1'],
1577
- parents: [],
1578
- body: 'xy'
1579
- })
1580
- if (!r.ok) throw 'got: ' + r.statusCode
1581
-
1582
- var a = new AbortController()
1583
- let r2 = await braid_fetch(`/${key}`, {
1584
- signal: a.signal,
1585
- parents: ['hi-0'],
1586
- subscribe: true,
1587
- headers: {
1588
- 'merge-type': 'dt',
1589
- 'X-Accept-Encoding': 'updates(dt)'
1590
- }
1591
- })
1592
-
1593
- return await new Promise(done => {
1594
- r2.subscribe(u => {
1595
- doc.mergeBytes(u.body)
1596
- done(doc.get())
1597
- doc.free()
1598
- a.abort()
1599
- })
1600
- })
1601
- },
1602
- 'xy'
1603
- )
1604
-
1605
- runTest(
1606
- "test accept-encoding updates(dt) (with parents which are current version)",
1607
- async () => {
1608
- await dt_p
1609
- let key = 'test-' + Math.random().toString(36).slice(2)
1610
- var doc = new Doc('hi')
1611
- doc.ins(0, 'xy')
1612
-
1613
- let r = await braid_fetch(`/${key}`, {
1614
- method: 'PUT',
1615
- version: ['hi-1'],
1616
- parents: [],
1617
- body: 'xy'
1618
- })
1619
- if (!r.ok) throw 'got: ' + r.statusCode
1620
-
1621
- var a = new AbortController()
1622
- let r2 = await braid_fetch(`/${key}`, {
1623
- signal: a.signal,
1624
- parents: ['hi-1'],
1625
- subscribe: true,
1626
- headers: {
1627
- 'merge-type': 'dt',
1628
- 'X-Accept-Encoding': 'updates(dt)'
1629
- }
1630
- })
1631
-
1632
- return await new Promise(done => {
1633
- r2.subscribe(u => {
1634
- doc.mergeBytes(u.body)
1635
- done(doc.get())
1636
- doc.free()
1637
- a.abort()
1638
- })
1639
- })
1640
- },
1641
- 'xy'
1642
- )
1643
-
1644
- runTest(
1645
- "test accept-encoding updates(dt)",
1646
- async () => {
1647
- await dt_p
1648
- let key = 'test-' + Math.random().toString(36).slice(2)
1649
-
1650
- let r = await braid_fetch(`/${key}`, {
1651
- method: 'PUT',
1652
- version: ['hi-1'],
1653
- parents: [],
1654
- body: 'xy'
1655
- })
1656
- if (!r.ok) throw 'got: ' + r.statusCode
1657
-
1658
- var a = new AbortController()
1659
- let r2 = await braid_fetch(`/${key}`, {
1660
- signal: a.signal,
1661
- subscribe: true,
1662
- headers: {
1663
- 'merge-type': 'dt',
1664
- 'X-Accept-Encoding': 'updates(dt)'
1665
- }
1666
- })
1667
-
1668
- var doc = new Doc('yo')
1669
- return await new Promise(done => {
1670
- r2.subscribe(u => {
1671
- doc.mergeBytes(u.body)
1672
- done(doc.get())
1673
- doc.free()
1674
- a.abort()
1675
- })
1676
- })
1677
- },
1678
- 'xy'
1679
- )
1680
-
1681
- runTest(
1682
- "test accept-encoding updates(dt), getting non-encoded update",
1683
- async () => {
1684
- await dt_p
1685
- let key = 'test-' + Math.random().toString(36).slice(2)
1686
-
1687
- let r = await braid_fetch(`/${key}`, {
1688
- method: 'PUT',
1689
- version: ['hi-1'],
1690
- parents: [],
1691
- body: 'xy'
1692
- })
1693
- if (!r.ok) throw 'got: ' + r.statusCode
1694
-
1695
- var a = new AbortController()
1696
- let r2 = await braid_fetch(`/${key}`, {
1697
- signal: a.signal,
1698
- subscribe: true,
1699
- headers: {
1700
- 'merge-type': 'dt',
1701
- 'X-Accept-Encoding': 'updates(dt)'
1702
- }
1703
- })
1704
-
1705
- setTimeout(async () => {
1706
- await braid_fetch(`/${key}`, {
1707
- method: 'PUT',
1708
- version: ['yo-0'],
1709
- parents: ['hi-1'],
1710
- patches: [{unit: 'text', range: '[2:2]', content: 'z'}]
1711
- })
1712
- }, 200)
1713
-
1714
- var results = []
1715
-
1716
- var doc = new Doc('yo')
1717
- return await new Promise(done => {
1718
- r2.subscribe(u => {
1719
- if (!u.status) {
1720
- doc.mergeBytes(u.body)
1721
- results.push(doc.get())
1722
- doc.free()
1723
- } else {
1724
- results.push(u.patches[0].content_text)
1725
- done(results.join(''))
1726
- a.abort()
1727
- }
1728
- })
1729
- })
1730
- },
1731
- 'xyz'
1732
- )
1733
-
1734
- runTest(
1735
- "test Version we get from PUTing",
1736
- async () => {
1737
- await dt_p
1738
- let key = 'test-' + Math.random().toString(36).slice(2)
1739
-
1740
- let r = await braid_fetch(`/${key}`, {
1741
- method: 'PUT',
1742
- version: ['hi∑-1'],
1743
- parents: [],
1744
- body: 'xy'
1745
- })
1746
- if (!r.ok) throw 'got: ' + r.statusCode
1747
-
1748
- return r.headers.get('version')
1749
- },
1750
- '"hi\\u2211-1"'
1751
- )
1752
-
1753
- runTest(
1754
- "test error code when missing parents",
1755
- async () => {
1756
- let key = 'test-' + Math.random().toString(36).slice(2)
1757
- let r = await braid_fetch(`/${key}`, {
1758
- method: 'PUT',
1759
- version: ['hi-1'],
1760
- parents: ['missing-0', 'y😀-0'],
1761
- body: 'xx'
1762
- })
1763
- return r.status + ' ' + r.ok + ' ' + r.statusText + ' ' + r.headers.get('Version')
1764
- },
1765
- '309 false Version Unknown Here "missing-0", "y\\ud83d\\ude00-0"'
1766
- )
1767
-
1768
- runTest(
1769
- "test subscribing starting at a version using simpleton",
1770
- async () => {
1771
- let key = 'test-' + Math.random().toString(36).slice(2)
1772
-
1773
- let r = await braid_fetch(`/${key}`, {
1774
- method: 'PUT',
1775
- version: ['hi-1'],
1776
- parents: [],
1777
- body: 'xx'
1778
- })
1779
- if (!r.ok) throw 'got: ' + r.statusCode
1780
-
1781
- var a = new AbortController()
1782
- let r2 = await braid_fetch(`/${key}`, {
1783
- signal: a.signal,
1784
- version: ['hi-0'],
1785
- subscribe: true
1786
- })
1787
- return await new Promise(async (done, fail) => {
1788
- r2.subscribe(update => {
1789
- done(JSON.stringify(update.parents))
1790
- a.abort()
1791
- }, fail)
1792
- })
1793
- },
1794
- JSON.stringify([ "hi-0" ])
1795
- )
1796
-
1797
- runTest(
1798
- "test subscribing starting at a version using dt",
1799
- async () => {
1800
- let key = 'test-' + Math.random().toString(36).slice(2)
1801
-
1802
- let r = await braid_fetch(`/${key}`, {
1803
- method: 'PUT',
1804
- version: ['hi-1'],
1805
- parents: [],
1806
- body: 'xx'
1807
- })
1808
- if (!r.ok) throw 'got: ' + r.statusCode
1809
-
1810
- var a = new AbortController()
1811
- let r2 = await braid_fetch(`/${key}`, {
1812
- signal: a.signal,
1813
- version: ['hi-0'],
1814
- subscribe: true,
1815
- headers: {
1816
- 'Merge-Type': 'dt'
1817
- }
1818
- })
1819
- return r2.headers.get('merge-type') + ':' + await new Promise(async (done, fail) => {
1820
- r2.subscribe(update => {
1821
- done(JSON.stringify(update.parents))
1822
- a.abort()
1823
- }, fail)
1824
- })
1825
- },
1826
- 'dt:' + JSON.stringify([ "hi-0" ])
1827
- )
1828
-
1829
- runTest(
1830
- "test subscribing starting at the latest version using dt",
1831
- async () => {
1832
- let key = 'test-' + Math.random().toString(36).slice(2)
1833
-
1834
- let r = await braid_fetch(`/${key}`, {
1835
- method: 'PUT',
1836
- version: ['hi-1'],
1837
- parents: [],
1838
- body: 'xx'
1839
- })
1840
- if (!r.ok) throw 'got: ' + r.statusCode
1841
-
1842
- var a = new AbortController()
1843
- let r2 = await braid_fetch(`/${key}`, {
1844
- signal: a.signal,
1845
- version: ['hi-1'],
1846
- subscribe: true,
1847
- headers: {
1848
- 'Merge-Type': 'dt'
1849
- }
1850
- })
1851
- return await new Promise(async (done, fail) => {
1852
- r2.subscribe(update => {
1853
- done('got something')
1854
- a.abort()
1855
- }, fail)
1856
- setTimeout(() => {
1857
- done('got nothing')
1858
- a.abort()
1859
- }, 1500)
1860
- })
1861
- },
1862
- 'got nothing'
1863
- )
1864
-
1865
- runTest(
1866
- "test subscribing starting at beginning using dt",
1867
- async () => {
1868
- let key = 'test-' + Math.random().toString(36).slice(2)
1869
-
1870
- let r = await braid_fetch(`/${key}`, {
1871
- method: 'PUT',
1872
- version: ['hi-1'],
1873
- parents: [],
1874
- body: 'xx'
1875
- })
1876
- if (!r.ok) throw 'got: ' + r.statusCode
1877
-
1878
- var a = new AbortController()
1879
- let r2 = await braid_fetch(`/${key}`, {
1880
- signal: a.signal,
1881
- subscribe: true,
1882
- headers: {
1883
- 'Merge-Type': 'dt'
1884
- }
1885
- })
1886
- return r2.headers.get('merge-type') + ':' + await new Promise(async (done, fail) => {
1887
- r2.subscribe(update => {
1888
- if (update.version[0] === 'hi-1') {
1889
- done('got it!')
1890
- a.abort()
1891
- }
1892
- }, fail)
1893
- })
1894
- },
1895
- 'dt:got it!'
1896
- )
1897
-
1898
- runTest(
1899
- "test dt_create_bytes with big agent name",
1900
- async () => {
1901
- let x = await (await fetch(`/test.html?dt_create_bytes_big_name`)).json()
1902
- return JSON.stringify(x)
1903
- },
1904
- JSON.stringify({ok: true})
1905
- )
1906
-
1907
- runTest(
1908
- "test dt_create_bytes with many agent names",
1909
- async () => {
1910
- let x = await (await fetch(`/test.html?dt_create_bytes_many_names`)).json()
1911
- return JSON.stringify(x)
1912
- },
1913
- JSON.stringify({ok: true})
1914
- )
1915
-
1916
- runTest(
1917
- "test deleting a resource",
1918
- async () => {
1919
- let key = 'test-' + Math.random().toString(36).slice(2)
1920
-
1921
- await fetch(`/${key}`, {
1922
- method: 'PUT',
1923
- body: 'hi'
1924
- })
1925
-
1926
- await fetch(`/${key}`, {method: 'DELETE'})
1927
-
1928
- let r = await fetch(`/${key}`)
1929
-
1930
- return await r.text()
1931
- },
1932
- ''
1933
- )
1934
-
1935
- runTest(
1936
- "test getting a binary update from a subscription",
1937
- async () => {
1938
- return await new Promise(async (done, fail) => {
1939
- let key = 'test-' + Math.random().toString(36).slice(2)
1940
-
1941
- await fetch(`/${key}`, {
1942
- method: 'PUT',
1943
- body: JSON.stringify({a: 5, b: 6}, null, 4)
1944
- })
1945
-
1946
- var a = new AbortController()
1947
- let r = await braid_fetch(`/${key}`, {
1948
- signal: a.signal,
1949
- subscribe: true
1950
- })
1951
-
1952
- r.subscribe(update => {
1953
- done(update.body_text)
1954
- a.abort()
1955
- }, fail)
1956
- })
1957
- },
1958
- JSON.stringify({a: 5, b: 6}, null, 4)
1959
- )
1960
-
1961
- runTest(
1962
- "test sending a json patch to some json-text",
1963
- async () => {
1964
- let key = 'test-' + Math.random().toString(36).slice(2)
1965
-
1966
- await fetch(`/${key}`, {
1967
- method: 'PUT',
1968
- body: JSON.stringify({a: 5, b: 6})
1969
- })
1970
-
1971
- await fetch(`/${key}`, {
1972
- method: 'PUT',
1973
- headers: { 'Content-Range': 'json a' },
1974
- body: '67'
1975
- })
1976
-
1977
- let r = await fetch(`/${key}`)
1978
-
1979
- return await r.text()
1980
- },
1981
- JSON.stringify({a: 67, b: 6}, null, 4)
1982
- )
1983
-
1984
- runTest(
1985
- "test sending multiple json patches to some json-text",
1986
- async () => {
1987
- let key = 'test-' + Math.random().toString(36).slice(2)
1988
-
1989
- await fetch(`/${key}`, {
1990
- method: 'PUT',
1991
- body: JSON.stringify({a: 5, b: 6, c: 7})
1992
- })
1993
-
1994
- await braid_fetch(`/${key}`, {
1995
- method: 'PUT',
1996
- headers: { 'Content-Range': 'json a' },
1997
- patches: [{
1998
- unit: 'json',
1999
- range: 'a',
2000
- content: '55',
2001
- }, {
2002
- unit: 'json',
2003
- range: 'b',
2004
- content: '66',
2005
- }]
2006
- })
2007
-
2008
- let r = await fetch(`/${key}`)
2009
-
2010
- return await r.text()
2011
- },
2012
- JSON.stringify({a: 55, b: 66, c: 7}, null, 4)
2013
- )
2014
-
2015
- runTest(
2016
- "test deleting something using a json patch",
2017
- async () => {
2018
- let key = 'test-' + Math.random().toString(36).slice(2)
2019
-
2020
- await fetch(`/${key}`, {
2021
- method: 'PUT',
2022
- body: JSON.stringify({a: 5, b: 6}, null, 4)
2023
- })
2024
-
2025
- await fetch(`/${key}`, {
2026
- method: 'PUT',
2027
- headers: { 'Content-Range': 'json a' },
2028
- body: ''
2029
- })
2030
-
2031
- let r = await fetch(`/${key}`)
2032
-
2033
- return await r.text()
2034
- },
2035
- JSON.stringify({b: 6}, null, 4)
2036
- )
2037
-
2038
- runTest(
2039
- "test length updating",
2040
- async () => {
2041
- let key = 'test-' + Math.random().toString(36).slice(2)
2042
-
2043
- await fetch(`/${key}`, { method: 'PUT', body: '' })
2044
- await fetch(`/${key}`, { method: 'PUT', body: '0123456789' })
2045
- await fetch(`/${key}`, { method: 'PUT', body: '0123456789' })
2046
- await fetch(`/${key}`, { method: 'PUT', body: '0123456789' })
2047
-
2048
- let r = await fetch(`/${key}`, { method: 'HEAD' })
2049
- return '' + parseInt(r.headers.get('version').split('-')[1])
2050
- },
2051
- '19'
2052
- )
2053
-
2054
- runTest(
2055
- "test retry when parents not there..",
2056
- async () => {
2057
- return await new Promise(done => {
2058
- var count = 0
2059
- var key = 'test-' + Math.random().toString(36).slice(2)
2060
- var a = new AbortController()
2061
- braid_fetch(`/${key}`, {
2062
- signal: a.signal,
2063
- multiplex: false,
2064
- method: 'PUT',
2065
- version: ['hi-3'],
2066
- parents: ['hi-1'],
2067
- body: 'xx',
2068
- onFetch: () => {
2069
- count++
2070
- if (count === 2) {
2071
- done('retried!')
2072
- a.abort()
2073
- }
2074
- },
2075
- retry: true
2076
- })
2077
- })
2078
- },
2079
- 'retried!'
2080
- )
2081
-
2082
- runTest(
2083
- "test asking for a version that should and shouldn't be there",
2084
- async () => {
2085
- var key = 'test-' + Math.random().toString(36).slice(2)
2086
-
2087
- var r = await braid_fetch(`/${key}`, {
2088
- method: 'PUT',
2089
- version: ['hi-10'],
2090
- parents: [],
2091
- body: 'x'
2092
- })
2093
- if (!r.ok) throw 'got: ' + r.statusCode
2094
-
2095
- var r = await braid_fetch(`/${key}`, {
2096
- method: 'HEAD',
2097
- version: ['hi-5']
2098
- })
2099
- if (r.status !== 309) throw 'expected 309, got: ' + r.status
2100
- if (r.statusText !== 'Version Unknown Here') throw 'unexpected status text: ' + r.statusText
2101
- if (r.ok) throw 'found version we should not have found'
2102
-
2103
- var r = await braid_fetch(`/${key}`, {
2104
- method: 'HEAD',
2105
- version: ['hi-10']
2106
- })
2107
- if (!r.ok) throw 'could not find version we should have found'
2108
-
2109
- return 'worked out!'
2110
- },
2111
- 'worked out!'
2112
- )
2113
-
2114
- runTest(
2115
- "test asking for parents that should and shouldn't be there",
2116
- async () => {
2117
- var key = 'test-' + Math.random().toString(36).slice(2)
2118
-
2119
- var r = await braid_fetch(`/${key}`, {
2120
- method: 'PUT',
2121
- version: ['hi-10'],
2122
- parents: [],
2123
- body: 'x'
2124
- })
2125
- if (!r.ok) throw 'got: ' + r.statusCode
2126
-
2127
- var r = await braid_fetch(`/${key}`, {
2128
- method: 'HEAD',
2129
- parents: ['hi-5']
2130
- })
2131
- if (r.status !== 309) throw 'expected 309, got: ' + r.status
2132
- if (r.ok) throw 'found parents we should not have found'
2133
-
2134
- var r = await braid_fetch(`/${key}`, {
2135
- method: 'HEAD',
2136
- parents: ['hi-10']
2137
- })
2138
- if (!r.ok) throw 'could not find parents we should have found'
2139
-
2140
- return 'worked out!'
2141
- },
2142
- 'worked out!'
2143
- )
2144
-
2145
- runTest(
2146
- "test that 309 returns all missing events",
2147
- async () => {
2148
- var key = 'test-' + Math.random().toString(36).slice(2)
2149
-
2150
- var r = await braid_fetch(`/${key}`, {
2151
- method: 'PUT',
2152
- version: ['hi-11'],
2153
- parents: [],
2154
- body: 'xyz'
2155
- })
2156
- if (!r.ok) throw 'got: ' + r.statusCode
2157
-
2158
- var r = await braid_fetch(`/${key}`, {
2159
- method: 'HEAD',
2160
- version: ['yo-1', 'hi-11'],
2161
- parents: ['hi-5', 'hi-8', 'hi-9', 'hi-10']
2162
- })
2163
- if (r.status !== 309) throw 'expected 309, got: ' + r.status
2164
- return r.headers.get('version')
2165
- },
2166
- '"yo-1", "hi-5", "hi-8"'
2167
- )
2168
-
2169
- runTest(
2170
- "test that subscribe returns current-version header",
2171
- async () => {
2172
- var key = 'test-' + Math.random().toString(36).slice(2)
2173
-
2174
- var r = await braid_fetch(`/${key}`, {
2175
- method: 'PUT',
2176
- version: ['hi-11'],
2177
- parents: [],
2178
- body: 'xyz'
2179
- })
2180
- if (!r.ok) throw 'got: ' + r.statusCode
2181
-
2182
- var a = new AbortController()
2183
- var r = await braid_fetch(`/${key}`, {
2184
- signal: a.signal,
2185
- subscribe: true
2186
- })
2187
- var result = r.headers.get('current-version')
2188
- a.abort()
2189
- return result
2190
- },
2191
- '"hi-11"'
2192
- )
115
+ // Load and run all tests from the shared tests.js file
116
+ defineTests(runTest, braid_fetch)
2193
117
 
2194
118
  </script>