-
Notifications
You must be signed in to change notification settings - Fork 4
/
private_ws_handler.ts
63 lines (53 loc) 路 2.2 KB
/
private_ws_handler.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
53
54
55
56
57
58
59
60
61
62
63
import WebSocket from 'ws'
import { webSocket } from 'rxjs/webSocket'
import { krakenPrivateApiRequest } from '../api_clients/private_api_request'
import debugHelper from '../../util/debug_helper'
import { Observable } from 'rxjs/internal/Observable'
import { Subject } from 'rxjs/internal/Subject'
import { InjectedApiKeys } from '../../types/injected_api_keys'
import { filter } from 'rxjs/operators'
const { logError } = debugHelper(__filename)
export const onKrakenPrivateWSOpened = new Subject()
export const onKrakenPrivateWSClosed = new Subject()
export const krakenPrivateWS = webSocket({
protocol: 'v1',
url: 'wss://ws-auth.kraken.com/',
WebSocketCtor: WebSocket,
openObserver: onKrakenPrivateWSOpened,
closeObserver: onKrakenPrivateWSClosed
})
export const onKrakenPrivateWSHeartbeat$ = krakenPrivateWS.pipe(filter(({ event = null }) => event && event === 'heartbeat'))
export const gethWsAuthToken = async (injectedApiKeys?: InjectedApiKeys): Promise<string> => {
try {
const { token } = await krakenPrivateApiRequest({ url: 'GetWebSocketsToken' }, injectedApiKeys) || {}
if (!token) {
throw ({ code: 'CUSTOM_ERROR', message: 'no token received' })
}
return token
} catch({ code, message }) {
logError('Kraken gethWsAuthToken error', { code, message })
throw ({ code, message })
}
}
export const getKrakenPrivateObservableFromWS = async (lastToken: string = null, subscriptionData: any = {}, filterFn: (data: unknown) => boolean = () => true, unsubscriptionData?: any, injectedApiKeys?: InjectedApiKeys): Promise<{ privateObservable$: Observable<any>; token: string }> => {
const token = lastToken || await gethWsAuthToken(injectedApiKeys)
const subscriptionDataWithToken = subscriptionData.subscription ? {
...subscriptionData,
subscription: {
...subscriptionData.subscription,
token
},
} : {
...subscriptionData,
token,
}
const privateObservable$ = krakenPrivateWS.multiplex(
() => (subscriptionDataWithToken),
() => (unsubscriptionData),
filterFn
)
return {
privateObservable$,
token
}
}