@fireproof/core 0.19.9-dev-frag → 0.19.11-dev-dryrun

Sign up to get free protection for your applications and to get access to all the features.
Files changed (46) hide show
  1. package/README.md +27 -0
  2. package/{chunk-YS4GL6OK.js → chunk-MAK4D54P.js} +20 -6
  3. package/chunk-MAK4D54P.js.map +1 -0
  4. package/{chunk-JO5AVWG7.js → chunk-XINRLWR3.js} +14 -6
  5. package/chunk-XINRLWR3.js.map +1 -0
  6. package/deno.json +20 -0
  7. package/{gateway-IZRHJWPE.js → gateway-7OM6OSYK.js} +3 -4
  8. package/gateway-7OM6OSYK.js.map +1 -0
  9. package/{gateway-YSNUK2L3.js → gateway-VWWKLHUI.js} +4 -5
  10. package/{gateway-YSNUK2L3.js.map → gateway-VWWKLHUI.js.map} +1 -1
  11. package/index.cjs +549 -372
  12. package/index.cjs.map +1 -1
  13. package/index.d.cts +75 -51
  14. package/index.d.ts +75 -51
  15. package/index.global.js +21461 -15114
  16. package/index.global.js.map +1 -1
  17. package/index.js +465 -313
  18. package/index.js.map +1 -1
  19. package/{key-bag-file-NMEBFSPM.js → key-bag-file-DFMW6ZM6.js} +3 -3
  20. package/{key-bag-indexdb-X5V6GNBZ.js → key-bag-indexdb-R2RWGSQ4.js} +3 -3
  21. package/key-bag-indexdb-R2RWGSQ4.js.map +1 -0
  22. package/{mem-filesystem-B6C6QOIP.js → mem-filesystem-BZQZLUR6.js} +3 -3
  23. package/metafile-cjs.json +1 -1
  24. package/metafile-esm.json +1 -1
  25. package/metafile-iife.json +1 -1
  26. package/{node-filesystem-5JLBSHKQ.js → node-filesystem-7YZR3POJ.js} +8 -4
  27. package/node-filesystem-7YZR3POJ.js.map +1 -0
  28. package/package.json +8 -5
  29. package/tests/blockstore/keyed-crypto.test.ts +34 -4
  30. package/tests/blockstore/store.test.ts +18 -13
  31. package/tests/fireproof/all-gateway.test.ts +395 -0
  32. package/tests/fireproof/cars/bafkreidxwt2nhvbl4fnqfw3ctlt6zbrir4kqwmjo5im6rf4q5si27kgo2i.car +0 -0
  33. package/tests/fireproof/cars/bafkreidxwt2nhvbl4fnqfw3ctlt6zbrir4kqwmjo5im6rf4q5si27kgo2i.js +316 -0
  34. package/tests/fireproof/convert_uint8.py +27 -0
  35. package/tests/fireproof/fireproof.test.ts +18 -18
  36. package/tests/fireproof/hello.test.ts +33 -19
  37. package/tests/helpers.ts +7 -4
  38. package/{utils-IZPK4QS7.js → utils-AISQB3PB.js} +3 -3
  39. package/chunk-JO5AVWG7.js.map +0 -1
  40. package/chunk-YS4GL6OK.js.map +0 -1
  41. package/gateway-IZRHJWPE.js.map +0 -1
  42. package/key-bag-indexdb-X5V6GNBZ.js.map +0 -1
  43. package/node-filesystem-5JLBSHKQ.js.map +0 -1
  44. /package/{key-bag-file-NMEBFSPM.js.map → key-bag-file-DFMW6ZM6.js.map} +0 -0
  45. /package/{mem-filesystem-B6C6QOIP.js.map → mem-filesystem-BZQZLUR6.js.map} +0 -0
  46. /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 "node":
379
- case "sys":
380
- default: {
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, import_cement4, KeyBagProviderIndexDB;
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
- import_cement4 = require("@adviser/cement");
523
+ import_cement5 = require("@adviser/cement");
499
524
  KeyBagProviderIndexDB = class {
500
525
  constructor(url, sthis) {
501
- this._db = new import_cement4.ResolveOnce();
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 import_cement8, versionFiles, FileGateway, FileTestStore;
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
- import_cement8 = require("@adviser/cement");
594
+ import_cement12 = require("@adviser/cement");
561
595
  init_utils();
562
596
  init_utils2();
563
- versionFiles = new import_cement8.KeyedResolvOnce();
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 import_cement8.Result.Ok(baseUrl.build().setParam("key", key).URI());
642
+ return import_cement12.Result.Ok(baseUrl.build().setParam("key", key).URI());
609
643
  }
610
644
  async close() {
611
- return import_cement8.Result.Ok(void 0);
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 import_cement8.Result.Ok(new Uint8Array(res));
666
+ return import_cement12.Result.Ok(new Uint8Array(res));
633
667
  } catch (e) {
634
668
  if (isNotFoundError(e)) {
635
- return import_cement8.Result.Err(new NotFoundError(`file not found: ${file}`));
669
+ return import_cement12.Result.Err(new NotFoundError(`file not found: ${file}`));
636
670
  }
637
- return import_cement8.Result.Err(e);
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 import_cement8.Result.Ok(void 0);
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, import_cement9, onceIndexDB, IndexDBGateway, IndexDBTestStore;
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
- import_cement9 = require("@adviser/cement");
787
+ import_cement13 = require("@adviser/cement");
763
788
  init_version2();
764
789
  init_utils();
765
- onceIndexDB = new import_cement9.KeyedResolvOnce();
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 import_cement9.Result.Ok(void 0);
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(import_cement9.Result.Ok(baseUrl.build().setParam("key", key).URI()));
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 import_cement9.Result.Err(new NotFoundError(`missing ${key}`));
838
+ return import_cement13.Result.Err(new NotFoundError(`missing ${key}`));
814
839
  }
815
- return import_cement9.Result.Ok(bytes);
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 import_cement9.Result.Ok(void 0);
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 import_cement13 = require("@adviser/cement");
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 import_cement12 = require("@adviser/cement");
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 import_cement10 = require("@adviser/cement");
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 import_cement7 = require("@adviser/cement");
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 import_cement6 = require("@adviser/cement");
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 import_cement5 = require("@adviser/cement");
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._seq = new import_cement5.ResolveSeq();
1421
- this.logger = ensureLogger(rt.sthis, "KeyBag", {
1422
- id: rt.id()
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
- false,
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 import_cement5.Result.Ok(url);
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 import_cement5.Result.Ok(urb.URI());
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 import_cement5.Result.Ok(url);
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 import_cement5.Result.Ok({
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 import_cement5.Result.Err(new Error(`Key not found: ${name}`));
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 = import_cement5.URI.from(kbo.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, import_cement5.runtimeFn)().isBrowser) {
1540
- url = import_cement5.URI.from(bagFnameOrUrl || "indexdb://fp-keybag");
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 = import_cement5.URI.from(`file://${bagFnameOrUrl}`);
1592
+ url = import_cement6.URI.from(`file://${bagFnameOrUrl}`);
1546
1593
  } else {
1547
- url = import_cement5.URI.from(bagFnameOrUrl);
1594
+ url = import_cement6.URI.from(bagFnameOrUrl);
1548
1595
  }
1549
1596
  }
1550
1597
  logger.Debug().Url(url).Msg("from env");
1551
1598
  }
1552
- let keyProviderFactory;
1553
- switch (url.protocol) {
1554
- case "file:":
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, import_cement5.toCryptoRuntime)({}),
1609
+ crypto: kbo.crypto || (0, import_cement6.toCryptoRuntime)({}),
1575
1610
  sthis,
1576
1611
  logger,
1577
1612
  keyLength: kbo.keyLength || 16,
1578
- getBag: keyProviderFactory,
1613
+ getBag,
1579
1614
  id: () => {
1580
1615
  return url.toString();
1581
1616
  }
1582
1617
  };
1583
1618
  }
1584
- var _keyBags = new import_cement5.KeyedResolvOnce();
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 import_cement6.ResolveOnce();
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 = this.ebOpts.meta ? [this.ebOpts.meta] : await (await this.metaStore()).load("main");
1751
- if (metas) {
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 * 8);
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
- import_cement.Result.Ok({
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(import_cement.Result.Ok(firstFragment))];
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 import_cement.Result.Err(logger.Error().Msg("Fragment fid mismatch").AsError());
2344
+ return import_cement8.Result.Err(logger.Error().Msg("Fragment fid mismatch").AsError());
2255
2345
  }
2256
2346
  if (fragment.ofs !== ofs2) {
2257
- return import_cement.Result.Err(logger.Error().Uint64("ofs", ofs2).Msg("Fragment ofs mismatch").AsError());
2347
+ return import_cement8.Result.Err(logger.Error().Uint64("ofs", ofs2).Msg("Fragment ofs mismatch").AsError());
2258
2348
  }
2259
- return import_cement.Result.Ok(fragment);
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 import_cement.Result.Ok(void 0);
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 import_cement.Result.Err(rfrag.Err());
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 import_cement.Result.Ok(buffer || new Uint8Array(0));
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 import_cement.Result.Err(rfrag.Err());
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 import_cement.Result.Ok(void 0);
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 import_cement7.Result.Err(`missing version: ${url.toString()}`);
2470
+ return import_cement9.Result.Err(`missing version: ${url.toString()}`);
2355
2471
  }
2356
- return import_cement7.Result.Ok(url);
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 import_cement7.Result.Ok(void 0);
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 import_cement7.ResolveOnce();
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 import_cement7.Result.Ok(void 0);
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 = import_cement10.URI.from(obuItem.overrideBaseURL);
3042
+ obuUrl = import_cement14.URI.from(obuItem.overrideBaseURL);
2770
3043
  }
2771
3044
  const ret = ensureIsIndex(
2772
- import_cement10.URI.from(optURL || obuUrl || dataDir(loader.sthis, loader.name, storeOpts.stores?.base)),
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 import_cement10.KeyedResolvOnce();
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
- const gateway = await getGatewayFromURL(url, sthis);
2823
- if (!gateway) {
2824
- throw sthis.logger.Error().Url(url).Msg("gateway not found").AsError();
2825
- }
2826
- const store = new DataStoreImpl(sthis, loader.name, url, {
2827
- gateway: gateway.gateway,
2828
- keybag: () => getKeyBag(loader.sthis, {
2829
- ...loader.ebOpts.keyBag
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
- sthis.logger.Debug().Str("protocol", url.protocol).Msg("pre-protocol switch");
2838
- const gateway = await getGatewayFromURL(url, sthis);
2839
- if (!gateway) {
2840
- throw sthis.logger.Error().Url(url).Msg("gateway not found").AsError();
2841
- }
2842
- const store = new MetaStoreImpl(loader.sthis, loader.name, url, {
2843
- gateway: gateway.gateway,
2844
- keybag: () => getKeyBag(loader.sthis, {
2845
- ...loader.ebOpts.keyBag
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
- const gateway = await getGatewayFromURL(url, sthis);
2854
- if (!gateway) {
2855
- throw sthis.logger.Error().Url(url).Msg("gateway not found").AsError();
2856
- }
2857
- sthis.logger.Debug().Str("prepared", url.toString()).Msg("produced");
2858
- const store = new WALStoreImpl(loader, url, {
2859
- gateway: gateway.gateway,
2860
- keybag: () => getKeyBag(loader.sthis, {
2861
- ...loader.ebOpts.keyBag
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 (logger) => {
3185
+ gateway: async (sthis) => {
2904
3186
  const { FileGateway: FileGateway2 } = await Promise.resolve().then(() => (init_gateway(), gateway_exports));
2905
- return new FileGateway2(logger);
3187
+ return new FileGateway2(sthis);
2906
3188
  },
2907
- test: async (logger) => {
3189
+ test: async (sthis) => {
2908
3190
  const { FileTestStore: FileTestStore2 } = await Promise.resolve().then(() => (init_gateway(), gateway_exports));
2909
- return new FileTestStore2(logger);
3191
+ return new FileTestStore2(sthis);
2910
3192
  }
2911
3193
  });
2912
3194
  registerStoreProtocol({
2913
3195
  protocol: "indexdb:",
2914
- gateway: async (logger) => {
3196
+ gateway: async (sthis) => {
2915
3197
  const { IndexDBGateway: IndexDBGateway2 } = await Promise.resolve().then(() => (init_gateway2(), gateway_exports2));
2916
- return new IndexDBGateway2(logger);
3198
+ return new IndexDBGateway2(sthis);
2917
3199
  },
2918
- test: async (logger) => {
3200
+ test: async (sthis) => {
2919
3201
  const { IndexDBTestStore: IndexDBTestStore2 } = await Promise.resolve().then(() => (init_gateway2(), gateway_exports2));
2920
- return new IndexDBTestStore2(logger);
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("main");
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 name = metaUrl.toString();
3017
- const remote = await RemoteMetaStore(loader.sthis, name, metaUrl, {
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("main").then(async () => {
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.toString();
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 import_utils15 = require("prolly-trees/utils");
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, import_utils15.simpleCompare)(aRef, bRef);
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, import_utils15.simpleCompare)(aKey, bKey);
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, import_utils15.bf)(30), codec: codec2, hasher: import_sha26.sha256, compare };
3385
- var byIdOpts = { cache: import_cache.nocache, chunker: (0, import_utils15.bf)(30), codec: codec2, hasher: import_sha26.sha256, compare: import_utils15.simpleCompare };
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 import_cement11 = require("@adviser/cement");
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 import_cement11.ResolveOnce();
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 import_cement12.ResolveOnce();
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
- throw this.logger.Error().Err(e).Msg("CRDT not ready").AsError();
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 import_cement13.ResolveOnce();
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.9-dev-frag": "xxxx"
4374
+ "0.19.11-dev-dryrun": "xxxx"
4198
4375
  })[0];
4199
4376
  //# sourceMappingURL=index.cjs.map