sleeptracker-tools
Version:
Simple tool to check SleepTracker device status
106 lines (105 loc) • 3.75 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.CLIENT_INFO = exports.AUTH_BASE_URL = exports.API_BASE_URL = void 0;
exports.authenticate = authenticate;
exports.createApiClient = createApiClient;
exports.createAuthClient = createAuthClient;
exports.handleApiError = handleApiError;
const axios_1 = __importDefault(require("axios"));
const inquirer_1 = __importDefault(require("inquirer"));
const ora_1 = __importDefault(require("ora"));
exports.API_BASE_URL = 'https://app.tsi.sleeptracker.com';
exports.AUTH_BASE_URL = 'https://auth.tsi.sleeptracker.com';
exports.CLIENT_INFO = {
clientID: 'sleeptracker-android-tsi',
clientVersion: '1.9.47'
};
async function authenticate() {
var _a;
const { username, password } = await inquirer_1.default.prompt([
{
type: 'input',
name: 'username',
message: 'Enter your SleepTracker email:',
validate: (input) => input.length > 0 && input.includes('@')
},
{
type: 'password',
name: 'password',
message: 'Enter your password:',
validate: (input) => input.length > 0
}
]);
const spinner = (0, ora_1.default)('Logging in...').start();
try {
const credentials = Buffer.from(`${username}:${password}`).toString('base64');
const client = await createAuthClient();
const response = await client.post('/v1/app/user/session', {
...exports.CLIENT_INFO,
id: 'TEST_ANDROID_getUserSession',
scope: 'scope'
}, {
headers: {
'Authorization': `Basic ${credentials}`
}
});
if ((_a = response.data) === null || _a === void 0 ? void 0 : _a.token) {
spinner.succeed('Login successful!');
return response.data.token;
}
else {
spinner.fail('Login failed: No token received');
throw new Error('No token received');
}
}
catch (error) {
spinner.fail('Login failed');
throw error;
}
}
async function createApiClient(token) {
if (!token) {
token = await authenticate();
}
return axios_1.default.create({
baseURL: exports.API_BASE_URL,
headers: {
'Authorization': `Bearer ${token}`,
'Host': 'app.tsi.sleeptracker.com',
'Accept': '*/*',
'Content-Type': 'application/json',
'Accept-Encoding': 'gzip',
'Accept-Language': 'en-US,en;q=0.9'
}
});
}
async function createAuthClient() {
return axios_1.default.create({
baseURL: exports.AUTH_BASE_URL,
headers: {
'Host': 'auth.tsi.sleeptracker.com',
'Accept': '*/*',
'Content-Type': 'application/json',
'Accept-Encoding': 'gzip',
'Accept-Language': 'en-US,en;q=0.9'
}
});
}
function handleApiError(error) {
var _a, _b, _c;
if (axios_1.default.isAxiosError(error)) {
if ((_b = (_a = error.response) === null || _a === void 0 ? void 0 : _a.data) === null || _b === void 0 ? void 0 : _b.message) {
throw new Error(error.response.data.message);
}
else if (((_c = error.response) === null || _c === void 0 ? void 0 : _c.status) === 401) {
throw new Error('Session expired. Please login again.');
}
else {
throw new Error('API request failed');
}
}
throw error instanceof Error ? error : new Error('Failed to connect to SleepTracker API');
}