diff --git a/demo.js b/demo.js index 7e654d6..6290a0b 100644 --- a/demo.js +++ b/demo.js @@ -1,36 +1,73 @@ // // To try this demo, just change the email and password below -// to match your sensorpush credentials -// +// to match your sensorpush credentials. +// Or add your sensorpush email/password to environment variables and use code as is. const sensorpush = require('sensorpush'); +const limit = 10 let credentials = { - email: "you@foo.com", - password: "BO000yAH!" + email: process.env.SENSOR_PUSH_EMAIL, + password: process.env.SENSOR_PUSH_PASSWORD }; -// step 1: get an authorization code -sensorpush.api.oauth.authorize(credentials, function (err1, res1) { +function init (isPromise) { + if (isPromise) { + let accessToken + // step 1: get an authorization code + return sensorpush.promise.oauth.authorize(credentials) + .then(resp => { + // step 2: get an access token + return sensorpush.promise.oauth.accessToken({ authorization: resp.authorization }) + }) + .then(resp => { + accessToken = resp.accesstoken; + // steps 3-5: get data, using the access token + return sensorpush.promise.devices.sensors({ accessToken }) + }) + .then(resp => { + console.log("Sensor response:", JSON.stringify(resp)); + return sensorpush.promise.devices.gateways({ accessToken }) + }) + .then(resp => { + console.log("Gateways response:", JSON.stringify(resp)); + // get any readings from the last 10 mins + let startTime = new Date(Date.now() - 60 * 1000 * 10); + return sensorpush.promise.samples({ limit, startTime, accessToken }); + }) + .then(resp => { + console.log("Samples response:", JSON.stringify(resp)); + }) + .catch(err => { + console.error(err) + }) + } else { + // step 1: get an authorization code + sensorpush.api.oauth.authorize(credentials, function (err1, res1) { - // step 2: get an access token - sensorpush.api.oauth.accesstoken({ authorization: res1.authorization }, function (err2, res2) { + // step 2: get an access token + sensorpush.api.oauth.accessToken({ authorization: res1.authorization }, function (err2, res2) { - let accesstoken = res2.accesstoken; + let accessToken = res2.accesstoken; - // steps 3-5: get data, using the access token - sensorpush.api.devices.sensors({ accesstoken: accesstoken }, function (err3, res3) { - console.log("Sensor response:", res3); - }); + // steps 3-5: get data, using the access token + sensorpush.api.devices.sensors({ accessToken: accessToken }, function (err3, res3) { + console.log("Sensor response:", res3); + }); - sensorpush.api.devices.gateways({ accesstoken: accesstoken }, function (err4, res4) { - console.log("Gateways response:", res4); - }); + sensorpush.api.devices.gateways({ accessToken: accessToken }, function (err4, res4) { + console.log("Gateways response:", res4); + }); - // get any readings from the last 10 mins - let startTime = new Date(Date.now() - 60 * 1000 * 10); - sensorpush.api.samples({ limit: 10, startTime: startTime, accesstoken: accesstoken }, function (err5, res5) { - console.log("Samples response:", res5); + // get any readings from the last 10 mins + let startTime = new Date(Date.now() - 60 * 1000 * 10); + sensorpush.api.samples({ limit: 10, startTime: startTime, accessToken: accessToken }, function (err5, res5) { + console.log("Samples response:", res5); + }); + }); }); - }); -}); + } +} + +// pass "false" to init function if you'd prefer to use callbacks instead of promises +init(true) diff --git a/index.js b/index.js index 276a431..e210ba1 100644 --- a/index.js +++ b/index.js @@ -1,13 +1,20 @@ const https = require('https'); exports.api = { oauth: {}, devices: {} }; +exports.promise = { oauth: {}, devices: {} }; + +const START_TIME_REGEX = /\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\.\d{3}Z/ + +function validateStartTime (startTime) { + return startTime && START_TIME_REGEX.test(startTime) +} // --------------------------------------------------------------------- function postToSensorPush(opts, cb) { let params = opts.params || {}; let path = opts.path; - let accesstoken = opts.accesstoken; // possibly undefined + let accessToken = opts.accessToken; // possibly undefined let postData = JSON.stringify(params) let headers = { @@ -15,9 +22,9 @@ function postToSensorPush(opts, cb) { 'Content-Type': 'application/json', 'Content-Length': postData.length }; - if (accesstoken) { - headers.Authorization = accesstoken; - }; + if (accessToken) { + headers.Authorization = accessToken; + } let options = { hostname: "api.sensorpush.com", port: 443, @@ -65,7 +72,7 @@ exports.api.oauth.authorize = function (opts, cb) { // --------------------------------------------------------------------- -exports.api.oauth.accesstoken = function (opts, cb) { +exports.api.oauth.accessToken = function (opts, cb) { postToSensorPush({ path: "/api/v1/oauth/accesstoken", params: { @@ -79,7 +86,7 @@ exports.api.oauth.accesstoken = function (opts, cb) { exports.api.devices.gateways = function (opts, cb) { postToSensorPush({ path: "/api/v1/devices/gateways", - accesstoken: opts.accesstoken + accessToken: opts.accessToken }, cb); }; @@ -88,7 +95,7 @@ exports.api.devices.gateways = function (opts, cb) { exports.api.devices.sensors = function (opts, cb) { postToSensorPush({ path: "/api/v1/devices/sensors", - accesstoken: opts.accesstoken + accessToken: opts.accessToken }, cb); }; @@ -99,15 +106,112 @@ exports.api.samples = function (opts, cb) { if (startTime && startTime instanceof Date) { startTime = startTime.toISOString() } - if (startTime && !(/\d{4}\-\d{2}\-\d{2}T\d{2}\:\d{2}\:\d{2}\.\d{3}Z/).test(startTime)) { + if (!validateStartTime(startTime)) { throw new Error('Bad `startTime` value. Please provide a Date object or string formatted with Date::toISOString()'); } postToSensorPush({ path: "/api/v1/samples", - accesstoken: opts.accesstoken, + accessToken: opts.accessToken, params: { limit: opts.limit, startTime: startTime } }, cb); }; + +// Promise based functions +// --------------------------------------------------------------------- + +exports.promise.oauth.authorize = opts => { + return new Promise((resolve, reject) => { + return postToSensorPush({ + path: "/api/v1/oauth/authorize", + params: { + email: opts.email, + password: opts.password + } + }, function callback (err, data) { + if (err) { + reject(err) + } + resolve(data) + }) + }) +} + +// --------------------------------------------------------------------- + +exports.promise.oauth.accessToken = function (opts) { + return new Promise((resolve, reject) => { + return postToSensorPush({ + path: "/api/v1/oauth/accesstoken", + params: { + authorization: opts.authorization + } + }, function callback (err, data) { + if (err) { + reject(err) + } + resolve(data) + }) + }) +} + +// --------------------------------------------------------------------- + +exports.promise.devices.gateways = function (opts) { + return new Promise((resolve, reject) => { + return postToSensorPush({ + path: "/api/v1/devices/gateways", + accessToken: opts.accessToken + }, function callback (err, data) { + if (err) { + reject(err) + } + resolve(data) + }) + }) +} + +// --------------------------------------------------------------------- + +exports.promise.devices.sensors = function (opts) { + return new Promise((resolve, reject) => { + return postToSensorPush({ + path: "/api/v1/devices/sensors", + accessToken: opts.accessToken + }, function callback (err, data) { + if (err) { + reject(err) + } + resolve(data) + }) + }) +} + +// --------------------------------------------------------------------- + +exports.promise.samples = function (opts) { + let startTime = opts.startTime + if (startTime && startTime instanceof Date) { + startTime = startTime.toISOString() + } + if (!validateStartTime(startTime)) { + throw new Error('Bad `startTime` value. Please provide a Date object or string formatted with Date::toISOString()'); + } + return new Promise((resolve, reject) => { + return postToSensorPush({ + path: "/api/v1/samples", + accessToken: opts.accessToken, + params: { + limit: opts.limit, + startTime: startTime + } + }, function callback (err, data) { + if (err) { + reject(err) + } + resolve(data) + }) + }) +} \ No newline at end of file