@metamask-previews/snap-networks-utils 2.0.0-preview-0a7c77e1 → 3.0.0-preview-61fa1fce
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 +21 -1
- package/dist/index.d.mts +2 -0
- package/dist/index.d.mts.map +1 -1
- package/dist/index.mjs +1 -0
- package/dist/index.mjs.map +1 -1
- package/dist/utils/fetchPolicy/createFetchPolicy.d.mts +152 -0
- package/dist/utils/fetchPolicy/createFetchPolicy.d.mts.map +1 -0
- package/dist/utils/fetchPolicy/createFetchPolicy.mjs +204 -0
- package/dist/utils/fetchPolicy/createFetchPolicy.mjs.map +1 -0
- package/dist/utils/fetchPolicy/performanceShim.d.mts +16 -0
- package/dist/utils/fetchPolicy/performanceShim.d.mts.map +1 -0
- package/dist/utils/fetchPolicy/performanceShim.mjs +16 -0
- package/dist/utils/fetchPolicy/performanceShim.mjs.map +1 -0
- package/package.json +20 -33
- package/dist/index.cjs +0 -111
- package/dist/index.cjs.map +0 -1
- package/dist/index.d.cts +0 -54
- package/dist/index.d.cts.map +0 -1
- package/dist/providers/assets/AssetsProvider.cjs +0 -76
- package/dist/providers/assets/AssetsProvider.cjs.map +0 -1
- package/dist/providers/assets/AssetsProvider.d.cts +0 -75
- package/dist/providers/assets/AssetsProvider.d.cts.map +0 -1
- package/dist/providers/remote-feature-flags/RemoteFeatureFlagsProvider.cjs +0 -39
- package/dist/providers/remote-feature-flags/RemoteFeatureFlagsProvider.cjs.map +0 -1
- package/dist/providers/remote-feature-flags/RemoteFeatureFlagsProvider.d.cts +0 -38
- package/dist/providers/remote-feature-flags/RemoteFeatureFlagsProvider.d.cts.map +0 -1
- package/dist/services/analytics/AnalyticsService.cjs +0 -225
- package/dist/services/analytics/AnalyticsService.cjs.map +0 -1
- package/dist/services/analytics/AnalyticsService.d.cts +0 -175
- package/dist/services/analytics/AnalyticsService.d.cts.map +0 -1
- package/dist/ui/ActionHeader/ActionHeader.cjs +0 -23
- package/dist/ui/ActionHeader/ActionHeader.cjs.map +0 -1
- package/dist/ui/ActionHeader/ActionHeader.d.cts +0 -27
- package/dist/ui/ActionHeader/ActionHeader.d.cts.map +0 -1
- package/dist/ui/Asset/Asset.cjs +0 -68
- package/dist/ui/Asset/Asset.cjs.map +0 -1
- package/dist/ui/Asset/Asset.d.cts +0 -83
- package/dist/ui/Asset/Asset.d.cts.map +0 -1
- package/dist/ui/EstimatedChanges/EstimatedChanges.cjs +0 -57
- package/dist/ui/EstimatedChanges/EstimatedChanges.cjs.map +0 -1
- package/dist/ui/EstimatedChanges/EstimatedChanges.d.cts +0 -50
- package/dist/ui/EstimatedChanges/EstimatedChanges.d.cts.map +0 -1
- package/dist/ui/TransactionAlert/TransactionAlert.cjs +0 -72
- package/dist/ui/TransactionAlert/TransactionAlert.cjs.map +0 -1
- package/dist/ui/TransactionAlert/TransactionAlert.d.cts +0 -58
- package/dist/ui/TransactionAlert/TransactionAlert.d.cts.map +0 -1
- package/dist/utils/async/async.cjs +0 -95
- package/dist/utils/async/async.cjs.map +0 -1
- package/dist/utils/async/async.d.cts +0 -51
- package/dist/utils/async/async.d.cts.map +0 -1
- package/dist/utils/buildUrl/buildUrl.cjs +0 -54
- package/dist/utils/buildUrl/buildUrl.cjs.map +0 -1
- package/dist/utils/buildUrl/buildUrl.d.cts +0 -15
- package/dist/utils/buildUrl/buildUrl.d.cts.map +0 -1
- package/dist/utils/cache/InMemoryCache.cjs +0 -134
- package/dist/utils/cache/InMemoryCache.cjs.map +0 -1
- package/dist/utils/cache/InMemoryCache.d.cts +0 -29
- package/dist/utils/cache/InMemoryCache.d.cts.map +0 -1
- package/dist/utils/cache/StateCache.cjs +0 -193
- package/dist/utils/cache/StateCache.cjs.map +0 -1
- package/dist/utils/cache/StateCache.d.cts +0 -96
- package/dist/utils/cache/StateCache.d.cts.map +0 -1
- package/dist/utils/cache/types.cjs +0 -3
- package/dist/utils/cache/types.cjs.map +0 -1
- package/dist/utils/cache/types.d.cts +0 -99
- package/dist/utils/cache/types.d.cts.map +0 -1
- package/dist/utils/cache/useCache.cjs +0 -82
- package/dist/utils/cache/useCache.cjs.map +0 -1
- package/dist/utils/cache/useCache.d.cts +0 -57
- package/dist/utils/cache/useCache.d.cts.map +0 -1
- package/dist/utils/cache/useCacheUntil.cjs +0 -80
- package/dist/utils/cache/useCacheUntil.cjs.map +0 -1
- package/dist/utils/cache/useCacheUntil.d.cts +0 -54
- package/dist/utils/cache/useCacheUntil.d.cts.map +0 -1
- package/dist/utils/config/BaseConfigProvider.cjs +0 -62
- package/dist/utils/config/BaseConfigProvider.cjs.map +0 -1
- package/dist/utils/config/BaseConfigProvider.d.cts +0 -54
- package/dist/utils/config/BaseConfigProvider.d.cts.map +0 -1
- package/dist/utils/config/envStructs.cjs +0 -69
- package/dist/utils/config/envStructs.cjs.map +0 -1
- package/dist/utils/config/envStructs.d.cts +0 -57
- package/dist/utils/config/envStructs.d.cts.map +0 -1
- package/dist/utils/config/environmentStruct.cjs +0 -19
- package/dist/utils/config/environmentStruct.cjs.map +0 -1
- package/dist/utils/config/environmentStruct.d.cts +0 -20
- package/dist/utils/config/environmentStruct.d.cts.map +0 -1
- package/dist/utils/config/logLevelStruct.cjs +0 -14
- package/dist/utils/config/logLevelStruct.cjs.map +0 -1
- package/dist/utils/config/logLevelStruct.d.cts +0 -17
- package/dist/utils/config/logLevelStruct.d.cts.map +0 -1
- package/dist/utils/config/parseEnv.cjs +0 -30
- package/dist/utils/config/parseEnv.cjs.map +0 -1
- package/dist/utils/config/parseEnv.d.cts +0 -19
- package/dist/utils/config/parseEnv.d.cts.map +0 -1
- package/dist/utils/dedupe/InFlightCoalescer.cjs +0 -28
- package/dist/utils/dedupe/InFlightCoalescer.cjs.map +0 -1
- package/dist/utils/dedupe/InFlightCoalescer.d.cts +0 -12
- package/dist/utils/dedupe/InFlightCoalescer.d.cts.map +0 -1
- package/dist/utils/errors/errors.cjs +0 -44
- package/dist/utils/errors/errors.cjs.map +0 -1
- package/dist/utils/errors/errors.d.cts +0 -37
- package/dist/utils/errors/errors.d.cts.map +0 -1
- package/dist/utils/errors/index.cjs +0 -18
- package/dist/utils/errors/index.cjs.map +0 -1
- package/dist/utils/errors/index.d.cts +0 -10
- package/dist/utils/errors/index.d.cts.map +0 -1
- package/dist/utils/errors/snapRpcError.cjs +0 -33
- package/dist/utils/errors/snapRpcError.cjs.map +0 -1
- package/dist/utils/errors/snapRpcError.d.cts +0 -11
- package/dist/utils/errors/snapRpcError.d.cts.map +0 -1
- package/dist/utils/errors/stringifyReason.cjs +0 -36
- package/dist/utils/errors/stringifyReason.cjs.map +0 -1
- package/dist/utils/errors/stringifyReason.d.cts +0 -15
- package/dist/utils/errors/stringifyReason.d.cts.map +0 -1
- package/dist/utils/errors/syncError.cjs +0 -98
- package/dist/utils/errors/syncError.cjs.map +0 -1
- package/dist/utils/errors/syncError.d.cts +0 -60
- package/dist/utils/errors/syncError.d.cts.map +0 -1
- package/dist/utils/errors/trackError.cjs +0 -76
- package/dist/utils/errors/trackError.cjs.map +0 -1
- package/dist/utils/errors/trackError.d.cts +0 -64
- package/dist/utils/errors/trackError.d.cts.map +0 -1
- package/dist/utils/handlers/wrapSnapHandlers.cjs +0 -57
- package/dist/utils/handlers/wrapSnapHandlers.cjs.map +0 -1
- package/dist/utils/handlers/wrapSnapHandlers.d.cts +0 -74
- package/dist/utils/handlers/wrapSnapHandlers.d.cts.map +0 -1
- package/dist/utils/keyringAccount/keyringAccount.cjs +0 -25
- package/dist/utils/keyringAccount/keyringAccount.cjs.map +0 -1
- package/dist/utils/keyringAccount/keyringAccount.d.cts +0 -29
- package/dist/utils/keyringAccount/keyringAccount.d.cts.map +0 -1
- package/dist/utils/logger/Logger.cjs +0 -140
- package/dist/utils/logger/Logger.cjs.map +0 -1
- package/dist/utils/logger/Logger.d.cts +0 -118
- package/dist/utils/logger/Logger.d.cts.map +0 -1
- package/dist/utils/logger/__mocks__/Logger.cjs +0 -26
- package/dist/utils/logger/__mocks__/Logger.cjs.map +0 -1
- package/dist/utils/logger/__mocks__/Logger.d.cts +0 -3
- package/dist/utils/logger/__mocks__/Logger.d.cts.map +0 -1
- package/dist/utils/originPermissions/createOriginPermissions.cjs +0 -30
- package/dist/utils/originPermissions/createOriginPermissions.cjs.map +0 -1
- package/dist/utils/originPermissions/createOriginPermissions.d.cts +0 -24
- package/dist/utils/originPermissions/createOriginPermissions.d.cts.map +0 -1
- package/dist/utils/originPermissions/validateOrigin.cjs +0 -23
- package/dist/utils/originPermissions/validateOrigin.cjs.map +0 -1
- package/dist/utils/originPermissions/validateOrigin.d.cts +0 -10
- package/dist/utils/originPermissions/validateOrigin.d.cts.map +0 -1
- package/dist/utils/proofOfOwnership/proofOfOwnership.cjs +0 -89
- package/dist/utils/proofOfOwnership/proofOfOwnership.cjs.map +0 -1
- package/dist/utils/proofOfOwnership/proofOfOwnership.d.cts +0 -143
- package/dist/utils/proofOfOwnership/proofOfOwnership.d.cts.map +0 -1
- package/dist/utils/safeMerge/safeMerge.cjs +0 -26
- package/dist/utils/safeMerge/safeMerge.cjs.map +0 -1
- package/dist/utils/safeMerge/safeMerge.d.cts +0 -17
- package/dist/utils/safeMerge/safeMerge.d.cts.map +0 -1
- package/dist/utils/sanitize/sanitize.cjs +0 -42
- package/dist/utils/sanitize/sanitize.cjs.map +0 -1
- package/dist/utils/sanitize/sanitize.d.cts +0 -15
- package/dist/utils/sanitize/sanitize.d.cts.map +0 -1
- package/dist/utils/serialization/serialization.cjs +0 -73
- package/dist/utils/serialization/serialization.cjs.map +0 -1
- package/dist/utils/serialization/serialization.d.cts +0 -19
- package/dist/utils/serialization/serialization.d.cts.map +0 -1
- package/dist/utils/serialization/types.cjs +0 -3
- package/dist/utils/serialization/types.cjs.map +0 -1
- package/dist/utils/serialization/types.d.cts +0 -8
- package/dist/utils/serialization/types.d.cts.map +0 -1
- package/dist/utils/state/IStateManager.cjs +0 -3
- package/dist/utils/state/IStateManager.cjs.map +0 -1
- package/dist/utils/state/IStateManager.d.cts +0 -69
- package/dist/utils/state/IStateManager.d.cts.map +0 -1
- package/dist/utils/state/InMemoryState.cjs +0 -41
- package/dist/utils/state/InMemoryState.cjs.map +0 -1
- package/dist/utils/state/InMemoryState.d.cts +0 -18
- package/dist/utils/state/InMemoryState.d.cts.map +0 -1
- package/dist/utils/state/State.cjs +0 -159
- package/dist/utils/state/State.cjs.map +0 -1
- package/dist/utils/state/State.d.cts +0 -25
- package/dist/utils/state/State.d.cts.map +0 -1
- package/dist/utils/transactionType/transactionType.cjs +0 -32
- package/dist/utils/transactionType/transactionType.cjs.map +0 -1
- package/dist/utils/transactionType/transactionType.d.cts +0 -17
- package/dist/utils/transactionType/transactionType.d.cts.map +0 -1
- package/dist/utils/urlStruct/urlStruct.cjs +0 -96
- package/dist/utils/urlStruct/urlStruct.cjs.map +0 -1
- package/dist/utils/urlStruct/urlStruct.d.cts +0 -25
- package/dist/utils/urlStruct/urlStruct.d.cts.map +0 -1
- package/dist/utils/uuidStruct/uuidStruct.cjs +0 -12
- package/dist/utils/uuidStruct/uuidStruct.cjs.map +0 -1
- package/dist/utils/uuidStruct/uuidStruct.d.cts +0 -8
- package/dist/utils/uuidStruct/uuidStruct.d.cts.map +0 -1
package/CHANGELOG.md
CHANGED
|
@@ -7,6 +7,25 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
7
7
|
|
|
8
8
|
## [Unreleased]
|
|
9
9
|
|
|
10
|
+
## [3.0.0]
|
|
11
|
+
|
|
12
|
+
### Added
|
|
13
|
+
|
|
14
|
+
- Add `createFetchPolicy`, a retry and circuit-breaker policy for calls to one upstream service, built on `createServicePolicy` from `@metamask/base-data-service` ([#462](https://github.com/MetaMask/internal-snaps/pull/462))
|
|
15
|
+
- Retries only transient errors (network failures, timeouts and HTTP 408, 425, 429, 500, 502, 503 and 504), up to 3 times, with exponential backoff and jitter
|
|
16
|
+
- Waits for the error's `retryAfterMs` when it is longer than the backoff, and doesn't retry when it is over `MAX_RETRY_AFTER_MS` (30 seconds)
|
|
17
|
+
- Opens the circuit for 30 seconds on repeated transient errors or 5xx responses, but not on other 4xx, aborts or validation errors
|
|
18
|
+
- Logs retries, give-ups, `Retry-After` values over the cap and circuit breaks to the given `logger`
|
|
19
|
+
- Add the `FetchPolicyError` type, `createFetchPolicyError`, `FetchPolicyErrorName` and `isTransientError` for converting errors to the shape `createFetchPolicy` decides on ([#462](https://github.com/MetaMask/internal-snaps/pull/462))
|
|
20
|
+
- Re-export `BrokenCircuitError` from `@metamask/base-data-service`, the error `createFetchPolicy` policies throw while the circuit is open ([#462](https://github.com/MetaMask/internal-snaps/pull/462))
|
|
21
|
+
- Its `name` is `Error`, so check for it with `instanceof`
|
|
22
|
+
- Add a `@metamask/snap-networks-utils/performance-shim` export, which snaps must provide as the `performance` global (e.g. with webpack's `ProvidePlugin`) to use `createFetchPolicy` ([#462](https://github.com/MetaMask/internal-snaps/pull/462))
|
|
23
|
+
|
|
24
|
+
### Removed
|
|
25
|
+
|
|
26
|
+
- **BREAKING:** Remove the CommonJS build; the package is now published as ESM only ([#452](https://github.com/MetaMask/internal-snaps/pull/452))
|
|
27
|
+
- `require('@metamask/snap-networks-utils')` no longer works. Import the package from ESM code or a bundler such as `mm-snap` (webpack) instead
|
|
28
|
+
|
|
10
29
|
## [2.0.0]
|
|
11
30
|
|
|
12
31
|
### Added
|
|
@@ -76,6 +95,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
76
95
|
- Implement `AssetsProvider` ([#82](https://github.com/MetaMask/internal-snaps/pull/82))
|
|
77
96
|
- Initial package release ([#79](https://github.com/MetaMask/internal-snaps/pull/79))
|
|
78
97
|
|
|
79
|
-
[Unreleased]: https://github.com/MetaMask/internal-snaps/compare/@metamask/snap-networks-utils@
|
|
98
|
+
[Unreleased]: https://github.com/MetaMask/internal-snaps/compare/@metamask/snap-networks-utils@3.0.0...HEAD
|
|
99
|
+
[3.0.0]: https://github.com/MetaMask/internal-snaps/compare/@metamask/snap-networks-utils@2.0.0...@metamask/snap-networks-utils@3.0.0
|
|
80
100
|
[2.0.0]: https://github.com/MetaMask/internal-snaps/compare/@metamask/snap-networks-utils@1.0.0...@metamask/snap-networks-utils@2.0.0
|
|
81
101
|
[1.0.0]: https://github.com/MetaMask/internal-snaps/releases/tag/@metamask/snap-networks-utils@1.0.0
|
package/dist/index.d.mts
CHANGED
|
@@ -32,6 +32,8 @@ export { InMemoryState } from "./utils/state/InMemoryState.mjs";
|
|
|
32
32
|
export type { IStateManager } from "./utils/state/IStateManager.mjs";
|
|
33
33
|
export { createSnapErrorHandling, createTrackError, createWithCatchAndThrowSnapError, formatAccountSyncFailures, getSyncFailuresFromSettledResult, isSnapRpcError, normalizeError, stringifyReason, SynchronizationError, } from "./utils/errors/index.mjs";
|
|
34
34
|
export { InFlightCoalescer } from "./utils/dedupe/InFlightCoalescer.mjs";
|
|
35
|
+
export { BrokenCircuitError, createFetchPolicy, createFetchPolicyError, FetchPolicyErrorName, isTransientError, MAX_RETRY_AFTER_MS, } from "./utils/fetchPolicy/createFetchPolicy.mjs";
|
|
36
|
+
export type { CreateFetchPolicyOptions, FetchPolicyError, } from "./utils/fetchPolicy/createFetchPolicy.mjs";
|
|
35
37
|
export { ActionHeader } from "./ui/ActionHeader/ActionHeader.mjs";
|
|
36
38
|
export type { ActionHeaderProps } from "./ui/ActionHeader/ActionHeader.mjs";
|
|
37
39
|
export { Asset, AssetIcon } from "./ui/Asset/Asset.mjs";
|
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,EACL,gBAAgB,EAChB,iBAAiB,EACjB,oBAAoB,GACrB,kDAA8C;AAC/C,YAAY,EACV,uBAAuB,EACvB,oCAAoC,EACpC,oCAAoC,EACpC,qBAAqB,EACrB,yBAAyB,EACzB,0BAA0B,EAC1B,mCAAmC,EACnC,wCAAwC,GACzC,kDAA8C;AAC/C,OAAO,EAAE,SAAS,EAAE,wCAAoC;AACxD,OAAO,EACL,0BAA0B,EAC1B,iCAAiC,GAClC,oDAAgD;AACjD,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,EAAE,UAAU,EAAE,0CAAsC;AAC3D,OAAO,EAAE,sBAAsB,EAAE,kDAA8C;AAC/E,YAAY,EACV,sBAAsB,EACtB,uBAAuB,GACxB,kDAA8C;AAC/C,OAAO,EAAE,QAAQ,EAAE,oCAAgC;AACnD,OAAO,EAAE,kBAAkB,EAAE,8CAA0C;AACvE,OAAO,EACL,oBAAoB,EACpB,kBAAkB,EAClB,gBAAgB,EAChB,kBAAkB,EAClB,gBAAgB,GACjB,sCAAkC;AACnC,OAAO,EAAE,cAAc,EAAE,0CAAsC;AAC/D,OAAO,EACL,WAAW,EACX,iBAAiB,GAClB,6CAAyC;AAC1C,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,4BAA4B,EAC5B,gCAAgC,EAChC,uCAAuC,EACvC,sCAAsC,EACtC,wCAAwC,EACxC,mCAAmC,EACnC,kCAAkC,EAClC,6BAA6B,EAC7B,iCAAiC,GAClC,sDAAkD;AACnD,YAAY,EACV,0BAA0B,EAC1B,iCAAiC,EACjC,gCAAgC,EAChC,kCAAkC,EAClC,6BAA6B,EAC7B,4BAA4B,EAC5B,uBAAuB,GACxB,sDAAkD;AACnD,OAAO,EACL,uBAAuB,EACvB,oBAAoB,EACpB,mBAAmB,EACnB,uBAAuB,GACxB,8DAA0D;AAC3D,YAAY,EAAE,6BAA6B,EAAE,8DAA0D;AACvG,OAAO,EAAE,cAAc,EAAE,qDAAiD;AAC1E,OAAO,EAAE,KAAK,EAAE,gCAA4B;AAC5C,YAAY,EAAE,WAAW,EAAE,gCAA4B;AACvD,OAAO,EAAE,aAAa,EAAE,wCAAoC;AAC5D,YAAY,EAAE,aAAa,EAAE,wCAAoC;AACjE,OAAO,EACL,uBAAuB,EACvB,gBAAgB,EAChB,gCAAgC,EAChC,yBAAyB,EACzB,gCAAgC,EAChC,cAAc,EACd,cAAc,EACd,eAAe,EACf,oBAAoB,GACrB,iCAAuB;AACxB,OAAO,EAAE,iBAAiB,EAAE,6CAAyC;AACrE,OAAO,EAAE,YAAY,EAAE,2CAAuC;AAC9D,YAAY,EAAE,iBAAiB,EAAE,2CAAuC;AACxE,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,6BAAyB;AACpD,YAAY,EAAE,cAAc,EAAE,UAAU,EAAE,6BAAyB;AACnE,OAAO,EAAE,gBAAgB,EAAE,mDAA+C;AAC1E,YAAY,EACV,qBAAqB,EACrB,sBAAsB,EACtB,qBAAqB,GACtB,mDAA+C;AAChD,OAAO,EAAE,gBAAgB,EAAE,mDAA+C;AAC1E,YAAY,EACV,qBAAqB,EACrB,sBAAsB,EACtB,qBAAqB,EACrB,0BAA0B,GAC3B,mDAA+C;AAChD,OAAO,EAAE,aAAa,EAAE,wCAAoC;AAC5D,OAAO,EAAE,UAAU,EAAE,qCAAiC;AACtD,OAAO,EAAE,QAAQ,EAAE,mCAA+B;AAClD,OAAO,EAAE,aAAa,EAAE,wCAAoC;AAC5D,YAAY,EAAE,YAAY,EAAE,mCAA+B;AAC3D,YAAY,EACV,iBAAiB,EACjB,gBAAgB,GACjB,wCAAoC;AACrC,YAAY,EACV,MAAM,EACN,UAAU,EACV,qBAAqB,GACtB,gCAA4B;AAC7B,YAAY,EACV,iBAAiB,EACjB,UAAU,EACV,WAAW,EACX,UAAU,GACX,qCAAiC;AAClC,OAAO,EACL,iBAAiB,EACjB,gBAAgB,GACjB,8CAA0C;AAC3C,YAAY,EACV,YAAY,EACZ,0BAA0B,GAC3B,8CAA0C;AAC3C,YAAY,EACV,kBAAkB,EAClB,8BAA8B,EAC9B,uBAAuB,EACvB,uCAAuC,EACvC,UAAU,EACV,gBAAgB,EAChB,yBAAyB,EACzB,kBAAkB,EAClB,YAAY,EACZ,qBAAqB,EACrB,yBAAyB,EACzB,YAAY,GACb,iCAAuB"}
|
|
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,EACL,gBAAgB,EAChB,iBAAiB,EACjB,oBAAoB,GACrB,kDAA8C;AAC/C,YAAY,EACV,uBAAuB,EACvB,oCAAoC,EACpC,oCAAoC,EACpC,qBAAqB,EACrB,yBAAyB,EACzB,0BAA0B,EAC1B,mCAAmC,EACnC,wCAAwC,GACzC,kDAA8C;AAC/C,OAAO,EAAE,SAAS,EAAE,wCAAoC;AACxD,OAAO,EACL,0BAA0B,EAC1B,iCAAiC,GAClC,oDAAgD;AACjD,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,EAAE,UAAU,EAAE,0CAAsC;AAC3D,OAAO,EAAE,sBAAsB,EAAE,kDAA8C;AAC/E,YAAY,EACV,sBAAsB,EACtB,uBAAuB,GACxB,kDAA8C;AAC/C,OAAO,EAAE,QAAQ,EAAE,oCAAgC;AACnD,OAAO,EAAE,kBAAkB,EAAE,8CAA0C;AACvE,OAAO,EACL,oBAAoB,EACpB,kBAAkB,EAClB,gBAAgB,EAChB,kBAAkB,EAClB,gBAAgB,GACjB,sCAAkC;AACnC,OAAO,EAAE,cAAc,EAAE,0CAAsC;AAC/D,OAAO,EACL,WAAW,EACX,iBAAiB,GAClB,6CAAyC;AAC1C,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,4BAA4B,EAC5B,gCAAgC,EAChC,uCAAuC,EACvC,sCAAsC,EACtC,wCAAwC,EACxC,mCAAmC,EACnC,kCAAkC,EAClC,6BAA6B,EAC7B,iCAAiC,GAClC,sDAAkD;AACnD,YAAY,EACV,0BAA0B,EAC1B,iCAAiC,EACjC,gCAAgC,EAChC,kCAAkC,EAClC,6BAA6B,EAC7B,4BAA4B,EAC5B,uBAAuB,GACxB,sDAAkD;AACnD,OAAO,EACL,uBAAuB,EACvB,oBAAoB,EACpB,mBAAmB,EACnB,uBAAuB,GACxB,8DAA0D;AAC3D,YAAY,EAAE,6BAA6B,EAAE,8DAA0D;AACvG,OAAO,EAAE,cAAc,EAAE,qDAAiD;AAC1E,OAAO,EAAE,KAAK,EAAE,gCAA4B;AAC5C,YAAY,EAAE,WAAW,EAAE,gCAA4B;AACvD,OAAO,EAAE,aAAa,EAAE,wCAAoC;AAC5D,YAAY,EAAE,aAAa,EAAE,wCAAoC;AACjE,OAAO,EACL,uBAAuB,EACvB,gBAAgB,EAChB,gCAAgC,EAChC,yBAAyB,EACzB,gCAAgC,EAChC,cAAc,EACd,cAAc,EACd,eAAe,EACf,oBAAoB,GACrB,iCAAuB;AACxB,OAAO,EAAE,iBAAiB,EAAE,6CAAyC;AACrE,OAAO,EACL,kBAAkB,EAClB,iBAAiB,EACjB,sBAAsB,EACtB,oBAAoB,EACpB,gBAAgB,EAChB,kBAAkB,GACnB,kDAA8C;AAC/C,YAAY,EACV,wBAAwB,EACxB,gBAAgB,GACjB,kDAA8C;AAC/C,OAAO,EAAE,YAAY,EAAE,2CAAuC;AAC9D,YAAY,EAAE,iBAAiB,EAAE,2CAAuC;AACxE,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,6BAAyB;AACpD,YAAY,EAAE,cAAc,EAAE,UAAU,EAAE,6BAAyB;AACnE,OAAO,EAAE,gBAAgB,EAAE,mDAA+C;AAC1E,YAAY,EACV,qBAAqB,EACrB,sBAAsB,EACtB,qBAAqB,GACtB,mDAA+C;AAChD,OAAO,EAAE,gBAAgB,EAAE,mDAA+C;AAC1E,YAAY,EACV,qBAAqB,EACrB,sBAAsB,EACtB,qBAAqB,EACrB,0BAA0B,GAC3B,mDAA+C;AAChD,OAAO,EAAE,aAAa,EAAE,wCAAoC;AAC5D,OAAO,EAAE,UAAU,EAAE,qCAAiC;AACtD,OAAO,EAAE,QAAQ,EAAE,mCAA+B;AAClD,OAAO,EAAE,aAAa,EAAE,wCAAoC;AAC5D,YAAY,EAAE,YAAY,EAAE,mCAA+B;AAC3D,YAAY,EACV,iBAAiB,EACjB,gBAAgB,GACjB,wCAAoC;AACrC,YAAY,EACV,MAAM,EACN,UAAU,EACV,qBAAqB,GACtB,gCAA4B;AAC7B,YAAY,EACV,iBAAiB,EACjB,UAAU,EACV,WAAW,EACX,UAAU,GACX,qCAAiC;AAClC,OAAO,EACL,iBAAiB,EACjB,gBAAgB,GACjB,8CAA0C;AAC3C,YAAY,EACV,YAAY,EACZ,0BAA0B,GAC3B,8CAA0C;AAC3C,YAAY,EACV,kBAAkB,EAClB,8BAA8B,EAC9B,uBAAuB,EACvB,uCAAuC,EACvC,UAAU,EACV,gBAAgB,EAChB,yBAAyB,EACzB,kBAAkB,EAClB,YAAY,EACZ,qBAAqB,EACrB,yBAAyB,EACzB,YAAY,GACb,iCAAuB"}
|
package/dist/index.mjs
CHANGED
|
@@ -23,6 +23,7 @@ export { State } from "./utils/state/State.mjs";
|
|
|
23
23
|
export { InMemoryState } from "./utils/state/InMemoryState.mjs";
|
|
24
24
|
export { createSnapErrorHandling, createTrackError, createWithCatchAndThrowSnapError, formatAccountSyncFailures, getSyncFailuresFromSettledResult, isSnapRpcError, normalizeError, stringifyReason, SynchronizationError } from "./utils/errors/index.mjs";
|
|
25
25
|
export { InFlightCoalescer } from "./utils/dedupe/InFlightCoalescer.mjs";
|
|
26
|
+
export { BrokenCircuitError, createFetchPolicy, createFetchPolicyError, FetchPolicyErrorName, isTransientError, MAX_RETRY_AFTER_MS } from "./utils/fetchPolicy/createFetchPolicy.mjs";
|
|
26
27
|
export { ActionHeader } from "./ui/ActionHeader/ActionHeader.mjs";
|
|
27
28
|
export { Asset, AssetIcon } from "./ui/Asset/Asset.mjs";
|
|
28
29
|
export { EstimatedChanges } from "./ui/EstimatedChanges/EstimatedChanges.mjs";
|
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,EACL,gBAAgB,EAChB,iBAAiB,EACjB,oBAAoB,EACrB,kDAA8C;AAW/C,OAAO,EAAE,SAAS,EAAE,wCAAoC;AACxD,OAAO,EACL,0BAA0B,EAC1B,iCAAiC,EAClC,oDAAgD;AACjD,OAAO,EAAE,QAAQ,EAAE,sCAAkC;AAErD,OAAO,EACL,yBAAyB,EACzB,WAAW,EACZ,sCAAkC;AACnC,OAAO,EAAE,SAAS,EAAE,wCAAoC;AACxD,OAAO,EAAE,UAAU,EAAE,0CAAsC;AAC3D,OAAO,EAAE,sBAAsB,EAAE,kDAA8C;AAK/E,OAAO,EAAE,QAAQ,EAAE,oCAAgC;AACnD,OAAO,EAAE,kBAAkB,EAAE,8CAA0C;AACvE,OAAO,EACL,oBAAoB,EACpB,kBAAkB,EAClB,gBAAgB,EAChB,kBAAkB,EAClB,gBAAgB,EACjB,sCAAkC;AACnC,OAAO,EAAE,cAAc,EAAE,0CAAsC;AAC/D,OAAO,EACL,WAAW,EACX,iBAAiB,EAClB,6CAAyC;AAC1C,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,4BAA4B,EAC5B,gCAAgC,EAChC,uCAAuC,EACvC,sCAAsC,EACtC,wCAAwC,EACxC,mCAAmC,EACnC,kCAAkC,EAClC,6BAA6B,EAC7B,iCAAiC,EAClC,sDAAkD;AAUnD,OAAO,EACL,uBAAuB,EACvB,oBAAoB,EACpB,mBAAmB,EACnB,uBAAuB,EACxB,8DAA0D;AAE3D,OAAO,EAAE,cAAc,EAAE,qDAAiD;AAC1E,OAAO,EAAE,KAAK,EAAE,gCAA4B;AAE5C,OAAO,EAAE,aAAa,EAAE,wCAAoC;AAE5D,OAAO,EACL,uBAAuB,EACvB,gBAAgB,EAChB,gCAAgC,EAChC,yBAAyB,EACzB,gCAAgC,EAChC,cAAc,EACd,cAAc,EACd,eAAe,EACf,oBAAoB,EACrB,iCAAuB;AACxB,OAAO,EAAE,iBAAiB,EAAE,6CAAyC;AACrE,OAAO,EAAE,YAAY,EAAE,2CAAuC;AAE9D,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,6BAAyB;AAEpD,OAAO,EAAE,gBAAgB,EAAE,mDAA+C;AAM1E,OAAO,EAAE,gBAAgB,EAAE,mDAA+C;AAO1E,OAAO,EAAE,aAAa,EAAE,wCAAoC;AAC5D,OAAO,EAAE,UAAU,EAAE,qCAAiC;AACtD,OAAO,EAAE,QAAQ,EAAE,mCAA+B;AAClD,OAAO,EAAE,aAAa,EAAE,wCAAoC;AAiB5D,OAAO,EACL,iBAAiB,EACjB,gBAAgB,EACjB,8CAA0C","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 {\n AnalyticsService,\n SecurityEventType,\n TransactionEventType,\n} from './services/analytics/AnalyticsService';\nexport type {\n AnalyticsServiceOptions,\n SecurityAlertDetectedEventProperties,\n SecurityScanCompletedEventProperties,\n SnapTrackEventRequest,\n TrackEventCapableProvider,\n TransactionEventProperties,\n TransactionFinalizedEventProperties,\n WebSocketConnectionClosedEventProperties,\n} from './services/analytics/AnalyticsService';\nexport { safeMerge } from './utils/safeMerge/safeMerge';\nexport {\n resolveFlowTransactionType,\n resolveUnifiedSwapTransactionType,\n} from './utils/transactionType/transactionType';\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 { UuidStruct } from './utils/uuidStruct/uuidStruct';\nexport { asStrictKeyringAccount } from './utils/keyringAccount/keyringAccount';\nexport type {\n ExtendedKeyringAccount,\n KeyringAccountExtension,\n} from './utils/keyringAccount/keyringAccount';\nexport { parseEnv } from './utils/config/parseEnv';\nexport { BaseConfigProvider } from './utils/config/BaseConfigProvider';\nexport {\n commaSeparatedListOf,\n defaultedUrlStruct,\n emptyToUndefined,\n parseIntegerStruct,\n parseFloatStruct,\n} from './utils/config/envStructs';\nexport { LogLevelStruct } from './utils/config/logLevelStruct';\nexport {\n Environment,\n EnvironmentStruct,\n} from './utils/config/environmentStruct';\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 parseProofOfOwnershipMessage,\n ProofOfOwnershipBatchErrorStruct,\n ProofOfOwnershipBatchItemResponseStruct,\n ProofOfOwnershipBatchRequestItemStruct,\n ProofOfOwnershipBatchRequestParamsStruct,\n ProofOfOwnershipBatchResponseStruct,\n ProofOfOwnershipBatchSuccessStruct,\n ProofOfOwnershipMessageStruct,\n PROOF_OF_OWNERSHIP_MESSAGE_PREFIX,\n} from './utils/proofOfOwnership/proofOfOwnership';\nexport type {\n ProofOfOwnershipBatchError,\n ProofOfOwnershipBatchItemResponse,\n ProofOfOwnershipBatchRequestItem,\n ProofOfOwnershipBatchRequestParams,\n ProofOfOwnershipBatchResponse,\n ProofOfOwnershipBatchSuccess,\n ProofOfOwnershipMessage,\n} from './utils/proofOfOwnership/proofOfOwnership';\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';\nexport { State } from './utils/state/State';\nexport type { StateConfig } from './utils/state/State';\nexport { InMemoryState } from './utils/state/InMemoryState';\nexport type { IStateManager } from './utils/state/IStateManager';\nexport {\n createSnapErrorHandling,\n createTrackError,\n createWithCatchAndThrowSnapError,\n formatAccountSyncFailures,\n getSyncFailuresFromSettledResult,\n isSnapRpcError,\n normalizeError,\n stringifyReason,\n SynchronizationError,\n} from './utils/errors';\nexport { InFlightCoalescer } from './utils/dedupe/InFlightCoalescer';\nexport { ActionHeader } from './ui/ActionHeader/ActionHeader';\nexport type { ActionHeaderProps } from './ui/ActionHeader/ActionHeader';\nexport { Asset, AssetIcon } from './ui/Asset/Asset';\nexport type { AssetIconProps, AssetProps } from './ui/Asset/Asset';\nexport { EstimatedChanges } from './ui/EstimatedChanges/EstimatedChanges';\nexport type {\n EstimatedChangesAsset,\n EstimatedChangesLabels,\n EstimatedChangesProps,\n} from './ui/EstimatedChanges/EstimatedChanges';\nexport { TransactionAlert } from './ui/TransactionAlert/TransactionAlert';\nexport type {\n TransactionAlertError,\n TransactionAlertLabels,\n TransactionAlertProps,\n TransactionAlertValidation,\n} from './ui/TransactionAlert/TransactionAlert';\nexport { InMemoryCache } from './utils/cache/InMemoryCache';\nexport { StateCache } from './utils/cache/StateCache';\nexport { useCache } from './utils/cache/useCache';\nexport { useCacheUntil } from './utils/cache/useCacheUntil';\nexport type { CacheOptions } from './utils/cache/useCache';\nexport type {\n CacheUntilOptions,\n ResultWithExpiry,\n} from './utils/cache/useCacheUntil';\nexport type {\n ICache,\n CacheEntry,\n TimestampMilliseconds,\n} from './utils/cache/types';\nexport type {\n CacheStateManager,\n CacheStore,\n CachePrefix,\n StateValue,\n} from './utils/cache/StateCache';\nexport {\n noopAssetHandlers,\n wrapSnapHandlers,\n} from './utils/handlers/wrapSnapHandlers';\nexport type {\n SnapHandlers,\n WithCatchAndThrowSnapError,\n} from './utils/handlers/wrapSnapHandlers';\nexport type {\n AccountSyncFailure,\n CreateSnapErrorHandlingOptions,\n CreateTrackErrorOptions,\n CreateWithCatchAndThrowSnapErrorOptions,\n LogErrorFn,\n NormalizeErrorFn,\n PrepareErrorForTrackingFn,\n ShouldTrackErrorFn,\n SnapRpcError,\n SnapTrackErrorRequest,\n TrackErrorCapableProvider,\n TrackErrorFn,\n} from './utils/errors';\n"]}
|
|
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,EACL,gBAAgB,EAChB,iBAAiB,EACjB,oBAAoB,EACrB,kDAA8C;AAW/C,OAAO,EAAE,SAAS,EAAE,wCAAoC;AACxD,OAAO,EACL,0BAA0B,EAC1B,iCAAiC,EAClC,oDAAgD;AACjD,OAAO,EAAE,QAAQ,EAAE,sCAAkC;AAErD,OAAO,EACL,yBAAyB,EACzB,WAAW,EACZ,sCAAkC;AACnC,OAAO,EAAE,SAAS,EAAE,wCAAoC;AACxD,OAAO,EAAE,UAAU,EAAE,0CAAsC;AAC3D,OAAO,EAAE,sBAAsB,EAAE,kDAA8C;AAK/E,OAAO,EAAE,QAAQ,EAAE,oCAAgC;AACnD,OAAO,EAAE,kBAAkB,EAAE,8CAA0C;AACvE,OAAO,EACL,oBAAoB,EACpB,kBAAkB,EAClB,gBAAgB,EAChB,kBAAkB,EAClB,gBAAgB,EACjB,sCAAkC;AACnC,OAAO,EAAE,cAAc,EAAE,0CAAsC;AAC/D,OAAO,EACL,WAAW,EACX,iBAAiB,EAClB,6CAAyC;AAC1C,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,4BAA4B,EAC5B,gCAAgC,EAChC,uCAAuC,EACvC,sCAAsC,EACtC,wCAAwC,EACxC,mCAAmC,EACnC,kCAAkC,EAClC,6BAA6B,EAC7B,iCAAiC,EAClC,sDAAkD;AAUnD,OAAO,EACL,uBAAuB,EACvB,oBAAoB,EACpB,mBAAmB,EACnB,uBAAuB,EACxB,8DAA0D;AAE3D,OAAO,EAAE,cAAc,EAAE,qDAAiD;AAC1E,OAAO,EAAE,KAAK,EAAE,gCAA4B;AAE5C,OAAO,EAAE,aAAa,EAAE,wCAAoC;AAE5D,OAAO,EACL,uBAAuB,EACvB,gBAAgB,EAChB,gCAAgC,EAChC,yBAAyB,EACzB,gCAAgC,EAChC,cAAc,EACd,cAAc,EACd,eAAe,EACf,oBAAoB,EACrB,iCAAuB;AACxB,OAAO,EAAE,iBAAiB,EAAE,6CAAyC;AACrE,OAAO,EACL,kBAAkB,EAClB,iBAAiB,EACjB,sBAAsB,EACtB,oBAAoB,EACpB,gBAAgB,EAChB,kBAAkB,EACnB,kDAA8C;AAK/C,OAAO,EAAE,YAAY,EAAE,2CAAuC;AAE9D,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,6BAAyB;AAEpD,OAAO,EAAE,gBAAgB,EAAE,mDAA+C;AAM1E,OAAO,EAAE,gBAAgB,EAAE,mDAA+C;AAO1E,OAAO,EAAE,aAAa,EAAE,wCAAoC;AAC5D,OAAO,EAAE,UAAU,EAAE,qCAAiC;AACtD,OAAO,EAAE,QAAQ,EAAE,mCAA+B;AAClD,OAAO,EAAE,aAAa,EAAE,wCAAoC;AAiB5D,OAAO,EACL,iBAAiB,EACjB,gBAAgB,EACjB,8CAA0C","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 {\n AnalyticsService,\n SecurityEventType,\n TransactionEventType,\n} from './services/analytics/AnalyticsService';\nexport type {\n AnalyticsServiceOptions,\n SecurityAlertDetectedEventProperties,\n SecurityScanCompletedEventProperties,\n SnapTrackEventRequest,\n TrackEventCapableProvider,\n TransactionEventProperties,\n TransactionFinalizedEventProperties,\n WebSocketConnectionClosedEventProperties,\n} from './services/analytics/AnalyticsService';\nexport { safeMerge } from './utils/safeMerge/safeMerge';\nexport {\n resolveFlowTransactionType,\n resolveUnifiedSwapTransactionType,\n} from './utils/transactionType/transactionType';\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 { UuidStruct } from './utils/uuidStruct/uuidStruct';\nexport { asStrictKeyringAccount } from './utils/keyringAccount/keyringAccount';\nexport type {\n ExtendedKeyringAccount,\n KeyringAccountExtension,\n} from './utils/keyringAccount/keyringAccount';\nexport { parseEnv } from './utils/config/parseEnv';\nexport { BaseConfigProvider } from './utils/config/BaseConfigProvider';\nexport {\n commaSeparatedListOf,\n defaultedUrlStruct,\n emptyToUndefined,\n parseIntegerStruct,\n parseFloatStruct,\n} from './utils/config/envStructs';\nexport { LogLevelStruct } from './utils/config/logLevelStruct';\nexport {\n Environment,\n EnvironmentStruct,\n} from './utils/config/environmentStruct';\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 parseProofOfOwnershipMessage,\n ProofOfOwnershipBatchErrorStruct,\n ProofOfOwnershipBatchItemResponseStruct,\n ProofOfOwnershipBatchRequestItemStruct,\n ProofOfOwnershipBatchRequestParamsStruct,\n ProofOfOwnershipBatchResponseStruct,\n ProofOfOwnershipBatchSuccessStruct,\n ProofOfOwnershipMessageStruct,\n PROOF_OF_OWNERSHIP_MESSAGE_PREFIX,\n} from './utils/proofOfOwnership/proofOfOwnership';\nexport type {\n ProofOfOwnershipBatchError,\n ProofOfOwnershipBatchItemResponse,\n ProofOfOwnershipBatchRequestItem,\n ProofOfOwnershipBatchRequestParams,\n ProofOfOwnershipBatchResponse,\n ProofOfOwnershipBatchSuccess,\n ProofOfOwnershipMessage,\n} from './utils/proofOfOwnership/proofOfOwnership';\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';\nexport { State } from './utils/state/State';\nexport type { StateConfig } from './utils/state/State';\nexport { InMemoryState } from './utils/state/InMemoryState';\nexport type { IStateManager } from './utils/state/IStateManager';\nexport {\n createSnapErrorHandling,\n createTrackError,\n createWithCatchAndThrowSnapError,\n formatAccountSyncFailures,\n getSyncFailuresFromSettledResult,\n isSnapRpcError,\n normalizeError,\n stringifyReason,\n SynchronizationError,\n} from './utils/errors';\nexport { InFlightCoalescer } from './utils/dedupe/InFlightCoalescer';\nexport {\n BrokenCircuitError,\n createFetchPolicy,\n createFetchPolicyError,\n FetchPolicyErrorName,\n isTransientError,\n MAX_RETRY_AFTER_MS,\n} from './utils/fetchPolicy/createFetchPolicy';\nexport type {\n CreateFetchPolicyOptions,\n FetchPolicyError,\n} from './utils/fetchPolicy/createFetchPolicy';\nexport { ActionHeader } from './ui/ActionHeader/ActionHeader';\nexport type { ActionHeaderProps } from './ui/ActionHeader/ActionHeader';\nexport { Asset, AssetIcon } from './ui/Asset/Asset';\nexport type { AssetIconProps, AssetProps } from './ui/Asset/Asset';\nexport { EstimatedChanges } from './ui/EstimatedChanges/EstimatedChanges';\nexport type {\n EstimatedChangesAsset,\n EstimatedChangesLabels,\n EstimatedChangesProps,\n} from './ui/EstimatedChanges/EstimatedChanges';\nexport { TransactionAlert } from './ui/TransactionAlert/TransactionAlert';\nexport type {\n TransactionAlertError,\n TransactionAlertLabels,\n TransactionAlertProps,\n TransactionAlertValidation,\n} from './ui/TransactionAlert/TransactionAlert';\nexport { InMemoryCache } from './utils/cache/InMemoryCache';\nexport { StateCache } from './utils/cache/StateCache';\nexport { useCache } from './utils/cache/useCache';\nexport { useCacheUntil } from './utils/cache/useCacheUntil';\nexport type { CacheOptions } from './utils/cache/useCache';\nexport type {\n CacheUntilOptions,\n ResultWithExpiry,\n} from './utils/cache/useCacheUntil';\nexport type {\n ICache,\n CacheEntry,\n TimestampMilliseconds,\n} from './utils/cache/types';\nexport type {\n CacheStateManager,\n CacheStore,\n CachePrefix,\n StateValue,\n} from './utils/cache/StateCache';\nexport {\n noopAssetHandlers,\n wrapSnapHandlers,\n} from './utils/handlers/wrapSnapHandlers';\nexport type {\n SnapHandlers,\n WithCatchAndThrowSnapError,\n} from './utils/handlers/wrapSnapHandlers';\nexport type {\n AccountSyncFailure,\n CreateSnapErrorHandlingOptions,\n CreateTrackErrorOptions,\n CreateWithCatchAndThrowSnapErrorOptions,\n LogErrorFn,\n NormalizeErrorFn,\n PrepareErrorForTrackingFn,\n ShouldTrackErrorFn,\n SnapRpcError,\n SnapTrackErrorRequest,\n TrackErrorCapableProvider,\n TrackErrorFn,\n} from './utils/errors';\n"]}
|
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
import type { CreateServicePolicyOptions, ServicePolicy } from "@metamask/base-data-service";
|
|
2
|
+
import type { Logger } from "../logger/Logger.mjs";
|
|
3
|
+
/**
|
|
4
|
+
* The error `policy.execute()` throws while the circuit is open. Its `name` is
|
|
5
|
+
* `Error`, so check for it with `instanceof`.
|
|
6
|
+
*/
|
|
7
|
+
export { BrokenCircuitError } from "@metamask/base-data-service";
|
|
8
|
+
/**
|
|
9
|
+
* The error shape the fetch policy decides on. Each snap converts its errors
|
|
10
|
+
* to this shape at the network boundary.
|
|
11
|
+
*
|
|
12
|
+
* - `httpStatus` is set only when a non-2xx response arrived.
|
|
13
|
+
* - Network failures and timeouts have no `httpStatus`; they are identified by
|
|
14
|
+
* their `name` (see {@link FetchPolicyErrorName}).
|
|
15
|
+
* - `retryAfterMs` is the parsed `Retry-After` header, when there is one.
|
|
16
|
+
*/
|
|
17
|
+
export type FetchPolicyError = Error & {
|
|
18
|
+
httpStatus?: number;
|
|
19
|
+
retryAfterMs?: number;
|
|
20
|
+
};
|
|
21
|
+
/**
|
|
22
|
+
* The error names the fetch policy treats as transient. `TimeoutError` is also
|
|
23
|
+
* the name of the error thrown by `AbortSignal.timeout()`.
|
|
24
|
+
*/
|
|
25
|
+
export declare const FetchPolicyErrorName: {
|
|
26
|
+
readonly Network: "NetworkError";
|
|
27
|
+
readonly Timeout: "TimeoutError";
|
|
28
|
+
};
|
|
29
|
+
/**
|
|
30
|
+
* The longest `Retry-After` the policy waits for. A longer one fails the call
|
|
31
|
+
* at once rather than blocking the user.
|
|
32
|
+
*/
|
|
33
|
+
export declare const MAX_RETRY_AFTER_MS = 30000;
|
|
34
|
+
/**
|
|
35
|
+
* Creates an error in the shape the fetch policy decides on.
|
|
36
|
+
*
|
|
37
|
+
* @param message - The error message.
|
|
38
|
+
* @param options - The error fields. Omitted fields are not set.
|
|
39
|
+
* @param options.name - The error name, e.g. `FetchPolicyErrorName.Network`.
|
|
40
|
+
* @param options.httpStatus - The HTTP status of a non-2xx response.
|
|
41
|
+
* @param options.retryAfterMs - The parsed `Retry-After` header, in milliseconds.
|
|
42
|
+
* @param options.cause - The original error.
|
|
43
|
+
* @returns The error.
|
|
44
|
+
*/
|
|
45
|
+
export declare const createFetchPolicyError: (message: string, { name, httpStatus, retryAfterMs, cause, }?: {
|
|
46
|
+
name?: string;
|
|
47
|
+
httpStatus?: number;
|
|
48
|
+
retryAfterMs?: number;
|
|
49
|
+
cause?: unknown;
|
|
50
|
+
}) => FetchPolicyError;
|
|
51
|
+
/**
|
|
52
|
+
* Whether an error is a transient failure: a network failure, a timeout, or
|
|
53
|
+
* HTTP 408, 425, 429, 500, 502, 503 or 504.
|
|
54
|
+
*
|
|
55
|
+
* @param error - The error to check.
|
|
56
|
+
* @returns `true` if the error is transient.
|
|
57
|
+
*/
|
|
58
|
+
export declare const isTransientError: (error: unknown) => boolean;
|
|
59
|
+
export type CreateFetchPolicyOptions = Omit<CreateServicePolicyOptions, 'retryFilterPolicy' | 'isServiceFailure'> & {
|
|
60
|
+
/**
|
|
61
|
+
* The upstream service the policy protects, e.g. `price_api`. Create one
|
|
62
|
+
* policy per service, so one failing service doesn't open the circuit for
|
|
63
|
+
* the others.
|
|
64
|
+
*/
|
|
65
|
+
service: string;
|
|
66
|
+
/**
|
|
67
|
+
* The CAIP-2 chain ID the service is called for, if any.
|
|
68
|
+
*/
|
|
69
|
+
chainIdCaip?: string;
|
|
70
|
+
/**
|
|
71
|
+
* Where retries, circuit breaks and give-ups are logged.
|
|
72
|
+
*/
|
|
73
|
+
logger: Pick<Logger, 'warn'>;
|
|
74
|
+
};
|
|
75
|
+
/**
|
|
76
|
+
* Creates a retry and circuit-breaker policy for calls to one upstream
|
|
77
|
+
* service, on top of `createServicePolicy` from `@metamask/base-data-service`.
|
|
78
|
+
*
|
|
79
|
+
* - Retries only transient errors (see {@link isTransientError}), up to 3 times
|
|
80
|
+
* by default, with exponential backoff and jitter.
|
|
81
|
+
* - Waits for the error's `retryAfterMs` when it is longer than the backoff, and
|
|
82
|
+
* doesn't retry when it is over {@link MAX_RETRY_AFTER_MS}.
|
|
83
|
+
* - Counts transient errors and any 5xx toward opening the circuit, which then
|
|
84
|
+
* stays open for 30 seconds by default. Other errors, such as 4xx, aborts and
|
|
85
|
+
* validation errors, don't count.
|
|
86
|
+
*
|
|
87
|
+
* The circuit state lives in memory, and a snap is stopped after about 30
|
|
88
|
+
* seconds idle, so the circuit only protects within a burst of requests.
|
|
89
|
+
*
|
|
90
|
+
* Snaps must provide a `performance` global (see `performance-shim`), which
|
|
91
|
+
* the underlying library uses to time calls.
|
|
92
|
+
*
|
|
93
|
+
* Create one policy per upstream service, convert errors to
|
|
94
|
+
* {@link FetchPolicyError} at the network boundary, and wrap each call with
|
|
95
|
+
* `policy.execute()`:
|
|
96
|
+
*
|
|
97
|
+
* @example
|
|
98
|
+
* ```typescript
|
|
99
|
+
* const priceApiPolicy = createFetchPolicy({ service: 'price_api', logger });
|
|
100
|
+
*
|
|
101
|
+
* const prices = await priceApiPolicy.execute(async () => {
|
|
102
|
+
* const response = await fetch(url, {
|
|
103
|
+
* signal: AbortSignal.timeout(10_000),
|
|
104
|
+
* });
|
|
105
|
+
* if (!response.ok) {
|
|
106
|
+
* throw createFetchPolicyError(`HTTP ${response.status}`, {
|
|
107
|
+
* httpStatus: response.status,
|
|
108
|
+
* });
|
|
109
|
+
* }
|
|
110
|
+
* return response.json();
|
|
111
|
+
* });
|
|
112
|
+
* ```
|
|
113
|
+
*
|
|
114
|
+
* Don't wrap calls that build, sign and send a transaction: a retry could send
|
|
115
|
+
* it twice.
|
|
116
|
+
*
|
|
117
|
+
* While the circuit is open, `policy.execute()` throws
|
|
118
|
+
* {@link BrokenCircuitError} without calling the service. Its `name` is
|
|
119
|
+
* `Error`, so check for it with `instanceof`.
|
|
120
|
+
*
|
|
121
|
+
* The underlying library times calls with `performance.now()`, which snaps
|
|
122
|
+
* don't have. Add `webpack` as a dev dependency, on the same major version as
|
|
123
|
+
* `@metamask/snaps-cli`, and provide the shim in `snap.config.ts`:
|
|
124
|
+
*
|
|
125
|
+
* @example
|
|
126
|
+
* ```typescript
|
|
127
|
+
* import type { SnapConfig } from '@metamask/snaps-cli';
|
|
128
|
+
* import { merge } from '@metamask/snaps-cli';
|
|
129
|
+
* import { ProvidePlugin } from 'webpack';
|
|
130
|
+
*
|
|
131
|
+
* const config: SnapConfig = {
|
|
132
|
+
* // ...
|
|
133
|
+
* customizeWebpackConfig: (webpackConfig) =>
|
|
134
|
+
* merge(webpackConfig, {
|
|
135
|
+
* plugins: [
|
|
136
|
+
* new ProvidePlugin({
|
|
137
|
+
* performance: '@metamask/snap-networks-utils/performance-shim',
|
|
138
|
+
* }),
|
|
139
|
+
* ],
|
|
140
|
+
* }),
|
|
141
|
+
* };
|
|
142
|
+
* ```
|
|
143
|
+
*
|
|
144
|
+
* @param options - The policy options.
|
|
145
|
+
* @param options.service - The upstream service name.
|
|
146
|
+
* @param options.chainIdCaip - The CAIP-2 chain ID, if any.
|
|
147
|
+
* @param options.logger - The logger.
|
|
148
|
+
* @param options.backoff - The base backoff. Defaults to exponential backoff.
|
|
149
|
+
* @returns The policy. Wrap each call with `policy.execute()`.
|
|
150
|
+
*/
|
|
151
|
+
export declare const createFetchPolicy: ({ service, chainIdCaip, logger, backoff, ...options }: CreateFetchPolicyOptions) => ServicePolicy;
|
|
152
|
+
//# sourceMappingURL=createFetchPolicy.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"createFetchPolicy.d.mts","sourceRoot":"","sources":["../../../src/utils/fetchPolicy/createFetchPolicy.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EACV,0BAA0B,EAC1B,aAAa,EACd,oCAAoC;AAErC,OAAO,KAAK,EAAE,MAAM,EAAE,6BAAyB;AAE/C;;;GAGG;AACH,OAAO,EAAE,kBAAkB,EAAE,oCAAoC;AAEjE;;;;;;;;GAQG;AACH,MAAM,MAAM,gBAAgB,GAAG,KAAK,GAAG;IACrC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,oBAAoB;;;CAGvB,CAAC;AAEX;;;GAGG;AACH,eAAO,MAAM,kBAAkB,QAAS,CAAC;AAMzC;;;;;;;;;;GAUG;AACH,eAAO,MAAM,sBAAsB,GACjC,SAAS,MAAM,EACf,6CAKG;IACD,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,KAAK,CAAC,EAAE,OAAO,CAAC;CACZ,KACL,gBAeF,CAAC;AAEF;;;;;;GAMG;AACH,eAAO,MAAM,gBAAgB,GAAI,OAAO,OAAO,KAAG,OAUjD,CAAC;AA4CF,MAAM,MAAM,wBAAwB,GAAG,IAAI,CACzC,0BAA0B,EAC1B,mBAAmB,GAAG,kBAAkB,CACzC,GAAG;IACF;;;;OAIG;IACH,OAAO,EAAE,MAAM,CAAC;IAChB;;OAEG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;OAEG;IACH,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC9B,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2EG;AACH,eAAO,MAAM,iBAAiB,GAAI,uDAM/B,wBAAwB,KAAG,aA8C7B,CAAC"}
|
|
@@ -0,0 +1,204 @@
|
|
|
1
|
+
import { createServicePolicy, ExponentialBackoff, handleWhen } from "@metamask/base-data-service";
|
|
2
|
+
/**
|
|
3
|
+
* The error `policy.execute()` throws while the circuit is open. Its `name` is
|
|
4
|
+
* `Error`, so check for it with `instanceof`.
|
|
5
|
+
*/
|
|
6
|
+
export { BrokenCircuitError } from "@metamask/base-data-service";
|
|
7
|
+
/**
|
|
8
|
+
* The error names the fetch policy treats as transient. `TimeoutError` is also
|
|
9
|
+
* the name of the error thrown by `AbortSignal.timeout()`.
|
|
10
|
+
*/
|
|
11
|
+
export const FetchPolicyErrorName = {
|
|
12
|
+
Network: 'NetworkError',
|
|
13
|
+
Timeout: 'TimeoutError',
|
|
14
|
+
};
|
|
15
|
+
/**
|
|
16
|
+
* The longest `Retry-After` the policy waits for. A longer one fails the call
|
|
17
|
+
* at once rather than blocking the user.
|
|
18
|
+
*/
|
|
19
|
+
export const MAX_RETRY_AFTER_MS = 30_000;
|
|
20
|
+
const DEFAULT_CIRCUIT_BREAK_DURATION_MS = 30_000;
|
|
21
|
+
const RETRYABLE_HTTP_STATUSES = new Set([408, 425, 429, 500, 502, 503, 504]);
|
|
22
|
+
/**
|
|
23
|
+
* Creates an error in the shape the fetch policy decides on.
|
|
24
|
+
*
|
|
25
|
+
* @param message - The error message.
|
|
26
|
+
* @param options - The error fields. Omitted fields are not set.
|
|
27
|
+
* @param options.name - The error name, e.g. `FetchPolicyErrorName.Network`.
|
|
28
|
+
* @param options.httpStatus - The HTTP status of a non-2xx response.
|
|
29
|
+
* @param options.retryAfterMs - The parsed `Retry-After` header, in milliseconds.
|
|
30
|
+
* @param options.cause - The original error.
|
|
31
|
+
* @returns The error.
|
|
32
|
+
*/
|
|
33
|
+
export const createFetchPolicyError = (message, { name, httpStatus, retryAfterMs, cause, } = {}) => {
|
|
34
|
+
const error = new Error(message, cause === undefined ? undefined : { cause });
|
|
35
|
+
if (name !== undefined) {
|
|
36
|
+
error.name = name;
|
|
37
|
+
}
|
|
38
|
+
if (httpStatus !== undefined) {
|
|
39
|
+
error.httpStatus = httpStatus;
|
|
40
|
+
}
|
|
41
|
+
if (retryAfterMs !== undefined) {
|
|
42
|
+
error.retryAfterMs = retryAfterMs;
|
|
43
|
+
}
|
|
44
|
+
return error;
|
|
45
|
+
};
|
|
46
|
+
/**
|
|
47
|
+
* Whether an error is a transient failure: a network failure, a timeout, or
|
|
48
|
+
* HTTP 408, 425, 429, 500, 502, 503 or 504.
|
|
49
|
+
*
|
|
50
|
+
* @param error - The error to check.
|
|
51
|
+
* @returns `true` if the error is transient.
|
|
52
|
+
*/
|
|
53
|
+
export const isTransientError = (error) => {
|
|
54
|
+
if (!(error instanceof Error)) {
|
|
55
|
+
return false;
|
|
56
|
+
}
|
|
57
|
+
const { name, httpStatus } = error;
|
|
58
|
+
return (name === FetchPolicyErrorName.Network ||
|
|
59
|
+
name === FetchPolicyErrorName.Timeout ||
|
|
60
|
+
(httpStatus !== undefined && RETRYABLE_HTTP_STATUSES.has(httpStatus)));
|
|
61
|
+
};
|
|
62
|
+
const isServiceFailure = (error) => isTransientError(error) ||
|
|
63
|
+
(error?.httpStatus ?? 0) >= 500;
|
|
64
|
+
/**
|
|
65
|
+
* Gets the error of a failed attempt, if it threw one.
|
|
66
|
+
*
|
|
67
|
+
* @param reason - The failure reason from the policy (`{ error }` or `{ value }`).
|
|
68
|
+
* @returns The error, or `undefined` if the attempt didn't throw.
|
|
69
|
+
*/
|
|
70
|
+
const errorOf = (reason) => reason.error;
|
|
71
|
+
/**
|
|
72
|
+
* Wraps a backoff so each delay is at least the failed attempt's
|
|
73
|
+
* `retryAfterMs`.
|
|
74
|
+
*
|
|
75
|
+
* @param inner - The backoff to wrap.
|
|
76
|
+
* @returns The wrapped backoff.
|
|
77
|
+
*/
|
|
78
|
+
const withRetryAfter = (inner) => ({
|
|
79
|
+
next(context) {
|
|
80
|
+
const step = inner.next(context);
|
|
81
|
+
const error = errorOf(context.result);
|
|
82
|
+
const retryAfter = error?.retryAfterMs;
|
|
83
|
+
const retryAfterMs = typeof retryAfter === 'number' &&
|
|
84
|
+
Number.isFinite(retryAfter) &&
|
|
85
|
+
retryAfter >= 0
|
|
86
|
+
? retryAfter
|
|
87
|
+
: 0;
|
|
88
|
+
return {
|
|
89
|
+
...withRetryAfter(step),
|
|
90
|
+
duration: Math.max(step.duration, retryAfterMs),
|
|
91
|
+
};
|
|
92
|
+
},
|
|
93
|
+
});
|
|
94
|
+
/**
|
|
95
|
+
* Creates a retry and circuit-breaker policy for calls to one upstream
|
|
96
|
+
* service, on top of `createServicePolicy` from `@metamask/base-data-service`.
|
|
97
|
+
*
|
|
98
|
+
* - Retries only transient errors (see {@link isTransientError}), up to 3 times
|
|
99
|
+
* by default, with exponential backoff and jitter.
|
|
100
|
+
* - Waits for the error's `retryAfterMs` when it is longer than the backoff, and
|
|
101
|
+
* doesn't retry when it is over {@link MAX_RETRY_AFTER_MS}.
|
|
102
|
+
* - Counts transient errors and any 5xx toward opening the circuit, which then
|
|
103
|
+
* stays open for 30 seconds by default. Other errors, such as 4xx, aborts and
|
|
104
|
+
* validation errors, don't count.
|
|
105
|
+
*
|
|
106
|
+
* The circuit state lives in memory, and a snap is stopped after about 30
|
|
107
|
+
* seconds idle, so the circuit only protects within a burst of requests.
|
|
108
|
+
*
|
|
109
|
+
* Snaps must provide a `performance` global (see `performance-shim`), which
|
|
110
|
+
* the underlying library uses to time calls.
|
|
111
|
+
*
|
|
112
|
+
* Create one policy per upstream service, convert errors to
|
|
113
|
+
* {@link FetchPolicyError} at the network boundary, and wrap each call with
|
|
114
|
+
* `policy.execute()`:
|
|
115
|
+
*
|
|
116
|
+
* @example
|
|
117
|
+
* ```typescript
|
|
118
|
+
* const priceApiPolicy = createFetchPolicy({ service: 'price_api', logger });
|
|
119
|
+
*
|
|
120
|
+
* const prices = await priceApiPolicy.execute(async () => {
|
|
121
|
+
* const response = await fetch(url, {
|
|
122
|
+
* signal: AbortSignal.timeout(10_000),
|
|
123
|
+
* });
|
|
124
|
+
* if (!response.ok) {
|
|
125
|
+
* throw createFetchPolicyError(`HTTP ${response.status}`, {
|
|
126
|
+
* httpStatus: response.status,
|
|
127
|
+
* });
|
|
128
|
+
* }
|
|
129
|
+
* return response.json();
|
|
130
|
+
* });
|
|
131
|
+
* ```
|
|
132
|
+
*
|
|
133
|
+
* Don't wrap calls that build, sign and send a transaction: a retry could send
|
|
134
|
+
* it twice.
|
|
135
|
+
*
|
|
136
|
+
* While the circuit is open, `policy.execute()` throws
|
|
137
|
+
* {@link BrokenCircuitError} without calling the service. Its `name` is
|
|
138
|
+
* `Error`, so check for it with `instanceof`.
|
|
139
|
+
*
|
|
140
|
+
* The underlying library times calls with `performance.now()`, which snaps
|
|
141
|
+
* don't have. Add `webpack` as a dev dependency, on the same major version as
|
|
142
|
+
* `@metamask/snaps-cli`, and provide the shim in `snap.config.ts`:
|
|
143
|
+
*
|
|
144
|
+
* @example
|
|
145
|
+
* ```typescript
|
|
146
|
+
* import type { SnapConfig } from '@metamask/snaps-cli';
|
|
147
|
+
* import { merge } from '@metamask/snaps-cli';
|
|
148
|
+
* import { ProvidePlugin } from 'webpack';
|
|
149
|
+
*
|
|
150
|
+
* const config: SnapConfig = {
|
|
151
|
+
* // ...
|
|
152
|
+
* customizeWebpackConfig: (webpackConfig) =>
|
|
153
|
+
* merge(webpackConfig, {
|
|
154
|
+
* plugins: [
|
|
155
|
+
* new ProvidePlugin({
|
|
156
|
+
* performance: '@metamask/snap-networks-utils/performance-shim',
|
|
157
|
+
* }),
|
|
158
|
+
* ],
|
|
159
|
+
* }),
|
|
160
|
+
* };
|
|
161
|
+
* ```
|
|
162
|
+
*
|
|
163
|
+
* @param options - The policy options.
|
|
164
|
+
* @param options.service - The upstream service name.
|
|
165
|
+
* @param options.chainIdCaip - The CAIP-2 chain ID, if any.
|
|
166
|
+
* @param options.logger - The logger.
|
|
167
|
+
* @param options.backoff - The base backoff. Defaults to exponential backoff.
|
|
168
|
+
* @returns The policy. Wrap each call with `policy.execute()`.
|
|
169
|
+
*/
|
|
170
|
+
export const createFetchPolicy = ({ service, chainIdCaip, logger, backoff = new ExponentialBackoff(), ...options }) => {
|
|
171
|
+
const prefix = `[${[service, chainIdCaip].filter(Boolean).join(' ')}]`;
|
|
172
|
+
const isRetryable = (error) => {
|
|
173
|
+
if (!isTransientError(error)) {
|
|
174
|
+
return false;
|
|
175
|
+
}
|
|
176
|
+
const retryAfterMs = error.retryAfterMs ?? 0;
|
|
177
|
+
if (retryAfterMs > MAX_RETRY_AFTER_MS) {
|
|
178
|
+
logger.warn(`${prefix} Not retrying: Retry-After of ${retryAfterMs} ms is over the ${MAX_RETRY_AFTER_MS} ms cap:`, error);
|
|
179
|
+
return false;
|
|
180
|
+
}
|
|
181
|
+
return true;
|
|
182
|
+
};
|
|
183
|
+
const policy = createServicePolicy({
|
|
184
|
+
circuitBreakDuration: DEFAULT_CIRCUIT_BREAK_DURATION_MS,
|
|
185
|
+
...options,
|
|
186
|
+
backoff: withRetryAfter(backoff),
|
|
187
|
+
retryFilterPolicy: handleWhen(isRetryable),
|
|
188
|
+
isServiceFailure,
|
|
189
|
+
});
|
|
190
|
+
policy.onRetry(({ attempt, delay, ...reason }) => logger.warn(`${prefix} Retrying (attempt ${attempt}, delay ${delay} ms):`, errorOf(reason)));
|
|
191
|
+
policy.retryPolicy.onGiveUp((reason) => logger.warn(`${prefix} Giving up:`, errorOf(reason)));
|
|
192
|
+
policy.onBreak((reason) => {
|
|
193
|
+
const message = `${prefix} Circuit opened for ${policy.circuitBreakDuration} ms`;
|
|
194
|
+
const error = errorOf(reason);
|
|
195
|
+
if (error === undefined) {
|
|
196
|
+
logger.warn(message);
|
|
197
|
+
}
|
|
198
|
+
else {
|
|
199
|
+
logger.warn(`${message}:`, error);
|
|
200
|
+
}
|
|
201
|
+
});
|
|
202
|
+
return policy;
|
|
203
|
+
};
|
|
204
|
+
//# sourceMappingURL=createFetchPolicy.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"createFetchPolicy.mjs","sourceRoot":"","sources":["../../../src/utils/fetchPolicy/createFetchPolicy.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n createServicePolicy,\n ExponentialBackoff,\n handleWhen,\n} from '@metamask/base-data-service';\nimport type {\n CreateServicePolicyOptions,\n ServicePolicy,\n} from '@metamask/base-data-service';\n\nimport type { Logger } from '../logger/Logger';\n\n/**\n * The error `policy.execute()` throws while the circuit is open. Its `name` is\n * `Error`, so check for it with `instanceof`.\n */\nexport { BrokenCircuitError } from '@metamask/base-data-service';\n\n/**\n * The error shape the fetch policy decides on. Each snap converts its errors\n * to this shape at the network boundary.\n *\n * - `httpStatus` is set only when a non-2xx response arrived.\n * - Network failures and timeouts have no `httpStatus`; they are identified by\n * their `name` (see {@link FetchPolicyErrorName}).\n * - `retryAfterMs` is the parsed `Retry-After` header, when there is one.\n */\nexport type FetchPolicyError = Error & {\n httpStatus?: number;\n retryAfterMs?: number;\n};\n\n/**\n * The error names the fetch policy treats as transient. `TimeoutError` is also\n * the name of the error thrown by `AbortSignal.timeout()`.\n */\nexport const FetchPolicyErrorName = {\n Network: 'NetworkError',\n Timeout: 'TimeoutError',\n} as const;\n\n/**\n * The longest `Retry-After` the policy waits for. A longer one fails the call\n * at once rather than blocking the user.\n */\nexport const MAX_RETRY_AFTER_MS = 30_000;\n\nconst DEFAULT_CIRCUIT_BREAK_DURATION_MS = 30_000;\n\nconst RETRYABLE_HTTP_STATUSES = new Set([408, 425, 429, 500, 502, 503, 504]);\n\n/**\n * Creates an error in the shape the fetch policy decides on.\n *\n * @param message - The error message.\n * @param options - The error fields. Omitted fields are not set.\n * @param options.name - The error name, e.g. `FetchPolicyErrorName.Network`.\n * @param options.httpStatus - The HTTP status of a non-2xx response.\n * @param options.retryAfterMs - The parsed `Retry-After` header, in milliseconds.\n * @param options.cause - The original error.\n * @returns The error.\n */\nexport const createFetchPolicyError = (\n message: string,\n {\n name,\n httpStatus,\n retryAfterMs,\n cause,\n }: {\n name?: string;\n httpStatus?: number;\n retryAfterMs?: number;\n cause?: unknown;\n } = {},\n): FetchPolicyError => {\n const error: FetchPolicyError = new Error(\n message,\n cause === undefined ? undefined : { cause },\n );\n if (name !== undefined) {\n error.name = name;\n }\n if (httpStatus !== undefined) {\n error.httpStatus = httpStatus;\n }\n if (retryAfterMs !== undefined) {\n error.retryAfterMs = retryAfterMs;\n }\n return error;\n};\n\n/**\n * Whether an error is a transient failure: a network failure, a timeout, or\n * HTTP 408, 425, 429, 500, 502, 503 or 504.\n *\n * @param error - The error to check.\n * @returns `true` if the error is transient.\n */\nexport const isTransientError = (error: unknown): boolean => {\n if (!(error instanceof Error)) {\n return false;\n }\n const { name, httpStatus } = error as FetchPolicyError;\n return (\n name === FetchPolicyErrorName.Network ||\n name === FetchPolicyErrorName.Timeout ||\n (httpStatus !== undefined && RETRYABLE_HTTP_STATUSES.has(httpStatus))\n );\n};\n\nconst isServiceFailure = (error: unknown): boolean =>\n isTransientError(error) ||\n ((error as FetchPolicyError | undefined)?.httpStatus ?? 0) >= 500;\n\ntype Backoff = NonNullable<CreateServicePolicyOptions['backoff']>;\n\n/**\n * Gets the error of a failed attempt, if it threw one.\n *\n * @param reason - The failure reason from the policy (`{ error }` or `{ value }`).\n * @returns The error, or `undefined` if the attempt didn't throw.\n */\nconst errorOf = (reason: unknown): unknown =>\n (reason as { error?: unknown }).error;\n\n/**\n * Wraps a backoff so each delay is at least the failed attempt's\n * `retryAfterMs`.\n *\n * @param inner - The backoff to wrap.\n * @returns The wrapped backoff.\n */\nconst withRetryAfter = (inner: Backoff): Backoff => ({\n next(context): ReturnType<Backoff['next']> {\n const step = inner.next(context);\n const error = errorOf((context as { result: unknown }).result) as\n | FetchPolicyError\n | undefined;\n const retryAfter = error?.retryAfterMs;\n const retryAfterMs =\n typeof retryAfter === 'number' &&\n Number.isFinite(retryAfter) &&\n retryAfter >= 0\n ? retryAfter\n : 0;\n return {\n ...withRetryAfter(step),\n duration: Math.max(step.duration, retryAfterMs),\n };\n },\n});\n\nexport type CreateFetchPolicyOptions = Omit<\n CreateServicePolicyOptions,\n 'retryFilterPolicy' | 'isServiceFailure'\n> & {\n /**\n * The upstream service the policy protects, e.g. `price_api`. Create one\n * policy per service, so one failing service doesn't open the circuit for\n * the others.\n */\n service: string;\n /**\n * The CAIP-2 chain ID the service is called for, if any.\n */\n chainIdCaip?: string;\n /**\n * Where retries, circuit breaks and give-ups are logged.\n */\n logger: Pick<Logger, 'warn'>;\n};\n\n/**\n * Creates a retry and circuit-breaker policy for calls to one upstream\n * service, on top of `createServicePolicy` from `@metamask/base-data-service`.\n *\n * - Retries only transient errors (see {@link isTransientError}), up to 3 times\n * by default, with exponential backoff and jitter.\n * - Waits for the error's `retryAfterMs` when it is longer than the backoff, and\n * doesn't retry when it is over {@link MAX_RETRY_AFTER_MS}.\n * - Counts transient errors and any 5xx toward opening the circuit, which then\n * stays open for 30 seconds by default. Other errors, such as 4xx, aborts and\n * validation errors, don't count.\n *\n * The circuit state lives in memory, and a snap is stopped after about 30\n * seconds idle, so the circuit only protects within a burst of requests.\n *\n * Snaps must provide a `performance` global (see `performance-shim`), which\n * the underlying library uses to time calls.\n *\n * Create one policy per upstream service, convert errors to\n * {@link FetchPolicyError} at the network boundary, and wrap each call with\n * `policy.execute()`:\n *\n * @example\n * ```typescript\n * const priceApiPolicy = createFetchPolicy({ service: 'price_api', logger });\n *\n * const prices = await priceApiPolicy.execute(async () => {\n * const response = await fetch(url, {\n * signal: AbortSignal.timeout(10_000),\n * });\n * if (!response.ok) {\n * throw createFetchPolicyError(`HTTP ${response.status}`, {\n * httpStatus: response.status,\n * });\n * }\n * return response.json();\n * });\n * ```\n *\n * Don't wrap calls that build, sign and send a transaction: a retry could send\n * it twice.\n *\n * While the circuit is open, `policy.execute()` throws\n * {@link BrokenCircuitError} without calling the service. Its `name` is\n * `Error`, so check for it with `instanceof`.\n *\n * The underlying library times calls with `performance.now()`, which snaps\n * don't have. Add `webpack` as a dev dependency, on the same major version as\n * `@metamask/snaps-cli`, and provide the shim in `snap.config.ts`:\n *\n * @example\n * ```typescript\n * import type { SnapConfig } from '@metamask/snaps-cli';\n * import { merge } from '@metamask/snaps-cli';\n * import { ProvidePlugin } from 'webpack';\n *\n * const config: SnapConfig = {\n * // ...\n * customizeWebpackConfig: (webpackConfig) =>\n * merge(webpackConfig, {\n * plugins: [\n * new ProvidePlugin({\n * performance: '@metamask/snap-networks-utils/performance-shim',\n * }),\n * ],\n * }),\n * };\n * ```\n *\n * @param options - The policy options.\n * @param options.service - The upstream service name.\n * @param options.chainIdCaip - The CAIP-2 chain ID, if any.\n * @param options.logger - The logger.\n * @param options.backoff - The base backoff. Defaults to exponential backoff.\n * @returns The policy. Wrap each call with `policy.execute()`.\n */\nexport const createFetchPolicy = ({\n service,\n chainIdCaip,\n logger,\n backoff = new ExponentialBackoff(),\n ...options\n}: CreateFetchPolicyOptions): ServicePolicy => {\n const prefix = `[${[service, chainIdCaip].filter(Boolean).join(' ')}]`;\n\n const isRetryable = (error: FetchPolicyError): boolean => {\n if (!isTransientError(error)) {\n return false;\n }\n const retryAfterMs = error.retryAfterMs ?? 0;\n if (retryAfterMs > MAX_RETRY_AFTER_MS) {\n logger.warn(\n `${prefix} Not retrying: Retry-After of ${retryAfterMs} ms is over the ${MAX_RETRY_AFTER_MS} ms cap:`,\n error,\n );\n return false;\n }\n return true;\n };\n\n const policy = createServicePolicy({\n circuitBreakDuration: DEFAULT_CIRCUIT_BREAK_DURATION_MS,\n ...options,\n backoff: withRetryAfter(backoff),\n retryFilterPolicy: handleWhen(isRetryable),\n isServiceFailure,\n });\n\n policy.onRetry(({ attempt, delay, ...reason }) =>\n logger.warn(\n `${prefix} Retrying (attempt ${attempt}, delay ${delay} ms):`,\n errorOf(reason),\n ),\n );\n policy.retryPolicy.onGiveUp((reason) =>\n logger.warn(`${prefix} Giving up:`, errorOf(reason)),\n );\n policy.onBreak((reason) => {\n const message = `${prefix} Circuit opened for ${policy.circuitBreakDuration} ms`;\n const error = errorOf(reason);\n if (error === undefined) {\n logger.warn(message);\n } else {\n logger.warn(`${message}:`, error);\n }\n });\n\n return policy;\n};\n"]}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A minimal `performance` global for snaps, which don't have one. The fetch
|
|
3
|
+
* policy's underlying library times calls with `performance.now()`.
|
|
4
|
+
*
|
|
5
|
+
* Provide it in `snap.config.ts`:
|
|
6
|
+
*
|
|
7
|
+
* ```ts
|
|
8
|
+
* new ProvidePlugin({
|
|
9
|
+
* performance: '@metamask/snap-networks-utils/performance-shim',
|
|
10
|
+
* });
|
|
11
|
+
* ```
|
|
12
|
+
*
|
|
13
|
+
* @returns The current time in milliseconds.
|
|
14
|
+
*/
|
|
15
|
+
export declare const now: () => number;
|
|
16
|
+
//# sourceMappingURL=performanceShim.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"performanceShim.d.mts","sourceRoot":"","sources":["../../../src/utils/fetchPolicy/performanceShim.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,GAAG,QAAO,MAAoB,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A minimal `performance` global for snaps, which don't have one. The fetch
|
|
3
|
+
* policy's underlying library times calls with `performance.now()`.
|
|
4
|
+
*
|
|
5
|
+
* Provide it in `snap.config.ts`:
|
|
6
|
+
*
|
|
7
|
+
* ```ts
|
|
8
|
+
* new ProvidePlugin({
|
|
9
|
+
* performance: '@metamask/snap-networks-utils/performance-shim',
|
|
10
|
+
* });
|
|
11
|
+
* ```
|
|
12
|
+
*
|
|
13
|
+
* @returns The current time in milliseconds.
|
|
14
|
+
*/
|
|
15
|
+
export const now = () => Date.now();
|
|
16
|
+
//# sourceMappingURL=performanceShim.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"performanceShim.mjs","sourceRoot":"","sources":["../../../src/utils/fetchPolicy/performanceShim.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AACH,MAAM,CAAC,MAAM,GAAG,GAAG,GAAW,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC","sourcesContent":["/**\n * A minimal `performance` global for snaps, which don't have one. The fetch\n * policy's underlying library times calls with `performance.now()`.\n *\n * Provide it in `snap.config.ts`:\n *\n * ```ts\n * new ProvidePlugin({\n * performance: '@metamask/snap-networks-utils/performance-shim',\n * });\n * ```\n *\n * @returns The current time in milliseconds.\n */\nexport const now = (): number => Date.now();\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@metamask-previews/snap-networks-utils",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "3.0.0-preview-61fa1fce",
|
|
4
4
|
"description": "Shared utilities for MetaMask network snaps",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"Ethereum",
|
|
@@ -19,38 +19,24 @@
|
|
|
19
19
|
"dist/"
|
|
20
20
|
],
|
|
21
21
|
"sideEffects": false,
|
|
22
|
-
"main": "./dist/index.
|
|
23
|
-
"types": "./dist/index.d.
|
|
22
|
+
"main": "./dist/index.mjs",
|
|
23
|
+
"types": "./dist/index.d.mts",
|
|
24
24
|
"exports": {
|
|
25
25
|
".": {
|
|
26
|
-
"
|
|
27
|
-
|
|
28
|
-
"default": "./dist/index.mjs"
|
|
29
|
-
},
|
|
30
|
-
"require": {
|
|
31
|
-
"types": "./dist/index.d.cts",
|
|
32
|
-
"default": "./dist/index.cjs"
|
|
33
|
-
}
|
|
26
|
+
"types": "./dist/index.d.mts",
|
|
27
|
+
"default": "./dist/index.mjs"
|
|
34
28
|
},
|
|
35
29
|
"./dedupe": {
|
|
36
|
-
"
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
"
|
|
41
|
-
|
|
42
|
-
"default": "./dist/utils/dedupe/InFlightCoalescer.cjs"
|
|
43
|
-
}
|
|
30
|
+
"types": "./dist/utils/dedupe/InFlightCoalescer.d.mts",
|
|
31
|
+
"default": "./dist/utils/dedupe/InFlightCoalescer.mjs"
|
|
32
|
+
},
|
|
33
|
+
"./performance-shim": {
|
|
34
|
+
"types": "./dist/utils/fetchPolicy/performanceShim.d.mts",
|
|
35
|
+
"default": "./dist/utils/fetchPolicy/performanceShim.mjs"
|
|
44
36
|
},
|
|
45
37
|
"./logger": {
|
|
46
|
-
"
|
|
47
|
-
|
|
48
|
-
"default": "./dist/utils/logger/Logger.mjs"
|
|
49
|
-
},
|
|
50
|
-
"require": {
|
|
51
|
-
"types": "./dist/utils/logger/Logger.d.cts",
|
|
52
|
-
"default": "./dist/utils/logger/Logger.cjs"
|
|
53
|
-
}
|
|
38
|
+
"types": "./dist/utils/logger/Logger.d.mts",
|
|
39
|
+
"default": "./dist/utils/logger/Logger.mjs"
|
|
54
40
|
},
|
|
55
41
|
"./package.json": "./package.json"
|
|
56
42
|
},
|
|
@@ -59,21 +45,22 @@
|
|
|
59
45
|
"registry": "https://registry.npmjs.org/"
|
|
60
46
|
},
|
|
61
47
|
"scripts": {
|
|
62
|
-
"build": "ts-bridge --project tsconfig.build.json --verbose --clean --no-references && yarn build:assets",
|
|
63
|
-
"build:all": "ts-bridge --project tsconfig.build.json --verbose --clean && yarn build:assets",
|
|
48
|
+
"build": "ts-bridge --format module --project tsconfig.build.json --verbose --clean --no-references && yarn build:assets",
|
|
49
|
+
"build:all": "ts-bridge --format module --project tsconfig.build.json --verbose --clean && yarn build:assets",
|
|
64
50
|
"build:assets": "rsync -a --prune-empty-dirs --include='*/' --include='*.svg' --exclude='*' src/ dist/",
|
|
65
51
|
"build:docs": "typedoc",
|
|
66
52
|
"changelog:update": "../../scripts/update-changelog.sh @metamask/snap-networks-utils",
|
|
67
53
|
"changelog:validate": "../../scripts/validate-changelog.sh @metamask/snap-networks-utils",
|
|
68
54
|
"since-latest-release": "../../scripts/since-latest-release.sh",
|
|
69
|
-
"test": "
|
|
55
|
+
"test": "jest --reporters=jest-silent-reporter && yarn coverage:ratchet",
|
|
70
56
|
"coverage:ratchet": "[ -n \"$CI\" ] || jest-it-up",
|
|
71
|
-
"test:clean": "
|
|
72
|
-
"test:verbose": "
|
|
73
|
-
"test:watch": "
|
|
57
|
+
"test:clean": "jest --clearCache",
|
|
58
|
+
"test:verbose": "jest --verbose",
|
|
59
|
+
"test:watch": "jest --watch"
|
|
74
60
|
},
|
|
75
61
|
"dependencies": {
|
|
76
62
|
"@metamask/assets-controller": "^15.0.0",
|
|
63
|
+
"@metamask/base-data-service": "^2.1.0",
|
|
77
64
|
"@metamask/keyring-api": "^24.1.0",
|
|
78
65
|
"@metamask/keyring-internal-api": "^12.0.0",
|
|
79
66
|
"@metamask/remote-feature-flag-controller": "^5.0.0",
|