npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

disker

v1.0.7

Published

Dispatcher-worker implementation using Redis. This is inspired by Pandastrike's mutual implementation of DurableChannel

Downloads

10

Readme

Disker

Disker is an implementation of dispatcher-worker pattern for distributed processing of tasks using Redis. For example, Disker can be used for distributed processing of HTTP requests. Disker is inspired by mutual.

Usage

Create a dispatcher and worker

Either we can use a singleton or create a new instance. Its optimal to use single Disker instance per process.

Create a dispatcher:

  const options = {"redis": {"host": "127.0.0.1", "port": 6379}, "maxConnectionPoolSize": 100};
  const dispatcher = Disker.getSingleton(options);
  // or if we need to create a new instance
  // const dispatcher = new Disker(options);

Similarly, create a worker:

  const options = { "redis": {"host": "127.0.0.1", "port": 6379}, "maxConnectionPoolSize": 100 };
  const worker = Disker.getSingleton(options);
  // or if we need to create a new instance
  // const worker = new Disker(options);

Note: You can run worker code on one or more remote machines for distributed processing of tasks.

Send messages

  dispatcher.send(
    { "sender": "my-dispatcher", "receiver": "my-worker", "content": "hello worker" }
  ).then(function() {
    console.log("Successfully sent message");
  }).catch(function(err) {
    console.log("Failed to send message: ${err}");
  });

If you do not wish to receive a reply, you can can use a boolean flag "fireAndForget" when sending the message. like this dispatcher.send({ "sender": "my-dispatcher", "receiver": "my-worker", "content": "hello worker", "fireAndForget": true })

Receive messages

  // Register a message handler to receive messages
  worker.registerMessageHandler({ 
    "receiver": "my-worker", 
    "handler": function(message) {
      // We have received a message, lets reply to the message
      worker.reply(
        { "sender": "my-worker", "receiver": "my-dispatcher", "message": message, "response": "hello dispatcher" }
      ).then(function() { 
        console.log("Successfully replied to message"); 
      }).catch(function(err) {
        console.log("Failed to reply to message");
      });
    }
  }).then(function() {
    console.log("Successfully registered message handler");
  }).catch(function(err) {
    console.log("Failed to register message handler: ${err}");
  });

Note: When replying to a message, 'sender' would be worker's name and 'receiver' would be dispatcher's name. We should send the original message and response.

Receive timeout notifications

  // Send a message with a timeout. Timeout is specified in milliseconds
  dispatcher.send(
    { "sender": "my-dispatcher", "receiver": "my-worker", "content": "hello worker", "timeout": 1000 }
  ).then(function() {
    console.log("Successfully sent message");
  }).catch(function(err) {
    console.log("Failed to send message: ${err}");
  });

  // Register a timeout handler to receive timeouts
  dispatcher.registerTimeoutHandler({
    "sender": "my-dispatcher", 
    "handler": function(message) {
      console.log("Successfully received a timeout");
    }
  }).then(function() {
    console.log("Successfully registered timeout handler");
  }).catch(function(err) {
    console.log("Failed to register timeout handler: ${err}");
  });

Note: To receive timeout, 'sender' would be dispatcher's name itself to indicate whose message timeouts we want to receive notifications for.

Finally, end the dispatcher and worker to close connections

End the dispatcher

  dispatcher.end();

End the worker

  worker.end();

Supported Options

| Property | Default | Description | |---------------------------|-----------|-------------| | redis.host | 127.0.0.1 | IP address of the Redis server. | | redis.port | 6379 | Port of the Redis server. | | maxConnectionPoolSize | 10 | The maximum number of connections to keep in pool. | | receiverBlockTimeout | 1 | Time in seconds to wait for a message. Set this to 0 to wait indefinitely. | | timeoutMonitorFrequency | 1 | How frequently should Disker monitor for timeouts. This value is in seconds. |