diff --git a/.gitignore b/.gitignore index 1bd7226..2ca413a 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ node_modules *.swp +*.sh diff --git a/README.md b/README.md index 0cea7e1..4d1bde7 100644 --- a/README.md +++ b/README.md @@ -8,18 +8,19 @@ $ npm install libbeacon ## Example ```js -var beacon = new Libbeacon(); -beacon.login('username', 'password', function(err, success) { - beacon.get('Jobs/1', {}, function(error, data) { - console.log(data); - } +const libbeacon = require('libbeacon')(client_id, client_secret, 'preview'); +libbeacon.login('username', 'password').then((api) => { + api.get('Messages/') +}, (error) => { + // fail }); +*/ ``` ## Tests ```bash $ npm install -$ BEACON_USERNAME='user' BEACON_PASSWORD='pass' npm test +$ IDENTITY_CLIENT_ID='' IDENTITY_CLIENT_SECRET='' BEACON_USERNAME='user' BEACON_PASSWORD='pass' npm test ``` ## License diff --git a/lib/auth.js b/lib/auth.js new file mode 100644 index 0000000..a5d251c --- /dev/null +++ b/lib/auth.js @@ -0,0 +1,43 @@ +const oauth2 = require('simple-oauth2'); +const c = require('./constants'); +const debug = require('debug')('libbeacon:auth'); + +module.exports = function( + client_id, client_secret, environment='prod', +) { + const credentials = { + client: { + id: client_id, + secret: client_secret, + }, + auth: { + tokenHost: c.environments[environment].identity_url, + tokenPath: '/core/connect/token', + authorizePath: '/core/connect/authorize', + }, + }; + + const api = oauth2.create(credentials); + + return { + getToken: (username, password) => { + return new Promise((resolve, reject) => { + const tokenConfig = { + username: username, + password: password, + scope: c.environments[environment].oauth_scope, + }; + + api.ownerPassword.getToken(tokenConfig) + .then((result) => { + debug('Successful auth: ', result); + resolve(api.accessToken.create(result)); + }) + .catch((error) => { + debug('Auth fail: ', error); + reject(Error('Access token error: ' + error.message)); + }); + }); + }, + }; +}; diff --git a/lib/client.js b/lib/client.js new file mode 100644 index 0000000..566eb10 --- /dev/null +++ b/lib/client.js @@ -0,0 +1,112 @@ +const c = require('./constants'); +const Request = require('request'); +const _ = require('underscore'); +const debug = require('debug')('libbeacon:client'); + + +class Client { + constructor(token, environment) { + debug('Initialize Client with token: ', token); + this._token = token; + this.environment = environment; + const userAgent = "libbeacon/" + c.version + " (github.com/SESMembers/libbeacon)"; + this._request = Request.defaults({ + rejectUnauthorized: false, + timeout: 30000, + headers: { + "User-Agent": userAgent, + "Authorization": this.authHeader, + }, + }); + } + + get authHeader() { + return 'Bearer ' +this._token.token.access_token; + } + + get path() { + return c.environments[this.environment].api_url + 'Api/v1/' + } + + get(path, opts) { + return new Promise((resolve, reject) => { + debug('Get request for ' + path); + var options = _.defaults(_.clone(opts) || {}, { + headers: {}, // make sure headers is an empty obj if not passed + }); + options.url = this.path + path; + + debug('Making request with args: ', options); + var req = this._request(options, function(error, response, body) { + if(error) { + debug('Error in HTTP request: ' + response); + reject(error); + } + if(response.statusCode === 403 || response.statusCode === 401) { + reject(new Error("unauthorized")); + } + if(response.statusCode != 200) { + debug('Non-200 HTTP status code: ' + response.statusCode); + reject(new Error('Non-200 HTTP status code: ' + response.statusCode)); + } + try { + var data = JSON.parse(body); + } catch(e) { + debug(options.url); + debug('Could not parse response: ' + body); + resolve(e) + } + resolve(null, data) + }); + }); + } + + getPagedResults(path, opts) { + return new Promise((resolve, reject) => { + var dataresult = [] + this.getPagedResultsPage(path, opts, 1, function(err,finished,data) { + dataresult = dataresult.concat(data); + err && reject(err) + finished && data && resolve(dataresult) + }); + }); + } + + getPagedResultsPage(path, opts, page, cb) { + // cb(error, finished, data) + var self = this; + var options = _.defaults(_.clone(opts) || {}, { + qs: {}, // make sure qs is an empty obj if not passed + }); + var totalItemsKey = 'TotalItems'; + if(options.totalItemsKey) { + totalItemsKey = options.totalItemsKey; + delete options.totalItemsKey; + } + options.qs['PageIndex'] = page; + this.get(path, options, function(error, data) { + if(error) { + cb && cb(error); + return; + } + var bad = false; + bad = 'CurrentPage' in data ? bad : true; + bad = 'PageSize' in data ? bad : true; + bad = totalItemsKey in data ? bad : true; + bad = 'Results' in data ? bad : true; + if(bad) { + cb && cb('Received data that does not contain page information'); + return; + } + if(data[totalItemsKey] > data['CurrentPage'] * data['PageSize']) { + cb && cb(null, false, data['Results']); + self.getPagedResultsPage(path, opts, page+1, cb); + } + else { + cb && cb(null, true, data['Results']); + } + }); + } +} + +module.exports = Client; diff --git a/lib/constants.js b/lib/constants.js new file mode 100644 index 0000000..8bccdb4 --- /dev/null +++ b/lib/constants.js @@ -0,0 +1,19 @@ +const package = require('../package.json'); + +module.exports = { + version: package.version, + environments: { + prod: { + api_url: 'https://apibeacon.ses.nsw.gov.au/', + beacon_url: 'https://beacon.ses.nsw.gov.au/', + identity_url: 'https://identity.ses.nsw.gov.au/', + oauth_scope: 'beaconApi profile', + }, + preview: { + api_url: 'https://apipreviewbeacon.ses.nsw.gov.au/', + beacon_url: 'https://previewbeacon.ses.nsw.gov.au/', + identity_url: 'https://identitypreview.ses.nsw.gov.au/', + oauth_scope: 'beaconApi profile', + }, + } +} diff --git a/lib/main.js b/lib/main.js index eaf1642..b32fbf7 100644 --- a/lib/main.js +++ b/lib/main.js @@ -1,220 +1,23 @@ -var Request = require('request'); -var htmlparser = require('htmlparser2'); -var _ = require('underscore'); - -var Libbeacon = function(opts) { - this.baseUrl = "https://beacon.ses.nsw.gov.au/"; - this.sessionCookieName = "PhaseThreeAuthCookie"; - this._userAgent = "libbeacon/0.1 (github.com/sdunster/libbeacon)"; - - if(opts) { - if(opts.development) { - this.baseUrl = "https://trainbeacon.ses.nsw.gov.au/"; - } - if(opts.userAgent) { - this._userAgent = opts.userAgent; - } - } - - this._request = Request.defaults({ - rejectUnauthorized: false, - timeout: 30000, - headers: { - 'User-Agent': this._userAgent - }, - }); - -} - -Libbeacon.prototype._getLoginTokens = function(cb) { - var self = this; - var inLoginForm = false; - var jar = this._request.jar(); - if(!_.isFunction(cb)) - throw new Error('Callback not specified'); - - var parser = new htmlparser.Parser({ - onopentag: function(name, attribs) { - if(name == "form" && attribs.id == "loginForm") { - inLoginForm = true; - } - if(name == "input" && attribs.name == "__RequestVerificationToken" && inLoginForm) { - var token = attribs.value; - var cookie; - jar.getCookies(self.baseUrl).forEach(function(c) { - if(c.key == "__RequestVerificationToken") - cookie = c.value; +const Auth = require('./auth'); +const Client = require('./client'); +const Request = require('request'); +const _ = require('underscore'); +const debug = require('debug')('libbeacon:main'); + + +module.exports = function(client_id, client_secret, environment='prod') { + const auth = Auth(client_id, client_secret, environment); + + return { + login: (username, password) => { + return new Promise((resolve, reject) => { + auth.getToken(username, password).then((token) => { + resolve(new Client(token, environment)); + }, (error) => { + reject(error); }); - if(cookie) { - cb && cb(null, token, cookie); - } - else { - cb && cb(new Error('No CSRF cookie returned')); - } - } - }, - onclosetag: function(name) { - inLoginForm = false; - } - }); - - var req = this._request({ - url: this.baseUrl + "Account/Login", - jar: jar - }); - - req.on('data', function(chunk) { - parser.write(chunk); - }); - req.on('end', function(chunk) { - parser.end(); - }); - req.on('error', function(error) { - cb && cb(error); - }); -} - -Libbeacon.prototype._performLogin = function(username, password, token, cookie, cb) { - var self = this; - var jar = this._request.jar(); - if(!_.isFunction(cb)) - throw new Error('Callback not specified'); - var req = this._request({ - url: this.baseUrl + "Account/Login", - headers: { - 'Cookie': '__RequestVerificationToken=' + cookie, - }, - form: { - "UserName": username, - "Password": password, - "__RequestVerificationToken": token - }, - method: 'POST', - jar: jar, - }, function(error, response, body) { - if(error) { - cb && cb(new Error("Failed to authenticate: " + error)); - return; - } - if(body.indexOf("Incorrect username and/or password") > -1 || - body.indexOf("Your account was locked") > -1) { - cb && cb(null, null); // auth failed so no error or cookie - return; - } - var cookie; - jar.getCookies(self.baseUrl).forEach(function(c) { - if(c.key == self.sessionCookieName) - cookie = c.value; - }); - if(cookie) { - cb && cb(null, cookie); - } - else { - console.log(body); - cb && cb(new Error("No session cookie returned")); - } - }); -} - -Libbeacon.prototype.login = function(username, password, cb) { - var self = this; - this.cookie = null; - this.username = username; - if(!_.isFunction(cb)) - throw new Error('Callback not specified'); - - this._getLoginTokens(function(error, token, cookie) { - if(error) { - cb && cb(error) - return; - } - - self._performLogin(username, password, token, cookie, function(error, cookie) { - if(error) { - cb && cb(error); - return; - } - - if(!cookie) { - cb && cb(null, false); - return; - } - - self.cookie = cookie; - cb && cb(null, true); - }); - }); -} - -Libbeacon.prototype.get = function(path, opts, cb) { - if(!_.isFunction(cb)) - throw new Error('Callback not specified'); - var options = _.defaults(_.clone(opts) || {}, { - headers: {}, // make sure headers is an empty obj if not passed - }); - options.url = this.baseUrl + 'Api/v1/' + path; - options.headers['Cookie'] = this.sessionCookieName + '=' + this.cookie; - options.headers['User-Agent'] = this._userAgent; - var req = this._request(options, function(error, response, body) { - if(error) { - cb && cb(error); - return; + }); } - if(response.statusCode === 403) { - cb && cb(new Error("unauthorized")); - return - } - try { - var data = JSON.parse(body); - } catch(e) { - cb && cb(e); - return; - } - cb && cb(null, data); - }); -} - -Libbeacon.prototype.getPagedResults = function(path, opts, cb) { - if(!_.isFunction(cb)) - throw new Error('Callback not specified'); - this.getPagedResultsPage(path, opts, 1, cb); -} - -Libbeacon.prototype.getPagedResultsPage = function(path, opts, page, cb) { - // cb(error, finished, data) - var self = this; - var options = _.defaults(_.clone(opts) || {}, { - qs: {}, // make sure qs is an empty obj if not passed - }); - var totalItemsKey = 'TotalItems'; - if(options.totalItemsKey) { - totalItemsKey = options.totalItemsKey; - delete options.totalItemsKey; - } - options.qs['PageIndex'] = page; - this.get(path, options, function(error, data) { - if(error) { - cb && cb(error); - return; - } - var bad = false; - bad = 'CurrentPage' in data ? bad : true; - bad = 'PageSize' in data ? bad : true; - bad = totalItemsKey in data ? bad : true; - bad = 'Results' in data ? bad : true; - if(bad) { - cb && cb('Received data that does not contain page information'); - return; - } - if(data[totalItemsKey] > data['CurrentPage'] * data['PageSize']) { - cb && cb(null, false, data['Results']); - self.getPagedResultsPage(path, opts, page+1, cb); - } - else { - cb && cb(null, true, data['Results']); - } - }); -} - -module.exports = Libbeacon; + }; +}; diff --git a/lib/tim.js b/lib/tim.js new file mode 100644 index 0000000..5f44d20 --- /dev/null +++ b/lib/tim.js @@ -0,0 +1,12 @@ +var libbeacon = require("../lib/main.js")(process.env.IDENTITY_CLIENT_ID, process.env.IDENTITY_CLIENT_SECRET, 'preview'); + + +libbeacon.login(process.env.BEACON_USERNAME, process.env.BEACON_PASSWORD).then((api) => { + console.log(typeof api ) + console.log(api) + api.get('Messages/').then(err,data) => { + console.log(data) + } +}, (error) => { + // fail +}); diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..bb7ba63 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,838 @@ +{ + "name": "libbeacon", + "version": "0.1.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "ajv": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.3.0.tgz", + "integrity": "sha1-RBT/dKUIecII7l/cgm4ywwNUnto=", + "requires": { + "co": "4.6.0", + "fast-deep-equal": "1.0.0", + "fast-json-stable-stringify": "2.0.0", + "json-schema-traverse": "0.3.1" + } + }, + "asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=" + }, + "asn1": { + "version": "0.1.11", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.1.11.tgz", + "integrity": "sha1-VZvhg3bQik7E2+gId9J4GGObLfc=", + "optional": true + }, + "assert-plus": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.1.5.tgz", + "integrity": "sha1-7nQAlBMALYTOxyGcasgRgS5yMWA=", + "optional": true + }, + "async": { + "version": "0.9.2", + "resolved": "https://registry.npmjs.org/async/-/async-0.9.2.tgz", + "integrity": "sha1-rqdNXmHB+JlhO/ZL2mbUx48v0X0=", + "optional": true + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" + }, + "aws-sign2": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.5.0.tgz", + "integrity": "sha1-xXED96F/wDfwLXwuZLYC6iI/fWM=", + "optional": true + }, + "aws4": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.6.0.tgz", + "integrity": "sha1-g+9cqGCysy5KDe7e6MdxudtXRx4=" + }, + "bcrypt-pbkdf": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz", + "integrity": "sha1-Y7xdy2EzG5K8Bf1SiVPDNGKgb40=", + "optional": true, + "requires": { + "tweetnacl": "0.14.5" + } + }, + "bluebird": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.1.tgz", + "integrity": "sha512-MKiLiV+I1AA596t9w1sQJ8jkiSr5+ZKi0WKrYGUn6d1Fx+Ij4tIj+m2WMQSGczs5jZVxV339chE8iwk6F64wjA==" + }, + "boom": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/boom/-/boom-0.4.2.tgz", + "integrity": "sha1-emNune1O/O+xnO9JR6PGffrukRs=", + "requires": { + "hoek": "0.9.1" + } + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" + }, + "co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=" + }, + "combined-stream": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-0.0.7.tgz", + "integrity": "sha1-ATfmV7qlp1QcV6w3rF/AfXO03B8=", + "optional": true, + "requires": { + "delayed-stream": "0.0.5" + } + }, + "commander": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.3.0.tgz", + "integrity": "sha1-/UMOiJgy7DU7ms0d4hfBHLPu+HM=", + "dev": true + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" + }, + "cryptiles": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-0.2.2.tgz", + "integrity": "sha1-7ZH/HxetE9N0gohZT4pIoNJvMlw=", + "optional": true, + "requires": { + "boom": "0.4.2" + } + }, + "ctype": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/ctype/-/ctype-0.5.3.tgz", + "integrity": "sha1-gsGMJGH3QRTvFsE1IkrQuRRMoS8=", + "optional": true + }, + "dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "requires": { + "assert-plus": "1.0.0" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" + } + } + }, + "date-fns": { + "version": "1.29.0", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-1.29.0.tgz", + "integrity": "sha512-lbTXWZ6M20cWH8N9S6afb0SBm6tMk+uUg6z3MqHPKE9atmsY3kJkTm8vKe93izJ2B2+q5MV990sM2CHgtAZaOw==" + }, + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "requires": { + "ms": "2.0.0" + } + }, + "delayed-stream": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-0.0.5.tgz", + "integrity": "sha1-1LH0OpPoKW3+AmlPRoC8N6MTxz8=", + "optional": true + }, + "diff": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-1.4.0.tgz", + "integrity": "sha1-fyjS657nsVqX79ic5j3P2qPMur8=", + "dev": true + }, + "ecc-jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz", + "integrity": "sha1-D8c6ntXw1Tw4GTOYUj735UN3dQU=", + "optional": true, + "requires": { + "jsbn": "0.1.1" + } + }, + "escape-string-regexp": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.2.tgz", + "integrity": "sha1-Tbwv5nTnGUnK8/smlc5/LcHZqNE=", + "dev": true + }, + "extend": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz", + "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ=" + }, + "extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=" + }, + "fast-deep-equal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.0.0.tgz", + "integrity": "sha1-liVqO8l1WV6zbYLpkp0GDYk0Of8=" + }, + "fast-json-stable-stringify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", + "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=" + }, + "forever-agent": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.5.2.tgz", + "integrity": "sha1-bQ4JxJIflKJ/Y9O0nF/v8epMUTA=" + }, + "form-data": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-0.1.4.tgz", + "integrity": "sha1-kavXiKupcCsaq/qLwBAxoqyeOxI=", + "optional": true, + "requires": { + "async": "0.9.2", + "combined-stream": "0.0.7", + "mime": "1.2.11" + } + }, + "getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "requires": { + "assert-plus": "1.0.0" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" + } + } + }, + "glob": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-3.2.3.tgz", + "integrity": "sha1-4xPusknHr/qlxHUoaw4RW1mDlGc=", + "dev": true, + "requires": { + "graceful-fs": "2.0.3", + "inherits": "2.0.3", + "minimatch": "0.2.14" + } + }, + "graceful-fs": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-2.0.3.tgz", + "integrity": "sha1-fNLNsiiko/Nule+mzBQt59GhNtA=", + "dev": true + }, + "growl": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/growl/-/growl-1.8.1.tgz", + "integrity": "sha1-Sy3sjZB+k9szZiTc7AGDUC+MlCg=", + "dev": true + }, + "har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=" + }, + "har-validator": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.0.3.tgz", + "integrity": "sha1-ukAsJmGU8VlW7xXg/PJCmT9qff0=", + "requires": { + "ajv": "5.3.0", + "har-schema": "2.0.0" + } + }, + "hawk": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/hawk/-/hawk-1.1.1.tgz", + "integrity": "sha1-h81JH5tG5OKurKM1QWdmiF0tHtk=", + "optional": true, + "requires": { + "boom": "0.4.2", + "cryptiles": "0.2.2", + "hoek": "0.9.1", + "sntp": "0.2.4" + } + }, + "hoek": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/hoek/-/hoek-0.9.1.tgz", + "integrity": "sha1-PTIkYrrfB3Fup+uFuviAec3c5QU=" + }, + "http-signature": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-0.10.1.tgz", + "integrity": "sha1-T72sEyVZqoMjEh5UB3nAoBKyfmY=", + "optional": true, + "requires": { + "asn1": "0.1.11", + "assert-plus": "0.1.5", + "ctype": "0.5.3" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" + }, + "isemail": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/isemail/-/isemail-2.2.1.tgz", + "integrity": "sha1-A1PT2aYpUQgMJiwqoKQrjqjp4qY=" + }, + "isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" + }, + "items": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/items/-/items-2.1.1.tgz", + "integrity": "sha1-i9FtnIOxlSneWuoyGsqtp4NkoZg=" + }, + "jade": { + "version": "0.26.3", + "resolved": "https://registry.npmjs.org/jade/-/jade-0.26.3.tgz", + "integrity": "sha1-jxDXl32NefL2/4YqgbBRPMslaGw=", + "dev": true, + "requires": { + "commander": "0.6.1", + "mkdirp": "0.3.0" + }, + "dependencies": { + "commander": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-0.6.1.tgz", + "integrity": "sha1-+mihT2qUXVTbvlDYzbMyDp47GgY=", + "dev": true + }, + "mkdirp": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.3.0.tgz", + "integrity": "sha1-G79asbqCevI1dRQ0kEJkVfSB/h4=", + "dev": true + } + } + }, + "joi": { + "version": "10.6.0", + "resolved": "https://registry.npmjs.org/joi/-/joi-10.6.0.tgz", + "integrity": "sha512-hBF3LcqyAid+9X/pwg+eXjD2QBZI5eXnBFJYaAkH4SK3mp9QSRiiQnDYlmlz5pccMvnLcJRS4whhDOTCkmsAdQ==", + "requires": { + "hoek": "4.2.0", + "isemail": "2.2.1", + "items": "2.1.1", + "topo": "2.0.2" + }, + "dependencies": { + "hoek": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/hoek/-/hoek-4.2.0.tgz", + "integrity": "sha512-v0XCLxICi9nPfYrS9RL8HbYnXi9obYAeLbSP00BmnZwCK9+Ih9WOjoZ8YoHCoav2csqn4FOz4Orldsy2dmDwmQ==" + } + } + }, + "jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", + "optional": true + }, + "json-schema": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=" + }, + "json-schema-traverse": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", + "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=" + }, + "json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" + }, + "jsprim": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", + "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.2.3", + "verror": "1.10.0" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" + } + } + }, + "lru-cache": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.7.3.tgz", + "integrity": "sha1-bUUk6LlV+V1PW1iFHOId1y+06VI=", + "dev": true + }, + "mime": { + "version": "1.2.11", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.2.11.tgz", + "integrity": "sha1-WCA+7Ybjpe8XrtK32evUfwpg3RA=", + "optional": true + }, + "mime-db": { + "version": "1.30.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.30.0.tgz", + "integrity": "sha1-dMZD2i3Z1qRTmZY0ZbJtXKfXHwE=" + }, + "mime-types": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-1.0.2.tgz", + "integrity": "sha1-mVrhOSq4r/y/yyZB3QVOlDwNXc4=" + }, + "minimatch": { + "version": "0.2.14", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.2.14.tgz", + "integrity": "sha1-x054BXT2PG+aCQ6Q775u9TpqdWo=", + "dev": true, + "requires": { + "lru-cache": "2.7.3", + "sigmund": "1.0.1" + } + }, + "minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", + "dev": true + }, + "mkdirp": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.0.tgz", + "integrity": "sha1-HXMHam35hs2TROFecfzAWkyavxI=", + "dev": true, + "requires": { + "minimist": "0.0.8" + } + }, + "mocha": { + "version": "2.2.5", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-2.2.5.tgz", + "integrity": "sha1-07cqT+SeyUOTU/GsiT28Qw2ZMUA=", + "dev": true, + "requires": { + "commander": "2.3.0", + "debug": "2.0.0", + "diff": "1.4.0", + "escape-string-regexp": "1.0.2", + "glob": "3.2.3", + "growl": "1.8.1", + "jade": "0.26.3", + "mkdirp": "0.5.0", + "supports-color": "1.2.1" + }, + "dependencies": { + "debug": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.0.0.tgz", + "integrity": "sha1-ib2d9nMrUSVrxnBTQrugLtEhMe8=", + "dev": true, + "requires": { + "ms": "0.6.2" + } + }, + "ms": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-0.6.2.tgz", + "integrity": "sha1-2JwhJMb9wTU9Zai3e/GqxLGTcIw=", + "dev": true + } + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "node-uuid": { + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/node-uuid/-/node-uuid-1.4.8.tgz", + "integrity": "sha1-sEDrCSOWivq/jTL7HxfxFn/auQc=" + }, + "oauth-sign": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.3.0.tgz", + "integrity": "sha1-y1QPk7srIqfVlBaRoojWDo6pOG4=", + "optional": true + }, + "performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" + }, + "promise": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/promise/-/promise-8.0.1.tgz", + "integrity": "sha1-5F1osAoXZHttpxG/he1u1HII9FA=", + "requires": { + "asap": "2.0.6" + } + }, + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" + }, + "qs": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-1.0.2.tgz", + "integrity": "sha1-UKk+K1r2aRwxvOpdrnjubqGQN2g=" + }, + "request": { + "version": "2.40.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.40.0.tgz", + "integrity": "sha1-TdZw9pbx5uhC5mtLXoOTAaub62c=", + "requires": { + "aws-sign2": "0.5.0", + "forever-agent": "0.5.2", + "form-data": "0.1.4", + "hawk": "1.1.1", + "http-signature": "0.10.1", + "json-stringify-safe": "5.0.1", + "mime-types": "1.0.2", + "node-uuid": "1.4.8", + "oauth-sign": "0.3.0", + "qs": "1.0.2", + "stringstream": "0.0.5", + "tough-cookie": "2.3.3", + "tunnel-agent": "0.4.3" + } + }, + "safe-buffer": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", + "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==" + }, + "sigmund": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz", + "integrity": "sha1-P/IfGYytIXX587eBhT/ZTQ0ZtZA=", + "dev": true + }, + "simple-oauth2": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/simple-oauth2/-/simple-oauth2-1.3.0.tgz", + "integrity": "sha1-azIgweIRJ+OxA3Wqtcl29eMP/+s=", + "requires": { + "bluebird": "3.5.1", + "date-fns": "1.29.0", + "debug": "2.6.9", + "joi": "10.6.0", + "request": "2.83.0" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" + }, + "aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=" + }, + "boom": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/boom/-/boom-4.3.1.tgz", + "integrity": "sha1-T4owBctKfjiJ90kDD9JbluAdLjE=", + "requires": { + "hoek": "4.2.0" + } + }, + "combined-stream": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.5.tgz", + "integrity": "sha1-k4NwpXtKUd6ix3wV1cX9+JUWQAk=", + "requires": { + "delayed-stream": "1.0.0" + } + }, + "cryptiles": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-3.1.2.tgz", + "integrity": "sha1-qJ+7Ig9c4l7FboxKqKT9e1sNKf4=", + "requires": { + "boom": "5.2.0" + }, + "dependencies": { + "boom": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/boom/-/boom-5.2.0.tgz", + "integrity": "sha512-Z5BTk6ZRe4tXXQlkqftmsAUANpXmuwlsF5Oov8ThoMbQRzdGTA1ngYRW160GexgOgjsFOKJz0LYhoNi+2AMBUw==", + "requires": { + "hoek": "4.2.0" + } + } + } + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" + }, + "forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=" + }, + "form-data": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.1.tgz", + "integrity": "sha1-b7lPvXGIUwbXPRXMSX/kzE7NRL8=", + "requires": { + "asynckit": "0.4.0", + "combined-stream": "1.0.5", + "mime-types": "2.1.17" + } + }, + "hawk": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/hawk/-/hawk-6.0.2.tgz", + "integrity": "sha512-miowhl2+U7Qle4vdLqDdPt9m09K6yZhkLDTWGoUiUzrQCn+mHHSmfJgAyGaLRZbPmTqfFFjRV1QWCW0VWUJBbQ==", + "requires": { + "boom": "4.3.1", + "cryptiles": "3.1.2", + "hoek": "4.2.0", + "sntp": "2.0.2" + } + }, + "hoek": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/hoek/-/hoek-4.2.0.tgz", + "integrity": "sha512-v0XCLxICi9nPfYrS9RL8HbYnXi9obYAeLbSP00BmnZwCK9+Ih9WOjoZ8YoHCoav2csqn4FOz4Orldsy2dmDwmQ==" + }, + "http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "requires": { + "assert-plus": "1.0.0", + "jsprim": "1.4.1", + "sshpk": "1.13.1" + } + }, + "mime-types": { + "version": "2.1.17", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.17.tgz", + "integrity": "sha1-Cdejk/A+mVp5+K+Fe3Cp4KsWVXo=", + "requires": { + "mime-db": "1.30.0" + } + }, + "oauth-sign": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz", + "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM=" + }, + "qs": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.1.tgz", + "integrity": "sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A==" + }, + "request": { + "version": "2.83.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.83.0.tgz", + "integrity": "sha512-lR3gD69osqm6EYLk9wB/G1W/laGWjzH90t1vEa2xuxHD5KUrSzp9pUSfTm+YC5Nxt2T8nMPEvKlhbQayU7bgFw==", + "requires": { + "aws-sign2": "0.7.0", + "aws4": "1.6.0", + "caseless": "0.12.0", + "combined-stream": "1.0.5", + "extend": "3.0.1", + "forever-agent": "0.6.1", + "form-data": "2.3.1", + "har-validator": "5.0.3", + "hawk": "6.0.2", + "http-signature": "1.2.0", + "is-typedarray": "1.0.0", + "isstream": "0.1.2", + "json-stringify-safe": "5.0.1", + "mime-types": "2.1.17", + "oauth-sign": "0.8.2", + "performance-now": "2.1.0", + "qs": "6.5.1", + "safe-buffer": "5.1.1", + "stringstream": "0.0.5", + "tough-cookie": "2.3.3", + "tunnel-agent": "0.6.0", + "uuid": "3.1.0" + } + }, + "sntp": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/sntp/-/sntp-2.0.2.tgz", + "integrity": "sha1-UGQRDwr4X3z9t9a2ekACjOUrSys=", + "requires": { + "hoek": "4.2.0" + } + }, + "tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "requires": { + "safe-buffer": "5.1.1" + } + }, + "uuid": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.1.0.tgz", + "integrity": "sha512-DIWtzUkw04M4k3bf1IcpS2tngXEL26YUD2M0tMDUpnUrz2hgzUBlD55a4FjdLGPvfHxS6uluGWvaVEqgBcVa+g==" + } + } + }, + "sntp": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/sntp/-/sntp-0.2.4.tgz", + "integrity": "sha1-+4hfGLDzqtGJ+CSGJTa87ux1CQA=", + "optional": true, + "requires": { + "hoek": "0.9.1" + } + }, + "sshpk": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.13.1.tgz", + "integrity": "sha1-US322mKHFEMW3EwY/hzx2UBzm+M=", + "requires": { + "asn1": "0.2.3", + "assert-plus": "1.0.0", + "bcrypt-pbkdf": "1.0.1", + "dashdash": "1.14.1", + "ecc-jsbn": "0.1.1", + "getpass": "0.1.7", + "jsbn": "0.1.1", + "tweetnacl": "0.14.5" + }, + "dependencies": { + "asn1": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz", + "integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y=" + }, + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" + } + } + }, + "stringstream": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz", + "integrity": "sha1-TkhM1N5aC7vuGORjB3EKioFiGHg=" + }, + "supports-color": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-1.2.1.tgz", + "integrity": "sha1-Eu4hUHCGzZjBBY2ewPSsR2t687I=", + "dev": true + }, + "topo": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/topo/-/topo-2.0.2.tgz", + "integrity": "sha1-zVYVdSU5BXwNwEkaYhw7xvvh0YI=", + "requires": { + "hoek": "4.2.0" + }, + "dependencies": { + "hoek": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/hoek/-/hoek-4.2.0.tgz", + "integrity": "sha512-v0XCLxICi9nPfYrS9RL8HbYnXi9obYAeLbSP00BmnZwCK9+Ih9WOjoZ8YoHCoav2csqn4FOz4Orldsy2dmDwmQ==" + } + } + }, + "tough-cookie": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.3.tgz", + "integrity": "sha1-C2GKVWW23qkL80JdBNVe3EdadWE=", + "requires": { + "punycode": "1.4.1" + } + }, + "tunnel-agent": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.4.3.tgz", + "integrity": "sha1-Y3PbdpCf5XDgjXNYM2Xtgop07us=", + "optional": true + }, + "tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", + "optional": true + }, + "underscore": { + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.8.3.tgz", + "integrity": "sha1-Tz+1OxBuYJf8+ctBCfKl6b36UCI=" + }, + "verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "requires": { + "assert-plus": "1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "1.3.0" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" + } + } + } + } +} diff --git a/package.json b/package.json index ef30eed..f5acf19 100644 --- a/package.json +++ b/package.json @@ -10,9 +10,10 @@ "license": "MIT", "repository": "sdunster/libbeacon", "dependencies": { - "htmlparser2": "~3.7.3", + "debug": "^3.1.0", + "promise": "^8.0.1", "request": "~2.40.0", - "tough-cookie": "~0.12.1", + "simple-oauth2": "^1.3.0", "underscore": "^1.7.0" }, "devDependencies": { diff --git a/test/main.js b/test/main.js index aa1becc..6eec502 100644 --- a/test/main.js +++ b/test/main.js @@ -1,124 +1,118 @@ -var assert = require("assert") -var Libbeacon = require("../lib/main") +const assert = require("assert"); +const Client = require("../lib/client.js"); +const api_factory = require("../lib/main.js"); -var credentials = { - username: process.env.BEACON_USERNAME, - password: process.env.BEACON_PASSWORD +var setup = function() { + if(!process.env.IDENTITY_CLIENT_ID || !process.env.IDENTITY_CLIENT_SECRET) { + assert.fail("Must set IDENTITY_CLIENT_ID and IDENTITY_CLIENT_SECRET"); + } + + const env = "BEACON_ENV" in process.env ? process.env.BEACON_ENV : 'prod' + + return api_factory( + process.env.IDENTITY_CLIENT_ID, + process.env.IDENTITY_CLIENT_SECRET, + env + ); } -var setupAndLogin = function(cb) { - if(!credentials.username || !credentials.password) { - console.log("Must set BEACON_USERNAME and BEACON_PASSWORD"); +var setupAndLogin = function() { + const api = setup(); + + if(!process.env.BEACON_USERNAME || !process.env.BEACON_PASSWORD) { + assert.fail("Must set BEACON_USERNAME and BEACON_PASSWORD"); } - var beacon = new Libbeacon(); - beacon.login( - credentials.username, - credentials.password, - function(error, success) { - assert.ifError(error); - assert.equal(success, true); - cb(beacon); - } + + return api.login( + process.env.BEACON_USERNAME, + process.env.BEACON_PASSWORD ); } -describe('Libbeacon', function() { - describe('login()', function() { - this.timeout(5000); // login is slow :( - it('should succeed but return false with invalid credentials', function(done) { - var beacon = new Libbeacon(); - beacon.login('test','test', function(error, success) { - assert.ifError(error); - assert.equal(success, false); - done(); +describe('login()', function() { + this.timeout(5000); // login is slow :( + it('should raise an error', function() { + const api = setup(); + return new Promise((resolve) => { + api.login('test', 'test') + .then((client) => { + assert.fail("Did not fail with incorrect credentials"); + }) + .catch((error) => { + resolve(); }); }); + }); - it('should fail and throw an error', function(done) { - var beacon = new Libbeacon(); - beacon.baseUrl = 'http://google.com'; - beacon.login('test','test', function(error, success) { - assert(error); - done(); - }); + it('should login successfully', function() { + const api = setup(); + return api.login( + process.env.BEACON_USERNAME, + process.env.BEACON_PASSWORD) + .then((client) => { + assert(client instanceof Client); }); + }); +}); - it('should login successfully', function(done) { - if(!credentials.username || !credentials.password) { - console.log("Must set BEACON_USERNAME and BEACON_PASSWORD"); - } - var beacon = new Libbeacon(); - beacon.login( - credentials.username, - credentials.password, - function(error, success) { - assert.ifError(error); - assert.equal(success, true); - done(); - } - ); +describe('Client', function() { + var beacon; + before(function() { + return setupAndLogin() + .then((result) => { + beacon = result; }); }); describe('get()', function() { - var beacon; - before(function(done) { - setupAndLogin(function(result) { - beacon = result; - done(); - }); - }); - - it('should fetch a job', function(done) { - beacon.get('Jobs/1', {}, function(error, data) { + it('should fetch a job', function() { + beacon.get('Jobs/1', {}).then((error, data) => { assert.ifError(error); assert('Id' in data); assert('Identifier' in data); - done(); + }) + .catch((error) => { + resolve(); }); }); - it('should fetch a job and override a header', function(done) { - beacon.get('Jobs/1', {headers: {"X-Test": 1}}, function(error, data) { + it('should fetch a job and override a header', function() { + beacon.get('Jobs/1', {headers: {"X-Test": 1}}).then((error, data) => { assert.ifError(error); assert('Id' in data); assert('Identifier' in data); - done(); + }) + .catch((error) => { + resolve(); }); }); + }); describe('getPagedResults()', function() { this.timeout(10000); - var beacon; - before(function(done) { - setupAndLogin(function(result) { - beacon = result; - done(); - }); - }); - - it('should fetch some locations', function(done) { + it('should fetch some locations', function() { var locations = []; - - beacon.getPagedResults('Entities', {qs: {"Q": ""}}, function(error, finished, data) { + + beacon.getPagedResults('Headquarters/Search', {qs: {"PageSize": "5"}}).then((error, data) => { assert.ifError(error); - locations = locations.concat(data); - if(finished) { - // make sure we get more than one page (50) - assert(Array.isArray(locations)); - assert(locations.length > 60); - done(); - } + // make sure we get more than one page (5) + assert(Array.isArray(data)); + assert(data.length > 10); + }) + .catch((error) => { + resolve(); + }); }); - }); - it('should fail requesting non-page API', function(done) { - beacon.getPagedResults('Jobs/1', {}, function(error, finished, data) { + it('should fail requesting non-page API', function() { + beacon.getPagedResults('Jobs/1', {}).then((error, data) => { assert(error); assert(!finished); - done(); + }) + .catch((error) => { + resolve(); }); }); });