@metamask-previews/snap-networks-utils 1.0.0-preview-8ff90d2f → 1.0.0-preview-e00d5bb
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/CHANGELOG.md +2 -0
- package/dist/index.cjs +19 -10
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +13 -10
- package/dist/index.d.cts.map +1 -1
- package/dist/index.d.mts +13 -10
- package/dist/index.d.mts.map +1 -1
- package/dist/index.mjs +9 -7
- package/dist/index.mjs.map +1 -1
- package/dist/utils/async/async.cjs +95 -0
- package/dist/utils/async/async.cjs.map +1 -0
- package/dist/utils/async/async.d.cts +51 -0
- package/dist/utils/async/async.d.cts.map +1 -0
- package/dist/utils/async/async.d.mts +51 -0
- package/dist/utils/async/async.d.mts.map +1 -0
- package/dist/utils/async/async.mjs +88 -0
- package/dist/utils/async/async.mjs.map +1 -0
- package/dist/{buildUrl → utils/buildUrl}/buildUrl.cjs +1 -1
- package/dist/utils/buildUrl/buildUrl.cjs.map +1 -0
- package/dist/utils/buildUrl/buildUrl.d.cts.map +1 -0
- package/dist/utils/buildUrl/buildUrl.d.mts.map +1 -0
- package/dist/{buildUrl → utils/buildUrl}/buildUrl.mjs +1 -1
- package/dist/utils/buildUrl/buildUrl.mjs.map +1 -0
- package/dist/utils/dedupe/InFlightCoalescer.cjs.map +1 -0
- package/dist/utils/dedupe/InFlightCoalescer.d.cts.map +1 -0
- package/dist/utils/dedupe/InFlightCoalescer.d.mts.map +1 -0
- package/dist/utils/dedupe/InFlightCoalescer.mjs.map +1 -0
- package/dist/utils/logger/Logger.cjs.map +1 -0
- package/dist/utils/logger/Logger.d.cts.map +1 -0
- package/dist/utils/logger/Logger.d.mts.map +1 -0
- package/dist/utils/logger/Logger.mjs.map +1 -0
- package/dist/utils/originPermissions/createOriginPermissions.cjs.map +1 -0
- package/dist/utils/originPermissions/createOriginPermissions.d.cts.map +1 -0
- package/dist/utils/originPermissions/createOriginPermissions.d.mts.map +1 -0
- package/dist/utils/originPermissions/createOriginPermissions.mjs.map +1 -0
- package/dist/utils/originPermissions/validateOrigin.cjs.map +1 -0
- package/dist/utils/originPermissions/validateOrigin.d.cts.map +1 -0
- package/dist/utils/originPermissions/validateOrigin.d.mts.map +1 -0
- package/dist/utils/originPermissions/validateOrigin.mjs.map +1 -0
- package/dist/utils/safeMerge/safeMerge.cjs.map +1 -0
- package/dist/utils/safeMerge/safeMerge.d.cts.map +1 -0
- package/dist/utils/safeMerge/safeMerge.d.mts.map +1 -0
- package/dist/utils/safeMerge/safeMerge.mjs.map +1 -0
- package/dist/utils/sanitize/sanitize.cjs.map +1 -0
- package/dist/utils/sanitize/sanitize.d.cts.map +1 -0
- package/dist/utils/sanitize/sanitize.d.mts.map +1 -0
- package/dist/utils/sanitize/sanitize.mjs.map +1 -0
- package/dist/utils/serialization/serialization.cjs +73 -0
- package/dist/utils/serialization/serialization.cjs.map +1 -0
- package/dist/utils/serialization/serialization.d.cts +19 -0
- package/dist/utils/serialization/serialization.d.cts.map +1 -0
- package/dist/utils/serialization/serialization.d.mts +19 -0
- package/dist/utils/serialization/serialization.d.mts.map +1 -0
- package/dist/utils/serialization/serialization.mjs +69 -0
- package/dist/utils/serialization/serialization.mjs.map +1 -0
- package/dist/utils/serialization/types.cjs +3 -0
- package/dist/utils/serialization/types.cjs.map +1 -0
- package/dist/utils/serialization/types.d.cts +8 -0
- package/dist/utils/serialization/types.d.cts.map +1 -0
- package/dist/utils/serialization/types.d.mts +8 -0
- package/dist/utils/serialization/types.d.mts.map +1 -0
- package/dist/utils/serialization/types.mjs +2 -0
- package/dist/utils/serialization/types.mjs.map +1 -0
- package/dist/utils/urlStruct/urlStruct.cjs.map +1 -0
- package/dist/utils/urlStruct/urlStruct.d.cts.map +1 -0
- package/dist/utils/urlStruct/urlStruct.d.mts.map +1 -0
- package/dist/utils/urlStruct/urlStruct.mjs.map +1 -0
- package/package.json +13 -10
- package/dist/buildUrl/buildUrl.cjs.map +0 -1
- package/dist/buildUrl/buildUrl.d.cts.map +0 -1
- package/dist/buildUrl/buildUrl.d.mts.map +0 -1
- package/dist/buildUrl/buildUrl.mjs.map +0 -1
- package/dist/dedupe/InFlightCoalescer.cjs.map +0 -1
- package/dist/dedupe/InFlightCoalescer.d.cts.map +0 -1
- package/dist/dedupe/InFlightCoalescer.d.mts.map +0 -1
- package/dist/dedupe/InFlightCoalescer.mjs.map +0 -1
- package/dist/dedupe/index.cjs +0 -6
- package/dist/dedupe/index.cjs.map +0 -1
- package/dist/dedupe/index.d.cts +0 -2
- package/dist/dedupe/index.d.cts.map +0 -1
- package/dist/dedupe/index.d.mts +0 -2
- package/dist/dedupe/index.d.mts.map +0 -1
- package/dist/dedupe/index.mjs +0 -2
- package/dist/dedupe/index.mjs.map +0 -1
- package/dist/logger/Logger.cjs.map +0 -1
- package/dist/logger/Logger.d.cts.map +0 -1
- package/dist/logger/Logger.d.mts.map +0 -1
- package/dist/logger/Logger.mjs.map +0 -1
- package/dist/logger/index.cjs +0 -7
- package/dist/logger/index.cjs.map +0 -1
- package/dist/logger/index.d.cts +0 -3
- package/dist/logger/index.d.cts.map +0 -1
- package/dist/logger/index.d.mts +0 -3
- package/dist/logger/index.d.mts.map +0 -1
- package/dist/logger/index.mjs +0 -2
- package/dist/logger/index.mjs.map +0 -1
- package/dist/originPermissions/createOriginPermissions.cjs.map +0 -1
- package/dist/originPermissions/createOriginPermissions.d.cts.map +0 -1
- package/dist/originPermissions/createOriginPermissions.d.mts.map +0 -1
- package/dist/originPermissions/createOriginPermissions.mjs.map +0 -1
- package/dist/originPermissions/validateOrigin.cjs.map +0 -1
- package/dist/originPermissions/validateOrigin.d.cts.map +0 -1
- package/dist/originPermissions/validateOrigin.d.mts.map +0 -1
- package/dist/originPermissions/validateOrigin.mjs.map +0 -1
- package/dist/safeMerge/safeMerge.cjs.map +0 -1
- package/dist/safeMerge/safeMerge.d.cts.map +0 -1
- package/dist/safeMerge/safeMerge.d.mts.map +0 -1
- package/dist/safeMerge/safeMerge.mjs.map +0 -1
- package/dist/sanitize.cjs.map +0 -1
- package/dist/sanitize.d.cts.map +0 -1
- package/dist/sanitize.d.mts.map +0 -1
- package/dist/sanitize.mjs.map +0 -1
- package/dist/urlStruct/urlStruct.cjs.map +0 -1
- package/dist/urlStruct/urlStruct.d.cts.map +0 -1
- package/dist/urlStruct/urlStruct.d.mts.map +0 -1
- package/dist/urlStruct/urlStruct.mjs.map +0 -1
- /package/dist/{buildUrl → utils/buildUrl}/buildUrl.d.cts +0 -0
- /package/dist/{buildUrl → utils/buildUrl}/buildUrl.d.mts +0 -0
- /package/dist/{dedupe → utils/dedupe}/InFlightCoalescer.cjs +0 -0
- /package/dist/{dedupe → utils/dedupe}/InFlightCoalescer.d.cts +0 -0
- /package/dist/{dedupe → utils/dedupe}/InFlightCoalescer.d.mts +0 -0
- /package/dist/{dedupe → utils/dedupe}/InFlightCoalescer.mjs +0 -0
- /package/dist/{logger → utils/logger}/Logger.cjs +0 -0
- /package/dist/{logger → utils/logger}/Logger.d.cts +0 -0
- /package/dist/{logger → utils/logger}/Logger.d.mts +0 -0
- /package/dist/{logger → utils/logger}/Logger.mjs +0 -0
- /package/dist/{originPermissions → utils/originPermissions}/createOriginPermissions.cjs +0 -0
- /package/dist/{originPermissions → utils/originPermissions}/createOriginPermissions.d.cts +0 -0
- /package/dist/{originPermissions → utils/originPermissions}/createOriginPermissions.d.mts +0 -0
- /package/dist/{originPermissions → utils/originPermissions}/createOriginPermissions.mjs +0 -0
- /package/dist/{originPermissions → utils/originPermissions}/validateOrigin.cjs +0 -0
- /package/dist/{originPermissions → utils/originPermissions}/validateOrigin.d.cts +0 -0
- /package/dist/{originPermissions → utils/originPermissions}/validateOrigin.d.mts +0 -0
- /package/dist/{originPermissions → utils/originPermissions}/validateOrigin.mjs +0 -0
- /package/dist/{safeMerge → utils/safeMerge}/safeMerge.cjs +0 -0
- /package/dist/{safeMerge → utils/safeMerge}/safeMerge.d.cts +0 -0
- /package/dist/{safeMerge → utils/safeMerge}/safeMerge.d.mts +0 -0
- /package/dist/{safeMerge → utils/safeMerge}/safeMerge.mjs +0 -0
- /package/dist/{sanitize.cjs → utils/sanitize/sanitize.cjs} +0 -0
- /package/dist/{sanitize.d.cts → utils/sanitize/sanitize.d.cts} +0 -0
- /package/dist/{sanitize.d.mts → utils/sanitize/sanitize.d.mts} +0 -0
- /package/dist/{sanitize.mjs → utils/sanitize/sanitize.mjs} +0 -0
- /package/dist/{urlStruct → utils/urlStruct}/urlStruct.cjs +0 -0
- /package/dist/{urlStruct → utils/urlStruct}/urlStruct.d.cts +0 -0
- /package/dist/{urlStruct → utils/urlStruct}/urlStruct.d.mts +0 -0
- /package/dist/{urlStruct → utils/urlStruct}/urlStruct.mjs +0 -0
package/CHANGELOG.md
CHANGED
|
@@ -9,7 +9,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
9
9
|
|
|
10
10
|
### Added
|
|
11
11
|
|
|
12
|
+
- Add helpers `serialize`, `deserialize`, and `Serializable` for round-tripping `BigNumber`, `bigint`, `Uint8Array`, and `undefined` through snap state ([#197](https://github.com/MetaMask/internal-snaps/pull/197))
|
|
12
13
|
- Add `InFlightCoalescer`, exported from a new `./dedupe` entry point, which coalesces concurrent async operations by key so callers share one in-flight run ([#149](https://github.com/MetaMask/internal-snaps/pull/149))
|
|
14
|
+
- Add shared async batching utilities. ([#211](https://github.com/MetaMask/internal-snaps/pull/211))
|
|
13
15
|
- Add origin permission helpers ([#193](https://github.com/MetaMask/internal-snaps/pull/193))
|
|
14
16
|
- `createOriginPermissions` for building origin-to-method maps
|
|
15
17
|
- `validateOrigin` for checking an origin against a permission map
|
package/dist/index.cjs
CHANGED
|
@@ -1,29 +1,38 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.validateOrigin = exports.DEFAULT_METAMASK_ORIGIN = exports.DEFAULT_DEV_ORIGINS = exports.DEFAULT_PROD_ORIGINS = exports.createOriginPermissions = exports.LogLevel = exports.Logger = exports.UrlStruct = exports.sanitizeUri = exports.sanitizeControlCharacters = exports.buildUrl = exports.safeMerge = exports.RemoteFeatureFlagsProvider = exports.REMOTE_FEATURE_FLAGS_PROVIDER_NAME = exports.AssetsProvider = exports.ASSETS_PROVIDER_NAME = void 0;
|
|
3
|
+
exports.validateOrigin = exports.DEFAULT_METAMASK_ORIGIN = exports.DEFAULT_DEV_ORIGINS = exports.DEFAULT_PROD_ORIGINS = exports.createOriginPermissions = exports.deserialize = exports.serialize = exports.LogLevel = exports.Logger = exports.chunks = exports.batchesAllWithChunks = exports.batchesAllSettledWithChunks = exports.batchesAllSettled = exports.batchesAll = exports.UrlStruct = exports.sanitizeUri = exports.sanitizeControlCharacters = exports.buildUrl = exports.safeMerge = exports.RemoteFeatureFlagsProvider = exports.REMOTE_FEATURE_FLAGS_PROVIDER_NAME = exports.AssetsProvider = exports.ASSETS_PROVIDER_NAME = void 0;
|
|
4
4
|
var AssetsProvider_1 = require("./providers/assets/AssetsProvider.cjs");
|
|
5
5
|
Object.defineProperty(exports, "ASSETS_PROVIDER_NAME", { enumerable: true, get: function () { return AssetsProvider_1.ASSETS_PROVIDER_NAME; } });
|
|
6
6
|
Object.defineProperty(exports, "AssetsProvider", { enumerable: true, get: function () { return AssetsProvider_1.AssetsProvider; } });
|
|
7
7
|
var RemoteFeatureFlagsProvider_1 = require("./providers/remote-feature-flags/RemoteFeatureFlagsProvider.cjs");
|
|
8
8
|
Object.defineProperty(exports, "REMOTE_FEATURE_FLAGS_PROVIDER_NAME", { enumerable: true, get: function () { return RemoteFeatureFlagsProvider_1.REMOTE_FEATURE_FLAGS_PROVIDER_NAME; } });
|
|
9
9
|
Object.defineProperty(exports, "RemoteFeatureFlagsProvider", { enumerable: true, get: function () { return RemoteFeatureFlagsProvider_1.RemoteFeatureFlagsProvider; } });
|
|
10
|
-
var safeMerge_1 = require("./safeMerge/safeMerge.cjs");
|
|
10
|
+
var safeMerge_1 = require("./utils/safeMerge/safeMerge.cjs");
|
|
11
11
|
Object.defineProperty(exports, "safeMerge", { enumerable: true, get: function () { return safeMerge_1.safeMerge; } });
|
|
12
|
-
var buildUrl_1 = require("./buildUrl/buildUrl.cjs");
|
|
12
|
+
var buildUrl_1 = require("./utils/buildUrl/buildUrl.cjs");
|
|
13
13
|
Object.defineProperty(exports, "buildUrl", { enumerable: true, get: function () { return buildUrl_1.buildUrl; } });
|
|
14
|
-
var sanitize_1 = require("./sanitize.cjs");
|
|
14
|
+
var sanitize_1 = require("./utils/sanitize/sanitize.cjs");
|
|
15
15
|
Object.defineProperty(exports, "sanitizeControlCharacters", { enumerable: true, get: function () { return sanitize_1.sanitizeControlCharacters; } });
|
|
16
16
|
Object.defineProperty(exports, "sanitizeUri", { enumerable: true, get: function () { return sanitize_1.sanitizeUri; } });
|
|
17
|
-
var urlStruct_1 = require("./urlStruct/urlStruct.cjs");
|
|
17
|
+
var urlStruct_1 = require("./utils/urlStruct/urlStruct.cjs");
|
|
18
18
|
Object.defineProperty(exports, "UrlStruct", { enumerable: true, get: function () { return urlStruct_1.UrlStruct; } });
|
|
19
|
-
var
|
|
20
|
-
Object.defineProperty(exports, "
|
|
21
|
-
Object.defineProperty(exports, "
|
|
22
|
-
|
|
19
|
+
var async_1 = require("./utils/async/async.cjs");
|
|
20
|
+
Object.defineProperty(exports, "batchesAll", { enumerable: true, get: function () { return async_1.batchesAll; } });
|
|
21
|
+
Object.defineProperty(exports, "batchesAllSettled", { enumerable: true, get: function () { return async_1.batchesAllSettled; } });
|
|
22
|
+
Object.defineProperty(exports, "batchesAllSettledWithChunks", { enumerable: true, get: function () { return async_1.batchesAllSettledWithChunks; } });
|
|
23
|
+
Object.defineProperty(exports, "batchesAllWithChunks", { enumerable: true, get: function () { return async_1.batchesAllWithChunks; } });
|
|
24
|
+
Object.defineProperty(exports, "chunks", { enumerable: true, get: function () { return async_1.chunks; } });
|
|
25
|
+
var Logger_1 = require("./utils/logger/Logger.cjs");
|
|
26
|
+
Object.defineProperty(exports, "Logger", { enumerable: true, get: function () { return Logger_1.Logger; } });
|
|
27
|
+
Object.defineProperty(exports, "LogLevel", { enumerable: true, get: function () { return Logger_1.LogLevel; } });
|
|
28
|
+
var serialization_1 = require("./utils/serialization/serialization.cjs");
|
|
29
|
+
Object.defineProperty(exports, "serialize", { enumerable: true, get: function () { return serialization_1.serialize; } });
|
|
30
|
+
Object.defineProperty(exports, "deserialize", { enumerable: true, get: function () { return serialization_1.deserialize; } });
|
|
31
|
+
var createOriginPermissions_1 = require("./utils/originPermissions/createOriginPermissions.cjs");
|
|
23
32
|
Object.defineProperty(exports, "createOriginPermissions", { enumerable: true, get: function () { return createOriginPermissions_1.createOriginPermissions; } });
|
|
24
33
|
Object.defineProperty(exports, "DEFAULT_PROD_ORIGINS", { enumerable: true, get: function () { return createOriginPermissions_1.DEFAULT_PROD_ORIGINS; } });
|
|
25
34
|
Object.defineProperty(exports, "DEFAULT_DEV_ORIGINS", { enumerable: true, get: function () { return createOriginPermissions_1.DEFAULT_DEV_ORIGINS; } });
|
|
26
35
|
Object.defineProperty(exports, "DEFAULT_METAMASK_ORIGIN", { enumerable: true, get: function () { return createOriginPermissions_1.DEFAULT_METAMASK_ORIGIN; } });
|
|
27
|
-
var validateOrigin_1 = require("./originPermissions/validateOrigin.cjs");
|
|
36
|
+
var validateOrigin_1 = require("./utils/originPermissions/validateOrigin.cjs");
|
|
28
37
|
Object.defineProperty(exports, "validateOrigin", { enumerable: true, get: function () { return validateOrigin_1.validateOrigin; } });
|
|
29
38
|
//# sourceMappingURL=index.cjs.map
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAAA,wEAI2C;AAHzC,sHAAA,oBAAoB,OAAA;AACpB,gHAAA,cAAc,OAAA;AAGhB,8GAIqE;AAHnE,gJAAA,kCAAkC,OAAA;AAClC,wIAAA,0BAA0B,OAAA;AAG5B,
|
|
1
|
+
{"version":3,"file":"index.cjs","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAAA,wEAI2C;AAHzC,sHAAA,oBAAoB,OAAA;AACpB,gHAAA,cAAc,OAAA;AAGhB,8GAIqE;AAHnE,gJAAA,kCAAkC,OAAA;AAClC,wIAAA,0BAA0B,OAAA;AAG5B,6DAAwD;AAA/C,sGAAA,SAAS,OAAA;AAClB,0DAAqD;AAA5C,oGAAA,QAAQ,OAAA;AAEjB,0DAGmC;AAFjC,qHAAA,yBAAyB,OAAA;AACzB,uGAAA,WAAW,OAAA;AAEb,6DAAwD;AAA/C,sGAAA,SAAS,OAAA;AAClB,iDAM6B;AAL3B,mGAAA,UAAU,OAAA;AACV,0GAAA,iBAAiB,OAAA;AACjB,oHAAA,2BAA2B,OAAA;AAC3B,6GAAA,oBAAoB,OAAA;AACpB,+FAAA,MAAM,OAAA;AAER,oDAAyD;AAAhD,gGAAA,MAAM,OAAA;AAAE,kGAAA,QAAQ,OAAA;AAQzB,yEAA6E;AAApE,0GAAA,SAAS,OAAA;AAAE,4GAAA,WAAW,OAAA;AAE/B,iGAK2D;AAJzD,kIAAA,uBAAuB,OAAA;AACvB,+HAAA,oBAAoB,OAAA;AACpB,8HAAA,mBAAmB,OAAA;AACnB,kIAAA,uBAAuB,OAAA;AAGzB,+EAA0E;AAAjE,gHAAA,cAAc,OAAA","sourcesContent":["export {\n ASSETS_PROVIDER_NAME,\n AssetsProvider,\n type AssetsProviderMessenger,\n} from './providers/assets/AssetsProvider';\nexport {\n REMOTE_FEATURE_FLAGS_PROVIDER_NAME,\n RemoteFeatureFlagsProvider,\n type RemoteFeatureFlagsProviderMessenger,\n} from './providers/remote-feature-flags/RemoteFeatureFlagsProvider';\nexport { safeMerge } from './utils/safeMerge/safeMerge';\nexport { buildUrl } from './utils/buildUrl/buildUrl';\nexport type { BuildUrlParams } from './utils/buildUrl/buildUrl';\nexport {\n sanitizeControlCharacters,\n sanitizeUri,\n} from './utils/sanitize/sanitize';\nexport { UrlStruct } from './utils/urlStruct/urlStruct';\nexport {\n batchesAll,\n batchesAllSettled,\n batchesAllSettledWithChunks,\n batchesAllWithChunks,\n chunks,\n} from './utils/async/async';\nexport { Logger, LogLevel } from './utils/logger/Logger';\nexport type {\n LoggerOptions,\n LoggerMethod,\n LogMethod,\n LogMethodDecorator,\n LoggerDecorators,\n} from './utils/logger/Logger';\nexport { serialize, deserialize } from './utils/serialization/serialization';\nexport type { Serializable } from './utils/serialization/types';\nexport {\n createOriginPermissions,\n DEFAULT_PROD_ORIGINS,\n DEFAULT_DEV_ORIGINS,\n DEFAULT_METAMASK_ORIGIN,\n} from './utils/originPermissions/createOriginPermissions';\nexport type { CreateOriginPermissionsParams } from './utils/originPermissions/createOriginPermissions';\nexport { validateOrigin } from './utils/originPermissions/validateOrigin';\n"]}
|
package/dist/index.d.cts
CHANGED
|
@@ -1,13 +1,16 @@
|
|
|
1
1
|
export { ASSETS_PROVIDER_NAME, AssetsProvider, type AssetsProviderMessenger, } from "./providers/assets/AssetsProvider.cjs";
|
|
2
2
|
export { REMOTE_FEATURE_FLAGS_PROVIDER_NAME, RemoteFeatureFlagsProvider, type RemoteFeatureFlagsProviderMessenger, } from "./providers/remote-feature-flags/RemoteFeatureFlagsProvider.cjs";
|
|
3
|
-
export { safeMerge } from "./safeMerge/safeMerge.cjs";
|
|
4
|
-
export { buildUrl } from "./buildUrl/buildUrl.cjs";
|
|
5
|
-
export type { BuildUrlParams } from "./buildUrl/buildUrl.cjs";
|
|
6
|
-
export { sanitizeControlCharacters, sanitizeUri } from "./sanitize.cjs";
|
|
7
|
-
export { UrlStruct } from "./urlStruct/urlStruct.cjs";
|
|
8
|
-
export {
|
|
9
|
-
export
|
|
10
|
-
export {
|
|
11
|
-
export
|
|
12
|
-
export {
|
|
3
|
+
export { safeMerge } from "./utils/safeMerge/safeMerge.cjs";
|
|
4
|
+
export { buildUrl } from "./utils/buildUrl/buildUrl.cjs";
|
|
5
|
+
export type { BuildUrlParams } from "./utils/buildUrl/buildUrl.cjs";
|
|
6
|
+
export { sanitizeControlCharacters, sanitizeUri, } from "./utils/sanitize/sanitize.cjs";
|
|
7
|
+
export { UrlStruct } from "./utils/urlStruct/urlStruct.cjs";
|
|
8
|
+
export { batchesAll, batchesAllSettled, batchesAllSettledWithChunks, batchesAllWithChunks, chunks, } from "./utils/async/async.cjs";
|
|
9
|
+
export { Logger, LogLevel } from "./utils/logger/Logger.cjs";
|
|
10
|
+
export type { LoggerOptions, LoggerMethod, LogMethod, LogMethodDecorator, LoggerDecorators, } from "./utils/logger/Logger.cjs";
|
|
11
|
+
export { serialize, deserialize } from "./utils/serialization/serialization.cjs";
|
|
12
|
+
export type { Serializable } from "./utils/serialization/types.cjs";
|
|
13
|
+
export { createOriginPermissions, DEFAULT_PROD_ORIGINS, DEFAULT_DEV_ORIGINS, DEFAULT_METAMASK_ORIGIN, } from "./utils/originPermissions/createOriginPermissions.cjs";
|
|
14
|
+
export type { CreateOriginPermissionsParams } from "./utils/originPermissions/createOriginPermissions.cjs";
|
|
15
|
+
export { validateOrigin } from "./utils/originPermissions/validateOrigin.cjs";
|
|
13
16
|
//# sourceMappingURL=index.d.cts.map
|
package/dist/index.d.cts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.cts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,oBAAoB,EACpB,cAAc,EACd,KAAK,uBAAuB,GAC7B,8CAA0C;AAC3C,OAAO,EACL,kCAAkC,EAClC,0BAA0B,EAC1B,KAAK,mCAAmC,GACzC,wEAAoE;AACrE,OAAO,EAAE,SAAS,EAAE,
|
|
1
|
+
{"version":3,"file":"index.d.cts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,oBAAoB,EACpB,cAAc,EACd,KAAK,uBAAuB,GAC7B,8CAA0C;AAC3C,OAAO,EACL,kCAAkC,EAClC,0BAA0B,EAC1B,KAAK,mCAAmC,GACzC,wEAAoE;AACrE,OAAO,EAAE,SAAS,EAAE,wCAAoC;AACxD,OAAO,EAAE,QAAQ,EAAE,sCAAkC;AACrD,YAAY,EAAE,cAAc,EAAE,sCAAkC;AAChE,OAAO,EACL,yBAAyB,EACzB,WAAW,GACZ,sCAAkC;AACnC,OAAO,EAAE,SAAS,EAAE,wCAAoC;AACxD,OAAO,EACL,UAAU,EACV,iBAAiB,EACjB,2BAA2B,EAC3B,oBAAoB,EACpB,MAAM,GACP,gCAA4B;AAC7B,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,kCAA8B;AACzD,YAAY,EACV,aAAa,EACb,YAAY,EACZ,SAAS,EACT,kBAAkB,EAClB,gBAAgB,GACjB,kCAA8B;AAC/B,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,gDAA4C;AAC7E,YAAY,EAAE,YAAY,EAAE,wCAAoC;AAChE,OAAO,EACL,uBAAuB,EACvB,oBAAoB,EACpB,mBAAmB,EACnB,uBAAuB,GACxB,8DAA0D;AAC3D,YAAY,EAAE,6BAA6B,EAAE,8DAA0D;AACvG,OAAO,EAAE,cAAc,EAAE,qDAAiD"}
|
package/dist/index.d.mts
CHANGED
|
@@ -1,13 +1,16 @@
|
|
|
1
1
|
export { ASSETS_PROVIDER_NAME, AssetsProvider, type AssetsProviderMessenger, } from "./providers/assets/AssetsProvider.mjs";
|
|
2
2
|
export { REMOTE_FEATURE_FLAGS_PROVIDER_NAME, RemoteFeatureFlagsProvider, type RemoteFeatureFlagsProviderMessenger, } from "./providers/remote-feature-flags/RemoteFeatureFlagsProvider.mjs";
|
|
3
|
-
export { safeMerge } from "./safeMerge/safeMerge.mjs";
|
|
4
|
-
export { buildUrl } from "./buildUrl/buildUrl.mjs";
|
|
5
|
-
export type { BuildUrlParams } from "./buildUrl/buildUrl.mjs";
|
|
6
|
-
export { sanitizeControlCharacters, sanitizeUri } from "./sanitize.mjs";
|
|
7
|
-
export { UrlStruct } from "./urlStruct/urlStruct.mjs";
|
|
8
|
-
export {
|
|
9
|
-
export
|
|
10
|
-
export {
|
|
11
|
-
export
|
|
12
|
-
export {
|
|
3
|
+
export { safeMerge } from "./utils/safeMerge/safeMerge.mjs";
|
|
4
|
+
export { buildUrl } from "./utils/buildUrl/buildUrl.mjs";
|
|
5
|
+
export type { BuildUrlParams } from "./utils/buildUrl/buildUrl.mjs";
|
|
6
|
+
export { sanitizeControlCharacters, sanitizeUri, } from "./utils/sanitize/sanitize.mjs";
|
|
7
|
+
export { UrlStruct } from "./utils/urlStruct/urlStruct.mjs";
|
|
8
|
+
export { batchesAll, batchesAllSettled, batchesAllSettledWithChunks, batchesAllWithChunks, chunks, } from "./utils/async/async.mjs";
|
|
9
|
+
export { Logger, LogLevel } from "./utils/logger/Logger.mjs";
|
|
10
|
+
export type { LoggerOptions, LoggerMethod, LogMethod, LogMethodDecorator, LoggerDecorators, } from "./utils/logger/Logger.mjs";
|
|
11
|
+
export { serialize, deserialize } from "./utils/serialization/serialization.mjs";
|
|
12
|
+
export type { Serializable } from "./utils/serialization/types.mjs";
|
|
13
|
+
export { createOriginPermissions, DEFAULT_PROD_ORIGINS, DEFAULT_DEV_ORIGINS, DEFAULT_METAMASK_ORIGIN, } from "./utils/originPermissions/createOriginPermissions.mjs";
|
|
14
|
+
export type { CreateOriginPermissionsParams } from "./utils/originPermissions/createOriginPermissions.mjs";
|
|
15
|
+
export { validateOrigin } from "./utils/originPermissions/validateOrigin.mjs";
|
|
13
16
|
//# sourceMappingURL=index.d.mts.map
|
package/dist/index.d.mts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.mts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,oBAAoB,EACpB,cAAc,EACd,KAAK,uBAAuB,GAC7B,8CAA0C;AAC3C,OAAO,EACL,kCAAkC,EAClC,0BAA0B,EAC1B,KAAK,mCAAmC,GACzC,wEAAoE;AACrE,OAAO,EAAE,SAAS,EAAE,
|
|
1
|
+
{"version":3,"file":"index.d.mts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,oBAAoB,EACpB,cAAc,EACd,KAAK,uBAAuB,GAC7B,8CAA0C;AAC3C,OAAO,EACL,kCAAkC,EAClC,0BAA0B,EAC1B,KAAK,mCAAmC,GACzC,wEAAoE;AACrE,OAAO,EAAE,SAAS,EAAE,wCAAoC;AACxD,OAAO,EAAE,QAAQ,EAAE,sCAAkC;AACrD,YAAY,EAAE,cAAc,EAAE,sCAAkC;AAChE,OAAO,EACL,yBAAyB,EACzB,WAAW,GACZ,sCAAkC;AACnC,OAAO,EAAE,SAAS,EAAE,wCAAoC;AACxD,OAAO,EACL,UAAU,EACV,iBAAiB,EACjB,2BAA2B,EAC3B,oBAAoB,EACpB,MAAM,GACP,gCAA4B;AAC7B,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,kCAA8B;AACzD,YAAY,EACV,aAAa,EACb,YAAY,EACZ,SAAS,EACT,kBAAkB,EAClB,gBAAgB,GACjB,kCAA8B;AAC/B,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,gDAA4C;AAC7E,YAAY,EAAE,YAAY,EAAE,wCAAoC;AAChE,OAAO,EACL,uBAAuB,EACvB,oBAAoB,EACpB,mBAAmB,EACnB,uBAAuB,GACxB,8DAA0D;AAC3D,YAAY,EAAE,6BAA6B,EAAE,8DAA0D;AACvG,OAAO,EAAE,cAAc,EAAE,qDAAiD"}
|
package/dist/index.mjs
CHANGED
|
@@ -1,10 +1,12 @@
|
|
|
1
1
|
export { ASSETS_PROVIDER_NAME, AssetsProvider } from "./providers/assets/AssetsProvider.mjs";
|
|
2
2
|
export { REMOTE_FEATURE_FLAGS_PROVIDER_NAME, RemoteFeatureFlagsProvider } from "./providers/remote-feature-flags/RemoteFeatureFlagsProvider.mjs";
|
|
3
|
-
export { safeMerge } from "./safeMerge/safeMerge.mjs";
|
|
4
|
-
export { buildUrl } from "./buildUrl/buildUrl.mjs";
|
|
5
|
-
export { sanitizeControlCharacters, sanitizeUri } from "./sanitize.mjs";
|
|
6
|
-
export { UrlStruct } from "./urlStruct/urlStruct.mjs";
|
|
7
|
-
export {
|
|
8
|
-
export {
|
|
9
|
-
export {
|
|
3
|
+
export { safeMerge } from "./utils/safeMerge/safeMerge.mjs";
|
|
4
|
+
export { buildUrl } from "./utils/buildUrl/buildUrl.mjs";
|
|
5
|
+
export { sanitizeControlCharacters, sanitizeUri } from "./utils/sanitize/sanitize.mjs";
|
|
6
|
+
export { UrlStruct } from "./utils/urlStruct/urlStruct.mjs";
|
|
7
|
+
export { batchesAll, batchesAllSettled, batchesAllSettledWithChunks, batchesAllWithChunks, chunks } from "./utils/async/async.mjs";
|
|
8
|
+
export { Logger, LogLevel } from "./utils/logger/Logger.mjs";
|
|
9
|
+
export { serialize, deserialize } from "./utils/serialization/serialization.mjs";
|
|
10
|
+
export { createOriginPermissions, DEFAULT_PROD_ORIGINS, DEFAULT_DEV_ORIGINS, DEFAULT_METAMASK_ORIGIN } from "./utils/originPermissions/createOriginPermissions.mjs";
|
|
11
|
+
export { validateOrigin } from "./utils/originPermissions/validateOrigin.mjs";
|
|
10
12
|
//# sourceMappingURL=index.mjs.map
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,oBAAoB,EACpB,cAAc,EAEf,8CAA0C;AAC3C,OAAO,EACL,kCAAkC,EAClC,0BAA0B,EAE3B,wEAAoE;AACrE,OAAO,EAAE,SAAS,EAAE,
|
|
1
|
+
{"version":3,"file":"index.mjs","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,oBAAoB,EACpB,cAAc,EAEf,8CAA0C;AAC3C,OAAO,EACL,kCAAkC,EAClC,0BAA0B,EAE3B,wEAAoE;AACrE,OAAO,EAAE,SAAS,EAAE,wCAAoC;AACxD,OAAO,EAAE,QAAQ,EAAE,sCAAkC;AAErD,OAAO,EACL,yBAAyB,EACzB,WAAW,EACZ,sCAAkC;AACnC,OAAO,EAAE,SAAS,EAAE,wCAAoC;AACxD,OAAO,EACL,UAAU,EACV,iBAAiB,EACjB,2BAA2B,EAC3B,oBAAoB,EACpB,MAAM,EACP,gCAA4B;AAC7B,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,kCAA8B;AAQzD,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,gDAA4C;AAE7E,OAAO,EACL,uBAAuB,EACvB,oBAAoB,EACpB,mBAAmB,EACnB,uBAAuB,EACxB,8DAA0D;AAE3D,OAAO,EAAE,cAAc,EAAE,qDAAiD","sourcesContent":["export {\n ASSETS_PROVIDER_NAME,\n AssetsProvider,\n type AssetsProviderMessenger,\n} from './providers/assets/AssetsProvider';\nexport {\n REMOTE_FEATURE_FLAGS_PROVIDER_NAME,\n RemoteFeatureFlagsProvider,\n type RemoteFeatureFlagsProviderMessenger,\n} from './providers/remote-feature-flags/RemoteFeatureFlagsProvider';\nexport { safeMerge } from './utils/safeMerge/safeMerge';\nexport { buildUrl } from './utils/buildUrl/buildUrl';\nexport type { BuildUrlParams } from './utils/buildUrl/buildUrl';\nexport {\n sanitizeControlCharacters,\n sanitizeUri,\n} from './utils/sanitize/sanitize';\nexport { UrlStruct } from './utils/urlStruct/urlStruct';\nexport {\n batchesAll,\n batchesAllSettled,\n batchesAllSettledWithChunks,\n batchesAllWithChunks,\n chunks,\n} from './utils/async/async';\nexport { Logger, LogLevel } from './utils/logger/Logger';\nexport type {\n LoggerOptions,\n LoggerMethod,\n LogMethod,\n LogMethodDecorator,\n LoggerDecorators,\n} from './utils/logger/Logger';\nexport { serialize, deserialize } from './utils/serialization/serialization';\nexport type { Serializable } from './utils/serialization/types';\nexport {\n createOriginPermissions,\n DEFAULT_PROD_ORIGINS,\n DEFAULT_DEV_ORIGINS,\n DEFAULT_METAMASK_ORIGIN,\n} from './utils/originPermissions/createOriginPermissions';\nexport type { CreateOriginPermissionsParams } from './utils/originPermissions/createOriginPermissions';\nexport { validateOrigin } from './utils/originPermissions/validateOrigin';\n"]}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.chunks = chunks;
|
|
4
|
+
exports.batchesAll = batchesAll;
|
|
5
|
+
exports.batchesAllSettled = batchesAllSettled;
|
|
6
|
+
exports.batchesAllSettledWithChunks = batchesAllSettledWithChunks;
|
|
7
|
+
exports.batchesAllWithChunks = batchesAllWithChunks;
|
|
8
|
+
/**
|
|
9
|
+
* Splits items into chunks of a given size.
|
|
10
|
+
*
|
|
11
|
+
* @param items - Input items; order is preserved in the returned chunks.
|
|
12
|
+
* @param chunkSize - Size of each chunk (must be ≥ 1).
|
|
13
|
+
* @returns An array of chunks, each containing `chunkSize` items.
|
|
14
|
+
*/
|
|
15
|
+
function chunks(items, chunkSize) {
|
|
16
|
+
if (chunkSize < 1) {
|
|
17
|
+
throw new RangeError('chunkSize must be at least 1');
|
|
18
|
+
}
|
|
19
|
+
const itemsChunks = [];
|
|
20
|
+
for (let index = 0; index < items.length; index += chunkSize) {
|
|
21
|
+
itemsChunks.push(items.slice(index, index + chunkSize));
|
|
22
|
+
}
|
|
23
|
+
return itemsChunks;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Runs async work on items in fixed-size waves, using {@link Promise.all} per wave.
|
|
27
|
+
* The next wave starts only after the current wave completes; any rejection fails the whole call.
|
|
28
|
+
*
|
|
29
|
+
* @param items - Input items; order is preserved in the returned results.
|
|
30
|
+
* @param batchSize - Maximum concurrent mapper invocations per wave (must be ≥ 1).
|
|
31
|
+
* @param mapper - Async function for each item; receives the global index in `items`.
|
|
32
|
+
* @returns One result per item, in the same order as `items`.
|
|
33
|
+
*/
|
|
34
|
+
async function batchesAll(items, batchSize, mapper) {
|
|
35
|
+
if (batchSize < 1) {
|
|
36
|
+
throw new RangeError('batchSize must be at least 1');
|
|
37
|
+
}
|
|
38
|
+
const results = [];
|
|
39
|
+
for (let index = 0; index < items.length; index += batchSize) {
|
|
40
|
+
const batch = items.slice(index, index + batchSize);
|
|
41
|
+
const batchResults = await Promise.all(batch.map(async (item, batchOffset) => mapper(item, index + batchOffset)));
|
|
42
|
+
results.push(...batchResults);
|
|
43
|
+
}
|
|
44
|
+
return results;
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Runs async work on items in fixed-size waves, using {@link Promise.allSettled} per wave.
|
|
48
|
+
* The next wave starts only after the current one settles, limiting concurrency to `batchSize`.
|
|
49
|
+
*
|
|
50
|
+
* @param items - Input items; order is preserved in the returned results.
|
|
51
|
+
* @param batchSize - Maximum concurrent mapper invocations per wave (must be ≥ 1).
|
|
52
|
+
* @param mapper - Async function for each item; receives the global index in `items`.
|
|
53
|
+
* @returns One settled result per item, in the same order as `items`.
|
|
54
|
+
*/
|
|
55
|
+
async function batchesAllSettled(items, batchSize, mapper) {
|
|
56
|
+
if (batchSize < 1) {
|
|
57
|
+
throw new RangeError('batchSize must be at least 1');
|
|
58
|
+
}
|
|
59
|
+
const results = [];
|
|
60
|
+
for (let index = 0; index < items.length; index += batchSize) {
|
|
61
|
+
const batch = items.slice(index, index + batchSize);
|
|
62
|
+
const settled = await Promise.allSettled(batch.map(async (item, batchOffset) => mapper(item, index + batchOffset)));
|
|
63
|
+
results.push(...settled);
|
|
64
|
+
}
|
|
65
|
+
return results;
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Splits `items` into consecutive chunks of `chunkSize`, then runs {@link batchesAllSettled} on those chunks.
|
|
69
|
+
* Each mapper call receives one chunk; settled results are in chunk order (same order as {@link chunks}).
|
|
70
|
+
*
|
|
71
|
+
* @param items - Flat input items.
|
|
72
|
+
* @param chunkSize - Items per chunk (must be ≥ 1).
|
|
73
|
+
* @param batchSize - Max concurrent chunk mappers per wave (must be ≥ 1).
|
|
74
|
+
* @param mapper - Async work for a single chunk; second argument is the chunk index (0-based).
|
|
75
|
+
* @returns One settled result per chunk.
|
|
76
|
+
*/
|
|
77
|
+
async function batchesAllSettledWithChunks(items, chunkSize, batchSize, mapper) {
|
|
78
|
+
const itemChunks = chunks(items, chunkSize);
|
|
79
|
+
return batchesAllSettled(itemChunks, batchSize, async (chunk, chunkIndex) => mapper(chunk, chunkIndex));
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Splits `items` into consecutive chunks of `chunkSize`, then runs {@link batchesAll} on those chunks.
|
|
83
|
+
* Each mapper call receives one chunk; results are in chunk order (same order as {@link chunks}).
|
|
84
|
+
*
|
|
85
|
+
* @param items - Flat input items.
|
|
86
|
+
* @param chunkSize - Items per chunk (must be ≥ 1).
|
|
87
|
+
* @param batchSize - Max concurrent chunk mappers per wave (must be ≥ 1).
|
|
88
|
+
* @param mapper - Async work for a single chunk; second argument is the chunk index (0-based).
|
|
89
|
+
* @returns One result per chunk.
|
|
90
|
+
*/
|
|
91
|
+
async function batchesAllWithChunks(items, chunkSize, batchSize, mapper) {
|
|
92
|
+
const itemChunks = chunks(items, chunkSize);
|
|
93
|
+
return batchesAll(itemChunks, batchSize, async (chunk, chunkIndex) => mapper(chunk, chunkIndex));
|
|
94
|
+
}
|
|
95
|
+
//# sourceMappingURL=async.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"async.cjs","sourceRoot":"","sources":["../../../src/utils/async/async.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Splits items into chunks of a given size.\n *\n * @param items - Input items; order is preserved in the returned chunks.\n * @param chunkSize - Size of each chunk (must be ≥ 1).\n * @returns An array of chunks, each containing `chunkSize` items.\n */\nexport function chunks<TItem>(\n items: readonly TItem[],\n chunkSize: number,\n): TItem[][] {\n if (chunkSize < 1) {\n throw new RangeError('chunkSize must be at least 1');\n }\n\n const itemsChunks: TItem[][] = [];\n for (let index = 0; index < items.length; index += chunkSize) {\n itemsChunks.push(items.slice(index, index + chunkSize));\n }\n return itemsChunks;\n}\n\n/**\n * Runs async work on items in fixed-size waves, using {@link Promise.all} per wave.\n * The next wave starts only after the current wave completes; any rejection fails the whole call.\n *\n * @param items - Input items; order is preserved in the returned results.\n * @param batchSize - Maximum concurrent mapper invocations per wave (must be ≥ 1).\n * @param mapper - Async function for each item; receives the global index in `items`.\n * @returns One result per item, in the same order as `items`.\n */\nexport async function batchesAll<TItem, TResult>(\n items: readonly TItem[],\n batchSize: number,\n mapper: (item: TItem, index: number) => Promise<TResult>,\n): Promise<TResult[]> {\n if (batchSize < 1) {\n throw new RangeError('batchSize must be at least 1');\n }\n\n const results: TResult[] = [];\n\n for (let index = 0; index < items.length; index += batchSize) {\n const batch = items.slice(index, index + batchSize);\n const batchResults = await Promise.all(\n batch.map(async (item, batchOffset) => mapper(item, index + batchOffset)),\n );\n results.push(...batchResults);\n }\n\n return results;\n}\n\n/**\n * Runs async work on items in fixed-size waves, using {@link Promise.allSettled} per wave.\n * The next wave starts only after the current one settles, limiting concurrency to `batchSize`.\n *\n * @param items - Input items; order is preserved in the returned results.\n * @param batchSize - Maximum concurrent mapper invocations per wave (must be ≥ 1).\n * @param mapper - Async function for each item; receives the global index in `items`.\n * @returns One settled result per item, in the same order as `items`.\n */\nexport async function batchesAllSettled<TItem, TResult>(\n items: readonly TItem[],\n batchSize: number,\n mapper: (item: TItem, index: number) => Promise<TResult>,\n): Promise<PromiseSettledResult<TResult>[]> {\n if (batchSize < 1) {\n throw new RangeError('batchSize must be at least 1');\n }\n\n const results: PromiseSettledResult<TResult>[] = [];\n\n for (let index = 0; index < items.length; index += batchSize) {\n const batch = items.slice(index, index + batchSize);\n const settled = await Promise.allSettled(\n batch.map(async (item, batchOffset) => mapper(item, index + batchOffset)),\n );\n results.push(...settled);\n }\n\n return results;\n}\n\n/**\n * Splits `items` into consecutive chunks of `chunkSize`, then runs {@link batchesAllSettled} on those chunks.\n * Each mapper call receives one chunk; settled results are in chunk order (same order as {@link chunks}).\n *\n * @param items - Flat input items.\n * @param chunkSize - Items per chunk (must be ≥ 1).\n * @param batchSize - Max concurrent chunk mappers per wave (must be ≥ 1).\n * @param mapper - Async work for a single chunk; second argument is the chunk index (0-based).\n * @returns One settled result per chunk.\n */\nexport async function batchesAllSettledWithChunks<TItem, TResult>(\n items: readonly TItem[],\n chunkSize: number,\n batchSize: number,\n mapper: (chunk: TItem[], chunkIndex: number) => Promise<TResult>,\n): Promise<PromiseSettledResult<TResult>[]> {\n const itemChunks = chunks(items, chunkSize);\n return batchesAllSettled(itemChunks, batchSize, async (chunk, chunkIndex) =>\n mapper(chunk, chunkIndex),\n );\n}\n\n/**\n * Splits `items` into consecutive chunks of `chunkSize`, then runs {@link batchesAll} on those chunks.\n * Each mapper call receives one chunk; results are in chunk order (same order as {@link chunks}).\n *\n * @param items - Flat input items.\n * @param chunkSize - Items per chunk (must be ≥ 1).\n * @param batchSize - Max concurrent chunk mappers per wave (must be ≥ 1).\n * @param mapper - Async work for a single chunk; second argument is the chunk index (0-based).\n * @returns One result per chunk.\n */\nexport async function batchesAllWithChunks<TItem, TResult>(\n items: readonly TItem[],\n chunkSize: number,\n batchSize: number,\n mapper: (chunk: TItem[], chunkIndex: number) => Promise<TResult>,\n): Promise<TResult[]> {\n const itemChunks = chunks(items, chunkSize);\n return batchesAll(itemChunks, batchSize, async (chunk, chunkIndex) =>\n mapper(chunk, chunkIndex),\n );\n}\n"]}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Splits items into chunks of a given size.
|
|
3
|
+
*
|
|
4
|
+
* @param items - Input items; order is preserved in the returned chunks.
|
|
5
|
+
* @param chunkSize - Size of each chunk (must be ≥ 1).
|
|
6
|
+
* @returns An array of chunks, each containing `chunkSize` items.
|
|
7
|
+
*/
|
|
8
|
+
export declare function chunks<TItem>(items: readonly TItem[], chunkSize: number): TItem[][];
|
|
9
|
+
/**
|
|
10
|
+
* Runs async work on items in fixed-size waves, using {@link Promise.all} per wave.
|
|
11
|
+
* The next wave starts only after the current wave completes; any rejection fails the whole call.
|
|
12
|
+
*
|
|
13
|
+
* @param items - Input items; order is preserved in the returned results.
|
|
14
|
+
* @param batchSize - Maximum concurrent mapper invocations per wave (must be ≥ 1).
|
|
15
|
+
* @param mapper - Async function for each item; receives the global index in `items`.
|
|
16
|
+
* @returns One result per item, in the same order as `items`.
|
|
17
|
+
*/
|
|
18
|
+
export declare function batchesAll<TItem, TResult>(items: readonly TItem[], batchSize: number, mapper: (item: TItem, index: number) => Promise<TResult>): Promise<TResult[]>;
|
|
19
|
+
/**
|
|
20
|
+
* Runs async work on items in fixed-size waves, using {@link Promise.allSettled} per wave.
|
|
21
|
+
* The next wave starts only after the current one settles, limiting concurrency to `batchSize`.
|
|
22
|
+
*
|
|
23
|
+
* @param items - Input items; order is preserved in the returned results.
|
|
24
|
+
* @param batchSize - Maximum concurrent mapper invocations per wave (must be ≥ 1).
|
|
25
|
+
* @param mapper - Async function for each item; receives the global index in `items`.
|
|
26
|
+
* @returns One settled result per item, in the same order as `items`.
|
|
27
|
+
*/
|
|
28
|
+
export declare function batchesAllSettled<TItem, TResult>(items: readonly TItem[], batchSize: number, mapper: (item: TItem, index: number) => Promise<TResult>): Promise<PromiseSettledResult<TResult>[]>;
|
|
29
|
+
/**
|
|
30
|
+
* Splits `items` into consecutive chunks of `chunkSize`, then runs {@link batchesAllSettled} on those chunks.
|
|
31
|
+
* Each mapper call receives one chunk; settled results are in chunk order (same order as {@link chunks}).
|
|
32
|
+
*
|
|
33
|
+
* @param items - Flat input items.
|
|
34
|
+
* @param chunkSize - Items per chunk (must be ≥ 1).
|
|
35
|
+
* @param batchSize - Max concurrent chunk mappers per wave (must be ≥ 1).
|
|
36
|
+
* @param mapper - Async work for a single chunk; second argument is the chunk index (0-based).
|
|
37
|
+
* @returns One settled result per chunk.
|
|
38
|
+
*/
|
|
39
|
+
export declare function batchesAllSettledWithChunks<TItem, TResult>(items: readonly TItem[], chunkSize: number, batchSize: number, mapper: (chunk: TItem[], chunkIndex: number) => Promise<TResult>): Promise<PromiseSettledResult<TResult>[]>;
|
|
40
|
+
/**
|
|
41
|
+
* Splits `items` into consecutive chunks of `chunkSize`, then runs {@link batchesAll} on those chunks.
|
|
42
|
+
* Each mapper call receives one chunk; results are in chunk order (same order as {@link chunks}).
|
|
43
|
+
*
|
|
44
|
+
* @param items - Flat input items.
|
|
45
|
+
* @param chunkSize - Items per chunk (must be ≥ 1).
|
|
46
|
+
* @param batchSize - Max concurrent chunk mappers per wave (must be ≥ 1).
|
|
47
|
+
* @param mapper - Async work for a single chunk; second argument is the chunk index (0-based).
|
|
48
|
+
* @returns One result per chunk.
|
|
49
|
+
*/
|
|
50
|
+
export declare function batchesAllWithChunks<TItem, TResult>(items: readonly TItem[], chunkSize: number, batchSize: number, mapper: (chunk: TItem[], chunkIndex: number) => Promise<TResult>): Promise<TResult[]>;
|
|
51
|
+
//# sourceMappingURL=async.d.cts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"async.d.cts","sourceRoot":"","sources":["../../../src/utils/async/async.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,wBAAgB,MAAM,CAAC,KAAK,EAC1B,KAAK,EAAE,SAAS,KAAK,EAAE,EACvB,SAAS,EAAE,MAAM,GAChB,KAAK,EAAE,EAAE,CAUX;AAED;;;;;;;;GAQG;AACH,wBAAsB,UAAU,CAAC,KAAK,EAAE,OAAO,EAC7C,KAAK,EAAE,SAAS,KAAK,EAAE,EACvB,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,GACvD,OAAO,CAAC,OAAO,EAAE,CAAC,CAgBpB;AAED;;;;;;;;GAQG;AACH,wBAAsB,iBAAiB,CAAC,KAAK,EAAE,OAAO,EACpD,KAAK,EAAE,SAAS,KAAK,EAAE,EACvB,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,GACvD,OAAO,CAAC,oBAAoB,CAAC,OAAO,CAAC,EAAE,CAAC,CAgB1C;AAED;;;;;;;;;GASG;AACH,wBAAsB,2BAA2B,CAAC,KAAK,EAAE,OAAO,EAC9D,KAAK,EAAE,SAAS,KAAK,EAAE,EACvB,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE,UAAU,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,GAC/D,OAAO,CAAC,oBAAoB,CAAC,OAAO,CAAC,EAAE,CAAC,CAK1C;AAED;;;;;;;;;GASG;AACH,wBAAsB,oBAAoB,CAAC,KAAK,EAAE,OAAO,EACvD,KAAK,EAAE,SAAS,KAAK,EAAE,EACvB,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE,UAAU,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,GAC/D,OAAO,CAAC,OAAO,EAAE,CAAC,CAKpB"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Splits items into chunks of a given size.
|
|
3
|
+
*
|
|
4
|
+
* @param items - Input items; order is preserved in the returned chunks.
|
|
5
|
+
* @param chunkSize - Size of each chunk (must be ≥ 1).
|
|
6
|
+
* @returns An array of chunks, each containing `chunkSize` items.
|
|
7
|
+
*/
|
|
8
|
+
export declare function chunks<TItem>(items: readonly TItem[], chunkSize: number): TItem[][];
|
|
9
|
+
/**
|
|
10
|
+
* Runs async work on items in fixed-size waves, using {@link Promise.all} per wave.
|
|
11
|
+
* The next wave starts only after the current wave completes; any rejection fails the whole call.
|
|
12
|
+
*
|
|
13
|
+
* @param items - Input items; order is preserved in the returned results.
|
|
14
|
+
* @param batchSize - Maximum concurrent mapper invocations per wave (must be ≥ 1).
|
|
15
|
+
* @param mapper - Async function for each item; receives the global index in `items`.
|
|
16
|
+
* @returns One result per item, in the same order as `items`.
|
|
17
|
+
*/
|
|
18
|
+
export declare function batchesAll<TItem, TResult>(items: readonly TItem[], batchSize: number, mapper: (item: TItem, index: number) => Promise<TResult>): Promise<TResult[]>;
|
|
19
|
+
/**
|
|
20
|
+
* Runs async work on items in fixed-size waves, using {@link Promise.allSettled} per wave.
|
|
21
|
+
* The next wave starts only after the current one settles, limiting concurrency to `batchSize`.
|
|
22
|
+
*
|
|
23
|
+
* @param items - Input items; order is preserved in the returned results.
|
|
24
|
+
* @param batchSize - Maximum concurrent mapper invocations per wave (must be ≥ 1).
|
|
25
|
+
* @param mapper - Async function for each item; receives the global index in `items`.
|
|
26
|
+
* @returns One settled result per item, in the same order as `items`.
|
|
27
|
+
*/
|
|
28
|
+
export declare function batchesAllSettled<TItem, TResult>(items: readonly TItem[], batchSize: number, mapper: (item: TItem, index: number) => Promise<TResult>): Promise<PromiseSettledResult<TResult>[]>;
|
|
29
|
+
/**
|
|
30
|
+
* Splits `items` into consecutive chunks of `chunkSize`, then runs {@link batchesAllSettled} on those chunks.
|
|
31
|
+
* Each mapper call receives one chunk; settled results are in chunk order (same order as {@link chunks}).
|
|
32
|
+
*
|
|
33
|
+
* @param items - Flat input items.
|
|
34
|
+
* @param chunkSize - Items per chunk (must be ≥ 1).
|
|
35
|
+
* @param batchSize - Max concurrent chunk mappers per wave (must be ≥ 1).
|
|
36
|
+
* @param mapper - Async work for a single chunk; second argument is the chunk index (0-based).
|
|
37
|
+
* @returns One settled result per chunk.
|
|
38
|
+
*/
|
|
39
|
+
export declare function batchesAllSettledWithChunks<TItem, TResult>(items: readonly TItem[], chunkSize: number, batchSize: number, mapper: (chunk: TItem[], chunkIndex: number) => Promise<TResult>): Promise<PromiseSettledResult<TResult>[]>;
|
|
40
|
+
/**
|
|
41
|
+
* Splits `items` into consecutive chunks of `chunkSize`, then runs {@link batchesAll} on those chunks.
|
|
42
|
+
* Each mapper call receives one chunk; results are in chunk order (same order as {@link chunks}).
|
|
43
|
+
*
|
|
44
|
+
* @param items - Flat input items.
|
|
45
|
+
* @param chunkSize - Items per chunk (must be ≥ 1).
|
|
46
|
+
* @param batchSize - Max concurrent chunk mappers per wave (must be ≥ 1).
|
|
47
|
+
* @param mapper - Async work for a single chunk; second argument is the chunk index (0-based).
|
|
48
|
+
* @returns One result per chunk.
|
|
49
|
+
*/
|
|
50
|
+
export declare function batchesAllWithChunks<TItem, TResult>(items: readonly TItem[], chunkSize: number, batchSize: number, mapper: (chunk: TItem[], chunkIndex: number) => Promise<TResult>): Promise<TResult[]>;
|
|
51
|
+
//# sourceMappingURL=async.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"async.d.mts","sourceRoot":"","sources":["../../../src/utils/async/async.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,wBAAgB,MAAM,CAAC,KAAK,EAC1B,KAAK,EAAE,SAAS,KAAK,EAAE,EACvB,SAAS,EAAE,MAAM,GAChB,KAAK,EAAE,EAAE,CAUX;AAED;;;;;;;;GAQG;AACH,wBAAsB,UAAU,CAAC,KAAK,EAAE,OAAO,EAC7C,KAAK,EAAE,SAAS,KAAK,EAAE,EACvB,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,GACvD,OAAO,CAAC,OAAO,EAAE,CAAC,CAgBpB;AAED;;;;;;;;GAQG;AACH,wBAAsB,iBAAiB,CAAC,KAAK,EAAE,OAAO,EACpD,KAAK,EAAE,SAAS,KAAK,EAAE,EACvB,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,GACvD,OAAO,CAAC,oBAAoB,CAAC,OAAO,CAAC,EAAE,CAAC,CAgB1C;AAED;;;;;;;;;GASG;AACH,wBAAsB,2BAA2B,CAAC,KAAK,EAAE,OAAO,EAC9D,KAAK,EAAE,SAAS,KAAK,EAAE,EACvB,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE,UAAU,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,GAC/D,OAAO,CAAC,oBAAoB,CAAC,OAAO,CAAC,EAAE,CAAC,CAK1C;AAED;;;;;;;;;GASG;AACH,wBAAsB,oBAAoB,CAAC,KAAK,EAAE,OAAO,EACvD,KAAK,EAAE,SAAS,KAAK,EAAE,EACvB,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE,UAAU,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,GAC/D,OAAO,CAAC,OAAO,EAAE,CAAC,CAKpB"}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Splits items into chunks of a given size.
|
|
3
|
+
*
|
|
4
|
+
* @param items - Input items; order is preserved in the returned chunks.
|
|
5
|
+
* @param chunkSize - Size of each chunk (must be ≥ 1).
|
|
6
|
+
* @returns An array of chunks, each containing `chunkSize` items.
|
|
7
|
+
*/
|
|
8
|
+
export function chunks(items, chunkSize) {
|
|
9
|
+
if (chunkSize < 1) {
|
|
10
|
+
throw new RangeError('chunkSize must be at least 1');
|
|
11
|
+
}
|
|
12
|
+
const itemsChunks = [];
|
|
13
|
+
for (let index = 0; index < items.length; index += chunkSize) {
|
|
14
|
+
itemsChunks.push(items.slice(index, index + chunkSize));
|
|
15
|
+
}
|
|
16
|
+
return itemsChunks;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Runs async work on items in fixed-size waves, using {@link Promise.all} per wave.
|
|
20
|
+
* The next wave starts only after the current wave completes; any rejection fails the whole call.
|
|
21
|
+
*
|
|
22
|
+
* @param items - Input items; order is preserved in the returned results.
|
|
23
|
+
* @param batchSize - Maximum concurrent mapper invocations per wave (must be ≥ 1).
|
|
24
|
+
* @param mapper - Async function for each item; receives the global index in `items`.
|
|
25
|
+
* @returns One result per item, in the same order as `items`.
|
|
26
|
+
*/
|
|
27
|
+
export async function batchesAll(items, batchSize, mapper) {
|
|
28
|
+
if (batchSize < 1) {
|
|
29
|
+
throw new RangeError('batchSize must be at least 1');
|
|
30
|
+
}
|
|
31
|
+
const results = [];
|
|
32
|
+
for (let index = 0; index < items.length; index += batchSize) {
|
|
33
|
+
const batch = items.slice(index, index + batchSize);
|
|
34
|
+
const batchResults = await Promise.all(batch.map(async (item, batchOffset) => mapper(item, index + batchOffset)));
|
|
35
|
+
results.push(...batchResults);
|
|
36
|
+
}
|
|
37
|
+
return results;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Runs async work on items in fixed-size waves, using {@link Promise.allSettled} per wave.
|
|
41
|
+
* The next wave starts only after the current one settles, limiting concurrency to `batchSize`.
|
|
42
|
+
*
|
|
43
|
+
* @param items - Input items; order is preserved in the returned results.
|
|
44
|
+
* @param batchSize - Maximum concurrent mapper invocations per wave (must be ≥ 1).
|
|
45
|
+
* @param mapper - Async function for each item; receives the global index in `items`.
|
|
46
|
+
* @returns One settled result per item, in the same order as `items`.
|
|
47
|
+
*/
|
|
48
|
+
export async function batchesAllSettled(items, batchSize, mapper) {
|
|
49
|
+
if (batchSize < 1) {
|
|
50
|
+
throw new RangeError('batchSize must be at least 1');
|
|
51
|
+
}
|
|
52
|
+
const results = [];
|
|
53
|
+
for (let index = 0; index < items.length; index += batchSize) {
|
|
54
|
+
const batch = items.slice(index, index + batchSize);
|
|
55
|
+
const settled = await Promise.allSettled(batch.map(async (item, batchOffset) => mapper(item, index + batchOffset)));
|
|
56
|
+
results.push(...settled);
|
|
57
|
+
}
|
|
58
|
+
return results;
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Splits `items` into consecutive chunks of `chunkSize`, then runs {@link batchesAllSettled} on those chunks.
|
|
62
|
+
* Each mapper call receives one chunk; settled results are in chunk order (same order as {@link chunks}).
|
|
63
|
+
*
|
|
64
|
+
* @param items - Flat input items.
|
|
65
|
+
* @param chunkSize - Items per chunk (must be ≥ 1).
|
|
66
|
+
* @param batchSize - Max concurrent chunk mappers per wave (must be ≥ 1).
|
|
67
|
+
* @param mapper - Async work for a single chunk; second argument is the chunk index (0-based).
|
|
68
|
+
* @returns One settled result per chunk.
|
|
69
|
+
*/
|
|
70
|
+
export async function batchesAllSettledWithChunks(items, chunkSize, batchSize, mapper) {
|
|
71
|
+
const itemChunks = chunks(items, chunkSize);
|
|
72
|
+
return batchesAllSettled(itemChunks, batchSize, async (chunk, chunkIndex) => mapper(chunk, chunkIndex));
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Splits `items` into consecutive chunks of `chunkSize`, then runs {@link batchesAll} on those chunks.
|
|
76
|
+
* Each mapper call receives one chunk; results are in chunk order (same order as {@link chunks}).
|
|
77
|
+
*
|
|
78
|
+
* @param items - Flat input items.
|
|
79
|
+
* @param chunkSize - Items per chunk (must be ≥ 1).
|
|
80
|
+
* @param batchSize - Max concurrent chunk mappers per wave (must be ≥ 1).
|
|
81
|
+
* @param mapper - Async work for a single chunk; second argument is the chunk index (0-based).
|
|
82
|
+
* @returns One result per chunk.
|
|
83
|
+
*/
|
|
84
|
+
export async function batchesAllWithChunks(items, chunkSize, batchSize, mapper) {
|
|
85
|
+
const itemChunks = chunks(items, chunkSize);
|
|
86
|
+
return batchesAll(itemChunks, batchSize, async (chunk, chunkIndex) => mapper(chunk, chunkIndex));
|
|
87
|
+
}
|
|
88
|
+
//# sourceMappingURL=async.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"async.mjs","sourceRoot":"","sources":["../../../src/utils/async/async.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Splits items into chunks of a given size.\n *\n * @param items - Input items; order is preserved in the returned chunks.\n * @param chunkSize - Size of each chunk (must be ≥ 1).\n * @returns An array of chunks, each containing `chunkSize` items.\n */\nexport function chunks<TItem>(\n items: readonly TItem[],\n chunkSize: number,\n): TItem[][] {\n if (chunkSize < 1) {\n throw new RangeError('chunkSize must be at least 1');\n }\n\n const itemsChunks: TItem[][] = [];\n for (let index = 0; index < items.length; index += chunkSize) {\n itemsChunks.push(items.slice(index, index + chunkSize));\n }\n return itemsChunks;\n}\n\n/**\n * Runs async work on items in fixed-size waves, using {@link Promise.all} per wave.\n * The next wave starts only after the current wave completes; any rejection fails the whole call.\n *\n * @param items - Input items; order is preserved in the returned results.\n * @param batchSize - Maximum concurrent mapper invocations per wave (must be ≥ 1).\n * @param mapper - Async function for each item; receives the global index in `items`.\n * @returns One result per item, in the same order as `items`.\n */\nexport async function batchesAll<TItem, TResult>(\n items: readonly TItem[],\n batchSize: number,\n mapper: (item: TItem, index: number) => Promise<TResult>,\n): Promise<TResult[]> {\n if (batchSize < 1) {\n throw new RangeError('batchSize must be at least 1');\n }\n\n const results: TResult[] = [];\n\n for (let index = 0; index < items.length; index += batchSize) {\n const batch = items.slice(index, index + batchSize);\n const batchResults = await Promise.all(\n batch.map(async (item, batchOffset) => mapper(item, index + batchOffset)),\n );\n results.push(...batchResults);\n }\n\n return results;\n}\n\n/**\n * Runs async work on items in fixed-size waves, using {@link Promise.allSettled} per wave.\n * The next wave starts only after the current one settles, limiting concurrency to `batchSize`.\n *\n * @param items - Input items; order is preserved in the returned results.\n * @param batchSize - Maximum concurrent mapper invocations per wave (must be ≥ 1).\n * @param mapper - Async function for each item; receives the global index in `items`.\n * @returns One settled result per item, in the same order as `items`.\n */\nexport async function batchesAllSettled<TItem, TResult>(\n items: readonly TItem[],\n batchSize: number,\n mapper: (item: TItem, index: number) => Promise<TResult>,\n): Promise<PromiseSettledResult<TResult>[]> {\n if (batchSize < 1) {\n throw new RangeError('batchSize must be at least 1');\n }\n\n const results: PromiseSettledResult<TResult>[] = [];\n\n for (let index = 0; index < items.length; index += batchSize) {\n const batch = items.slice(index, index + batchSize);\n const settled = await Promise.allSettled(\n batch.map(async (item, batchOffset) => mapper(item, index + batchOffset)),\n );\n results.push(...settled);\n }\n\n return results;\n}\n\n/**\n * Splits `items` into consecutive chunks of `chunkSize`, then runs {@link batchesAllSettled} on those chunks.\n * Each mapper call receives one chunk; settled results are in chunk order (same order as {@link chunks}).\n *\n * @param items - Flat input items.\n * @param chunkSize - Items per chunk (must be ≥ 1).\n * @param batchSize - Max concurrent chunk mappers per wave (must be ≥ 1).\n * @param mapper - Async work for a single chunk; second argument is the chunk index (0-based).\n * @returns One settled result per chunk.\n */\nexport async function batchesAllSettledWithChunks<TItem, TResult>(\n items: readonly TItem[],\n chunkSize: number,\n batchSize: number,\n mapper: (chunk: TItem[], chunkIndex: number) => Promise<TResult>,\n): Promise<PromiseSettledResult<TResult>[]> {\n const itemChunks = chunks(items, chunkSize);\n return batchesAllSettled(itemChunks, batchSize, async (chunk, chunkIndex) =>\n mapper(chunk, chunkIndex),\n );\n}\n\n/**\n * Splits `items` into consecutive chunks of `chunkSize`, then runs {@link batchesAll} on those chunks.\n * Each mapper call receives one chunk; results are in chunk order (same order as {@link chunks}).\n *\n * @param items - Flat input items.\n * @param chunkSize - Items per chunk (must be ≥ 1).\n * @param batchSize - Max concurrent chunk mappers per wave (must be ≥ 1).\n * @param mapper - Async work for a single chunk; second argument is the chunk index (0-based).\n * @returns One result per chunk.\n */\nexport async function batchesAllWithChunks<TItem, TResult>(\n items: readonly TItem[],\n chunkSize: number,\n batchSize: number,\n mapper: (chunk: TItem[], chunkIndex: number) => Promise<TResult>,\n): Promise<TResult[]> {\n const itemChunks = chunks(items, chunkSize);\n return batchesAll(itemChunks, batchSize, async (chunk, chunkIndex) =>\n mapper(chunk, chunkIndex),\n );\n}\n"]}
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.buildUrl = buildUrl;
|
|
4
4
|
const superstruct_1 = require("@metamask/superstruct");
|
|
5
|
-
const sanitize_1 = require("../sanitize.cjs");
|
|
5
|
+
const sanitize_1 = require("../sanitize/sanitize.cjs");
|
|
6
6
|
const urlStruct_1 = require("../urlStruct/urlStruct.cjs");
|
|
7
7
|
/**
|
|
8
8
|
* Builds a safe URL from a base URL, path, and optional parameters.
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"buildUrl.cjs","sourceRoot":"","sources":["../../../src/utils/buildUrl/buildUrl.ts"],"names":[],"mappings":";;AAmBA,4BAqDC;AAxED,uDAA+C;AAE/C,uDAA8E;AAC9E,0DAAmD;AAUnD;;;;;GAKG;AACH,SAAgB,QAAQ,CAAC,MAAsB;IAC7C,MAAM,EACJ,OAAO,EACP,IAAI,EACJ,UAAU,EACV,WAAW,EACX,gBAAgB,GAAG,IAAI,GACxB,GAAG,MAAM,CAAC;IAEX,iCAAiC;IACjC,MAAM,gBAAgB,GAAG,IAAA,sBAAW,EAAC,OAAO,CAAC,CAAC;IAC9C,IAAI,gBAAgB,KAAK,EAAE,EAAE,CAAC;QAC5B,MAAM,IAAI,KAAK,CAAC,oBAAoB,CAAC,CAAC;IACxC,CAAC;IACD,IAAA,oBAAM,EAAC,gBAAgB,EAAE,qBAAS,CAAC,CAAC;IAEpC,MAAM,cAAc,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,EAAE,CAAC,CAAC,EAAE,GAAW,EAAE,EAAE;QACpE,MAAM,KAAK,GAAG,UAAU,EAAE,CAAC,GAAG,CAAC,CAAC;QAChC,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACxB,MAAM,IAAI,KAAK,CAAC,kBAAkB,GAAG,eAAe,CAAC,CAAC;QACxD,CAAC;QACD,8DAA8D;QAC9D,MAAM,cAAc,GAAG,IAAA,oCAAyB,EAAC,KAAK,CAAC,CAAC;QACxD,OAAO,gBAAgB;YACrB,CAAC,CAAC,kBAAkB,CAAC,cAAc,CAAC;YACpC,CAAC,CAAC,cAAc,CAAC;IACrB,CAAC,CAAC,CAAC;IAEH,MAAM,SAAS,GAAG,cAAc;SAC7B,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC;SACpB,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC;SACrB,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;IAExB,MAAM,iBAAiB,GAAG,gBAAgB,CAAC,QAAQ,CAAC,GAAG,CAAC;QACtD,CAAC,CAAC,gBAAgB;QAClB,CAAC,CAAC,GAAG,gBAAgB,GAAG,CAAC;IAE3B,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,SAAS,EAAE,iBAAiB,CAAC,CAAC;IAElD,MAAM,CAAC,OAAO,CAAC,WAAW,IAAI,EAAE,CAAC;SAC9B,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,KAAK,KAAK,SAAS,CAAC;SAC3C,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,KAAK,KAAK,IAAI,CAAC;SACtC,OAAO,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE;QACxB,IAAI,KAAK,EAAE,CAAC;YACV,+DAA+D;YAC/D,MAAM,cAAc,GAAG,IAAA,oCAAyB,EAAC,KAAK,CAAC,CAAC;YACxD,GAAG,CAAC,YAAY,CAAC,MAAM,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC;QAC/C,CAAC;IACH,CAAC,CAAC,CAAC;IAEL,MAAM,QAAQ,GAAG,GAAG,CAAC,QAAQ,EAAE,CAAC;IAChC,IAAA,oBAAM,EAAC,QAAQ,EAAE,qBAAS,CAAC,CAAC;IAC5B,OAAO,QAAQ,CAAC;AAClB,CAAC","sourcesContent":["import { assert } from '@metamask/superstruct';\n\nimport { sanitizeControlCharacters, sanitizeUri } from '../sanitize/sanitize';\nimport { UrlStruct } from '../urlStruct/urlStruct';\n\nexport type BuildUrlParams = {\n baseUrl: string;\n path: string;\n pathParams?: Record<string, string> | undefined;\n queryParams?: Record<string, string> | undefined;\n encodePathParams?: boolean;\n};\n\n/**\n * Builds a safe URL from a base URL, path, and optional parameters.\n *\n * @param params - The parameters to build the URL from.\n * @returns The validated, sanitized URL.\n */\nexport function buildUrl(params: BuildUrlParams): string {\n const {\n baseUrl,\n path,\n pathParams,\n queryParams,\n encodePathParams = true,\n } = params;\n\n // Validate and sanitize base URL\n const sanitizedBaseUrl = sanitizeUri(baseUrl);\n if (sanitizedBaseUrl === '') {\n throw new Error('Invalid URL format');\n }\n assert(sanitizedBaseUrl, UrlStruct);\n\n const pathWithParams = path.replace(/\\{(\\w+)\\}/gu, (_, key: string) => {\n const value = pathParams?.[key];\n if (value === undefined) {\n throw new Error(`Path parameter ${key} is undefined`);\n }\n // Sanitize path parameter values to remove control characters\n const sanitizedValue = sanitizeControlCharacters(value);\n return encodePathParams\n ? encodeURIComponent(sanitizedValue)\n : sanitizedValue;\n });\n\n const cleanPath = pathWithParams\n .replace(/^\\/+/u, '')\n .replace(/\\/+/gu, '/')\n .replace(/\\/+$/u, '');\n\n const normalizedBaseUrl = sanitizedBaseUrl.endsWith('/')\n ? sanitizedBaseUrl\n : `${sanitizedBaseUrl}/`;\n\n const url = new URL(cleanPath, normalizedBaseUrl);\n\n Object.entries(queryParams ?? {})\n .filter(([_, value]) => value !== undefined)\n .filter(([_, value]) => value !== null)\n .forEach(([key, value]) => {\n if (value) {\n // Sanitize query parameter values to remove control characters\n const sanitizedValue = sanitizeControlCharacters(value);\n url.searchParams.append(key, sanitizedValue);\n }\n });\n\n const builtUrl = url.toString();\n assert(builtUrl, UrlStruct);\n return builtUrl;\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"buildUrl.d.cts","sourceRoot":"","sources":["../../../src/utils/buildUrl/buildUrl.ts"],"names":[],"mappings":"AAKA,MAAM,MAAM,cAAc,GAAG;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,CAAC;IAChD,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,CAAC;IACjD,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC5B,CAAC;AAEF;;;;;GAKG;AACH,wBAAgB,QAAQ,CAAC,MAAM,EAAE,cAAc,GAAG,MAAM,CAqDvD"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"buildUrl.d.mts","sourceRoot":"","sources":["../../../src/utils/buildUrl/buildUrl.ts"],"names":[],"mappings":"AAKA,MAAM,MAAM,cAAc,GAAG;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,CAAC;IAChD,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,CAAC;IACjD,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC5B,CAAC;AAEF;;;;;GAKG;AACH,wBAAgB,QAAQ,CAAC,MAAM,EAAE,cAAc,GAAG,MAAM,CAqDvD"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { assert } from "@metamask/superstruct";
|
|
2
|
-
import { sanitizeControlCharacters, sanitizeUri } from "../sanitize.mjs";
|
|
2
|
+
import { sanitizeControlCharacters, sanitizeUri } from "../sanitize/sanitize.mjs";
|
|
3
3
|
import { UrlStruct } from "../urlStruct/urlStruct.mjs";
|
|
4
4
|
/**
|
|
5
5
|
* Builds a safe URL from a base URL, path, and optional parameters.
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"buildUrl.mjs","sourceRoot":"","sources":["../../../src/utils/buildUrl/buildUrl.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,8BAA8B;AAE/C,OAAO,EAAE,yBAAyB,EAAE,WAAW,EAAE,iCAA6B;AAC9E,OAAO,EAAE,SAAS,EAAE,mCAA+B;AAUnD;;;;;GAKG;AACH,MAAM,UAAU,QAAQ,CAAC,MAAsB;IAC7C,MAAM,EACJ,OAAO,EACP,IAAI,EACJ,UAAU,EACV,WAAW,EACX,gBAAgB,GAAG,IAAI,GACxB,GAAG,MAAM,CAAC;IAEX,iCAAiC;IACjC,MAAM,gBAAgB,GAAG,WAAW,CAAC,OAAO,CAAC,CAAC;IAC9C,IAAI,gBAAgB,KAAK,EAAE,EAAE,CAAC;QAC5B,MAAM,IAAI,KAAK,CAAC,oBAAoB,CAAC,CAAC;IACxC,CAAC;IACD,MAAM,CAAC,gBAAgB,EAAE,SAAS,CAAC,CAAC;IAEpC,MAAM,cAAc,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,EAAE,CAAC,CAAC,EAAE,GAAW,EAAE,EAAE;QACpE,MAAM,KAAK,GAAG,UAAU,EAAE,CAAC,GAAG,CAAC,CAAC;QAChC,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACxB,MAAM,IAAI,KAAK,CAAC,kBAAkB,GAAG,eAAe,CAAC,CAAC;QACxD,CAAC;QACD,8DAA8D;QAC9D,MAAM,cAAc,GAAG,yBAAyB,CAAC,KAAK,CAAC,CAAC;QACxD,OAAO,gBAAgB;YACrB,CAAC,CAAC,kBAAkB,CAAC,cAAc,CAAC;YACpC,CAAC,CAAC,cAAc,CAAC;IACrB,CAAC,CAAC,CAAC;IAEH,MAAM,SAAS,GAAG,cAAc;SAC7B,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC;SACpB,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC;SACrB,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;IAExB,MAAM,iBAAiB,GAAG,gBAAgB,CAAC,QAAQ,CAAC,GAAG,CAAC;QACtD,CAAC,CAAC,gBAAgB;QAClB,CAAC,CAAC,GAAG,gBAAgB,GAAG,CAAC;IAE3B,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,SAAS,EAAE,iBAAiB,CAAC,CAAC;IAElD,MAAM,CAAC,OAAO,CAAC,WAAW,IAAI,EAAE,CAAC;SAC9B,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,KAAK,KAAK,SAAS,CAAC;SAC3C,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,KAAK,KAAK,IAAI,CAAC;SACtC,OAAO,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE;QACxB,IAAI,KAAK,EAAE,CAAC;YACV,+DAA+D;YAC/D,MAAM,cAAc,GAAG,yBAAyB,CAAC,KAAK,CAAC,CAAC;YACxD,GAAG,CAAC,YAAY,CAAC,MAAM,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC;QAC/C,CAAC;IACH,CAAC,CAAC,CAAC;IAEL,MAAM,QAAQ,GAAG,GAAG,CAAC,QAAQ,EAAE,CAAC;IAChC,MAAM,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;IAC5B,OAAO,QAAQ,CAAC;AAClB,CAAC","sourcesContent":["import { assert } from '@metamask/superstruct';\n\nimport { sanitizeControlCharacters, sanitizeUri } from '../sanitize/sanitize';\nimport { UrlStruct } from '../urlStruct/urlStruct';\n\nexport type BuildUrlParams = {\n baseUrl: string;\n path: string;\n pathParams?: Record<string, string> | undefined;\n queryParams?: Record<string, string> | undefined;\n encodePathParams?: boolean;\n};\n\n/**\n * Builds a safe URL from a base URL, path, and optional parameters.\n *\n * @param params - The parameters to build the URL from.\n * @returns The validated, sanitized URL.\n */\nexport function buildUrl(params: BuildUrlParams): string {\n const {\n baseUrl,\n path,\n pathParams,\n queryParams,\n encodePathParams = true,\n } = params;\n\n // Validate and sanitize base URL\n const sanitizedBaseUrl = sanitizeUri(baseUrl);\n if (sanitizedBaseUrl === '') {\n throw new Error('Invalid URL format');\n }\n assert(sanitizedBaseUrl, UrlStruct);\n\n const pathWithParams = path.replace(/\\{(\\w+)\\}/gu, (_, key: string) => {\n const value = pathParams?.[key];\n if (value === undefined) {\n throw new Error(`Path parameter ${key} is undefined`);\n }\n // Sanitize path parameter values to remove control characters\n const sanitizedValue = sanitizeControlCharacters(value);\n return encodePathParams\n ? encodeURIComponent(sanitizedValue)\n : sanitizedValue;\n });\n\n const cleanPath = pathWithParams\n .replace(/^\\/+/u, '')\n .replace(/\\/+/gu, '/')\n .replace(/\\/+$/u, '');\n\n const normalizedBaseUrl = sanitizedBaseUrl.endsWith('/')\n ? sanitizedBaseUrl\n : `${sanitizedBaseUrl}/`;\n\n const url = new URL(cleanPath, normalizedBaseUrl);\n\n Object.entries(queryParams ?? {})\n .filter(([_, value]) => value !== undefined)\n .filter(([_, value]) => value !== null)\n .forEach(([key, value]) => {\n if (value) {\n // Sanitize query parameter values to remove control characters\n const sanitizedValue = sanitizeControlCharacters(value);\n url.searchParams.append(key, sanitizedValue);\n }\n });\n\n const builtUrl = url.toString();\n assert(builtUrl, UrlStruct);\n return builtUrl;\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"InFlightCoalescer.cjs","sourceRoot":"","sources":["../../../src/utils/dedupe/InFlightCoalescer.ts"],"names":[],"mappings":";;;;;;;;;AAAA;;;;;;GAMG;AACH,MAAa,iBAAiB;IAA9B;QACW,sCAAY,IAAI,GAAG,EAA4B,EAAC;IAiB3D,CAAC;IAfC,KAAK,CAAC,GAAG,CAAS,GAAW,EAAE,EAAyB;QACtD,MAAM,OAAO,GAAG,uBAAA,IAAI,mCAAU,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACxC,IAAI,OAAO,EAAE,CAAC;YACZ,OAAO,OAA0B,CAAC;QACpC,CAAC;QAED,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,EAAE;aAC3B,IAAI,CAAC,EAAE,CAAC;aACR,OAAO,CAAC,GAAG,EAAE;YACZ,uBAAA,IAAI,mCAAU,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAC7B,CAAC,CAAC,CAAC;QACL,uBAAA,IAAI,mCAAU,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QAE9B,OAAO,IAAI,CAAC;IACd,CAAC;CACF;AAlBD,8CAkBC","sourcesContent":["/**\n * Coalesces concurrent async operations by key: while a call for a key is in\n * flight, subsequent calls with the same key await the same promise instead of\n * starting duplicate work. Once a run settles, the next call starts a fresh one.\n *\n * Note that coalesced callers share the run's outcome, including rejections.\n */\nexport class InFlightCoalescer {\n readonly #inFlight = new Map<string, Promise<unknown>>();\n\n async run<Result>(key: string, fn: () => Promise<Result>): Promise<Result> {\n const pending = this.#inFlight.get(key);\n if (pending) {\n return pending as Promise<Result>;\n }\n\n const task = Promise.resolve()\n .then(fn)\n .finally(() => {\n this.#inFlight.delete(key);\n });\n this.#inFlight.set(key, task);\n\n return task;\n }\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"InFlightCoalescer.d.cts","sourceRoot":"","sources":["../../../src/utils/dedupe/InFlightCoalescer.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,qBAAa,iBAAiB;;IAGtB,GAAG,CAAC,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC;CAe3E"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"InFlightCoalescer.d.mts","sourceRoot":"","sources":["../../../src/utils/dedupe/InFlightCoalescer.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,qBAAa,iBAAiB;;IAGtB,GAAG,CAAC,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC;CAe3E"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"InFlightCoalescer.mjs","sourceRoot":"","sources":["../../../src/utils/dedupe/InFlightCoalescer.ts"],"names":[],"mappings":";;;;;;AAAA;;;;;;GAMG;AACH,MAAM,OAAO,iBAAiB;IAA9B;QACW,sCAAY,IAAI,GAAG,EAA4B,EAAC;IAiB3D,CAAC;IAfC,KAAK,CAAC,GAAG,CAAS,GAAW,EAAE,EAAyB;QACtD,MAAM,OAAO,GAAG,uBAAA,IAAI,mCAAU,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACxC,IAAI,OAAO,EAAE,CAAC;YACZ,OAAO,OAA0B,CAAC;QACpC,CAAC;QAED,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,EAAE;aAC3B,IAAI,CAAC,EAAE,CAAC;aACR,OAAO,CAAC,GAAG,EAAE;YACZ,uBAAA,IAAI,mCAAU,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAC7B,CAAC,CAAC,CAAC;QACL,uBAAA,IAAI,mCAAU,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QAE9B,OAAO,IAAI,CAAC;IACd,CAAC;CACF","sourcesContent":["/**\n * Coalesces concurrent async operations by key: while a call for a key is in\n * flight, subsequent calls with the same key await the same promise instead of\n * starting duplicate work. Once a run settles, the next call starts a fresh one.\n *\n * Note that coalesced callers share the run's outcome, including rejections.\n */\nexport class InFlightCoalescer {\n readonly #inFlight = new Map<string, Promise<unknown>>();\n\n async run<Result>(key: string, fn: () => Promise<Result>): Promise<Result> {\n const pending = this.#inFlight.get(key);\n if (pending) {\n return pending as Promise<Result>;\n }\n\n const task = Promise.resolve()\n .then(fn)\n .finally(() => {\n this.#inFlight.delete(key);\n });\n this.#inFlight.set(key, task);\n\n return task;\n }\n}\n"]}
|