458 lines
		
	
	
		
			15 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
			
		
		
	
	
			458 lines
		
	
	
		
			15 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
| # node-notifier [![NPM version][npm-image]][npm-url] [![Build Status][travis-image]][travis-url]
 | ||
| 
 | ||
| Send cross platform native notifications using Node.js. Notification Center for macOS,
 | ||
| `notify-osd`/`libnotify-bin` for Linux, Toasters for Windows 8/10, or taskbar balloons for
 | ||
| earlier Windows versions. Growl is used if none of these requirements are met.
 | ||
| [Works well with Electron](#within-electron-packaging).
 | ||
| 
 | ||
| 
 | ||
| 
 | ||
| 
 | ||
| ## Input Example macOS Notification Center
 | ||
| 
 | ||
| 
 | ||
| 
 | ||
| ## Quick Usage
 | ||
| 
 | ||
| Show a native notification on macOS, Windows, Linux:
 | ||
| 
 | ||
| ```javascript
 | ||
| const notifier = require('node-notifier');
 | ||
| // String
 | ||
| notifier.notify('Message');
 | ||
| 
 | ||
| // Object
 | ||
| notifier.notify({
 | ||
|   title: 'My notification',
 | ||
|   message: 'Hello, there!'
 | ||
| });
 | ||
| ```
 | ||
| 
 | ||
| ## Requirements
 | ||
| 
 | ||
| - **macOS**: >= 10.8 for native notifications, or Growl if earlier.
 | ||
| - **Linux**: `notify-osd` or `libnotify-bin` installed (Ubuntu should have this by default)
 | ||
| - **Windows**: >= 8, or task bar balloons for Windows < 8. Growl as fallback. Growl takes precedence over Windows balloons.
 | ||
| - **General Fallback**: Growl
 | ||
| 
 | ||
| See [documentation and flow chart for reporter choice](./DECISION_FLOW.md).
 | ||
| 
 | ||
| ## Install
 | ||
| 
 | ||
| ```shell
 | ||
| npm install --save node-notifier
 | ||
| ```
 | ||
| 
 | ||
| ## <abbr title="Command Line Interface">CLI</abbr>
 | ||
| 
 | ||
| <abbr title="Command Line Interface">CLI</abbr> has moved to separate project:
 | ||
| <https://github.com/mikaelbr/node-notifier-cli>
 | ||
| 
 | ||
| ## Cross-Platform Advanced Usage
 | ||
| 
 | ||
| Standard usage, with cross-platform fallbacks as defined in the
 | ||
| [reporter flow chart](./DECISION_FLOW.md). All of the options
 | ||
| below will work in some way or another on all platforms.
 | ||
| 
 | ||
| ```javascript
 | ||
| const notifier = require('node-notifier');
 | ||
| const path = require('path');
 | ||
| 
 | ||
| notifier.notify(
 | ||
|   {
 | ||
|     title: 'My awesome title',
 | ||
|     message: 'Hello from node, Mr. User!',
 | ||
|     icon: path.join(__dirname, 'coulson.jpg'), // Absolute path (doesn't work on balloons)
 | ||
|     sound: true, // Only Notification Center or Windows Toasters
 | ||
|     wait: true // Wait with callback, until user action is taken against notification
 | ||
|   },
 | ||
|   function(err, response) {
 | ||
|     // Response is response from notification
 | ||
|   }
 | ||
| );
 | ||
| 
 | ||
| notifier.on('click', function(notifierObject, options) {
 | ||
|   // Triggers if `wait: true` and user clicks notification
 | ||
| });
 | ||
| 
 | ||
| notifier.on('timeout', function(notifierObject, options) {
 | ||
|   // Triggers if `wait: true` and notification closes
 | ||
| });
 | ||
| ```
 | ||
| 
 | ||
| If you want super fine-grained control, you can customize each reporter individually,
 | ||
| allowing you to tune specific options for different systems.
 | ||
| 
 | ||
| See below for documentation on each reporter.
 | ||
| 
 | ||
| **Example:**
 | ||
| 
 | ||
| ```javascript
 | ||
| const NotificationCenter = require('node-notifier/notifiers/notificationcenter');
 | ||
| new NotificationCenter(options).notify();
 | ||
| 
 | ||
| const NotifySend = require('node-notifier/notifiers/notifysend');
 | ||
| new NotifySend(options).notify();
 | ||
| 
 | ||
| const WindowsToaster = require('node-notifier/notifiers/toaster');
 | ||
| new WindowsToaster(options).notify();
 | ||
| 
 | ||
| const Growl = require('node-notifier/notifiers/growl');
 | ||
| new Growl(options).notify();
 | ||
| 
 | ||
| const WindowsBalloon = require('node-notifier/notifiers/balloon');
 | ||
| new WindowsBalloon(options).notify();
 | ||
| ```
 | ||
| 
 | ||
| Or, if you are using several reporters (or you're lazy):
 | ||
| 
 | ||
| ```javascript
 | ||
| // NOTE: Technically, this takes longer to require
 | ||
| const nn = require('node-notifier');
 | ||
| 
 | ||
| new nn.NotificationCenter(options).notify();
 | ||
| new nn.NotifySend(options).notify();
 | ||
| new nn.WindowsToaster(options).notify(options);
 | ||
| new nn.WindowsBalloon(options).notify(options);
 | ||
| new nn.Growl(options).notify(options);
 | ||
| ```
 | ||
| 
 | ||
| ## Contents
 | ||
| 
 | ||
| - [Notification Center documentation](#usage-notificationcenter)
 | ||
| - [Windows Toaster documentation](#usage-windowstoaster)
 | ||
| - [Windows Balloon documentation](#usage-windowsballoon)
 | ||
| - [Growl documentation](#usage-growl)
 | ||
| - [Notify-send documentation](#usage-notifysend)
 | ||
| 
 | ||
| ### Usage: `NotificationCenter`
 | ||
| 
 | ||
| Same usage and parameter setup as [**`terminal-notifier`**](https://github.com/julienXX/terminal-notifier).
 | ||
| 
 | ||
| Native Notification Center requires macOS version 10.8 or higher. If you have
 | ||
| an earlier version, Growl will be the fallback. If Growl isn't installed, an
 | ||
| error will be returned in the callback.
 | ||
| 
 | ||
| #### Example
 | ||
| 
 | ||
| Because `node-notifier` wraps around [**`terminal-notifier`**](https://github.com/julienXX/terminal-notifier),
 | ||
| you can do anything `terminal-notifier` can, just by passing properties to the `notify`
 | ||
| method.
 | ||
| 
 | ||
| For example:
 | ||
| 
 | ||
| - if `terminal-notifier` says `-message`, you can do `{message: 'Foo'}`
 | ||
| - if `terminal-notifier` says `-list ALL`, you can do `{list: 'ALL'}`.
 | ||
| 
 | ||
| Notification is the primary focus of this module, so listing and activating do work,
 | ||
| but they aren't documented.
 | ||
| 
 | ||
| ### All notification options with their defaults:
 | ||
| 
 | ||
| ```javascript
 | ||
| const NotificationCenter = require('node-notifier').NotificationCenter;
 | ||
| 
 | ||
| var notifier = new NotificationCenter({
 | ||
|   withFallback: false, // Use Growl Fallback if <= 10.8
 | ||
|   customPath: void 0 // Relative/Absolute path to binary if you want to use your own fork of terminal-notifier
 | ||
| });
 | ||
| 
 | ||
| notifier.notify(
 | ||
|   {
 | ||
|     title: void 0,
 | ||
|     subtitle: void 0,
 | ||
|     message: void 0,
 | ||
|     sound: false, // Case Sensitive string for location of sound file, or use one of macOS' native sounds (see below)
 | ||
|     icon: 'Terminal Icon', // Absolute Path to Triggering Icon
 | ||
|     contentImage: void 0, // Absolute Path to Attached Image (Content Image)
 | ||
|     open: void 0, // URL to open on Click
 | ||
|     wait: false, // Wait for User Action against Notification or times out. Same as timeout = 5 seconds
 | ||
| 
 | ||
|     // New in latest version. See `example/macInput.js` for usage
 | ||
|     timeout: 5, // Takes precedence over wait if both are defined.
 | ||
|     closeLabel: void 0, // String. Label for cancel button
 | ||
|     actions: void 0, // String | Array<String>. Action label or list of labels in case of dropdown
 | ||
|     dropdownLabel: void 0, // String. Label to be used if multiple actions
 | ||
|     reply: false // Boolean. If notification should take input. Value passed as third argument in callback and event emitter.
 | ||
|   },
 | ||
|   function(error, response, metadata) {
 | ||
|     console.log(response, metadata);
 | ||
|   }
 | ||
| );
 | ||
| ```
 | ||
| 
 | ||
| ---
 | ||
| 
 | ||
| **Note:** The `wait` option is shorthand for `timeout: 5`. This just sets a timeout
 | ||
| for 5 seconds. It does _not_ make the notification sticky!
 | ||
| 
 | ||
| Without `wait` or `timeout`, notifications are just fired and forgotten. They don't
 | ||
| wait for any response.
 | ||
| 
 | ||
| To make notifications wait for a response (like activation/click), you must define
 | ||
| a `timeout`.
 | ||
| 
 | ||
| _Exception:_ If `reply` is defined, it's recommended to set `timeout` to a either
 | ||
| high value, or to nothing at all.
 | ||
| 
 | ||
| ---
 | ||
| 
 | ||
| **For macOS notifications: `icon`, `contentImage`, and all forms of `reply`/`actions` require macOS 10.9.**
 | ||
| 
 | ||
| Sound can be one of these: `Basso`, `Blow`, `Bottle`, `Frog`, `Funk`, `Glass`,
 | ||
| `Hero`, `Morse`, `Ping`, `Pop`, `Purr`, `Sosumi`, `Submarine`, `Tink`.
 | ||
| 
 | ||
| If `sound` is simply `true`, `Bottle` is used.
 | ||
| 
 | ||
| ---
 | ||
| 
 | ||
| **See Also:**
 | ||
| 
 | ||
| - [Example: specific Notification Centers](./example/advanced.js)
 | ||
| - [Example: input](./example/macInput.js).
 | ||
| 
 | ||
| ---
 | ||
| 
 | ||
| **Custom Path clarification**
 | ||
| 
 | ||
| `customPath` takes a value of a relative or absolute path to the binary of your
 | ||
| fork/custom version of **`terminal-notifier`**.
 | ||
| 
 | ||
| **Example:** `./vendor/mac.noindex/terminal-notifier.app/Contents/MacOS/terminal-notifier`
 | ||
| 
 | ||
| **Spotlight clarification**
 | ||
| 
 | ||
| `terminal-notifier.app` resides in a `mac.noindex` folder to prevent Spotlight from indexing the app.
 | ||
| 
 | ||
| ### Usage: `WindowsToaster`
 | ||
| 
 | ||
| **Note:** There are some limitations for images in native Windows 8 notifications:
 | ||
| 
 | ||
| - The image must be a PNG image
 | ||
| - The image must be smaller than 1024×1024 px
 | ||
| - The image must be less than 200kb
 | ||
| - The image must be specified using an absolute path
 | ||
| 
 | ||
| These limitations are due to the Toast notification system. A good tip is to use
 | ||
| something like `path.join` or `path.delimiter` to keep your paths cross-platform.
 | ||
| 
 | ||
| From [mikaelbr/gulp-notify#90 (comment)](https://github.com/mikaelbr/gulp-notify/issues/90#issuecomment-129333034)
 | ||
| 
 | ||
| > You can make it work by going to System > Notifications & Actions. The 'toast'
 | ||
| > app needs to have Banners enabled. (You can activate banners by clicking on the
 | ||
| > 'toast' app and setting the 'Show notification banners' to On)
 | ||
| 
 | ||
| ---
 | ||
| 
 | ||
| **Windows 10 Fall Creators Update (Version 1709) Note:**
 | ||
| 
 | ||
| With the Fall Creators Update, Notifications on Windows 10 will only work as
 | ||
| expected if the correct `appID` is specified. Your `appID` must be exactly the same
 | ||
| value that was registered during the installation of your app.
 | ||
| 
 | ||
| You can find the ID of your App by searching the registry for the `appID` you
 | ||
| specified at installation of your app. For example: If you use the squirrel
 | ||
| framework, your `appID` will be something like `com.squirrel.your.app`.
 | ||
| 
 | ||
| The default behaviour is to have the underlying toaster applicaton as `appId`.
 | ||
| This works as expected, but shows `SnoreToast` as text in the notification.
 | ||
| 
 | ||
| [**Snoretoast**](https://github.com/KDE/snoretoast) is used to get native Windows Toasts!
 | ||
| 
 | ||
| ```javascript
 | ||
| const WindowsToaster = require('node-notifier').WindowsToaster;
 | ||
| 
 | ||
| var notifier = new WindowsToaster({
 | ||
|   withFallback: false, // Fallback to Growl or Balloons?
 | ||
|   customPath: void 0 // Relative/Absolute path if you want to use your fork of SnoreToast.exe
 | ||
| });
 | ||
| 
 | ||
| notifier.notify(
 | ||
|   {
 | ||
|     title: void 0, // String. Required
 | ||
|     message: void 0, // String. Required if remove is not defined
 | ||
|     icon: void 0, // String. Absolute path to Icon
 | ||
|     sound: false, // Bool | String (as defined by http://msdn.microsoft.com/en-us/library/windows/apps/hh761492.aspx)
 | ||
|     wait: false, // Bool. Wait for User Action against Notification or times out
 | ||
|     id: void 0, // Number. ID to use for closing notification.
 | ||
|     appID: void 0, // String. App.ID and app Name. Defaults to no value, causing SnoreToast text to be visible.
 | ||
|     remove: void 0, // Number. Refer to previously created notification to close.
 | ||
|     install: void 0 // String (path, application, app id).  Creates a shortcut <path> in the start menu which point to the executable <application>, appID used for the notifications.
 | ||
|   },
 | ||
|   function(error, response) {
 | ||
|     console.log(response);
 | ||
|   }
 | ||
| );
 | ||
| ```
 | ||
| 
 | ||
| ### Usage: `Growl`
 | ||
| 
 | ||
| ```javascript
 | ||
| const Growl = require('node-notifier').Growl;
 | ||
| 
 | ||
| var notifier = new Growl({
 | ||
|   name: 'Growl Name Used', // Defaults as 'Node'
 | ||
|   host: 'localhost',
 | ||
|   port: 23053
 | ||
| });
 | ||
| 
 | ||
| notifier.notify({
 | ||
|   title: 'Foo',
 | ||
|   message: 'Hello World',
 | ||
|   icon: fs.readFileSync(__dirname + '/coulson.jpg'),
 | ||
|   wait: false, // Wait for User Action against Notification
 | ||
| 
 | ||
|   // and other growl options like sticky etc.
 | ||
|   sticky: false,
 | ||
|   label: void 0,
 | ||
|   priority: void 0
 | ||
| });
 | ||
| ```
 | ||
| 
 | ||
| See more information about using [growly](https://github.com/theabraham/growly/).
 | ||
| 
 | ||
| ### Usage: `WindowsBalloon`
 | ||
| 
 | ||
| For earlier versions of Windows, taskbar balloons are used (unless
 | ||
| fallback is activated and Growl is running). The balloons notifier uses a great
 | ||
| project called [**`notifu`**](http://www.paralint.com/projects/notifu/).
 | ||
| 
 | ||
| ```javascript
 | ||
| const WindowsBalloon = require('node-notifier').WindowsBalloon;
 | ||
| 
 | ||
| var notifier = new WindowsBalloon({
 | ||
|   withFallback: false, // Try Windows Toast and Growl first?
 | ||
|   customPath: void 0 // Relative/Absolute path if you want to use your fork of notifu
 | ||
| });
 | ||
| 
 | ||
| notifier.notify(
 | ||
|   {
 | ||
|     title: void 0,
 | ||
|     message: void 0,
 | ||
|     sound: false, // true | false.
 | ||
|     time: 5000, // How long to show balloon in ms
 | ||
|     wait: false, // Wait for User Action against Notification
 | ||
|     type: 'info' // The notification type : info | warn | error
 | ||
|   },
 | ||
|   function(error, response) {
 | ||
|     console.log(response);
 | ||
|   }
 | ||
| );
 | ||
| ```
 | ||
| 
 | ||
| See full usage on the [project homepage: **`notifu`**](http://www.paralint.com/projects/notifu/).
 | ||
| 
 | ||
| ### Usage: `NotifySend`
 | ||
| 
 | ||
| **Note:** `notify-send` doesn't support the `wait` flag.
 | ||
| 
 | ||
| ```javascript
 | ||
| const NotifySend = require('node-notifier').NotifySend;
 | ||
| 
 | ||
| var notifier = new NotifySend();
 | ||
| 
 | ||
| notifier.notify({
 | ||
|   title: 'Foo',
 | ||
|   message: 'Hello World',
 | ||
|   icon: __dirname + '/coulson.jpg',
 | ||
| 
 | ||
|   // .. and other notify-send flags:
 | ||
|   urgency: void 0,
 | ||
|   time: void 0,
 | ||
|   category: void 0,
 | ||
|   hint: void 0
 | ||
| });
 | ||
| ```
 | ||
| 
 | ||
| See flags and options on the man page [`notify-send(1)`](http://manpages.ubuntu.com/manpages/gutsy/man1/notify-send.1.html)
 | ||
| 
 | ||
| ## Thanks to OSS
 | ||
| 
 | ||
| `node-notifier` is made possible through Open Source Software.
 | ||
| A very special thanks to all the modules `node-notifier` uses.
 | ||
| 
 | ||
| - [`terminal-notifier`](https://github.com/julienXX/terminal-notifier)
 | ||
| - [`Snoretoast`](https://github.com/KDE/snoretoast)
 | ||
| - [`notifu`](http://www.paralint.com/projects/notifu/)
 | ||
| - [`growly`](https://github.com/theabraham/growly/)
 | ||
| 
 | ||
| [![NPM downloads][npm-downloads]][npm-url]
 | ||
| 
 | ||
| ## Common Issues
 | ||
| 
 | ||
| ### Windows: `SnoreToast` text
 | ||
| 
 | ||
| See note on "Windows 10 Fall Creators Update" in Windows section.
 | ||
| _**Short answer:** update your `appId`._
 | ||
| 
 | ||
| ### Use inside tmux session
 | ||
| 
 | ||
| When using `node-notifier` within a tmux session, it can cause a hang in the system.
 | ||
| This can be solved by following the steps described in [this comment](https://github.com/julienXX/terminal-notifier/issues/115#issuecomment-104214742)
 | ||
| 
 | ||
| There’s even more info [here](https://github.com/mikaelbr/node-notifier/issues/61#issuecomment-163560801)
 | ||
| <https://github.com/mikaelbr/node-notifier/issues/61#issuecomment-163560801>.
 | ||
| 
 | ||
| ### macOS: Custom icon without Terminal icon
 | ||
| 
 | ||
| Even if you define an icon in the configuration object for `node-notifier`, you will
 | ||
| see a small Terminal icon in the notification (see the example at the top of this
 | ||
| document).
 | ||
| 
 | ||
| This is the way notifications on macOS work. They always show the icon of the
 | ||
| parent application initiating the notification. For `node-notifier`, `terminal-notifier`
 | ||
| is the initiator, and it has the Terminal icon defined as its icon.
 | ||
| 
 | ||
| To define your custom icon, you need to fork `terminal-notifier` and build your
 | ||
| custom version with your icon.
 | ||
| 
 | ||
| See [Issue #71 for more info](https://github.com/mikaelbr/node-notifier/issues/71)
 | ||
| <https://github.com/mikaelbr/node-notifier/issues/71>.
 | ||
| 
 | ||
| ### Within Electron Packaging
 | ||
| 
 | ||
| If packaging your Electron app as an `asar`, you will find `node-notifier` will fail to load.
 | ||
| 
 | ||
| Due to the way asar works, you cannot execute a binary from within an `asar`.
 | ||
| As a simple solution, when packaging the app into an asar please make sure you
 | ||
| `--unpack` the `vendor/` folder of `node-notifier`, so the module still has access to
 | ||
| the notification binaries.
 | ||
| 
 | ||
| You can do so with the following command:
 | ||
| 
 | ||
| ```bash
 | ||
| asar pack . app.asar --unpack "./node_modules/node-notifier/vendor/**"
 | ||
| ```
 | ||
| 
 | ||
| ### Using with pkg
 | ||
| 
 | ||
| For issues using with the pkg module. Check this issue out: https://github.com/mikaelbr/node-notifier/issues/220#issuecomment-425963752
 | ||
| 
 | ||
| ### Using Webpack
 | ||
| 
 | ||
| When using `node-notifier` inside of `webpack`, you must add the snippet below to your `webpack.config.js`.
 | ||
| 
 | ||
| This is necessary because `node-notifier` loads the notifiers from a binary, so it
 | ||
| needs a relative file path. When webpack compiles the modules, it supresses file
 | ||
| directories, causing `node-notifier` to error on certain platforms.
 | ||
| 
 | ||
| To fix this, you can configure webpack to keep the relative file directories.
 | ||
| Do so by append the following code to your `webpack.config.js`:
 | ||
| 
 | ||
| ```javascript
 | ||
| node: {
 | ||
|   __filename: true,
 | ||
|   __dirname: true
 | ||
| }
 | ||
| ```
 | ||
| 
 | ||
| ## License
 | ||
| 
 | ||
| [MIT License](http://en.wikipedia.org/wiki/MIT_License)
 | ||
| 
 | ||
| [npm-url]: https://npmjs.org/package/node-notifier
 | ||
| [npm-image]: http://img.shields.io/npm/v/node-notifier.svg?style=flat
 | ||
| [npm-downloads]: http://img.shields.io/npm/dm/node-notifier.svg?style=flat
 | ||
| [travis-url]: http://travis-ci.org/mikaelbr/node-notifier
 | ||
| [travis-image]: http://img.shields.io/travis/mikaelbr/node-notifier.svg?style=flat
 |