@gitbeaker/requester-utils 39.28.0 → 39.30.0--canary.3428.1137971077.0
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/dist/index.d.mts +7 -7
- package/dist/index.d.ts +7 -7
- package/dist/index.js +17 -10
- package/dist/index.mjs +16 -10
- package/package.json +13 -8
package/dist/index.d.mts
CHANGED
|
@@ -1,8 +1,7 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
type RateLimiters = Record<string, ReturnType<typeof RateLimit> | {
|
|
1
|
+
type RateLimiterFn = () => Promise<number>;
|
|
2
|
+
type RateLimiters = Record<string, RateLimiterFn | {
|
|
4
3
|
method: string;
|
|
5
|
-
limit:
|
|
4
|
+
limit: RateLimiterFn;
|
|
6
5
|
}>;
|
|
7
6
|
type RateLimitOptions = Record<string, number | {
|
|
8
7
|
method: string;
|
|
@@ -45,7 +44,7 @@ type RequestOptions = {
|
|
|
45
44
|
body?: string | FormData;
|
|
46
45
|
asStream?: boolean;
|
|
47
46
|
signal?: AbortSignal;
|
|
48
|
-
rateLimiters?: Record<string,
|
|
47
|
+
rateLimiters?: Record<string, RateLimiterFn>;
|
|
49
48
|
};
|
|
50
49
|
interface RequesterType {
|
|
51
50
|
get<T extends ResponseBodyTypes>(endpoint: string, options?: DefaultRequestOptions): Promise<FormattedResponse<T>>;
|
|
@@ -55,13 +54,14 @@ interface RequesterType {
|
|
|
55
54
|
delete<T extends ResponseBodyTypes>(endpoint: string, options?: DefaultRequestOptions): Promise<FormattedResponse<T>>;
|
|
56
55
|
}
|
|
57
56
|
type RequestHandlerFn<T extends ResponseBodyTypes = ResponseBodyTypes> = (endpoint: string, options?: Record<string, unknown>) => Promise<FormattedResponse<T>>;
|
|
57
|
+
declare function generateRateLimiterFn(limit: number, interval: number): () => Promise<number>;
|
|
58
58
|
declare function formatQuery(params?: Record<string, unknown>): string;
|
|
59
59
|
type OptionsHandlerFn = (serviceOptions: ResourceOptions, requestOptions: RequestOptions) => Promise<RequestOptions>;
|
|
60
60
|
declare function defaultOptionsHandler(resourceOptions: ResourceOptions, { body, searchParams, sudo, signal, asStream, method, }?: DefaultRequestOptions): Promise<RequestOptions>;
|
|
61
61
|
declare function createRateLimiters(rateLimitOptions?: RateLimitOptions): RateLimiters;
|
|
62
62
|
declare function createRequesterFn(optionsHandler: OptionsHandlerFn, requestHandler: RequestHandlerFn): (serviceOptions: ResourceOptions) => RequesterType;
|
|
63
63
|
declare function presetResourceArguments<T extends Record<string, Constructable>>(resources: T, customConfig?: Record<string, unknown>): T;
|
|
64
|
-
declare function getMatchingRateLimiter(endpoint: string, rateLimiters?: RateLimiters, method?: string):
|
|
64
|
+
declare function getMatchingRateLimiter(endpoint: string, rateLimiters?: RateLimiters, method?: string): RateLimiterFn;
|
|
65
65
|
|
|
66
66
|
interface RootResourceOptions<C> {
|
|
67
67
|
requesterFn?: (resourceOptions: ResourceOptions) => RequesterType;
|
|
@@ -117,4 +117,4 @@ declare class GitbeakerRetryError extends Error {
|
|
|
117
117
|
constructor(message: string);
|
|
118
118
|
}
|
|
119
119
|
|
|
120
|
-
export { type BaseRequestOptionsWithAccessToken, type BaseRequestOptionsWithJobToken, type BaseRequestOptionsWithOAuthToken, BaseResource, type BaseResourceOptions, type Constructable, type DefaultRequestOptions, type FormattedResponse, GitbeakerRequestError, GitbeakerRetryError, GitbeakerTimeoutError, type GitlabToken, type OptionsHandlerFn, type RateLimitOptions, type RateLimiters, type RequestHandlerFn, type RequestOptions, type RequesterType, type ResourceOptions, type ResponseBodyTypes, type RootResourceOptions, createRateLimiters, createRequesterFn, defaultOptionsHandler, formatQuery, getMatchingRateLimiter, presetResourceArguments };
|
|
120
|
+
export { type BaseRequestOptionsWithAccessToken, type BaseRequestOptionsWithJobToken, type BaseRequestOptionsWithOAuthToken, BaseResource, type BaseResourceOptions, type Constructable, type DefaultRequestOptions, type FormattedResponse, GitbeakerRequestError, GitbeakerRetryError, GitbeakerTimeoutError, type GitlabToken, type OptionsHandlerFn, type RateLimitOptions, type RateLimiterFn, type RateLimiters, type RequestHandlerFn, type RequestOptions, type RequesterType, type ResourceOptions, type ResponseBodyTypes, type RootResourceOptions, createRateLimiters, createRequesterFn, defaultOptionsHandler, formatQuery, generateRateLimiterFn, getMatchingRateLimiter, presetResourceArguments };
|
package/dist/index.d.ts
CHANGED
|
@@ -1,8 +1,7 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
type RateLimiters = Record<string, ReturnType<typeof RateLimit> | {
|
|
1
|
+
type RateLimiterFn = () => Promise<number>;
|
|
2
|
+
type RateLimiters = Record<string, RateLimiterFn | {
|
|
4
3
|
method: string;
|
|
5
|
-
limit:
|
|
4
|
+
limit: RateLimiterFn;
|
|
6
5
|
}>;
|
|
7
6
|
type RateLimitOptions = Record<string, number | {
|
|
8
7
|
method: string;
|
|
@@ -45,7 +44,7 @@ type RequestOptions = {
|
|
|
45
44
|
body?: string | FormData;
|
|
46
45
|
asStream?: boolean;
|
|
47
46
|
signal?: AbortSignal;
|
|
48
|
-
rateLimiters?: Record<string,
|
|
47
|
+
rateLimiters?: Record<string, RateLimiterFn>;
|
|
49
48
|
};
|
|
50
49
|
interface RequesterType {
|
|
51
50
|
get<T extends ResponseBodyTypes>(endpoint: string, options?: DefaultRequestOptions): Promise<FormattedResponse<T>>;
|
|
@@ -55,13 +54,14 @@ interface RequesterType {
|
|
|
55
54
|
delete<T extends ResponseBodyTypes>(endpoint: string, options?: DefaultRequestOptions): Promise<FormattedResponse<T>>;
|
|
56
55
|
}
|
|
57
56
|
type RequestHandlerFn<T extends ResponseBodyTypes = ResponseBodyTypes> = (endpoint: string, options?: Record<string, unknown>) => Promise<FormattedResponse<T>>;
|
|
57
|
+
declare function generateRateLimiterFn(limit: number, interval: number): () => Promise<number>;
|
|
58
58
|
declare function formatQuery(params?: Record<string, unknown>): string;
|
|
59
59
|
type OptionsHandlerFn = (serviceOptions: ResourceOptions, requestOptions: RequestOptions) => Promise<RequestOptions>;
|
|
60
60
|
declare function defaultOptionsHandler(resourceOptions: ResourceOptions, { body, searchParams, sudo, signal, asStream, method, }?: DefaultRequestOptions): Promise<RequestOptions>;
|
|
61
61
|
declare function createRateLimiters(rateLimitOptions?: RateLimitOptions): RateLimiters;
|
|
62
62
|
declare function createRequesterFn(optionsHandler: OptionsHandlerFn, requestHandler: RequestHandlerFn): (serviceOptions: ResourceOptions) => RequesterType;
|
|
63
63
|
declare function presetResourceArguments<T extends Record<string, Constructable>>(resources: T, customConfig?: Record<string, unknown>): T;
|
|
64
|
-
declare function getMatchingRateLimiter(endpoint: string, rateLimiters?: RateLimiters, method?: string):
|
|
64
|
+
declare function getMatchingRateLimiter(endpoint: string, rateLimiters?: RateLimiters, method?: string): RateLimiterFn;
|
|
65
65
|
|
|
66
66
|
interface RootResourceOptions<C> {
|
|
67
67
|
requesterFn?: (resourceOptions: ResourceOptions) => RequesterType;
|
|
@@ -117,4 +117,4 @@ declare class GitbeakerRetryError extends Error {
|
|
|
117
117
|
constructor(message: string);
|
|
118
118
|
}
|
|
119
119
|
|
|
120
|
-
export { type BaseRequestOptionsWithAccessToken, type BaseRequestOptionsWithJobToken, type BaseRequestOptionsWithOAuthToken, BaseResource, type BaseResourceOptions, type Constructable, type DefaultRequestOptions, type FormattedResponse, GitbeakerRequestError, GitbeakerRetryError, GitbeakerTimeoutError, type GitlabToken, type OptionsHandlerFn, type RateLimitOptions, type RateLimiters, type RequestHandlerFn, type RequestOptions, type RequesterType, type ResourceOptions, type ResponseBodyTypes, type RootResourceOptions, createRateLimiters, createRequesterFn, defaultOptionsHandler, formatQuery, getMatchingRateLimiter, presetResourceArguments };
|
|
120
|
+
export { type BaseRequestOptionsWithAccessToken, type BaseRequestOptionsWithJobToken, type BaseRequestOptionsWithOAuthToken, BaseResource, type BaseResourceOptions, type Constructable, type DefaultRequestOptions, type FormattedResponse, GitbeakerRequestError, GitbeakerRetryError, GitbeakerTimeoutError, type GitlabToken, type OptionsHandlerFn, type RateLimitOptions, type RateLimiterFn, type RateLimiters, type RequestHandlerFn, type RequestOptions, type RequesterType, type ResourceOptions, type ResponseBodyTypes, type RootResourceOptions, createRateLimiters, createRequesterFn, defaultOptionsHandler, formatQuery, generateRateLimiterFn, getMatchingRateLimiter, presetResourceArguments };
|
package/dist/index.js
CHANGED
|
@@ -2,14 +2,21 @@
|
|
|
2
2
|
|
|
3
3
|
var qs = require('qs');
|
|
4
4
|
var xcase = require('xcase');
|
|
5
|
-
var
|
|
6
|
-
var
|
|
5
|
+
var rateLimiterFlexible = require('rate-limiter-flexible');
|
|
6
|
+
var Picomatch = require('picomatch-browser');
|
|
7
7
|
|
|
8
8
|
function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
|
|
9
9
|
|
|
10
|
-
var
|
|
10
|
+
var Picomatch__default = /*#__PURE__*/_interopDefault(Picomatch);
|
|
11
11
|
|
|
12
12
|
// src/RequesterUtils.ts
|
|
13
|
+
var { isMatch: isGlobMatch } = Picomatch__default.default;
|
|
14
|
+
function generateRateLimiterFn(limit, interval) {
|
|
15
|
+
const limiter = new rateLimiterFlexible.RateLimiterQueue(
|
|
16
|
+
new rateLimiterFlexible.RateLimiterMemory({ points: limit, duration: interval })
|
|
17
|
+
);
|
|
18
|
+
return () => limiter.removeTokens(1);
|
|
19
|
+
}
|
|
13
20
|
function formatQuery(params = {}) {
|
|
14
21
|
const decamelized = xcase.decamelizeKeys(params);
|
|
15
22
|
return qs.stringify(decamelized, { arrayFormat: "brackets" });
|
|
@@ -52,11 +59,11 @@ function createRateLimiters(rateLimitOptions = {}) {
|
|
|
52
59
|
const rateLimiters = {};
|
|
53
60
|
Object.entries(rateLimitOptions).forEach(([key, config]) => {
|
|
54
61
|
if (typeof config === "number")
|
|
55
|
-
rateLimiters[key] =
|
|
62
|
+
rateLimiters[key] = generateRateLimiterFn(config, 60);
|
|
56
63
|
else
|
|
57
64
|
rateLimiters[key] = {
|
|
58
65
|
method: config.method.toUpperCase(),
|
|
59
|
-
limit:
|
|
66
|
+
limit: generateRateLimiterFn(config.limit, 60)
|
|
60
67
|
};
|
|
61
68
|
});
|
|
62
69
|
return rateLimiters;
|
|
@@ -96,15 +103,14 @@ function presetResourceArguments(resources, customConfig = {}) {
|
|
|
96
103
|
}
|
|
97
104
|
function getMatchingRateLimiter(endpoint, rateLimiters = {}, method = "GET") {
|
|
98
105
|
const sortedEndpoints = Object.keys(rateLimiters).sort().reverse();
|
|
99
|
-
const match = sortedEndpoints.find((ep) =>
|
|
106
|
+
const match = sortedEndpoints.find((ep) => isGlobMatch(endpoint, ep));
|
|
100
107
|
const rateLimitConfig = match && rateLimiters[match];
|
|
101
|
-
if (
|
|
108
|
+
if (typeof rateLimitConfig === "function")
|
|
102
109
|
return rateLimitConfig;
|
|
103
|
-
|
|
104
|
-
if (rateLimitConfig && rateLimitConfig.method.toUpperCase() === method.toUpperCase()) {
|
|
110
|
+
if (rateLimitConfig && rateLimitConfig?.method?.toUpperCase() === method.toUpperCase()) {
|
|
105
111
|
return rateLimitConfig.limit;
|
|
106
112
|
}
|
|
107
|
-
return
|
|
113
|
+
return generateRateLimiterFn(3e3, 60);
|
|
108
114
|
}
|
|
109
115
|
|
|
110
116
|
// src/BaseResource.ts
|
|
@@ -225,5 +231,6 @@ exports.createRateLimiters = createRateLimiters;
|
|
|
225
231
|
exports.createRequesterFn = createRequesterFn;
|
|
226
232
|
exports.defaultOptionsHandler = defaultOptionsHandler;
|
|
227
233
|
exports.formatQuery = formatQuery;
|
|
234
|
+
exports.generateRateLimiterFn = generateRateLimiterFn;
|
|
228
235
|
exports.getMatchingRateLimiter = getMatchingRateLimiter;
|
|
229
236
|
exports.presetResourceArguments = presetResourceArguments;
|
package/dist/index.mjs
CHANGED
|
@@ -1,9 +1,16 @@
|
|
|
1
1
|
import { stringify } from 'qs';
|
|
2
2
|
import { decamelizeKeys } from 'xcase';
|
|
3
|
-
import {
|
|
4
|
-
import
|
|
3
|
+
import { RateLimiterQueue, RateLimiterMemory } from 'rate-limiter-flexible';
|
|
4
|
+
import Picomatch from 'picomatch-browser';
|
|
5
5
|
|
|
6
6
|
// src/RequesterUtils.ts
|
|
7
|
+
var { isMatch: isGlobMatch } = Picomatch;
|
|
8
|
+
function generateRateLimiterFn(limit, interval) {
|
|
9
|
+
const limiter = new RateLimiterQueue(
|
|
10
|
+
new RateLimiterMemory({ points: limit, duration: interval })
|
|
11
|
+
);
|
|
12
|
+
return () => limiter.removeTokens(1);
|
|
13
|
+
}
|
|
7
14
|
function formatQuery(params = {}) {
|
|
8
15
|
const decamelized = decamelizeKeys(params);
|
|
9
16
|
return stringify(decamelized, { arrayFormat: "brackets" });
|
|
@@ -46,11 +53,11 @@ function createRateLimiters(rateLimitOptions = {}) {
|
|
|
46
53
|
const rateLimiters = {};
|
|
47
54
|
Object.entries(rateLimitOptions).forEach(([key, config]) => {
|
|
48
55
|
if (typeof config === "number")
|
|
49
|
-
rateLimiters[key] =
|
|
56
|
+
rateLimiters[key] = generateRateLimiterFn(config, 60);
|
|
50
57
|
else
|
|
51
58
|
rateLimiters[key] = {
|
|
52
59
|
method: config.method.toUpperCase(),
|
|
53
|
-
limit:
|
|
60
|
+
limit: generateRateLimiterFn(config.limit, 60)
|
|
54
61
|
};
|
|
55
62
|
});
|
|
56
63
|
return rateLimiters;
|
|
@@ -90,15 +97,14 @@ function presetResourceArguments(resources, customConfig = {}) {
|
|
|
90
97
|
}
|
|
91
98
|
function getMatchingRateLimiter(endpoint, rateLimiters = {}, method = "GET") {
|
|
92
99
|
const sortedEndpoints = Object.keys(rateLimiters).sort().reverse();
|
|
93
|
-
const match = sortedEndpoints.find((ep) =>
|
|
100
|
+
const match = sortedEndpoints.find((ep) => isGlobMatch(endpoint, ep));
|
|
94
101
|
const rateLimitConfig = match && rateLimiters[match];
|
|
95
|
-
if (
|
|
102
|
+
if (typeof rateLimitConfig === "function")
|
|
96
103
|
return rateLimitConfig;
|
|
97
|
-
|
|
98
|
-
if (rateLimitConfig && rateLimitConfig.method.toUpperCase() === method.toUpperCase()) {
|
|
104
|
+
if (rateLimitConfig && rateLimitConfig?.method?.toUpperCase() === method.toUpperCase()) {
|
|
99
105
|
return rateLimitConfig.limit;
|
|
100
106
|
}
|
|
101
|
-
return
|
|
107
|
+
return generateRateLimiterFn(3e3, 60);
|
|
102
108
|
}
|
|
103
109
|
|
|
104
110
|
// src/BaseResource.ts
|
|
@@ -211,4 +217,4 @@ var GitbeakerRetryError = class extends Error {
|
|
|
211
217
|
}
|
|
212
218
|
};
|
|
213
219
|
|
|
214
|
-
export { BaseResource, GitbeakerRequestError, GitbeakerRetryError, GitbeakerTimeoutError, createRateLimiters, createRequesterFn, defaultOptionsHandler, formatQuery, getMatchingRateLimiter, presetResourceArguments };
|
|
220
|
+
export { BaseResource, GitbeakerRequestError, GitbeakerRetryError, GitbeakerTimeoutError, createRateLimiters, createRequesterFn, defaultOptionsHandler, formatQuery, generateRateLimiterFn, getMatchingRateLimiter, presetResourceArguments };
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@gitbeaker/requester-utils",
|
|
3
|
-
"version": "39.
|
|
3
|
+
"version": "39.30.0--canary.3428.1137971077.0",
|
|
4
4
|
"description": "Utility functions for requester implementatons used in @gitbeaker",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"engines": {
|
|
@@ -25,9 +25,14 @@
|
|
|
25
25
|
"types": "./dist/index.d.ts",
|
|
26
26
|
"exports": {
|
|
27
27
|
".": {
|
|
28
|
-
"
|
|
29
|
-
|
|
30
|
-
|
|
28
|
+
"import": {
|
|
29
|
+
"types": "./dist/index.d.mts",
|
|
30
|
+
"default": "./dist/index.mjs"
|
|
31
|
+
},
|
|
32
|
+
"require": {
|
|
33
|
+
"types": "./dist/index.d.ts",
|
|
34
|
+
"default": "./dist/index.js"
|
|
35
|
+
}
|
|
31
36
|
}
|
|
32
37
|
},
|
|
33
38
|
"files": [
|
|
@@ -51,15 +56,15 @@
|
|
|
51
56
|
"release": "auto shipit"
|
|
52
57
|
},
|
|
53
58
|
"dependencies": {
|
|
54
|
-
"
|
|
55
|
-
"micromatch": "^4.0.5",
|
|
59
|
+
"picomatch-browser": "^2.2.6",
|
|
56
60
|
"qs": "^6.11.2",
|
|
61
|
+
"rate-limiter-flexible": "^4.0.0",
|
|
57
62
|
"xcase": "^2.0.1"
|
|
58
63
|
},
|
|
59
64
|
"devDependencies": {
|
|
60
|
-
"@types/node": "^20.10.
|
|
65
|
+
"@types/node": "^20.10.5",
|
|
61
66
|
"tsup": "^8.0.1",
|
|
62
67
|
"typescript": "^5.3.3"
|
|
63
68
|
},
|
|
64
|
-
"gitHead": "
|
|
69
|
+
"gitHead": "54851e218b030b5ec4ebcb2b6b99c5c246fc7d99"
|
|
65
70
|
}
|