Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
81 changes: 59 additions & 22 deletions demo.js
Original file line number Diff line number Diff line change
@@ -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)
122 changes: 113 additions & 9 deletions index.js
Original file line number Diff line number Diff line change
@@ -1,23 +1,30 @@
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 = {
'accept': 'application/json',
'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,
Expand Down Expand Up @@ -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: {
Expand All @@ -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);
};

Expand All @@ -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);
};

Expand All @@ -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)
})
})
}