Skip to content

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

25 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Resource Pool

An easy to use resource pool, including support for recycling resources, with excellent TypeScript typings.

Installation

npm install --save ts-resource-pool

Usage

A simplified example of writing a connection pooling mail client:

const net = require('net')
const ResourcePool = require('ts-resource-pool')

const factory = {
  async create () {
    const connection = net.createConnection(25, 'aspmx.l.google.com')
    connection.write('HELO LinusU.local\r\n')
    return connection
  },
  async recycle (connection, error) {
    // Create a new connection if an error happened
    if (error) {
      await this.destroy(connection)
      return this.create()
    }

    // Otherwise, just issue a `RSET` command and reuse the connection
    connection.write('RSET\r\n')
    return connection
  },
  async destory (connection) {
    connection.write('QUIT\r\n')
    connection.end()
  }
}

const pool = new ResourcePool(factory, 5)

for (let i = 0; i < 25; i++) {
  pool.use(async (connection) => {
    connection.write('MAIL FROM: <linus@LinusU.local>\r\n')
    connection.write('RCPT TO: <spam@gmail.com>\r\n')
  })
}

The ResourcePool will make sure that there is never more than 5 connections open at the same time, and it will also reuse the connections instead of closing and opening new sockets.

API

new ResourcePool(factory: Factory, concurrency: number = 1)

Create a new ResourcePool with the specificed factory and concurrency limit.

The factory must at the very least provide a create function, which returns a fresh resource. This can optionally be an async function.

It can also optionally provide:

  • A destroy function, that takes a used resource and an optional error that occured, and tears it down.
  • A recycle function, that takes a used resource and an optional error that occured, and returns a resource (possibly the same) that's ready for use again.

ResourcePool#use (fn: (resource: T) => R | PromiseLike<R>): Promise<R>

Aquire a resource, then execute (possibly async) function fn, and finally returns the resource to the pool. Returns a Promise of whatever the function fn returns.

The resource will be returned even if fn throws or returns a rejected Promise. In this case, the Promise returned will also be rejected with that error.

About

An easy to use resource pool, including support for recycling resources, with excellent TypeScript typings

Resources

Stars

Watchers

Forks

Releases

Packages

Used by

Contributors

Languages