UNPKG

fitbit-livedata

Version:

This project aims to getting `livedata` from Fitbit tracker

88 lines (72 loc) 3.5 kB
'use strict';Object.defineProperty(exports, "__esModule", { value: true });var _axios = require('axios');var _axios2 = _interopRequireDefault(_axios); var _querystring = require('querystring');var _querystring2 = _interopRequireDefault(_querystring); var _deviceTypes = require('./deviceTypes');var _deviceTypes2 = _interopRequireDefault(_deviceTypes);function _interopRequireDefault(obj) {return obj && obj.__esModule ? obj : { default: obj };} _axios2.default.defaults.baseURL = 'https://android-cdn-api.fitbit.com'; var SCOPE = ''; // activity heartrate location nutrition profile settings sleep social weight mfa_ok'; var GRANT_TYPE_AUTHCODE = 'authorization_code'; var GRANT_TYPE_PASSWORD = 'password'; var REDIRECT_URI = 'https://horihiro.github.io/node-fitbit-livedata/'; var AUTHORIZATION = 'Basic MjI4VlNSOjQ1MDY4YTc2Mzc0MDRmYzc5OGEyMDhkNmMxZjI5ZTRm'; var URL_OAUTH = 'https://android-api.fitbit.com/oauth2/token'; var PATH_USER_DEVICES = '/1/user/-/devices.json'; var PATH_GENBLECREDS = '/1/user/-/devices/tracker/generateBtleClientAuthCredentials.json';exports.default = function (accounts) { var accountArray = function () {return accounts instanceof Array ? accounts : [accounts];}(); return Promise.all(accountArray.map(function (account) { var params = function () { var queries = { scope: SCOPE }; if (account.username && account.password) { queries.username = account.username; queries.password = account.password; queries.grant_type = GRANT_TYPE_PASSWORD; } else if (account.authCode) { queries.code = account.authCode; queries.redirect_uri = REDIRECT_URI; queries.grant_type = GRANT_TYPE_AUTHCODE; } else { return null; } return _querystring2.default.stringify(queries); }(); if (!params) return null; var options = { headers: { Authorization: AUTHORIZATION } }; return _axios2.default.post(URL_OAUTH, params, options); })).then(function (responses) { var promises = responses.map(function (response) {return _axios2.default.get(PATH_USER_DEVICES, { headers: { Authorization: 'Bearer ' + response.data.access_token } });}); return Promise.all(promises).then(function (results) {return { responses: results, tokens: responses.map(function (response) {return response.data.access_token;}) };}); }).then(function (results) {var tokens = results.tokens; var allDevices = results.responses.reduce(function (prev, curr, index) { var userDevices = curr.data; return prev.concat(userDevices.map(function (device) { var serialNumber = device.wireId; var address = device.mac.match(/.{2}/g).reverse().join(':'); var metadata = _deviceTypes2.default.filter(function (type) {return type.name === device.deviceVersion;}); var params = _querystring2.default.stringify({ serialNumber: device.wireId }); return _axios2.default.post(PATH_GENBLECREDS, params, { headers: { Authorization: 'Bearer ' + tokens[index] } }). then(function (res2) { var auth = res2.data; if (metadata.length === 1) { auth.type = metadata[0].authType; } return { name: metadata[0].name, auth: auth, serialNumber: serialNumber, address: address }; }); })); }, []); return Promise.all(allDevices); }); };