adaptive-concurrency 0.6.0 → 0.7.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.ts CHANGED
@@ -17,7 +17,7 @@ export type { StreamingStatistic } from "./statistics/StreamingStatistic.js";
17
17
  export { makeAverageSampleWindow } from "./limit/window/AverageSampleWindow.js";
18
18
  export { createPercentileSampleWindow } from "./limit/window/PercentileSampleWindow.js";
19
19
  export type { SampleWindow } from "./limit/window/SampleWindow.js";
20
- export { squareRoot, squareRootWithBaseline } from "./utils/index.js";
20
+ export { LinkedWaiterQueue, squareRoot, squareRootWithBaseline, } from "./utils/index.js";
21
21
  export * from "./limiter/factories/index.js";
22
22
  export { PartitionedStrategy, type PartitionConfig, } from "./limiter/acquire-strategies/PartitionedStrategy.js";
23
23
  export { SemaphoreStrategy } from "./limiter/acquire-strategies/SemaphoreStrategy.js";
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,YAAY,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAC/D,YAAY,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,EACL,OAAO,EACP,WAAW,EACX,KAAK,cAAc,EACnB,KAAK,aAAa,EAClB,KAAK,eAAe,EACpB,KAAK,4BAA4B,EACjC,KAAK,eAAe,EACpB,KAAK,cAAc,EACnB,KAAK,YAAY,EACjB,KAAK,YAAY,EACjB,KAAK,eAAe,GACrB,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EACL,SAAS,EACT,kBAAkB,EAClB,KAAK,OAAO,EACZ,KAAK,kBAAkB,EACvB,KAAK,WAAW,EAChB,KAAK,cAAc,GACpB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACL,oBAAoB,EACpB,OAAO,EACP,MAAM,EACN,sBAAsB,EACtB,WAAW,EACX,iBAAiB,EACjB,OAAO,EACP,KAAK,UAAU,EACf,KAAK,SAAS,EACd,KAAK,SAAS,EACd,KAAK,UAAU,GAChB,MAAM,gBAAgB,CAAC;AAGxB,OAAO,EAAE,SAAS,EAAE,KAAK,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AACxE,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACnD,OAAO,EACL,aAAa,EACb,KAAK,qBAAqB,GAC3B,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AACzD,OAAO,EAAE,qBAAqB,EAAE,MAAM,kCAAkC,CAAC;AACzE,OAAO,EACL,UAAU,EACV,KAAK,iBAAiB,EACtB,KAAK,gBAAgB,GACtB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EACL,aAAa,EACb,KAAK,oBAAoB,GAC1B,MAAM,0BAA0B,CAAC;AAGlC,OAAO,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAC;AACpE,OAAO,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAC5D,YAAY,EAAE,kBAAkB,EAAE,MAAM,oCAAoC,CAAC;AAG7E,OAAO,EAAE,uBAAuB,EAAE,MAAM,uCAAuC,CAAC;AAChF,OAAO,EAAE,4BAA4B,EAAE,MAAM,0CAA0C,CAAC;AACxF,YAAY,EAAE,YAAY,EAAE,MAAM,gCAAgC,CAAC;AAGnE,OAAO,EAAE,UAAU,EAAE,sBAAsB,EAAE,MAAM,kBAAkB,CAAC;AAEtE,cAAc,8BAA8B,CAAC;AAG7C,OAAO,EACL,mBAAmB,EACnB,KAAK,eAAe,GACrB,MAAM,qDAAqD,CAAC;AAC7D,OAAO,EAAE,iBAAiB,EAAE,MAAM,mDAAmD,CAAC;AAGtF,OAAO,EACL,wBAAwB,EACxB,WAAW,EACX,KAAK,+BAA+B,EACpC,KAAK,WAAW,GACjB,MAAM,yEAAyE,CAAC;AACjF,OAAO,EACL,qBAAqB,EACrB,KAAK,4BAA4B,GAClC,MAAM,sEAAsE,CAAC;AAC9E,OAAO,EAAE,4BAA4B,EAAE,MAAM,6EAA6E,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,YAAY,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAC/D,YAAY,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,EACL,OAAO,EACP,WAAW,EACX,KAAK,cAAc,EACnB,KAAK,aAAa,EAClB,KAAK,eAAe,EACpB,KAAK,4BAA4B,EACjC,KAAK,eAAe,EACpB,KAAK,cAAc,EACnB,KAAK,YAAY,EACjB,KAAK,YAAY,EACjB,KAAK,eAAe,GACrB,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EACL,SAAS,EACT,kBAAkB,EAClB,KAAK,OAAO,EACZ,KAAK,kBAAkB,EACvB,KAAK,WAAW,EAChB,KAAK,cAAc,GACpB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACL,oBAAoB,EACpB,OAAO,EACP,MAAM,EACN,sBAAsB,EACtB,WAAW,EACX,iBAAiB,EACjB,OAAO,EACP,KAAK,UAAU,EACf,KAAK,SAAS,EACd,KAAK,SAAS,EACd,KAAK,UAAU,GAChB,MAAM,gBAAgB,CAAC;AAGxB,OAAO,EAAE,SAAS,EAAE,KAAK,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AACxE,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACnD,OAAO,EACL,aAAa,EACb,KAAK,qBAAqB,GAC3B,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AACzD,OAAO,EAAE,qBAAqB,EAAE,MAAM,kCAAkC,CAAC;AACzE,OAAO,EACL,UAAU,EACV,KAAK,iBAAiB,EACtB,KAAK,gBAAgB,GACtB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EACL,aAAa,EACb,KAAK,oBAAoB,GAC1B,MAAM,0BAA0B,CAAC;AAGlC,OAAO,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAC;AACpE,OAAO,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAC5D,YAAY,EAAE,kBAAkB,EAAE,MAAM,oCAAoC,CAAC;AAG7E,OAAO,EAAE,uBAAuB,EAAE,MAAM,uCAAuC,CAAC;AAChF,OAAO,EAAE,4BAA4B,EAAE,MAAM,0CAA0C,CAAC;AACxF,YAAY,EAAE,YAAY,EAAE,MAAM,gCAAgC,CAAC;AAEnE,OAAO,EACL,iBAAiB,EACjB,UAAU,EACV,sBAAsB,GACvB,MAAM,kBAAkB,CAAC;AAE1B,cAAc,8BAA8B,CAAC;AAG7C,OAAO,EACL,mBAAmB,EACnB,KAAK,eAAe,GACrB,MAAM,qDAAqD,CAAC;AAC7D,OAAO,EAAE,iBAAiB,EAAE,MAAM,mDAAmD,CAAC;AAGtF,OAAO,EACL,wBAAwB,EACxB,WAAW,EACX,KAAK,+BAA+B,EACpC,KAAK,WAAW,GACjB,MAAM,yEAAyE,CAAC;AACjF,OAAO,EACL,qBAAqB,EACrB,KAAK,4BAA4B,GAClC,MAAM,sEAAsE,CAAC;AAC9E,OAAO,EAAE,4BAA4B,EAAE,MAAM,6EAA6E,CAAC"}
package/dist/index.js CHANGED
@@ -16,8 +16,7 @@ export { MinimumValue } from "./statistics/MinimumValue.js";
16
16
  // Sample window types
17
17
  export { makeAverageSampleWindow } from "./limit/window/AverageSampleWindow.js";
18
18
  export { createPercentileSampleWindow } from "./limit/window/PercentileSampleWindow.js";
19
- // Limit functions
20
- export { squareRoot, squareRootWithBaseline } from "./utils/index.js";
19
+ export { LinkedWaiterQueue, squareRoot, squareRootWithBaseline, } from "./utils/index.js";
21
20
  export * from "./limiter/factories/index.js";
22
21
  // Acquire strategies
23
22
  export { PartitionedStrategy, } from "./limiter/acquire-strategies/PartitionedStrategy.js";
@@ -10,6 +10,9 @@ export declare class LinkedWaiterQueue<T extends object> {
10
10
  private readonly nodes;
11
11
  private maxPriority;
12
12
  private length;
13
+ private shuttingDown;
14
+ private shutdownPromise;
15
+ private resolveShutdown;
13
16
  enqueue(value: T, options: EnqueueOptions): {
14
17
  value: T;
15
18
  handle: ItemHandle;
@@ -19,10 +22,12 @@ export declare class LinkedWaiterQueue<T extends object> {
19
22
  handle: ItemHandle;
20
23
  } | undefined;
21
24
  removeByHandle(handle: ItemHandle): boolean;
25
+ shutdown(): Promise<void>;
22
26
  size(): number;
23
27
  private getOrCreateBucket;
24
28
  private insertInBucket;
25
29
  private unlinkFromBucket;
30
+ private maybeResolveShutdown;
26
31
  }
27
32
  export {};
28
33
  //# sourceMappingURL=LinkedWaiterQueue.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"LinkedWaiterQueue.d.ts","sourceRoot":"","sources":["../../src/utils/LinkedWaiterQueue.ts"],"names":[],"mappings":"AAAA,cAAM,UAAU;CAAG;AAEnB,MAAM,MAAM,gBAAgB,GAAG,OAAO,GAAG,MAAM,CAAC;AAChD,MAAM,MAAM,cAAc,GAAG;IAC3B,SAAS,EAAE,gBAAgB,CAAC;IAC5B,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAC/B,CAAC;AAkBF,qBAAa,iBAAiB,CAAC,CAAC,SAAS,MAAM;IAC7C,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAwC;IAChE,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAwC;IAC9D,OAAO,CAAC,WAAW,CAAqB;IACxC,OAAO,CAAC,MAAM,CAAK;IAEnB,OAAO,CACL,KAAK,EAAE,CAAC,EACR,OAAO,EAAE,cAAc,GACtB;QAAE,KAAK,EAAE,CAAC,CAAC;QAAC,MAAM,EAAE,UAAU,CAAA;KAAE;IA0BnC,QAAQ,IAAI;QAAE,KAAK,EAAE,CAAC,CAAC;QAAC,MAAM,EAAE,UAAU,CAAA;KAAE,GAAG,SAAS;IAcxD,cAAc,CAAC,MAAM,EAAE,UAAU,GAAG,OAAO;IAa3C,IAAI,IAAI,MAAM;IAId,OAAO,CAAC,iBAAiB;IAezB,OAAO,CAAC,cAAc;IAwBtB,OAAO,CAAC,gBAAgB;CA+BzB"}
1
+ {"version":3,"file":"LinkedWaiterQueue.d.ts","sourceRoot":"","sources":["../../src/utils/LinkedWaiterQueue.ts"],"names":[],"mappings":"AAAA,cAAM,UAAU;CAAG;AAEnB,MAAM,MAAM,gBAAgB,GAAG,OAAO,GAAG,MAAM,CAAC;AAChD,MAAM,MAAM,cAAc,GAAG;IAC3B,SAAS,EAAE,gBAAgB,CAAC;IAC5B,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAC/B,CAAC;AAkBF,qBAAa,iBAAiB,CAAC,CAAC,SAAS,MAAM;IAC7C,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAwC;IAChE,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAwC;IAC9D,OAAO,CAAC,WAAW,CAAqB;IACxC,OAAO,CAAC,MAAM,CAAK;IACnB,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,eAAe,CAA4B;IACnD,OAAO,CAAC,eAAe,CAA2B;IAElD,OAAO,CACL,KAAK,EAAE,CAAC,EACR,OAAO,EAAE,cAAc,GACtB;QAAE,KAAK,EAAE,CAAC,CAAC;QAAC,MAAM,EAAE,UAAU,CAAA;KAAE;IA8BnC,QAAQ,IAAI;QAAE,KAAK,EAAE,CAAC,CAAC;QAAC,MAAM,EAAE,UAAU,CAAA;KAAE,GAAG,SAAS;IAcxD,cAAc,CAAC,MAAM,EAAE,UAAU,GAAG,OAAO;IAc3C,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAYzB,IAAI,IAAI,MAAM;IAId,OAAO,CAAC,iBAAiB;IAezB,OAAO,CAAC,cAAc;IAwBtB,OAAO,CAAC,gBAAgB;IAgCxB,OAAO,CAAC,oBAAoB;CAQ7B"}
@@ -5,7 +5,13 @@ export class LinkedWaiterQueue {
5
5
  nodes = new Map();
6
6
  maxPriority;
7
7
  length = 0;
8
+ shuttingDown = false;
9
+ shutdownPromise;
10
+ resolveShutdown;
8
11
  enqueue(value, options) {
12
+ if (this.shuttingDown) {
13
+ throw new Error("queue has been shut down");
14
+ }
9
15
  const handle = new ItemHandle();
10
16
  const priority = options.priority ?? 0;
11
17
  if (!Number.isFinite(priority)) {
@@ -50,8 +56,19 @@ export class LinkedWaiterQueue {
50
56
  node.prev = undefined;
51
57
  node.next = undefined;
52
58
  this.length -= 1;
59
+ this.maybeResolveShutdown();
53
60
  return true;
54
61
  }
62
+ shutdown() {
63
+ if (!this.shuttingDown) {
64
+ this.shuttingDown = true;
65
+ this.shutdownPromise = new Promise((resolve) => {
66
+ this.resolveShutdown = resolve;
67
+ });
68
+ this.maybeResolveShutdown();
69
+ }
70
+ return this.shutdownPromise;
71
+ }
55
72
  size() {
56
73
  return this.length;
57
74
  }
@@ -125,4 +142,11 @@ export class LinkedWaiterQueue {
125
142
  }
126
143
  this.maxPriority = newMax;
127
144
  }
145
+ maybeResolveShutdown() {
146
+ if (!this.shuttingDown || this.length !== 0 || !this.resolveShutdown) {
147
+ return;
148
+ }
149
+ this.resolveShutdown();
150
+ this.resolveShutdown = undefined;
151
+ }
128
152
  }
@@ -7,4 +7,5 @@ export declare function squareRoot(n: number): number;
7
7
  * Create a function that returns: max(baseline, squareRoot(n))
8
8
  */
9
9
  export declare function squareRootWithBaseline(baseline: number): (n: number) => number;
10
+ export { LinkedWaiterQueue } from "./LinkedWaiterQueue.js";
10
11
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AASA;;;GAGG;AACH,wBAAgB,UAAU,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAE5C;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CACpC,QAAQ,EAAE,MAAM,GACf,CAAC,CAAC,EAAE,MAAM,KAAK,MAAM,CAEvB"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AASA;;;GAGG;AACH,wBAAgB,UAAU,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAE5C;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CACpC,QAAQ,EAAE,MAAM,GACf,CAAC,CAAC,EAAE,MAAM,KAAK,MAAM,CAEvB;AAED,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC"}
@@ -17,3 +17,4 @@ export function squareRoot(n) {
17
17
  export function squareRootWithBaseline(baseline) {
18
18
  return (n) => Math.max(baseline, squareRoot(n));
19
19
  }
20
+ export { LinkedWaiterQueue } from "./LinkedWaiterQueue.js";
package/package.json CHANGED
@@ -9,7 +9,7 @@
9
9
  "dynamic rate limiting"
10
10
  ],
11
11
  "author": "Ethan Resnick <ethan.resnick@gmail.com>",
12
- "version": "0.6.0",
12
+ "version": "0.7.0",
13
13
  "type": "module",
14
14
  "exports": {
15
15
  ".": {
@@ -20,14 +20,15 @@
20
20
  "files": [
21
21
  "dist"
22
22
  ],
23
+ "scripts": {
24
+ "build": "tsc",
25
+ "test": "node --import tsx --test \"src/**/*.test.ts\"",
26
+ "prepublishOnly": "pnpm build"
27
+ },
23
28
  "devDependencies": {
24
29
  "tsx": "^4.19.0",
25
30
  "type-fest": "^5.5.0",
26
31
  "type-party": "^0.7.3",
27
32
  "typescript": "^6.0.2"
28
- },
29
- "scripts": {
30
- "build": "tsc",
31
- "test": "node --import tsx --test \"src/**/*.test.ts\""
32
33
  }
33
- }
34
+ }