@ipsme/msgenv-nsdnc
v0.0.2
Published
This library contains the wrapper code for sending messages to the macOS messaging environment (NSDistributedNotificationCenter) from plain Node.js, no Electron required
Readme
npm-msgenv-NSDNC
This library contains the wrapper code for sending messages to the macOS messaging environment (ME) from plain Node.js. The ready available pubsub between processes on macOS is the NSDistributedNotificationCenter (NSDNC), reached here through its CoreFoundation face by a small Node-API addon; Electron is not required (contrast @ipsme/msgenv-nsdnc-electron).
IPSME- Idempotent Publish/Subscribe Messaging Environment
https://dl.acm.org/doi/abs/10.1145/3458307.3460966
Subscribing
IPSME_MsgEnv_OS = require('@ipsme/msgenv-nsdnc');
function ipsme_handler_(msg)
{
console.log(msg);
}
IPSME_MsgEnv_OS.subscribe( ipsme_handler_ );It is by design that a participant receives the messages it has published itself. If this is not desirable, each message can contain a "referer" (sic) identifier and a clause added in the ipsme_handler_ to drop those messages containing the participant's own referer id.
Publishing
IPSME_MsgEnv_OS.publish('...');Disposing
IPSME_MsgEnv_OS.dispose();While subscribed, the process is kept alive (as an open socket would); dispose() releases it.
Discussion
Wire format is identical to objc-msgenv-NSDNC and @ipsme/msgenv-nsdnc-electron: the notification name is the channel (IPSME by default, config.options = { channel } to change it) and the message is carried as userInfo["msg"], so Node, Objective-C and Electron participants interoperate.
Distributed notifications are delivered through the main thread's CFRunLoop, which Node never runs. The addon exposes a pump() that runs that loop for one non-blocking pass, and this wrapper calls it from a setInterval (default every 10 ms, config.options = { pump_ms }) so that handlers are invoked on the JS thread. Delivery latency is therefore bounded by pump_ms on top of NSDNC's own, unbounded, latency.
Note: Apple forbids sending userInfo dictionaries in distributed notifications from sandboxed applications; this package is for unsandboxed Node processes.
Building
npm install compiles the addon with node-gyp (Xcode command line tools required). npm run build bundles the wrapper into dist/. npm test publishes to itself and expects messages 1 and 3.o to be echoed, not 2.o.
