@se-studio/contentful-rest-api 1.26.0 → 1.26.1
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 +6 -0
- package/dist/client.js +3 -3
- package/dist/client.js.map +1 -1
- package/dist/utils/index.d.ts +1 -0
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/index.js +1 -0
- package/dist/utils/index.js.map +1 -1
- package/dist/utils/rate-limit-store.d.ts +26 -0
- package/dist/utils/rate-limit-store.d.ts.map +1 -0
- package/dist/utils/rate-limit-store.js +172 -0
- package/dist/utils/rate-limit-store.js.map +1 -0
- package/dist/utils/retry.d.ts +5 -11
- package/dist/utils/retry.d.ts.map +1 -1
- package/dist/utils/retry.js +16 -38
- package/dist/utils/retry.js.map +1 -1
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,11 @@
|
|
|
1
1
|
# @se-studio/contentful-rest-api
|
|
2
2
|
|
|
3
|
+
## 1.26.1
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- Share Contentful CDA rate-limit pauses across Next SSG workers (file-backed limiter) and rethrow 429/5xx from handleCmsError instead of baking static 404s.
|
|
8
|
+
|
|
3
9
|
## 1.26.0
|
|
4
10
|
|
|
5
11
|
### Minor Changes
|
package/dist/client.js
CHANGED
|
@@ -129,7 +129,7 @@ export class ContentfulFetchClient {
|
|
|
129
129
|
`API: ${this.isPreview ? 'preview' : 'delivery'}`);
|
|
130
130
|
// Pause the rate limiter - this affects all queued requests
|
|
131
131
|
const pauseSeconds = getRateLimitPauseSeconds(retryAfter, this.isPreview);
|
|
132
|
-
this.rateLimiter.pause(pauseSeconds);
|
|
132
|
+
await this.rateLimiter.pause(pauseSeconds);
|
|
133
133
|
// Wait before retrying this request
|
|
134
134
|
await sleep(delay);
|
|
135
135
|
continue;
|
|
@@ -186,7 +186,7 @@ export class ContentfulFetchClient {
|
|
|
186
186
|
`Queue: ${this.rateLimiter.getQueueLength()} waiting. ` +
|
|
187
187
|
`API: ${this.isPreview ? 'preview' : 'delivery'}`);
|
|
188
188
|
const pauseSeconds = getRateLimitPauseSeconds(retryAfter, this.isPreview);
|
|
189
|
-
this.rateLimiter.pause(pauseSeconds);
|
|
189
|
+
await this.rateLimiter.pause(pauseSeconds);
|
|
190
190
|
await sleep(delay);
|
|
191
191
|
continue;
|
|
192
192
|
}
|
|
@@ -244,7 +244,7 @@ export class ContentfulFetchClient {
|
|
|
244
244
|
`API: ${this.isPreview ? 'preview' : 'delivery'}`);
|
|
245
245
|
// Pause the rate limiter - this affects all queued requests
|
|
246
246
|
const pauseSeconds = getRateLimitPauseSeconds(retryAfter, this.isPreview);
|
|
247
|
-
this.rateLimiter.pause(pauseSeconds);
|
|
247
|
+
await this.rateLimiter.pause(pauseSeconds);
|
|
248
248
|
// Wait before retrying this request
|
|
249
249
|
await sleep(delay);
|
|
250
250
|
continue;
|
package/dist/client.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
|
package/dist/utils/index.d.ts
CHANGED
|
@@ -4,6 +4,7 @@
|
|
|
4
4
|
export { arrayOrUndefined, notEmpty } from './arrayUtils';
|
|
5
5
|
export { isValidDate, safeDate } from './dateUtils';
|
|
6
6
|
export { AuthenticationError, ContentfulError, EntryNotFoundError, getRetryAfter, isContentfulError, isRateLimitError, isRetryableError, RateLimitError, ValidationError, } from './errors';
|
|
7
|
+
export { FileRateLimitStore, MemoryRateLimitStore, type RateLimitStore, } from './rate-limit-store';
|
|
7
8
|
export { calculateBackoffDelay, getRateLimiter, getRateLimitPauseSeconds, getRetryConfig, RateLimiter, withRetry, } from './retry';
|
|
8
9
|
export { type ArticleForTagSelection, filterVisibleTags, getPrimaryTag, isTagShowEnabled, isTagVisible, type PrimaryTagSelector, type TagVisibilityFields, } from './tags';
|
|
9
10
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,gBAAgB,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AAC1D,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACpD,OAAO,EACL,mBAAmB,EACnB,eAAe,EACf,kBAAkB,EAClB,aAAa,EACb,iBAAiB,EACjB,gBAAgB,EAChB,gBAAgB,EAChB,cAAc,EACd,eAAe,GAChB,MAAM,UAAU,CAAC;AAClB,OAAO,EACL,qBAAqB,EACrB,cAAc,EACd,wBAAwB,EACxB,cAAc,EACd,WAAW,EACX,SAAS,GACV,MAAM,SAAS,CAAC;AACjB,OAAO,EACL,KAAK,sBAAsB,EAC3B,iBAAiB,EACjB,aAAa,EACb,gBAAgB,EAChB,YAAY,EACZ,KAAK,kBAAkB,EACvB,KAAK,mBAAmB,GACzB,MAAM,QAAQ,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,gBAAgB,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AAC1D,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACpD,OAAO,EACL,mBAAmB,EACnB,eAAe,EACf,kBAAkB,EAClB,aAAa,EACb,iBAAiB,EACjB,gBAAgB,EAChB,gBAAgB,EAChB,cAAc,EACd,eAAe,GAChB,MAAM,UAAU,CAAC;AAClB,OAAO,EACL,kBAAkB,EAClB,oBAAoB,EACpB,KAAK,cAAc,GACpB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACL,qBAAqB,EACrB,cAAc,EACd,wBAAwB,EACxB,cAAc,EACd,WAAW,EACX,SAAS,GACV,MAAM,SAAS,CAAC;AACjB,OAAO,EACL,KAAK,sBAAsB,EAC3B,iBAAiB,EACjB,aAAa,EACb,gBAAgB,EAChB,YAAY,EACZ,KAAK,kBAAkB,EACvB,KAAK,mBAAmB,GACzB,MAAM,QAAQ,CAAC"}
|
package/dist/utils/index.js
CHANGED
|
@@ -4,6 +4,7 @@
|
|
|
4
4
|
export { arrayOrUndefined, notEmpty } from './arrayUtils.js';
|
|
5
5
|
export { isValidDate, safeDate } from './dateUtils.js';
|
|
6
6
|
export { AuthenticationError, ContentfulError, EntryNotFoundError, getRetryAfter, isContentfulError, isRateLimitError, isRetryableError, RateLimitError, ValidationError, } from './errors.js';
|
|
7
|
+
export { FileRateLimitStore, MemoryRateLimitStore, } from './rate-limit-store.js';
|
|
7
8
|
export { calculateBackoffDelay, getRateLimiter, getRateLimitPauseSeconds, getRetryConfig, RateLimiter, withRetry, } from './retry.js';
|
|
8
9
|
export { filterVisibleTags, getPrimaryTag, isTagShowEnabled, isTagVisible, } from './tags.js';
|
|
9
10
|
//# sourceMappingURL=index.js.map
|
package/dist/utils/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,gBAAgB,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AAC1D,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACpD,OAAO,EACL,mBAAmB,EACnB,eAAe,EACf,kBAAkB,EAClB,aAAa,EACb,iBAAiB,EACjB,gBAAgB,EAChB,gBAAgB,EAChB,cAAc,EACd,eAAe,GAChB,MAAM,UAAU,CAAC;AAClB,OAAO,EACL,qBAAqB,EACrB,cAAc,EACd,wBAAwB,EACxB,cAAc,EACd,WAAW,EACX,SAAS,GACV,MAAM,SAAS,CAAC;AACjB,OAAO,EAEL,iBAAiB,EACjB,aAAa,EACb,gBAAgB,EAChB,YAAY,GAGb,MAAM,QAAQ,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,gBAAgB,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AAC1D,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACpD,OAAO,EACL,mBAAmB,EACnB,eAAe,EACf,kBAAkB,EAClB,aAAa,EACb,iBAAiB,EACjB,gBAAgB,EAChB,gBAAgB,EAChB,cAAc,EACd,eAAe,GAChB,MAAM,UAAU,CAAC;AAClB,OAAO,EACL,kBAAkB,EAClB,oBAAoB,GAErB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACL,qBAAqB,EACrB,cAAc,EACd,wBAAwB,EACxB,cAAc,EACd,WAAW,EACX,SAAS,GACV,MAAM,SAAS,CAAC;AACjB,OAAO,EAEL,iBAAiB,EACjB,aAAa,EACb,gBAAgB,EAChB,YAAY,GAGb,MAAM,QAAQ,CAAC"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
export interface RateLimitState {
|
|
2
|
+
nextAvailableTime: number;
|
|
3
|
+
pauseUntil: number;
|
|
4
|
+
}
|
|
5
|
+
export interface RateLimitStore {
|
|
6
|
+
reserve(intervalMs: number): Promise<void>;
|
|
7
|
+
pause(seconds: number): Promise<void>;
|
|
8
|
+
}
|
|
9
|
+
/** In-process store. Safe for concurrent callers in one process (mutex). */
|
|
10
|
+
export declare class MemoryRateLimitStore implements RateLimitStore {
|
|
11
|
+
private state;
|
|
12
|
+
private readonly mutex;
|
|
13
|
+
reserve(intervalMs: number): Promise<void>;
|
|
14
|
+
pause(seconds: number): Promise<void>;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Cross-process store for Next SSG workers that share a tmp dir.
|
|
18
|
+
*/
|
|
19
|
+
export declare class FileRateLimitStore implements RateLimitStore {
|
|
20
|
+
private readonly statePath;
|
|
21
|
+
constructor(statePath: string);
|
|
22
|
+
reserve(intervalMs: number): Promise<void>;
|
|
23
|
+
pause(seconds: number): Promise<void>;
|
|
24
|
+
}
|
|
25
|
+
export declare function defaultRateLimitStore(kind: 'delivery' | 'preview'): RateLimitStore;
|
|
26
|
+
//# sourceMappingURL=rate-limit-store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rate-limit-store.d.ts","sourceRoot":"","sources":["../../src/utils/rate-limit-store.ts"],"names":[],"mappings":"AAWA,MAAM,WAAW,cAAc;IAC7B,iBAAiB,EAAE,MAAM,CAAC;IAC1B,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,cAAc;IAC7B,OAAO,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3C,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACvC;AA4BD,4EAA4E;AAC5E,qBAAa,oBAAqB,YAAW,cAAc;IACzD,OAAO,CAAC,KAAK,CAAgB;IAC7B,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAiB;IAEjC,OAAO,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAgB/C;IAEK,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAO1C;CACF;AA+DD;;GAEG;AACH,qBAAa,kBAAmB,YAAW,cAAc;IAC3C,OAAO,CAAC,QAAQ,CAAC,SAAS;IAAtC,YAA6B,SAAS,EAAE,MAAM,EAAI;IAE5C,OAAO,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAkB/C;IAEK,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAS1C;CACF;AAID,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,UAAU,GAAG,SAAS,GAAG,cAAc,CAclF"}
|
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
import { closeSync, mkdirSync, openSync, readFileSync, unlinkSync, writeFileSync } from 'node:fs';
|
|
2
|
+
import { tmpdir } from 'node:os';
|
|
3
|
+
import { join } from 'node:path';
|
|
4
|
+
const STALE_LOCK_MS = 15_000;
|
|
5
|
+
const LOCK_RETRY_MS = 8;
|
|
6
|
+
function sleep(ms) {
|
|
7
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
8
|
+
}
|
|
9
|
+
function createMutex() {
|
|
10
|
+
let chain = Promise.resolve();
|
|
11
|
+
return {
|
|
12
|
+
run(fn) {
|
|
13
|
+
const run = chain.then(fn, fn);
|
|
14
|
+
chain = run.then(() => undefined, () => undefined);
|
|
15
|
+
return run;
|
|
16
|
+
},
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
function emptyState() {
|
|
20
|
+
return { nextAvailableTime: 0, pauseUntil: 0 };
|
|
21
|
+
}
|
|
22
|
+
function waitFromState(state, now) {
|
|
23
|
+
return Math.max(0, state.nextAvailableTime - now, state.pauseUntil - now);
|
|
24
|
+
}
|
|
25
|
+
/** In-process store. Safe for concurrent callers in one process (mutex). */
|
|
26
|
+
export class MemoryRateLimitStore {
|
|
27
|
+
state = emptyState();
|
|
28
|
+
mutex = createMutex();
|
|
29
|
+
async reserve(intervalMs) {
|
|
30
|
+
while (true) {
|
|
31
|
+
const wait = await this.mutex.run(() => {
|
|
32
|
+
const now = Date.now();
|
|
33
|
+
const waitMs = waitFromState(this.state, now);
|
|
34
|
+
if (waitMs > 0) {
|
|
35
|
+
return waitMs;
|
|
36
|
+
}
|
|
37
|
+
this.state.nextAvailableTime = Date.now() + intervalMs;
|
|
38
|
+
return 0;
|
|
39
|
+
});
|
|
40
|
+
if (wait === 0) {
|
|
41
|
+
return;
|
|
42
|
+
}
|
|
43
|
+
await sleep(wait);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
async pause(seconds) {
|
|
47
|
+
await this.mutex.run(() => {
|
|
48
|
+
const until = Date.now() + seconds * 1000;
|
|
49
|
+
if (until > this.state.pauseUntil) {
|
|
50
|
+
this.state.pauseUntil = until;
|
|
51
|
+
}
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
function readState(statePath) {
|
|
56
|
+
try {
|
|
57
|
+
const parsed = JSON.parse(readFileSync(statePath, 'utf8'));
|
|
58
|
+
return {
|
|
59
|
+
nextAvailableTime: Number(parsed.nextAvailableTime) || 0,
|
|
60
|
+
pauseUntil: Number(parsed.pauseUntil) || 0,
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
catch {
|
|
64
|
+
return emptyState();
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
function writeState(statePath, state) {
|
|
68
|
+
writeFileSync(statePath, JSON.stringify(state), 'utf8');
|
|
69
|
+
}
|
|
70
|
+
function stealStaleLock(lockPath) {
|
|
71
|
+
try {
|
|
72
|
+
const created = Number(readFileSync(lockPath, 'utf8'));
|
|
73
|
+
if (!Number.isFinite(created) || Date.now() - created > STALE_LOCK_MS) {
|
|
74
|
+
unlinkSync(lockPath);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
catch {
|
|
78
|
+
try {
|
|
79
|
+
unlinkSync(lockPath);
|
|
80
|
+
}
|
|
81
|
+
catch {
|
|
82
|
+
// lock already gone
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
async function withFileLock(lockPath, fn) {
|
|
87
|
+
const started = Date.now();
|
|
88
|
+
while (true) {
|
|
89
|
+
try {
|
|
90
|
+
const fd = openSync(lockPath, 'wx');
|
|
91
|
+
try {
|
|
92
|
+
writeFileSync(fd, String(Date.now()));
|
|
93
|
+
return fn();
|
|
94
|
+
}
|
|
95
|
+
finally {
|
|
96
|
+
closeSync(fd);
|
|
97
|
+
try {
|
|
98
|
+
unlinkSync(lockPath);
|
|
99
|
+
}
|
|
100
|
+
catch {
|
|
101
|
+
// ignore
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
catch (error) {
|
|
106
|
+
const code = error.code;
|
|
107
|
+
if (code !== 'EEXIST') {
|
|
108
|
+
throw error;
|
|
109
|
+
}
|
|
110
|
+
if (Date.now() - started > 30_000) {
|
|
111
|
+
throw error;
|
|
112
|
+
}
|
|
113
|
+
stealStaleLock(lockPath);
|
|
114
|
+
await sleep(LOCK_RETRY_MS + Math.random() * LOCK_RETRY_MS);
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Cross-process store for Next SSG workers that share a tmp dir.
|
|
120
|
+
*/
|
|
121
|
+
export class FileRateLimitStore {
|
|
122
|
+
statePath;
|
|
123
|
+
constructor(statePath) {
|
|
124
|
+
this.statePath = statePath;
|
|
125
|
+
}
|
|
126
|
+
async reserve(intervalMs) {
|
|
127
|
+
while (true) {
|
|
128
|
+
const wait = await withFileLock(`${this.statePath}.lock`, () => {
|
|
129
|
+
const state = readState(this.statePath);
|
|
130
|
+
const now = Date.now();
|
|
131
|
+
const waitMs = waitFromState(state, now);
|
|
132
|
+
if (waitMs > 0) {
|
|
133
|
+
return waitMs;
|
|
134
|
+
}
|
|
135
|
+
state.nextAvailableTime = Date.now() + intervalMs;
|
|
136
|
+
writeState(this.statePath, state);
|
|
137
|
+
return 0;
|
|
138
|
+
});
|
|
139
|
+
if (wait === 0) {
|
|
140
|
+
return;
|
|
141
|
+
}
|
|
142
|
+
await sleep(wait);
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
async pause(seconds) {
|
|
146
|
+
await withFileLock(`${this.statePath}.lock`, () => {
|
|
147
|
+
const state = readState(this.statePath);
|
|
148
|
+
const until = Date.now() + seconds * 1000;
|
|
149
|
+
if (until > state.pauseUntil) {
|
|
150
|
+
state.pauseUntil = until;
|
|
151
|
+
writeState(this.statePath, state);
|
|
152
|
+
}
|
|
153
|
+
});
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
const FILE_STORE_CACHE = new Map();
|
|
157
|
+
export function defaultRateLimitStore(kind) {
|
|
158
|
+
if (process.env.SE_CDA_RATE_LIMIT_MEMORY === '1') {
|
|
159
|
+
return new MemoryRateLimitStore();
|
|
160
|
+
}
|
|
161
|
+
const dir = join(tmpdir(), 'se-studio-cda-rate-limit');
|
|
162
|
+
mkdirSync(dir, { recursive: true });
|
|
163
|
+
const statePath = join(dir, `${kind}.json`);
|
|
164
|
+
const cached = FILE_STORE_CACHE.get(statePath);
|
|
165
|
+
if (cached) {
|
|
166
|
+
return cached;
|
|
167
|
+
}
|
|
168
|
+
const store = new FileRateLimitStore(statePath);
|
|
169
|
+
FILE_STORE_CACHE.set(statePath, store);
|
|
170
|
+
return store;
|
|
171
|
+
}
|
|
172
|
+
//# sourceMappingURL=rate-limit-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rate-limit-store.js","sourceRoot":"","sources":["../../src/utils/rate-limit-store.ts"],"names":[],"mappings":"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"}
|
package/dist/utils/retry.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { RetryConfig } from '../types';
|
|
2
|
+
import { type RateLimitStore } from './rate-limit-store';
|
|
2
3
|
/**
|
|
3
4
|
* Calculates the delay for the next retry attempt using exponential backoff
|
|
4
5
|
*
|
|
@@ -39,21 +40,14 @@ export declare function withRetry<T>(fn: () => Promise<T>, config?: RetryConfig)
|
|
|
39
40
|
export declare class RateLimiter {
|
|
40
41
|
/** Minimum interval between requests in milliseconds */
|
|
41
42
|
private readonly intervalMs;
|
|
42
|
-
/** Timestamp when the next request can be made */
|
|
43
|
-
private nextAvailableTime;
|
|
44
43
|
/** Queue of pending requests */
|
|
45
44
|
private readonly queue;
|
|
46
45
|
/** Whether the queue processor is running */
|
|
47
46
|
private processing;
|
|
48
|
-
|
|
49
|
-
private pauseUntil;
|
|
47
|
+
private readonly store;
|
|
50
48
|
constructor(requestsPerSecond: number,
|
|
51
|
-
/** @deprecated
|
|
52
|
-
|
|
53
|
-
/**
|
|
54
|
-
* Calculates how long to wait before the next request can be made
|
|
55
|
-
*/
|
|
56
|
-
private getWaitTime;
|
|
49
|
+
/** @deprecated Number refill rate, or a shared RateLimitStore */
|
|
50
|
+
refillOrStore?: number | RateLimitStore, store?: RateLimitStore);
|
|
57
51
|
/**
|
|
58
52
|
* Processes the queue, releasing requests one at a time with proper spacing
|
|
59
53
|
*/
|
|
@@ -77,7 +71,7 @@ export declare class RateLimiter {
|
|
|
77
71
|
*
|
|
78
72
|
* @param seconds - Duration to pause in seconds
|
|
79
73
|
*/
|
|
80
|
-
pause(seconds: number): void
|
|
74
|
+
pause(seconds: number): Promise<void>;
|
|
81
75
|
/**
|
|
82
76
|
* Gets the current interval between requests in milliseconds
|
|
83
77
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"retry.d.ts","sourceRoot":"","sources":["../../src/utils/retry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"retry.d.ts","sourceRoot":"","sources":["../../src/utils/retry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAE5C,OAAO,EAGL,KAAK,cAAc,EACpB,MAAM,oBAAoB,CAAC;AAmB5B;;;;;;;GAOG;AACH,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,QAAQ,CAAC,WAAW,CAAC,EAC7B,UAAU,CAAC,EAAE,MAAM,GAClB,MAAM,CAaR;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAsB,SAAS,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,CAAC,CAAC,CAyCzF;AASD;;;;;;;;;;;GAWG;AACH,qBAAa,WAAW;IACtB,wDAAwD;IACxD,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC,gCAAgC;IAChC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAoB;IAC1C,6CAA6C;IAC7C,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAiB;IAEvC,YACE,iBAAiB,EAAE,MAAM;IACzB,iEAAiE;IACjE,aAAa,CAAC,EAAE,MAAM,GAAG,cAAc,EACvC,KAAK,CAAC,EAAE,cAAc,EAOvB;IAED;;OAEG;YACW,YAAY;IAgB1B;;;;;;OAMG;IACG,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAU7B;IAED;;OAEG;IACH,cAAc,IAAI,MAAM,CAEvB;IAED;;;;;;OAMG;IACG,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAE1C;IAED;;OAEG;IACH,aAAa,IAAI,MAAM,CAEtB;CACF;AA8BD;;;GAGG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,OAAO,GAAG,QAAQ,CAAC,WAAW,CAAC,CAEtE;AAED;;;GAGG;AACH,wBAAgB,wBAAwB,CAAC,UAAU,EAAE,MAAM,GAAG,SAAS,EAAE,OAAO,EAAE,OAAO,GAAG,MAAM,CAGjG;AAoBD;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,OAAO,GAAG,WAAW,CAE5D"}
|
package/dist/utils/retry.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { getRetryAfter, isRetryableError } from './errors.js';
|
|
2
|
+
import { defaultRateLimitStore, MemoryRateLimitStore, } from './rate-limit-store.js';
|
|
2
3
|
/**
|
|
3
4
|
* Default retry configuration
|
|
4
5
|
*/
|
|
@@ -95,29 +96,19 @@ export async function withRetry(fn, config) {
|
|
|
95
96
|
export class RateLimiter {
|
|
96
97
|
/** Minimum interval between requests in milliseconds */
|
|
97
98
|
intervalMs;
|
|
98
|
-
/** Timestamp when the next request can be made */
|
|
99
|
-
nextAvailableTime = 0;
|
|
100
99
|
/** Queue of pending requests */
|
|
101
100
|
queue = [];
|
|
102
101
|
/** Whether the queue processor is running */
|
|
103
102
|
processing = false;
|
|
104
|
-
|
|
105
|
-
pauseUntil = 0;
|
|
103
|
+
store;
|
|
106
104
|
constructor(requestsPerSecond,
|
|
107
|
-
/** @deprecated
|
|
108
|
-
|
|
109
|
-
// Calculate minimum interval between requests
|
|
110
|
-
// Use 80% of theoretical max to leave headroom
|
|
105
|
+
/** @deprecated Number refill rate, or a shared RateLimitStore */
|
|
106
|
+
refillOrStore, store) {
|
|
111
107
|
this.intervalMs = Math.ceil(1000 / (requestsPerSecond * 0.8));
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
getWaitTime() {
|
|
117
|
-
const now = Date.now();
|
|
118
|
-
const waitForInterval = Math.max(0, this.nextAvailableTime - now);
|
|
119
|
-
const waitForPause = Math.max(0, this.pauseUntil - now);
|
|
120
|
-
return Math.max(waitForInterval, waitForPause);
|
|
108
|
+
this.store =
|
|
109
|
+
refillOrStore && typeof refillOrStore === 'object'
|
|
110
|
+
? refillOrStore
|
|
111
|
+
: (store ?? new MemoryRateLimitStore());
|
|
121
112
|
}
|
|
122
113
|
/**
|
|
123
114
|
* Processes the queue, releasing requests one at a time with proper spacing
|
|
@@ -128,13 +119,7 @@ export class RateLimiter {
|
|
|
128
119
|
}
|
|
129
120
|
this.processing = true;
|
|
130
121
|
while (this.queue.length > 0) {
|
|
131
|
-
|
|
132
|
-
if (waitTime > 0) {
|
|
133
|
-
await sleep(waitTime);
|
|
134
|
-
}
|
|
135
|
-
// Update next available time BEFORE releasing the request
|
|
136
|
-
this.nextAvailableTime = Date.now() + this.intervalMs;
|
|
137
|
-
// Release the next queued request
|
|
122
|
+
await this.store.reserve(this.intervalMs);
|
|
138
123
|
const entry = this.queue.shift();
|
|
139
124
|
entry?.resolve();
|
|
140
125
|
}
|
|
@@ -148,16 +133,13 @@ export class RateLimiter {
|
|
|
148
133
|
* @returns Promise that resolves when rate limit allows the request
|
|
149
134
|
*/
|
|
150
135
|
async acquire() {
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
if (waitTime === 0 && this.queue.length === 0) {
|
|
154
|
-
this.nextAvailableTime = Date.now() + this.intervalMs;
|
|
136
|
+
if (this.queue.length === 0 && !this.processing) {
|
|
137
|
+
await this.store.reserve(this.intervalMs);
|
|
155
138
|
return;
|
|
156
139
|
}
|
|
157
|
-
// Otherwise, queue the request
|
|
158
140
|
return new Promise((resolve) => {
|
|
159
141
|
this.queue.push({ resolve });
|
|
160
|
-
this.processQueue();
|
|
142
|
+
void this.processQueue();
|
|
161
143
|
});
|
|
162
144
|
}
|
|
163
145
|
/**
|
|
@@ -173,12 +155,8 @@ export class RateLimiter {
|
|
|
173
155
|
*
|
|
174
156
|
* @param seconds - Duration to pause in seconds
|
|
175
157
|
*/
|
|
176
|
-
pause(seconds) {
|
|
177
|
-
|
|
178
|
-
// Only extend pause, never shorten it
|
|
179
|
-
if (pauseUntil > this.pauseUntil) {
|
|
180
|
-
this.pauseUntil = pauseUntil;
|
|
181
|
-
}
|
|
158
|
+
async pause(seconds) {
|
|
159
|
+
await this.store.pause(seconds);
|
|
182
160
|
}
|
|
183
161
|
/**
|
|
184
162
|
* Gets the current interval between requests in milliseconds
|
|
@@ -230,12 +208,12 @@ export function getRateLimitPauseSeconds(retryAfter, preview) {
|
|
|
230
208
|
* Shared rate limiter for Contentful Delivery API (55 req/s)
|
|
231
209
|
* Module-level singleton shared across all client instances
|
|
232
210
|
*/
|
|
233
|
-
const deliveryRateLimiter = new RateLimiter(CONTENTFUL_RATE_LIMITS.delivery);
|
|
211
|
+
const deliveryRateLimiter = new RateLimiter(CONTENTFUL_RATE_LIMITS.delivery, defaultRateLimitStore('delivery'));
|
|
234
212
|
/**
|
|
235
213
|
* Shared rate limiter for Contentful Preview API (14 req/s)
|
|
236
214
|
* Module-level singleton shared across all client instances
|
|
237
215
|
*/
|
|
238
|
-
const previewRateLimiter = new RateLimiter(CONTENTFUL_RATE_LIMITS.preview);
|
|
216
|
+
const previewRateLimiter = new RateLimiter(CONTENTFUL_RATE_LIMITS.preview, defaultRateLimitStore('preview'));
|
|
239
217
|
/**
|
|
240
218
|
* Gets the appropriate rate limiter based on preview mode
|
|
241
219
|
*
|
package/dist/utils/retry.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"retry.js","sourceRoot":"","sources":["../../src/utils/retry.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"retry.js","sourceRoot":"","sources":["../../src/utils/retry.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED