Files
NapCatQQ/.pnpm-store/v3/files/a4/4c0760cc99665c8a000646c417f4c21232a38c3dbe6b4ac2f504725a1a8833abb8d42b5f7cf4e8f45683532d9a9143b4d1e89ceeca044a7390702e99dfe66f
T
TanTan e311ca3275
Build NapCat Artifacts / Type Check & Test (push) Waiting to run
docs: 仓库链接指向本镜像仓库
2026-11-13 09:25:58 +08:00

42 lines
1.3 KiB
Plaintext

import { MutableRefObject } from 'react';
type IfEquals<X, Y, A=X, B=never> =
(<T>() => T extends X ? 1 : 2) extends
(<T>() => T extends Y ? 1 : 2) ? A : B;
type WritableKeys<T> = {
[P in keyof T]-?: IfEquals<{ [Q in P]: T[P] }, { -readonly [Q in P]: T[P] }, P>
}[keyof T];
export const websocketWrapper = (
webSocket: WebSocket,
start: MutableRefObject<() => void>,
): WebSocket => {
return new Proxy<WebSocket>(webSocket, {
get: (obj, key: keyof WebSocket) => {
const val = obj[key];
if ((key as any) === 'reconnect') return start;
if (typeof val === 'function') {
console.error('Calling methods directly on the websocket is not supported at this moment. You must use the methods returned by useWebSocket.');
//Prevent error thrown by invoking a non-function
return () => {};
} else {
return val;
}
},
set: <T extends WritableKeys<WebSocket>>(obj: WebSocket, key: T, val: WebSocket[T]) => {
if (/^on/.test(key)) {
console.warn('The websocket\'s event handlers should be defined through the options object passed into useWebSocket.')
return false;
} else {
obj[key] = val;
return true;
}
},
});
};
export default websocketWrapper;