/** * A Node.js wrapper for terminal-notify (with fallback). */ var utils = require('../lib/utils'); var Growl = require('./growl'); var path = require('path'); var notifier = path.join( __dirname, '../vendor/mac.noindex/terminal-notifier.app/Contents/MacOS/terminal-notifier' ); var EventEmitter = require('events').EventEmitter; var util = require('util'); var errorMessageOsX = 'You need Mac OS X 10.8 or above to use NotificationCenter,' + ' or use Growl fallback with constructor option {withFallback: true}.'; module.exports = NotificationCenter; function NotificationCenter(options) { options = utils.clone(options || {}); if (!(this instanceof NotificationCenter)) { return new NotificationCenter(options); } this.options = options; EventEmitter.call(this); } util.inherits(NotificationCenter, EventEmitter); var activeId = null; function noop() {} function notifyRaw(options, callback) { var fallbackNotifier; var id = identificator(); options = utils.clone(options || {}); activeId = id; if (typeof options === 'string') { options = { title: 'node-notifier', message: options }; } callback = callback || noop; if (typeof callback !== 'function') { throw new TypeError( 'The second argument must be a function callback. You have passed ' + typeof fn ); } var actionJackedCallback = utils.actionJackerDecorator( this, options, callback, function(data) { if (activeId !== id) return false; if (data === 'activate') { return 'click'; } if (data === 'timeout') { return 'timeout'; } if (data === 'replied') { return 'replied'; } return false; } ); options = utils.mapToMac(options); if (!options.message && !options.group && !options.list && !options.remove) { callback(new Error('Message, group, remove or list property is required.')); return this; } var argsList = utils.constructArgumentList(options); if (utils.isMountainLion()) { utils.fileCommandJson( this.options.customPath || notifier, argsList, actionJackedCallback ); return this; } if (fallbackNotifier || !!this.options.withFallback) { fallbackNotifier = fallbackNotifier || new Growl(this.options); return fallbackNotifier.notify(options, callback); } callback(new Error(errorMessageOsX)); return this; } Object.defineProperty(NotificationCenter.prototype, 'notify', { get: function() { if (!this._notify) this._notify = notifyRaw.bind(this); return this._notify; } }); function identificator() { return { _ref: 'val' }; }