@metamask-previews/shield-controller 6.0.0-preview-c2ef75d18 → 6.0.0-preview-e81fe8853
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
CHANGED
|
@@ -10,6 +10,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
10
10
|
### Changed
|
|
11
11
|
|
|
12
12
|
- Bump `@metamask/transaction-controller` from `^69.5.1` to `^69.5.2` ([#9823](https://github.com/MetaMask/core/pull/9823))
|
|
13
|
+
- Bump `@tanstack/query-core` from `^4.43.0` to `^5.62.16` ([#9712](https://github.com/MetaMask/core/pull/9712))
|
|
13
14
|
|
|
14
15
|
## [6.0.0]
|
|
15
16
|
|
|
@@ -148,7 +148,7 @@ class ShieldApiService extends base_data_service_1.BaseDataService {
|
|
|
148
148
|
req.status,
|
|
149
149
|
],
|
|
150
150
|
staleTime: 0,
|
|
151
|
-
|
|
151
|
+
gcTime: 0,
|
|
152
152
|
queryFn: async () => {
|
|
153
153
|
const res = await __classPrivateFieldGet(this, _ShieldApiService_fetch, "f").call(this, `${__classPrivateFieldGet(this, _ShieldApiService_baseUrl, "f")}/v1/signature/coverage/log`, {
|
|
154
154
|
method: 'POST',
|
|
@@ -192,7 +192,7 @@ class ShieldApiService extends base_data_service_1.BaseDataService {
|
|
|
192
192
|
req.status,
|
|
193
193
|
],
|
|
194
194
|
staleTime: 0,
|
|
195
|
-
|
|
195
|
+
gcTime: 0,
|
|
196
196
|
queryFn: async () => {
|
|
197
197
|
const res = await __classPrivateFieldGet(this, _ShieldApiService_fetch, "f").call(this, `${__classPrivateFieldGet(this, _ShieldApiService_baseUrl, "f")}/v1/transaction/coverage/log`, {
|
|
198
198
|
method: 'POST',
|
|
@@ -220,7 +220,7 @@ _ShieldApiService_baseUrl = new WeakMap(), _ShieldApiService_fetch = new WeakMap
|
|
|
220
220
|
return await this.fetchQuery({
|
|
221
221
|
queryKey: [`${this.name}:initCoverageCheck`, path, requestId],
|
|
222
222
|
staleTime: 0,
|
|
223
|
-
|
|
223
|
+
gcTime: 0,
|
|
224
224
|
queryFn: async () => {
|
|
225
225
|
const res = await __classPrivateFieldGet(this, _ShieldApiService_fetch, "f").call(this, `${__classPrivateFieldGet(this, _ShieldApiService_baseUrl, "f")}/${path}`, {
|
|
226
226
|
method: 'POST',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shield-api-service.cjs","sourceRoot":"","sources":["../src/shield-api-service.ts"],"names":[],"mappings":"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","sourcesContent":["import { BaseDataService } from '@metamask/base-data-service';\nimport type {\n DataServiceCacheUpdatedEvent,\n DataServiceGranularCacheUpdatedEvent,\n DataServiceInvalidateQueriesAction,\n} from '@metamask/base-data-service';\nimport type { CreateServicePolicyOptions } from '@metamask/controller-utils';\nimport {\n ConstantBackoff,\n DEFAULT_MAX_RETRIES,\n HttpError,\n} from '@metamask/controller-utils';\nimport type { Messenger } from '@metamask/messenger';\nimport type { AuthenticationController } from '@metamask/profile-sync-controller';\nimport {\n EthMethod,\n SignatureRequestType,\n} from '@metamask/signature-controller';\nimport type { SignatureRequest } from '@metamask/signature-controller';\nimport type { TransactionMeta } from '@metamask/transaction-controller';\nimport type { AuthorizationList } from '@metamask/transaction-controller';\nimport type { Json } from '@metamask/utils';\nimport type { QueryClientConfig } from '@tanstack/query-core';\n\nimport { Env, getShieldApiBaseUrl, SignTypedDataVersion } from './constants.js';\nimport { PollingWithCockatielPolicy } from './polling-with-policy.js';\nimport type { ShieldApiServiceMethodActions } from './shield-api-service-method-action-types.js';\nimport type {\n CheckCoverageRequest,\n CheckSignatureCoverageRequest,\n CoverageResult,\n CoverageStatus,\n LogSignatureRequest,\n LogTransactionRequest,\n} from './types.js';\n\nexport type InitCoverageCheckRequest = {\n txParams: [\n {\n authorizationList?: AuthorizationList;\n from: string;\n to?: string;\n value?: string;\n data?: string;\n nonce?: string;\n },\n ];\n chainId: string;\n origin?: string;\n};\n\nexport type InitSignatureCoverageCheckRequest = {\n chainId: string;\n data: Json;\n from: string;\n method: string;\n origin?: string;\n};\n\nexport type InitCoverageCheckResponse = {\n coverageId: string;\n};\n\nexport type GetCoverageResultRequest = {\n coverageId: string;\n};\n\nexport type GetCoverageResultResponse = {\n message?: string;\n reasonCode?: string;\n status: CoverageStatus;\n metrics: {\n latency?: number;\n };\n};\n\n/**\n * The name of the {@link ShieldApiService}, used to namespace the service's\n * actions and events.\n */\nexport const serviceName = 'ShieldApiService';\n\nconst MESSENGER_EXPOSED_METHODS = [\n 'checkCoverage',\n 'checkSignatureCoverage',\n 'logSignature',\n 'logTransaction',\n] as const;\n\nconst DEFAULT_POLICY_OPTIONS: CreateServicePolicyOptions = {\n maxRetries: 0,\n};\n\n/**\n * Invalidates cached queries for {@link ShieldApiService}.\n */\nexport type ShieldApiServiceInvalidateQueriesAction =\n DataServiceInvalidateQueriesAction<typeof serviceName>;\n\n/**\n * Actions that {@link ShieldApiService} exposes to other consumers.\n */\nexport type ShieldApiServiceActions =\n | ShieldApiServiceMethodActions\n | ShieldApiServiceInvalidateQueriesAction;\n\n/**\n * Actions from other messengers that {@link ShieldApiService} calls.\n */\ntype AllowedActions =\n AuthenticationController.AuthenticationControllerGetBearerTokenAction;\n\n/**\n * Published when {@link ShieldApiService}'s cache is updated.\n */\nexport type ShieldApiServiceCacheUpdatedEvent = DataServiceCacheUpdatedEvent<\n typeof serviceName\n>;\n\n/**\n * Published when a key within {@link ShieldApiService}'s cache is updated.\n */\nexport type ShieldApiServiceGranularCacheUpdatedEvent =\n DataServiceGranularCacheUpdatedEvent<typeof serviceName>;\n\n/**\n * Events that {@link ShieldApiService} exposes to other consumers.\n */\nexport type ShieldApiServiceEvents =\n | ShieldApiServiceCacheUpdatedEvent\n | ShieldApiServiceGranularCacheUpdatedEvent;\n\n/**\n * Events from other messengers that {@link ShieldApiService} subscribes to.\n */\ntype AllowedEvents = never;\n\n/**\n * The messenger which is restricted to actions and events accessed by\n * {@link ShieldApiService}.\n */\nexport type ShieldApiServiceMessenger = Messenger<\n typeof serviceName,\n ShieldApiServiceActions | AllowedActions,\n ShieldApiServiceEvents | AllowedEvents\n>;\n\n/**\n * This service is responsible for communicating with the Shield API.\n *\n * All requests are authenticated via JWT Bearer tokens obtained from the\n * `AuthenticationController:getBearerToken` messenger action.\n */\nexport class ShieldApiService extends BaseDataService<\n typeof serviceName,\n ShieldApiServiceMessenger\n> {\n readonly #baseUrl: string;\n\n readonly #fetch: typeof globalThis.fetch;\n\n readonly #pollingPolicy: PollingWithCockatielPolicy;\n\n readonly #captureException?: (error: Error) => void;\n\n /**\n * Constructs a new ShieldApiService.\n *\n * @param args - The constructor arguments.\n * @param args.messenger - The messenger suited for this service.\n * @param args.env - The environment used to resolve the Shield API URL.\n * @param args.fetch - The fetch implementation. Defaults to `globalThis.fetch`.\n * @param args.captureException - Optional error reporter.\n * @param args.getCoverageResultTimeout - Timeout for coverage result polling.\n * @param args.getCoverageResultPollInterval - Poll interval for coverage results.\n * @param args.queryClientConfig - Configuration for the underlying TanStack\n * Query client.\n * @param args.policyOptions - Options to pass to `createServicePolicy`.\n */\n constructor({\n messenger,\n env,\n fetch: fetchFn = globalThis.fetch,\n captureException: captureExceptionFn,\n getCoverageResultTimeout = 5000,\n getCoverageResultPollInterval = 1000,\n queryClientConfig = {},\n policyOptions = {},\n }: {\n messenger: ShieldApiServiceMessenger;\n env: Env;\n /**\n * The `fetch` function to use for requests. Defaults to the global `fetch`.\n */\n fetch?: typeof globalThis.fetch;\n captureException?: (error: Error) => void;\n getCoverageResultTimeout?: number;\n getCoverageResultPollInterval?: number;\n queryClientConfig?: QueryClientConfig;\n policyOptions?: CreateServicePolicyOptions;\n }) {\n super({\n name: serviceName,\n messenger,\n queryClientConfig,\n policyOptions: { ...DEFAULT_POLICY_OPTIONS, ...policyOptions },\n });\n\n this.#baseUrl = getShieldApiBaseUrl(env);\n this.#fetch = fetchFn;\n\n const { backoff, maxRetries } = computePollingIntervalAndRetryCount(\n getCoverageResultTimeout,\n getCoverageResultPollInterval,\n );\n\n this.#pollingPolicy = new PollingWithCockatielPolicy({\n backoff,\n maxRetries,\n });\n\n this.#captureException = (error: Error): void => {\n try {\n captureExceptionFn?.(error);\n } catch {\n // ignore error thrown when calling captureException\n }\n };\n\n this.messenger.registerMethodActionHandlers(\n this,\n MESSENGER_EXPOSED_METHODS,\n );\n }\n\n /**\n * Checks the coverage of a transaction.\n *\n * @param req - The coverage check request.\n * @returns The coverage result.\n */\n async checkCoverage(req: CheckCoverageRequest): Promise<CoverageResult> {\n let { coverageId } = req;\n if (!coverageId) {\n const reqBody = makeInitCoverageCheckBody(req.txMeta);\n ({ coverageId } = await this.#initCoverageCheck(\n 'v1/transaction/coverage/init',\n reqBody,\n req.txMeta.id,\n ));\n }\n\n const txCoverageResultUrl = `${this.#baseUrl}/v1/transaction/coverage/result`;\n const coverageResult = await this.#getCoverageResult(\n req.txMeta.id,\n coverageId,\n txCoverageResultUrl,\n );\n return {\n coverageId,\n message: coverageResult.message,\n reasonCode: coverageResult.reasonCode,\n status: coverageResult.status,\n metrics: coverageResult.metrics,\n };\n }\n\n /**\n * Checks the coverage of a signature request.\n *\n * @param req - The signature coverage check request.\n * @returns The coverage result.\n */\n async checkSignatureCoverage(\n req: CheckSignatureCoverageRequest,\n ): Promise<CoverageResult> {\n let { coverageId } = req;\n if (!coverageId) {\n const reqBody = makeInitSignatureCoverageCheckBody(req.signatureRequest);\n ({ coverageId } = await this.#initCoverageCheck(\n 'v1/signature/coverage/init',\n reqBody,\n req.signatureRequest.id,\n ));\n }\n\n const signatureCoverageResultUrl = `${this.#baseUrl}/v1/signature/coverage/result`;\n const coverageResult = await this.#getCoverageResult(\n req.signatureRequest.id,\n coverageId,\n signatureCoverageResultUrl,\n );\n return {\n coverageId,\n message: coverageResult.message,\n reasonCode: coverageResult.reasonCode,\n status: coverageResult.status,\n metrics: coverageResult.metrics,\n };\n }\n\n /**\n * Logs a signed signature request.\n *\n * @param req - The log signature request.\n */\n async logSignature(req: LogSignatureRequest): Promise<void> {\n try {\n const initBody = makeInitSignatureCoverageCheckBody(req.signatureRequest);\n const body = {\n signature: req.signature,\n status: req.status,\n ...initBody,\n };\n\n this.#pollingPolicy.abortPendingRequest(req.signatureRequest.id);\n\n const headers = await this.#authHeaders();\n\n await this.fetchQuery({\n queryKey: [\n `${this.name}:logSignature`,\n req.signatureRequest.id,\n req.status,\n ],\n staleTime: 0,\n cacheTime: 0,\n queryFn: async () => {\n const res = await this.#fetch(\n `${this.#baseUrl}/v1/signature/coverage/log`,\n {\n method: 'POST',\n headers,\n body: JSON.stringify(body),\n },\n );\n if (res.status !== 200) {\n throw new HttpError(\n res.status,\n `Failed to log signature: ${res.status}`,\n );\n }\n return null;\n },\n });\n } catch (error) {\n const sentryError = createSentryError(\n 'Failed to log signature',\n error as Error,\n );\n this.#captureException?.(sentryError);\n throw error;\n }\n }\n\n /**\n * Logs a submitted transaction.\n *\n * @param req - The log transaction request.\n */\n async logTransaction(req: LogTransactionRequest): Promise<void> {\n try {\n const initBody = makeInitCoverageCheckBody(req.txMeta);\n const body = {\n transactionHash: req.transactionHash,\n rawTransactionHex: req.rawTransactionHex,\n status: req.status,\n ...initBody,\n };\n\n this.#pollingPolicy.abortPendingRequest(req.txMeta.id);\n\n const headers = await this.#authHeaders();\n\n await this.fetchQuery({\n queryKey: [\n `${this.name}:logTransaction`,\n req.txMeta.id,\n req.transactionHash,\n req.status,\n ],\n staleTime: 0,\n cacheTime: 0,\n queryFn: async () => {\n const res = await this.#fetch(\n `${this.#baseUrl}/v1/transaction/coverage/log`,\n {\n method: 'POST',\n headers,\n body: JSON.stringify(body),\n },\n );\n if (res.status !== 200) {\n throw new HttpError(\n res.status,\n `Failed to log transaction: ${res.status}`,\n );\n }\n return null;\n },\n });\n } catch (error) {\n const sentryError = createSentryError(\n 'Failed to log transaction',\n error as Error,\n );\n this.#captureException?.(sentryError);\n throw error;\n }\n }\n\n async #initCoverageCheck(\n path: string,\n reqBody: unknown,\n requestId: string,\n ): Promise<InitCoverageCheckResponse> {\n try {\n const headers = await this.#authHeaders();\n\n return await this.fetchQuery({\n queryKey: [`${this.name}:initCoverageCheck`, path, requestId],\n staleTime: 0,\n cacheTime: 0,\n queryFn: async () => {\n const res = await this.#fetch(`${this.#baseUrl}/${path}`, {\n method: 'POST',\n headers,\n body: JSON.stringify(reqBody),\n });\n if (res.status !== 200) {\n throw new HttpError(\n res.status,\n `Failed to init coverage check: ${res.status}`,\n );\n }\n return (await res.json()) as InitCoverageCheckResponse;\n },\n });\n } catch (error) {\n const sentryError = createSentryError(\n 'Failed to init coverage check',\n error as Error,\n );\n this.#captureException?.(sentryError);\n throw error;\n }\n }\n\n async #getCoverageResult(\n requestId: string,\n coverageId: string,\n coverageResultUrl: string,\n ): Promise<GetCoverageResultResponse> {\n const reqBody: GetCoverageResultRequest = {\n coverageId,\n };\n\n const headers = await this.#authHeaders();\n const startTime = Date.now();\n\n const getCoverageResultFn = async (\n signal: AbortSignal,\n ): Promise<Omit<GetCoverageResultResponse, 'metrics'>> => {\n const res = await this.#fetch(coverageResultUrl, {\n method: 'POST',\n headers,\n body: JSON.stringify(reqBody),\n signal,\n });\n\n if (res.status === 200) {\n return (await res.json()) as Omit<GetCoverageResultResponse, 'metrics'>;\n }\n\n let errorMessage = 'Timeout waiting for coverage result';\n try {\n const errorJson = (await res.json()) as {\n message?: string;\n status?: string;\n };\n errorMessage = `Failed to get coverage result: ${errorJson.message ?? errorJson.status}`;\n } catch {\n errorMessage = `Failed to get coverage result: ${res.status}`;\n }\n throw new HttpError(res.status, errorMessage);\n };\n\n const result = await this.#pollingPolicy.start(\n requestId,\n getCoverageResultFn,\n );\n\n const totalLatency = Date.now() - startTime;\n\n return {\n ...result,\n metrics: { latency: totalLatency },\n } as GetCoverageResultResponse;\n }\n\n async #authHeaders(): Promise<Record<string, string>> {\n const token = await this.messenger.call(\n 'AuthenticationController:getBearerToken',\n );\n return {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${token}`,\n };\n }\n}\n\n/**\n * Make the body for the init coverage check request.\n *\n * @param txMeta - The transaction metadata.\n * @returns The body for the init coverage check request.\n */\nexport function makeInitCoverageCheckBody(\n txMeta: TransactionMeta,\n): InitCoverageCheckRequest {\n return {\n txParams: [\n {\n authorizationList: txMeta.txParams.authorizationList,\n from: txMeta.txParams.from,\n to: txMeta.txParams.to,\n value: txMeta.txParams.value,\n data: txMeta.txParams.data,\n nonce: txMeta.txParams.nonce,\n },\n ],\n chainId: txMeta.chainId,\n origin: txMeta.origin,\n };\n}\n\n/**\n * Make the body for the init signature coverage check request.\n *\n * @param signatureRequest - The signature request.\n * @returns The body for the init signature coverage check request.\n */\nfunction makeInitSignatureCoverageCheckBody(\n signatureRequest: SignatureRequest,\n): InitSignatureCoverageCheckRequest {\n const method = parseSignatureRequestMethod(signatureRequest);\n\n return {\n chainId: signatureRequest.chainId,\n data: signatureRequest.messageParams.data,\n from: signatureRequest.messageParams.from,\n method,\n origin: signatureRequest.messageParams.origin,\n };\n}\n\n/**\n * Parse the JSON-RPC method from the signature request.\n *\n * @param signatureRequest - The signature request.\n * @returns The JSON-RPC method.\n */\nexport function parseSignatureRequestMethod(\n signatureRequest: SignatureRequest,\n): string {\n if (signatureRequest.type === SignatureRequestType.TypedSign) {\n switch (signatureRequest.version) {\n case SignTypedDataVersion.V3:\n return EthMethod.SignTypedDataV3;\n case SignTypedDataVersion.V4:\n return EthMethod.SignTypedDataV4;\n case SignTypedDataVersion.V1:\n default:\n return SignatureRequestType.TypedSign;\n }\n }\n\n return signatureRequest.type;\n}\n\n/**\n * Compute the polling interval and retry count for the Cockatiel policy based on the timeout and poll interval given.\n *\n * @param timeout - The timeout in milliseconds.\n * @param pollInterval - The poll interval in milliseconds.\n * @returns The polling interval and retry count.\n */\nfunction computePollingIntervalAndRetryCount(\n timeout: number,\n pollInterval: number,\n): { backoff: ConstantBackoff; maxRetries: number } {\n const backoff = new ConstantBackoff(pollInterval);\n const computedMaxRetries = Math.floor(timeout / pollInterval) + 1;\n\n const maxRetries =\n isNaN(computedMaxRetries) || !isFinite(computedMaxRetries)\n ? DEFAULT_MAX_RETRIES\n : computedMaxRetries;\n\n return {\n backoff,\n maxRetries,\n };\n}\n\n/**\n * Create an error instance with a readable message, a cause and a context for Sentry.\n *\n * @param errorMessage - The error message.\n * @param cause - The cause of the error.\n * @returns A Sentry error.\n */\nfunction createSentryError(errorMessage: string, cause: Error): Error {\n const error = new Error(errorMessage) as Error & {\n cause: Error;\n };\n error.cause = cause;\n return error;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"shield-api-service.cjs","sourceRoot":"","sources":["../src/shield-api-service.ts"],"names":[],"mappings":"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","sourcesContent":["import { BaseDataService } from '@metamask/base-data-service';\nimport type {\n DataServiceCacheUpdatedEvent,\n DataServiceGranularCacheUpdatedEvent,\n DataServiceInvalidateQueriesAction,\n} from '@metamask/base-data-service';\nimport type { CreateServicePolicyOptions } from '@metamask/controller-utils';\nimport {\n ConstantBackoff,\n DEFAULT_MAX_RETRIES,\n HttpError,\n} from '@metamask/controller-utils';\nimport type { Messenger } from '@metamask/messenger';\nimport type { AuthenticationController } from '@metamask/profile-sync-controller';\nimport {\n EthMethod,\n SignatureRequestType,\n} from '@metamask/signature-controller';\nimport type { SignatureRequest } from '@metamask/signature-controller';\nimport type { TransactionMeta } from '@metamask/transaction-controller';\nimport type { AuthorizationList } from '@metamask/transaction-controller';\nimport type { Json } from '@metamask/utils';\nimport type { QueryClientConfig } from '@tanstack/query-core';\n\nimport { Env, getShieldApiBaseUrl, SignTypedDataVersion } from './constants.js';\nimport { PollingWithCockatielPolicy } from './polling-with-policy.js';\nimport type { ShieldApiServiceMethodActions } from './shield-api-service-method-action-types.js';\nimport type {\n CheckCoverageRequest,\n CheckSignatureCoverageRequest,\n CoverageResult,\n CoverageStatus,\n LogSignatureRequest,\n LogTransactionRequest,\n} from './types.js';\n\nexport type InitCoverageCheckRequest = {\n txParams: [\n {\n authorizationList?: AuthorizationList;\n from: string;\n to?: string;\n value?: string;\n data?: string;\n nonce?: string;\n },\n ];\n chainId: string;\n origin?: string;\n};\n\nexport type InitSignatureCoverageCheckRequest = {\n chainId: string;\n data: Json;\n from: string;\n method: string;\n origin?: string;\n};\n\nexport type InitCoverageCheckResponse = {\n coverageId: string;\n};\n\nexport type GetCoverageResultRequest = {\n coverageId: string;\n};\n\nexport type GetCoverageResultResponse = {\n message?: string;\n reasonCode?: string;\n status: CoverageStatus;\n metrics: {\n latency?: number;\n };\n};\n\n/**\n * The name of the {@link ShieldApiService}, used to namespace the service's\n * actions and events.\n */\nexport const serviceName = 'ShieldApiService';\n\nconst MESSENGER_EXPOSED_METHODS = [\n 'checkCoverage',\n 'checkSignatureCoverage',\n 'logSignature',\n 'logTransaction',\n] as const;\n\nconst DEFAULT_POLICY_OPTIONS: CreateServicePolicyOptions = {\n maxRetries: 0,\n};\n\n/**\n * Invalidates cached queries for {@link ShieldApiService}.\n */\nexport type ShieldApiServiceInvalidateQueriesAction =\n DataServiceInvalidateQueriesAction<typeof serviceName>;\n\n/**\n * Actions that {@link ShieldApiService} exposes to other consumers.\n */\nexport type ShieldApiServiceActions =\n | ShieldApiServiceMethodActions\n | ShieldApiServiceInvalidateQueriesAction;\n\n/**\n * Actions from other messengers that {@link ShieldApiService} calls.\n */\ntype AllowedActions =\n AuthenticationController.AuthenticationControllerGetBearerTokenAction;\n\n/**\n * Published when {@link ShieldApiService}'s cache is updated.\n */\nexport type ShieldApiServiceCacheUpdatedEvent = DataServiceCacheUpdatedEvent<\n typeof serviceName\n>;\n\n/**\n * Published when a key within {@link ShieldApiService}'s cache is updated.\n */\nexport type ShieldApiServiceGranularCacheUpdatedEvent =\n DataServiceGranularCacheUpdatedEvent<typeof serviceName>;\n\n/**\n * Events that {@link ShieldApiService} exposes to other consumers.\n */\nexport type ShieldApiServiceEvents =\n | ShieldApiServiceCacheUpdatedEvent\n | ShieldApiServiceGranularCacheUpdatedEvent;\n\n/**\n * Events from other messengers that {@link ShieldApiService} subscribes to.\n */\ntype AllowedEvents = never;\n\n/**\n * The messenger which is restricted to actions and events accessed by\n * {@link ShieldApiService}.\n */\nexport type ShieldApiServiceMessenger = Messenger<\n typeof serviceName,\n ShieldApiServiceActions | AllowedActions,\n ShieldApiServiceEvents | AllowedEvents\n>;\n\n/**\n * This service is responsible for communicating with the Shield API.\n *\n * All requests are authenticated via JWT Bearer tokens obtained from the\n * `AuthenticationController:getBearerToken` messenger action.\n */\nexport class ShieldApiService extends BaseDataService<\n typeof serviceName,\n ShieldApiServiceMessenger\n> {\n readonly #baseUrl: string;\n\n readonly #fetch: typeof globalThis.fetch;\n\n readonly #pollingPolicy: PollingWithCockatielPolicy;\n\n readonly #captureException?: (error: Error) => void;\n\n /**\n * Constructs a new ShieldApiService.\n *\n * @param args - The constructor arguments.\n * @param args.messenger - The messenger suited for this service.\n * @param args.env - The environment used to resolve the Shield API URL.\n * @param args.fetch - The fetch implementation. Defaults to `globalThis.fetch`.\n * @param args.captureException - Optional error reporter.\n * @param args.getCoverageResultTimeout - Timeout for coverage result polling.\n * @param args.getCoverageResultPollInterval - Poll interval for coverage results.\n * @param args.queryClientConfig - Configuration for the underlying TanStack\n * Query client.\n * @param args.policyOptions - Options to pass to `createServicePolicy`.\n */\n constructor({\n messenger,\n env,\n fetch: fetchFn = globalThis.fetch,\n captureException: captureExceptionFn,\n getCoverageResultTimeout = 5000,\n getCoverageResultPollInterval = 1000,\n queryClientConfig = {},\n policyOptions = {},\n }: {\n messenger: ShieldApiServiceMessenger;\n env: Env;\n /**\n * The `fetch` function to use for requests. Defaults to the global `fetch`.\n */\n fetch?: typeof globalThis.fetch;\n captureException?: (error: Error) => void;\n getCoverageResultTimeout?: number;\n getCoverageResultPollInterval?: number;\n queryClientConfig?: QueryClientConfig;\n policyOptions?: CreateServicePolicyOptions;\n }) {\n super({\n name: serviceName,\n messenger,\n queryClientConfig,\n policyOptions: { ...DEFAULT_POLICY_OPTIONS, ...policyOptions },\n });\n\n this.#baseUrl = getShieldApiBaseUrl(env);\n this.#fetch = fetchFn;\n\n const { backoff, maxRetries } = computePollingIntervalAndRetryCount(\n getCoverageResultTimeout,\n getCoverageResultPollInterval,\n );\n\n this.#pollingPolicy = new PollingWithCockatielPolicy({\n backoff,\n maxRetries,\n });\n\n this.#captureException = (error: Error): void => {\n try {\n captureExceptionFn?.(error);\n } catch {\n // ignore error thrown when calling captureException\n }\n };\n\n this.messenger.registerMethodActionHandlers(\n this,\n MESSENGER_EXPOSED_METHODS,\n );\n }\n\n /**\n * Checks the coverage of a transaction.\n *\n * @param req - The coverage check request.\n * @returns The coverage result.\n */\n async checkCoverage(req: CheckCoverageRequest): Promise<CoverageResult> {\n let { coverageId } = req;\n if (!coverageId) {\n const reqBody = makeInitCoverageCheckBody(req.txMeta);\n ({ coverageId } = await this.#initCoverageCheck(\n 'v1/transaction/coverage/init',\n reqBody,\n req.txMeta.id,\n ));\n }\n\n const txCoverageResultUrl = `${this.#baseUrl}/v1/transaction/coverage/result`;\n const coverageResult = await this.#getCoverageResult(\n req.txMeta.id,\n coverageId,\n txCoverageResultUrl,\n );\n return {\n coverageId,\n message: coverageResult.message,\n reasonCode: coverageResult.reasonCode,\n status: coverageResult.status,\n metrics: coverageResult.metrics,\n };\n }\n\n /**\n * Checks the coverage of a signature request.\n *\n * @param req - The signature coverage check request.\n * @returns The coverage result.\n */\n async checkSignatureCoverage(\n req: CheckSignatureCoverageRequest,\n ): Promise<CoverageResult> {\n let { coverageId } = req;\n if (!coverageId) {\n const reqBody = makeInitSignatureCoverageCheckBody(req.signatureRequest);\n ({ coverageId } = await this.#initCoverageCheck(\n 'v1/signature/coverage/init',\n reqBody,\n req.signatureRequest.id,\n ));\n }\n\n const signatureCoverageResultUrl = `${this.#baseUrl}/v1/signature/coverage/result`;\n const coverageResult = await this.#getCoverageResult(\n req.signatureRequest.id,\n coverageId,\n signatureCoverageResultUrl,\n );\n return {\n coverageId,\n message: coverageResult.message,\n reasonCode: coverageResult.reasonCode,\n status: coverageResult.status,\n metrics: coverageResult.metrics,\n };\n }\n\n /**\n * Logs a signed signature request.\n *\n * @param req - The log signature request.\n */\n async logSignature(req: LogSignatureRequest): Promise<void> {\n try {\n const initBody = makeInitSignatureCoverageCheckBody(req.signatureRequest);\n const body = {\n signature: req.signature,\n status: req.status,\n ...initBody,\n };\n\n this.#pollingPolicy.abortPendingRequest(req.signatureRequest.id);\n\n const headers = await this.#authHeaders();\n\n await this.fetchQuery({\n queryKey: [\n `${this.name}:logSignature`,\n req.signatureRequest.id,\n req.status,\n ],\n staleTime: 0,\n gcTime: 0,\n queryFn: async () => {\n const res = await this.#fetch(\n `${this.#baseUrl}/v1/signature/coverage/log`,\n {\n method: 'POST',\n headers,\n body: JSON.stringify(body),\n },\n );\n if (res.status !== 200) {\n throw new HttpError(\n res.status,\n `Failed to log signature: ${res.status}`,\n );\n }\n return null;\n },\n });\n } catch (error) {\n const sentryError = createSentryError(\n 'Failed to log signature',\n error as Error,\n );\n this.#captureException?.(sentryError);\n throw error;\n }\n }\n\n /**\n * Logs a submitted transaction.\n *\n * @param req - The log transaction request.\n */\n async logTransaction(req: LogTransactionRequest): Promise<void> {\n try {\n const initBody = makeInitCoverageCheckBody(req.txMeta);\n const body = {\n transactionHash: req.transactionHash,\n rawTransactionHex: req.rawTransactionHex,\n status: req.status,\n ...initBody,\n };\n\n this.#pollingPolicy.abortPendingRequest(req.txMeta.id);\n\n const headers = await this.#authHeaders();\n\n await this.fetchQuery({\n queryKey: [\n `${this.name}:logTransaction`,\n req.txMeta.id,\n req.transactionHash,\n req.status,\n ],\n staleTime: 0,\n gcTime: 0,\n queryFn: async () => {\n const res = await this.#fetch(\n `${this.#baseUrl}/v1/transaction/coverage/log`,\n {\n method: 'POST',\n headers,\n body: JSON.stringify(body),\n },\n );\n if (res.status !== 200) {\n throw new HttpError(\n res.status,\n `Failed to log transaction: ${res.status}`,\n );\n }\n return null;\n },\n });\n } catch (error) {\n const sentryError = createSentryError(\n 'Failed to log transaction',\n error as Error,\n );\n this.#captureException?.(sentryError);\n throw error;\n }\n }\n\n async #initCoverageCheck(\n path: string,\n reqBody: unknown,\n requestId: string,\n ): Promise<InitCoverageCheckResponse> {\n try {\n const headers = await this.#authHeaders();\n\n return await this.fetchQuery({\n queryKey: [`${this.name}:initCoverageCheck`, path, requestId],\n staleTime: 0,\n gcTime: 0,\n queryFn: async () => {\n const res = await this.#fetch(`${this.#baseUrl}/${path}`, {\n method: 'POST',\n headers,\n body: JSON.stringify(reqBody),\n });\n if (res.status !== 200) {\n throw new HttpError(\n res.status,\n `Failed to init coverage check: ${res.status}`,\n );\n }\n return (await res.json()) as InitCoverageCheckResponse;\n },\n });\n } catch (error) {\n const sentryError = createSentryError(\n 'Failed to init coverage check',\n error as Error,\n );\n this.#captureException?.(sentryError);\n throw error;\n }\n }\n\n async #getCoverageResult(\n requestId: string,\n coverageId: string,\n coverageResultUrl: string,\n ): Promise<GetCoverageResultResponse> {\n const reqBody: GetCoverageResultRequest = {\n coverageId,\n };\n\n const headers = await this.#authHeaders();\n const startTime = Date.now();\n\n const getCoverageResultFn = async (\n signal: AbortSignal,\n ): Promise<Omit<GetCoverageResultResponse, 'metrics'>> => {\n const res = await this.#fetch(coverageResultUrl, {\n method: 'POST',\n headers,\n body: JSON.stringify(reqBody),\n signal,\n });\n\n if (res.status === 200) {\n return (await res.json()) as Omit<GetCoverageResultResponse, 'metrics'>;\n }\n\n let errorMessage = 'Timeout waiting for coverage result';\n try {\n const errorJson = (await res.json()) as {\n message?: string;\n status?: string;\n };\n errorMessage = `Failed to get coverage result: ${errorJson.message ?? errorJson.status}`;\n } catch {\n errorMessage = `Failed to get coverage result: ${res.status}`;\n }\n throw new HttpError(res.status, errorMessage);\n };\n\n const result = await this.#pollingPolicy.start(\n requestId,\n getCoverageResultFn,\n );\n\n const totalLatency = Date.now() - startTime;\n\n return {\n ...result,\n metrics: { latency: totalLatency },\n } as GetCoverageResultResponse;\n }\n\n async #authHeaders(): Promise<Record<string, string>> {\n const token = await this.messenger.call(\n 'AuthenticationController:getBearerToken',\n );\n return {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${token}`,\n };\n }\n}\n\n/**\n * Make the body for the init coverage check request.\n *\n * @param txMeta - The transaction metadata.\n * @returns The body for the init coverage check request.\n */\nexport function makeInitCoverageCheckBody(\n txMeta: TransactionMeta,\n): InitCoverageCheckRequest {\n return {\n txParams: [\n {\n authorizationList: txMeta.txParams.authorizationList,\n from: txMeta.txParams.from,\n to: txMeta.txParams.to,\n value: txMeta.txParams.value,\n data: txMeta.txParams.data,\n nonce: txMeta.txParams.nonce,\n },\n ],\n chainId: txMeta.chainId,\n origin: txMeta.origin,\n };\n}\n\n/**\n * Make the body for the init signature coverage check request.\n *\n * @param signatureRequest - The signature request.\n * @returns The body for the init signature coverage check request.\n */\nfunction makeInitSignatureCoverageCheckBody(\n signatureRequest: SignatureRequest,\n): InitSignatureCoverageCheckRequest {\n const method = parseSignatureRequestMethod(signatureRequest);\n\n return {\n chainId: signatureRequest.chainId,\n data: signatureRequest.messageParams.data,\n from: signatureRequest.messageParams.from,\n method,\n origin: signatureRequest.messageParams.origin,\n };\n}\n\n/**\n * Parse the JSON-RPC method from the signature request.\n *\n * @param signatureRequest - The signature request.\n * @returns The JSON-RPC method.\n */\nexport function parseSignatureRequestMethod(\n signatureRequest: SignatureRequest,\n): string {\n if (signatureRequest.type === SignatureRequestType.TypedSign) {\n switch (signatureRequest.version) {\n case SignTypedDataVersion.V3:\n return EthMethod.SignTypedDataV3;\n case SignTypedDataVersion.V4:\n return EthMethod.SignTypedDataV4;\n case SignTypedDataVersion.V1:\n default:\n return SignatureRequestType.TypedSign;\n }\n }\n\n return signatureRequest.type;\n}\n\n/**\n * Compute the polling interval and retry count for the Cockatiel policy based on the timeout and poll interval given.\n *\n * @param timeout - The timeout in milliseconds.\n * @param pollInterval - The poll interval in milliseconds.\n * @returns The polling interval and retry count.\n */\nfunction computePollingIntervalAndRetryCount(\n timeout: number,\n pollInterval: number,\n): { backoff: ConstantBackoff; maxRetries: number } {\n const backoff = new ConstantBackoff(pollInterval);\n const computedMaxRetries = Math.floor(timeout / pollInterval) + 1;\n\n const maxRetries =\n isNaN(computedMaxRetries) || !isFinite(computedMaxRetries)\n ? DEFAULT_MAX_RETRIES\n : computedMaxRetries;\n\n return {\n backoff,\n maxRetries,\n };\n}\n\n/**\n * Create an error instance with a readable message, a cause and a context for Sentry.\n *\n * @param errorMessage - The error message.\n * @param cause - The cause of the error.\n * @returns A Sentry error.\n */\nfunction createSentryError(errorMessage: string, cause: Error): Error {\n const error = new Error(errorMessage) as Error & {\n cause: Error;\n };\n error.cause = cause;\n return error;\n}\n"]}
|
|
@@ -145,7 +145,7 @@ export class ShieldApiService extends BaseDataService {
|
|
|
145
145
|
req.status,
|
|
146
146
|
],
|
|
147
147
|
staleTime: 0,
|
|
148
|
-
|
|
148
|
+
gcTime: 0,
|
|
149
149
|
queryFn: async () => {
|
|
150
150
|
const res = await __classPrivateFieldGet(this, _ShieldApiService_fetch, "f").call(this, `${__classPrivateFieldGet(this, _ShieldApiService_baseUrl, "f")}/v1/signature/coverage/log`, {
|
|
151
151
|
method: 'POST',
|
|
@@ -189,7 +189,7 @@ export class ShieldApiService extends BaseDataService {
|
|
|
189
189
|
req.status,
|
|
190
190
|
],
|
|
191
191
|
staleTime: 0,
|
|
192
|
-
|
|
192
|
+
gcTime: 0,
|
|
193
193
|
queryFn: async () => {
|
|
194
194
|
const res = await __classPrivateFieldGet(this, _ShieldApiService_fetch, "f").call(this, `${__classPrivateFieldGet(this, _ShieldApiService_baseUrl, "f")}/v1/transaction/coverage/log`, {
|
|
195
195
|
method: 'POST',
|
|
@@ -216,7 +216,7 @@ _ShieldApiService_baseUrl = new WeakMap(), _ShieldApiService_fetch = new WeakMap
|
|
|
216
216
|
return await this.fetchQuery({
|
|
217
217
|
queryKey: [`${this.name}:initCoverageCheck`, path, requestId],
|
|
218
218
|
staleTime: 0,
|
|
219
|
-
|
|
219
|
+
gcTime: 0,
|
|
220
220
|
queryFn: async () => {
|
|
221
221
|
const res = await __classPrivateFieldGet(this, _ShieldApiService_fetch, "f").call(this, `${__classPrivateFieldGet(this, _ShieldApiService_baseUrl, "f")}/${path}`, {
|
|
222
222
|
method: 'POST',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shield-api-service.mjs","sourceRoot":"","sources":["../src/shield-api-service.ts"],"names":[],"mappings":"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","sourcesContent":["import { BaseDataService } from '@metamask/base-data-service';\nimport type {\n DataServiceCacheUpdatedEvent,\n DataServiceGranularCacheUpdatedEvent,\n DataServiceInvalidateQueriesAction,\n} from '@metamask/base-data-service';\nimport type { CreateServicePolicyOptions } from '@metamask/controller-utils';\nimport {\n ConstantBackoff,\n DEFAULT_MAX_RETRIES,\n HttpError,\n} from '@metamask/controller-utils';\nimport type { Messenger } from '@metamask/messenger';\nimport type { AuthenticationController } from '@metamask/profile-sync-controller';\nimport {\n EthMethod,\n SignatureRequestType,\n} from '@metamask/signature-controller';\nimport type { SignatureRequest } from '@metamask/signature-controller';\nimport type { TransactionMeta } from '@metamask/transaction-controller';\nimport type { AuthorizationList } from '@metamask/transaction-controller';\nimport type { Json } from '@metamask/utils';\nimport type { QueryClientConfig } from '@tanstack/query-core';\n\nimport { Env, getShieldApiBaseUrl, SignTypedDataVersion } from './constants.js';\nimport { PollingWithCockatielPolicy } from './polling-with-policy.js';\nimport type { ShieldApiServiceMethodActions } from './shield-api-service-method-action-types.js';\nimport type {\n CheckCoverageRequest,\n CheckSignatureCoverageRequest,\n CoverageResult,\n CoverageStatus,\n LogSignatureRequest,\n LogTransactionRequest,\n} from './types.js';\n\nexport type InitCoverageCheckRequest = {\n txParams: [\n {\n authorizationList?: AuthorizationList;\n from: string;\n to?: string;\n value?: string;\n data?: string;\n nonce?: string;\n },\n ];\n chainId: string;\n origin?: string;\n};\n\nexport type InitSignatureCoverageCheckRequest = {\n chainId: string;\n data: Json;\n from: string;\n method: string;\n origin?: string;\n};\n\nexport type InitCoverageCheckResponse = {\n coverageId: string;\n};\n\nexport type GetCoverageResultRequest = {\n coverageId: string;\n};\n\nexport type GetCoverageResultResponse = {\n message?: string;\n reasonCode?: string;\n status: CoverageStatus;\n metrics: {\n latency?: number;\n };\n};\n\n/**\n * The name of the {@link ShieldApiService}, used to namespace the service's\n * actions and events.\n */\nexport const serviceName = 'ShieldApiService';\n\nconst MESSENGER_EXPOSED_METHODS = [\n 'checkCoverage',\n 'checkSignatureCoverage',\n 'logSignature',\n 'logTransaction',\n] as const;\n\nconst DEFAULT_POLICY_OPTIONS: CreateServicePolicyOptions = {\n maxRetries: 0,\n};\n\n/**\n * Invalidates cached queries for {@link ShieldApiService}.\n */\nexport type ShieldApiServiceInvalidateQueriesAction =\n DataServiceInvalidateQueriesAction<typeof serviceName>;\n\n/**\n * Actions that {@link ShieldApiService} exposes to other consumers.\n */\nexport type ShieldApiServiceActions =\n | ShieldApiServiceMethodActions\n | ShieldApiServiceInvalidateQueriesAction;\n\n/**\n * Actions from other messengers that {@link ShieldApiService} calls.\n */\ntype AllowedActions =\n AuthenticationController.AuthenticationControllerGetBearerTokenAction;\n\n/**\n * Published when {@link ShieldApiService}'s cache is updated.\n */\nexport type ShieldApiServiceCacheUpdatedEvent = DataServiceCacheUpdatedEvent<\n typeof serviceName\n>;\n\n/**\n * Published when a key within {@link ShieldApiService}'s cache is updated.\n */\nexport type ShieldApiServiceGranularCacheUpdatedEvent =\n DataServiceGranularCacheUpdatedEvent<typeof serviceName>;\n\n/**\n * Events that {@link ShieldApiService} exposes to other consumers.\n */\nexport type ShieldApiServiceEvents =\n | ShieldApiServiceCacheUpdatedEvent\n | ShieldApiServiceGranularCacheUpdatedEvent;\n\n/**\n * Events from other messengers that {@link ShieldApiService} subscribes to.\n */\ntype AllowedEvents = never;\n\n/**\n * The messenger which is restricted to actions and events accessed by\n * {@link ShieldApiService}.\n */\nexport type ShieldApiServiceMessenger = Messenger<\n typeof serviceName,\n ShieldApiServiceActions | AllowedActions,\n ShieldApiServiceEvents | AllowedEvents\n>;\n\n/**\n * This service is responsible for communicating with the Shield API.\n *\n * All requests are authenticated via JWT Bearer tokens obtained from the\n * `AuthenticationController:getBearerToken` messenger action.\n */\nexport class ShieldApiService extends BaseDataService<\n typeof serviceName,\n ShieldApiServiceMessenger\n> {\n readonly #baseUrl: string;\n\n readonly #fetch: typeof globalThis.fetch;\n\n readonly #pollingPolicy: PollingWithCockatielPolicy;\n\n readonly #captureException?: (error: Error) => void;\n\n /**\n * Constructs a new ShieldApiService.\n *\n * @param args - The constructor arguments.\n * @param args.messenger - The messenger suited for this service.\n * @param args.env - The environment used to resolve the Shield API URL.\n * @param args.fetch - The fetch implementation. Defaults to `globalThis.fetch`.\n * @param args.captureException - Optional error reporter.\n * @param args.getCoverageResultTimeout - Timeout for coverage result polling.\n * @param args.getCoverageResultPollInterval - Poll interval for coverage results.\n * @param args.queryClientConfig - Configuration for the underlying TanStack\n * Query client.\n * @param args.policyOptions - Options to pass to `createServicePolicy`.\n */\n constructor({\n messenger,\n env,\n fetch: fetchFn = globalThis.fetch,\n captureException: captureExceptionFn,\n getCoverageResultTimeout = 5000,\n getCoverageResultPollInterval = 1000,\n queryClientConfig = {},\n policyOptions = {},\n }: {\n messenger: ShieldApiServiceMessenger;\n env: Env;\n /**\n * The `fetch` function to use for requests. Defaults to the global `fetch`.\n */\n fetch?: typeof globalThis.fetch;\n captureException?: (error: Error) => void;\n getCoverageResultTimeout?: number;\n getCoverageResultPollInterval?: number;\n queryClientConfig?: QueryClientConfig;\n policyOptions?: CreateServicePolicyOptions;\n }) {\n super({\n name: serviceName,\n messenger,\n queryClientConfig,\n policyOptions: { ...DEFAULT_POLICY_OPTIONS, ...policyOptions },\n });\n\n this.#baseUrl = getShieldApiBaseUrl(env);\n this.#fetch = fetchFn;\n\n const { backoff, maxRetries } = computePollingIntervalAndRetryCount(\n getCoverageResultTimeout,\n getCoverageResultPollInterval,\n );\n\n this.#pollingPolicy = new PollingWithCockatielPolicy({\n backoff,\n maxRetries,\n });\n\n this.#captureException = (error: Error): void => {\n try {\n captureExceptionFn?.(error);\n } catch {\n // ignore error thrown when calling captureException\n }\n };\n\n this.messenger.registerMethodActionHandlers(\n this,\n MESSENGER_EXPOSED_METHODS,\n );\n }\n\n /**\n * Checks the coverage of a transaction.\n *\n * @param req - The coverage check request.\n * @returns The coverage result.\n */\n async checkCoverage(req: CheckCoverageRequest): Promise<CoverageResult> {\n let { coverageId } = req;\n if (!coverageId) {\n const reqBody = makeInitCoverageCheckBody(req.txMeta);\n ({ coverageId } = await this.#initCoverageCheck(\n 'v1/transaction/coverage/init',\n reqBody,\n req.txMeta.id,\n ));\n }\n\n const txCoverageResultUrl = `${this.#baseUrl}/v1/transaction/coverage/result`;\n const coverageResult = await this.#getCoverageResult(\n req.txMeta.id,\n coverageId,\n txCoverageResultUrl,\n );\n return {\n coverageId,\n message: coverageResult.message,\n reasonCode: coverageResult.reasonCode,\n status: coverageResult.status,\n metrics: coverageResult.metrics,\n };\n }\n\n /**\n * Checks the coverage of a signature request.\n *\n * @param req - The signature coverage check request.\n * @returns The coverage result.\n */\n async checkSignatureCoverage(\n req: CheckSignatureCoverageRequest,\n ): Promise<CoverageResult> {\n let { coverageId } = req;\n if (!coverageId) {\n const reqBody = makeInitSignatureCoverageCheckBody(req.signatureRequest);\n ({ coverageId } = await this.#initCoverageCheck(\n 'v1/signature/coverage/init',\n reqBody,\n req.signatureRequest.id,\n ));\n }\n\n const signatureCoverageResultUrl = `${this.#baseUrl}/v1/signature/coverage/result`;\n const coverageResult = await this.#getCoverageResult(\n req.signatureRequest.id,\n coverageId,\n signatureCoverageResultUrl,\n );\n return {\n coverageId,\n message: coverageResult.message,\n reasonCode: coverageResult.reasonCode,\n status: coverageResult.status,\n metrics: coverageResult.metrics,\n };\n }\n\n /**\n * Logs a signed signature request.\n *\n * @param req - The log signature request.\n */\n async logSignature(req: LogSignatureRequest): Promise<void> {\n try {\n const initBody = makeInitSignatureCoverageCheckBody(req.signatureRequest);\n const body = {\n signature: req.signature,\n status: req.status,\n ...initBody,\n };\n\n this.#pollingPolicy.abortPendingRequest(req.signatureRequest.id);\n\n const headers = await this.#authHeaders();\n\n await this.fetchQuery({\n queryKey: [\n `${this.name}:logSignature`,\n req.signatureRequest.id,\n req.status,\n ],\n staleTime: 0,\n cacheTime: 0,\n queryFn: async () => {\n const res = await this.#fetch(\n `${this.#baseUrl}/v1/signature/coverage/log`,\n {\n method: 'POST',\n headers,\n body: JSON.stringify(body),\n },\n );\n if (res.status !== 200) {\n throw new HttpError(\n res.status,\n `Failed to log signature: ${res.status}`,\n );\n }\n return null;\n },\n });\n } catch (error) {\n const sentryError = createSentryError(\n 'Failed to log signature',\n error as Error,\n );\n this.#captureException?.(sentryError);\n throw error;\n }\n }\n\n /**\n * Logs a submitted transaction.\n *\n * @param req - The log transaction request.\n */\n async logTransaction(req: LogTransactionRequest): Promise<void> {\n try {\n const initBody = makeInitCoverageCheckBody(req.txMeta);\n const body = {\n transactionHash: req.transactionHash,\n rawTransactionHex: req.rawTransactionHex,\n status: req.status,\n ...initBody,\n };\n\n this.#pollingPolicy.abortPendingRequest(req.txMeta.id);\n\n const headers = await this.#authHeaders();\n\n await this.fetchQuery({\n queryKey: [\n `${this.name}:logTransaction`,\n req.txMeta.id,\n req.transactionHash,\n req.status,\n ],\n staleTime: 0,\n cacheTime: 0,\n queryFn: async () => {\n const res = await this.#fetch(\n `${this.#baseUrl}/v1/transaction/coverage/log`,\n {\n method: 'POST',\n headers,\n body: JSON.stringify(body),\n },\n );\n if (res.status !== 200) {\n throw new HttpError(\n res.status,\n `Failed to log transaction: ${res.status}`,\n );\n }\n return null;\n },\n });\n } catch (error) {\n const sentryError = createSentryError(\n 'Failed to log transaction',\n error as Error,\n );\n this.#captureException?.(sentryError);\n throw error;\n }\n }\n\n async #initCoverageCheck(\n path: string,\n reqBody: unknown,\n requestId: string,\n ): Promise<InitCoverageCheckResponse> {\n try {\n const headers = await this.#authHeaders();\n\n return await this.fetchQuery({\n queryKey: [`${this.name}:initCoverageCheck`, path, requestId],\n staleTime: 0,\n cacheTime: 0,\n queryFn: async () => {\n const res = await this.#fetch(`${this.#baseUrl}/${path}`, {\n method: 'POST',\n headers,\n body: JSON.stringify(reqBody),\n });\n if (res.status !== 200) {\n throw new HttpError(\n res.status,\n `Failed to init coverage check: ${res.status}`,\n );\n }\n return (await res.json()) as InitCoverageCheckResponse;\n },\n });\n } catch (error) {\n const sentryError = createSentryError(\n 'Failed to init coverage check',\n error as Error,\n );\n this.#captureException?.(sentryError);\n throw error;\n }\n }\n\n async #getCoverageResult(\n requestId: string,\n coverageId: string,\n coverageResultUrl: string,\n ): Promise<GetCoverageResultResponse> {\n const reqBody: GetCoverageResultRequest = {\n coverageId,\n };\n\n const headers = await this.#authHeaders();\n const startTime = Date.now();\n\n const getCoverageResultFn = async (\n signal: AbortSignal,\n ): Promise<Omit<GetCoverageResultResponse, 'metrics'>> => {\n const res = await this.#fetch(coverageResultUrl, {\n method: 'POST',\n headers,\n body: JSON.stringify(reqBody),\n signal,\n });\n\n if (res.status === 200) {\n return (await res.json()) as Omit<GetCoverageResultResponse, 'metrics'>;\n }\n\n let errorMessage = 'Timeout waiting for coverage result';\n try {\n const errorJson = (await res.json()) as {\n message?: string;\n status?: string;\n };\n errorMessage = `Failed to get coverage result: ${errorJson.message ?? errorJson.status}`;\n } catch {\n errorMessage = `Failed to get coverage result: ${res.status}`;\n }\n throw new HttpError(res.status, errorMessage);\n };\n\n const result = await this.#pollingPolicy.start(\n requestId,\n getCoverageResultFn,\n );\n\n const totalLatency = Date.now() - startTime;\n\n return {\n ...result,\n metrics: { latency: totalLatency },\n } as GetCoverageResultResponse;\n }\n\n async #authHeaders(): Promise<Record<string, string>> {\n const token = await this.messenger.call(\n 'AuthenticationController:getBearerToken',\n );\n return {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${token}`,\n };\n }\n}\n\n/**\n * Make the body for the init coverage check request.\n *\n * @param txMeta - The transaction metadata.\n * @returns The body for the init coverage check request.\n */\nexport function makeInitCoverageCheckBody(\n txMeta: TransactionMeta,\n): InitCoverageCheckRequest {\n return {\n txParams: [\n {\n authorizationList: txMeta.txParams.authorizationList,\n from: txMeta.txParams.from,\n to: txMeta.txParams.to,\n value: txMeta.txParams.value,\n data: txMeta.txParams.data,\n nonce: txMeta.txParams.nonce,\n },\n ],\n chainId: txMeta.chainId,\n origin: txMeta.origin,\n };\n}\n\n/**\n * Make the body for the init signature coverage check request.\n *\n * @param signatureRequest - The signature request.\n * @returns The body for the init signature coverage check request.\n */\nfunction makeInitSignatureCoverageCheckBody(\n signatureRequest: SignatureRequest,\n): InitSignatureCoverageCheckRequest {\n const method = parseSignatureRequestMethod(signatureRequest);\n\n return {\n chainId: signatureRequest.chainId,\n data: signatureRequest.messageParams.data,\n from: signatureRequest.messageParams.from,\n method,\n origin: signatureRequest.messageParams.origin,\n };\n}\n\n/**\n * Parse the JSON-RPC method from the signature request.\n *\n * @param signatureRequest - The signature request.\n * @returns The JSON-RPC method.\n */\nexport function parseSignatureRequestMethod(\n signatureRequest: SignatureRequest,\n): string {\n if (signatureRequest.type === SignatureRequestType.TypedSign) {\n switch (signatureRequest.version) {\n case SignTypedDataVersion.V3:\n return EthMethod.SignTypedDataV3;\n case SignTypedDataVersion.V4:\n return EthMethod.SignTypedDataV4;\n case SignTypedDataVersion.V1:\n default:\n return SignatureRequestType.TypedSign;\n }\n }\n\n return signatureRequest.type;\n}\n\n/**\n * Compute the polling interval and retry count for the Cockatiel policy based on the timeout and poll interval given.\n *\n * @param timeout - The timeout in milliseconds.\n * @param pollInterval - The poll interval in milliseconds.\n * @returns The polling interval and retry count.\n */\nfunction computePollingIntervalAndRetryCount(\n timeout: number,\n pollInterval: number,\n): { backoff: ConstantBackoff; maxRetries: number } {\n const backoff = new ConstantBackoff(pollInterval);\n const computedMaxRetries = Math.floor(timeout / pollInterval) + 1;\n\n const maxRetries =\n isNaN(computedMaxRetries) || !isFinite(computedMaxRetries)\n ? DEFAULT_MAX_RETRIES\n : computedMaxRetries;\n\n return {\n backoff,\n maxRetries,\n };\n}\n\n/**\n * Create an error instance with a readable message, a cause and a context for Sentry.\n *\n * @param errorMessage - The error message.\n * @param cause - The cause of the error.\n * @returns A Sentry error.\n */\nfunction createSentryError(errorMessage: string, cause: Error): Error {\n const error = new Error(errorMessage) as Error & {\n cause: Error;\n };\n error.cause = cause;\n return error;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"shield-api-service.mjs","sourceRoot":"","sources":["../src/shield-api-service.ts"],"names":[],"mappings":"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","sourcesContent":["import { BaseDataService } from '@metamask/base-data-service';\nimport type {\n DataServiceCacheUpdatedEvent,\n DataServiceGranularCacheUpdatedEvent,\n DataServiceInvalidateQueriesAction,\n} from '@metamask/base-data-service';\nimport type { CreateServicePolicyOptions } from '@metamask/controller-utils';\nimport {\n ConstantBackoff,\n DEFAULT_MAX_RETRIES,\n HttpError,\n} from '@metamask/controller-utils';\nimport type { Messenger } from '@metamask/messenger';\nimport type { AuthenticationController } from '@metamask/profile-sync-controller';\nimport {\n EthMethod,\n SignatureRequestType,\n} from '@metamask/signature-controller';\nimport type { SignatureRequest } from '@metamask/signature-controller';\nimport type { TransactionMeta } from '@metamask/transaction-controller';\nimport type { AuthorizationList } from '@metamask/transaction-controller';\nimport type { Json } from '@metamask/utils';\nimport type { QueryClientConfig } from '@tanstack/query-core';\n\nimport { Env, getShieldApiBaseUrl, SignTypedDataVersion } from './constants.js';\nimport { PollingWithCockatielPolicy } from './polling-with-policy.js';\nimport type { ShieldApiServiceMethodActions } from './shield-api-service-method-action-types.js';\nimport type {\n CheckCoverageRequest,\n CheckSignatureCoverageRequest,\n CoverageResult,\n CoverageStatus,\n LogSignatureRequest,\n LogTransactionRequest,\n} from './types.js';\n\nexport type InitCoverageCheckRequest = {\n txParams: [\n {\n authorizationList?: AuthorizationList;\n from: string;\n to?: string;\n value?: string;\n data?: string;\n nonce?: string;\n },\n ];\n chainId: string;\n origin?: string;\n};\n\nexport type InitSignatureCoverageCheckRequest = {\n chainId: string;\n data: Json;\n from: string;\n method: string;\n origin?: string;\n};\n\nexport type InitCoverageCheckResponse = {\n coverageId: string;\n};\n\nexport type GetCoverageResultRequest = {\n coverageId: string;\n};\n\nexport type GetCoverageResultResponse = {\n message?: string;\n reasonCode?: string;\n status: CoverageStatus;\n metrics: {\n latency?: number;\n };\n};\n\n/**\n * The name of the {@link ShieldApiService}, used to namespace the service's\n * actions and events.\n */\nexport const serviceName = 'ShieldApiService';\n\nconst MESSENGER_EXPOSED_METHODS = [\n 'checkCoverage',\n 'checkSignatureCoverage',\n 'logSignature',\n 'logTransaction',\n] as const;\n\nconst DEFAULT_POLICY_OPTIONS: CreateServicePolicyOptions = {\n maxRetries: 0,\n};\n\n/**\n * Invalidates cached queries for {@link ShieldApiService}.\n */\nexport type ShieldApiServiceInvalidateQueriesAction =\n DataServiceInvalidateQueriesAction<typeof serviceName>;\n\n/**\n * Actions that {@link ShieldApiService} exposes to other consumers.\n */\nexport type ShieldApiServiceActions =\n | ShieldApiServiceMethodActions\n | ShieldApiServiceInvalidateQueriesAction;\n\n/**\n * Actions from other messengers that {@link ShieldApiService} calls.\n */\ntype AllowedActions =\n AuthenticationController.AuthenticationControllerGetBearerTokenAction;\n\n/**\n * Published when {@link ShieldApiService}'s cache is updated.\n */\nexport type ShieldApiServiceCacheUpdatedEvent = DataServiceCacheUpdatedEvent<\n typeof serviceName\n>;\n\n/**\n * Published when a key within {@link ShieldApiService}'s cache is updated.\n */\nexport type ShieldApiServiceGranularCacheUpdatedEvent =\n DataServiceGranularCacheUpdatedEvent<typeof serviceName>;\n\n/**\n * Events that {@link ShieldApiService} exposes to other consumers.\n */\nexport type ShieldApiServiceEvents =\n | ShieldApiServiceCacheUpdatedEvent\n | ShieldApiServiceGranularCacheUpdatedEvent;\n\n/**\n * Events from other messengers that {@link ShieldApiService} subscribes to.\n */\ntype AllowedEvents = never;\n\n/**\n * The messenger which is restricted to actions and events accessed by\n * {@link ShieldApiService}.\n */\nexport type ShieldApiServiceMessenger = Messenger<\n typeof serviceName,\n ShieldApiServiceActions | AllowedActions,\n ShieldApiServiceEvents | AllowedEvents\n>;\n\n/**\n * This service is responsible for communicating with the Shield API.\n *\n * All requests are authenticated via JWT Bearer tokens obtained from the\n * `AuthenticationController:getBearerToken` messenger action.\n */\nexport class ShieldApiService extends BaseDataService<\n typeof serviceName,\n ShieldApiServiceMessenger\n> {\n readonly #baseUrl: string;\n\n readonly #fetch: typeof globalThis.fetch;\n\n readonly #pollingPolicy: PollingWithCockatielPolicy;\n\n readonly #captureException?: (error: Error) => void;\n\n /**\n * Constructs a new ShieldApiService.\n *\n * @param args - The constructor arguments.\n * @param args.messenger - The messenger suited for this service.\n * @param args.env - The environment used to resolve the Shield API URL.\n * @param args.fetch - The fetch implementation. Defaults to `globalThis.fetch`.\n * @param args.captureException - Optional error reporter.\n * @param args.getCoverageResultTimeout - Timeout for coverage result polling.\n * @param args.getCoverageResultPollInterval - Poll interval for coverage results.\n * @param args.queryClientConfig - Configuration for the underlying TanStack\n * Query client.\n * @param args.policyOptions - Options to pass to `createServicePolicy`.\n */\n constructor({\n messenger,\n env,\n fetch: fetchFn = globalThis.fetch,\n captureException: captureExceptionFn,\n getCoverageResultTimeout = 5000,\n getCoverageResultPollInterval = 1000,\n queryClientConfig = {},\n policyOptions = {},\n }: {\n messenger: ShieldApiServiceMessenger;\n env: Env;\n /**\n * The `fetch` function to use for requests. Defaults to the global `fetch`.\n */\n fetch?: typeof globalThis.fetch;\n captureException?: (error: Error) => void;\n getCoverageResultTimeout?: number;\n getCoverageResultPollInterval?: number;\n queryClientConfig?: QueryClientConfig;\n policyOptions?: CreateServicePolicyOptions;\n }) {\n super({\n name: serviceName,\n messenger,\n queryClientConfig,\n policyOptions: { ...DEFAULT_POLICY_OPTIONS, ...policyOptions },\n });\n\n this.#baseUrl = getShieldApiBaseUrl(env);\n this.#fetch = fetchFn;\n\n const { backoff, maxRetries } = computePollingIntervalAndRetryCount(\n getCoverageResultTimeout,\n getCoverageResultPollInterval,\n );\n\n this.#pollingPolicy = new PollingWithCockatielPolicy({\n backoff,\n maxRetries,\n });\n\n this.#captureException = (error: Error): void => {\n try {\n captureExceptionFn?.(error);\n } catch {\n // ignore error thrown when calling captureException\n }\n };\n\n this.messenger.registerMethodActionHandlers(\n this,\n MESSENGER_EXPOSED_METHODS,\n );\n }\n\n /**\n * Checks the coverage of a transaction.\n *\n * @param req - The coverage check request.\n * @returns The coverage result.\n */\n async checkCoverage(req: CheckCoverageRequest): Promise<CoverageResult> {\n let { coverageId } = req;\n if (!coverageId) {\n const reqBody = makeInitCoverageCheckBody(req.txMeta);\n ({ coverageId } = await this.#initCoverageCheck(\n 'v1/transaction/coverage/init',\n reqBody,\n req.txMeta.id,\n ));\n }\n\n const txCoverageResultUrl = `${this.#baseUrl}/v1/transaction/coverage/result`;\n const coverageResult = await this.#getCoverageResult(\n req.txMeta.id,\n coverageId,\n txCoverageResultUrl,\n );\n return {\n coverageId,\n message: coverageResult.message,\n reasonCode: coverageResult.reasonCode,\n status: coverageResult.status,\n metrics: coverageResult.metrics,\n };\n }\n\n /**\n * Checks the coverage of a signature request.\n *\n * @param req - The signature coverage check request.\n * @returns The coverage result.\n */\n async checkSignatureCoverage(\n req: CheckSignatureCoverageRequest,\n ): Promise<CoverageResult> {\n let { coverageId } = req;\n if (!coverageId) {\n const reqBody = makeInitSignatureCoverageCheckBody(req.signatureRequest);\n ({ coverageId } = await this.#initCoverageCheck(\n 'v1/signature/coverage/init',\n reqBody,\n req.signatureRequest.id,\n ));\n }\n\n const signatureCoverageResultUrl = `${this.#baseUrl}/v1/signature/coverage/result`;\n const coverageResult = await this.#getCoverageResult(\n req.signatureRequest.id,\n coverageId,\n signatureCoverageResultUrl,\n );\n return {\n coverageId,\n message: coverageResult.message,\n reasonCode: coverageResult.reasonCode,\n status: coverageResult.status,\n metrics: coverageResult.metrics,\n };\n }\n\n /**\n * Logs a signed signature request.\n *\n * @param req - The log signature request.\n */\n async logSignature(req: LogSignatureRequest): Promise<void> {\n try {\n const initBody = makeInitSignatureCoverageCheckBody(req.signatureRequest);\n const body = {\n signature: req.signature,\n status: req.status,\n ...initBody,\n };\n\n this.#pollingPolicy.abortPendingRequest(req.signatureRequest.id);\n\n const headers = await this.#authHeaders();\n\n await this.fetchQuery({\n queryKey: [\n `${this.name}:logSignature`,\n req.signatureRequest.id,\n req.status,\n ],\n staleTime: 0,\n gcTime: 0,\n queryFn: async () => {\n const res = await this.#fetch(\n `${this.#baseUrl}/v1/signature/coverage/log`,\n {\n method: 'POST',\n headers,\n body: JSON.stringify(body),\n },\n );\n if (res.status !== 200) {\n throw new HttpError(\n res.status,\n `Failed to log signature: ${res.status}`,\n );\n }\n return null;\n },\n });\n } catch (error) {\n const sentryError = createSentryError(\n 'Failed to log signature',\n error as Error,\n );\n this.#captureException?.(sentryError);\n throw error;\n }\n }\n\n /**\n * Logs a submitted transaction.\n *\n * @param req - The log transaction request.\n */\n async logTransaction(req: LogTransactionRequest): Promise<void> {\n try {\n const initBody = makeInitCoverageCheckBody(req.txMeta);\n const body = {\n transactionHash: req.transactionHash,\n rawTransactionHex: req.rawTransactionHex,\n status: req.status,\n ...initBody,\n };\n\n this.#pollingPolicy.abortPendingRequest(req.txMeta.id);\n\n const headers = await this.#authHeaders();\n\n await this.fetchQuery({\n queryKey: [\n `${this.name}:logTransaction`,\n req.txMeta.id,\n req.transactionHash,\n req.status,\n ],\n staleTime: 0,\n gcTime: 0,\n queryFn: async () => {\n const res = await this.#fetch(\n `${this.#baseUrl}/v1/transaction/coverage/log`,\n {\n method: 'POST',\n headers,\n body: JSON.stringify(body),\n },\n );\n if (res.status !== 200) {\n throw new HttpError(\n res.status,\n `Failed to log transaction: ${res.status}`,\n );\n }\n return null;\n },\n });\n } catch (error) {\n const sentryError = createSentryError(\n 'Failed to log transaction',\n error as Error,\n );\n this.#captureException?.(sentryError);\n throw error;\n }\n }\n\n async #initCoverageCheck(\n path: string,\n reqBody: unknown,\n requestId: string,\n ): Promise<InitCoverageCheckResponse> {\n try {\n const headers = await this.#authHeaders();\n\n return await this.fetchQuery({\n queryKey: [`${this.name}:initCoverageCheck`, path, requestId],\n staleTime: 0,\n gcTime: 0,\n queryFn: async () => {\n const res = await this.#fetch(`${this.#baseUrl}/${path}`, {\n method: 'POST',\n headers,\n body: JSON.stringify(reqBody),\n });\n if (res.status !== 200) {\n throw new HttpError(\n res.status,\n `Failed to init coverage check: ${res.status}`,\n );\n }\n return (await res.json()) as InitCoverageCheckResponse;\n },\n });\n } catch (error) {\n const sentryError = createSentryError(\n 'Failed to init coverage check',\n error as Error,\n );\n this.#captureException?.(sentryError);\n throw error;\n }\n }\n\n async #getCoverageResult(\n requestId: string,\n coverageId: string,\n coverageResultUrl: string,\n ): Promise<GetCoverageResultResponse> {\n const reqBody: GetCoverageResultRequest = {\n coverageId,\n };\n\n const headers = await this.#authHeaders();\n const startTime = Date.now();\n\n const getCoverageResultFn = async (\n signal: AbortSignal,\n ): Promise<Omit<GetCoverageResultResponse, 'metrics'>> => {\n const res = await this.#fetch(coverageResultUrl, {\n method: 'POST',\n headers,\n body: JSON.stringify(reqBody),\n signal,\n });\n\n if (res.status === 200) {\n return (await res.json()) as Omit<GetCoverageResultResponse, 'metrics'>;\n }\n\n let errorMessage = 'Timeout waiting for coverage result';\n try {\n const errorJson = (await res.json()) as {\n message?: string;\n status?: string;\n };\n errorMessage = `Failed to get coverage result: ${errorJson.message ?? errorJson.status}`;\n } catch {\n errorMessage = `Failed to get coverage result: ${res.status}`;\n }\n throw new HttpError(res.status, errorMessage);\n };\n\n const result = await this.#pollingPolicy.start(\n requestId,\n getCoverageResultFn,\n );\n\n const totalLatency = Date.now() - startTime;\n\n return {\n ...result,\n metrics: { latency: totalLatency },\n } as GetCoverageResultResponse;\n }\n\n async #authHeaders(): Promise<Record<string, string>> {\n const token = await this.messenger.call(\n 'AuthenticationController:getBearerToken',\n );\n return {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${token}`,\n };\n }\n}\n\n/**\n * Make the body for the init coverage check request.\n *\n * @param txMeta - The transaction metadata.\n * @returns The body for the init coverage check request.\n */\nexport function makeInitCoverageCheckBody(\n txMeta: TransactionMeta,\n): InitCoverageCheckRequest {\n return {\n txParams: [\n {\n authorizationList: txMeta.txParams.authorizationList,\n from: txMeta.txParams.from,\n to: txMeta.txParams.to,\n value: txMeta.txParams.value,\n data: txMeta.txParams.data,\n nonce: txMeta.txParams.nonce,\n },\n ],\n chainId: txMeta.chainId,\n origin: txMeta.origin,\n };\n}\n\n/**\n * Make the body for the init signature coverage check request.\n *\n * @param signatureRequest - The signature request.\n * @returns The body for the init signature coverage check request.\n */\nfunction makeInitSignatureCoverageCheckBody(\n signatureRequest: SignatureRequest,\n): InitSignatureCoverageCheckRequest {\n const method = parseSignatureRequestMethod(signatureRequest);\n\n return {\n chainId: signatureRequest.chainId,\n data: signatureRequest.messageParams.data,\n from: signatureRequest.messageParams.from,\n method,\n origin: signatureRequest.messageParams.origin,\n };\n}\n\n/**\n * Parse the JSON-RPC method from the signature request.\n *\n * @param signatureRequest - The signature request.\n * @returns The JSON-RPC method.\n */\nexport function parseSignatureRequestMethod(\n signatureRequest: SignatureRequest,\n): string {\n if (signatureRequest.type === SignatureRequestType.TypedSign) {\n switch (signatureRequest.version) {\n case SignTypedDataVersion.V3:\n return EthMethod.SignTypedDataV3;\n case SignTypedDataVersion.V4:\n return EthMethod.SignTypedDataV4;\n case SignTypedDataVersion.V1:\n default:\n return SignatureRequestType.TypedSign;\n }\n }\n\n return signatureRequest.type;\n}\n\n/**\n * Compute the polling interval and retry count for the Cockatiel policy based on the timeout and poll interval given.\n *\n * @param timeout - The timeout in milliseconds.\n * @param pollInterval - The poll interval in milliseconds.\n * @returns The polling interval and retry count.\n */\nfunction computePollingIntervalAndRetryCount(\n timeout: number,\n pollInterval: number,\n): { backoff: ConstantBackoff; maxRetries: number } {\n const backoff = new ConstantBackoff(pollInterval);\n const computedMaxRetries = Math.floor(timeout / pollInterval) + 1;\n\n const maxRetries =\n isNaN(computedMaxRetries) || !isFinite(computedMaxRetries)\n ? DEFAULT_MAX_RETRIES\n : computedMaxRetries;\n\n return {\n backoff,\n maxRetries,\n };\n}\n\n/**\n * Create an error instance with a readable message, a cause and a context for Sentry.\n *\n * @param errorMessage - The error message.\n * @param cause - The cause of the error.\n * @returns A Sentry error.\n */\nfunction createSentryError(errorMessage: string, cause: Error): Error {\n const error = new Error(errorMessage) as Error & {\n cause: Error;\n };\n error.cause = cause;\n return error;\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@metamask-previews/shield-controller",
|
|
3
|
-
"version": "6.0.0-preview-
|
|
3
|
+
"version": "6.0.0-preview-e81fe8853",
|
|
4
4
|
"description": "Controller handling shield transaction coverage logic",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"Ethereum",
|
|
@@ -63,7 +63,7 @@
|
|
|
63
63
|
"@metamask/signature-controller": "^39.2.9",
|
|
64
64
|
"@metamask/transaction-controller": "^69.5.2",
|
|
65
65
|
"@metamask/utils": "^11.11.0",
|
|
66
|
-
"@tanstack/query-core": "^
|
|
66
|
+
"@tanstack/query-core": "^5.62.16",
|
|
67
67
|
"cockatiel": "^3.1.2"
|
|
68
68
|
},
|
|
69
69
|
"devDependencies": {
|