diff --git a/README.md b/README.md index d9f30ca..6499683 100644 --- a/README.md +++ b/README.md @@ -95,3 +95,69 @@ for ( var i = 0, l = users.length; i < l; i++ ) { }) } ``` + +### Sending a message with an image attachment + +```javascript + +var fs = require( 'fs' ) +var Push = require( 'pushover-notifications' ) + +var p = new Push( { + user: process.env['PUSHOVER_USER'], + token: process.env['PUSHOVER_TOKEN'], +}) + +var msg = { + message: 'omg node test', // required + title: "Well - this is fantastic - an attachment", + sound: 'magic', + device: 'devicename', + attachment: fs.createReadStream('path/to/image.jpg'), + priority: 1 +} + +p.send( msg, function( err, result ) { + if ( err ) { + throw err + } + + console.log( result ) +}) +``` + +### Sending a message with an image attachment from a Buffer + +```javascript + +var fs = require( 'fs' ) +var Push = require( 'pushover-notifications' ) + +var p = new Push( { + user: process.env['PUSHOVER_USER'], + token: process.env['PUSHOVER_TOKEN'], +}) + +// data is a Buffer object holding contents of image.jpg +fs.readFile('path/to/image.jpg', function (err, data) { + if (err) throw err; + + var msg = { + message: 'omg node test', // required + title: "Well - this is fantastic - an attachment from a buffer", + sound: 'magic', + device: 'devicename', + attachment: data + priority: 1 + } + + p.send( msg, function( err, result ) { + if ( err ) { + throw err + } + + console.log( result ) + }) +}) + +``` diff --git a/lib/pushover.js b/lib/pushover.js index 04c7964..c120a18 100644 --- a/lib/pushover.js +++ b/lib/pushover.js @@ -3,6 +3,7 @@ var http = require('http') var url = require('url') var qs = require('querystring') var pUrl = 'https://api.pushover.net/1/messages.json' +var FormData = require('form-data') function setDefaults (o) { var def = [ @@ -113,26 +114,27 @@ Pushover.prototype.updateSounds = function () { Pushover.prototype.send = function (obj, fn) { var self = this var o = url.parse(pUrl) + var form = new FormData() var proxy o.method = 'POST' obj = setDefaults(obj) - var reqString = { - token: self.token || obj.token, - user: self.user || obj.user - } + form.append('token', self.token || obj.token) + form.append('user', self.user || obj.user) + if ('attachment' in obj && obj.attachment instanceof Buffer) { + // Sending a file from a buffer + // https://stackoverflow.com/a/43914175 + form.append('attachment', obj.attachment, {filename: 'filename'}) + delete obj.attachment + } var p for (p in obj) { - reqString[ p ] = obj[p] + form.append(p, obj[p]) } - reqString = qs.stringify(reqString) - - o.headers = { - 'Content-Length': reqString.length - } + o.headers = form.getHeaders() var httpOpts = self.httpOptions || {} if (httpOpts) { @@ -150,18 +152,20 @@ Pushover.prototype.send = function (obj, fn) { o.protocol = proxy.protocol } - var request - if (httpOpts.proxy && httpOpts.proxy !== '') { - request = http.request - } else { - request = https.request - } + form.submit(o, function (err, res) { + if (err) { + if (fn) { + fn(err) + } + // In the tests the "end" event did not get emitted if "error" was emitted, + // but to be sure that the callback is not get called twice, null the callback function + fn = null + } - var req = request(o, function (res) { if (self.debug) { console.log(res.statusCode) } - var err + var data = '' res.on('end', function () { self.errors(data, res) @@ -175,20 +179,6 @@ Pushover.prototype.send = function (obj, fn) { }) }) - req.on('error', function (err) { - if (fn) { - fn(err) - } - // In the tests the "end" event did not get emitted if "error" was emitted, - // but to be sure that the callback is not get called twice, null the callback function - fn = null - }) - - if (self.debug) { - console.log(reqString.replace(self.token, 'XXXXX').replace(self.user, 'XXXXX')) - } - req.write(reqString) - req.end() } exports = module.exports = Pushover diff --git a/package.json b/package.json index 42d2c93..1492f19 100644 --- a/package.json +++ b/package.json @@ -8,7 +8,9 @@ "type": "git", "url": "https://github.com/qbit/node-pushover.git" }, - "dependencies": {}, + "dependencies": { + "form-data": "^2.3.2" + }, "devDependencies": {}, "optionalDependencies": {}, "engines": { diff --git a/test/test_attachment.js b/test/test_attachment.js new file mode 100644 index 0000000..5b00d43 --- /dev/null +++ b/test/test_attachment.js @@ -0,0 +1,41 @@ +var Push = require('../lib/pushover.js') +var fs = require('fs') + +var p = new Push({ + user: process.env['PUSHOVER_USER'], + token: process.env['PUSHOVER_TOKEN'], + update_sounds: false, + debug: true +}) + +var msg = { + message: 'test from ' + process.argv[1], + sound: 'magic', + title: 'Testing attachment', + attachment: fs.createReadStream('img/pushover-header.png') +} + +// console.log( p ); + +p.send(msg, function (err, result, res) { + console.log('error', err) + console.log('result', result) + console.log('res.headers', res.headers) + // process.exit(0); +}) + +fs.readFile('img/pushover-header.png', function (err, data) { + if (err) throw err; + + msg = { + message: 'test from ' + process.argv[1], + title: 'Testing attachment from buffer', + attachment: data + } + + p.send(msg, function (err, result, res) { + console.log('error', err) + console.log('result', result) + console.log('res.headers', res.headers) + }) +});