1
- import { isModuleNamespaceObject } from 'node:util/types'
2
- import {
3
- HeadersObject ,
1
+ import type { ServerResponse , IncomingHttpHeaders , OutgoingHttpHeaders } from 'node:http'
2
+ import type {
4
3
RateLimit ,
5
4
RateLimitOptions ,
6
- ResponseOrHeadersObject
7
5
} from './types'
8
6
7
+ // node or fetch
8
+ export type ResponseObject = ServerResponse | Response ;
9
+ export type HeadersObject = IncomingHttpHeaders | OutgoingHttpHeaders | Headers | Object ;
10
+ export type ResponseOrHeadersObject = ResponseObject | HeadersObject ;
11
+
9
12
export function parseRateLimit ( input : ResponseOrHeadersObject , options ?: RateLimitOptions ) : RateLimit | undefined {
10
13
if ( 'headers' in input && typeof input . headers === 'object' && ! Array . isArray ( input . headers ) ) {
11
14
return parseHeadersObject ( input . headers , options )
@@ -39,8 +42,10 @@ function parseHeadersObject(input: HeadersObject, options: RateLimitOptions | un
39
42
40
43
const limit = num ( getHeader ( input , `${ prefix } limit` ) )
41
44
// used - https://github.com/reddit-archive/reddit/wiki/API#rules
45
+ // used - https://docs.github.com/en/rest/overview/resources-in-the-rest-api?apiVersion=2022-11-28#rate-limit-headers
42
46
// observed - https://docs.gitlab.com/ee/administration/settings/user_and_ip_rate_limits.html#response-headers
43
- const current = num ( getHeader ( input , `${ prefix } used` ) ) || num ( getHeader ( input , `${ prefix } observed` ) )
47
+ // note that || is valid here because used should always be at least 1, and || handles NaN correctly, whereas ?? doesn't
48
+ const used = num ( getHeader ( input , `${ prefix } used` ) ) || num ( getHeader ( input , `${ prefix } observed` ) )
44
49
const remaining = num ( getHeader ( input , `${ prefix } remaining` ) )
45
50
46
51
let reset : Date | undefined = undefined ;
@@ -60,8 +65,8 @@ function parseHeadersObject(input: HeadersObject, options: RateLimitOptions | un
60
65
}
61
66
62
67
return {
63
- limit : isNaN ( limit ) ? current + remaining : limit , // reddit omits
64
- current : isNaN ( current ) ? limit - remaining : current , // most omit
68
+ limit : isNaN ( limit ) ? used + remaining : limit , // reddit omits
69
+ used : isNaN ( used ) ? limit - remaining : used , // most omit
65
70
remaining,
66
71
reset
67
72
}
@@ -77,7 +82,7 @@ export function parseCombinedRateLimitHeader(input: string): RateLimit {
77
82
const reset = secondsToDate ( resetSeconds ) ;
78
83
return {
79
84
limit,
80
- current : limit - remaining ,
85
+ used : limit - remaining ,
81
86
remaining,
82
87
reset,
83
88
}
0 commit comments