autobee 1.0.8 → 1.0.10
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/encoding/spec/autobee/index.js +69 -42
- package/encoding/spec/autobee/schema.json +31 -5
- package/index.js +92 -26
- package/lib/writers.js +54 -30
- package/package.json +5 -5
|
@@ -645,8 +645,33 @@ const encoding21 = {
|
|
|
645
645
|
// @autobee/link
|
|
646
646
|
const encoding22 = encoding0
|
|
647
647
|
|
|
648
|
-
// @autobee/batch
|
|
648
|
+
// @autobee/external-batch
|
|
649
649
|
const encoding23 = {
|
|
650
|
+
preencode(state, m) {
|
|
651
|
+
c.fixed32.preencode(state, m.key)
|
|
652
|
+
c.uint.preencode(state, m.start)
|
|
653
|
+
c.uint.preencode(state, m.length)
|
|
654
|
+
},
|
|
655
|
+
encode(state, m) {
|
|
656
|
+
c.fixed32.encode(state, m.key)
|
|
657
|
+
c.uint.encode(state, m.start)
|
|
658
|
+
c.uint.encode(state, m.length)
|
|
659
|
+
},
|
|
660
|
+
decode(state) {
|
|
661
|
+
const r0 = c.fixed32.decode(state)
|
|
662
|
+
const r1 = c.uint.decode(state)
|
|
663
|
+
const r2 = c.uint.decode(state)
|
|
664
|
+
|
|
665
|
+
return {
|
|
666
|
+
key: r0,
|
|
667
|
+
start: r1,
|
|
668
|
+
length: r2
|
|
669
|
+
}
|
|
670
|
+
}
|
|
671
|
+
}
|
|
672
|
+
|
|
673
|
+
// @autobee/batch
|
|
674
|
+
const encoding24 = {
|
|
650
675
|
preencode(state, m) {
|
|
651
676
|
c.uint.preencode(state, m.start)
|
|
652
677
|
c.uint.preencode(state, m.end)
|
|
@@ -667,72 +692,72 @@ const encoding23 = {
|
|
|
667
692
|
}
|
|
668
693
|
|
|
669
694
|
// @autobee/views
|
|
670
|
-
const
|
|
695
|
+
const encoding25 = {
|
|
671
696
|
preencode(state, m) {
|
|
672
|
-
encoding22.preencode(state, m.system)
|
|
673
697
|
c.uint.preencode(state, m.flushes)
|
|
698
|
+
encoding23.preencode(state, m.system)
|
|
674
699
|
state.end++ // flags are fixed size
|
|
675
700
|
|
|
676
|
-
if (m.view)
|
|
701
|
+
if (m.view) encoding23.preencode(state, m.view)
|
|
677
702
|
},
|
|
678
703
|
encode(state, m) {
|
|
679
704
|
const flags = m.view ? 1 : 0
|
|
680
705
|
|
|
681
|
-
encoding22.encode(state, m.system)
|
|
682
706
|
c.uint.encode(state, m.flushes)
|
|
707
|
+
encoding23.encode(state, m.system)
|
|
683
708
|
c.uint8.encode(state, flags)
|
|
684
709
|
|
|
685
|
-
if (m.view)
|
|
710
|
+
if (m.view) encoding23.encode(state, m.view)
|
|
686
711
|
},
|
|
687
712
|
decode(state) {
|
|
688
|
-
const r0 =
|
|
689
|
-
const r1 =
|
|
713
|
+
const r0 = c.uint.decode(state)
|
|
714
|
+
const r1 = encoding23.decode(state)
|
|
690
715
|
const flags = c.uint8.decode(state)
|
|
691
716
|
|
|
692
717
|
return {
|
|
693
|
-
|
|
694
|
-
|
|
695
|
-
view: (flags & 1) !== 0 ?
|
|
718
|
+
flushes: r0,
|
|
719
|
+
system: r1,
|
|
720
|
+
view: (flags & 1) !== 0 ? encoding23.decode(state) : null
|
|
696
721
|
}
|
|
697
722
|
}
|
|
698
723
|
}
|
|
699
724
|
|
|
700
725
|
// @autobee/views (inline)
|
|
701
|
-
const
|
|
726
|
+
const encoding25_inline = {
|
|
702
727
|
preencode(state, m) {
|
|
703
|
-
encoding22.preencode(state, m.system)
|
|
704
728
|
c.uint.preencode(state, m.flushes)
|
|
729
|
+
encoding23.preencode(state, m.system)
|
|
705
730
|
|
|
706
|
-
if (m.view)
|
|
731
|
+
if (m.view) encoding23.preencode(state, m.view)
|
|
707
732
|
},
|
|
708
733
|
encode(state, m) {
|
|
709
|
-
encoding22.encode(state, m.system)
|
|
710
734
|
c.uint.encode(state, m.flushes)
|
|
735
|
+
encoding23.encode(state, m.system)
|
|
711
736
|
|
|
712
|
-
if (m.view)
|
|
737
|
+
if (m.view) encoding23.encode(state, m.view)
|
|
713
738
|
},
|
|
714
739
|
decode(state, inlining) {
|
|
715
|
-
const r0 =
|
|
716
|
-
const r1 =
|
|
740
|
+
const r0 = c.uint.decode(state)
|
|
741
|
+
const r1 = encoding23.decode(state)
|
|
717
742
|
const flags = inlining
|
|
718
743
|
|
|
719
744
|
return {
|
|
720
|
-
|
|
721
|
-
|
|
722
|
-
view: (flags & 1) !== 0 ?
|
|
745
|
+
flushes: r0,
|
|
746
|
+
system: r1,
|
|
747
|
+
view: (flags & 1) !== 0 ? encoding23.decode(state) : null
|
|
723
748
|
}
|
|
724
749
|
}
|
|
725
750
|
}
|
|
726
751
|
|
|
727
752
|
// @autobee/oplog-message-v3
|
|
728
|
-
const
|
|
753
|
+
const encoding26 = {
|
|
729
754
|
preencode(state, m) {
|
|
730
755
|
c.uint.preencode(state, m.timestamp)
|
|
731
|
-
|
|
756
|
+
encoding26_1.preencode(state, m.links)
|
|
732
757
|
state.end++ // max flag is 16 so always one byte
|
|
733
758
|
|
|
734
|
-
if (m.batch)
|
|
735
|
-
if (m.views)
|
|
759
|
+
if (m.batch) encoding24.preencode(state, m.batch)
|
|
760
|
+
if (m.views) encoding25_inline.preencode(state, m.views)
|
|
736
761
|
if (m.value) c.buffer.preencode(state, m.value)
|
|
737
762
|
},
|
|
738
763
|
encode(state, m) {
|
|
@@ -742,25 +767,25 @@ const encoding25 = {
|
|
|
742
767
|
}
|
|
743
768
|
|
|
744
769
|
c.uint.encode(state, m.timestamp)
|
|
745
|
-
|
|
770
|
+
encoding26_1.encode(state, m.links)
|
|
746
771
|
c.uint.encode(state, flags)
|
|
747
772
|
|
|
748
|
-
if (m.batch)
|
|
749
|
-
if (m.views)
|
|
773
|
+
if (m.batch) encoding24.encode(state, m.batch)
|
|
774
|
+
if (m.views) encoding25_inline.encode(state, m.views)
|
|
750
775
|
if (m.value) c.buffer.encode(state, m.value)
|
|
751
776
|
},
|
|
752
777
|
decode(state) {
|
|
753
778
|
const v = c.uint.decode(state)
|
|
754
779
|
const r0 = c.uint.decode(state)
|
|
755
|
-
const r1 =
|
|
780
|
+
const r1 = encoding26_1.decode(state)
|
|
756
781
|
const flags = c.uint.decode(state)
|
|
757
782
|
|
|
758
783
|
return {
|
|
759
784
|
version: v,
|
|
760
785
|
timestamp: r0,
|
|
761
786
|
links: r1,
|
|
762
|
-
batch: (flags & 1) !== 0 ?
|
|
763
|
-
views: (flags & 2) !== 0 ?
|
|
787
|
+
batch: (flags & 1) !== 0 ? encoding24.decode(state) : null,
|
|
788
|
+
views: (flags & 2) !== 0 ? encoding25_inline.decode(state, flags >>> 2) : null,
|
|
764
789
|
optimistic: (flags & 8) !== 0,
|
|
765
790
|
value: (flags & 16) !== 0 ? c.buffer.decode(state) : null
|
|
766
791
|
}
|
|
@@ -768,7 +793,7 @@ const encoding25 = {
|
|
|
768
793
|
}
|
|
769
794
|
|
|
770
795
|
// @autobee/oplog
|
|
771
|
-
const
|
|
796
|
+
const encoding27 = {
|
|
772
797
|
preencode(state, m) {
|
|
773
798
|
c.uint.preencode(state, m.version)
|
|
774
799
|
switch (m.version) {
|
|
@@ -782,7 +807,7 @@ const encoding26 = {
|
|
|
782
807
|
encoding14.preencode(state, m)
|
|
783
808
|
break
|
|
784
809
|
case 3:
|
|
785
|
-
|
|
810
|
+
encoding26.preencode(state, m)
|
|
786
811
|
break
|
|
787
812
|
default:
|
|
788
813
|
throw new Error('Unsupported version')
|
|
@@ -801,7 +826,7 @@ const encoding26 = {
|
|
|
801
826
|
encoding14.encode(state, m)
|
|
802
827
|
break
|
|
803
828
|
case 3:
|
|
804
|
-
|
|
829
|
+
encoding26.encode(state, m)
|
|
805
830
|
break
|
|
806
831
|
default:
|
|
807
832
|
throw new Error('Unsupported version')
|
|
@@ -825,7 +850,7 @@ const encoding26 = {
|
|
|
825
850
|
return decoded
|
|
826
851
|
}
|
|
827
852
|
case 3: {
|
|
828
|
-
const decoded =
|
|
853
|
+
const decoded = encoding26.decode(state)
|
|
829
854
|
return decoded
|
|
830
855
|
}
|
|
831
856
|
default:
|
|
@@ -835,7 +860,7 @@ const encoding26 = {
|
|
|
835
860
|
}
|
|
836
861
|
|
|
837
862
|
// @autobee/manifest-data
|
|
838
|
-
const
|
|
863
|
+
const encoding28 = {
|
|
839
864
|
preencode(state, m) {
|
|
840
865
|
c.uint.preencode(state, m.version)
|
|
841
866
|
state.end++ // max flag is 2 so always one byte
|
|
@@ -869,7 +894,7 @@ const encoding18_3 = c.array(encoding22)
|
|
|
869
894
|
// @autobee/system-info-v3.indexers, deferred due to recusive use
|
|
870
895
|
const encoding18_4 = encoding18_3
|
|
871
896
|
// @autobee/oplog-message-v3.links, deferred due to recusive use
|
|
872
|
-
const
|
|
897
|
+
const encoding26_1 = encoding18_3
|
|
873
898
|
|
|
874
899
|
function setVersion(v) {
|
|
875
900
|
version = v
|
|
@@ -940,16 +965,18 @@ function getEncoding(name) {
|
|
|
940
965
|
return encoding21
|
|
941
966
|
case '@autobee/link':
|
|
942
967
|
return encoding22
|
|
943
|
-
case '@autobee/batch':
|
|
968
|
+
case '@autobee/external-batch':
|
|
944
969
|
return encoding23
|
|
945
|
-
case '@autobee/
|
|
970
|
+
case '@autobee/batch':
|
|
946
971
|
return encoding24
|
|
947
|
-
case '@autobee/
|
|
972
|
+
case '@autobee/views':
|
|
948
973
|
return encoding25
|
|
949
|
-
case '@autobee/oplog':
|
|
974
|
+
case '@autobee/oplog-message-v3':
|
|
950
975
|
return encoding26
|
|
951
|
-
case '@autobee/
|
|
976
|
+
case '@autobee/oplog':
|
|
952
977
|
return encoding27
|
|
978
|
+
case '@autobee/manifest-data':
|
|
979
|
+
return encoding28
|
|
953
980
|
default:
|
|
954
981
|
throw new Error('Encoder not found ' + name)
|
|
955
982
|
}
|
|
@@ -526,6 +526,32 @@
|
|
|
526
526
|
}
|
|
527
527
|
]
|
|
528
528
|
},
|
|
529
|
+
{
|
|
530
|
+
"name": "external-batch",
|
|
531
|
+
"namespace": "autobee",
|
|
532
|
+
"compact": true,
|
|
533
|
+
"flagsPosition": -1,
|
|
534
|
+
"fields": [
|
|
535
|
+
{
|
|
536
|
+
"name": "key",
|
|
537
|
+
"required": true,
|
|
538
|
+
"type": "fixed32",
|
|
539
|
+
"version": 1
|
|
540
|
+
},
|
|
541
|
+
{
|
|
542
|
+
"name": "start",
|
|
543
|
+
"required": true,
|
|
544
|
+
"type": "uint",
|
|
545
|
+
"version": 1
|
|
546
|
+
},
|
|
547
|
+
{
|
|
548
|
+
"name": "length",
|
|
549
|
+
"required": true,
|
|
550
|
+
"type": "uint",
|
|
551
|
+
"version": 1
|
|
552
|
+
}
|
|
553
|
+
]
|
|
554
|
+
},
|
|
529
555
|
{
|
|
530
556
|
"name": "batch",
|
|
531
557
|
"namespace": "autobee",
|
|
@@ -553,21 +579,21 @@
|
|
|
553
579
|
"flagsPosition": 2,
|
|
554
580
|
"fields": [
|
|
555
581
|
{
|
|
556
|
-
"name": "
|
|
582
|
+
"name": "flushes",
|
|
557
583
|
"required": true,
|
|
558
|
-
"type": "
|
|
584
|
+
"type": "uint",
|
|
559
585
|
"version": 1
|
|
560
586
|
},
|
|
561
587
|
{
|
|
562
|
-
"name": "
|
|
588
|
+
"name": "system",
|
|
563
589
|
"required": true,
|
|
564
|
-
"type": "
|
|
590
|
+
"type": "@autobee/external-batch",
|
|
565
591
|
"version": 1
|
|
566
592
|
},
|
|
567
593
|
{
|
|
568
594
|
"name": "view",
|
|
569
595
|
"required": false,
|
|
570
|
-
"type": "@autobee/
|
|
596
|
+
"type": "@autobee/external-batch",
|
|
571
597
|
"version": 1
|
|
572
598
|
}
|
|
573
599
|
]
|
package/index.js
CHANGED
|
@@ -79,6 +79,11 @@ module.exports = class Autobee extends ReadyResource {
|
|
|
79
79
|
this._workingBee = bee
|
|
80
80
|
this._workingView = handlers.open ? handlers.open(this._workingBee, this) : this._workingBee
|
|
81
81
|
|
|
82
|
+
this._localSystemStart = 0
|
|
83
|
+
this._localSystemLength = 0
|
|
84
|
+
this._localViewStart = 0
|
|
85
|
+
this._localViewLength = 0
|
|
86
|
+
|
|
82
87
|
this._appending = []
|
|
83
88
|
this._draining = null
|
|
84
89
|
|
|
@@ -98,6 +103,7 @@ module.exports = class Autobee extends ReadyResource {
|
|
|
98
103
|
this._interrupting = false
|
|
99
104
|
this._onErrorBound = this._onError.bind(this)
|
|
100
105
|
this._bumpSoonBound = this.bumpSoon.bind(this)
|
|
106
|
+
this._onGroupUpdateBound = this._onGroupUpdate.bind(this)
|
|
101
107
|
|
|
102
108
|
this.wakeupCapability = null
|
|
103
109
|
this._wakeup = new AutobeeWakeup(this, handlers)
|
|
@@ -137,6 +143,9 @@ module.exports = class Autobee extends ReadyResource {
|
|
|
137
143
|
await this.bee.ready()
|
|
138
144
|
await this._bootingState
|
|
139
145
|
|
|
146
|
+
this._localSystemStart = this.system.bee.context.local.length
|
|
147
|
+
this._localViewStart = this._workingBee.context.local.length
|
|
148
|
+
|
|
140
149
|
this.bumpSoon()
|
|
141
150
|
}
|
|
142
151
|
|
|
@@ -269,7 +278,8 @@ module.exports = class Autobee extends ReadyResource {
|
|
|
269
278
|
}
|
|
270
279
|
|
|
271
280
|
this._notifyHandler = this.store.notifyGroup(this.wakeupCapability.discoveryKey)
|
|
272
|
-
this._notifyHandler.on('update', this.
|
|
281
|
+
this._notifyHandler.on('update', this._onGroupUpdateBound)
|
|
282
|
+
await this._drainBootHints()
|
|
273
283
|
}
|
|
274
284
|
|
|
275
285
|
const system = result.system || EMPTY_HEAD
|
|
@@ -405,15 +415,37 @@ module.exports = class Autobee extends ReadyResource {
|
|
|
405
415
|
}
|
|
406
416
|
}
|
|
407
417
|
|
|
408
|
-
|
|
409
|
-
|
|
418
|
+
_onGroupUpdate({ key, length }) {
|
|
419
|
+
this._wakeup.hint({ key, length })
|
|
420
|
+
this.bumpSoon()
|
|
421
|
+
}
|
|
410
422
|
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
423
|
+
async _drainBootHints() {
|
|
424
|
+
if (!this._notifyHandler) return
|
|
425
|
+
|
|
426
|
+
const keys = []
|
|
427
|
+
for await (const key of this._notifyHandler.updates({ since: this.previousDrain })) {
|
|
428
|
+
keys.push(key)
|
|
416
429
|
}
|
|
430
|
+
if (!keys.length) return
|
|
431
|
+
|
|
432
|
+
// read the lengths straight from storage in one batch instead of opening cores
|
|
433
|
+
const discoveryKeys = keys.map((key) => crypto.discoveryKey(key))
|
|
434
|
+
const infos = await this.store.storage.getInfos(discoveryKeys, {
|
|
435
|
+
auth: false,
|
|
436
|
+
head: true,
|
|
437
|
+
hints: false
|
|
438
|
+
})
|
|
439
|
+
|
|
440
|
+
for (let i = 0; i < keys.length; i++) {
|
|
441
|
+
const info = infos[i]
|
|
442
|
+
const length = info && info.head ? info.head.length : 0
|
|
443
|
+
this._wakeup.hint({ key: keys[i], length })
|
|
444
|
+
}
|
|
445
|
+
}
|
|
446
|
+
|
|
447
|
+
async _flushWakeup() {
|
|
448
|
+
const hints = this._wakeup.flush()
|
|
417
449
|
|
|
418
450
|
this.previousDrain = Date.now()
|
|
419
451
|
this.queueWakeupFastForward(hints).catch(noop)
|
|
@@ -421,11 +453,7 @@ module.exports = class Autobee extends ReadyResource {
|
|
|
421
453
|
for (const [hex, length] of hints) {
|
|
422
454
|
const key = b4a.from(hex, 'hex')
|
|
423
455
|
if (this.writers.has(hex)) continue
|
|
424
|
-
|
|
425
|
-
const info = await this.system.get(key)
|
|
426
|
-
if (info && length <= info.length) continue // stale hint
|
|
427
|
-
}
|
|
428
|
-
await this.writers.wakeup(key, length === -1 ? 0 : length)
|
|
456
|
+
await this.writers.wakeup(key, length)
|
|
429
457
|
}
|
|
430
458
|
}
|
|
431
459
|
|
|
@@ -445,7 +473,8 @@ module.exports = class Autobee extends ReadyResource {
|
|
|
445
473
|
|
|
446
474
|
if (buf === null) return null
|
|
447
475
|
|
|
448
|
-
|
|
476
|
+
const oplog = encoding.decodeOplog(buf)
|
|
477
|
+
return oplog
|
|
449
478
|
}
|
|
450
479
|
|
|
451
480
|
_update(changes) {
|
|
@@ -492,7 +521,7 @@ module.exports = class Autobee extends ReadyResource {
|
|
|
492
521
|
const oldLocal = this.local
|
|
493
522
|
|
|
494
523
|
this.local = newLocal
|
|
495
|
-
this.writers.rotateLocalWriter(this.local)
|
|
524
|
+
await this.writers.rotateLocalWriter(this.local)
|
|
496
525
|
|
|
497
526
|
this._updateLocalCore = null
|
|
498
527
|
|
|
@@ -664,6 +693,8 @@ module.exports = class Autobee extends ReadyResource {
|
|
|
664
693
|
}
|
|
665
694
|
|
|
666
695
|
async _applyBatch(batch, optimistic) {
|
|
696
|
+
const local = batch[0].core === this.local
|
|
697
|
+
|
|
667
698
|
const userBatch = []
|
|
668
699
|
for (const node of batch) {
|
|
669
700
|
this.system.addNode(node)
|
|
@@ -680,6 +711,11 @@ module.exports = class Autobee extends ReadyResource {
|
|
|
680
711
|
|
|
681
712
|
const changed = await this.system.flush(batch, this._workingBee)
|
|
682
713
|
|
|
714
|
+
if (local) {
|
|
715
|
+
this._localSystemLength = this.system.bee.context.local.length - this._localSystemStart
|
|
716
|
+
this._localViewLength = this._workingBee.context.local.length - this._localViewStart
|
|
717
|
+
}
|
|
718
|
+
|
|
683
719
|
await this._storeBoot()
|
|
684
720
|
|
|
685
721
|
for (const { key, added } of changed) {
|
|
@@ -742,8 +778,24 @@ module.exports = class Autobee extends ReadyResource {
|
|
|
742
778
|
}
|
|
743
779
|
|
|
744
780
|
async _flushLocal() {
|
|
745
|
-
|
|
746
|
-
|
|
781
|
+
await this.writers.flushLocal({
|
|
782
|
+
flushes: this.system.flushes,
|
|
783
|
+
system: {
|
|
784
|
+
key: this.system.bee.context.local.key,
|
|
785
|
+
start: this._localSystemStart,
|
|
786
|
+
length: this._localSystemLength
|
|
787
|
+
},
|
|
788
|
+
view: {
|
|
789
|
+
key: this._workingBee.context.local.key,
|
|
790
|
+
start: this._localViewStart,
|
|
791
|
+
length: this._localViewLength
|
|
792
|
+
}
|
|
793
|
+
})
|
|
794
|
+
|
|
795
|
+
this._localSystemStart = this.system.bee.context.local.length
|
|
796
|
+
this._localSystemLength = 0
|
|
797
|
+
this._localViewStart = this._workingBee.context.local.length
|
|
798
|
+
this._localViewLength = 0
|
|
747
799
|
}
|
|
748
800
|
|
|
749
801
|
moveTo(head, tip) {
|
|
@@ -758,9 +810,11 @@ module.exports = class Autobee extends ReadyResource {
|
|
|
758
810
|
}
|
|
759
811
|
|
|
760
812
|
const promises = []
|
|
813
|
+
const heads = []
|
|
761
814
|
for (const [hex, length] of hints) {
|
|
762
815
|
if (length === 0) continue
|
|
763
816
|
const key = b4a.from(hex, 'hex')
|
|
817
|
+
heads.push({ key, length })
|
|
764
818
|
promises.push(this._getOplog(key, length))
|
|
765
819
|
}
|
|
766
820
|
|
|
@@ -768,24 +822,30 @@ module.exports = class Autobee extends ReadyResource {
|
|
|
768
822
|
if (this.fastForwarding || this.fastForwardTo) return false
|
|
769
823
|
|
|
770
824
|
let best = null
|
|
825
|
+
let bestHead = null
|
|
771
826
|
let bestFlushes = -1
|
|
772
827
|
|
|
773
|
-
for (
|
|
828
|
+
for (let i = 0; i < ops.length; i++) {
|
|
829
|
+
const msg = ops[i]
|
|
774
830
|
if (msg === null) continue
|
|
775
831
|
|
|
776
832
|
if (msg.views && msg.views.flushes > bestFlushes) {
|
|
777
833
|
bestFlushes = msg.views.flushes
|
|
778
834
|
best = msg.views
|
|
835
|
+
bestHead = heads[i]
|
|
779
836
|
}
|
|
780
837
|
}
|
|
781
838
|
|
|
782
839
|
if (best === null || bestFlushes - this.system.flushes < MIN_FF_GAP) return false
|
|
783
840
|
|
|
784
|
-
const view = this.bee.checkout(
|
|
841
|
+
const view = this.bee.checkout({
|
|
842
|
+
key: best.view.key,
|
|
843
|
+
length: best.view.start + best.view.length
|
|
844
|
+
})
|
|
785
845
|
|
|
786
846
|
let trusted = null
|
|
787
847
|
try {
|
|
788
|
-
trusted = await this._handlers.onwakeup(view, this)
|
|
848
|
+
trusted = await this._handlers.onwakeup(bestHead, view, this)
|
|
789
849
|
if (!trusted || this.fastForwarding || this.fastForwardTo) return false
|
|
790
850
|
} finally {
|
|
791
851
|
view.close()
|
|
@@ -793,13 +853,19 @@ module.exports = class Autobee extends ReadyResource {
|
|
|
793
853
|
|
|
794
854
|
const oplog = await this._getOplog(trusted.key, trusted.length)
|
|
795
855
|
|
|
796
|
-
return this.moveTo(
|
|
797
|
-
|
|
798
|
-
|
|
799
|
-
|
|
800
|
-
|
|
856
|
+
return this.moveTo(
|
|
857
|
+
{
|
|
858
|
+
key: oplog.views.system.key,
|
|
859
|
+
length: oplog.views.system.start + oplog.views.system.length
|
|
860
|
+
},
|
|
861
|
+
{
|
|
862
|
+
system: { key: best.system.key, length: best.system.start + best.system.length },
|
|
863
|
+
verified: {
|
|
864
|
+
node: trusted,
|
|
865
|
+
flushes: oplog.views.flushes
|
|
866
|
+
}
|
|
801
867
|
}
|
|
802
|
-
|
|
868
|
+
)
|
|
803
869
|
}
|
|
804
870
|
|
|
805
871
|
async _runFastForward(ff) {
|
package/lib/writers.js
CHANGED
|
@@ -67,14 +67,16 @@ class ActiveWriters {
|
|
|
67
67
|
this.localWriter = new Writer(this, this.auto.system, true, core, b4a.toString(core.key, 'hex'))
|
|
68
68
|
this.localWriter.addPending()
|
|
69
69
|
this.auto.emit('writer', this.localWriter)
|
|
70
|
+
|
|
71
|
+
await this.updateLocalState()
|
|
70
72
|
}
|
|
71
73
|
|
|
72
74
|
clearLocal() {
|
|
73
75
|
return this.localWriter.clear()
|
|
74
76
|
}
|
|
75
77
|
|
|
76
|
-
flushLocal(
|
|
77
|
-
return this.localWriter.flush(
|
|
78
|
+
flushLocal(views) {
|
|
79
|
+
return this.localWriter.flush(views)
|
|
78
80
|
}
|
|
79
81
|
|
|
80
82
|
async refresh() {
|
|
@@ -88,16 +90,16 @@ class ActiveWriters {
|
|
|
88
90
|
}
|
|
89
91
|
|
|
90
92
|
async updateLocalState() {
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
const info = await this.auto.system.get(this.auto.local.key)
|
|
94
|
-
const writable = this.writable
|
|
93
|
+
await this.localWriter.update()
|
|
94
|
+
}
|
|
95
95
|
|
|
96
|
-
|
|
97
|
-
|
|
96
|
+
_updateLocalState() {
|
|
97
|
+
const w = this.localWriter
|
|
98
98
|
|
|
99
|
+
const writable = w.isAdded && !w.isRemoved
|
|
99
100
|
if (writable === this.writable) return
|
|
100
101
|
|
|
102
|
+
this.writable = writable
|
|
101
103
|
this.auto.emit(this.writable ? 'writable' : 'unwritable')
|
|
102
104
|
this.auto.emit('update')
|
|
103
105
|
}
|
|
@@ -176,6 +178,8 @@ class Writer {
|
|
|
176
178
|
this.index = 0
|
|
177
179
|
this.weight = 0
|
|
178
180
|
this.pending = null
|
|
181
|
+
this.processed = 0
|
|
182
|
+
this.appendLength = this.core.length + 1
|
|
179
183
|
this.waiting = null
|
|
180
184
|
this.download = null
|
|
181
185
|
|
|
@@ -305,9 +309,12 @@ class Writer {
|
|
|
305
309
|
if (!latest || !latest.views) return []
|
|
306
310
|
|
|
307
311
|
// signedLength for autobase compat
|
|
312
|
+
const system = latest.views.system.start + latest.views.system.length
|
|
313
|
+
const view = latest.views.view.start + latest.views.view.length
|
|
314
|
+
|
|
308
315
|
return [
|
|
309
|
-
{
|
|
310
|
-
{
|
|
316
|
+
{ key: latest.views.system.key, length: system, signedLength: system },
|
|
317
|
+
{ key: latest.views.view.key, length: view, signedLength: view }
|
|
311
318
|
]
|
|
312
319
|
}
|
|
313
320
|
|
|
@@ -322,13 +329,17 @@ class Writer {
|
|
|
322
329
|
const info = await this.system.get(this.core.key)
|
|
323
330
|
|
|
324
331
|
if (!info) {
|
|
325
|
-
this.isAdded = this.system.isGenesis()
|
|
332
|
+
this.isAdded = this.system.isGenesis() && b4a.equals(this.core.key, this.writers.auto.key)
|
|
326
333
|
} else {
|
|
327
334
|
this.isAdded = true
|
|
328
335
|
this.isRemoved = info.isRemoved
|
|
329
336
|
this.weight = info.weight
|
|
330
337
|
}
|
|
331
338
|
|
|
339
|
+
if (this === this.writers.localWriter) {
|
|
340
|
+
this.writers._updateLocalState()
|
|
341
|
+
}
|
|
342
|
+
|
|
332
343
|
return info ? info.length : 0
|
|
333
344
|
}
|
|
334
345
|
|
|
@@ -357,6 +368,9 @@ class Writer {
|
|
|
357
368
|
const block = await this.core.get(length++)
|
|
358
369
|
const oplog = encoding.decodeOplog(block)
|
|
359
370
|
const node = createNode(this.core, length, this.weight, oplog)
|
|
371
|
+
|
|
372
|
+
if (this.writable) node.optimistic = false
|
|
373
|
+
|
|
360
374
|
const b = oplog.batch
|
|
361
375
|
|
|
362
376
|
// auto correct some batch invariants
|
|
@@ -398,12 +412,18 @@ class Writer {
|
|
|
398
412
|
|
|
399
413
|
// handle local writer
|
|
400
414
|
if (this.core.writable && this.pending !== null) {
|
|
401
|
-
|
|
415
|
+
let start = this.processed
|
|
416
|
+
this.processed = this.pending.length
|
|
417
|
+
|
|
418
|
+
for (let i = start; i < this.processed; i++) {
|
|
402
419
|
const node = this.pending[i]
|
|
403
420
|
|
|
404
|
-
node.
|
|
421
|
+
if (node.length <= length) {
|
|
422
|
+
start++
|
|
423
|
+
continue
|
|
424
|
+
}
|
|
405
425
|
|
|
406
|
-
|
|
426
|
+
node.batch = { start: i, end: this.pending.length - 1 - i }
|
|
407
427
|
|
|
408
428
|
if (!this.writers.writable && !node.optimistic) {
|
|
409
429
|
this.writers.clearLocal()
|
|
@@ -424,11 +444,14 @@ class Writer {
|
|
|
424
444
|
}
|
|
425
445
|
|
|
426
446
|
if (!(await this._isLinked(node))) return null
|
|
447
|
+
}
|
|
427
448
|
|
|
449
|
+
if (this.processed === this.pending.length) {
|
|
428
450
|
this.removePending()
|
|
429
|
-
|
|
430
|
-
return this.pending.slice(i)
|
|
431
451
|
}
|
|
452
|
+
|
|
453
|
+
if (start === this.processed) return null
|
|
454
|
+
return this.pending.slice(start, this.processed)
|
|
432
455
|
}
|
|
433
456
|
|
|
434
457
|
return null
|
|
@@ -472,16 +495,11 @@ class Writer {
|
|
|
472
495
|
links,
|
|
473
496
|
batch,
|
|
474
497
|
views: null,
|
|
475
|
-
optimistic,
|
|
498
|
+
optimistic: optimistic && !this.writable,
|
|
476
499
|
value
|
|
477
500
|
}
|
|
478
501
|
|
|
479
|
-
const node = createNode(
|
|
480
|
-
this.core,
|
|
481
|
-
this.core.length + this.pending.length + 1,
|
|
482
|
-
this.weight,
|
|
483
|
-
oplog
|
|
484
|
-
)
|
|
502
|
+
const node = createNode(this.core, this.appendLength++, this.weight, oplog)
|
|
485
503
|
|
|
486
504
|
this.pending.push(node)
|
|
487
505
|
this.addPending()
|
|
@@ -490,21 +508,27 @@ class Writer {
|
|
|
490
508
|
}
|
|
491
509
|
|
|
492
510
|
clear() {
|
|
493
|
-
this.pending
|
|
511
|
+
if (!this.pending) return
|
|
512
|
+
|
|
513
|
+
if (this.processed === this.pending.length) {
|
|
514
|
+
this.pending = null
|
|
515
|
+
} else {
|
|
516
|
+
this.pending = this.pending.slice(this.processed)
|
|
517
|
+
}
|
|
518
|
+
|
|
519
|
+
this.processed = 0
|
|
494
520
|
}
|
|
495
521
|
|
|
496
|
-
flush(
|
|
522
|
+
flush(views) {
|
|
497
523
|
if (this.pending === null) return Promise.resolve()
|
|
498
524
|
const buffers = []
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
this.pending[this.pending.length - 1].views = { system: s, flushes, view }
|
|
502
|
-
for (let i = 0; i < this.pending.length; i++) {
|
|
525
|
+
this.pending[this.pending.length - 1].views = views
|
|
526
|
+
for (let i = 0; i < this.processed; i++) {
|
|
503
527
|
const node = this.pending[i]
|
|
504
528
|
node.batch = { start: i, end: this.pending.length - 1 - i }
|
|
505
529
|
buffers.push(encoding.encodeOplog(node))
|
|
506
530
|
}
|
|
507
|
-
this.
|
|
531
|
+
this.clear()
|
|
508
532
|
return this.core.append(buffers)
|
|
509
533
|
}
|
|
510
534
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "autobee",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.10",
|
|
4
4
|
"description": "Bee based autobase",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"author": "Holepunch Inc.",
|
|
@@ -24,11 +24,11 @@
|
|
|
24
24
|
},
|
|
25
25
|
"dependencies": {
|
|
26
26
|
"autobee-encryption": "^0.1.2",
|
|
27
|
-
"autobee-wakeup": "^1.
|
|
27
|
+
"autobee-wakeup": "^1.1.3",
|
|
28
28
|
"b4a": "^1.8.0",
|
|
29
29
|
"compact-encoding": "^2.18.0",
|
|
30
|
-
"hyperbee2": "^2.
|
|
31
|
-
"hypercore": "^11.33.
|
|
30
|
+
"hyperbee2": "^2.10.3",
|
|
31
|
+
"hypercore": "^11.33.2",
|
|
32
32
|
"hypercore-id-encoding": "^1.3.0",
|
|
33
33
|
"hyperschema": "^1.20.1",
|
|
34
34
|
"ready-guard": "^1.0.0",
|
|
@@ -38,7 +38,7 @@
|
|
|
38
38
|
},
|
|
39
39
|
"devDependencies": {
|
|
40
40
|
"brittle": "^3.19.1",
|
|
41
|
-
"corestore": "^7.
|
|
41
|
+
"corestore": "^7.11.0",
|
|
42
42
|
"hypercore-crypto": "^3.6.1",
|
|
43
43
|
"lunte": "^1.6.0",
|
|
44
44
|
"prettier": "^3.8.1",
|