tardis-dev 12.5.22 → 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 (100) 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 +10 -10
  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/bybit.d.ts +12 -1
  31. package/dist/mappers/bybit.d.ts.map +1 -1
  32. package/dist/mappers/bybit.js +21 -3
  33. package/dist/mappers/bybit.js.map +1 -1
  34. package/dist/mappers/coinbase.js +2 -2
  35. package/dist/mappers/coinbase.js.map +1 -1
  36. package/dist/mappers/dydx.d.ts +6 -14
  37. package/dist/mappers/dydx.d.ts.map +1 -1
  38. package/dist/mappers/dydx.js +1 -1
  39. package/dist/mappers/dydx.js.map +1 -1
  40. package/dist/mappers/ftx.js +2 -2
  41. package/dist/mappers/ftx.js.map +1 -1
  42. package/dist/mappers/huobi.d.ts.map +1 -1
  43. package/dist/mappers/huobi.js +11 -11
  44. package/dist/mappers/huobi.js.map +1 -1
  45. package/dist/mappers/okex.js +14 -14
  46. package/dist/mappers/okex.js.map +1 -1
  47. package/dist/mappers/phemex.d.ts.map +1 -1
  48. package/dist/mappers/phemex.js.map +1 -1
  49. package/dist/realtimefeeds/ascendex.js +2 -2
  50. package/dist/realtimefeeds/ascendex.js.map +1 -1
  51. package/dist/realtimefeeds/binance.js +1 -1
  52. package/dist/realtimefeeds/binance.js.map +1 -1
  53. package/dist/realtimefeeds/bitmex.js +1 -1
  54. package/dist/realtimefeeds/bitmex.js.map +1 -1
  55. package/dist/realtimefeeds/ftx.js +1 -1
  56. package/dist/realtimefeeds/ftx.js.map +1 -1
  57. package/dist/realtimefeeds/huobi.js +7 -7
  58. package/dist/realtimefeeds/huobi.js.map +1 -1
  59. package/dist/realtimefeeds/okex.js +1 -1
  60. package/dist/realtimefeeds/okex.js.map +1 -1
  61. package/dist/realtimefeeds/realtimefeed.js +9 -9
  62. package/dist/realtimefeeds/realtimefeed.js.map +1 -1
  63. package/dist/replay.d.ts.map +1 -1
  64. package/dist/replay.js +75 -40
  65. package/dist/replay.js.map +1 -1
  66. package/dist/stream.js +4 -4
  67. package/dist/stream.js.map +1 -1
  68. package/dist/worker.js +12 -12
  69. package/dist/worker.js.map +1 -1
  70. package/package.json +19 -18
  71. package/src/computable/booksnapshot.ts +4 -2
  72. package/src/computable/tradebar.ts +4 -1
  73. package/src/downloaddatasets.ts +188 -188
  74. package/src/filter.ts +69 -69
  75. package/src/handy.ts +2 -2
  76. package/src/instrumentinfo.ts +1 -1
  77. package/src/mappers/ascendex.ts +156 -156
  78. package/src/mappers/binance.ts +6 -3
  79. package/src/mappers/bybit.ts +28 -4
  80. package/src/mappers/coinflex.ts +159 -159
  81. package/src/mappers/delta.ts +175 -175
  82. package/src/mappers/dydx.ts +303 -306
  83. package/src/mappers/gateio.ts +117 -117
  84. package/src/mappers/gateiofutures.ts +185 -185
  85. package/src/mappers/huobi.ts +4 -2
  86. package/src/mappers/phemex.ts +179 -177
  87. package/src/mappers/poloniex.ts +150 -150
  88. package/src/mappers/serum.ts +103 -103
  89. package/src/mappers/upbit.ts +104 -104
  90. package/src/realtimefeeds/ascendex.ts +65 -65
  91. package/src/realtimefeeds/coinflex.ts +29 -29
  92. package/src/realtimefeeds/delta.ts +27 -27
  93. package/src/realtimefeeds/dydx.ts +40 -40
  94. package/src/realtimefeeds/gateio.ts +41 -41
  95. package/src/realtimefeeds/gateiofutures.ts +90 -90
  96. package/src/realtimefeeds/poloniex.ts +28 -28
  97. package/src/realtimefeeds/realtimefeed.ts +2 -2
  98. package/src/realtimefeeds/upbit.ts +35 -35
  99. package/src/replay.ts +61 -18
  100. package/src/stream.ts +1 -1
@@ -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
+ }
@@ -1,175 +1,175 @@
1
- import { Mapper, PendingTickerInfoHelper } from './mapper'
2
- import { Trade, BookChange, DerivativeTicker } from '../types'
3
-
4
- const fromMicroSecondsToDate = (micros: number) => {
5
- const timestamp = new Date(micros / 1000)
6
- timestamp.μs = micros % 1000
7
-
8
- return timestamp
9
- }
10
-
11
- export class DeltaTradesMapper implements Mapper<'delta', Trade> {
12
- constructor(private _useV2Channels: boolean) {}
13
-
14
- canHandle(message: DeltaTrade) {
15
- return message.type === (this._useV2Channels ? 'all_trades' : 'recent_trade')
16
- }
17
-
18
- getFilters(symbols?: string[]) {
19
- return [
20
- {
21
- channel: this._useV2Channels ? 'all_trades' : 'recent_trade',
22
- symbols
23
- } as const
24
- ]
25
- }
26
-
27
- *map(message: DeltaTrade, localTimestamp: Date): IterableIterator<Trade> {
28
- yield {
29
- type: 'trade',
30
- symbol: message.symbol,
31
- exchange: 'delta',
32
- id: undefined,
33
- price: Number(message.price),
34
- amount: Number(message.size),
35
- side: message.buyer_role === 'taker' ? 'buy' : 'sell',
36
- timestamp: fromMicroSecondsToDate(message.timestamp),
37
- localTimestamp: localTimestamp
38
- }
39
- }
40
- }
41
-
42
- const mapBookLevel = (level: DeltaBookLevel) => {
43
- return {
44
- price: Number(level.limit_price),
45
- amount: Number(level.size)
46
- }
47
- }
48
-
49
- export const deltaBookChangeMapper: Mapper<'delta', BookChange> = {
50
- canHandle(message: DeltaL2OrderBook) {
51
- return message.type === 'l2_orderbook'
52
- },
53
-
54
- getFilters(symbols?: string[]) {
55
- return [
56
- {
57
- channel: 'l2_orderbook',
58
- symbols
59
- } as const
60
- ]
61
- },
62
-
63
- *map(message: DeltaL2OrderBook, localTimestamp: Date): IterableIterator<BookChange> {
64
- yield {
65
- type: 'book_change',
66
- symbol: message.symbol,
67
- exchange: 'delta',
68
- isSnapshot: true,
69
- bids: message.buy.map(mapBookLevel),
70
- asks: message.sell.map(mapBookLevel),
71
- timestamp: message.timestamp !== undefined ? fromMicroSecondsToDate(message.timestamp) : localTimestamp,
72
- localTimestamp
73
- }
74
- }
75
- }
76
-
77
- export class DeltaDerivativeTickerMapper implements Mapper<'delta', DerivativeTicker> {
78
- constructor(private _useV2Channels: boolean) {}
79
-
80
- private readonly pendingTickerInfoHelper = new PendingTickerInfoHelper()
81
-
82
- canHandle(message: DeltaTrade | DeltaMarkPrice | DeltaFundingRate) {
83
- return (
84
- message.type === (this._useV2Channels ? 'all_trades' : 'recent_trade') ||
85
- message.type === 'funding_rate' ||
86
- message.type === 'mark_price'
87
- )
88
- }
89
-
90
- getFilters(symbols?: string[]) {
91
- return [
92
- {
93
- channel: this._useV2Channels ? 'all_trades' : 'recent_trade',
94
- symbols
95
- } as const,
96
- {
97
- channel: 'funding_rate',
98
- symbols
99
- } as const,
100
- {
101
- channel: 'mark_price',
102
- symbols
103
- } as const
104
- ]
105
- }
106
-
107
- *map(message: DeltaTrade | DeltaMarkPrice | DeltaFundingRate, localTimestamp: Date): IterableIterator<DerivativeTicker> {
108
- const pendingTickerInfo = this.pendingTickerInfoHelper.getPendingTickerInfo(message.symbol.replace('MARK:', ''), 'delta')
109
-
110
- if (message.type === 'recent_trade' || message.type === 'all_trades') {
111
- pendingTickerInfo.updateLastPrice(Number(message.price))
112
- }
113
- if (message.type === 'mark_price') {
114
- pendingTickerInfo.updateMarkPrice(Number(message.price))
115
- }
116
-
117
- if (message.type === 'funding_rate') {
118
- if (message.funding_rate !== undefined) {
119
- pendingTickerInfo.updateFundingRate(Number(message.funding_rate))
120
- }
121
-
122
- if (message.predicted_funding_rate !== undefined) {
123
- pendingTickerInfo.updatePredictedFundingRate(Number(message.predicted_funding_rate))
124
- }
125
-
126
- if (message.next_funding_realization !== undefined) {
127
- pendingTickerInfo.updateFundingTimestamp(fromMicroSecondsToDate(message.next_funding_realization))
128
- }
129
- }
130
-
131
- pendingTickerInfo.updateTimestamp(fromMicroSecondsToDate(message.timestamp))
132
-
133
- if (pendingTickerInfo.hasChanged()) {
134
- yield pendingTickerInfo.getSnapshot(localTimestamp)
135
- }
136
- }
137
- }
138
-
139
- type DeltaTrade = {
140
- buyer_role: 'taker' | 'maker'
141
- price: string
142
- size: number | string
143
- symbol: string
144
- timestamp: number
145
- type: 'recent_trade' | 'all_trades'
146
- }
147
-
148
- type DeltaBookLevel = {
149
- limit_price: string
150
- size: number | string
151
- }
152
-
153
- type DeltaL2OrderBook = {
154
- buy: DeltaBookLevel[]
155
- sell: DeltaBookLevel[]
156
- symbol: string
157
- timestamp?: number
158
- type: 'l2_orderbook'
159
- }
160
-
161
- type DeltaMarkPrice = {
162
- price: string
163
- symbol: string
164
- timestamp: number
165
- type: 'mark_price'
166
- }
167
-
168
- type DeltaFundingRate = {
169
- funding_rate?: string | number
170
- next_funding_realization?: number
171
- predicted_funding_rate?: number
172
- symbol: string
173
- timestamp: number
174
- type: 'funding_rate'
175
- }
1
+ import { Mapper, PendingTickerInfoHelper } from './mapper'
2
+ import { Trade, BookChange, DerivativeTicker } from '../types'
3
+
4
+ const fromMicroSecondsToDate = (micros: number) => {
5
+ const timestamp = new Date(micros / 1000)
6
+ timestamp.μs = micros % 1000
7
+
8
+ return timestamp
9
+ }
10
+
11
+ export class DeltaTradesMapper implements Mapper<'delta', Trade> {
12
+ constructor(private _useV2Channels: boolean) {}
13
+
14
+ canHandle(message: DeltaTrade) {
15
+ return message.type === (this._useV2Channels ? 'all_trades' : 'recent_trade')
16
+ }
17
+
18
+ getFilters(symbols?: string[]) {
19
+ return [
20
+ {
21
+ channel: this._useV2Channels ? 'all_trades' : 'recent_trade',
22
+ symbols
23
+ } as const
24
+ ]
25
+ }
26
+
27
+ *map(message: DeltaTrade, localTimestamp: Date): IterableIterator<Trade> {
28
+ yield {
29
+ type: 'trade',
30
+ symbol: message.symbol,
31
+ exchange: 'delta',
32
+ id: undefined,
33
+ price: Number(message.price),
34
+ amount: Number(message.size),
35
+ side: message.buyer_role === 'taker' ? 'buy' : 'sell',
36
+ timestamp: fromMicroSecondsToDate(message.timestamp),
37
+ localTimestamp: localTimestamp
38
+ }
39
+ }
40
+ }
41
+
42
+ const mapBookLevel = (level: DeltaBookLevel) => {
43
+ return {
44
+ price: Number(level.limit_price),
45
+ amount: Number(level.size)
46
+ }
47
+ }
48
+
49
+ export const deltaBookChangeMapper: Mapper<'delta', BookChange> = {
50
+ canHandle(message: DeltaL2OrderBook) {
51
+ return message.type === 'l2_orderbook'
52
+ },
53
+
54
+ getFilters(symbols?: string[]) {
55
+ return [
56
+ {
57
+ channel: 'l2_orderbook',
58
+ symbols
59
+ } as const
60
+ ]
61
+ },
62
+
63
+ *map(message: DeltaL2OrderBook, localTimestamp: Date): IterableIterator<BookChange> {
64
+ yield {
65
+ type: 'book_change',
66
+ symbol: message.symbol,
67
+ exchange: 'delta',
68
+ isSnapshot: true,
69
+ bids: message.buy.map(mapBookLevel),
70
+ asks: message.sell.map(mapBookLevel),
71
+ timestamp: message.timestamp !== undefined ? fromMicroSecondsToDate(message.timestamp) : localTimestamp,
72
+ localTimestamp
73
+ }
74
+ }
75
+ }
76
+
77
+ export class DeltaDerivativeTickerMapper implements Mapper<'delta', DerivativeTicker> {
78
+ constructor(private _useV2Channels: boolean) {}
79
+
80
+ private readonly pendingTickerInfoHelper = new PendingTickerInfoHelper()
81
+
82
+ canHandle(message: DeltaTrade | DeltaMarkPrice | DeltaFundingRate) {
83
+ return (
84
+ message.type === (this._useV2Channels ? 'all_trades' : 'recent_trade') ||
85
+ message.type === 'funding_rate' ||
86
+ message.type === 'mark_price'
87
+ )
88
+ }
89
+
90
+ getFilters(symbols?: string[]) {
91
+ return [
92
+ {
93
+ channel: this._useV2Channels ? 'all_trades' : 'recent_trade',
94
+ symbols
95
+ } as const,
96
+ {
97
+ channel: 'funding_rate',
98
+ symbols
99
+ } as const,
100
+ {
101
+ channel: 'mark_price',
102
+ symbols
103
+ } as const
104
+ ]
105
+ }
106
+
107
+ *map(message: DeltaTrade | DeltaMarkPrice | DeltaFundingRate, localTimestamp: Date): IterableIterator<DerivativeTicker> {
108
+ const pendingTickerInfo = this.pendingTickerInfoHelper.getPendingTickerInfo(message.symbol.replace('MARK:', ''), 'delta')
109
+
110
+ if (message.type === 'recent_trade' || message.type === 'all_trades') {
111
+ pendingTickerInfo.updateLastPrice(Number(message.price))
112
+ }
113
+ if (message.type === 'mark_price') {
114
+ pendingTickerInfo.updateMarkPrice(Number(message.price))
115
+ }
116
+
117
+ if (message.type === 'funding_rate') {
118
+ if (message.funding_rate !== undefined) {
119
+ pendingTickerInfo.updateFundingRate(Number(message.funding_rate))
120
+ }
121
+
122
+ if (message.predicted_funding_rate !== undefined) {
123
+ pendingTickerInfo.updatePredictedFundingRate(Number(message.predicted_funding_rate))
124
+ }
125
+
126
+ if (message.next_funding_realization !== undefined) {
127
+ pendingTickerInfo.updateFundingTimestamp(fromMicroSecondsToDate(message.next_funding_realization))
128
+ }
129
+ }
130
+
131
+ pendingTickerInfo.updateTimestamp(fromMicroSecondsToDate(message.timestamp))
132
+
133
+ if (pendingTickerInfo.hasChanged()) {
134
+ yield pendingTickerInfo.getSnapshot(localTimestamp)
135
+ }
136
+ }
137
+ }
138
+
139
+ type DeltaTrade = {
140
+ buyer_role: 'taker' | 'maker'
141
+ price: string
142
+ size: number | string
143
+ symbol: string
144
+ timestamp: number
145
+ type: 'recent_trade' | 'all_trades'
146
+ }
147
+
148
+ type DeltaBookLevel = {
149
+ limit_price: string
150
+ size: number | string
151
+ }
152
+
153
+ type DeltaL2OrderBook = {
154
+ buy: DeltaBookLevel[]
155
+ sell: DeltaBookLevel[]
156
+ symbol: string
157
+ timestamp?: number
158
+ type: 'l2_orderbook'
159
+ }
160
+
161
+ type DeltaMarkPrice = {
162
+ price: string
163
+ symbol: string
164
+ timestamp: number
165
+ type: 'mark_price'
166
+ }
167
+
168
+ type DeltaFundingRate = {
169
+ funding_rate?: string | number
170
+ next_funding_realization?: number
171
+ predicted_funding_rate?: number
172
+ symbol: string
173
+ timestamp: number
174
+ type: 'funding_rate'
175
+ }