laplace-api
Version:
Client library for Laplace API for the US stock market and BIST (Istanbul stock market) fundamental financial data.
96 lines (83 loc) • 2.62 kB
text/typescript
import axios, { AxiosInstance, AxiosRequestConfig } from 'axios';
import { Logger } from 'winston';
import { LaplaceConfiguration } from '../utilities/configuration';
import { LaplaceHTTPError, WrapError } from './errors';
export class Client {
private cli: AxiosInstance;
private baseUrl: string;
private apiKey: string;
private logger: Logger;
constructor(cfg: LaplaceConfiguration, logger: Logger) {
this.cli = axios.create();
this.baseUrl = cfg.baseURL;
this.apiKey = cfg.apiKey;
this.logger = logger;
}
async sendRequest<T>(config: AxiosRequestConfig): Promise<T> {
try {
const response = await this.cli.request<T>({
...config,
baseURL: this.baseUrl,
headers: {
...config.headers,
Authorization: `Bearer ${this.apiKey}`,
},
});
return response.data;
} catch (error) {
if (axios.isAxiosError(error) && error.response) {
const httpError = new LaplaceHTTPError(
error.response.status,
JSON.stringify(error.response.data)
);
throw WrapError(httpError);
}
throw error;
}
}
sendSSERequest<T>(url: string): { events: AsyncIterable<T>, cancel: () => void } {
const source = axios.CancelToken.source();
var apiKey = this.apiKey;
const events: AsyncIterable<T> = {
async *[Symbol.asyncIterator]() {
try {
const response = await axios.get(url, {
headers: {
Authorization: `Bearer ${apiKey}`,
},
responseType: 'stream',
cancelToken: source.token,
});
const reader = response.data;
const decoder = new TextDecoder();
for await (const chunk of reader) {
const text = decoder.decode(chunk);
const lines = text.split('\n').filter(line => line.trim() !== '');
for (const line of lines) {
if (line.startsWith('data: ')) {
const data = line.slice(6);
try {
const parsedData = JSON.parse(data) as T;
yield parsedData;
} catch (error) {
console.error(`Error parsing event data: ${error}`);
}
}
}
}
} catch (error) {
if (!axios.isCancel(error)) {
console.error(`SSE error: ${error}`);
}
}
},
};
const cancel = () => {
source.cancel('Request cancelled by user');
};
return { events, cancel };
}
}
export function createClient(cfg: LaplaceConfiguration, logger: Logger): Client {
return new Client(cfg, logger);
}