@fireproof/core 0.19.9-dev-frag → 0.19.11-dev-dryrun
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/README.md +27 -0
- package/{chunk-YS4GL6OK.js → chunk-MAK4D54P.js} +20 -6
- package/chunk-MAK4D54P.js.map +1 -0
- package/{chunk-JO5AVWG7.js → chunk-XINRLWR3.js} +14 -6
- package/chunk-XINRLWR3.js.map +1 -0
- package/deno.json +20 -0
- package/{gateway-IZRHJWPE.js → gateway-7OM6OSYK.js} +3 -4
- package/gateway-7OM6OSYK.js.map +1 -0
- package/{gateway-YSNUK2L3.js → gateway-VWWKLHUI.js} +4 -5
- package/{gateway-YSNUK2L3.js.map → gateway-VWWKLHUI.js.map} +1 -1
- package/index.cjs +549 -372
- package/index.cjs.map +1 -1
- package/index.d.cts +75 -51
- package/index.d.ts +75 -51
- package/index.global.js +21461 -15114
- package/index.global.js.map +1 -1
- package/index.js +465 -313
- package/index.js.map +1 -1
- package/{key-bag-file-NMEBFSPM.js → key-bag-file-DFMW6ZM6.js} +3 -3
- package/{key-bag-indexdb-X5V6GNBZ.js → key-bag-indexdb-R2RWGSQ4.js} +3 -3
- package/key-bag-indexdb-R2RWGSQ4.js.map +1 -0
- package/{mem-filesystem-B6C6QOIP.js → mem-filesystem-BZQZLUR6.js} +3 -3
- package/metafile-cjs.json +1 -1
- package/metafile-esm.json +1 -1
- package/metafile-iife.json +1 -1
- package/{node-filesystem-5JLBSHKQ.js → node-filesystem-7YZR3POJ.js} +8 -4
- package/node-filesystem-7YZR3POJ.js.map +1 -0
- package/package.json +8 -5
- package/tests/blockstore/keyed-crypto.test.ts +34 -4
- package/tests/blockstore/store.test.ts +18 -13
- package/tests/fireproof/all-gateway.test.ts +395 -0
- package/tests/fireproof/cars/bafkreidxwt2nhvbl4fnqfw3ctlt6zbrir4kqwmjo5im6rf4q5si27kgo2i.car +0 -0
- package/tests/fireproof/cars/bafkreidxwt2nhvbl4fnqfw3ctlt6zbrir4kqwmjo5im6rf4q5si27kgo2i.js +316 -0
- package/tests/fireproof/convert_uint8.py +27 -0
- package/tests/fireproof/fireproof.test.ts +18 -18
- package/tests/fireproof/hello.test.ts +33 -19
- package/tests/helpers.ts +7 -4
- package/{utils-IZPK4QS7.js → utils-AISQB3PB.js} +3 -3
- package/chunk-JO5AVWG7.js.map +0 -1
- package/chunk-YS4GL6OK.js.map +0 -1
- package/gateway-IZRHJWPE.js.map +0 -1
- package/key-bag-indexdb-X5V6GNBZ.js.map +0 -1
- package/node-filesystem-5JLBSHKQ.js.map +0 -1
- /package/{key-bag-file-NMEBFSPM.js.map → key-bag-file-DFMW6ZM6.js.map} +0 -0
- /package/{mem-filesystem-B6C6QOIP.js.map → mem-filesystem-BZQZLUR6.js.map} +0 -0
- /package/{utils-IZPK4QS7.js.map → utils-AISQB3PB.js.map} +0 -0
package/index.cjs
CHANGED
@@ -117,6 +117,21 @@ function ensureLogger(sthis, componentName, ctx) {
|
|
117
117
|
sthis.env.onSet(
|
118
118
|
(key, value) => {
|
119
119
|
switch (key) {
|
120
|
+
case "FP_FORMAT": {
|
121
|
+
switch (value) {
|
122
|
+
case "jsonice":
|
123
|
+
logger.SetFormatter(new import_cement.JSONFormatter(logger.TxtEnDe(), 2));
|
124
|
+
break;
|
125
|
+
case "yaml":
|
126
|
+
logger.SetFormatter(new import_cement.YAMLFormatter(logger.TxtEnDe(), 2));
|
127
|
+
break;
|
128
|
+
case "json":
|
129
|
+
default:
|
130
|
+
logger.SetFormatter(new import_cement.JSONFormatter(logger.TxtEnDe()));
|
131
|
+
break;
|
132
|
+
}
|
133
|
+
break;
|
134
|
+
}
|
120
135
|
case "FP_DEBUG":
|
121
136
|
logger.SetDebug(value || []);
|
122
137
|
break;
|
@@ -125,6 +140,7 @@ function ensureLogger(sthis, componentName, ctx) {
|
|
125
140
|
break;
|
126
141
|
}
|
127
142
|
},
|
143
|
+
"FP_FORMAT",
|
128
144
|
"FP_DEBUG",
|
129
145
|
"FP_STACK"
|
130
146
|
);
|
@@ -170,9 +186,6 @@ function getName(sthis, url) {
|
|
170
186
|
}
|
171
187
|
return result;
|
172
188
|
}
|
173
|
-
function exception2Result(fn) {
|
174
|
-
return fn().then((value) => import_cement.Result.Ok(value)).catch((e) => import_cement.Result.Err(e));
|
175
|
-
}
|
176
189
|
async function exceptionWrapper(fn) {
|
177
190
|
return fn().catch((e) => import_cement.Result.Err(e));
|
178
191
|
}
|
@@ -318,11 +331,12 @@ var node_filesystem_exports = {};
|
|
318
331
|
__export(node_filesystem_exports, {
|
319
332
|
NodeFileSystem: () => NodeFileSystem
|
320
333
|
});
|
321
|
-
var NodeFileSystem;
|
334
|
+
var import_cement4, NodeFileSystem;
|
322
335
|
var init_node_filesystem = __esm({
|
323
336
|
"src/runtime/gateways/file/node-filesystem.ts"() {
|
324
337
|
"use strict";
|
325
338
|
init_utils2();
|
339
|
+
import_cement4 = require("@adviser/cement");
|
326
340
|
NodeFileSystem = class {
|
327
341
|
async start() {
|
328
342
|
this.fs = await import("fs/promises");
|
@@ -351,6 +365,9 @@ var init_node_filesystem = __esm({
|
|
351
365
|
return this.fs?.unlink(path);
|
352
366
|
}
|
353
367
|
async writefile(path, data) {
|
368
|
+
if ((0, import_cement4.runtimeFn)().isDeno) {
|
369
|
+
return this.fs?.writeFile(path, data);
|
370
|
+
}
|
354
371
|
return this.fs?.writeFile(path, Buffer.from(data));
|
355
372
|
}
|
356
373
|
};
|
@@ -375,11 +392,19 @@ async function getFileSystem(url) {
|
|
375
392
|
fs2 = new MemFileSystem2();
|
376
393
|
}
|
377
394
|
break;
|
378
|
-
case
|
379
|
-
|
380
|
-
|
395
|
+
// case 'deno': {
|
396
|
+
// const { DenoFileSystem } = await import("./deno-filesystem.js");
|
397
|
+
// fs = new DenoFileSystem();
|
398
|
+
// break;
|
399
|
+
// }
|
400
|
+
case "node": {
|
381
401
|
const { NodeFileSystem: NodeFileSystem2 } = await Promise.resolve().then(() => (init_node_filesystem(), node_filesystem_exports));
|
382
402
|
fs2 = new NodeFileSystem2();
|
403
|
+
break;
|
404
|
+
}
|
405
|
+
case "sys":
|
406
|
+
default: {
|
407
|
+
return getFileSystem(url.build().setParam("fs", "node").URI());
|
383
408
|
}
|
384
409
|
}
|
385
410
|
return fs2.start();
|
@@ -489,16 +514,16 @@ var key_bag_indexdb_exports = {};
|
|
489
514
|
__export(key_bag_indexdb_exports, {
|
490
515
|
KeyBagProviderIndexDB: () => KeyBagProviderIndexDB
|
491
516
|
});
|
492
|
-
var import_idb,
|
517
|
+
var import_idb, import_cement5, KeyBagProviderIndexDB;
|
493
518
|
var init_key_bag_indexdb = __esm({
|
494
519
|
"src/runtime/key-bag-indexdb.ts"() {
|
495
520
|
"use strict";
|
496
521
|
import_idb = require("idb");
|
497
522
|
init_utils2();
|
498
|
-
|
523
|
+
import_cement5 = require("@adviser/cement");
|
499
524
|
KeyBagProviderIndexDB = class {
|
500
525
|
constructor(url, sthis) {
|
501
|
-
this._db = new
|
526
|
+
this._db = new import_cement5.ResolveOnce();
|
502
527
|
this.sthis = sthis;
|
503
528
|
this.logger = sthis.logger;
|
504
529
|
this.url = url;
|
@@ -546,21 +571,30 @@ var init_version = __esm({
|
|
546
571
|
}
|
547
572
|
});
|
548
573
|
|
574
|
+
// src/runtime/gateways/indexdb/version.ts
|
575
|
+
var INDEXDB_VERSION;
|
576
|
+
var init_version2 = __esm({
|
577
|
+
"src/runtime/gateways/indexdb/version.ts"() {
|
578
|
+
"use strict";
|
579
|
+
INDEXDB_VERSION = "v0.19-indexdb";
|
580
|
+
}
|
581
|
+
});
|
582
|
+
|
549
583
|
// src/runtime/gateways/file/gateway.ts
|
550
584
|
var gateway_exports = {};
|
551
585
|
__export(gateway_exports, {
|
552
586
|
FileGateway: () => FileGateway,
|
553
587
|
FileTestStore: () => FileTestStore
|
554
588
|
});
|
555
|
-
var
|
589
|
+
var import_cement12, versionFiles, FileGateway, FileTestStore;
|
556
590
|
var init_gateway = __esm({
|
557
591
|
"src/runtime/gateways/file/gateway.ts"() {
|
558
592
|
"use strict";
|
559
593
|
init_version();
|
560
|
-
|
594
|
+
import_cement12 = require("@adviser/cement");
|
561
595
|
init_utils();
|
562
596
|
init_utils2();
|
563
|
-
versionFiles = new
|
597
|
+
versionFiles = new import_cement12.KeyedResolvOnce();
|
564
598
|
FileGateway = class {
|
565
599
|
get fs() {
|
566
600
|
if (!this._fs) throw this.logger.Error().Msg("fs not initialized").AsError();
|
@@ -590,7 +624,7 @@ var init_gateway = __esm({
|
|
590
624
|
});
|
591
625
|
}
|
592
626
|
start(baseURL) {
|
593
|
-
return exception2Result(async () => {
|
627
|
+
return (0, import_cement12.exception2Result)(async () => {
|
594
628
|
this._fs = await getFileSystem(baseURL);
|
595
629
|
await this.fs.start();
|
596
630
|
const url = baseURL.build();
|
@@ -605,10 +639,10 @@ var init_gateway = __esm({
|
|
605
639
|
});
|
606
640
|
}
|
607
641
|
async buildUrl(baseUrl, key) {
|
608
|
-
return
|
642
|
+
return import_cement12.Result.Ok(baseUrl.build().setParam("key", key).URI());
|
609
643
|
}
|
610
644
|
async close() {
|
611
|
-
return
|
645
|
+
return import_cement12.Result.Ok(void 0);
|
612
646
|
}
|
613
647
|
// abstract buildUrl(baseUrl: URL, key: string): Promise<Result<URL>>;
|
614
648
|
getFilePath(url) {
|
@@ -617,7 +651,7 @@ var init_gateway = __esm({
|
|
617
651
|
return this.sthis.pathOps.join(getPath(url, this.sthis), getFileName(url, this.sthis));
|
618
652
|
}
|
619
653
|
async put(url, body) {
|
620
|
-
return exception2Result(async () => {
|
654
|
+
return (0, import_cement12.exception2Result)(async () => {
|
621
655
|
const file = await this.getFilePath(url);
|
622
656
|
this.logger.Debug().Str("url", url.toString()).Str("file", file).Msg("put");
|
623
657
|
await this.fs.writefile(file, body);
|
@@ -629,17 +663,17 @@ var init_gateway = __esm({
|
|
629
663
|
try {
|
630
664
|
const res = await this.fs.readfile(file);
|
631
665
|
this.logger.Debug().Url(url.asURL()).Str("file", file).Msg("get");
|
632
|
-
return
|
666
|
+
return import_cement12.Result.Ok(new Uint8Array(res));
|
633
667
|
} catch (e) {
|
634
668
|
if (isNotFoundError(e)) {
|
635
|
-
return
|
669
|
+
return import_cement12.Result.Err(new NotFoundError(`file not found: ${file}`));
|
636
670
|
}
|
637
|
-
return
|
671
|
+
return import_cement12.Result.Err(e);
|
638
672
|
}
|
639
673
|
});
|
640
674
|
}
|
641
675
|
async delete(url) {
|
642
|
-
return exception2Result(async () => {
|
676
|
+
return (0, import_cement12.exception2Result)(async () => {
|
643
677
|
await this.fs.unlink(this.getFilePath(url));
|
644
678
|
});
|
645
679
|
}
|
@@ -665,7 +699,7 @@ var init_gateway = __esm({
|
|
665
699
|
}
|
666
700
|
}
|
667
701
|
}
|
668
|
-
return
|
702
|
+
return import_cement12.Result.Ok(void 0);
|
669
703
|
}
|
670
704
|
};
|
671
705
|
FileTestStore = class {
|
@@ -685,15 +719,6 @@ var init_gateway = __esm({
|
|
685
719
|
}
|
686
720
|
});
|
687
721
|
|
688
|
-
// src/runtime/gateways/indexdb/version.ts
|
689
|
-
var INDEXDB_VERSION;
|
690
|
-
var init_version2 = __esm({
|
691
|
-
"src/runtime/gateways/indexdb/version.ts"() {
|
692
|
-
"use strict";
|
693
|
-
INDEXDB_VERSION = "v0.19-indexdb";
|
694
|
-
}
|
695
|
-
});
|
696
|
-
|
697
722
|
// src/runtime/gateways/indexdb/gateway.ts
|
698
723
|
var gateway_exports2 = {};
|
699
724
|
__export(gateway_exports2, {
|
@@ -754,15 +779,15 @@ function getIndexDBName(iurl, sthis) {
|
|
754
779
|
dbName
|
755
780
|
};
|
756
781
|
}
|
757
|
-
var import_idb2,
|
782
|
+
var import_idb2, import_cement13, onceIndexDB, IndexDBGateway, IndexDBTestStore;
|
758
783
|
var init_gateway2 = __esm({
|
759
784
|
"src/runtime/gateways/indexdb/gateway.ts"() {
|
760
785
|
"use strict";
|
761
786
|
import_idb2 = require("idb");
|
762
|
-
|
787
|
+
import_cement13 = require("@adviser/cement");
|
763
788
|
init_version2();
|
764
789
|
init_utils();
|
765
|
-
onceIndexDB = new
|
790
|
+
onceIndexDB = new import_cement13.KeyedResolvOnce();
|
766
791
|
IndexDBGateway = class {
|
767
792
|
constructor(sthis) {
|
768
793
|
this._db = {};
|
@@ -770,7 +795,7 @@ var init_gateway2 = __esm({
|
|
770
795
|
this.sthis = sthis;
|
771
796
|
}
|
772
797
|
async start(baseURL) {
|
773
|
-
return exception2Result(async () => {
|
798
|
+
return (0, import_cement13.exception2Result)(async () => {
|
774
799
|
this.logger.Debug().Url(baseURL).Msg("starting");
|
775
800
|
await this.sthis.start();
|
776
801
|
const ic = await connectIdb(baseURL, this.sthis);
|
@@ -780,10 +805,10 @@ var init_gateway2 = __esm({
|
|
780
805
|
});
|
781
806
|
}
|
782
807
|
async close() {
|
783
|
-
return
|
808
|
+
return import_cement13.Result.Ok(void 0);
|
784
809
|
}
|
785
810
|
async destroy(baseUrl) {
|
786
|
-
return exception2Result(async () => {
|
811
|
+
return (0, import_cement13.exception2Result)(async () => {
|
787
812
|
const type = getStore(baseUrl, this.sthis, joinDBName).name;
|
788
813
|
const idb = this._db;
|
789
814
|
const trans = idb.transaction(type, "readwrite");
|
@@ -799,7 +824,7 @@ var init_gateway2 = __esm({
|
|
799
824
|
});
|
800
825
|
}
|
801
826
|
buildUrl(baseUrl, key) {
|
802
|
-
return Promise.resolve(
|
827
|
+
return Promise.resolve(import_cement13.Result.Ok(baseUrl.build().setParam("key", key).URI()));
|
803
828
|
}
|
804
829
|
async get(url) {
|
805
830
|
return exceptionWrapper(async () => {
|
@@ -810,13 +835,13 @@ var init_gateway2 = __esm({
|
|
810
835
|
const bytes = await tx.objectStore(store).get(sanitzeKey(key));
|
811
836
|
await tx.done;
|
812
837
|
if (!bytes) {
|
813
|
-
return
|
838
|
+
return import_cement13.Result.Err(new NotFoundError(`missing ${key}`));
|
814
839
|
}
|
815
|
-
return
|
840
|
+
return import_cement13.Result.Ok(bytes);
|
816
841
|
});
|
817
842
|
}
|
818
843
|
async put(url, value) {
|
819
|
-
return exception2Result(async () => {
|
844
|
+
return (0, import_cement13.exception2Result)(async () => {
|
820
845
|
const key = getKey(url, this.logger);
|
821
846
|
const store = getStore(url, this.sthis, joinDBName).name;
|
822
847
|
this.logger.Debug().Url(url).Str("key", key).Str("store", store).Msg("putting");
|
@@ -826,14 +851,14 @@ var init_gateway2 = __esm({
|
|
826
851
|
});
|
827
852
|
}
|
828
853
|
async delete(url) {
|
829
|
-
return exception2Result(async () => {
|
854
|
+
return (0, import_cement13.exception2Result)(async () => {
|
830
855
|
const key = getKey(url, this.logger);
|
831
856
|
const store = getStore(url, this.sthis, joinDBName).name;
|
832
857
|
this.logger.Debug().Url(url).Str("key", key).Str("store", store).Msg("deleting");
|
833
858
|
const tx = this._db.transaction([store], "readwrite");
|
834
859
|
await tx.objectStore(store).delete(sanitzeKey(key));
|
835
860
|
await tx.done;
|
836
|
-
return
|
861
|
+
return import_cement13.Result.Ok(void 0);
|
837
862
|
});
|
838
863
|
}
|
839
864
|
};
|
@@ -873,7 +898,6 @@ __export(src_exports, {
|
|
873
898
|
ensureLogger: () => ensureLogger,
|
874
899
|
ensureSuperLog: () => ensureSuperLog,
|
875
900
|
ensureSuperThis: () => ensureSuperThis,
|
876
|
-
exception2Result: () => exception2Result,
|
877
901
|
exceptionWrapper: () => exceptionWrapper,
|
878
902
|
falsyToUndef: () => falsyToUndef,
|
879
903
|
fireproof: () => fireproof,
|
@@ -890,7 +914,7 @@ __export(src_exports, {
|
|
890
914
|
module.exports = __toCommonJS(src_exports);
|
891
915
|
|
892
916
|
// src/database.ts
|
893
|
-
var
|
917
|
+
var import_cement17 = require("@adviser/cement");
|
894
918
|
|
895
919
|
// src/write-queue.ts
|
896
920
|
function writeQueue(worker, payload = Infinity, unbounded = false) {
|
@@ -933,7 +957,7 @@ function writeQueue(worker, payload = Infinity, unbounded = false) {
|
|
933
957
|
}
|
934
958
|
|
935
959
|
// src/crdt.ts
|
936
|
-
var
|
960
|
+
var import_cement16 = require("@adviser/cement");
|
937
961
|
|
938
962
|
// src/runtime/wait-pr-multiformats/block.ts
|
939
963
|
var block_exports = {};
|
@@ -1024,10 +1048,12 @@ __export(blockstore_exports, {
|
|
1024
1048
|
EncryptedBlockstore: () => EncryptedBlockstore,
|
1025
1049
|
FragmentGateway: () => FragmentGateway,
|
1026
1050
|
Loader: () => Loader,
|
1051
|
+
addCryptoKeyToGatewayMetaPayload: () => addCryptoKeyToGatewayMetaPayload,
|
1027
1052
|
ensureStart: () => ensureStart,
|
1028
1053
|
getGatewayFromURL: () => getGatewayFromURL,
|
1029
1054
|
parseCarFile: () => parseCarFile,
|
1030
1055
|
registerStoreProtocol: () => registerStoreProtocol,
|
1056
|
+
setCryptoKeyFromGatewayMetaPayload: () => setCryptoKeyFromGatewayMetaPayload,
|
1031
1057
|
testStoreFactory: () => testStoreFactory,
|
1032
1058
|
toCIDBlock: () => toCIDBlock,
|
1033
1059
|
toStoreRuntime: () => toStoreRuntime
|
@@ -1039,7 +1065,7 @@ function toCIDBlock(block) {
|
|
1039
1065
|
}
|
1040
1066
|
|
1041
1067
|
// src/blockstore/store-factory.ts
|
1042
|
-
var
|
1068
|
+
var import_cement14 = require("@adviser/cement");
|
1043
1069
|
|
1044
1070
|
// src/runtime/files.ts
|
1045
1071
|
var files_exports = {};
|
@@ -1115,7 +1141,7 @@ var UnixFSFileBuilder = class {
|
|
1115
1141
|
// src/blockstore/store.ts
|
1116
1142
|
var import_p_limit2 = __toESM(require("p-limit"), 1);
|
1117
1143
|
var import_dag_json = require("@ipld/dag-json");
|
1118
|
-
var
|
1144
|
+
var import_cement9 = require("@adviser/cement");
|
1119
1145
|
|
1120
1146
|
// src/types.ts
|
1121
1147
|
function isFalsy(value) {
|
@@ -1140,7 +1166,7 @@ init_utils();
|
|
1140
1166
|
// src/blockstore/loader.ts
|
1141
1167
|
var import_p_limit = __toESM(require("p-limit"), 1);
|
1142
1168
|
var import_car = require("@ipld/car");
|
1143
|
-
var
|
1169
|
+
var import_cement7 = require("@adviser/cement");
|
1144
1170
|
|
1145
1171
|
// src/blockstore/loader-helpers.ts
|
1146
1172
|
var import_sha2 = require("multiformats/hashes/sha2");
|
@@ -1411,34 +1437,38 @@ __export(key_bag_exports, {
|
|
1411
1437
|
getKeyBag: () => getKeyBag,
|
1412
1438
|
registerKeyBagProviderFactory: () => registerKeyBagProviderFactory
|
1413
1439
|
});
|
1414
|
-
var
|
1440
|
+
var import_cement6 = require("@adviser/cement");
|
1415
1441
|
init_utils();
|
1416
1442
|
var import_base582 = require("multiformats/bases/base58");
|
1417
1443
|
var KeyBag = class {
|
1418
1444
|
constructor(rt) {
|
1419
1445
|
this.rt = rt;
|
1420
|
-
this.
|
1421
|
-
this.
|
1422
|
-
|
1423
|
-
});
|
1446
|
+
this._warnOnce = new import_cement6.ResolveOnce();
|
1447
|
+
this._seq = new import_cement6.ResolveSeq();
|
1448
|
+
this.logger = ensureLogger(rt.sthis, "KeyBag");
|
1424
1449
|
this.logger.Debug().Msg("KeyBag created");
|
1425
1450
|
}
|
1426
1451
|
async subtleKey(key) {
|
1452
|
+
const extractable = this.rt.url.getParam("extractKey") === "_deprecated_internal_api";
|
1453
|
+
if (extractable) {
|
1454
|
+
this._warnOnce.once(
|
1455
|
+
() => this.logger.Warn().Msg("extractKey is enabled via _deprecated_internal_api --- handle keys safely!!!")
|
1456
|
+
);
|
1457
|
+
}
|
1427
1458
|
return await this.rt.crypto.importKey(
|
1428
1459
|
"raw",
|
1429
1460
|
// raw or jwk
|
1430
1461
|
import_base582.base58btc.decode(key),
|
1431
1462
|
// hexStringToUint8Array(key), // raw data
|
1432
1463
|
"AES-GCM",
|
1433
|
-
|
1434
|
-
// extractable
|
1464
|
+
extractable,
|
1435
1465
|
["encrypt", "decrypt"]
|
1436
1466
|
);
|
1437
1467
|
}
|
1438
1468
|
async ensureKeyFromUrl(url, keyFactory) {
|
1439
1469
|
const storeKey = url.getParam("storekey");
|
1440
1470
|
if (storeKey === "insecure") {
|
1441
|
-
return
|
1471
|
+
return import_cement6.Result.Ok(url);
|
1442
1472
|
}
|
1443
1473
|
if (!storeKey) {
|
1444
1474
|
const keyName = `@${keyFactory()}@`;
|
@@ -1447,7 +1477,7 @@ var KeyBag = class {
|
|
1447
1477
|
return ret;
|
1448
1478
|
}
|
1449
1479
|
const urb = url.build().setParam("storekey", keyName);
|
1450
|
-
return
|
1480
|
+
return import_cement6.Result.Ok(urb.URI());
|
1451
1481
|
}
|
1452
1482
|
if (storeKey.startsWith("@") && storeKey.endsWith("@")) {
|
1453
1483
|
const ret = await this.getNamedKey(storeKey);
|
@@ -1455,13 +1485,13 @@ var KeyBag = class {
|
|
1455
1485
|
return ret;
|
1456
1486
|
}
|
1457
1487
|
}
|
1458
|
-
return
|
1488
|
+
return import_cement6.Result.Ok(url);
|
1459
1489
|
}
|
1460
1490
|
async toKeyWithFingerPrint(keyStr) {
|
1461
1491
|
const material = import_base582.base58btc.decode(keyStr);
|
1462
1492
|
const key = await this.subtleKey(keyStr);
|
1463
1493
|
const fpr = await this.rt.crypto.digestSHA256(material);
|
1464
|
-
return
|
1494
|
+
return import_cement6.Result.Ok({
|
1465
1495
|
key,
|
1466
1496
|
fingerPrint: import_base582.base58btc.encode(new Uint8Array(fpr))
|
1467
1497
|
});
|
@@ -1480,6 +1510,23 @@ var KeyBag = class {
|
|
1480
1510
|
await bag.set(name, item);
|
1481
1511
|
return await this.toKeyWithFingerPrint(item.key);
|
1482
1512
|
}
|
1513
|
+
async getNamedExtractableKey(name, failIfNotFound = false) {
|
1514
|
+
const ret = await this.getNamedKey(name, failIfNotFound);
|
1515
|
+
if (ret.isErr()) {
|
1516
|
+
return ret;
|
1517
|
+
}
|
1518
|
+
const named = ret.Ok();
|
1519
|
+
return import_cement6.Result.Ok({
|
1520
|
+
...named,
|
1521
|
+
extract: async () => {
|
1522
|
+
const ext = new Uint8Array(await this.rt.crypto.exportKey("raw", named.key));
|
1523
|
+
return {
|
1524
|
+
key: ext,
|
1525
|
+
keyStr: import_base582.base58btc.encode(ext)
|
1526
|
+
};
|
1527
|
+
}
|
1528
|
+
});
|
1529
|
+
}
|
1483
1530
|
async getNamedKey(name, failIfNotFound = false) {
|
1484
1531
|
const id = this.rt.sthis.nextId(4).str;
|
1485
1532
|
return this._seq.add(async () => {
|
@@ -1492,7 +1539,7 @@ var KeyBag = class {
|
|
1492
1539
|
}
|
1493
1540
|
if (failIfNotFound) {
|
1494
1541
|
this.logger.Debug().Str("id", id).Str("name", name).Msg("failIfNotFound getNamedKey");
|
1495
|
-
return
|
1542
|
+
return import_cement6.Result.Err(new Error(`Key not found: ${name}`));
|
1496
1543
|
}
|
1497
1544
|
const ret = await this._setNamedKey(name, import_base582.base58btc.encode(this.rt.crypto.randomBytes(this.rt.keyLength)));
|
1498
1545
|
this.logger.Debug().Str("id", id).Str("name", name).Result("fpr", ret).Msg("createKey getNamedKey-post");
|
@@ -1532,56 +1579,44 @@ function defaultKeyBagOpts(sthis, kbo) {
|
|
1532
1579
|
const logger = ensureLogger(sthis, "KeyBag");
|
1533
1580
|
let url;
|
1534
1581
|
if (kbo.url) {
|
1535
|
-
url =
|
1582
|
+
url = import_cement6.URI.from(kbo.url);
|
1536
1583
|
logger.Debug().Url(url).Msg("from opts");
|
1537
1584
|
} else {
|
1538
1585
|
let bagFnameOrUrl = sthis.env.get("FP_KEYBAG_URL");
|
1539
|
-
if ((0,
|
1540
|
-
url =
|
1586
|
+
if ((0, import_cement6.runtimeFn)().isBrowser) {
|
1587
|
+
url = import_cement6.URI.from(bagFnameOrUrl || "indexdb://fp-keybag");
|
1541
1588
|
} else {
|
1542
1589
|
if (!bagFnameOrUrl) {
|
1543
1590
|
const home = sthis.env.get("HOME");
|
1544
1591
|
bagFnameOrUrl = `${home}/.fireproof/keybag`;
|
1545
|
-
url =
|
1592
|
+
url = import_cement6.URI.from(`file://${bagFnameOrUrl}`);
|
1546
1593
|
} else {
|
1547
|
-
url =
|
1594
|
+
url = import_cement6.URI.from(bagFnameOrUrl);
|
1548
1595
|
}
|
1549
1596
|
}
|
1550
1597
|
logger.Debug().Url(url).Msg("from env");
|
1551
1598
|
}
|
1552
|
-
|
1553
|
-
|
1554
|
-
|
1555
|
-
keyProviderFactory = async () => {
|
1556
|
-
const { KeyBagProviderFile: KeyBagProviderFile2 } = await Promise.resolve().then(() => (init_key_bag_file(), key_bag_file_exports));
|
1557
|
-
return new KeyBagProviderFile2(url, sthis);
|
1558
|
-
};
|
1559
|
-
break;
|
1560
|
-
case "indexdb:":
|
1561
|
-
keyProviderFactory = async () => {
|
1562
|
-
const { KeyBagProviderIndexDB: KeyBagProviderIndexDB2 } = await Promise.resolve().then(() => (init_key_bag_indexdb(), key_bag_indexdb_exports));
|
1563
|
-
return new KeyBagProviderIndexDB2(url, sthis);
|
1564
|
-
};
|
1565
|
-
break;
|
1566
|
-
default:
|
1567
|
-
throw logger.Error().Url(url).Msg("unsupported protocol").AsError();
|
1599
|
+
const kitem = keyBagProviderFactories.get(url.protocol);
|
1600
|
+
if (!kitem) {
|
1601
|
+
throw logger.Error().Url(url).Msg("unsupported protocol").AsError();
|
1568
1602
|
}
|
1603
|
+
const getBag = async () => kitem.factory(url, sthis);
|
1569
1604
|
if (url.hasParam("masterkey")) {
|
1570
1605
|
throw logger.Error().Url(url).Msg("masterkey is not supported").AsError();
|
1571
1606
|
}
|
1572
1607
|
return {
|
1573
1608
|
url,
|
1574
|
-
crypto: kbo.crypto || (0,
|
1609
|
+
crypto: kbo.crypto || (0, import_cement6.toCryptoRuntime)({}),
|
1575
1610
|
sthis,
|
1576
1611
|
logger,
|
1577
1612
|
keyLength: kbo.keyLength || 16,
|
1578
|
-
getBag
|
1613
|
+
getBag,
|
1579
1614
|
id: () => {
|
1580
1615
|
return url.toString();
|
1581
1616
|
}
|
1582
1617
|
};
|
1583
1618
|
}
|
1584
|
-
var _keyBags = new
|
1619
|
+
var _keyBags = new import_cement6.KeyedResolvOnce();
|
1585
1620
|
async function getKeyBag(sthis, kbo = {}) {
|
1586
1621
|
await sthis.start();
|
1587
1622
|
const rt = defaultKeyBagOpts(sthis, kbo);
|
@@ -1692,6 +1727,54 @@ async function prepareCarFiles(encoder, threshold, rootBlock, t) {
|
|
1692
1727
|
|
1693
1728
|
// src/blockstore/loader.ts
|
1694
1729
|
var import_sha23 = require("multiformats/hashes/sha2");
|
1730
|
+
|
1731
|
+
// src/blockstore/task-manager.ts
|
1732
|
+
init_utils();
|
1733
|
+
var TaskManager = class {
|
1734
|
+
constructor(sthis, callback) {
|
1735
|
+
this.eventsWeHandled = /* @__PURE__ */ new Set();
|
1736
|
+
this.queue = [];
|
1737
|
+
this.isProcessing = false;
|
1738
|
+
this.logger = ensureLogger(sthis, "TaskManager");
|
1739
|
+
this.callback = callback;
|
1740
|
+
}
|
1741
|
+
async handleEvent(cid, parents, dbMeta) {
|
1742
|
+
for (const parent of parents) {
|
1743
|
+
this.eventsWeHandled.add(parent.toString());
|
1744
|
+
}
|
1745
|
+
this.queue.push({ cid: cid.toString(), dbMeta, retries: 0 });
|
1746
|
+
this.queue = this.queue.filter(({ cid: cid2 }) => !this.eventsWeHandled.has(cid2));
|
1747
|
+
void this.processQueue();
|
1748
|
+
}
|
1749
|
+
async processQueue() {
|
1750
|
+
if (this.isProcessing) return;
|
1751
|
+
this.isProcessing = true;
|
1752
|
+
const filteredQueue = this.queue.filter(({ cid }) => !this.eventsWeHandled.has(cid));
|
1753
|
+
const first = filteredQueue[0];
|
1754
|
+
if (!first) {
|
1755
|
+
return;
|
1756
|
+
}
|
1757
|
+
try {
|
1758
|
+
await this.callback(first.dbMeta);
|
1759
|
+
this.eventsWeHandled.add(first.cid);
|
1760
|
+
this.queue = this.queue.filter(({ cid }) => !this.eventsWeHandled.has(cid));
|
1761
|
+
} catch (err) {
|
1762
|
+
if (first.retries++ > 3) {
|
1763
|
+
this.logger.Error().Str("cid", first.cid).Msg("failed to process event block after 3 retries");
|
1764
|
+
this.queue = this.queue.filter(({ cid }) => cid !== first.cid);
|
1765
|
+
}
|
1766
|
+
await new Promise((resolve) => setTimeout(resolve, 50));
|
1767
|
+
throw this.logger.Error().Err(err).Msg("failed to process event block").AsError();
|
1768
|
+
} finally {
|
1769
|
+
this.isProcessing = false;
|
1770
|
+
if (this.queue.length > 0) {
|
1771
|
+
void this.processQueue();
|
1772
|
+
}
|
1773
|
+
}
|
1774
|
+
}
|
1775
|
+
};
|
1776
|
+
|
1777
|
+
// src/blockstore/loader.ts
|
1695
1778
|
function carLogIncludesGroup(list, cids) {
|
1696
1779
|
return list.some((arr) => {
|
1697
1780
|
return arr.toString() === cids.toString();
|
@@ -1716,7 +1799,7 @@ var Loader = class {
|
|
1716
1799
|
this.getBlockCache = /* @__PURE__ */ new Map();
|
1717
1800
|
this.seenMeta = /* @__PURE__ */ new Set();
|
1718
1801
|
this.writeLimit = (0, import_p_limit.default)(1);
|
1719
|
-
this.onceReady = new
|
1802
|
+
this.onceReady = new import_cement7.ResolveOnce();
|
1720
1803
|
this.name = name;
|
1721
1804
|
this.sthis = sthis;
|
1722
1805
|
this.ebOpts = defaultedBlockstoreRuntime(
|
@@ -1728,6 +1811,9 @@ var Loader = class {
|
|
1728
1811
|
"Loader"
|
1729
1812
|
);
|
1730
1813
|
this.logger = this.ebOpts.logger;
|
1814
|
+
this.taskManager = new TaskManager(sthis, async (dbMeta) => {
|
1815
|
+
await this.handleDbMetasFromStore([dbMeta]);
|
1816
|
+
});
|
1731
1817
|
}
|
1732
1818
|
// readonly id = uuidv4();
|
1733
1819
|
async keyBag() {
|
@@ -1747,8 +1833,10 @@ var Loader = class {
|
|
1747
1833
|
}
|
1748
1834
|
async ready() {
|
1749
1835
|
return this.onceReady.once(async () => {
|
1750
|
-
const metas =
|
1751
|
-
if (
|
1836
|
+
const metas = await (await this.metaStore()).load();
|
1837
|
+
if (this.ebOpts.meta) {
|
1838
|
+
await this.handleDbMetasFromStore([this.ebOpts.meta]);
|
1839
|
+
} else if (metas) {
|
1752
1840
|
await this.handleDbMetasFromStore(metas);
|
1753
1841
|
}
|
1754
1842
|
});
|
@@ -2054,7 +2142,7 @@ var generateIV = {
|
|
2054
2142
|
calc: async (ko, crypto, data) => {
|
2055
2143
|
const hash = await import_sha24.sha256.digest(data);
|
2056
2144
|
const hashBytes = new Uint8Array(hash.bytes);
|
2057
|
-
const hashArray = new Uint8Array(ko.ivLength
|
2145
|
+
const hashArray = new Uint8Array(ko.ivLength);
|
2058
2146
|
for (let i = 0; i < hashBytes.length; i++) {
|
2059
2147
|
hashArray[i % ko.ivLength] ^= hashBytes[i];
|
2060
2148
|
}
|
@@ -2132,7 +2220,7 @@ var keyedCrypto = class {
|
|
2132
2220
|
};
|
2133
2221
|
}
|
2134
2222
|
async _decrypt(data) {
|
2135
|
-
this.logger.Debug().Len(data.bytes).Str("fp", this.key.fingerPrint).Msg("decrypting");
|
2223
|
+
this.logger.Debug().Len(data.bytes, "bytes").Len(data.iv, "iv").Str("fp", this.key.fingerPrint).Msg("decrypting");
|
2136
2224
|
return new Uint8Array(await this.crypto.decrypt(this.algo(data.iv), this.key.key, data.bytes));
|
2137
2225
|
}
|
2138
2226
|
async _encrypt(data) {
|
@@ -2203,8 +2291,10 @@ async function keyedCryptoFactory(url, kb, sthis) {
|
|
2203
2291
|
}
|
2204
2292
|
|
2205
2293
|
// src/blockstore/fragment-gateway.ts
|
2294
|
+
var import_cement8 = require("@adviser/cement");
|
2206
2295
|
var import_base584 = require("multiformats/bases/base58");
|
2207
2296
|
var import_cborg = require("cborg");
|
2297
|
+
init_utils();
|
2208
2298
|
function getFragSize(url) {
|
2209
2299
|
const fragSize = url.getParam("fragSize");
|
2210
2300
|
let ret = 0;
|
@@ -2225,7 +2315,7 @@ async function getFrags(url, innerGW, headerSize, logger) {
|
|
2225
2315
|
}
|
2226
2316
|
const data = res.unwrap();
|
2227
2317
|
return [
|
2228
|
-
|
2318
|
+
import_cement8.Result.Ok({
|
2229
2319
|
fid: new Uint8Array(0),
|
2230
2320
|
ofs: 0,
|
2231
2321
|
len: data.length,
|
@@ -2239,7 +2329,7 @@ async function getFrags(url, innerGW, headerSize, logger) {
|
|
2239
2329
|
}
|
2240
2330
|
const firstFragment = (0, import_cborg.decode)(firstRaw.unwrap());
|
2241
2331
|
const blockSize = firstFragment.data.length;
|
2242
|
-
const ops = [Promise.resolve(
|
2332
|
+
const ops = [Promise.resolve(import_cement8.Result.Ok(firstFragment))];
|
2243
2333
|
const fidStr = import_base584.base58btc.encode(firstFragment.fid);
|
2244
2334
|
const fragUrl = url.build().setParam("fid", fidStr).setParam("len", firstFragment.len.toString()).setParam("headerSize", headerSize.toString());
|
2245
2335
|
for (let ofs = blockSize; ofs < firstFragment.len; ofs += blockSize) {
|
@@ -2251,12 +2341,12 @@ async function getFrags(url, innerGW, headerSize, logger) {
|
|
2251
2341
|
}
|
2252
2342
|
const fragment = (0, import_cborg.decode)(raw2.unwrap());
|
2253
2343
|
if (import_base584.base58btc.encode(fragment.fid) !== fidStr) {
|
2254
|
-
return
|
2344
|
+
return import_cement8.Result.Err(logger.Error().Msg("Fragment fid mismatch").AsError());
|
2255
2345
|
}
|
2256
2346
|
if (fragment.ofs !== ofs2) {
|
2257
|
-
return
|
2347
|
+
return import_cement8.Result.Err(logger.Error().Uint64("ofs", ofs2).Msg("Fragment ofs mismatch").AsError());
|
2258
2348
|
}
|
2259
|
-
return
|
2349
|
+
return import_cement8.Result.Ok(fragment);
|
2260
2350
|
})(fragUrl.setParam("ofs", ofs.toString()).URI(), ofs)
|
2261
2351
|
);
|
2262
2352
|
}
|
@@ -2318,42 +2408,68 @@ var FragmentGateway = class {
|
|
2318
2408
|
}
|
2319
2409
|
async put(url, body) {
|
2320
2410
|
await Promise.all(this.slicer(url, body));
|
2321
|
-
return
|
2411
|
+
return import_cement8.Result.Ok(void 0);
|
2322
2412
|
}
|
2323
2413
|
async get(url) {
|
2324
2414
|
const rfrags = await getFrags(url, this.innerGW, this.headerSize, this.logger);
|
2325
2415
|
let buffer = void 0;
|
2326
2416
|
for (const rfrag of rfrags) {
|
2327
2417
|
if (rfrag.isErr()) {
|
2328
|
-
return
|
2418
|
+
return import_cement8.Result.Err(rfrag.Err());
|
2329
2419
|
}
|
2330
2420
|
const frag = rfrag.Ok();
|
2331
2421
|
buffer = buffer || new Uint8Array(frag.len);
|
2332
2422
|
buffer.set(frag.data, frag.ofs);
|
2333
2423
|
}
|
2334
|
-
return
|
2424
|
+
return import_cement8.Result.Ok(buffer || new Uint8Array(0));
|
2425
|
+
}
|
2426
|
+
async subscribe(url, callback) {
|
2427
|
+
if (this.innerGW.subscribe) {
|
2428
|
+
return this.innerGW.subscribe(url, callback);
|
2429
|
+
} else {
|
2430
|
+
let lastData = void 0;
|
2431
|
+
let interval = 100;
|
2432
|
+
const fetchData = async () => {
|
2433
|
+
const result = await this.innerGW.get(url);
|
2434
|
+
if (result.isOk()) {
|
2435
|
+
const data = result.Ok();
|
2436
|
+
if (!lastData || !data.every((value, index2) => lastData && value === lastData[index2])) {
|
2437
|
+
lastData = data;
|
2438
|
+
callback(data);
|
2439
|
+
interval = 100;
|
2440
|
+
} else {
|
2441
|
+
interval *= 2;
|
2442
|
+
}
|
2443
|
+
}
|
2444
|
+
timeoutId = setTimeout(fetchData, interval);
|
2445
|
+
};
|
2446
|
+
let timeoutId = setTimeout(fetchData, interval);
|
2447
|
+
return import_cement8.Result.Ok(() => {
|
2448
|
+
clearTimeout(timeoutId);
|
2449
|
+
});
|
2450
|
+
}
|
2335
2451
|
}
|
2336
2452
|
async delete(url) {
|
2337
2453
|
const rfrags = await getFrags(url, this.innerGW, this.headerSize, this.logger);
|
2338
2454
|
for (const rfrag of rfrags) {
|
2339
2455
|
if (rfrag.isErr()) {
|
2340
|
-
return
|
2456
|
+
return import_cement8.Result.Err(rfrag.Err());
|
2341
2457
|
}
|
2342
2458
|
const frag = rfrag.Ok();
|
2343
2459
|
const fidStr = import_base584.base58btc.encode(frag.fid);
|
2344
2460
|
const fragUrl = url.build().setParam("fid", fidStr).setParam("len", frag.len.toString()).setParam("headerSize", this.headerSize.toString()).URI();
|
2345
2461
|
await this.innerGW.delete(fragUrl);
|
2346
2462
|
}
|
2347
|
-
return
|
2463
|
+
return import_cement8.Result.Ok(void 0);
|
2348
2464
|
}
|
2349
2465
|
};
|
2350
2466
|
|
2351
2467
|
// src/blockstore/store.ts
|
2352
2468
|
function guardVersion(url) {
|
2353
2469
|
if (!url.hasParam("version")) {
|
2354
|
-
return
|
2470
|
+
return import_cement9.Result.Err(`missing version: ${url.toString()}`);
|
2355
2471
|
}
|
2356
|
-
return
|
2472
|
+
return import_cement9.Result.Ok(url);
|
2357
2473
|
}
|
2358
2474
|
var BaseStoreImpl = class {
|
2359
2475
|
constructor(name, url, opts, sthis, logger) {
|
@@ -2365,6 +2481,7 @@ var BaseStoreImpl = class {
|
|
2365
2481
|
this.sthis = sthis;
|
2366
2482
|
this.logger = logger.With().Ref("url", () => this._url.toString()).Str("name", name).Logger();
|
2367
2483
|
this.gateway = new FragmentGateway(this.sthis, opts.gateway);
|
2484
|
+
this.loader = opts.loader;
|
2368
2485
|
}
|
2369
2486
|
url() {
|
2370
2487
|
return this._url;
|
@@ -2409,7 +2526,7 @@ var BaseStoreImpl = class {
|
|
2409
2526
|
}
|
2410
2527
|
if (this.ready) {
|
2411
2528
|
const fn = this.ready.bind(this);
|
2412
|
-
const ready = await exception2Result(fn);
|
2529
|
+
const ready = await (0, import_cement9.exception2Result)(fn);
|
2413
2530
|
if (ready.isErr()) {
|
2414
2531
|
await this.close();
|
2415
2532
|
return ready;
|
@@ -2420,102 +2537,6 @@ var BaseStoreImpl = class {
|
|
2420
2537
|
return version;
|
2421
2538
|
}
|
2422
2539
|
};
|
2423
|
-
var MetaStoreImpl = class extends BaseStoreImpl {
|
2424
|
-
constructor(sthis, name, url, opts) {
|
2425
|
-
super(
|
2426
|
-
name,
|
2427
|
-
url,
|
2428
|
-
{
|
2429
|
-
...opts
|
2430
|
-
},
|
2431
|
-
sthis,
|
2432
|
-
ensureLogger(sthis, "MetaStoreImpl")
|
2433
|
-
);
|
2434
|
-
this.storeType = "meta";
|
2435
|
-
this.subscribers = /* @__PURE__ */ new Map();
|
2436
|
-
}
|
2437
|
-
onLoad(branch, loadHandler) {
|
2438
|
-
const subscribers = this.subscribers.get(branch) || [];
|
2439
|
-
subscribers.push(loadHandler);
|
2440
|
-
this.subscribers.set(branch, subscribers);
|
2441
|
-
return () => {
|
2442
|
-
const subscribers2 = this.subscribers.get(branch) || [];
|
2443
|
-
const idx = subscribers2.indexOf(loadHandler);
|
2444
|
-
if (idx > -1) subscribers2.splice(idx, 1);
|
2445
|
-
};
|
2446
|
-
}
|
2447
|
-
makeHeader({ cars }) {
|
2448
|
-
const toEncode = { cars };
|
2449
|
-
return (0, import_dag_json.format)(toEncode);
|
2450
|
-
}
|
2451
|
-
parseHeader(headerData) {
|
2452
|
-
const got = (0, import_dag_json.parse)(headerData);
|
2453
|
-
return got;
|
2454
|
-
}
|
2455
|
-
async handleSubscribers(dbMetas, branch) {
|
2456
|
-
try {
|
2457
|
-
const subscribers = this.subscribers.get(branch) || [];
|
2458
|
-
await Promise.all(subscribers.map((subscriber) => subscriber(dbMetas)));
|
2459
|
-
} catch (e) {
|
2460
|
-
this.logger.Error().Err(e).Msg("handleSubscribers").AsError();
|
2461
|
-
}
|
2462
|
-
}
|
2463
|
-
async handleByteHeads(byteHeads, branch = "main") {
|
2464
|
-
let dbMetas;
|
2465
|
-
try {
|
2466
|
-
dbMetas = this.dbMetasForByteHeads(byteHeads);
|
2467
|
-
} catch (e) {
|
2468
|
-
throw this.logger.Error().Err(e).Msg("parseHeader").AsError();
|
2469
|
-
}
|
2470
|
-
await this.handleSubscribers(dbMetas, branch);
|
2471
|
-
return dbMetas;
|
2472
|
-
}
|
2473
|
-
dbMetasForByteHeads(byteHeads) {
|
2474
|
-
return byteHeads.map((bytes) => {
|
2475
|
-
const txt = this.sthis.txt.decode(bytes);
|
2476
|
-
return this.parseHeader(txt);
|
2477
|
-
});
|
2478
|
-
}
|
2479
|
-
async load(branch) {
|
2480
|
-
branch = branch || "main";
|
2481
|
-
this.logger.Debug().Str("branch", branch).Msg("loading");
|
2482
|
-
const url = await this.gateway.buildUrl(this.url(), branch);
|
2483
|
-
if (url.isErr()) {
|
2484
|
-
throw this.logger.Error().Result("buidUrl", url).Str("branch", branch).Msg("got error from gateway.buildUrl").AsError();
|
2485
|
-
}
|
2486
|
-
const bytes = await this.gateway.get(url.Ok());
|
2487
|
-
if (bytes.isErr()) {
|
2488
|
-
if (isNotFoundError(bytes)) {
|
2489
|
-
return void 0;
|
2490
|
-
}
|
2491
|
-
throw this.logger.Error().Url(url.Ok()).Result("bytes:", bytes).Msg("gateway get").AsError();
|
2492
|
-
}
|
2493
|
-
return this.handleByteHeads([bytes.Ok()], branch);
|
2494
|
-
}
|
2495
|
-
async save(meta, branch) {
|
2496
|
-
branch = branch || "main";
|
2497
|
-
this.logger.Debug().Str("branch", branch).Any("meta", meta).Msg("saving meta");
|
2498
|
-
const bytes = this.makeHeader(meta);
|
2499
|
-
const url = await this.gateway.buildUrl(this.url(), branch);
|
2500
|
-
if (url.isErr()) {
|
2501
|
-
throw this.logger.Error().Err(url.Err()).Str("branch", branch).Msg("got error from gateway.buildUrl").AsError();
|
2502
|
-
}
|
2503
|
-
const res = await this.gateway.put(url.Ok(), this.sthis.txt.encode(bytes));
|
2504
|
-
if (res.isErr()) {
|
2505
|
-
throw this.logger.Error().Err(res.Err()).Msg("got error from gateway.put").AsError();
|
2506
|
-
}
|
2507
|
-
await this.handleSubscribers([meta], branch);
|
2508
|
-
return res;
|
2509
|
-
}
|
2510
|
-
async close() {
|
2511
|
-
await this.gateway.close(this.url());
|
2512
|
-
this._onClosed.forEach((fn) => fn());
|
2513
|
-
return import_cement7.Result.Ok(void 0);
|
2514
|
-
}
|
2515
|
-
async destroy() {
|
2516
|
-
return this.gateway.destroy(this.url());
|
2517
|
-
}
|
2518
|
-
};
|
2519
2540
|
var DataStoreImpl = class extends BaseStoreImpl {
|
2520
2541
|
// readonly tag: string = "car-base";
|
2521
2542
|
constructor(sthis, name, url, opts) {
|
@@ -2565,7 +2586,7 @@ var DataStoreImpl = class extends BaseStoreImpl {
|
|
2565
2586
|
async close() {
|
2566
2587
|
await this.gateway.close(this.url());
|
2567
2588
|
this._onClosed.forEach((fn) => fn());
|
2568
|
-
return
|
2589
|
+
return import_cement9.Result.Ok(void 0);
|
2569
2590
|
}
|
2570
2591
|
destroy() {
|
2571
2592
|
return this.gateway.destroy(this.url());
|
@@ -2583,7 +2604,7 @@ var WALStoreImpl = class extends BaseStoreImpl {
|
|
2583
2604
|
ensureLogger(loader.sthis, "WALStoreImpl")
|
2584
2605
|
);
|
2585
2606
|
this.storeType = "wal";
|
2586
|
-
this._ready = new
|
2607
|
+
this._ready = new import_cement9.ResolveOnce();
|
2587
2608
|
this.walState = { operations: [], noLoaderOps: [], fileOperations: [] };
|
2588
2609
|
this.processing = void 0;
|
2589
2610
|
this.processQueue = new CommitQueue();
|
@@ -2739,13 +2760,265 @@ var WALStoreImpl = class extends BaseStoreImpl {
|
|
2739
2760
|
async close() {
|
2740
2761
|
await this.gateway.close(this.url());
|
2741
2762
|
this._onClosed.forEach((fn) => fn());
|
2742
|
-
return
|
2763
|
+
return import_cement9.Result.Ok(void 0);
|
2743
2764
|
}
|
2744
2765
|
destroy() {
|
2745
2766
|
return this.gateway.destroy(this.url());
|
2746
2767
|
}
|
2747
2768
|
};
|
2748
2769
|
|
2770
|
+
// src/blockstore/store-meta.ts
|
2771
|
+
var import_dag_json2 = require("@ipld/dag-json");
|
2772
|
+
var import_clock = require("@web3-storage/pail/clock");
|
2773
|
+
var import_multiformats2 = require("multiformats");
|
2774
|
+
var import_cement11 = require("@adviser/cement");
|
2775
|
+
init_utils();
|
2776
|
+
|
2777
|
+
// src/runtime/index.ts
|
2778
|
+
var runtime_exports = {};
|
2779
|
+
__export(runtime_exports, {
|
2780
|
+
FILESTORE_VERSION: () => FILESTORE_VERSION,
|
2781
|
+
INDEXDB_VERSION: () => INDEXDB_VERSION,
|
2782
|
+
files: () => files_exports,
|
2783
|
+
getFileName: () => getFileName,
|
2784
|
+
getFileSystem: () => getFileSystem,
|
2785
|
+
getPath: () => getPath,
|
2786
|
+
kb: () => key_bag_exports,
|
2787
|
+
kc: () => keyed_crypto_exports,
|
2788
|
+
mf: () => wait_pr_multiformats_exports,
|
2789
|
+
runtimeFn: () => import_cement10.runtimeFn,
|
2790
|
+
toArrayBuffer: () => toArrayBuffer
|
2791
|
+
});
|
2792
|
+
init_utils2();
|
2793
|
+
|
2794
|
+
// src/runtime/wait-pr-multiformats/index.ts
|
2795
|
+
var wait_pr_multiformats_exports = {};
|
2796
|
+
__export(wait_pr_multiformats_exports, {
|
2797
|
+
block: () => block_exports,
|
2798
|
+
codec: () => codec_interface_exports
|
2799
|
+
});
|
2800
|
+
|
2801
|
+
// src/runtime/wait-pr-multiformats/codec-interface.ts
|
2802
|
+
var codec_interface_exports = {};
|
2803
|
+
|
2804
|
+
// src/runtime/index.ts
|
2805
|
+
var import_cement10 = require("@adviser/cement");
|
2806
|
+
init_version();
|
2807
|
+
init_version2();
|
2808
|
+
|
2809
|
+
// src/blockstore/store-meta.ts
|
2810
|
+
async function decodeGatewayMetaBytesToDbMeta(sthis, byteHeads) {
|
2811
|
+
const crdtEntries = JSON.parse(sthis.txt.decode(byteHeads));
|
2812
|
+
return Promise.all(
|
2813
|
+
crdtEntries.map(async (crdtEntry) => {
|
2814
|
+
const eventBlock = await (0, import_clock.decodeEventBlock)(decodeFromBase64(crdtEntry.data));
|
2815
|
+
const dbMeta = (0, import_dag_json2.parse)(sthis.txt.decode(eventBlock.value.data.dbMeta));
|
2816
|
+
return {
|
2817
|
+
eventCid: eventBlock.cid,
|
2818
|
+
parents: crdtEntry.parents,
|
2819
|
+
dbMeta
|
2820
|
+
};
|
2821
|
+
})
|
2822
|
+
);
|
2823
|
+
}
|
2824
|
+
async function setCryptoKeyFromGatewayMetaPayload(uri, sthis, data) {
|
2825
|
+
try {
|
2826
|
+
sthis.logger.Debug().Str("uri", uri.toString()).Msg("Setting crypto key from gateway meta payload");
|
2827
|
+
const keyInfo = await decodeGatewayMetaBytesToDbMeta(sthis, data);
|
2828
|
+
if (keyInfo.length) {
|
2829
|
+
const dbMeta = keyInfo[0].dbMeta;
|
2830
|
+
if (dbMeta.key) {
|
2831
|
+
const kb = await key_bag_exports.getKeyBag(sthis);
|
2832
|
+
const keyName = getStoreKeyName(uri);
|
2833
|
+
const res = await kb.setNamedKey(keyName, dbMeta.key);
|
2834
|
+
if (res.isErr()) {
|
2835
|
+
sthis.logger.Debug().Str("keyName", keyName).Str("dbMeta.key", dbMeta.key).Msg("Failed to set named key");
|
2836
|
+
throw res.Err();
|
2837
|
+
}
|
2838
|
+
}
|
2839
|
+
sthis.logger.Debug().Str("dbMeta.key", dbMeta.key).Str("uri", uri.toString()).Msg("Set crypto key from gateway meta payload");
|
2840
|
+
return import_cement11.Result.Ok(dbMeta);
|
2841
|
+
}
|
2842
|
+
sthis.logger.Debug().Str("data", new TextDecoder().decode(data)).Msg("No crypto in gateway meta payload");
|
2843
|
+
return import_cement11.Result.Ok(void 0);
|
2844
|
+
} catch (error) {
|
2845
|
+
sthis.logger.Debug().Err(error).Msg("Failed to set crypto key from gateway meta payload");
|
2846
|
+
return import_cement11.Result.Err(error);
|
2847
|
+
}
|
2848
|
+
}
|
2849
|
+
async function addCryptoKeyToGatewayMetaPayload(uri, sthis, body) {
|
2850
|
+
try {
|
2851
|
+
sthis.logger.Debug().Str("uri", uri.toString()).Msg("Adding crypto key to gateway meta payload");
|
2852
|
+
const keyName = getStoreKeyName(uri);
|
2853
|
+
const kb = await key_bag_exports.getKeyBag(sthis);
|
2854
|
+
const res = await kb.getNamedExtractableKey(keyName, true);
|
2855
|
+
if (res.isErr()) {
|
2856
|
+
sthis.logger.Error().Str("keyName", keyName).Msg("Failed to get named extractable key");
|
2857
|
+
throw res.Err();
|
2858
|
+
}
|
2859
|
+
const keyData = await res.Ok().extract();
|
2860
|
+
const dbMetas = await decodeGatewayMetaBytesToDbMeta(sthis, body);
|
2861
|
+
const { dbMeta, parents } = dbMetas[0];
|
2862
|
+
const parentLinks = parents.map((p) => import_multiformats2.CID.parse(p));
|
2863
|
+
dbMeta.key = keyData.keyStr;
|
2864
|
+
const events = await Promise.all([dbMeta].map((dbMeta2) => createDbMetaEventBlock(sthis, dbMeta2, parentLinks)));
|
2865
|
+
const encoded = await encodeEventsWithParents(sthis, events, parentLinks);
|
2866
|
+
sthis.logger.Debug().Str("uri", uri.toString()).Msg("Added crypto key to gateway meta payload");
|
2867
|
+
return import_cement11.Result.Ok(encoded);
|
2868
|
+
} catch (error) {
|
2869
|
+
sthis.logger.Error().Err(error).Msg("Failed to add crypto key to gateway meta payload");
|
2870
|
+
return import_cement11.Result.Err(error);
|
2871
|
+
}
|
2872
|
+
}
|
2873
|
+
function getStoreKeyName(url) {
|
2874
|
+
const storeKeyName = [url.getParam("localName") || url.getParam("name")];
|
2875
|
+
const idx = url.getParam("index");
|
2876
|
+
if (idx) {
|
2877
|
+
storeKeyName.push(idx);
|
2878
|
+
}
|
2879
|
+
storeKeyName.push("data");
|
2880
|
+
return `@${storeKeyName.join(":")}@`;
|
2881
|
+
}
|
2882
|
+
async function createDbMetaEventBlock(sthis, dbMeta, parents) {
|
2883
|
+
const event = await import_clock.EventBlock.create(
|
2884
|
+
{
|
2885
|
+
dbMeta: sthis.txt.encode((0, import_dag_json2.format)(dbMeta))
|
2886
|
+
},
|
2887
|
+
parents
|
2888
|
+
);
|
2889
|
+
return event;
|
2890
|
+
}
|
2891
|
+
async function encodeEventsWithParents(sthis, events, parents) {
|
2892
|
+
const crdtEntries = events.map((event) => {
|
2893
|
+
const base64String = encodeToBase64(event.bytes);
|
2894
|
+
return {
|
2895
|
+
cid: event.cid.toString(),
|
2896
|
+
data: base64String,
|
2897
|
+
parents: parents.map((p) => p.toString())
|
2898
|
+
};
|
2899
|
+
});
|
2900
|
+
return sthis.txt.encode(JSON.stringify(crdtEntries));
|
2901
|
+
}
|
2902
|
+
var MetaStoreImpl = class extends BaseStoreImpl {
|
2903
|
+
constructor(sthis, name, url, opts, remote) {
|
2904
|
+
super(
|
2905
|
+
name,
|
2906
|
+
url,
|
2907
|
+
{
|
2908
|
+
...opts
|
2909
|
+
},
|
2910
|
+
sthis,
|
2911
|
+
ensureLogger(sthis, "MetaStoreImpl")
|
2912
|
+
);
|
2913
|
+
this.storeType = "meta";
|
2914
|
+
this.subscribers = /* @__PURE__ */ new Map();
|
2915
|
+
this.parents = [];
|
2916
|
+
if (remote && opts.gateway.subscribe) {
|
2917
|
+
this.onStarted(async () => {
|
2918
|
+
this.logger.Debug().Str("url", this.url().toString()).Msg("Subscribing to the gateway");
|
2919
|
+
opts.gateway.subscribe?.(this.url(), async (message) => {
|
2920
|
+
this.logger.Debug().Msg("Received message from gateway");
|
2921
|
+
const dbMetas = await decodeGatewayMetaBytesToDbMeta(this.sthis, message);
|
2922
|
+
await Promise.all(
|
2923
|
+
dbMetas.map((dbMeta) => this.loader?.taskManager?.handleEvent(dbMeta.eventCid, dbMeta.parents, dbMeta.dbMeta))
|
2924
|
+
);
|
2925
|
+
});
|
2926
|
+
});
|
2927
|
+
}
|
2928
|
+
}
|
2929
|
+
async handleByteHeads(byteHeads) {
|
2930
|
+
return await decodeGatewayMetaBytesToDbMeta(this.sthis, byteHeads);
|
2931
|
+
}
|
2932
|
+
async load() {
|
2933
|
+
const branch = "main";
|
2934
|
+
const url = await this.gateway.buildUrl(this.url(), branch);
|
2935
|
+
if (url.isErr()) {
|
2936
|
+
throw this.logger.Error().Result("buildUrl", url).Str("branch", branch).Msg("got error from gateway.buildUrl").AsError();
|
2937
|
+
}
|
2938
|
+
const bytes = await this.gateway.get(url.Ok());
|
2939
|
+
if (bytes.isErr()) {
|
2940
|
+
if (isNotFoundError(bytes)) {
|
2941
|
+
return void 0;
|
2942
|
+
}
|
2943
|
+
throw this.logger.Error().Url(url.Ok()).Result("bytes:", bytes).Msg("gateway get").AsError();
|
2944
|
+
}
|
2945
|
+
const dbMetas = await this.handleByteHeads(bytes.Ok());
|
2946
|
+
await this.loader?.handleDbMetasFromStore(dbMetas.map((m) => m.dbMeta));
|
2947
|
+
const cids = dbMetas.map((m) => m.eventCid);
|
2948
|
+
const uniqueParentsMap = new Map([...this.parents, ...cids].map((p) => [p.toString(), p]));
|
2949
|
+
this.parents = Array.from(uniqueParentsMap.values());
|
2950
|
+
return dbMetas.map((m) => m.dbMeta);
|
2951
|
+
}
|
2952
|
+
async save(meta, branch) {
|
2953
|
+
branch = branch || "main";
|
2954
|
+
this.logger.Debug().Str("branch", branch).Any("meta", meta).Msg("saving meta");
|
2955
|
+
const event = await createDbMetaEventBlock(this.sthis, meta, this.parents);
|
2956
|
+
const bytes = await encodeEventsWithParents(this.sthis, [event], this.parents);
|
2957
|
+
const url = await this.gateway.buildUrl(this.url(), branch);
|
2958
|
+
if (url.isErr()) {
|
2959
|
+
throw this.logger.Error().Err(url.Err()).Str("branch", branch).Msg("got error from gateway.buildUrl").AsError();
|
2960
|
+
}
|
2961
|
+
const res = await this.gateway.put(url.Ok(), bytes);
|
2962
|
+
if (res.isErr()) {
|
2963
|
+
throw this.logger.Error().Err(res.Err()).Msg("got error from gateway.put").AsError();
|
2964
|
+
}
|
2965
|
+
await this.loader?.handleDbMetasFromStore([meta]);
|
2966
|
+
this.parents = [event.cid];
|
2967
|
+
return res;
|
2968
|
+
}
|
2969
|
+
async close() {
|
2970
|
+
await this.gateway.close(this.url());
|
2971
|
+
this._onClosed.forEach((fn) => fn());
|
2972
|
+
return import_cement11.Result.Ok(void 0);
|
2973
|
+
}
|
2974
|
+
async destroy() {
|
2975
|
+
return this.gateway.destroy(this.url());
|
2976
|
+
}
|
2977
|
+
};
|
2978
|
+
function encodeToBase64(bytes) {
|
2979
|
+
const chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
|
2980
|
+
let base64 = "";
|
2981
|
+
let i;
|
2982
|
+
for (i = 0; i < bytes.length - 2; i += 3) {
|
2983
|
+
base64 += chars[bytes[i] >> 2];
|
2984
|
+
base64 += chars[(bytes[i] & 3) << 4 | bytes[i + 1] >> 4];
|
2985
|
+
base64 += chars[(bytes[i + 1] & 15) << 2 | bytes[i + 2] >> 6];
|
2986
|
+
base64 += chars[bytes[i + 2] & 63];
|
2987
|
+
}
|
2988
|
+
if (i < bytes.length) {
|
2989
|
+
base64 += chars[bytes[i] >> 2];
|
2990
|
+
if (i === bytes.length - 1) {
|
2991
|
+
base64 += chars[(bytes[i] & 3) << 4];
|
2992
|
+
base64 += "==";
|
2993
|
+
} else {
|
2994
|
+
base64 += chars[(bytes[i] & 3) << 4 | bytes[i + 1] >> 4];
|
2995
|
+
base64 += chars[(bytes[i + 1] & 15) << 2];
|
2996
|
+
base64 += "=";
|
2997
|
+
}
|
2998
|
+
}
|
2999
|
+
return base64;
|
3000
|
+
}
|
3001
|
+
function decodeFromBase64(base64) {
|
3002
|
+
const chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
|
3003
|
+
const bytes = new Uint8Array(base64.length * 3 / 4);
|
3004
|
+
let i;
|
3005
|
+
let j = 0;
|
3006
|
+
for (i = 0; i < base64.length; i += 4) {
|
3007
|
+
const a = chars.indexOf(base64[i]);
|
3008
|
+
const b = chars.indexOf(base64[i + 1]);
|
3009
|
+
const c = chars.indexOf(base64[i + 2]);
|
3010
|
+
const d = chars.indexOf(base64[i + 3]);
|
3011
|
+
bytes[j++] = a << 2 | b >> 4;
|
3012
|
+
if (base64[i + 2] !== "=") {
|
3013
|
+
bytes[j++] = (b & 15) << 4 | c >> 2;
|
3014
|
+
}
|
3015
|
+
if (base64[i + 3] !== "=") {
|
3016
|
+
bytes[j++] = (c & 3) << 6 | d;
|
3017
|
+
}
|
3018
|
+
}
|
3019
|
+
return bytes.slice(0, j);
|
3020
|
+
}
|
3021
|
+
|
2749
3022
|
// src/blockstore/store-factory.ts
|
2750
3023
|
init_utils();
|
2751
3024
|
function ensureIsIndex(url, isIndex) {
|
@@ -2766,15 +3039,15 @@ function buildURL(optURL, loader) {
|
|
2766
3039
|
const obuItem = Array.from(storeFactory.values()).find((items) => items.overrideBaseURL);
|
2767
3040
|
let obuUrl;
|
2768
3041
|
if (obuItem && obuItem.overrideBaseURL) {
|
2769
|
-
obuUrl =
|
3042
|
+
obuUrl = import_cement14.URI.from(obuItem.overrideBaseURL);
|
2770
3043
|
}
|
2771
3044
|
const ret = ensureIsIndex(
|
2772
|
-
|
3045
|
+
import_cement14.URI.from(optURL || obuUrl || dataDir(loader.sthis, loader.name, storeOpts.stores?.base)),
|
2773
3046
|
storeOpts.isIndex
|
2774
3047
|
);
|
2775
3048
|
return ret;
|
2776
3049
|
}
|
2777
|
-
var onceGateway = new
|
3050
|
+
var onceGateway = new import_cement14.KeyedResolvOnce();
|
2778
3051
|
async function getGatewayFromURL(url, sthis) {
|
2779
3052
|
return onceGateway.get(url.toString()).once(async () => {
|
2780
3053
|
const item = storeFactory.get(url.protocol);
|
@@ -2816,52 +3089,61 @@ function registerStoreProtocol(item) {
|
|
2816
3089
|
storeFactory.delete(protocol);
|
2817
3090
|
};
|
2818
3091
|
}
|
3092
|
+
var onceDataStoreFactory = new import_cement14.KeyedResolvOnce();
|
2819
3093
|
async function dataStoreFactory(loader) {
|
2820
3094
|
const url = ensureName(loader.name, buildURL(loader.ebOpts.store.stores?.data, loader)).build().setParam("store", "data").URI();
|
2821
3095
|
const sthis = ensureSuperLog(loader.sthis, "dataStoreFactory", { url: url.toString() });
|
2822
|
-
|
2823
|
-
|
2824
|
-
|
2825
|
-
|
2826
|
-
|
2827
|
-
|
2828
|
-
|
2829
|
-
|
2830
|
-
|
3096
|
+
return onceDataStoreFactory.get(url.toString()).once(async () => {
|
3097
|
+
const gateway = await getGatewayFromURL(url, sthis);
|
3098
|
+
if (!gateway) {
|
3099
|
+
throw sthis.logger.Error().Url(url).Msg("gateway not found").AsError();
|
3100
|
+
}
|
3101
|
+
const store = new DataStoreImpl(sthis, loader.name, url, {
|
3102
|
+
gateway: gateway.gateway,
|
3103
|
+
keybag: () => getKeyBag(loader.sthis, {
|
3104
|
+
...loader.ebOpts.keyBag
|
3105
|
+
})
|
3106
|
+
});
|
3107
|
+
return store;
|
2831
3108
|
});
|
2832
|
-
return store;
|
2833
3109
|
}
|
3110
|
+
var onceMetaStoreFactory = new import_cement14.KeyedResolvOnce();
|
2834
3111
|
async function metaStoreFactory(loader) {
|
2835
3112
|
const url = ensureName(loader.name, buildURL(loader.ebOpts.store.stores?.meta, loader)).build().setParam("store", "meta").URI();
|
2836
3113
|
const sthis = ensureSuperLog(loader.sthis, "metaStoreFactory", { url: () => url.toString() });
|
2837
|
-
|
2838
|
-
|
2839
|
-
|
2840
|
-
|
2841
|
-
|
2842
|
-
|
2843
|
-
|
2844
|
-
|
2845
|
-
|
2846
|
-
|
3114
|
+
return onceMetaStoreFactory.get(url.toString()).once(async () => {
|
3115
|
+
sthis.logger.Debug().Str("protocol", url.protocol).Msg("pre-protocol switch");
|
3116
|
+
const gateway = await getGatewayFromURL(url, sthis);
|
3117
|
+
if (!gateway) {
|
3118
|
+
throw sthis.logger.Error().Url(url).Msg("gateway not found").AsError();
|
3119
|
+
}
|
3120
|
+
const store = new MetaStoreImpl(loader.sthis, loader.name, url, {
|
3121
|
+
gateway: gateway.gateway,
|
3122
|
+
keybag: () => getKeyBag(loader.sthis, {
|
3123
|
+
...loader.ebOpts.keyBag
|
3124
|
+
})
|
3125
|
+
});
|
3126
|
+
return store;
|
2847
3127
|
});
|
2848
|
-
return store;
|
2849
3128
|
}
|
3129
|
+
var onceRemoteWalFactory = new import_cement14.KeyedResolvOnce();
|
2850
3130
|
async function remoteWalFactory(loader) {
|
2851
3131
|
const url = ensureName(loader.name, buildURL(loader.ebOpts.store.stores?.wal, loader)).build().setParam("store", "wal").URI();
|
2852
3132
|
const sthis = ensureSuperLog(loader.sthis, "remoteWalFactory", { url: url.toString() });
|
2853
|
-
|
2854
|
-
|
2855
|
-
|
2856
|
-
|
2857
|
-
|
2858
|
-
|
2859
|
-
|
2860
|
-
|
2861
|
-
|
2862
|
-
|
3133
|
+
return onceRemoteWalFactory.get(url.toString()).once(async () => {
|
3134
|
+
const gateway = await getGatewayFromURL(url, sthis);
|
3135
|
+
if (!gateway) {
|
3136
|
+
throw sthis.logger.Error().Url(url).Msg("gateway not found").AsError();
|
3137
|
+
}
|
3138
|
+
sthis.logger.Debug().Str("prepared", url.toString()).Msg("produced");
|
3139
|
+
const store = new WALStoreImpl(loader, url, {
|
3140
|
+
gateway: gateway.gateway,
|
3141
|
+
keybag: () => getKeyBag(loader.sthis, {
|
3142
|
+
...loader.ebOpts.keyBag
|
3143
|
+
})
|
3144
|
+
});
|
3145
|
+
return store;
|
2863
3146
|
});
|
2864
|
-
return store;
|
2865
3147
|
}
|
2866
3148
|
async function testStoreFactory(url, sthis) {
|
2867
3149
|
sthis = ensureSuperLog(sthis, "testStoreFactory");
|
@@ -2900,79 +3182,27 @@ function toStoreRuntime(opts, sthis) {
|
|
2900
3182
|
}
|
2901
3183
|
registerStoreProtocol({
|
2902
3184
|
protocol: "file:",
|
2903
|
-
gateway: async (
|
3185
|
+
gateway: async (sthis) => {
|
2904
3186
|
const { FileGateway: FileGateway2 } = await Promise.resolve().then(() => (init_gateway(), gateway_exports));
|
2905
|
-
return new FileGateway2(
|
3187
|
+
return new FileGateway2(sthis);
|
2906
3188
|
},
|
2907
|
-
test: async (
|
3189
|
+
test: async (sthis) => {
|
2908
3190
|
const { FileTestStore: FileTestStore2 } = await Promise.resolve().then(() => (init_gateway(), gateway_exports));
|
2909
|
-
return new FileTestStore2(
|
3191
|
+
return new FileTestStore2(sthis);
|
2910
3192
|
}
|
2911
3193
|
});
|
2912
3194
|
registerStoreProtocol({
|
2913
3195
|
protocol: "indexdb:",
|
2914
|
-
gateway: async (
|
3196
|
+
gateway: async (sthis) => {
|
2915
3197
|
const { IndexDBGateway: IndexDBGateway2 } = await Promise.resolve().then(() => (init_gateway2(), gateway_exports2));
|
2916
|
-
return new IndexDBGateway2(
|
3198
|
+
return new IndexDBGateway2(sthis);
|
2917
3199
|
},
|
2918
|
-
test: async (
|
3200
|
+
test: async (sthis) => {
|
2919
3201
|
const { IndexDBTestStore: IndexDBTestStore2 } = await Promise.resolve().then(() => (init_gateway2(), gateway_exports2));
|
2920
|
-
return new IndexDBTestStore2(
|
3202
|
+
return new IndexDBTestStore2(sthis);
|
2921
3203
|
}
|
2922
3204
|
});
|
2923
3205
|
|
2924
|
-
// src/blockstore/connection-base.ts
|
2925
|
-
var import_clock = require("@web3-storage/pail/clock");
|
2926
|
-
var import_block6 = require("@web3-storage/pail/block");
|
2927
|
-
|
2928
|
-
// src/blockstore/task-manager.ts
|
2929
|
-
init_utils();
|
2930
|
-
var TaskManager = class {
|
2931
|
-
constructor(loader) {
|
2932
|
-
this.eventsWeHandled = /* @__PURE__ */ new Set();
|
2933
|
-
this.queue = [];
|
2934
|
-
this.isProcessing = false;
|
2935
|
-
this.loader = loader;
|
2936
|
-
this.logger = ensureLogger(loader.sthis, "TaskManager");
|
2937
|
-
}
|
2938
|
-
async handleEvent(eventBlock) {
|
2939
|
-
const cid = eventBlock.cid.toString();
|
2940
|
-
const parents = eventBlock.value.parents.map((cid2) => cid2.toString());
|
2941
|
-
for (const parent of parents) {
|
2942
|
-
this.eventsWeHandled.add(parent);
|
2943
|
-
}
|
2944
|
-
this.queue.push({ cid, eventBlock, retries: 0 });
|
2945
|
-
this.queue = this.queue.filter(({ cid: cid2 }) => !this.eventsWeHandled.has(cid2));
|
2946
|
-
void this.processQueue();
|
2947
|
-
}
|
2948
|
-
async processQueue() {
|
2949
|
-
if (this.isProcessing) return;
|
2950
|
-
this.isProcessing = true;
|
2951
|
-
const filteredQueue = this.queue.filter(({ cid }) => !this.eventsWeHandled.has(cid));
|
2952
|
-
const first = filteredQueue[0];
|
2953
|
-
if (!first) {
|
2954
|
-
return;
|
2955
|
-
}
|
2956
|
-
try {
|
2957
|
-
this.loader?.remoteMetaStore?.handleByteHeads([first.eventBlock.value.data.dbMeta]);
|
2958
|
-
this.eventsWeHandled.add(first.cid);
|
2959
|
-
this.queue = this.queue.filter(({ cid }) => !this.eventsWeHandled.has(cid));
|
2960
|
-
} catch (err) {
|
2961
|
-
if (first.retries++ > 3) {
|
2962
|
-
this.logger.Error().Str("cid", first.cid).Msg("failed to process event block after 3 retries");
|
2963
|
-
this.queue = this.queue.filter(({ cid }) => cid !== first.cid);
|
2964
|
-
}
|
2965
|
-
await new Promise((resolve) => setTimeout(resolve, 50));
|
2966
|
-
throw this.logger.Error().Err(err).Msg("failed to process event block").AsError();
|
2967
|
-
} finally {
|
2968
|
-
this.isProcessing = false;
|
2969
|
-
if (this.queue.length > 0) {
|
2970
|
-
void this.processQueue();
|
2971
|
-
}
|
2972
|
-
}
|
2973
|
-
}
|
2974
|
-
};
|
2975
|
-
|
2976
3206
|
// src/blockstore/store-remote.ts
|
2977
3207
|
async function RemoteDataStore(sthis, name, url, opts) {
|
2978
3208
|
const ds = new DataStoreImpl(sthis, name, url, opts);
|
@@ -2980,7 +3210,7 @@ async function RemoteDataStore(sthis, name, url, opts) {
|
|
2980
3210
|
return ds;
|
2981
3211
|
}
|
2982
3212
|
async function RemoteMetaStore(sthis, name, url, opts) {
|
2983
|
-
const ms = new MetaStoreImpl(sthis, name, url, opts);
|
3213
|
+
const ms = new MetaStoreImpl(sthis, name, url, opts, true);
|
2984
3214
|
await ms.start();
|
2985
3215
|
return ms;
|
2986
3216
|
}
|
@@ -2988,16 +3218,12 @@ async function RemoteMetaStore(sthis, name, url, opts) {
|
|
2988
3218
|
// src/blockstore/connection-base.ts
|
2989
3219
|
var ConnectionBase = class {
|
2990
3220
|
constructor(url, logger) {
|
2991
|
-
// readonly ready: Promise<unknown>;
|
2992
|
-
// todo move to LRU blockstore https://github.com/web3-storage/w3clock/blob/main/src/worker/block.js
|
2993
|
-
this.eventBlocks = new import_block6.MemoryBlockstore();
|
2994
|
-
this.parents = [];
|
2995
3221
|
this.loaded = Promise.resolve();
|
2996
3222
|
this.logger = logger;
|
2997
3223
|
this.url = url;
|
2998
3224
|
}
|
2999
3225
|
async refresh() {
|
3000
|
-
await throwFalsy(throwFalsy(this.loader).remoteMetaStore).load(
|
3226
|
+
await throwFalsy(throwFalsy(this.loader).remoteMetaStore).load();
|
3001
3227
|
await (await throwFalsy(this.loader).WALStore()).process();
|
3002
3228
|
}
|
3003
3229
|
async connect_X({ loader }) {
|
@@ -3008,26 +3234,20 @@ var ConnectionBase = class {
|
|
3008
3234
|
async connectMeta_X({ loader }) {
|
3009
3235
|
if (!loader) throw this.logger.Error().Msg("connectMeta_X: loader is required").AsError();
|
3010
3236
|
this.loader = loader;
|
3011
|
-
this.taskManager = new TaskManager(loader);
|
3012
3237
|
await this.onConnect();
|
3013
3238
|
const metaUrl = this.url.build().defParam("store", "meta").URI();
|
3014
3239
|
const gateway = await getGatewayFromURL(metaUrl, this.loader.sthis);
|
3015
3240
|
if (!gateway) throw this.logger.Error().Url(metaUrl).Msg("connectMeta_X: gateway is required").AsError();
|
3016
|
-
const
|
3017
|
-
|
3241
|
+
const dbName = metaUrl.getParam("name");
|
3242
|
+
if (!dbName) throw this.logger.Error().Url(metaUrl).Msg("connectMeta_X: name is required").AsError();
|
3243
|
+
const remote = await RemoteMetaStore(loader.sthis, dbName, metaUrl, {
|
3018
3244
|
gateway: gateway.gateway,
|
3019
|
-
keybag: () => getKeyBag(loader.sthis, loader.ebOpts.keyBag)
|
3020
|
-
|
3021
|
-
remote.onLoad("main", async (metas) => {
|
3022
|
-
if (metas) {
|
3023
|
-
this.logger.Debug().Any("metas", metas).Bool("loader", this.loader).Msg("connectMeta_X: handleDbMetasFromStore pre");
|
3024
|
-
await throwFalsy(this.loader).handleDbMetasFromStore(metas);
|
3025
|
-
this.logger.Debug().Any("metas", metas).Msg("connectMeta_X: handleDbMetasFromStore post");
|
3026
|
-
}
|
3245
|
+
keybag: () => getKeyBag(loader.sthis, loader.ebOpts.keyBag),
|
3246
|
+
loader
|
3027
3247
|
});
|
3028
3248
|
this.loader.remoteMetaStore = remote;
|
3029
3249
|
this.loaded = this.loader.ready().then(async () => {
|
3030
|
-
remote.load(
|
3250
|
+
remote.load().then(async () => {
|
3031
3251
|
(await throwFalsy(this.loader).WALStore()).process();
|
3032
3252
|
});
|
3033
3253
|
});
|
@@ -3038,28 +3258,14 @@ var ConnectionBase = class {
|
|
3038
3258
|
const dataUrl = this.url.build().defParam("store", "data").URI();
|
3039
3259
|
const gateway = await getGatewayFromURL(dataUrl, this.loader.sthis);
|
3040
3260
|
if (!gateway) throw this.logger.Error().Url(dataUrl).Msg("connectStorage_X: gateway is required").AsError();
|
3041
|
-
const name = dataUrl.
|
3261
|
+
const name = dataUrl.getParam("name");
|
3262
|
+
if (!name) throw this.logger.Error().Url(dataUrl).Msg("connectStorage_X: name is required").AsError;
|
3042
3263
|
loader.remoteCarStore = await RemoteDataStore(loader.sthis, name, this.url, {
|
3043
3264
|
gateway: gateway.gateway,
|
3044
3265
|
keybag: () => getKeyBag(loader.sthis, this.loader?.ebOpts.keyBag)
|
3045
3266
|
});
|
3046
3267
|
loader.remoteFileStore = loader.remoteCarStore;
|
3047
3268
|
}
|
3048
|
-
async createEventBlock(bytes) {
|
3049
|
-
const data = {
|
3050
|
-
dbMeta: bytes
|
3051
|
-
};
|
3052
|
-
const event = await import_clock.EventBlock.create(
|
3053
|
-
data,
|
3054
|
-
this.parents
|
3055
|
-
);
|
3056
|
-
await this.eventBlocks.put(event.cid, event.bytes);
|
3057
|
-
return event;
|
3058
|
-
}
|
3059
|
-
async decodeEventBlock(bytes) {
|
3060
|
-
const event = await (0, import_clock.decodeEventBlock)(bytes);
|
3061
|
-
return event;
|
3062
|
-
}
|
3063
3269
|
// move this stuff to connect
|
3064
3270
|
// async getDashboardURL(compact = true) {
|
3065
3271
|
// const baseUrl = 'https://dashboard.fireproof.storage/'
|
@@ -3364,7 +3570,7 @@ var import_sha26 = require("multiformats/hashes/sha2");
|
|
3364
3570
|
var codec2 = __toESM(require("@ipld/dag-cbor"), 1);
|
3365
3571
|
var import_charwise = __toESM(require("charwise"), 1);
|
3366
3572
|
var DbIndex = __toESM(require("prolly-trees/db-index"), 1);
|
3367
|
-
var
|
3573
|
+
var import_utils17 = require("prolly-trees/utils");
|
3368
3574
|
var import_cache = require("prolly-trees/cache");
|
3369
3575
|
var IndexTree = class {
|
3370
3576
|
};
|
@@ -3372,17 +3578,17 @@ function refCompare(aRef, bRef) {
|
|
3372
3578
|
if (Number.isNaN(aRef)) return -1;
|
3373
3579
|
if (Number.isNaN(bRef)) throw new Error("ref may not be Infinity or NaN");
|
3374
3580
|
if (aRef === Infinity) return 1;
|
3375
|
-
return (0,
|
3581
|
+
return (0, import_utils17.simpleCompare)(aRef, bRef);
|
3376
3582
|
}
|
3377
3583
|
function compare(a, b) {
|
3378
3584
|
const [aKey, aRef] = a;
|
3379
3585
|
const [bKey, bRef] = b;
|
3380
|
-
const comp = (0,
|
3586
|
+
const comp = (0, import_utils17.simpleCompare)(aKey, bKey);
|
3381
3587
|
if (comp !== 0) return comp;
|
3382
3588
|
return refCompare(aRef, bRef);
|
3383
3589
|
}
|
3384
|
-
var byKeyOpts = { cache: import_cache.nocache, chunker: (0,
|
3385
|
-
var byIdOpts = { cache: import_cache.nocache, chunker: (0,
|
3590
|
+
var byKeyOpts = { cache: import_cache.nocache, chunker: (0, import_utils17.bf)(30), codec: codec2, hasher: import_sha26.sha256, compare };
|
3591
|
+
var byIdOpts = { cache: import_cache.nocache, chunker: (0, import_utils17.bf)(30), codec: codec2, hasher: import_sha26.sha256, compare: import_utils17.simpleCompare };
|
3386
3592
|
function indexEntriesForChanges(changes, mapFn) {
|
3387
3593
|
const indexEntries = [];
|
3388
3594
|
changes.forEach(({ id: key, value, del }) => {
|
@@ -3690,7 +3896,7 @@ var Index = class {
|
|
3690
3896
|
// src/crdt-clock.ts
|
3691
3897
|
var import_clock3 = require("@web3-storage/pail/clock");
|
3692
3898
|
var import_crdt2 = require("@web3-storage/pail/crdt");
|
3693
|
-
var
|
3899
|
+
var import_cement15 = require("@adviser/cement");
|
3694
3900
|
|
3695
3901
|
// src/apply-head-queue.ts
|
3696
3902
|
function applyHeadQueue(worker, logger) {
|
@@ -3748,7 +3954,7 @@ var CRDTClock = class {
|
|
3748
3954
|
this.zoomers = /* @__PURE__ */ new Set();
|
3749
3955
|
this.watchers = /* @__PURE__ */ new Set();
|
3750
3956
|
this.emptyWatchers = /* @__PURE__ */ new Set();
|
3751
|
-
this._ready = new
|
3957
|
+
this._ready = new import_cement15.ResolveOnce();
|
3752
3958
|
this.blockstore = blockstore;
|
3753
3959
|
this.logger = ensureLogger(blockstore.sthis, "CRDTClock");
|
3754
3960
|
this.applyHeadQueue = applyHeadQueue(this.int_applyHead.bind(this), this.logger);
|
@@ -3860,7 +4066,7 @@ init_utils();
|
|
3860
4066
|
var CRDT = class {
|
3861
4067
|
constructor(sthis, name, opts = {}) {
|
3862
4068
|
this.indexers = /* @__PURE__ */ new Map();
|
3863
|
-
this.onceReady = new
|
4069
|
+
this.onceReady = new import_cement16.ResolveOnce();
|
3864
4070
|
this.sthis = sthis;
|
3865
4071
|
this.name = name;
|
3866
4072
|
this.logger = ensureLogger(sthis, "CRDT");
|
@@ -3926,7 +4132,8 @@ var CRDT = class {
|
|
3926
4132
|
try {
|
3927
4133
|
await Promise.all([this.blockstore.ready(), this.indexBlockstore.ready(), this.clock.ready()]);
|
3928
4134
|
} catch (e) {
|
3929
|
-
|
4135
|
+
const ee = e;
|
4136
|
+
throw this.logger.Error().Err(e).Msg(`CRDT is not ready: ${ee.stack}`).AsError();
|
3930
4137
|
}
|
3931
4138
|
});
|
3932
4139
|
}
|
@@ -3981,7 +4188,7 @@ var Database = class {
|
|
3981
4188
|
this._listening = false;
|
3982
4189
|
this._listeners = /* @__PURE__ */ new Set();
|
3983
4190
|
this._noupdate_listeners = /* @__PURE__ */ new Set();
|
3984
|
-
this._ready = new
|
4191
|
+
this._ready = new import_cement17.ResolveOnce();
|
3985
4192
|
this.name = name;
|
3986
4193
|
this.opts = opts || this.opts;
|
3987
4194
|
this.sthis = ensureSuperThis(this.opts);
|
@@ -4159,41 +4366,11 @@ function makeName(fnString) {
|
|
4159
4366
|
}
|
4160
4367
|
}
|
4161
4368
|
|
4162
|
-
// src/runtime/index.ts
|
4163
|
-
var runtime_exports = {};
|
4164
|
-
__export(runtime_exports, {
|
4165
|
-
FILESTORE_VERSION: () => FILESTORE_VERSION,
|
4166
|
-
INDEXDB_VERSION: () => INDEXDB_VERSION,
|
4167
|
-
files: () => files_exports,
|
4168
|
-
getFileName: () => getFileName,
|
4169
|
-
getFileSystem: () => getFileSystem,
|
4170
|
-
getPath: () => getPath,
|
4171
|
-
kb: () => key_bag_exports,
|
4172
|
-
kc: () => keyed_crypto_exports,
|
4173
|
-
mf: () => wait_pr_multiformats_exports,
|
4174
|
-
toArrayBuffer: () => toArrayBuffer
|
4175
|
-
});
|
4176
|
-
init_utils2();
|
4177
|
-
|
4178
|
-
// src/runtime/wait-pr-multiformats/index.ts
|
4179
|
-
var wait_pr_multiformats_exports = {};
|
4180
|
-
__export(wait_pr_multiformats_exports, {
|
4181
|
-
block: () => block_exports,
|
4182
|
-
codec: () => codec_interface_exports
|
4183
|
-
});
|
4184
|
-
|
4185
|
-
// src/runtime/wait-pr-multiformats/codec-interface.ts
|
4186
|
-
var codec_interface_exports = {};
|
4187
|
-
|
4188
|
-
// src/runtime/index.ts
|
4189
|
-
init_version();
|
4190
|
-
init_version2();
|
4191
|
-
|
4192
4369
|
// src/index.ts
|
4193
4370
|
init_utils();
|
4194
4371
|
|
4195
4372
|
// src/version.ts
|
4196
4373
|
var PACKAGE_VERSION = Object.keys({
|
4197
|
-
"0.19.
|
4374
|
+
"0.19.11-dev-dryrun": "xxxx"
|
4198
4375
|
})[0];
|
4199
4376
|
//# sourceMappingURL=index.cjs.map
|