@cloudbitmaps/roaring 0.18.3 → 0.19.0
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/PRIVACY.md +10 -7
- package/README.md +3 -3
- package/dist/bin/export-segments.js +439 -465
- package/dist/bin/export-segments.js.map +3 -3
- package/dist/index.d.ts +128 -214
- package/dist/index.js +427 -465
- package/dist/index.js.map +3 -3
- package/dist/testing/conformance.d.ts +29 -2
- package/package.json +2 -2
package/dist/index.d.ts
CHANGED
|
@@ -23,7 +23,7 @@
|
|
|
23
23
|
* `checkConsistency`, `exportSegments` — reuse the store's own drivers, so you never re-pass them (they need the
|
|
24
24
|
* store built with a backend). See the README and the getting-started guide.
|
|
25
25
|
*/
|
|
26
|
-
import type { BudgetOption, GenerationEntry, GenerationMetadata, LoadGuard, LoadInput, LoadOptions, LoadRefusal, LoadResult,
|
|
26
|
+
import type { BudgetOption, GenerationEntry, GenerationMetadata, LoadGuard, LoadInput, LoadOptions, LoadRefusal, LoadResult, RollbackResult, Clock, StorageChunkSource, ConsistencyReport, CostReport, DropResult, EstimateInput, ExportManifest, ExportOptions, ExportSink, IAuditSink, IStorageDriver, IKeystore, IMetricsSink, StorageBackend, PricingProfile, RetentionPolicy, RetireExpiredOptions, RetireExpiredResult, RetryPolicy, Rng, SetRetentionResult, PinnedAt, IdRange, SegmentRef, Workload } from '@cloudbitmaps/core';
|
|
27
27
|
import type { SegmentInfo } from '@cloudbitmaps/core';
|
|
28
28
|
import type { CombineExpr, CombineManyFeedRecord, CombineManyOperandStats, CombineManyOutputStats, CombineManyStats } from '@cloudbitmaps/core';
|
|
29
29
|
import { deserializePortable } from './roaring-codec.js';
|
|
@@ -201,31 +201,13 @@ export interface SeamOptions {
|
|
|
201
201
|
/** Defaults to `Math.random`-backed. Drives transient-retry jitter. */
|
|
202
202
|
readonly rng?: Rng;
|
|
203
203
|
}
|
|
204
|
+
/**
|
|
205
|
+
* What {@link CloudRoaring.segment} takes besides the name. A handle carries no deadline: check one where you read,
|
|
206
|
+
* or record it with {@link CloudRoaring.setRetention} and run {@link CloudRoaring.retireExpired}. An `expiresAt`
|
|
207
|
+
* passed here is refused with {@link ValidationError}.
|
|
208
|
+
*/
|
|
204
209
|
export interface SegmentOptions {
|
|
205
210
|
readonly namespace?: string;
|
|
206
|
-
/**
|
|
207
|
-
* **When this segment stops being readable** — an absolute epoch-ms instant, declared where the segment is
|
|
208
|
-
* named instead of in a separate `setRetention` call.
|
|
209
|
-
*
|
|
210
|
-
* Every read through this handle checks it first: past the deadline, `has` is `false`, `count` is `0`, and
|
|
211
|
-
* `iterate` yields nothing — **one integer compare against the injected clock, no I/O, on every backend**.
|
|
212
|
-
* That is Redis's lazy expiry, and it is what makes an expiry *correct* rather than *eventually correct*: a
|
|
213
|
-
* deployment whose sweep is late — or which has no sweep at all, like a Lambda-only reader — still stops
|
|
214
|
-
* serving the data on time.
|
|
215
|
-
*
|
|
216
|
-
* **Two things this does NOT do, both deliberate:**
|
|
217
|
-
*
|
|
218
|
-
* - It does not reclaim the bytes. That is {@link CloudRoaring.retireExpired}, and until it runs the data is
|
|
219
|
-
* still stored and still billed. `count()` reporting 0 while objects exist is the expected state in that
|
|
220
|
-
* window, not a bug.
|
|
221
|
-
* - It does not apply to *other* handles. The deadline lives on this handle; a second handle opened without
|
|
222
|
-
* the option reads the segment normally. Record the policy with {@link CloudRoaring.setRetention} to make
|
|
223
|
-
* it durable, fleet-visible, and reclaimable.
|
|
224
|
-
*
|
|
225
|
-
* Must be **milliseconds** since the epoch and at or after {@link MIN_EXPIRES_AT_MS} — a seconds value would
|
|
226
|
-
* land in 1970 and make the segment permanently unreadable, so it is refused rather than honoured.
|
|
227
|
-
*/
|
|
228
|
-
readonly expiresAt?: number;
|
|
229
211
|
}
|
|
230
212
|
/** A segment reference in a subject report / erasure ledger. */
|
|
231
213
|
export interface SubjectSegmentRef {
|
|
@@ -362,10 +344,9 @@ export interface MaterializeManyFeed {
|
|
|
362
344
|
/** The options of {@link CloudRoaring.materializeMany}. */
|
|
363
345
|
export interface MaterializeManyOptions extends IdRange {
|
|
364
346
|
/**
|
|
365
|
-
* The
|
|
366
|
-
* operand is accepted here and nowhere else.
|
|
347
|
+
* The stored segments the expressions name. A set the caller holds in memory arrives as a {@link MaterializeManyOptions.feed}.
|
|
367
348
|
*/
|
|
368
|
-
readonly operands: Record<string, Segment
|
|
349
|
+
readonly operands: Record<string, Segment>;
|
|
369
350
|
/** The outputs, in the order their results come back. */
|
|
370
351
|
readonly outputs: ReadonlyArray<MaterializeManyOutput>;
|
|
371
352
|
/**
|
|
@@ -409,10 +390,9 @@ export interface MaterializeManyOptions extends IdRange {
|
|
|
409
390
|
*/
|
|
410
391
|
readonly feed?: MaterializeManyFeed;
|
|
411
392
|
/**
|
|
412
|
-
* Fed
|
|
413
|
-
*
|
|
414
|
-
*
|
|
415
|
-
* {@link ValidationError}.
|
|
393
|
+
* Fed operand names allowed to hold no id. A declared fed name that appears in no record is refused at the end of the
|
|
394
|
+
* feed, because an operand that is empty is usually an upstream query that failed quietly. Naming something that is not
|
|
395
|
+
* a fed operand is a {@link ValidationError}.
|
|
416
396
|
*/
|
|
417
397
|
readonly mayBeEmpty?: readonly string[];
|
|
418
398
|
}
|
|
@@ -435,6 +415,42 @@ export interface MaterializeManyRun {
|
|
|
435
415
|
readonly outputs: MaterializeManyOutcome[];
|
|
436
416
|
readonly stats: MaterializeManyStats;
|
|
437
417
|
}
|
|
418
|
+
/**
|
|
419
|
+
* {@link MaterializeManyOptions} for a **dry run**: every output is computed exactly as the call would compute it, and
|
|
420
|
+
* judged against its `dest` as its publish would be, and nothing is written. See {@link CloudRoaring.materializeMany}.
|
|
421
|
+
*/
|
|
422
|
+
export interface MaterializeManyDryRunOptions extends MaterializeManyOptions {
|
|
423
|
+
readonly dryRun: true;
|
|
424
|
+
}
|
|
425
|
+
/**
|
|
426
|
+
* What one output of a dry run would come to, with nothing written: its size, what its `dest` holds now, and the bound
|
|
427
|
+
* its publish would be refused for now. `published` is always `false`, so code that branches on it never takes a dry
|
|
428
|
+
* run for a publish.
|
|
429
|
+
*/
|
|
430
|
+
export interface MaterializeDryRunResult {
|
|
431
|
+
readonly dryRun: true;
|
|
432
|
+
readonly published: false;
|
|
433
|
+
/** Distinct ids the output would hold. */
|
|
434
|
+
readonly cardinality: number;
|
|
435
|
+
/** What `dest` holds now: `null` when it has no current generation, or its object is gone. Always read. */
|
|
436
|
+
readonly cardinalityBefore: number | null;
|
|
437
|
+
/** The bound a publish of the output would be refused for, judged now; absent when it would publish. */
|
|
438
|
+
readonly wouldRefuse?: MaterializeRefusal;
|
|
439
|
+
}
|
|
440
|
+
/**
|
|
441
|
+
* What one output of a dry run came to: a {@link MaterializeDryRunResult}, or `{ published: false, error }` for what its
|
|
442
|
+
* publish would have thrown or what stopped it, as on a call that publishes.
|
|
443
|
+
*/
|
|
444
|
+
export type MaterializeManyDryRunOutcome = MaterializeDryRunResult | {
|
|
445
|
+
readonly published: false;
|
|
446
|
+
readonly error: Error;
|
|
447
|
+
};
|
|
448
|
+
/** The result of {@link CloudRoaring.materializeMany} with `dryRun: true`. */
|
|
449
|
+
export interface MaterializeManyDryRun {
|
|
450
|
+
/** One per output, in the order given. */
|
|
451
|
+
readonly outputs: MaterializeManyDryRunOutcome[];
|
|
452
|
+
readonly stats: MaterializeManyStats;
|
|
453
|
+
}
|
|
438
454
|
/** What an `*Into` verb wrote: the new generation of the destination, and whether it became current. */
|
|
439
455
|
export interface MaterializeResult {
|
|
440
456
|
/**
|
|
@@ -456,8 +472,8 @@ export interface MaterializeResult {
|
|
|
456
472
|
readonly cardinality: number;
|
|
457
473
|
/**
|
|
458
474
|
* What the destination held when the guard judged it — `null` when it had no current generation, **or when
|
|
459
|
-
* no bound needed it**. It is taken only when a bound will use it: `allowEmpty: true` with
|
|
460
|
-
* `guard.minRetained` skips it, and this is `null` even though `dest` was non-empty. When the destination's row
|
|
475
|
+
* no bound needed it**. It is taken only when a bound will use it: `allowEmpty: true` with neither
|
|
476
|
+
* `guard.minRetained` nor `guard.maxGrowth` skips it, and this is `null` even though `dest` was non-empty. When the destination's row
|
|
461
477
|
* carries a summary of its current generation the count comes from the row and the object is not read; a row
|
|
462
478
|
* written before rows carried a summary costs one object-header fetch.
|
|
463
479
|
*/
|
|
@@ -502,6 +518,11 @@ export declare class CloudRoaring {
|
|
|
502
518
|
* another library's config spread into this one — so every key is checked against {@link OPTION_KEYS}.
|
|
503
519
|
*/
|
|
504
520
|
private static rejectUnknownOptions;
|
|
521
|
+
/**
|
|
522
|
+
* A seam the store calls through must have the methods it calls. Without this a `clock` with no `now`, an `rng` with
|
|
523
|
+
* no `next` or a keystore with no `createDek` builds a store that throws a raw `TypeError` at its first load or read.
|
|
524
|
+
*/
|
|
525
|
+
private static rejectHollowSeams;
|
|
505
526
|
constructor(options: CloudRoaringOptions);
|
|
506
527
|
/**
|
|
507
528
|
* The write-side deps, from the store's own drivers, for the lifecycle helpers and the `*Into` verbs. Requires
|
|
@@ -510,14 +531,20 @@ export declare class CloudRoaring {
|
|
|
510
531
|
* every write publishes.
|
|
511
532
|
*/
|
|
512
533
|
private lifecycleDeps;
|
|
513
|
-
/**
|
|
534
|
+
/**
|
|
535
|
+
* Get a handle to a segment. Validates the name (non-empty, well-formed, within the encoded-length cap). The options
|
|
536
|
+
* are `{ namespace }` and nothing else: anything else is refused with {@link ValidationError}, by name, since a
|
|
537
|
+
* misspelt `namespace` would otherwise address the default namespace. An `expiresAt` among them is refused with its own
|
|
538
|
+
* message: a handle carries no deadline, and one left unread would serve the data past it. A key whose value is
|
|
539
|
+
* `undefined` is read as absent, so a spread of options keeps working.
|
|
540
|
+
*/
|
|
514
541
|
segment(name: string, options?: SegmentOptions): Segment;
|
|
515
542
|
/**
|
|
516
543
|
* Write `ids` as a **new generation of `dest`** and publish it — the shared body of the `*Into` verbs. An `*Into`
|
|
517
544
|
* materialisation is a load, and publishes the same way (hard invariant 1): every load that finds a row fences its
|
|
518
545
|
* publish on the row's token; a guarded load (the default, since the empty refusal needs the size of the current generation)
|
|
519
546
|
* also fences on the pointer it judged (`expectFrom`), and one that found no row fences on that absence instead.
|
|
520
|
-
* Only an unguarded load (`allowEmpty: true
|
|
547
|
+
* Only an unguarded load (`allowEmpty: true`, with neither `guard.minRetained` nor `guard.maxGrowth`) onto a segment with no row publishes bare
|
|
521
548
|
* forward-only. The destination's previous generation stays readable until the publish lands (readers re-resolve
|
|
522
549
|
* within `cache.genTtlMs`).
|
|
523
550
|
*
|
|
@@ -554,35 +581,29 @@ export declare class CloudRoaring {
|
|
|
554
581
|
*/
|
|
555
582
|
private materialize;
|
|
556
583
|
/**
|
|
557
|
-
* **
|
|
558
|
-
*
|
|
559
|
-
*
|
|
560
|
-
*
|
|
561
|
-
*
|
|
562
|
-
*
|
|
563
|
-
*
|
|
564
|
-
*
|
|
565
|
-
* It takes what {@link CloudRoaring.load} takes as input (ids as a sync or async iterable or a typed array, `{ bitmap }`
|
|
566
|
-
* or `{ serialized }`) and checks it the same way, with the same errors: the size cap, the structure, the safe
|
|
567
|
-
* deserializer and each id's range. **Only a real `Uint32Array` skips the per-id range check**; any other typed array goes
|
|
568
|
-
* through it, so `Int32Array([-1])` and `Float64Array([1.5])` throw {@link ValidationError}. An object with an `ascending`
|
|
569
|
-
* key is refused: ids that arrive in key order are a `feed`. An empty set is accepted here, and refused by
|
|
570
|
-
* `materializeMany` unless its name is in `mayBeEmpty`.
|
|
571
|
-
*
|
|
572
|
-
* The ids are held as the chunks a stored generation would hold, until {@link MemoryOperand.release}; between calls that
|
|
573
|
-
* memory is the caller's, and during a call it counts against `maxBufferedBytes`. There is no size option: the load's
|
|
574
|
-
* own cap applies to a serialized input.
|
|
584
|
+
* **A dry run:** every output computed exactly as the call would compute it, and judged against its `dest` as its
|
|
585
|
+
* publish would be, with nothing written: no object, no pointer, no audit event. Each output's result says how many ids
|
|
586
|
+
* it would hold, what its `dest` holds now, and the bound its publish would be refused for now (`wouldRefuse`). The
|
|
587
|
+
* call reads its operands as a publishing call does, takes its feed if it has one, and fails an output for what would
|
|
588
|
+
* fail its publish (a `dest` whose lease has ended, a destroyed one, a moved exclude, an erasure). It reads the operands as
|
|
589
|
+
* the publishing call does, and for each output the reads a publish's guard makes: one registry read for `dest`'s size,
|
|
590
|
+
* or two where its row has no usable summary. It holds the memory a publish would, so it fails for memory where one
|
|
591
|
+
* would, and reports to the metrics sink as the same `materializeMany` op.
|
|
575
592
|
*
|
|
576
|
-
*
|
|
577
|
-
*
|
|
578
|
-
*
|
|
579
|
-
|
|
580
|
-
|
|
581
|
-
|
|
582
|
-
*
|
|
583
|
-
* @
|
|
593
|
+
* What it reports holds for now only: a publish made later reads the operands and judges each `dest` as they are then.
|
|
594
|
+
* To publish what was reviewed, call again without `dryRun`, on the same pinned handles or with the same feed (the
|
|
595
|
+
* guide's recipe).
|
|
596
|
+
*/
|
|
597
|
+
materializeMany(options: MaterializeManyDryRunOptions): Promise<MaterializeManyDryRun>;
|
|
598
|
+
/**
|
|
599
|
+
* The call with `dryRun` a switch held in a variable, optional or not: a {@link MaterializeManyDryRun} when it is
|
|
600
|
+
* `true` and a {@link MaterializeManyRun} when it is `false` or absent, so with a `boolean` (or `boolean | undefined`)
|
|
601
|
+
* the result is typed as either, and the flag passed says which. A literal `true` or `false`, and a call without
|
|
602
|
+
* `dryRun`, are typed exactly, as by the forms either side of this one.
|
|
584
603
|
*/
|
|
585
|
-
|
|
604
|
+
materializeMany<D extends boolean | undefined = undefined>(options: MaterializeManyOptions & {
|
|
605
|
+
readonly dryRun?: D;
|
|
606
|
+
}): Promise<D extends true ? MaterializeManyDryRun : MaterializeManyRun>;
|
|
586
607
|
/**
|
|
587
608
|
* **Many outputs, each operand read once per group.** Each output is an expression over named stored operands (`and`, `or`, `andNot`, nested
|
|
588
609
|
* to depth 64) published as a new generation of its own `dest`, exactly as an `*Into` would publish it, but computed
|
|
@@ -631,10 +652,10 @@ export declare class CloudRoaring {
|
|
|
631
652
|
* **Untrusted bytes.** Every operand chunk is decoded through the checks on untrusted tier data. A key an operand's index
|
|
632
653
|
* lists whose bytes are missing is an error for the outputs that read the operand, never an empty chunk.
|
|
633
654
|
*
|
|
634
|
-
* **Handles.**
|
|
635
|
-
* as on the `*Into` verbs. A leased operand's lease
|
|
636
|
-
*
|
|
637
|
-
*
|
|
655
|
+
* **Handles.** A handle anywhere in the call (an operand or a `dest`) whose lease has ended or was released is refused
|
|
656
|
+
* before any request, as on the `*Into` verbs. A leased operand's lease is checked before each chunk key is read: a
|
|
657
|
+
* lapse fails only the outputs that read that operand, never reads empty. Each `dest`'s lease is checked again just
|
|
658
|
+
* before its publish.
|
|
638
659
|
*
|
|
639
660
|
* **The chunk cache is bypassed:** the pass reads through the storage source and never writes the decoded-chunk cache, so
|
|
640
661
|
* a batch does not evict other readers' hot chunks. Each publish still invalidates its `dest` as an `*Into` does.
|
|
@@ -642,13 +663,6 @@ export declare class CloudRoaring {
|
|
|
642
663
|
* **A limit of the form.** An output cannot name another output of the same call: a `dest` that is also an operand is
|
|
643
664
|
* refused. Chain two calls.
|
|
644
665
|
*
|
|
645
|
-
* **Held operands.** An operand may be a {@link MemoryOperand} from {@link CloudRoaring.memory}: ids the caller holds,
|
|
646
|
-
* read beside the stored ones and giving the same output byte for byte. It is read from memory (no request, and the
|
|
647
|
-
* shared chunk cache never sees it), counts against `maxBufferedBytes` while the call runs, and is refused when empty
|
|
648
|
-
* unless its name is in `mayBeEmpty`. A handle from another store, or a released one, is a {@link ValidationError}. An
|
|
649
|
-
* erasure in this store since the handle was made fails the outputs that read it with {@link StaleOperandError}
|
|
650
|
-
* (`reason: 'erased'`).
|
|
651
|
-
*
|
|
652
666
|
* **A feed.** `feed: { names, records, counts }` adds operands that arrive as records in chunk-key order, for conditions
|
|
653
667
|
* too many to hold or store. Each record is checked before the pass sees it (see {@link MaterializeManyFeedRecord}): a bad
|
|
654
668
|
* feed is refused, never read as fewer members, and **a fed output is published only after the whole feed was read and every
|
|
@@ -674,7 +688,14 @@ export declare class CloudRoaring {
|
|
|
674
688
|
* });
|
|
675
689
|
* ```
|
|
676
690
|
*/
|
|
677
|
-
materializeMany(options: MaterializeManyOptions
|
|
691
|
+
materializeMany(options: MaterializeManyOptions & {
|
|
692
|
+
readonly dryRun?: false;
|
|
693
|
+
}): Promise<MaterializeManyRun>;
|
|
694
|
+
/**
|
|
695
|
+
* A dry run's publish of one output: count what the finished chunks hold, and judge that size against `dest` as a
|
|
696
|
+
* load would, writing nothing.
|
|
697
|
+
*/
|
|
698
|
+
private judgeOutput;
|
|
678
699
|
private epochNow;
|
|
679
700
|
/**
|
|
680
701
|
* Whether an erasure has started in this store since `at` was read, or was running when it was: one that is still
|
|
@@ -691,10 +712,8 @@ export declare class CloudRoaring {
|
|
|
691
712
|
* can be taken again once its object is gone.
|
|
692
713
|
*/
|
|
693
714
|
private currentRowOf;
|
|
694
|
-
/** Throw what a read of `handle` must throw now: its lease error,
|
|
695
|
-
private
|
|
696
|
-
/** {@link assertReadable} for a destination, named by where it sits in the call. */
|
|
697
|
-
private assertWritable;
|
|
715
|
+
/** Throw what a read of, or a publish to, `handle` must throw now: its lease error, if it has one. */
|
|
716
|
+
private assertLease;
|
|
698
717
|
/**
|
|
699
718
|
* **Subject access (GDPR Art. 15 / CCPA right-to-know): which segments is this id a member of?**
|
|
700
719
|
*
|
|
@@ -750,8 +769,9 @@ export declare class CloudRoaring {
|
|
|
750
769
|
* every generation below its new pointer — the one this rewrite is streaming, and the object this rewrite
|
|
751
770
|
* just wrote — so the loser can find its own inputs deleted mid-flight. That surfaces as an outcome rather than
|
|
752
771
|
* an error, read off the row: a moved pointer is a `'superseded'` entry, which a re-run settles, and a segment
|
|
753
|
-
* that a concurrent `dropSegment` tombstoned or a retention sweep purged is left out of the ledger
|
|
754
|
-
*
|
|
772
|
+
* that a concurrent `dropSegment` tombstoned or a retention sweep purged is left out of the ledger. A tombstoned
|
|
773
|
+
* segment is still searched: a cleartext object left under it that holds the id is deleted, with everything under
|
|
774
|
+
* the tombstone, and the entry reads `erased: true`.
|
|
755
775
|
*
|
|
756
776
|
* **Read `note` on any `erased: false` entry — the two reasons mean different things.** `'superseded'` means
|
|
757
777
|
* another writer (a load, another erasure, or a rollback) moved the pointer mid-call, so **this call** did not
|
|
@@ -809,10 +829,9 @@ export declare class CloudRoaring {
|
|
|
809
829
|
* exists. It is `false` for a segment whose row was minted ahead of its first load (by `setRetention`) and
|
|
810
830
|
* for a `destroyed` tombstone, because a read answers empty in both cases.
|
|
811
831
|
*
|
|
812
|
-
*
|
|
832
|
+
* One state answers `true` where a read still gives you nothing: a torn restore (a live pointer whose object
|
|
813
833
|
* was deleted) makes reads of the object *throw* rather than answer empty, while a cold `count()` answers the number
|
|
814
|
-
* its row records — `checkConsistency` is the call for that
|
|
815
|
-
* a handle carrying an expired `expiresAt` reads empty by a rule that lives on the handle, not the row.
|
|
834
|
+
* its row records — `checkConsistency` is the call for that.
|
|
816
835
|
*
|
|
817
836
|
* Not a lock: the answer can change the moment it returns. If it has to hold, use the fence built for that —
|
|
818
837
|
* `load`'s `guard`, or `expectFrom`/`expectToken` on a publish. Needs a storage backend.
|
|
@@ -1130,55 +1149,6 @@ export declare class CloudRoaring {
|
|
|
1130
1149
|
retireExpired(options?: Omit<RetireExpiredOptions, 'now'> & {
|
|
1131
1150
|
now?: number;
|
|
1132
1151
|
}): Promise<RetireExpiredResult>;
|
|
1133
|
-
/**
|
|
1134
|
-
* **Remove the registry rows that releases before 0.12.0 left as `deleted: true` envelopes.** Those releases never
|
|
1135
|
-
* removed a row they deleted, and no later call removes it either: it is invisible to every read, and every full
|
|
1136
|
-
* listing of the registry still reads it (one GET each). This is the one call that removes them. It is an admin call,
|
|
1137
|
-
* not a sweep, and nothing schedules it: run it once after the last process on a release before 0.12.0 is gone.
|
|
1138
|
-
*
|
|
1139
|
-
* ```ts
|
|
1140
|
-
* const preview = await store.reapRegistryTombstones({ dryRun: true });
|
|
1141
|
-
* console.log(`would remove ${preview.wouldReap} of ${preview.examined} rows read`);
|
|
1142
|
-
*
|
|
1143
|
-
* const done = await store.reapRegistryTombstones({ confirmNoLegacyWriters: true });
|
|
1144
|
-
* if (done.limited) runAgain(); // `limit` (default 1,000) stopped the run with rows unread
|
|
1145
|
-
* ```
|
|
1146
|
-
*
|
|
1147
|
-
* **What it removes.** Only a row that is `deleted: true` and whose token carries no incarnation id, which is what a
|
|
1148
|
-
* release before 0.12.0 left, or a 0.12.0 or later release left by deleting a row born before 0.12.0 (both are safe to
|
|
1149
|
-
* remove), whatever its `status`. It never touches a live row, a `destroyed` row that is not `deleted` (a crypto-shred's
|
|
1150
|
-
* or a `dropSegment`'s tombstone: the attestation of an erasure, which it cannot tell from another), or a deleted row
|
|
1151
|
-
* with an incarnation id, and it never touches a generation. **So it does not clean a bucket completely**: the
|
|
1152
|
-
* `destroyed` tombstones `dropSegment` leaves stay, so do live rows written before 0.12.0, and so does a tombstone a
|
|
1153
|
-
* 0.12.0 or later release wrote while `conditionalDelete` was off (GCS by default, S3 on a custom endpoint): every full
|
|
1154
|
-
* listing still reads it, and this call neither removes it nor runs on such a store.
|
|
1155
|
-
* It also covers the library's own bookkeeping rows when `namespace` is not set, by the same rule. The default
|
|
1156
|
-
* namespace cannot be scoped to: leave `namespace` out to cover it.
|
|
1157
|
-
*
|
|
1158
|
-
* **The two things it asks.** `confirmNoLegacyWriters: true` is required for a real run (without it, a
|
|
1159
|
-
* `ValidationError`, and nothing is requested): your statement that no process on a release before 0.12.0 writes
|
|
1160
|
-
* this registry, since one that did would, re-creating a removed name, issue the removed row's tokens again. And the
|
|
1161
|
-
* registry must apply a delete under a precondition: where its `conditionalDelete` capability is off (GCS by default,
|
|
1162
|
-
* S3 on a custom endpoint) it throws `CapabilityError` before any request, dry run included. A registry that keeps
|
|
1163
|
-
* no such rows (the in-memory and local-filesystem ones) throws `UnsupportedError`.
|
|
1164
|
-
*
|
|
1165
|
-
* **Each removal is fenced** on the version it read, so a `create` that lands over the envelope first wins, the
|
|
1166
|
-
* delete is refused, and the row is counted as `skipped.raced` (which also counts a row already gone). That holds where
|
|
1167
|
-
* the backend applies the precondition, which auto-detection checks (S3 only on an AWS host). On an endpoint that
|
|
1168
|
-
* ignores `If-Match` (MinIO, fake-gcs-server), a `conditionalDelete: true` you set makes this an unfenced delete: run
|
|
1169
|
-
* it with every writer stopped. On a versioned bucket a delete leaves a delete marker and the earlier version, record
|
|
1170
|
-
* included, so the name is not erased from the bucket. A `create` that had already read the envelope and
|
|
1171
|
-
* whose write meets the removal throws `WriteConflictError`, which this library does not retry: retry the create, and
|
|
1172
|
-
* it finds no row and writes one.
|
|
1173
|
-
*
|
|
1174
|
-
* **Cost** over R rows read and E removed: `ceil(R / 1000)` LIST requests, R GETs and E DELETEs (a dry run, no
|
|
1175
|
-
* DELETEs). `limit` bounds the removals, and the run stops listing once it is spent. **A run is not resumable**: each
|
|
1176
|
-
* lists and reads from the start (R GETs whatever the `limit`), a dry run with a `limit` reports the same first rows
|
|
1177
|
-
* every time, so `wouldReap` is a total only when `limited` is `false`, and `limited` is `true` whenever the limit was
|
|
1178
|
-
* spent with keys left, removable or not. An unreadable object stops the run with an error naming its key, and
|
|
1179
|
-
* removes nothing more: it may be a newer release's row. Scope the run with `namespace` to get past one.
|
|
1180
|
-
*/
|
|
1181
|
-
reapRegistryTombstones(options?: ReapRegistryTombstonesOptions): Promise<ReapRegistryTombstonesResult>;
|
|
1182
1152
|
/**
|
|
1183
1153
|
* **Forget everything this store has cached about a segment.** Use it after destroying or retiring a segment
|
|
1184
1154
|
* through a path this store did not perform itself.
|
|
@@ -1292,6 +1262,8 @@ export declare class CloudRoaring {
|
|
|
1292
1262
|
/**
|
|
1293
1263
|
* Planning cost estimate — pure, no instance/data needed: sizing, sales, what-if. For a real, grounded report
|
|
1294
1264
|
* from live segment sizes, use `store.segment(name).costReport()`. See {@link CostReport}.
|
|
1265
|
+
* @deprecated Moves to `@cloudbitmaps/tools`, a package of its own, with a `size` on `stat()` so a grounded report
|
|
1266
|
+
* needs nothing internal. It is a planning tool, and its price list is as old as the release that ships it.
|
|
1295
1267
|
*/
|
|
1296
1268
|
static estimateCost(input: EstimateInput): CostReport;
|
|
1297
1269
|
}
|
|
@@ -1344,11 +1316,7 @@ export interface BaseCombineOptions extends IdRange {
|
|
|
1344
1316
|
* list costs reads proportional to the audience, not to itself.
|
|
1345
1317
|
*/
|
|
1346
1318
|
export interface CombineOptions extends BaseCombineOptions {
|
|
1347
|
-
/**
|
|
1348
|
-
* Segments whose ids are subtracted from the result. An **expired** handle here is refused, in every combine:
|
|
1349
|
-
* the stream throws {@link ValidationError} naming it, before any request is made, exactly as in
|
|
1350
|
-
* {@link Segment.andNot}.
|
|
1351
|
-
*/
|
|
1319
|
+
/** Segments whose ids are subtracted from the result. */
|
|
1352
1320
|
readonly exclude?: Segment[];
|
|
1353
1321
|
}
|
|
1354
1322
|
/**
|
|
@@ -1472,26 +1440,6 @@ export interface SegmentStat {
|
|
|
1472
1440
|
/** The metadata the generation was loaded with; absent when it has none. */
|
|
1473
1441
|
readonly metadata?: GenerationMetadata;
|
|
1474
1442
|
}
|
|
1475
|
-
/**
|
|
1476
|
-
* A set of ids held in memory by {@link CloudRoaring.memory}, to be an operand of {@link CloudRoaring.materializeMany}
|
|
1477
|
-
* and of no other verb. The bytes are the caller's until {@link MemoryOperand.release}.
|
|
1478
|
-
*
|
|
1479
|
-
* It belongs to the store that made it. `eraseSubject` in that store, started after the handle began to be made or still
|
|
1480
|
-
* running when it was, fails the outputs of a `materializeMany` call that read it with {@link StaleOperandError}
|
|
1481
|
-
* (`reason: 'erased'`): the call does not throw, and its outputs that do not read the handle publish. Nothing else is
|
|
1482
|
-
* seen: an erasure in another store or process, and
|
|
1483
|
-
* `dropSegment`, `eraseNamespace`, `destroySegment` and the free function `eraseIdFromSegment`, do not move the counter.
|
|
1484
|
-
*/
|
|
1485
|
-
export declare class MemoryOperand {
|
|
1486
|
-
private readonly view;
|
|
1487
|
-
/** Not constructible: a handle comes from {@link CloudRoaring.memory}. */
|
|
1488
|
-
private constructor();
|
|
1489
|
-
/**
|
|
1490
|
-
* Zero and drop the bytes it holds. Any later use throws {@link ValidationError}; releasing twice does nothing. A call
|
|
1491
|
-
* still reading it fails the outputs that read it.
|
|
1492
|
-
*/
|
|
1493
|
-
release(): void;
|
|
1494
|
-
}
|
|
1495
1443
|
/**
|
|
1496
1444
|
* A handle bound to one segment — the read verbs, plus the three `*Into` verbs that write a **new generation**
|
|
1497
1445
|
* of another segment.
|
|
@@ -1511,8 +1459,6 @@ export declare class Segment {
|
|
|
1511
1459
|
private readonly materialize;
|
|
1512
1460
|
private readonly pinned;
|
|
1513
1461
|
private readonly combineEngine;
|
|
1514
|
-
/** Absolute epoch-ms deadline from {@link SegmentOptions.expiresAt}; `undefined` ⇒ this handle never expires. */
|
|
1515
|
-
readonly expiresAt?: number;
|
|
1516
1462
|
/**
|
|
1517
1463
|
* The generation this handle is held at, when it came from {@link Segment.pin}. Read by the store so a
|
|
1518
1464
|
* pinned handle passed as an **operand** is still read at its pin rather than live.
|
|
@@ -1612,8 +1558,8 @@ export declare class Segment {
|
|
|
1612
1558
|
pin(options?: PinOptions): Promise<Segment>;
|
|
1613
1559
|
/**
|
|
1614
1560
|
* Hold what this pin names until `leaseUntil`, or `undefined` for a pin with no lease. Refuses an option it does not
|
|
1615
|
-
* know, a value that is not epoch-milliseconds in the future, one past the longest lease,
|
|
1616
|
-
*
|
|
1561
|
+
* know, a value that is not epoch-milliseconds in the future, and one past the longest lease, before any request is
|
|
1562
|
+
* made.
|
|
1617
1563
|
*/
|
|
1618
1564
|
private leaseUntilOf;
|
|
1619
1565
|
/**
|
|
@@ -1627,12 +1573,17 @@ export declare class Segment {
|
|
|
1627
1573
|
release(): Promise<void>;
|
|
1628
1574
|
/**
|
|
1629
1575
|
* The error a read of this handle must throw, or `undefined` when it holds no lease or the lease is live. One property
|
|
1630
|
-
* read on a handle with no lease.
|
|
1576
|
+
* read on a handle with no lease. A read past a lease throws; it never reads empty.
|
|
1631
1577
|
*/
|
|
1632
1578
|
private leaseError;
|
|
1579
|
+
/**
|
|
1580
|
+
* Refuse with a {@link ValidationError} anything among `handles` that is not a segment, a value a JavaScript caller
|
|
1581
|
+
* passed. It runs first in every combine, before the lease check reads the handles.
|
|
1582
|
+
*/
|
|
1583
|
+
private assertSegments;
|
|
1633
1584
|
/**
|
|
1634
1585
|
* Throw the first lease error among `handles`: this handle and every operand and exclude of a call. It runs before
|
|
1635
|
-
*
|
|
1586
|
+
* the engine, so no operand, exclude or cached reader can answer past a lease.
|
|
1636
1587
|
*/
|
|
1637
1588
|
private assertLeases;
|
|
1638
1589
|
/**
|
|
@@ -1666,36 +1617,15 @@ export declare class Segment {
|
|
|
1666
1617
|
*/
|
|
1667
1618
|
key(): string;
|
|
1668
1619
|
/**
|
|
1669
|
-
*
|
|
1670
|
-
*
|
|
1671
|
-
*
|
|
1672
|
-
* Deliberately evaluated per call rather than cached: a long-lived handle created before its deadline must
|
|
1673
|
-
* start reading empty the moment the deadline passes, without the caller re-creating it.
|
|
1674
|
-
*/
|
|
1675
|
-
private expired;
|
|
1676
|
-
/**
|
|
1677
|
-
* Refuse a materialisation that involves an **expired** handle. Called by the three `*Into` verbs only.
|
|
1678
|
-
*
|
|
1679
|
-
* On the read verbs an expired handle answers empty, which is the point of lazy expiry. On a *write* the same
|
|
1680
|
-
* rule would be destructive in a way nobody asks for: `a.intersectInto(dest, [b])` where `b`'s deadline has
|
|
1681
|
-
* quietly passed would, unrefused, replace `dest` with an **empty generation** — a wipe, reported as a successful
|
|
1682
|
-
* write, with the cause (a deadline on a handle somewhere) nowhere in the result. Reads degrade to empty; writes must not.
|
|
1683
|
-
*
|
|
1684
|
-
* So every handle in the call is checked, `dest` included: an expired `dest` does not change the bytes written,
|
|
1685
|
-
* but a caller who put a deadline on the thing they are writing into has said something contradictory and is
|
|
1686
|
-
* better told than guessed at. Open a handle without `expiresAt` to write, or drop the deadline.
|
|
1687
|
-
*
|
|
1688
|
-
* (The broader guard — refusing to publish an empty or implausible generation over a non-empty one, with an
|
|
1689
|
-
* `allowEmpty` override — covers these verbs too: they route through the same guarded write path as
|
|
1690
|
-
* {@link CloudRoaring.load}. The two stay separate because they differ in kind. That one is a REPORTED
|
|
1691
|
-
* refusal a caller may legitimately override; an expired handle is a wiring mistake, so it THROWS, before
|
|
1692
|
-
* any object is written — and `allowEmpty: true` does not reach it.)
|
|
1620
|
+
* Refuse an `*Into` whose handles cannot be read, before any object is written: anything that is not a segment
|
|
1621
|
+
* ({@link ValidationError}), and a handle (this one, `dest` or an operand) whose lease has ended or was released
|
|
1622
|
+
* ({@link LeaseExpiredError}). Called by the three `*Into` verbs only.
|
|
1693
1623
|
*
|
|
1694
1624
|
* The verbs are `async` so this surfaces as a **rejected promise**, like every other validation in the facade —
|
|
1695
1625
|
* a synchronous throw out of a promise-returning method escapes a caller who attached `.catch()` instead of
|
|
1696
1626
|
* awaiting.
|
|
1697
1627
|
*/
|
|
1698
|
-
private
|
|
1628
|
+
private assertIntoHandles;
|
|
1699
1629
|
/** `result` as is, or, when a handle of the call holds a lease, checking that lease each time it reads a chunk. */
|
|
1700
1630
|
private guarded;
|
|
1701
1631
|
/**
|
|
@@ -1728,8 +1658,8 @@ export declare class Segment {
|
|
|
1728
1658
|
* What the generation this handle reads is, from one resolution: its number, its id count and the metadata it
|
|
1729
1659
|
* was loaded with (absent when it has none). It is what answers {@link Segment.count}, so the three describe one
|
|
1730
1660
|
* generation and cannot straddle a publish. One registry read when cold, none while warm, and none on a pinned
|
|
1731
|
-
* handle, which answers for the generation it pinned. A segment with no generation
|
|
1732
|
-
*
|
|
1661
|
+
* handle, which answers for the generation it pinned. A segment with no generation answers
|
|
1662
|
+
* `{ generation: null, cardinality: 0 }`.
|
|
1733
1663
|
*
|
|
1734
1664
|
* Trust is as for `count()`: the registry row's word, not confirmed against the object until the object is
|
|
1735
1665
|
* opened, when a disagreement makes this process stop using that row's summary.
|
|
@@ -1751,8 +1681,7 @@ export declare class Segment {
|
|
|
1751
1681
|
* ```
|
|
1752
1682
|
*
|
|
1753
1683
|
* Each bound is optional and an integer in `0..4294967295`; a bad one throws {@link ValidationError} when the
|
|
1754
|
-
* stream is first read. `after >= through` is an empty range, which reads nothing.
|
|
1755
|
-
* without checking its options, as every read of one does.
|
|
1684
|
+
* stream is first read. `after >= through` is an empty range, which reads nothing.
|
|
1756
1685
|
*/
|
|
1757
1686
|
iterate(options?: IdRange): IdStream;
|
|
1758
1687
|
/**
|
|
@@ -1777,7 +1706,7 @@ export declare class Segment {
|
|
|
1777
1706
|
*
|
|
1778
1707
|
* A live handle is refused with {@link UnsupportedError} at the first read, because its counts and its chunks could
|
|
1779
1708
|
* come from two generations and name the wrong id. `n` that is not a positive integer throws
|
|
1780
|
-
* {@link ValidationError} at the first read, as does a bad bound.
|
|
1709
|
+
* {@link ValidationError} at the first read, as does a bad bound.
|
|
1781
1710
|
*
|
|
1782
1711
|
* ```ts
|
|
1783
1712
|
* const audience = await store.segment('audience').pin();
|
|
@@ -1802,19 +1731,6 @@ export declare class Segment {
|
|
|
1802
1731
|
* a shared empty list; otherwise it is the caller's own array, so the common case allocates nothing.
|
|
1803
1732
|
*/
|
|
1804
1733
|
private excludesOf;
|
|
1805
|
-
/**
|
|
1806
|
-
* The refusal for a combine whose **exclusion** has expired, or `undefined` when none has. Unlike an expired
|
|
1807
|
-
* operand, which reads empty, an exclusion is a suppression or opt-out list: left out silently, the result
|
|
1808
|
-
* would include the very ids it was passed to remove. So it is refused with a {@link ValidationError} naming each
|
|
1809
|
-
* expired exclusion, as the `*Into` verbs refuse an expired handle.
|
|
1810
|
-
*
|
|
1811
|
-
* It is judged against the injected clock when the combine is called, before the engine is asked for anything:
|
|
1812
|
-
* no request is made, and an expired exclusion that names a segment that does not exist is refused as expired,
|
|
1813
|
-
* not as an absent operand. It runs ahead of the expired-operand shortcuts, so a combine that would read empty
|
|
1814
|
-
* anyway still refuses a lapsed exclusion. A stream already being read is not re-checked when an exclusion
|
|
1815
|
-
* expires part-way, as an operand expiring part-way does not stop it either.
|
|
1816
|
-
*/
|
|
1817
|
-
private expiredExcludes;
|
|
1818
1734
|
/**
|
|
1819
1735
|
* Chunk-skipping intersection: stream the ids in **this** segment AND every segment in `others`, ascending.
|
|
1820
1736
|
* Fetches only the Storage chunks present in *all* operands (a key absent from any operand contributes nothing
|
|
@@ -1839,12 +1755,12 @@ export declare class Segment {
|
|
|
1839
1755
|
* write is **refused and reported**: `published: false`, `reason: 'empty'`, and `dest` keeps what it had.
|
|
1840
1756
|
* Pass `allowEmpty: true` when emptying the destination is the point.
|
|
1841
1757
|
*
|
|
1842
|
-
* `guard` adds the same plausibility bounds `load()` takes — `minCardinality` and `
|
|
1758
|
+
* `guard` adds the same plausibility bounds `load()` takes — `minCardinality`, `minRetained` and `maxGrowth` — judged
|
|
1843
1759
|
* against what `dest` held before. A refusal is **reported, not thrown**, exactly as on `load()`; branch on
|
|
1844
1760
|
* `published`. A lost race is the one outcome that still throws ({@link WriteConflictError}), because a
|
|
1845
1761
|
* materialisation that silently did not take effect is the one thing a caller cannot detect on its own.
|
|
1846
1762
|
*
|
|
1847
|
-
* A call involving
|
|
1763
|
+
* A call involving a handle whose lease has ended, or anything that is not a segment, is refused before any of this.
|
|
1848
1764
|
*/
|
|
1849
1765
|
intersectInto(dest: Segment, others: Segment[], options?: MaterializeOptions): Promise<MaterializeResult>;
|
|
1850
1766
|
/**
|
|
@@ -1869,10 +1785,6 @@ export declare class Segment {
|
|
|
1869
1785
|
* suppression list: at most one read per surviving key of `this`, so subtracting a 61,000-chunk global
|
|
1870
1786
|
* opt-out list from a 40-chunk audience costs at most 40 reads, not 61,000.
|
|
1871
1787
|
*
|
|
1872
|
-
* An expired handle in `excludes` is refused, not skipped: the stream throws {@link ValidationError} naming it,
|
|
1873
|
-
* before any request is made, because a lapsed suppression list would otherwise let through the ids it was
|
|
1874
|
-
* passed to remove. An expired `this` is empty. `exclude` on `intersect` and `union` follows the same rule.
|
|
1875
|
-
*
|
|
1876
1788
|
* To filter the *result of an intersection*, do not chain — pass `exclude` to {@link intersect} instead, so
|
|
1877
1789
|
* the suppression folds into the same pass rather than materializing an intermediate segment first.
|
|
1878
1790
|
*/
|
|
@@ -1886,6 +1798,8 @@ export declare class Segment {
|
|
|
1886
1798
|
* storage. The pointer refresh is priced at the store's own `cache.genTtlMs`, or at none when the store never
|
|
1887
1799
|
* refreshes, unless the workload sets `genTtlMs`. See {@link CostReport} — it always includes a verdict (incl.
|
|
1888
1800
|
* the lose-zone).
|
|
1801
|
+
* @deprecated Moves to `@cloudbitmaps/tools`, a package of its own, with a `size` on `stat()` so a grounded report
|
|
1802
|
+
* needs nothing internal. It is a planning tool, and its price list is as old as the release that ships it.
|
|
1889
1803
|
*/
|
|
1890
1804
|
costReport(options?: {
|
|
1891
1805
|
pricing?: PricingProfile;
|
|
@@ -1893,5 +1807,5 @@ export declare class Segment {
|
|
|
1893
1807
|
}): Promise<CostReport>;
|
|
1894
1808
|
}
|
|
1895
1809
|
export { deserializePortable };
|
|
1896
|
-
export { MemoryStorage, LocalFsStorage, CrbmStorageChunkSource, destroySegment, eraseNamespace, excludingReservedRows, readRetentionPolicy, MIN_EXPIRES_AT_MS, LEASE_SKEW_MS, MAX_LEASE_MS, MAX_LEASES_PER_SEGMENT, InProcessKeystore, NodeAead, aadFor, CloudRoaringError, ValidationError, WriteConflictError, IntegrityError, NotFoundError, UnsupportedError, CapabilityError, TransientError, KeyUnavailableError, BudgetExceededError, LeaseExpiredError, LeaseLimitError, StaleOperandError, isCloudRoaringError, isWriteConflictError, isTransientError, isNotFoundError, isIntegrityError, isValidationError, isLeaseExpiredError, isLeaseLimitError, isStaleOperandError, CrbmReader, BufferReader, CountingMetricsSink, RecordingAuditSink, DEFAULT_RETRY_POLICY, AWS_US_EAST_1_ONDEMAND, ELASTICACHE_REDIS_US_EAST_1_ONDEMAND, ONE_REDIS_HA_CLUSTER, } from '@cloudbitmaps/core';
|
|
1897
|
-
export type { Aead, AeadSealed, AuditEvent, BlobReader, BlobSink, Budget, BudgetOption, ChunkRef, Clock, CodecBitmap, CodecInterface, ConsistencyErrorEntry, ConsistencyIssue, ConsistencyReport, CostReport, CrbmCrypto, CrbmReaderOptions, CrbmStorageChunkSourceOptions, DestroyResult, ClearRegistrySummary, DropResult, EncodedChunk, EraseDeps, EstimateInput, ExportFailure, ExportFormat, ExportManifest, ExportOptions, ExportSink, ExportWriter, ExportedSegment, GenKey, GenerationEntry, GenerationMetadata, GovernanceMeta, IAuditSink, IKeystore, IMetricsSink, IRegistryDriver, IStorageDriver, IdRange, InProcessKeystoreOptions, LoadGuard, LoadInput, LoadOptions, LoadRefusal, LoadResult, LocalFsStorageOptions, MemoryStorageOptions, MetricEvent, MetricOpName, MetricsSnapshot, NewRegistryRecord, PinnedAt, PinnedObject, PortableBitmap, PricingProfile, RedisNodeType, RedisSizing, RegCaps, RegistryPatch, RegistryRecord, RegistryStatus, RegistrySummary,
|
|
1810
|
+
export { MemoryStorage, LocalFsStorage, CrbmStorageChunkSource, destroySegment, eraseNamespace, excludingReservedRows, readRetentionPolicy, MIN_EXPIRES_AT_MS, LEASE_SKEW_MS, MAX_LEASE_MS, MAX_LEASES_PER_SEGMENT, InProcessKeystore, NodeAead, aadFor, CloudRoaringError, ValidationError, WriteConflictError, IntegrityError, NotFoundError, UnsupportedError, CapabilityError, TransientError, KeyUnavailableError, BudgetExceededError, LeaseExpiredError, LeaseLimitError, StaleOperandError, isCloudRoaringError, isWriteConflictError, isTransientError, isNotFoundError, isIntegrityError, isValidationError, isLeaseExpiredError, isLeaseLimitError, isStaleOperandError, isUnsupportedError, isCapabilityError, isBudgetExceededError, isKeyUnavailableError, CrbmReader, BufferReader, CountingMetricsSink, RecordingAuditSink, DEFAULT_RETRY_POLICY, AWS_US_EAST_1_ONDEMAND, ELASTICACHE_REDIS_US_EAST_1_ONDEMAND, ONE_REDIS_HA_CLUSTER, } from '@cloudbitmaps/core';
|
|
1811
|
+
export type { Aead, AeadSealed, AuditEvent, BlobReader, BlobSink, Budget, BudgetOption, ChunkRef, Clock, CodecBitmap, CodecInterface, ConsistencyErrorEntry, ConsistencyIssue, ConsistencyReport, CostReport, CrbmCrypto, CrbmReaderOptions, CrbmStorageChunkSourceOptions, DestroyResult, ClearRegistrySummary, DropResult, EncodedChunk, EraseDeps, EstimateInput, ExportFailure, ExportFormat, ExportManifest, ExportOptions, ExportSink, ExportWriter, ExportedSegment, GenKey, GenerationEntry, GenerationMetadata, GovernanceMeta, IAuditSink, IKeystore, IMetricsSink, IRegistryDriver, IStorageDriver, IdRange, InProcessKeystoreOptions, LoadGuard, LoadInput, LoadOptions, LoadRefusal, LoadResult, LocalFsStorageOptions, MemoryStorageOptions, MetricEvent, MetricOpName, MetricsSnapshot, NewRegistryRecord, PinnedAt, PinnedObject, PortableBitmap, PricingProfile, RedisNodeType, RedisSizing, RegCaps, RegistryPatch, RegistryRecord, RegistryStatus, RegistrySummary, RegistryWriteOptions, LeaseEntry, RetentionPolicy, RetireEntry, RetireExpiredOptions, RetireExpiredResult, RetryPolicy, Rng, RollbackResult, SealedRegistrySummary, SegmentInfo, SegmentRef, SegmentSize, SegmentSizing, SetRetentionResult, StorageBackend, StorageCaps, StorageChunkSource, Token, Workload, WrappedDek, } from '@cloudbitmaps/core';
|