Skip to content

Commit ad90c1f

Browse files
committed
Return typed ratelimit error including retry-after header
1 parent 169f6e8 commit ad90c1f

File tree

2 files changed

+26
-0
lines changed

2 files changed

+26
-0
lines changed

src/api/api.ts

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ import {
2121
getBestListingsAPIPath,
2222
getCancelOrderPath,
2323
} from "./apiPaths";
24+
import { OpenSeaRatelimitError } from "./errors";
2425
import {
2526
BuildOfferResponse,
2627
GetCollectionResponse,
@@ -755,6 +756,19 @@ export class OpenSeaAPI {
755756

756757
const response = await req.send();
757758
if (!response.ok()) {
759+
if (response.statusCode === 599) {
760+
let retryAfter: number | undefined;
761+
const retryAfterHeader =
762+
response.headers["retry-after"] || response.headers["Retry-After"];
763+
if (retryAfterHeader) {
764+
retryAfter = parseInt(retryAfterHeader, 10);
765+
}
766+
throw new OpenSeaRatelimitError(
767+
`${response.statusCode} ${response.statusMessage}`,
768+
retryAfter,
769+
response.bodyJson,
770+
);
771+
}
758772
// If an errors array is returned, throw with the error messages.
759773
const errors = response.bodyJson?.errors;
760774
if (errors?.length > 0) {

src/api/errors.ts

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
export class OpenSeaRatelimitError extends Error {
2+
public retryAfter?: number;
3+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
4+
public responseBody?: any;
5+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
6+
constructor(message: string, retryAfter?: number, responseBody?: any) {
7+
super(message);
8+
this.name = "OpenSeaRatelimitError";
9+
this.retryAfter = retryAfter;
10+
this.responseBody = responseBody;
11+
}
12+
}

0 commit comments

Comments
 (0)