@gitbeaker/requester-utils
Advanced tools
Comparing version 39.29.0 to 39.30.0--canary.3428.1137971077.0
@@ -1,6 +0,5 @@ | ||
import { RateLimit } from 'async-sema'; | ||
type RateLimiters = Record<string, ReturnType<typeof RateLimit> | { | ||
type RateLimiterFn = () => Promise<number>; | ||
type RateLimiters = Record<string, RateLimiterFn | { | ||
method: string; | ||
limit: ReturnType<typeof RateLimit>; | ||
limit: RateLimiterFn; | ||
}>; | ||
@@ -48,3 +47,3 @@ type RateLimitOptions = Record<string, number | { | ||
signal?: AbortSignal; | ||
rateLimiters?: Record<string, ReturnType<typeof RateLimit>>; | ||
rateLimiters?: Record<string, RateLimiterFn>; | ||
}; | ||
@@ -59,2 +58,3 @@ interface RequesterType { | ||
type RequestHandlerFn<T extends ResponseBodyTypes = ResponseBodyTypes> = (endpoint: string, options?: Record<string, unknown>) => Promise<FormattedResponse<T>>; | ||
declare function generateRateLimiterFn(limit: number, interval: number): () => Promise<number>; | ||
declare function formatQuery(params?: Record<string, unknown>): string; | ||
@@ -66,3 +66,3 @@ type OptionsHandlerFn = (serviceOptions: ResourceOptions, requestOptions: RequestOptions) => Promise<RequestOptions>; | ||
declare function presetResourceArguments<T extends Record<string, Constructable>>(resources: T, customConfig?: Record<string, unknown>): T; | ||
declare function getMatchingRateLimiter(endpoint: string, rateLimiters?: RateLimiters, method?: string): () => Promise<void>; | ||
declare function getMatchingRateLimiter(endpoint: string, rateLimiters?: RateLimiters, method?: string): RateLimiterFn; | ||
@@ -123,2 +123,2 @@ interface RootResourceOptions<C> { | ||
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 }; | ||
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 }; |
@@ -5,10 +5,17 @@ 'use strict'; | ||
var xcase = require('xcase'); | ||
var asyncSema = require('async-sema'); | ||
var micromatch = require('micromatch'); | ||
var rateLimiterFlexible = require('rate-limiter-flexible'); | ||
var Picomatch = require('picomatch-browser'); | ||
function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; } | ||
var micromatch__default = /*#__PURE__*/_interopDefault(micromatch); | ||
var Picomatch__default = /*#__PURE__*/_interopDefault(Picomatch); | ||
// src/RequesterUtils.ts | ||
var { isMatch: isGlobMatch } = Picomatch__default.default; | ||
function generateRateLimiterFn(limit, interval) { | ||
const limiter = new rateLimiterFlexible.RateLimiterQueue( | ||
new rateLimiterFlexible.RateLimiterMemory({ points: limit, duration: interval }) | ||
); | ||
return () => limiter.removeTokens(1); | ||
} | ||
function formatQuery(params = {}) { | ||
@@ -56,7 +63,7 @@ const decamelized = xcase.decamelizeKeys(params); | ||
if (typeof config === "number") | ||
rateLimiters[key] = asyncSema.RateLimit(config, { timeUnit: 6e4 }); | ||
rateLimiters[key] = generateRateLimiterFn(config, 60); | ||
else | ||
rateLimiters[key] = { | ||
method: config.method.toUpperCase(), | ||
limit: asyncSema.RateLimit(config.limit, { timeUnit: 6e4 }) | ||
limit: generateRateLimiterFn(config.limit, 60) | ||
}; | ||
@@ -101,11 +108,10 @@ }); | ||
const sortedEndpoints = Object.keys(rateLimiters).sort().reverse(); | ||
const match = sortedEndpoints.find((ep) => micromatch__default.default.isMatch(endpoint, ep)); | ||
const match = sortedEndpoints.find((ep) => isGlobMatch(endpoint, ep)); | ||
const rateLimitConfig = match && rateLimiters[match]; | ||
if (rateLimitConfig && typeof rateLimitConfig !== "object") { | ||
if (typeof rateLimitConfig === "function") | ||
return rateLimitConfig; | ||
} | ||
if (rateLimitConfig && rateLimitConfig.method.toUpperCase() === method.toUpperCase()) { | ||
if (rateLimitConfig && rateLimitConfig?.method?.toUpperCase() === method.toUpperCase()) { | ||
return rateLimitConfig.limit; | ||
} | ||
return asyncSema.RateLimit(3e3, { timeUnit: 6e4 }); | ||
return generateRateLimiterFn(3e3, 60); | ||
} | ||
@@ -231,3 +237,4 @@ | ||
exports.formatQuery = formatQuery; | ||
exports.generateRateLimiterFn = generateRateLimiterFn; | ||
exports.getMatchingRateLimiter = getMatchingRateLimiter; | ||
exports.presetResourceArguments = presetResourceArguments; |
{ | ||
"name": "@gitbeaker/requester-utils", | ||
"version": "39.29.0", | ||
"version": "39.30.0--canary.3428.1137971077.0", | ||
"description": "Utility functions for requester implementatons used in @gitbeaker", | ||
@@ -28,5 +28,10 @@ "license": "MIT", | ||
".": { | ||
"types": "./dist/index.d.ts", | ||
"import": "./dist/index.mjs", | ||
"require": "./dist/index.js" | ||
"import": { | ||
"types": "./dist/index.d.mts", | ||
"default": "./dist/index.mjs" | ||
}, | ||
"require": { | ||
"types": "./dist/index.d.ts", | ||
"default": "./dist/index.js" | ||
} | ||
} | ||
@@ -55,13 +60,13 @@ }, | ||
"dependencies": { | ||
"async-sema": "^3.1.1", | ||
"micromatch": "^4.0.5", | ||
"picomatch-browser": "^2.2.6", | ||
"qs": "^6.11.2", | ||
"rate-limiter-flexible": "^4.0.0", | ||
"xcase": "^2.0.1" | ||
}, | ||
"devDependencies": { | ||
"@types/node": "^20.10.4", | ||
"@types/node": "^20.10.5", | ||
"tsup": "^8.0.1", | ||
"typescript": "^5.3.3" | ||
}, | ||
"gitHead": "29e36d244bf9f4852e227012775b946f80caa5af" | ||
"gitHead": "54851e218b030b5ec4ebcb2b6b99c5c246fc7d99" | ||
} |
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
No v1
QualityPackage is not semver >=1. This means it is not stable and does not support ^ ranges.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
59029
564
1
+ Addedpicomatch-browser@^2.2.6
+ Addedrate-limiter-flexible@^4.0.0
+ Addedpicomatch-browser@2.2.6(transitive)
+ Addedrate-limiter-flexible@4.0.1(transitive)
- Removedasync-sema@^3.1.1
- Removedmicromatch@^4.0.5
- Removedasync-sema@3.1.1(transitive)
- Removedbraces@3.0.3(transitive)
- Removedfill-range@7.1.1(transitive)
- Removedis-number@7.0.0(transitive)
- Removedmicromatch@4.0.8(transitive)
- Removedpicomatch@2.3.1(transitive)
- Removedto-regex-range@5.0.1(transitive)