UNPKG

growwapi

Version:
68 lines (67 loc) 2.37 kB
import * as OTPAuth from 'otpauth'; import { AUTH_URL, SOCKET_TOKEN_URL } from '../config'; let accessToken = null; let currentTokenRequest = null; export class Auth { static async getAccessToken() { if (accessToken) { if (new Date() < new Date(accessToken.expiry)) { return accessToken.token; } } if (currentTokenRequest) { return currentTokenRequest; } currentTokenRequest = (async () => { const response = await Auth.createAccessToken(); if (!response.ok) { throw new Error(`Failed to create access token: ${response.statusText}, Status Code: ${response.status}, Response: ${await response.text()}`); } const data = await response.json(); accessToken = data; return accessToken?.token; })(); try { return await currentTokenRequest; } finally { currentTokenRequest = null; } } static async socketAccessToken(publicKey) { const token = await Auth.getAccessToken(); const response = await fetch(SOCKET_TOKEN_URL, { method: 'POST', headers: { 'Authorization': `Bearer ${token}`, 'Content-Type': 'application/json', }, body: JSON.stringify({ socketKey: publicKey, }), }); const result = await response.json(); return response.ok ? result : Promise.reject(new Error(`Failed to create socket access token: ${response.statusText}, Status Code: ${response.status}, Response: ${await response.text()}`)); } static async createAccessToken() { return await fetch(AUTH_URL, { method: 'POST', headers: { 'Authorization': `Bearer ${process.env.GROWW_API_KEY}`, 'Content-Type': 'application/json', }, body: JSON.stringify({ totp: Auth.generateTOTP(), }), }); } static generateTOTP() { const secret = OTPAuth.Secret.fromBase32(process.env.GROWW_API_SECRET || ''); return new OTPAuth.TOTP({ secret: secret, algorithm: 'SHA1', digits: 6, period: 30, }).generate(); } }