extra-pool 0.1.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.
@@ -0,0 +1 @@
1
+ export * from './pool';
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./pool"), exports);
18
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,yCAAsB"}
@@ -0,0 +1,19 @@
1
+ import { Awaitable } from '@blackglory/prelude';
2
+ import { Deferred } from 'extra-promise';
3
+ export declare enum InstanceState {
4
+ Creating = "creating",
5
+ Idle = "idle",
6
+ Using = "using",
7
+ Destroying = "destroying",
8
+ Destroyed = "destroyed"
9
+ }
10
+ export declare class Instance<T> {
11
+ private destroyValue?;
12
+ private fsm;
13
+ readonly _value: Deferred<T>;
14
+ constructor(createValue: () => Awaitable<T>, destroyValue?: ((value: T) => Awaitable<void>) | undefined);
15
+ waitForCreated(): Promise<void>;
16
+ getState(): InstanceState;
17
+ use<U>(fn: (instance: T) => Awaitable<U>): Promise<U>;
18
+ destroy(): Promise<void>;
19
+ }
@@ -0,0 +1,97 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.Instance = exports.InstanceState = void 0;
13
+ const prelude_1 = require("@blackglory/prelude");
14
+ const extra_promise_1 = require("extra-promise");
15
+ const structures_1 = require("@blackglory/structures");
16
+ const rxjs_1 = require("rxjs");
17
+ const operators_1 = require("rxjs/operators");
18
+ var InstanceState;
19
+ (function (InstanceState) {
20
+ InstanceState["Creating"] = "creating";
21
+ InstanceState["Idle"] = "idle";
22
+ InstanceState["Using"] = "using";
23
+ InstanceState["Destroying"] = "destroying";
24
+ InstanceState["Destroyed"] = "destroyed";
25
+ })(InstanceState = exports.InstanceState || (exports.InstanceState = {}));
26
+ const instanceSchema = {
27
+ [InstanceState.Creating]: {
28
+ created: InstanceState.Idle
29
+ },
30
+ [InstanceState.Idle]: {
31
+ use: InstanceState.Using,
32
+ destroy: InstanceState.Destroying
33
+ },
34
+ [InstanceState.Using]: {
35
+ used: InstanceState.Idle
36
+ },
37
+ [InstanceState.Destroying]: {
38
+ destroyed: InstanceState.Destroyed
39
+ },
40
+ [InstanceState.Destroyed]: {}
41
+ };
42
+ class Instance {
43
+ constructor(createValue, destroyValue) {
44
+ this.destroyValue = destroyValue;
45
+ this._value = new extra_promise_1.Deferred();
46
+ this.fsm = new structures_1.ObservableFiniteStateMachine(instanceSchema, InstanceState.Creating);
47
+ (0, prelude_1.go)(() => __awaiter(this, void 0, void 0, function* () {
48
+ try {
49
+ const val = yield createValue();
50
+ this._value.resolve(val);
51
+ this.fsm.send('created');
52
+ }
53
+ catch (e) {
54
+ this._value.reject(e);
55
+ }
56
+ }));
57
+ }
58
+ waitForCreated() {
59
+ return __awaiter(this, void 0, void 0, function* () {
60
+ yield this._value;
61
+ });
62
+ }
63
+ getState() {
64
+ return this.fsm.state;
65
+ }
66
+ use(fn) {
67
+ return __awaiter(this, void 0, void 0, function* () {
68
+ this.fsm.send('use');
69
+ const value = yield this._value;
70
+ try {
71
+ return yield fn(value);
72
+ }
73
+ finally {
74
+ this.fsm.send('used');
75
+ }
76
+ });
77
+ }
78
+ destroy() {
79
+ var _a;
80
+ return __awaiter(this, void 0, void 0, function* () {
81
+ if (this.fsm.matches(InstanceState.Creating) ||
82
+ this.fsm.matches(InstanceState.Using)) {
83
+ yield (0, rxjs_1.firstValueFrom)(this.fsm.observeStateChanges().pipe((0, operators_1.filter)(state => state.newState === InstanceState.Idle)));
84
+ }
85
+ if (this.fsm.matches(InstanceState.Idle)) {
86
+ this.fsm.send('destroy');
87
+ yield ((_a = this.destroyValue) === null || _a === void 0 ? void 0 : _a.call(this, yield this._value));
88
+ this.fsm.send('destroyed');
89
+ }
90
+ else if (this.fsm.matches(InstanceState.Destroying)) {
91
+ yield (0, rxjs_1.firstValueFrom)(this.fsm.observeStateChanges().pipe((0, operators_1.filter)(state => state.newState === InstanceState.Destroyed)));
92
+ }
93
+ });
94
+ }
95
+ }
96
+ exports.Instance = Instance;
97
+ //# sourceMappingURL=instance.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"instance.js","sourceRoot":"","sources":["../../src/instance.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ import { CustomError } from '@blackglory/errors';
2
+ import { Awaitable } from '@blackglory/prelude';
3
+ interface IPoolOptions<T> {
4
+ create: () => Awaitable<T>;
5
+ destroy?: (value: T) => Awaitable<void>;
6
+ maxInstances?: number;
7
+ minInstances?: number;
8
+ idleTimeout?: number;
9
+ }
10
+ export declare class Pool<T> {
11
+ private createValue;
12
+ private destroyValue?;
13
+ private fsm;
14
+ private items;
15
+ private userDeferredQueue;
16
+ private maxInstances;
17
+ private minInstances;
18
+ private idleTimeout;
19
+ get size(): number;
20
+ constructor(options: IPoolOptions<T>);
21
+ use<U>(fn: (instance: T) => Awaitable<U>): Promise<U>;
22
+ destroy(): Promise<void>;
23
+ }
24
+ export declare class UnavailablePool extends CustomError {
25
+ }
26
+ export {};
@@ -0,0 +1,129 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.UnavailablePool = exports.Pool = void 0;
13
+ const errors_1 = require("@blackglory/errors");
14
+ const structures_1 = require("@blackglory/structures");
15
+ const extra_promise_1 = require("extra-promise");
16
+ const iterable_operator_1 = require("iterable-operator");
17
+ const instance_1 = require("./instance");
18
+ const extra_timers_1 = require("extra-timers");
19
+ var PoolState;
20
+ (function (PoolState) {
21
+ PoolState["Running"] = "running";
22
+ PoolState["Destroying"] = "destroying";
23
+ PoolState["Destroyed"] = "destroyed";
24
+ })(PoolState || (PoolState = {}));
25
+ const poolSchema = {
26
+ [PoolState.Running]: {
27
+ destroy: PoolState.Destroying
28
+ },
29
+ [PoolState.Destroying]: {
30
+ destroyed: PoolState.Destroyed
31
+ },
32
+ [PoolState.Destroyed]: {}
33
+ };
34
+ class Pool {
35
+ constructor(options) {
36
+ var _a, _b, _c;
37
+ this.fsm = new structures_1.FiniteStateMachine(poolSchema, PoolState.Running);
38
+ this.items = new Set();
39
+ this.userDeferredQueue = new structures_1.Queue();
40
+ this.createValue = options.create;
41
+ this.destroyValue = options.destroy;
42
+ this.maxInstances = (_a = options.maxInstances) !== null && _a !== void 0 ? _a : Infinity;
43
+ this.minInstances = (_b = options.minInstances) !== null && _b !== void 0 ? _b : 0;
44
+ this.idleTimeout = (_c = options.idleTimeout) !== null && _c !== void 0 ? _c : 0;
45
+ }
46
+ get size() {
47
+ return this.items.size;
48
+ }
49
+ use(fn) {
50
+ return __awaiter(this, void 0, void 0, function* () {
51
+ const self = this;
52
+ const item = (0, iterable_operator_1.find)(this.items, instance => !instance.using);
53
+ if (item) {
54
+ return yield use(item);
55
+ }
56
+ else {
57
+ if (this.items.size < this.maxInstances) {
58
+ const instance = new instance_1.Instance(this.createValue, this.destroyValue);
59
+ const item = {
60
+ instance,
61
+ using: true
62
+ };
63
+ this.items.add(item);
64
+ return yield use(item);
65
+ }
66
+ else {
67
+ const deferred = new extra_promise_1.Deferred();
68
+ this.userDeferredQueue.enqueue(deferred);
69
+ const item = yield deferred;
70
+ return yield use(item);
71
+ }
72
+ }
73
+ function use(item) {
74
+ return __awaiter(this, void 0, void 0, function* () {
75
+ item.using = true;
76
+ if (item.cancelDeletion) {
77
+ item.cancelDeletion();
78
+ delete item.cancelDeletion;
79
+ }
80
+ yield item.instance.waitForCreated();
81
+ try {
82
+ return yield item.instance.use(fn);
83
+ }
84
+ finally {
85
+ if (self.userDeferredQueue.size > 0) {
86
+ self.userDeferredQueue.dequeue().resolve(item);
87
+ }
88
+ else {
89
+ item.using = false;
90
+ if (self.items.size > self.minInstances) {
91
+ if (self.idleTimeout > 0) {
92
+ item.cancelDeletion = (0, extra_timers_1.setTimeout)(self.idleTimeout, removeItem);
93
+ }
94
+ else {
95
+ yield removeItem();
96
+ }
97
+ }
98
+ }
99
+ }
100
+ function removeItem() {
101
+ return __awaiter(this, void 0, void 0, function* () {
102
+ self.items.delete(item);
103
+ yield item.instance.destroy();
104
+ });
105
+ }
106
+ });
107
+ }
108
+ });
109
+ }
110
+ destroy() {
111
+ return __awaiter(this, void 0, void 0, function* () {
112
+ this.fsm.send('destroy');
113
+ for (const item of this.items) {
114
+ yield item.instance.destroy();
115
+ }
116
+ this.items.clear();
117
+ let deferred;
118
+ while (deferred = this.userDeferredQueue.dequeue()) {
119
+ deferred.reject(new UnavailablePool());
120
+ }
121
+ this.fsm.send('destroyed');
122
+ });
123
+ }
124
+ }
125
+ exports.Pool = Pool;
126
+ class UnavailablePool extends errors_1.CustomError {
127
+ }
128
+ exports.UnavailablePool = UnavailablePool;
129
+ //# sourceMappingURL=pool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pool.js","sourceRoot":"","sources":["../../src/pool.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export * from './pool';
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./pool"), exports);
18
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,yCAAsB"}
@@ -0,0 +1,19 @@
1
+ import { Awaitable } from '@blackglory/prelude';
2
+ import { Deferred } from 'extra-promise';
3
+ export declare enum InstanceState {
4
+ Creating = "creating",
5
+ Idle = "idle",
6
+ Using = "using",
7
+ Destroying = "destroying",
8
+ Destroyed = "destroyed"
9
+ }
10
+ export declare class Instance<T> {
11
+ private destroyValue?;
12
+ private fsm;
13
+ readonly _value: Deferred<T>;
14
+ constructor(createValue: () => Awaitable<T>, destroyValue?: ((value: T) => Awaitable<void>) | undefined);
15
+ waitForCreated(): Promise<void>;
16
+ getState(): InstanceState;
17
+ use<U>(fn: (instance: T) => Awaitable<U>): Promise<U>;
18
+ destroy(): Promise<void>;
19
+ }
@@ -0,0 +1,82 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Instance = exports.InstanceState = void 0;
4
+ const prelude_1 = require("@blackglory/prelude");
5
+ const extra_promise_1 = require("extra-promise");
6
+ const structures_1 = require("@blackglory/structures");
7
+ const rxjs_1 = require("rxjs");
8
+ const operators_1 = require("rxjs/operators");
9
+ var InstanceState;
10
+ (function (InstanceState) {
11
+ InstanceState["Creating"] = "creating";
12
+ InstanceState["Idle"] = "idle";
13
+ InstanceState["Using"] = "using";
14
+ InstanceState["Destroying"] = "destroying";
15
+ InstanceState["Destroyed"] = "destroyed";
16
+ })(InstanceState = exports.InstanceState || (exports.InstanceState = {}));
17
+ const instanceSchema = {
18
+ [InstanceState.Creating]: {
19
+ created: InstanceState.Idle
20
+ },
21
+ [InstanceState.Idle]: {
22
+ use: InstanceState.Using,
23
+ destroy: InstanceState.Destroying
24
+ },
25
+ [InstanceState.Using]: {
26
+ used: InstanceState.Idle
27
+ },
28
+ [InstanceState.Destroying]: {
29
+ destroyed: InstanceState.Destroyed
30
+ },
31
+ [InstanceState.Destroyed]: {}
32
+ };
33
+ class Instance {
34
+ constructor(createValue, destroyValue) {
35
+ this.destroyValue = destroyValue;
36
+ this._value = new extra_promise_1.Deferred();
37
+ this.fsm = new structures_1.ObservableFiniteStateMachine(instanceSchema, InstanceState.Creating);
38
+ (0, prelude_1.go)(async () => {
39
+ try {
40
+ const val = await createValue();
41
+ this._value.resolve(val);
42
+ this.fsm.send('created');
43
+ }
44
+ catch (e) {
45
+ this._value.reject(e);
46
+ }
47
+ });
48
+ }
49
+ async waitForCreated() {
50
+ await this._value;
51
+ }
52
+ getState() {
53
+ return this.fsm.state;
54
+ }
55
+ async use(fn) {
56
+ this.fsm.send('use');
57
+ const value = await this._value;
58
+ try {
59
+ return await fn(value);
60
+ }
61
+ finally {
62
+ this.fsm.send('used');
63
+ }
64
+ }
65
+ async destroy() {
66
+ var _a;
67
+ if (this.fsm.matches(InstanceState.Creating) ||
68
+ this.fsm.matches(InstanceState.Using)) {
69
+ await (0, rxjs_1.firstValueFrom)(this.fsm.observeStateChanges().pipe((0, operators_1.filter)(state => state.newState === InstanceState.Idle)));
70
+ }
71
+ if (this.fsm.matches(InstanceState.Idle)) {
72
+ this.fsm.send('destroy');
73
+ await ((_a = this.destroyValue) === null || _a === void 0 ? void 0 : _a.call(this, await this._value));
74
+ this.fsm.send('destroyed');
75
+ }
76
+ else if (this.fsm.matches(InstanceState.Destroying)) {
77
+ await (0, rxjs_1.firstValueFrom)(this.fsm.observeStateChanges().pipe((0, operators_1.filter)(state => state.newState === InstanceState.Destroyed)));
78
+ }
79
+ }
80
+ }
81
+ exports.Instance = Instance;
82
+ //# sourceMappingURL=instance.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"instance.js","sourceRoot":"","sources":["../../src/instance.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ import { CustomError } from '@blackglory/errors';
2
+ import { Awaitable } from '@blackglory/prelude';
3
+ interface IPoolOptions<T> {
4
+ create: () => Awaitable<T>;
5
+ destroy?: (value: T) => Awaitable<void>;
6
+ maxInstances?: number;
7
+ minInstances?: number;
8
+ idleTimeout?: number;
9
+ }
10
+ export declare class Pool<T> {
11
+ private createValue;
12
+ private destroyValue?;
13
+ private fsm;
14
+ private items;
15
+ private userDeferredQueue;
16
+ private maxInstances;
17
+ private minInstances;
18
+ private idleTimeout;
19
+ get size(): number;
20
+ constructor(options: IPoolOptions<T>);
21
+ use<U>(fn: (instance: T) => Awaitable<U>): Promise<U>;
22
+ destroy(): Promise<void>;
23
+ }
24
+ export declare class UnavailablePool extends CustomError {
25
+ }
26
+ export {};
@@ -0,0 +1,112 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.UnavailablePool = exports.Pool = void 0;
4
+ const errors_1 = require("@blackglory/errors");
5
+ const structures_1 = require("@blackglory/structures");
6
+ const extra_promise_1 = require("extra-promise");
7
+ const iterable_operator_1 = require("iterable-operator");
8
+ const instance_1 = require("./instance");
9
+ const extra_timers_1 = require("extra-timers");
10
+ var PoolState;
11
+ (function (PoolState) {
12
+ PoolState["Running"] = "running";
13
+ PoolState["Destroying"] = "destroying";
14
+ PoolState["Destroyed"] = "destroyed";
15
+ })(PoolState || (PoolState = {}));
16
+ const poolSchema = {
17
+ [PoolState.Running]: {
18
+ destroy: PoolState.Destroying
19
+ },
20
+ [PoolState.Destroying]: {
21
+ destroyed: PoolState.Destroyed
22
+ },
23
+ [PoolState.Destroyed]: {}
24
+ };
25
+ class Pool {
26
+ constructor(options) {
27
+ var _a, _b, _c;
28
+ this.fsm = new structures_1.FiniteStateMachine(poolSchema, PoolState.Running);
29
+ this.items = new Set();
30
+ this.userDeferredQueue = new structures_1.Queue();
31
+ this.createValue = options.create;
32
+ this.destroyValue = options.destroy;
33
+ this.maxInstances = (_a = options.maxInstances) !== null && _a !== void 0 ? _a : Infinity;
34
+ this.minInstances = (_b = options.minInstances) !== null && _b !== void 0 ? _b : 0;
35
+ this.idleTimeout = (_c = options.idleTimeout) !== null && _c !== void 0 ? _c : 0;
36
+ }
37
+ get size() {
38
+ return this.items.size;
39
+ }
40
+ async use(fn) {
41
+ const self = this;
42
+ const item = (0, iterable_operator_1.find)(this.items, instance => !instance.using);
43
+ if (item) {
44
+ return await use(item);
45
+ }
46
+ else {
47
+ if (this.items.size < this.maxInstances) {
48
+ const instance = new instance_1.Instance(this.createValue, this.destroyValue);
49
+ const item = {
50
+ instance,
51
+ using: true
52
+ };
53
+ this.items.add(item);
54
+ return await use(item);
55
+ }
56
+ else {
57
+ const deferred = new extra_promise_1.Deferred();
58
+ this.userDeferredQueue.enqueue(deferred);
59
+ const item = await deferred;
60
+ return await use(item);
61
+ }
62
+ }
63
+ async function use(item) {
64
+ item.using = true;
65
+ if (item.cancelDeletion) {
66
+ item.cancelDeletion();
67
+ delete item.cancelDeletion;
68
+ }
69
+ await item.instance.waitForCreated();
70
+ try {
71
+ return await item.instance.use(fn);
72
+ }
73
+ finally {
74
+ if (self.userDeferredQueue.size > 0) {
75
+ self.userDeferredQueue.dequeue().resolve(item);
76
+ }
77
+ else {
78
+ item.using = false;
79
+ if (self.items.size > self.minInstances) {
80
+ if (self.idleTimeout > 0) {
81
+ item.cancelDeletion = (0, extra_timers_1.setTimeout)(self.idleTimeout, removeItem);
82
+ }
83
+ else {
84
+ await removeItem();
85
+ }
86
+ }
87
+ }
88
+ }
89
+ async function removeItem() {
90
+ self.items.delete(item);
91
+ await item.instance.destroy();
92
+ }
93
+ }
94
+ }
95
+ async destroy() {
96
+ this.fsm.send('destroy');
97
+ for (const item of this.items) {
98
+ await item.instance.destroy();
99
+ }
100
+ this.items.clear();
101
+ let deferred;
102
+ while (deferred = this.userDeferredQueue.dequeue()) {
103
+ deferred.reject(new UnavailablePool());
104
+ }
105
+ this.fsm.send('destroyed');
106
+ }
107
+ }
108
+ exports.Pool = Pool;
109
+ class UnavailablePool extends errors_1.CustomError {
110
+ }
111
+ exports.UnavailablePool = UnavailablePool;
112
+ //# sourceMappingURL=pool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pool.js","sourceRoot":"","sources":["../../src/pool.ts"],"names":[],"mappings":"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"}