Skip to content

Commit cd521bb

Browse files
committed
rename current to used, tweak types
1 parent f5b1a58 commit cd521bb

File tree

4 files changed

+17
-24
lines changed

4 files changed

+17
-24
lines changed

source/index.ts

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1 @@
1-
export { parseRateLimit } from './ratelimit-header-parser'
2-
export {
3-
RateLimit,
4-
RateLimitOptions,
5-
ResponseOrHeadersObject
6-
} from './types'
1+
export { parseRateLimit } from './ratelimit-header-parser'

source/ratelimit-header-parser.ts

Lines changed: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,14 @@
1-
import { isModuleNamespaceObject } from 'node:util/types'
2-
import {
3-
HeadersObject,
1+
import type { ServerResponse, IncomingHttpHeaders, OutgoingHttpHeaders } from 'node:http'
2+
import type {
43
RateLimit,
54
RateLimitOptions,
6-
ResponseOrHeadersObject
75
} from './types'
86

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+
912
export function parseRateLimit(input: ResponseOrHeadersObject, options?: RateLimitOptions): RateLimit | undefined {
1013
if ('headers' in input && typeof input.headers === 'object' && !Array.isArray(input.headers)) {
1114
return parseHeadersObject(input.headers, options)
@@ -39,8 +42,10 @@ function parseHeadersObject(input: HeadersObject, options: RateLimitOptions | un
3942

4043
const limit = num(getHeader(input, `${prefix}limit`))
4144
// 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
4246
// 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`))
4449
const remaining = num(getHeader(input, `${prefix}remaining`))
4550

4651
let reset: Date|undefined = undefined;
@@ -60,8 +65,8 @@ function parseHeadersObject(input: HeadersObject, options: RateLimitOptions | un
6065
}
6166

6267
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
6570
remaining,
6671
reset
6772
}
@@ -77,7 +82,7 @@ export function parseCombinedRateLimitHeader(input: string): RateLimit {
7782
const reset = secondsToDate(resetSeconds);
7883
return {
7984
limit,
80-
current: limit - remaining,
85+
used: limit - remaining,
8186
remaining,
8287
reset,
8388
}

source/types.ts

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,6 @@
1-
import type { ServerResponse, IncomingHttpHeaders, OutgoingHttpHeaders } from 'node:http'
2-
31
export type RateLimit = {
42
limit: number,
5-
current: number,
3+
used: number,
64
remaining: number,
75
reset?: Date,
86
// todo: policy
@@ -11,8 +9,3 @@ export type RateLimit = {
119
export type RateLimitOptions = {
1210
reset?: 'date' | 'unix' | 'seconds' | 'milliseconds',
1311
}
14-
15-
// node or fetch
16-
export type ResponseObject = ServerResponse | Response;
17-
export type HeadersObject = IncomingHttpHeaders | OutgoingHttpHeaders | Headers | Object;
18-
export type ResponseOrHeadersObject = ResponseObject | HeadersObject;

test/parser-test.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ describe('parseRateLimitHeaders', () => {
1111
expect(parseRateLimit(headers)).toMatchObject({
1212
limit: 100,
1313
remaining: 70,
14-
current: 30,
14+
used: 30,
1515
reset: expect.any(Date) // todo: mock the clock, then match to a specific date
1616
})
1717
})
@@ -27,7 +27,7 @@ describe('parseCombinedRateLimitHeader', () => {
2727
expect(parseCombinedRateLimitHeader('limit=100, remaining=25, reset=5')).toMatchObject({
2828
limit: 100,
2929
remaining: 25,
30-
current: 75,
30+
used: 75,
3131
reset: expect.any(Date) // todo: mock the clock, then match to a specific date
3232
})
3333
})

0 commit comments

Comments
 (0)