growwapi
Version:
NodeJS SDK for Groww trading APIs
68 lines (67 loc) • 2.37 kB
JavaScript
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();
}
}