-
Notifications
You must be signed in to change notification settings - Fork 4
/
private_api_request.ts
52 lines (47 loc) 路 2.46 KB
/
private_api_request.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
import { baseAxiosRequestInterceptor, baseAxiosRequestErrorInterceptor, baseAxiosResponseInterceptor, baseAxiosResponseErrorInterceptor } from '../../base_axios_config'
import { getKrakenMessageSignature } from './../message_signature'
import debugHelper from '../../util/debug_helper'
import axios, { AxiosInstance, AxiosRequestConfig } from 'axios'
import { krakenAxiosConfig, apiVersion } from '../kraken_axios_config'
import { PrivateEndpoint } from '../types/kraken_api_endpoints'
import { InjectedApiKeys } from '../../types/injected_api_keys'
const { logError, debug } = debugHelper(__filename)
export const createKrakenPrivateApiClient = (apikey = process.env.KRAKEN_API_KEY || '', apiSecret = process.env.KRAKEN_API_SECRET || ''): AxiosInstance => {
const privateApiClient: AxiosInstance = axios.create(krakenAxiosConfig)
privateApiClient.defaults.baseURL = `${privateApiClient.defaults.baseURL}/private`
privateApiClient.defaults.headers['API-Key'] = apikey
privateApiClient.interceptors.request.use((config) => {
const { url } = config
const nonce = new Date().getTime() * 1000
config.data = {
...config.data,
nonce
}
config.headers['API-Sign'] = getKrakenMessageSignature(`/${apiVersion}/private/${url}`, config.data, apiSecret)
return baseAxiosRequestInterceptor(config)
},
baseAxiosRequestErrorInterceptor
)
privateApiClient.interceptors.response.use(baseAxiosResponseInterceptor, baseAxiosResponseErrorInterceptor)
return privateApiClient
}
interface KrakenPrivateRequestConfig extends AxiosRequestConfig {
method?: 'POST' | 'post';
url: PrivateEndpoint;
data?: any;
}
let defaultClient = createKrakenPrivateApiClient()
export const krakenPrivateApiRequest = async ({ url, data }: KrakenPrivateRequestConfig, injectedApiKeys?: InjectedApiKeys): Promise<any> => {
const apiClient = injectedApiKeys ? createKrakenPrivateApiClient(injectedApiKeys.apiKey, injectedApiKeys.apiSecret) : defaultClient
const { data: { result: krakenPrivateResponse, error }} = await apiClient.request({ url, data }) || {}
if (error?.length) {
const errorStr = error.join(' | ')
logError(errorStr)
throw new Error(errorStr)
}
debug({ krakenPrivateResponse })
return krakenPrivateResponse
}
export const updateKrakenDefaultClient = (apikey: string, apiSecret: string): void => {
defaultClient = createKrakenPrivateApiClient(apikey, apiSecret)
}