var util = require('util') var WebClient = require('slack-client').WebClient var Promise = require('bluebird') var logger = require('../../util/logger') var wire = require('../../wire') var wirerouter = require('../../wire/router') var wireutil = require('../../wire/util') var lifecycle = require('../../util/lifecycle') var srv = require('../../util/srv') var zmqutil = require('../../util/zmqutil') module.exports = function(options) { var log = logger.createLogger('notify-slack') var client = new WebClient(options.token) var buffer = [] var timer // Input var sub = zmqutil.socket('sub') Promise.map(options.endpoints.sub, function(endpoint) { return srv.resolve(endpoint).then(function(records) { return srv.attempt(records, function(record) { log.info('Receiving input from "%s"', record.url) sub.connect(record.url) return Promise.resolve(true) }) }) }) // Establish always-on channels ;[wireutil.global].forEach(function(channel) { log.info('Subscribing to permanent channel "%s"', channel) sub.subscribe(channel) }) function push() { buffer.splice(0).forEach(function(entry) { var format = entry.message.indexOf('\n') === -1 ? '`%s`' : '```%s```' var message = util.format(format, entry.message) client.chat.postMessage(options.channel, util.format( '>>> *%s/%s* %d [*%s*] %s' , logger.LevelLabel[entry.priority] , entry.tag , entry.pid , entry.identifier , message ) , { username: 'STF' , icon_url: 'https://openstf.io/favicon.png' } ) }) } sub.on('message', wirerouter() .on(wire.DeviceLogMessage, function(channel, message) { if (message.priority >= options.priority) { buffer.push(message) clearTimeout(timer) timer = setTimeout(push, 1000) } }) .handler()) log.info('Listening for %s (or higher) level log messages', logger.LevelLabel[options.priority]) lifecycle.observe(function() { try { sub.close() } catch (err) { // No-op } }) }