tardis-dev 13.4.10 → 13.4.13
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/consts.d.ts +6 -2
- package/dist/consts.d.ts.map +1 -1
- package/dist/consts.js +26 -3
- package/dist/consts.js.map +1 -1
- package/dist/mappers/bybit.d.ts +1 -1
- package/dist/mappers/bybitspot.d.ts +96 -0
- package/dist/mappers/bybitspot.d.ts.map +1 -0
- package/dist/mappers/bybitspot.js +102 -0
- package/dist/mappers/bybitspot.js.map +1 -0
- package/dist/mappers/cryptocom.d.ts +257 -0
- package/dist/mappers/cryptocom.d.ts.map +1 -0
- package/dist/mappers/cryptocom.js +193 -0
- package/dist/mappers/cryptocom.js.map +1 -0
- package/dist/mappers/huobi.d.ts +3 -3
- package/dist/mappers/index.d.ts +4 -4
- package/dist/mappers/index.d.ts.map +1 -1
- package/dist/mappers/index.js +25 -6
- package/dist/mappers/index.js.map +1 -1
- package/dist/mappers/poloniex.d.ts +60 -0
- package/dist/mappers/poloniex.d.ts.map +1 -1
- package/dist/mappers/poloniex.js +73 -2
- package/dist/mappers/poloniex.js.map +1 -1
- package/dist/mappers/serum.d.ts +12 -0
- package/dist/mappers/serum.d.ts.map +1 -1
- package/dist/mappers/serum.js +2 -2
- package/dist/mappers/serum.js.map +1 -1
- package/dist/realtimefeeds/ascendex.d.ts +2 -0
- package/dist/realtimefeeds/ascendex.d.ts.map +1 -1
- package/dist/realtimefeeds/ascendex.js +6 -0
- package/dist/realtimefeeds/ascendex.js.map +1 -1
- package/dist/realtimefeeds/bybit.d.ts +2 -0
- package/dist/realtimefeeds/bybit.d.ts.map +1 -1
- package/dist/realtimefeeds/bybit.js +6 -0
- package/dist/realtimefeeds/bybit.js.map +1 -1
- package/dist/realtimefeeds/bybitspot.d.ts +10 -0
- package/dist/realtimefeeds/bybitspot.d.ts.map +1 -0
- package/dist/realtimefeeds/bybitspot.js +40 -0
- package/dist/realtimefeeds/bybitspot.js.map +1 -0
- package/dist/realtimefeeds/cryptocom.d.ts +10 -0
- package/dist/realtimefeeds/cryptocom.d.ts.map +1 -0
- package/dist/realtimefeeds/cryptocom.js +49 -0
- package/dist/realtimefeeds/cryptocom.js.map +1 -0
- package/dist/realtimefeeds/cryptocomderivatives.d.ts +10 -0
- package/dist/realtimefeeds/cryptocomderivatives.d.ts.map +1 -0
- package/dist/realtimefeeds/cryptocomderivatives.js +51 -0
- package/dist/realtimefeeds/cryptocomderivatives.js.map +1 -0
- package/dist/realtimefeeds/delta.d.ts +2 -0
- package/dist/realtimefeeds/delta.d.ts.map +1 -1
- package/dist/realtimefeeds/delta.js +6 -0
- package/dist/realtimefeeds/delta.js.map +1 -1
- package/dist/realtimefeeds/ftx.d.ts +2 -0
- package/dist/realtimefeeds/ftx.d.ts.map +1 -1
- package/dist/realtimefeeds/ftx.js +6 -0
- package/dist/realtimefeeds/ftx.js.map +1 -1
- package/dist/realtimefeeds/index.d.ts.map +1 -1
- package/dist/realtimefeeds/index.js +9 -1
- package/dist/realtimefeeds/index.js.map +1 -1
- package/dist/realtimefeeds/mango.d.ts +5 -0
- package/dist/realtimefeeds/mango.d.ts.map +1 -0
- package/dist/realtimefeeds/mango.js +12 -0
- package/dist/realtimefeeds/mango.js.map +1 -0
- package/dist/realtimefeeds/poloniex.d.ts +6 -3
- package/dist/realtimefeeds/poloniex.d.ts.map +1 -1
- package/dist/realtimefeeds/poloniex.js +14 -9
- package/dist/realtimefeeds/poloniex.js.map +1 -1
- package/dist/realtimefeeds/realtimefeed.d.ts +1 -0
- package/dist/realtimefeeds/realtimefeed.d.ts.map +1 -1
- package/dist/realtimefeeds/realtimefeed.js +7 -1
- package/dist/realtimefeeds/realtimefeed.js.map +1 -1
- package/package.json +1 -1
- package/src/consts.ts +30 -3
- package/src/mappers/bybitspot.ts +129 -0
- package/src/mappers/cryptocom.ts +395 -0
- package/src/mappers/index.ts +30 -8
- package/src/mappers/poloniex.ts +134 -1
- package/src/mappers/serum.ts +27 -13
- package/src/realtimefeeds/ascendex.ts +8 -0
- package/src/realtimefeeds/bybit.ts +8 -0
- package/src/realtimefeeds/bybitspot.ts +39 -0
- package/src/realtimefeeds/cryptocom.ts +48 -0
- package/src/realtimefeeds/cryptocomderivatives.ts +50 -0
- package/src/realtimefeeds/delta.ts +8 -0
- package/src/realtimefeeds/ftx.ts +8 -0
- package/src/realtimefeeds/index.ts +9 -1
- package/src/realtimefeeds/mango.ts +5 -0
- package/src/realtimefeeds/poloniex.ts +16 -10
- package/src/realtimefeeds/realtimefeed.ts +7 -1
package/src/mappers/serum.ts
CHANGED
|
@@ -31,8 +31,8 @@ export class SerumTradesMapper implements Mapper<'serum' | 'star-atlas', Trade>
|
|
|
31
31
|
price: Number(message.price),
|
|
32
32
|
amount: Number(message.size),
|
|
33
33
|
side: message.side,
|
|
34
|
-
timestamp: new Date(message.timestamp),
|
|
35
|
-
localTimestamp
|
|
34
|
+
timestamp: message.eventTimestamp !== undefined ? new Date(message.eventTimestamp) : new Date(message.timestamp),
|
|
35
|
+
localTimestamp
|
|
36
36
|
}
|
|
37
37
|
}
|
|
38
38
|
}
|
|
@@ -118,17 +118,31 @@ export class SerumBookTickerMapper implements Mapper<'serum' | 'star-atlas', Boo
|
|
|
118
118
|
}
|
|
119
119
|
}
|
|
120
120
|
|
|
121
|
-
type SerumVialTrade =
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
121
|
+
type SerumVialTrade =
|
|
122
|
+
| {
|
|
123
|
+
type: 'trade'
|
|
124
|
+
market: 'RAY/USDT'
|
|
125
|
+
timestamp: '2021-05-22T00:00:59.448Z'
|
|
126
|
+
slot: 79469377
|
|
127
|
+
version: 3
|
|
128
|
+
id: '96845406386975144808722|185.8|1621641659448'
|
|
129
|
+
side: 'buy'
|
|
130
|
+
price: '5.235'
|
|
131
|
+
size: '185.8'
|
|
132
|
+
eventTimestamp: undefined
|
|
133
|
+
}
|
|
134
|
+
| {
|
|
135
|
+
type: 'trade'
|
|
136
|
+
market: string
|
|
137
|
+
timestamp: string
|
|
138
|
+
slot: number
|
|
139
|
+
version: number
|
|
140
|
+
id: string
|
|
141
|
+
side: 'buy' | 'sell'
|
|
142
|
+
price: string
|
|
143
|
+
size: string
|
|
144
|
+
eventTimestamp: string
|
|
145
|
+
}
|
|
132
146
|
|
|
133
147
|
type SerumVialPriceLevel = [string, string]
|
|
134
148
|
|
|
@@ -38,6 +38,14 @@ export class AscendexRealTimeFeed extends RealTimeFeedBase {
|
|
|
38
38
|
return message.m === 'error'
|
|
39
39
|
}
|
|
40
40
|
|
|
41
|
+
protected sendCustomPing = () => {
|
|
42
|
+
this.send({ op: 'ping' })
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
protected messageIsHeartbeat(msg: any) {
|
|
46
|
+
return msg.m === 'pong'
|
|
47
|
+
}
|
|
48
|
+
|
|
41
49
|
protected async provideManualSnapshots(filters: Filter<string>[], shouldCancel: () => boolean) {
|
|
42
50
|
const depthSnapshotChannel = filters.find((f) => f.channel === 'depth-snapshot-realtime')
|
|
43
51
|
if (!depthSnapshotChannel) {
|
|
@@ -90,4 +90,12 @@ class BybitSingleConnectionRealTimeDataFeed extends RealTimeFeedBase {
|
|
|
90
90
|
protected messageIsError(message: any): boolean {
|
|
91
91
|
return message.success === false
|
|
92
92
|
}
|
|
93
|
+
|
|
94
|
+
protected sendCustomPing = () => {
|
|
95
|
+
this.send({ op: 'ping' })
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
protected messageIsHeartbeat(msg: any) {
|
|
99
|
+
return msg.ret_msg === 'pong' || msg.op == 'pong'
|
|
100
|
+
}
|
|
93
101
|
}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { Filter } from '../types'
|
|
2
|
+
import { RealTimeFeedBase } from './realtimefeed'
|
|
3
|
+
|
|
4
|
+
export class BybitSpotRealTimeFeed extends RealTimeFeedBase {
|
|
5
|
+
protected wssURL = 'wss://stream.bybit.com/spot/quote/ws/v2'
|
|
6
|
+
|
|
7
|
+
protected mapToSubscribeMessages(filters: Filter<string>[]): any[] {
|
|
8
|
+
return filters
|
|
9
|
+
.map((filter) => {
|
|
10
|
+
if (!filter.symbols || filter.symbols.length === 0) {
|
|
11
|
+
throw new Error('BybitSpotRealTimeFeed requires explicitly specified symbols when subscribing to live feed')
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
return filter.symbols.map((symbol) => {
|
|
15
|
+
return {
|
|
16
|
+
event: 'sub',
|
|
17
|
+
topic: filter.channel,
|
|
18
|
+
params: {
|
|
19
|
+
binary: false,
|
|
20
|
+
symbol: symbol
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
})
|
|
24
|
+
})
|
|
25
|
+
.flatMap((c) => c)
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
protected messageIsError(message: any): boolean {
|
|
29
|
+
return message.code !== undefined && message.code !== '0'
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
protected sendCustomPing = () => {
|
|
33
|
+
this.send({ ping: new Date().valueOf() })
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
protected messageIsHeartbeat(msg: any) {
|
|
37
|
+
return msg.pong !== undefined
|
|
38
|
+
}
|
|
39
|
+
}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { Filter } from '../types'
|
|
2
|
+
import { RealTimeFeedBase } from './realtimefeed'
|
|
3
|
+
|
|
4
|
+
export class CryptoComRealTimeFeed extends RealTimeFeedBase {
|
|
5
|
+
protected wssURL = 'wss://stream.crypto.com/v2/market'
|
|
6
|
+
|
|
7
|
+
protected mapToSubscribeMessages(filters: Filter<string>[]): any[] {
|
|
8
|
+
const channels = filters
|
|
9
|
+
.map((filter) => {
|
|
10
|
+
if (!filter.symbols || filter.symbols.length === 0) {
|
|
11
|
+
throw new Error('CryptoComRealTimeFeed requires explicitly specified symbols when subscribing to live feed')
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
return filter.symbols.map((symbol) => {
|
|
15
|
+
const suffix = filter.channel === 'book' ? '.150' : ''
|
|
16
|
+
return `${filter.channel}.${symbol}${suffix}`
|
|
17
|
+
})
|
|
18
|
+
})
|
|
19
|
+
.flatMap((s) => s)
|
|
20
|
+
|
|
21
|
+
return [
|
|
22
|
+
{
|
|
23
|
+
id: 1,
|
|
24
|
+
method: 'subscribe',
|
|
25
|
+
nonce: new Date().valueOf(),
|
|
26
|
+
params: {
|
|
27
|
+
channels: channels
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
]
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
protected messageIsError(message: any): boolean {
|
|
34
|
+
return message.code !== undefined && message.code !== 0
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
protected onMessage(msg: any) {
|
|
38
|
+
if (msg.method === 'public/heartbeat') {
|
|
39
|
+
this.send({
|
|
40
|
+
id: msg.id,
|
|
41
|
+
method: 'public/respond-heartbeat'
|
|
42
|
+
})
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
protected messageIsHeartbeat(msg: any) {
|
|
46
|
+
return msg.method === 'public/heartbeat'
|
|
47
|
+
}
|
|
48
|
+
}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { Filter } from '../types'
|
|
2
|
+
import { RealTimeFeedBase } from './realtimefeed'
|
|
3
|
+
|
|
4
|
+
export class CryptoComDerivativesRealTimeFeed extends RealTimeFeedBase {
|
|
5
|
+
protected wssURL = 'wss://deriv-stream.crypto.com/v1/market'
|
|
6
|
+
|
|
7
|
+
protected mapToSubscribeMessages(filters: Filter<string>[]): any[] {
|
|
8
|
+
const channels = filters
|
|
9
|
+
.map((filter) => {
|
|
10
|
+
if (!filter.symbols || filter.symbols.length === 0) {
|
|
11
|
+
throw new Error('CryptoComDerivativesRealTimeFeed requires explicitly specified symbols when subscribing to live feed')
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
return filter.symbols.map((symbol) => {
|
|
15
|
+
const suffix = filter.channel === 'book' ? '.50' : ''
|
|
16
|
+
return `${filter.channel}.${symbol}${suffix}`
|
|
17
|
+
})
|
|
18
|
+
})
|
|
19
|
+
.flatMap((s) => s)
|
|
20
|
+
|
|
21
|
+
return [
|
|
22
|
+
{
|
|
23
|
+
id: 1,
|
|
24
|
+
method: 'subscribe',
|
|
25
|
+
nonce: new Date().valueOf(),
|
|
26
|
+
params: {
|
|
27
|
+
channels: channels,
|
|
28
|
+
book_subscription_type: 'SNAPSHOT_AND_UPDATE',
|
|
29
|
+
book_update_frequency: 5
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
]
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
protected messageIsError(message: any): boolean {
|
|
36
|
+
return message.code !== undefined && message.code !== 0 && message.code !== 40003
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
protected onMessage(msg: any) {
|
|
40
|
+
if (msg.method === 'public/heartbeat') {
|
|
41
|
+
this.send({
|
|
42
|
+
id: msg.id,
|
|
43
|
+
method: 'public/respond-heartbeat'
|
|
44
|
+
})
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
protected messageIsHeartbeat(msg: any) {
|
|
48
|
+
return msg.method === 'public/heartbeat'
|
|
49
|
+
}
|
|
50
|
+
}
|
|
@@ -24,4 +24,12 @@ export class DeltaRealTimeFeed extends RealTimeFeedBase {
|
|
|
24
24
|
protected messageIsError(message: any): boolean {
|
|
25
25
|
return message.error !== undefined && message.error !== null
|
|
26
26
|
}
|
|
27
|
+
|
|
28
|
+
protected sendCustomPing = () => {
|
|
29
|
+
this.send({ type: 'ping' })
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
protected messageIsHeartbeat(msg: any) {
|
|
33
|
+
return msg.type === 'pong'
|
|
34
|
+
}
|
|
27
35
|
}
|
package/src/realtimefeeds/ftx.ts
CHANGED
|
@@ -63,6 +63,14 @@ class FtxSingleConnectionRealTimeFeed extends RealTimeFeedBase {
|
|
|
63
63
|
// ignore market not found errors
|
|
64
64
|
return message.code == 404
|
|
65
65
|
}
|
|
66
|
+
|
|
67
|
+
protected sendCustomPing = () => {
|
|
68
|
+
this.send({ op: 'ping' })
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
protected messageIsHeartbeat(msg: any) {
|
|
72
|
+
return msg.type === 'pong'
|
|
73
|
+
}
|
|
66
74
|
}
|
|
67
75
|
|
|
68
76
|
class FTXInstrumentInfoClient extends PoolingClientBase {
|
|
@@ -40,6 +40,10 @@ import { AscendexRealTimeFeed } from './ascendex'
|
|
|
40
40
|
import { DydxRealTimeFeed } from './dydx'
|
|
41
41
|
import { SerumRealTimeFeed } from './serum'
|
|
42
42
|
import { StarAtlasRealTimeFeed } from './staratlas'
|
|
43
|
+
import { MangoRealTimeFeed } from './mango'
|
|
44
|
+
import { BybitSpotRealTimeFeed } from './bybitspot'
|
|
45
|
+
import { CryptoComRealTimeFeed } from './cryptocom'
|
|
46
|
+
import { CryptoComDerivativesRealTimeFeed } from './cryptocomderivatives'
|
|
43
47
|
|
|
44
48
|
export * from './realtimefeed'
|
|
45
49
|
|
|
@@ -87,7 +91,11 @@ const realTimeFeedsMap: {
|
|
|
87
91
|
dydx: DydxRealTimeFeed,
|
|
88
92
|
serum: SerumRealTimeFeed,
|
|
89
93
|
'star-atlas': StarAtlasRealTimeFeed,
|
|
90
|
-
'huobi-dm-options': HuobiDMOptionsRealTimeFeed
|
|
94
|
+
'huobi-dm-options': HuobiDMOptionsRealTimeFeed,
|
|
95
|
+
mango: MangoRealTimeFeed,
|
|
96
|
+
'bybit-spot': BybitSpotRealTimeFeed,
|
|
97
|
+
'crypto-com': CryptoComRealTimeFeed,
|
|
98
|
+
'crypto-com-derivatives': CryptoComDerivativesRealTimeFeed
|
|
91
99
|
}
|
|
92
100
|
|
|
93
101
|
export function getRealTimeFeedFactory(exchange: Exchange): RealTimeFeed {
|
|
@@ -2,27 +2,33 @@ import { Filter } from '../types'
|
|
|
2
2
|
import { RealTimeFeedBase } from './realtimefeed'
|
|
3
3
|
|
|
4
4
|
export class PoloniexRealTimeFeed extends RealTimeFeedBase {
|
|
5
|
-
protected readonly wssURL = 'wss://
|
|
5
|
+
protected readonly wssURL = 'wss://ws.poloniex.com/ws/public'
|
|
6
6
|
|
|
7
7
|
protected mapToSubscribeMessages(filters: Filter<string>[]) {
|
|
8
|
-
|
|
8
|
+
return filters.flatMap((filter) => {
|
|
9
9
|
if (!filter.symbols || filter.symbols.length === 0) {
|
|
10
10
|
throw new Error('PoloniexRealTimeFeed requires explicitly specified symbols when subscribing to live feed')
|
|
11
11
|
}
|
|
12
|
-
return filter.symbols
|
|
13
|
-
})
|
|
14
|
-
|
|
15
|
-
const uniqueSymbols = [...new Set(allSymbols)]
|
|
16
12
|
|
|
17
|
-
return uniqueSymbols.map((symbol) => {
|
|
18
13
|
return {
|
|
19
|
-
|
|
20
|
-
channel:
|
|
14
|
+
event: 'subscribe',
|
|
15
|
+
channel: [filter.channel],
|
|
16
|
+
symbols: filter.symbols
|
|
21
17
|
}
|
|
22
18
|
})
|
|
23
19
|
}
|
|
24
20
|
|
|
21
|
+
protected sendCustomPing = () => {
|
|
22
|
+
this.send({
|
|
23
|
+
event: 'ping'
|
|
24
|
+
})
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
protected messageIsHeartbeat(msg: any) {
|
|
28
|
+
return msg.event === 'pong'
|
|
29
|
+
}
|
|
30
|
+
|
|
25
31
|
protected messageIsError(message: any): boolean {
|
|
26
|
-
return message.
|
|
32
|
+
return message.event === 'error'
|
|
27
33
|
}
|
|
28
34
|
}
|
|
@@ -202,6 +202,8 @@ export abstract class RealTimeFeedBase implements RealTimeFeedIterable {
|
|
|
202
202
|
|
|
203
203
|
protected abstract messageIsError(message: any): boolean
|
|
204
204
|
|
|
205
|
+
protected sendCustomPing: (() => void) | undefined = undefined
|
|
206
|
+
|
|
205
207
|
protected isIgnoredError(_message: any) {
|
|
206
208
|
return false
|
|
207
209
|
}
|
|
@@ -247,7 +249,11 @@ export abstract class RealTimeFeedBase implements RealTimeFeedIterable {
|
|
|
247
249
|
return
|
|
248
250
|
}
|
|
249
251
|
|
|
250
|
-
this.
|
|
252
|
+
if (this.sendCustomPing !== undefined) {
|
|
253
|
+
this.sendCustomPing()
|
|
254
|
+
} else {
|
|
255
|
+
this._ws.ping()
|
|
256
|
+
}
|
|
251
257
|
}, 5 * ONE_SEC_IN_MS)
|
|
252
258
|
}
|
|
253
259
|
|