@distilled.cloud/core 0.28.1 → 0.29.0
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/lib/retry.d.ts +2 -2
- package/lib/retry.d.ts.map +1 -1
- package/lib/retry.js +17 -10
- package/lib/retry.js.map +1 -1
- package/package.json +5 -5
- package/src/retry.ts +25 -13
package/lib/retry.d.ts
CHANGED
|
@@ -42,11 +42,11 @@ export declare const makeRetryService: (name: string) => Context.ServiceClass<an
|
|
|
42
42
|
* Custom jittered schedule helper.
|
|
43
43
|
* Adds random jitter between 0-50ms to avoid thundering herd.
|
|
44
44
|
*/
|
|
45
|
-
export declare const jittered: <
|
|
45
|
+
export declare const jittered: <Error, Env>(self: Schedule.Schedule<unknown, unknown, Error, Env>) => Schedule.Schedule<unknown, unknown, Error, Env>;
|
|
46
46
|
/**
|
|
47
47
|
* Cap delay at a maximum duration.
|
|
48
48
|
*/
|
|
49
|
-
export declare const capped: (max: Duration.Duration) => <
|
|
49
|
+
export declare const capped: (max: Duration.Duration) => <Error, Env>(self: Schedule.Schedule<unknown, unknown, Error, Env>) => Schedule.Schedule<unknown, unknown, Error, Env>;
|
|
50
50
|
/**
|
|
51
51
|
* Default cap (milliseconds) on how long we'll honor a server-provided
|
|
52
52
|
* `Retry-After` / `RateLimit` hint. A misbehaving server can otherwise park
|
package/lib/retry.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"retry.d.ts","sourceRoot":"","sources":["../src/retry.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"retry.d.ts","sourceRoot":"","sources":["../src/retry.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,OAAO,MAAM,gBAAgB,CAAC;AAC1C,OAAO,KAAK,QAAQ,MAAM,iBAAiB,CAAC;AAG5C,OAAO,KAAK,KAAK,MAAM,cAAc,CAAC;AAEtC,OAAO,KAAK,GAAG,MAAM,YAAY,CAAC;AAClC,OAAO,KAAK,QAAQ,MAAM,iBAAiB,CAAC;AAO5C;;GAEG;AACH,MAAM,WAAW,OAAO;IACtB;;OAEG;IACH,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,OAAO,CAAC;IAC7C;;OAEG;IACH,QAAQ,CAAC,QAAQ,CAAC,EAAE,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;CAChD;AAED;;;GAGG;AACH,MAAM,MAAM,OAAO,GAAG,CAAC,SAAS,EAAE,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,OAAO,CAAC;AAE/D;;GAEG;AACH,MAAM,MAAM,MAAM,GAAG,OAAO,GAAG,OAAO,CAAC;AAMvC;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,gBAAgB,SAAU,MAAM,8CACP,CAAC;AAMvC;;;GAGG;AACH,eAAO,MAAM,QAAQ,wHAEpB,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,MAAM,QAAS,QAAQ,CAAC,QAAQ,2HAK1C,CAAC;AAMJ;;;;GAIG;AACH,eAAO,MAAM,gCAAgC,QAAS,CAAC;AAIvD;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,oBAAoB,iCAEhC,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,uBAAuB,UAAW,MAAM,sCACT,CAAC;AAc7C;;;;;;;GAOG;AACH,eAAO,MAAM,+BAA+B,QAAO,MAWhD,CAAC;AA4DJ;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,WAAW,EAAE,OAcxB,CAAC;AAEH;;;GAGG;AACH,eAAO,MAAM,iBAAiB,EAAE,OAQ9B,CAAC;AAEH;;;;;;GAMG;AACH,eAAO,MAAM,iBAAiB,EAAE,OAO/B,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,gBAAgB,EAAE,OAQ7B,CAAC;AAEH;;;;;;;;;;GAUG;AACH,eAAO,MAAM,gBAAgB,EAAE,OAO9B,CAAC"}
|
package/lib/retry.js
CHANGED
|
@@ -8,6 +8,7 @@
|
|
|
8
8
|
* for that SDK without wrapping every call with `Effect.retry`.
|
|
9
9
|
*/
|
|
10
10
|
import * as Config from "effect/Config";
|
|
11
|
+
import * as ConfigProvider from "effect/ConfigProvider";
|
|
11
12
|
import * as Context from "effect/Context";
|
|
12
13
|
import * as Duration from "effect/Duration";
|
|
13
14
|
import * as Effect from "effect/Effect";
|
|
@@ -44,7 +45,7 @@ export const jittered = Schedule.addDelay(() => Effect.succeed(Duration.millis(M
|
|
|
44
45
|
/**
|
|
45
46
|
* Cap delay at a maximum duration.
|
|
46
47
|
*/
|
|
47
|
-
export const capped = (max) => Schedule.modifyDelay((duration) => Effect.succeed(Duration.isGreaterThan(duration, max) ? Duration.millis(5000) : duration));
|
|
48
|
+
export const capped = (max) => Schedule.modifyDelay(({ duration }) => Effect.succeed(Duration.isGreaterThan(duration, max) ? Duration.millis(5000) : duration));
|
|
48
49
|
// ============================================================================
|
|
49
50
|
// Server Hint Helpers
|
|
50
51
|
// ============================================================================
|
|
@@ -88,7 +89,10 @@ const serverRetryHintCapMsConfig = Config.string(ENV_SERVER_RETRY_HINT_CAP_MS).p
|
|
|
88
89
|
* Effect's {@link Config} (must be a non-negative finite number; invalid
|
|
89
90
|
* values fall back to the default).
|
|
90
91
|
*/
|
|
91
|
-
export const readServerRetryHintCapMsFromEnv = () => Effect.runSync(serverRetryHintCapMsConfig.pipe(Effect.orElseSucceed(() => DEFAULT_SERVER_RETRY_HINT_CAP_MS)
|
|
92
|
+
export const readServerRetryHintCapMsFromEnv = () => Effect.runSync(serverRetryHintCapMsConfig.pipe(Effect.orElseSucceed(() => DEFAULT_SERVER_RETRY_HINT_CAP_MS),
|
|
93
|
+
// The default ConfigProvider caches env reads; use a fresh provider so
|
|
94
|
+
// each call observes the current process.env value.
|
|
95
|
+
Effect.provideService(ConfigProvider.ConfigProvider, ConfigProvider.fromEnv())));
|
|
92
96
|
const resolveServerRetryHintCapMs = () => Effect.gen(function* () {
|
|
93
97
|
const fromLayer = yield* Effect.serviceOption(ServerRetryHintCapMs);
|
|
94
98
|
if (Option.isSome(fromLayer)) {
|
|
@@ -96,7 +100,7 @@ const resolveServerRetryHintCapMs = () => Effect.gen(function* () {
|
|
|
96
100
|
if (Number.isFinite(n) && n >= 0)
|
|
97
101
|
return Math.trunc(n);
|
|
98
102
|
}
|
|
99
|
-
return yield* serverRetryHintCapMsConfig.pipe(Effect.orElseSucceed(() => DEFAULT_SERVER_RETRY_HINT_CAP_MS));
|
|
103
|
+
return yield* serverRetryHintCapMsConfig.pipe(Effect.orElseSucceed(() => DEFAULT_SERVER_RETRY_HINT_CAP_MS), Effect.provideService(ConfigProvider.ConfigProvider, ConfigProvider.fromEnv()));
|
|
100
104
|
});
|
|
101
105
|
/**
|
|
102
106
|
* Extract a server-provided retry hint (in milliseconds) from an error's
|
|
@@ -118,7 +122,7 @@ const serverHintMillis = (error, capMs) => {
|
|
|
118
122
|
* over the input delay. Falls back to the original delay when no hint is
|
|
119
123
|
* present.
|
|
120
124
|
*/
|
|
121
|
-
const honorServerHint = (lastError, baseline) => Schedule.modifyDelay(Effect.fnUntraced(function* (duration) {
|
|
125
|
+
const honorServerHint = (lastError, baseline) => Schedule.modifyDelay(Effect.fnUntraced(function* ({ duration }) {
|
|
122
126
|
const capMs = yield* resolveServerRetryHintCapMs();
|
|
123
127
|
const error = yield* Ref.get(lastError);
|
|
124
128
|
const hint = serverHintMillis(error, capMs);
|
|
@@ -145,12 +149,15 @@ const honorServerHint = (lastError, baseline) => Schedule.modifyDelay(Effect.fnU
|
|
|
145
149
|
*/
|
|
146
150
|
export const makeDefault = (lastError) => ({
|
|
147
151
|
while: (error) => isTransientError(error),
|
|
148
|
-
schedule:
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
152
|
+
schedule: Schedule.max([
|
|
153
|
+
pipe(Schedule.exponential(100, 2), honorServerHint(lastError, (duration, error) => {
|
|
154
|
+
if (isThrottling(error) && Duration.toMillis(duration) < 500) {
|
|
155
|
+
return Duration.millis(500);
|
|
156
|
+
}
|
|
157
|
+
return duration;
|
|
158
|
+
})),
|
|
159
|
+
Schedule.recurs(5),
|
|
160
|
+
]).pipe(jittered),
|
|
154
161
|
});
|
|
155
162
|
/**
|
|
156
163
|
* Factory for the throttling-only retry policy. Honors server hints when
|
package/lib/retry.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"retry.js","sourceRoot":"","sources":["../src/retry.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AACxC,OAAO,KAAK,OAAO,MAAM,gBAAgB,CAAC;AAC1C,OAAO,KAAK,QAAQ,MAAM,iBAAiB,CAAC;AAC5C,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AACxC,OAAO,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAC;AACvC,OAAO,KAAK,KAAK,MAAM,cAAc,CAAC;AACtC,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AACxC,OAAO,KAAK,GAAG,MAAM,YAAY,CAAC;AAClC,OAAO,KAAK,QAAQ,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AA+B/D,+EAA+E;AAC/E,wBAAwB;AACxB,+EAA+E;AAE/E;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,IAAY,EAAE,EAAE,CAC/C,OAAO,CAAC,OAAO,EAAe,CAAC,IAAI,CAAC,CAAC;AAEvC,+EAA+E;AAC/E,2BAA2B;AAC3B,+EAA+E;AAE/E;;;GAGG;AACH,MAAM,CAAC,MAAM,QAAQ,GAAG,QAAQ,CAAC,QAAQ,CAAC,GAAG,EAAE,CAC7C,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC,CACpD,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,MAAM,MAAM,GAAG,CAAC,GAAsB,EAAE,EAAE,CAC/C,QAAQ,CAAC,WAAW,CAAC,CAAC,
|
|
1
|
+
{"version":3,"file":"retry.js","sourceRoot":"","sources":["../src/retry.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@distilled.cloud/core",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.29.0",
|
|
4
4
|
"repository": {
|
|
5
5
|
"type": "git",
|
|
6
6
|
"url": "https://github.com/alchemy-run/distilled",
|
|
@@ -79,11 +79,11 @@
|
|
|
79
79
|
}
|
|
80
80
|
},
|
|
81
81
|
"scripts": {
|
|
82
|
-
"typecheck": "
|
|
83
|
-
"build": "
|
|
82
|
+
"typecheck": "tsc",
|
|
83
|
+
"build": "tsc -b",
|
|
84
84
|
"fmt": "oxfmt --write src",
|
|
85
85
|
"lint": "oxlint --fix src",
|
|
86
|
-
"check": "
|
|
86
|
+
"check": "tsc && oxlint src && oxfmt --check src",
|
|
87
87
|
"test": "bunx vitest run test --exclude specs --passWithNoTests",
|
|
88
88
|
"publish:npm": "bun run build && bun publish --access public"
|
|
89
89
|
},
|
|
@@ -94,6 +94,6 @@
|
|
|
94
94
|
"vitest": "^3.2.3"
|
|
95
95
|
},
|
|
96
96
|
"peerDependencies": {
|
|
97
|
-
"effect": ">=4.0.0-beta.
|
|
97
|
+
"effect": ">=4.0.0-beta.97 || >=4.0.0"
|
|
98
98
|
}
|
|
99
99
|
}
|
package/src/retry.ts
CHANGED
|
@@ -8,6 +8,7 @@
|
|
|
8
8
|
* for that SDK without wrapping every call with `Effect.retry`.
|
|
9
9
|
*/
|
|
10
10
|
import * as Config from "effect/Config";
|
|
11
|
+
import * as ConfigProvider from "effect/ConfigProvider";
|
|
11
12
|
import * as Context from "effect/Context";
|
|
12
13
|
import * as Duration from "effect/Duration";
|
|
13
14
|
import * as Effect from "effect/Effect";
|
|
@@ -82,7 +83,7 @@ export const jittered = Schedule.addDelay(() =>
|
|
|
82
83
|
* Cap delay at a maximum duration.
|
|
83
84
|
*/
|
|
84
85
|
export const capped = (max: Duration.Duration) =>
|
|
85
|
-
Schedule.modifyDelay((duration
|
|
86
|
+
Schedule.modifyDelay(({ duration }) =>
|
|
86
87
|
Effect.succeed(
|
|
87
88
|
Duration.isGreaterThan(duration, max) ? Duration.millis(5000) : duration,
|
|
88
89
|
),
|
|
@@ -147,6 +148,12 @@ export const readServerRetryHintCapMsFromEnv = (): number =>
|
|
|
147
148
|
Effect.runSync(
|
|
148
149
|
serverRetryHintCapMsConfig.pipe(
|
|
149
150
|
Effect.orElseSucceed(() => DEFAULT_SERVER_RETRY_HINT_CAP_MS),
|
|
151
|
+
// The default ConfigProvider caches env reads; use a fresh provider so
|
|
152
|
+
// each call observes the current process.env value.
|
|
153
|
+
Effect.provideService(
|
|
154
|
+
ConfigProvider.ConfigProvider,
|
|
155
|
+
ConfigProvider.fromEnv(),
|
|
156
|
+
),
|
|
150
157
|
),
|
|
151
158
|
);
|
|
152
159
|
|
|
@@ -159,6 +166,10 @@ const resolveServerRetryHintCapMs = (): Effect.Effect<number, never, never> =>
|
|
|
159
166
|
}
|
|
160
167
|
return yield* serverRetryHintCapMsConfig.pipe(
|
|
161
168
|
Effect.orElseSucceed(() => DEFAULT_SERVER_RETRY_HINT_CAP_MS),
|
|
169
|
+
Effect.provideService(
|
|
170
|
+
ConfigProvider.ConfigProvider,
|
|
171
|
+
ConfigProvider.fromEnv(),
|
|
172
|
+
),
|
|
162
173
|
);
|
|
163
174
|
});
|
|
164
175
|
|
|
@@ -190,7 +201,7 @@ const honorServerHint = (
|
|
|
190
201
|
baseline?: (duration: Duration.Duration, error: unknown) => Duration.Duration,
|
|
191
202
|
) =>
|
|
192
203
|
Schedule.modifyDelay(
|
|
193
|
-
Effect.fnUntraced(function* (duration
|
|
204
|
+
Effect.fnUntraced(function* ({ duration }) {
|
|
194
205
|
const capMs = yield* resolveServerRetryHintCapMs();
|
|
195
206
|
const error = yield* Ref.get(lastError);
|
|
196
207
|
const hint = serverHintMillis(error, capMs);
|
|
@@ -219,17 +230,18 @@ const honorServerHint = (
|
|
|
219
230
|
*/
|
|
220
231
|
export const makeDefault: Factory = (lastError) => ({
|
|
221
232
|
while: (error) => isTransientError(error),
|
|
222
|
-
schedule:
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
+
schedule: Schedule.max([
|
|
234
|
+
pipe(
|
|
235
|
+
Schedule.exponential(100, 2),
|
|
236
|
+
honorServerHint(lastError, (duration, error) => {
|
|
237
|
+
if (isThrottling(error) && Duration.toMillis(duration) < 500) {
|
|
238
|
+
return Duration.millis(500);
|
|
239
|
+
}
|
|
240
|
+
return duration;
|
|
241
|
+
}),
|
|
242
|
+
),
|
|
243
|
+
Schedule.recurs(5),
|
|
244
|
+
]).pipe(jittered),
|
|
233
245
|
});
|
|
234
246
|
|
|
235
247
|
/**
|