sliftutils 1.7.90 → 1.7.92

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 (37) hide show
  1. package/index.d.ts +38 -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/IArchives.d.ts +1 -0
  16. package/storage/IArchives.ts +3 -0
  17. package/storage/remoteStorage/accessStats.d.ts +12 -0
  18. package/storage/remoteStorage/accessStats.ts +47 -0
  19. package/storage/remoteStorage/blobStore.d.ts +6 -1
  20. package/storage/remoteStorage/blobStore.ts +34 -5
  21. package/storage/remoteStorage/createArchives.ts +13 -6
  22. package/storage/remoteStorage/dist/accessStats.ts.cache +42 -3
  23. package/storage/remoteStorage/dist/blobStore.ts.cache +6 -3
  24. package/storage/remoteStorage/dist/intermediateManagement.ts.cache +56 -50
  25. package/storage/remoteStorage/dist/storageController.ts.cache +36 -29
  26. package/storage/remoteStorage/dist/storageServerState.ts.cache +110 -233
  27. package/storage/remoteStorage/dist/storeConfig.ts.cache +2 -2
  28. package/storage/remoteStorage/dist/storePlan.ts.cache +4 -56
  29. package/storage/remoteStorage/intermediateManagement.d.ts +2 -3
  30. package/storage/remoteStorage/intermediateManagement.ts +53 -46
  31. package/storage/remoteStorage/storageController.ts +22 -14
  32. package/storage/remoteStorage/storageServerState.d.ts +15 -55
  33. package/storage/remoteStorage/storageServerState.ts +106 -268
  34. package/storage/remoteStorage/storeConfig.d.ts +2 -0
  35. package/storage/remoteStorage/storeConfig.ts +2 -0
  36. package/storage/remoteStorage/storePlan.d.ts +0 -20
  37. package/storage/remoteStorage/storePlan.ts +1 -69
package/index.d.ts CHANGED
@@ -2257,6 +2257,7 @@ declare module "sliftutils/storage/IArchives" {
2257
2257
  };
2258
2258
  export declare const STORAGE_WRONG_VALID_WINDOW = "REMOTE_STORAGE_WRONG_VALID_WINDOW_a7c1f04e";
2259
2259
  export declare const STORAGE_WRONG_ROUTE = "REMOTE_STORAGE_WRONG_ROUTE_c94d2e17";
2260
+ export declare const STORAGE_NOT_CONFIGURED = "REMOTE_STORAGE_NOT_CONFIGURED_e51b7d92";
2260
2261
  export declare const FULL_ROUTE: [number, number];
2261
2262
  export declare const VARIABLE_SHARD = "VARIABLE_SHARD_f0234jfah08fgyhfgyssdds83nmp";
2262
2263
  export declare function windowAcceptsWrites(validWindow: [number, number] | undefined): boolean;
@@ -3218,13 +3219,25 @@ declare module "sliftutils/storage/remoteStorage/accessStats" {
3218
3219
  weightBySize?: boolean;
3219
3220
  }): SummaryEntry<AccessSummaryState>[];
3220
3221
  export declare function clearAccountAccessStats(account: string): void;
3222
+ export type BucketWriteStats = {
3223
+ /** Every set call the bucket accepted */
3224
+ originalWrites: number;
3225
+ originalBytes: number;
3226
+ /** 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). */
3227
+ flushedWrites: number;
3228
+ flushedBytes: number;
3229
+ };
3230
+ export declare function countBucketWrite(key: string, kind: "original" | "flushed", bytes: number): void;
3231
+ export declare function getBucketWriteStats(key: string): BucketWriteStats;
3232
+ /** Zeroes the write statistics of every bucket in the account. */
3233
+ export declare function debugClearAccountWriteStats(account: string): number;
3221
3234
 
3222
3235
  }
3223
3236
 
3224
3237
  declare module "sliftutils/storage/remoteStorage/blobStore" {
3225
3238
  /// <reference types="node" />
3226
3239
  /// <reference types="node" />
3227
- import { IArchives, ArchiveFileInfo, ArchivesSource, ArchivesSyncStatus, ChangesAfterConfig, FindConfig, SourceConfig, SyncActivity } from "../IArchives";
3240
+ import { IArchives, ArchiveFileInfo, ArchivesSource, ArchivesSyncStatus, ChangesAfterConfig, FindConfig, RemoteConfig, SourceConfig, SyncActivity } from "../IArchives";
3228
3241
  import { StoreSync } from "./storeSync";
3229
3242
  import { StoreConfig } from "./storeConfig";
3230
3243
  export declare const WINDOW_END_FLUSH_MARGIN: number;
@@ -3281,6 +3294,8 @@ declare module "sliftutils/storage/remoteStorage/blobStore" {
3281
3294
  /** Hands a running source a changed config, so an endpoint we already talk to is never rebuilt just because a flag moved. */
3282
3295
  applySource?: ((source: IArchives, sourceConfig: SourceConfig | undefined, writeDelay: number) => void) | undefined;
3283
3296
  onIndexChanged?: ((key: string) => void) | undefined;
3297
+ /** 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. */
3298
+ onRoutingApplied?: ((routing: RemoteConfig) => void) | undefined;
3284
3299
  onWriteCounted?: ((kind: "original" | "flushed", bytes: number) => void) | undefined;
3285
3300
  resolveSourceUrl?: ((url: string) => IArchives) | undefined;
3286
3301
  } | undefined);
@@ -3289,6 +3304,7 @@ declare module "sliftutils/storage/remoteStorage/blobStore" {
3289
3304
  /** What this store is configured to be. It owns this: the routing config is a file IN the store, so the store reads it, applies it to itself, and re-applies it whenever the file changes - by our own write, or by a peer's copy arriving through synchronization. */
3290
3305
  storeConfig: StoreConfig;
3291
3306
  private appliedRoutingVersion;
3307
+ private appliedRouting;
3292
3308
  init: {
3293
3309
  (): Promise<void>;
3294
3310
  reset(): void;
@@ -3475,6 +3491,8 @@ declare module "sliftutils/storage/remoteStorage/blobStore" {
3475
3491
  * reason it aimed here is that its config was stale.
3476
3492
  */
3477
3493
  private assertWriteTarget;
3494
+ /** Exactly why this store has no configuration entries - which of the three possible reasons it is, with the values that decided it, because "not configured" alone is undiagnosable. */
3495
+ private unconfiguredDetail;
3478
3496
  /**
3479
3497
  * Whether a routing config may be written here. Two rules, and this is the one place either is
3480
3498
  * applied - a config only ever enters the system through a write, so a config that got in is a
@@ -3743,9 +3761,8 @@ declare module "sliftutils/storage/remoteStorage/grantAccessCli" {
3743
3761
 
3744
3762
  declare module "sliftutils/storage/remoteStorage/intermediateManagement" {
3745
3763
  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;
3764
+ /** 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. */
3765
+ export declare function scheduleBoundaryWork(account: string, bucketName: string, routing: RemoteConfig): void;
3749
3766
  /** 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
3767
  export declare function reinjectIntermediates(current: RemoteConfig | undefined, incoming: RemoteConfig): RemoteConfig;
3751
3768
  /** 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 +4212,17 @@ declare module "sliftutils/storage/remoteStorage/storageServerState" {
4195
4212
  /// <reference types="node" />
4196
4213
  /// <reference types="node" />
4197
4214
  import { BlobStore } from "./blobStore";
4198
- import { RemoteConfig, HostedConfig, SourceConfig, IArchives, ArchivesConfig, ArchivesSyncStatus } from "../IArchives";
4215
+ import { RemoteConfig, SourceConfig, IArchives, ArchivesConfig, ArchivesSyncStatus } from "../IArchives";
4199
4216
  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>;
4217
+ import { BucketWriteStats } from "./accessStats";
4218
+ export declare function getStore(account: string, bucketName: string, name: string): BlobStore;
4228
4219
  /** 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
4220
  export declare function findBucketStore(account: string, bucketName: string, sourceConfig: SourceConfig | undefined): BlobStore;
4221
+ /** 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. */
4222
+ export declare function getBucketStores(account: string, bucketName: string): Promise<{
4223
+ name: string;
4224
+ store: BlobStore;
4225
+ }[]>;
4230
4226
  /** 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
4227
  export declare function readBucketInternal(account: string, bucketName: string, config: {
4232
4228
  path: string;
@@ -4240,9 +4236,9 @@ declare module "sliftutils/storage/remoteStorage/storageServerState" {
4240
4236
  writeTime: number;
4241
4237
  size: number;
4242
4238
  } | 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<{
4239
+ export declare function getBucketArchivesConfig(account: string, bucketName: string): Promise<ArchivesConfig>;
4240
+ export declare function bucketSyncStatus(account: string, bucketName: string): Promise<ArchivesSyncStatus>;
4241
+ export declare function debugBucketIndexTotals(account: string, bucketName: string): Promise<{
4246
4242
  fileCount: number;
4247
4243
  byteCount: number;
4248
4244
  sources: {
@@ -4251,14 +4247,8 @@ declare module "sliftutils/storage/remoteStorage/storageServerState" {
4251
4247
  byteCount: number;
4252
4248
  }[];
4253
4249
  }>;
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
4250
  /** 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
4251
  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
4252
  /**
4263
4253
  * Writing the routing config is a write like any other: it goes into a store, and the store applies
4264
4254
  * it to itself and lets its peers pull it. The only thing that happens here is picking WHICH store,
@@ -4271,7 +4261,7 @@ declare module "sliftutils/storage/remoteStorage/storageServerState" {
4271
4261
  export declare function writeRoutingConfig(account: string, bucketName: string, name: string, data: Buffer, config?: {
4272
4262
  lastModified?: number;
4273
4263
  }): 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. */
4264
+ /** 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
4265
  export declare function getActiveBucketKeys(): {
4276
4266
  account: string;
4277
4267
  bucketName: string;
@@ -4290,28 +4280,15 @@ declare module "sliftutils/storage/remoteStorage/storageServerState" {
4290
4280
  };
4291
4281
  export type ActiveBucketInfo = {
4292
4282
  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. */
4283
+ /** The bucket's routing config, the newest copy among its stores. Absent when none of them has one yet. */
4294
4284
  routing?: RemoteConfig;
4295
- /** Our own entries in that config, and their summarized current role (routes union + flags) */
4296
- selfEntries: HostedConfig[];
4297
- self?: SelfSummary;
4298
4285
  config: ArchivesConfig;
4299
4286
  };
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. */
4287
+ /** 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
4288
  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. */
4289
+ /** 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
4290
  export declare function activateBucket(account: string, bucketName: string): Promise<ActiveBucketInfo | string>;
4304
4291
  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
4292
 
4316
4293
  }
4317
4294
 
@@ -4341,6 +4318,8 @@ declare module "sliftutils/storage/remoteStorage/storeConfig" {
4341
4318
  export type StorePolicy = {
4342
4319
  validWindow: [number, number];
4343
4320
  route?: [number, number];
4321
+ public?: boolean;
4322
+ immutable?: boolean;
4344
4323
  fast?: boolean;
4345
4324
  writeDelay?: number;
4346
4325
  noFullSync?: boolean;
@@ -4376,26 +4355,6 @@ declare module "sliftutils/storage/remoteStorage/storePlan" {
4376
4355
  * Pure: config in, plan out. Nothing here reads a store, a clock, or the network.
4377
4356
  */
4378
4357
  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
4358
 
4400
4359
  }
4401
4360
 
@@ -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.92",
4
4
  "main": "index.js",
5
5
  "license": "MIT",
6
6
  "files": [