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

hapi-intercom

v1.2.0

Published

A hapi module that enables horizontal eventdriven communication between modules

Downloads

13

Readme

Couple Hapi Plugins horizontally

Hapi is awesome. Period. We use it for all our backend projects and it provides a good eventing system along the flow of the request. To distinguish both eventing systems we call this approach vertically eventing.

Since we really love to encapsulate business logic into plugins, we often have the requirement to couple them to properly use the provided functionality. Hapi offers 2 namespaces for that. The server.methods and the server.plugins namespace, but to offer more flexibility hapi does not make any assumptions on what functions to put there and it's not really event-driven.

So we decided to adopt the good messaging patterns from Backbone.Events and Backbone.Radio and put it in this plugin. This covers the event-driven communication between loosely coupled plugins and we consider this as horizontally eventing.

Install

npm install hapi-intercom

Usage

With

var channel = server.methods.intercom.getChannel()

you get a channel object, where you can use the publish/subscribe, request/reply and the command/comply pattern. You can provide a channel name, to seperate the events, otherwise you get the universal channel.

If the channel does not exist, Backbone.Radio will create it for you, so there is no need to check for existence. Just use getChannel and couple your plugins.

Publish/Subscribe

channel.on("someEvent", doSomething)

channel.emit("someEvent")

The well-known pattern to inform subscribers that something has happened in an event-driven way.

Request/Reply

channel.reply("giveMeSomething", returnSomethingAwesome)

var promise = channel.request("giveMeSomething")

We changed the request/reply api of Backbone.Radio to always return a promise or throw an error, when nothing is returned. So your reply function should return a Promise, otherwise the reply api will wrap it for you.

If there are more than one plugin, which want to reply to one event, the last one registered wins and is the only one replying.

Use this to acquire a transient ressource, e.g. requesting a connection from a connection pool of your database plugin.

Command/Comply

channel.comply("myCommand", function() {
    //do some work that can be triggered from different handlers/plugins in your app
});

//trigger command execution
channel.command("myCommand");

Use this to encapsulate business logic that should be easily accessible everywhere in your app. We use this to easily update a session in our session plugin no matter if triggered from a socket connection or a regular http request.