coinbase-api 0.3.2 → 1.0.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/README.md +438 -14
- package/dist/cjs/CBAdvancedTradeClient.d.ts +559 -0
- package/dist/cjs/CBAdvancedTradeClient.js +574 -0
- package/dist/cjs/CBAdvancedTradeClient.js.map +1 -0
- package/dist/cjs/CBAppClient.d.ts +359 -0
- package/dist/cjs/CBAppClient.js +336 -0
- package/dist/cjs/CBAppClient.js.map +1 -0
- package/dist/cjs/CBCommerceClient.d.ts +110 -0
- package/dist/cjs/CBCommerceClient.js +105 -0
- package/dist/cjs/CBCommerceClient.js.map +1 -0
- package/dist/cjs/CBExchangeClient.d.ts +640 -0
- package/dist/cjs/CBExchangeClient.js +751 -0
- package/dist/cjs/CBExchangeClient.js.map +1 -0
- package/dist/cjs/CBInternationalClient.d.ts +381 -0
- package/dist/cjs/CBInternationalClient.js +437 -0
- package/dist/cjs/CBInternationalClient.js.map +1 -0
- package/dist/cjs/CBPrimeClient.d.ts +363 -0
- package/dist/cjs/CBPrimeClient.js +451 -0
- package/dist/cjs/CBPrimeClient.js.map +1 -0
- package/dist/cjs/WebsocketClient.d.ts +78 -0
- package/dist/cjs/WebsocketClient.js +534 -0
- package/dist/cjs/WebsocketClient.js.map +1 -0
- package/dist/cjs/index.d.ts +13 -0
- package/dist/cjs/index.js +30 -0
- package/dist/cjs/index.js.map +1 -0
- package/dist/cjs/lib/BaseRestClient.d.ts +66 -0
- package/dist/cjs/lib/BaseRestClient.js +436 -0
- package/dist/cjs/lib/BaseRestClient.js.map +1 -0
- package/dist/cjs/lib/BaseWSClient.d.ts +169 -0
- package/dist/cjs/lib/BaseWSClient.js +638 -0
- package/dist/cjs/lib/BaseWSClient.js.map +1 -0
- package/dist/cjs/lib/jwtNode.d.ts +13 -0
- package/dist/cjs/lib/jwtNode.js +52 -0
- package/dist/cjs/lib/jwtNode.js.map +1 -0
- package/dist/cjs/lib/misc-util.d.ts +1 -0
- package/dist/cjs/lib/misc-util.js +7 -0
- package/dist/cjs/lib/misc-util.js.map +1 -0
- package/dist/cjs/lib/requestUtils.d.ts +98 -0
- package/dist/cjs/lib/requestUtils.js +75 -0
- package/dist/cjs/lib/requestUtils.js.map +1 -0
- package/dist/cjs/lib/webCryptoAPI.d.ts +10 -0
- package/dist/cjs/lib/webCryptoAPI.js +83 -0
- package/dist/cjs/lib/webCryptoAPI.js.map +1 -0
- package/dist/cjs/lib/websocket/WsStore.d.ts +63 -0
- package/dist/cjs/lib/websocket/WsStore.js +254 -0
- package/dist/cjs/lib/websocket/WsStore.js.map +1 -0
- package/dist/cjs/lib/websocket/WsStore.types.d.ts +49 -0
- package/dist/cjs/lib/websocket/WsStore.types.js +14 -0
- package/dist/cjs/lib/websocket/WsStore.types.js.map +1 -0
- package/dist/cjs/lib/websocket/logger.d.ts +6 -0
- package/dist/cjs/lib/websocket/logger.js +16 -0
- package/dist/cjs/lib/websocket/logger.js.map +1 -0
- package/dist/cjs/lib/websocket/typeGuards.d.ts +27 -0
- package/dist/cjs/lib/websocket/typeGuards.js +86 -0
- package/dist/cjs/lib/websocket/typeGuards.js.map +1 -0
- package/dist/cjs/lib/websocket/websocket-util.d.ts +120 -0
- package/dist/cjs/lib/websocket/websocket-util.js +173 -0
- package/dist/cjs/lib/websocket/websocket-util.js.map +1 -0
- package/dist/cjs/package.json +3 -0
- package/dist/cjs/types/request/advanced-trade-client.d.ts +194 -0
- package/dist/cjs/types/request/advanced-trade-client.js +18 -0
- package/dist/cjs/types/request/advanced-trade-client.js.map +1 -0
- package/dist/cjs/types/request/coinbase-app-client.d.ts +80 -0
- package/dist/cjs/types/request/coinbase-app-client.js +28 -0
- package/dist/cjs/types/request/coinbase-app-client.js.map +1 -0
- package/dist/cjs/types/request/coinbase-exchange.d.ts +332 -0
- package/dist/cjs/types/request/coinbase-exchange.js +3 -0
- package/dist/cjs/types/request/coinbase-exchange.js.map +1 -0
- package/dist/cjs/types/request/coinbase-international.d.ts +160 -0
- package/dist/cjs/types/request/coinbase-international.js +13 -0
- package/dist/cjs/types/request/coinbase-international.js.map +1 -0
- package/dist/cjs/types/request/coinbase-prime.d.ts +298 -0
- package/dist/cjs/types/request/coinbase-prime.js +8 -0
- package/dist/cjs/types/request/coinbase-prime.js.map +1 -0
- package/dist/cjs/types/response/advanced-trade-client.d.ts +759 -0
- package/dist/cjs/types/response/advanced-trade-client.js +8 -0
- package/dist/cjs/types/response/advanced-trade-client.js.map +1 -0
- package/dist/cjs/types/response/coinbase-app-client.d.ts +168 -0
- package/dist/cjs/types/response/coinbase-app-client.js +18 -0
- package/dist/cjs/types/response/coinbase-app-client.js.map +1 -0
- package/dist/cjs/types/response/coinbase-exchange.d.ts +80 -0
- package/dist/cjs/types/response/coinbase-exchange.js +82 -0
- package/dist/cjs/types/response/coinbase-exchange.js.map +1 -0
- package/dist/cjs/types/response/coinbase-international.d.ts +40 -0
- package/dist/cjs/types/response/coinbase-international.js +42 -0
- package/dist/cjs/types/response/coinbase-international.js.map +1 -0
- package/dist/cjs/types/response/coinbase-prime.d.ts +70 -0
- package/dist/cjs/types/response/coinbase-prime.js +72 -0
- package/dist/cjs/types/response/coinbase-prime.js.map +1 -0
- package/dist/cjs/types/response/ws.d.ts +7 -0
- package/dist/cjs/types/response/ws.js +3 -0
- package/dist/cjs/types/response/ws.js.map +1 -0
- package/dist/cjs/types/shared.types.d.ts +60 -0
- package/dist/cjs/types/shared.types.js +3 -0
- package/dist/cjs/types/shared.types.js.map +1 -0
- package/dist/cjs/types/websockets/client.d.ts +73 -0
- package/dist/cjs/types/websockets/client.js +3 -0
- package/dist/cjs/types/websockets/client.js.map +1 -0
- package/dist/cjs/types/websockets/events.d.ts +40 -0
- package/dist/cjs/types/websockets/events.js +3 -0
- package/dist/cjs/types/websockets/events.js.map +1 -0
- package/dist/cjs/types/websockets/requests.d.ts +76 -0
- package/dist/cjs/types/websockets/requests.js +3 -0
- package/dist/cjs/types/websockets/requests.js.map +1 -0
- package/dist/cjs/types/websockets/wsAPI.d.ts +9 -0
- package/dist/cjs/types/websockets/wsAPI.js +3 -0
- package/dist/cjs/types/websockets/wsAPI.js.map +1 -0
- package/dist/mjs/CBAdvancedTradeClient.d.ts +559 -0
- package/dist/mjs/CBAdvancedTradeClient.js +570 -0
- package/dist/mjs/CBAdvancedTradeClient.js.map +1 -0
- package/dist/mjs/CBAppClient.d.ts +359 -0
- package/dist/mjs/CBAppClient.js +332 -0
- package/dist/mjs/CBAppClient.js.map +1 -0
- package/dist/mjs/CBCommerceClient.d.ts +110 -0
- package/dist/mjs/CBCommerceClient.js +101 -0
- package/dist/mjs/CBCommerceClient.js.map +1 -0
- package/dist/mjs/CBExchangeClient.d.ts +640 -0
- package/dist/mjs/CBExchangeClient.js +747 -0
- package/dist/mjs/CBExchangeClient.js.map +1 -0
- package/dist/mjs/CBInternationalClient.d.ts +381 -0
- package/dist/mjs/CBInternationalClient.js +433 -0
- package/dist/mjs/CBInternationalClient.js.map +1 -0
- package/dist/mjs/CBPrimeClient.d.ts +363 -0
- package/dist/mjs/CBPrimeClient.js +447 -0
- package/dist/mjs/CBPrimeClient.js.map +1 -0
- package/dist/mjs/WebsocketClient.d.ts +78 -0
- package/dist/mjs/WebsocketClient.js +530 -0
- package/dist/mjs/WebsocketClient.js.map +1 -0
- package/dist/mjs/index.d.ts +13 -0
- package/dist/mjs/index.js +14 -0
- package/dist/mjs/index.js.map +1 -0
- package/dist/mjs/lib/BaseRestClient.d.ts +66 -0
- package/dist/mjs/lib/BaseRestClient.js +429 -0
- package/dist/mjs/lib/BaseRestClient.js.map +1 -0
- package/dist/mjs/lib/BaseWSClient.d.ts +169 -0
- package/dist/mjs/lib/BaseWSClient.js +631 -0
- package/dist/mjs/lib/BaseWSClient.js.map +1 -0
- package/dist/mjs/lib/jwtNode.d.ts +13 -0
- package/dist/mjs/lib/jwtNode.js +45 -0
- package/dist/mjs/lib/jwtNode.js.map +1 -0
- package/dist/mjs/lib/misc-util.d.ts +1 -0
- package/dist/mjs/lib/misc-util.js +4 -0
- package/dist/mjs/lib/misc-util.js.map +1 -0
- package/dist/mjs/lib/requestUtils.d.ts +98 -0
- package/dist/mjs/lib/requestUtils.js +69 -0
- package/dist/mjs/lib/requestUtils.js.map +1 -0
- package/dist/mjs/lib/webCryptoAPI.d.ts +10 -0
- package/dist/mjs/lib/webCryptoAPI.js +79 -0
- package/dist/mjs/lib/webCryptoAPI.js.map +1 -0
- package/dist/mjs/lib/websocket/WsStore.d.ts +63 -0
- package/dist/mjs/lib/websocket/WsStore.js +249 -0
- package/dist/mjs/lib/websocket/WsStore.js.map +1 -0
- package/dist/mjs/lib/websocket/WsStore.types.d.ts +49 -0
- package/dist/mjs/lib/websocket/WsStore.types.js +11 -0
- package/dist/mjs/lib/websocket/WsStore.types.js.map +1 -0
- package/dist/mjs/lib/websocket/logger.d.ts +6 -0
- package/dist/mjs/lib/websocket/logger.js +13 -0
- package/dist/mjs/lib/websocket/logger.js.map +1 -0
- package/dist/mjs/lib/websocket/typeGuards.d.ts +27 -0
- package/dist/mjs/lib/websocket/typeGuards.js +78 -0
- package/dist/mjs/lib/websocket/typeGuards.js.map +1 -0
- package/dist/mjs/lib/websocket/websocket-util.d.ts +120 -0
- package/dist/mjs/lib/websocket/websocket-util.js +164 -0
- package/dist/mjs/lib/websocket/websocket-util.js.map +1 -0
- package/dist/mjs/package.json +3 -0
- package/dist/mjs/types/request/advanced-trade-client.d.ts +194 -0
- package/dist/mjs/types/request/advanced-trade-client.js +17 -0
- package/dist/mjs/types/request/advanced-trade-client.js.map +1 -0
- package/dist/mjs/types/request/coinbase-app-client.d.ts +80 -0
- package/dist/mjs/types/request/coinbase-app-client.js +27 -0
- package/dist/mjs/types/request/coinbase-app-client.js.map +1 -0
- package/dist/mjs/types/request/coinbase-exchange.d.ts +332 -0
- package/dist/mjs/types/request/coinbase-exchange.js +2 -0
- package/dist/mjs/types/request/coinbase-exchange.js.map +1 -0
- package/dist/mjs/types/request/coinbase-international.d.ts +160 -0
- package/dist/mjs/types/request/coinbase-international.js +12 -0
- package/dist/mjs/types/request/coinbase-international.js.map +1 -0
- package/dist/mjs/types/request/coinbase-prime.d.ts +298 -0
- package/dist/mjs/types/request/coinbase-prime.js +7 -0
- package/dist/mjs/types/request/coinbase-prime.js.map +1 -0
- package/dist/mjs/types/response/advanced-trade-client.d.ts +759 -0
- package/dist/mjs/types/response/advanced-trade-client.js +7 -0
- package/dist/mjs/types/response/advanced-trade-client.js.map +1 -0
- package/dist/mjs/types/response/coinbase-app-client.d.ts +168 -0
- package/dist/mjs/types/response/coinbase-app-client.js +17 -0
- package/dist/mjs/types/response/coinbase-app-client.js.map +1 -0
- package/dist/mjs/types/response/coinbase-exchange.d.ts +80 -0
- package/dist/mjs/types/response/coinbase-exchange.js +82 -0
- package/dist/mjs/types/response/coinbase-exchange.js.map +1 -0
- package/dist/mjs/types/response/coinbase-international.d.ts +40 -0
- package/dist/mjs/types/response/coinbase-international.js +42 -0
- package/dist/mjs/types/response/coinbase-international.js.map +1 -0
- package/dist/mjs/types/response/coinbase-prime.d.ts +70 -0
- package/dist/mjs/types/response/coinbase-prime.js +72 -0
- package/dist/mjs/types/response/coinbase-prime.js.map +1 -0
- package/dist/mjs/types/response/ws.d.ts +7 -0
- package/dist/mjs/types/response/ws.js +2 -0
- package/dist/mjs/types/response/ws.js.map +1 -0
- package/dist/mjs/types/shared.types.d.ts +60 -0
- package/dist/mjs/types/shared.types.js +2 -0
- package/dist/mjs/types/shared.types.js.map +1 -0
- package/dist/mjs/types/websockets/client.d.ts +73 -0
- package/dist/mjs/types/websockets/client.js +2 -0
- package/dist/mjs/types/websockets/client.js.map +1 -0
- package/dist/mjs/types/websockets/events.d.ts +40 -0
- package/dist/mjs/types/websockets/events.js +2 -0
- package/dist/mjs/types/websockets/events.js.map +1 -0
- package/dist/mjs/types/websockets/requests.d.ts +76 -0
- package/dist/mjs/types/websockets/requests.js +2 -0
- package/dist/mjs/types/websockets/requests.js.map +1 -0
- package/dist/mjs/types/websockets/wsAPI.d.ts +9 -0
- package/dist/mjs/types/websockets/wsAPI.js +2 -0
- package/dist/mjs/types/websockets/wsAPI.js.map +1 -0
- package/package.json +42 -30
- package/index.js +0 -1
- package/lib/index.d.ts +0 -1
- package/lib/index.js +0 -16
- package/lib/index.js.map +0 -1
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import { AxiosRequestConfig } from 'axios';
|
|
2
|
+
import { CloseAdvTradePositionRequest, SubmitAdvTradeOrderRequest } from '../types/request/advanced-trade-client.js';
|
|
3
|
+
import { SubmitCBExchOrderRequest } from '../types/request/coinbase-exchange.js';
|
|
4
|
+
import { SubmitINTXOrderRequest } from '../types/request/coinbase-international.js';
|
|
5
|
+
import { SubmitPrimeOrderRequest } from '../types/request/coinbase-prime.js';
|
|
6
|
+
import { CustomOrderIdProperty } from '../types/shared.types.js';
|
|
7
|
+
import { RestClientOptions, RestClientType } from './requestUtils.js';
|
|
8
|
+
/**
|
|
9
|
+
* Some requests require some params to be in the query string, some in the body, some even in the headers.
|
|
10
|
+
* This type anticipates either are possible in any combination.
|
|
11
|
+
*
|
|
12
|
+
* The request builder will automatically handle where parameters should go.
|
|
13
|
+
*/
|
|
14
|
+
type ParamsInRequest = {
|
|
15
|
+
query?: object;
|
|
16
|
+
body?: object;
|
|
17
|
+
headers?: object;
|
|
18
|
+
};
|
|
19
|
+
export declare abstract class BaseRestClient {
|
|
20
|
+
private options;
|
|
21
|
+
private baseUrl;
|
|
22
|
+
private globalRequestOptions;
|
|
23
|
+
private apiKey;
|
|
24
|
+
private apiSecret;
|
|
25
|
+
private apiPassphrase;
|
|
26
|
+
/** Defines the client type (affecting how requests & signatures behave) */
|
|
27
|
+
abstract getClientType(): RestClientType;
|
|
28
|
+
/**
|
|
29
|
+
* Create an instance of the REST client. Pass API credentials in the object in the first parameter.
|
|
30
|
+
* @param {RestClientOptions} [restClientOptions={}] options to configure REST API connectivity
|
|
31
|
+
* @param {AxiosRequestConfig} [networkOptions={}] HTTP networking options for axios
|
|
32
|
+
*/
|
|
33
|
+
constructor(restClientOptions?: RestClientOptions, networkOptions?: AxiosRequestConfig);
|
|
34
|
+
/**
|
|
35
|
+
* Timestamp used to sign the request. Override this method to implement your own timestamp/sync mechanism
|
|
36
|
+
*/
|
|
37
|
+
getSignTimestampMs(): number;
|
|
38
|
+
get(endpoint: string, params?: object): Promise<any>;
|
|
39
|
+
post(endpoint: string, params?: ParamsInRequest): Promise<any>;
|
|
40
|
+
getPrivate(endpoint: string, params?: object): Promise<any>;
|
|
41
|
+
postPrivate(endpoint: string, params?: ParamsInRequest): Promise<any>;
|
|
42
|
+
deletePrivate(endpoint: string, params?: ParamsInRequest): Promise<any>;
|
|
43
|
+
putPrivate(endpoint: string, params?: ParamsInRequest): Promise<any>;
|
|
44
|
+
patchPrivate(endpoint: string, params?: ParamsInRequest): Promise<any>;
|
|
45
|
+
/**
|
|
46
|
+
* @private Make a HTTP request to a specific endpoint. Private endpoint API calls are automatically signed.
|
|
47
|
+
*/
|
|
48
|
+
private _call;
|
|
49
|
+
generateNewOrderId(): string;
|
|
50
|
+
/**
|
|
51
|
+
* Validate syntax meets requirements set by coinbase. Log warning if not.
|
|
52
|
+
*/
|
|
53
|
+
protected validateOrderId(params: SubmitAdvTradeOrderRequest | CloseAdvTradePositionRequest | SubmitCBExchOrderRequest | SubmitINTXOrderRequest | SubmitPrimeOrderRequest, orderIdProperty: CustomOrderIdProperty): void;
|
|
54
|
+
/**
|
|
55
|
+
* @private generic handler to parse request exceptions
|
|
56
|
+
*/
|
|
57
|
+
parseException(e: any, requestParams: any): unknown;
|
|
58
|
+
/**
|
|
59
|
+
* @private sign request and set recv window
|
|
60
|
+
*/
|
|
61
|
+
private signRequest;
|
|
62
|
+
private prepareSignParams;
|
|
63
|
+
/** Returns an axios request object. Handles signing process automatically if this is a private API call */
|
|
64
|
+
private buildRequest;
|
|
65
|
+
}
|
|
66
|
+
export {};
|
|
@@ -0,0 +1,436 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.BaseRestClient = void 0;
|
|
7
|
+
const axios_1 = __importDefault(require("axios"));
|
|
8
|
+
const https_1 = __importDefault(require("https"));
|
|
9
|
+
const nanoid_1 = require("nanoid");
|
|
10
|
+
const jwtNode_js_1 = require("./jwtNode.js");
|
|
11
|
+
const misc_util_js_1 = require("./misc-util.js");
|
|
12
|
+
const requestUtils_js_1 = require("./requestUtils.js");
|
|
13
|
+
const webCryptoAPI_js_1 = require("./webCryptoAPI.js");
|
|
14
|
+
const MISSING_API_KEYS_ERROR = 'API Key, Secret & API Passphrase are ALL required to use the authenticated REST client';
|
|
15
|
+
const ENABLE_HTTP_TRACE = typeof process === 'object' &&
|
|
16
|
+
typeof process.env === 'object' &&
|
|
17
|
+
process.env.CBTRACE;
|
|
18
|
+
if (ENABLE_HTTP_TRACE) {
|
|
19
|
+
axios_1.default.interceptors.request.use((request) => {
|
|
20
|
+
console.log(new Date(), 'Starting Request', JSON.stringify({
|
|
21
|
+
url: request.url,
|
|
22
|
+
method: request.method,
|
|
23
|
+
params: request.params,
|
|
24
|
+
data: request.data,
|
|
25
|
+
}, null, 2));
|
|
26
|
+
return request;
|
|
27
|
+
});
|
|
28
|
+
axios_1.default.interceptors.response.use((response) => {
|
|
29
|
+
console.log(new Date(), 'Response:', {
|
|
30
|
+
// request: {
|
|
31
|
+
// url: response.config.url,
|
|
32
|
+
// method: response.config.method,
|
|
33
|
+
// data: response.config.data,
|
|
34
|
+
// headers: response.config.headers,
|
|
35
|
+
// },
|
|
36
|
+
response: {
|
|
37
|
+
status: response.status,
|
|
38
|
+
statusText: response.statusText,
|
|
39
|
+
headers: response.headers,
|
|
40
|
+
data: JSON.stringify(response.data, null, 2),
|
|
41
|
+
},
|
|
42
|
+
});
|
|
43
|
+
return response;
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Impure, mutates params to remove any values that have a key but are undefined.
|
|
48
|
+
*/
|
|
49
|
+
function deleteUndefinedValues(params) {
|
|
50
|
+
if (!params) {
|
|
51
|
+
return;
|
|
52
|
+
}
|
|
53
|
+
for (const key in params) {
|
|
54
|
+
const value = params[key];
|
|
55
|
+
if (typeof value === 'undefined') {
|
|
56
|
+
delete params[key];
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
class BaseRestClient {
|
|
61
|
+
options;
|
|
62
|
+
baseUrl;
|
|
63
|
+
globalRequestOptions;
|
|
64
|
+
apiKey;
|
|
65
|
+
apiSecret;
|
|
66
|
+
apiPassphrase;
|
|
67
|
+
/**
|
|
68
|
+
* Create an instance of the REST client. Pass API credentials in the object in the first parameter.
|
|
69
|
+
* @param {RestClientOptions} [restClientOptions={}] options to configure REST API connectivity
|
|
70
|
+
* @param {AxiosRequestConfig} [networkOptions={}] HTTP networking options for axios
|
|
71
|
+
*/
|
|
72
|
+
constructor(restClientOptions = {}, networkOptions = {}) {
|
|
73
|
+
this.options = {
|
|
74
|
+
/** Throw errors if any request params are empty */
|
|
75
|
+
strictParamValidation: false,
|
|
76
|
+
...restClientOptions,
|
|
77
|
+
};
|
|
78
|
+
const VERSION = '0.1.0';
|
|
79
|
+
const USER_AGENT = `${requestUtils_js_1.APIIDPrefix}/${VERSION}`;
|
|
80
|
+
this.globalRequestOptions = {
|
|
81
|
+
/** in ms == 5 minutes by default */
|
|
82
|
+
timeout: 1000 * 60 * 5,
|
|
83
|
+
/** inject custom rquest options based on axios specs - see axios docs for more guidance on AxiosRequestConfig: https://github.com/axios/axios#request-config */
|
|
84
|
+
...networkOptions,
|
|
85
|
+
headers: {
|
|
86
|
+
...networkOptions.headers,
|
|
87
|
+
'Content-Type': 'application/json',
|
|
88
|
+
locale: 'en-US',
|
|
89
|
+
'User-Agent': USER_AGENT,
|
|
90
|
+
},
|
|
91
|
+
};
|
|
92
|
+
if (restClientOptions.localisation) {
|
|
93
|
+
if (!this.globalRequestOptions.headers) {
|
|
94
|
+
this.globalRequestOptions.headers = {};
|
|
95
|
+
}
|
|
96
|
+
this.globalRequestOptions.headers['Accept-Language'] =
|
|
97
|
+
restClientOptions.localisation;
|
|
98
|
+
}
|
|
99
|
+
// If enabled, configure a https agent with keepAlive enabled
|
|
100
|
+
if (this.options.keepAlive) {
|
|
101
|
+
// For more advanced configuration, raise an issue on GitHub or use the "networkOptions"
|
|
102
|
+
// parameter to define a custom httpsAgent with the desired properties
|
|
103
|
+
this.globalRequestOptions.httpsAgent = new https_1.default.Agent({
|
|
104
|
+
keepAlive: true,
|
|
105
|
+
keepAliveMsecs: this.options.keepAliveMsecs,
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
this.baseUrl = (0, requestUtils_js_1.getRestBaseUrl)(restClientOptions, this.getClientType());
|
|
109
|
+
this.apiKey = this.options.apiKey;
|
|
110
|
+
this.apiSecret = this.options.apiSecret;
|
|
111
|
+
this.apiPassphrase = this.options.apiPassphrase;
|
|
112
|
+
if (restClientOptions.cdpApiKey) {
|
|
113
|
+
this.apiKey = restClientOptions.cdpApiKey.name;
|
|
114
|
+
this.apiSecret = restClientOptions.cdpApiKey.privateKey;
|
|
115
|
+
}
|
|
116
|
+
// Throw if one of these values is missing, and at least one of them is set
|
|
117
|
+
const credentials = [this.apiKey, this.apiSecret];
|
|
118
|
+
if (
|
|
119
|
+
// commerce only needs keys, not key and secret
|
|
120
|
+
this.getClientType() !== requestUtils_js_1.REST_CLIENT_TYPE_ENUM.commerce &&
|
|
121
|
+
credentials.includes(undefined) &&
|
|
122
|
+
credentials.some((v) => typeof v === 'string')) {
|
|
123
|
+
throw new Error(MISSING_API_KEYS_ERROR);
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Timestamp used to sign the request. Override this method to implement your own timestamp/sync mechanism
|
|
128
|
+
*/
|
|
129
|
+
getSignTimestampMs() {
|
|
130
|
+
return Date.now();
|
|
131
|
+
}
|
|
132
|
+
get(endpoint, params) {
|
|
133
|
+
return this._call('GET', endpoint, params, true);
|
|
134
|
+
}
|
|
135
|
+
post(endpoint, params) {
|
|
136
|
+
return this._call('POST', endpoint, params, true);
|
|
137
|
+
}
|
|
138
|
+
getPrivate(endpoint, params) {
|
|
139
|
+
return this._call('GET', endpoint, params, false);
|
|
140
|
+
}
|
|
141
|
+
postPrivate(endpoint, params) {
|
|
142
|
+
return this._call('POST', endpoint, params, false);
|
|
143
|
+
}
|
|
144
|
+
deletePrivate(endpoint, params) {
|
|
145
|
+
return this._call('DELETE', endpoint, params, false);
|
|
146
|
+
}
|
|
147
|
+
putPrivate(endpoint, params) {
|
|
148
|
+
return this._call('PUT', endpoint, params, false);
|
|
149
|
+
}
|
|
150
|
+
patchPrivate(endpoint, params) {
|
|
151
|
+
return this._call('PATCH', endpoint, params, false);
|
|
152
|
+
}
|
|
153
|
+
/**
|
|
154
|
+
* @private Make a HTTP request to a specific endpoint. Private endpoint API calls are automatically signed.
|
|
155
|
+
*/
|
|
156
|
+
async _call(method, endpoint, params, isPublicApi) {
|
|
157
|
+
// Sanity check to make sure it's only ever prefixed by one forward slash
|
|
158
|
+
const requestUrl = [this.baseUrl, endpoint].join(endpoint.startsWith('/') ? '' : '/');
|
|
159
|
+
// Build a request and handle signature process
|
|
160
|
+
const options = await this.buildRequest(method, endpoint, requestUrl, params, isPublicApi);
|
|
161
|
+
if (ENABLE_HTTP_TRACE) {
|
|
162
|
+
console.log('full request: ', options);
|
|
163
|
+
}
|
|
164
|
+
// Dispatch request
|
|
165
|
+
return (0, axios_1.default)(options)
|
|
166
|
+
.then((response) => {
|
|
167
|
+
if (response.status >= 200 && response.status <= 204) {
|
|
168
|
+
// Throw if API returns an error (e.g. insufficient balance)
|
|
169
|
+
if (typeof response.data?.code === 'string' &&
|
|
170
|
+
response.data?.code !== '200000') {
|
|
171
|
+
throw { response };
|
|
172
|
+
}
|
|
173
|
+
return response.data;
|
|
174
|
+
}
|
|
175
|
+
throw { response };
|
|
176
|
+
})
|
|
177
|
+
.catch((e) => this.parseException(e, { method, endpoint, requestUrl, params }));
|
|
178
|
+
}
|
|
179
|
+
generateNewOrderId() {
|
|
180
|
+
return requestUtils_js_1.APIIDPrefix + (0, nanoid_1.nanoid)(14);
|
|
181
|
+
}
|
|
182
|
+
/**
|
|
183
|
+
* Validate syntax meets requirements set by coinbase. Log warning if not.
|
|
184
|
+
*/
|
|
185
|
+
validateOrderId(params, orderIdProperty) {
|
|
186
|
+
// Not the cleanest but strict checks aren't quite necessary here either
|
|
187
|
+
const requestParams = params;
|
|
188
|
+
if (!requestParams[orderIdProperty]) {
|
|
189
|
+
requestParams[orderIdProperty] = this.generateNewOrderId();
|
|
190
|
+
return;
|
|
191
|
+
}
|
|
192
|
+
if (!requestParams[orderIdProperty].startsWith(requestUtils_js_1.APIIDPrefix)) {
|
|
193
|
+
(0, requestUtils_js_1.logInvalidOrderId)(orderIdProperty, requestUtils_js_1.APIIDPrefix, params);
|
|
194
|
+
const previousValue = requestParams[orderIdProperty];
|
|
195
|
+
const newValue = requestUtils_js_1.APIIDPrefix + requestParams[orderIdProperty];
|
|
196
|
+
console.warn(`WARNING: "${orderIdProperty}" was automatically prefixed. Changed from "${previousValue}" to "${newValue}". To avoid this, apply the prefix before submitting an order or use the client.generateNewOrderId() utility method.`);
|
|
197
|
+
requestParams[orderIdProperty] = newValue;
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
/**
|
|
201
|
+
* @private generic handler to parse request exceptions
|
|
202
|
+
*/
|
|
203
|
+
parseException(e, requestParams) {
|
|
204
|
+
if (this.options.parseExceptions === false) {
|
|
205
|
+
throw e;
|
|
206
|
+
}
|
|
207
|
+
// Something happened in setting up the request that triggered an error
|
|
208
|
+
if (!e.response) {
|
|
209
|
+
if (!e.request) {
|
|
210
|
+
throw e.message;
|
|
211
|
+
}
|
|
212
|
+
// request made but no response received
|
|
213
|
+
throw e;
|
|
214
|
+
}
|
|
215
|
+
// The request was made and the server responded with a status code
|
|
216
|
+
// that falls out of the range of 2xx
|
|
217
|
+
const response = e.response;
|
|
218
|
+
// console.error('err: ', response?.data);
|
|
219
|
+
throw {
|
|
220
|
+
code: response.status,
|
|
221
|
+
message: response.statusText,
|
|
222
|
+
body: response.data,
|
|
223
|
+
headers: response.headers,
|
|
224
|
+
requestOptions: {
|
|
225
|
+
...this.options,
|
|
226
|
+
// Prevent credentials from leaking into error messages
|
|
227
|
+
apiKey: 'omittedFromError',
|
|
228
|
+
apiSecret: 'omittedFromError',
|
|
229
|
+
apiPassphrase: 'omittedFromError',
|
|
230
|
+
cdpApiKey: 'omittedFromError',
|
|
231
|
+
},
|
|
232
|
+
requestParams,
|
|
233
|
+
};
|
|
234
|
+
}
|
|
235
|
+
/**
|
|
236
|
+
* @private sign request and set recv window
|
|
237
|
+
*/
|
|
238
|
+
async signRequest(data, url, endpoint, method, signMethod) {
|
|
239
|
+
const timestampInMs = this.getSignTimestampMs();
|
|
240
|
+
const res = {
|
|
241
|
+
originalParams: {
|
|
242
|
+
...data,
|
|
243
|
+
},
|
|
244
|
+
sign: '',
|
|
245
|
+
timestamp: timestampInMs,
|
|
246
|
+
recvWindow: 0,
|
|
247
|
+
serializedParams: '',
|
|
248
|
+
queryParamsWithSign: '',
|
|
249
|
+
headers: {},
|
|
250
|
+
};
|
|
251
|
+
const apiKey = this.apiKey;
|
|
252
|
+
const apiSecret = this.apiSecret;
|
|
253
|
+
const apiPassphrase = this.apiPassphrase;
|
|
254
|
+
const jwtExpiresSeconds = this.options.jwtExpiresSeconds || 120;
|
|
255
|
+
if (!apiKey) {
|
|
256
|
+
return res;
|
|
257
|
+
}
|
|
258
|
+
const strictParamValidation = this.options.strictParamValidation;
|
|
259
|
+
const encodeQueryStringValues = true;
|
|
260
|
+
const requestBody = data?.body || data;
|
|
261
|
+
const requestBodyString = requestBody ? JSON.stringify(requestBody) : '';
|
|
262
|
+
if (signMethod === 'coinbase') {
|
|
263
|
+
const clientType = this.getClientType();
|
|
264
|
+
const signRequestParams = method === 'GET'
|
|
265
|
+
? (0, requestUtils_js_1.serializeParams)(data?.query || data, strictParamValidation, encodeQueryStringValues, '?')
|
|
266
|
+
: requestBodyString;
|
|
267
|
+
// https://docs.cdp.coinbase.com/product-apis/docs/welcome
|
|
268
|
+
switch (clientType) {
|
|
269
|
+
case requestUtils_js_1.REST_CLIENT_TYPE_ENUM.advancedTrade:
|
|
270
|
+
case requestUtils_js_1.REST_CLIENT_TYPE_ENUM.coinbaseApp: {
|
|
271
|
+
// Both adv trade & app API use the same JWT auth mechanism
|
|
272
|
+
// Advanced Trade: https://docs.cdp.coinbase.com/advanced-trade/docs/rest-api-auth
|
|
273
|
+
// App: https://docs.cdp.coinbase.com/coinbase-app/docs/api-key-authentication
|
|
274
|
+
if (!apiSecret) {
|
|
275
|
+
throw new Error(`No API secret provided, cannot prepare JWT.`);
|
|
276
|
+
}
|
|
277
|
+
const sign = (0, jwtNode_js_1.signJWT)({
|
|
278
|
+
url,
|
|
279
|
+
method,
|
|
280
|
+
algorithm: 'ES256',
|
|
281
|
+
timestampMs: timestampInMs,
|
|
282
|
+
jwtExpiresSeconds,
|
|
283
|
+
apiPubKey: apiKey,
|
|
284
|
+
apiPrivKey: apiSecret,
|
|
285
|
+
});
|
|
286
|
+
return {
|
|
287
|
+
...res,
|
|
288
|
+
sign: sign,
|
|
289
|
+
queryParamsWithSign: signRequestParams,
|
|
290
|
+
headers: {
|
|
291
|
+
Authorization: `Bearer ${sign}`,
|
|
292
|
+
},
|
|
293
|
+
};
|
|
294
|
+
// TODO: is there demand for oauth support?
|
|
295
|
+
// Docs: https://docs.cdp.coinbase.com/coinbase-app/docs/coinbase-app-integration
|
|
296
|
+
// See: https://github.com/tiagosiebler/coinbase-api/issues/24
|
|
297
|
+
}
|
|
298
|
+
// Docs: https://docs.cdp.coinbase.com/exchange/docs/rest-auth
|
|
299
|
+
case requestUtils_js_1.REST_CLIENT_TYPE_ENUM.exchange:
|
|
300
|
+
// Docs: https://docs.cdp.coinbase.com/intx/docs/rest-auth
|
|
301
|
+
case requestUtils_js_1.REST_CLIENT_TYPE_ENUM.international: {
|
|
302
|
+
const timestampInSeconds = timestampInMs / 1000; // decimals are OK
|
|
303
|
+
if (!apiSecret) {
|
|
304
|
+
throw new Error(`No API secret provided, cannot sign request.`);
|
|
305
|
+
}
|
|
306
|
+
if (!apiPassphrase) {
|
|
307
|
+
throw new Error(`No API passphrase provided, cannot sign request.`);
|
|
308
|
+
}
|
|
309
|
+
const signInput = timestampInSeconds + method + endpoint + signRequestParams;
|
|
310
|
+
const sign = await (0, webCryptoAPI_js_1.signMessage)(signInput, apiSecret, 'base64', 'SHA-256', 'base64:web');
|
|
311
|
+
const headers = {
|
|
312
|
+
'CB-ACCESS-KEY': apiKey,
|
|
313
|
+
'CB-ACCESS-SIGN': sign,
|
|
314
|
+
'CB-ACCESS-TIMESTAMP': timestampInSeconds,
|
|
315
|
+
'CB-ACCESS-PASSPHRASE': apiPassphrase,
|
|
316
|
+
};
|
|
317
|
+
// console.log('sign res: ', { signInput, ...headers });
|
|
318
|
+
return {
|
|
319
|
+
...res,
|
|
320
|
+
sign: sign,
|
|
321
|
+
queryParamsWithSign: signRequestParams,
|
|
322
|
+
headers: {
|
|
323
|
+
...headers,
|
|
324
|
+
},
|
|
325
|
+
};
|
|
326
|
+
// For CB Exchange, is there demand for FIX
|
|
327
|
+
// Docs, FIX: https://docs.cdp.coinbase.com/exchange/docs/fix-connectivity
|
|
328
|
+
// For CB International, is there demand for FIX
|
|
329
|
+
// Docs, FIX: https://docs.cdp.coinbase.com/intx/docs/fix-overview
|
|
330
|
+
}
|
|
331
|
+
// Docs: https://docs.cdp.coinbase.com/prime/docs/rest-authentication
|
|
332
|
+
case requestUtils_js_1.REST_CLIENT_TYPE_ENUM.prime: {
|
|
333
|
+
const timestampInSeconds = Math.floor(timestampInMs / 1000); // decimal not allowed
|
|
334
|
+
const signInput = timestampInSeconds + method + endpoint + requestBodyString;
|
|
335
|
+
if (!apiSecret) {
|
|
336
|
+
throw new Error(`No API secret provided, cannot sign request.`);
|
|
337
|
+
}
|
|
338
|
+
if (!apiPassphrase) {
|
|
339
|
+
throw new Error(`No API passphrase provided, cannot sign request.`);
|
|
340
|
+
}
|
|
341
|
+
const sign = await (0, webCryptoAPI_js_1.signMessage)(signInput, apiSecret, 'base64', 'SHA-256', 'base64:web');
|
|
342
|
+
const headers = {
|
|
343
|
+
'X-CB-ACCESS-KEY': apiKey,
|
|
344
|
+
'X-CB-ACCESS-PASSPHRASE': apiPassphrase,
|
|
345
|
+
'X-CB-ACCESS-SIGNATURE': sign,
|
|
346
|
+
'X-CB-ACCESS-TIMESTAMP': timestampInSeconds,
|
|
347
|
+
};
|
|
348
|
+
// For CB Prime, is there demand for FIX
|
|
349
|
+
// Docs, FIX: https://docs.cdp.coinbase.com/prime/docs/fix-connectivity
|
|
350
|
+
return {
|
|
351
|
+
...res,
|
|
352
|
+
sign: sign,
|
|
353
|
+
queryParamsWithSign: signRequestParams,
|
|
354
|
+
headers: {
|
|
355
|
+
...headers,
|
|
356
|
+
},
|
|
357
|
+
};
|
|
358
|
+
}
|
|
359
|
+
case requestUtils_js_1.REST_CLIENT_TYPE_ENUM.commerce: {
|
|
360
|
+
// https://docs.cdp.coinbase.com/commerce-onchain/docs/getting-started
|
|
361
|
+
// No auth?
|
|
362
|
+
return {
|
|
363
|
+
...res,
|
|
364
|
+
headers: {
|
|
365
|
+
'X-CC-Api-Key': apiKey,
|
|
366
|
+
},
|
|
367
|
+
};
|
|
368
|
+
}
|
|
369
|
+
default: {
|
|
370
|
+
console.error(new Date(), (0, misc_util_js_1.neverGuard)(clientType, `Unhandled sign client type : "${clientType}"`));
|
|
371
|
+
throw new Error(`Unhandled request sign for client : "${clientType}"`);
|
|
372
|
+
}
|
|
373
|
+
}
|
|
374
|
+
}
|
|
375
|
+
console.error(new Date(), (0, misc_util_js_1.neverGuard)(signMethod, `Unhandled sign method: "${webCryptoAPI_js_1.signMessage}"`));
|
|
376
|
+
return res;
|
|
377
|
+
}
|
|
378
|
+
async prepareSignParams(method, url, endpoint, signMethod, params, isPublicApi) {
|
|
379
|
+
if (isPublicApi) {
|
|
380
|
+
return {
|
|
381
|
+
originalParams: params,
|
|
382
|
+
paramsWithSign: params,
|
|
383
|
+
};
|
|
384
|
+
}
|
|
385
|
+
if (!this.apiKey || !this.apiSecret) {
|
|
386
|
+
throw new Error(MISSING_API_KEYS_ERROR);
|
|
387
|
+
}
|
|
388
|
+
return this.signRequest(params, url, endpoint, method, signMethod);
|
|
389
|
+
}
|
|
390
|
+
/** Returns an axios request object. Handles signing process automatically if this is a private API call */
|
|
391
|
+
async buildRequest(method, endpoint, url, params, isPublicApi) {
|
|
392
|
+
const options = {
|
|
393
|
+
...this.globalRequestOptions,
|
|
394
|
+
url: url,
|
|
395
|
+
method: method,
|
|
396
|
+
};
|
|
397
|
+
deleteUndefinedValues(params);
|
|
398
|
+
deleteUndefinedValues(params?.body);
|
|
399
|
+
deleteUndefinedValues(params?.query);
|
|
400
|
+
deleteUndefinedValues(params?.headers);
|
|
401
|
+
if (isPublicApi || !this.apiKey || !this.apiSecret) {
|
|
402
|
+
return {
|
|
403
|
+
...options,
|
|
404
|
+
params: params,
|
|
405
|
+
};
|
|
406
|
+
}
|
|
407
|
+
const signResult = await this.prepareSignParams(method, url, endpoint, 'coinbase', params, isPublicApi);
|
|
408
|
+
const requestHeaders = {
|
|
409
|
+
// request parameter headers for this request
|
|
410
|
+
...params?.headers,
|
|
411
|
+
// auth headers for this request
|
|
412
|
+
...signResult.headers,
|
|
413
|
+
// global headers for every request
|
|
414
|
+
...options.headers,
|
|
415
|
+
};
|
|
416
|
+
let urlWithQueryParams = options.url;
|
|
417
|
+
if (method === 'GET') {
|
|
418
|
+
if (signResult.queryParamsWithSign) {
|
|
419
|
+
urlWithQueryParams += signResult.queryParamsWithSign;
|
|
420
|
+
}
|
|
421
|
+
return {
|
|
422
|
+
...options,
|
|
423
|
+
headers: requestHeaders,
|
|
424
|
+
url: urlWithQueryParams,
|
|
425
|
+
};
|
|
426
|
+
}
|
|
427
|
+
return {
|
|
428
|
+
...options,
|
|
429
|
+
headers: requestHeaders,
|
|
430
|
+
url: params?.query ? urlWithQueryParams : options.url,
|
|
431
|
+
data: signResult.originalParams.body,
|
|
432
|
+
};
|
|
433
|
+
}
|
|
434
|
+
}
|
|
435
|
+
exports.BaseRestClient = BaseRestClient;
|
|
436
|
+
//# sourceMappingURL=BaseRestClient.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BaseRestClient.js","sourceRoot":"","sources":["../../../src/lib/BaseRestClient.ts"],"names":[],"mappings":"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"}
|