MCPcopy Create free account
hub / github.com/Effect-TS/effect / runAdaptive

Function runAdaptive

packages/effect/src/unstable/http/HttpClient.ts:1196–1240  ·  view source on GitHub ↗
()

Source from the content-addressed store, hash-verified

1194 }),
1195 ({ delay }) => {
1196 const runAdaptive = (): Effect.Effect<
1197 HttpClientResponse.HttpClientResponse,
1198 E | RateLimiter.RateLimiterError,
1199 R
1200 > => {
1201 const runRequest = (adaptive: RateLimiter.AdaptiveConsumeResult | undefined) => {
1202 const request = Effect.matchEffect(effect, {
1203 onSuccess(response) {
1204 return Effect.flatMap(inspectResponse(response, adaptive), (retryAfter) => {
1205 if (response.status !== 429 || !canRetry) return Effect.succeed(response)
1206 return retry(retryAfter)
1207 })
1208 },
1209 onFailure(error) {
1210 if (isTooManyRequestsHttpClientError(error)) {
1211 return Effect.flatMap(
1212 inspectResponse(error.reason.response, adaptive),
1213 (retryAfter) => canRetry ? retry(retryAfter) : Effect.fail(error)
1214 )
1215 }
1216 return Effect.fail(error)
1217 }
1218 })
1219 return adaptive === undefined || Duration.isZero(adaptive.delay)
1220 ? request
1221 : Effect.delay(request, adaptive.delay)
1222 }
1223 if (!adaptiveLearningEnabled) {
1224 return runRequest(undefined)
1225 }
1226 return Effect.flatMap(
1227 options.limiter.adaptiveConsume({
1228 key,
1229 tokens,
1230 fallbackLimit: current.limit,
1231 fallbackWindow: current.window
1232 }),
1233 (adaptive) => {
1234 if (!Duration.isZero(adaptive.delay) && adaptive.phase === "cooldown") {
1235 return Effect.flatMap(Effect.sleep(adaptive.delay), runAdaptive)
1236 }
1237 return runRequest(adaptive)
1238 }
1239 )
1240 }
1241 return Duration.isZero(delay) ? runAdaptive() : Effect.flatMap(Effect.sleep(delay), runAdaptive)
1242 }
1243 )

Callers 1

HttpClient.tsFile · 0.85

Calls 2

runRequestFunction · 0.85
sleepMethod · 0.65

Tested by

no test coverage detected