tangweijie 5099f2e87e Initial commit: Vue3 + TypeScript 前端项目
- Vue 3 + TypeScript + Element Plus 前端界面
- Pinia 状态管理
- Vue Router 4 路由管理
- Axios HTTP 客户端
- MSW (Mock Service Worker) 开发环境模拟
- 账户管理界面 (列表、详情、三科目余额展示)
- 交易管理界面 (列表、详情)
- 对账管理界面 (三账校验)
- 完善的 API 客户端封装
- Docker 容器化配置
- Nginx 配置用于生产环境
2026-01-05 17:57:11 +08:00

54 lines
1.6 KiB
JavaScript

import { invariant } from "outvariant";
import {
WebSocketHandler,
kEmitter
} from './handlers/WebSocketHandler.mjs';
import { isPath } from './utils/matching/matchRequestUrl.mjs';
import { WebSocketClientManager } from './ws/WebSocketClientManager.mjs';
function isBroadcastChannelWithUnref(channel) {
return typeof Reflect.get(channel, "unref") !== "undefined";
}
const webSocketChannel = new BroadcastChannel("msw:websocket-client-manager");
if (isBroadcastChannelWithUnref(webSocketChannel)) {
webSocketChannel.unref();
}
function createWebSocketLinkHandler(url) {
invariant(url, "Expected a WebSocket server URL but got undefined");
invariant(
isPath(url),
"Expected a WebSocket server URL to be a valid path but got %s",
typeof url
);
const clientManager = new WebSocketClientManager(webSocketChannel);
return {
get clients() {
return clientManager.clients;
},
addEventListener(event, listener) {
const handler = new WebSocketHandler(url);
handler[kEmitter].on("connection", async ({ client }) => {
await clientManager.addConnection(client);
});
handler[kEmitter].on(event, listener);
return handler;
},
broadcast(data) {
this.broadcastExcept([], data);
},
broadcastExcept(clients, data) {
const ignoreClients = Array.prototype.concat(clients).map((client) => client.id);
clientManager.clients.forEach((otherClient) => {
if (!ignoreClients.includes(otherClient.id)) {
otherClient.send(data);
}
});
}
};
}
const ws = {
link: createWebSocketLinkHandler
};
export {
ws
};
//# sourceMappingURL=ws.mjs.map