From 4e38c3a74eb2ea43d8e09e1859d324f58c112820 Mon Sep 17 00:00:00 2001 From: xion Date: Tue, 1 Oct 2024 00:57:17 +0800 Subject: [PATCH] Connect and return true --- package.json | 2 +- src/ws.ts | 39 +++++++++++++++++++++++++++------------ 2 files changed, 28 insertions(+), 13 deletions(-) diff --git a/package.json b/package.json index 486ec3b..f5e9c23 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@kevisual/query", - "version": "0.0.6", + "version": "0.0.7-alpha.0", "main": "dist/index.js", "module": "dist/index.js", "types": "dist/index.d.ts", diff --git a/src/ws.ts b/src/ws.ts index 190852a..129410c 100644 --- a/src/ws.ts +++ b/src/ws.ts @@ -45,22 +45,31 @@ export class QueryWs { /** * 连接 WebSocket */ - connect() { + async connect(opts?: { timeout?: number }) { const store = this.store; const connected = store.getState().connected; if (connected) { - return; + return Promise.resolve(true); } - const ws = this.ws || new WebSocket(this.url); - ws.onopen = () => { - store.getState().setConnected(true); - store.getState().setStatus('connected'); - }; - ws.onclose = () => { - store.getState().setConnected(false); - store.getState().setStatus('disconnected'); - this.ws = null; - }; + return new Promise((resolve, reject) => { + const ws = this.ws || new WebSocket(this.url); + const timeout = opts?.timeout || 5 * 60 * 1000; // 默认 2 分钟 + let timer = setTimeout(() => { + console.error('WebSocket 连接超时'); + reject('timeout'); + }, timeout); + ws.onopen = () => { + store.getState().setConnected(true); + store.getState().setStatus('connected'); + resolve(true); + clearTimeout(timer); + }; + ws.onclose = () => { + store.getState().setConnected(false); + store.getState().setStatus('disconnected'); + this.ws = null; + }; + }); } listenConnect(callback: () => void) { @@ -141,4 +150,10 @@ export class QueryWs { ws.send(data as string); } } + getOpen() { + if (!this.ws) { + return false; + } + return this.ws.readyState === WebSocket.OPEN; + } }