@xyo-network/sdk 7.3.1 → 7.4.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.
Files changed (24) hide show
  1. package/dist/neutral/archivist-abstract.mjs +195 -110
  2. package/dist/neutral/archivist-abstract.mjs.map +4 -4
  3. package/dist/neutral/archivist-memory.mjs +2 -0
  4. package/dist/neutral/archivist-memory.mjs.map +2 -2
  5. package/dist/neutral/module-abstract.mjs.map +2 -2
  6. package/dist/neutral/modules/archivist-abstract/AbstractArchivist.d.ts +20 -1
  7. package/dist/neutral/modules/archivist-abstract/AbstractArchivist.d.ts.map +1 -1
  8. package/dist/neutral/modules/archivist-abstract/index.d.ts +1 -0
  9. package/dist/neutral/modules/archivist-abstract/index.d.ts.map +1 -1
  10. package/dist/neutral/modules/archivist-abstract/payloadAdmission.d.ts +13 -0
  11. package/dist/neutral/modules/archivist-abstract/payloadAdmission.d.ts.map +1 -0
  12. package/dist/neutral/modules/archivist-memory/MemoryDriver.d.ts.map +1 -1
  13. package/dist/neutral/modules/module-abstract/Error.d.ts +3 -3
  14. package/dist/neutral/modules/module-abstract/Error.d.ts.map +1 -1
  15. package/dist/node/modules/archivist-abstract/AbstractArchivist.d.ts +20 -1
  16. package/dist/node/modules/archivist-abstract/AbstractArchivist.d.ts.map +1 -1
  17. package/dist/node/modules/archivist-abstract/index.d.ts +1 -0
  18. package/dist/node/modules/archivist-abstract/index.d.ts.map +1 -1
  19. package/dist/node/modules/archivist-abstract/payloadAdmission.d.ts +13 -0
  20. package/dist/node/modules/archivist-abstract/payloadAdmission.d.ts.map +1 -0
  21. package/dist/node/modules/archivist-memory/MemoryDriver.d.ts.map +1 -1
  22. package/dist/node/modules/module-abstract/Error.d.ts +3 -3
  23. package/dist/node/modules/module-abstract/Error.d.ts.map +1 -1
  24. package/package.json +9 -10
@@ -1,7 +1,6 @@
1
1
  // src/modules/archivist-abstract/AbstractArchivist.ts
2
2
  import {
3
3
  assertEx,
4
- difference,
5
4
  exists,
6
5
  isNull,
7
6
  isUndefined
@@ -40,6 +39,8 @@ var AbstractArchivist = class _AbstractArchivist extends AbstractModuleInstance
40
39
  _parentArchivists;
41
40
  _payloadCountGauge;
42
41
  _payloadCountMeter;
42
+ activeCacheMutations = 0;
43
+ cacheGeneration = 0;
43
44
  // do not override this! It is meant to get the this.defaultNextLimitSetting and work if it is overridden
44
45
  static get defaultNextLimit() {
45
46
  return this.defaultNextLimitSetting;
@@ -102,9 +103,7 @@ var AbstractArchivist = class _AbstractArchivist extends AbstractModuleInstance
102
103
  await this.globalReentrancyMutex?.acquire();
103
104
  return await this.busy(async () => {
104
105
  await this.startedAsync("throw");
105
- await this.clearHandler();
106
- this.reportPayloadCount();
107
- await this.emit("cleared", { mod: this });
106
+ await this.clearWithConfig();
108
107
  });
109
108
  } finally {
110
109
  this.globalReentrancyMutex?.release();
@@ -188,6 +187,7 @@ var AbstractArchivist = class _AbstractArchivist extends AbstractModuleInstance
188
187
  async insert(payloads) {
189
188
  this._noOverride("insert");
190
189
  this.isSupportedQuery(ArchivistInsertQuerySchema, "insert");
190
+ const snapshot = this.snapshotPayloads(payloads);
191
191
  return await this.spanAsync(`${this.id}|insert`, async () => {
192
192
  if (this.reentrancy?.scope === "global" && this.reentrancy.action === "skip" && this.globalReentrancyMutex?.isLocked()) {
193
193
  return [];
@@ -196,7 +196,7 @@ var AbstractArchivist = class _AbstractArchivist extends AbstractModuleInstance
196
196
  await this.globalReentrancyMutex?.acquire();
197
197
  return await this.busy(async () => {
198
198
  await this.startedAsync("throw");
199
- return await this.insertWithConfig(PayloadBuilder.omitStorageMeta(payloads));
199
+ return await this.insertWithConfig(snapshot);
200
200
  });
201
201
  } finally {
202
202
  this.globalReentrancyMutex?.release();
@@ -206,7 +206,7 @@ var AbstractArchivist = class _AbstractArchivist extends AbstractModuleInstance
206
206
  async insertQuery(payloads, account) {
207
207
  this._noOverride("insertQuery");
208
208
  const queryPayload = { schema: ArchivistInsertQuerySchema };
209
- return await this.sendQueryRaw(queryPayload, payloads, account);
209
+ return await this.sendQueryRaw(queryPayload, this.snapshotPayloads(payloads), account);
210
210
  }
211
211
  async next(options) {
212
212
  this._noOverride("next");
@@ -261,6 +261,13 @@ var AbstractArchivist = class _AbstractArchivist extends AbstractModuleInstance
261
261
  clearHandler() {
262
262
  throw new Error(NOT_IMPLEMENTED);
263
263
  }
264
+ async clearWithConfig(config) {
265
+ await this.withCacheMutation(async () => {
266
+ await this.withStorageMutation(async () => await this.clearHandler());
267
+ this.reportPayloadCount();
268
+ if (config?.emitEvents ?? true) await this.emit("cleared", { mod: this });
269
+ });
270
+ }
264
271
  commitHandler() {
265
272
  throw new Error(NOT_IMPLEMENTED);
266
273
  }
@@ -268,18 +275,20 @@ var AbstractArchivist = class _AbstractArchivist extends AbstractModuleInstance
268
275
  throw new Error(NOT_IMPLEMENTED);
269
276
  }
270
277
  async deleteWithConfig(hashes, config) {
271
- const emitEvents = config?.emitEvents ?? true;
272
- const payloads = await this.deleteHandler(hashes);
273
- const hashesDeleted = payloads.map((p) => p._hash);
274
- if (emitEvents) {
275
- await this.emit("deleted", {
276
- hashes: hashesDeleted,
277
- payloads,
278
- mod: this
279
- });
280
- }
281
- this.reportPayloadCount();
282
- return payloads;
278
+ return await this.withCacheMutation(async () => {
279
+ const emitEvents = config?.emitEvents ?? true;
280
+ const payloads = await this.withStorageMutation(async () => await this.deleteHandler(hashes));
281
+ const hashesDeleted = payloads.map((p) => p._hash);
282
+ if (emitEvents) {
283
+ await this.emit("deleted", {
284
+ hashes: hashesDeleted,
285
+ payloads,
286
+ mod: this
287
+ });
288
+ }
289
+ this.reportPayloadCount();
290
+ return payloads;
291
+ });
283
292
  }
284
293
  generateStats() {
285
294
  return {
@@ -287,18 +296,18 @@ var AbstractArchivist = class _AbstractArchivist extends AbstractModuleInstance
287
296
  schema: ArchivistStatsPayloadSchema
288
297
  };
289
298
  }
299
+ /**
300
+ * Inspect local stored roots without consulting public projections, caches or
301
+ * parents. Backends whose getHandler synthesizes views must override this hook
302
+ * to read their primary record keys directly.
303
+ */
304
+ async getExistingLocalPayloads(hashes) {
305
+ return await this.exactRepresentations(await this.getHandler(hashes), hashes);
306
+ }
290
307
  async getFromParent(hashes, archivist) {
291
- const foundPairs = (await PayloadBuilder.dataHashPairs(await archivist.get(hashes))).filter(([, hash]) => {
292
- const askedFor = hashes.includes(hash);
293
- if (!askedFor) {
294
- console.warn(`Parent returned payload with hash not asked for: ${hash}`);
295
- }
296
- return askedFor;
297
- });
298
- const foundHashes = new Set(foundPairs.map(([, hash]) => hash));
299
- const foundPayloads = foundPairs.map(([payload]) => payload);
300
- const notfound = hashes.filter((hash) => !foundHashes.has(hash));
301
- return [foundPayloads, notfound];
308
+ const foundPayloads = await this.requestedRepresentations(await archivist.get(hashes), hashes);
309
+ const foundHashes = new Set(foundPayloads.map((payload) => payload._hash));
310
+ return [foundPayloads, hashes.filter((hash) => !foundHashes.has(hash))];
302
311
  }
303
312
  async getFromParents(hashes) {
304
313
  const parents = Object.values((await this.parentArchivists())?.read ?? {});
@@ -319,58 +328,25 @@ var AbstractArchivist = class _AbstractArchivist extends AbstractModuleInstance
319
328
  getHandler(_hashes) {
320
329
  throw new Error(NOT_IMPLEMENTED);
321
330
  }
322
- // eslint-disable-next-line max-statements
323
331
  async getWithConfig(hashes, _config) {
324
- const requestedHashes = new Set(hashes);
325
- const cache = this._getCache;
326
- let fromCache = [];
327
- let remainingHashes = [...requestedHashes];
328
- if (cache !== void 0) {
329
- fromCache = hashes.map((hash) => cache.get(hash)).filter(exists);
330
- remainingHashes = hashes.filter((hash) => !fromCache.some((payload) => payload?._hash === hash || payload?._dataHash === hash));
331
- }
332
- const fromGet = await this.getHandler([...remainingHashes]);
333
- const gotten = [...fromCache, ...fromGet].toSorted(PayloadBuilder.compareStorageMeta);
334
- const foundPayloads = [];
335
- const foundHashes = /* @__PURE__ */ new Set();
336
- for (const payload of gotten) {
337
- const map = {
338
- [payload._hash]: payload,
339
- [payload._dataHash]: payload
340
- };
341
- for (const [key, payload2] of Object.entries(map)) {
342
- let requestedPayloadFound = false;
343
- const hash = key;
344
- if (requestedHashes.has(hash) && !foundHashes.has(hash)) {
345
- requestedPayloadFound = true;
346
- foundHashes.add(hash);
347
- }
348
- if (requestedPayloadFound) foundPayloads.push(payload2);
349
- }
350
- }
351
- const notFoundHashes = [...difference(requestedHashes, foundHashes)];
352
- const [parentFoundPayloads] = await this.getFromParents(notFoundHashes);
353
- if (this.storeParentReads) {
332
+ const requestedHashes = [...new Set(hashes)];
333
+ const generation = this.cacheGeneration;
334
+ const cache = this.activeCacheMutations === 0 ? this._getCache : void 0;
335
+ const fromCache = await this.requestedRepresentations(requestedHashes.map((hash) => cache?.get(hash)).filter(exists), requestedHashes);
336
+ const cachedHashes = new Set(fromCache.map((payload) => payload._hash));
337
+ const remainingHashes = requestedHashes.filter((hash) => !cachedHashes.has(hash));
338
+ const fromGet = await this.requestedRepresentations(await this.getHandler(remainingHashes), remainingHashes);
339
+ const foundHashes = new Set([...fromCache, ...fromGet].map((payload) => payload._hash));
340
+ const [parentFoundPayloads] = await this.getFromParents(requestedHashes.filter((hash) => !foundHashes.has(hash)));
341
+ if (this.storeParentReads && parentFoundPayloads.length > 0) {
354
342
  await this.insertWithConfig(parentFoundPayloads);
355
343
  }
356
- const result = this.omitClientMetaForDataHashes(
357
- hashes,
358
- PayloadBuilder.omitPrivateStorageMeta([
359
- ...foundPayloads,
360
- ...parentFoundPayloads
361
- ]).toSorted(PayloadBuilder.compareStorageMeta)
362
- );
363
- if (cache !== void 0) {
364
- for (const payload of fromGet) {
365
- cache.set(payload._hash, payload);
366
- cache.set(payload._dataHash, payload);
367
- }
368
- for (const payload of parentFoundPayloads) {
369
- cache.set(payload._hash, payload);
370
- cache.set(payload._dataHash, payload);
371
- }
344
+ if (this.activeCacheMutations === 0 && generation === this.cacheGeneration) {
345
+ for (const payload of [...fromGet, ...parentFoundPayloads]) cache?.set(payload._hash, payload);
372
346
  }
373
- return result;
347
+ return PayloadBuilder.omitPrivateStorageMeta(
348
+ [...fromCache, ...fromGet, ...parentFoundPayloads].toSorted(PayloadBuilder.compareStorageMeta)
349
+ );
374
350
  }
375
351
  insertHandler(_payloads) {
376
352
  throw new Error(NOT_IMPLEMENTED);
@@ -388,27 +364,38 @@ var AbstractArchivist = class _AbstractArchivist extends AbstractModuleInstance
388
364
  return result;
389
365
  }
390
366
  async insertWithConfig(payloads, config) {
391
- const emitEvents = config?.emitEvents ?? true;
392
- const writeToParents = config?.writeToParents ?? true;
393
- const withStorageMeta = await PayloadBuilder.addStorageMeta(payloads);
394
- const hashes = withStorageMeta.map((p) => p._hash);
395
- const existingPayloads = await this.getWithConfig(hashes);
396
- const existingHashes = new Set(existingPayloads.map((p) => p._hash));
397
- const payloadsToInsert = withStorageMeta.filter((p) => !existingHashes.has(p._hash));
398
- const insertedPayloads = await this.insertHandler(payloadsToInsert);
399
- if (writeToParents) {
400
- await this.writeToParents(insertedPayloads);
401
- }
402
- if (emitEvents) {
403
- await this.emit("inserted", {
404
- mod: this,
405
- payloads: insertedPayloads,
406
- outPayloads: insertedPayloads,
407
- inPayloads: payloads
367
+ const sanitizedPayloads = this.snapshotPayloads(payloads);
368
+ return await this.withCacheMutation(async () => {
369
+ const emitEvents = config?.emitEvents ?? true;
370
+ const writeToParents = config?.writeToParents ?? true;
371
+ await this.validateInsertPayloads(sanitizedPayloads);
372
+ const withStorageMeta = await PayloadBuilder.addStorageMeta(sanitizedPayloads);
373
+ const hashes = [...new Set(withStorageMeta.map((payload) => payload._hash))];
374
+ const { existingPayloads, insertedPayloads } = await this.withStorageMutation(async () => {
375
+ const existingPayloads2 = await this.getExistingLocalPayloads(hashes);
376
+ await this.repairExistingPayloads(existingPayloads2);
377
+ const existingHashes = new Set(existingPayloads2.map((payload) => payload._hash));
378
+ const payloadsToInsert = withStorageMeta.filter((payload) => {
379
+ if (existingHashes.has(payload._hash)) return false;
380
+ existingHashes.add(payload._hash);
381
+ return true;
382
+ });
383
+ return { existingPayloads: existingPayloads2, insertedPayloads: await this.insertHandler(payloadsToInsert) };
408
384
  });
409
- }
410
- this.reportPayloadCount();
411
- return PayloadBuilder.omitPrivateStorageMeta(insertedPayloads);
385
+ if (writeToParents) {
386
+ await this.writeToParents([...existingPayloads, ...insertedPayloads]);
387
+ }
388
+ if (emitEvents) {
389
+ await this.emit("inserted", {
390
+ mod: this,
391
+ payloads: insertedPayloads,
392
+ outPayloads: insertedPayloads,
393
+ inPayloads: payloads
394
+ });
395
+ }
396
+ this.reportPayloadCount();
397
+ return PayloadBuilder.omitPrivateStorageMeta(insertedPayloads);
398
+ });
412
399
  }
413
400
  nextHandler(_options) {
414
401
  throw new Error(NOT_IMPLEMENTED);
@@ -433,7 +420,7 @@ var AbstractArchivist = class _AbstractArchivist extends AbstractModuleInstance
433
420
  // eslint-disable-next-line max-statements
434
421
  async queryHandler(query, payloads, queryConfig) {
435
422
  const sanitizedQuery = PayloadBuilder.omitStorageMeta(query);
436
- const sanitizedPayloads = PayloadBuilder.omitStorageMeta(payloads);
423
+ const sanitizedPayloads = this.snapshotPayloads(payloads);
437
424
  const wrappedQuery = QueryBoundWitnessWrapper.parseQuery(sanitizedQuery, sanitizedPayloads);
438
425
  const queryPayload = await wrappedQuery.getQuery();
439
426
  assertEx(await this.queryable(sanitizedQuery, sanitizedPayloads, queryConfig));
@@ -444,7 +431,7 @@ var AbstractArchivist = class _AbstractArchivist extends AbstractModuleInstance
444
431
  break;
445
432
  }
446
433
  case ArchivistClearQuerySchema: {
447
- await this.clearHandler();
434
+ await this.clearWithConfig();
448
435
  break;
449
436
  }
450
437
  case ArchivistCommitQuerySchema: {
@@ -487,6 +474,10 @@ var AbstractArchivist = class _AbstractArchivist extends AbstractModuleInstance
487
474
  }
488
475
  return PayloadBuilder.omitPrivateStorageMeta(resultPayloads);
489
476
  }
477
+ /** Restore derived indexes for a stored root without rewriting its body. */
478
+ repairExistingPayloads(_payloads) {
479
+ return void 0;
480
+ }
490
481
  reportPayloadCount() {
491
482
  this._noOverride("reportPayloadCount");
492
483
  const gauge = this.payloadCountGauge;
@@ -513,8 +504,27 @@ var AbstractArchivist = class _AbstractArchivist extends AbstractModuleInstance
513
504
  async stateHandler() {
514
505
  return [...await super.stateHandler(), await this.generateStats()];
515
506
  }
507
+ /** Enforce backend admission before lookup, repair, insertion or parent writes. */
508
+ validateInsertPayloads(_payloads) {
509
+ return void 0;
510
+ }
511
+ /** Serialize local storage changes without holding a lock across callbacks or parents. */
512
+ async withStorageMutation(operation) {
513
+ return await operation();
514
+ }
516
515
  async writeToParent(parent, payloads) {
517
- return await parent.insert(PayloadBuilder.omitStorageMeta(payloads));
516
+ if (payloads.length === 0) return [];
517
+ const sanitized = PayloadBuilder.omitStorageMeta(payloads);
518
+ const hashes = [...new Set(await Promise.all(sanitized.map((payload) => PayloadBuilder.hash(payload))))];
519
+ const inserted = await this.exactRepresentations(await parent.insert(sanitized), hashes);
520
+ const insertedHashes = new Set(inserted.map((payload) => payload._hash));
521
+ const missing = hashes.filter((hash) => !insertedHashes.has(hash));
522
+ const existing = missing.length > 0 ? await this.exactRepresentations(await parent.get(missing), missing) : [];
523
+ const acknowledged = new Set([...inserted, ...existing].map((payload) => payload._hash));
524
+ if (hashes.some((hash) => !acknowledged.has(hash))) {
525
+ throw new Error("Write parent did not acknowledge all requested payloads");
526
+ }
527
+ return [...inserted, ...existing];
518
528
  }
519
529
  async writeToParents(payloads) {
520
530
  const parents = await this.parentArchivists();
@@ -524,16 +534,30 @@ var AbstractArchivist = class _AbstractArchivist extends AbstractModuleInstance
524
534
  })
525
535
  )).filter(exists).flat();
526
536
  }
527
- omitClientMetaForDataHashes(hashes, payloads) {
528
- return payloads.map((payload) => {
529
- if (hashes.includes(payload._dataHash) && !hashes.includes(payload._hash)) {
530
- const result = PayloadBuilder.omitClientMeta(payload);
531
- result._hash = result._dataHash;
532
- return result;
533
- } else {
534
- return payload;
537
+ async exactRepresentations(payloads, hashes) {
538
+ const requested = new Set(hashes);
539
+ const found = /* @__PURE__ */ new Map();
540
+ for (const payload of payloads) {
541
+ await this.verifyPayloadIdentity(payload);
542
+ if (requested.has(payload._hash)) found.set(payload._hash, payload);
543
+ }
544
+ return [...found.values()];
545
+ }
546
+ async requestedRepresentations(payloads, hashes) {
547
+ const requested = new Set(hashes);
548
+ const result = /* @__PURE__ */ new Map();
549
+ const sorted = payloads.toSorted(PayloadBuilder.compareStorageMeta);
550
+ for (const payload of sorted) {
551
+ await this.verifyPayloadIdentity(payload);
552
+ if (requested.has(payload._hash) && !result.has(payload._hash)) result.set(payload._hash, payload);
553
+ }
554
+ for (const payload of sorted) {
555
+ if (requested.has(payload._dataHash) && !result.has(payload._dataHash)) {
556
+ const dataOnly = PayloadBuilder.omitClientMeta(payload);
557
+ result.set(payload._dataHash, { ...dataOnly, _hash: payload._dataHash });
535
558
  }
536
- });
559
+ }
560
+ return [...result.values()];
537
561
  }
538
562
  async resolveArchivists(archivists = [], archivistInstances) {
539
563
  const archivistModules = (await Promise.all(archivists.map((archivist) => this.resolve(archivist)))).filter(exists).filter(duplicateModules);
@@ -553,9 +577,70 @@ var AbstractArchivist = class _AbstractArchivist extends AbstractModuleInstance
553
577
  return prev;
554
578
  }, archivistInstancesMap);
555
579
  }
580
+ snapshotPayloads(payloads) {
581
+ return JSON.parse(JSON.stringify(PayloadBuilder.omitStorageMeta(payloads)));
582
+ }
583
+ async verifyPayloadIdentity(payload) {
584
+ const canonicalPayload = PayloadBuilder.omitStorageMeta(payload);
585
+ const [hash, dataHash] = await Promise.all([
586
+ PayloadBuilder.hash(canonicalPayload),
587
+ PayloadBuilder.dataHash(canonicalPayload)
588
+ ]);
589
+ if (hash !== payload._hash || dataHash !== payload._dataHash) {
590
+ throw new Error("Archivist returned payload with invalid hash metadata");
591
+ }
592
+ }
593
+ async withCacheMutation(operation) {
594
+ this.activeCacheMutations++;
595
+ this.cacheGeneration++;
596
+ this._getCache?.clear();
597
+ try {
598
+ return await operation();
599
+ } finally {
600
+ this.activeCacheMutations--;
601
+ this.cacheGeneration++;
602
+ this._getCache?.clear();
603
+ }
604
+ }
556
605
  };
606
+
607
+ // src/modules/archivist-abstract/payloadAdmission.ts
608
+ import { PayloadBuilder as PayloadBuilder2 } from "@xyo-network/sdk-protocol";
609
+ function validByteLimit(value) {
610
+ return Number.isSafeInteger(value) && value > 0;
611
+ }
612
+ function validatePayloadAdmissionPolicy(policy) {
613
+ if (!policy || !Array.isArray(policy.allowedSchemas) || policy.allowedSchemas.some((schema) => typeof schema !== "string" || schema.length === 0 || schema.trim() !== schema) || !validByteLimit(policy.maxPayloadBytes)) {
614
+ throw new TypeError("Invalid payload admission policy");
615
+ }
616
+ if (policy.schemaMaxPayloadBytes !== void 0) {
617
+ if (policy.schemaMaxPayloadBytes === null || typeof policy.schemaMaxPayloadBytes !== "object" || Array.isArray(policy.schemaMaxPayloadBytes)) {
618
+ throw new TypeError("Invalid schema payload byte limits");
619
+ }
620
+ for (const [schema, limit] of Object.entries(policy.schemaMaxPayloadBytes)) {
621
+ if (!policy.allowedSchemas.includes(schema) || !validByteLimit(limit)) {
622
+ throw new TypeError("Invalid schema payload byte limits");
623
+ }
624
+ }
625
+ }
626
+ }
627
+ function validatePayloadAdmission(payloads, policy) {
628
+ validatePayloadAdmissionPolicy(policy);
629
+ const allowed = new Set(policy.allowedSchemas);
630
+ for (const payload of payloads) {
631
+ if (!allowed.has(payload.schema)) throw new Error("Payload schema is not admitted by this archivist");
632
+ const schemaLimit = policy.schemaMaxPayloadBytes && Object.hasOwn(policy.schemaMaxPayloadBytes, payload.schema) ? policy.schemaMaxPayloadBytes[payload.schema] : policy.maxPayloadBytes;
633
+ const limit = Math.min(policy.maxPayloadBytes, schemaLimit);
634
+ const json = JSON.stringify(PayloadBuilder2.omitStorageMeta(payload));
635
+ if (new TextEncoder().encode(json).byteLength > limit) {
636
+ throw new Error("Payload exceeds this archivist byte limit");
637
+ }
638
+ }
639
+ }
557
640
  export {
558
641
  AbstractArchivist,
559
- StorageClassLabel
642
+ StorageClassLabel,
643
+ validatePayloadAdmission,
644
+ validatePayloadAdmissionPolicy
560
645
  };
561
646
  //# sourceMappingURL=archivist-abstract.mjs.map