@cjwddz/mirror 2.0.3 → 2.0.4
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/dist/cli/cli-commands.d.ts.map +1 -1
- package/dist/cli/cli-commands.js +83 -88
- package/dist/cli/cli-commands.js.map +1 -1
- package/dist/cli/index.d.ts +1 -1
- package/dist/cli/index.js +18 -60
- package/dist/cli/index.js.map +1 -1
- package/dist/core/http-tunnel-server.d.ts.map +1 -1
- package/dist/core/http-tunnel-server.js +4 -4
- package/dist/core/http-tunnel-server.js.map +1 -1
- package/dist/core/rule-manager.d.ts.map +1 -1
- package/dist/core/rule-manager.js +4 -6
- package/dist/core/rule-manager.js.map +1 -1
- package/package.json +1 -1
- package/dist/core/file-sync.d.ts +0 -14
- package/dist/core/file-sync.d.ts.map +0 -1
- package/dist/core/file-sync.js +0 -34
- package/dist/core/file-sync.js.map +0 -1
- package/dist/core/output-buffer.d.ts +0 -42
- package/dist/core/output-buffer.d.ts.map +0 -1
- package/dist/core/output-buffer.js +0 -66
- package/dist/core/output-buffer.js.map +0 -1
- package/dist/core/protocol.d.ts +0 -83
- package/dist/core/protocol.d.ts.map +0 -1
- package/dist/core/protocol.js +0 -10
- package/dist/core/protocol.js.map +0 -1
- package/dist/core/state-machine.d.ts +0 -19
- package/dist/core/state-machine.d.ts.map +0 -1
- package/dist/core/state-machine.js +0 -39
- package/dist/core/state-machine.js.map +0 -1
- package/dist/core/token-manager.d.ts +0 -29
- package/dist/core/token-manager.d.ts.map +0 -1
- package/dist/core/token-manager.js +0 -90
- package/dist/core/token-manager.js.map +0 -1
- package/dist/core/workspace.d.ts +0 -28
- package/dist/core/workspace.d.ts.map +0 -1
- package/dist/core/workspace.js +0 -186
- package/dist/core/workspace.js.map +0 -1
- package/dist/transport/websocket.d.ts +0 -22
- package/dist/transport/websocket.d.ts.map +0 -1
- package/dist/transport/websocket.js +0 -96
- package/dist/transport/websocket.js.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"token-manager.js","sourceRoot":"","sources":["../../src/core/token-manager.ts"],"names":[],"mappings":"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"}
|
package/dist/core/workspace.d.ts
DELETED
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Workspace 管理
|
|
3
|
-
*/
|
|
4
|
-
export declare class Workspace {
|
|
5
|
-
private path;
|
|
6
|
-
private currentVersion;
|
|
7
|
-
private metadataPath;
|
|
8
|
-
private metadata;
|
|
9
|
-
constructor(path: string, metadataDir?: string);
|
|
10
|
-
static create(workspaceDir: string, createTemp?: boolean, clientId?: string | null, clientWorkspacePath?: string | null, metadataDir?: string): Promise<Workspace>;
|
|
11
|
-
private loadMetadata;
|
|
12
|
-
private saveMetadata;
|
|
13
|
-
setClientInfo(clientId: string, workspacePath: string | null): Promise<void>;
|
|
14
|
-
getClientId(): string | null;
|
|
15
|
-
getWorkspacePath(): string | null;
|
|
16
|
-
getOldFiles(): Record<string, string>;
|
|
17
|
-
updateFileList(files: Record<string, string>): Promise<void>;
|
|
18
|
-
getFileHash(path: string): string | undefined;
|
|
19
|
-
hasFile(path: string, hash: string): boolean;
|
|
20
|
-
getPath(): string;
|
|
21
|
-
getCurrentVersion(): number;
|
|
22
|
-
setVersion(version: number): void;
|
|
23
|
-
writeFile(relativePath: string, content: Buffer): Promise<void>;
|
|
24
|
-
deleteFile(relativePath: string): Promise<void>;
|
|
25
|
-
cleanup(): Promise<void>;
|
|
26
|
-
disconnect(): Promise<void>;
|
|
27
|
-
}
|
|
28
|
-
//# sourceMappingURL=workspace.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"workspace.d.ts","sourceRoot":"","sources":["../../src/core/workspace.ts"],"names":[],"mappings":"AAAA;;GAEG;AAgBH,qBAAa,SAAS;IACpB,OAAO,CAAC,IAAI,CAAS;IACrB,OAAO,CAAC,cAAc,CAAa;IACnC,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,QAAQ,CAAkC;gBAEtC,IAAI,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM;WAoBjC,MAAM,CACjB,YAAY,EAAE,MAAM,EACpB,UAAU,GAAE,OAAe,EAC3B,QAAQ,GAAE,MAAM,GAAG,IAAW,EAC9B,mBAAmB,GAAE,MAAM,GAAG,IAAW,EACzC,WAAW,CAAC,EAAE,MAAM,GACnB,OAAO,CAAC,SAAS,CAAC;YAmDP,YAAY;YAYZ,YAAY;IAMpB,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IAelF,WAAW,IAAI,MAAM,GAAG,IAAI;IAI5B,gBAAgB,IAAI,MAAM,GAAG,IAAI;IAIjC,WAAW,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;IAI/B,cAAc,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAelE,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAI7C,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO;IAI5C,OAAO,IAAI,MAAM;IAIjB,iBAAiB,IAAI,MAAM;IAI3B,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAU3B,SAAS,CAAC,YAAY,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAW/D,UAAU,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAO/C,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAcxB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;CAIlC"}
|
package/dist/core/workspace.js
DELETED
|
@@ -1,186 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Workspace 管理
|
|
3
|
-
*/
|
|
4
|
-
import { mkdtemp, rm, readdir, readFile } from 'fs/promises';
|
|
5
|
-
import { join } from 'path';
|
|
6
|
-
import { writeFile, mkdir, unlink } from 'fs/promises';
|
|
7
|
-
import { existsSync } from 'fs';
|
|
8
|
-
import { createHash } from 'crypto';
|
|
9
|
-
import { tmpdir } from 'os';
|
|
10
|
-
export class Workspace {
|
|
11
|
-
path;
|
|
12
|
-
currentVersion = 0;
|
|
13
|
-
metadataPath;
|
|
14
|
-
metadata = null;
|
|
15
|
-
constructor(path, metadataDir) {
|
|
16
|
-
this.path = path;
|
|
17
|
-
// 元数据文件保存在工作区目录之外,避免污染同步目录
|
|
18
|
-
// 基于工作区路径生成唯一的元数据文件名
|
|
19
|
-
const hash = createHash('sha256').update(path).digest('hex').substring(0, 16);
|
|
20
|
-
if (metadataDir) {
|
|
21
|
-
// 使用指定的元数据目录
|
|
22
|
-
if (!existsSync(metadataDir)) {
|
|
23
|
-
mkdir(metadataDir, { recursive: true }).catch(() => {
|
|
24
|
-
// 如果创建失败,使用临时目录作为后备
|
|
25
|
-
});
|
|
26
|
-
}
|
|
27
|
-
this.metadataPath = join(metadataDir, `.mirror-metadata-${hash}.json`);
|
|
28
|
-
}
|
|
29
|
-
else {
|
|
30
|
-
// 后备方案:使用系统临时目录
|
|
31
|
-
this.metadataPath = join(tmpdir(), `.mirror-metadata-${hash}.json`);
|
|
32
|
-
}
|
|
33
|
-
}
|
|
34
|
-
static async create(workspaceDir, createTemp = false, clientId = null, clientWorkspacePath = null, metadataDir) {
|
|
35
|
-
if (createTemp) {
|
|
36
|
-
// 创建临时目录
|
|
37
|
-
const workspacePath = await mkdtemp(join(workspaceDir, 'mirror-'));
|
|
38
|
-
return new Workspace(workspacePath, metadataDir);
|
|
39
|
-
}
|
|
40
|
-
else {
|
|
41
|
-
// 直接使用 workspaceDir,不需要子目录(服务端只支持单个客户端)
|
|
42
|
-
const actualWorkspacePath = workspaceDir;
|
|
43
|
-
// 检查目录是否存在
|
|
44
|
-
if (!existsSync(actualWorkspacePath)) {
|
|
45
|
-
await mkdir(actualWorkspacePath, { recursive: true });
|
|
46
|
-
}
|
|
47
|
-
const workspace = new Workspace(actualWorkspacePath, metadataDir);
|
|
48
|
-
// 尝试加载元数据
|
|
49
|
-
await workspace.loadMetadata();
|
|
50
|
-
// 如果元数据存在且工作目录路径匹配,复用工作区
|
|
51
|
-
if (workspace.metadata &&
|
|
52
|
-
workspace.metadata.workspacePath === clientWorkspacePath &&
|
|
53
|
-
workspace.metadata.clientId === clientId) {
|
|
54
|
-
workspace.currentVersion = workspace.metadata.version;
|
|
55
|
-
return workspace;
|
|
56
|
-
}
|
|
57
|
-
// 如果元数据存在但工作目录路径不匹配,说明是不同的工作目录,清理
|
|
58
|
-
if (workspace.metadata && workspace.metadata.workspacePath !== clientWorkspacePath) {
|
|
59
|
-
console.log(`检测到不同工作目录: 旧=${workspace.metadata.workspacePath}, 新=${clientWorkspacePath},清理工作区`);
|
|
60
|
-
await workspace.cleanup();
|
|
61
|
-
await mkdir(actualWorkspacePath, { recursive: true });
|
|
62
|
-
workspace.metadata = null;
|
|
63
|
-
}
|
|
64
|
-
else if (!workspace.metadata) {
|
|
65
|
-
// 没有元数据,检查目录是否为空
|
|
66
|
-
const entries = await readdir(actualWorkspacePath);
|
|
67
|
-
if (entries.length > 0) {
|
|
68
|
-
// 目录不为空,清理(可能是旧数据)
|
|
69
|
-
await workspace.cleanup();
|
|
70
|
-
await mkdir(actualWorkspacePath, { recursive: true });
|
|
71
|
-
}
|
|
72
|
-
}
|
|
73
|
-
return workspace;
|
|
74
|
-
}
|
|
75
|
-
}
|
|
76
|
-
async loadMetadata() {
|
|
77
|
-
if (existsSync(this.metadataPath)) {
|
|
78
|
-
try {
|
|
79
|
-
const content = await readFile(this.metadataPath, 'utf-8');
|
|
80
|
-
this.metadata = JSON.parse(content);
|
|
81
|
-
}
|
|
82
|
-
catch (error) {
|
|
83
|
-
// 元数据文件损坏,忽略
|
|
84
|
-
this.metadata = null;
|
|
85
|
-
}
|
|
86
|
-
}
|
|
87
|
-
}
|
|
88
|
-
async saveMetadata() {
|
|
89
|
-
if (this.metadata) {
|
|
90
|
-
await writeFile(this.metadataPath, JSON.stringify(this.metadata, null, 2), 'utf-8');
|
|
91
|
-
}
|
|
92
|
-
}
|
|
93
|
-
async setClientInfo(clientId, workspacePath) {
|
|
94
|
-
if (!this.metadata) {
|
|
95
|
-
this.metadata = {
|
|
96
|
-
clientId,
|
|
97
|
-
workspacePath,
|
|
98
|
-
version: 0,
|
|
99
|
-
files: {},
|
|
100
|
-
};
|
|
101
|
-
}
|
|
102
|
-
else {
|
|
103
|
-
this.metadata.clientId = clientId;
|
|
104
|
-
this.metadata.workspacePath = workspacePath;
|
|
105
|
-
}
|
|
106
|
-
await this.saveMetadata();
|
|
107
|
-
}
|
|
108
|
-
getClientId() {
|
|
109
|
-
return this.metadata?.clientId || null;
|
|
110
|
-
}
|
|
111
|
-
getWorkspacePath() {
|
|
112
|
-
return this.metadata?.workspacePath || null;
|
|
113
|
-
}
|
|
114
|
-
getOldFiles() {
|
|
115
|
-
return this.metadata?.files || {};
|
|
116
|
-
}
|
|
117
|
-
async updateFileList(files) {
|
|
118
|
-
if (!this.metadata) {
|
|
119
|
-
this.metadata = {
|
|
120
|
-
clientId: null,
|
|
121
|
-
workspacePath: null,
|
|
122
|
-
version: this.currentVersion,
|
|
123
|
-
files,
|
|
124
|
-
};
|
|
125
|
-
}
|
|
126
|
-
else {
|
|
127
|
-
this.metadata.files = files;
|
|
128
|
-
this.metadata.version = this.currentVersion;
|
|
129
|
-
}
|
|
130
|
-
await this.saveMetadata();
|
|
131
|
-
}
|
|
132
|
-
getFileHash(path) {
|
|
133
|
-
return this.metadata?.files[path];
|
|
134
|
-
}
|
|
135
|
-
hasFile(path, hash) {
|
|
136
|
-
return this.metadata?.files[path] === hash;
|
|
137
|
-
}
|
|
138
|
-
getPath() {
|
|
139
|
-
return this.path;
|
|
140
|
-
}
|
|
141
|
-
getCurrentVersion() {
|
|
142
|
-
return this.currentVersion;
|
|
143
|
-
}
|
|
144
|
-
setVersion(version) {
|
|
145
|
-
this.currentVersion = version;
|
|
146
|
-
if (this.metadata) {
|
|
147
|
-
this.metadata.version = version;
|
|
148
|
-
this.saveMetadata().catch(() => {
|
|
149
|
-
// 忽略保存错误
|
|
150
|
-
});
|
|
151
|
-
}
|
|
152
|
-
}
|
|
153
|
-
async writeFile(relativePath, content) {
|
|
154
|
-
const fullPath = join(this.path, relativePath);
|
|
155
|
-
const dir = join(fullPath, '..');
|
|
156
|
-
if (!existsSync(dir)) {
|
|
157
|
-
await mkdir(dir, { recursive: true });
|
|
158
|
-
}
|
|
159
|
-
await writeFile(fullPath, content);
|
|
160
|
-
}
|
|
161
|
-
async deleteFile(relativePath) {
|
|
162
|
-
const fullPath = join(this.path, relativePath);
|
|
163
|
-
if (existsSync(fullPath)) {
|
|
164
|
-
await unlink(fullPath);
|
|
165
|
-
}
|
|
166
|
-
}
|
|
167
|
-
async cleanup() {
|
|
168
|
-
try {
|
|
169
|
-
// 清理工作区目录
|
|
170
|
-
await rm(this.path, { recursive: true, force: true });
|
|
171
|
-
// 清理元数据文件
|
|
172
|
-
if (existsSync(this.metadataPath)) {
|
|
173
|
-
await unlink(this.metadataPath);
|
|
174
|
-
}
|
|
175
|
-
this.metadata = null;
|
|
176
|
-
}
|
|
177
|
-
catch (error) {
|
|
178
|
-
// 忽略清理错误
|
|
179
|
-
}
|
|
180
|
-
}
|
|
181
|
-
async disconnect() {
|
|
182
|
-
// 断开连接时保留工作区,只保存元数据
|
|
183
|
-
await this.saveMetadata();
|
|
184
|
-
}
|
|
185
|
-
}
|
|
186
|
-
//# sourceMappingURL=workspace.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"workspace.js","sourceRoot":"","sources":["../../src/core/workspace.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* WebSocket 传输层
|
|
3
|
-
*/
|
|
4
|
-
import { WebSocket, WebSocketServer } from 'ws';
|
|
5
|
-
import type { Message } from '../core/protocol.js';
|
|
6
|
-
export declare class WebSocketTransport {
|
|
7
|
-
private ws;
|
|
8
|
-
private server;
|
|
9
|
-
private messageHandlers;
|
|
10
|
-
private allMessageHandlers;
|
|
11
|
-
private closeHandlers;
|
|
12
|
-
createServer(port: number, onConnection: (ws: WebSocket) => void): Promise<WebSocketServer>;
|
|
13
|
-
connect(url: string): Promise<WebSocket>;
|
|
14
|
-
private setupMessageHandler;
|
|
15
|
-
send(message: Message): void;
|
|
16
|
-
onMessage(type: string, handler: (message: Message) => void): void;
|
|
17
|
-
onAnyMessage(handler: (message: Message) => void): void;
|
|
18
|
-
onClose(handler: () => void): void;
|
|
19
|
-
getWebSocket(): WebSocket | null;
|
|
20
|
-
close(): void;
|
|
21
|
-
}
|
|
22
|
-
//# sourceMappingURL=websocket.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"websocket.d.ts","sourceRoot":"","sources":["../../src/transport/websocket.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,IAAI,CAAC;AAChD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAEnD,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,EAAE,CAA0B;IACpC,OAAO,CAAC,MAAM,CAAgC;IAC9C,OAAO,CAAC,eAAe,CAAsD;IAC7E,OAAO,CAAC,kBAAkB,CAAyC;IACnE,OAAO,CAAC,aAAa,CAAyB;IAG9C,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,YAAY,EAAE,CAAC,EAAE,EAAE,SAAS,KAAK,IAAI,GAAG,OAAO,CAAC,eAAe,CAAC;IAiB3F,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC;IAcxC,OAAO,CAAC,mBAAmB;IA8B3B,IAAI,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;IAO5B,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,GAAG,IAAI;IAIlE,YAAY,CAAC,OAAO,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,GAAG,IAAI;IAIvD,OAAO,CAAC,OAAO,EAAE,MAAM,IAAI,GAAG,IAAI;IAIlC,YAAY,IAAI,SAAS,GAAG,IAAI;IAIhC,KAAK,IAAI,IAAI;CAad"}
|
|
@@ -1,96 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* WebSocket 传输层
|
|
3
|
-
*/
|
|
4
|
-
import { WebSocket, WebSocketServer } from 'ws';
|
|
5
|
-
export class WebSocketTransport {
|
|
6
|
-
ws = null;
|
|
7
|
-
server = null;
|
|
8
|
-
messageHandlers = new Map();
|
|
9
|
-
allMessageHandlers = [];
|
|
10
|
-
closeHandlers = [];
|
|
11
|
-
// Server side
|
|
12
|
-
createServer(port, onConnection) {
|
|
13
|
-
return new Promise((resolve, reject) => {
|
|
14
|
-
const server = new WebSocketServer({ port }, () => {
|
|
15
|
-
resolve(server);
|
|
16
|
-
});
|
|
17
|
-
server.on('error', reject);
|
|
18
|
-
server.on('connection', (ws) => {
|
|
19
|
-
this.setupMessageHandler(ws);
|
|
20
|
-
onConnection(ws);
|
|
21
|
-
});
|
|
22
|
-
this.server = server;
|
|
23
|
-
});
|
|
24
|
-
}
|
|
25
|
-
// Client side
|
|
26
|
-
connect(url) {
|
|
27
|
-
return new Promise((resolve, reject) => {
|
|
28
|
-
const ws = new WebSocket(url);
|
|
29
|
-
ws.on('open', () => {
|
|
30
|
-
this.ws = ws;
|
|
31
|
-
this.setupMessageHandler(ws);
|
|
32
|
-
resolve(ws);
|
|
33
|
-
});
|
|
34
|
-
ws.on('error', reject);
|
|
35
|
-
});
|
|
36
|
-
}
|
|
37
|
-
setupMessageHandler(ws) {
|
|
38
|
-
ws.on('message', (data) => {
|
|
39
|
-
try {
|
|
40
|
-
// 正确处理 Buffer 和 string 类型的数据
|
|
41
|
-
const messageStr = typeof data === 'string' ? data : data.toString('utf8');
|
|
42
|
-
const message = JSON.parse(messageStr);
|
|
43
|
-
// 调用特定类型的处理器
|
|
44
|
-
const handler = this.messageHandlers.get(message.type);
|
|
45
|
-
if (handler) {
|
|
46
|
-
handler(message);
|
|
47
|
-
}
|
|
48
|
-
// 调用所有消息处理器
|
|
49
|
-
for (const h of this.allMessageHandlers) {
|
|
50
|
-
h(message);
|
|
51
|
-
}
|
|
52
|
-
}
|
|
53
|
-
catch (error) {
|
|
54
|
-
console.error('Failed to parse message:', error);
|
|
55
|
-
}
|
|
56
|
-
});
|
|
57
|
-
ws.on('close', () => {
|
|
58
|
-
// 调用所有关闭处理器
|
|
59
|
-
for (const handler of this.closeHandlers) {
|
|
60
|
-
handler();
|
|
61
|
-
}
|
|
62
|
-
});
|
|
63
|
-
}
|
|
64
|
-
send(message) {
|
|
65
|
-
if (!this.ws || this.ws.readyState !== WebSocket.OPEN) {
|
|
66
|
-
throw new Error('WebSocket is not connected');
|
|
67
|
-
}
|
|
68
|
-
this.ws.send(JSON.stringify(message));
|
|
69
|
-
}
|
|
70
|
-
onMessage(type, handler) {
|
|
71
|
-
this.messageHandlers.set(type, handler);
|
|
72
|
-
}
|
|
73
|
-
onAnyMessage(handler) {
|
|
74
|
-
this.allMessageHandlers.push(handler);
|
|
75
|
-
}
|
|
76
|
-
onClose(handler) {
|
|
77
|
-
this.closeHandlers.push(handler);
|
|
78
|
-
}
|
|
79
|
-
getWebSocket() {
|
|
80
|
-
return this.ws;
|
|
81
|
-
}
|
|
82
|
-
close() {
|
|
83
|
-
if (this.ws) {
|
|
84
|
-
this.ws.close();
|
|
85
|
-
this.ws = null;
|
|
86
|
-
}
|
|
87
|
-
if (this.server) {
|
|
88
|
-
this.server.close();
|
|
89
|
-
this.server = null;
|
|
90
|
-
}
|
|
91
|
-
this.messageHandlers.clear();
|
|
92
|
-
this.allMessageHandlers = [];
|
|
93
|
-
this.closeHandlers = [];
|
|
94
|
-
}
|
|
95
|
-
}
|
|
96
|
-
//# sourceMappingURL=websocket.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"websocket.js","sourceRoot":"","sources":["../../src/transport/websocket.ts"],"names":[],"mappings":"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"}
|