okx-api 0.0.6 → 1.0.0

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 (56) hide show
  1. package/README.md +47 -10
  2. package/lib/index.d.ts +2 -1
  3. package/lib/index.js +2 -2
  4. package/lib/index.js.map +1 -1
  5. package/lib/rest-client.d.ts +3 -4
  6. package/lib/rest-client.js +1 -1
  7. package/lib/rest-client.js.map +1 -1
  8. package/lib/types/index.d.ts +2 -0
  9. package/lib/types/index.js +2 -0
  10. package/lib/types/index.js.map +1 -1
  11. package/lib/types/rest/client.d.ts +5 -0
  12. package/lib/types/rest/client.js +3 -0
  13. package/lib/types/rest/client.js.map +1 -0
  14. package/lib/types/rest/index.d.ts +1 -0
  15. package/lib/types/rest/index.js +1 -0
  16. package/lib/types/rest/index.js.map +1 -1
  17. package/lib/types/shared.d.ts +6 -0
  18. package/lib/types/shared.js +3 -0
  19. package/lib/types/shared.js.map +1 -0
  20. package/lib/types/websockets/client.d.ts +22 -0
  21. package/lib/types/websockets/client.js +3 -0
  22. package/lib/types/websockets/client.js.map +1 -0
  23. package/lib/types/websockets/event.d.ts +21 -0
  24. package/lib/types/websockets/event.js +3 -0
  25. package/lib/types/websockets/event.js.map +1 -0
  26. package/lib/types/websockets/index.d.ts +3 -0
  27. package/lib/types/websockets/index.js +20 -0
  28. package/lib/types/websockets/index.js.map +1 -0
  29. package/lib/types/websockets/request.d.ts +108 -0
  30. package/lib/types/websockets/request.js +3 -0
  31. package/lib/types/websockets/request.js.map +1 -0
  32. package/lib/util/BaseRestClient.d.ts +2 -7
  33. package/lib/util/BaseRestClient.js +6 -7
  34. package/lib/util/BaseRestClient.js.map +1 -1
  35. package/lib/util/WsStore.d.ts +66 -0
  36. package/lib/util/WsStore.js +168 -0
  37. package/lib/util/WsStore.js.map +1 -0
  38. package/lib/util/index.d.ts +4 -0
  39. package/lib/util/index.js +21 -0
  40. package/lib/util/index.js.map +1 -0
  41. package/lib/util/logger.d.ts +9 -0
  42. package/lib/util/logger.js +24 -0
  43. package/lib/util/logger.js.map +1 -0
  44. package/lib/util/requestUtils.d.ts +2 -12
  45. package/lib/util/requestUtils.js +3 -3
  46. package/lib/util/requestUtils.js.map +1 -1
  47. package/lib/util/typeGuards.d.ts +13 -0
  48. package/lib/util/typeGuards.js +46 -1
  49. package/lib/util/typeGuards.js.map +1 -1
  50. package/lib/util/websocket-util.d.ts +26 -0
  51. package/lib/util/websocket-util.js +131 -0
  52. package/lib/util/websocket-util.js.map +1 -0
  53. package/lib/websocket-client.d.ts +99 -0
  54. package/lib/websocket-client.js +467 -0
  55. package/lib/websocket-client.js.map +1 -0
  56. package/package.json +1 -1
@@ -0,0 +1,66 @@
1
+ import WebSocket from 'isomorphic-ws';
2
+ import { DefaultLogger } from './logger';
3
+ import { WsKey } from './websocket-util';
4
+ export declare enum WsConnectionStateEnum {
5
+ INITIAL = 0,
6
+ CONNECTING = 1,
7
+ CONNECTED = 2,
8
+ CLOSING = 3,
9
+ RECONNECTING = 4
10
+ }
11
+ /** A "topic" is always a string */
12
+ declare type WsTopic = string;
13
+ /**
14
+ * A "Set" is used to ensure we only subscribe to a topic once (tracking a list of unique topics we're expected to be connected to)
15
+ * Note: Accurate duplicate tracking only works for plaintext topics. E.g. JSON objects may not be seen as duplicates if keys are in different orders. If that's needed, check the FTX implementation.
16
+ */
17
+ interface WsStoredState<WSTopic> {
18
+ /** The currently active websocket connection */
19
+ ws?: WebSocket;
20
+ /** The current lifecycle state of the connection (enum) */
21
+ connectionState?: WsConnectionStateEnum;
22
+ /** A timer that will send an upstream heartbeat (ping) when it expires */
23
+ activePingTimer?: ReturnType<typeof setTimeout> | undefined;
24
+ /** A timer tracking that an upstream heartbeat was sent, expecting a reply before it expires */
25
+ activePongTimer?: ReturnType<typeof setTimeout> | undefined;
26
+ /** If a reconnection is in progress, this will have the timer for the delayed reconnect */
27
+ activeReconnectTimer?: ReturnType<typeof setTimeout> | undefined;
28
+ /**
29
+ * All the topics we are expected to be subscribed to (and we automatically resubscribed to if the connection drops)
30
+ * A "Set" is used to ensure we only subscribe to a topic once (tracking a list of unique topics we're expected to be connected to)
31
+ *
32
+ * Note: Accurate duplicate tracking using a Set only works for plaintext topics. E.g. JSON objects may not be seen as duplicates if keys are in different orders.
33
+ * More complex topics (objects) are matched using the isDeepObjectMatch function
34
+ */
35
+ subscribedTopics: Set<WSTopic>;
36
+ }
37
+ export declare function isDeepObjectMatch(object1: any, object2: any): boolean;
38
+ declare type WSSimpleTopic = string;
39
+ export declare class WsStore<WSComplexTopic> {
40
+ private wsState;
41
+ private logger;
42
+ constructor(logger: typeof DefaultLogger);
43
+ /** Get WS stored state for key, optionally create if missing */
44
+ get(wsKey: WsKey, createIfMissing?: true): WsStoredState<WSComplexTopic | WSSimpleTopic>;
45
+ get(wsKey: WsKey, createIfMissing?: false): WsStoredState<WSComplexTopic | WSSimpleTopic> | undefined;
46
+ getKeys(): WsKey[];
47
+ create(wsKey: WsKey): WsStoredState<WSComplexTopic | WSSimpleTopic> | undefined;
48
+ delete(wsKey: WsKey): void;
49
+ hasExistingActiveConnection(wsKey: WsKey): boolean;
50
+ getWs(wsKey: WsKey): WebSocket | undefined;
51
+ setWs(wsKey: WsKey, wsConnection: WebSocket): WebSocket;
52
+ isWsOpen(wsKey: WsKey): boolean;
53
+ getConnectionState(wsKey: WsKey): WsConnectionStateEnum;
54
+ setConnectionState(wsKey: WsKey, state: WsConnectionStateEnum): void;
55
+ isConnectionState(wsKey: WsKey, state: WsConnectionStateEnum): boolean;
56
+ getTopics(wsKey: WsKey): Set<WSComplexTopic | WSSimpleTopic>;
57
+ getTopicsByKey(): Record<string, Set<WSComplexTopic | WSSimpleTopic>>;
58
+ addTopic(wsKey: WsKey, topic: WsTopic): Set<string | WSComplexTopic>;
59
+ /** Add subscribed topic to store, only if not already subscribed */
60
+ addComplexTopic(wsKey: WsKey, topic: WSComplexTopic): Set<string | WSComplexTopic>;
61
+ deleteTopic(wsKey: WsKey, topic: WsTopic): boolean;
62
+ /** Remove subscribed topic from store */
63
+ deleteComplexTopic(wsKey: WsKey, topic: WSComplexTopic): Set<string | WSComplexTopic>;
64
+ getMatchingTopic(key: WsKey, topic: WsTopic | WSComplexTopic): WSComplexTopic | WSSimpleTopic | undefined;
65
+ }
66
+ export {};
@@ -0,0 +1,168 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.WsStore = exports.isDeepObjectMatch = exports.WsConnectionStateEnum = void 0;
4
+ const logger_1 = require("./logger");
5
+ var WsConnectionStateEnum;
6
+ (function (WsConnectionStateEnum) {
7
+ WsConnectionStateEnum[WsConnectionStateEnum["INITIAL"] = 0] = "INITIAL";
8
+ WsConnectionStateEnum[WsConnectionStateEnum["CONNECTING"] = 1] = "CONNECTING";
9
+ WsConnectionStateEnum[WsConnectionStateEnum["CONNECTED"] = 2] = "CONNECTED";
10
+ WsConnectionStateEnum[WsConnectionStateEnum["CLOSING"] = 3] = "CLOSING";
11
+ WsConnectionStateEnum[WsConnectionStateEnum["RECONNECTING"] = 4] = "RECONNECTING";
12
+ // ERROR = 5,
13
+ })(WsConnectionStateEnum = exports.WsConnectionStateEnum || (exports.WsConnectionStateEnum = {}));
14
+ function isDeepObjectMatch(object1, object2) {
15
+ if (typeof object2 !== typeof object1) {
16
+ return false;
17
+ }
18
+ const keys1 = Object.keys(object1).sort();
19
+ const keys2 = Object.keys(object2).sort();
20
+ const hasSameKeyCount = keys1.length === keys2.length;
21
+ if (!hasSameKeyCount) {
22
+ // console.log('not same key count', { keys1, keys2 });
23
+ // not the same amount of keys or keys don't match
24
+ return false;
25
+ }
26
+ const hasSameKeyNames = keys1.every((val, i) => val === keys2[i]);
27
+ if (!hasSameKeyNames) {
28
+ // console.log('not same key names: ', { keys1, keys2 });
29
+ return false;
30
+ }
31
+ for (const key in object1) {
32
+ const value1 = object1[key];
33
+ const value2 = object2[key];
34
+ if (typeof value1 === 'object' && typeof value2 === 'object') {
35
+ if (!isDeepObjectMatch(value1, value2)) {
36
+ return false;
37
+ }
38
+ }
39
+ if (value1 !== value2) {
40
+ return false;
41
+ }
42
+ }
43
+ return true;
44
+ }
45
+ exports.isDeepObjectMatch = isDeepObjectMatch;
46
+ class WsStore {
47
+ constructor(logger) {
48
+ this.wsState = {};
49
+ this.logger = logger || logger_1.DefaultLogger;
50
+ this.wsState = {};
51
+ }
52
+ get(wsKey, createIfMissing) {
53
+ if (this.wsState[wsKey]) {
54
+ return this.wsState[wsKey];
55
+ }
56
+ if (createIfMissing) {
57
+ return this.create(wsKey);
58
+ }
59
+ }
60
+ getKeys() {
61
+ return Object.keys(this.wsState);
62
+ }
63
+ create(wsKey) {
64
+ if (this.hasExistingActiveConnection(wsKey)) {
65
+ this.logger.warning('WsStore setConnection() overwriting existing open connection: ', this.getWs(wsKey));
66
+ }
67
+ this.wsState[wsKey] = {
68
+ subscribedTopics: new Set(),
69
+ connectionState: WsConnectionStateEnum.INITIAL,
70
+ };
71
+ return this.get(wsKey);
72
+ }
73
+ delete(wsKey) {
74
+ if (this.hasExistingActiveConnection(wsKey)) {
75
+ const ws = this.getWs(wsKey);
76
+ this.logger.warning('WsStore deleting state for connection still open: ', ws);
77
+ ws === null || ws === void 0 ? void 0 : ws.close();
78
+ }
79
+ delete this.wsState[wsKey];
80
+ }
81
+ /* connection websocket */
82
+ hasExistingActiveConnection(wsKey) {
83
+ return this.get(wsKey) && this.isWsOpen(wsKey);
84
+ }
85
+ getWs(wsKey) {
86
+ var _a;
87
+ return (_a = this.get(wsKey)) === null || _a === void 0 ? void 0 : _a.ws;
88
+ }
89
+ setWs(wsKey, wsConnection) {
90
+ if (this.isWsOpen(wsKey)) {
91
+ this.logger.warning('WsStore setConnection() overwriting existing open connection: ', this.getWs(wsKey));
92
+ }
93
+ this.get(wsKey, true).ws = wsConnection;
94
+ return wsConnection;
95
+ }
96
+ /* connection state */
97
+ isWsOpen(wsKey) {
98
+ const existingConnection = this.getWs(wsKey);
99
+ return (!!existingConnection &&
100
+ existingConnection.readyState === existingConnection.OPEN);
101
+ }
102
+ getConnectionState(wsKey) {
103
+ return this.get(wsKey, true).connectionState;
104
+ }
105
+ setConnectionState(wsKey, state) {
106
+ this.get(wsKey, true).connectionState = state;
107
+ }
108
+ isConnectionState(wsKey, state) {
109
+ return this.getConnectionState(wsKey) === state;
110
+ }
111
+ /* subscribed topics */
112
+ getTopics(wsKey) {
113
+ return this.get(wsKey, true).subscribedTopics;
114
+ }
115
+ getTopicsByKey() {
116
+ const result = {};
117
+ for (const refKey in this.wsState) {
118
+ result[refKey] = this.getTopics(refKey);
119
+ }
120
+ return result;
121
+ }
122
+ addTopic(wsKey, topic) {
123
+ return this.getTopics(wsKey).add(topic);
124
+ }
125
+ /** Add subscribed topic to store, only if not already subscribed */
126
+ addComplexTopic(wsKey, topic) {
127
+ if (this.getMatchingTopic(wsKey, topic)) {
128
+ return this.getTopics(wsKey);
129
+ }
130
+ // console.log('add complex topic: ', topic);
131
+ return this.getTopics(wsKey).add(topic);
132
+ }
133
+ deleteTopic(wsKey, topic) {
134
+ return this.getTopics(wsKey).delete(topic);
135
+ }
136
+ /** Remove subscribed topic from store */
137
+ deleteComplexTopic(wsKey, topic) {
138
+ const storedTopic = this.getMatchingTopic(wsKey, topic);
139
+ if (storedTopic) {
140
+ this.getTopics(wsKey).delete(storedTopic);
141
+ }
142
+ return this.getTopics(wsKey);
143
+ }
144
+ // Since topics are objects we can't rely on the set to detect duplicates
145
+ getMatchingTopic(key, topic) {
146
+ if (typeof topic === 'string') {
147
+ if (this.getTopics(key).has(topic)) {
148
+ return topic;
149
+ }
150
+ else {
151
+ return undefined;
152
+ }
153
+ }
154
+ const allTopics = this.getTopics(key).values();
155
+ for (const storedTopic of allTopics) {
156
+ // console.log('?: ', {
157
+ // isMatch: isDeepObjectMatch(topic, storedTopic),
158
+ // newTopic: topic,
159
+ // storedTopic: storedTopic,
160
+ // });
161
+ if (isDeepObjectMatch(topic, storedTopic)) {
162
+ return storedTopic;
163
+ }
164
+ }
165
+ }
166
+ }
167
+ exports.WsStore = WsStore;
168
+ //# sourceMappingURL=WsStore.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WsStore.js","sourceRoot":"","sources":["../../src/util/WsStore.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ export * from './typeGuards';
2
+ export * from './WsStore';
3
+ export * from './logger';
4
+ export * from './websocket-util';
@@ -0,0 +1,21 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./typeGuards"), exports);
18
+ __exportStar(require("./WsStore"), exports);
19
+ __exportStar(require("./logger"), exports);
20
+ __exportStar(require("./websocket-util"), exports);
21
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/util/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,+CAA6B;AAC7B,4CAA0B;AAC1B,2CAAyB;AACzB,mDAAiC"}
@@ -0,0 +1,9 @@
1
+ export declare type LogParams = null | any;
2
+ export declare const DefaultLogger: {
3
+ silly: (...params: LogParams) => void;
4
+ debug: (...params: LogParams) => void;
5
+ notice: (...params: LogParams) => void;
6
+ info: (...params: LogParams) => void;
7
+ warning: (...params: LogParams) => void;
8
+ error: (...params: LogParams) => void;
9
+ };
@@ -0,0 +1,24 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.DefaultLogger = void 0;
4
+ exports.DefaultLogger = {
5
+ silly: (...params) => {
6
+ // console.log(params);
7
+ },
8
+ debug: (...params) => {
9
+ console.log(params);
10
+ },
11
+ notice: (...params) => {
12
+ console.log(params);
13
+ },
14
+ info: (...params) => {
15
+ console.info(params);
16
+ },
17
+ warning: (...params) => {
18
+ console.error(params);
19
+ },
20
+ error: (...params) => {
21
+ console.error(params);
22
+ },
23
+ };
24
+ //# sourceMappingURL=logger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/util/logger.ts"],"names":[],"mappings":";;;AAEa,QAAA,aAAa,GAAG;IAC3B,KAAK,EAAE,CAAC,GAAG,MAAiB,EAAQ,EAAE;QACpC,uBAAuB;IACzB,CAAC;IACD,KAAK,EAAE,CAAC,GAAG,MAAiB,EAAQ,EAAE;QACpC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IACtB,CAAC;IACD,MAAM,EAAE,CAAC,GAAG,MAAiB,EAAQ,EAAE;QACrC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IACtB,CAAC;IACD,IAAI,EAAE,CAAC,GAAG,MAAiB,EAAQ,EAAE;QACnC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACvB,CAAC;IACD,OAAO,EAAE,CAAC,GAAG,MAAiB,EAAQ,EAAE;QACtC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IACxB,CAAC;IACD,KAAK,EAAE,CAAC,GAAG,MAAiB,EAAQ,EAAE;QACpC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IACxB,CAAC;CACF,CAAC"}
@@ -1,17 +1,7 @@
1
1
  import { Method } from 'axios';
2
- export interface RestClientOptions {
3
- strict_param_validation?: boolean;
4
- baseUrl?: string;
5
- parse_exceptions?: boolean;
6
- }
2
+ import { APIMarket, RestClientOptions } from '../types';
7
3
  export declare function serializeParams(params: object | undefined, method: Method, strict_validation?: boolean): string;
8
4
  export declare const programKey = "tag";
9
5
  export declare const programId = "159881cb7207BCDE";
10
- /**
11
- * - live: production,
12
- * - aws: aws subdomain,
13
- * - demo: demo environment
14
- */
15
- export declare type OKXEnvironment = 'live' | 'aws' | 'demo';
16
- export declare function getRestBaseUrl(environment: OKXEnvironment, restClientOptions: RestClientOptions): string;
6
+ export declare function getRestBaseUrl(market: APIMarket, restClientOptions: RestClientOptions): string;
17
7
  export declare function isWsPong(response: any): any;
@@ -23,14 +23,14 @@ function serializeParams(params, method, strict_validation = false) {
23
23
  exports.serializeParams = serializeParams;
24
24
  exports.programKey = 'tag';
25
25
  exports.programId = '159881cb7207BCDE';
26
- function getRestBaseUrl(environment, restClientOptions) {
26
+ function getRestBaseUrl(market, restClientOptions) {
27
27
  if (restClientOptions.baseUrl) {
28
28
  return restClientOptions.baseUrl;
29
29
  }
30
- switch (environment) {
30
+ switch (market) {
31
31
  default:
32
32
  case 'demo':
33
- case 'live': {
33
+ case 'prod': {
34
34
  return 'https://www.okx.com';
35
35
  }
36
36
  case 'aws': {
@@ -1 +1 @@
1
- {"version":3,"file":"requestUtils.js","sourceRoot":"","sources":["../../src/util/requestUtils.ts"],"names":[],"mappings":";;;AAcA,SAAgB,eAAe,CAC7B,MAA0B,EAC1B,MAAc,EACd,iBAAiB,GAAG,KAAK;IAEzB,IAAI,CAAC,MAAM,EAAE;QACX,OAAO,EAAE,CAAC;KACX;IAED,IAAI,MAAM,KAAK,KAAK,EAAE;QACpB,OAAO,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;KAC/B;IAED,MAAM,WAAW,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC;SACpC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE;QACX,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;QAC1B,IAAI,iBAAiB,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,WAAW,EAAE;YAC9D,MAAM,IAAI,KAAK,CACb,uDAAuD,CACxD,CAAC;SACH;QACD,OAAO,GAAG,GAAG,IAAI,KAAK,EAAE,CAAC;IAC3B,CAAC,CAAC;SACD,IAAI,CAAC,GAAG,CAAC,CAAC;IAEb,iDAAiD;IACjD,OAAO,WAAW,CAAC,CAAC,CAAC,GAAG,GAAG,WAAW,CAAC,CAAC,CAAC,WAAW,CAAC;AACvD,CAAC;AA3BD,0CA2BC;AACY,QAAA,UAAU,GAAG,KAAK,CAAC;AACnB,QAAA,SAAS,GAAG,kBAAkB,CAAC;AAS5C,SAAgB,cAAc,CAC5B,WAA2B,EAC3B,iBAAoC;IAEpC,IAAI,iBAAiB,CAAC,OAAO,EAAE;QAC7B,OAAO,iBAAiB,CAAC,OAAO,CAAC;KAClC;IAED,QAAQ,WAAW,EAAE;QACnB,QAAQ;QACR,KAAK,MAAM,CAAC;QACZ,KAAK,MAAM,CAAC,CAAC;YACX,OAAO,qBAAqB,CAAC;SAC9B;QACD,KAAK,KAAK,CAAC,CAAC;YACV,OAAO,sBAAsB,CAAC;SAC/B;KACF;AACH,CAAC;AAlBD,wCAkBC;AAED,SAAgB,QAAQ,CAAC,QAAa;IACpC,IAAI,QAAQ,CAAC,IAAI,IAAI,QAAQ,CAAC,IAAI,EAAE;QAClC,OAAO,IAAI,CAAC;KACb;IACD,OAAO,CACL,QAAQ,CAAC,OAAO;QAChB,QAAQ,CAAC,OAAO,CAAC,EAAE,KAAK,MAAM;QAC9B,QAAQ,CAAC,OAAO,KAAK,MAAM;QAC3B,QAAQ,CAAC,OAAO,KAAK,IAAI,CAC1B,CAAC;AACJ,CAAC;AAVD,4BAUC"}
1
+ {"version":3,"file":"requestUtils.js","sourceRoot":"","sources":["../../src/util/requestUtils.ts"],"names":[],"mappings":";;;AAGA,SAAgB,eAAe,CAC7B,MAA0B,EAC1B,MAAc,EACd,iBAAiB,GAAG,KAAK;IAEzB,IAAI,CAAC,MAAM,EAAE;QACX,OAAO,EAAE,CAAC;KACX;IAED,IAAI,MAAM,KAAK,KAAK,EAAE;QACpB,OAAO,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;KAC/B;IAED,MAAM,WAAW,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC;SACpC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE;QACX,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;QAC1B,IAAI,iBAAiB,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,WAAW,EAAE;YAC9D,MAAM,IAAI,KAAK,CACb,uDAAuD,CACxD,CAAC;SACH;QACD,OAAO,GAAG,GAAG,IAAI,KAAK,EAAE,CAAC;IAC3B,CAAC,CAAC;SACD,IAAI,CAAC,GAAG,CAAC,CAAC;IAEb,iDAAiD;IACjD,OAAO,WAAW,CAAC,CAAC,CAAC,GAAG,GAAG,WAAW,CAAC,CAAC,CAAC,WAAW,CAAC;AACvD,CAAC;AA3BD,0CA2BC;AACY,QAAA,UAAU,GAAG,KAAK,CAAC;AACnB,QAAA,SAAS,GAAG,kBAAkB,CAAC;AAE5C,SAAgB,cAAc,CAC5B,MAAiB,EACjB,iBAAoC;IAEpC,IAAI,iBAAiB,CAAC,OAAO,EAAE;QAC7B,OAAO,iBAAiB,CAAC,OAAO,CAAC;KAClC;IAED,QAAQ,MAAM,EAAE;QACd,QAAQ;QACR,KAAK,MAAM,CAAC;QACZ,KAAK,MAAM,CAAC,CAAC;YACX,OAAO,qBAAqB,CAAC;SAC9B;QACD,KAAK,KAAK,CAAC,CAAC;YACV,OAAO,sBAAsB,CAAC;SAC/B;KACF;AACH,CAAC;AAlBD,wCAkBC;AAED,SAAgB,QAAQ,CAAC,QAAa;IACpC,IAAI,QAAQ,CAAC,IAAI,IAAI,QAAQ,CAAC,IAAI,EAAE;QAClC,OAAO,IAAI,CAAC;KACb;IACD,OAAO,CACL,QAAQ,CAAC,OAAO;QAChB,QAAQ,CAAC,OAAO,CAAC,EAAE,KAAK,MAAM;QAC9B,QAAQ,CAAC,OAAO,KAAK,MAAM;QAC3B,QAAQ,CAAC,OAAO,KAAK,IAAI,CAC1B,CAAC;AACJ,CAAC;AAVD,4BAUC"}
@@ -1,2 +1,15 @@
1
+ import { WsDataEvent, WsEvent, WsLoginEvent } from '../types';
1
2
  import { APIResponse } from '../types/rest';
2
3
  export declare function isRawAPIResponse(response: unknown): response is APIResponse<unknown>;
4
+ /** Simple type guard that a websocket event extends a known event schema */
5
+ export declare function isWsEvent(evtData: unknown): evtData is WsEvent;
6
+ export declare function isWsDataEvent(evtData: unknown): evtData is WsDataEvent;
7
+ export declare function isWsErrorEvent(evt: unknown): boolean;
8
+ /** Usually a response to authenticating over ws */
9
+ export declare function isWsLoginEvent(evt: unknown): evt is WsLoginEvent;
10
+ /** A response to subscribing to a channel */
11
+ export declare function isWsSubscribeEvent(evtData: unknown): boolean;
12
+ /** A response to unsubscribing from a channel */
13
+ export declare function isWsUnsubscribeEvent(evtData: unknown): boolean;
14
+ /** Simple typescript guard never expecting code to reach it (will throw typescript error if called) */
15
+ export declare function neverGuard(x: never, msg: string): Error;
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.isRawAPIResponse = void 0;
3
+ exports.neverGuard = exports.isWsUnsubscribeEvent = exports.isWsSubscribeEvent = exports.isWsLoginEvent = exports.isWsErrorEvent = exports.isWsDataEvent = exports.isWsEvent = exports.isRawAPIResponse = void 0;
4
4
  function isRawAPIResponse(response) {
5
5
  if (typeof response !== 'object' || !response) {
6
6
  return false;
@@ -11,4 +11,49 @@ function isRawAPIResponse(response) {
11
11
  return false;
12
12
  }
13
13
  exports.isRawAPIResponse = isRawAPIResponse;
14
+ /** Simple type guard that a websocket event extends a known event schema */
15
+ function isWsEvent(evtData) {
16
+ if (typeof evtData !== 'object' || !evtData) {
17
+ return false;
18
+ }
19
+ if ('event' in evtData) {
20
+ return true;
21
+ }
22
+ return false;
23
+ }
24
+ exports.isWsEvent = isWsEvent;
25
+ function isWsDataEvent(evtData) {
26
+ if (typeof evtData !== 'object' || !evtData) {
27
+ return false;
28
+ }
29
+ if ('arg' in evtData && 'data' in evtData) {
30
+ return true;
31
+ }
32
+ return false;
33
+ }
34
+ exports.isWsDataEvent = isWsDataEvent;
35
+ function isWsErrorEvent(evt) {
36
+ return isWsEvent(evt) && evt.event === 'error';
37
+ }
38
+ exports.isWsErrorEvent = isWsErrorEvent;
39
+ /** Usually a response to authenticating over ws */
40
+ function isWsLoginEvent(evt) {
41
+ return isWsEvent(evt) && evt.event === 'login';
42
+ }
43
+ exports.isWsLoginEvent = isWsLoginEvent;
44
+ /** A response to subscribing to a channel */
45
+ function isWsSubscribeEvent(evtData) {
46
+ return isWsEvent(evtData) && evtData.event === 'subscribe';
47
+ }
48
+ exports.isWsSubscribeEvent = isWsSubscribeEvent;
49
+ /** A response to unsubscribing from a channel */
50
+ function isWsUnsubscribeEvent(evtData) {
51
+ return isWsEvent(evtData) && evtData.event === 'unsubscribe';
52
+ }
53
+ exports.isWsUnsubscribeEvent = isWsUnsubscribeEvent;
54
+ /** Simple typescript guard never expecting code to reach it (will throw typescript error if called) */
55
+ function neverGuard(x, msg) {
56
+ return new Error(`Unhandled value exception "${x}", ${msg}`);
57
+ }
58
+ exports.neverGuard = neverGuard;
14
59
  //# sourceMappingURL=typeGuards.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"typeGuards.js","sourceRoot":"","sources":["../../src/util/typeGuards.ts"],"names":[],"mappings":";;;AAEA,SAAgB,gBAAgB,CAC9B,QAAiB;IAEjB,IAAI,OAAO,QAAQ,KAAK,QAAQ,IAAI,CAAC,QAAQ,EAAE;QAC7C,OAAO,KAAK,CAAC;KACd;IAED,IAAI,MAAM,IAAI,QAAQ,IAAI,KAAK,IAAI,QAAQ,IAAI,MAAM,IAAI,QAAQ,EAAE;QACjE,OAAO,IAAI,CAAC;KACb;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAZD,4CAYC"}
1
+ {"version":3,"file":"typeGuards.js","sourceRoot":"","sources":["../../src/util/typeGuards.ts"],"names":[],"mappings":";;;AAGA,SAAgB,gBAAgB,CAC9B,QAAiB;IAEjB,IAAI,OAAO,QAAQ,KAAK,QAAQ,IAAI,CAAC,QAAQ,EAAE;QAC7C,OAAO,KAAK,CAAC;KACd;IAED,IAAI,MAAM,IAAI,QAAQ,IAAI,KAAK,IAAI,QAAQ,IAAI,MAAM,IAAI,QAAQ,EAAE;QACjE,OAAO,IAAI,CAAC;KACb;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAZD,4CAYC;AAED,4EAA4E;AAC5E,SAAgB,SAAS,CAAC,OAAgB;IACxC,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,CAAC,OAAO,EAAE;QAC3C,OAAO,KAAK,CAAC;KACd;IAED,IAAI,OAAO,IAAI,OAAO,EAAE;QACtB,OAAO,IAAI,CAAC;KACb;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAVD,8BAUC;AAED,SAAgB,aAAa,CAAC,OAAgB;IAC5C,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,CAAC,OAAO,EAAE;QAC3C,OAAO,KAAK,CAAC;KACd;IAED,IAAI,KAAK,IAAI,OAAO,IAAI,MAAM,IAAI,OAAO,EAAE;QACzC,OAAO,IAAI,CAAC;KACb;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AATD,sCASC;AAED,SAAgB,cAAc,CAAC,GAAY;IACzC,OAAO,SAAS,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,KAAK,KAAK,OAAO,CAAC;AACjD,CAAC;AAFD,wCAEC;AAED,mDAAmD;AACnD,SAAgB,cAAc,CAAC,GAAY;IACzC,OAAO,SAAS,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,KAAK,KAAK,OAAO,CAAC;AACjD,CAAC;AAFD,wCAEC;AAED,6CAA6C;AAC7C,SAAgB,kBAAkB,CAAC,OAAgB;IACjD,OAAO,SAAS,CAAC,OAAO,CAAC,IAAI,OAAO,CAAC,KAAK,KAAK,WAAW,CAAC;AAC7D,CAAC;AAFD,gDAEC;AAED,iDAAiD;AACjD,SAAgB,oBAAoB,CAAC,OAAgB;IACnD,OAAO,SAAS,CAAC,OAAO,CAAC,IAAI,OAAO,CAAC,KAAK,KAAK,aAAa,CAAC;AAC/D,CAAC;AAFD,oDAEC;AAED,uGAAuG;AACvG,SAAgB,UAAU,CAAC,CAAQ,EAAE,GAAW;IAC9C,OAAO,IAAI,KAAK,CAAC,8BAA8B,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC;AAC/D,CAAC;AAFD,gCAEC"}
@@ -0,0 +1,26 @@
1
+ import { APIMarket, WebsocketClientOptions, WsChannel } from '../types';
2
+ export declare const WS_BASE_URL_MAP: Record<APIMarket, Record<'public' | 'private', string>>;
3
+ export declare const WS_KEY_MAP: {
4
+ readonly prodPublic: "prodPublic";
5
+ readonly prodPrivate: "prodPrivate";
6
+ readonly awsPublic: "awsPublic";
7
+ readonly awsPrivate: "awsPrivate";
8
+ readonly demoPublic: "demoPublic";
9
+ readonly demoPrivate: "demoPrivate";
10
+ };
11
+ /** This is used to differentiate between each of the available websocket streams (as bybit has multiple websockets) */
12
+ export declare type WsKey = typeof WS_KEY_MAP[keyof typeof WS_KEY_MAP];
13
+ export declare const PRIVATE_WS_KEYS: WsKey[];
14
+ export declare const PUBLIC_WS_KEYS: WsKey[];
15
+ /** Determine which WsKey (ws connection) to route an event to */
16
+ export declare function getWsKeyForTopicChannel(market: APIMarket, channel: WsChannel, isPrivate?: boolean): WsKey;
17
+ export declare function getWsKeyForMarket(market: APIMarket, isPrivate: boolean): WsKey;
18
+ /** Maps a WS key back to a WS URL */
19
+ export declare function getWsUrlForWsKey(wsKey: WsKey, wsClientOptions: WebsocketClientOptions): string;
20
+ export declare function getMaxTopicsPerSubscribeEvent(market: APIMarket): number | null;
21
+ export declare function isWsPong(event: unknown): boolean;
22
+ export declare const WS_EVENT_CODE_ENUM: {
23
+ OK: string;
24
+ LOGIN_FAILED: string;
25
+ LOGIN_PARTIALLY_FAILED: string;
26
+ };
@@ -0,0 +1,131 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.WS_EVENT_CODE_ENUM = exports.isWsPong = exports.getMaxTopicsPerSubscribeEvent = exports.getWsUrlForWsKey = exports.getWsKeyForMarket = exports.getWsKeyForTopicChannel = exports.PUBLIC_WS_KEYS = exports.PRIVATE_WS_KEYS = exports.WS_KEY_MAP = exports.WS_BASE_URL_MAP = void 0;
4
+ const typeGuards_1 = require("./typeGuards");
5
+ exports.WS_BASE_URL_MAP = {
6
+ prod: {
7
+ public: 'wss://ws.okx.com:8443/ws/v5/public',
8
+ private: 'wss://ws.okx.com:8443/ws/v5/private',
9
+ },
10
+ aws: {
11
+ public: 'wss://wsaws.okx.com:8443/ws/v5/public',
12
+ private: 'wss://wsaws.okx.com:8443/ws/v5/private',
13
+ },
14
+ demo: {
15
+ public: 'wss://wspap.okx.com:8443/ws/v5/public?brokerId=9999',
16
+ private: 'wss://wspap.okx.com:8443/ws/v5/private?brokerId=9999',
17
+ },
18
+ };
19
+ exports.WS_KEY_MAP = {
20
+ prodPublic: 'prodPublic',
21
+ prodPrivate: 'prodPrivate',
22
+ awsPublic: 'awsPublic',
23
+ awsPrivate: 'awsPrivate',
24
+ demoPublic: 'demoPublic',
25
+ demoPrivate: 'demoPrivate',
26
+ };
27
+ exports.PRIVATE_WS_KEYS = [
28
+ exports.WS_KEY_MAP.prodPrivate,
29
+ exports.WS_KEY_MAP.awsPrivate,
30
+ exports.WS_KEY_MAP.demoPrivate,
31
+ ];
32
+ exports.PUBLIC_WS_KEYS = [
33
+ exports.WS_KEY_MAP.prodPublic,
34
+ exports.WS_KEY_MAP.awsPublic,
35
+ exports.WS_KEY_MAP.demoPublic,
36
+ ];
37
+ /** Used to automatically determine if a sub request should be to the public or private ws (when there's two) */
38
+ const PRIVATE_CHANNELS = [
39
+ 'account',
40
+ 'positions',
41
+ 'balance_and_position',
42
+ 'orders',
43
+ 'orders-algo',
44
+ 'algo-advance',
45
+ 'liquidation-warning',
46
+ 'account-greeks',
47
+ 'grid-orders-spot',
48
+ 'grid-orders-contract',
49
+ 'grid-orders-moon',
50
+ 'grid-positions',
51
+ 'grid-sub-orders',
52
+ ];
53
+ /** Determine which WsKey (ws connection) to route an event to */
54
+ function getWsKeyForTopicChannel(market, channel, isPrivate) {
55
+ const isPrivateTopic = isPrivate === true || PRIVATE_CHANNELS.includes(channel);
56
+ return getWsKeyForMarket(market, isPrivateTopic);
57
+ }
58
+ exports.getWsKeyForTopicChannel = getWsKeyForTopicChannel;
59
+ function getWsKeyForMarket(market, isPrivate) {
60
+ switch (market) {
61
+ case 'prod': {
62
+ return isPrivate ? exports.WS_KEY_MAP.prodPrivate : exports.WS_KEY_MAP.prodPublic;
63
+ }
64
+ case 'aws': {
65
+ return isPrivate ? exports.WS_KEY_MAP.awsPrivate : exports.WS_KEY_MAP.awsPublic;
66
+ }
67
+ case 'demo': {
68
+ return isPrivate ? exports.WS_KEY_MAP.demoPrivate : exports.WS_KEY_MAP.demoPublic;
69
+ }
70
+ default: {
71
+ throw (0, typeGuards_1.neverGuard)(market, `getWsKeyForTopic(): Unhandled market`);
72
+ }
73
+ }
74
+ }
75
+ exports.getWsKeyForMarket = getWsKeyForMarket;
76
+ /** Maps a WS key back to a WS URL */
77
+ function getWsUrlForWsKey(wsKey, wsClientOptions) {
78
+ if (wsClientOptions.wsUrl) {
79
+ return wsClientOptions.wsUrl;
80
+ }
81
+ switch (wsKey) {
82
+ case 'prodPublic':
83
+ return exports.WS_BASE_URL_MAP.prod.public;
84
+ case 'prodPrivate':
85
+ return exports.WS_BASE_URL_MAP.prod.private;
86
+ case 'awsPublic':
87
+ return exports.WS_BASE_URL_MAP.aws.public;
88
+ case 'awsPrivate':
89
+ return exports.WS_BASE_URL_MAP.aws.private;
90
+ case 'demoPublic':
91
+ return exports.WS_BASE_URL_MAP.demo.public;
92
+ case 'demoPrivate':
93
+ return exports.WS_BASE_URL_MAP.demo.private;
94
+ default: {
95
+ const errorMessage = 'getWsUrl(): Unhandled wsKey: ';
96
+ this.logger.error(errorMessage, {
97
+ category: 'okx-ws',
98
+ wsKey,
99
+ });
100
+ throw (0, typeGuards_1.neverGuard)(wsKey, errorMessage);
101
+ }
102
+ }
103
+ }
104
+ exports.getWsUrlForWsKey = getWsUrlForWsKey;
105
+ function getMaxTopicsPerSubscribeEvent(market) {
106
+ switch (market) {
107
+ case 'prod':
108
+ case 'aws':
109
+ case 'demo': {
110
+ return null;
111
+ }
112
+ default: {
113
+ throw (0, typeGuards_1.neverGuard)(market, `getWsKeyForTopic(): Unhandled market`);
114
+ }
115
+ }
116
+ }
117
+ exports.getMaxTopicsPerSubscribeEvent = getMaxTopicsPerSubscribeEvent;
118
+ function isWsPong(event) {
119
+ return (typeof event === 'object' &&
120
+ !!event &&
121
+ 'data' in event &&
122
+ typeof event['data'] === 'string' &&
123
+ event['data'] === 'pong');
124
+ }
125
+ exports.isWsPong = isWsPong;
126
+ exports.WS_EVENT_CODE_ENUM = {
127
+ OK: '0',
128
+ LOGIN_FAILED: '60009',
129
+ LOGIN_PARTIALLY_FAILED: '60022',
130
+ };
131
+ //# sourceMappingURL=websocket-util.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"websocket-util.js","sourceRoot":"","sources":["../../src/util/websocket-util.ts"],"names":[],"mappings":"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"}