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.
- package/dist/mappers/coinbase.d.ts +1 -0
- package/dist/mappers/coinbase.d.ts.map +1 -1
- package/dist/mappers/coinbase.js +14 -1
- package/dist/mappers/coinbase.js.map +1 -1
- package/dist/realtimefeeds/coinbase.d.ts +3 -1
- package/dist/realtimefeeds/coinbase.d.ts.map +1 -1
- package/dist/realtimefeeds/coinbase.js +40 -2
- package/dist/realtimefeeds/coinbase.js.map +1 -1
- package/dist/realtimefeeds/realtimefeed.js +1 -1
- package/package.json +1 -1
- package/src/mappers/coinbase.ts +14 -1
- package/src/realtimefeeds/coinbase.ts +42 -3
- package/src/realtimefeeds/realtimefeed.ts +1 -1
|
@@ -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;
|
|
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"}
|
package/dist/mappers/coinbase.js
CHANGED
|
@@ -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
|
|
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":";;;AAAA,oCAAoD;AAIpD,gDAAgD;AAEnC,QAAA,oBAAoB,GAA8B;IAC7D,SAAS,CAAC,OAAsE;QAC9E,OAAO,OAAO,CAAC,IAAI,KAAK,OAAO,CAAA;IACjC,CAAC;IAED,UAAU,CAAC,OAAkB;QAC3B,OAAO,GAAG,IAAA,wBAAgB,EAAC,OAAO,CAAC,CAAA;QAEnC,OAAO;YACL;gBACE,OAAO,EAAE,OAAO;gBAChB,OAAO;aACR;SACF,CAAA;IACH,CAAC;IAED,CAAC,GAAG,CAAC,OAAsB,EAAE,cAAoB;QAC/C,MAAM,SAAS,GAAG,IAAI,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;QACxC,SAAS,CAAC,EAAE,GAAG,IAAA,eAAO,EAAC,OAAO,CAAC,IAAI,CAAC,CAAA;QAEpC,MAAM;YACJ,IAAI,EAAE,OAAO;YACb,MAAM,EAAE,OAAO,CAAC,UAAU;YAC1B,QAAQ,EAAE,UAAU;YACpB,EAAE,EAAE,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC;YAC5B,KAAK,EAAE,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC;YAC5B,MAAM,EAAE,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC;YAC5B,IAAI,EAAE,OAAO,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM;YAC9C,SAAS;YACT,cAAc,EAAE,cAAc;SAC/B,CAAA;IACH,CAAC;CACF,CAAA;AAED,MAAM,kBAAkB,GAAG,CAAC,KAA8B,EAAE,EAAE;IAC5D,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAA;IAC9B,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAA;IAE/B,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,CAAA;AAC1B,CAAC,CAAA;AAED,MAAM,oBAAoB,GAAG,CAAC,KAAgC,EAAE,EAAE;IAChE,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAA;IAC9B,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAA;IAE/B,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,CAAA;AAC1B,CAAC,CAAA;AAED,MAAM,gBAAgB,GAAG,CAAC,KAAqB,EAAE,EAAE;IACjD,IAAI,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE;QAC9B,OAAO,KAAK,CAAA;KACb;IACD,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE;QACpB,OAAO,KAAK,CAAA;KACb;IAED,OAAO,IAAI,CAAA;AACb,CAAC,CAAA;AAED,MAAa,uBAAuB;IAApC;QACmB,4BAAuB,GAAG,IAAI,GAAG,EAAgB,CAAA;
|
|
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
|
-
|
|
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":"
|
|
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.
|
|
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
|
-
|
|
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":"
|
|
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: %
|
|
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
package/src/mappers/coinbase.ts
CHANGED
|
@@ -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
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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: %
|
|
82
|
+
'(connection id: %d) provided filters: %o mapped to subscribe messages: %j',
|
|
83
83
|
this._connectionId,
|
|
84
84
|
this._filters,
|
|
85
85
|
subscribeMessages
|