@metamask-previews/snap-networks-utils 3.0.0-preview-3ca061e → 3.0.0-preview-80f0b922
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 +7 -0
- 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/executeWithFetchPolicy.d.mts +60 -0
- package/dist/utils/fetchPolicy/executeWithFetchPolicy.d.mts.map +1 -0
- package/dist/utils/fetchPolicy/executeWithFetchPolicy.mjs +167 -0
- package/dist/utils/fetchPolicy/executeWithFetchPolicy.mjs.map +1 -0
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -7,6 +7,13 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
7
7
|
|
|
8
8
|
## [Unreleased]
|
|
9
9
|
|
|
10
|
+
### Added
|
|
11
|
+
|
|
12
|
+
- Add `executeWithFetchPolicy` for wrapping transport-only operations in a policy created by `createFetchPolicy`, passing `SyntaxError` and abort errors through unchanged, passing errors already in the policy shape through unchanged, and mapping any other error with an optional mapper (defaulting to a network failure) ([#478](https://github.com/MetaMask/internal-snaps/pull/478))
|
|
13
|
+
- Add `fetchWithPolicy` for the common policy-wrapped HTTP call: a fetch with a 10 second timeout, a status check that throws a `FetchPolicyError` for non-2xx responses (honouring `Retry-After`), and a body read inside the policy ([#478](https://github.com/MetaMask/internal-snaps/pull/478))
|
|
14
|
+
- Add `parseRetryAfter` for parsing a `Retry-After` header value as milliseconds ([#478](https://github.com/MetaMask/internal-snaps/pull/478))
|
|
15
|
+
- Add the `FetchPolicy` type, the minimal policy surface `executeWithFetchPolicy` and `fetchWithPolicy` accept ([#478](https://github.com/MetaMask/internal-snaps/pull/478))
|
|
16
|
+
|
|
10
17
|
## [3.0.0]
|
|
11
18
|
|
|
12
19
|
### Added
|
package/dist/index.d.mts
CHANGED
|
@@ -34,6 +34,8 @@ export { createSnapErrorHandling, createTrackError, createWithCatchAndThrowSnapE
|
|
|
34
34
|
export { InFlightCoalescer } from "./utils/dedupe/InFlightCoalescer.mjs";
|
|
35
35
|
export { BrokenCircuitError, createFetchPolicy, createFetchPolicyError, FetchPolicyErrorName, isTransientError, MAX_RETRY_AFTER_MS, } from "./utils/fetchPolicy/createFetchPolicy.mjs";
|
|
36
36
|
export type { CreateFetchPolicyOptions, FetchPolicyError, } from "./utils/fetchPolicy/createFetchPolicy.mjs";
|
|
37
|
+
export { executeWithFetchPolicy, fetchWithPolicy, parseRetryAfter, } from "./utils/fetchPolicy/executeWithFetchPolicy.mjs";
|
|
38
|
+
export type { FetchPolicy } from "./utils/fetchPolicy/executeWithFetchPolicy.mjs";
|
|
37
39
|
export { ActionHeader } from "./ui/ActionHeader/ActionHeader.mjs";
|
|
38
40
|
export type { ActionHeaderProps } from "./ui/ActionHeader/ActionHeader.mjs";
|
|
39
41
|
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":"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"}
|
|
1
|
+
{"version":3,"file":"index.d.mts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.mjs
CHANGED
|
@@ -24,6 +24,7 @@ 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
26
|
export { BrokenCircuitError, createFetchPolicy, createFetchPolicyError, FetchPolicyErrorName, isTransientError, MAX_RETRY_AFTER_MS } from "./utils/fetchPolicy/createFetchPolicy.mjs";
|
|
27
|
+
export { executeWithFetchPolicy, fetchWithPolicy, parseRetryAfter } from "./utils/fetchPolicy/executeWithFetchPolicy.mjs";
|
|
27
28
|
export { ActionHeader } from "./ui/ActionHeader/ActionHeader.mjs";
|
|
28
29
|
export { Asset, AssetIcon } from "./ui/Asset/Asset.mjs";
|
|
29
30
|
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,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"]}
|
|
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,EACL,sBAAsB,EACtB,eAAe,EACf,eAAe,EAChB,uDAAmD;AAEpD,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 {\n executeWithFetchPolicy,\n fetchWithPolicy,\n parseRetryAfter,\n} from './utils/fetchPolicy/executeWithFetchPolicy';\nexport type { FetchPolicy } from './utils/fetchPolicy/executeWithFetchPolicy';\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,60 @@
|
|
|
1
|
+
import type { ServicePolicy } from "@metamask/base-data-service";
|
|
2
|
+
import type { FetchPolicyError } from "./createFetchPolicy.mjs";
|
|
3
|
+
/**
|
|
4
|
+
* The minimal policy surface `executeWithFetchPolicy` and `fetchWithPolicy`
|
|
5
|
+
* accept: the `execute` method of a policy created by
|
|
6
|
+
* {@link createFetchPolicy}.
|
|
7
|
+
*/
|
|
8
|
+
export type FetchPolicy = Pick<ServicePolicy, 'execute'>;
|
|
9
|
+
/**
|
|
10
|
+
* Parse a `Retry-After` header value as milliseconds.
|
|
11
|
+
*
|
|
12
|
+
* @param value - The header value: a delay in seconds or an HTTP date.
|
|
13
|
+
* @returns The delay in milliseconds, or `undefined` if the value is invalid.
|
|
14
|
+
*/
|
|
15
|
+
export declare const parseRetryAfter: (value: unknown) => number | undefined;
|
|
16
|
+
/**
|
|
17
|
+
* Execute a transport-only operation through a fetch policy, mapping errors to
|
|
18
|
+
* the shape the policy decides on.
|
|
19
|
+
*
|
|
20
|
+
* The operation must contain only transport work: a fetch, a status check and
|
|
21
|
+
* a body read. Parsing and validation belong outside it, so their errors
|
|
22
|
+
* propagate unchanged instead of being counted as failures.
|
|
23
|
+
*
|
|
24
|
+
* - `SyntaxError` and abort errors pass through unchanged: the policy must not
|
|
25
|
+
* retry or count them.
|
|
26
|
+
* - Errors already in the policy shape (with an `httpStatus`, or a network or
|
|
27
|
+
* timeout name) pass through unchanged.
|
|
28
|
+
* - Any other error is mapped with `mapError`, which defaults to treating it
|
|
29
|
+
* as a network failure. The catch-all is intentional: real `fetch` network
|
|
30
|
+
* failures are not recognisable by name or code across runtimes, so they can
|
|
31
|
+
* only be identified by being the residual case.
|
|
32
|
+
*
|
|
33
|
+
* @param policy - The shared fetch policy.
|
|
34
|
+
* @param operation - The transport operation.
|
|
35
|
+
* @param mapError - An optional mapper for unrecognized errors. Use it to
|
|
36
|
+
* extract statuses from protocol-specific error shapes (e.g. axios responses
|
|
37
|
+
* or Solana transport errors).
|
|
38
|
+
* @param signal - Optional caller abort signal. When aborted, skips or
|
|
39
|
+
* interrupts retry backoff immediately without another transport invocation.
|
|
40
|
+
* @returns The operation result.
|
|
41
|
+
*/
|
|
42
|
+
export declare const executeWithFetchPolicy: <Result>(policy: FetchPolicy, operation: () => Promise<Result>, mapError?: (error: unknown) => FetchPolicyError, signal?: AbortSignal | null) => Promise<Result>;
|
|
43
|
+
/**
|
|
44
|
+
* Fetch a URL through a fetch policy, throwing a {@link FetchPolicyError} on a
|
|
45
|
+
* non-2xx response and returning the body as text.
|
|
46
|
+
*
|
|
47
|
+
* This is the common shape of every policy-wrapped HTTP call in the snaps: a
|
|
48
|
+
* fetch with a timeout, a status check that turns a non-2xx response into a
|
|
49
|
+
* policy error (honouring `Retry-After`), and a body read inside the policy so
|
|
50
|
+
* a truncated response is retried too.
|
|
51
|
+
*
|
|
52
|
+
* @param policy - The shared fetch policy.
|
|
53
|
+
* @param url - The URL to fetch.
|
|
54
|
+
* @param init - Optional fetch options. A caller-provided `signal` replaces
|
|
55
|
+
* the default timeout signal.
|
|
56
|
+
* @param fetchImpl - The fetch implementation, defaulting to `globalThis.fetch`.
|
|
57
|
+
* @returns The response body as text.
|
|
58
|
+
*/
|
|
59
|
+
export declare const fetchWithPolicy: (policy: FetchPolicy, url: string, init?: RequestInit, fetchImpl?: typeof globalThis.fetch) => Promise<string>;
|
|
60
|
+
//# sourceMappingURL=executeWithFetchPolicy.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"executeWithFetchPolicy.d.mts","sourceRoot":"","sources":["../../../src/utils/fetchPolicy/executeWithFetchPolicy.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,oCAAoC;AAEjE,OAAO,KAAK,EAAE,gBAAgB,EAAE,gCAA4B;AAM5D;;;;GAIG;AACH,MAAM,MAAM,WAAW,GAAG,IAAI,CAAC,aAAa,EAAE,SAAS,CAAC,CAAC;AAOzD;;;;;GAKG;AACH,eAAO,MAAM,eAAe,GAAI,OAAO,OAAO,KAAG,MAAM,GAAG,SAYzD,CAAC;AA0DF;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,eAAO,MAAM,sBAAsB,GAAU,MAAM,EACjD,QAAQ,WAAW,EACnB,WAAW,MAAM,OAAO,CAAC,MAAM,CAAC,EAChC,WAAU,CAAC,KAAK,EAAE,OAAO,KAAK,gBAAiC,EAC/D,SAAS,WAAW,GAAG,IAAI,KAC1B,OAAO,CAAC,MAAM,CAyChB,CAAC;AAEF;;;;;;;;;;;;;;;GAeG;AACH,eAAO,MAAM,eAAe,GAC1B,QAAQ,WAAW,EACnB,KAAK,MAAM,EACX,OAAO,WAAW,EAClB,YAAW,OAAO,UAAU,CAAC,KAAwB,KACpD,OAAO,CAAC,MAAM,CAoBhB,CAAC"}
|
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
import { createFetchPolicyError, FetchPolicyErrorName } from "./createFetchPolicy.mjs";
|
|
2
|
+
/**
|
|
3
|
+
* The default timeout for a `fetchWithPolicy` request, in milliseconds.
|
|
4
|
+
*/
|
|
5
|
+
const DEFAULT_TIMEOUT_MS = 10_000;
|
|
6
|
+
/**
|
|
7
|
+
* Parse a `Retry-After` header value as milliseconds.
|
|
8
|
+
*
|
|
9
|
+
* @param value - The header value: a delay in seconds or an HTTP date.
|
|
10
|
+
* @returns The delay in milliseconds, or `undefined` if the value is invalid.
|
|
11
|
+
*/
|
|
12
|
+
export const parseRetryAfter = (value) => {
|
|
13
|
+
if (typeof value !== 'string') {
|
|
14
|
+
return undefined;
|
|
15
|
+
}
|
|
16
|
+
const seconds = Number(value);
|
|
17
|
+
if (Number.isFinite(seconds) && seconds >= 0) {
|
|
18
|
+
return seconds * 1000;
|
|
19
|
+
}
|
|
20
|
+
const date = Date.parse(value);
|
|
21
|
+
return Number.isNaN(date) ? undefined : Math.max(0, date - Date.now());
|
|
22
|
+
};
|
|
23
|
+
/**
|
|
24
|
+
* Convert an unrecognized error to a network failure.
|
|
25
|
+
*
|
|
26
|
+
* @param error - The upstream error.
|
|
27
|
+
* @returns The error in the policy shape.
|
|
28
|
+
*/
|
|
29
|
+
const toNetworkError = (error) => error instanceof Error
|
|
30
|
+
? createFetchPolicyError(error.message, {
|
|
31
|
+
name: FetchPolicyErrorName.Network,
|
|
32
|
+
cause: error,
|
|
33
|
+
})
|
|
34
|
+
: createFetchPolicyError('Network request failed', {
|
|
35
|
+
name: FetchPolicyErrorName.Network,
|
|
36
|
+
cause: error,
|
|
37
|
+
});
|
|
38
|
+
const createAbortError = () => Object.assign(new Error('The operation was aborted.'), {
|
|
39
|
+
name: 'AbortError',
|
|
40
|
+
});
|
|
41
|
+
/**
|
|
42
|
+
* Race a promise against an abort signal so caller cancellation interrupts
|
|
43
|
+
* retry backoff waits without waiting for the timer to expire.
|
|
44
|
+
*
|
|
45
|
+
* @param promise - The operation promise.
|
|
46
|
+
* @param signal - Optional abort signal from the caller.
|
|
47
|
+
* @returns The operation result, or rejects with the abort reason.
|
|
48
|
+
*/
|
|
49
|
+
const raceWithSignal = async (promise, signal) => {
|
|
50
|
+
if (!signal) {
|
|
51
|
+
return promise;
|
|
52
|
+
}
|
|
53
|
+
let onAbort;
|
|
54
|
+
const abortPromise = new Promise((_resolve, reject) => {
|
|
55
|
+
onAbort = () => {
|
|
56
|
+
reject(createAbortError());
|
|
57
|
+
};
|
|
58
|
+
signal.addEventListener('abort', onAbort, { once: true });
|
|
59
|
+
if (signal.aborted) {
|
|
60
|
+
onAbort();
|
|
61
|
+
}
|
|
62
|
+
});
|
|
63
|
+
// Suppress unhandled rejection if `promise` settles after `abortPromise` wins.
|
|
64
|
+
promise.catch(() => undefined);
|
|
65
|
+
try {
|
|
66
|
+
return await Promise.race([promise, abortPromise]);
|
|
67
|
+
}
|
|
68
|
+
finally {
|
|
69
|
+
signal.removeEventListener('abort', onAbort);
|
|
70
|
+
}
|
|
71
|
+
};
|
|
72
|
+
/**
|
|
73
|
+
* Execute a transport-only operation through a fetch policy, mapping errors to
|
|
74
|
+
* the shape the policy decides on.
|
|
75
|
+
*
|
|
76
|
+
* The operation must contain only transport work: a fetch, a status check and
|
|
77
|
+
* a body read. Parsing and validation belong outside it, so their errors
|
|
78
|
+
* propagate unchanged instead of being counted as failures.
|
|
79
|
+
*
|
|
80
|
+
* - `SyntaxError` and abort errors pass through unchanged: the policy must not
|
|
81
|
+
* retry or count them.
|
|
82
|
+
* - Errors already in the policy shape (with an `httpStatus`, or a network or
|
|
83
|
+
* timeout name) pass through unchanged.
|
|
84
|
+
* - Any other error is mapped with `mapError`, which defaults to treating it
|
|
85
|
+
* as a network failure. The catch-all is intentional: real `fetch` network
|
|
86
|
+
* failures are not recognisable by name or code across runtimes, so they can
|
|
87
|
+
* only be identified by being the residual case.
|
|
88
|
+
*
|
|
89
|
+
* @param policy - The shared fetch policy.
|
|
90
|
+
* @param operation - The transport operation.
|
|
91
|
+
* @param mapError - An optional mapper for unrecognized errors. Use it to
|
|
92
|
+
* extract statuses from protocol-specific error shapes (e.g. axios responses
|
|
93
|
+
* or Solana transport errors).
|
|
94
|
+
* @param signal - Optional caller abort signal. When aborted, skips or
|
|
95
|
+
* interrupts retry backoff immediately without another transport invocation.
|
|
96
|
+
* @returns The operation result.
|
|
97
|
+
*/
|
|
98
|
+
export const executeWithFetchPolicy = async (policy, operation, mapError = toNetworkError, signal) => {
|
|
99
|
+
if (signal?.aborted) {
|
|
100
|
+
throw signal.reason ?? createAbortError();
|
|
101
|
+
}
|
|
102
|
+
try {
|
|
103
|
+
return await raceWithSignal(policy.execute(async () => {
|
|
104
|
+
if (signal?.aborted) {
|
|
105
|
+
throw createAbortError();
|
|
106
|
+
}
|
|
107
|
+
try {
|
|
108
|
+
return await operation();
|
|
109
|
+
}
|
|
110
|
+
catch (error) {
|
|
111
|
+
if (signal?.aborted) {
|
|
112
|
+
throw createAbortError();
|
|
113
|
+
}
|
|
114
|
+
if (error instanceof SyntaxError ||
|
|
115
|
+
error?.name === 'AbortError') {
|
|
116
|
+
throw error;
|
|
117
|
+
}
|
|
118
|
+
if (error instanceof Error &&
|
|
119
|
+
(error.httpStatus !== undefined ||
|
|
120
|
+
error.name === FetchPolicyErrorName.Network ||
|
|
121
|
+
error.name === FetchPolicyErrorName.Timeout)) {
|
|
122
|
+
throw error;
|
|
123
|
+
}
|
|
124
|
+
throw mapError(error);
|
|
125
|
+
}
|
|
126
|
+
}, signal ?? undefined), signal ?? undefined);
|
|
127
|
+
}
|
|
128
|
+
catch (error) {
|
|
129
|
+
if (signal?.aborted) {
|
|
130
|
+
throw signal.reason ?? error;
|
|
131
|
+
}
|
|
132
|
+
throw error;
|
|
133
|
+
}
|
|
134
|
+
};
|
|
135
|
+
/**
|
|
136
|
+
* Fetch a URL through a fetch policy, throwing a {@link FetchPolicyError} on a
|
|
137
|
+
* non-2xx response and returning the body as text.
|
|
138
|
+
*
|
|
139
|
+
* This is the common shape of every policy-wrapped HTTP call in the snaps: a
|
|
140
|
+
* fetch with a timeout, a status check that turns a non-2xx response into a
|
|
141
|
+
* policy error (honouring `Retry-After`), and a body read inside the policy so
|
|
142
|
+
* a truncated response is retried too.
|
|
143
|
+
*
|
|
144
|
+
* @param policy - The shared fetch policy.
|
|
145
|
+
* @param url - The URL to fetch.
|
|
146
|
+
* @param init - Optional fetch options. A caller-provided `signal` replaces
|
|
147
|
+
* the default timeout signal.
|
|
148
|
+
* @param fetchImpl - The fetch implementation, defaulting to `globalThis.fetch`.
|
|
149
|
+
* @returns The response body as text.
|
|
150
|
+
*/
|
|
151
|
+
export const fetchWithPolicy = async (policy, url, init, fetchImpl = globalThis.fetch) => {
|
|
152
|
+
const callerSignal = init?.signal;
|
|
153
|
+
return executeWithFetchPolicy(policy, async () => {
|
|
154
|
+
const response = await fetchImpl(url, {
|
|
155
|
+
...init,
|
|
156
|
+
signal: callerSignal ?? AbortSignal.timeout(DEFAULT_TIMEOUT_MS),
|
|
157
|
+
});
|
|
158
|
+
if (!response.ok) {
|
|
159
|
+
throw createFetchPolicyError(`HTTP error! status: ${response.status}`, {
|
|
160
|
+
httpStatus: response.status,
|
|
161
|
+
retryAfterMs: parseRetryAfter(response.headers?.get('Retry-After')),
|
|
162
|
+
});
|
|
163
|
+
}
|
|
164
|
+
return response.text();
|
|
165
|
+
}, toNetworkError, callerSignal);
|
|
166
|
+
};
|
|
167
|
+
//# sourceMappingURL=executeWithFetchPolicy.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"executeWithFetchPolicy.mjs","sourceRoot":"","sources":["../../../src/utils/fetchPolicy/executeWithFetchPolicy.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ServicePolicy } from '@metamask/base-data-service';\n\nimport type { FetchPolicyError } from './createFetchPolicy';\nimport {\n createFetchPolicyError,\n FetchPolicyErrorName,\n} from './createFetchPolicy';\n\n/**\n * The minimal policy surface `executeWithFetchPolicy` and `fetchWithPolicy`\n * accept: the `execute` method of a policy created by\n * {@link createFetchPolicy}.\n */\nexport type FetchPolicy = Pick<ServicePolicy, 'execute'>;\n\n/**\n * The default timeout for a `fetchWithPolicy` request, in milliseconds.\n */\nconst DEFAULT_TIMEOUT_MS = 10_000;\n\n/**\n * Parse a `Retry-After` header value as milliseconds.\n *\n * @param value - The header value: a delay in seconds or an HTTP date.\n * @returns The delay in milliseconds, or `undefined` if the value is invalid.\n */\nexport const parseRetryAfter = (value: unknown): number | undefined => {\n if (typeof value !== 'string') {\n return undefined;\n }\n\n const seconds = Number(value);\n if (Number.isFinite(seconds) && seconds >= 0) {\n return seconds * 1000;\n }\n\n const date = Date.parse(value);\n return Number.isNaN(date) ? undefined : Math.max(0, date - Date.now());\n};\n\n/**\n * Convert an unrecognized error to a network failure.\n *\n * @param error - The upstream error.\n * @returns The error in the policy shape.\n */\nconst toNetworkError = (error: unknown): FetchPolicyError =>\n error instanceof Error\n ? createFetchPolicyError(error.message, {\n name: FetchPolicyErrorName.Network,\n cause: error,\n })\n : createFetchPolicyError('Network request failed', {\n name: FetchPolicyErrorName.Network,\n cause: error,\n });\n\nconst createAbortError = (): Error =>\n Object.assign(new Error('The operation was aborted.'), {\n name: 'AbortError',\n });\n\n/**\n * Race a promise against an abort signal so caller cancellation interrupts\n * retry backoff waits without waiting for the timer to expire.\n *\n * @param promise - The operation promise.\n * @param signal - Optional abort signal from the caller.\n * @returns The operation result, or rejects with the abort reason.\n */\nconst raceWithSignal = async <Result>(\n promise: Promise<Result>,\n signal: AbortSignal | undefined,\n): Promise<Result> => {\n if (!signal) {\n return promise;\n }\n let onAbort!: () => void;\n const abortPromise = new Promise<never>((_resolve, reject) => {\n onAbort = (): void => {\n reject(createAbortError());\n };\n signal.addEventListener('abort', onAbort, { once: true });\n if (signal.aborted) {\n onAbort();\n }\n });\n // Suppress unhandled rejection if `promise` settles after `abortPromise` wins.\n promise.catch(() => undefined);\n try {\n return await Promise.race([promise, abortPromise]);\n } finally {\n signal.removeEventListener('abort', onAbort);\n }\n};\n\n/**\n * Execute a transport-only operation through a fetch policy, mapping errors to\n * the shape the policy decides on.\n *\n * The operation must contain only transport work: a fetch, a status check and\n * a body read. Parsing and validation belong outside it, so their errors\n * propagate unchanged instead of being counted as failures.\n *\n * - `SyntaxError` and abort errors pass through unchanged: the policy must not\n * retry or count them.\n * - Errors already in the policy shape (with an `httpStatus`, or a network or\n * timeout name) pass through unchanged.\n * - Any other error is mapped with `mapError`, which defaults to treating it\n * as a network failure. The catch-all is intentional: real `fetch` network\n * failures are not recognisable by name or code across runtimes, so they can\n * only be identified by being the residual case.\n *\n * @param policy - The shared fetch policy.\n * @param operation - The transport operation.\n * @param mapError - An optional mapper for unrecognized errors. Use it to\n * extract statuses from protocol-specific error shapes (e.g. axios responses\n * or Solana transport errors).\n * @param signal - Optional caller abort signal. When aborted, skips or\n * interrupts retry backoff immediately without another transport invocation.\n * @returns The operation result.\n */\nexport const executeWithFetchPolicy = async <Result>(\n policy: FetchPolicy,\n operation: () => Promise<Result>,\n mapError: (error: unknown) => FetchPolicyError = toNetworkError,\n signal?: AbortSignal | null,\n): Promise<Result> => {\n if (signal?.aborted) {\n throw signal.reason ?? createAbortError();\n }\n try {\n return await raceWithSignal(\n policy.execute(async () => {\n if (signal?.aborted) {\n throw createAbortError();\n }\n try {\n return await operation();\n } catch (error) {\n if (signal?.aborted) {\n throw createAbortError();\n }\n if (\n error instanceof SyntaxError ||\n (error as { name?: unknown } | undefined)?.name === 'AbortError'\n ) {\n throw error;\n }\n if (\n error instanceof Error &&\n ((error as FetchPolicyError).httpStatus !== undefined ||\n error.name === FetchPolicyErrorName.Network ||\n error.name === FetchPolicyErrorName.Timeout)\n ) {\n throw error;\n }\n throw mapError(error);\n }\n }, signal ?? undefined),\n signal ?? undefined,\n );\n } catch (error) {\n if (signal?.aborted) {\n throw signal.reason ?? error;\n }\n throw error;\n }\n};\n\n/**\n * Fetch a URL through a fetch policy, throwing a {@link FetchPolicyError} on a\n * non-2xx response and returning the body as text.\n *\n * This is the common shape of every policy-wrapped HTTP call in the snaps: a\n * fetch with a timeout, a status check that turns a non-2xx response into a\n * policy error (honouring `Retry-After`), and a body read inside the policy so\n * a truncated response is retried too.\n *\n * @param policy - The shared fetch policy.\n * @param url - The URL to fetch.\n * @param init - Optional fetch options. A caller-provided `signal` replaces\n * the default timeout signal.\n * @param fetchImpl - The fetch implementation, defaulting to `globalThis.fetch`.\n * @returns The response body as text.\n */\nexport const fetchWithPolicy = async (\n policy: FetchPolicy,\n url: string,\n init?: RequestInit,\n fetchImpl: typeof globalThis.fetch = globalThis.fetch,\n): Promise<string> => {\n const callerSignal = init?.signal;\n return executeWithFetchPolicy(\n policy,\n async () => {\n const response = await fetchImpl(url, {\n ...init,\n signal: callerSignal ?? AbortSignal.timeout(DEFAULT_TIMEOUT_MS),\n });\n if (!response.ok) {\n throw createFetchPolicyError(`HTTP error! status: ${response.status}`, {\n httpStatus: response.status,\n retryAfterMs: parseRetryAfter(response.headers?.get('Retry-After')),\n });\n }\n return response.text();\n },\n toNetworkError,\n callerSignal,\n );\n};\n"]}
|