export default class Trimlog { constructor({username, password}) { this.token = null; this.tokenExpiry = new Date(0); this.username = username; this.password = password; } async getLooseActivities() { return this.fetch("GET", "activities"); } async getWorkouts() { return this.fetch("GET", `workouts?from=${new Date(Date.now() - 86400000 * 3).toISOString().slice(0, 10)}`); } async postWorkout(data) { return this.fetch("POST", "workouts", data); } async fetch(method, path, body) { if (new Date() > this.tokenExpiry) { await this.refreshToken(); } const res = await fetch("https://i.stifred.dev/api/"+path, { method: method, headers: { "content-type": body ? "application/json" : void(0), "authorization": `Bearer ${this.token}` }, body: body ? JSON.stringify(body) : void(0), }) if (!res.ok) { throw new Error(res.statusText); } return (await res.json()).data; } async refreshToken() { const res = await fetch("https://stifred.auth.eu-west-1.amazoncognito.com/oauth2/token", { method: "POST", headers: { "content-type": "application/x-www-form-urlencoded", "authorization": `Basic ${Buffer.from(`${this.username}:${this.password}`).toString("base64")}` }, body: "grant_type=client_credentials&scope=indigo/api", }) const data = await res.json(); this.token = data.access_token; this.tokenExpiry = new Date(Date.now() + (data.expires_in * 1000 * 0.95)); } }