High performance resource pool written with TypeScript.
- The fastest Resource Pool implementation for JavaScript ever! Check out benchmark results
- Advanced configuration options, suits for enterprise level applications
- Configuration can be changed while pool running
- Promise based factory supported
- Supports validation and resource reset
- Fully tested. (%100 coverage)
npm install lightning-pool --save
import {Pool} from 'lightning-pool';
import dbDriver from 'some-db-driver';
/**
* Step 1 - Create a factory object
*/
const factory = {
create: async function(opts) {
const client = await DbDriver.createClient();
return client;
},
destroy: async function(client) {
await client.close();
},
reset: async function(client){
await client.rollback();
},
validate: async function(client) {
await client.query('select 1');
}
};
/**
* Step 2 - Create a the pool object
*/
const pool = new Pool(factory, {
max: 10, // maximum size of the pool
min: 2, // minimum size of the pool
minIdle: 2 // minimum idle resources
});
pool.start();
/**
* Step 3 - Use pool in your code to acquire/release resources
*/
// acquire connection - Promise is resolved
const client = await pool.acquire();
// once a resource becomes available
// Use resource
await client.query("select * from foo");
// return object back to pool
await pool.release(client);
/**
* Step 4 - Shutdown pool (optional)
* Call close(force) when you need to shutdown the pool
*/
// Wait for active resource for 5 sec than force shutdown
await pool.close(5000);lightning-pool module exports createPool() method and Pool class. Both can be used to instantiate a Pool.
import {createPool} from 'lightning-pool';
const pool = createPool(factory, options);import {Pool} from 'lightning-pool';
const pool = new Pool(factory, options);Can be any object/instance with the following properties:
create: The function that thePoolwill call when it needs a new resource. It should return aPromise<resouce>.destroy: The function that thePoolwill call when it wants to destroy aresource. It should accept first argument asresource, whereresourceis whatever factory.create made. It should return aPromise<>.reset(optional) : The function that thePoolwill call before anyresourceback to thePool. It should accept first argument asresource, whereresourceis whatever factory.create made. It should return aPromise<>.Poolwill destroy and remove the resource from thePoolon any error.validate(optional) : The function that thePoolwill call when any resource needs to be validated. It should accept first argument asresource, whereresourceis whatever factory.create made. It should return aPromise<>.Poolwill destroy and remove the resource from thePoolon any error.
acquireMaxRetries: Maximum number thatPoolwill try to create a resource before returning the error. (Default 0)acquireRetryWait: Time in millis thatPoolwill wait after each tries. (Default 2000)acquireTimeoutMillis: Time in millis an acquire call will wait for a resource before timing out. (Default 0 - no limit)fifo: If true resources will be allocated first-in-first-out order. resources will be allocated last-in-first-out order. (Default true)idleTimeoutMillis: The minimum amount of time in millis that anresourcemay sit idle in thePool. (Default 30000)houseKeepInterval: Time period in millis thatPoolwill make a cleanup. (Default 1000)min: Minimum number of resources thatPoolwill keep. (Default 0)minIdle: Minimum number of resources thatPoolwill keep in idle state. (Default 0)max: Maximum number of resources thatPoolwill create. (Default 10)maxQueue: Maximum number of request thatPoolwill accept. (Default 1000)resetOnReturn: If truePoolwill callreset()function of factory before moving it idle state. (Default true)validation: If truePoolwill callvalidation()function of factory when it needs it. If false,validation()never been called. (Default true)
Acquires a resource from the Pool or create a new one.
pool.acquire(): Promise<any>
pool.acquire(factoryCreateOptions: any): Promise<any>
pool.acquire(callback:Callback): Promise<any>
pool.acquire(factoryCreateOptions?: any, callback:Callback): Promise<any>
- Returns: A Promise
var promise = pool.acquire();
promise.then(resource => {
// Do what ever you want with resource
}).catch(err =>{
// Handle Error
});Returns if a resource has been acquired from the Pool and not yet released or destroyed.
pool.isAcquired(resource)
resource: A previously acquired resource- Returns: True if the resource is acquired, else False
if (pool.isAcquired(resource)) {
// Do any thing
}Returns if the Pool contains a resource
pool.includes(resource)
resource: A resource object- Returns: True if the resource is in the
Pool, else False
if (pool.includes(resource)) {
// Do any thing
}Releases an allocated resource and let it back to pool.
pool.release(resource)
resource: A previously acquired resource- Returns: undefined
pool.release(resource);Releases, destroys and removes any resource from Pool.
pool.destroy(resource)
resource: A previously acquired resource- Returns: undefined
pool.destroy(resource);Starts the Pool and begins creating of resources, starts house keeping and any other internal logic.
Note: This method is not need to be called. Pool instance will automatically be started when acquire() method is called
pool.start()
- Returns: undefined
pool.start();Shuts down the Pool and destroys all resources.
close(callback: Callback): void;
close(terminateWait: number, callback?: Callback): Promise<void>;
close(force: boolean, callback?: Callback): void;
force: If true,Poolwill immediately destroy resources instead of waiting to be releasedterminateWait: If specified,Poolwill wait for active resources to releasecallback: If specified, callback will be called after close. If not specified a promise returns.
var promise = pool.close();
promise.then(() => {
console.log('Pool has been shut down')
}).catch(err => {
console.error(err);
});acquired(Number): Returns number of acquired resources.available(Number): Returns number of idle resources.creating(Number): Returns number of resources currently been created.pending(Number): Returns number of acquire request waits in thePoolqueue.size(Number): Returns number of total resources.state(PoolState): Returns current state of thePool.options(PoolOptions): Returns object instance that holds configuration propertiesacquireMaxRetries(Get/Set): Maximum number thatPoolwill try to create a resource before returning the error. (Default 0)acquireRetryWait(Get/Set): Time in millis thatPoolwill wait after each tries. (Default 2000)acquireTimeoutMillis(Get/Set): Time in millis an acquire call will wait for a resource before timing out. (Default 0 - no limit)fifo(Get/Set): If true resources will be allocated first-in-first-out order. resources will be allocated last-in-first-out order. (Default true)idleTimeoutMillis(Get/Set): The minimum amount of time in millis that anresourcemay sit idle in thePool. (Default 30000)houseKeepInterval(Get/Set): Time period in millis thatPoolwill make a cleanup. (Default 1000)min(Get/Set): Minimum number of resources thatPoolwill keep. (Default 0)minIdle(Get/Set): Minimum number of resources thatPoolwill keep in idle state. (Default 0)max(Get/Set): Maximum number of resources thatPoolwill create. (Default 10)maxQueue(Get/Set): Maximum number of request thatPoolwill acceps. (Default 1000)resetOnReturn(Get/Set): If truePoolwill callreset()function of factory before moving it idle state. (Default true)validation(Get/Set): If truePoolwill callvalidation()function of factory when it needs it. If false,validation()never been called. (Default true)
Pool derives from EventEmitter and produce the following events:
acquire: Emitted when a resource acquired.
pool.on('acquire', function(resource){
//....
})create: Emitted when a new resource is added to thePool.
pool.on('create', function(resource){
//....
})create-error: Emitted when a factory.create informs any error.
pool.on('create-error', function(error){
//Log stuff maybe
})destroy: Emitted when a resource is destroyed and removed from thePool.destroy-error: Emitted when a factory.destroy informs any error.
pool.on('destroy-error', function(error, resource){
//Log stuff maybe
})return: Emitted when an acquired resource returns to thePool.
pool.on('start', function(resource){
//...
})start: Emitted when thePoolstarted.
pool.on('start', function(){
//...
})closing: Emitted when before closing thePool.
pool.on('closing', function(){
//...
})close: Emitted when after closing thePool.
pool.on('close', function(){
//...
})validate-error: Emitted when a factory.validate informs any error.
pool.on('validate-error', function(error, resource){
//Log stuff maybe
})Pool.PoolState (Number):
-
IDLE: 0, // Pool has not been started
-
STARTED: 1, // Pool has been started
-
CLOSING: 2, // Pool shutdown in progress
-
CLOSED: 3 // Pool has been shut down
- node
>= 16.0;