tardis-dev 12.6.2 → 12.6.7

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.
Files changed (90) hide show
  1. package/dist/apikeyaccessinfo.js +1 -1
  2. package/dist/apikeyaccessinfo.js.map +1 -1
  3. package/dist/clearcache.js +12 -12
  4. package/dist/clearcache.js.map +1 -1
  5. package/dist/combine.js +1 -1
  6. package/dist/combine.js.map +1 -1
  7. package/dist/computable/booksnapshot.d.ts.map +1 -1
  8. package/dist/computable/booksnapshot.js +1 -1
  9. package/dist/computable/booksnapshot.js.map +1 -1
  10. package/dist/computable/tradebar.d.ts.map +1 -1
  11. package/dist/computable/tradebar.js.map +1 -1
  12. package/dist/debug.js +1 -1
  13. package/dist/debug.js.map +1 -1
  14. package/dist/downloaddatasets.js +13 -13
  15. package/dist/downloaddatasets.js.map +1 -1
  16. package/dist/exchangedetails.js +1 -1
  17. package/dist/exchangedetails.js.map +1 -1
  18. package/dist/filter.js.map +1 -1
  19. package/dist/handy.js +8 -8
  20. package/dist/handy.js.map +1 -1
  21. package/dist/instrumentinfo.js +1 -1
  22. package/dist/instrumentinfo.js.map +1 -1
  23. package/dist/mappers/binance.d.ts.map +1 -1
  24. package/dist/mappers/binance.js +2 -2
  25. package/dist/mappers/binance.js.map +1 -1
  26. package/dist/mappers/binanceoptions.js +10 -10
  27. package/dist/mappers/binanceoptions.js.map +1 -1
  28. package/dist/mappers/bitflyer.js +1 -1
  29. package/dist/mappers/bitflyer.js.map +1 -1
  30. package/dist/mappers/coinbase.js +2 -2
  31. package/dist/mappers/coinbase.js.map +1 -1
  32. package/dist/mappers/ftx.js +2 -2
  33. package/dist/mappers/ftx.js.map +1 -1
  34. package/dist/mappers/huobi.d.ts.map +1 -1
  35. package/dist/mappers/huobi.js +11 -11
  36. package/dist/mappers/huobi.js.map +1 -1
  37. package/dist/mappers/okex.js +14 -14
  38. package/dist/mappers/okex.js.map +1 -1
  39. package/dist/mappers/phemex.d.ts.map +1 -1
  40. package/dist/mappers/phemex.js.map +1 -1
  41. package/dist/realtimefeeds/ascendex.js +2 -2
  42. package/dist/realtimefeeds/ascendex.js.map +1 -1
  43. package/dist/realtimefeeds/binance.js +1 -1
  44. package/dist/realtimefeeds/binance.js.map +1 -1
  45. package/dist/realtimefeeds/bitmex.js +1 -1
  46. package/dist/realtimefeeds/bitmex.js.map +1 -1
  47. package/dist/realtimefeeds/ftx.js +1 -1
  48. package/dist/realtimefeeds/ftx.js.map +1 -1
  49. package/dist/realtimefeeds/huobi.js +7 -7
  50. package/dist/realtimefeeds/huobi.js.map +1 -1
  51. package/dist/realtimefeeds/okex.js +1 -1
  52. package/dist/realtimefeeds/okex.js.map +1 -1
  53. package/dist/realtimefeeds/realtimefeed.js +9 -9
  54. package/dist/realtimefeeds/realtimefeed.js.map +1 -1
  55. package/dist/replay.d.ts.map +1 -1
  56. package/dist/replay.js +34 -36
  57. package/dist/replay.js.map +1 -1
  58. package/dist/stream.js +4 -4
  59. package/dist/stream.js.map +1 -1
  60. package/dist/worker.js +12 -12
  61. package/dist/worker.js.map +1 -1
  62. package/package.json +19 -18
  63. package/src/computable/booksnapshot.ts +4 -2
  64. package/src/computable/tradebar.ts +4 -1
  65. package/src/downloaddatasets.ts +188 -188
  66. package/src/filter.ts +69 -69
  67. package/src/instrumentinfo.ts +1 -1
  68. package/src/mappers/ascendex.ts +156 -156
  69. package/src/mappers/binance.ts +6 -3
  70. package/src/mappers/coinflex.ts +159 -159
  71. package/src/mappers/delta.ts +175 -175
  72. package/src/mappers/dydx.ts +303 -303
  73. package/src/mappers/gateio.ts +117 -117
  74. package/src/mappers/gateiofutures.ts +185 -185
  75. package/src/mappers/huobi.ts +4 -2
  76. package/src/mappers/phemex.ts +179 -177
  77. package/src/mappers/poloniex.ts +150 -150
  78. package/src/mappers/serum.ts +103 -103
  79. package/src/mappers/upbit.ts +104 -104
  80. package/src/realtimefeeds/ascendex.ts +65 -65
  81. package/src/realtimefeeds/coinflex.ts +29 -29
  82. package/src/realtimefeeds/delta.ts +27 -27
  83. package/src/realtimefeeds/dydx.ts +40 -40
  84. package/src/realtimefeeds/gateio.ts +41 -41
  85. package/src/realtimefeeds/gateiofutures.ts +90 -90
  86. package/src/realtimefeeds/poloniex.ts +28 -28
  87. package/src/realtimefeeds/realtimefeed.ts +2 -2
  88. package/src/realtimefeeds/upbit.ts +35 -35
  89. package/src/replay.ts +7 -8
  90. package/src/stream.ts +1 -1
@@ -1,156 +1,156 @@
1
- import { Mapper, PendingTickerInfoHelper } from './mapper'
2
- import { Trade, BookChange, DerivativeTicker } from '../types'
3
-
4
- export class AscendexTradesMapper implements Mapper<'ascendex', Trade> {
5
- canHandle(message: AscendexTrade) {
6
- return message.m === 'trades'
7
- }
8
-
9
- getFilters(symbols?: string[]) {
10
- return [
11
- {
12
- channel: 'trades',
13
- symbols
14
- } as const
15
- ]
16
- }
17
-
18
- *map(message: AscendexTrade, localTimestamp: Date): IterableIterator<Trade> {
19
- for (let trade of message.data) {
20
- yield {
21
- type: 'trade',
22
- symbol: message.symbol,
23
- exchange: 'ascendex',
24
- id: undefined,
25
- price: Number(trade.p),
26
- amount: Number(trade.q),
27
- side: trade.bm === true ? 'sell' : 'buy',
28
- timestamp: new Date(trade.ts),
29
- localTimestamp: localTimestamp
30
- }
31
- }
32
- }
33
- }
34
-
35
- export class AscendexBookChangeMapper implements Mapper<'ascendex', BookChange> {
36
- canHandle(message: AscendexDepthRealTime | AscendexDepthRealTimeSnapshot) {
37
- return message.m === 'depth-realtime' || message.m === 'depth-snapshot-realtime'
38
- }
39
-
40
- getFilters(symbols?: string[]) {
41
- return [
42
- {
43
- channel: 'depth-realtime',
44
- symbols
45
- } as const,
46
- {
47
- channel: 'depth-snapshot-realtime',
48
- symbols
49
- } as const
50
- ]
51
- }
52
-
53
- *map(message: AscendexDepthRealTime | AscendexDepthRealTimeSnapshot, localTimestamp: Date): IterableIterator<BookChange> {
54
- yield {
55
- type: 'book_change',
56
- symbol: message.symbol,
57
- exchange: 'ascendex',
58
- isSnapshot: message.m === 'depth-snapshot-realtime',
59
- bids: message.data.bids.map(this.mapBookLevel),
60
- asks: message.data.asks.map(this.mapBookLevel),
61
- timestamp: message.data.ts > 0 ? new Date(message.data.ts) : localTimestamp,
62
- localTimestamp
63
- }
64
- }
65
-
66
- protected mapBookLevel(level: AscendexPriceLevel) {
67
- const price = Number(level[0])
68
- const amount = Number(level[1])
69
- return { price, amount }
70
- }
71
- }
72
-
73
- export class AscendexDerivativeTickerMapper implements Mapper<'ascendex', DerivativeTicker> {
74
- private readonly pendingTickerInfoHelper = new PendingTickerInfoHelper()
75
-
76
- canHandle(message: AscendexFuturesData | AscendexTrade) {
77
- return message.m === 'futures-pricing-data' || message.m === 'trades'
78
- }
79
-
80
- getFilters(symbols?: string[]) {
81
- return [
82
- {
83
- channel: 'futures-pricing-data',
84
- symbols: [] as string[]
85
- } as const,
86
- {
87
- channel: 'trades',
88
- symbols
89
- } as const
90
- ]
91
- }
92
-
93
- *map(message: AscendexFuturesData | AscendexTrade, localTimestamp: Date): IterableIterator<DerivativeTicker> {
94
- if (message.m === 'trades') {
95
- const pendingTickerInfo = this.pendingTickerInfoHelper.getPendingTickerInfo(message.symbol, 'ascendex')
96
- pendingTickerInfo.updateLastPrice(Number(message.data[message.data.length - 1].p))
97
- return
98
- }
99
-
100
- for (const futuresData of message.con) {
101
- const pendingTickerInfo = this.pendingTickerInfoHelper.getPendingTickerInfo(futuresData.s, 'ascendex')
102
-
103
- pendingTickerInfo.updateIndexPrice(Number(futuresData.ip))
104
- pendingTickerInfo.updateMarkPrice(Number(futuresData.mp))
105
- pendingTickerInfo.updateOpenInterest(Number(futuresData.oi))
106
- pendingTickerInfo.updateTimestamp(new Date(futuresData.t))
107
- pendingTickerInfo.updateFundingTimestamp(new Date(futuresData.f))
108
- pendingTickerInfo.updateFundingRate(Number(futuresData.r))
109
-
110
- if (pendingTickerInfo.hasChanged()) {
111
- yield pendingTickerInfo.getSnapshot(localTimestamp)
112
- }
113
- }
114
- }
115
- }
116
-
117
- type AscendexTrade = {
118
- m: 'trades'
119
- symbol: string
120
- data: [{ p: string; q: string; ts: number; bm: boolean; seqnum: number }]
121
- }
122
-
123
- type AscendexPriceLevel = [string, string]
124
-
125
- type AscendexDepthRealTime = {
126
- m: 'depth-realtime'
127
- symbol: 'XRP/USDT'
128
- data: { ts: 1621814400204; seqnum: 39862426; asks: AscendexPriceLevel[]; bids: AscendexPriceLevel[] }
129
- }
130
-
131
- type AscendexDepthRealTimeSnapshot = {
132
- m: 'depth-snapshot-realtime'
133
- symbol: 'XRP/USDT'
134
- data: {
135
- ts: 0
136
- seqnum: 39862426
137
- asks: AscendexPriceLevel[]
138
- bids: AscendexPriceLevel[]
139
- }
140
- }
141
-
142
- type AscendexFuturesData = {
143
- m: 'futures-pricing-data'
144
- con: [
145
- {
146
- t: 1621814404114
147
- s: 'BTC-PERP'
148
- mp: '34878.075977904'
149
- ip: '34697.17'
150
- oi: '80.6126'
151
- r: '0.000093633'
152
- f: 1621843200000
153
- fi: 28800000
154
- }
155
- ]
156
- }
1
+ import { Mapper, PendingTickerInfoHelper } from './mapper'
2
+ import { Trade, BookChange, DerivativeTicker } from '../types'
3
+
4
+ export class AscendexTradesMapper implements Mapper<'ascendex', Trade> {
5
+ canHandle(message: AscendexTrade) {
6
+ return message.m === 'trades'
7
+ }
8
+
9
+ getFilters(symbols?: string[]) {
10
+ return [
11
+ {
12
+ channel: 'trades',
13
+ symbols
14
+ } as const
15
+ ]
16
+ }
17
+
18
+ *map(message: AscendexTrade, localTimestamp: Date): IterableIterator<Trade> {
19
+ for (let trade of message.data) {
20
+ yield {
21
+ type: 'trade',
22
+ symbol: message.symbol,
23
+ exchange: 'ascendex',
24
+ id: undefined,
25
+ price: Number(trade.p),
26
+ amount: Number(trade.q),
27
+ side: trade.bm === true ? 'sell' : 'buy',
28
+ timestamp: new Date(trade.ts),
29
+ localTimestamp: localTimestamp
30
+ }
31
+ }
32
+ }
33
+ }
34
+
35
+ export class AscendexBookChangeMapper implements Mapper<'ascendex', BookChange> {
36
+ canHandle(message: AscendexDepthRealTime | AscendexDepthRealTimeSnapshot) {
37
+ return message.m === 'depth-realtime' || message.m === 'depth-snapshot-realtime'
38
+ }
39
+
40
+ getFilters(symbols?: string[]) {
41
+ return [
42
+ {
43
+ channel: 'depth-realtime',
44
+ symbols
45
+ } as const,
46
+ {
47
+ channel: 'depth-snapshot-realtime',
48
+ symbols
49
+ } as const
50
+ ]
51
+ }
52
+
53
+ *map(message: AscendexDepthRealTime | AscendexDepthRealTimeSnapshot, localTimestamp: Date): IterableIterator<BookChange> {
54
+ yield {
55
+ type: 'book_change',
56
+ symbol: message.symbol,
57
+ exchange: 'ascendex',
58
+ isSnapshot: message.m === 'depth-snapshot-realtime',
59
+ bids: message.data.bids.map(this.mapBookLevel),
60
+ asks: message.data.asks.map(this.mapBookLevel),
61
+ timestamp: message.data.ts > 0 ? new Date(message.data.ts) : localTimestamp,
62
+ localTimestamp
63
+ }
64
+ }
65
+
66
+ protected mapBookLevel(level: AscendexPriceLevel) {
67
+ const price = Number(level[0])
68
+ const amount = Number(level[1])
69
+ return { price, amount }
70
+ }
71
+ }
72
+
73
+ export class AscendexDerivativeTickerMapper implements Mapper<'ascendex', DerivativeTicker> {
74
+ private readonly pendingTickerInfoHelper = new PendingTickerInfoHelper()
75
+
76
+ canHandle(message: AscendexFuturesData | AscendexTrade) {
77
+ return message.m === 'futures-pricing-data' || message.m === 'trades'
78
+ }
79
+
80
+ getFilters(symbols?: string[]) {
81
+ return [
82
+ {
83
+ channel: 'futures-pricing-data',
84
+ symbols: [] as string[]
85
+ } as const,
86
+ {
87
+ channel: 'trades',
88
+ symbols
89
+ } as const
90
+ ]
91
+ }
92
+
93
+ *map(message: AscendexFuturesData | AscendexTrade, localTimestamp: Date): IterableIterator<DerivativeTicker> {
94
+ if (message.m === 'trades') {
95
+ const pendingTickerInfo = this.pendingTickerInfoHelper.getPendingTickerInfo(message.symbol, 'ascendex')
96
+ pendingTickerInfo.updateLastPrice(Number(message.data[message.data.length - 1].p))
97
+ return
98
+ }
99
+
100
+ for (const futuresData of message.con) {
101
+ const pendingTickerInfo = this.pendingTickerInfoHelper.getPendingTickerInfo(futuresData.s, 'ascendex')
102
+
103
+ pendingTickerInfo.updateIndexPrice(Number(futuresData.ip))
104
+ pendingTickerInfo.updateMarkPrice(Number(futuresData.mp))
105
+ pendingTickerInfo.updateOpenInterest(Number(futuresData.oi))
106
+ pendingTickerInfo.updateTimestamp(new Date(futuresData.t))
107
+ pendingTickerInfo.updateFundingTimestamp(new Date(futuresData.f))
108
+ pendingTickerInfo.updateFundingRate(Number(futuresData.r))
109
+
110
+ if (pendingTickerInfo.hasChanged()) {
111
+ yield pendingTickerInfo.getSnapshot(localTimestamp)
112
+ }
113
+ }
114
+ }
115
+ }
116
+
117
+ type AscendexTrade = {
118
+ m: 'trades'
119
+ symbol: string
120
+ data: [{ p: string; q: string; ts: number; bm: boolean; seqnum: number }]
121
+ }
122
+
123
+ type AscendexPriceLevel = [string, string]
124
+
125
+ type AscendexDepthRealTime = {
126
+ m: 'depth-realtime'
127
+ symbol: 'XRP/USDT'
128
+ data: { ts: 1621814400204; seqnum: 39862426; asks: AscendexPriceLevel[]; bids: AscendexPriceLevel[] }
129
+ }
130
+
131
+ type AscendexDepthRealTimeSnapshot = {
132
+ m: 'depth-snapshot-realtime'
133
+ symbol: 'XRP/USDT'
134
+ data: {
135
+ ts: 0
136
+ seqnum: 39862426
137
+ asks: AscendexPriceLevel[]
138
+ bids: AscendexPriceLevel[]
139
+ }
140
+ }
141
+
142
+ type AscendexFuturesData = {
143
+ m: 'futures-pricing-data'
144
+ con: [
145
+ {
146
+ t: 1621814404114
147
+ s: 'BTC-PERP'
148
+ mp: '34878.075977904'
149
+ ip: '34697.17'
150
+ oi: '80.6126'
151
+ r: '0.000093633'
152
+ f: 1621843200000
153
+ fi: 28800000
154
+ }
155
+ ]
156
+ }
@@ -6,7 +6,8 @@ import { Mapper, PendingTickerInfoHelper } from './mapper'
6
6
  // https://github.com/binance-exchange/binance-official-api-docs/blob/master/web-socket-streams.md
7
7
 
8
8
  export class BinanceTradesMapper
9
- implements Mapper<'binance' | 'binance-jersey' | 'binance-us' | 'binance-futures' | 'binance-delivery', Trade> {
9
+ implements Mapper<'binance' | 'binance-jersey' | 'binance-us' | 'binance-futures' | 'binance-delivery', Trade>
10
+ {
10
11
  constructor(private readonly _exchange: Exchange) {}
11
12
 
12
13
  canHandle(message: BinanceResponse<any>) {
@@ -53,7 +54,8 @@ export class BinanceTradesMapper
53
54
  }
54
55
 
55
56
  export class BinanceBookChangeMapper
56
- implements Mapper<'binance' | 'binance-jersey' | 'binance-us' | 'binance-futures' | 'binance-delivery', BookChange> {
57
+ implements Mapper<'binance' | 'binance-jersey' | 'binance-us' | 'binance-futures' | 'binance-delivery', BookChange>
58
+ {
57
59
  protected readonly symbolToDepthInfoMapping: {
58
60
  [key: string]: LocalDepthInfo
59
61
  } = {}
@@ -213,7 +215,8 @@ export class BinanceBookChangeMapper
213
215
 
214
216
  export class BinanceFuturesBookChangeMapper
215
217
  extends BinanceBookChangeMapper
216
- implements Mapper<'binance-futures' | 'binance-delivery', BookChange> {
218
+ implements Mapper<'binance-futures' | 'binance-delivery', BookChange>
219
+ {
217
220
  constructor(protected readonly exchange: Exchange, protected readonly ignoreBookSnapshotOverlapError: boolean) {
218
221
  super(exchange, ignoreBookSnapshotOverlapError)
219
222
  }
@@ -1,159 +1,159 @@
1
- import { BookChange, Trade, DerivativeTicker } from '../types'
2
- import { Mapper, PendingTickerInfoHelper } from './mapper'
3
-
4
- // https://docs.coinflex.com/v2/#websocket-api-subscriptions-public
5
-
6
- export const coinflexTradesMapper: Mapper<'coinflex', Trade> = {
7
- canHandle(message: CoinflexTrades) {
8
- return message.table === 'trade'
9
- },
10
-
11
- getFilters(symbols?: string[]) {
12
- return [
13
- {
14
- channel: 'trade',
15
- symbols
16
- }
17
- ]
18
- },
19
-
20
- *map(coinflexTrades: CoinflexTrades, localTimestamp: Date): IterableIterator<Trade> {
21
- for (const trade of coinflexTrades.data) {
22
- yield {
23
- type: 'trade',
24
- symbol: trade.marketCode,
25
- exchange: 'coinflex',
26
- id: trade.tradeId,
27
- price: Number(trade.price),
28
- amount: Number(trade.quantity),
29
- side: trade.side === 'SELL' ? 'sell' : 'buy',
30
- timestamp: new Date(Number(trade.timestamp)),
31
- localTimestamp: localTimestamp
32
- }
33
- }
34
- }
35
- }
36
-
37
- const mapBookLevel = (level: CoinflexBookLevel) => {
38
- const price = Number(level[0])
39
- const amount = Number(level[1])
40
-
41
- return { price, amount }
42
- }
43
-
44
- export const coinflexBookChangeMapper: Mapper<'coinflex', BookChange> = {
45
- canHandle(message: CoinflexBookDepthMessage) {
46
- return message.table === 'futures/depth'
47
- },
48
-
49
- getFilters(symbols?: string[]) {
50
- return [
51
- {
52
- channel: 'futures/depth',
53
- symbols
54
- }
55
- ]
56
- },
57
-
58
- *map(depthMessage: CoinflexBookDepthMessage, localTimestamp: Date): IterableIterator<BookChange> {
59
- for (const change of depthMessage.data) {
60
- yield {
61
- type: 'book_change',
62
- symbol: change.instrumentId,
63
- exchange: 'coinflex',
64
- isSnapshot: depthMessage.action === 'partial',
65
- bids: change.bids.map(mapBookLevel),
66
- asks: change.asks.map(mapBookLevel),
67
- timestamp: new Date(Number(change.timestamp)),
68
- localTimestamp
69
- }
70
- }
71
- }
72
- }
73
-
74
- export class CoinflexDerivativeTickerMapper implements Mapper<'coinflex', DerivativeTicker> {
75
- private readonly pendingTickerInfoHelper = new PendingTickerInfoHelper()
76
-
77
- canHandle(message: CoinflexTickerMessage) {
78
- return message.table === 'ticker'
79
- }
80
-
81
- getFilters(symbols?: string[]) {
82
- return [
83
- {
84
- channel: 'ticker',
85
- symbols
86
- } as const
87
- ]
88
- }
89
-
90
- *map(message: CoinflexTickerMessage, localTimestamp: Date): IterableIterator<DerivativeTicker> {
91
- for (const ticker of message.data) {
92
- // exclude spot symbols
93
- if (ticker.marketCode.split('-').length === 2) {
94
- continue
95
- }
96
-
97
- const pendingTickerInfo = this.pendingTickerInfoHelper.getPendingTickerInfo(ticker.marketCode, 'coinflex')
98
-
99
- if (ticker.markPrice !== undefined) {
100
- pendingTickerInfo.updateMarkPrice(Number(ticker.markPrice))
101
- }
102
-
103
- if (ticker.openInterest !== undefined) {
104
- pendingTickerInfo.updateOpenInterest(Number(ticker.openInterest))
105
- }
106
- if (ticker.last !== undefined) {
107
- pendingTickerInfo.updateLastPrice(Number(ticker.last))
108
- }
109
-
110
- pendingTickerInfo.updateTimestamp(new Date(Number(ticker.timestamp)))
111
-
112
- if (pendingTickerInfo.hasChanged()) {
113
- yield pendingTickerInfo.getSnapshot(localTimestamp)
114
- }
115
- }
116
- }
117
- }
118
-
119
- type CoinflexTrades = {
120
- data: [
121
- {
122
- side: 'SELL' | 'BUY'
123
- quantity: string
124
- price: string
125
- marketCode: string
126
- tradeId: string
127
- timestamp: string
128
- }
129
- ]
130
- table: 'trade'
131
- }
132
-
133
- type CoinflexBookLevel = [number | string, number | string]
134
-
135
- type CoinflexBookDepthMessage = {
136
- data: [
137
- {
138
- instrumentId: string
139
- asks: CoinflexBookLevel[]
140
- bids: CoinflexBookLevel[]
141
- timestamp: string
142
- }
143
- ]
144
- action: 'partial'
145
- table: 'futures/depth'
146
- }
147
-
148
- type CoinflexTickerMessage = {
149
- data: [
150
- {
151
- last: string
152
- markPrice?: string
153
- marketCode: string
154
- openInterest: string
155
- timestamp: string
156
- }
157
- ]
158
- table: 'ticker'
159
- }
1
+ import { BookChange, Trade, DerivativeTicker } from '../types'
2
+ import { Mapper, PendingTickerInfoHelper } from './mapper'
3
+
4
+ // https://docs.coinflex.com/v2/#websocket-api-subscriptions-public
5
+
6
+ export const coinflexTradesMapper: Mapper<'coinflex', Trade> = {
7
+ canHandle(message: CoinflexTrades) {
8
+ return message.table === 'trade'
9
+ },
10
+
11
+ getFilters(symbols?: string[]) {
12
+ return [
13
+ {
14
+ channel: 'trade',
15
+ symbols
16
+ }
17
+ ]
18
+ },
19
+
20
+ *map(coinflexTrades: CoinflexTrades, localTimestamp: Date): IterableIterator<Trade> {
21
+ for (const trade of coinflexTrades.data) {
22
+ yield {
23
+ type: 'trade',
24
+ symbol: trade.marketCode,
25
+ exchange: 'coinflex',
26
+ id: trade.tradeId,
27
+ price: Number(trade.price),
28
+ amount: Number(trade.quantity),
29
+ side: trade.side === 'SELL' ? 'sell' : 'buy',
30
+ timestamp: new Date(Number(trade.timestamp)),
31
+ localTimestamp: localTimestamp
32
+ }
33
+ }
34
+ }
35
+ }
36
+
37
+ const mapBookLevel = (level: CoinflexBookLevel) => {
38
+ const price = Number(level[0])
39
+ const amount = Number(level[1])
40
+
41
+ return { price, amount }
42
+ }
43
+
44
+ export const coinflexBookChangeMapper: Mapper<'coinflex', BookChange> = {
45
+ canHandle(message: CoinflexBookDepthMessage) {
46
+ return message.table === 'futures/depth'
47
+ },
48
+
49
+ getFilters(symbols?: string[]) {
50
+ return [
51
+ {
52
+ channel: 'futures/depth',
53
+ symbols
54
+ }
55
+ ]
56
+ },
57
+
58
+ *map(depthMessage: CoinflexBookDepthMessage, localTimestamp: Date): IterableIterator<BookChange> {
59
+ for (const change of depthMessage.data) {
60
+ yield {
61
+ type: 'book_change',
62
+ symbol: change.instrumentId,
63
+ exchange: 'coinflex',
64
+ isSnapshot: depthMessage.action === 'partial',
65
+ bids: change.bids.map(mapBookLevel),
66
+ asks: change.asks.map(mapBookLevel),
67
+ timestamp: new Date(Number(change.timestamp)),
68
+ localTimestamp
69
+ }
70
+ }
71
+ }
72
+ }
73
+
74
+ export class CoinflexDerivativeTickerMapper implements Mapper<'coinflex', DerivativeTicker> {
75
+ private readonly pendingTickerInfoHelper = new PendingTickerInfoHelper()
76
+
77
+ canHandle(message: CoinflexTickerMessage) {
78
+ return message.table === 'ticker'
79
+ }
80
+
81
+ getFilters(symbols?: string[]) {
82
+ return [
83
+ {
84
+ channel: 'ticker',
85
+ symbols
86
+ } as const
87
+ ]
88
+ }
89
+
90
+ *map(message: CoinflexTickerMessage, localTimestamp: Date): IterableIterator<DerivativeTicker> {
91
+ for (const ticker of message.data) {
92
+ // exclude spot symbols
93
+ if (ticker.marketCode.split('-').length === 2) {
94
+ continue
95
+ }
96
+
97
+ const pendingTickerInfo = this.pendingTickerInfoHelper.getPendingTickerInfo(ticker.marketCode, 'coinflex')
98
+
99
+ if (ticker.markPrice !== undefined) {
100
+ pendingTickerInfo.updateMarkPrice(Number(ticker.markPrice))
101
+ }
102
+
103
+ if (ticker.openInterest !== undefined) {
104
+ pendingTickerInfo.updateOpenInterest(Number(ticker.openInterest))
105
+ }
106
+ if (ticker.last !== undefined) {
107
+ pendingTickerInfo.updateLastPrice(Number(ticker.last))
108
+ }
109
+
110
+ pendingTickerInfo.updateTimestamp(new Date(Number(ticker.timestamp)))
111
+
112
+ if (pendingTickerInfo.hasChanged()) {
113
+ yield pendingTickerInfo.getSnapshot(localTimestamp)
114
+ }
115
+ }
116
+ }
117
+ }
118
+
119
+ type CoinflexTrades = {
120
+ data: [
121
+ {
122
+ side: 'SELL' | 'BUY'
123
+ quantity: string
124
+ price: string
125
+ marketCode: string
126
+ tradeId: string
127
+ timestamp: string
128
+ }
129
+ ]
130
+ table: 'trade'
131
+ }
132
+
133
+ type CoinflexBookLevel = [number | string, number | string]
134
+
135
+ type CoinflexBookDepthMessage = {
136
+ data: [
137
+ {
138
+ instrumentId: string
139
+ asks: CoinflexBookLevel[]
140
+ bids: CoinflexBookLevel[]
141
+ timestamp: string
142
+ }
143
+ ]
144
+ action: 'partial'
145
+ table: 'futures/depth'
146
+ }
147
+
148
+ type CoinflexTickerMessage = {
149
+ data: [
150
+ {
151
+ last: string
152
+ markPrice?: string
153
+ marketCode: string
154
+ openInterest: string
155
+ timestamp: string
156
+ }
157
+ ]
158
+ table: 'ticker'
159
+ }