fix: fix onopen

This commit is contained in:
熊潇 2025-03-22 14:34:17 +08:00
parent 64b37e369d
commit fd5437292a
3 changed files with 71 additions and 8 deletions

View File

@ -1,4 +1,5 @@
import { QueryClient } from '@abearxiong/query'; // @ts-ignore
import { QueryClient } from '@kevisual/query';
const query = new QueryClient({ url: '/api/router', io: true }); const query = new QueryClient({ url: '/api/router', io: true });

View File

@ -1,6 +1,6 @@
{ {
"name": "@kevisual/query", "name": "@kevisual/query",
"version": "0.0.14", "version": "0.0.15-alpha.1",
"main": "dist/index.js", "main": "dist/index.js",
"module": "dist/index.js", "module": "dist/index.js",
"types": "dist/index.d.ts", "types": "dist/index.d.ts",
@ -9,6 +9,7 @@
"scripts": { "scripts": {
"build": "npm run clean && rollup -c", "build": "npm run clean && rollup -c",
"build:app": "npm run build && rsync dist/* ../deploy/dist", "build:app": "npm run build && rsync dist/* ../deploy/dist",
"dev:lib": "rollup -c -w",
"clean": "rm -rf dist" "clean": "rm -rf dist"
}, },
"files": [ "files": [

View File

@ -47,31 +47,42 @@ export class QueryWs {
*/ */
async connect(opts?: { timeout?: number }) { async connect(opts?: { timeout?: number }) {
const store = this.store; const store = this.store;
const that = this;
const connected = store.getState().connected; const connected = store.getState().connected;
if (connected) { if (connected) {
return Promise.resolve(true); return Promise.resolve(true);
} }
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
const ws = this.ws || new WebSocket(this.url); const ws = that.ws || new WebSocket(that.url);
const timeout = opts?.timeout || 5 * 60 * 1000; // 默认 2 分钟 const timeout = opts?.timeout || 5 * 60 * 1000; // 默认 5 分钟
let timer = setTimeout(() => { let timer = setTimeout(() => {
const isOpen = ws.readyState === WebSocket.OPEN;
if (isOpen) {
console.log('WebSocket 连接成功 in timer');
resolve(true);
return;
}
console.error('WebSocket 连接超时'); console.error('WebSocket 连接超时');
reject('timeout'); reject('timeout');
}, timeout); }, timeout);
ws.onopen = () => { ws.onopen = (ev) => {
store.getState().setConnected(true); store.getState().setConnected(true);
store.getState().setStatus('connected'); store.getState().setStatus('connected');
resolve(true); resolve(true);
clearTimeout(timer); clearTimeout(timer);
}; };
ws.onclose = () => { ws.onclose = (ev) => {
store.getState().setConnected(false); store.getState().setConnected(false);
store.getState().setStatus('disconnected'); store.getState().setStatus('disconnected');
this.ws = null; this.ws = null;
}; };
}); });
} }
/**
* ws.onopen
* @param callback
* @returns
*/
listenConnect(callback: () => void) { listenConnect(callback: () => void) {
const store = this.store; const store = this.store;
const { connected } = store.getState(); const { connected } = store.getState();
@ -96,10 +107,41 @@ export class QueryWs {
); );
return cancel; return cancel;
} }
listenClose(callback: () => void) {
const store = this.store;
const { status } = store.getState();
if (status === 'disconnected') {
callback();
}
const subscriptionOne = (selector: (state: QueryWsStore) => QueryWsStore['status'], listener: QueryWsStoreListener) => {
const unsubscribe = store.subscribe((newState: any, oldState: any) => {
if (selector(newState) !== selector(oldState)) {
listener(newState, oldState);
unsubscribe();
}
});
return unsubscribe;
};
const cancel = subscriptionOne(
(state) => state.status,
(newState, oldState) => {
if (newState.status === 'disconnected') {
callback();
}
},
);
return cancel;
}
onMessage<T = any, U = any>( onMessage<T = any, U = any>(
fn: (data: U, event: MessageEvent) => void, fn: (data: U, event: MessageEvent) => void,
opts?: { opts?: {
/**
* JSON
*/
isJson?: boolean; isJson?: boolean;
/**
*
*/
selector?: (data: T) => U; selector?: (data: T) => U;
}, },
) { ) {
@ -136,7 +178,26 @@ export class QueryWs {
store.getState().setConnected(false); store.getState().setConnected(false);
store.getState().setStatus('disconnected'); store.getState().setStatus('disconnected');
} }
send<T = any, U = any>(data: T, opts?: { isJson?: boolean; wrapper?: (data: T) => U }) { /**
*
*
* @param data
* @param opts
* @returns
*/
send<T = any, U = any>(
data: T,
opts?: {
/**
* JSON
*/
isJson?: boolean;
/**
*
*/
wrapper?: (data: T) => U;
},
) {
const ws = this.ws; const ws = this.ws;
const isJson = opts?.isJson ?? true; const isJson = opts?.isJson ?? true;
const wrapper = opts?.wrapper; const wrapper = opts?.wrapper;