1+ import { isModuleNamespaceObject } from 'node:util/types'
12import {
23 HeadersObject ,
34 RateLimit ,
@@ -24,12 +25,22 @@ function parseHeadersObject(input: HeadersObject, options: RateLimitOptions | un
2425 prefix = 'ratelimit-'
2526 } else if ( getHeader ( input , 'x-ratelimit-remaining' ) ) {
2627 prefix = 'x-ratelimit-'
28+ } else if ( getHeader ( input , 'x-rate-limit-remaining' ) ) {
29+ // twitter - https://developer.twitter.com/en/docs/twitter-api/rate-limits#headers-and-codes
30+ prefix = 'x-rate-limit-'
2731 } else {
28- // todo: handle vendor-specific headers here - see https://github.com/ietf-wg-httpapi/ratelimit-headers/issues/25
32+ // todo: handle other vendor-specific headers - see
33+ // https://github.com/ietf-wg-httpapi/ratelimit-headers/issues/25
34+ // https://stackoverflow.com/questions/16022624/examples-of-http-api-rate-limiting-http-response-headers
35+ // https://github.com/mre/rate-limits/blob/master/src/variants.rs
36+ // etc.
2937 return ;
3038 }
3139
3240 const limit = num ( getHeader ( input , `${ prefix } limit` ) )
41+ // used - https://github.com/reddit-archive/reddit/wiki/API#rules
42+ // 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` ) )
3344 const remaining = num ( getHeader ( input , `${ prefix } remaining` ) )
3445
3546 let reset : Date | undefined = undefined ;
@@ -49,8 +60,8 @@ function parseHeadersObject(input: HeadersObject, options: RateLimitOptions | un
4960 }
5061
5162 return {
52- limit,
53- current : limit - remaining ,
63+ limit : isNaN ( limit ) ? current + remaining : limit , // reddit omits
64+ current : isNaN ( current ) ? limit - remaining : current , // most omit
5465 remaining,
5566 reset
5667 }
0 commit comments