@metamask-previews/shield-controller 0.3.2-preview-332b0b7a → 0.3.2-preview-8504447
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 +0 -6
- package/dist/ShieldController.cjs +7 -35
- package/dist/ShieldController.cjs.map +1 -1
- package/dist/ShieldController.d.cts.map +1 -1
- package/dist/ShieldController.d.mts.map +1 -1
- package/dist/ShieldController.mjs +8 -36
- package/dist/ShieldController.mjs.map +1 -1
- package/dist/backend.cjs +41 -34
- package/dist/backend.cjs.map +1 -1
- package/dist/backend.d.cts.map +1 -1
- package/dist/backend.d.mts.map +1 -1
- package/dist/backend.mjs +41 -34
- package/dist/backend.mjs.map +1 -1
- package/package.json +1 -1
- package/dist/polling-with-timeout-abort.cjs +0 -152
- package/dist/polling-with-timeout-abort.cjs.map +0 -1
- package/dist/polling-with-timeout-abort.d.cts +0 -41
- package/dist/polling-with-timeout-abort.d.cts.map +0 -1
- package/dist/polling-with-timeout-abort.d.mts +0 -41
- package/dist/polling-with-timeout-abort.d.mts.map +0 -1
- package/dist/polling-with-timeout-abort.mjs +0 -148
- package/dist/polling-with-timeout-abort.mjs.map +0 -1
package/dist/backend.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"backend.cjs","sourceRoot":"","sources":["../src/backend.ts"],"names":[],"mappings":"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","sourcesContent":["import type { SignatureRequest } from '@metamask/signature-controller';\nimport type { TransactionMeta } from '@metamask/transaction-controller';\n\nimport { PollingWithTimeoutAndAbort } from './polling-with-timeout-abort';\nimport type {\n CheckCoverageRequest,\n CheckSignatureCoverageRequest,\n CoverageResult,\n CoverageStatus,\n LogSignatureRequest,\n LogTransactionRequest,\n ShieldBackend,\n} from './types';\n\nexport type InitCoverageCheckRequest = {\n txParams: [\n {\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: string;\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};\n\nexport class ShieldRemoteBackend implements ShieldBackend {\n readonly #getAccessToken: () => Promise<string>;\n\n readonly #getCoverageResultTimeout: number;\n\n readonly #getCoverageResultPollInterval: number;\n\n readonly #baseUrl: string;\n\n readonly #fetch: typeof globalThis.fetch;\n\n readonly #pollingWithTimeout: PollingWithTimeoutAndAbort;\n\n constructor({\n getAccessToken,\n getCoverageResultTimeout = 5000, // milliseconds\n getCoverageResultPollInterval = 1000, // milliseconds\n baseUrl,\n fetch: fetchFn,\n }: {\n getAccessToken: () => Promise<string>;\n getCoverageResultTimeout?: number;\n getCoverageResultPollInterval?: number;\n baseUrl: string;\n fetch: typeof globalThis.fetch;\n }) {\n this.#getAccessToken = getAccessToken;\n this.#getCoverageResultTimeout = getCoverageResultTimeout;\n this.#getCoverageResultPollInterval = getCoverageResultPollInterval;\n this.#baseUrl = baseUrl;\n this.#fetch = fetchFn;\n this.#pollingWithTimeout = new PollingWithTimeoutAndAbort({\n timeout: getCoverageResultTimeout,\n pollInterval: getCoverageResultPollInterval,\n });\n }\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 ));\n }\n\n const txCoverageResultUrl = `${this.#baseUrl}/v1/transaction/coverage/result`;\n const coverageResult = await this.#getCoverageResult(coverageId, {\n requestId: req.txMeta.id,\n coverageResultUrl: txCoverageResultUrl,\n });\n return {\n coverageId,\n message: coverageResult.message,\n reasonCode: coverageResult.reasonCode,\n status: coverageResult.status,\n };\n }\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 ));\n }\n\n const signatureCoverageResultUrl = `${this.#baseUrl}/v1/signature/coverage/result`;\n const coverageResult = await this.#getCoverageResult(coverageId, {\n requestId: req.signatureRequest.id,\n coverageResultUrl: signatureCoverageResultUrl,\n });\n return {\n coverageId,\n message: coverageResult.message,\n reasonCode: coverageResult.reasonCode,\n status: coverageResult.status,\n };\n }\n\n async logSignature(req: LogSignatureRequest): Promise<void> {\n const initBody = makeInitSignatureCoverageCheckBody(req.signatureRequest);\n const body = {\n signature: req.signature,\n status: req.status,\n ...initBody,\n };\n\n // clean up the pending coverage result polling\n this.#pollingWithTimeout.abortPendingRequest(req.signatureRequest.id);\n\n const res = await this.#fetch(\n `${this.#baseUrl}/v1/signature/coverage/log`,\n {\n method: 'POST',\n headers: await this.#createHeaders(),\n body: JSON.stringify(body),\n },\n );\n if (res.status !== 200) {\n throw new Error(`Failed to log signature: ${res.status}`);\n }\n }\n\n async logTransaction(req: LogTransactionRequest): Promise<void> {\n const initBody = makeInitCoverageCheckBody(req.txMeta);\n const body = {\n transactionHash: req.transactionHash,\n status: req.status,\n ...initBody,\n };\n\n // clean up the pending coverage result polling\n this.#pollingWithTimeout.abortPendingRequest(req.txMeta.id);\n\n const res = await this.#fetch(\n `${this.#baseUrl}/v1/transaction/coverage/log`,\n {\n method: 'POST',\n headers: await this.#createHeaders(),\n body: JSON.stringify(body),\n },\n );\n if (res.status !== 200) {\n throw new Error(`Failed to log transaction: ${res.status}`);\n }\n }\n\n async #initCoverageCheck(\n path: string,\n reqBody: unknown,\n ): Promise<InitCoverageCheckResponse> {\n const res = await this.#fetch(`${this.#baseUrl}/${path}`, {\n method: 'POST',\n headers: await this.#createHeaders(),\n body: JSON.stringify(reqBody),\n });\n if (res.status !== 200) {\n throw new Error(`Failed to init coverage check: ${res.status}`);\n }\n return (await res.json()) as InitCoverageCheckResponse;\n }\n\n async #getCoverageResult(\n coverageId: string,\n config: {\n requestId: string;\n coverageResultUrl: string;\n timeout?: number;\n pollInterval?: number;\n },\n ): Promise<GetCoverageResultResponse> {\n const reqBody: GetCoverageResultRequest = {\n coverageId,\n };\n const pollingOptions = {\n timeout: config.timeout ?? this.#getCoverageResultTimeout,\n pollInterval: config.pollInterval ?? this.#getCoverageResultPollInterval,\n fnName: 'getCoverageResult',\n };\n const headers = await this.#createHeaders();\n\n const requestCoverageFn = async (\n signal: AbortSignal,\n ): Promise<GetCoverageResultResponse> => {\n const res = await this.#fetch(config.coverageResultUrl, {\n method: 'POST',\n headers,\n body: JSON.stringify(reqBody),\n signal,\n });\n if (res.status === 200) {\n return (await res.json()) as GetCoverageResultResponse;\n }\n throw new Error(`Failed to get coverage result: ${res.status}`);\n };\n\n const coverageResult = await this.#pollingWithTimeout.pollRequest(\n config.requestId,\n requestCoverageFn,\n pollingOptions,\n );\n return coverageResult;\n }\n\n async #createHeaders() {\n const accessToken = await this.#getAccessToken();\n return {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${accessToken}`,\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 */\nfunction makeInitCoverageCheckBody(\n txMeta: TransactionMeta,\n): InitCoverageCheckRequest {\n return {\n txParams: [\n {\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 if (typeof signatureRequest.messageParams.data !== 'string') {\n throw new Error('Signature data must be a string');\n }\n\n return {\n chainId: signatureRequest.chainId,\n data: signatureRequest.messageParams.data as string,\n from: signatureRequest.messageParams.from,\n method: signatureRequest.type,\n origin: signatureRequest.messageParams.origin,\n };\n}\n"]}
|
|
1
|
+
{"version":3,"file":"backend.cjs","sourceRoot":"","sources":["../src/backend.ts"],"names":[],"mappings":"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","sourcesContent":["import type { SignatureRequest } from '@metamask/signature-controller';\nimport type { TransactionMeta } from '@metamask/transaction-controller';\n\nimport type {\n CheckCoverageRequest,\n CheckSignatureCoverageRequest,\n CoverageResult,\n CoverageStatus,\n LogSignatureRequest,\n LogTransactionRequest,\n ShieldBackend,\n} from './types';\n\nexport type InitCoverageCheckRequest = {\n txParams: [\n {\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: string;\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};\n\nexport class ShieldRemoteBackend implements ShieldBackend {\n readonly #getAccessToken: () => Promise<string>;\n\n readonly #getCoverageResultTimeout: number;\n\n readonly #getCoverageResultPollInterval: number;\n\n readonly #baseUrl: string;\n\n readonly #fetch: typeof globalThis.fetch;\n\n constructor({\n getAccessToken,\n getCoverageResultTimeout = 5000, // milliseconds\n getCoverageResultPollInterval = 1000, // milliseconds\n baseUrl,\n fetch: fetchFn,\n }: {\n getAccessToken: () => Promise<string>;\n getCoverageResultTimeout?: number;\n getCoverageResultPollInterval?: number;\n baseUrl: string;\n fetch: typeof globalThis.fetch;\n }) {\n this.#getAccessToken = getAccessToken;\n this.#getCoverageResultTimeout = getCoverageResultTimeout;\n this.#getCoverageResultPollInterval = getCoverageResultPollInterval;\n this.#baseUrl = baseUrl;\n this.#fetch = fetchFn;\n }\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 ));\n }\n\n const txCoverageResultUrl = `${this.#baseUrl}/v1/transaction/coverage/result`;\n const coverageResult = await this.#getCoverageResult(coverageId, {\n coverageResultUrl: txCoverageResultUrl,\n });\n return {\n coverageId,\n message: coverageResult.message,\n reasonCode: coverageResult.reasonCode,\n status: coverageResult.status,\n };\n }\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 ));\n }\n\n const signatureCoverageResultUrl = `${this.#baseUrl}/v1/signature/coverage/result`;\n const coverageResult = await this.#getCoverageResult(coverageId, {\n coverageResultUrl: signatureCoverageResultUrl,\n });\n return {\n coverageId,\n message: coverageResult.message,\n reasonCode: coverageResult.reasonCode,\n status: coverageResult.status,\n };\n }\n\n async logSignature(req: LogSignatureRequest): Promise<void> {\n const initBody = makeInitSignatureCoverageCheckBody(req.signatureRequest);\n const body = {\n signature: req.signature,\n status: req.status,\n ...initBody,\n };\n\n const res = await this.#fetch(\n `${this.#baseUrl}/v1/signature/coverage/log`,\n {\n method: 'POST',\n headers: await this.#createHeaders(),\n body: JSON.stringify(body),\n },\n );\n if (res.status !== 200) {\n throw new Error(`Failed to log signature: ${res.status}`);\n }\n }\n\n async logTransaction(req: LogTransactionRequest): Promise<void> {\n const initBody = makeInitCoverageCheckBody(req.txMeta);\n const body = {\n transactionHash: req.transactionHash,\n status: req.status,\n ...initBody,\n };\n\n const res = await this.#fetch(\n `${this.#baseUrl}/v1/transaction/coverage/log`,\n {\n method: 'POST',\n headers: await this.#createHeaders(),\n body: JSON.stringify(body),\n },\n );\n if (res.status !== 200) {\n throw new Error(`Failed to log transaction: ${res.status}`);\n }\n }\n\n async #initCoverageCheck(\n path: string,\n reqBody: unknown,\n ): Promise<InitCoverageCheckResponse> {\n const res = await this.#fetch(`${this.#baseUrl}/${path}`, {\n method: 'POST',\n headers: await this.#createHeaders(),\n body: JSON.stringify(reqBody),\n });\n if (res.status !== 200) {\n throw new Error(`Failed to init coverage check: ${res.status}`);\n }\n return (await res.json()) as InitCoverageCheckResponse;\n }\n\n async #getCoverageResult(\n coverageId: string,\n configs: {\n coverageResultUrl: string;\n timeout?: number;\n pollInterval?: number;\n },\n ): Promise<GetCoverageResultResponse> {\n const reqBody: GetCoverageResultRequest = {\n coverageId,\n };\n\n const timeout = configs?.timeout ?? this.#getCoverageResultTimeout;\n const pollInterval =\n configs?.pollInterval ?? this.#getCoverageResultPollInterval;\n\n const headers = await this.#createHeaders();\n return await new Promise((resolve, reject) => {\n let timeoutReached = false;\n setTimeout(() => {\n timeoutReached = true;\n reject(new Error('Timeout waiting for coverage result'));\n }, timeout);\n\n const poll = async (): Promise<GetCoverageResultResponse> => {\n // The timeoutReached variable is modified in the timeout callback.\n // eslint-disable-next-line no-unmodified-loop-condition\n while (!timeoutReached) {\n const startTime = Date.now();\n const res = await this.#fetch(configs.coverageResultUrl, {\n method: 'POST',\n headers,\n body: JSON.stringify(reqBody),\n });\n if (res.status === 200) {\n return (await res.json()) as GetCoverageResultResponse;\n }\n await sleep(pollInterval - (Date.now() - startTime));\n }\n // The following line will not have an effect as the upper level promise\n // will already be rejected by now.\n throw new Error('unexpected error');\n };\n\n poll().then(resolve).catch(reject);\n });\n }\n\n async #createHeaders() {\n const accessToken = await this.#getAccessToken();\n return {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${accessToken}`,\n };\n }\n}\n\n/**\n * Sleep for a specified amount of time.\n *\n * @param ms - The number of milliseconds to sleep.\n * @returns A promise that resolves after the specified amount of time.\n */\nasync function sleep(ms: number) {\n return new Promise((resolve) => setTimeout(resolve, ms));\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 */\nfunction makeInitCoverageCheckBody(\n txMeta: TransactionMeta,\n): InitCoverageCheckRequest {\n return {\n txParams: [\n {\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 if (typeof signatureRequest.messageParams.data !== 'string') {\n throw new Error('Signature data must be a string');\n }\n\n return {\n chainId: signatureRequest.chainId,\n data: signatureRequest.messageParams.data as string,\n from: signatureRequest.messageParams.from,\n method: signatureRequest.type,\n origin: signatureRequest.messageParams.origin,\n };\n}\n"]}
|
package/dist/backend.d.cts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"backend.d.cts","sourceRoot":"","sources":["../src/backend.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"backend.d.cts","sourceRoot":"","sources":["../src/backend.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACV,oBAAoB,EACpB,6BAA6B,EAC7B,cAAc,EACd,cAAc,EACd,mBAAmB,EACnB,qBAAqB,EACrB,aAAa,EACd,oBAAgB;AAEjB,MAAM,MAAM,wBAAwB,GAAG;IACrC,QAAQ,EAAE;QACR;YACE,IAAI,EAAE,MAAM,CAAC;YACb,EAAE,CAAC,EAAE,MAAM,CAAC;YACZ,KAAK,CAAC,EAAE,MAAM,CAAC;YACf,IAAI,CAAC,EAAE,MAAM,CAAC;YACd,KAAK,CAAC,EAAE,MAAM,CAAC;SAChB;KACF,CAAC;IACF,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,MAAM,MAAM,iCAAiC,GAAG;IAC9C,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,MAAM,MAAM,yBAAyB,GAAG;IACtC,UAAU,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,wBAAwB,GAAG;IACrC,UAAU,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,yBAAyB,GAAG;IACtC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,cAAc,CAAC;CACxB,CAAC;AAEF,qBAAa,mBAAoB,YAAW,aAAa;;gBAW3C,EACV,cAAc,EACd,wBAA+B,EAAE,eAAe;IAChD,6BAAoC,EAAE,eAAe;IACrD,OAAO,EACP,KAAK,EAAE,OAAO,GACf,EAAE;QACD,cAAc,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,CAAC;QACtC,wBAAwB,CAAC,EAAE,MAAM,CAAC;QAClC,6BAA6B,CAAC,EAAE,MAAM,CAAC;QACvC,OAAO,EAAE,MAAM,CAAC;QAChB,KAAK,EAAE,OAAO,UAAU,CAAC,KAAK,CAAC;KAChC;IAQK,aAAa,CAAC,GAAG,EAAE,oBAAoB,GAAG,OAAO,CAAC,cAAc,CAAC;IAsBjE,sBAAsB,CAC1B,GAAG,EAAE,6BAA6B,GACjC,OAAO,CAAC,cAAc,CAAC;IAsBpB,YAAY,CAAC,GAAG,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC;IAqBrD,cAAc,CAAC,GAAG,EAAE,qBAAqB,GAAG,OAAO,CAAC,IAAI,CAAC;CA2FhE"}
|
package/dist/backend.d.mts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"backend.d.mts","sourceRoot":"","sources":["../src/backend.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"backend.d.mts","sourceRoot":"","sources":["../src/backend.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACV,oBAAoB,EACpB,6BAA6B,EAC7B,cAAc,EACd,cAAc,EACd,mBAAmB,EACnB,qBAAqB,EACrB,aAAa,EACd,oBAAgB;AAEjB,MAAM,MAAM,wBAAwB,GAAG;IACrC,QAAQ,EAAE;QACR;YACE,IAAI,EAAE,MAAM,CAAC;YACb,EAAE,CAAC,EAAE,MAAM,CAAC;YACZ,KAAK,CAAC,EAAE,MAAM,CAAC;YACf,IAAI,CAAC,EAAE,MAAM,CAAC;YACd,KAAK,CAAC,EAAE,MAAM,CAAC;SAChB;KACF,CAAC;IACF,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,MAAM,MAAM,iCAAiC,GAAG;IAC9C,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,MAAM,MAAM,yBAAyB,GAAG;IACtC,UAAU,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,wBAAwB,GAAG;IACrC,UAAU,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,yBAAyB,GAAG;IACtC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,cAAc,CAAC;CACxB,CAAC;AAEF,qBAAa,mBAAoB,YAAW,aAAa;;gBAW3C,EACV,cAAc,EACd,wBAA+B,EAAE,eAAe;IAChD,6BAAoC,EAAE,eAAe;IACrD,OAAO,EACP,KAAK,EAAE,OAAO,GACf,EAAE;QACD,cAAc,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,CAAC;QACtC,wBAAwB,CAAC,EAAE,MAAM,CAAC;QAClC,6BAA6B,CAAC,EAAE,MAAM,CAAC;QACvC,OAAO,EAAE,MAAM,CAAC;QAChB,KAAK,EAAE,OAAO,UAAU,CAAC,KAAK,CAAC;KAChC;IAQK,aAAa,CAAC,GAAG,EAAE,oBAAoB,GAAG,OAAO,CAAC,cAAc,CAAC;IAsBjE,sBAAsB,CAC1B,GAAG,EAAE,6BAA6B,GACjC,OAAO,CAAC,cAAc,CAAC;IAsBpB,YAAY,CAAC,GAAG,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC;IAqBrD,cAAc,CAAC,GAAG,EAAE,qBAAqB,GAAG,OAAO,CAAC,IAAI,CAAC;CA2FhE"}
|
package/dist/backend.mjs
CHANGED
|
@@ -9,8 +9,7 @@ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (
|
|
|
9
9
|
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
|
|
10
10
|
return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
|
|
11
11
|
};
|
|
12
|
-
var _ShieldRemoteBackend_instances, _ShieldRemoteBackend_getAccessToken, _ShieldRemoteBackend_getCoverageResultTimeout, _ShieldRemoteBackend_getCoverageResultPollInterval, _ShieldRemoteBackend_baseUrl, _ShieldRemoteBackend_fetch,
|
|
13
|
-
import { PollingWithTimeoutAndAbort } from "./polling-with-timeout-abort.mjs";
|
|
12
|
+
var _ShieldRemoteBackend_instances, _ShieldRemoteBackend_getAccessToken, _ShieldRemoteBackend_getCoverageResultTimeout, _ShieldRemoteBackend_getCoverageResultPollInterval, _ShieldRemoteBackend_baseUrl, _ShieldRemoteBackend_fetch, _ShieldRemoteBackend_initCoverageCheck, _ShieldRemoteBackend_getCoverageResult, _ShieldRemoteBackend_createHeaders;
|
|
14
13
|
export class ShieldRemoteBackend {
|
|
15
14
|
constructor({ getAccessToken, getCoverageResultTimeout = 5000, // milliseconds
|
|
16
15
|
getCoverageResultPollInterval = 1000, // milliseconds
|
|
@@ -21,16 +20,11 @@ export class ShieldRemoteBackend {
|
|
|
21
20
|
_ShieldRemoteBackend_getCoverageResultPollInterval.set(this, void 0);
|
|
22
21
|
_ShieldRemoteBackend_baseUrl.set(this, void 0);
|
|
23
22
|
_ShieldRemoteBackend_fetch.set(this, void 0);
|
|
24
|
-
_ShieldRemoteBackend_pollingWithTimeout.set(this, void 0);
|
|
25
23
|
__classPrivateFieldSet(this, _ShieldRemoteBackend_getAccessToken, getAccessToken, "f");
|
|
26
24
|
__classPrivateFieldSet(this, _ShieldRemoteBackend_getCoverageResultTimeout, getCoverageResultTimeout, "f");
|
|
27
25
|
__classPrivateFieldSet(this, _ShieldRemoteBackend_getCoverageResultPollInterval, getCoverageResultPollInterval, "f");
|
|
28
26
|
__classPrivateFieldSet(this, _ShieldRemoteBackend_baseUrl, baseUrl, "f");
|
|
29
27
|
__classPrivateFieldSet(this, _ShieldRemoteBackend_fetch, fetchFn, "f");
|
|
30
|
-
__classPrivateFieldSet(this, _ShieldRemoteBackend_pollingWithTimeout, new PollingWithTimeoutAndAbort({
|
|
31
|
-
timeout: getCoverageResultTimeout,
|
|
32
|
-
pollInterval: getCoverageResultPollInterval,
|
|
33
|
-
}), "f");
|
|
34
28
|
}
|
|
35
29
|
async checkCoverage(req) {
|
|
36
30
|
let { coverageId } = req;
|
|
@@ -40,7 +34,6 @@ export class ShieldRemoteBackend {
|
|
|
40
34
|
}
|
|
41
35
|
const txCoverageResultUrl = `${__classPrivateFieldGet(this, _ShieldRemoteBackend_baseUrl, "f")}/v1/transaction/coverage/result`;
|
|
42
36
|
const coverageResult = await __classPrivateFieldGet(this, _ShieldRemoteBackend_instances, "m", _ShieldRemoteBackend_getCoverageResult).call(this, coverageId, {
|
|
43
|
-
requestId: req.txMeta.id,
|
|
44
37
|
coverageResultUrl: txCoverageResultUrl,
|
|
45
38
|
});
|
|
46
39
|
return {
|
|
@@ -58,7 +51,6 @@ export class ShieldRemoteBackend {
|
|
|
58
51
|
}
|
|
59
52
|
const signatureCoverageResultUrl = `${__classPrivateFieldGet(this, _ShieldRemoteBackend_baseUrl, "f")}/v1/signature/coverage/result`;
|
|
60
53
|
const coverageResult = await __classPrivateFieldGet(this, _ShieldRemoteBackend_instances, "m", _ShieldRemoteBackend_getCoverageResult).call(this, coverageId, {
|
|
61
|
-
requestId: req.signatureRequest.id,
|
|
62
54
|
coverageResultUrl: signatureCoverageResultUrl,
|
|
63
55
|
});
|
|
64
56
|
return {
|
|
@@ -75,8 +67,6 @@ export class ShieldRemoteBackend {
|
|
|
75
67
|
status: req.status,
|
|
76
68
|
...initBody,
|
|
77
69
|
};
|
|
78
|
-
// clean up the pending coverage result polling
|
|
79
|
-
__classPrivateFieldGet(this, _ShieldRemoteBackend_pollingWithTimeout, "f").abortPendingRequest(req.signatureRequest.id);
|
|
80
70
|
const res = await __classPrivateFieldGet(this, _ShieldRemoteBackend_fetch, "f").call(this, `${__classPrivateFieldGet(this, _ShieldRemoteBackend_baseUrl, "f")}/v1/signature/coverage/log`, {
|
|
81
71
|
method: 'POST',
|
|
82
72
|
headers: await __classPrivateFieldGet(this, _ShieldRemoteBackend_instances, "m", _ShieldRemoteBackend_createHeaders).call(this),
|
|
@@ -93,8 +83,6 @@ export class ShieldRemoteBackend {
|
|
|
93
83
|
status: req.status,
|
|
94
84
|
...initBody,
|
|
95
85
|
};
|
|
96
|
-
// clean up the pending coverage result polling
|
|
97
|
-
__classPrivateFieldGet(this, _ShieldRemoteBackend_pollingWithTimeout, "f").abortPendingRequest(req.txMeta.id);
|
|
98
86
|
const res = await __classPrivateFieldGet(this, _ShieldRemoteBackend_fetch, "f").call(this, `${__classPrivateFieldGet(this, _ShieldRemoteBackend_baseUrl, "f")}/v1/transaction/coverage/log`, {
|
|
99
87
|
method: 'POST',
|
|
100
88
|
headers: await __classPrivateFieldGet(this, _ShieldRemoteBackend_instances, "m", _ShieldRemoteBackend_createHeaders).call(this),
|
|
@@ -105,7 +93,7 @@ export class ShieldRemoteBackend {
|
|
|
105
93
|
}
|
|
106
94
|
}
|
|
107
95
|
}
|
|
108
|
-
_ShieldRemoteBackend_getAccessToken = new WeakMap(), _ShieldRemoteBackend_getCoverageResultTimeout = new WeakMap(), _ShieldRemoteBackend_getCoverageResultPollInterval = new WeakMap(), _ShieldRemoteBackend_baseUrl = new WeakMap(), _ShieldRemoteBackend_fetch = new WeakMap(),
|
|
96
|
+
_ShieldRemoteBackend_getAccessToken = new WeakMap(), _ShieldRemoteBackend_getCoverageResultTimeout = new WeakMap(), _ShieldRemoteBackend_getCoverageResultPollInterval = new WeakMap(), _ShieldRemoteBackend_baseUrl = new WeakMap(), _ShieldRemoteBackend_fetch = new WeakMap(), _ShieldRemoteBackend_instances = new WeakSet(), _ShieldRemoteBackend_initCoverageCheck = async function _ShieldRemoteBackend_initCoverageCheck(path, reqBody) {
|
|
109
97
|
const res = await __classPrivateFieldGet(this, _ShieldRemoteBackend_fetch, "f").call(this, `${__classPrivateFieldGet(this, _ShieldRemoteBackend_baseUrl, "f")}/${path}`, {
|
|
110
98
|
method: 'POST',
|
|
111
99
|
headers: await __classPrivateFieldGet(this, _ShieldRemoteBackend_instances, "m", _ShieldRemoteBackend_createHeaders).call(this),
|
|
@@ -115,30 +103,40 @@ _ShieldRemoteBackend_getAccessToken = new WeakMap(), _ShieldRemoteBackend_getCov
|
|
|
115
103
|
throw new Error(`Failed to init coverage check: ${res.status}`);
|
|
116
104
|
}
|
|
117
105
|
return (await res.json());
|
|
118
|
-
}, _ShieldRemoteBackend_getCoverageResult = async function _ShieldRemoteBackend_getCoverageResult(coverageId,
|
|
106
|
+
}, _ShieldRemoteBackend_getCoverageResult = async function _ShieldRemoteBackend_getCoverageResult(coverageId, configs) {
|
|
119
107
|
const reqBody = {
|
|
120
108
|
coverageId,
|
|
121
109
|
};
|
|
122
|
-
const
|
|
123
|
-
|
|
124
|
-
pollInterval: config.pollInterval ?? __classPrivateFieldGet(this, _ShieldRemoteBackend_getCoverageResultPollInterval, "f"),
|
|
125
|
-
fnName: 'getCoverageResult',
|
|
126
|
-
};
|
|
110
|
+
const timeout = configs?.timeout ?? __classPrivateFieldGet(this, _ShieldRemoteBackend_getCoverageResultTimeout, "f");
|
|
111
|
+
const pollInterval = configs?.pollInterval ?? __classPrivateFieldGet(this, _ShieldRemoteBackend_getCoverageResultPollInterval, "f");
|
|
127
112
|
const headers = await __classPrivateFieldGet(this, _ShieldRemoteBackend_instances, "m", _ShieldRemoteBackend_createHeaders).call(this);
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
113
|
+
return await new Promise((resolve, reject) => {
|
|
114
|
+
let timeoutReached = false;
|
|
115
|
+
setTimeout(() => {
|
|
116
|
+
timeoutReached = true;
|
|
117
|
+
reject(new Error('Timeout waiting for coverage result'));
|
|
118
|
+
}, timeout);
|
|
119
|
+
const poll = async () => {
|
|
120
|
+
// The timeoutReached variable is modified in the timeout callback.
|
|
121
|
+
// eslint-disable-next-line no-unmodified-loop-condition
|
|
122
|
+
while (!timeoutReached) {
|
|
123
|
+
const startTime = Date.now();
|
|
124
|
+
const res = await __classPrivateFieldGet(this, _ShieldRemoteBackend_fetch, "f").call(this, configs.coverageResultUrl, {
|
|
125
|
+
method: 'POST',
|
|
126
|
+
headers,
|
|
127
|
+
body: JSON.stringify(reqBody),
|
|
128
|
+
});
|
|
129
|
+
if (res.status === 200) {
|
|
130
|
+
return (await res.json());
|
|
131
|
+
}
|
|
132
|
+
await sleep(pollInterval - (Date.now() - startTime));
|
|
133
|
+
}
|
|
134
|
+
// The following line will not have an effect as the upper level promise
|
|
135
|
+
// will already be rejected by now.
|
|
136
|
+
throw new Error('unexpected error');
|
|
137
|
+
};
|
|
138
|
+
poll().then(resolve).catch(reject);
|
|
139
|
+
});
|
|
142
140
|
}, _ShieldRemoteBackend_createHeaders = async function _ShieldRemoteBackend_createHeaders() {
|
|
143
141
|
const accessToken = await __classPrivateFieldGet(this, _ShieldRemoteBackend_getAccessToken, "f").call(this);
|
|
144
142
|
return {
|
|
@@ -146,6 +144,15 @@ _ShieldRemoteBackend_getAccessToken = new WeakMap(), _ShieldRemoteBackend_getCov
|
|
|
146
144
|
Authorization: `Bearer ${accessToken}`,
|
|
147
145
|
};
|
|
148
146
|
};
|
|
147
|
+
/**
|
|
148
|
+
* Sleep for a specified amount of time.
|
|
149
|
+
*
|
|
150
|
+
* @param ms - The number of milliseconds to sleep.
|
|
151
|
+
* @returns A promise that resolves after the specified amount of time.
|
|
152
|
+
*/
|
|
153
|
+
async function sleep(ms) {
|
|
154
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
155
|
+
}
|
|
149
156
|
/**
|
|
150
157
|
* Make the body for the init coverage check request.
|
|
151
158
|
*
|
package/dist/backend.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"backend.mjs","sourceRoot":"","sources":["../src/backend.ts"],"names":[],"mappings":"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","sourcesContent":["import type { SignatureRequest } from '@metamask/signature-controller';\nimport type { TransactionMeta } from '@metamask/transaction-controller';\n\nimport { PollingWithTimeoutAndAbort } from './polling-with-timeout-abort';\nimport type {\n CheckCoverageRequest,\n CheckSignatureCoverageRequest,\n CoverageResult,\n CoverageStatus,\n LogSignatureRequest,\n LogTransactionRequest,\n ShieldBackend,\n} from './types';\n\nexport type InitCoverageCheckRequest = {\n txParams: [\n {\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: string;\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};\n\nexport class ShieldRemoteBackend implements ShieldBackend {\n readonly #getAccessToken: () => Promise<string>;\n\n readonly #getCoverageResultTimeout: number;\n\n readonly #getCoverageResultPollInterval: number;\n\n readonly #baseUrl: string;\n\n readonly #fetch: typeof globalThis.fetch;\n\n readonly #pollingWithTimeout: PollingWithTimeoutAndAbort;\n\n constructor({\n getAccessToken,\n getCoverageResultTimeout = 5000, // milliseconds\n getCoverageResultPollInterval = 1000, // milliseconds\n baseUrl,\n fetch: fetchFn,\n }: {\n getAccessToken: () => Promise<string>;\n getCoverageResultTimeout?: number;\n getCoverageResultPollInterval?: number;\n baseUrl: string;\n fetch: typeof globalThis.fetch;\n }) {\n this.#getAccessToken = getAccessToken;\n this.#getCoverageResultTimeout = getCoverageResultTimeout;\n this.#getCoverageResultPollInterval = getCoverageResultPollInterval;\n this.#baseUrl = baseUrl;\n this.#fetch = fetchFn;\n this.#pollingWithTimeout = new PollingWithTimeoutAndAbort({\n timeout: getCoverageResultTimeout,\n pollInterval: getCoverageResultPollInterval,\n });\n }\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 ));\n }\n\n const txCoverageResultUrl = `${this.#baseUrl}/v1/transaction/coverage/result`;\n const coverageResult = await this.#getCoverageResult(coverageId, {\n requestId: req.txMeta.id,\n coverageResultUrl: txCoverageResultUrl,\n });\n return {\n coverageId,\n message: coverageResult.message,\n reasonCode: coverageResult.reasonCode,\n status: coverageResult.status,\n };\n }\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 ));\n }\n\n const signatureCoverageResultUrl = `${this.#baseUrl}/v1/signature/coverage/result`;\n const coverageResult = await this.#getCoverageResult(coverageId, {\n requestId: req.signatureRequest.id,\n coverageResultUrl: signatureCoverageResultUrl,\n });\n return {\n coverageId,\n message: coverageResult.message,\n reasonCode: coverageResult.reasonCode,\n status: coverageResult.status,\n };\n }\n\n async logSignature(req: LogSignatureRequest): Promise<void> {\n const initBody = makeInitSignatureCoverageCheckBody(req.signatureRequest);\n const body = {\n signature: req.signature,\n status: req.status,\n ...initBody,\n };\n\n // clean up the pending coverage result polling\n this.#pollingWithTimeout.abortPendingRequest(req.signatureRequest.id);\n\n const res = await this.#fetch(\n `${this.#baseUrl}/v1/signature/coverage/log`,\n {\n method: 'POST',\n headers: await this.#createHeaders(),\n body: JSON.stringify(body),\n },\n );\n if (res.status !== 200) {\n throw new Error(`Failed to log signature: ${res.status}`);\n }\n }\n\n async logTransaction(req: LogTransactionRequest): Promise<void> {\n const initBody = makeInitCoverageCheckBody(req.txMeta);\n const body = {\n transactionHash: req.transactionHash,\n status: req.status,\n ...initBody,\n };\n\n // clean up the pending coverage result polling\n this.#pollingWithTimeout.abortPendingRequest(req.txMeta.id);\n\n const res = await this.#fetch(\n `${this.#baseUrl}/v1/transaction/coverage/log`,\n {\n method: 'POST',\n headers: await this.#createHeaders(),\n body: JSON.stringify(body),\n },\n );\n if (res.status !== 200) {\n throw new Error(`Failed to log transaction: ${res.status}`);\n }\n }\n\n async #initCoverageCheck(\n path: string,\n reqBody: unknown,\n ): Promise<InitCoverageCheckResponse> {\n const res = await this.#fetch(`${this.#baseUrl}/${path}`, {\n method: 'POST',\n headers: await this.#createHeaders(),\n body: JSON.stringify(reqBody),\n });\n if (res.status !== 200) {\n throw new Error(`Failed to init coverage check: ${res.status}`);\n }\n return (await res.json()) as InitCoverageCheckResponse;\n }\n\n async #getCoverageResult(\n coverageId: string,\n config: {\n requestId: string;\n coverageResultUrl: string;\n timeout?: number;\n pollInterval?: number;\n },\n ): Promise<GetCoverageResultResponse> {\n const reqBody: GetCoverageResultRequest = {\n coverageId,\n };\n const pollingOptions = {\n timeout: config.timeout ?? this.#getCoverageResultTimeout,\n pollInterval: config.pollInterval ?? this.#getCoverageResultPollInterval,\n fnName: 'getCoverageResult',\n };\n const headers = await this.#createHeaders();\n\n const requestCoverageFn = async (\n signal: AbortSignal,\n ): Promise<GetCoverageResultResponse> => {\n const res = await this.#fetch(config.coverageResultUrl, {\n method: 'POST',\n headers,\n body: JSON.stringify(reqBody),\n signal,\n });\n if (res.status === 200) {\n return (await res.json()) as GetCoverageResultResponse;\n }\n throw new Error(`Failed to get coverage result: ${res.status}`);\n };\n\n const coverageResult = await this.#pollingWithTimeout.pollRequest(\n config.requestId,\n requestCoverageFn,\n pollingOptions,\n );\n return coverageResult;\n }\n\n async #createHeaders() {\n const accessToken = await this.#getAccessToken();\n return {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${accessToken}`,\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 */\nfunction makeInitCoverageCheckBody(\n txMeta: TransactionMeta,\n): InitCoverageCheckRequest {\n return {\n txParams: [\n {\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 if (typeof signatureRequest.messageParams.data !== 'string') {\n throw new Error('Signature data must be a string');\n }\n\n return {\n chainId: signatureRequest.chainId,\n data: signatureRequest.messageParams.data as string,\n from: signatureRequest.messageParams.from,\n method: signatureRequest.type,\n origin: signatureRequest.messageParams.origin,\n };\n}\n"]}
|
|
1
|
+
{"version":3,"file":"backend.mjs","sourceRoot":"","sources":["../src/backend.ts"],"names":[],"mappings":"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","sourcesContent":["import type { SignatureRequest } from '@metamask/signature-controller';\nimport type { TransactionMeta } from '@metamask/transaction-controller';\n\nimport type {\n CheckCoverageRequest,\n CheckSignatureCoverageRequest,\n CoverageResult,\n CoverageStatus,\n LogSignatureRequest,\n LogTransactionRequest,\n ShieldBackend,\n} from './types';\n\nexport type InitCoverageCheckRequest = {\n txParams: [\n {\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: string;\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};\n\nexport class ShieldRemoteBackend implements ShieldBackend {\n readonly #getAccessToken: () => Promise<string>;\n\n readonly #getCoverageResultTimeout: number;\n\n readonly #getCoverageResultPollInterval: number;\n\n readonly #baseUrl: string;\n\n readonly #fetch: typeof globalThis.fetch;\n\n constructor({\n getAccessToken,\n getCoverageResultTimeout = 5000, // milliseconds\n getCoverageResultPollInterval = 1000, // milliseconds\n baseUrl,\n fetch: fetchFn,\n }: {\n getAccessToken: () => Promise<string>;\n getCoverageResultTimeout?: number;\n getCoverageResultPollInterval?: number;\n baseUrl: string;\n fetch: typeof globalThis.fetch;\n }) {\n this.#getAccessToken = getAccessToken;\n this.#getCoverageResultTimeout = getCoverageResultTimeout;\n this.#getCoverageResultPollInterval = getCoverageResultPollInterval;\n this.#baseUrl = baseUrl;\n this.#fetch = fetchFn;\n }\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 ));\n }\n\n const txCoverageResultUrl = `${this.#baseUrl}/v1/transaction/coverage/result`;\n const coverageResult = await this.#getCoverageResult(coverageId, {\n coverageResultUrl: txCoverageResultUrl,\n });\n return {\n coverageId,\n message: coverageResult.message,\n reasonCode: coverageResult.reasonCode,\n status: coverageResult.status,\n };\n }\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 ));\n }\n\n const signatureCoverageResultUrl = `${this.#baseUrl}/v1/signature/coverage/result`;\n const coverageResult = await this.#getCoverageResult(coverageId, {\n coverageResultUrl: signatureCoverageResultUrl,\n });\n return {\n coverageId,\n message: coverageResult.message,\n reasonCode: coverageResult.reasonCode,\n status: coverageResult.status,\n };\n }\n\n async logSignature(req: LogSignatureRequest): Promise<void> {\n const initBody = makeInitSignatureCoverageCheckBody(req.signatureRequest);\n const body = {\n signature: req.signature,\n status: req.status,\n ...initBody,\n };\n\n const res = await this.#fetch(\n `${this.#baseUrl}/v1/signature/coverage/log`,\n {\n method: 'POST',\n headers: await this.#createHeaders(),\n body: JSON.stringify(body),\n },\n );\n if (res.status !== 200) {\n throw new Error(`Failed to log signature: ${res.status}`);\n }\n }\n\n async logTransaction(req: LogTransactionRequest): Promise<void> {\n const initBody = makeInitCoverageCheckBody(req.txMeta);\n const body = {\n transactionHash: req.transactionHash,\n status: req.status,\n ...initBody,\n };\n\n const res = await this.#fetch(\n `${this.#baseUrl}/v1/transaction/coverage/log`,\n {\n method: 'POST',\n headers: await this.#createHeaders(),\n body: JSON.stringify(body),\n },\n );\n if (res.status !== 200) {\n throw new Error(`Failed to log transaction: ${res.status}`);\n }\n }\n\n async #initCoverageCheck(\n path: string,\n reqBody: unknown,\n ): Promise<InitCoverageCheckResponse> {\n const res = await this.#fetch(`${this.#baseUrl}/${path}`, {\n method: 'POST',\n headers: await this.#createHeaders(),\n body: JSON.stringify(reqBody),\n });\n if (res.status !== 200) {\n throw new Error(`Failed to init coverage check: ${res.status}`);\n }\n return (await res.json()) as InitCoverageCheckResponse;\n }\n\n async #getCoverageResult(\n coverageId: string,\n configs: {\n coverageResultUrl: string;\n timeout?: number;\n pollInterval?: number;\n },\n ): Promise<GetCoverageResultResponse> {\n const reqBody: GetCoverageResultRequest = {\n coverageId,\n };\n\n const timeout = configs?.timeout ?? this.#getCoverageResultTimeout;\n const pollInterval =\n configs?.pollInterval ?? this.#getCoverageResultPollInterval;\n\n const headers = await this.#createHeaders();\n return await new Promise((resolve, reject) => {\n let timeoutReached = false;\n setTimeout(() => {\n timeoutReached = true;\n reject(new Error('Timeout waiting for coverage result'));\n }, timeout);\n\n const poll = async (): Promise<GetCoverageResultResponse> => {\n // The timeoutReached variable is modified in the timeout callback.\n // eslint-disable-next-line no-unmodified-loop-condition\n while (!timeoutReached) {\n const startTime = Date.now();\n const res = await this.#fetch(configs.coverageResultUrl, {\n method: 'POST',\n headers,\n body: JSON.stringify(reqBody),\n });\n if (res.status === 200) {\n return (await res.json()) as GetCoverageResultResponse;\n }\n await sleep(pollInterval - (Date.now() - startTime));\n }\n // The following line will not have an effect as the upper level promise\n // will already be rejected by now.\n throw new Error('unexpected error');\n };\n\n poll().then(resolve).catch(reject);\n });\n }\n\n async #createHeaders() {\n const accessToken = await this.#getAccessToken();\n return {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${accessToken}`,\n };\n }\n}\n\n/**\n * Sleep for a specified amount of time.\n *\n * @param ms - The number of milliseconds to sleep.\n * @returns A promise that resolves after the specified amount of time.\n */\nasync function sleep(ms: number) {\n return new Promise((resolve) => setTimeout(resolve, ms));\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 */\nfunction makeInitCoverageCheckBody(\n txMeta: TransactionMeta,\n): InitCoverageCheckRequest {\n return {\n txParams: [\n {\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 if (typeof signatureRequest.messageParams.data !== 'string') {\n throw new Error('Signature data must be a string');\n }\n\n return {\n chainId: signatureRequest.chainId,\n data: signatureRequest.messageParams.data as string,\n from: signatureRequest.messageParams.from,\n method: signatureRequest.type,\n origin: signatureRequest.messageParams.origin,\n };\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,152 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {
|
|
3
|
-
if (kind === "m") throw new TypeError("Private method is not writable");
|
|
4
|
-
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
|
|
5
|
-
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
|
|
6
|
-
return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
|
|
7
|
-
};
|
|
8
|
-
var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
|
|
9
|
-
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
|
|
10
|
-
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
|
|
11
|
-
return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
|
|
12
|
-
};
|
|
13
|
-
var _PollingWithTimeoutAndAbort_instances, _PollingWithTimeoutAndAbort_requestEntries, _PollingWithTimeoutAndAbort_timeout, _PollingWithTimeoutAndAbort_pollInterval, _PollingWithTimeoutAndAbort_insertRequestEntry, _PollingWithTimeoutAndAbort_cleanUpOnFinished, _PollingWithTimeoutAndAbort_cleanUpRequestEntryIfExists, _PollingWithTimeoutAndAbort_delayWithAbortSignal;
|
|
14
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
-
exports.PollingWithTimeoutAndAbort = void 0;
|
|
16
|
-
class PollingWithTimeoutAndAbort {
|
|
17
|
-
constructor(config) {
|
|
18
|
-
_PollingWithTimeoutAndAbort_instances.add(this);
|
|
19
|
-
this.ABORT_REASON_TIMEOUT = 'Request timed out';
|
|
20
|
-
this.ABORT_REASON_CANCELLED = 'Request cancelled';
|
|
21
|
-
// Map of request ID to request entry
|
|
22
|
-
_PollingWithTimeoutAndAbort_requestEntries.set(this, new Map());
|
|
23
|
-
_PollingWithTimeoutAndAbort_timeout.set(this, void 0);
|
|
24
|
-
_PollingWithTimeoutAndAbort_pollInterval.set(this, void 0);
|
|
25
|
-
__classPrivateFieldSet(this, _PollingWithTimeoutAndAbort_timeout, config.timeout, "f");
|
|
26
|
-
__classPrivateFieldSet(this, _PollingWithTimeoutAndAbort_pollInterval, config.pollInterval, "f");
|
|
27
|
-
}
|
|
28
|
-
/**
|
|
29
|
-
* Poll a request with a timeout and abort.
|
|
30
|
-
* This will poll the request until it succeeds or fails due to the timeout or the abort signal being triggered.
|
|
31
|
-
*
|
|
32
|
-
* @param requestId - The ID of the request to poll.
|
|
33
|
-
* @param requestFn - The function to poll the request.
|
|
34
|
-
* @param pollingOptions - The options for the polling.
|
|
35
|
-
* @param pollingOptions.timeout - The timeout for the request. Defaults to the constructor's timeout.
|
|
36
|
-
* @param pollingOptions.pollInterval - The interval for the polling. Defaults to the constructor's pollInterval.
|
|
37
|
-
* @param pollingOptions.fnName - The name of the function to poll the request. Defaults to an empty string.
|
|
38
|
-
* @returns The result of the request.
|
|
39
|
-
*/
|
|
40
|
-
async pollRequest(requestId, requestFn, pollingOptions = {}) {
|
|
41
|
-
const timeout = pollingOptions.timeout ?? __classPrivateFieldGet(this, _PollingWithTimeoutAndAbort_timeout, "f");
|
|
42
|
-
const pollInterval = pollingOptions.pollInterval ?? __classPrivateFieldGet(this, _PollingWithTimeoutAndAbort_pollInterval, "f");
|
|
43
|
-
// clean up the request entry if it exists
|
|
44
|
-
this.abortPendingRequest(requestId);
|
|
45
|
-
// insert the request entry for the next polling cycle
|
|
46
|
-
const { abortController } = __classPrivateFieldGet(this, _PollingWithTimeoutAndAbort_instances, "m", _PollingWithTimeoutAndAbort_insertRequestEntry).call(this, requestId, timeout);
|
|
47
|
-
while (!abortController.signal.aborted) {
|
|
48
|
-
try {
|
|
49
|
-
const result = await requestFn(abortController.signal);
|
|
50
|
-
// polling success, we just need to clean up the request entry and return the result
|
|
51
|
-
__classPrivateFieldGet(this, _PollingWithTimeoutAndAbort_instances, "m", _PollingWithTimeoutAndAbort_cleanUpOnFinished).call(this, requestId);
|
|
52
|
-
return result;
|
|
53
|
-
}
|
|
54
|
-
catch {
|
|
55
|
-
if (abortController.signal.aborted) {
|
|
56
|
-
// request failed due to the abort signal being triggered,
|
|
57
|
-
// then we will break out of the polling loop
|
|
58
|
-
break;
|
|
59
|
-
}
|
|
60
|
-
// otherwise, we will wait for the next polling cycle
|
|
61
|
-
// and continue the polling loop
|
|
62
|
-
await __classPrivateFieldGet(this, _PollingWithTimeoutAndAbort_instances, "m", _PollingWithTimeoutAndAbort_delayWithAbortSignal).call(this, pollInterval, abortController.signal);
|
|
63
|
-
continue;
|
|
64
|
-
}
|
|
65
|
-
}
|
|
66
|
-
// At this point, the polling loop has exited and abortController is aborted
|
|
67
|
-
const abortReason = abortController.signal.reason;
|
|
68
|
-
const errorMessage = pollingOptions.fnName
|
|
69
|
-
? `${pollingOptions.fnName}: ${abortReason}`
|
|
70
|
-
: abortReason;
|
|
71
|
-
throw new Error(errorMessage);
|
|
72
|
-
}
|
|
73
|
-
/**
|
|
74
|
-
* Abort the pending requests.
|
|
75
|
-
* This will clean up the request entry if it exists, and abort the pending request if it exists.
|
|
76
|
-
*
|
|
77
|
-
* @param requestId - The ID of the request to abort.
|
|
78
|
-
*/
|
|
79
|
-
abortPendingRequest(requestId) {
|
|
80
|
-
// firstly clean up the request entry if it exists
|
|
81
|
-
// note: this does not abort the request, it only cleans up the request entry for the next polling cycle
|
|
82
|
-
const existingEntry = __classPrivateFieldGet(this, _PollingWithTimeoutAndAbort_instances, "m", _PollingWithTimeoutAndAbort_cleanUpRequestEntryIfExists).call(this, requestId);
|
|
83
|
-
// then abort the request if it exists
|
|
84
|
-
// note: this does abort the request, but it will not trigger the abort handler (hence, {@link cleanUpRequestEntryIfExists} will not be called)
|
|
85
|
-
// coz the AbortHandler event listener is already removed from the AbortSignal
|
|
86
|
-
existingEntry?.abortController.abort(this.ABORT_REASON_CANCELLED);
|
|
87
|
-
}
|
|
88
|
-
}
|
|
89
|
-
exports.PollingWithTimeoutAndAbort = PollingWithTimeoutAndAbort;
|
|
90
|
-
_PollingWithTimeoutAndAbort_requestEntries = new WeakMap(), _PollingWithTimeoutAndAbort_timeout = new WeakMap(), _PollingWithTimeoutAndAbort_pollInterval = new WeakMap(), _PollingWithTimeoutAndAbort_instances = new WeakSet(), _PollingWithTimeoutAndAbort_insertRequestEntry = function _PollingWithTimeoutAndAbort_insertRequestEntry(requestId, timeout) {
|
|
91
|
-
const abortController = new AbortController();
|
|
92
|
-
// Set a timeout to abort the request if it takes too long
|
|
93
|
-
const timerId = setTimeout(() => {
|
|
94
|
-
abortController.abort(this.ABORT_REASON_TIMEOUT);
|
|
95
|
-
}, timeout);
|
|
96
|
-
// Set the abort handler and listen to the `abort` event
|
|
97
|
-
const abortHandler = () => {
|
|
98
|
-
__classPrivateFieldGet(this, _PollingWithTimeoutAndAbort_instances, "m", _PollingWithTimeoutAndAbort_cleanUpOnFinished).call(this, requestId);
|
|
99
|
-
};
|
|
100
|
-
abortController.signal.addEventListener('abort', abortHandler);
|
|
101
|
-
const requestEntry = {
|
|
102
|
-
abortController,
|
|
103
|
-
abortHandler,
|
|
104
|
-
timerId,
|
|
105
|
-
};
|
|
106
|
-
// Insert the request entry
|
|
107
|
-
__classPrivateFieldGet(this, _PollingWithTimeoutAndAbort_requestEntries, "f").set(requestId, requestEntry);
|
|
108
|
-
return requestEntry;
|
|
109
|
-
}, _PollingWithTimeoutAndAbort_cleanUpOnFinished = function _PollingWithTimeoutAndAbort_cleanUpOnFinished(requestId) {
|
|
110
|
-
const requestEntry = __classPrivateFieldGet(this, _PollingWithTimeoutAndAbort_instances, "m", _PollingWithTimeoutAndAbort_cleanUpRequestEntryIfExists).call(this, requestId);
|
|
111
|
-
if (requestEntry) {
|
|
112
|
-
requestEntry.abortController.signal.removeEventListener('abort', requestEntry.abortHandler);
|
|
113
|
-
}
|
|
114
|
-
return requestEntry;
|
|
115
|
-
}, _PollingWithTimeoutAndAbort_cleanUpRequestEntryIfExists = function _PollingWithTimeoutAndAbort_cleanUpRequestEntryIfExists(requestId) {
|
|
116
|
-
const requestEntry = __classPrivateFieldGet(this, _PollingWithTimeoutAndAbort_requestEntries, "f").get(requestId);
|
|
117
|
-
if (requestEntry) {
|
|
118
|
-
clearTimeout(requestEntry.timerId); // Clear the timeout
|
|
119
|
-
__classPrivateFieldGet(this, _PollingWithTimeoutAndAbort_requestEntries, "f").delete(requestId); // Remove the request entry
|
|
120
|
-
}
|
|
121
|
-
return requestEntry;
|
|
122
|
-
}, _PollingWithTimeoutAndAbort_delayWithAbortSignal =
|
|
123
|
-
/**
|
|
124
|
-
* Delay with an abort signal.
|
|
125
|
-
* This will delay the execution of the code until the abort signal is triggered.
|
|
126
|
-
*
|
|
127
|
-
* @param ms - The number of milliseconds to delay.
|
|
128
|
-
* @param abortSignal - The abort signal to listen to.
|
|
129
|
-
* @returns A promise that resolves when the delay is complete.
|
|
130
|
-
*/
|
|
131
|
-
async function _PollingWithTimeoutAndAbort_delayWithAbortSignal(ms, abortSignal) {
|
|
132
|
-
return new Promise((resolve) => {
|
|
133
|
-
let timer = null;
|
|
134
|
-
const abortHandlerForDelay = () => {
|
|
135
|
-
// clear the timeout and resolve the promise
|
|
136
|
-
// Note: we don't reject the promise as this is only a dummy delay
|
|
137
|
-
if (timer) {
|
|
138
|
-
clearTimeout(timer);
|
|
139
|
-
}
|
|
140
|
-
resolve(undefined);
|
|
141
|
-
};
|
|
142
|
-
timer = setTimeout(() => {
|
|
143
|
-
abortSignal.removeEventListener('abort', abortHandlerForDelay);
|
|
144
|
-
resolve(undefined);
|
|
145
|
-
}, ms);
|
|
146
|
-
// set the abort handler to clear the timeout and resolve the promise
|
|
147
|
-
abortSignal.addEventListener('abort', abortHandlerForDelay, {
|
|
148
|
-
once: true, // only listen to the abort event once
|
|
149
|
-
});
|
|
150
|
-
});
|
|
151
|
-
};
|
|
152
|
-
//# sourceMappingURL=polling-with-timeout-abort.cjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"polling-with-timeout-abort.cjs","sourceRoot":"","sources":["../src/polling-with-timeout-abort.ts"],"names":[],"mappings":"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","sourcesContent":["export type RequestEntry = {\n abortController: AbortController; // The abort controller for the request\n abortHandler: (ev: Event) => void; // The abort handler for the request\n timerId: NodeJS.Timeout; // The timer ID for the request timeout\n};\n\nexport type RequestFn<ReturnType> = (\n signal: AbortSignal,\n) => Promise<ReturnType>;\n\nexport class PollingWithTimeoutAndAbort {\n readonly ABORT_REASON_TIMEOUT = 'Request timed out';\n\n readonly ABORT_REASON_CANCELLED = 'Request cancelled';\n\n // Map of request ID to request entry\n readonly #requestEntries: Map<string, RequestEntry> = new Map();\n\n readonly #timeout: number;\n\n readonly #pollInterval: number;\n\n constructor(config: { timeout: number; pollInterval: number }) {\n this.#timeout = config.timeout;\n this.#pollInterval = config.pollInterval;\n }\n\n /**\n * Poll a request with a timeout and abort.\n * This will poll the request until it succeeds or fails due to the timeout or the abort signal being triggered.\n *\n * @param requestId - The ID of the request to poll.\n * @param requestFn - The function to poll the request.\n * @param pollingOptions - The options for the polling.\n * @param pollingOptions.timeout - The timeout for the request. Defaults to the constructor's timeout.\n * @param pollingOptions.pollInterval - The interval for the polling. Defaults to the constructor's pollInterval.\n * @param pollingOptions.fnName - The name of the function to poll the request. Defaults to an empty string.\n * @returns The result of the request.\n */\n async pollRequest<ReturnType>(\n requestId: string,\n requestFn: RequestFn<ReturnType>,\n pollingOptions: {\n timeout?: number;\n pollInterval?: number;\n fnName?: string;\n } = {},\n ) {\n const timeout = pollingOptions.timeout ?? this.#timeout;\n const pollInterval = pollingOptions.pollInterval ?? this.#pollInterval;\n\n // clean up the request entry if it exists\n this.abortPendingRequest(requestId);\n\n // insert the request entry for the next polling cycle\n const { abortController } = this.#insertRequestEntry(requestId, timeout);\n\n while (!abortController.signal.aborted) {\n try {\n const result = await requestFn(abortController.signal);\n // polling success, we just need to clean up the request entry and return the result\n this.#cleanUpOnFinished(requestId);\n return result;\n } catch {\n if (abortController.signal.aborted) {\n // request failed due to the abort signal being triggered,\n // then we will break out of the polling loop\n break;\n }\n // otherwise, we will wait for the next polling cycle\n // and continue the polling loop\n await this.#delayWithAbortSignal(pollInterval, abortController.signal);\n continue;\n }\n }\n // At this point, the polling loop has exited and abortController is aborted\n const abortReason = abortController.signal.reason;\n const errorMessage = pollingOptions.fnName\n ? `${pollingOptions.fnName}: ${abortReason}`\n : abortReason;\n throw new Error(errorMessage);\n }\n\n /**\n * Abort the pending requests.\n * This will clean up the request entry if it exists, and abort the pending request if it exists.\n *\n * @param requestId - The ID of the request to abort.\n */\n abortPendingRequest(requestId: string) {\n // firstly clean up the request entry if it exists\n // note: this does not abort the request, it only cleans up the request entry for the next polling cycle\n const existingEntry = this.#cleanUpRequestEntryIfExists(requestId);\n // then abort the request if it exists\n // note: this does abort the request, but it will not trigger the abort handler (hence, {@link cleanUpRequestEntryIfExists} will not be called)\n // coz the AbortHandler event listener is already removed from the AbortSignal\n existingEntry?.abortController.abort(this.ABORT_REASON_CANCELLED);\n }\n\n /**\n * Insert a new request entry.\n * This will create a new abort controller, set a timeout to abort the request if it takes too long, and set the abort handler.\n *\n * @param requestId - The ID of the request to insert the entry for.\n * @param timeout - The timeout for the request.\n * @returns The request entry that was inserted.\n */\n #insertRequestEntry(requestId: string, timeout: number) {\n const abortController = new AbortController();\n\n // Set a timeout to abort the request if it takes too long\n const timerId = setTimeout(() => {\n abortController.abort(this.ABORT_REASON_TIMEOUT);\n }, timeout);\n\n // Set the abort handler and listen to the `abort` event\n const abortHandler = () => {\n this.#cleanUpOnFinished(requestId);\n };\n abortController.signal.addEventListener('abort', abortHandler);\n\n const requestEntry: RequestEntry = {\n abortController,\n abortHandler,\n timerId,\n };\n\n // Insert the request entry\n this.#requestEntries.set(requestId, requestEntry);\n\n return requestEntry;\n }\n\n /**\n * Clean up the request entry upon finished (success or failure).\n * This will remove the abort handler from the AbortSignal, clear the timeout, and remove the request entry.\n *\n * @param requestId - The ID of the request to clean up for.\n * @returns The request entry that was cleaned up, if it exists.\n */\n #cleanUpOnFinished(requestId: string): RequestEntry | undefined {\n const requestEntry = this.#cleanUpRequestEntryIfExists(requestId);\n if (requestEntry) {\n requestEntry.abortController.signal.removeEventListener(\n 'abort',\n requestEntry.abortHandler,\n );\n }\n return requestEntry;\n }\n\n /**\n * Clean up the request entry if it exists.\n * This will clear the pending timeout, remove the event listener from the AbortSignal, and remove the request entry.\n *\n * @param requestId - The ID of the request to handle the abort for.\n * @returns The request entry that was aborted, if it exists.\n */\n #cleanUpRequestEntryIfExists(requestId: string): RequestEntry | undefined {\n const requestEntry = this.#requestEntries.get(requestId);\n if (requestEntry) {\n clearTimeout(requestEntry.timerId); // Clear the timeout\n this.#requestEntries.delete(requestId); // Remove the request entry\n }\n return requestEntry;\n }\n\n /**\n * Delay with an abort signal.\n * This will delay the execution of the code until the abort signal is triggered.\n *\n * @param ms - The number of milliseconds to delay.\n * @param abortSignal - The abort signal to listen to.\n * @returns A promise that resolves when the delay is complete.\n */\n async #delayWithAbortSignal(ms: number, abortSignal: AbortSignal) {\n return new Promise((resolve) => {\n let timer: NodeJS.Timeout | null = null;\n\n const abortHandlerForDelay = () => {\n // clear the timeout and resolve the promise\n // Note: we don't reject the promise as this is only a dummy delay\n if (timer) {\n clearTimeout(timer);\n }\n resolve(undefined);\n };\n\n timer = setTimeout(() => {\n abortSignal.removeEventListener('abort', abortHandlerForDelay);\n resolve(undefined);\n }, ms);\n\n // set the abort handler to clear the timeout and resolve the promise\n abortSignal.addEventListener('abort', abortHandlerForDelay, {\n once: true, // only listen to the abort event once\n });\n });\n }\n}\n"]}
|
|
@@ -1,41 +0,0 @@
|
|
|
1
|
-
/// <reference types="node" />
|
|
2
|
-
export type RequestEntry = {
|
|
3
|
-
abortController: AbortController;
|
|
4
|
-
abortHandler: (ev: Event) => void;
|
|
5
|
-
timerId: NodeJS.Timeout;
|
|
6
|
-
};
|
|
7
|
-
export type RequestFn<ReturnType> = (signal: AbortSignal) => Promise<ReturnType>;
|
|
8
|
-
export declare class PollingWithTimeoutAndAbort {
|
|
9
|
-
#private;
|
|
10
|
-
readonly ABORT_REASON_TIMEOUT = "Request timed out";
|
|
11
|
-
readonly ABORT_REASON_CANCELLED = "Request cancelled";
|
|
12
|
-
constructor(config: {
|
|
13
|
-
timeout: number;
|
|
14
|
-
pollInterval: number;
|
|
15
|
-
});
|
|
16
|
-
/**
|
|
17
|
-
* Poll a request with a timeout and abort.
|
|
18
|
-
* This will poll the request until it succeeds or fails due to the timeout or the abort signal being triggered.
|
|
19
|
-
*
|
|
20
|
-
* @param requestId - The ID of the request to poll.
|
|
21
|
-
* @param requestFn - The function to poll the request.
|
|
22
|
-
* @param pollingOptions - The options for the polling.
|
|
23
|
-
* @param pollingOptions.timeout - The timeout for the request. Defaults to the constructor's timeout.
|
|
24
|
-
* @param pollingOptions.pollInterval - The interval for the polling. Defaults to the constructor's pollInterval.
|
|
25
|
-
* @param pollingOptions.fnName - The name of the function to poll the request. Defaults to an empty string.
|
|
26
|
-
* @returns The result of the request.
|
|
27
|
-
*/
|
|
28
|
-
pollRequest<ReturnType>(requestId: string, requestFn: RequestFn<ReturnType>, pollingOptions?: {
|
|
29
|
-
timeout?: number;
|
|
30
|
-
pollInterval?: number;
|
|
31
|
-
fnName?: string;
|
|
32
|
-
}): Promise<ReturnType>;
|
|
33
|
-
/**
|
|
34
|
-
* Abort the pending requests.
|
|
35
|
-
* This will clean up the request entry if it exists, and abort the pending request if it exists.
|
|
36
|
-
*
|
|
37
|
-
* @param requestId - The ID of the request to abort.
|
|
38
|
-
*/
|
|
39
|
-
abortPendingRequest(requestId: string): void;
|
|
40
|
-
}
|
|
41
|
-
//# sourceMappingURL=polling-with-timeout-abort.d.cts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"polling-with-timeout-abort.d.cts","sourceRoot":"","sources":["../src/polling-with-timeout-abort.ts"],"names":[],"mappings":";AAAA,MAAM,MAAM,YAAY,GAAG;IACzB,eAAe,EAAE,eAAe,CAAC;IACjC,YAAY,EAAE,CAAC,EAAE,EAAE,KAAK,KAAK,IAAI,CAAC;IAClC,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC;CACzB,CAAC;AAEF,MAAM,MAAM,SAAS,CAAC,UAAU,IAAI,CAClC,MAAM,EAAE,WAAW,KAChB,OAAO,CAAC,UAAU,CAAC,CAAC;AAEzB,qBAAa,0BAA0B;;IACrC,QAAQ,CAAC,oBAAoB,uBAAuB;IAEpD,QAAQ,CAAC,sBAAsB,uBAAuB;gBAS1C,MAAM,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAA;KAAE;IAK7D;;;;;;;;;;;OAWG;IACG,WAAW,CAAC,UAAU,EAC1B,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,SAAS,CAAC,UAAU,CAAC,EAChC,cAAc,GAAE;QACd,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,MAAM,CAAC,EAAE,MAAM,CAAC;KACZ;IAqCR;;;;;OAKG;IACH,mBAAmB,CAAC,SAAS,EAAE,MAAM;CA8GtC"}
|
|
@@ -1,41 +0,0 @@
|
|
|
1
|
-
/// <reference types="node" />
|
|
2
|
-
export type RequestEntry = {
|
|
3
|
-
abortController: AbortController;
|
|
4
|
-
abortHandler: (ev: Event) => void;
|
|
5
|
-
timerId: NodeJS.Timeout;
|
|
6
|
-
};
|
|
7
|
-
export type RequestFn<ReturnType> = (signal: AbortSignal) => Promise<ReturnType>;
|
|
8
|
-
export declare class PollingWithTimeoutAndAbort {
|
|
9
|
-
#private;
|
|
10
|
-
readonly ABORT_REASON_TIMEOUT = "Request timed out";
|
|
11
|
-
readonly ABORT_REASON_CANCELLED = "Request cancelled";
|
|
12
|
-
constructor(config: {
|
|
13
|
-
timeout: number;
|
|
14
|
-
pollInterval: number;
|
|
15
|
-
});
|
|
16
|
-
/**
|
|
17
|
-
* Poll a request with a timeout and abort.
|
|
18
|
-
* This will poll the request until it succeeds or fails due to the timeout or the abort signal being triggered.
|
|
19
|
-
*
|
|
20
|
-
* @param requestId - The ID of the request to poll.
|
|
21
|
-
* @param requestFn - The function to poll the request.
|
|
22
|
-
* @param pollingOptions - The options for the polling.
|
|
23
|
-
* @param pollingOptions.timeout - The timeout for the request. Defaults to the constructor's timeout.
|
|
24
|
-
* @param pollingOptions.pollInterval - The interval for the polling. Defaults to the constructor's pollInterval.
|
|
25
|
-
* @param pollingOptions.fnName - The name of the function to poll the request. Defaults to an empty string.
|
|
26
|
-
* @returns The result of the request.
|
|
27
|
-
*/
|
|
28
|
-
pollRequest<ReturnType>(requestId: string, requestFn: RequestFn<ReturnType>, pollingOptions?: {
|
|
29
|
-
timeout?: number;
|
|
30
|
-
pollInterval?: number;
|
|
31
|
-
fnName?: string;
|
|
32
|
-
}): Promise<ReturnType>;
|
|
33
|
-
/**
|
|
34
|
-
* Abort the pending requests.
|
|
35
|
-
* This will clean up the request entry if it exists, and abort the pending request if it exists.
|
|
36
|
-
*
|
|
37
|
-
* @param requestId - The ID of the request to abort.
|
|
38
|
-
*/
|
|
39
|
-
abortPendingRequest(requestId: string): void;
|
|
40
|
-
}
|
|
41
|
-
//# sourceMappingURL=polling-with-timeout-abort.d.mts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"polling-with-timeout-abort.d.mts","sourceRoot":"","sources":["../src/polling-with-timeout-abort.ts"],"names":[],"mappings":";AAAA,MAAM,MAAM,YAAY,GAAG;IACzB,eAAe,EAAE,eAAe,CAAC;IACjC,YAAY,EAAE,CAAC,EAAE,EAAE,KAAK,KAAK,IAAI,CAAC;IAClC,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC;CACzB,CAAC;AAEF,MAAM,MAAM,SAAS,CAAC,UAAU,IAAI,CAClC,MAAM,EAAE,WAAW,KAChB,OAAO,CAAC,UAAU,CAAC,CAAC;AAEzB,qBAAa,0BAA0B;;IACrC,QAAQ,CAAC,oBAAoB,uBAAuB;IAEpD,QAAQ,CAAC,sBAAsB,uBAAuB;gBAS1C,MAAM,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAA;KAAE;IAK7D;;;;;;;;;;;OAWG;IACG,WAAW,CAAC,UAAU,EAC1B,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,SAAS,CAAC,UAAU,CAAC,EAChC,cAAc,GAAE;QACd,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,MAAM,CAAC,EAAE,MAAM,CAAC;KACZ;IAqCR;;;;;OAKG;IACH,mBAAmB,CAAC,SAAS,EAAE,MAAM;CA8GtC"}
|