@orderly.network/net 1.0.89 → 1.0.90
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/.turbo/turbo-build.log +10 -10
- package/CHANGELOG.md +6 -0
- package/dist/index.d.mts +4 -4
- package/dist/index.d.ts +4 -4
- package/dist/index.js +1 -2
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +1 -2
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
- package/src/fetch/index.ts +3 -3
package/.turbo/turbo-build.log
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
|
|
2
|
-
> @orderly.network/net@1.0.
|
|
2
|
+
> @orderly.network/net@1.0.89 build /Users/leo/orderly/orderly-web/packages/net
|
|
3
3
|
> tsup
|
|
4
4
|
|
|
5
5
|
CLI Building entry: src/index.ts
|
|
@@ -10,13 +10,13 @@ CLI Target: es6
|
|
|
10
10
|
CLI Cleaning output folder
|
|
11
11
|
CJS Build start
|
|
12
12
|
ESM Build start
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
13
|
+
CJS dist/index.js 19.38 KB
|
|
14
|
+
CJS dist/index.js.map 33.42 KB
|
|
15
|
+
CJS ⚡️ Build success in 38ms
|
|
16
|
+
ESM dist/index.mjs 18.34 KB
|
|
17
|
+
ESM dist/index.mjs.map 33.18 KB
|
|
18
|
+
ESM ⚡️ Build success in 38ms
|
|
19
19
|
DTS Build start
|
|
20
|
-
DTS ⚡️ Build success in
|
|
21
|
-
DTS dist/index.d.ts 3.
|
|
22
|
-
DTS dist/index.d.mts 3.
|
|
20
|
+
DTS ⚡️ Build success in 1199ms
|
|
21
|
+
DTS dist/index.d.ts 3.17 KB
|
|
22
|
+
DTS dist/index.d.mts 3.17 KB
|
package/CHANGELOG.md
CHANGED
package/dist/index.d.mts
CHANGED
|
@@ -6,16 +6,16 @@ declare function mutate(url: string, init: RequestInit): Promise<any>;
|
|
|
6
6
|
|
|
7
7
|
declare const __ORDERLY_API_URL_KEY__: string;
|
|
8
8
|
|
|
9
|
-
type NetworkId = "testnet" | "mainnet";
|
|
10
|
-
type WSOptions = {
|
|
9
|
+
declare type NetworkId = "testnet" | "mainnet";
|
|
10
|
+
declare type WSOptions = {
|
|
11
11
|
privateUrl: string;
|
|
12
12
|
publicUrl: string;
|
|
13
13
|
networkId?: NetworkId;
|
|
14
14
|
accountId?: string;
|
|
15
15
|
onSigntureRequest?: (accountId: string) => Promise<any>;
|
|
16
16
|
};
|
|
17
|
-
type unsubscribe = () => void;
|
|
18
|
-
type WSMessageHandler = {
|
|
17
|
+
declare type unsubscribe = () => void;
|
|
18
|
+
declare type WSMessageHandler = {
|
|
19
19
|
onMessage: (message: any) => void;
|
|
20
20
|
onError?: (error: any) => void;
|
|
21
21
|
onClose?: (event: any) => void;
|
package/dist/index.d.ts
CHANGED
|
@@ -6,16 +6,16 @@ declare function mutate(url: string, init: RequestInit): Promise<any>;
|
|
|
6
6
|
|
|
7
7
|
declare const __ORDERLY_API_URL_KEY__: string;
|
|
8
8
|
|
|
9
|
-
type NetworkId = "testnet" | "mainnet";
|
|
10
|
-
type WSOptions = {
|
|
9
|
+
declare type NetworkId = "testnet" | "mainnet";
|
|
10
|
+
declare type WSOptions = {
|
|
11
11
|
privateUrl: string;
|
|
12
12
|
publicUrl: string;
|
|
13
13
|
networkId?: NetworkId;
|
|
14
14
|
accountId?: string;
|
|
15
15
|
onSigntureRequest?: (accountId: string) => Promise<any>;
|
|
16
16
|
};
|
|
17
|
-
type unsubscribe = () => void;
|
|
18
|
-
type WSMessageHandler = {
|
|
17
|
+
declare type unsubscribe = () => void;
|
|
18
|
+
declare type WSMessageHandler = {
|
|
19
19
|
onMessage: (message: any) => void;
|
|
20
20
|
onError?: (error: any) => void;
|
|
21
21
|
onClose?: (event: any) => void;
|
package/dist/index.js
CHANGED
|
@@ -73,8 +73,7 @@ function request(url, options) {
|
|
|
73
73
|
if (!url.startsWith("http")) {
|
|
74
74
|
throw new Error("url must start with http(s)");
|
|
75
75
|
}
|
|
76
|
-
const
|
|
77
|
-
const response = yield fetch(urlInstance, __spreadProps(__spreadValues({}, options), {
|
|
76
|
+
const response = yield fetch(url, __spreadProps(__spreadValues({}, options), {
|
|
78
77
|
// mode: "cors",
|
|
79
78
|
// credentials: "include",
|
|
80
79
|
headers: _createHeaders(options.headers, options.method)
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/fetch/index.ts","../src/constants.ts","../src/ws/handler/baseHandler.ts","../src/ws/handler/ping.ts","../src/ws/handler/handler.ts","../src/ws/ws.ts"],"sourcesContent":["export { get, post, del, put, mutate } from \"./fetch\";\n\nexport { __ORDERLY_API_URL_KEY__ } from \"./constants\";\n\nexport { WS } from \"./ws/ws\";\n","async function request(url: string, options: RequestInit) {\n //\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, options.method),\n });\n\n if (response.ok) {\n const res = await response.json();\n return res;\n // if (res.success) {\n // return res;\n // } else {\n // throw new Error(res.message);\n // }\n }\n\n throw new Error(response.statusText);\n}\n\nfunction _createHeaders(\n headers: HeadersInit = {},\n method?: string\n): HeadersInit {\n //\n const _headers = new Headers(headers);\n // _headers.append(\"Accept\", \"application/json\");\n\n if (!_headers.has(\"Content-Type\")) {\n if (method !== \"DELETE\") {\n _headers.append(\"Content-Type\", \"application/json;charset=utf-8\");\n } else {\n _headers.append(\"Content-Type\", \"application/x-www-form-urlencoded\");\n }\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\nasync function put(\n url: string,\n data: any,\n options?: Omit<RequestInit, \"method\">\n): Promise<any> {\n const res = await request(url, {\n method: \"PUT\",\n body: JSON.stringify(data),\n ...options,\n });\n\n return res;\n}\n\nasync function del(\n url: string,\n options?: Omit<RequestInit, \"method\">\n): Promise<any> {\n const res = await request(url, {\n method: \"DELETE\",\n ...options,\n });\n\n return res;\n}\n\nasync function mutate(url: string, init: RequestInit) {\n const res = await request(url, init);\n\n return res;\n}\n\nexport { get, post, del, put, mutate };\n","export const __ORDERLY_API_URL_KEY__: string = \"__ORDERLY_API_URL__\";\n","import { MessageHandler } from \"@/types/ws\";\n\nexport default class BaseHandler implements MessageHandler {\n handle(message: any, webSocket: WebSocket) {\n throw new Error(\"Method not implemented.\");\n }\n}\n","import BaseHandler from \"./baseHandler\";\n\nexport default class PingHandler extends BaseHandler {\n handle(_: any, webSocket: WebSocket) {\n webSocket.send(JSON.stringify({ 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","import { messageHandlers } from \"./handler/handler\";\n\nexport type NetworkId = \"testnet\" | \"mainnet\";\n\nexport type WSOptions = {\n privateUrl: string;\n publicUrl: string;\n networkId?: NetworkId;\n accountId?: string;\n\n onSigntureRequest?: (accountId: string) => Promise<any>;\n};\n\nexport type unsubscribe = () => void;\n\nexport type MessageParams = {\n event: string;\n topic: string;\n\n onMessage?: (message: any) => any;\n\n params?: any;\n // [key: string]: any;\n};\n\ntype WSMessageHandler = {\n onMessage: (message: any) => void;\n onError?: (error: any) => void;\n onClose?: (event: any) => void;\n onUnsubscribe: (event: any) => any;\n formatter?: (message: any) => any;\n};\n\ntype Topics = {\n params: MessageParams;\n isPrivate?: boolean;\n isOnce?: boolean;\n callback: WSMessageHandler[];\n};\n\nconst defaultMessageFormatter = (message: any) => message.data;\nconst COMMON_ID = \"OqdphuyCtYWxwzhxyLLjOWNdFP7sQt8RPWzmb5xY\";\n\nconst TIME_OUT = 1000 * 60 * 2;\nconst CONNECT_LIMIT = 5;\n\nexport class WS {\n private _publicSocket!: WebSocket;\n private privateSocket?: WebSocket;\n\n private _eventContainer: Map<string, Set<Function>> = new Map();\n\n private publicIsReconnecting: boolean = false;\n private privateIsReconnecting: boolean = false;\n\n private reconnectInterval: number = 1000;\n\n private authenticated: boolean = false;\n\n private _pendingPrivateSubscribe: any[][] = [];\n private _pendingPublicSubscribe: any[][] = [];\n\n // all message handlers\n private _eventHandlers: Map<string, Topics> = new Map();\n private _eventPrivateHandlers: Map<string, Topics> = new Map();\n\n private _publicHeartbeatTime?: number;\n private _privateHeartbeatTime?: number;\n\n private _publicRetryCount: number = 0;\n private _privateRetryCount: number = 0;\n\n constructor(private options: WSOptions) {\n this.createPublicSC(options);\n\n if (!!options.accountId) {\n this.createPrivateSC(options);\n }\n\n this.bindEvents();\n }\n\n private bindEvents() {\n if (typeof document !== \"undefined\") {\n document.addEventListener(\n \"visibilitychange\",\n this.onVisibilityChange.bind(this)\n );\n }\n\n if (typeof window !== \"undefined\") {\n window.addEventListener(\"online\", this.onNetworkStatusChange.bind(this));\n // window.addEventListener(\"offline\", this.onNetworkStatusChange);\n }\n }\n\n private onVisibilityChange() {\n if (document.visibilityState === \"visible\") {\n this.checkSocketStatus();\n }\n // else {\n // this.publicSocket.close();\n // this.privateSocket?.close();\n // }\n }\n\n private onNetworkStatusChange() {\n if (navigator.onLine) {\n this.checkSocketStatus();\n }\n }\n\n /**\n * 判断当前连接状态,\n * 1、如果已断开则重连\n * 2、如果太久没有收到消息,则主动断开,并重连\n * 3、从后台返回、网络状态变化时,都走以下流程\n */\n private checkSocketStatus() {\n const now = Date.now();\n\n //\n // \"👀👀 checkNetworkStatus 👀👀\",\n // this._publicHeartbeatTime,\n // this._privateHeartbeatTime,\n // now,\n // this.publicSocket.readyState,\n // this.privateSocket?.readyState\n // );\n\n // check the last time\n // 如果容器不可见,则不做处理\n if (document.visibilityState !== \"visible\") return;\n // 如果网络不可用,则不做处理\n if (!navigator.onLine) return;\n\n // 如果已断开,则重连\n // public\n if (!this.publicIsReconnecting) {\n if (this._publicSocket.readyState === WebSocket.CLOSED) {\n this.reconnectPublic();\n } else {\n if (now - this._publicHeartbeatTime! > TIME_OUT) {\n //unsubscribe all public topic\n this._publicSocket.close();\n }\n }\n }\n\n if (!this.privateIsReconnecting) {\n // private\n if (this.privateSocket?.readyState === WebSocket.CLOSED) {\n this.reconnectPrivate();\n } else {\n if (\n this._privateHeartbeatTime &&\n now - this._privateHeartbeatTime! > TIME_OUT\n ) {\n // unsubscribe all private topic\n this.privateSocket?.close();\n }\n }\n }\n }\n\n public openPrivate(accountId: string) {\n if (this.privateSocket?.readyState === WebSocket.OPEN) {\n return;\n }\n this.createPrivateSC({\n ...this.options,\n accountId,\n });\n }\n\n public closePrivate() {\n this.authenticated = false;\n this._pendingPrivateSubscribe = [];\n\n this._eventPrivateHandlers.clear();\n\n this.privateSocket?.close();\n }\n\n private createPublicSC(options: WSOptions) {\n if (this._publicSocket && this._publicSocket.readyState === WebSocket.OPEN)\n return;\n this._publicSocket = new WebSocket(\n `${this.options.publicUrl}/ws/stream/${COMMON_ID}`\n );\n this._publicSocket.onopen = this.onOpen.bind(this);\n // this.publicSocket.onmessage = this.onPublicMessage.bind(this);\n this._publicSocket.addEventListener(\n \"message\",\n this.onPublicMessage.bind(this)\n );\n this._publicSocket.addEventListener(\"close\", this.onPublicClose.bind(this));\n this._publicSocket.addEventListener(\"error\", this.onPublicError.bind(this));\n // this.publicSocket.onclose = this.onPublicClose.bind(this);\n // this.publicSocket.onerror = this.onPublicError.bind(this);\n }\n\n private createPrivateSC(options: WSOptions) {\n if (this.privateSocket && this.privateSocket.readyState === WebSocket.OPEN)\n return;\n\n this.options = options;\n\n this.privateSocket = new WebSocket(\n `${this.options.privateUrl}/v2/ws/private/stream/${options.accountId}`\n );\n this.privateSocket.onopen = this.onPrivateOpen.bind(this);\n this.privateSocket.onmessage = this.onPrivateMessage.bind(this);\n this.privateSocket.onclose = this.onPrivateClose.bind(this);\n this.privateSocket.onerror = this.onPrivateError.bind(this);\n }\n\n private onOpen(event: Event) {\n //\n if (this._pendingPublicSubscribe.length > 0) {\n this._pendingPublicSubscribe.forEach(([params, cb, isOnce]) => {\n this.subscribe(params, cb, isOnce);\n });\n this._pendingPublicSubscribe = [];\n }\n\n this.publicIsReconnecting = false;\n this._publicRetryCount = 0;\n }\n\n private onPrivateOpen(event: Event) {\n //auth\n this.authenticate(this.options.accountId!);\n this.privateIsReconnecting = false;\n this._privateRetryCount = 0;\n }\n\n private onMessage(\n event: MessageEvent,\n socket: WebSocket,\n handlerMap: Map<string, Topics>\n ) {\n try {\n const message = JSON.parse(event.data);\n\n const commoneHandler = messageHandlers.get(message.event);\n\n if (message.event === \"auth\" && message.success) {\n this.authenticated = true;\n this.handlePendingPrivateTopic();\n return;\n }\n\n if (commoneHandler) {\n commoneHandler.handle(message, socket);\n } else {\n const topicKey = this.getTopicKeyFromMessage(message);\n\n const eventhandler = handlerMap.get(topicKey);\n //\n if (eventhandler?.callback) {\n // console.log(\"👀👀👀👀👀👀👀👀👀\", topicKey, eventhandler?.callback);\n eventhandler.callback.forEach((cb) => {\n const data = cb.formatter\n ? cb.formatter(message)\n : defaultMessageFormatter(message);\n\n if (data) {\n cb.onMessage(data);\n }\n });\n\n // 延时删除,在重连时还需要用到\n // if (eventhandler.isOnce) {\n // handlerMap.delete(topicKey);\n // }\n }\n\n // 触发事件\n this._eventContainer.forEach((_, key) => {\n const reg = new RegExp(key);\n if (reg.test(topicKey)) {\n this.emit(key, message);\n }\n });\n }\n\n //\n } catch (e) {}\n\n // You can process the received message here\n }\n\n private onPublicMessage(event: MessageEvent) {\n this.onMessage(event, this._publicSocket, this._eventHandlers);\n // 更新最后收到消息的时间\n this._publicHeartbeatTime = Date.now();\n }\n\n private onPrivateMessage(event: MessageEvent) {\n this.onMessage(event, this.privateSocket!, this._eventPrivateHandlers);\n // 更新最后收到消息的时间\n this._privateHeartbeatTime = Date.now();\n }\n\n private handlePendingPrivateTopic() {\n if (this._pendingPrivateSubscribe.length > 0) {\n this._pendingPrivateSubscribe.forEach(([params, cb]) => {\n this.privateSubscribe(params, cb);\n });\n this._pendingPrivateSubscribe = [];\n }\n }\n\n private onPublicClose(event: CloseEvent) {\n // move handler to pending\n this._eventHandlers.forEach((value, key) => {\n value.callback.forEach((cb) => {\n this._pendingPublicSubscribe.push([value.params, cb, value.isOnce]);\n });\n\n this._eventHandlers.delete(key);\n });\n\n setTimeout(() => this.checkSocketStatus(), 0);\n }\n\n private onPrivateClose(event: CloseEvent) {\n if (this.privateIsReconnecting) return;\n this._eventPrivateHandlers.forEach((value, key) => {\n value.callback.forEach((cb) => {\n this._pendingPrivateSubscribe.push([value.params, cb, value.isOnce]);\n });\n\n this._eventPrivateHandlers.delete(key);\n });\n this.authenticated = false;\n\n setTimeout(() => this.checkSocketStatus(), 0);\n }\n\n private onPublicError(event: Event) {\n console.error(\"public WebSocket error:\", event);\n this.publicIsReconnecting = false;\n\n if (this._publicSocket.readyState === WebSocket.OPEN) {\n this._publicSocket.close();\n } else {\n // retry connect\n if (this._publicRetryCount > CONNECT_LIMIT) return;\n setTimeout(() => {\n // this.createPublicSC(this.options);\n this.reconnectPublic();\n this._publicRetryCount++;\n }, this._publicRetryCount * 1000);\n }\n\n this.errorBoardscast(event, this._eventHandlers);\n }\n\n private onPrivateError(event: Event) {\n console.error(\"Private WebSocket error:\", event);\n this.privateIsReconnecting = false;\n\n if (this.privateSocket?.readyState === WebSocket.OPEN) {\n this.privateSocket.close();\n } else {\n // retry connect\n if (this._privateRetryCount > CONNECT_LIMIT) return;\n setTimeout(() => {\n // this.createPublicSC(this.options);\n this.reconnectPrivate();\n this._privateRetryCount++;\n }, this._privateRetryCount * 1000);\n }\n\n this.errorBoardscast(event, this._eventPrivateHandlers);\n }\n\n private errorBoardscast(error: any, eventHandlers: Map<string, Topics>) {\n eventHandlers.forEach((value) => {\n value.callback.forEach((cb) => {\n cb.onError?.(error);\n });\n });\n }\n\n send = (message: any) => {\n if (typeof message !== \"string\") {\n message = JSON.stringify(message);\n }\n if (typeof message === \"undefined\") return;\n if (this._publicSocket.readyState === WebSocket.OPEN) {\n this._publicSocket.send(message);\n //\n } else {\n console.warn(\"WebSocket connection is not open. Cannot send message.\");\n }\n };\n\n close() {\n this._publicSocket.close();\n this.privateSocket?.close();\n }\n\n set accountId(accountId: string) {}\n\n private async authenticate(accountId: string) {\n if (this.authenticated) return;\n if (!this.privateSocket) {\n console.error(\"private ws not connected\");\n return;\n }\n\n const message = await this.options.onSigntureRequest?.(accountId);\n\n this.privateSocket.send(\n JSON.stringify({\n id: \"auth\",\n event: \"auth\",\n params: {\n orderly_key: message.publicKey,\n sign: message.signature,\n timestamp: message.timestamp,\n },\n })\n );\n // this.wsSubject.next({ type: \"authenticate\" });\n // this.authenticated = true;\n }\n\n privateSubscribe(\n params: any,\n callback: WSMessageHandler | Omit<WSMessageHandler, \"onUnsubscribe\">\n ) {\n const [subscribeMessage, onUnsubscribe] = this.generateMessage(\n params,\n (callback as WSMessageHandler).onUnsubscribe\n );\n\n if (this.privateSocket?.readyState !== WebSocket.OPEN) {\n this._pendingPrivateSubscribe.push([params, callback]);\n return () => {\n this.unsubscribePrivate(subscribeMessage);\n };\n }\n\n const topic = subscribeMessage.topic || subscribeMessage.event;\n\n const handler = this._eventPrivateHandlers.get(topic);\n const callbacks = {\n ...callback,\n onUnsubscribe,\n };\n\n if (!handler) {\n this._eventPrivateHandlers.set(topic, {\n params,\n callback: [callbacks],\n });\n this.privateSocket.send(JSON.stringify(subscribeMessage));\n } else {\n handler.callback.push(callbacks);\n }\n\n return () => {\n this.unsubscribePrivate(subscribeMessage);\n };\n }\n\n subscribe(\n params: any,\n callback: WSMessageHandler | Omit<WSMessageHandler, \"onUnsubscribe\">,\n once?: boolean,\n id?: string\n ): unsubscribe | undefined {\n //\n\n const [subscribeMessage, onUnsubscribe] = this.generateMessage(\n params,\n (callback as WSMessageHandler).onUnsubscribe,\n (callback as WSMessageHandler).onMessage\n );\n\n //\n\n if (this._publicSocket.readyState !== WebSocket.OPEN) {\n this._pendingPublicSubscribe.push([params, callback, once, id]);\n\n if (!once) {\n return () => {\n this.unsubscribePublic(subscribeMessage);\n };\n }\n return;\n }\n\n let topic = this.getTopicKeyFromParams(subscribeMessage);\n // const topic = subscribeMessage.topic || subscribeMessage.event;\n\n const handler = this._eventHandlers.get(topic);\n const callbacks = {\n ...callback,\n onUnsubscribe,\n };\n\n if (!handler) {\n this._eventHandlers.set(topic, {\n params,\n isOnce: once,\n callback: [callbacks],\n });\n this._publicSocket.send(JSON.stringify(subscribeMessage));\n } else {\n // 是否once,如果是once,则替换掉之前的callback\n if (once) {\n handler.callback = [callbacks];\n this._publicSocket.send(JSON.stringify(subscribeMessage));\n } else {\n handler.callback.push(callbacks);\n }\n }\n\n // this._subscriptionPublicTopics.push({params, cb: [cb]});\n\n if (!once) {\n return () => {\n this.unsubscribePublic(subscribeMessage);\n };\n }\n }\n\n private getTopicKeyFromParams(params: any): string {\n let topic;\n\n if (params.topic) {\n topic = params.topic;\n } else {\n const eventName = params.event;\n topic = params.event;\n\n if (params.id) {\n topic += `_${params.id}`;\n }\n }\n\n return topic;\n }\n\n private getTopicKeyFromMessage(message: any): string {\n let topic;\n if (message.topic) {\n topic = message.topic;\n } else {\n if (message.event) {\n topic = `${message.event}`;\n\n if (message.id) {\n topic += `_${message.id}`;\n }\n }\n }\n\n return topic;\n }\n\n // sendPublicMessage(){\n // if(this.publicSocket.readyState !== )\n // }\n\n onceSubscribe(\n params: any,\n callback: Omit<WSMessageHandler, \"onUnsubscribe\">\n ) {\n this.subscribe(params, callback, true);\n }\n\n private unsubscribe(\n parmas: MessageParams,\n webSocket: WebSocket,\n handlerMap: Map<string, Topics>\n ) {\n const topic = parmas.topic || parmas.event;\n const handler = handlerMap.get(topic);\n\n // console.log(\"unsubscribe\", topic);\n\n if (!!handler && Array.isArray(handler?.callback)) {\n // console.log(\"是否需要退订\", handler.callback.length);\n if (handler!.callback.length === 1) {\n const unsubscribeMessage = handler!.callback[0].onUnsubscribe(topic);\n\n // console.log(\"退订参数 unsubscribeMessage\", unsubscribeMessage);\n\n //\n webSocket.send(JSON.stringify(unsubscribeMessage));\n handlerMap.delete(topic);\n //post unsubscribe message\n } else {\n const index = handler.callback.findIndex(\n (cb) => cb.onMessage === parmas.onMessage\n );\n\n // console.log(index, handler.callback.length);\n\n if (index === -1) return;\n\n handler.callback.splice(index, 1);\n\n // handlerMap.set(topic, {\n // ...handler,\n // callback: handler.callback.splice(index, 1),\n // });\n }\n }\n }\n\n private unsubscribePrivate(parmas: MessageParams) {\n this.unsubscribe(parmas, this.privateSocket!, this._eventPrivateHandlers);\n }\n\n private unsubscribePublic(parmas: MessageParams) {\n this.unsubscribe(parmas, this._publicSocket, this._eventHandlers);\n }\n\n private generateMessage(\n params: any,\n onUnsubscribe?: (event: string) => any,\n onMessage?: (message: any) => any\n ): [MessageParams, (event: string) => any] {\n let subscribeMessage;\n\n if (typeof params === \"string\") {\n subscribeMessage = { event: \"subscribe\", topic: params };\n } else {\n subscribeMessage = params;\n }\n\n if (typeof onUnsubscribe !== \"function\") {\n if (typeof params === \"string\") {\n onUnsubscribe = () => ({ event: \"unsubscribe\", topic: params });\n } else {\n onUnsubscribe = () => ({ event: \"unsubscribe\", topic: params.topic });\n }\n }\n\n return [{ ...subscribeMessage, onMessage }, onUnsubscribe];\n }\n\n private reconnectPublic() {\n if (this.publicIsReconnecting) return;\n this.publicIsReconnecting = true;\n\n window.setTimeout(() => {\n this.createPublicSC(this.options);\n }, this.reconnectInterval);\n }\n\n private reconnectPrivate() {\n if (!this.options.accountId) return;\n if (this.privateIsReconnecting) return;\n this.privateIsReconnecting = true;\n\n window.setTimeout(() => {\n this.createPrivateSC(this.options);\n }, this.reconnectInterval);\n }\n\n get publicSocket(): WebSocket {\n return this._publicSocket;\n }\n\n on(eventName: string, callback: (message: any) => any) {\n if (this._eventContainer.has(eventName)) {\n this._eventContainer.get(eventName)?.add(callback);\n }\n this._eventContainer.set(eventName, new Set([callback]));\n }\n\n off(eventName: string, callback: (message: any) => any) {\n if (this._eventContainer.has(eventName)) {\n this._eventContainer.get(eventName)?.delete(callback);\n }\n }\n\n emit(eventName: string, message: any) {\n if (this._eventContainer.has(eventName)) {\n this._eventContainer.get(eventName)?.forEach((cb) => cb(message));\n }\n }\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/fetch/index.ts","../src/constants.ts","../src/ws/handler/baseHandler.ts","../src/ws/handler/ping.ts","../src/ws/handler/handler.ts","../src/ws/ws.ts"],"sourcesContent":["export { get, post, del, put, mutate } from \"./fetch\";\n\nexport { __ORDERLY_API_URL_KEY__ } from \"./constants\";\n\nexport { WS } from \"./ws/ws\";\n","async function request(url: string, options: RequestInit) {\n //\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(url, {\n ...options,\n // mode: \"cors\",\n // credentials: \"include\",\n headers: _createHeaders(options.headers, options.method),\n });\n\n if (response.ok) {\n const res = await response.json();\n return res;\n // if (res.success) {\n // return res;\n // } else {\n // throw new Error(res.message);\n // }\n }\n\n throw new Error(response.statusText);\n}\n\nfunction _createHeaders(\n headers: HeadersInit = {},\n method?: string\n): HeadersInit {\n //\n const _headers = new Headers(headers);\n // _headers.append(\"Accept\", \"application/json\");\n\n if (!_headers.has(\"Content-Type\")) {\n if (method !== \"DELETE\") {\n _headers.append(\"Content-Type\", \"application/json;charset=utf-8\");\n } else {\n _headers.append(\"Content-Type\", \"application/x-www-form-urlencoded\");\n }\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 unknown 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\nasync function put(\n url: string,\n data: any,\n options?: Omit<RequestInit, \"method\">\n): Promise<any> {\n const res = await request(url, {\n method: \"PUT\",\n body: JSON.stringify(data),\n ...options,\n });\n\n return res;\n}\n\nasync function del(\n url: string,\n options?: Omit<RequestInit, \"method\">\n): Promise<any> {\n const res = await request(url, {\n method: \"DELETE\",\n ...options,\n });\n\n return res;\n}\n\nasync function mutate(url: string, init: RequestInit) {\n const res = await request(url, init);\n\n return res;\n}\n\nexport { get, post, del, put, mutate };\n","export const __ORDERLY_API_URL_KEY__: string = \"__ORDERLY_API_URL__\";\n","import { MessageHandler } from \"@/types/ws\";\n\nexport default class BaseHandler implements MessageHandler {\n handle(message: any, webSocket: WebSocket) {\n throw new Error(\"Method not implemented.\");\n }\n}\n","import BaseHandler from \"./baseHandler\";\n\nexport default class PingHandler extends BaseHandler {\n handle(_: any, webSocket: WebSocket) {\n webSocket.send(JSON.stringify({ 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","import { messageHandlers } from \"./handler/handler\";\n\nexport type NetworkId = \"testnet\" | \"mainnet\";\n\nexport type WSOptions = {\n privateUrl: string;\n publicUrl: string;\n networkId?: NetworkId;\n accountId?: string;\n\n onSigntureRequest?: (accountId: string) => Promise<any>;\n};\n\nexport type unsubscribe = () => void;\n\nexport type MessageParams = {\n event: string;\n topic: string;\n\n onMessage?: (message: any) => any;\n\n params?: any;\n // [key: string]: any;\n};\n\ntype WSMessageHandler = {\n onMessage: (message: any) => void;\n onError?: (error: any) => void;\n onClose?: (event: any) => void;\n onUnsubscribe: (event: any) => any;\n formatter?: (message: any) => any;\n};\n\ntype Topics = {\n params: MessageParams;\n isPrivate?: boolean;\n isOnce?: boolean;\n callback: WSMessageHandler[];\n};\n\nconst defaultMessageFormatter = (message: any) => message.data;\nconst COMMON_ID = \"OqdphuyCtYWxwzhxyLLjOWNdFP7sQt8RPWzmb5xY\";\n\nconst TIME_OUT = 1000 * 60 * 2;\nconst CONNECT_LIMIT = 5;\n\nexport class WS {\n private _publicSocket!: WebSocket;\n private privateSocket?: WebSocket;\n\n private _eventContainer: Map<string, Set<Function>> = new Map();\n\n private publicIsReconnecting: boolean = false;\n private privateIsReconnecting: boolean = false;\n\n private reconnectInterval: number = 1000;\n\n private authenticated: boolean = false;\n\n private _pendingPrivateSubscribe: any[][] = [];\n private _pendingPublicSubscribe: any[][] = [];\n\n // all message handlers\n private _eventHandlers: Map<string, Topics> = new Map();\n private _eventPrivateHandlers: Map<string, Topics> = new Map();\n\n private _publicHeartbeatTime?: number;\n private _privateHeartbeatTime?: number;\n\n private _publicRetryCount: number = 0;\n private _privateRetryCount: number = 0;\n\n constructor(private options: WSOptions) {\n this.createPublicSC(options);\n\n if (!!options.accountId) {\n this.createPrivateSC(options);\n }\n\n this.bindEvents();\n }\n\n private bindEvents() {\n if (typeof document !== \"undefined\") {\n document.addEventListener(\n \"visibilitychange\",\n this.onVisibilityChange.bind(this)\n );\n }\n\n if (typeof window !== \"undefined\") {\n window.addEventListener(\"online\", this.onNetworkStatusChange.bind(this));\n // window.addEventListener(\"offline\", this.onNetworkStatusChange);\n }\n }\n\n private onVisibilityChange() {\n if (document.visibilityState === \"visible\") {\n this.checkSocketStatus();\n }\n // else {\n // this.publicSocket.close();\n // this.privateSocket?.close();\n // }\n }\n\n private onNetworkStatusChange() {\n if (navigator.onLine) {\n this.checkSocketStatus();\n }\n }\n\n /**\n * 判断当前连接状态,\n * 1、如果已断开则重连\n * 2、如果太久没有收到消息,则主动断开,并重连\n * 3、从后台返回、网络状态变化时,都走以下流程\n */\n private checkSocketStatus() {\n const now = Date.now();\n\n //\n // \"👀👀 checkNetworkStatus 👀👀\",\n // this._publicHeartbeatTime,\n // this._privateHeartbeatTime,\n // now,\n // this.publicSocket.readyState,\n // this.privateSocket?.readyState\n // );\n\n // check the last time\n // 如果容器不可见,则不做处理\n if (document.visibilityState !== \"visible\") return;\n // 如果网络不可用,则不做处理\n if (!navigator.onLine) return;\n\n // 如果已断开,则重连\n // public\n if (!this.publicIsReconnecting) {\n if (this._publicSocket.readyState === WebSocket.CLOSED) {\n this.reconnectPublic();\n } else {\n if (now - this._publicHeartbeatTime! > TIME_OUT) {\n //unsubscribe all public topic\n this._publicSocket.close();\n }\n }\n }\n\n if (!this.privateIsReconnecting) {\n // private\n if (this.privateSocket?.readyState === WebSocket.CLOSED) {\n this.reconnectPrivate();\n } else {\n if (\n this._privateHeartbeatTime &&\n now - this._privateHeartbeatTime! > TIME_OUT\n ) {\n // unsubscribe all private topic\n this.privateSocket?.close();\n }\n }\n }\n }\n\n public openPrivate(accountId: string) {\n if (this.privateSocket?.readyState === WebSocket.OPEN) {\n return;\n }\n this.createPrivateSC({\n ...this.options,\n accountId,\n });\n }\n\n public closePrivate() {\n this.authenticated = false;\n this._pendingPrivateSubscribe = [];\n\n this._eventPrivateHandlers.clear();\n\n this.privateSocket?.close();\n }\n\n private createPublicSC(options: WSOptions) {\n if (this._publicSocket && this._publicSocket.readyState === WebSocket.OPEN)\n return;\n this._publicSocket = new WebSocket(\n `${this.options.publicUrl}/ws/stream/${COMMON_ID}`\n );\n this._publicSocket.onopen = this.onOpen.bind(this);\n // this.publicSocket.onmessage = this.onPublicMessage.bind(this);\n this._publicSocket.addEventListener(\n \"message\",\n this.onPublicMessage.bind(this)\n );\n this._publicSocket.addEventListener(\"close\", this.onPublicClose.bind(this));\n this._publicSocket.addEventListener(\"error\", this.onPublicError.bind(this));\n // this.publicSocket.onclose = this.onPublicClose.bind(this);\n // this.publicSocket.onerror = this.onPublicError.bind(this);\n }\n\n private createPrivateSC(options: WSOptions) {\n if (this.privateSocket && this.privateSocket.readyState === WebSocket.OPEN)\n return;\n\n this.options = options;\n\n this.privateSocket = new WebSocket(\n `${this.options.privateUrl}/v2/ws/private/stream/${options.accountId}`\n );\n this.privateSocket.onopen = this.onPrivateOpen.bind(this);\n this.privateSocket.onmessage = this.onPrivateMessage.bind(this);\n this.privateSocket.onclose = this.onPrivateClose.bind(this);\n this.privateSocket.onerror = this.onPrivateError.bind(this);\n }\n\n private onOpen(event: Event) {\n //\n if (this._pendingPublicSubscribe.length > 0) {\n this._pendingPublicSubscribe.forEach(([params, cb, isOnce]) => {\n this.subscribe(params, cb, isOnce);\n });\n this._pendingPublicSubscribe = [];\n }\n\n this.publicIsReconnecting = false;\n this._publicRetryCount = 0;\n }\n\n private onPrivateOpen(event: Event) {\n //auth\n this.authenticate(this.options.accountId!);\n this.privateIsReconnecting = false;\n this._privateRetryCount = 0;\n }\n\n private onMessage(\n event: MessageEvent,\n socket: WebSocket,\n handlerMap: Map<string, Topics>\n ) {\n try {\n const message = JSON.parse(event.data);\n\n const commoneHandler = messageHandlers.get(message.event);\n\n if (message.event === \"auth\" && message.success) {\n this.authenticated = true;\n this.handlePendingPrivateTopic();\n return;\n }\n\n if (commoneHandler) {\n commoneHandler.handle(message, socket);\n } else {\n const topicKey = this.getTopicKeyFromMessage(message);\n\n const eventhandler = handlerMap.get(topicKey);\n //\n if (eventhandler?.callback) {\n // console.log(\"👀👀👀👀👀👀👀👀👀\", topicKey, eventhandler?.callback);\n eventhandler.callback.forEach((cb) => {\n const data = cb.formatter\n ? cb.formatter(message)\n : defaultMessageFormatter(message);\n\n if (data) {\n cb.onMessage(data);\n }\n });\n\n // 延时删除,在重连时还需要用到\n // if (eventhandler.isOnce) {\n // handlerMap.delete(topicKey);\n // }\n }\n\n // 触发事件\n this._eventContainer.forEach((_, key) => {\n const reg = new RegExp(key);\n if (reg.test(topicKey)) {\n this.emit(key, message);\n }\n });\n }\n\n //\n } catch (e) {}\n\n // You can process the received message here\n }\n\n private onPublicMessage(event: MessageEvent) {\n this.onMessage(event, this._publicSocket, this._eventHandlers);\n // 更新最后收到消息的时间\n this._publicHeartbeatTime = Date.now();\n }\n\n private onPrivateMessage(event: MessageEvent) {\n this.onMessage(event, this.privateSocket!, this._eventPrivateHandlers);\n // 更新最后收到消息的时间\n this._privateHeartbeatTime = Date.now();\n }\n\n private handlePendingPrivateTopic() {\n if (this._pendingPrivateSubscribe.length > 0) {\n this._pendingPrivateSubscribe.forEach(([params, cb]) => {\n this.privateSubscribe(params, cb);\n });\n this._pendingPrivateSubscribe = [];\n }\n }\n\n private onPublicClose(event: CloseEvent) {\n // move handler to pending\n this._eventHandlers.forEach((value, key) => {\n value.callback.forEach((cb) => {\n this._pendingPublicSubscribe.push([value.params, cb, value.isOnce]);\n });\n\n this._eventHandlers.delete(key);\n });\n\n setTimeout(() => this.checkSocketStatus(), 0);\n }\n\n private onPrivateClose(event: CloseEvent) {\n if (this.privateIsReconnecting) return;\n this._eventPrivateHandlers.forEach((value, key) => {\n value.callback.forEach((cb) => {\n this._pendingPrivateSubscribe.push([value.params, cb, value.isOnce]);\n });\n\n this._eventPrivateHandlers.delete(key);\n });\n this.authenticated = false;\n\n setTimeout(() => this.checkSocketStatus(), 0);\n }\n\n private onPublicError(event: Event) {\n console.error(\"public WebSocket error:\", event);\n this.publicIsReconnecting = false;\n\n if (this._publicSocket.readyState === WebSocket.OPEN) {\n this._publicSocket.close();\n } else {\n // retry connect\n if (this._publicRetryCount > CONNECT_LIMIT) return;\n setTimeout(() => {\n // this.createPublicSC(this.options);\n this.reconnectPublic();\n this._publicRetryCount++;\n }, this._publicRetryCount * 1000);\n }\n\n this.errorBoardscast(event, this._eventHandlers);\n }\n\n private onPrivateError(event: Event) {\n console.error(\"Private WebSocket error:\", event);\n this.privateIsReconnecting = false;\n\n if (this.privateSocket?.readyState === WebSocket.OPEN) {\n this.privateSocket.close();\n } else {\n // retry connect\n if (this._privateRetryCount > CONNECT_LIMIT) return;\n setTimeout(() => {\n // this.createPublicSC(this.options);\n this.reconnectPrivate();\n this._privateRetryCount++;\n }, this._privateRetryCount * 1000);\n }\n\n this.errorBoardscast(event, this._eventPrivateHandlers);\n }\n\n private errorBoardscast(error: any, eventHandlers: Map<string, Topics>) {\n eventHandlers.forEach((value) => {\n value.callback.forEach((cb) => {\n cb.onError?.(error);\n });\n });\n }\n\n send = (message: any) => {\n if (typeof message !== \"string\") {\n message = JSON.stringify(message);\n }\n if (typeof message === \"undefined\") return;\n if (this._publicSocket.readyState === WebSocket.OPEN) {\n this._publicSocket.send(message);\n //\n } else {\n console.warn(\"WebSocket connection is not open. Cannot send message.\");\n }\n };\n\n close() {\n this._publicSocket.close();\n this.privateSocket?.close();\n }\n\n set accountId(accountId: string) {}\n\n private async authenticate(accountId: string) {\n if (this.authenticated) return;\n if (!this.privateSocket) {\n console.error(\"private ws not connected\");\n return;\n }\n\n const message = await this.options.onSigntureRequest?.(accountId);\n\n this.privateSocket.send(\n JSON.stringify({\n id: \"auth\",\n event: \"auth\",\n params: {\n orderly_key: message.publicKey,\n sign: message.signature,\n timestamp: message.timestamp,\n },\n })\n );\n // this.wsSubject.next({ type: \"authenticate\" });\n // this.authenticated = true;\n }\n\n privateSubscribe(\n params: any,\n callback: WSMessageHandler | Omit<WSMessageHandler, \"onUnsubscribe\">\n ) {\n const [subscribeMessage, onUnsubscribe] = this.generateMessage(\n params,\n (callback as WSMessageHandler).onUnsubscribe\n );\n\n if (this.privateSocket?.readyState !== WebSocket.OPEN) {\n this._pendingPrivateSubscribe.push([params, callback]);\n return () => {\n this.unsubscribePrivate(subscribeMessage);\n };\n }\n\n const topic = subscribeMessage.topic || subscribeMessage.event;\n\n const handler = this._eventPrivateHandlers.get(topic);\n const callbacks = {\n ...callback,\n onUnsubscribe,\n };\n\n if (!handler) {\n this._eventPrivateHandlers.set(topic, {\n params,\n callback: [callbacks],\n });\n this.privateSocket.send(JSON.stringify(subscribeMessage));\n } else {\n handler.callback.push(callbacks);\n }\n\n return () => {\n this.unsubscribePrivate(subscribeMessage);\n };\n }\n\n subscribe(\n params: any,\n callback: WSMessageHandler | Omit<WSMessageHandler, \"onUnsubscribe\">,\n once?: boolean,\n id?: string\n ): unsubscribe | undefined {\n //\n\n const [subscribeMessage, onUnsubscribe] = this.generateMessage(\n params,\n (callback as WSMessageHandler).onUnsubscribe,\n (callback as WSMessageHandler).onMessage\n );\n\n //\n\n if (this._publicSocket.readyState !== WebSocket.OPEN) {\n this._pendingPublicSubscribe.push([params, callback, once, id]);\n\n if (!once) {\n return () => {\n this.unsubscribePublic(subscribeMessage);\n };\n }\n return;\n }\n\n let topic = this.getTopicKeyFromParams(subscribeMessage);\n // const topic = subscribeMessage.topic || subscribeMessage.event;\n\n const handler = this._eventHandlers.get(topic);\n const callbacks = {\n ...callback,\n onUnsubscribe,\n };\n\n if (!handler) {\n this._eventHandlers.set(topic, {\n params,\n isOnce: once,\n callback: [callbacks],\n });\n this._publicSocket.send(JSON.stringify(subscribeMessage));\n } else {\n // 是否once,如果是once,则替换掉之前的callback\n if (once) {\n handler.callback = [callbacks];\n this._publicSocket.send(JSON.stringify(subscribeMessage));\n } else {\n handler.callback.push(callbacks);\n }\n }\n\n // this._subscriptionPublicTopics.push({params, cb: [cb]});\n\n if (!once) {\n return () => {\n this.unsubscribePublic(subscribeMessage);\n };\n }\n }\n\n private getTopicKeyFromParams(params: any): string {\n let topic;\n\n if (params.topic) {\n topic = params.topic;\n } else {\n const eventName = params.event;\n topic = params.event;\n\n if (params.id) {\n topic += `_${params.id}`;\n }\n }\n\n return topic;\n }\n\n private getTopicKeyFromMessage(message: any): string {\n let topic;\n if (message.topic) {\n topic = message.topic;\n } else {\n if (message.event) {\n topic = `${message.event}`;\n\n if (message.id) {\n topic += `_${message.id}`;\n }\n }\n }\n\n return topic;\n }\n\n // sendPublicMessage(){\n // if(this.publicSocket.readyState !== )\n // }\n\n onceSubscribe(\n params: any,\n callback: Omit<WSMessageHandler, \"onUnsubscribe\">\n ) {\n this.subscribe(params, callback, true);\n }\n\n private unsubscribe(\n parmas: MessageParams,\n webSocket: WebSocket,\n handlerMap: Map<string, Topics>\n ) {\n const topic = parmas.topic || parmas.event;\n const handler = handlerMap.get(topic);\n\n // console.log(\"unsubscribe\", topic);\n\n if (!!handler && Array.isArray(handler?.callback)) {\n // console.log(\"是否需要退订\", handler.callback.length);\n if (handler!.callback.length === 1) {\n const unsubscribeMessage = handler!.callback[0].onUnsubscribe(topic);\n\n // console.log(\"退订参数 unsubscribeMessage\", unsubscribeMessage);\n\n //\n webSocket.send(JSON.stringify(unsubscribeMessage));\n handlerMap.delete(topic);\n //post unsubscribe message\n } else {\n const index = handler.callback.findIndex(\n (cb) => cb.onMessage === parmas.onMessage\n );\n\n // console.log(index, handler.callback.length);\n\n if (index === -1) return;\n\n handler.callback.splice(index, 1);\n\n // handlerMap.set(topic, {\n // ...handler,\n // callback: handler.callback.splice(index, 1),\n // });\n }\n }\n }\n\n private unsubscribePrivate(parmas: MessageParams) {\n this.unsubscribe(parmas, this.privateSocket!, this._eventPrivateHandlers);\n }\n\n private unsubscribePublic(parmas: MessageParams) {\n this.unsubscribe(parmas, this._publicSocket, this._eventHandlers);\n }\n\n private generateMessage(\n params: any,\n onUnsubscribe?: (event: string) => any,\n onMessage?: (message: any) => any\n ): [MessageParams, (event: string) => any] {\n let subscribeMessage;\n\n if (typeof params === \"string\") {\n subscribeMessage = { event: \"subscribe\", topic: params };\n } else {\n subscribeMessage = params;\n }\n\n if (typeof onUnsubscribe !== \"function\") {\n if (typeof params === \"string\") {\n onUnsubscribe = () => ({ event: \"unsubscribe\", topic: params });\n } else {\n onUnsubscribe = () => ({ event: \"unsubscribe\", topic: params.topic });\n }\n }\n\n return [{ ...subscribeMessage, onMessage }, onUnsubscribe];\n }\n\n private reconnectPublic() {\n if (this.publicIsReconnecting) return;\n this.publicIsReconnecting = true;\n\n window.setTimeout(() => {\n this.createPublicSC(this.options);\n }, this.reconnectInterval);\n }\n\n private reconnectPrivate() {\n if (!this.options.accountId) return;\n if (this.privateIsReconnecting) return;\n this.privateIsReconnecting = true;\n\n window.setTimeout(() => {\n this.createPrivateSC(this.options);\n }, this.reconnectInterval);\n }\n\n get publicSocket(): WebSocket {\n return this._publicSocket;\n }\n\n on(eventName: string, callback: (message: any) => any) {\n if (this._eventContainer.has(eventName)) {\n this._eventContainer.get(eventName)?.add(callback);\n }\n this._eventContainer.set(eventName, new Set([callback]));\n }\n\n off(eventName: string, callback: (message: any) => any) {\n if (this._eventContainer.has(eventName)) {\n this._eventContainer.get(eventName)?.delete(callback);\n }\n }\n\n emit(eventName: string, message: any) {\n if (this._eventContainer.has(eventName)) {\n this._eventContainer.get(eventName)?.forEach((cb) => cb(message));\n }\n }\n}\n"],"mappings":"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","names":[]}
|
package/dist/index.mjs
CHANGED
|
@@ -44,8 +44,7 @@ function request(url, options) {
|
|
|
44
44
|
if (!url.startsWith("http")) {
|
|
45
45
|
throw new Error("url must start with http(s)");
|
|
46
46
|
}
|
|
47
|
-
const
|
|
48
|
-
const response = yield fetch(urlInstance, __spreadProps(__spreadValues({}, options), {
|
|
47
|
+
const response = yield fetch(url, __spreadProps(__spreadValues({}, options), {
|
|
49
48
|
// mode: "cors",
|
|
50
49
|
// credentials: "include",
|
|
51
50
|
headers: _createHeaders(options.headers, options.method)
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/fetch/index.ts","../src/constants.ts","../src/ws/handler/baseHandler.ts","../src/ws/handler/ping.ts","../src/ws/handler/handler.ts","../src/ws/ws.ts"],"sourcesContent":["async function request(url: string, options: RequestInit) {\n //\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, options.method),\n });\n\n if (response.ok) {\n const res = await response.json();\n return res;\n // if (res.success) {\n // return res;\n // } else {\n // throw new Error(res.message);\n // }\n }\n\n throw new Error(response.statusText);\n}\n\nfunction _createHeaders(\n headers: HeadersInit = {},\n method?: string\n): HeadersInit {\n //\n const _headers = new Headers(headers);\n // _headers.append(\"Accept\", \"application/json\");\n\n if (!_headers.has(\"Content-Type\")) {\n if (method !== \"DELETE\") {\n _headers.append(\"Content-Type\", \"application/json;charset=utf-8\");\n } else {\n _headers.append(\"Content-Type\", \"application/x-www-form-urlencoded\");\n }\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\nasync function put(\n url: string,\n data: any,\n options?: Omit<RequestInit, \"method\">\n): Promise<any> {\n const res = await request(url, {\n method: \"PUT\",\n body: JSON.stringify(data),\n ...options,\n });\n\n return res;\n}\n\nasync function del(\n url: string,\n options?: Omit<RequestInit, \"method\">\n): Promise<any> {\n const res = await request(url, {\n method: \"DELETE\",\n ...options,\n });\n\n return res;\n}\n\nasync function mutate(url: string, init: RequestInit) {\n const res = await request(url, init);\n\n return res;\n}\n\nexport { get, post, del, put, mutate };\n","export const __ORDERLY_API_URL_KEY__: string = \"__ORDERLY_API_URL__\";\n","import { MessageHandler } from \"@/types/ws\";\n\nexport default class BaseHandler implements MessageHandler {\n handle(message: any, webSocket: WebSocket) {\n throw new Error(\"Method not implemented.\");\n }\n}\n","import BaseHandler from \"./baseHandler\";\n\nexport default class PingHandler extends BaseHandler {\n handle(_: any, webSocket: WebSocket) {\n webSocket.send(JSON.stringify({ 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","import { messageHandlers } from \"./handler/handler\";\n\nexport type NetworkId = \"testnet\" | \"mainnet\";\n\nexport type WSOptions = {\n privateUrl: string;\n publicUrl: string;\n networkId?: NetworkId;\n accountId?: string;\n\n onSigntureRequest?: (accountId: string) => Promise<any>;\n};\n\nexport type unsubscribe = () => void;\n\nexport type MessageParams = {\n event: string;\n topic: string;\n\n onMessage?: (message: any) => any;\n\n params?: any;\n // [key: string]: any;\n};\n\ntype WSMessageHandler = {\n onMessage: (message: any) => void;\n onError?: (error: any) => void;\n onClose?: (event: any) => void;\n onUnsubscribe: (event: any) => any;\n formatter?: (message: any) => any;\n};\n\ntype Topics = {\n params: MessageParams;\n isPrivate?: boolean;\n isOnce?: boolean;\n callback: WSMessageHandler[];\n};\n\nconst defaultMessageFormatter = (message: any) => message.data;\nconst COMMON_ID = \"OqdphuyCtYWxwzhxyLLjOWNdFP7sQt8RPWzmb5xY\";\n\nconst TIME_OUT = 1000 * 60 * 2;\nconst CONNECT_LIMIT = 5;\n\nexport class WS {\n private _publicSocket!: WebSocket;\n private privateSocket?: WebSocket;\n\n private _eventContainer: Map<string, Set<Function>> = new Map();\n\n private publicIsReconnecting: boolean = false;\n private privateIsReconnecting: boolean = false;\n\n private reconnectInterval: number = 1000;\n\n private authenticated: boolean = false;\n\n private _pendingPrivateSubscribe: any[][] = [];\n private _pendingPublicSubscribe: any[][] = [];\n\n // all message handlers\n private _eventHandlers: Map<string, Topics> = new Map();\n private _eventPrivateHandlers: Map<string, Topics> = new Map();\n\n private _publicHeartbeatTime?: number;\n private _privateHeartbeatTime?: number;\n\n private _publicRetryCount: number = 0;\n private _privateRetryCount: number = 0;\n\n constructor(private options: WSOptions) {\n this.createPublicSC(options);\n\n if (!!options.accountId) {\n this.createPrivateSC(options);\n }\n\n this.bindEvents();\n }\n\n private bindEvents() {\n if (typeof document !== \"undefined\") {\n document.addEventListener(\n \"visibilitychange\",\n this.onVisibilityChange.bind(this)\n );\n }\n\n if (typeof window !== \"undefined\") {\n window.addEventListener(\"online\", this.onNetworkStatusChange.bind(this));\n // window.addEventListener(\"offline\", this.onNetworkStatusChange);\n }\n }\n\n private onVisibilityChange() {\n if (document.visibilityState === \"visible\") {\n this.checkSocketStatus();\n }\n // else {\n // this.publicSocket.close();\n // this.privateSocket?.close();\n // }\n }\n\n private onNetworkStatusChange() {\n if (navigator.onLine) {\n this.checkSocketStatus();\n }\n }\n\n /**\n * 判断当前连接状态,\n * 1、如果已断开则重连\n * 2、如果太久没有收到消息,则主动断开,并重连\n * 3、从后台返回、网络状态变化时,都走以下流程\n */\n private checkSocketStatus() {\n const now = Date.now();\n\n //\n // \"👀👀 checkNetworkStatus 👀👀\",\n // this._publicHeartbeatTime,\n // this._privateHeartbeatTime,\n // now,\n // this.publicSocket.readyState,\n // this.privateSocket?.readyState\n // );\n\n // check the last time\n // 如果容器不可见,则不做处理\n if (document.visibilityState !== \"visible\") return;\n // 如果网络不可用,则不做处理\n if (!navigator.onLine) return;\n\n // 如果已断开,则重连\n // public\n if (!this.publicIsReconnecting) {\n if (this._publicSocket.readyState === WebSocket.CLOSED) {\n this.reconnectPublic();\n } else {\n if (now - this._publicHeartbeatTime! > TIME_OUT) {\n //unsubscribe all public topic\n this._publicSocket.close();\n }\n }\n }\n\n if (!this.privateIsReconnecting) {\n // private\n if (this.privateSocket?.readyState === WebSocket.CLOSED) {\n this.reconnectPrivate();\n } else {\n if (\n this._privateHeartbeatTime &&\n now - this._privateHeartbeatTime! > TIME_OUT\n ) {\n // unsubscribe all private topic\n this.privateSocket?.close();\n }\n }\n }\n }\n\n public openPrivate(accountId: string) {\n if (this.privateSocket?.readyState === WebSocket.OPEN) {\n return;\n }\n this.createPrivateSC({\n ...this.options,\n accountId,\n });\n }\n\n public closePrivate() {\n this.authenticated = false;\n this._pendingPrivateSubscribe = [];\n\n this._eventPrivateHandlers.clear();\n\n this.privateSocket?.close();\n }\n\n private createPublicSC(options: WSOptions) {\n if (this._publicSocket && this._publicSocket.readyState === WebSocket.OPEN)\n return;\n this._publicSocket = new WebSocket(\n `${this.options.publicUrl}/ws/stream/${COMMON_ID}`\n );\n this._publicSocket.onopen = this.onOpen.bind(this);\n // this.publicSocket.onmessage = this.onPublicMessage.bind(this);\n this._publicSocket.addEventListener(\n \"message\",\n this.onPublicMessage.bind(this)\n );\n this._publicSocket.addEventListener(\"close\", this.onPublicClose.bind(this));\n this._publicSocket.addEventListener(\"error\", this.onPublicError.bind(this));\n // this.publicSocket.onclose = this.onPublicClose.bind(this);\n // this.publicSocket.onerror = this.onPublicError.bind(this);\n }\n\n private createPrivateSC(options: WSOptions) {\n if (this.privateSocket && this.privateSocket.readyState === WebSocket.OPEN)\n return;\n\n this.options = options;\n\n this.privateSocket = new WebSocket(\n `${this.options.privateUrl}/v2/ws/private/stream/${options.accountId}`\n );\n this.privateSocket.onopen = this.onPrivateOpen.bind(this);\n this.privateSocket.onmessage = this.onPrivateMessage.bind(this);\n this.privateSocket.onclose = this.onPrivateClose.bind(this);\n this.privateSocket.onerror = this.onPrivateError.bind(this);\n }\n\n private onOpen(event: Event) {\n //\n if (this._pendingPublicSubscribe.length > 0) {\n this._pendingPublicSubscribe.forEach(([params, cb, isOnce]) => {\n this.subscribe(params, cb, isOnce);\n });\n this._pendingPublicSubscribe = [];\n }\n\n this.publicIsReconnecting = false;\n this._publicRetryCount = 0;\n }\n\n private onPrivateOpen(event: Event) {\n //auth\n this.authenticate(this.options.accountId!);\n this.privateIsReconnecting = false;\n this._privateRetryCount = 0;\n }\n\n private onMessage(\n event: MessageEvent,\n socket: WebSocket,\n handlerMap: Map<string, Topics>\n ) {\n try {\n const message = JSON.parse(event.data);\n\n const commoneHandler = messageHandlers.get(message.event);\n\n if (message.event === \"auth\" && message.success) {\n this.authenticated = true;\n this.handlePendingPrivateTopic();\n return;\n }\n\n if (commoneHandler) {\n commoneHandler.handle(message, socket);\n } else {\n const topicKey = this.getTopicKeyFromMessage(message);\n\n const eventhandler = handlerMap.get(topicKey);\n //\n if (eventhandler?.callback) {\n // console.log(\"👀👀👀👀👀👀👀👀👀\", topicKey, eventhandler?.callback);\n eventhandler.callback.forEach((cb) => {\n const data = cb.formatter\n ? cb.formatter(message)\n : defaultMessageFormatter(message);\n\n if (data) {\n cb.onMessage(data);\n }\n });\n\n // 延时删除,在重连时还需要用到\n // if (eventhandler.isOnce) {\n // handlerMap.delete(topicKey);\n // }\n }\n\n // 触发事件\n this._eventContainer.forEach((_, key) => {\n const reg = new RegExp(key);\n if (reg.test(topicKey)) {\n this.emit(key, message);\n }\n });\n }\n\n //\n } catch (e) {}\n\n // You can process the received message here\n }\n\n private onPublicMessage(event: MessageEvent) {\n this.onMessage(event, this._publicSocket, this._eventHandlers);\n // 更新最后收到消息的时间\n this._publicHeartbeatTime = Date.now();\n }\n\n private onPrivateMessage(event: MessageEvent) {\n this.onMessage(event, this.privateSocket!, this._eventPrivateHandlers);\n // 更新最后收到消息的时间\n this._privateHeartbeatTime = Date.now();\n }\n\n private handlePendingPrivateTopic() {\n if (this._pendingPrivateSubscribe.length > 0) {\n this._pendingPrivateSubscribe.forEach(([params, cb]) => {\n this.privateSubscribe(params, cb);\n });\n this._pendingPrivateSubscribe = [];\n }\n }\n\n private onPublicClose(event: CloseEvent) {\n // move handler to pending\n this._eventHandlers.forEach((value, key) => {\n value.callback.forEach((cb) => {\n this._pendingPublicSubscribe.push([value.params, cb, value.isOnce]);\n });\n\n this._eventHandlers.delete(key);\n });\n\n setTimeout(() => this.checkSocketStatus(), 0);\n }\n\n private onPrivateClose(event: CloseEvent) {\n if (this.privateIsReconnecting) return;\n this._eventPrivateHandlers.forEach((value, key) => {\n value.callback.forEach((cb) => {\n this._pendingPrivateSubscribe.push([value.params, cb, value.isOnce]);\n });\n\n this._eventPrivateHandlers.delete(key);\n });\n this.authenticated = false;\n\n setTimeout(() => this.checkSocketStatus(), 0);\n }\n\n private onPublicError(event: Event) {\n console.error(\"public WebSocket error:\", event);\n this.publicIsReconnecting = false;\n\n if (this._publicSocket.readyState === WebSocket.OPEN) {\n this._publicSocket.close();\n } else {\n // retry connect\n if (this._publicRetryCount > CONNECT_LIMIT) return;\n setTimeout(() => {\n // this.createPublicSC(this.options);\n this.reconnectPublic();\n this._publicRetryCount++;\n }, this._publicRetryCount * 1000);\n }\n\n this.errorBoardscast(event, this._eventHandlers);\n }\n\n private onPrivateError(event: Event) {\n console.error(\"Private WebSocket error:\", event);\n this.privateIsReconnecting = false;\n\n if (this.privateSocket?.readyState === WebSocket.OPEN) {\n this.privateSocket.close();\n } else {\n // retry connect\n if (this._privateRetryCount > CONNECT_LIMIT) return;\n setTimeout(() => {\n // this.createPublicSC(this.options);\n this.reconnectPrivate();\n this._privateRetryCount++;\n }, this._privateRetryCount * 1000);\n }\n\n this.errorBoardscast(event, this._eventPrivateHandlers);\n }\n\n private errorBoardscast(error: any, eventHandlers: Map<string, Topics>) {\n eventHandlers.forEach((value) => {\n value.callback.forEach((cb) => {\n cb.onError?.(error);\n });\n });\n }\n\n send = (message: any) => {\n if (typeof message !== \"string\") {\n message = JSON.stringify(message);\n }\n if (typeof message === \"undefined\") return;\n if (this._publicSocket.readyState === WebSocket.OPEN) {\n this._publicSocket.send(message);\n //\n } else {\n console.warn(\"WebSocket connection is not open. Cannot send message.\");\n }\n };\n\n close() {\n this._publicSocket.close();\n this.privateSocket?.close();\n }\n\n set accountId(accountId: string) {}\n\n private async authenticate(accountId: string) {\n if (this.authenticated) return;\n if (!this.privateSocket) {\n console.error(\"private ws not connected\");\n return;\n }\n\n const message = await this.options.onSigntureRequest?.(accountId);\n\n this.privateSocket.send(\n JSON.stringify({\n id: \"auth\",\n event: \"auth\",\n params: {\n orderly_key: message.publicKey,\n sign: message.signature,\n timestamp: message.timestamp,\n },\n })\n );\n // this.wsSubject.next({ type: \"authenticate\" });\n // this.authenticated = true;\n }\n\n privateSubscribe(\n params: any,\n callback: WSMessageHandler | Omit<WSMessageHandler, \"onUnsubscribe\">\n ) {\n const [subscribeMessage, onUnsubscribe] = this.generateMessage(\n params,\n (callback as WSMessageHandler).onUnsubscribe\n );\n\n if (this.privateSocket?.readyState !== WebSocket.OPEN) {\n this._pendingPrivateSubscribe.push([params, callback]);\n return () => {\n this.unsubscribePrivate(subscribeMessage);\n };\n }\n\n const topic = subscribeMessage.topic || subscribeMessage.event;\n\n const handler = this._eventPrivateHandlers.get(topic);\n const callbacks = {\n ...callback,\n onUnsubscribe,\n };\n\n if (!handler) {\n this._eventPrivateHandlers.set(topic, {\n params,\n callback: [callbacks],\n });\n this.privateSocket.send(JSON.stringify(subscribeMessage));\n } else {\n handler.callback.push(callbacks);\n }\n\n return () => {\n this.unsubscribePrivate(subscribeMessage);\n };\n }\n\n subscribe(\n params: any,\n callback: WSMessageHandler | Omit<WSMessageHandler, \"onUnsubscribe\">,\n once?: boolean,\n id?: string\n ): unsubscribe | undefined {\n //\n\n const [subscribeMessage, onUnsubscribe] = this.generateMessage(\n params,\n (callback as WSMessageHandler).onUnsubscribe,\n (callback as WSMessageHandler).onMessage\n );\n\n //\n\n if (this._publicSocket.readyState !== WebSocket.OPEN) {\n this._pendingPublicSubscribe.push([params, callback, once, id]);\n\n if (!once) {\n return () => {\n this.unsubscribePublic(subscribeMessage);\n };\n }\n return;\n }\n\n let topic = this.getTopicKeyFromParams(subscribeMessage);\n // const topic = subscribeMessage.topic || subscribeMessage.event;\n\n const handler = this._eventHandlers.get(topic);\n const callbacks = {\n ...callback,\n onUnsubscribe,\n };\n\n if (!handler) {\n this._eventHandlers.set(topic, {\n params,\n isOnce: once,\n callback: [callbacks],\n });\n this._publicSocket.send(JSON.stringify(subscribeMessage));\n } else {\n // 是否once,如果是once,则替换掉之前的callback\n if (once) {\n handler.callback = [callbacks];\n this._publicSocket.send(JSON.stringify(subscribeMessage));\n } else {\n handler.callback.push(callbacks);\n }\n }\n\n // this._subscriptionPublicTopics.push({params, cb: [cb]});\n\n if (!once) {\n return () => {\n this.unsubscribePublic(subscribeMessage);\n };\n }\n }\n\n private getTopicKeyFromParams(params: any): string {\n let topic;\n\n if (params.topic) {\n topic = params.topic;\n } else {\n const eventName = params.event;\n topic = params.event;\n\n if (params.id) {\n topic += `_${params.id}`;\n }\n }\n\n return topic;\n }\n\n private getTopicKeyFromMessage(message: any): string {\n let topic;\n if (message.topic) {\n topic = message.topic;\n } else {\n if (message.event) {\n topic = `${message.event}`;\n\n if (message.id) {\n topic += `_${message.id}`;\n }\n }\n }\n\n return topic;\n }\n\n // sendPublicMessage(){\n // if(this.publicSocket.readyState !== )\n // }\n\n onceSubscribe(\n params: any,\n callback: Omit<WSMessageHandler, \"onUnsubscribe\">\n ) {\n this.subscribe(params, callback, true);\n }\n\n private unsubscribe(\n parmas: MessageParams,\n webSocket: WebSocket,\n handlerMap: Map<string, Topics>\n ) {\n const topic = parmas.topic || parmas.event;\n const handler = handlerMap.get(topic);\n\n // console.log(\"unsubscribe\", topic);\n\n if (!!handler && Array.isArray(handler?.callback)) {\n // console.log(\"是否需要退订\", handler.callback.length);\n if (handler!.callback.length === 1) {\n const unsubscribeMessage = handler!.callback[0].onUnsubscribe(topic);\n\n // console.log(\"退订参数 unsubscribeMessage\", unsubscribeMessage);\n\n //\n webSocket.send(JSON.stringify(unsubscribeMessage));\n handlerMap.delete(topic);\n //post unsubscribe message\n } else {\n const index = handler.callback.findIndex(\n (cb) => cb.onMessage === parmas.onMessage\n );\n\n // console.log(index, handler.callback.length);\n\n if (index === -1) return;\n\n handler.callback.splice(index, 1);\n\n // handlerMap.set(topic, {\n // ...handler,\n // callback: handler.callback.splice(index, 1),\n // });\n }\n }\n }\n\n private unsubscribePrivate(parmas: MessageParams) {\n this.unsubscribe(parmas, this.privateSocket!, this._eventPrivateHandlers);\n }\n\n private unsubscribePublic(parmas: MessageParams) {\n this.unsubscribe(parmas, this._publicSocket, this._eventHandlers);\n }\n\n private generateMessage(\n params: any,\n onUnsubscribe?: (event: string) => any,\n onMessage?: (message: any) => any\n ): [MessageParams, (event: string) => any] {\n let subscribeMessage;\n\n if (typeof params === \"string\") {\n subscribeMessage = { event: \"subscribe\", topic: params };\n } else {\n subscribeMessage = params;\n }\n\n if (typeof onUnsubscribe !== \"function\") {\n if (typeof params === \"string\") {\n onUnsubscribe = () => ({ event: \"unsubscribe\", topic: params });\n } else {\n onUnsubscribe = () => ({ event: \"unsubscribe\", topic: params.topic });\n }\n }\n\n return [{ ...subscribeMessage, onMessage }, onUnsubscribe];\n }\n\n private reconnectPublic() {\n if (this.publicIsReconnecting) return;\n this.publicIsReconnecting = true;\n\n window.setTimeout(() => {\n this.createPublicSC(this.options);\n }, this.reconnectInterval);\n }\n\n private reconnectPrivate() {\n if (!this.options.accountId) return;\n if (this.privateIsReconnecting) return;\n this.privateIsReconnecting = true;\n\n window.setTimeout(() => {\n this.createPrivateSC(this.options);\n }, this.reconnectInterval);\n }\n\n get publicSocket(): WebSocket {\n return this._publicSocket;\n }\n\n on(eventName: string, callback: (message: any) => any) {\n if (this._eventContainer.has(eventName)) {\n this._eventContainer.get(eventName)?.add(callback);\n }\n this._eventContainer.set(eventName, new Set([callback]));\n }\n\n off(eventName: string, callback: (message: any) => any) {\n if (this._eventContainer.has(eventName)) {\n this._eventContainer.get(eventName)?.delete(callback);\n }\n }\n\n emit(eventName: string, message: any) {\n if (this._eventContainer.has(eventName)) {\n this._eventContainer.get(eventName)?.forEach((cb) => cb(message));\n }\n }\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../src/fetch/index.ts","../src/constants.ts","../src/ws/handler/baseHandler.ts","../src/ws/handler/ping.ts","../src/ws/handler/handler.ts","../src/ws/ws.ts"],"sourcesContent":["async function request(url: string, options: RequestInit) {\n //\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(url, {\n ...options,\n // mode: \"cors\",\n // credentials: \"include\",\n headers: _createHeaders(options.headers, options.method),\n });\n\n if (response.ok) {\n const res = await response.json();\n return res;\n // if (res.success) {\n // return res;\n // } else {\n // throw new Error(res.message);\n // }\n }\n\n throw new Error(response.statusText);\n}\n\nfunction _createHeaders(\n headers: HeadersInit = {},\n method?: string\n): HeadersInit {\n //\n const _headers = new Headers(headers);\n // _headers.append(\"Accept\", \"application/json\");\n\n if (!_headers.has(\"Content-Type\")) {\n if (method !== \"DELETE\") {\n _headers.append(\"Content-Type\", \"application/json;charset=utf-8\");\n } else {\n _headers.append(\"Content-Type\", \"application/x-www-form-urlencoded\");\n }\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 unknown 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\nasync function put(\n url: string,\n data: any,\n options?: Omit<RequestInit, \"method\">\n): Promise<any> {\n const res = await request(url, {\n method: \"PUT\",\n body: JSON.stringify(data),\n ...options,\n });\n\n return res;\n}\n\nasync function del(\n url: string,\n options?: Omit<RequestInit, \"method\">\n): Promise<any> {\n const res = await request(url, {\n method: \"DELETE\",\n ...options,\n });\n\n return res;\n}\n\nasync function mutate(url: string, init: RequestInit) {\n const res = await request(url, init);\n\n return res;\n}\n\nexport { get, post, del, put, mutate };\n","export const __ORDERLY_API_URL_KEY__: string = \"__ORDERLY_API_URL__\";\n","import { MessageHandler } from \"@/types/ws\";\n\nexport default class BaseHandler implements MessageHandler {\n handle(message: any, webSocket: WebSocket) {\n throw new Error(\"Method not implemented.\");\n }\n}\n","import BaseHandler from \"./baseHandler\";\n\nexport default class PingHandler extends BaseHandler {\n handle(_: any, webSocket: WebSocket) {\n webSocket.send(JSON.stringify({ 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","import { messageHandlers } from \"./handler/handler\";\n\nexport type NetworkId = \"testnet\" | \"mainnet\";\n\nexport type WSOptions = {\n privateUrl: string;\n publicUrl: string;\n networkId?: NetworkId;\n accountId?: string;\n\n onSigntureRequest?: (accountId: string) => Promise<any>;\n};\n\nexport type unsubscribe = () => void;\n\nexport type MessageParams = {\n event: string;\n topic: string;\n\n onMessage?: (message: any) => any;\n\n params?: any;\n // [key: string]: any;\n};\n\ntype WSMessageHandler = {\n onMessage: (message: any) => void;\n onError?: (error: any) => void;\n onClose?: (event: any) => void;\n onUnsubscribe: (event: any) => any;\n formatter?: (message: any) => any;\n};\n\ntype Topics = {\n params: MessageParams;\n isPrivate?: boolean;\n isOnce?: boolean;\n callback: WSMessageHandler[];\n};\n\nconst defaultMessageFormatter = (message: any) => message.data;\nconst COMMON_ID = \"OqdphuyCtYWxwzhxyLLjOWNdFP7sQt8RPWzmb5xY\";\n\nconst TIME_OUT = 1000 * 60 * 2;\nconst CONNECT_LIMIT = 5;\n\nexport class WS {\n private _publicSocket!: WebSocket;\n private privateSocket?: WebSocket;\n\n private _eventContainer: Map<string, Set<Function>> = new Map();\n\n private publicIsReconnecting: boolean = false;\n private privateIsReconnecting: boolean = false;\n\n private reconnectInterval: number = 1000;\n\n private authenticated: boolean = false;\n\n private _pendingPrivateSubscribe: any[][] = [];\n private _pendingPublicSubscribe: any[][] = [];\n\n // all message handlers\n private _eventHandlers: Map<string, Topics> = new Map();\n private _eventPrivateHandlers: Map<string, Topics> = new Map();\n\n private _publicHeartbeatTime?: number;\n private _privateHeartbeatTime?: number;\n\n private _publicRetryCount: number = 0;\n private _privateRetryCount: number = 0;\n\n constructor(private options: WSOptions) {\n this.createPublicSC(options);\n\n if (!!options.accountId) {\n this.createPrivateSC(options);\n }\n\n this.bindEvents();\n }\n\n private bindEvents() {\n if (typeof document !== \"undefined\") {\n document.addEventListener(\n \"visibilitychange\",\n this.onVisibilityChange.bind(this)\n );\n }\n\n if (typeof window !== \"undefined\") {\n window.addEventListener(\"online\", this.onNetworkStatusChange.bind(this));\n // window.addEventListener(\"offline\", this.onNetworkStatusChange);\n }\n }\n\n private onVisibilityChange() {\n if (document.visibilityState === \"visible\") {\n this.checkSocketStatus();\n }\n // else {\n // this.publicSocket.close();\n // this.privateSocket?.close();\n // }\n }\n\n private onNetworkStatusChange() {\n if (navigator.onLine) {\n this.checkSocketStatus();\n }\n }\n\n /**\n * 判断当前连接状态,\n * 1、如果已断开则重连\n * 2、如果太久没有收到消息,则主动断开,并重连\n * 3、从后台返回、网络状态变化时,都走以下流程\n */\n private checkSocketStatus() {\n const now = Date.now();\n\n //\n // \"👀👀 checkNetworkStatus 👀👀\",\n // this._publicHeartbeatTime,\n // this._privateHeartbeatTime,\n // now,\n // this.publicSocket.readyState,\n // this.privateSocket?.readyState\n // );\n\n // check the last time\n // 如果容器不可见,则不做处理\n if (document.visibilityState !== \"visible\") return;\n // 如果网络不可用,则不做处理\n if (!navigator.onLine) return;\n\n // 如果已断开,则重连\n // public\n if (!this.publicIsReconnecting) {\n if (this._publicSocket.readyState === WebSocket.CLOSED) {\n this.reconnectPublic();\n } else {\n if (now - this._publicHeartbeatTime! > TIME_OUT) {\n //unsubscribe all public topic\n this._publicSocket.close();\n }\n }\n }\n\n if (!this.privateIsReconnecting) {\n // private\n if (this.privateSocket?.readyState === WebSocket.CLOSED) {\n this.reconnectPrivate();\n } else {\n if (\n this._privateHeartbeatTime &&\n now - this._privateHeartbeatTime! > TIME_OUT\n ) {\n // unsubscribe all private topic\n this.privateSocket?.close();\n }\n }\n }\n }\n\n public openPrivate(accountId: string) {\n if (this.privateSocket?.readyState === WebSocket.OPEN) {\n return;\n }\n this.createPrivateSC({\n ...this.options,\n accountId,\n });\n }\n\n public closePrivate() {\n this.authenticated = false;\n this._pendingPrivateSubscribe = [];\n\n this._eventPrivateHandlers.clear();\n\n this.privateSocket?.close();\n }\n\n private createPublicSC(options: WSOptions) {\n if (this._publicSocket && this._publicSocket.readyState === WebSocket.OPEN)\n return;\n this._publicSocket = new WebSocket(\n `${this.options.publicUrl}/ws/stream/${COMMON_ID}`\n );\n this._publicSocket.onopen = this.onOpen.bind(this);\n // this.publicSocket.onmessage = this.onPublicMessage.bind(this);\n this._publicSocket.addEventListener(\n \"message\",\n this.onPublicMessage.bind(this)\n );\n this._publicSocket.addEventListener(\"close\", this.onPublicClose.bind(this));\n this._publicSocket.addEventListener(\"error\", this.onPublicError.bind(this));\n // this.publicSocket.onclose = this.onPublicClose.bind(this);\n // this.publicSocket.onerror = this.onPublicError.bind(this);\n }\n\n private createPrivateSC(options: WSOptions) {\n if (this.privateSocket && this.privateSocket.readyState === WebSocket.OPEN)\n return;\n\n this.options = options;\n\n this.privateSocket = new WebSocket(\n `${this.options.privateUrl}/v2/ws/private/stream/${options.accountId}`\n );\n this.privateSocket.onopen = this.onPrivateOpen.bind(this);\n this.privateSocket.onmessage = this.onPrivateMessage.bind(this);\n this.privateSocket.onclose = this.onPrivateClose.bind(this);\n this.privateSocket.onerror = this.onPrivateError.bind(this);\n }\n\n private onOpen(event: Event) {\n //\n if (this._pendingPublicSubscribe.length > 0) {\n this._pendingPublicSubscribe.forEach(([params, cb, isOnce]) => {\n this.subscribe(params, cb, isOnce);\n });\n this._pendingPublicSubscribe = [];\n }\n\n this.publicIsReconnecting = false;\n this._publicRetryCount = 0;\n }\n\n private onPrivateOpen(event: Event) {\n //auth\n this.authenticate(this.options.accountId!);\n this.privateIsReconnecting = false;\n this._privateRetryCount = 0;\n }\n\n private onMessage(\n event: MessageEvent,\n socket: WebSocket,\n handlerMap: Map<string, Topics>\n ) {\n try {\n const message = JSON.parse(event.data);\n\n const commoneHandler = messageHandlers.get(message.event);\n\n if (message.event === \"auth\" && message.success) {\n this.authenticated = true;\n this.handlePendingPrivateTopic();\n return;\n }\n\n if (commoneHandler) {\n commoneHandler.handle(message, socket);\n } else {\n const topicKey = this.getTopicKeyFromMessage(message);\n\n const eventhandler = handlerMap.get(topicKey);\n //\n if (eventhandler?.callback) {\n // console.log(\"👀👀👀👀👀👀👀👀👀\", topicKey, eventhandler?.callback);\n eventhandler.callback.forEach((cb) => {\n const data = cb.formatter\n ? cb.formatter(message)\n : defaultMessageFormatter(message);\n\n if (data) {\n cb.onMessage(data);\n }\n });\n\n // 延时删除,在重连时还需要用到\n // if (eventhandler.isOnce) {\n // handlerMap.delete(topicKey);\n // }\n }\n\n // 触发事件\n this._eventContainer.forEach((_, key) => {\n const reg = new RegExp(key);\n if (reg.test(topicKey)) {\n this.emit(key, message);\n }\n });\n }\n\n //\n } catch (e) {}\n\n // You can process the received message here\n }\n\n private onPublicMessage(event: MessageEvent) {\n this.onMessage(event, this._publicSocket, this._eventHandlers);\n // 更新最后收到消息的时间\n this._publicHeartbeatTime = Date.now();\n }\n\n private onPrivateMessage(event: MessageEvent) {\n this.onMessage(event, this.privateSocket!, this._eventPrivateHandlers);\n // 更新最后收到消息的时间\n this._privateHeartbeatTime = Date.now();\n }\n\n private handlePendingPrivateTopic() {\n if (this._pendingPrivateSubscribe.length > 0) {\n this._pendingPrivateSubscribe.forEach(([params, cb]) => {\n this.privateSubscribe(params, cb);\n });\n this._pendingPrivateSubscribe = [];\n }\n }\n\n private onPublicClose(event: CloseEvent) {\n // move handler to pending\n this._eventHandlers.forEach((value, key) => {\n value.callback.forEach((cb) => {\n this._pendingPublicSubscribe.push([value.params, cb, value.isOnce]);\n });\n\n this._eventHandlers.delete(key);\n });\n\n setTimeout(() => this.checkSocketStatus(), 0);\n }\n\n private onPrivateClose(event: CloseEvent) {\n if (this.privateIsReconnecting) return;\n this._eventPrivateHandlers.forEach((value, key) => {\n value.callback.forEach((cb) => {\n this._pendingPrivateSubscribe.push([value.params, cb, value.isOnce]);\n });\n\n this._eventPrivateHandlers.delete(key);\n });\n this.authenticated = false;\n\n setTimeout(() => this.checkSocketStatus(), 0);\n }\n\n private onPublicError(event: Event) {\n console.error(\"public WebSocket error:\", event);\n this.publicIsReconnecting = false;\n\n if (this._publicSocket.readyState === WebSocket.OPEN) {\n this._publicSocket.close();\n } else {\n // retry connect\n if (this._publicRetryCount > CONNECT_LIMIT) return;\n setTimeout(() => {\n // this.createPublicSC(this.options);\n this.reconnectPublic();\n this._publicRetryCount++;\n }, this._publicRetryCount * 1000);\n }\n\n this.errorBoardscast(event, this._eventHandlers);\n }\n\n private onPrivateError(event: Event) {\n console.error(\"Private WebSocket error:\", event);\n this.privateIsReconnecting = false;\n\n if (this.privateSocket?.readyState === WebSocket.OPEN) {\n this.privateSocket.close();\n } else {\n // retry connect\n if (this._privateRetryCount > CONNECT_LIMIT) return;\n setTimeout(() => {\n // this.createPublicSC(this.options);\n this.reconnectPrivate();\n this._privateRetryCount++;\n }, this._privateRetryCount * 1000);\n }\n\n this.errorBoardscast(event, this._eventPrivateHandlers);\n }\n\n private errorBoardscast(error: any, eventHandlers: Map<string, Topics>) {\n eventHandlers.forEach((value) => {\n value.callback.forEach((cb) => {\n cb.onError?.(error);\n });\n });\n }\n\n send = (message: any) => {\n if (typeof message !== \"string\") {\n message = JSON.stringify(message);\n }\n if (typeof message === \"undefined\") return;\n if (this._publicSocket.readyState === WebSocket.OPEN) {\n this._publicSocket.send(message);\n //\n } else {\n console.warn(\"WebSocket connection is not open. Cannot send message.\");\n }\n };\n\n close() {\n this._publicSocket.close();\n this.privateSocket?.close();\n }\n\n set accountId(accountId: string) {}\n\n private async authenticate(accountId: string) {\n if (this.authenticated) return;\n if (!this.privateSocket) {\n console.error(\"private ws not connected\");\n return;\n }\n\n const message = await this.options.onSigntureRequest?.(accountId);\n\n this.privateSocket.send(\n JSON.stringify({\n id: \"auth\",\n event: \"auth\",\n params: {\n orderly_key: message.publicKey,\n sign: message.signature,\n timestamp: message.timestamp,\n },\n })\n );\n // this.wsSubject.next({ type: \"authenticate\" });\n // this.authenticated = true;\n }\n\n privateSubscribe(\n params: any,\n callback: WSMessageHandler | Omit<WSMessageHandler, \"onUnsubscribe\">\n ) {\n const [subscribeMessage, onUnsubscribe] = this.generateMessage(\n params,\n (callback as WSMessageHandler).onUnsubscribe\n );\n\n if (this.privateSocket?.readyState !== WebSocket.OPEN) {\n this._pendingPrivateSubscribe.push([params, callback]);\n return () => {\n this.unsubscribePrivate(subscribeMessage);\n };\n }\n\n const topic = subscribeMessage.topic || subscribeMessage.event;\n\n const handler = this._eventPrivateHandlers.get(topic);\n const callbacks = {\n ...callback,\n onUnsubscribe,\n };\n\n if (!handler) {\n this._eventPrivateHandlers.set(topic, {\n params,\n callback: [callbacks],\n });\n this.privateSocket.send(JSON.stringify(subscribeMessage));\n } else {\n handler.callback.push(callbacks);\n }\n\n return () => {\n this.unsubscribePrivate(subscribeMessage);\n };\n }\n\n subscribe(\n params: any,\n callback: WSMessageHandler | Omit<WSMessageHandler, \"onUnsubscribe\">,\n once?: boolean,\n id?: string\n ): unsubscribe | undefined {\n //\n\n const [subscribeMessage, onUnsubscribe] = this.generateMessage(\n params,\n (callback as WSMessageHandler).onUnsubscribe,\n (callback as WSMessageHandler).onMessage\n );\n\n //\n\n if (this._publicSocket.readyState !== WebSocket.OPEN) {\n this._pendingPublicSubscribe.push([params, callback, once, id]);\n\n if (!once) {\n return () => {\n this.unsubscribePublic(subscribeMessage);\n };\n }\n return;\n }\n\n let topic = this.getTopicKeyFromParams(subscribeMessage);\n // const topic = subscribeMessage.topic || subscribeMessage.event;\n\n const handler = this._eventHandlers.get(topic);\n const callbacks = {\n ...callback,\n onUnsubscribe,\n };\n\n if (!handler) {\n this._eventHandlers.set(topic, {\n params,\n isOnce: once,\n callback: [callbacks],\n });\n this._publicSocket.send(JSON.stringify(subscribeMessage));\n } else {\n // 是否once,如果是once,则替换掉之前的callback\n if (once) {\n handler.callback = [callbacks];\n this._publicSocket.send(JSON.stringify(subscribeMessage));\n } else {\n handler.callback.push(callbacks);\n }\n }\n\n // this._subscriptionPublicTopics.push({params, cb: [cb]});\n\n if (!once) {\n return () => {\n this.unsubscribePublic(subscribeMessage);\n };\n }\n }\n\n private getTopicKeyFromParams(params: any): string {\n let topic;\n\n if (params.topic) {\n topic = params.topic;\n } else {\n const eventName = params.event;\n topic = params.event;\n\n if (params.id) {\n topic += `_${params.id}`;\n }\n }\n\n return topic;\n }\n\n private getTopicKeyFromMessage(message: any): string {\n let topic;\n if (message.topic) {\n topic = message.topic;\n } else {\n if (message.event) {\n topic = `${message.event}`;\n\n if (message.id) {\n topic += `_${message.id}`;\n }\n }\n }\n\n return topic;\n }\n\n // sendPublicMessage(){\n // if(this.publicSocket.readyState !== )\n // }\n\n onceSubscribe(\n params: any,\n callback: Omit<WSMessageHandler, \"onUnsubscribe\">\n ) {\n this.subscribe(params, callback, true);\n }\n\n private unsubscribe(\n parmas: MessageParams,\n webSocket: WebSocket,\n handlerMap: Map<string, Topics>\n ) {\n const topic = parmas.topic || parmas.event;\n const handler = handlerMap.get(topic);\n\n // console.log(\"unsubscribe\", topic);\n\n if (!!handler && Array.isArray(handler?.callback)) {\n // console.log(\"是否需要退订\", handler.callback.length);\n if (handler!.callback.length === 1) {\n const unsubscribeMessage = handler!.callback[0].onUnsubscribe(topic);\n\n // console.log(\"退订参数 unsubscribeMessage\", unsubscribeMessage);\n\n //\n webSocket.send(JSON.stringify(unsubscribeMessage));\n handlerMap.delete(topic);\n //post unsubscribe message\n } else {\n const index = handler.callback.findIndex(\n (cb) => cb.onMessage === parmas.onMessage\n );\n\n // console.log(index, handler.callback.length);\n\n if (index === -1) return;\n\n handler.callback.splice(index, 1);\n\n // handlerMap.set(topic, {\n // ...handler,\n // callback: handler.callback.splice(index, 1),\n // });\n }\n }\n }\n\n private unsubscribePrivate(parmas: MessageParams) {\n this.unsubscribe(parmas, this.privateSocket!, this._eventPrivateHandlers);\n }\n\n private unsubscribePublic(parmas: MessageParams) {\n this.unsubscribe(parmas, this._publicSocket, this._eventHandlers);\n }\n\n private generateMessage(\n params: any,\n onUnsubscribe?: (event: string) => any,\n onMessage?: (message: any) => any\n ): [MessageParams, (event: string) => any] {\n let subscribeMessage;\n\n if (typeof params === \"string\") {\n subscribeMessage = { event: \"subscribe\", topic: params };\n } else {\n subscribeMessage = params;\n }\n\n if (typeof onUnsubscribe !== \"function\") {\n if (typeof params === \"string\") {\n onUnsubscribe = () => ({ event: \"unsubscribe\", topic: params });\n } else {\n onUnsubscribe = () => ({ event: \"unsubscribe\", topic: params.topic });\n }\n }\n\n return [{ ...subscribeMessage, onMessage }, onUnsubscribe];\n }\n\n private reconnectPublic() {\n if (this.publicIsReconnecting) return;\n this.publicIsReconnecting = true;\n\n window.setTimeout(() => {\n this.createPublicSC(this.options);\n }, this.reconnectInterval);\n }\n\n private reconnectPrivate() {\n if (!this.options.accountId) return;\n if (this.privateIsReconnecting) return;\n this.privateIsReconnecting = true;\n\n window.setTimeout(() => {\n this.createPrivateSC(this.options);\n }, this.reconnectInterval);\n }\n\n get publicSocket(): WebSocket {\n return this._publicSocket;\n }\n\n on(eventName: string, callback: (message: any) => any) {\n if (this._eventContainer.has(eventName)) {\n this._eventContainer.get(eventName)?.add(callback);\n }\n this._eventContainer.set(eventName, new Set([callback]));\n }\n\n off(eventName: string, callback: (message: any) => any) {\n if (this._eventContainer.has(eventName)) {\n this._eventContainer.get(eventName)?.delete(callback);\n }\n }\n\n emit(eventName: string, message: any) {\n if (this._eventContainer.has(eventName)) {\n this._eventContainer.get(eventName)?.forEach((cb) => cb(message));\n }\n }\n}\n"],"mappings":"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","names":[]}
|
package/package.json
CHANGED
package/src/fetch/index.ts
CHANGED
|
@@ -3,8 +3,8 @@ async function request(url: string, options: RequestInit) {
|
|
|
3
3
|
if (!url.startsWith("http")) {
|
|
4
4
|
throw new Error("url must start with http(s)");
|
|
5
5
|
}
|
|
6
|
-
const urlInstance = new URL(url);
|
|
7
|
-
const response = await fetch(
|
|
6
|
+
// const urlInstance = new URL(url);
|
|
7
|
+
const response = await fetch(url, {
|
|
8
8
|
...options,
|
|
9
9
|
// mode: "cors",
|
|
10
10
|
// credentials: "include",
|
|
@@ -59,7 +59,7 @@ async function get<R>(
|
|
|
59
59
|
}
|
|
60
60
|
// 根据返回的数据结构,返回需要的数据
|
|
61
61
|
if (Array.isArray(res.data["rows"])) {
|
|
62
|
-
return res.data["rows"] as R;
|
|
62
|
+
return res.data["rows"] as unknown as R;
|
|
63
63
|
}
|
|
64
64
|
return res.data;
|
|
65
65
|
}
|