adaptive-concurrency 0.4.0 → 0.5.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/limiter/allocation-unavailable-strategies/BlockingBacklogRejection.d.ts +4 -1
- package/dist/limiter/allocation-unavailable-strategies/BlockingBacklogRejection.d.ts.map +1 -1
- package/dist/limiter/allocation-unavailable-strategies/BlockingBacklogRejection.js +21 -14
- package/dist/limiter/factories/makeBlockingLimiter.d.ts.map +1 -1
- package/dist/limiter/factories/makeBlockingLimiter.js +2 -1
- package/dist/limiter/factories/makeLifoBlockingLimiter.d.ts.map +1 -1
- package/dist/limiter/factories/makeLifoBlockingLimiter.js +2 -1
- package/dist/limiter/factories/makePartitionedBlockingLimiter.d.ts.map +1 -1
- package/dist/limiter/factories/makePartitionedBlockingLimiter.js +2 -1
- package/dist/limiter/factories/makePartitionedLifoBlockingLimiter.d.ts.map +1 -1
- package/dist/limiter/factories/makePartitionedLifoBlockingLimiter.js +2 -1
- package/dist/utils/LinkedWaiterQueue.d.ts +4 -3
- package/dist/utils/LinkedWaiterQueue.d.ts.map +1 -1
- package/dist/utils/LinkedWaiterQueue.js +2 -7
- package/package.json +1 -1
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import type { LimitAllotment } from "../../LimitAllotment.js";
|
|
2
2
|
import type { AcquireResult, AllotmentUnavailableStrategy } from "../../Limiter.js";
|
|
3
|
+
import type { EnqueueDirection, EnqueueOptions } from "../../utils/LinkedWaiterQueue.js";
|
|
3
4
|
export type Waiter<ContextT> = {
|
|
4
5
|
context: ContextT;
|
|
5
6
|
retry: (context: ContextT) => AcquireResult;
|
|
@@ -10,9 +11,10 @@ export type BlockingBacklogRejectionOptions<ContextT, Handle> = {
|
|
|
10
11
|
backlogSize: number;
|
|
11
12
|
backlogTimeout: number | ((context: ContextT) => number);
|
|
12
13
|
queue: WaiterQueue<ContextT, Handle>;
|
|
14
|
+
enqueueDirection: EnqueueDirection | ((context: ContextT) => EnqueueDirection);
|
|
13
15
|
};
|
|
14
16
|
export type WaiterQueue<ContextT, Handle> = {
|
|
15
|
-
enqueue: (waiter: Waiter<ContextT
|
|
17
|
+
enqueue: (waiter: Waiter<ContextT>, options: EnqueueOptions) => {
|
|
16
18
|
value: Waiter<ContextT>;
|
|
17
19
|
handle: Handle;
|
|
18
20
|
};
|
|
@@ -26,6 +28,7 @@ export type WaiterQueue<ContextT, Handle> = {
|
|
|
26
28
|
export declare class BlockingBacklogRejection<ContextT, Handle> implements AllotmentUnavailableStrategy<ContextT> {
|
|
27
29
|
private readonly backlogSize;
|
|
28
30
|
private readonly getBacklogTimeout;
|
|
31
|
+
private readonly getEnqueueOptions;
|
|
29
32
|
private readonly queue;
|
|
30
33
|
private drainInProgress;
|
|
31
34
|
private releaseDuringDrain;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BlockingBacklogRejection.d.ts","sourceRoot":"","sources":["../../../src/limiter/allocation-unavailable-strategies/BlockingBacklogRejection.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAC9D,OAAO,KAAK,EACV,aAAa,EACb,4BAA4B,EAC7B,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"BlockingBacklogRejection.d.ts","sourceRoot":"","sources":["../../../src/limiter/allocation-unavailable-strategies/BlockingBacklogRejection.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAC9D,OAAO,KAAK,EACV,aAAa,EACb,4BAA4B,EAC7B,MAAM,kBAAkB,CAAC;AAC1B,OAAO,KAAK,EACV,gBAAgB,EAChB,cAAc,EACf,MAAM,kCAAkC,CAAC;AAE1C,MAAM,MAAM,MAAM,CAAC,QAAQ,IAAI;IAC7B,OAAO,EAAE,QAAQ,CAAC;IAClB,KAAK,EAAE,CAAC,OAAO,EAAE,QAAQ,KAAK,aAAa,CAAC;IAC5C,OAAO,EAAE,CAAC,SAAS,EAAE,cAAc,GAAG,SAAS,KAAK,IAAI,CAAC;CAC1D,CAAC;AAEF,eAAO,MAAM,WAAW,QAAiB,CAAC;AAE1C,MAAM,MAAM,+BAA+B,CAAC,QAAQ,EAAE,MAAM,IAAI;IAC9D,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,MAAM,GAAG,CAAC,CAAC,OAAO,EAAE,QAAQ,KAAK,MAAM,CAAC,CAAC;IACzD,KAAK,EAAE,WAAW,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IACrC,gBAAgB,EACZ,gBAAgB,GAChB,CAAC,CAAC,OAAO,EAAE,QAAQ,KAAK,gBAAgB,CAAC,CAAC;CAC/C,CAAC;AAEF,MAAM,MAAM,WAAW,CAAC,QAAQ,EAAE,MAAM,IAAI;IAC1C,OAAO,EAAE,CACP,MAAM,EAAE,MAAM,CAAC,QAAQ,CAAC,EACxB,OAAO,EAAE,cAAc,KACpB;QAAE,KAAK,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IACjD,QAAQ,EAAE,MAAM;QAAE,KAAK,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,GAAG,SAAS,CAAC;IACxE,cAAc,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC;IAC5C,IAAI,EAAE,MAAM,MAAM,CAAC;CACpB,CAAC;AAEF,qBAAa,wBAAwB,CACnC,QAAQ,EACR,MAAM,CACN,YAAW,4BAA4B,CAAC,QAAQ,CAAC;IACjD,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;IACrC,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAgC;IAClE,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAwC;IAC1E,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAgC;IACtD,OAAO,CAAC,eAAe,CAAS;IAChC,OAAO,CAAC,kBAAkB,CAAS;gBAEvB,OAAO,EAAE,+BAA+B,CAAC,QAAQ,EAAE,MAAM,CAAC;IA6BtE,sBAAsB,CACpB,OAAO,EAAE,QAAQ,EACjB,KAAK,EAAE,CAAC,OAAO,EAAE,QAAQ,KAAK,aAAa,EAC3C,MAAM,CAAC,EAAE,WAAW,GACnB,OAAO,CAAC,cAAc,GAAG,SAAS,CAAC;IAYhC,mBAAmB,IAAI,OAAO,CAAC,IAAI,CAAC;IA6C1C,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI;IAQxD,OAAO,CAAC,aAAa;IAoCrB,OAAO,CAAC,yBAAyB;CAUlC"}
|
|
@@ -2,28 +2,34 @@ export const MAX_TIMEOUT = 60 * 60 * 1000; // 1 hour
|
|
|
2
2
|
export class BlockingBacklogRejection {
|
|
3
3
|
backlogSize;
|
|
4
4
|
getBacklogTimeout;
|
|
5
|
+
getEnqueueOptions;
|
|
5
6
|
queue;
|
|
6
7
|
drainInProgress = false;
|
|
7
8
|
releaseDuringDrain = false;
|
|
8
9
|
constructor(options) {
|
|
9
10
|
const backlogSize = options.backlogSize;
|
|
10
|
-
if (backlogSize
|
|
11
|
-
(
|
|
12
|
-
throw new RangeError("BlockingBacklogRejection: backlogSize must be a finite number greater than or equal to 0, or Infinity");
|
|
11
|
+
if (Number.isNaN(backlogSize) || backlogSize < 0) {
|
|
12
|
+
throw new RangeError("backlogSize must be greater than or equal to 0");
|
|
13
13
|
}
|
|
14
14
|
this.backlogSize = backlogSize;
|
|
15
15
|
this.queue = options.queue;
|
|
16
16
|
const backlogTimeout = options.backlogTimeout;
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
17
|
+
const enqueueDirection = options.enqueueDirection;
|
|
18
|
+
this.getBacklogTimeout = (() => {
|
|
19
|
+
if (typeof backlogTimeout === "number") {
|
|
20
|
+
this.assertTimeoutWithinBounds(backlogTimeout);
|
|
21
|
+
return () => backlogTimeout;
|
|
22
|
+
}
|
|
23
|
+
return (context) => {
|
|
24
|
+
const contextTimeout = backlogTimeout(context);
|
|
25
|
+
this.assertTimeoutWithinBounds(contextTimeout);
|
|
26
|
+
return contextTimeout;
|
|
27
|
+
};
|
|
28
|
+
})();
|
|
29
|
+
this.getEnqueueOptions =
|
|
30
|
+
typeof enqueueDirection === "function"
|
|
31
|
+
? (context) => ({ direction: enqueueDirection(context) })
|
|
32
|
+
: () => ({ direction: enqueueDirection });
|
|
27
33
|
}
|
|
28
34
|
onAllotmentUnavailable(context, retry, signal) {
|
|
29
35
|
if (signal?.aborted) {
|
|
@@ -97,7 +103,8 @@ export class BlockingBacklogRejection {
|
|
|
97
103
|
retry,
|
|
98
104
|
resolve: (allotment) => settle(allotment),
|
|
99
105
|
};
|
|
100
|
-
const
|
|
106
|
+
const enqueueOptions = this.getEnqueueOptions(context);
|
|
107
|
+
const { handle } = this.queue.enqueue(waiter, enqueueOptions);
|
|
101
108
|
const timer = setTimeout(() => settle(undefined), timeout);
|
|
102
109
|
const onAbort = () => settle(undefined);
|
|
103
110
|
const cleanup = () => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"makeBlockingLimiter.d.ts","sourceRoot":"","sources":["../../../src/limiter/factories/makeBlockingLimiter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,KAAK,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAQhE,wBAAgB,mBAAmB,CAAC,QAAQ,GAAG,IAAI,EACjD,OAAO,GAAE;IACP,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,cAAc,CAAC,EAAE,MAAM,GAAG,CAAC,CAAC,OAAO,EAAE,QAAQ,KAAK,MAAM,CAAC,CAAC;IAC1D,OAAO,CAAC,EAAE,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,EAAE,8BAA8B,CAAC,CAAC;CACrE,GACL,OAAO,CAAC,QAAQ,CAAC,
|
|
1
|
+
{"version":3,"file":"makeBlockingLimiter.d.ts","sourceRoot":"","sources":["../../../src/limiter/factories/makeBlockingLimiter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,KAAK,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAQhE,wBAAgB,mBAAmB,CAAC,QAAQ,GAAG,IAAI,EACjD,OAAO,GAAE;IACP,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,cAAc,CAAC,EAAE,MAAM,GAAG,CAAC,CAAC,OAAO,EAAE,QAAQ,KAAK,MAAM,CAAC,CAAC;IAC1D,OAAO,CAAC,EAAE,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,EAAE,8BAA8B,CAAC,CAAC;CACrE,GACL,OAAO,CAAC,QAAQ,CAAC,CAUnB"}
|
|
@@ -7,7 +7,8 @@ export function makeBlockingLimiter(options = {}) {
|
|
|
7
7
|
allotmentUnavailableStrategy: new BlockingBacklogRejection({
|
|
8
8
|
backlogSize: options.backlogSize ?? Number.POSITIVE_INFINITY,
|
|
9
9
|
backlogTimeout: options.backlogTimeout ?? MAX_TIMEOUT,
|
|
10
|
-
|
|
10
|
+
enqueueDirection: "back",
|
|
11
|
+
queue: new LinkedWaiterQueue(),
|
|
11
12
|
}),
|
|
12
13
|
});
|
|
13
14
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"makeLifoBlockingLimiter.d.ts","sourceRoot":"","sources":["../../../src/limiter/factories/makeLifoBlockingLimiter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,KAAK,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAOhE,wBAAgB,uBAAuB,CAAC,QAAQ,GAAG,IAAI,EACrD,OAAO,GAAE;IACP,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,cAAc,CAAC,EAAE,MAAM,GAAG,CAAC,CAAC,OAAO,EAAE,QAAQ,KAAK,MAAM,CAAC,CAAC;IAC1D,OAAO,CAAC,EAAE,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,EAAE,8BAA8B,CAAC,CAAC;CACrE,GACL,OAAO,CAAC,QAAQ,CAAC,
|
|
1
|
+
{"version":3,"file":"makeLifoBlockingLimiter.d.ts","sourceRoot":"","sources":["../../../src/limiter/factories/makeLifoBlockingLimiter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,KAAK,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAOhE,wBAAgB,uBAAuB,CAAC,QAAQ,GAAG,IAAI,EACrD,OAAO,GAAE;IACP,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,cAAc,CAAC,EAAE,MAAM,GAAG,CAAC,CAAC,OAAO,EAAE,QAAQ,KAAK,MAAM,CAAC,CAAC;IAC1D,OAAO,CAAC,EAAE,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,EAAE,8BAA8B,CAAC,CAAC;CACrE,GACL,OAAO,CAAC,QAAQ,CAAC,CAUnB"}
|
|
@@ -7,7 +7,8 @@ export function makeLifoBlockingLimiter(options = {}) {
|
|
|
7
7
|
allotmentUnavailableStrategy: new BlockingBacklogRejection({
|
|
8
8
|
backlogSize: options.backlogSize ?? 100,
|
|
9
9
|
backlogTimeout: options.backlogTimeout ?? 1_000,
|
|
10
|
-
|
|
10
|
+
enqueueDirection: "front",
|
|
11
|
+
queue: new LinkedWaiterQueue(),
|
|
11
12
|
}),
|
|
12
13
|
});
|
|
13
14
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"makePartitionedBlockingLimiter.d.ts","sourceRoot":"","sources":["../../../src/limiter/factories/makePartitionedBlockingLimiter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,KAAK,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAEhE,OAAO,EAEL,KAAK,eAAe,EACrB,MAAM,8CAA8C,CAAC;AAStD,wBAAgB,8BAA8B,CAC5C,QAAQ,EACR,aAAa,SAAS,MAAM,GAAG,MAAM,EACrC,OAAO,EAAE;IACT,iBAAiB,EAAE,CAAC,OAAO,EAAE,QAAQ,KAAK,aAAa,GAAG,SAAS,CAAC;IACpE,UAAU,EAAE,MAAM,CAAC,aAAa,EAAE,eAAe,GAAG;QAAE,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC1E,OAAO,CAAC,EAAE,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,EAAE,iBAAiB,CAAC,CAAC;IAC5D,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,cAAc,CAAC,EAAE,MAAM,GAAG,CAAC,CAAC,OAAO,EAAE,QAAQ,KAAK,MAAM,CAAC,CAAC;CAC3D,GAAG,OAAO,CAAC,QAAQ,CAAC,
|
|
1
|
+
{"version":3,"file":"makePartitionedBlockingLimiter.d.ts","sourceRoot":"","sources":["../../../src/limiter/factories/makePartitionedBlockingLimiter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,KAAK,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAEhE,OAAO,EAEL,KAAK,eAAe,EACrB,MAAM,8CAA8C,CAAC;AAStD,wBAAgB,8BAA8B,CAC5C,QAAQ,EACR,aAAa,SAAS,MAAM,GAAG,MAAM,EACrC,OAAO,EAAE;IACT,iBAAiB,EAAE,CAAC,OAAO,EAAE,QAAQ,KAAK,aAAa,GAAG,SAAS,CAAC;IACpE,UAAU,EAAE,MAAM,CAAC,aAAa,EAAE,eAAe,GAAG;QAAE,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC1E,OAAO,CAAC,EAAE,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,EAAE,iBAAiB,CAAC,CAAC;IAC5D,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,cAAc,CAAC,EAAE,MAAM,GAAG,CAAC,CAAC,OAAO,EAAE,QAAQ,KAAK,MAAM,CAAC,CAAC;CAC3D,GAAG,OAAO,CAAC,QAAQ,CAAC,CAmCpB"}
|
|
@@ -32,7 +32,8 @@ export function makePartitionedBlockingLimiter(options) {
|
|
|
32
32
|
blockingStrategy: new BlockingBacklogRejection({
|
|
33
33
|
backlogSize: options.backlogSize ?? Number.POSITIVE_INFINITY,
|
|
34
34
|
backlogTimeout: options.backlogTimeout ?? MAX_TIMEOUT,
|
|
35
|
-
|
|
35
|
+
enqueueDirection: "back",
|
|
36
|
+
queue: new LinkedWaiterQueue(),
|
|
36
37
|
}),
|
|
37
38
|
}),
|
|
38
39
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"makePartitionedLifoBlockingLimiter.d.ts","sourceRoot":"","sources":["../../../src/limiter/factories/makePartitionedLifoBlockingLimiter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,KAAK,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAEhE,OAAO,EAEL,KAAK,eAAe,EACrB,MAAM,8CAA8C,CAAC;AAQtD,wBAAgB,kCAAkC,CAChD,QAAQ,EACR,aAAa,SAAS,MAAM,GAAG,MAAM,EACrC,OAAO,EAAE;IACT,iBAAiB,EAAE,CAAC,OAAO,EAAE,QAAQ,KAAK,aAAa,GAAG,SAAS,CAAC;IACpE,UAAU,EAAE,MAAM,CAAC,aAAa,EAAE,eAAe,GAAG;QAAE,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC1E,OAAO,CAAC,EAAE,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,EAAE,iBAAiB,CAAC,CAAC;IAC5D,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,cAAc,CAAC,EAAE,MAAM,GAAG,CAAC,CAAC,OAAO,EAAE,QAAQ,KAAK,MAAM,CAAC,CAAC;CAC3D,GAAG,OAAO,CAAC,QAAQ,CAAC,
|
|
1
|
+
{"version":3,"file":"makePartitionedLifoBlockingLimiter.d.ts","sourceRoot":"","sources":["../../../src/limiter/factories/makePartitionedLifoBlockingLimiter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,KAAK,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAEhE,OAAO,EAEL,KAAK,eAAe,EACrB,MAAM,8CAA8C,CAAC;AAQtD,wBAAgB,kCAAkC,CAChD,QAAQ,EACR,aAAa,SAAS,MAAM,GAAG,MAAM,EACrC,OAAO,EAAE;IACT,iBAAiB,EAAE,CAAC,OAAO,EAAE,QAAQ,KAAK,aAAa,GAAG,SAAS,CAAC;IACpE,UAAU,EAAE,MAAM,CAAC,aAAa,EAAE,eAAe,GAAG;QAAE,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC1E,OAAO,CAAC,EAAE,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,EAAE,iBAAiB,CAAC,CAAC;IAC5D,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,cAAc,CAAC,EAAE,MAAM,GAAG,CAAC,CAAC,OAAO,EAAE,QAAQ,KAAK,MAAM,CAAC,CAAC;CAC3D,GAAG,OAAO,CAAC,QAAQ,CAAC,CAoCpB"}
|
|
@@ -32,7 +32,8 @@ export function makePartitionedLifoBlockingLimiter(options) {
|
|
|
32
32
|
blockingStrategy: new BlockingBacklogRejection({
|
|
33
33
|
backlogSize: options.backlogSize ?? 100,
|
|
34
34
|
backlogTimeout: options.backlogTimeout ?? 1_000,
|
|
35
|
-
|
|
35
|
+
enqueueDirection: "front",
|
|
36
|
+
queue: new LinkedWaiterQueue(),
|
|
36
37
|
}),
|
|
37
38
|
}),
|
|
38
39
|
});
|
|
@@ -1,14 +1,15 @@
|
|
|
1
1
|
declare class ItemHandle {
|
|
2
2
|
}
|
|
3
3
|
export type EnqueueDirection = "front" | "back";
|
|
4
|
+
export type EnqueueOptions = {
|
|
5
|
+
direction: EnqueueDirection;
|
|
6
|
+
};
|
|
4
7
|
export declare class LinkedWaiterQueue<T extends object> {
|
|
5
8
|
private head;
|
|
6
9
|
private tail;
|
|
7
10
|
private readonly nodes;
|
|
8
|
-
private readonly enqueueDirection;
|
|
9
11
|
private length;
|
|
10
|
-
|
|
11
|
-
enqueue(value: T, enqueueDirection?: EnqueueDirection): {
|
|
12
|
+
enqueue(value: T, options: EnqueueOptions): {
|
|
12
13
|
value: T;
|
|
13
14
|
handle: ItemHandle;
|
|
14
15
|
};
|
|
@@ -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;
|
|
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;CAC7B,CAAC;AASF,qBAAa,iBAAiB,CAAC,CAAC,SAAS,MAAM;IAC7C,OAAO,CAAC,IAAI,CAA4B;IACxC,OAAO,CAAC,IAAI,CAA4B;IACxC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAwC;IAC9D,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;IAoBnC,QAAQ,IAAI;QAAE,KAAK,EAAE,CAAC,CAAC;QAAC,MAAM,EAAE,UAAU,CAAA;KAAE,GAAG,SAAS;IAUxD,cAAc,CAAC,MAAM,EAAE,UAAU,GAAG,OAAO;IAuB3C,IAAI,IAAI,MAAM;IAId,OAAO,CAAC,SAAS;IAYjB,OAAO,CAAC,QAAQ;CAWjB"}
|
|
@@ -4,12 +4,8 @@ export class LinkedWaiterQueue {
|
|
|
4
4
|
head;
|
|
5
5
|
tail;
|
|
6
6
|
nodes = new Map();
|
|
7
|
-
enqueueDirection;
|
|
8
7
|
length = 0;
|
|
9
|
-
|
|
10
|
-
this.enqueueDirection = enqueueDirection;
|
|
11
|
-
}
|
|
12
|
-
enqueue(value, enqueueDirection) {
|
|
8
|
+
enqueue(value, options) {
|
|
13
9
|
const handle = new ItemHandle();
|
|
14
10
|
const node = {
|
|
15
11
|
handle,
|
|
@@ -17,9 +13,8 @@ export class LinkedWaiterQueue {
|
|
|
17
13
|
prev: undefined,
|
|
18
14
|
next: undefined,
|
|
19
15
|
};
|
|
20
|
-
const direction = enqueueDirection ?? this.enqueueDirection;
|
|
21
16
|
this.nodes.set(handle, node);
|
|
22
|
-
if (direction === "front") {
|
|
17
|
+
if (options.direction === "front") {
|
|
23
18
|
this.pushFront(node);
|
|
24
19
|
}
|
|
25
20
|
else {
|