123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081 |
- function createRateLimiter(
- maxPerSecond,
- enable,
- disable,
- ) {
- let count = 0;
- let retrySeconds = 5;
- let disabledTimeout = 0;
- setInterval(() => {
- if (disabledTimeout === 0) {
- if (count > maxPerSecond) {
- retrySeconds *= 2;
- disable(retrySeconds);
-
- if (retrySeconds > 86400) {
- retrySeconds = 86400;
- }
- disabledTimeout = retrySeconds;
- }
- } else {
- disabledTimeout -= 1;
- if (disabledTimeout === 0) {
- enable();
- }
- }
- count = 0;
- }, 1000).unref();
- return () => {
- count += 1;
- };
- }
- function isAnonymous(name) {
- return name !== undefined && (name.length === 0 || name === '?' || name === '<anonymous>');
- }
- function functionNamesMatch(a, b) {
- return a === b || (isAnonymous(a) && isAnonymous(b));
- }
- function hashFrames(frames) {
- if (frames === undefined) {
- return;
- }
-
- return frames.slice(-10).reduce((acc, frame) => `${acc},${frame.function},${frame.lineno},${frame.colno}`, '');
- }
- function hashFromStack(stackParser, stack) {
- if (stack === undefined) {
- return undefined;
- }
- return hashFrames(stackParser(stack, 1));
- }
- export { createRateLimiter, functionNamesMatch, hashFrames, hashFromStack, isAnonymous };
|