meshblu-http
Version:
Meshblu HTTP API
193 lines (146 loc) • 6.86 kB
text/coffeescript
_ = require 'lodash'
debug = require('debug')('meshblu-http')
stableStringify = require 'json-stable-stringify'
class MeshbluHttp
constructor: (options={}, ={}) ->
options = _.defaults(_.cloneDeep(options), port: 443, server: 'meshblu.octoblu.com')
{, , , , , } = options
= null if == 'websocket'
try
= parseInt
catch e
?= 'http'
= 'https' if == 443
= "#{@protocol}://#{@server}:#{@port}"
= .request ? require 'request'
= .NodeRSA ? require 'node-rsa'
getDefaultRequestOptions: =>
_.extend json: true,
getAuthRequestOptions: =>
return auth: if ?
return {} unless &&
auth:
user:
pass:
createSubscription: (options, callback) =>
{subscriberId, emitterId, type} = options
.post "#{@urlBase}/devices/#{subscriberId}/subscriptions/#{emitterId}/#{type}", (error, response, body) =>
return callback new Error(body.error) if response.statusCode != 201
callback()
deleteSubscription: (options, callback) =>
{subscriberId, emitterId, type} = options
.delete "#{@urlBase}/devices/#{subscriberId}/subscriptions/#{emitterId}/#{type}", (error, response, body) =>
return callback new Error(body.error) if response.statusCode != 204
callback()
device: (deviceUuid, callback=->) =>
options =
.get "#{@urlBase}/v2/devices/#{deviceUuid}", options, (error, response, body) ->
debug "device", error, body
return callback error if error?
return callback new Error(body.error.message) if body?.error?
return callback new Error(body.message || body) if response.statusCode != 200
callback null, body
devices: (query={}, callback=->) =>
options =
options.qs = query
.get "#{@urlBase}/devices", options, (error, response, body) ->
debug "devices", error, body
return callback error if error?
return callback new Error(body.error) if body?.error?
callback null, body
mydevices: (query={}, callback=->) =>
options =
options.qs = query
.get "#{@urlBase}/mydevices", options, (error, response, body) ->
debug "mydevices", error, body
return callback error if error?
return callback new Error(body.error) if body?.error?
callback null, body
generateAndStoreToken: (deviceUuid, callback=->) =>
options =
.post "#{@urlBase}/devices/#{deviceUuid}/tokens", options, (error, response, body) ->
debug "generateAndStoreToken", error, body
return callback error if error?
return callback new Error(body.error.message) if body?.error?
callback null, body
generateKeyPair: =>
key = new
key.generateKeyPair()
privateKey: key.exportKey('private'), publicKey: key.exportKey('public')
message: (message, callback=->) =>
options =
options.json = message
debug 'POST', "#{@urlBase}/messages", options
.post "#{@urlBase}/messages", options, (error, response, body) ->
debug "message", error, body
return callback error if error?
return callback new Error(body.error) if body?.error?
callback null, body
publicKey: (deviceUuid, callback=->) =>
options =
.get "#{@urlBase}/devices/#{deviceUuid}/publickey", options, (error, response, body) ->
debug "publicKey", error, body
return callback error if error?
return callback new Error(body.error.message) if body?.error?
return callback new Error(body.message || body) if response.statusCode != 200
callback null, body
register: (device, callback=->) =>
options =
options.json = device
.post "#{@urlBase}/devices", options, (error, response, body) ->
debug "register", error, body
return callback error if error?
return callback new Error(body.error.message) if body?.error?
callback null, body
resetToken: (deviceUuid, callback=->) =>
options =
url = "#{@urlBase}/devices/#{deviceUuid}/token"
.post url, options, (error, response, body) =>
return callback error if error?
return callback new Error body.error unless response.statusCode == 201
callback null, body
revokeToken: (deviceUuid, deviceToken, callback=->) =>
options =
.del "#{@urlBase}/devices/#{deviceUuid}/tokens/#{deviceToken}", options, (error, response, body) ->
debug "revokeToken", error, body
return callback error if error?
return callback new Error(body.error.message) if body?.error?
callback null
setPrivateKey: (privateKey) =>
= new privateKey
sign: (data) =>
.sign(stableStringify(data)).toString('base64');
unregister: (device, callback=->) =>
options =
.del "#{@urlBase}/devices/#{device.uuid}", options, (error, response, body) ->
debug "unregister", error, body
return callback error if error?
return callback new Error(body.error.message) if body?.error?
callback null
update: (uuid, params, callback=->) =>
options =
options.json = params
.patch "#{@urlBase}/v2/devices/#{uuid}", options, (error, response, body) ->
debug "update", error, body
return callback error if error?
return callback new Error(body.error) unless response.statusCode == 204
callback null, body
updateDangerously: (uuid, params, callback=->) =>
options =
options.json = params
.put "#{@urlBase}/v2/devices/#{uuid}", options, (error, response, body) ->
debug "update", error, body
return callback error if error?
return callback new Error(body.error) unless response.statusCode == 204
callback null, body
verify: (message, signature) =>
.verify stableStringify(message), signature, 'utf8', 'base64'
whoami: (callback=->) =>
options =
.get "#{@urlBase}/v2/whoami", options, (error, response, body) ->
debug "whoami", error, body
return callback error if error?
return callback new Error(body.error.message) if body?.error?
return callback new Error(body.message || body) if response.statusCode != 200
callback null, body
module.exports = MeshbluHttp