|
1 | 1 | /* global Zinnia */
|
2 | 2 |
|
3 | 3 | import { ActivityState } from './activity-state.js'
|
4 |
| -import { SPARK_VERSION, MAX_CAR_SIZE, APPROX_ROUND_LENGTH_IN_MS, MAX_JITTER_BETWEEN_TASKS_IN_MS } from './constants.js' |
| 4 | +import { SPARK_VERSION, MAX_CAR_SIZE, APPROX_ROUND_LENGTH_IN_MS, MAX_JITTER_BETWEEN_TASKS_IN_MS, MAX_REQUEST_DURATION_MS } from './constants.js' |
5 | 5 | import { queryTheIndex } from './ipni-client.js'
|
6 | 6 | import { assertOkResponse } from './http-assertions.js'
|
7 | 7 | import { getIndexProviderPeerId as defaultGetIndexProvider } from './miner-info.js'
|
@@ -83,20 +83,27 @@ export default class Spark {
|
83 | 83 | }
|
84 | 84 | }
|
85 | 85 |
|
86 |
| - async fetchCAR (protocol, address, cid, stats) { |
| 86 | + async fetchCAR (protocol, address, cid, stats, { maxRequestDurationMs = MAX_REQUEST_DURATION_MS } = {}) { |
87 | 87 | // Abort if no progress was made for 60 seconds
|
88 | 88 | const controller = new AbortController()
|
89 | 89 | const { signal } = controller
|
90 |
| - let timeout |
| 90 | + |
| 91 | + let requestIdleTimeout |
| 92 | + let maxDurationTimeout |
| 93 | + |
91 | 94 | const resetTimeout = () => {
|
92 |
| - if (timeout) { |
93 |
| - clearTimeout(timeout) |
| 95 | + if (requestIdleTimeout) { |
| 96 | + clearTimeout(requestIdleTimeout) |
94 | 97 | }
|
95 |
| - timeout = setTimeout(() => { |
| 98 | + requestIdleTimeout = setTimeout(() => { |
96 | 99 | stats.timeout = true
|
97 | 100 | controller.abort()
|
98 | 101 | }, 60_000)
|
99 | 102 | }
|
| 103 | + maxDurationTimeout = setTimeout(() => { |
| 104 | + stats.timeout = true |
| 105 | + controller.abort() |
| 106 | + }, maxRequestDurationMs) |
100 | 107 |
|
101 | 108 | // WebCrypto API does not support streams yet, the hashing function requires entire data
|
102 | 109 | // to be provided at once. See https://github.com/w3c/webcrypto/issues/73
|
@@ -157,7 +164,8 @@ export default class Spark {
|
157 | 164 | stats.statusCode = mapErrorToStatusCode(err)
|
158 | 165 | }
|
159 | 166 | } finally {
|
160 |
| - clearTimeout(timeout) |
| 167 | + clearTimeout(requestIdleTimeout) |
| 168 | + clearTimeout(maxDurationTimeout) |
161 | 169 | }
|
162 | 170 |
|
163 | 171 | stats.endAt = new Date()
|
|
0 commit comments