@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 CHANGED
@@ -1,8 +1,7 @@
1
- import { RateLimit } from 'async-sema';
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: ReturnType<typeof RateLimit>;
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, ReturnType<typeof RateLimit>>;
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): () => Promise<void>;
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
- import { RateLimit } from 'async-sema';
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: ReturnType<typeof RateLimit>;
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, ReturnType<typeof RateLimit>>;
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): () => Promise<void>;
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 asyncSema = require('async-sema');
6
- var micromatch = require('micromatch');
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 micromatch__default = /*#__PURE__*/_interopDefault(micromatch);
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] = asyncSema.RateLimit(config, { timeUnit: 6e4 });
62
+ rateLimiters[key] = generateRateLimiterFn(config, 60);
56
63
  else
57
64
  rateLimiters[key] = {
58
65
  method: config.method.toUpperCase(),
59
- limit: asyncSema.RateLimit(config.limit, { timeUnit: 6e4 })
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) => micromatch__default.default.isMatch(endpoint, ep));
106
+ const match = sortedEndpoints.find((ep) => isGlobMatch(endpoint, ep));
100
107
  const rateLimitConfig = match && rateLimiters[match];
101
- if (rateLimitConfig && typeof rateLimitConfig !== "object") {
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 asyncSema.RateLimit(3e3, { timeUnit: 6e4 });
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 { RateLimit } from 'async-sema';
4
- import micromatch from 'micromatch';
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] = RateLimit(config, { timeUnit: 6e4 });
56
+ rateLimiters[key] = generateRateLimiterFn(config, 60);
50
57
  else
51
58
  rateLimiters[key] = {
52
59
  method: config.method.toUpperCase(),
53
- limit: RateLimit(config.limit, { timeUnit: 6e4 })
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) => micromatch.isMatch(endpoint, ep));
100
+ const match = sortedEndpoints.find((ep) => isGlobMatch(endpoint, ep));
94
101
  const rateLimitConfig = match && rateLimiters[match];
95
- if (rateLimitConfig && typeof rateLimitConfig !== "object") {
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 RateLimit(3e3, { timeUnit: 6e4 });
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.28.0",
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
- "types": "./dist/index.d.ts",
29
- "import": "./dist/index.mjs",
30
- "require": "./dist/index.js"
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
- "async-sema": "^3.1.1",
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.4",
65
+ "@types/node": "^20.10.5",
61
66
  "tsup": "^8.0.1",
62
67
  "typescript": "^5.3.3"
63
68
  },
64
- "gitHead": "e15097c508ee0b5bc2f599ed818fa1e08e2645d3"
69
+ "gitHead": "54851e218b030b5ec4ebcb2b6b99c5c246fc7d99"
65
70
  }