import axios, { AxiosInstance } from 'axios' import { APIResponse } from './APIResponse' import { WyreAPIOptions } from './WyreAPIOptions' import { WyreAxiosInstance } from './WyreAxiosInstance' import { getErrorResponse } from './api-response-utils' import { AuthTokenData } from './AuthTokenData' import * as crypto from 'crypto' import { SessionData } from './SessionData' // tslint:disable: no-console export class BaseWyreAPI { private instance: WyreAxiosInstance constructor( private options: WyreAPIOptions, ) { } public initialize( secretKey?: string, ) { this.instance = WyreAxiosInstance.newInstance( this.options, secretKey, ) } async newSession(): Promise> { const secretKey = this.generateWyreSecretKey() const { response: secretKeyResponse, error } = await this.submitWyreSecretKey(secretKey) if (error) { return { error } } const { apiKey } = secretKeyResponse const response = { apiKey, secretKey, } return { response } } async createSession(): Promise> { const { response, error } = await this.newSession() if (error) { return { error } } const { secretKey } = response this.instance.setSecretKey(secretKey) return { response } } public getAxiosInstance(): AxiosInstance { return this.instance.getAxiosInstance() } private generateWyreSecretKey(): string { return crypto.randomBytes(30).toString('hex') } async submitWyreSecretKey(secretKey: string): Promise> { const body = { secretKey, } const req = axios .post( `${this.options.baseUrl}/v2/sessions/auth/key`, body, { headers: { 'Content-Type': 'application/json', } } ) return await this.executeRequest(req) } async executeRequest(req: any): Promise> { try { const response = await req const { data } = response return { response: data } } catch (ex) { return { error: this.getError(ex) } } } private getError(ex: any): any { const { response } = ex if (response) { const { data } = response if (data) { const error1 = { message: data, } return getErrorResponse(error1) } } const error = { message: ex.error || ex, } return getErrorResponse(error) } }