@orderly.network/net 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/dist/index.mjs ADDED
@@ -0,0 +1,383 @@
1
+ var __defProp = Object.defineProperty;
2
+ var __defProps = Object.defineProperties;
3
+ var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
4
+ var __getOwnPropSymbols = Object.getOwnPropertySymbols;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __propIsEnum = Object.prototype.propertyIsEnumerable;
7
+ var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
8
+ var __spreadValues = (a, b) => {
9
+ for (var prop in b || (b = {}))
10
+ if (__hasOwnProp.call(b, prop))
11
+ __defNormalProp(a, prop, b[prop]);
12
+ if (__getOwnPropSymbols)
13
+ for (var prop of __getOwnPropSymbols(b)) {
14
+ if (__propIsEnum.call(b, prop))
15
+ __defNormalProp(a, prop, b[prop]);
16
+ }
17
+ return a;
18
+ };
19
+ var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
20
+ var __async = (__this, __arguments, generator) => {
21
+ return new Promise((resolve, reject) => {
22
+ var fulfilled = (value) => {
23
+ try {
24
+ step(generator.next(value));
25
+ } catch (e) {
26
+ reject(e);
27
+ }
28
+ };
29
+ var rejected = (value) => {
30
+ try {
31
+ step(generator.throw(value));
32
+ } catch (e) {
33
+ reject(e);
34
+ }
35
+ };
36
+ var step = (x) => x.done ? resolve(x.value) : Promise.resolve(x.value).then(fulfilled, rejected);
37
+ step((generator = generator.apply(__this, __arguments)).next());
38
+ });
39
+ };
40
+
41
+ // src/fetch/index.ts
42
+ function request(url, options) {
43
+ return __async(this, null, function* () {
44
+ if (!url.startsWith("http")) {
45
+ throw new Error("url must start with http(s)");
46
+ }
47
+ const urlInstance = new URL(url);
48
+ const response = yield fetch(urlInstance, __spreadProps(__spreadValues({}, options), {
49
+ // mode: "cors",
50
+ // credentials: "include",
51
+ headers: _createHeaders(options.headers)
52
+ })).catch((err) => {
53
+ throw new Error(err);
54
+ });
55
+ if (response.ok) {
56
+ return response.json();
57
+ }
58
+ throw new Error(response.statusText);
59
+ });
60
+ }
61
+ function _createHeaders(headers = {}) {
62
+ const _headers = new Headers(headers);
63
+ if (!_headers.has("Content-Type")) {
64
+ _headers.append("Content-Type", "application/json;charset=utf-8");
65
+ }
66
+ return _headers;
67
+ }
68
+ function get(url, options, formatter) {
69
+ return __async(this, null, function* () {
70
+ const res = yield request(url, __spreadValues({
71
+ method: "GET"
72
+ }, options));
73
+ if (res.success) {
74
+ if (typeof formatter === "function") {
75
+ return formatter(res.data);
76
+ }
77
+ if (Array.isArray(res.data["rows"])) {
78
+ return res.data["rows"];
79
+ }
80
+ return res.data;
81
+ }
82
+ throw new Error(res.message);
83
+ });
84
+ }
85
+ function post(url, data, options) {
86
+ return __async(this, null, function* () {
87
+ const res = yield request(url, __spreadValues({
88
+ method: "POST",
89
+ body: JSON.stringify(data)
90
+ }, options));
91
+ return res;
92
+ });
93
+ }
94
+
95
+ // src/ws/index.ts
96
+ import { webSocket } from "rxjs/webSocket";
97
+
98
+ // src/ws/contants.ts
99
+ var WS_URL = {
100
+ testnet: {
101
+ // public: "wss://testnet-ws.orderly.org/ws/stream/",
102
+ public: "wss://dev-ws-v2.orderly.org/ws/stream/",
103
+ // private:
104
+ // "wss://dev-ws-private-v2.orderly.org/wsprivate/v2/ws/private/stream/",
105
+ private: "wss://dev-ws-private-v2.orderly.org/v2/ws/private/stream/"
106
+ },
107
+ mainnet: {
108
+ public: "wss://mainnet-ws.orderly.io",
109
+ private: "wss://mainnet-ws.orderly.io"
110
+ }
111
+ };
112
+
113
+ // src/ws/index.ts
114
+ import { Observable } from "rxjs";
115
+
116
+ // src/ws/handler/baseHandler.ts
117
+ var BaseHandler = class {
118
+ // constructor(readonly wsSubject: WebSocketSubject<any>) {}
119
+ handle(message, send) {
120
+ throw new Error("Method not implemented.");
121
+ }
122
+ };
123
+
124
+ // src/ws/handler/ping.ts
125
+ var PingHandler = class extends BaseHandler {
126
+ handle(_, send) {
127
+ send({ event: "pong", ts: Date.now() });
128
+ }
129
+ };
130
+
131
+ // src/ws/handler/handler.ts
132
+ var messageHandlers = /* @__PURE__ */ new Map([
133
+ ["ping", new PingHandler()]
134
+ ]);
135
+
136
+ // src/ws/index.ts
137
+ var _WebSocketClient = class _WebSocketClient {
138
+ constructor(options) {
139
+ this.authenticated = false;
140
+ this._pendingPrivateSubscribe = [];
141
+ this.send = (message) => {
142
+ this.wsSubject.next(message);
143
+ };
144
+ this.privateSend = (message) => {
145
+ if (!this.privateWsSubject) {
146
+ console.warn("private ws not connected");
147
+ return;
148
+ }
149
+ this.privateWsSubject.next(message);
150
+ };
151
+ this.wsSubject = this.createSubject(options);
152
+ if (!!options.accountId) {
153
+ this.privateWsSubject = this.createPrivateSubject(options);
154
+ }
155
+ this.bindSubscribe();
156
+ }
157
+ createSubject(options) {
158
+ let url;
159
+ if (typeof options.url === "string") {
160
+ url = options.url;
161
+ } else {
162
+ url = WS_URL[options.networkId || "testnet"].public;
163
+ }
164
+ return webSocket({
165
+ url: `${url}${options.accountId || ""}`,
166
+ openObserver: {
167
+ next: () => {
168
+ console.log("Connection ok");
169
+ }
170
+ },
171
+ closeObserver: {
172
+ next: () => {
173
+ console.log("Connection closed");
174
+ }
175
+ }
176
+ });
177
+ }
178
+ createPrivateSubject(options) {
179
+ const url = WS_URL[options.networkId || "testnet"].private;
180
+ const ws = webSocket({
181
+ url: `${url}${options.accountId}`,
182
+ openObserver: {
183
+ next: () => {
184
+ var _a;
185
+ console.log("Private connection ok");
186
+ if (this.authenticated || !options.accountId)
187
+ return;
188
+ (_a = options.onSigntureRequest) == null ? void 0 : _a.call(options, options.accountId).then((signature) => {
189
+ this.authenticate(options.accountId, signature);
190
+ });
191
+ }
192
+ },
193
+ closeObserver: {
194
+ next: () => {
195
+ console.log("Private connection closed");
196
+ this.authenticated = false;
197
+ }
198
+ }
199
+ });
200
+ return ws;
201
+ }
202
+ bindSubscribe() {
203
+ this.wsSubject.subscribe({
204
+ next: (message) => {
205
+ const handler = messageHandlers.get(message.event);
206
+ if (handler) {
207
+ handler.handle(message, this.send);
208
+ }
209
+ },
210
+ error(err) {
211
+ console.log("WS Error: ", err);
212
+ },
213
+ complete() {
214
+ console.log("WS Connection closed");
215
+ }
216
+ });
217
+ if (!this.privateWsSubject)
218
+ return;
219
+ this.privateWsSubject.subscribe({
220
+ next: (message) => {
221
+ if (message.event === "auth") {
222
+ this.authenticated = true;
223
+ this._sendPendingPrivateMessage();
224
+ return;
225
+ }
226
+ const handler = messageHandlers.get(message.event);
227
+ if (handler) {
228
+ handler.handle(message, this.privateSend);
229
+ }
230
+ },
231
+ error(err) {
232
+ console.log("WS Error: ", err);
233
+ },
234
+ complete() {
235
+ console.log("WS Connection closed");
236
+ }
237
+ });
238
+ }
239
+ authenticate(accountId, message) {
240
+ var _a;
241
+ if (this.authenticated)
242
+ return;
243
+ if (!this.privateWsSubject) {
244
+ console.error("private ws not connected");
245
+ return;
246
+ }
247
+ console.log("push auth message:", message);
248
+ (_a = this.privateWsSubject) == null ? void 0 : _a.next({
249
+ id: "auth",
250
+ event: "auth",
251
+ params: {
252
+ orderly_key: message.publicKey,
253
+ sign: message.signature,
254
+ timestamp: message.timestamp
255
+ }
256
+ });
257
+ }
258
+ get isAuthed() {
259
+ return this.authenticated;
260
+ }
261
+ // observe<T>(topic: string): Observable<T>;
262
+ // observe<T>(topic: string, unsubscribe?: () => any): Observable<T>;
263
+ // observe<T>(
264
+ // params: {
265
+ // event: string;
266
+ // } & Record<string, any>,
267
+ // unsubscribe?: () => any
268
+ // ): Observable<T>;
269
+ observe(params, unsubscribe, messageFilter) {
270
+ return this._observe(false, params, unsubscribe, messageFilter);
271
+ }
272
+ // privateObserve<T>(topic: string): Observable<T>;
273
+ // privateObserve<T>(topic: string, unsubscribe?: () => any): Observable<T>;
274
+ // privateObserve<T>(
275
+ // params: {
276
+ // event: string;
277
+ // } & Record<string, any>,
278
+ // unsubscribe?: () => any
279
+ // ): Observable<T>;
280
+ privateObserve(params, unsubscribe, messageFilter) {
281
+ return this._observe(true, params, unsubscribe, messageFilter);
282
+ }
283
+ _observe(isPrivate, params, unsubscribe, messageFilter) {
284
+ if (isPrivate && !this.privateWsSubject) {
285
+ throw new Error("private ws not connected");
286
+ }
287
+ const subject = isPrivate ? this.privateWsSubject : this.wsSubject;
288
+ const sendFunc = isPrivate ? this.privateSend : this.send;
289
+ const [subscribeMessage, unsubscribeMessage, filter, messageFormatter] = this.generateMessage(params, unsubscribe, messageFilter);
290
+ return new Observable((observer) => {
291
+ if (isPrivate && !this.authenticated) {
292
+ this._pendingPrivateSubscribe.push(params);
293
+ return;
294
+ }
295
+ try {
296
+ const refCount = _WebSocketClient.__topicRefCountMap.get(subscribeMessage.topic) || 0;
297
+ if (refCount === 0) {
298
+ sendFunc(subscribeMessage);
299
+ _WebSocketClient.__topicRefCountMap.set(
300
+ subscribeMessage.topic,
301
+ refCount + 1
302
+ );
303
+ }
304
+ } catch (err) {
305
+ observer.error(err);
306
+ }
307
+ const subscription = subject.subscribe({
308
+ next: (x) => {
309
+ try {
310
+ if (filter(x)) {
311
+ observer.next(messageFormatter(x));
312
+ }
313
+ } catch (err) {
314
+ observer.error(err);
315
+ }
316
+ },
317
+ error: (err) => observer.error(err),
318
+ complete: () => observer.complete()
319
+ });
320
+ return () => {
321
+ try {
322
+ const refCount = _WebSocketClient.__topicRefCountMap.get(subscribeMessage.topic) || 0;
323
+ if (refCount > 1) {
324
+ _WebSocketClient.__topicRefCountMap.set(
325
+ subscribeMessage.topic,
326
+ refCount - 1
327
+ );
328
+ return;
329
+ }
330
+ if (!!unsubscribeMessage) {
331
+ this.send(unsubscribeMessage);
332
+ }
333
+ _WebSocketClient.__topicRefCountMap.delete(subscribeMessage.topic);
334
+ } catch (err) {
335
+ observer.error(err);
336
+ }
337
+ subscription.unsubscribe();
338
+ };
339
+ });
340
+ }
341
+ generateMessage(params, unsubscribe, messageFilter) {
342
+ let subscribeMessage, unsubscribeMessage;
343
+ let filter, messageFormatter = (message) => message.data;
344
+ if (typeof params === "string") {
345
+ subscribeMessage = { event: "subscribe", topic: params };
346
+ unsubscribeMessage = { event: "unsubscribe", topic: params };
347
+ filter = (message) => message.topic === params;
348
+ } else {
349
+ subscribeMessage = params;
350
+ unsubscribeMessage = typeof unsubscribe === "function" ? unsubscribe() : unsubscribe;
351
+ filter = messageFilter || ((message) => true);
352
+ }
353
+ return [subscribeMessage, unsubscribeMessage, filter, messageFormatter];
354
+ }
355
+ _sendPendingPrivateMessage() {
356
+ if (this._pendingPrivateSubscribe.length === 0)
357
+ return;
358
+ this._pendingPrivateSubscribe.forEach((params) => {
359
+ this.privateObserve(params).subscribe();
360
+ });
361
+ this._pendingPrivateSubscribe = [];
362
+ }
363
+ // 取消所有订阅
364
+ desotry() {
365
+ var _a;
366
+ this.wsSubject.unsubscribe();
367
+ (_a = this.privateWsSubject) == null ? void 0 : _a.unsubscribe();
368
+ }
369
+ };
370
+ // the topic reference count;
371
+ _WebSocketClient.__topicRefCountMap = /* @__PURE__ */ new Map();
372
+ var WebSocketClient = _WebSocketClient;
373
+ var ws_default = WebSocketClient;
374
+
375
+ // src/constants.ts
376
+ var __ORDERLY_API_URL_KEY__ = "__ORDERLY_API_URL__";
377
+ export {
378
+ ws_default as WebSocketClient,
379
+ __ORDERLY_API_URL_KEY__,
380
+ get,
381
+ post
382
+ };
383
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/fetch/index.ts","../src/ws/index.ts","../src/ws/contants.ts","../src/ws/handler/baseHandler.ts","../src/ws/handler/ping.ts","../src/ws/handler/handler.ts","../src/constants.ts"],"sourcesContent":["async function request(url: string, options: RequestInit) {\n // console.log(\"request\", url, options);\n if (!url.startsWith(\"http\")) {\n throw new Error(\"url must start with http(s)\");\n }\n const urlInstance = new URL(url);\n const response = await fetch(urlInstance, {\n ...options,\n // mode: \"cors\",\n // credentials: \"include\",\n headers: _createHeaders(options.headers),\n }).catch((err) => {\n throw new Error(err);\n });\n\n if (response.ok) {\n return response.json();\n }\n throw new Error(response.statusText);\n}\n\nfunction _createHeaders(headers: HeadersInit = {}): HeadersInit {\n // console.log(\"headers\", headers);\n const _headers = new Headers(headers);\n // _headers.append(\"Accept\", \"application/json\");\n\n if (!_headers.has(\"Content-Type\")) {\n _headers.append(\"Content-Type\", \"application/json;charset=utf-8\");\n }\n\n return _headers;\n}\n\nasync function get<R>(\n url: string,\n options?: RequestInit,\n formatter?: (data: any) => R\n): Promise<R> {\n const res = await request(url, {\n method: \"GET\",\n ...options,\n });\n\n if (res.success) {\n if (typeof formatter === \"function\") {\n return formatter(res.data);\n }\n // 根据返回的数据结构,返回需要的数据\n if (Array.isArray(res.data[\"rows\"])) {\n return res.data[\"rows\"] as R;\n }\n return res.data;\n }\n throw new Error(res.message);\n}\nasync function post(\n url: string,\n data: any,\n options?: Omit<RequestInit, \"method\">\n): Promise<any> {\n const res = await request(url, {\n method: \"POST\",\n body: JSON.stringify(data),\n ...options,\n });\n\n return res;\n}\n\nexport { get, post };\n","import { type WebSocketSubject, webSocket } from \"rxjs/webSocket\";\n\nimport { WS_URL } from \"./contants\";\nimport { Observable, Observer, Subject, tap } from \"rxjs\";\nimport { messageHandlers } from \"@/ws/handler/handler\";\n\nexport type NetworkId = \"testnet\" | \"mainnet\";\n\nexport type WSOptions = {\n url?: string;\n networkId?: NetworkId;\n accountId?: string;\n\n onSigntureRequest?: (accountId: string) => Promise<any>;\n};\n\nclass WebSocketClient {\n // the topic reference count;\n private static __topicRefCountMap: Map<string, number> = new Map();\n private wsSubject: WebSocketSubject<any>;\n private privateWsSubject?: WebSocketSubject<any>;\n\n private authenticated: boolean = false;\n\n private _pendingPrivateSubscribe: any[] = [];\n\n constructor(options: WSOptions) {\n this.wsSubject = this.createSubject(options);\n\n if (!!options.accountId) {\n this.privateWsSubject = this.createPrivateSubject(options);\n }\n\n this.bindSubscribe();\n }\n private createSubject(options: WSOptions): WebSocketSubject<any> {\n let url;\n if (typeof options.url === \"string\") {\n url = options.url;\n } else {\n url = WS_URL[options.networkId || \"testnet\"].public;\n }\n\n return webSocket({\n url: `${url}${options.accountId || \"\"}`,\n openObserver: {\n next: () => {\n console.log(\"Connection ok\");\n },\n },\n closeObserver: {\n next: () => {\n console.log(\"Connection closed\");\n },\n },\n });\n }\n\n private createPrivateSubject(options: WSOptions): WebSocketSubject<any> {\n const url = WS_URL[options.networkId || \"testnet\"].private;\n const ws = webSocket({\n url: `${url}${options.accountId}`,\n openObserver: {\n next: () => {\n console.log(\"Private connection ok\");\n if (this.authenticated || !options.accountId) return;\n\n options.onSigntureRequest?.(options.accountId).then((signature) => {\n this.authenticate(options.accountId!, signature);\n });\n },\n },\n closeObserver: {\n next: () => {\n console.log(\"Private connection closed\");\n this.authenticated = false;\n },\n },\n });\n // authenticate\n\n return ws;\n }\n\n private bindSubscribe() {\n /// 处理ping,auth等消息\n\n this.wsSubject.subscribe({\n next: (message) => {\n const handler = messageHandlers.get(message.event);\n if (handler) {\n handler.handle(message, this.send);\n }\n },\n error(err) {\n console.log(\"WS Error: \", err);\n },\n complete() {\n console.log(\"WS Connection closed\");\n },\n });\n\n if (!this.privateWsSubject) return;\n\n this.privateWsSubject.subscribe({\n next: (message) => {\n if (message.event === \"auth\") {\n this.authenticated = true;\n // 认证成功后,发送之前的订阅消息\n this._sendPendingPrivateMessage();\n return;\n }\n\n const handler = messageHandlers.get(message.event);\n\n if (handler) {\n handler.handle(message, this.privateSend);\n }\n },\n error(err) {\n console.log(\"WS Error: \", err);\n },\n complete() {\n console.log(\"WS Connection closed\");\n },\n });\n }\n\n private authenticate(\n accountId: string,\n message: {\n publicKey: string;\n signature: string;\n timestamp: number;\n }\n ) {\n if (this.authenticated) return;\n if (!this.privateWsSubject) {\n console.error(\"private ws not connected\");\n return;\n }\n\n console.log(\"push auth message:\", message);\n this.privateWsSubject?.next({\n id: \"auth\",\n event: \"auth\",\n params: {\n orderly_key: message.publicKey,\n sign: message.signature,\n timestamp: message.timestamp,\n },\n });\n // this.wsSubject.next({ type: \"authenticate\" });\n // this.authenticated = true;\n }\n\n send = (message: any) => {\n this.wsSubject.next(message);\n };\n\n privateSend = (message: any) => {\n if (!this.privateWsSubject) {\n console.warn(\"private ws not connected\");\n return;\n }\n\n this.privateWsSubject.next(message);\n };\n\n get isAuthed() {\n return this.authenticated;\n }\n\n // observe<T>(topic: string): Observable<T>;\n // observe<T>(topic: string, unsubscribe?: () => any): Observable<T>;\n // observe<T>(\n // params: {\n // event: string;\n // } & Record<string, any>,\n // unsubscribe?: () => any\n // ): Observable<T>;\n observe<T>(\n params: any,\n unsubscribe?: () => any,\n messageFilter?: (value: T) => boolean\n ): Observable<T> {\n return this._observe(false, params, unsubscribe, messageFilter);\n }\n\n // privateObserve<T>(topic: string): Observable<T>;\n // privateObserve<T>(topic: string, unsubscribe?: () => any): Observable<T>;\n // privateObserve<T>(\n // params: {\n // event: string;\n // } & Record<string, any>,\n // unsubscribe?: () => any\n // ): Observable<T>;\n privateObserve<T>(\n params: any,\n unsubscribe?: () => any,\n messageFilter?: (value: T) => boolean\n ): Observable<T> {\n return this._observe(true, params, unsubscribe, messageFilter);\n }\n\n private _observe<T>(\n isPrivate: boolean,\n params: any,\n unsubscribe?: () => any,\n messageFilter?: (value: T) => boolean\n ) {\n if (isPrivate && !this.privateWsSubject) {\n throw new Error(\"private ws not connected\");\n }\n\n const subject = isPrivate ? this.privateWsSubject : this.wsSubject;\n const sendFunc = isPrivate ? this.privateSend : this.send;\n\n const [subscribeMessage, unsubscribeMessage, filter, messageFormatter] =\n this.generateMessage(params, unsubscribe, messageFilter);\n\n return new Observable((observer: Observer<T>) => {\n // 如果是private ws, 但是没有连接,就先缓存起来,等连接上了再订阅\n if (isPrivate && !this.authenticated) {\n this._pendingPrivateSubscribe.push(params);\n return;\n }\n\n try {\n //TODO: add ref count, only send subscribe message when ref count is 0\n // 如果已经订阅过了,就不再发送订阅消息\n const refCount =\n WebSocketClient.__topicRefCountMap.get(subscribeMessage.topic) || 0;\n if (refCount === 0) {\n // WS.__topicRefCountMap.set(subscribeMessage.topic, WS.__topicRefCountMap.get(subscribeMessage.topic) + 1);\n // this.send(subscribeMessage);\n sendFunc(subscribeMessage);\n WebSocketClient.__topicRefCountMap.set(\n subscribeMessage.topic,\n refCount + 1\n );\n }\n } catch (err) {\n observer.error(err);\n }\n\n const subscription = subject!.subscribe({\n next: (x) => {\n try {\n if (filter(x)) {\n observer.next(messageFormatter(x));\n }\n } catch (err) {\n observer.error(err);\n }\n },\n error: (err) => observer.error(err),\n complete: () => observer.complete(),\n });\n\n return () => {\n try {\n // console.log(\"******* unsubscribe\", unsubscribeMessage);\n const refCount =\n WebSocketClient.__topicRefCountMap.get(subscribeMessage.topic) || 0;\n if (refCount > 1) {\n WebSocketClient.__topicRefCountMap.set(\n subscribeMessage.topic,\n refCount - 1\n );\n return;\n }\n if (!!unsubscribeMessage) {\n this.send(unsubscribeMessage);\n }\n WebSocketClient.__topicRefCountMap.delete(subscribeMessage.topic);\n } catch (err) {\n observer.error(err);\n }\n subscription.unsubscribe();\n };\n });\n }\n\n private generateMessage(\n params: any,\n unsubscribe?: () => any,\n messageFilter?: (value: any) => boolean\n ): [\n Record<string, any>,\n Record<string, any>,\n (message: any) => boolean,\n (message: any) => any\n ] {\n let subscribeMessage: Record<string, any>,\n unsubscribeMessage: Record<string, any>;\n let filter: (message: any) => boolean,\n messageFormatter: (message: any) => any = (message: any) => message.data;\n\n if (typeof params === \"string\") {\n subscribeMessage = { event: \"subscribe\", topic: params };\n unsubscribeMessage = { event: \"unsubscribe\", topic: params };\n filter = (message: any) => message.topic === params;\n } else {\n subscribeMessage = params;\n unsubscribeMessage =\n typeof unsubscribe === \"function\" ? unsubscribe() : unsubscribe;\n filter = messageFilter || ((message: any) => true);\n }\n\n return [subscribeMessage, unsubscribeMessage, filter, messageFormatter];\n }\n\n private _sendPendingPrivateMessage() {\n if (this._pendingPrivateSubscribe.length === 0) return;\n this._pendingPrivateSubscribe.forEach((params) => {\n this.privateObserve(params).subscribe();\n });\n this._pendingPrivateSubscribe = [];\n }\n\n // 取消所有订阅\n desotry() {\n this.wsSubject.unsubscribe();\n this.privateWsSubject?.unsubscribe();\n }\n}\n\nexport default WebSocketClient;\n","export const WS_URL = {\n testnet: {\n // public: \"wss://testnet-ws.orderly.org/ws/stream/\",\n public: \"wss://dev-ws-v2.orderly.org/ws/stream/\",\n // private:\n // \"wss://dev-ws-private-v2.orderly.org/wsprivate/v2/ws/private/stream/\",\n private: \"wss://dev-ws-private-v2.orderly.org/v2/ws/private/stream/\",\n },\n mainnet: {\n public: \"wss://mainnet-ws.orderly.io\",\n private: \"wss://mainnet-ws.orderly.io\",\n },\n};\n","import { MessageHandler, SendFunc } from \"@/types/ws\";\nimport { WebSocketSubject } from \"rxjs/webSocket\";\n\nexport default class BaseHandler implements MessageHandler {\n // constructor(readonly wsSubject: WebSocketSubject<any>) {}\n handle(message: any, send: SendFunc) {\n throw new Error(\"Method not implemented.\");\n }\n}\n","import BaseHandler from \"./baseHandler\";\nimport { SendFunc } from \"@/types/ws\";\n\nexport default class PingHandler extends BaseHandler {\n handle(_: any, send: SendFunc) {\n send({ event: \"pong\", ts: Date.now() });\n }\n}\n","import { MessageHandler } from \"@/types/ws\";\nimport PingHandler from \"./ping\";\n\nexport type MessageType =\n | \"ping\"\n | \"pong\"\n | \"subscribe\"\n | \"unsubscribe\"\n | \"authenticate\"\n | \"message\"\n | \"error\"\n | \"auth\"\n | \"close\";\n\nexport const messageHandlers = new Map<MessageType, MessageHandler>([\n [\"ping\", new PingHandler()],\n]);\n","export const __ORDERLY_API_URL_KEY__: string = \"__ORDERLY_API_URL__\";\n"],"mappings":"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","names":[]}
package/package.json ADDED
@@ -0,0 +1,33 @@
1
+ {
2
+ "name": "@orderly.network/net",
3
+ "version": "1.0.1",
4
+ "description": "",
5
+ "main": "dist/index.js",
6
+ "module": "dist/index.mjs",
7
+ "keywords": [],
8
+ "author": "",
9
+ "license": "ISC",
10
+ "devDependencies": {
11
+ "@babel/core": "^7.22.9",
12
+ "@babel/preset-env": "^7.22.9",
13
+ "@babel/preset-typescript": "^7.22.5",
14
+ "@types/jest": "^29.5.3",
15
+ "babel-jest": "^29.6.1",
16
+ "jest": "^29.6.1",
17
+ "rxjs": "^7.8.1",
18
+ "tsup": "^7.1.0",
19
+ "typescript": "^5.1.6",
20
+ "tsconfig": "0.0.1"
21
+ },
22
+ "peerDependencies": {
23
+ "rxjs": "^7.8.1"
24
+ },
25
+ "publishConfig": {
26
+ "access": "public"
27
+ },
28
+ "scripts": {
29
+ "dev": "tsup --watch",
30
+ "build": "tsup",
31
+ "test": "jest"
32
+ }
33
+ }
@@ -0,0 +1 @@
1
+ export const __ORDERLY_API_URL_KEY__: string = "__ORDERLY_API_URL__";
@@ -0,0 +1,70 @@
1
+ async function request(url: string, options: RequestInit) {
2
+ // console.log("request", url, options);
3
+ if (!url.startsWith("http")) {
4
+ throw new Error("url must start with http(s)");
5
+ }
6
+ const urlInstance = new URL(url);
7
+ const response = await fetch(urlInstance, {
8
+ ...options,
9
+ // mode: "cors",
10
+ // credentials: "include",
11
+ headers: _createHeaders(options.headers),
12
+ }).catch((err) => {
13
+ throw new Error(err);
14
+ });
15
+
16
+ if (response.ok) {
17
+ return response.json();
18
+ }
19
+ throw new Error(response.statusText);
20
+ }
21
+
22
+ function _createHeaders(headers: HeadersInit = {}): HeadersInit {
23
+ // console.log("headers", headers);
24
+ const _headers = new Headers(headers);
25
+ // _headers.append("Accept", "application/json");
26
+
27
+ if (!_headers.has("Content-Type")) {
28
+ _headers.append("Content-Type", "application/json;charset=utf-8");
29
+ }
30
+
31
+ return _headers;
32
+ }
33
+
34
+ async function get<R>(
35
+ url: string,
36
+ options?: RequestInit,
37
+ formatter?: (data: any) => R
38
+ ): Promise<R> {
39
+ const res = await request(url, {
40
+ method: "GET",
41
+ ...options,
42
+ });
43
+
44
+ if (res.success) {
45
+ if (typeof formatter === "function") {
46
+ return formatter(res.data);
47
+ }
48
+ // 根据返回的数据结构,返回需要的数据
49
+ if (Array.isArray(res.data["rows"])) {
50
+ return res.data["rows"] as R;
51
+ }
52
+ return res.data;
53
+ }
54
+ throw new Error(res.message);
55
+ }
56
+ async function post(
57
+ url: string,
58
+ data: any,
59
+ options?: Omit<RequestInit, "method">
60
+ ): Promise<any> {
61
+ const res = await request(url, {
62
+ method: "POST",
63
+ body: JSON.stringify(data),
64
+ ...options,
65
+ });
66
+
67
+ return res;
68
+ }
69
+
70
+ export { get, post };
package/src/index.ts ADDED
@@ -0,0 +1,4 @@
1
+ export { get, post } from "./fetch";
2
+
3
+ export { default as WebSocketClient } from "./ws";
4
+ export { __ORDERLY_API_URL_KEY__ } from "./constants";
@@ -0,0 +1,5 @@
1
+ import { sum } from "./sum";
2
+
3
+ test("adds 1 + 2 to equal 3", () => {
4
+ expect(sum(1, 2)).toBe(3);
5
+ });
package/src/sum.ts ADDED
@@ -0,0 +1 @@
1
+ export const sum = (a: number, b: number): number => a + b;
@@ -0,0 +1,15 @@
1
+ import { WebSocketSubject } from "rxjs/webSocket";
2
+
3
+ export type MessageObserveTopic = {
4
+ event: "subscribe" | "unsubscribe";
5
+ topic: string;
6
+ };
7
+
8
+ export type MessageObserveParams = string | MessageObserveTopic;
9
+
10
+ export type SendFunc = (message: any) => void;
11
+
12
+ export interface MessageHandler {
13
+ // wsSubject: WebSocketSubject<any>;
14
+ handle: (message: any, send: (message: SendFunc) => void) => void;
15
+ }
@@ -0,0 +1,20 @@
1
+ import { BehaviorSubject } from "rxjs";
2
+
3
+ class NetStateObserver {
4
+ public subject: BehaviorSubject<any>;
5
+ constructor() {
6
+ this.subject = new BehaviorSubject<any>(null);
7
+
8
+ this.bindEvents();
9
+ }
10
+
11
+ private bindEvents() {
12
+ // add net state change event listener to browser
13
+ }
14
+
15
+ get state() {
16
+ return this.subject.value;
17
+ }
18
+ }
19
+
20
+ export default new NetStateObserver();
@@ -0,0 +1,13 @@
1
+ export const WS_URL = {
2
+ testnet: {
3
+ // public: "wss://testnet-ws.orderly.org/ws/stream/",
4
+ public: "wss://dev-ws-v2.orderly.org/ws/stream/",
5
+ // private:
6
+ // "wss://dev-ws-private-v2.orderly.org/wsprivate/v2/ws/private/stream/",
7
+ private: "wss://dev-ws-private-v2.orderly.org/v2/ws/private/stream/",
8
+ },
9
+ mainnet: {
10
+ public: "wss://mainnet-ws.orderly.io",
11
+ private: "wss://mainnet-ws.orderly.io",
12
+ },
13
+ };
@@ -0,0 +1,9 @@
1
+ import { MessageHandler, SendFunc } from "@/types/ws";
2
+ import { WebSocketSubject } from "rxjs/webSocket";
3
+
4
+ export default class BaseHandler implements MessageHandler {
5
+ // constructor(readonly wsSubject: WebSocketSubject<any>) {}
6
+ handle(message: any, send: SendFunc) {
7
+ throw new Error("Method not implemented.");
8
+ }
9
+ }
@@ -0,0 +1,17 @@
1
+ import { MessageHandler } from "@/types/ws";
2
+ import PingHandler from "./ping";
3
+
4
+ export type MessageType =
5
+ | "ping"
6
+ | "pong"
7
+ | "subscribe"
8
+ | "unsubscribe"
9
+ | "authenticate"
10
+ | "message"
11
+ | "error"
12
+ | "auth"
13
+ | "close";
14
+
15
+ export const messageHandlers = new Map<MessageType, MessageHandler>([
16
+ ["ping", new PingHandler()],
17
+ ]);
@@ -0,0 +1,8 @@
1
+ import BaseHandler from "./baseHandler";
2
+ import { SendFunc } from "@/types/ws";
3
+
4
+ export default class PingHandler extends BaseHandler {
5
+ handle(_: any, send: SendFunc) {
6
+ send({ event: "pong", ts: Date.now() });
7
+ }
8
+ }