tardis-dev 13.21.6 → 13.22.1

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.
@@ -29,6 +29,7 @@ type CoinbaseLevel2Snapshot = {
29
29
  product_id: string;
30
30
  bids: CoinbaseSnapshotBookLevel[];
31
31
  asks: CoinbaseSnapshotBookLevel[];
32
+ time?: string;
32
33
  };
33
34
  type CoinbaseUpdateBookLevel = ['buy' | 'sell', string, string];
34
35
  type CoinbaseLevel2Update = {
@@ -1 +1 @@
1
- {"version":3,"file":"coinbase.d.ts","sourceRoot":"","sources":["../../src/mappers/coinbase.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAkB,UAAU,EAAE,KAAK,EAAE,MAAM,UAAU,CAAA;AACxE,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAA;AAIjC,eAAO,MAAM,oBAAoB,EAAE,MAAM,CAAC,UAAU,EAAE,KAAK,CAgC1D,CAAA;AA2BD,qBAAa,uBAAwB,YAAW,MAAM,CAAC,UAAU,EAAE,UAAU,CAAC;IAC5E,OAAO,CAAC,QAAQ,CAAC,uBAAuB,CAA0B;IAElE,SAAS,CAAC,OAAO,EAAE,aAAa,GAAG,sBAAsB,GAAG,oBAAoB;IAIhF,UAAU,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE;;;;;;;IAe5B,GAAG,CAAC,OAAO,EAAE,oBAAoB,GAAG,sBAAsB,EAAE,cAAc,EAAE,IAAI,GAAG,gBAAgB,CAAC,UAAU,CAAC;CAuCjH;AAED,eAAO,MAAM,wBAAwB,EAAE,MAAM,CAAC,UAAU,EAAE,UAAU,CAqCnE,CAAA;AAED,KAAK,aAAa,GAAG;IACnB,IAAI,EAAE,OAAO,CAAA;IACb,QAAQ,EAAE,MAAM,CAAA;IAChB,IAAI,EAAE,MAAM,CAAA;IACZ,UAAU,EAAE,MAAM,CAAA;IAClB,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,EAAE,MAAM,GAAG,KAAK,CAAA;CACrB,CAAA;AAED,KAAK,yBAAyB,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;AAEjD,KAAK,sBAAsB,GAAG;IAC5B,IAAI,EAAE,UAAU,CAAA;IAChB,UAAU,EAAE,MAAM,CAAA;IAClB,IAAI,EAAE,yBAAyB,EAAE,CAAA;IACjC,IAAI,EAAE,yBAAyB,EAAE,CAAA;CAClC,CAAA;AAED,KAAK,uBAAuB,GAAG,CAAC,KAAK,GAAG,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;AAE/D,KAAK,oBAAoB,GAAG;IAC1B,IAAI,EAAE,UAAU,CAAA;IAChB,UAAU,EAAE,MAAM,CAAA;IAClB,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,EAAE,uBAAuB,EAAE,CAAA;CACnC,CAAA"}
1
+ {"version":3,"file":"coinbase.d.ts","sourceRoot":"","sources":["../../src/mappers/coinbase.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAkB,UAAU,EAAE,KAAK,EAAE,MAAM,UAAU,CAAA;AACxE,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAA;AAIjC,eAAO,MAAM,oBAAoB,EAAE,MAAM,CAAC,UAAU,EAAE,KAAK,CAgC1D,CAAA;AA2BD,qBAAa,uBAAwB,YAAW,MAAM,CAAC,UAAU,EAAE,UAAU,CAAC;IAC5E,OAAO,CAAC,QAAQ,CAAC,uBAAuB,CAA0B;IAElE,SAAS,CAAC,OAAO,EAAE,aAAa,GAAG,sBAAsB,GAAG,oBAAoB;IAIhF,UAAU,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE;;;;;;;IAe5B,GAAG,CAAC,OAAO,EAAE,oBAAoB,GAAG,sBAAsB,EAAE,cAAc,EAAE,IAAI,GAAG,gBAAgB,CAAC,UAAU,CAAC;CAmDjH;AAED,eAAO,MAAM,wBAAwB,EAAE,MAAM,CAAC,UAAU,EAAE,UAAU,CAqCnE,CAAA;AAED,KAAK,aAAa,GAAG;IACnB,IAAI,EAAE,OAAO,CAAA;IACb,QAAQ,EAAE,MAAM,CAAA;IAChB,IAAI,EAAE,MAAM,CAAA;IACZ,UAAU,EAAE,MAAM,CAAA;IAClB,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,EAAE,MAAM,GAAG,KAAK,CAAA;CACrB,CAAA;AAED,KAAK,yBAAyB,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;AAEjD,KAAK,sBAAsB,GAAG;IAC5B,IAAI,EAAE,UAAU,CAAA;IAChB,UAAU,EAAE,MAAM,CAAA;IAClB,IAAI,EAAE,yBAAyB,EAAE,CAAA;IACjC,IAAI,EAAE,yBAAyB,EAAE,CAAA;IACjC,IAAI,CAAC,EAAE,MAAM,CAAA;CACd,CAAA;AAED,KAAK,uBAAuB,GAAG,CAAC,KAAK,GAAG,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;AAE/D,KAAK,oBAAoB,GAAG;IAC1B,IAAI,EAAE,UAAU,CAAA;IAChB,UAAU,EAAE,MAAM,CAAA;IAClB,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,EAAE,uBAAuB,EAAE,CAAA;CACnC,CAAA"}
@@ -73,6 +73,19 @@ class CoinbaseBookChangMapper {
73
73
  }
74
74
  *map(message, localTimestamp) {
75
75
  if (message.type === 'snapshot') {
76
+ let timestamp;
77
+ if (message.time !== undefined) {
78
+ timestamp = new Date(message.time);
79
+ if (timestamp.valueOf() < 0) {
80
+ timestamp = localTimestamp;
81
+ }
82
+ else {
83
+ timestamp.μs = (0, handy_1.parseμs)(message.time);
84
+ }
85
+ }
86
+ else {
87
+ timestamp = localTimestamp;
88
+ }
76
89
  yield {
77
90
  type: 'book_change',
78
91
  symbol: message.product_id,
@@ -80,7 +93,7 @@ class CoinbaseBookChangMapper {
80
93
  isSnapshot: true,
81
94
  bids: message.bids.map(mapSnapshotBookLevel).filter(validAmountsOnly),
82
95
  asks: message.asks.map(mapSnapshotBookLevel).filter(validAmountsOnly),
83
- timestamp: localTimestamp,
96
+ timestamp,
84
97
  localTimestamp
85
98
  };
86
99
  }
@@ -1 +1 @@
1
- {"version":3,"file":"coinbase.js","sourceRoot":"","sources":["../../src/mappers/coinbase.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"coinbase.js","sourceRoot":"","sources":["../../src/mappers/coinbase.ts"],"names":[],"mappings":"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"}
@@ -1,7 +1,8 @@
1
1
  import { Filter } from '../types';
2
2
  import { RealTimeFeedBase } from './realtimefeed';
3
3
  export declare class CoinbaseRealTimeFeed extends RealTimeFeedBase {
4
- protected wssURL: string;
4
+ private _hasCredentials;
5
+ protected get wssURL(): "wss://ws-direct.exchange.coinbase.com" | "wss://ws-feed.exchange.coinbase.com";
5
6
  protected channelMappings: {
6
7
  full: string[];
7
8
  level2: string[];
@@ -9,6 +10,7 @@ export declare class CoinbaseRealTimeFeed extends RealTimeFeedBase {
9
10
  ticker: string[];
10
11
  };
11
12
  protected mapToSubscribeMessages(filters: Filter<string>[]): any[];
13
+ private getAuthParams;
12
14
  protected messageIsError(message: any): boolean;
13
15
  }
14
16
  //# sourceMappingURL=coinbase.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"coinbase.d.ts","sourceRoot":"","sources":["../../src/realtimefeeds/coinbase.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAA;AACjC,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAA;AAEjD,qBAAa,oBAAqB,SAAQ,gBAAgB;IACxD,SAAS,CAAC,MAAM,SAAwC;IAIxD,SAAS,CAAC,eAAe;;;;;MAKxB;IAED,SAAS,CAAC,sBAAsB,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,GAAG,GAAG,EAAE;IAmDlE,SAAS,CAAC,cAAc,CAAC,OAAO,EAAE,GAAG,GAAG,OAAO;CAGhD"}
1
+ {"version":3,"file":"coinbase.d.ts","sourceRoot":"","sources":["../../src/realtimefeeds/coinbase.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAA;AACjC,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAA;AAEjD,qBAAa,oBAAqB,SAAQ,gBAAgB;IACxD,OAAO,CAAC,eAAe,CAG4B;IAEnD,SAAS,KAAK,MAAM,oFAEnB;IAGD,SAAS,CAAC,eAAe;;;;;MAKxB;IAED,SAAS,CAAC,sBAAsB,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,GAAG,GAAG,EAAE;IAoElE,OAAO,CAAC,aAAa;IAerB,SAAS,CAAC,cAAc,CAAC,OAAO,EAAE,GAAG,GAAG,OAAO;CAGhD"}
@@ -1,11 +1,17 @@
1
1
  "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
2
5
  Object.defineProperty(exports, "__esModule", { value: true });
3
6
  exports.CoinbaseRealTimeFeed = void 0;
7
+ const crypto_1 = __importDefault(require("crypto"));
4
8
  const realtimefeed_1 = require("./realtimefeed");
5
9
  class CoinbaseRealTimeFeed extends realtimefeed_1.RealTimeFeedBase {
6
10
  constructor() {
7
11
  super(...arguments);
8
- this.wssURL = 'wss://ws-feed.exchange.coinbase.com';
12
+ this._hasCredentials = process.env.COINBASE_API_KEY !== undefined &&
13
+ process.env.COINBASE_API_SECRET !== undefined &&
14
+ process.env.COINBASE_API_PASSPHRASE !== undefined;
9
15
  // map from coinbase subscribe 'channels' to more granular channels that tardis uses
10
16
  this.channelMappings = {
11
17
  full: ['received', 'open', 'done', 'match', 'change', 'full_snapshot'],
@@ -14,6 +20,9 @@ class CoinbaseRealTimeFeed extends realtimefeed_1.RealTimeFeedBase {
14
20
  ticker: ['ticker']
15
21
  };
16
22
  }
23
+ get wssURL() {
24
+ return this._hasCredentials ? 'wss://ws-direct.exchange.coinbase.com' : 'wss://ws-feed.exchange.coinbase.com';
25
+ }
17
26
  mapToSubscribeMessages(filters) {
18
27
  const channelsToSubscribe = filters
19
28
  .map((filter) => {
@@ -28,7 +37,13 @@ class CoinbaseRealTimeFeed extends realtimefeed_1.RealTimeFeedBase {
28
37
  channel = 'full';
29
38
  }
30
39
  else if (subscribeToLevel2Channel) {
31
- channel = 'level2';
40
+ if (this._hasCredentials) {
41
+ channel = 'level2';
42
+ }
43
+ else {
44
+ // for not authenticated connections use batch channel, non batched l2 updates require auth
45
+ channel = 'level2_batch';
46
+ }
32
47
  }
33
48
  else if (subscribeToMatchesChannel) {
34
49
  channel = 'matches';
@@ -55,6 +70,16 @@ class CoinbaseRealTimeFeed extends realtimefeed_1.RealTimeFeedBase {
55
70
  }
56
71
  return prev;
57
72
  }, []);
73
+ if (this._hasCredentials) {
74
+ const authParams = this.getAuthParams();
75
+ return [
76
+ {
77
+ type: 'subscribe',
78
+ channels: channelsToSubscribe,
79
+ ...authParams
80
+ }
81
+ ];
82
+ }
58
83
  return [
59
84
  {
60
85
  type: 'subscribe',
@@ -62,6 +87,19 @@ class CoinbaseRealTimeFeed extends realtimefeed_1.RealTimeFeedBase {
62
87
  }
63
88
  ];
64
89
  }
90
+ getAuthParams() {
91
+ const timestamp = Date.now().valueOf() / 1000;
92
+ const apiSecret = process.env.COINBASE_API_SECRET;
93
+ const message = `${timestamp}GET/users/self/verify`;
94
+ const hmac = crypto_1.default.createHmac('sha256', Buffer.from(apiSecret, 'base64'));
95
+ const signature = hmac.update(message).digest('base64');
96
+ return {
97
+ signature,
98
+ key: process.env.COINBASE_API_KEY,
99
+ passphrase: process.env.COINBASE_API_PASSPHRASE,
100
+ timestamp
101
+ };
102
+ }
65
103
  messageIsError(message) {
66
104
  return message.type === 'error';
67
105
  }
@@ -1 +1 @@
1
- {"version":3,"file":"coinbase.js","sourceRoot":"","sources":["../../src/realtimefeeds/coinbase.ts"],"names":[],"mappings":";;;AACA,iDAAiD;AAEjD,MAAa,oBAAqB,SAAQ,+BAAgB;IAA1D;;QACY,WAAM,GAAG,qCAAqC,CAAA;QAExD,oFAAoF;QAE1E,oBAAe,GAAG;YAC1B,IAAI,EAAE,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,eAAe,CAAC;YACtE,MAAM,EAAE,CAAC,UAAU,EAAE,UAAU,CAAC;YAChC,OAAO,EAAE,CAAC,OAAO,EAAE,YAAY,CAAC;YAChC,MAAM,EAAE,CAAC,QAAQ,CAAC;SACnB,CAAA;IAwDH,CAAC;IAtDW,sBAAsB,CAAC,OAAyB;QACxD,MAAM,mBAAmB,GAAG,OAAO;aAChC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE;YACd,IAAI,CAAC,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE;gBAClD,MAAM,IAAI,KAAK,CAAC,0FAA0F,CAAC,CAAA;aAC5G;YAED,MAAM,sBAAsB,GAC1B,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,OAAO,KAAK,OAAO,CAAC,CAAC,MAAM,GAAG,CAAC,CAAA;YAC1G,MAAM,wBAAwB,GAAG,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA;YACrF,MAAM,yBAAyB,GAAG,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA;YACvF,IAAI,OAAO,CAAA;YAEX,IAAI,sBAAsB,EAAE;gBAC1B,OAAO,GAAG,MAAM,CAAA;aACjB;iBAAM,IAAI,wBAAwB,EAAE;gBACnC,OAAO,GAAG,QAAQ,CAAA;aACnB;iBAAM,IAAI,yBAAyB,EAAE;gBACpC,OAAO,GAAG,SAAS,CAAA;aACpB;iBAAM;gBACL,OAAO,GAAG,QAAQ,CAAA;aACnB;YAED,OAAO;gBACL,IAAI,EAAE,OAAO;gBACb,WAAW,EAAE,MAAM,CAAC,OAAO;aAC5B,CAAA;QACH,CAAC,CAAC;aACD,MAAM,CAAC,CAAC,IAAI,EAAE,OAAO,EAAE,EAAE;YACxB,MAAM,gBAAgB,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;YAClE,IAAI,gBAAgB,KAAK,SAAS,EAAE;gBAClC,KAAK,MAAM,MAAM,IAAI,OAAO,CAAC,WAAW,EAAE;oBACxC,IAAI,gBAAgB,CAAC,WAAW,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,KAAK,EAAE;wBAC3D,gBAAgB,CAAC,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;qBAC1C;iBACF;aACF;iBAAM;gBACL,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;aACnB;YAED,OAAO,IAAI,CAAA;QACb,CAAC,EAAE,EAA+C,CAAC,CAAA;QAErD,OAAO;YACL;gBACE,IAAI,EAAE,WAAW;gBACjB,QAAQ,EAAE,mBAAmB;aAC9B;SACF,CAAA;IACH,CAAC;IAES,cAAc,CAAC,OAAY;QACnC,OAAO,OAAO,CAAC,IAAI,KAAK,OAAO,CAAA;IACjC,CAAC;CACF;AAlED,oDAkEC"}
1
+ {"version":3,"file":"coinbase.js","sourceRoot":"","sources":["../../src/realtimefeeds/coinbase.ts"],"names":[],"mappings":"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"}
@@ -90,7 +90,7 @@ class RealTimeFeedBase {
90
90
  const subscribeMessages = this.mapToSubscribeMessages(this._filters);
91
91
  const finalWssUrl = await this.getWebSocketUrl();
92
92
  this.debug('(connection id: %d) estabilishing connection to %s', this._connectionId, finalWssUrl);
93
- this.debug('(connection id: %d) provided filters: %o mapped to subscribe messages: %o', this._connectionId, this._filters, subscribeMessages);
93
+ this.debug('(connection id: %d) provided filters: %o mapped to subscribe messages: %j', this._connectionId, this._filters, subscribeMessages);
94
94
  if (this.originHeader !== undefined) {
95
95
  this._wsClientOptions.headers.origin = this.originHeader;
96
96
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "tardis-dev",
3
- "version": "13.21.6",
3
+ "version": "13.22.1",
4
4
  "engines": {
5
5
  "node": ">=12"
6
6
  },
@@ -87,6 +87,18 @@ export class CoinbaseBookChangMapper implements Mapper<'coinbase', BookChange> {
87
87
 
88
88
  *map(message: CoinbaseLevel2Update | CoinbaseLevel2Snapshot, localTimestamp: Date): IterableIterator<BookChange> {
89
89
  if (message.type === 'snapshot') {
90
+ let timestamp
91
+ if (message.time !== undefined) {
92
+ timestamp = new Date(message.time)
93
+ if (timestamp.valueOf() < 0) {
94
+ timestamp = localTimestamp
95
+ } else {
96
+ timestamp.μs = parseμs(message.time)
97
+ }
98
+ } else {
99
+ timestamp = localTimestamp
100
+ }
101
+
90
102
  yield {
91
103
  type: 'book_change',
92
104
  symbol: message.product_id,
@@ -94,7 +106,7 @@ export class CoinbaseBookChangMapper implements Mapper<'coinbase', BookChange> {
94
106
  isSnapshot: true,
95
107
  bids: message.bids.map(mapSnapshotBookLevel).filter(validAmountsOnly),
96
108
  asks: message.asks.map(mapSnapshotBookLevel).filter(validAmountsOnly),
97
- timestamp: localTimestamp,
109
+ timestamp,
98
110
  localTimestamp
99
111
  }
100
112
  } else {
@@ -182,6 +194,7 @@ type CoinbaseLevel2Snapshot = {
182
194
  product_id: string
183
195
  bids: CoinbaseSnapshotBookLevel[]
184
196
  asks: CoinbaseSnapshotBookLevel[]
197
+ time?: string
185
198
  }
186
199
 
187
200
  type CoinbaseUpdateBookLevel = ['buy' | 'sell', string, string]
@@ -1,11 +1,18 @@
1
+ import crypto, { sign } from 'crypto'
1
2
  import { Filter } from '../types'
2
3
  import { RealTimeFeedBase } from './realtimefeed'
3
4
 
4
5
  export class CoinbaseRealTimeFeed extends RealTimeFeedBase {
5
- protected wssURL = 'wss://ws-feed.exchange.coinbase.com'
6
+ private _hasCredentials =
7
+ process.env.COINBASE_API_KEY !== undefined &&
8
+ process.env.COINBASE_API_SECRET !== undefined &&
9
+ process.env.COINBASE_API_PASSPHRASE !== undefined
6
10
 
7
- // map from coinbase subscribe 'channels' to more granular channels that tardis uses
11
+ protected get wssURL() {
12
+ return this._hasCredentials ? 'wss://ws-direct.exchange.coinbase.com' : 'wss://ws-feed.exchange.coinbase.com'
13
+ }
8
14
 
15
+ // map from coinbase subscribe 'channels' to more granular channels that tardis uses
9
16
  protected channelMappings = {
10
17
  full: ['received', 'open', 'done', 'match', 'change', 'full_snapshot'],
11
18
  level2: ['snapshot', 'l2update'],
@@ -29,7 +36,12 @@ export class CoinbaseRealTimeFeed extends RealTimeFeedBase {
29
36
  if (subscribeToFullChannel) {
30
37
  channel = 'full'
31
38
  } else if (subscribeToLevel2Channel) {
32
- channel = 'level2'
39
+ if (this._hasCredentials) {
40
+ channel = 'level2'
41
+ } else {
42
+ // for not authenticated connections use batch channel, non batched l2 updates require auth
43
+ channel = 'level2_batch'
44
+ }
33
45
  } else if (subscribeToMatchesChannel) {
34
46
  channel = 'matches'
35
47
  } else {
@@ -56,6 +68,18 @@ export class CoinbaseRealTimeFeed extends RealTimeFeedBase {
56
68
  return prev
57
69
  }, [] as { name: string; product_ids: string[] }[])
58
70
 
71
+ if (this._hasCredentials) {
72
+ const authParams = this.getAuthParams()
73
+
74
+ return [
75
+ {
76
+ type: 'subscribe',
77
+ channels: channelsToSubscribe,
78
+ ...authParams
79
+ }
80
+ ]
81
+ }
82
+
59
83
  return [
60
84
  {
61
85
  type: 'subscribe',
@@ -64,6 +88,21 @@ export class CoinbaseRealTimeFeed extends RealTimeFeedBase {
64
88
  ]
65
89
  }
66
90
 
91
+ private getAuthParams() {
92
+ const timestamp = Date.now().valueOf() / 1000
93
+ const apiSecret = process.env.COINBASE_API_SECRET!
94
+ const message = `${timestamp}GET/users/self/verify`
95
+ const hmac = crypto.createHmac('sha256', Buffer.from(apiSecret, 'base64'))
96
+ const signature = hmac.update(message).digest('base64')
97
+
98
+ return {
99
+ signature,
100
+ key: process.env.COINBASE_API_KEY!,
101
+ passphrase: process.env.COINBASE_API_PASSPHRASE!,
102
+ timestamp
103
+ }
104
+ }
105
+
67
106
  protected messageIsError(message: any): boolean {
68
107
  return message.type === 'error'
69
108
  }
@@ -79,7 +79,7 @@ export abstract class RealTimeFeedBase implements RealTimeFeedIterable {
79
79
  this.debug('(connection id: %d) estabilishing connection to %s', this._connectionId, finalWssUrl)
80
80
 
81
81
  this.debug(
82
- '(connection id: %d) provided filters: %o mapped to subscribe messages: %o',
82
+ '(connection id: %d) provided filters: %o mapped to subscribe messages: %j',
83
83
  this._connectionId,
84
84
  this._filters,
85
85
  subscribeMessages