@cjwddz/mirror 0.0.1 → 0.0.2
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/README.md +115 -0
- package/dist/cli/index.js +1 -1
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/link.d.ts.map +1 -1
- package/dist/cli/link.js +19 -6
- package/dist/cli/link.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -52,10 +52,29 @@ mirror link 192.168.1.100:7331?token=KJ82mZpX...
|
|
|
52
52
|
|
|
53
53
|
在项目目录中执行:
|
|
54
54
|
|
|
55
|
+
**使用 IP 和端口连接:**
|
|
56
|
+
|
|
55
57
|
```bash
|
|
56
58
|
mirror link 192.168.1.100:7331?token=KJ82mZpX...
|
|
57
59
|
```
|
|
58
60
|
|
|
61
|
+
**使用域名连接(支持反向代理):**
|
|
62
|
+
|
|
63
|
+
```bash
|
|
64
|
+
# HTTP (ws://)
|
|
65
|
+
mirror link ws://mirror.example.com?token=KJ82mZpX...
|
|
66
|
+
|
|
67
|
+
# HTTPS (wss://)
|
|
68
|
+
mirror link wss://mirror.example.com?token=KJ82mZpX...
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
**URL 格式说明:**
|
|
72
|
+
|
|
73
|
+
- 格式:`[ws://|wss://]host[:port]?token=xxx`
|
|
74
|
+
- `ws://` 或 `wss://` 协议前缀可选(默认 `ws://`)
|
|
75
|
+
- `port` 可选,如果使用反向代理可以不指定端口
|
|
76
|
+
- `token` 必需,用于身份验证
|
|
77
|
+
|
|
59
78
|
连接成功后:
|
|
60
79
|
|
|
61
80
|
1. 自动进行全量文件同步
|
|
@@ -97,12 +116,108 @@ Host 维护以下状态:
|
|
|
97
116
|
- 命令执行在独立的进程组中
|
|
98
117
|
- 断开连接时自动清理所有进程
|
|
99
118
|
|
|
119
|
+
## Nginx 反向代理配置
|
|
120
|
+
|
|
121
|
+
如果需要在生产环境中通过域名访问,可以使用 Nginx 作为反向代理。
|
|
122
|
+
|
|
123
|
+
### 基本配置(HTTP)
|
|
124
|
+
|
|
125
|
+
```nginx
|
|
126
|
+
server {
|
|
127
|
+
listen 80;
|
|
128
|
+
server_name mirror.example.com;
|
|
129
|
+
|
|
130
|
+
location / {
|
|
131
|
+
proxy_pass http://127.0.0.1:7331;
|
|
132
|
+
proxy_http_version 1.1;
|
|
133
|
+
|
|
134
|
+
# WebSocket 升级
|
|
135
|
+
proxy_set_header Upgrade $http_upgrade;
|
|
136
|
+
proxy_set_header Connection "upgrade";
|
|
137
|
+
|
|
138
|
+
# 传递原始信息
|
|
139
|
+
proxy_set_header Host $host;
|
|
140
|
+
proxy_set_header X-Real-IP $remote_addr;
|
|
141
|
+
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
|
142
|
+
proxy_set_header X-Forwarded-Proto $scheme;
|
|
143
|
+
|
|
144
|
+
# 超时设置
|
|
145
|
+
proxy_connect_timeout 7d;
|
|
146
|
+
proxy_send_timeout 7d;
|
|
147
|
+
proxy_read_timeout 7d;
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
```
|
|
151
|
+
|
|
152
|
+
### HTTPS 配置(推荐)
|
|
153
|
+
|
|
154
|
+
```nginx
|
|
155
|
+
server {
|
|
156
|
+
listen 443 ssl http2;
|
|
157
|
+
server_name mirror.example.com;
|
|
158
|
+
|
|
159
|
+
# SSL 证书配置
|
|
160
|
+
ssl_certificate /path/to/cert.pem;
|
|
161
|
+
ssl_certificate_key /path/to/key.pem;
|
|
162
|
+
|
|
163
|
+
# SSL 优化
|
|
164
|
+
ssl_protocols TLSv1.2 TLSv1.3;
|
|
165
|
+
ssl_ciphers HIGH:!aNULL:!MD5;
|
|
166
|
+
ssl_prefer_server_ciphers on;
|
|
167
|
+
|
|
168
|
+
location / {
|
|
169
|
+
proxy_pass http://127.0.0.1:7331;
|
|
170
|
+
proxy_http_version 1.1;
|
|
171
|
+
|
|
172
|
+
# WebSocket 升级
|
|
173
|
+
proxy_set_header Upgrade $http_upgrade;
|
|
174
|
+
proxy_set_header Connection "upgrade";
|
|
175
|
+
|
|
176
|
+
# 传递原始信息
|
|
177
|
+
proxy_set_header Host $host;
|
|
178
|
+
proxy_set_header X-Real-IP $remote_addr;
|
|
179
|
+
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
|
180
|
+
proxy_set_header X-Forwarded-Proto $scheme;
|
|
181
|
+
|
|
182
|
+
# 超时设置(WebSocket 连接可能需要长时间保持)
|
|
183
|
+
proxy_connect_timeout 7d;
|
|
184
|
+
proxy_send_timeout 7d;
|
|
185
|
+
proxy_read_timeout 7d;
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
# HTTP 重定向到 HTTPS
|
|
190
|
+
server {
|
|
191
|
+
listen 80;
|
|
192
|
+
server_name mirror.example.com;
|
|
193
|
+
return 301 https://$server_name$request_uri;
|
|
194
|
+
}
|
|
195
|
+
```
|
|
196
|
+
|
|
197
|
+
### 配置说明
|
|
198
|
+
|
|
199
|
+
1. **WebSocket 升级**:`proxy_set_header Upgrade` 和 `Connection "upgrade"` 是必需的,用于将 HTTP 连接升级为 WebSocket
|
|
200
|
+
2. **超时设置**:WebSocket 连接可能需要长时间保持,建议设置较长的超时时间(如 7 天)
|
|
201
|
+
3. **端口映射**:将 `127.0.0.1:7331` 替换为实际的 mirror host 服务地址和端口
|
|
202
|
+
4. **SSL 证书**:使用 HTTPS 时,需要配置有效的 SSL 证书
|
|
203
|
+
|
|
204
|
+
配置完成后,客户端可以使用以下方式连接:
|
|
205
|
+
|
|
206
|
+
```bash
|
|
207
|
+
# HTTPS (推荐)
|
|
208
|
+
mirror link wss://mirror.example.com?token=KJ82mZpX...
|
|
209
|
+
|
|
210
|
+
# HTTP (不推荐,仅用于测试)
|
|
211
|
+
mirror link ws://mirror.example.com?token=KJ82mZpX...
|
|
212
|
+
```
|
|
213
|
+
|
|
100
214
|
## 注意事项
|
|
101
215
|
|
|
102
216
|
- ⚠️ 仅用于开发阶段,不适用于生产环境
|
|
103
217
|
- ⚠️ 不支持多 client 并发(新连接会抢占旧连接)
|
|
104
218
|
- ⚠️ workspace 是临时的,断开连接后自动清理
|
|
105
219
|
- ⚠️ 不支持恢复,需要重新连接
|
|
220
|
+
- ⚠️ 使用反向代理时,确保 Nginx 配置了正确的 WebSocket 升级头
|
|
106
221
|
|
|
107
222
|
## 开发
|
|
108
223
|
|
package/dist/cli/index.js
CHANGED
|
@@ -18,7 +18,7 @@ program
|
|
|
18
18
|
program
|
|
19
19
|
.command('link')
|
|
20
20
|
.description('连接到远程 host')
|
|
21
|
-
.argument('<url>', '连接地址,格式: host:port?token=xxx')
|
|
21
|
+
.argument('<url>', '连接地址,格式: [ws://|wss://]host[:port]?token=xxx')
|
|
22
22
|
.action(linkCommand);
|
|
23
23
|
program.parse();
|
|
24
24
|
//# sourceMappingURL=index.js.map
|
package/dist/cli/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":";AAEA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAExC,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,WAAW,CAAC,eAAe,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;AAErE,OAAO;KACJ,OAAO,CAAC,MAAM,CAAC;KACf,WAAW,CAAC,cAAc,CAAC;KAC3B,MAAM,CAAC,mBAAmB,EAAE,KAAK,EAAE,MAAM,CAAC;KAC1C,MAAM,CAAC,iBAAiB,EAAE,MAAM,EAAE,MAAM,CAAC;KACzC,MAAM,CAAC,qBAAqB,EAAE,eAAe,EAAE,mBAAmB,CAAC;KACnE,MAAM,CAAC,iBAAiB,EAAE,4BAA4B,CAAC;KACvD,MAAM,CAAC,WAAW,CAAC,CAAC;AAEvB,OAAO;KACJ,OAAO,CAAC,MAAM,CAAC;KACf,WAAW,CAAC,YAAY,CAAC;KACzB,QAAQ,CAAC,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":";AAEA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAExC,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,WAAW,CAAC,eAAe,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;AAErE,OAAO;KACJ,OAAO,CAAC,MAAM,CAAC;KACf,WAAW,CAAC,cAAc,CAAC;KAC3B,MAAM,CAAC,mBAAmB,EAAE,KAAK,EAAE,MAAM,CAAC;KAC1C,MAAM,CAAC,iBAAiB,EAAE,MAAM,EAAE,MAAM,CAAC;KACzC,MAAM,CAAC,qBAAqB,EAAE,eAAe,EAAE,mBAAmB,CAAC;KACnE,MAAM,CAAC,iBAAiB,EAAE,4BAA4B,CAAC;KACvD,MAAM,CAAC,WAAW,CAAC,CAAC;AAEvB,OAAO;KACJ,OAAO,CAAC,MAAM,CAAC;KACf,WAAW,CAAC,YAAY,CAAC;KACzB,QAAQ,CAAC,OAAO,EAAE,8CAA8C,CAAC;KACjE,MAAM,CAAC,WAAW,CAAC,CAAC;AAEvB,OAAO,CAAC,KAAK,EAAE,CAAC"}
|
package/dist/cli/link.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"link.d.ts","sourceRoot":"","sources":["../../src/cli/link.ts"],"names":[],"mappings":"AAAA;;GAEG;AAYH,wBAAsB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"link.d.ts","sourceRoot":"","sources":["../../src/cli/link.ts"],"names":[],"mappings":"AAAA;;GAEG;AAYH,wBAAsB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAsD5D"}
|
package/dist/cli/link.js
CHANGED
|
@@ -13,7 +13,7 @@ export async function linkCommand(url) {
|
|
|
13
13
|
// 解析 URL
|
|
14
14
|
const parsed = parseUrl(url);
|
|
15
15
|
if (!parsed) {
|
|
16
|
-
console.error('Invalid URL format. Expected: host:port?token=xxx');
|
|
16
|
+
console.error('Invalid URL format. Expected: [ws://|wss://]host[:port]?token=xxx');
|
|
17
17
|
process.exit(1);
|
|
18
18
|
}
|
|
19
19
|
// 检查当前目录
|
|
@@ -25,7 +25,9 @@ export async function linkCommand(url) {
|
|
|
25
25
|
const clientId = randomUUID();
|
|
26
26
|
const clientVersion = '0.0.0'; // TODO: 从 package.json 读取
|
|
27
27
|
// 连接 WebSocket
|
|
28
|
-
const
|
|
28
|
+
const protocol = parsed.protocol || 'ws';
|
|
29
|
+
const portPart = parsed.port ? `:${parsed.port}` : '';
|
|
30
|
+
const wsUrl = `${protocol}://${parsed.host}${portPart}`;
|
|
29
31
|
const transport = new WebSocketTransport();
|
|
30
32
|
try {
|
|
31
33
|
await transport.connect(wsUrl);
|
|
@@ -55,14 +57,25 @@ export async function linkCommand(url) {
|
|
|
55
57
|
}
|
|
56
58
|
function parseUrl(url) {
|
|
57
59
|
try {
|
|
58
|
-
|
|
60
|
+
// 如果 URL 没有协议,默认添加 ws://
|
|
61
|
+
let urlToParse = url;
|
|
62
|
+
if (!url.startsWith('ws://') && !url.startsWith('wss://')) {
|
|
63
|
+
urlToParse = `ws://${url}`;
|
|
64
|
+
}
|
|
65
|
+
const urlObj = new URL(urlToParse);
|
|
66
|
+
const protocol = urlObj.protocol === 'wss:' ? 'wss' : 'ws';
|
|
59
67
|
const host = urlObj.hostname;
|
|
60
|
-
const
|
|
68
|
+
const portStr = urlObj.port;
|
|
69
|
+
const port = portStr ? parseInt(portStr, 10) : null;
|
|
61
70
|
const token = urlObj.searchParams.get('token');
|
|
62
|
-
if (!host ||
|
|
71
|
+
if (!host || !token) {
|
|
72
|
+
return null;
|
|
73
|
+
}
|
|
74
|
+
// 如果端口无效,返回 null(但允许 port 为 null,表示使用默认端口)
|
|
75
|
+
if (portStr && isNaN(port)) {
|
|
63
76
|
return null;
|
|
64
77
|
}
|
|
65
|
-
return { host, port, token };
|
|
78
|
+
return { protocol, host, port, token };
|
|
66
79
|
}
|
|
67
80
|
catch {
|
|
68
81
|
return null;
|
package/dist/cli/link.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"link.js","sourceRoot":"","sources":["../../src/cli/link.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AACpC,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AACtC,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAChC,OAAO,QAAQ,MAAM,UAAU,CAAC;AAChC,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAE/D,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACzE,OAAO,KAAK,QAAQ,MAAM,UAAU,CAAC;AAErC,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,GAAW;IAC3C,SAAS;IACT,MAAM,MAAM,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC;IAC7B,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO,CAAC,KAAK,CAAC,
|
|
1
|
+
{"version":3,"file":"link.js","sourceRoot":"","sources":["../../src/cli/link.ts"],"names":[],"mappings":"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"}
|