sliftutils 1.7.90 → 1.7.91

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 (34) hide show
  1. package/index.d.ts +34 -79
  2. package/misc/https/dist/cloudflareHelpers.ts.cache +2 -2
  3. package/misc/https/dist/dns.ts.cache +2 -2
  4. package/package.json +1 -1
  5. package/storage/BulkDatabase2/dist/BulkDatabaseBase.ts.cache +2 -2
  6. package/storage/BulkDatabase2/dist/BulkDatabaseFormat.ts.cache +2 -2
  7. package/storage/BulkDatabase2/dist/BulkDatabaseMerge.ts.cache +2 -2
  8. package/storage/BulkDatabase2/dist/LoadedIndex.ts.cache +2 -2
  9. package/storage/BulkDatabase2/dist/WriteOverlay.ts.cache +2 -2
  10. package/storage/BulkDatabase2/dist/blockCache.ts.cache +2 -2
  11. package/storage/BulkDatabase2/dist/mergeLock.ts.cache +2 -2
  12. package/storage/BulkDatabase2/dist/mergeMarkers.ts.cache +2 -2
  13. package/storage/BulkDatabase2/dist/streamLog.ts.cache +2 -2
  14. package/storage/BulkDatabase2/dist/syncClient.ts.cache +2 -2
  15. package/storage/remoteStorage/accessStats.d.ts +12 -0
  16. package/storage/remoteStorage/accessStats.ts +47 -0
  17. package/storage/remoteStorage/blobStore.d.ts +3 -1
  18. package/storage/remoteStorage/blobStore.ts +5 -0
  19. package/storage/remoteStorage/dist/accessStats.ts.cache +42 -3
  20. package/storage/remoteStorage/dist/blobStore.ts.cache +6 -3
  21. package/storage/remoteStorage/dist/intermediateManagement.ts.cache +56 -50
  22. package/storage/remoteStorage/dist/storageController.ts.cache +36 -29
  23. package/storage/remoteStorage/dist/storageServerState.ts.cache +110 -233
  24. package/storage/remoteStorage/dist/storeConfig.ts.cache +2 -2
  25. package/storage/remoteStorage/dist/storePlan.ts.cache +4 -56
  26. package/storage/remoteStorage/intermediateManagement.d.ts +2 -3
  27. package/storage/remoteStorage/intermediateManagement.ts +53 -46
  28. package/storage/remoteStorage/storageController.ts +22 -14
  29. package/storage/remoteStorage/storageServerState.d.ts +15 -55
  30. package/storage/remoteStorage/storageServerState.ts +106 -268
  31. package/storage/remoteStorage/storeConfig.d.ts +2 -0
  32. package/storage/remoteStorage/storeConfig.ts +2 -0
  33. package/storage/remoteStorage/storePlan.d.ts +0 -20
  34. package/storage/remoteStorage/storePlan.ts +1 -69
package/index.d.ts CHANGED
@@ -3218,13 +3218,25 @@ declare module "sliftutils/storage/remoteStorage/accessStats" {
3218
3218
  weightBySize?: boolean;
3219
3219
  }): SummaryEntry<AccessSummaryState>[];
3220
3220
  export declare function clearAccountAccessStats(account: string): void;
3221
+ export type BucketWriteStats = {
3222
+ /** Every set call the bucket accepted */
3223
+ originalWrites: number;
3224
+ originalBytes: number;
3225
+ /** What actually reached the sources. Fast writes coalesce repeated writes to the same key, so this is lower than the original counts (and is what the disk actually did). */
3226
+ flushedWrites: number;
3227
+ flushedBytes: number;
3228
+ };
3229
+ export declare function countBucketWrite(key: string, kind: "original" | "flushed", bytes: number): void;
3230
+ export declare function getBucketWriteStats(key: string): BucketWriteStats;
3231
+ /** Zeroes the write statistics of every bucket in the account. */
3232
+ export declare function debugClearAccountWriteStats(account: string): number;
3221
3233
 
3222
3234
  }
3223
3235
 
3224
3236
  declare module "sliftutils/storage/remoteStorage/blobStore" {
3225
3237
  /// <reference types="node" />
3226
3238
  /// <reference types="node" />
3227
- import { IArchives, ArchiveFileInfo, ArchivesSource, ArchivesSyncStatus, ChangesAfterConfig, FindConfig, SourceConfig, SyncActivity } from "../IArchives";
3239
+ import { IArchives, ArchiveFileInfo, ArchivesSource, ArchivesSyncStatus, ChangesAfterConfig, FindConfig, RemoteConfig, SourceConfig, SyncActivity } from "../IArchives";
3228
3240
  import { StoreSync } from "./storeSync";
3229
3241
  import { StoreConfig } from "./storeConfig";
3230
3242
  export declare const WINDOW_END_FLUSH_MARGIN: number;
@@ -3281,6 +3293,8 @@ declare module "sliftutils/storage/remoteStorage/blobStore" {
3281
3293
  /** Hands a running source a changed config, so an endpoint we already talk to is never rebuilt just because a flag moved. */
3282
3294
  applySource?: ((source: IArchives, sourceConfig: SourceConfig | undefined, writeDelay: number) => void) | undefined;
3283
3295
  onIndexChanged?: ((key: string) => void) | undefined;
3296
+ /** Called every time this store applies a routing config to itself (startup, an operator's write, a peer's copy arriving) - the store is the one that knows when a config landed, and the server arms window-boundary scans from it. */
3297
+ onRoutingApplied?: ((routing: RemoteConfig) => void) | undefined;
3284
3298
  onWriteCounted?: ((kind: "original" | "flushed", bytes: number) => void) | undefined;
3285
3299
  resolveSourceUrl?: ((url: string) => IArchives) | undefined;
3286
3300
  } | undefined);
@@ -3743,9 +3757,8 @@ declare module "sliftutils/storage/remoteStorage/grantAccessCli" {
3743
3757
 
3744
3758
  declare module "sliftutils/storage/remoteStorage/intermediateManagement" {
3745
3759
  import { RemoteConfig } from "../IArchives";
3746
- import { BucketState } from "./storageServerState";
3747
- /** Called whenever a bucket's state is (re)built: arms the scans its upcoming window boundaries need. Each scan is scheduled once - the key includes the boundary it is for - so re-arming on every config change is harmless. */
3748
- export declare function scheduleBoundaryWork(loaded: BucketState): void;
3760
+ /** Called every time a store applies a routing config to itself (see BlobStore's onRoutingApplied): arms the scans the config's upcoming window boundaries need. Each scan is scheduled once - the key includes the boundary it is for - so re-arming on every config application is harmless. */
3761
+ export declare function scheduleBoundaryWork(account: string, bucketName: string, routing: RemoteConfig): void;
3749
3762
  /** An operator's config knows nothing about a switchover that is in flight right now, so writing it as-is would cancel one mid-handover. The in-flight windows are put back into it first. */
3750
3763
  export declare function reinjectIntermediates(current: RemoteConfig | undefined, incoming: RemoteConfig): RemoteConfig;
3751
3764
  /** Started by deployTakeover once we are actually a deploy successor listening on an alternate port. Until then there are no switchover windows to write or expire, so nothing polls. */
@@ -4195,38 +4208,17 @@ declare module "sliftutils/storage/remoteStorage/storageServerState" {
4195
4208
  /// <reference types="node" />
4196
4209
  /// <reference types="node" />
4197
4210
  import { BlobStore } from "./blobStore";
4198
- import { RemoteConfig, HostedConfig, SourceConfig, IArchives, ArchivesConfig, ArchivesSyncStatus } from "../IArchives";
4211
+ import { RemoteConfig, SourceConfig, IArchives, ArchivesConfig, ArchivesSyncStatus } from "../IArchives";
4199
4212
  import { BucketDiskInfo } from "./bucketDisk";
4200
- import { SelfSummary } from "./storePlan";
4201
- /**
4202
- * What this server HAS, as opposed to what any of it does. Four things, and nothing else:
4203
- *
4204
- * - the stores, by folder (getStore) - made once, and self-configuring from there
4205
- * - which of them a request means (findBucketStore), which is only ever a name
4206
- * - what exists on disk, for listings and for the pages that report it
4207
- *
4208
- * It decides nothing about routes, windows or peers - a store reads its own config and works that
4209
- * out itself (BlobStore.applyRoutingConfig) - and it schedules nothing: switchovers and the handovers
4210
- * they cause live in intermediateManagement.
4211
- */
4212
- export type LoadedStore = {
4213
- name: string;
4214
- entries: HostedConfig[];
4215
- folder: string;
4216
- store: BlobStore;
4217
- };
4218
- export type BucketState = {
4219
- account: string;
4220
- bucketName: string;
4221
- routing?: RemoteConfig;
4222
- selfEntries: HostedConfig[];
4223
- self: SelfSummary | undefined;
4224
- stores: LoadedStore[];
4225
- };
4226
- /** The loaded bucket, loading it (which instantiates its stores and starts their synchronization) if needed. A bucket that does not exist on this server throws - callers never see undefined buckets. */
4227
- export declare function requireBucket(account: string, bucketName: string): Promise<BucketState>;
4213
+ import { BucketWriteStats } from "./accessStats";
4214
+ export declare function getStore(account: string, bucketName: string, name: string): BlobStore;
4228
4215
  /** The store serving a request: the one the client's selected entry NAMES. Account, name, and bucket ARE the folder, so this is a direct lookup, never a search of what exists - and a name this server has never seen is CREATED, never rejected, because asking for a name is the instruction to have that store (one name, one folder, one index; it configures itself once the routing config lands in it). Nothing else about the request is compared - not the window, not the route, not the flags - which is the whole point of naming it: a client a config version behind on some flag still reaches the right store. */
4229
4216
  export declare function findBucketStore(account: string, bucketName: string, sourceConfig: SourceConfig | undefined): BlobStore;
4217
+ /** The stores of a bucket as the DISK records them (a bucket is nothing more than the store folders sharing its name), opened - so the ones that weren't running yet start synchronizing. Empty when the bucket does not exist here. */
4218
+ export declare function getBucketStores(account: string, bucketName: string): Promise<{
4219
+ name: string;
4220
+ store: BlobStore;
4221
+ }[]>;
4230
4222
  /** Internal (store-to-store) reads skip store selection entirely: the caller is another store whose index says this MACHINE holds the bytes - the persisted holder identity is just a URL, which cannot name a store. Whichever store's folder has the newest copy answers. */
4231
4223
  export declare function readBucketInternal(account: string, bucketName: string, config: {
4232
4224
  path: string;
@@ -4240,9 +4232,9 @@ declare module "sliftutils/storage/remoteStorage/storageServerState" {
4240
4232
  writeTime: number;
4241
4233
  size: number;
4242
4234
  } | undefined>;
4243
- export declare function getBucketConfig(bucket: BucketState): ArchivesConfig;
4244
- export declare function bucketSyncStatus(bucket: BucketState): Promise<ArchivesSyncStatus>;
4245
- export declare function debugBucketIndexTotals(bucket: BucketState): Promise<{
4235
+ export declare function getBucketArchivesConfig(account: string, bucketName: string): Promise<ArchivesConfig>;
4236
+ export declare function bucketSyncStatus(account: string, bucketName: string): Promise<ArchivesSyncStatus>;
4237
+ export declare function debugBucketIndexTotals(account: string, bucketName: string): Promise<{
4246
4238
  fileCount: number;
4247
4239
  byteCount: number;
4248
4240
  sources: {
@@ -4251,14 +4243,8 @@ declare module "sliftutils/storage/remoteStorage/storageServerState" {
4251
4243
  byteCount: number;
4252
4244
  }[];
4253
4245
  }>;
4254
- /** The bucket states currently in memory - what the switchover machinery walks. Only what is loaded: loading a bucket starts its synchronization, and a bucket nothing has touched has no in-flight writes to hand over anyway. */
4255
- export declare function getBucketStates(): BucketState[];
4256
4246
  /** A cached IArchives for a persisted source identity: a routing URL (hosted/backblaze) or a disk folder path - the form BlobStore's sources list stores. Configuration (valid windows, routes) decides WHEN a source should be used; for reading bytes the index says a source holds, the URL alone is enough - even for sources no longer in any config. */
4257
4247
  export declare function resolveSourceArchives(url: string): IArchives;
4258
- export declare function getStore(account: string, bucketName: string, name: string): BlobStore;
4259
- export declare function getLoadedBucket(account: string, bucketName: string): Promise<BucketState | undefined>;
4260
- /** Re-reads the bucket off the disk, replacing the cached snapshot: what a routing-config write calls, because that write can CREATE a store (a new name gets a new folder) and the snapshot would keep answering with the stores it saw at load time. Existing stores are reused (getStore caches by folder), so this only picks up folder changes - it never restarts a store. */
4261
- export declare function reloadBucket(account: string, bucketName: string): Promise<BucketState | undefined>;
4262
4248
  /**
4263
4249
  * Writing the routing config is a write like any other: it goes into a store, and the store applies
4264
4250
  * it to itself and lets its peers pull it. The only thing that happens here is picking WHICH store,
@@ -4271,7 +4257,7 @@ declare module "sliftutils/storage/remoteStorage/storageServerState" {
4271
4257
  export declare function writeRoutingConfig(account: string, bucketName: string, name: string, data: Buffer, config?: {
4272
4258
  lastModified?: number;
4273
4259
  }): Promise<void>;
4274
- /** Which buckets this process currently has loaded - what a deploy successor asks its predecessor for, so it activates exactly the buckets that are actually in use. */
4260
+ /** Which buckets this process currently has active (some store of theirs was opened) - what a deploy successor asks its predecessor for, so it activates exactly the buckets that are actually in use. */
4275
4261
  export declare function getActiveBucketKeys(): {
4276
4262
  account: string;
4277
4263
  bucketName: string;
@@ -4290,28 +4276,15 @@ declare module "sliftutils/storage/remoteStorage/storageServerState" {
4290
4276
  };
4291
4277
  export type ActiveBucketInfo = {
4292
4278
  folder: string;
4293
- /** The routing config the bucket is RUNNING on, straight from memory - including switchover windows written since it loaded. Absent when none of its stores has one yet. */
4279
+ /** The bucket's routing config, the newest copy among its stores. Absent when none of them has one yet. */
4294
4280
  routing?: RemoteConfig;
4295
- /** Our own entries in that config, and their summarized current role (routes union + flags) */
4296
- selfEntries: HostedConfig[];
4297
- self?: SelfSummary;
4298
4281
  config: ArchivesConfig;
4299
4282
  };
4300
- /** The live in-memory state of ONE bucket, answered without touching the disk (no routing file read, no statfs, no stored write stats). Returns an error string when the bucket is not loaded here, which is the normal state for a bucket nothing has accessed since startup. */
4283
+ /** The state of ONE active bucket. Returns an error string when the bucket is not active here, which is the normal state for a bucket nothing has accessed since startup. */
4301
4284
  export declare function debugGetActiveBucket(account: string, bucketName: string): Promise<ActiveBucketInfo | string>;
4302
- /** Loads a bucket that exists on this server's disk into memory, which starts its synchronization and window timers, and returns its live state. Nothing is written and no other server is contacted - unlike building an ArchivesChain for it, which would probe every source and could write the routing config. Already-loaded buckets just return their state. */
4285
+ /** Loads every store of a bucket that exists on this server's disk into memory, which starts their synchronization and window timers, and returns the bucket's state. Nothing is written and no other server is contacted - unlike building an ArchivesChain for it, which would probe every source and could write the routing config. Already-active buckets just return their state. */
4303
4286
  export declare function activateBucket(account: string, bucketName: string): Promise<ActiveBucketInfo | string>;
4304
4287
  export declare function debugListAccountBuckets(account: string): Promise<ServerBucketInfo[]>;
4305
- export type BucketWriteStats = {
4306
- /** Every set call the bucket accepted */
4307
- originalWrites: number;
4308
- originalBytes: number;
4309
- /** What actually reached the sources. Fast writes coalesce repeated writes to the same key, so this is lower than the original counts (and is what the disk actually did). */
4310
- flushedWrites: number;
4311
- flushedBytes: number;
4312
- };
4313
- /** Zeroes the write statistics of every bucket in the account. */
4314
- export declare function debugClearAccountWriteStats(account: string): number;
4315
4288
 
4316
4289
  }
4317
4290
 
@@ -4341,6 +4314,8 @@ declare module "sliftutils/storage/remoteStorage/storeConfig" {
4341
4314
  export type StorePolicy = {
4342
4315
  validWindow: [number, number];
4343
4316
  route?: [number, number];
4317
+ public?: boolean;
4318
+ immutable?: boolean;
4344
4319
  fast?: boolean;
4345
4320
  writeDelay?: number;
4346
4321
  noFullSync?: boolean;
@@ -4376,26 +4351,6 @@ declare module "sliftutils/storage/remoteStorage/storePlan" {
4376
4351
  * Pure: config in, plan out. Nothing here reads a store, a clock, or the network.
4377
4352
  */
4378
4353
  export declare function previousWindowOwners(config: RemoteConfig, windowStart: number, selfIndexes: number[]): BoundaryHandover[];
4379
- /** Our role in a bucket's routing config, summarized across ALL currently-valid self entries. Stored instead of a single representative HostedConfig, so nothing can accidentally use one entry's route or flags where the union is required - the standard config has the same URL twice: a routed write-shard entry plus an unrouted read-everything entry. */
4380
- export type SelfSummary = {
4381
- /** The union of the current entries' routes, with overlapping/adjacent ranges combined - which commonly collapses to a single full range, making matching trivial. */
4382
- routes: [number, number][];
4383
- public: boolean;
4384
- immutable: boolean;
4385
- noFullSync: boolean;
4386
- readerDiskLimit?: number;
4387
- };
4388
- /** One store this server runs for a bucket: the name that IS the store, and the entries that name it. What it synchronizes with is NOT decided here - the store reads its own copy of the config and works that out itself (see BlobStore.applyRoutingConfig). */
4389
- export type SelfStore = {
4390
- name: string;
4391
- entries: HostedConfig[];
4392
- };
4393
- /** Which stores this server runs for a bucket, by name. Nothing more: a store is found by name, and configures itself. */
4394
- export declare function planSelfStores(account: string, bucketName: string, routing: RemoteConfig): {
4395
- selfEntries: HostedConfig[];
4396
- self: SelfSummary | undefined;
4397
- stores: SelfStore[];
4398
- };
4399
4354
 
4400
4355
  }
4401
4356
 
@@ -1,4 +1,4 @@
1
- "use strict";
1
+ "use strict"; var console = (function shimConsole() { let baseConsole = globalThis.console; if (typeof window !== "undefined") return baseConsole; let name = __filename.replaceAll("\\", "/").split("/").pop(); let dirName = __dirname.replaceAll("\\", "/").split("/").pop(); let context = { __FILE__: __filename, __DIR__: __dirname, __NAME__: name, __DIRNAME__: dirName }; let newConsole = { ...baseConsole }; for (let shim of ["log", "info", "warn", "error"]) { newConsole[shim] = (...args) => { args.push(context); baseConsole[shim](...args); }; } newConsole.__context = context; return newConsole; })(); "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true , configurable: true});
3
3
  //exports.cloudflareCall = exports.cloudflarePOSTCall = exports.cloudflareGETCall = exports.getCloudflareCreds = void 0;
4
4
  const caching_1 = require("socket-function/src/caching");
@@ -65,4 +65,4 @@ async function cloudflareCall(path, payload, method) {
65
65
  }
66
66
  exports.cloudflareCall = cloudflareCall;
67
67
  //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xvdWRmbGFyZUhlbHBlcnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJjbG91ZGZsYXJlSGVscGVycy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSx5REFBbUQ7QUFDbkQscURBQXlEO0FBQ3pELDRDQUF5QztBQVE1QixRQUFBLGtCQUFrQixHQUFHLElBQUEsY0FBSSxFQUFDLEtBQUssSUFBOEIsRUFBRTtJQUN4RSxpR0FBaUc7SUFDakcsSUFBSSxDQUFDO1FBQ0QsSUFBSSxHQUFHLEdBQUcsTUFBTSxJQUFBLHFCQUFTLEVBQUMscUJBQXFCLENBQUMsQ0FBQztRQUNqRCxJQUFJLEtBQUssR0FBRyxNQUFNLElBQUEscUJBQVMsRUFBQyx1QkFBdUIsQ0FBQyxDQUFDO1FBQ3JELE9BQU8sRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLENBQUM7SUFDMUIsQ0FBQztJQUFDLFdBQU0sQ0FBQyxDQUFDLENBQUM7SUFFWCxzSkFBc0o7SUFDdEosT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLElBQUEscUJBQVMsRUFBQyxxQkFBcUIsQ0FBQyxFQUFFLENBQUM7QUFDM0QsQ0FBQyxDQUFDLENBQUM7QUFFSCxTQUFTLGNBQWMsQ0FBQyxLQUFzQjtJQUMxQyxJQUFJLEtBQUssQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUNkLE9BQU87WUFDSCxjQUFjLEVBQUUsS0FBSyxDQUFDLEtBQUs7WUFDM0IseUJBQXlCLEVBQUUsS0FBSyxDQUFDLEdBQUc7WUFDcEMsWUFBWSxFQUFFLEtBQUssQ0FBQyxHQUFHO1NBQzFCLENBQUM7SUFDTixDQUFDO0lBQ0QsT0FBTyxFQUFFLGVBQWUsRUFBRSxVQUFVLEtBQUssQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDO0FBQ3RELENBQUM7QUFFTSxLQUFLLFVBQVUsaUJBQWlCLENBQUksSUFBWSxFQUFFLE1BQWtDO0lBQ3ZGLElBQUksR0FBRyxHQUFHLElBQUksR0FBRyxDQUFDLHNDQUFzQyxHQUFHLElBQUksQ0FBQyxDQUFDO0lBQ2pFLEtBQUssSUFBSSxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLE1BQU0sSUFBSSxFQUFFLENBQUMsRUFBRSxDQUFDO1FBQ3BELEdBQUcsQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsQ0FBQztJQUNyQyxDQUFDO0lBQ0QsSUFBSSxLQUFLLEdBQUcsTUFBTSxJQUFBLDBCQUFrQixHQUFFLENBQUM7SUFDdkMsSUFBSSxNQUFNLEdBQUcsTUFBTSxJQUFBLG9CQUFZLEVBQUMsR0FBRyxDQUFDLFFBQVEsRUFBRSxFQUFFLEVBQUUsRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFO1FBQ2xFLE9BQU8sRUFBRTtZQUNMLGNBQWMsRUFBRSxrQkFBa0I7WUFDbEMsR0FBRyxjQUFjLENBQUMsS0FBSyxDQUFDO1NBQzNCO0tBQ0osQ0FBQyxDQUFDO0lBQ0gsSUFBSSxPQUFPLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsUUFBUSxFQUFFLENBQXVGLENBQUM7SUFDbEksSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUNuQixNQUFNLElBQUksS0FBSyxDQUFDLDJCQUEyQixPQUFPLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ2hHLENBQUM7SUFDRCxPQUFPLE9BQU8sQ0FBQyxNQUFXLENBQUM7QUFDL0IsQ0FBQztBQWpCRCw4Q0FpQkM7QUFDTSxLQUFLLFVBQVUsa0JBQWtCLENBQUksSUFBWSxFQUFFLE1BQWtDO0lBQ3hGLE9BQU8sTUFBTSxjQUFjLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0FBQ25GLENBQUM7QUFGRCxnREFFQztBQUNNLEtBQUssVUFBVSxjQUFjLENBQUksSUFBWSxFQUFFLE9BQWUsRUFBRSxNQUFjO0lBQ2pGLElBQUksR0FBRyxHQUFHLElBQUksR0FBRyxDQUFDLHNDQUFzQyxHQUFHLElBQUksQ0FBQyxDQUFDO0lBQ2pFLElBQUksS0FBSyxHQUFHLE1BQU0sSUFBQSwwQkFBa0IsR0FBRSxDQUFDO0lBQ3ZDLElBQUksTUFBTSxHQUFHLE1BQU0sSUFBQSxvQkFBWSxFQUFDLEdBQUcsQ0FBQyxRQUFRLEVBQUUsRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRTtRQUN4RSxPQUFPLEVBQUU7WUFDTCxjQUFjLEVBQUUsa0JBQWtCO1lBQ2xDLEdBQUcsY0FBYyxDQUFDLEtBQUssQ0FBQztTQUMzQjtLQUNKLENBQUMsQ0FBQztJQUNILElBQUksT0FBTyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLFFBQVEsRUFBRSxDQUF1RixDQUFDO0lBQ2xJLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDbkIsTUFBTSxJQUFJLEtBQUssQ0FBQywyQkFBMkIsT0FBTyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUNoRyxDQUFDO0lBQ0QsT0FBTyxPQUFPLENBQUMsTUFBVyxDQUFDO0FBQy9CLENBQUM7QUFkRCx3Q0FjQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGxhenkgfSBmcm9tIFwic29ja2V0LWZ1bmN0aW9uL3NyYy9jYWNoaW5nXCI7XG5pbXBvcnQgeyBodHRwc1JlcXVlc3QgfSBmcm9tIFwic29ja2V0LWZ1bmN0aW9uL3NyYy9odHRwc1wiO1xuaW1wb3J0IHsgZ2V0U2VjcmV0IH0gZnJvbSBcIi4uL2dldFNlY3JldFwiO1xuXG5leHBvcnQgdHlwZSBDbG91ZGZsYXJlQ3JlZHMgPSB7XG4gICAga2V5OiBzdHJpbmc7XG4gICAgLyoqIFNldCBmb3IgbGVnYWN5IGdsb2JhbCBBUEkga2V5cywgd2hpY2ggYXV0aCB2aWEgWC1BdXRoLUVtYWlsL1gtQXV0aC1LZXkuIEFic2VudCBmb3IgQVBJIHRva2Vucywgd2hpY2ggYXV0aCB2aWEgQXV0aG9yaXphdGlvbjogQmVhcmVyLiAqL1xuICAgIGVtYWlsPzogc3RyaW5nO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldENsb3VkZmxhcmVDcmVkcyA9IGxhenkoYXN5bmMgKCk6IFByb21pc2U8Q2xvdWRmbGFyZUNyZWRzPiA9PiB7XG4gICAgLy8gTGVnYWN5IGdsb2JhbC1rZXkgYXV0aCBuZWVkcyBhbiBlbWFpbCBhbG9uZ3NpZGUgdGhlIGtleSwgc28gcHJlZmVyIGl0IHdoZW4gYm90aCBzZWNyZXRzIGV4aXN0LlxuICAgIHRyeSB7XG4gICAgICAgIGxldCBrZXkgPSBhd2FpdCBnZXRTZWNyZXQoXCJjbG91ZGZsYXJlLmpzb24ua2V5XCIpO1xuICAgICAgICBsZXQgZW1haWwgPSBhd2FpdCBnZXRTZWNyZXQoXCJjbG91ZGZsYXJlLmpzb24uZW1haWxcIik7XG4gICAgICAgIHJldHVybiB7IGtleSwgZW1haWwgfTtcbiAgICB9IGNhdGNoIHsgfVxuXG4gICAgLy8gQVBJIHRva2VuIGZvcm0uIERlbGliZXJhdGVseSBOT1QgY2F1Z2h0OiBpZiB0aGlzIGZhaWxzIHRvbywgZ2V0U2VjcmV0J3MgZXJyb3IgKHdoaWNoIG5hbWVzIGV2ZXJ5IHBsYWNlIGl0IGxvb2tlZCkgaXMgdGhlIG9uZSB0aGUgY2FsbGVyIHNob3VsZCBzZWUuXG4gICAgcmV0dXJuIHsga2V5OiBhd2FpdCBnZXRTZWNyZXQoXCJjbG91ZGZsYXJlLmpzb24ua2V5XCIpIH07XG59KTtcblxuZnVuY3Rpb24gZ2V0QXV0aEhlYWRlcnMoY3JlZHM6IENsb3VkZmxhcmVDcmVkcyk6IHsgW2hlYWRlcjogc3RyaW5nXTogc3RyaW5nIH0ge1xuICAgIGlmIChjcmVkcy5lbWFpbCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgXCJYLUF1dGgtRW1haWxcIjogY3JlZHMuZW1haWwsXG4gICAgICAgICAgICBcIlgtQXV0aC1Vc2VyLVNlcnZpY2UtS2V5XCI6IGNyZWRzLmtleSxcbiAgICAgICAgICAgIFwiWC1BdXRoLUtleVwiOiBjcmVkcy5rZXksXG4gICAgICAgIH07XG4gICAgfVxuICAgIHJldHVybiB7IFwiQXV0aG9yaXphdGlvblwiOiBgQmVhcmVyICR7Y3JlZHMua2V5fWAgfTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNsb3VkZmxhcmVHRVRDYWxsPFQ+KHBhdGg6IHN0cmluZywgcGFyYW1zPzogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSk6IFByb21pc2U8VD4ge1xuICAgIGxldCB1cmwgPSBuZXcgVVJMKGBodHRwczovL2FwaS5jbG91ZGZsYXJlLmNvbS9jbGllbnQvdjRgICsgcGF0aCk7XG4gICAgZm9yIChsZXQgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHBhcmFtcyB8fCB7fSkpIHtcbiAgICAgICAgdXJsLnNlYXJjaFBhcmFtcy5zZXQoa2V5LCB2YWx1ZSk7XG4gICAgfVxuICAgIGxldCBjcmVkcyA9IGF3YWl0IGdldENsb3VkZmxhcmVDcmVkcygpO1xuICAgIGxldCByZXN1bHQgPSBhd2FpdCBodHRwc1JlcXVlc3QodXJsLnRvU3RyaW5nKCksIFtdLCBcIkdFVFwiLCB1bmRlZmluZWQsIHtcbiAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgICAgXCJDb250ZW50LVR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uXCIsXG4gICAgICAgICAgICAuLi5nZXRBdXRoSGVhZGVycyhjcmVkcyksXG4gICAgICAgIH1cbiAgICB9KTtcbiAgICBsZXQgcmVzdWx0MiA9IEpTT04ucGFyc2UocmVzdWx0LnRvU3RyaW5nKCkpIGFzIHsgcmVzdWx0OiB1bmtub3duOyBzdWNjZXNzOiBib29sZWFuOyBlcnJvcnM6IHsgY29kZTogbnVtYmVyOyBtZXNzYWdlOiBzdHJpbmcgfVtdIH07XG4gICAgaWYgKCFyZXN1bHQyLnN1Y2Nlc3MpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDbG91ZGZsYXJlIGNhbGwgZmFpbGVkOiAke3Jlc3VsdDIuZXJyb3JzLm1hcCh4ID0+IHgubWVzc2FnZSkuam9pbihcIiwgXCIpfWApO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0Mi5yZXN1bHQgYXMgVDtcbn1cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjbG91ZGZsYXJlUE9TVENhbGw8VD4ocGF0aDogc3RyaW5nLCBwYXJhbXM6IHsgW2tleTogc3RyaW5nXTogdW5rbm93biB9KTogUHJvbWlzZTxUPiB7XG4gICAgcmV0dXJuIGF3YWl0IGNsb3VkZmxhcmVDYWxsKHBhdGgsIEJ1ZmZlci5mcm9tKEpTT04uc3RyaW5naWZ5KHBhcmFtcykpLCBcIlBPU1RcIik7XG59XG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY2xvdWRmbGFyZUNhbGw8VD4ocGF0aDogc3RyaW5nLCBwYXlsb2FkOiBCdWZmZXIsIG1ldGhvZDogc3RyaW5nKTogUHJvbWlzZTxUPiB7XG4gICAgbGV0IHVybCA9IG5ldyBVUkwoYGh0dHBzOi8vYXBpLmNsb3VkZmxhcmUuY29tL2NsaWVudC92NGAgKyBwYXRoKTtcbiAgICBsZXQgY3JlZHMgPSBhd2FpdCBnZXRDbG91ZGZsYXJlQ3JlZHMoKTtcbiAgICBsZXQgcmVzdWx0ID0gYXdhaXQgaHR0cHNSZXF1ZXN0KHVybC50b1N0cmluZygpLCBwYXlsb2FkLCBtZXRob2QsIHVuZGVmaW5lZCwge1xuICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgICBcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIixcbiAgICAgICAgICAgIC4uLmdldEF1dGhIZWFkZXJzKGNyZWRzKSxcbiAgICAgICAgfVxuICAgIH0pO1xuICAgIGxldCByZXN1bHQyID0gSlNPTi5wYXJzZShyZXN1bHQudG9TdHJpbmcoKSkgYXMgeyByZXN1bHQ6IHVua25vd247IHN1Y2Nlc3M6IGJvb2xlYW47IGVycm9yczogeyBjb2RlOiBudW1iZXI7IG1lc3NhZ2U6IHN0cmluZyB9W10gfTtcbiAgICBpZiAoIXJlc3VsdDIuc3VjY2Vzcykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENsb3VkZmxhcmUgY2FsbCBmYWlsZWQ6ICR7cmVzdWx0Mi5lcnJvcnMubWFwKHggPT4geC5tZXNzYWdlKS5qb2luKFwiLCBcIil9YCk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQyLnJlc3VsdCBhcyBUO1xufVxuIl19
68
- /* _JS_SOURCE_HASH = "6d49ba115f1c398bd3914ce2dcad5bb9959e4ab49ad84b7200b0f6eac8f5fbb2"; */
68
+ /* _JS_SOURCE_HASH = "52bb6b5727ee98c684a094288c4e01c175dc7cfe81d4ffe10996a39ee22ecf5d"; */
@@ -1,4 +1,4 @@
1
- "use strict";
1
+ "use strict"; var console = (function shimConsole() { let baseConsole = globalThis.console; if (typeof window !== "undefined") return baseConsole; let name = __filename.replaceAll("\\", "/").split("/").pop(); let dirName = __dirname.replaceAll("\\", "/").split("/").pop(); let context = { __FILE__: __filename, __DIR__: __dirname, __NAME__: name, __DIRNAME__: dirName }; let newConsole = { ...baseConsole }; for (let shim of ["log", "info", "warn", "error"]) { newConsole[shim] = (...args) => { args.push(context); baseConsole[shim](...args); }; } newConsole.__context = context; return newConsole; })(); "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true , configurable: true});
3
3
  //exports.addRecord = exports.setRecord = exports.deleteRecord = exports.getRecords = exports.batchRecords = exports.getRecordsRaw = exports.getZoneId = exports.hasDNSWritePermissions = exports.freshnessTime = void 0;
4
4
  const caching_1 = require("socket-function/src/caching");
@@ -166,4 +166,4 @@ async function addRecord(type, key, value, proxied, staleAfter = DNS_REFRESH_STA
166
166
  }
167
167
  exports.addRecord = addRecord;
168
168
  //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZG5zLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiZG5zLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLHlEQUEwRDtBQUMxRCwyREFBcUQ7QUFDckQsbUVBQWdFO0FBQ2hFLG1EQUE2RDtBQUM3RCx3RUFBbUU7QUFDbkUsMkRBQWdIO0FBRWhILE1BQU0sY0FBYyxHQUFHO0lBQ25CLEtBQUssRUFBRSxFQUFFO0lBQ1QsR0FBRyxFQUFFLEVBQUU7Q0FDVixDQUFDO0FBRUYsTUFBTSx1QkFBdUIsR0FBRyxnQkFBUyxDQUFDO0FBRTFDLHdGQUF3RjtBQUN4Riw4V0FBOFc7QUFDOVcsTUFBTSxlQUFlLEdBQUcsZ0JBQWdCLENBQUM7QUFFekMsMkZBQTJGO0FBQzNGLFNBQVMsY0FBYyxDQUFDLE9BQWdCO0lBQ3BDLElBQUksSUFBSSxHQUFHLENBQUMsT0FBTyxhQUFQLE9BQU8sY0FBUCxPQUFPLEdBQUksRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLGVBQWUsRUFBRSxFQUFFLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUMvRCxJQUFJLEtBQUssR0FBRyxZQUFZLElBQUksSUFBSSxFQUFFLENBQUMsUUFBUSxFQUFFLEdBQUcsQ0FBQztJQUNqRCxPQUFPLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLElBQUksS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQztBQUM3QyxDQUFDO0FBQ0Qsc0ZBQXNGO0FBQ3RGLFNBQWdCLGFBQWEsQ0FBQyxPQUFnQjtJQUMxQyxJQUFJLEtBQUssR0FBRyxlQUFlLENBQUMsSUFBSSxDQUFDLE9BQU8sYUFBUCxPQUFPLGNBQVAsT0FBTyxHQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQ2hELElBQUksQ0FBQyxLQUFLO1FBQUUsT0FBTyxDQUFDLENBQUM7SUFDckIsT0FBTyxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLFVBQVUsRUFBRSxFQUFFLENBQUMs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LENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsUUFBUSxDQUFDLEVBQUUsRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFO1FBQ3ZELEtBQUssRUFBRSxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLE9BQU8sRUFBRSxPQUFPLEtBQUssU0FBUyxFQUFFLE9BQU8sRUFBRSxDQUFDO0tBQzdHLENBQUMsQ0FBQztJQUNILElBQUksUUFBUTtRQUFFLE9BQU87SUFDckIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxXQUFXLEdBQUcsa0NBQWtDLENBQUMsQ0FBQztJQUM5RCxLQUFLLElBQUksT0FBTyxHQUFHLEdBQUcsRUFBRSxPQUFPLEdBQUcsQ0FBQyxFQUFFLE9BQU8sRUFBRSxFQUFFLENBQUM7UUFDN0MsTUFBTSxJQUFBLGdCQUFLLEVBQUMsSUFBSSxDQUFDLENBQUM7UUFDbEIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLE9BQU8sa0JBQWtCLENBQUMsQ0FBQztJQUM5QyxDQUFDO0lBQ0QsT0FBTyxDQUFDLEdBQUcsQ0FBQyxpQ0FBaUMsQ0FBQyxDQUFDO0FBQ25ELENBQUM7QUF0QkQsOEJBc0JDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgY2FjaGUsIGxhenkgfSBmcm9tIFwic29ja2V0LWZ1bmN0aW9uL3NyYy9jYWNoaW5nXCI7XG5pbXBvcnQgeyBkZWxheSB9IGZyb20gXCJzb2NrZXQtZnVuY3Rpb24vc3JjL2JhdGNoaW5nXCI7XG5pbXBvcnQgeyBTb2NrZXRGdW5jdGlvbiB9IGZyb20gXCJzb2NrZXQtZnVuY3Rpb24vU29ja2V0RnVuY3Rpb25cIjtcbmltcG9ydCB7IGlzTm9kZSwgdGltZUluRGF5IH0gZnJvbSBcInNvY2tldC1mdW5jdGlvbi9zcmMvbWlzY1wiO1xuaW1wb3J0IHsgbWFnZW50YSB9IGZyb20gXCJzb2NrZXQtZnVuY3Rpb24vc3JjL2Zvcm1hdHRpbmcvbG9nQ29sb3JzXCI7XG5pbXBvcnQgeyBjbG91ZGZsYXJlQ2FsbCwgY2xvdWRmbGFyZUdFVENhbGwsIGNsb3VkZmxhcmVQT1NUQ2FsbCwgZ2V0Q2xvdWRmbGFyZUNyZWRzIH0gZnJvbSBcIi4vY2xvdWRmbGFyZUhlbHBlcnNcIjtcblxuY29uc3QgRE5TX1RUTFNlY29uZHMgPSB7XG4gICAgXCJUWFRcIjogNjAsXG4gICAgXCJBXCI6IDYwLFxufTtcblxuY29uc3QgRE5TX1JFRlJFU0hfU1RBTEVfQUZURVIgPSB0aW1lSW5EYXk7XG5cbi8vIFdlIHN0YW1wIG91ciBvd24gXCJsYXN0IGFzc2VydGVkXCIgdGltZSBpbnRvIHRoZSByZWNvcmQncyBjb21tZW50LCBiZWNhdXNlIENsb3VkZmxhcmUnc1xuLy8gIG1vZGlmaWVkX29uIGNhbiBvbmx5IGJlIG1vdmVkIGJ5IGFuIGFjdHVhbCBjb250ZW50IGNoYW5nZSAtIGFuZCByZS1hc3NlcnRpbmcgYW4gYWxyZWFkeSBjb3JyZWN0IHJlY29yZCBoYXMgbm8gY29udGVudCBjaGFuZ2UgdG8gbWFrZSAoYSBjcmVhdGUgZXJyb3JzIHdpdGggODEwNTgsIGEgbm8tb3AgZWRpdCBkb2Vzbid0IGJ1bXAgdGhlIHRpbWVzdGFtcCkuIFJlYWRpbmcgZnJlc2huZXNzIGZyb20gdGV4dCB3ZSBjb250cm9sIHNpZGVzdGVwcyB0aGF0IGVudGlyZWx5LCBhbmQgbGV0cyB1cyByZWZyZXNoIGEgc3RhbGUtYnV0LWNvcnJlY3QgcmVjb3JkIGluIHBsYWNlIGluc3RlYWQgb2YgZGVsZXRpbmcgYW5kIHJlY3JlYXRpbmcgaXQuXG5jb25zdCBGUkVTSE5FU1NfUkVHRVggPSAvPHNldCBvbjpbXj5dKj4vO1xuXG4vKiogU3RyaXBzIGFueSBwcmlvciBmcmVzaG5lc3MgdGFnIGFuZCBhcHBlbmRzIGEgbmV3IG9uZSwgcHJlc2VydmluZyBvdGhlciBjb21tZW50IHRleHQuICovXG5mdW5jdGlvbiBzdGFtcEZyZXNobmVzcyhjb21tZW50Pzogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBsZXQgYmFzZSA9IChjb21tZW50ID8/IFwiXCIpLnJlcGxhY2UoRlJFU0hORVNTX1JFR0VYLCBcIlwiKS50cmltKCk7XG4gICAgbGV0IHN0YW1wID0gYDxzZXQgb246ICR7bmV3IERhdGUoKS50b1N0cmluZygpfT5gO1xuICAgIHJldHVybiBiYXNlID8gYCR7YmFzZX0gJHtzdGFtcH1gIDogc3RhbXA7XG59XG4vKiogUGFyc2VzIG91ciB0YWcgYmFjayBvdXQ7IDAgKGkuZS4gYWx3YXlzIHN0YWxlKSB3aGVuIGl0J3MgYWJzZW50IG9yIHVucGFyc2VhYmxlLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZyZXNobmVzc1RpbWUoY29tbWVudD86IHN0cmluZyk6IG51bWJlciB7XG4gICAgbGV0IG1hdGNoID0gRlJFU0hORVNTX1JFR0VYLmV4ZWMoY29tbWVudCA/PyBcIlwiKTtcbiAgICBpZiAoIW1hdGNoKSByZXR1cm4gMDtcbiAgICByZXR1cm4gbmV3IERhdGUobWF0Y2hbMF0ucmVwbGFjZShcIjxzZXQgb246XCIsIFwiXCIpLnJlcGxhY2UoXCI+XCIsIFwiXCIpLnRyaW0oKSkuZ2V0VGltZSgpIHx8IDA7XG59XG5cbmV4cG9ydCBjb25zdCBoYXNETlNXcml0ZVBlcm1pc3Npb25zID0gbGF6eShhc3luYyAoKSA9PiB7XG4gICAgaWYgKCFpc05vZGUoKSkgcmV0dXJuIGZhbHNlO1xuICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IGdldENsb3VkZmxhcmVDcmVkcygpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGNhdGNoIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbn0pO1xuXG5leHBvcnQgY29uc3QgZ2V0Wm9uZUlkID0gY2FjaGUoYXN5bmMgKHJvb3REb21haW46IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiA9PiB7XG4gICAgbGV0IHpvbmVzID0gYXdhaXQgY2xvdWRmbGFyZUdFVENhbGw8eyBpZDogc3RyaW5nOyBuYW1lOiBzdHJpbmcgfVtdPihcIi96b25lc1wiLCB7fSk7XG4gICAgbGV0IHNlbGVjdGVkID0gem9uZXMuZmluZCh4ID0+IHgubmFtZSA9PT0gcm9vdERvbWFpbik7XG4gICAgaWYgKCFzZWxlY3RlZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENvdWxkIG5vdCBmaW5kIHpvbmUgZm9yICR7cm9vdERvbWFpbn0uIEZvdW5kICR7em9uZXMubWFwKHggPT4geC5uYW1lKS5qb2luKFwiLCBcIil9YCk7XG4gICAgfVxuICAgIHJldHVybiBzZWxlY3RlZC5pZDtcbn0pO1xuXG5mdW5jdGlvbiBnZXRSb290RG9tYWluKGtleTogc3RyaW5nKSB7XG4gICAgaWYgKGtleS5lbmRzV2l0aChcIi5cIikpIHtcbiAgICAgICAga2V5ID0ga2V5LnNsaWNlKDAsIC0xKTtcbiAgICB9XG4gICAgcmV0dXJuIGtleS5zcGxpdChcIi5cIikuc2xpY2UoLTIpLmpvaW4oXCIuXCIpO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0UmVjb3Jkc1Jhdyh0eXBlOiBzdHJpbmcsIGtleTogc3RyaW5nKSB7XG4gICAgaWYgKGtleS5lbmRzV2l0aChcIi5cIikpIGtleSA9IGtleS5zbGljZSgwLCAtMSk7XG4gICAgbGV0IHpvbmVJZCA9IGF3YWl0IGdldFpvbmVJZChnZXRSb290RG9tYWluKGtleSkpO1xuICAgIGxldCByZXN1bHRzID0gYXdhaXQgY2xvdWRmbGFyZUdFVENhbGw8e1xuICAgICAgICBpZDogc3RyaW5nO1xuICAgICAgICB0eXBlOiBzdHJpbmc7XG4gICAgICAgIG5hbWU6IHN0cmluZztcbiAgICAgICAgY29udGVudDogc3RyaW5nO1xuICAgICAgICBwcm94aWVkOiBib29sZWFuO1xuICAgICAgICBtb2RpZmllZF9vbjogc3RyaW5nO1xuICAgICAgICAvLyBPbWl0dGVkIGJ5IENsb3VkZmxhcmUgd2hlbiB0aGUgcmVjb3JkIGhhcyBubyBjb21tZW50LlxuICAgICAgICBjb21tZW50Pzogc3RyaW5nO1xuICAgIH1bXT4oYC96b25lcy8ke3pvbmVJZH0vZG5zX3JlY29yZHNgKTtcbiAgICAvLyBETlMgbmFtZXMgYXJlIGNhc2UtaW5zZW5zaXRpdmUgYW5kIENsb3VkZmxhcmUgcmV0dXJucyB0aGVtIGxvd2VyY2FzZWQsIHNvIGEgbWl4ZWQtY2FzZSBrZXkgKGUuZy4gYSBtYWNoaW5lIGlkIHN1YmRvbWFpbikgd291bGQgbmV2ZXIgbWF0Y2ggYW4gZXhhY3QtY2FzZSBjb21wYXJlIC0gbWF0Y2ggbG93ZXJjYXNlZC5cbiAgICBsZXQga2V5TG93ZXIgPSBrZXkudG9Mb3dlckNhc2UoKTtcbiAgICByZXR1cm4gcmVzdWx0cy5maWx0ZXIoeCA9PiB4LnR5cGUgPT09IHR5cGUgJiYgeC5uYW1lLnRvTG93ZXJDYXNlKCkgPT09IGtleUxvd2VyKTtcbn1cblxuLyoqIENsb3VkZmxhcmUncyBiYXRjaCBlbmRwb2ludCBhcHBsaWVzIGRlbGV0ZXMsIHRoZW4gcGF0Y2hlcywgdGhlbiBwb3N0cyBpbiBhIHNpbmdsZSBkYXRhYmFzZSB0cmFuc2FjdGlvbi4gV2Ugcm91dGUgZWRpdHMgKHBhdGNoZXMpIHRocm91Z2ggaGVyZSBiZWNhdXNlIHRoZSBzdGFuZGFsb25lIFBBVENIL1BVVCB2ZXJicyBhcmVuJ3QgdXNhYmxlIGluIG91ciBzZXR1cCwgYW5kIGJlY2F1c2UgaXQgbGV0cyBcInJlbW92ZSBvdGhlcnMgKyBhc3NlcnQgdGFyZ2V0XCIgaGFwcGVuIHdpdGhvdXQgYSB3aW5kb3cgd2hlcmUgdGhlIG5hbWUgcmVzb2x2ZXMgdG8gbm90aGluZy4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBiYXRjaFJlY29yZHMoem9uZUlkOiBzdHJpbmcsIGJhdGNoOiB7XG4gICAgZGVsZXRlcz86IHsgaWQ6IHN0cmluZyB9W107XG4gICAgcGF0Y2hlcz86IHsgaWQ6IHN0cmluZzsgY29tbWVudD86IHN0cmluZyB9W107XG4gICAgcG9zdHM/OiB7IHR5cGU6IHN0cmluZzsgbmFtZTogc3RyaW5nOyBjb250ZW50OiBzdHJpbmc7IHR0bDogbnVtYmVyOyBwcm94aWVkOiBib29sZWFuOyBjb21tZW50Pzogc3RyaW5nIH1bXTtcbn0pIHtcbiAgICBsZXQgcGF5bG9hZDogeyBba2V5OiBzdHJpbmddOiB1bmtub3duIH0gPSB7fTtcbiAgICBpZiAoYmF0Y2guZGVsZXRlcyAmJiBiYXRjaC5kZWxldGVzLmxlbmd0aCA+IDApIHBheWxvYWQuZGVsZXRlcyA9IGJhdGNoLmRlbGV0ZXM7XG4gICAgaWYgKGJhdGNoLnBhdGNoZXMgJiYgYmF0Y2gucGF0Y2hlcy5sZW5ndGggPiAwKSBwYXlsb2FkLnBhdGNoZXMgPSBiYXRjaC5wYXRjaGVzO1xuICAgIGlmIChiYXRjaC5wb3N0cyAmJiBiYXRjaC5wb3N0cy5sZW5ndGggPiAwKSBwYXlsb2FkLnBvc3RzID0gYmF0Y2gucG9zdHM7XG4gICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgY2xvdWRmbGFyZVBPU1RDYWxsKGAvem9uZXMvJHt6b25lSWR9L2Ruc19yZWNvcmRzL2JhdGNoYCwgcGF5bG9hZCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihgRXJyb3IgdXBkYXRpbmcgRE5TIHJlY29yZHM6YCwgeyBlcnJvcjogZXJyb3IsIGJhdGNoIH0pO1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEVycm9yIHVwZGF0aW5nIEROUyByZWNvcmRzLiAke0pTT04uc3RyaW5naWZ5KGJhdGNoKX0uIEVycm9yOiAke2Vycm9yfWApO1xuICAgIH1cbn1cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRSZWNvcmRzKHR5cGU6IHN0cmluZywga2V5OiBzdHJpbmcpIHtcbiAgICBpZiAoa2V5LmVuZHNXaXRoKFwiLlwiKSkga2V5ID0ga2V5LnNsaWNlKDAsIC0xKTtcbiAgICBsZXQgcmF3ID0gYXdhaXQgZ2V0UmVjb3Jkc1Jhdyh0eXBlLCBrZXkpO1xuICAgIHJldHVybiByYXcubWFwKHggPT4geC5jb250ZW50KTtcbn1cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBkZWxldGVSZWNvcmQodHlwZTogc3RyaW5nLCBrZXk6IHN0cmluZywgdmFsdWU6IHN0cmluZykge1xuICAgIGlmIChrZXkuZW5kc1dpdGgoXCIuXCIpKSBrZXkgPSBrZXkuc2xpY2UoMCwgLTEpO1xuICAgIGxldCB6b25lSWQgPSBhd2FpdCBnZXRab25lSWQoZ2V0Um9vdERvbWFpbihrZXkpKTtcbiAgICBsZXQgcHJldlZhbHVlcyA9IGF3YWl0IGdldFJlY29yZHNSYXcodHlwZSwga2V5KTtcbiAgICBwcmV2VmFsdWVzID0gcHJldlZhbHVlcy5maWx0ZXIoeCA9PiB4LmNvbnRlbnQgPT09IHZhbHVlKTtcbiAgICBpZiAocHJldlZhbHVlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgaWYgKCFTb2NrZXRGdW5jdGlvbi5zaWxlbnQpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGBObyBuZWVkIHRvIGRlbGV0ZSByZWNvcmQsIGl0IHdhcyBub3QgZm91bmQuICR7SlNPTi5zdHJpbmdpZnkodmFsdWUpfSB2YWx1ZSB3YXMgbm90IGluICR7dHlwZX0gZm9yICR7a2V5fSwgdmFsdWVzICR7SlNPTi5zdHJpbmdpZnkocHJldlZhbHVlcy5tYXAoeCA9PiB4LmNvbnRlbnQpKX1gKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc29sZS5sb2coYFJlbW92aW5nIHJlY29yZHMgb2YgJHt0eXBlfSBmb3IgJHtrZXl9LCB2YWx1ZXMgJHtKU09OLnN0cmluZ2lmeShwcmV2VmFsdWVzLm1hcCh4ID0+IHguY29udGVudCkpfWApO1xuICAgIGZvciAobGV0IHZhbHVlIG9mIHByZXZWYWx1ZXMpIHtcbiAgICAgICAgYXdhaXQgY2xvdWRmbGFyZUNhbGwoYC96b25lcy8ke3pvbmVJZH0vZG5zX3JlY29yZHMvJHt2YWx1ZS5pZH1gLCBCdWZmZXIuZnJvbShbXSksIFwiREVMRVRFXCIpO1xuICAgIH1cbn1cbi8qKiBSZW1vdmVzIGFsbCBleGlzdGluZyByZWNvcmRzICh1bmxlc3MgdGhlIHJlY29yZCBpcyBhbHJlYWR5IHByZXNlbnQgYW5kIGZyZXNoKSAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNldFJlY29yZCh0eXBlOiBzdHJpbmcsIGtleTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nLCBwcm94aWVkPzogXCJwcm94aWVkXCIsIHN0YWxlQWZ0ZXIgPSBETlNfUkVGUkVTSF9TVEFMRV9BRlRFUikge1xuICAgIGlmIChrZXkuZW5kc1dpdGgoXCIuXCIpKSBrZXkgPSBrZXkuc2xpY2UoMCwgLTEpO1xuICAgIGxldCB6b25lSWQgPSBhd2FpdCBnZXRab25lSWQoZ2V0Um9vdERvbWFpbihrZXkpKTtcbiAgICBsZXQgcHJldlZhbHVlcyA9IGF3YWl0IGdldFJlY29yZHNSYXcodHlwZSwga2V5KTtcbiAgICBsZXQgZXhpc3RpbmcgPSBwcmV2VmFsdWVzLmZpbmQoeCA9PiB4LmNvbnRlbnQgPT09IHZhbHVlKTtcbiAgICBsZXQgb3RoZXJzID0gcHJldlZhbHVlcy5maWx0ZXIoeCA9PiB4LmNvbnRlbnQgIT09IHZhbHVlKTtcblxuICAgIC8vIEFscmVhZHkgY29ycmVjdCBhbmQgcmVjZW50bHkgYXNzZXJ0ZWQgLSBhIHByaW9yIHJ1biBhbHNvIGNsZWFuZWQgdXAgdGhlIG90aGVyIHJlY29yZHMsIHNvIHRoZXJlIGlzIG5vdGhpbmcgbGVmdCB0byBkby5cbiAgICBpZiAoZXhpc3RpbmcgJiYgRGF0ZS5ub3coKSAtIGZyZXNobmVzc1RpbWUoZXhpc3RpbmcuY29tbWVudCkgPCBzdGFsZUFmdGVyKSByZXR1cm47XG5cbiAgICAvLyBBIHNpbmdsZSBhdG9taWMgYmF0Y2g6IGRyb3AgdGhlIHdyb25nIHJlY29yZHMsIGFuZCBlaXRoZXIgcmVmcmVzaCB0aGUgZXhpc3RpbmcgcmVjb3JkJ3MgY29tbWVudCBpbiBwbGFjZSBvciBjcmVhdGUgaXQgLSBzbyB0aGUgbmFtZSBpcyBuZXZlciBsZWZ0IHJlc29sdmluZyB0byBub3RoaW5nLlxuICAgIGxldCB0dGwgPSBETlNfVFRMU2Vjb25kc1t0eXBlIGFzIFwiQVwiXSB8fCA2MDtcbiAgICBsZXQgY29tbWVudCA9IHN0YW1wRnJlc2huZXNzKGV4aXN0aW5nPy5jb21tZW50KTtcbiAgICBjb25zb2xlLmxvZyhtYWdlbnRhKGBTZXR0aW5nICR7dHlwZX0gcmVjb3JkIGZvciAke2tleX0gdG8gJHt2YWx1ZX0gKHByZXZpb3VzbHkgaGFkICR7SlNPTi5zdHJpbmdpZnkocHJldlZhbHVlcy5tYXAoeCA9PiB4LmNvbnRlbnQpKX0pYCkpO1xuICAgIGF3YWl0IGJhdGNoUmVjb3Jkcyh6b25lSWQsIHtcbiAgICAgICAgZGVsZXRlczogb3RoZXJzLm1hcCh4ID0+ICh7IGlkOiB4LmlkIH0pKSxcbiAgICAgICAgcGF0Y2hlczogZXhpc3RpbmcgPyBbeyBpZDogZXhpc3RpbmcuaWQsIGNvbW1lbnQgfV0gOiBbXSxcbiAgICAgICAgcG9zdHM6IGV4aXN0aW5nID8gW10gOiBbeyB0eXBlLCBuYW1lOiBrZXksIGNvbnRlbnQ6IHZhbHVlLCB0dGwsIHByb3hpZWQ6IHByb3hpZWQgPT09IFwicHJveGllZFwiLCBjb21tZW50IH1dLFxuICAgIH0pO1xuICAgIC8vIE9ubHkgYSBicmFuZCBuZXcgcmVjb3JkIG5lZWRzIHRvIHByb3BhZ2F0ZTsgYW4gaW4tcGxhY2UgY29tbWVudCByZWZyZXNoIGRvZXNuJ3QgY2hhbmdlIHRoZSBhbnN3ZXIuXG4gICAgaWYgKCFleGlzdGluZykge1xuICAgICAgICBjb25zb2xlLmxvZyhgV2FpdGluZyAke3R0bH0gc2Vjb25kcyBmb3IgRE5TIHRvIHByb3BhZ2F0ZS4uLmApO1xuICAgICAgICBmb3IgKGxldCB0dGxMZWZ0ID0gdHRsOyB0dGxMZWZ0ID4gMDsgdHRsTGVmdC0tKSB7XG4gICAgICAgICAgICBhd2FpdCBkZWxheSgxMDAwKTtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGAke3R0bExlZnR9IHNlY29uZHMgbGVmdC4uLmApO1xuICAgICAgICB9XG4gICAgICAgIGNvbnNvbGUubG9nKGBEb25lIHdhaXRpbmcgZm9yIEROUyB0byB1cGRhdGUuYCk7XG4gICAgfVxufVxuLyoqIEtlZXBzIGV4aXN0aW5nIHJlY29yZHMgKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBhZGRSZWNvcmQodHlwZTogc3RyaW5nLCBrZXk6IHN0cmluZywgdmFsdWU6IHN0cmluZywgcHJveGllZD86IFwicHJveGllZFwiLCBzdGFsZUFmdGVyID0gRE5TX1JFRlJFU0hfU1RBTEVfQUZURVIpIHtcbiAgICBpZiAoa2V5LmVuZHNXaXRoKFwiLlwiKSkga2V5ID0ga2V5LnNsaWNlKDAsIC0xKTtcbiAgICBsZXQgem9uZUlkID0gYXdhaXQgZ2V0Wm9uZUlkKGdldFJvb3REb21haW4oa2V5KSk7XG4gICAgbGV0IHByZXZWYWx1ZXMgPSBhd2FpdCBnZXRSZWNvcmRzUmF3KHR5cGUsIGtleSk7XG4gICAgbGV0IGV4aXN0aW5nID0gcHJldlZhbHVlcy5maW5kKHggPT4geC5jb250ZW50ID09PSB2YWx1ZSk7XG4gICAgaWYgKGV4aXN0aW5nICYmIERhdGUubm93KCkgLSBmcmVzaG5lc3NUaW1lKGV4aXN0aW5nLmNvbW1lbnQpIDwgc3RhbGVBZnRlcikgcmV0dXJuO1xuXG4gICAgLy8gU2FtZSBzaW5nbGUtYmF0Y2ggZmxvdyBhcyBzZXRSZWNvcmQsIG1pbnVzIHRoZSBkZWxldGVzICh3ZSBrZWVwIHNpYmxpbmcgcmVjb3JkcyBoZXJlKS5cbiAgICBsZXQgdHRsID0gRE5TX1RUTFNlY29uZHNbdHlwZSBhcyBcIkFcIl0gfHwgNjA7XG4gICAgbGV0IGNvbW1lbnQgPSBzdGFtcEZyZXNobmVzcyhleGlzdGluZz8uY29tbWVudCk7XG4gICAgY29uc29sZS5sb2coYEFkZGluZyAke3R5cGV9IHJlY29yZCBmb3IgJHtrZXl9IHRvICR7dmFsdWV9IChwcmV2aW91c2x5IGhhZCAke0pTT04uc3RyaW5naWZ5KHByZXZWYWx1ZXMubWFwKHggPT4geC5jb250ZW50KSl9KWApO1xuICAgIGF3YWl0IGJhdGNoUmVjb3Jkcyh6b25lSWQsIHtcbiAgICAgICAgcGF0Y2hlczogZXhpc3RpbmcgPyBbeyBpZDogZXhpc3RpbmcuaWQsIGNvbW1lbnQgfV0gOiBbXSxcbiAgICAgICAgcG9zdHM6IGV4aXN0aW5nID8gW10gOiBbeyB0eXBlLCBuYW1lOiBrZXksIGNvbnRlbnQ6IHZhbHVlLCB0dGwsIHByb3hpZWQ6IHByb3hpZWQgPT09IFwicHJveGllZFwiLCBjb21tZW50IH1dLFxuICAgIH0pO1xuICAgIGlmIChleGlzdGluZykgcmV0dXJuO1xuICAgIGNvbnNvbGUubG9nKGBXYWl0aW5nICR7dHRsfSBzZWNvbmRzIGZvciBETlMgdG8gcHJvcGFnYXRlLi4uYCk7XG4gICAgZm9yIChsZXQgdHRsTGVmdCA9IHR0bDsgdHRsTGVmdCA+IDA7IHR0bExlZnQtLSkge1xuICAgICAgICBhd2FpdCBkZWxheSgxMDAwKTtcbiAgICAgICAgY29uc29sZS5sb2coYCR7dHRsTGVmdH0gc2Vjb25kcyBsZWZ0Li4uYCk7XG4gICAgfVxuICAgIGNvbnNvbGUubG9nKGBEb25lIHdhaXRpbmcgZm9yIEROUyB0byB1cGRhdGUuYCk7XG59XG4iXX0=
169
- /* _JS_SOURCE_HASH = "bd46cf1c718a466d5d937a15640697ac65efd09cffd1a37799ae71c93d78d9ec"; */
169
+ /* _JS_SOURCE_HASH = "cdc70b4acd8101703333fe1f72ed365fbeb32bd04759e62272143b3286939aa8"; */
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "sliftutils",
3
- "version": "1.7.90",
3
+ "version": "1.7.91",
4
4
  "main": "index.js",
5
5
  "license": "MIT",
6
6
  "files": [