UNPKG

aladdin-connect

Version:

Client module for opening + closing garage doors via the Genie Aladdin Connect

100 lines (91 loc) 2.96 kB
const envcheck = require('./envcheck') const series = require('run-series') const tiny = require('tiny-json-http') /** * Session * - Once validated, Aladdin passes back a session token * - To keep this module stateless, we'll fetch the token upon each request */ module.exports = function AladdinConnectSessionRequest(params, callback) { envcheck(function go(err) { if (err) callback(err) else { if (!callback && typeof params === 'function') { callback = params params = undefined } params = params || {} let {deviceNumber=0} = params const geniePortalAPI = 'https://genie.exosite.com/api/portals/v1' const env = process.env const user = env.ALADDIN_USER const password = env.ALADDIN_PASSWORD // Set up standard headers let auth = Buffer.from(`${user}:${password}`).toString('base64') let headers = { Authorization: `Basic ${auth}`, AppVersion: '3.0.0', BundleName: 'com.geniecompany.AladdinConnect', BuildVersion: '131', 'Content-Type': 'application/json', 'User-Agent': 'Aladdin Connect iOS v3.0.0' } // Assigned below let userID let portalID let body series([ // Although not J*T, per exosite docs login tokens do have a TTL function getToken(callback) { let url = `${geniePortalAPI}/users/_this/token` tiny.get({url, headers}, function _done(err, response) { if (err) callback(err) else { headers.Authorization = `Token: ${response.body}` callback() } }) }, function getUserID(callback) { let url = `${geniePortalAPI}/users/_this` tiny.get({url, headers}, function _done(err, response) { if (err) callback(err) else { userID = response.body.id callback() } }) }, function getPortalID(callback) { let url = `${geniePortalAPI}/users/${userID}/portals` tiny.get({url, headers}, function _done(err, response) { if (err) callback(err) else { portalID = response.body[0].PortalID callback() } }) }, function getPortalInfo(callback) { let url = `${geniePortalAPI}/portals/${portalID}` tiny.get({url, headers}, function _done(err, response) { if (err) callback(err) else { let portal = response.body body = { auth: { cik: portal.info.key, client_id: portal.devices[deviceNumber] } } callback() } }) }, ], function _done(err) { if (err) callback(err) else callback(null, {headers, body}) }) } }) }