@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.
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