Generic resource pooling for Node.js applications with Promise-based API for efficient management of expensive resources.
—
Pending
Does it follow best practices?
Impact
Pending
No eval scenarios have been run
Pending
The risk profile of this skill
Core functionality for creating and managing resource pools with comprehensive configuration options for connection pooling, resource reuse, and pool behavior customization.
Creates a new resource pool with the specified factory and configuration options.
/**
* Creates a new resource pool
* @param factory - Factory object for creating/destroying resources
* @param options - Pool configuration options
* @returns Pool instance
*/
function createPool(factory, options);Usage Examples:
const genericPool = require('generic-pool');
// Database connection pool
const dbFactory = {
create: () => {
return new Promise((resolve, reject) => {
const connection = new DatabaseConnection();
connection.connect((err) => {
if (err) reject(err);
else resolve(connection);
});
});
},
destroy: (connection) => {
return new Promise((resolve) => {
connection.close(() => resolve());
});
},
validate: (connection) => {
return Promise.resolve(connection.isConnected());
}
};
const pool = genericPool.createPool(dbFactory, {
max: 10,
min: 2,
acquireTimeoutMillis: 3000,
testOnBorrow: true
});Required interface for resource creation, destruction, and optional validation.
/**
* Factory interface for managing pool resources
*/
interface Factory {
/**
* Creates a new resource - must return a Promise
* @returns Promise that resolves to the created resource
*/
create(): Promise<any>;
/**
* Destroys a resource - must return a Promise
* @param resource - The resource to destroy
* @returns Promise that resolves when destruction is complete
*/
destroy(resource: any): Promise<void>;
/**
* Optional: Validates if a resource is still usable
* @param resource - The resource to validate
* @returns Promise that resolves to true if valid, false otherwise
*/
validate?(resource: any): Promise<boolean>;
}Usage Examples:
// Simple factory
const simpleFactory = {
create: async () => {
return new SomeResource();
},
destroy: async (resource) => {
await resource.cleanup();
}
};
// Factory with validation
const validatingFactory = {
create: async () => {
const client = new HttpClient();
await client.connect();
return client;
},
destroy: async (client) => {
await client.disconnect();
},
validate: async (client) => {
return client.isConnected() && !client.hasErrors();
}
};Comprehensive configuration interface for customizing pool behavior.
/**
* Pool configuration options
*/
interface Options {
/** Maximum number of resources to create (default: 1) */
max?: number;
/** Minimum number of resources to keep in pool (default: 0) */
min?: number;
/** Maximum number of queued acquire requests (default: unlimited) */
maxWaitingClients?: number;
/** Validate resources before lending (default: false) */
testOnBorrow?: boolean;
/** Validate resources when returned (default: false) */
testOnReturn?: boolean;
/** Timeout for acquire operations in ms (default: unlimited) */
acquireTimeoutMillis?: number;
/** Timeout for destroy operations in ms (default: unlimited) */
destroyTimeoutMillis?: number;
/** FIFO vs LIFO behavior for idle resources (default: true) */
fifo?: boolean;
/** Number of priority levels for queuing (default: 1) */
priorityRange?: number;
/** Start pool automatically on creation (default: true) */
autostart?: boolean;
/** Interval for eviction checks in ms (default: 0 - disabled) */
evictionRunIntervalMillis?: number;
/** Number of resources to check per eviction run (default: 3) */
numTestsPerEvictionRun?: number;
/** Soft idle timeout maintaining minimum pool size (default: -1) */
softIdleTimeoutMillis?: number;
/** Hard idle timeout for eviction (default: 30000) */
idleTimeoutMillis?: number;
/** Promise implementation to use (default: global Promise) */
Promise?: typeof Promise;
}Usage Examples:
// High-capacity database pool
const dbPool = genericPool.createPool(dbFactory, {
max: 50,
min: 5,
maxWaitingClients: 100,
acquireTimeoutMillis: 5000,
testOnBorrow: true,
evictionRunIntervalMillis: 60000,
idleTimeoutMillis: 300000
});
// Priority-enabled API client pool
const apiPool = genericPool.createPool(apiFactory, {
max: 20,
priorityRange: 3, // 0=high, 1=medium, 2=low priority
acquireTimeoutMillis: 10000
});
// Custom Promise implementation
const customPool = genericPool.createPool(factory, {
max: 10,
Promise: require('bluebird')
});Direct Pool class constructor for advanced use cases.
/**
* Pool class constructor (advanced usage)
* @param Evictor - Evictor class for resource eviction
* @param Deque - Deque class for queue management
* @param PriorityQueue - PriorityQueue class for priority queuing
* @param factory - Resource factory
* @param options - Pool configuration
*/
class Pool extends EventEmitter {
constructor(Evictor, Deque, PriorityQueue, factory, options);
}Usage Examples:
const { Pool, DefaultEvictor, Deque, PriorityQueue } = require('generic-pool');
// Create pool with custom components
const customPool = new Pool(
DefaultEvictor,
Deque,
PriorityQueue,
factory,
options
);All available exports from the generic-pool module.
/**
* Module exports
*/
module.exports = {
Pool: Pool,
Deque: Deque,
PriorityQueue: PriorityQueue,
DefaultEvictor: DefaultEvictor,
createPool: function(factory, config) {
return new Pool(DefaultEvictor, Deque, PriorityQueue, factory, config);
}
};