@fireproof/core 0.16.7 → 0.17.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +15 -6
- package/dist/browser/fireproof.cjs +62 -56
- package/dist/browser/fireproof.cjs.map +1 -1
- package/dist/browser/fireproof.d.cts +4 -4
- package/dist/browser/fireproof.d.ts +4 -4
- package/dist/browser/fireproof.global.js +713 -275
- package/dist/browser/fireproof.global.js.map +1 -1
- package/dist/browser/fireproof.js +64 -58
- package/dist/browser/fireproof.js.map +1 -1
- package/dist/browser/metafile-cjs.json +1 -1
- package/dist/browser/metafile-esm.json +1 -1
- package/dist/browser/metafile-iife.json +1 -1
- package/dist/memory/fireproof.cjs +62 -56
- package/dist/memory/fireproof.cjs.map +1 -1
- package/dist/memory/fireproof.d.cts +4 -4
- package/dist/memory/fireproof.d.ts +4 -4
- package/dist/memory/fireproof.global.js +713 -275
- package/dist/memory/fireproof.global.js.map +1 -1
- package/dist/memory/fireproof.js +64 -58
- package/dist/memory/fireproof.js.map +1 -1
- package/dist/memory/metafile-cjs.json +1 -1
- package/dist/memory/metafile-esm.json +1 -1
- package/dist/memory/metafile-iife.json +1 -1
- package/dist/node/fireproof.cjs +62 -56
- package/dist/node/fireproof.cjs.map +1 -1
- package/dist/node/fireproof.d.cts +4 -4
- package/dist/node/fireproof.d.ts +4 -4
- package/dist/node/fireproof.global.js +713 -275
- package/dist/node/fireproof.global.js.map +1 -1
- package/dist/node/fireproof.js +64 -58
- package/dist/node/fireproof.js.map +1 -1
- package/dist/node/metafile-cjs.json +1 -1
- package/dist/node/metafile-esm.json +1 -1
- package/dist/node/metafile-iife.json +1 -1
- package/package.json +4 -7
@@ -925,7 +925,7 @@ var Fireproof = (() => {
|
|
925
925
|
this.tail = this.head;
|
926
926
|
this.states = null;
|
927
927
|
}
|
928
|
-
var
|
928
|
+
var create18 = function create19() {
|
929
929
|
return util.Buffer ? function create_buffer_setup() {
|
930
930
|
return (Writer.create = function create_buffer() {
|
931
931
|
return new BufferWriter();
|
@@ -934,7 +934,7 @@ var Fireproof = (() => {
|
|
934
934
|
return new Writer();
|
935
935
|
};
|
936
936
|
};
|
937
|
-
Writer.create =
|
937
|
+
Writer.create = create18();
|
938
938
|
Writer.alloc = function alloc3(size) {
|
939
939
|
return new util.Array(size);
|
940
940
|
};
|
@@ -1080,7 +1080,7 @@ var Fireproof = (() => {
|
|
1080
1080
|
};
|
1081
1081
|
Writer._configure = function(BufferWriter_) {
|
1082
1082
|
BufferWriter = BufferWriter_;
|
1083
|
-
Writer.create =
|
1083
|
+
Writer.create = create18();
|
1084
1084
|
BufferWriter._configure();
|
1085
1085
|
};
|
1086
1086
|
}
|
@@ -1163,14 +1163,14 @@ var Fireproof = (() => {
|
|
1163
1163
|
return new Reader(buffer2);
|
1164
1164
|
throw Error("illegal buffer");
|
1165
1165
|
};
|
1166
|
-
var
|
1166
|
+
var create18 = function create19() {
|
1167
1167
|
return util.Buffer ? function create_buffer_setup(buffer2) {
|
1168
1168
|
return (Reader.create = function create_buffer(buffer3) {
|
1169
1169
|
return util.Buffer.isBuffer(buffer3) ? new BufferReader(buffer3) : create_array(buffer3);
|
1170
1170
|
})(buffer2);
|
1171
1171
|
} : create_array;
|
1172
1172
|
};
|
1173
|
-
Reader.create =
|
1173
|
+
Reader.create = create18();
|
1174
1174
|
Reader.prototype._slice = util.Array.prototype.subarray || /* istanbul ignore next */
|
1175
1175
|
util.Array.prototype.slice;
|
1176
1176
|
Reader.prototype.uint32 = /* @__PURE__ */ function read_uint32_setup() {
|
@@ -1338,7 +1338,7 @@ var Fireproof = (() => {
|
|
1338
1338
|
};
|
1339
1339
|
Reader._configure = function(BufferReader_) {
|
1340
1340
|
BufferReader = BufferReader_;
|
1341
|
-
Reader.create =
|
1341
|
+
Reader.create = create18();
|
1342
1342
|
BufferReader._configure();
|
1343
1343
|
var fn = util.Long ? "toLong" : (
|
1344
1344
|
/* istanbul ignore next */
|
@@ -1493,13 +1493,13 @@ var Fireproof = (() => {
|
|
1493
1493
|
protobuf.util = require_minimal();
|
1494
1494
|
protobuf.rpc = require_rpc();
|
1495
1495
|
protobuf.roots = require_roots();
|
1496
|
-
protobuf.configure =
|
1497
|
-
function
|
1496
|
+
protobuf.configure = configure6;
|
1497
|
+
function configure6() {
|
1498
1498
|
protobuf.util._configure();
|
1499
1499
|
protobuf.Writer._configure(protobuf.BufferWriter);
|
1500
1500
|
protobuf.Reader._configure(protobuf.BufferReader);
|
1501
1501
|
}
|
1502
|
-
|
1502
|
+
configure6();
|
1503
1503
|
}
|
1504
1504
|
});
|
1505
1505
|
|
@@ -4060,24 +4060,41 @@ var Fireproof = (() => {
|
|
4060
4060
|
var cidSymbol = Symbol.for("@ipld/js-cid/CID");
|
4061
4061
|
|
4062
4062
|
// ../../node_modules/.pnpm/multiformats@12.1.3/node_modules/multiformats/src/link.js
|
4063
|
+
var isLink = (value) => {
|
4064
|
+
if (value == null) {
|
4065
|
+
return false;
|
4066
|
+
}
|
4067
|
+
const withSlash = (
|
4068
|
+
/** @type {{'/'?: Uint8Array, bytes: Uint8Array}} */
|
4069
|
+
value
|
4070
|
+
);
|
4071
|
+
if (withSlash["/"] != null && withSlash["/"] === withSlash.bytes) {
|
4072
|
+
return true;
|
4073
|
+
}
|
4074
|
+
const withAsCID = (
|
4075
|
+
/** @type {{'asCID'?: unknown}} */
|
4076
|
+
value
|
4077
|
+
);
|
4078
|
+
if (withAsCID.asCID === value) {
|
4079
|
+
return true;
|
4080
|
+
}
|
4081
|
+
return false;
|
4082
|
+
};
|
4063
4083
|
var parse = (source, base4) => CID.parse(source, base4);
|
4064
4084
|
|
4065
|
-
// ../../node_modules/.pnpm/@
|
4085
|
+
// ../../node_modules/.pnpm/@web3-storage+pail@0.4.0/node_modules/@web3-storage/pail/src/block.js
|
4066
4086
|
var MemoryBlockstore = class {
|
4067
4087
|
/** @type {Map<string, Uint8Array>} */
|
4068
4088
|
#blocks = /* @__PURE__ */ new Map();
|
4069
4089
|
/**
|
4070
|
-
* @param {Array<
|
4090
|
+
* @param {Array<import('multiformats').Block>} [blocks]
|
4071
4091
|
*/
|
4072
4092
|
constructor(blocks) {
|
4073
4093
|
if (blocks) {
|
4074
4094
|
this.#blocks = new Map(blocks.map((b) => [b.cid.toString(), b.bytes]));
|
4075
4095
|
}
|
4076
4096
|
}
|
4077
|
-
/**
|
4078
|
-
* @param {import('./link').AnyLink} cid
|
4079
|
-
* @returns {Promise<AnyBlock | undefined>}
|
4080
|
-
*/
|
4097
|
+
/** @type {API.BlockFetcher['get']} */
|
4081
4098
|
async get(cid) {
|
4082
4099
|
const bytes = this.#blocks.get(cid.toString());
|
4083
4100
|
if (!bytes)
|
@@ -4085,24 +4102,24 @@ var Fireproof = (() => {
|
|
4085
4102
|
return { cid, bytes };
|
4086
4103
|
}
|
4087
4104
|
/**
|
4088
|
-
* @param {
|
4105
|
+
* @param {API.UnknownLink} cid
|
4089
4106
|
* @param {Uint8Array} bytes
|
4090
4107
|
*/
|
4091
4108
|
async put(cid, bytes) {
|
4092
4109
|
this.#blocks.set(cid.toString(), bytes);
|
4093
4110
|
}
|
4094
4111
|
/**
|
4095
|
-
* @param {
|
4112
|
+
* @param {API.UnknownLink} cid
|
4096
4113
|
* @param {Uint8Array} bytes
|
4097
4114
|
*/
|
4098
4115
|
putSync(cid, bytes) {
|
4099
4116
|
this.#blocks.set(cid.toString(), bytes);
|
4100
4117
|
}
|
4101
|
-
/** @param {
|
4118
|
+
/** @param {API.UnknownLink} cid */
|
4102
4119
|
async delete(cid) {
|
4103
4120
|
this.#blocks.delete(cid.toString());
|
4104
4121
|
}
|
4105
|
-
/** @param {
|
4122
|
+
/** @param {API.UnknownLink} cid */
|
4106
4123
|
deleteSync(cid) {
|
4107
4124
|
this.#blocks.delete(cid.toString());
|
4108
4125
|
}
|
@@ -4113,13 +4130,13 @@ var Fireproof = (() => {
|
|
4113
4130
|
}
|
4114
4131
|
};
|
4115
4132
|
var MultiBlockFetcher = class {
|
4116
|
-
/** @type {BlockFetcher[]} */
|
4133
|
+
/** @type {API.BlockFetcher[]} */
|
4117
4134
|
#fetchers;
|
4118
|
-
/** @param {BlockFetcher[]} fetchers */
|
4135
|
+
/** @param {API.BlockFetcher[]} fetchers */
|
4119
4136
|
constructor(...fetchers) {
|
4120
4137
|
this.#fetchers = fetchers;
|
4121
4138
|
}
|
4122
|
-
/** @
|
4139
|
+
/** @type {API.BlockFetcher['get']} */
|
4123
4140
|
async get(link2) {
|
4124
4141
|
for (const f of this.#fetchers) {
|
4125
4142
|
const v = await f.get(link2);
|
@@ -4368,10 +4385,10 @@ var Fireproof = (() => {
|
|
4368
4385
|
* @param {any} [value]
|
4369
4386
|
* @param {number} [encodedLength]
|
4370
4387
|
*/
|
4371
|
-
constructor(type2, value,
|
4388
|
+
constructor(type2, value, encodedLength2) {
|
4372
4389
|
this.type = type2;
|
4373
4390
|
this.value = value;
|
4374
|
-
this.encodedLength =
|
4391
|
+
this.encodedLength = encodedLength2;
|
4375
4392
|
this.encodedBytes = void 0;
|
4376
4393
|
this.byteValue = void 0;
|
4377
4394
|
}
|
@@ -10122,6 +10139,22 @@ You can use close({ resize: true }) to resize header`);
|
|
10122
10139
|
async commit(t, done, opts = { noLoader: false, compact: false }) {
|
10123
10140
|
return this.commitQueue.enqueue(() => this._commitInternal(t, done, opts));
|
10124
10141
|
}
|
10142
|
+
async cacheTransaction(t) {
|
10143
|
+
for await (const block of t.entries()) {
|
10144
|
+
const sBlock = block.cid.toString();
|
10145
|
+
if (!this.getBlockCache.has(sBlock)) {
|
10146
|
+
this.getBlockCache.set(sBlock, block);
|
10147
|
+
}
|
10148
|
+
}
|
10149
|
+
}
|
10150
|
+
async cacheCarReader(reader) {
|
10151
|
+
for await (const block of reader.blocks()) {
|
10152
|
+
const sBlock = block.cid.toString();
|
10153
|
+
if (!this.getBlockCache.has(sBlock)) {
|
10154
|
+
this.getBlockCache.set(sBlock, block);
|
10155
|
+
}
|
10156
|
+
}
|
10157
|
+
}
|
10125
10158
|
async _commitInternal(t, done, opts = { noLoader: false, compact: false }) {
|
10126
10159
|
await this.ready;
|
10127
10160
|
const header = done;
|
@@ -10129,6 +10162,7 @@ You can use close({ resize: true }) to resize header`);
|
|
10129
10162
|
let roots = await this.prepareRoots(fp, t);
|
10130
10163
|
const { cid, bytes } = await this.prepareCarFile(roots[0], t, !!opts.public);
|
10131
10164
|
await this.carStore.save({ cid, bytes });
|
10165
|
+
await this.cacheTransaction(t);
|
10132
10166
|
const newDbMeta = { car: cid, key: this.key || null };
|
10133
10167
|
await this.remoteWAL.enqueue(newDbMeta, opts);
|
10134
10168
|
await this.metaStore.save(newDbMeta);
|
@@ -10181,13 +10215,8 @@ You can use close({ resize: true }) to resize header`);
|
|
10181
10215
|
}
|
10182
10216
|
async *entries() {
|
10183
10217
|
await this.ready;
|
10184
|
-
for (const
|
10185
|
-
|
10186
|
-
if (!reader)
|
10187
|
-
throw new Error(`missing car reader ${cid.toString()}`);
|
10188
|
-
for await (const block of reader.blocks()) {
|
10189
|
-
yield block;
|
10190
|
-
}
|
10218
|
+
for (const [, block] of this.getBlockCache) {
|
10219
|
+
yield block;
|
10191
10220
|
}
|
10192
10221
|
}
|
10193
10222
|
async getBlock(cid) {
|
@@ -10202,10 +10231,9 @@ You can use close({ resize: true }) to resize header`);
|
|
10202
10231
|
if (!reader) {
|
10203
10232
|
throw new Error(`missing car reader ${carCid.toString()}`);
|
10204
10233
|
}
|
10205
|
-
|
10206
|
-
if (
|
10207
|
-
return
|
10208
|
-
}
|
10234
|
+
await this.cacheCarReader(reader);
|
10235
|
+
if (this.getBlockCache.has(sCid))
|
10236
|
+
return this.getBlockCache.get(sCid);
|
10209
10237
|
throw new Error(`block not in reader: ${cid.toString()}`);
|
10210
10238
|
})
|
10211
10239
|
).catch(() => void 0);
|
@@ -10258,7 +10286,7 @@ You can use close({ resize: true }) to resize header`);
|
|
10258
10286
|
}
|
10259
10287
|
async ensureDecryptedReader(reader) {
|
10260
10288
|
const theKey = await this._getKey();
|
10261
|
-
if (!(theKey && this.ebOpts.crypto))
|
10289
|
+
if (this.ebOpts.public || !(theKey && this.ebOpts.crypto))
|
10262
10290
|
return reader;
|
10263
10291
|
const { blocks, root: root2 } = await decodeEncryptedCar(this.ebOpts.crypto, theKey, reader);
|
10264
10292
|
return {
|
@@ -10336,8 +10364,10 @@ You can use close({ resize: true }) to resize header`);
|
|
10336
10364
|
if (this.ebOpts.autoCompact && this.loader.carLog.length > this.ebOpts.autoCompact) {
|
10337
10365
|
setTimeout(() => void this.compact(), 10);
|
10338
10366
|
}
|
10339
|
-
if (car)
|
10367
|
+
if (car) {
|
10368
|
+
this.transactions.delete(t);
|
10340
10369
|
return { ...done, car };
|
10370
|
+
}
|
10341
10371
|
throw new Error("failed to commit car");
|
10342
10372
|
}
|
10343
10373
|
return done;
|
@@ -10388,13 +10418,19 @@ You can use close({ resize: true }) to resize header`);
|
|
10388
10418
|
}
|
10389
10419
|
async *entries() {
|
10390
10420
|
const seen = /* @__PURE__ */ new Set();
|
10391
|
-
|
10392
|
-
for await (const blk of
|
10393
|
-
if (seen.has(blk.cid.toString()))
|
10394
|
-
continue;
|
10395
|
-
seen.add(blk.cid.toString());
|
10421
|
+
if (this.loader) {
|
10422
|
+
for await (const blk of this.loader.entries()) {
|
10396
10423
|
yield blk;
|
10397
10424
|
}
|
10425
|
+
} else {
|
10426
|
+
for (const t of this.transactions) {
|
10427
|
+
for await (const blk of t.entries()) {
|
10428
|
+
if (seen.has(blk.cid.toString()))
|
10429
|
+
continue;
|
10430
|
+
seen.add(blk.cid.toString());
|
10431
|
+
yield blk;
|
10432
|
+
}
|
10433
|
+
}
|
10398
10434
|
}
|
10399
10435
|
}
|
10400
10436
|
};
|
@@ -10945,8 +10981,8 @@ You can use close({ resize: true }) to resize header`);
|
|
10945
10981
|
}
|
10946
10982
|
};
|
10947
10983
|
|
10948
|
-
// ../../node_modules/.pnpm/@
|
10949
|
-
async
|
10984
|
+
// ../../node_modules/.pnpm/@web3-storage+pail@0.4.0/node_modules/@web3-storage/pail/src/clock/index.js
|
10985
|
+
var advance = async (blocks, head, event) => {
|
10950
10986
|
const events = new EventFetcher(blocks);
|
10951
10987
|
const headmap = new Map(head.map((cid) => [cid.toString(), cid]));
|
10952
10988
|
if (headmap.has(event.toString()))
|
@@ -10968,11 +11004,11 @@ You can use close({ resize: true }) to resize header`);
|
|
10968
11004
|
}
|
10969
11005
|
}
|
10970
11006
|
return head.concat(event);
|
10971
|
-
}
|
11007
|
+
};
|
10972
11008
|
var EventBlock = class extends Block {
|
10973
11009
|
/**
|
10974
11010
|
* @param {object} config
|
10975
|
-
* @param {EventLink<T>} config.cid
|
11011
|
+
* @param {API.EventLink<T>} config.cid
|
10976
11012
|
* @param {Event} config.value
|
10977
11013
|
* @param {Uint8Array} config.bytes
|
10978
11014
|
* @param {string} config.prefix
|
@@ -10984,20 +11020,20 @@ You can use close({ resize: true }) to resize header`);
|
|
10984
11020
|
/**
|
10985
11021
|
* @template T
|
10986
11022
|
* @param {T} data
|
10987
|
-
* @param {EventLink<T>[]} [parents]
|
11023
|
+
* @param {API.EventLink<T>[]} [parents]
|
10988
11024
|
*/
|
10989
11025
|
static create(data, parents) {
|
10990
11026
|
return encodeEventBlock({ data, parents: parents ?? [] });
|
10991
11027
|
}
|
10992
11028
|
};
|
10993
11029
|
var EventFetcher = class {
|
10994
|
-
/** @param {
|
11030
|
+
/** @param {API.BlockFetcher} blocks */
|
10995
11031
|
constructor(blocks) {
|
10996
11032
|
this._blocks = blocks;
|
10997
11033
|
}
|
10998
11034
|
/**
|
10999
|
-
* @param {EventLink<T>} link
|
11000
|
-
* @returns {Promise<EventBlockView<T>>}
|
11035
|
+
* @param {API.EventLink<T>} link
|
11036
|
+
* @returns {Promise<API.EventBlockView<T>>}
|
11001
11037
|
*/
|
11002
11038
|
async get(link2) {
|
11003
11039
|
const block = await this._blocks.get(link2);
|
@@ -11006,15 +11042,15 @@ You can use close({ resize: true }) to resize header`);
|
|
11006
11042
|
return decodeEventBlock(block.bytes);
|
11007
11043
|
}
|
11008
11044
|
};
|
11009
|
-
async
|
11045
|
+
var encodeEventBlock = async (value) => {
|
11010
11046
|
const { cid, bytes } = await encode7({ value, codec: src_exports, hasher: sha256 });
|
11011
11047
|
return new Block({ cid, value, bytes });
|
11012
|
-
}
|
11013
|
-
async
|
11048
|
+
};
|
11049
|
+
var decodeEventBlock = async (bytes) => {
|
11014
11050
|
const { cid, value } = await decode11({ bytes, codec: src_exports, hasher: sha256 });
|
11015
11051
|
return new Block({ cid, value, bytes });
|
11016
|
-
}
|
11017
|
-
async
|
11052
|
+
};
|
11053
|
+
var contains = async (events, a, b) => {
|
11018
11054
|
if (a.toString() === b.toString())
|
11019
11055
|
return true;
|
11020
11056
|
const [{ value: aevent }, { value: bevent }] = await Promise.all([events.get(a), events.get(b)]);
|
@@ -11035,8 +11071,8 @@ You can use close({ resize: true }) to resize header`);
|
|
11035
11071
|
links3.push(...event.parents);
|
11036
11072
|
}
|
11037
11073
|
return false;
|
11038
|
-
}
|
11039
|
-
async function*
|
11074
|
+
};
|
11075
|
+
var vis = async function* (blocks, head, options = {}) {
|
11040
11076
|
const renderNodeLabel = options.renderNodeLabel ?? ((b) => shortLink(b.cid));
|
11041
11077
|
const events = new EventFetcher(blocks);
|
11042
11078
|
yield "digraph clock {";
|
@@ -11068,15 +11104,18 @@ You can use close({ resize: true }) to resize header`);
|
|
11068
11104
|
links3.push(...block.value.parents);
|
11069
11105
|
}
|
11070
11106
|
yield "}";
|
11071
|
-
}
|
11107
|
+
};
|
11072
11108
|
var shortLink = (l) => `${String(l).slice(0, 4)}..${String(l).slice(-4)}`;
|
11073
11109
|
|
11074
|
-
// ../../node_modules/.pnpm/@
|
11110
|
+
// ../../node_modules/.pnpm/@web3-storage+pail@0.4.0/node_modules/@web3-storage/pail/src/shard.js
|
11111
|
+
var MaxKeyLength = 64;
|
11112
|
+
var MaxShardSize = 512 * 1024;
|
11113
|
+
var CID_TAG2 = new Token(Type.tag, 42);
|
11075
11114
|
var ShardBlock = class extends Block {
|
11076
11115
|
/**
|
11077
11116
|
* @param {object} config
|
11078
|
-
* @param {ShardLink} config.cid
|
11079
|
-
* @param {Shard} config.value
|
11117
|
+
* @param {API.ShardLink} config.cid
|
11118
|
+
* @param {API.Shard} config.value
|
11080
11119
|
* @param {Uint8Array} config.bytes
|
11081
11120
|
* @param {string} config.prefix
|
11082
11121
|
*/
|
@@ -11084,94 +11123,105 @@ You can use close({ resize: true }) to resize header`);
|
|
11084
11123
|
super({ cid, value, bytes });
|
11085
11124
|
this.prefix = prefix;
|
11086
11125
|
}
|
11087
|
-
|
11088
|
-
|
11126
|
+
/** @param {API.ShardOptions} [options] */
|
11127
|
+
static create(options) {
|
11128
|
+
return encodeBlock(create7(options));
|
11089
11129
|
}
|
11090
11130
|
};
|
11131
|
+
var create7 = (options) => ({ entries: [], ...configure(options) });
|
11132
|
+
var configure = (options) => ({
|
11133
|
+
maxSize: options?.maxSize ?? MaxShardSize,
|
11134
|
+
maxKeyLength: options?.maxKeyLength ?? MaxKeyLength
|
11135
|
+
});
|
11136
|
+
var withEntries = (entries3, options) => ({ ...create7(options), entries: entries3 });
|
11091
11137
|
var decodeCache = /* @__PURE__ */ new WeakMap();
|
11092
|
-
async
|
11138
|
+
var encodeBlock = async (value, prefix) => {
|
11093
11139
|
const { cid, bytes } = await encode7({ value, codec: src_exports, hasher: sha256 });
|
11094
11140
|
const block = new ShardBlock({ cid, value, bytes, prefix: prefix ?? "" });
|
11095
11141
|
decodeCache.set(block.bytes, block);
|
11096
11142
|
return block;
|
11097
|
-
}
|
11098
|
-
async
|
11143
|
+
};
|
11144
|
+
var decodeBlock = async (bytes, prefix) => {
|
11099
11145
|
const block = decodeCache.get(bytes);
|
11100
11146
|
if (block)
|
11101
11147
|
return block;
|
11102
11148
|
const { cid, value } = await decode11({ bytes, codec: src_exports, hasher: sha256 });
|
11103
|
-
if (!
|
11149
|
+
if (!isShard(value))
|
11104
11150
|
throw new Error(`invalid shard: ${cid}`);
|
11105
11151
|
return new ShardBlock({ cid, value, bytes, prefix: prefix ?? "" });
|
11106
|
-
}
|
11152
|
+
};
|
11153
|
+
var isShard = (value) => value != null && typeof value === "object" && Array.isArray(value.entries) && typeof value.maxSize === "number" && typeof value.maxKeyLength === "number";
|
11154
|
+
var isShardLink = (value) => isLink(value) && value.code === code;
|
11107
11155
|
var ShardFetcher = class {
|
11108
|
-
/** @param {
|
11156
|
+
/** @param {API.BlockFetcher} blocks */
|
11109
11157
|
constructor(blocks) {
|
11110
11158
|
this._blocks = blocks;
|
11111
11159
|
}
|
11112
11160
|
/**
|
11113
|
-
* @param {ShardLink} link
|
11161
|
+
* @param {API.ShardLink} link
|
11114
11162
|
* @param {string} [prefix]
|
11115
|
-
* @returns {Promise<ShardBlockView>}
|
11163
|
+
* @returns {Promise<API.ShardBlockView>}
|
11116
11164
|
*/
|
11117
11165
|
async get(link2, prefix = "") {
|
11118
11166
|
const block = await this._blocks.get(link2);
|
11119
11167
|
if (!block)
|
11120
11168
|
throw new Error(`missing block: ${link2}`);
|
11121
|
-
return
|
11122
|
-
}
|
11123
|
-
};
|
11124
|
-
|
11125
|
-
|
11126
|
-
|
11127
|
-
|
11128
|
-
|
11129
|
-
|
11130
|
-
|
11131
|
-
|
11132
|
-
shard.push([k, [entry[1][0], v[1]]]);
|
11169
|
+
return decodeBlock(block.bytes, prefix);
|
11170
|
+
}
|
11171
|
+
};
|
11172
|
+
var putEntry = (target, newEntry) => {
|
11173
|
+
const entries3 = [];
|
11174
|
+
for (const [i, entry] of target.entries()) {
|
11175
|
+
const [k, v] = entry;
|
11176
|
+
if (newEntry[0] === k) {
|
11177
|
+
if (Array.isArray(newEntry[1])) {
|
11178
|
+
if (Array.isArray(v) && v[1] != null && newEntry[1][1] == null) {
|
11179
|
+
entries3.push([k, [newEntry[1][0], v[1]]]);
|
11133
11180
|
} else {
|
11134
|
-
|
11181
|
+
entries3.push(newEntry);
|
11135
11182
|
}
|
11136
11183
|
} else {
|
11137
|
-
|
11138
|
-
|
11184
|
+
if (Array.isArray(v)) {
|
11185
|
+
entries3.push([k, [v[0], newEntry[1]]]);
|
11186
|
+
} else {
|
11187
|
+
entries3.push(newEntry);
|
11188
|
+
}
|
11139
11189
|
}
|
11140
11190
|
for (let j = i + 1; j < target.length; j++) {
|
11141
|
-
|
11191
|
+
entries3.push(target[j]);
|
11142
11192
|
}
|
11143
|
-
return
|
11193
|
+
return entries3;
|
11144
11194
|
}
|
11145
|
-
if (i === 0 &&
|
11146
|
-
|
11195
|
+
if (i === 0 && newEntry[0] < k) {
|
11196
|
+
entries3.push(newEntry);
|
11147
11197
|
for (let j = i; j < target.length; j++) {
|
11148
|
-
|
11198
|
+
entries3.push(target[j]);
|
11149
11199
|
}
|
11150
|
-
return
|
11200
|
+
return entries3;
|
11151
11201
|
}
|
11152
|
-
if (i > 0 &&
|
11153
|
-
|
11202
|
+
if (i > 0 && newEntry[0] > target[i - 1][0] && newEntry[0] < k) {
|
11203
|
+
entries3.push(newEntry);
|
11154
11204
|
for (let j = i; j < target.length; j++) {
|
11155
|
-
|
11205
|
+
entries3.push(target[j]);
|
11156
11206
|
}
|
11157
|
-
return
|
11207
|
+
return entries3;
|
11158
11208
|
}
|
11159
|
-
|
11209
|
+
entries3.push(entry);
|
11160
11210
|
}
|
11161
|
-
|
11162
|
-
return
|
11163
|
-
}
|
11164
|
-
|
11165
|
-
const startidx =
|
11211
|
+
entries3.push(newEntry);
|
11212
|
+
return entries3;
|
11213
|
+
};
|
11214
|
+
var findCommonPrefix = (entries3, skey) => {
|
11215
|
+
const startidx = entries3.findIndex(([k]) => skey === k);
|
11166
11216
|
if (startidx === -1)
|
11167
11217
|
throw new Error(`key not found in shard: ${skey}`);
|
11168
11218
|
let i = startidx;
|
11169
11219
|
let pfx;
|
11170
11220
|
while (true) {
|
11171
|
-
pfx =
|
11221
|
+
pfx = entries3[i][0].slice(0, -1);
|
11172
11222
|
if (pfx.length) {
|
11173
11223
|
while (true) {
|
11174
|
-
const matches =
|
11224
|
+
const matches = entries3.filter((entry) => entry[0].startsWith(pfx));
|
11175
11225
|
if (matches.length > 1)
|
11176
11226
|
return { prefix: pfx, matches };
|
11177
11227
|
pfx = pfx.slice(0, -1);
|
@@ -11180,19 +11230,50 @@ You can use close({ resize: true }) to resize header`);
|
|
11180
11230
|
}
|
11181
11231
|
}
|
11182
11232
|
i++;
|
11183
|
-
if (i >=
|
11233
|
+
if (i >= entries3.length) {
|
11184
11234
|
i = 0;
|
11185
11235
|
}
|
11186
11236
|
if (i === startidx) {
|
11187
11237
|
return;
|
11188
11238
|
}
|
11189
11239
|
}
|
11190
|
-
}
|
11240
|
+
};
|
11241
|
+
var encodedLength = (shard) => {
|
11242
|
+
let entriesLength = 0;
|
11243
|
+
for (const entry of shard.entries) {
|
11244
|
+
entriesLength += entryEncodedLength(entry);
|
11245
|
+
}
|
11246
|
+
const tokens = [
|
11247
|
+
new Token(Type.map, 3),
|
11248
|
+
new Token(Type.string, "entries"),
|
11249
|
+
new Token(Type.array, shard.entries.length),
|
11250
|
+
new Token(Type.string, "maxKeyLength"),
|
11251
|
+
new Token(Type.uint, shard.maxKeyLength),
|
11252
|
+
new Token(Type.string, "maxSize"),
|
11253
|
+
new Token(Type.uint, shard.maxSize)
|
11254
|
+
];
|
11255
|
+
return tokensToLength(tokens) + entriesLength;
|
11256
|
+
};
|
11257
|
+
var entryEncodedLength = (entry) => {
|
11258
|
+
const tokens = [
|
11259
|
+
new Token(Type.array, entry.length),
|
11260
|
+
new Token(Type.string, entry[0])
|
11261
|
+
];
|
11262
|
+
if (Array.isArray(entry[1])) {
|
11263
|
+
tokens.push(new Token(Type.array, entry[1].length));
|
11264
|
+
for (const link2 of entry[1]) {
|
11265
|
+
tokens.push(CID_TAG2);
|
11266
|
+
tokens.push(new Token(Type.bytes, { length: link2.byteLength + 1 }));
|
11267
|
+
}
|
11268
|
+
} else {
|
11269
|
+
tokens.push(CID_TAG2);
|
11270
|
+
tokens.push(new Token(Type.bytes, { length: entry[1].byteLength + 1 }));
|
11271
|
+
}
|
11272
|
+
return tokensToLength(tokens);
|
11273
|
+
};
|
11191
11274
|
|
11192
|
-
// ../../node_modules/.pnpm/@
|
11193
|
-
var
|
11194
|
-
var MaxShardSize = 512 * 1024;
|
11195
|
-
async function put(blocks, root2, key, value, options = {}) {
|
11275
|
+
// ../../node_modules/.pnpm/@web3-storage+pail@0.4.0/node_modules/@web3-storage/pail/src/index.js
|
11276
|
+
var put = async (blocks, root2, key, value) => {
|
11196
11277
|
const shards = new ShardFetcher(blocks);
|
11197
11278
|
const rshard = await shards.get(root2);
|
11198
11279
|
const path = await traverse(shards, rshard, key);
|
@@ -11200,31 +11281,40 @@ You can use close({ resize: true }) to resize header`);
|
|
11200
11281
|
const skey = key.slice(target.prefix.length);
|
11201
11282
|
let entry = [skey, value];
|
11202
11283
|
const additions = [];
|
11203
|
-
if (skey.length >
|
11204
|
-
const pfxskeys = Array.from(Array(Math.ceil(skey.length /
|
11205
|
-
const start = i *
|
11284
|
+
if (skey.length > target.value.maxKeyLength) {
|
11285
|
+
const pfxskeys = Array.from(Array(Math.ceil(skey.length / target.value.maxKeyLength)), (_, i) => {
|
11286
|
+
const start = i * target.value.maxKeyLength;
|
11206
11287
|
return {
|
11207
11288
|
prefix: target.prefix + skey.slice(0, start),
|
11208
|
-
skey: skey.slice(start, start +
|
11289
|
+
skey: skey.slice(start, start + target.value.maxKeyLength)
|
11209
11290
|
};
|
11210
11291
|
});
|
11211
|
-
let child2 = await
|
11292
|
+
let child2 = await encodeBlock(
|
11293
|
+
withEntries([[pfxskeys[pfxskeys.length - 1].skey, value]], target.value),
|
11294
|
+
pfxskeys[pfxskeys.length - 1].prefix
|
11295
|
+
);
|
11212
11296
|
additions.push(child2);
|
11213
11297
|
for (let i = pfxskeys.length - 2; i > 0; i--) {
|
11214
|
-
child2 = await
|
11298
|
+
child2 = await encodeBlock(
|
11299
|
+
withEntries([[pfxskeys[i].skey, [child2.cid]]], target.value),
|
11300
|
+
pfxskeys[i].prefix
|
11301
|
+
);
|
11215
11302
|
additions.push(child2);
|
11216
11303
|
}
|
11217
11304
|
entry = [pfxskeys[0].skey, [child2.cid]];
|
11218
11305
|
}
|
11219
|
-
let shard = putEntry(target.value, entry);
|
11220
|
-
let child = await
|
11221
|
-
if (child.bytes.length >
|
11222
|
-
const common = findCommonPrefix(shard, entry[0]);
|
11306
|
+
let shard = withEntries(putEntry(target.value.entries, entry), target.value);
|
11307
|
+
let child = await encodeBlock(shard, target.prefix);
|
11308
|
+
if (child.bytes.length > shard.maxSize) {
|
11309
|
+
const common = findCommonPrefix(shard.entries, entry[0]);
|
11223
11310
|
if (!common)
|
11224
11311
|
throw new Error("shard limit reached");
|
11225
11312
|
const { prefix, matches } = common;
|
11226
|
-
const block = await
|
11227
|
-
|
11313
|
+
const block = await encodeBlock(
|
11314
|
+
withEntries(
|
11315
|
+
matches.filter(([k]) => k !== prefix).map(([k, v]) => [k.slice(prefix.length), v]),
|
11316
|
+
shard
|
11317
|
+
),
|
11228
11318
|
target.prefix + prefix
|
11229
11319
|
);
|
11230
11320
|
additions.push(block);
|
@@ -11238,9 +11328,9 @@ You can use close({ resize: true }) to resize header`);
|
|
11238
11328
|
} else {
|
11239
11329
|
value2 = [block.cid];
|
11240
11330
|
}
|
11241
|
-
shard = shard.filter((e) => matches.every((m) => e[0] !== m[0]));
|
11242
|
-
shard = putEntry(shard, [prefix, value2]);
|
11243
|
-
child = await
|
11331
|
+
shard.entries = shard.entries.filter((e) => matches.every((m) => e[0] !== m[0]));
|
11332
|
+
shard = withEntries(putEntry(shard.entries, [prefix, value2]), shard);
|
11333
|
+
child = await encodeBlock(shard, target.prefix);
|
11244
11334
|
}
|
11245
11335
|
if (child.cid.toString() === target.cid.toString()) {
|
11246
11336
|
return { root: root2, additions: [], removals: [] };
|
@@ -11249,94 +11339,104 @@ You can use close({ resize: true }) to resize header`);
|
|
11249
11339
|
for (let i = path.length - 2; i >= 0; i--) {
|
11250
11340
|
const parent = path[i];
|
11251
11341
|
const key2 = child.prefix.slice(parent.prefix.length);
|
11252
|
-
const value2 =
|
11253
|
-
|
11254
|
-
|
11255
|
-
|
11256
|
-
|
11257
|
-
|
11258
|
-
|
11259
|
-
|
11260
|
-
|
11261
|
-
|
11262
|
-
|
11263
|
-
|
11342
|
+
const value2 = withEntries(
|
11343
|
+
parent.value.entries.map((entry2) => {
|
11344
|
+
const [k, v] = entry2;
|
11345
|
+
if (k !== key2)
|
11346
|
+
return entry2;
|
11347
|
+
if (!Array.isArray(v))
|
11348
|
+
throw new Error(`"${key2}" is not a shard link in: ${parent.cid}`);
|
11349
|
+
return (
|
11350
|
+
/** @type {API.ShardEntry} */
|
11351
|
+
v[1] == null ? [k, [child.cid]] : [k, [child.cid, v[1]]]
|
11352
|
+
);
|
11353
|
+
}),
|
11354
|
+
parent.value
|
11355
|
+
);
|
11356
|
+
child = await encodeBlock(value2, parent.prefix);
|
11264
11357
|
additions.push(child);
|
11265
11358
|
}
|
11266
11359
|
return { root: additions[additions.length - 1].cid, additions, removals: path };
|
11267
|
-
}
|
11268
|
-
async
|
11360
|
+
};
|
11361
|
+
var get2 = async (blocks, root2, key) => {
|
11269
11362
|
const shards = new ShardFetcher(blocks);
|
11270
11363
|
const rshard = await shards.get(root2);
|
11271
11364
|
const path = await traverse(shards, rshard, key);
|
11272
11365
|
const target = path[path.length - 1];
|
11273
11366
|
const skey = key.slice(target.prefix.length);
|
11274
|
-
const entry = target.value.find(([k]) => k === skey);
|
11367
|
+
const entry = target.value.entries.find(([k]) => k === skey);
|
11275
11368
|
if (!entry)
|
11276
11369
|
return;
|
11277
11370
|
return Array.isArray(entry[1]) ? entry[1][1] : entry[1];
|
11278
|
-
}
|
11279
|
-
async
|
11371
|
+
};
|
11372
|
+
var del = async (blocks, root2, key) => {
|
11280
11373
|
const shards = new ShardFetcher(blocks);
|
11281
11374
|
const rshard = await shards.get(root2);
|
11282
11375
|
const path = await traverse(shards, rshard, key);
|
11283
11376
|
const target = path[path.length - 1];
|
11284
11377
|
const skey = key.slice(target.prefix.length);
|
11285
|
-
const entryidx = target.value.findIndex(([k]) => k === skey);
|
11378
|
+
const entryidx = target.value.entries.findIndex(([k]) => k === skey);
|
11286
11379
|
if (entryidx === -1)
|
11287
11380
|
return { root: root2, additions: [], removals: [] };
|
11288
|
-
const entry = target.value[entryidx];
|
11289
|
-
if (Array.isArray(entry[1]) && entry[1][1] == null)
|
11381
|
+
const entry = target.value.entries[entryidx];
|
11382
|
+
if (Array.isArray(entry[1]) && entry[1][1] == null) {
|
11290
11383
|
return { root: root2, additions: [], removals: [] };
|
11384
|
+
}
|
11291
11385
|
const additions = [];
|
11292
11386
|
const removals = [...path];
|
11293
|
-
let shard = [...target.value];
|
11387
|
+
let shard = withEntries([...target.value.entries], target.value);
|
11294
11388
|
if (Array.isArray(entry[1])) {
|
11295
|
-
shard[entryidx] = [entry[0], [entry[1][0]]];
|
11389
|
+
shard.entries[entryidx] = [entry[0], [entry[1][0]]];
|
11296
11390
|
} else {
|
11297
|
-
shard.splice(entryidx, 1);
|
11298
|
-
while (!shard.length) {
|
11391
|
+
shard.entries.splice(entryidx, 1);
|
11392
|
+
while (!shard.entries.length) {
|
11299
11393
|
const child2 = path[path.length - 1];
|
11300
11394
|
const parent = path[path.length - 2];
|
11301
11395
|
if (!parent)
|
11302
11396
|
break;
|
11303
11397
|
path.pop();
|
11304
|
-
shard =
|
11305
|
-
|
11306
|
-
|
11307
|
-
|
11308
|
-
|
11398
|
+
shard = withEntries(
|
11399
|
+
parent.value.entries.filter((e) => {
|
11400
|
+
if (!Array.isArray(e[1]))
|
11401
|
+
return true;
|
11402
|
+
return e[1][0].toString() !== child2.cid.toString();
|
11403
|
+
}),
|
11404
|
+
parent.value
|
11405
|
+
);
|
11309
11406
|
}
|
11310
11407
|
}
|
11311
|
-
let child = await
|
11408
|
+
let child = await encodeBlock(shard, path[path.length - 1].prefix);
|
11312
11409
|
additions.push(child);
|
11313
11410
|
for (let i = path.length - 2; i >= 0; i--) {
|
11314
11411
|
const parent = path[i];
|
11315
11412
|
const key2 = child.prefix.slice(parent.prefix.length);
|
11316
|
-
const value =
|
11317
|
-
|
11318
|
-
|
11319
|
-
|
11320
|
-
|
11321
|
-
|
11322
|
-
|
11323
|
-
|
11324
|
-
|
11325
|
-
|
11326
|
-
|
11327
|
-
|
11413
|
+
const value = withEntries(
|
11414
|
+
parent.value.entries.map((entry2) => {
|
11415
|
+
const [k, v] = entry2;
|
11416
|
+
if (k !== key2)
|
11417
|
+
return entry2;
|
11418
|
+
if (!Array.isArray(v))
|
11419
|
+
throw new Error(`"${key2}" is not a shard link in: ${parent.cid}`);
|
11420
|
+
return (
|
11421
|
+
/** @type {API.ShardEntry} */
|
11422
|
+
v[1] == null ? [k, [child.cid]] : [k, [child.cid, v[1]]]
|
11423
|
+
);
|
11424
|
+
}),
|
11425
|
+
parent.value
|
11426
|
+
);
|
11427
|
+
child = await encodeBlock(value, parent.prefix);
|
11328
11428
|
additions.push(child);
|
11329
11429
|
}
|
11330
11430
|
return { root: additions[additions.length - 1].cid, additions, removals };
|
11331
|
-
}
|
11332
|
-
async function*
|
11431
|
+
};
|
11432
|
+
var entries = async function* (blocks, root2, options = {}) {
|
11333
11433
|
const { prefix } = options;
|
11334
11434
|
const shards = new ShardFetcher(blocks);
|
11335
11435
|
const rshard = await shards.get(root2);
|
11336
11436
|
yield* (
|
11337
|
-
/** @returns {AsyncIterableIterator<
|
11437
|
+
/** @returns {AsyncIterableIterator<API.ShardValueEntry>} */
|
11338
11438
|
async function* ents(shard) {
|
11339
|
-
for (const entry of shard.value) {
|
11439
|
+
for (const entry of shard.value.entries) {
|
11340
11440
|
const key = shard.prefix + entry[0];
|
11341
11441
|
if (Array.isArray(entry[1])) {
|
11342
11442
|
if (entry[1][1]) {
|
@@ -11362,9 +11462,9 @@ You can use close({ resize: true }) to resize header`);
|
|
11362
11462
|
}
|
11363
11463
|
}(rshard)
|
11364
11464
|
);
|
11365
|
-
}
|
11366
|
-
async
|
11367
|
-
for (const [k, v] of shard.value) {
|
11465
|
+
};
|
11466
|
+
var traverse = async (shards, shard, key) => {
|
11467
|
+
for (const [k, v] of shard.value.entries) {
|
11368
11468
|
if (key === k)
|
11369
11469
|
return [shard];
|
11370
11470
|
if (key.startsWith(k) && Array.isArray(v)) {
|
@@ -11373,16 +11473,204 @@ You can use close({ resize: true }) to resize header`);
|
|
11373
11473
|
}
|
11374
11474
|
}
|
11375
11475
|
return [shard];
|
11376
|
-
}
|
11476
|
+
};
|
11477
|
+
|
11478
|
+
// ../../node_modules/.pnpm/@web3-storage+pail@0.4.0/node_modules/@web3-storage/pail/src/batch/shard.js
|
11479
|
+
var create8 = (init2) => ({
|
11480
|
+
base: init2?.base,
|
11481
|
+
prefix: init2?.prefix ?? "",
|
11482
|
+
entries: init2?.entries ?? [],
|
11483
|
+
...configure(init2)
|
11484
|
+
});
|
11485
|
+
|
11486
|
+
// ../../node_modules/.pnpm/@web3-storage+pail@0.4.0/node_modules/@web3-storage/pail/src/batch/index.js
|
11487
|
+
var Batcher = class _Batcher {
|
11488
|
+
#committed = false;
|
11489
|
+
/**
|
11490
|
+
* @param {object} init
|
11491
|
+
* @param {API.BlockFetcher} init.blocks Block storage.
|
11492
|
+
* @param {API.BatcherShardEntry[]} init.entries The entries in this shard.
|
11493
|
+
* @param {string} init.prefix Key prefix.
|
11494
|
+
* @param {number} init.maxSize
|
11495
|
+
* @param {number} init.maxKeyLength
|
11496
|
+
* @param {API.ShardBlockView} init.base Original shard this batcher is based on.
|
11497
|
+
*/
|
11498
|
+
constructor({ blocks, entries: entries3, prefix, maxSize, maxKeyLength, base: base4 }) {
|
11499
|
+
this.blocks = blocks;
|
11500
|
+
this.prefix = prefix;
|
11501
|
+
this.entries = entries3;
|
11502
|
+
this.base = base4;
|
11503
|
+
this.maxSize = maxSize;
|
11504
|
+
this.maxKeyLength = maxKeyLength;
|
11505
|
+
}
|
11506
|
+
/**
|
11507
|
+
* @param {string} key The key of the value to put.
|
11508
|
+
* @param {API.UnknownLink} value The value to put.
|
11509
|
+
* @returns {Promise<void>}
|
11510
|
+
*/
|
11511
|
+
async put(key, value) {
|
11512
|
+
if (this.#committed)
|
11513
|
+
throw new BatchCommittedError();
|
11514
|
+
return put2(this.blocks, this, key, value);
|
11515
|
+
}
|
11516
|
+
async commit() {
|
11517
|
+
if (this.#committed)
|
11518
|
+
throw new BatchCommittedError();
|
11519
|
+
this.#committed = true;
|
11520
|
+
return commit(this);
|
11521
|
+
}
|
11522
|
+
/**
|
11523
|
+
* @param {object} init
|
11524
|
+
* @param {API.BlockFetcher} init.blocks Block storage.
|
11525
|
+
* @param {API.ShardLink} init.link CID of the shard block.
|
11526
|
+
* @param {string} init.prefix
|
11527
|
+
*/
|
11528
|
+
static async create({ blocks, link: link2, prefix }) {
|
11529
|
+
const shards = new ShardFetcher(blocks);
|
11530
|
+
const base4 = await shards.get(link2);
|
11531
|
+
return new _Batcher({ blocks, entries: base4.value.entries, prefix, base: base4, ...configure(base4.value) });
|
11532
|
+
}
|
11533
|
+
};
|
11534
|
+
var put2 = async (blocks, shard, key, value) => {
|
11535
|
+
const shards = new ShardFetcher(blocks);
|
11536
|
+
const dest = await traverse2(shards, key, shard);
|
11537
|
+
if (dest.shard !== shard) {
|
11538
|
+
shard = dest.shard;
|
11539
|
+
key = dest.key;
|
11540
|
+
}
|
11541
|
+
let entry = [key, value];
|
11542
|
+
let batcher;
|
11543
|
+
if (key.length > shard.maxKeyLength) {
|
11544
|
+
const pfxskeys = Array.from(Array(Math.ceil(key.length / shard.maxKeyLength)), (_, i) => {
|
11545
|
+
const start = i * shard.maxKeyLength;
|
11546
|
+
return {
|
11547
|
+
prefix: shard.prefix + key.slice(0, start),
|
11548
|
+
key: key.slice(start, start + shard.maxKeyLength)
|
11549
|
+
};
|
11550
|
+
});
|
11551
|
+
entry = [pfxskeys[pfxskeys.length - 1].key, value];
|
11552
|
+
batcher = create8({
|
11553
|
+
entries: [entry],
|
11554
|
+
prefix: pfxskeys[pfxskeys.length - 1].prefix,
|
11555
|
+
...configure(shard)
|
11556
|
+
});
|
11557
|
+
for (let i = pfxskeys.length - 2; i > 0; i--) {
|
11558
|
+
entry = [pfxskeys[i].key, [batcher]];
|
11559
|
+
batcher = create8({
|
11560
|
+
entries: [entry],
|
11561
|
+
prefix: pfxskeys[i].prefix,
|
11562
|
+
...configure(shard)
|
11563
|
+
});
|
11564
|
+
}
|
11565
|
+
entry = [pfxskeys[0].key, [batcher]];
|
11566
|
+
}
|
11567
|
+
shard.entries = putEntry(asShardEntries(shard.entries), asShardEntry(entry));
|
11568
|
+
const size = encodedLength(withEntries(asShardEntries(shard.entries), shard));
|
11569
|
+
if (size > shard.maxSize) {
|
11570
|
+
const common = findCommonPrefix(
|
11571
|
+
asShardEntries(shard.entries),
|
11572
|
+
entry[0]
|
11573
|
+
);
|
11574
|
+
if (!common)
|
11575
|
+
throw new Error("shard limit reached");
|
11576
|
+
const { prefix } = common;
|
11577
|
+
const matches = common.matches;
|
11578
|
+
const entries3 = matches.filter((m) => m[0] !== prefix).map((m) => {
|
11579
|
+
m = [...m];
|
11580
|
+
m[0] = m[0].slice(prefix.length);
|
11581
|
+
return m;
|
11582
|
+
});
|
11583
|
+
const batcher2 = create8({
|
11584
|
+
entries: entries3,
|
11585
|
+
prefix: shard.prefix + prefix,
|
11586
|
+
...configure(shard)
|
11587
|
+
});
|
11588
|
+
let value2;
|
11589
|
+
const pfxmatch = matches.find((m) => m[0] === prefix);
|
11590
|
+
if (pfxmatch) {
|
11591
|
+
if (Array.isArray(pfxmatch[1])) {
|
11592
|
+
throw new Error(`expected "${prefix}" to be a shard value but found a shard link`);
|
11593
|
+
}
|
11594
|
+
value2 = [batcher2, pfxmatch[1]];
|
11595
|
+
} else {
|
11596
|
+
value2 = [batcher2];
|
11597
|
+
}
|
11598
|
+
shard.entries = putEntry(
|
11599
|
+
asShardEntries(shard.entries.filter((e) => matches.every((m) => e[0] !== m[0]))),
|
11600
|
+
asShardEntry([prefix, value2])
|
11601
|
+
);
|
11602
|
+
}
|
11603
|
+
};
|
11604
|
+
var traverse2 = async (shards, key, shard) => {
|
11605
|
+
for (const e of shard.entries) {
|
11606
|
+
const [k, v] = e;
|
11607
|
+
if (key <= k)
|
11608
|
+
break;
|
11609
|
+
if (key.startsWith(k) && Array.isArray(v)) {
|
11610
|
+
if (isShardLink(v[0])) {
|
11611
|
+
const blk = await shards.get(v[0], shard.prefix + k);
|
11612
|
+
v[0] = create8({ base: blk, prefix: blk.prefix, ...blk.value });
|
11613
|
+
}
|
11614
|
+
return traverse2(shards, key.slice(k.length), v[0]);
|
11615
|
+
}
|
11616
|
+
}
|
11617
|
+
return { shard, key };
|
11618
|
+
};
|
11619
|
+
var commit = async (shard) => {
|
11620
|
+
const additions = [];
|
11621
|
+
const removals = [];
|
11622
|
+
const entries3 = [];
|
11623
|
+
for (const entry of shard.entries) {
|
11624
|
+
if (Array.isArray(entry[1]) && !isShardLink(entry[1][0])) {
|
11625
|
+
const result = await commit(entry[1][0]);
|
11626
|
+
entries3.push([
|
11627
|
+
entry[0],
|
11628
|
+
entry[1][1] == null ? [result.root] : [result.root, entry[1][1]]
|
11629
|
+
]);
|
11630
|
+
additions.push(...result.additions);
|
11631
|
+
removals.push(...result.removals);
|
11632
|
+
} else {
|
11633
|
+
entries3.push(asShardEntry(entry));
|
11634
|
+
}
|
11635
|
+
}
|
11636
|
+
const block = await encodeBlock(withEntries(entries3, shard), shard.prefix);
|
11637
|
+
additions.push(block);
|
11638
|
+
if (shard.base && shard.base.cid.toString() === block.cid.toString()) {
|
11639
|
+
return { root: block.cid, additions: [], removals: [] };
|
11640
|
+
}
|
11641
|
+
if (shard.base)
|
11642
|
+
removals.push(shard.base);
|
11643
|
+
return { root: block.cid, additions, removals };
|
11644
|
+
};
|
11645
|
+
var asShardEntries = (entries3) => (
|
11646
|
+
/** @type {API.ShardEntry[]} */
|
11647
|
+
entries3
|
11648
|
+
);
|
11649
|
+
var asShardEntry = (entry) => (
|
11650
|
+
/** @type {API.ShardEntry} */
|
11651
|
+
entry
|
11652
|
+
);
|
11653
|
+
var create9 = (blocks, root2) => Batcher.create({ blocks, link: root2, prefix: "" });
|
11654
|
+
var BatchCommittedError = class _BatchCommittedError extends Error {
|
11655
|
+
/**
|
11656
|
+
* @param {string} [message]
|
11657
|
+
* @param {ErrorOptions} [options]
|
11658
|
+
*/
|
11659
|
+
constructor(message2, options) {
|
11660
|
+
super(message2 ?? "batch already committed", options);
|
11661
|
+
this.code = _BatchCommittedError.code;
|
11662
|
+
}
|
11663
|
+
static code = "ERR_BATCH_COMMITTED";
|
11664
|
+
};
|
11377
11665
|
|
11378
|
-
// ../../node_modules/.pnpm/@
|
11379
|
-
async
|
11666
|
+
// ../../node_modules/.pnpm/@web3-storage+pail@0.4.0/node_modules/@web3-storage/pail/src/crdt/index.js
|
11667
|
+
var put3 = async (blocks, head, key, value) => {
|
11380
11668
|
const mblocks = new MemoryBlockstore();
|
11381
11669
|
blocks = new MultiBlockFetcher(mblocks, blocks);
|
11382
11670
|
if (!head.length) {
|
11383
11671
|
const shard = await ShardBlock.create();
|
11384
11672
|
mblocks.putSync(shard.cid, shard.bytes);
|
11385
|
-
const result2 = await put(blocks, shard.cid, key, value
|
11673
|
+
const result2 = await put(blocks, shard.cid, key, value);
|
11386
11674
|
const data2 = { type: "put", root: result2.root, key, value };
|
11387
11675
|
const event2 = await EventBlock.create(data2, head);
|
11388
11676
|
head = await advance(blocks, head, event2.cid);
|
@@ -11404,10 +11692,22 @@ You can use close({ resize: true }) to resize header`);
|
|
11404
11692
|
const additions = /* @__PURE__ */ new Map();
|
11405
11693
|
const removals = /* @__PURE__ */ new Map();
|
11406
11694
|
for (const { value: event2 } of sorted) {
|
11407
|
-
|
11408
|
-
|
11695
|
+
let result2;
|
11696
|
+
if (event2.data.type === "put") {
|
11697
|
+
result2 = await put(blocks, root2, event2.data.key, event2.data.value);
|
11698
|
+
} else if (event2.data.type === "del") {
|
11699
|
+
result2 = await del(blocks, root2, event2.data.key);
|
11700
|
+
} else if (event2.data.type === "batch") {
|
11701
|
+
const batch2 = await create9(blocks, root2);
|
11702
|
+
for (const op of event2.data.ops) {
|
11703
|
+
if (op.type !== "put")
|
11704
|
+
throw new Error(`unsupported batch operation: ${op.type}`);
|
11705
|
+
await batch2.put(op.key, op.value);
|
11706
|
+
}
|
11707
|
+
result2 = await batch2.commit();
|
11708
|
+
} else {
|
11709
|
+
throw new Error(`unknown operation: ${event2.data.type}`);
|
11409
11710
|
}
|
11410
|
-
const result2 = event2.data.type === "put" ? await put(blocks, root2, event2.data.key, event2.data.value) : await del(blocks, root2, event2.data.key);
|
11411
11711
|
root2 = result2.root;
|
11412
11712
|
for (const a of result2.additions) {
|
11413
11713
|
mblocks.putSync(a.cid, a.bytes);
|
@@ -11417,7 +11717,7 @@ You can use close({ resize: true }) to resize header`);
|
|
11417
11717
|
removals.set(r.cid.toString(), r);
|
11418
11718
|
}
|
11419
11719
|
}
|
11420
|
-
const result = await put(blocks, root2, key, value
|
11720
|
+
const result = await put(blocks, root2, key, value);
|
11421
11721
|
if (result.root.toString() === root2.toString()) {
|
11422
11722
|
return { root: root2, additions: [], removals: [], head };
|
11423
11723
|
}
|
@@ -11445,8 +11745,8 @@ You can use close({ resize: true }) to resize header`);
|
|
11445
11745
|
head,
|
11446
11746
|
event
|
11447
11747
|
};
|
11448
|
-
}
|
11449
|
-
async
|
11748
|
+
};
|
11749
|
+
var root = async (blocks, head) => {
|
11450
11750
|
if (!head.length)
|
11451
11751
|
throw new Error("cannot determine root of headless clock");
|
11452
11752
|
const mblocks = new MemoryBlockstore();
|
@@ -11466,10 +11766,22 @@ You can use close({ resize: true }) to resize header`);
|
|
11466
11766
|
const additions = /* @__PURE__ */ new Map();
|
11467
11767
|
const removals = /* @__PURE__ */ new Map();
|
11468
11768
|
for (const { value: event } of sorted) {
|
11469
|
-
|
11470
|
-
|
11769
|
+
let result;
|
11770
|
+
if (event.data.type === "put") {
|
11771
|
+
result = await put(blocks, root2, event.data.key, event.data.value);
|
11772
|
+
} else if (event.data.type === "del") {
|
11773
|
+
result = await del(blocks, root2, event.data.key);
|
11774
|
+
} else if (event.data.type === "batch") {
|
11775
|
+
const batch2 = await create9(blocks, root2);
|
11776
|
+
for (const op of event.data.ops) {
|
11777
|
+
if (op.type !== "put")
|
11778
|
+
throw new Error(`unsupported batch operation: ${op.type}`);
|
11779
|
+
await batch2.put(op.key, op.value);
|
11780
|
+
}
|
11781
|
+
result = await batch2.commit();
|
11782
|
+
} else {
|
11783
|
+
throw new Error(`unknown operation: ${event.data.type}`);
|
11471
11784
|
}
|
11472
|
-
const result = event.data.type === "put" ? await put(blocks, root2, event.data.key, event.data.value) : await del(blocks, root2, event.data.key);
|
11473
11785
|
root2 = result.root;
|
11474
11786
|
for (const a of result.additions) {
|
11475
11787
|
mblocks.putSync(a.cid, a.bytes);
|
@@ -11490,8 +11802,8 @@ You can use close({ resize: true }) to resize header`);
|
|
11490
11802
|
additions: [...additions.values()],
|
11491
11803
|
removals: [...removals.values()]
|
11492
11804
|
};
|
11493
|
-
}
|
11494
|
-
async
|
11805
|
+
};
|
11806
|
+
var get3 = async (blocks, head, key) => {
|
11495
11807
|
if (!head.length)
|
11496
11808
|
return;
|
11497
11809
|
const result = await root(blocks, head);
|
@@ -11499,8 +11811,8 @@ You can use close({ resize: true }) to resize header`);
|
|
11499
11811
|
blocks = new MultiBlockFetcher(new MemoryBlockstore(result.additions), blocks);
|
11500
11812
|
}
|
11501
11813
|
return get2(blocks, result.root, key);
|
11502
|
-
}
|
11503
|
-
async function*
|
11814
|
+
};
|
11815
|
+
var entries2 = async function* (blocks, head, options) {
|
11504
11816
|
if (!head.length)
|
11505
11817
|
return;
|
11506
11818
|
const result = await root(blocks, head);
|
@@ -11508,8 +11820,8 @@ You can use close({ resize: true }) to resize header`);
|
|
11508
11820
|
blocks = new MultiBlockFetcher(new MemoryBlockstore(result.additions), blocks);
|
11509
11821
|
}
|
11510
11822
|
yield* entries(blocks, result.root, options);
|
11511
|
-
}
|
11512
|
-
async
|
11823
|
+
};
|
11824
|
+
var findCommonAncestor = async (events, children) => {
|
11513
11825
|
if (!children.length)
|
11514
11826
|
return;
|
11515
11827
|
const candidates = children.map((c) => [c]);
|
@@ -11528,14 +11840,14 @@ You can use close({ resize: true }) to resize header`);
|
|
11528
11840
|
if (!changed)
|
11529
11841
|
return;
|
11530
11842
|
}
|
11531
|
-
}
|
11532
|
-
async
|
11843
|
+
};
|
11844
|
+
var findAncestorCandidate = async (events, root2) => {
|
11533
11845
|
const { value: event } = await events.get(root2);
|
11534
11846
|
if (!event.parents.length)
|
11535
11847
|
return root2;
|
11536
11848
|
return event.parents.length === 1 ? event.parents[0] : findCommonAncestor(events, event.parents);
|
11537
|
-
}
|
11538
|
-
|
11849
|
+
};
|
11850
|
+
var findCommonString = (arrays) => {
|
11539
11851
|
arrays = arrays.map((a) => [...a]);
|
11540
11852
|
for (const arr of arrays) {
|
11541
11853
|
for (const item of arr) {
|
@@ -11551,9 +11863,9 @@ You can use close({ resize: true }) to resize header`);
|
|
11551
11863
|
return item;
|
11552
11864
|
}
|
11553
11865
|
}
|
11554
|
-
}
|
11555
|
-
async
|
11556
|
-
if (head.length === 1 &&
|
11866
|
+
};
|
11867
|
+
var findSortedEvents = async (events, head, tail) => {
|
11868
|
+
if (head.length === 1 && head[0].toString() === tail.toString()) {
|
11557
11869
|
return [];
|
11558
11870
|
}
|
11559
11871
|
const weights = /* @__PURE__ */ new Map();
|
@@ -11578,8 +11890,8 @@ You can use close({ resize: true }) to resize header`);
|
|
11578
11890
|
}
|
11579
11891
|
}
|
11580
11892
|
return Array.from(buckets).sort((a, b) => b[0] - a[0]).flatMap(([, es]) => es.sort((a, b) => String(a.cid) < String(b.cid) ? -1 : 1));
|
11581
|
-
}
|
11582
|
-
async
|
11893
|
+
};
|
11894
|
+
var findEvents = async (events, start, end, depth = 0) => {
|
11583
11895
|
const event = await events.get(start);
|
11584
11896
|
const acc = [{ event, depth }];
|
11585
11897
|
const { parents } = event.value;
|
@@ -11587,7 +11899,128 @@ You can use close({ resize: true }) to resize header`);
|
|
11587
11899
|
return acc;
|
11588
11900
|
const rest = await Promise.all(parents.map((p) => findEvents(events, p, end, depth + 1)));
|
11589
11901
|
return acc.concat(...rest);
|
11590
|
-
}
|
11902
|
+
};
|
11903
|
+
|
11904
|
+
// ../../node_modules/.pnpm/@web3-storage+pail@0.4.0/node_modules/@web3-storage/pail/src/crdt/batch/index.js
|
11905
|
+
var Batcher2 = class _Batcher {
|
11906
|
+
#committed = false;
|
11907
|
+
/**
|
11908
|
+
* @param {object} init
|
11909
|
+
* @param {API.BlockFetcher} init.blocks Block storage.
|
11910
|
+
* @param {API.EventLink<API.Operation>[]} init.head Merkle clock head.
|
11911
|
+
* @param {API.BatcherShardEntry[]} init.entries The entries in this shard.
|
11912
|
+
* @param {string} init.prefix Key prefix.
|
11913
|
+
* @param {number} init.maxSize
|
11914
|
+
* @param {number} init.maxKeyLength
|
11915
|
+
* @param {API.ShardBlockView} init.base Original shard this batcher is based on.
|
11916
|
+
* @param {API.ShardBlockView[]} init.additions Additions to include in the committed batch.
|
11917
|
+
* @param {API.ShardBlockView[]} init.removals Removals to include in the committed batch.
|
11918
|
+
*/
|
11919
|
+
constructor({ blocks, head, entries: entries3, prefix, maxSize, maxKeyLength, base: base4, additions, removals }) {
|
11920
|
+
this.blocks = blocks;
|
11921
|
+
this.head = head;
|
11922
|
+
this.prefix = prefix;
|
11923
|
+
this.entries = entries3;
|
11924
|
+
this.base = base4;
|
11925
|
+
this.maxSize = maxSize;
|
11926
|
+
this.maxKeyLength = maxKeyLength;
|
11927
|
+
this.additions = additions;
|
11928
|
+
this.removals = removals;
|
11929
|
+
this.ops = [];
|
11930
|
+
}
|
11931
|
+
/**
|
11932
|
+
* @param {string} key The key of the value to put.
|
11933
|
+
* @param {API.UnknownLink} value The value to put.
|
11934
|
+
* @returns {Promise<void>}
|
11935
|
+
*/
|
11936
|
+
async put(key, value) {
|
11937
|
+
if (this.#committed)
|
11938
|
+
throw new BatchCommittedError();
|
11939
|
+
await put2(this.blocks, this, key, value);
|
11940
|
+
this.ops.push({ type: "put", key, value });
|
11941
|
+
}
|
11942
|
+
async commit() {
|
11943
|
+
if (this.#committed)
|
11944
|
+
throw new BatchCommittedError();
|
11945
|
+
this.#committed = true;
|
11946
|
+
const res = await commit(this);
|
11947
|
+
const data = { type: "batch", ops: this.ops, root: res.root };
|
11948
|
+
const event = await EventBlock.create(data, this.head);
|
11949
|
+
const mblocks = new MemoryBlockstore();
|
11950
|
+
const blocks = new MultiBlockFetcher(mblocks, this.blocks);
|
11951
|
+
mblocks.putSync(event.cid, event.bytes);
|
11952
|
+
const head = await advance(blocks, this.head, event.cid);
|
11953
|
+
const additions = /* @__PURE__ */ new Map();
|
11954
|
+
const removals = /* @__PURE__ */ new Map();
|
11955
|
+
for (const a of this.additions) {
|
11956
|
+
additions.set(a.cid.toString(), a);
|
11957
|
+
}
|
11958
|
+
for (const r of this.removals) {
|
11959
|
+
removals.set(r.cid.toString(), r);
|
11960
|
+
}
|
11961
|
+
for (const a of res.additions) {
|
11962
|
+
if (removals.has(a.cid.toString())) {
|
11963
|
+
removals.delete(a.cid.toString());
|
11964
|
+
}
|
11965
|
+
additions.set(a.cid.toString(), a);
|
11966
|
+
}
|
11967
|
+
for (const r of res.removals) {
|
11968
|
+
if (additions.has(r.cid.toString())) {
|
11969
|
+
additions.delete(r.cid.toString());
|
11970
|
+
} else {
|
11971
|
+
removals.set(r.cid.toString(), r);
|
11972
|
+
}
|
11973
|
+
}
|
11974
|
+
return {
|
11975
|
+
head,
|
11976
|
+
event,
|
11977
|
+
root: res.root,
|
11978
|
+
additions: [...additions.values()],
|
11979
|
+
removals: [...removals.values()]
|
11980
|
+
};
|
11981
|
+
}
|
11982
|
+
/**
|
11983
|
+
* @param {object} init
|
11984
|
+
* @param {API.BlockFetcher} init.blocks Block storage.
|
11985
|
+
* @param {API.EventLink<API.Operation>[]} init.head Merkle clock head.
|
11986
|
+
* @param {string} init.prefix
|
11987
|
+
*/
|
11988
|
+
static async create({ blocks, head, prefix }) {
|
11989
|
+
const mblocks = new MemoryBlockstore();
|
11990
|
+
blocks = new MultiBlockFetcher(mblocks, blocks);
|
11991
|
+
if (!head.length) {
|
11992
|
+
const base5 = await ShardBlock.create();
|
11993
|
+
mblocks.putSync(base5.cid, base5.bytes);
|
11994
|
+
return new _Batcher({
|
11995
|
+
blocks,
|
11996
|
+
head,
|
11997
|
+
entries: [],
|
11998
|
+
prefix,
|
11999
|
+
base: base5,
|
12000
|
+
additions: [base5],
|
12001
|
+
removals: [],
|
12002
|
+
...configure(base5.value)
|
12003
|
+
});
|
12004
|
+
}
|
12005
|
+
const { root: root2, additions, removals } = await root(blocks, head);
|
12006
|
+
for (const a of additions) {
|
12007
|
+
mblocks.putSync(a.cid, a.bytes);
|
12008
|
+
}
|
12009
|
+
const shards = new ShardFetcher(blocks);
|
12010
|
+
const base4 = await shards.get(root2);
|
12011
|
+
return new _Batcher({
|
12012
|
+
blocks,
|
12013
|
+
head,
|
12014
|
+
entries: base4.value.entries,
|
12015
|
+
prefix,
|
12016
|
+
base: base4,
|
12017
|
+
additions,
|
12018
|
+
removals,
|
12019
|
+
...configure(base4.value)
|
12020
|
+
});
|
12021
|
+
}
|
12022
|
+
};
|
12023
|
+
var create10 = (blocks, head) => Batcher2.create({ blocks, head, prefix: "" });
|
11591
12024
|
|
11592
12025
|
// ../../node_modules/.pnpm/@ipld+unixfs@2.1.2/node_modules/@ipld/unixfs/src/codec.js
|
11593
12026
|
var codec_exports = {};
|
@@ -14392,7 +14825,7 @@ You can use close({ resize: true }) to resize header`);
|
|
14392
14825
|
};
|
14393
14826
|
|
14394
14827
|
// ../../node_modules/.pnpm/multiformats@11.0.2/node_modules/multiformats/src/hashes/digest.js
|
14395
|
-
var
|
14828
|
+
var create11 = (code8, digest3) => {
|
14396
14829
|
const size = digest3.byteLength;
|
14397
14830
|
const sizeOffset = encodingLength3(code8);
|
14398
14831
|
const digestOffset = sizeOffset + encodingLength3(size);
|
@@ -14461,7 +14894,7 @@ You can use close({ resize: true }) to resize header`);
|
|
14461
14894
|
digest(input) {
|
14462
14895
|
if (input instanceof Uint8Array) {
|
14463
14896
|
const result = this.encode(input);
|
14464
|
-
return result instanceof Uint8Array ?
|
14897
|
+
return result instanceof Uint8Array ? create11(this.code, result) : result.then((digest3) => create11(this.code, digest3));
|
14465
14898
|
} else {
|
14466
14899
|
throw Error("Unknown type, must be binary type");
|
14467
14900
|
}
|
@@ -15008,7 +15441,7 @@ You can use close({ resize: true }) to resize header`);
|
|
15008
15441
|
switch (this.version) {
|
15009
15442
|
case 0: {
|
15010
15443
|
const { code: code8, digest: digest3 } = this.multihash;
|
15011
|
-
const multihash =
|
15444
|
+
const multihash = create11(code8, digest3);
|
15012
15445
|
return (
|
15013
15446
|
/** @type {CID<Data, Format, Alg, 1>} */
|
15014
15447
|
_CID.createV1(this.code, multihash)
|
@@ -15539,7 +15972,7 @@ You can use close({ resize: true }) to resize header`);
|
|
15539
15972
|
hasher: sha2562,
|
15540
15973
|
linker: { createLink: CID3.createV1 }
|
15541
15974
|
});
|
15542
|
-
var
|
15975
|
+
var configure2 = (config2) => ({
|
15543
15976
|
...defaults2(),
|
15544
15977
|
...config2
|
15545
15978
|
});
|
@@ -15548,7 +15981,7 @@ You can use close({ resize: true }) to resize header`);
|
|
15548
15981
|
name: name3,
|
15549
15982
|
encode: encodeFileChunk
|
15550
15983
|
};
|
15551
|
-
var
|
15984
|
+
var create12 = ({ writer, metadata = {}, settings: settings2 = defaults2() }) => new FileWriterView(init(writer, metadata, configure2(settings2)));
|
15552
15985
|
var write4 = async (view, bytes) => {
|
15553
15986
|
await perform(view, send({ type: "write", bytes }));
|
15554
15987
|
return view;
|
@@ -15607,7 +16040,7 @@ You can use close({ resize: true }) to resize header`);
|
|
15607
16040
|
|
15608
16041
|
// ../../node_modules/.pnpm/@ipld+unixfs@2.1.2/node_modules/@ipld/unixfs/src/directory.js
|
15609
16042
|
var defaults3 = defaults2;
|
15610
|
-
var
|
16043
|
+
var create13 = ({ writer, settings: settings2 = defaults3(), metadata = {} }) => new DirectoryWriter({
|
15611
16044
|
writer,
|
15612
16045
|
metadata,
|
15613
16046
|
settings: settings2,
|
@@ -15808,7 +16241,7 @@ You can use close({ resize: true }) to resize header`);
|
|
15808
16241
|
/** @type {Uint8Array} */
|
15809
16242
|
murmur364.encode(bytes)
|
15810
16243
|
);
|
15811
|
-
var
|
16244
|
+
var configure5 = ({ bitWidth: bitWidth2 = 8, hash = hash64 }) => {
|
15812
16245
|
const hashSize = hash(new Uint8Array()).byteLength;
|
15813
16246
|
const options = { bitWidth: bitWidth2, hash, hashSize };
|
15814
16247
|
const at = (path, depth) => read4(path, depth, options);
|
@@ -15845,7 +16278,7 @@ You can use close({ resize: true }) to resize header`);
|
|
15845
16278
|
var bitWidth = 8;
|
15846
16279
|
var config = {
|
15847
16280
|
bitWidth,
|
15848
|
-
Path:
|
16281
|
+
Path: configure5({ bitWidth })
|
15849
16282
|
};
|
15850
16283
|
|
15851
16284
|
// ../../node_modules/.pnpm/@ipld+unixfs@2.1.2/node_modules/@ipld/unixfs/src/lib.js
|
@@ -15869,14 +16302,14 @@ You can use close({ resize: true }) to resize header`);
|
|
15869
16302
|
*/
|
15870
16303
|
constructor({ writer, settings: settings2 }) {
|
15871
16304
|
this.writer = writer;
|
15872
|
-
this.settings =
|
16305
|
+
this.settings = configure2(settings2);
|
15873
16306
|
}
|
15874
16307
|
/**
|
15875
16308
|
* @template [L=unknown]
|
15876
16309
|
* @param {API.WriterOptions<L|Layout>} config
|
15877
16310
|
*/
|
15878
16311
|
createFileWriter({ settings: settings2 = this.settings, metadata } = {}) {
|
15879
|
-
return
|
16312
|
+
return create12({
|
15880
16313
|
writer: this.writer,
|
15881
16314
|
settings: settings2,
|
15882
16315
|
metadata
|
@@ -15887,7 +16320,7 @@ You can use close({ resize: true }) to resize header`);
|
|
15887
16320
|
* @param {API.WriterOptions<L|Layout>} config
|
15888
16321
|
*/
|
15889
16322
|
createDirectoryWriter({ settings: settings2 = this.settings, metadata } = {}) {
|
15890
|
-
return
|
16323
|
+
return create13({
|
15891
16324
|
writer: this.writer,
|
15892
16325
|
settings: settings2,
|
15893
16326
|
metadata
|
@@ -19159,7 +19592,7 @@ You can use close({ resize: true }) to resize header`);
|
|
19159
19592
|
var import_err_code7 = __toESM(require_err_code(), 1);
|
19160
19593
|
|
19161
19594
|
// ../../node_modules/.pnpm/eventemitter3@5.0.1/node_modules/eventemitter3/index.mjs
|
19162
|
-
var
|
19595
|
+
var import_index5 = __toESM(require_eventemitter3(), 1);
|
19163
19596
|
|
19164
19597
|
// ../../node_modules/.pnpm/p-timeout@6.1.2/node_modules/p-timeout/index.js
|
19165
19598
|
var TimeoutError = class extends Error {
|
@@ -19294,7 +19727,7 @@ You can use close({ resize: true }) to resize header`);
|
|
19294
19727
|
};
|
19295
19728
|
|
19296
19729
|
// ../../node_modules/.pnpm/p-queue@8.0.1/node_modules/p-queue/dist/index.js
|
19297
|
-
var PQueue = class extends
|
19730
|
+
var PQueue = class extends import_index5.default {
|
19298
19731
|
#carryoverConcurrencyCount;
|
19299
19732
|
#isIntervalIgnored;
|
19300
19733
|
#intervalCount = 0;
|
@@ -19936,7 +20369,7 @@ You can use close({ resize: true }) to resize header`);
|
|
19936
20369
|
|
19937
20370
|
// src/files.ts
|
19938
20371
|
var queuingStrategy = withCapacity();
|
19939
|
-
var settings =
|
20372
|
+
var settings = configure2({
|
19940
20373
|
fileChunkEncoder: raw_exports,
|
19941
20374
|
smallFileEncoder: raw_exports,
|
19942
20375
|
// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-call
|
@@ -19985,7 +20418,7 @@ You can use close({ resize: true }) to resize header`);
|
|
19985
20418
|
this.#file = file;
|
19986
20419
|
}
|
19987
20420
|
async finalize(writer) {
|
19988
|
-
const unixfsFileWriter =
|
20421
|
+
const unixfsFileWriter = create12(writer);
|
19989
20422
|
await this.#file.stream().pipeTo(
|
19990
20423
|
new WritableStream({
|
19991
20424
|
async write(chunk) {
|
@@ -20002,30 +20435,39 @@ You can use close({ resize: true }) to resize header`);
|
|
20002
20435
|
}
|
20003
20436
|
function timeEnd(tag2) {
|
20004
20437
|
}
|
20005
|
-
async function applyBulkUpdateToCrdt(tblocks, head, updates
|
20006
|
-
let result;
|
20007
|
-
|
20008
|
-
const
|
20009
|
-
|
20010
|
-
|
20011
|
-
|
20012
|
-
if (!isReturned) {
|
20013
|
-
const hasRoot = await tblocks.get(result.root);
|
20014
|
-
if (!hasRoot) {
|
20015
|
-
throw new Error(
|
20016
|
-
`missing root in additions: ${result.additions.length} ${resRoot} keys: ${updates.map((u) => u.key).toString()}`
|
20017
|
-
);
|
20018
|
-
result.head = head;
|
20019
|
-
}
|
20438
|
+
async function applyBulkUpdateToCrdt(tblocks, head, updates) {
|
20439
|
+
let result = null;
|
20440
|
+
if (updates.length > 1) {
|
20441
|
+
const batch2 = await create10(tblocks, head);
|
20442
|
+
for (const update2 of updates) {
|
20443
|
+
const link2 = await writeDocContent(tblocks, update2);
|
20444
|
+
await batch2.put(update2.key, link2);
|
20020
20445
|
}
|
20021
|
-
|
20022
|
-
|
20023
|
-
|
20446
|
+
result = await batch2.commit();
|
20447
|
+
} else {
|
20448
|
+
for (const update2 of updates) {
|
20449
|
+
const link2 = await writeDocContent(tblocks, update2);
|
20450
|
+
result = await put3(tblocks, head, update2.key, link2);
|
20451
|
+
const resRoot = result.root.toString();
|
20452
|
+
const isReturned = result.additions.some((a) => a.cid.toString() === resRoot);
|
20453
|
+
if (!isReturned) {
|
20454
|
+
const hasRoot = await tblocks.get(result.root);
|
20455
|
+
if (!hasRoot) {
|
20456
|
+
throw new Error(
|
20457
|
+
`missing root in additions: ${result.additions.length} ${resRoot} keys: ${updates.map((u) => u.key).toString()}`
|
20458
|
+
);
|
20459
|
+
}
|
20024
20460
|
}
|
20025
|
-
head = result.head;
|
20026
20461
|
}
|
20027
20462
|
}
|
20028
|
-
|
20463
|
+
if (!result)
|
20464
|
+
throw new Error("Missing result");
|
20465
|
+
if (result.event) {
|
20466
|
+
for (const { cid, bytes } of [...result.additions, ...result.removals, result.event]) {
|
20467
|
+
tblocks.putSync(cid, bytes);
|
20468
|
+
}
|
20469
|
+
}
|
20470
|
+
return { head: result.head };
|
20029
20471
|
}
|
20030
20472
|
async function writeDocContent(blocks, update2) {
|
20031
20473
|
let value;
|
@@ -20163,37 +20605,33 @@ You can use close({ resize: true }) to resize header`);
|
|
20163
20605
|
const { value: event } = await eventsFetcher.get(link2);
|
20164
20606
|
if (!event)
|
20165
20607
|
continue;
|
20166
|
-
const {
|
20167
|
-
|
20168
|
-
|
20169
|
-
|
20170
|
-
|
20171
|
-
|
20172
|
-
|
20173
|
-
|
20174
|
-
|
20175
|
-
|
20176
|
-
|
20177
|
-
|
20178
|
-
|
20179
|
-
|
20180
|
-
|
20181
|
-
|
20182
|
-
|
20183
|
-
updates
|
20184
|
-
|
20185
|
-
|
20186
|
-
|
20187
|
-
|
20188
|
-
|
20189
|
-
|
20190
|
-
|
20191
|
-
|
20192
|
-
|
20193
|
-
didLinks,
|
20194
|
-
limit
|
20195
|
-
);
|
20196
|
-
}
|
20608
|
+
const { type: type2 } = event.data;
|
20609
|
+
let ops = [];
|
20610
|
+
if (type2 === "batch") {
|
20611
|
+
ops = event.data.ops;
|
20612
|
+
} else if (type2 === "put") {
|
20613
|
+
ops = [event.data];
|
20614
|
+
}
|
20615
|
+
for (let i = ops.length - 1; i >= 0; i--) {
|
20616
|
+
const { key, value } = ops[i];
|
20617
|
+
if (!keys.has(key)) {
|
20618
|
+
const docValue = await getValueFromLink(blocks, value);
|
20619
|
+
updates.push({ key, value: docValue.doc, del: docValue.del, clock: link2 });
|
20620
|
+
limit--;
|
20621
|
+
keys.add(key);
|
20622
|
+
}
|
20623
|
+
}
|
20624
|
+
if (event.parents) {
|
20625
|
+
updates = await gatherUpdates(
|
20626
|
+
blocks,
|
20627
|
+
eventsFetcher,
|
20628
|
+
event.parents,
|
20629
|
+
since,
|
20630
|
+
updates,
|
20631
|
+
keys,
|
20632
|
+
didLinks,
|
20633
|
+
limit
|
20634
|
+
);
|
20197
20635
|
}
|
20198
20636
|
}
|
20199
20637
|
return updates;
|
@@ -20366,7 +20804,7 @@ You can use close({ resize: true }) to resize header`);
|
|
20366
20804
|
});
|
20367
20805
|
return getNode;
|
20368
20806
|
};
|
20369
|
-
var
|
20807
|
+
var create16 = ({ get: get7, cache: cache4, chunker: chunker3, list, codec, hasher, sorted, compare: compare5, ...opts }) => {
|
20370
20808
|
if (!sorted)
|
20371
20809
|
list = list.sort(({ key: a }, { key: b }) => compare5(a, b));
|
20372
20810
|
const getNode = createGetNode2(get7, cache4, chunker3, codec, hasher, compare5, opts);
|
@@ -20547,12 +20985,12 @@ You can use close({ resize: true }) to resize header`);
|
|
20547
20985
|
...classes2,
|
20548
20986
|
compare: compare3
|
20549
20987
|
};
|
20550
|
-
var
|
20988
|
+
var create17 = (opts) => {
|
20551
20989
|
opts = {
|
20552
20990
|
...defaults4,
|
20553
20991
|
...opts
|
20554
20992
|
};
|
20555
|
-
return
|
20993
|
+
return create16(opts);
|
20556
20994
|
};
|
20557
20995
|
var load3 = (opts) => {
|
20558
20996
|
opts = {
|
@@ -20628,7 +21066,7 @@ You can use close({ resize: true }) to resize header`);
|
|
20628
21066
|
if (!inIndex.cid) {
|
20629
21067
|
let returnRootBlock = null;
|
20630
21068
|
let returnNode = null;
|
20631
|
-
for await (const node of await
|
21069
|
+
for await (const node of await create17({ get: makeProllyGetBlock(tblocks), list: indexEntries, ...opts })) {
|
20632
21070
|
const block = await node.block;
|
20633
21071
|
await tblocks.put(block.cid, block.bytes);
|
20634
21072
|
returnRootBlock = block;
|
@@ -21102,12 +21540,12 @@ You can use close({ resize: true }) to resize header`);
|
|
21102
21540
|
}
|
21103
21541
|
});
|
21104
21542
|
}
|
21105
|
-
async bulk(updates
|
21543
|
+
async bulk(updates) {
|
21106
21544
|
await this.ready;
|
21107
21545
|
const prevHead = [...this.clock.head];
|
21108
21546
|
const meta = await this.blockstore.transaction(
|
21109
21547
|
async (blocks) => {
|
21110
|
-
const { head } = await applyBulkUpdateToCrdt(blocks, this.clock.head, updates
|
21548
|
+
const { head } = await applyBulkUpdateToCrdt(blocks, this.clock.head, updates);
|
21111
21549
|
updates = updates.map(({ key, value, del: del2, clock }) => {
|
21112
21550
|
readFiles(this.blockstore, { doc: value });
|
21113
21551
|
return { key, value, del: del2, clock };
|