UNPKG

@crussell52/socket-ipc

Version:

An event-driven IPC implementation using unix file sockets.

127 lines (91 loc) 4.2 kB
# About An event-driven IPC implementation for NodeJS using unix file sockets [Docs](https://crussell52.github.io/node-socket-ipc/) | [Source](https://github.com/crussell52/node-socket-ipc/) | [Releases](https://github.com/crussell52/node-socket-ipc/releases) | [NPM](https://www.npmjs.com/package/@crussell52/socket-ipc) ## Table of Contents ### [About](/) (you are here) - [Quick Start](#quick-start) * [Install](#install) * [A Simple Example](#a-simple-example) * [More Examples](#more-examples) - [Limitations](#limitations) - [Alternate solutions](#alternate-solutions) * [Why this One](#why-this-one) #### [Usage](/docs/USAGE.md) #### [Advanced Usage](/docs/ADVANCED.md) #### [API](/docs/API.md) ## Quick Start Want to get up and running quickly? This is for you. ### Install ``` npm install --save @crussell52/socket-ipc ``` ### A Simple Example Client: ```js const {Client} = require('@crussell52/socket-ipc'); const client = new Client({socketFile: '/tmp/myApp.sock'}); // Say hello as soon as we connect to the server with a simple message // that give it our name. client.on('connect', () => client.send('hello', {name: 'crussell52'})); // Connect. It will auto-retry if the connection fails and auto-reconnect if the connection drops. client.connect(); ``` Server: ```js const {Server} = require('@crussell52/socket-ipc'); const server = new Server({socketFile: '/tmp/myApp.sock'}); // Listen for errors so they don't bubble up and kill the app. server.on('error', err => console.error('IPC Server Error!', err)); // Log all messages. Topics are completely up to the sender! server.on('message', (message, topic) => console.log(topic, message)); // Say hello back to anybody that sends a message with the "hello" topic. server.on('message.hello', (message, clientId) => server.send('hello', `Hello, ${message.name}!`, clientId)); // Start listening for connections. server.listen(); // Always clean up when you are ready to shut down your app to clean up socket files. If the app // closes unexpectedly, the server will try to "reclaim" the socket file on the next start. function shutdown() { server.close(); } ``` ### More Examples Check out the `/examples` directory in the [source](https://github.com/crussell52/node-socket-ipc) for more code samples. (Make sure you set the `SOCKET_FILE` constant at the top of the example files before you run them!) ## Limitations Let's get this out of the way early... Requires: - NodeJS >= 8.x LTS (might work with perfectly fine with some older versions -- but not tested) Transport Support: - Unix socket files (might work with windows socket files too -- but not tested) Unsupported Features: - TCP Sockets - UDP Sockets - Windows socket files (well *maybe* it does, I haven't tried ) - Native client-to-client communication (although you could implement it!) Love the project, but you need it to do something it doesn't? Open up a [feature request](https://github.com/crussell52/node-socket-ipc)! ## Alternate solutions [node-ipc](https://www.npmjs.com/package/node-ipc) [ZeroMQ](https://github.com/zeromq/zeromq.js) ### Why this one? When I needed to solve this problem, most of what I found was tied to some extra external dependency or platform (electron, redis, etc). The `node-ipc` lib caught my eye for a time, but I wasn't in love with the interface and it was published under a non-standard (and sometimes considered "satirical") license. So this package was born. Here are the goals of this project: - Bidirectional communication over Unix sockets (maybe other transports, in the future) - Simple interface for sending messages: * From the server to a specific client * From the server to all clients (broadcast) * From any client to the server - Minimize dependencies (So far, `0`!). - Event driven (using native NodeJS `EventEmitter`) - Ability to listen for _all_ messages or to narrow in on specific _topics_. - Built-in client resiliency (automatic reconnection, automatic connection retry) - Extensible design: * _Pluggable_ * Stable API * Thorough docs to make wrapping or extending easy * Leave domain details to the domain experts