most-box 0.0.2 → 0.0.6

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.
Files changed (181) hide show
  1. package/LICENSE +21 -21
  2. package/README.md +222 -156
  3. package/electron/main.js +67 -0
  4. package/out/404/index.html +15 -0
  5. package/out/404.html +15 -0
  6. package/out/__next.__PAGE__.txt +11 -0
  7. package/out/__next._full.txt +21 -0
  8. package/out/__next._head.txt +5 -0
  9. package/out/__next._index.txt +7 -0
  10. package/out/__next._tree.txt +4 -0
  11. package/out/_next/static/alUUgRz4oMlw4EtULOYfV/_buildManifest.js +11 -0
  12. package/out/_next/static/alUUgRz4oMlw4EtULOYfV/_clientMiddlewareManifest.js +1 -0
  13. package/out/_next/static/alUUgRz4oMlw4EtULOYfV/_ssgManifest.js +1 -0
  14. package/out/_next/static/chunks/00s106sbq8t9v.js +1 -0
  15. package/out/_next/static/chunks/0174xh3wfsjm1.js +2 -0
  16. package/out/_next/static/chunks/01xlw8hd842-c.js +1 -0
  17. package/out/_next/static/chunks/02ou_44kkb5dz.js +1 -0
  18. package/out/_next/static/chunks/02pr2b_eos3~h.js +1 -0
  19. package/out/_next/static/chunks/03~yq9q893hmn.js +1 -0
  20. package/out/_next/static/chunks/07lsjkarm1p9f.css +1 -0
  21. package/out/_next/static/chunks/0_-ccbcyh_o30.css +1 -0
  22. package/out/_next/static/chunks/0_b839~4.q324.js +1 -0
  23. package/out/_next/static/chunks/0_sna3wdypbzr.js +1 -0
  24. package/out/_next/static/chunks/0_wia9ofmsi1c.css +2 -0
  25. package/out/_next/static/chunks/0byj66sc-9o0g.js +1 -0
  26. package/out/_next/static/chunks/0bzupvr5gt3k9.js +31 -0
  27. package/out/_next/static/chunks/0d3shmwh5_nmn.js +1 -0
  28. package/out/_next/static/chunks/0du450zbk4kq_.js +1 -0
  29. package/out/_next/static/chunks/0e_h0d3ekzks8.css +1 -0
  30. package/out/_next/static/chunks/0ho~log~~-jwp.css +1 -0
  31. package/out/_next/static/chunks/0ibjp~7qzxfjv.js +5 -0
  32. package/out/_next/static/chunks/0imvn_arv36xt.css +1 -0
  33. package/out/_next/static/chunks/0j9~17180dl8j.js +1 -0
  34. package/out/_next/static/chunks/0ji.28mehrvdp.js +1 -0
  35. package/out/_next/static/chunks/0jl~j62iz2uvr.js +1 -0
  36. package/out/_next/static/chunks/0nct0fubs64d-.js +1 -0
  37. package/out/_next/static/chunks/0n~dq4kpx9xxx.js +1 -0
  38. package/out/_next/static/chunks/0pqt~8bl3ukh4.js +4 -0
  39. package/out/_next/static/chunks/0q7ck9f.90_i9.js +1 -0
  40. package/out/_next/static/chunks/0qub_r0x_r-e9.css +1 -0
  41. package/out/_next/static/chunks/0rr4gwjp9z~9a.js +1 -0
  42. package/out/_next/static/chunks/0ry.po.a~iu4p.js +1 -0
  43. package/out/_next/static/chunks/0slwj0c46k5cu.js +1 -0
  44. package/out/_next/static/chunks/0sorqk.oc6b7j.css +1 -0
  45. package/out/_next/static/chunks/11dalasm30arx.js +1 -0
  46. package/out/_next/static/chunks/turbopack-0a_g3u0ud~jb8.js +1 -0
  47. package/out/_not-found/__next._full.txt +20 -0
  48. package/out/_not-found/__next._head.txt +5 -0
  49. package/out/_not-found/__next._index.txt +7 -0
  50. package/out/_not-found/__next._not-found.__PAGE__.txt +9 -0
  51. package/out/_not-found/__next._not-found.txt +5 -0
  52. package/out/_not-found/__next._tree.txt +2 -0
  53. package/out/_not-found/index.html +15 -0
  54. package/out/_not-found/index.txt +20 -0
  55. package/out/app/__next._full.txt +20 -0
  56. package/out/app/__next._head.txt +5 -0
  57. package/out/app/__next._index.txt +7 -0
  58. package/out/app/__next._tree.txt +2 -0
  59. package/out/app/__next.app.__PAGE__.txt +9 -0
  60. package/out/app/__next.app.txt +5 -0
  61. package/out/app/index.html +15 -0
  62. package/out/app/index.txt +20 -0
  63. package/out/changelog/__next._full.txt +22 -0
  64. package/out/changelog/__next._head.txt +5 -0
  65. package/out/changelog/__next._index.txt +7 -0
  66. package/out/changelog/__next._tree.txt +3 -0
  67. package/out/changelog/__next.changelog.__PAGE__.txt +10 -0
  68. package/out/changelog/__next.changelog.txt +5 -0
  69. package/out/changelog/index.html +15 -0
  70. package/out/changelog/index.txt +22 -0
  71. package/out/chat/__next._full.txt +21 -0
  72. package/out/chat/__next._head.txt +5 -0
  73. package/out/chat/__next._index.txt +7 -0
  74. package/out/chat/__next._tree.txt +3 -0
  75. package/out/chat/__next.chat.__PAGE__.txt +9 -0
  76. package/out/chat/__next.chat.txt +6 -0
  77. package/out/chat/index.html +15 -0
  78. package/out/chat/index.txt +21 -0
  79. package/out/docs/__next._full.txt +22 -0
  80. package/out/docs/__next._head.txt +5 -0
  81. package/out/docs/__next._index.txt +7 -0
  82. package/out/docs/__next._tree.txt +3 -0
  83. package/out/docs/__next.docs.__PAGE__.txt +10 -0
  84. package/out/docs/__next.docs.txt +5 -0
  85. package/out/docs/getting-started/__next._full.txt +22 -0
  86. package/out/docs/getting-started/__next._head.txt +5 -0
  87. package/out/docs/getting-started/__next._index.txt +7 -0
  88. package/out/docs/getting-started/__next._tree.txt +3 -0
  89. package/out/docs/getting-started/__next.docs.getting-started.__PAGE__.txt +10 -0
  90. package/out/docs/getting-started/__next.docs.getting-started.txt +5 -0
  91. package/out/docs/getting-started/__next.docs.txt +5 -0
  92. package/out/docs/getting-started/index.html +15 -0
  93. package/out/docs/getting-started/index.txt +22 -0
  94. package/out/docs/index.html +15 -0
  95. package/out/docs/index.txt +22 -0
  96. package/out/download/__next._full.txt +34 -0
  97. package/out/download/__next._head.txt +5 -0
  98. package/out/download/__next._index.txt +7 -0
  99. package/out/download/__next._tree.txt +4 -0
  100. package/out/download/__next.download.__PAGE__.txt +16 -0
  101. package/out/download/__next.download.txt +5 -0
  102. package/out/download/index.html +15 -0
  103. package/out/download/index.txt +34 -0
  104. package/out/favicon.ico +0 -0
  105. package/out/fonts/jetbrains-mono-latin-400-normal.woff2 +0 -0
  106. package/out/fonts/jetbrains-mono-latin-500-normal.woff2 +0 -0
  107. package/out/fonts/jetbrains-mono-latin-600-normal.woff2 +0 -0
  108. package/out/fonts/jetbrains-mono-latin-700-normal.woff2 +0 -0
  109. package/out/index.html +15 -0
  110. package/out/index.txt +21 -0
  111. package/out/lottery/__next._full.txt +21 -0
  112. package/out/lottery/__next._head.txt +5 -0
  113. package/out/lottery/__next._index.txt +7 -0
  114. package/out/lottery/__next._tree.txt +3 -0
  115. package/out/lottery/__next.lottery.__PAGE__.txt +9 -0
  116. package/out/lottery/__next.lottery.txt +6 -0
  117. package/out/lottery/index.html +15 -0
  118. package/out/lottery/index.txt +21 -0
  119. package/out/ping/__next._full.txt +21 -0
  120. package/out/ping/__next._head.txt +5 -0
  121. package/out/ping/__next._index.txt +7 -0
  122. package/out/ping/__next._tree.txt +4 -0
  123. package/out/ping/__next.ping.__PAGE__.txt +10 -0
  124. package/out/ping/__next.ping.txt +5 -0
  125. package/out/ping/index.html +15 -0
  126. package/out/ping/index.txt +21 -0
  127. package/out/pwa-512x512.png +0 -0
  128. package/out/web3/__next._full.txt +21 -0
  129. package/out/web3/__next._head.txt +5 -0
  130. package/out/web3/__next._index.txt +7 -0
  131. package/out/web3/__next._tree.txt +3 -0
  132. package/out/web3/__next.web3.__PAGE__.txt +9 -0
  133. package/out/web3/__next.web3.txt +6 -0
  134. package/out/web3/ed25519/__next._full.txt +20 -0
  135. package/out/web3/ed25519/__next._head.txt +5 -0
  136. package/out/web3/ed25519/__next._index.txt +7 -0
  137. package/out/web3/ed25519/__next._tree.txt +3 -0
  138. package/out/web3/ed25519/__next.web3.ed25519.__PAGE__.txt +6 -0
  139. package/out/web3/ed25519/__next.web3.ed25519.txt +5 -0
  140. package/out/web3/ed25519/__next.web3.txt +6 -0
  141. package/out/web3/ed25519/index.html +1 -0
  142. package/out/web3/ed25519/index.txt +20 -0
  143. package/out/web3/index.html +15 -0
  144. package/out/web3/index.txt +21 -0
  145. package/out/web3/tools/__next._full.txt +20 -0
  146. package/out/web3/tools/__next._head.txt +5 -0
  147. package/out/web3/tools/__next._index.txt +7 -0
  148. package/out/web3/tools/__next._tree.txt +3 -0
  149. package/out/web3/tools/__next.web3.tools.__PAGE__.txt +6 -0
  150. package/out/web3/tools/__next.web3.tools.txt +5 -0
  151. package/out/web3/tools/__next.web3.txt +6 -0
  152. package/out/web3/tools/index.html +1 -0
  153. package/out/web3/tools/index.txt +20 -0
  154. package/package.json +162 -48
  155. package/public/fonts/jetbrains-mono-latin-400-normal.woff2 +0 -0
  156. package/public/fonts/jetbrains-mono-latin-500-normal.woff2 +0 -0
  157. package/public/fonts/jetbrains-mono-latin-600-normal.woff2 +0 -0
  158. package/public/fonts/jetbrains-mono-latin-700-normal.woff2 +0 -0
  159. package/public/pwa-512x512.png +0 -0
  160. package/server/cli.js +3 -0
  161. package/server/index.js +963 -0
  162. package/{src → server/src}/config.js +51 -39
  163. package/{src → server/src}/core/cid.js +157 -146
  164. package/{src → server/src}/index.js +1950 -1201
  165. package/server/src/utils/api.js +68 -0
  166. package/server/src/utils/avatar.js +11 -0
  167. package/{src → server/src}/utils/errors.js +70 -66
  168. package/server/src/utils/mostWallet.js +42 -0
  169. package/server/src/utils/mp.js +117 -0
  170. package/{src → server/src}/utils/security.js +173 -169
  171. package/server/src/utils/userIdentity.js +93 -0
  172. package/build.mjs +0 -40
  173. package/cli.js +0 -2
  174. package/public/app.css +0 -1519
  175. package/public/app.jsx +0 -1543
  176. package/public/bundle.css +0 -1
  177. package/public/bundle.js +0 -107
  178. package/public/error-boundary.jsx +0 -50
  179. package/public/index.html +0 -16
  180. package/public/index.jsx +0 -20
  181. package/server.js +0 -698
package/LICENSE CHANGED
@@ -1,21 +1,21 @@
1
- MIT License
2
-
3
- Copyright (c) 2026 MOST.BOX
4
-
5
- Permission is hereby granted, free of charge, to any person obtaining a copy
6
- of this software and associated documentation files (the "Software"), to deal
7
- in the Software without restriction, including without limitation the rights
8
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
- copies of the Software, and to permit persons to whom the Software is
10
- furnished to do so, subject to the following conditions:
11
-
12
- The above copyright notice and this permission notice shall be included in all
13
- copies or substantial portions of the Software.
14
-
15
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
- SOFTWARE.
1
+ MIT License
2
+
3
+ Copyright (c) 2026 MOST.BOX
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md CHANGED
@@ -1,156 +1,222 @@
1
- # MostBox 文件管理
2
-
3
- [![npm version](https://img.shields.io/npm/v/most-box)](https://npmjs.com/package/most-box)
4
- [![Node.js version](https://img.shields.io/badge/node-%3E%3D18-brightgreen)](https://nodejs.org)
5
- [![License](https://img.shields.io/badge/license-MIT-blue)](LICENSE)
6
-
7
- > P2P 文件分享应用。基于 Hyperswarm/Hyperdrive 的去中心化文件分发。
8
-
9
- ## 为什么用 MostBox?
10
-
11
- | 特性 | MostBox | 微信/QQ | 网盘 |
12
- | ------------------- | ------- | ------- | ---- |
13
- | 🔒 无需注册 | ✅ | ❌ | ❌ |
14
- | 🚀 P2P直连,不限速 | ✅ | ❌ | 限流 |
15
- | 💾 去中心化存储 | ✅ | ❌ | ❌ |
16
- | 🌐 开源免费,自托管 | ✅ | ❌ ||
17
- | 📦 无限文件大小 | ✅ | ❌ | 限流 |
18
-
19
- ## 演示
20
-
21
- 在线体验:[Most.Box](https://Most.Box)
22
-
23
- ## 🚀 立即使用
24
-
25
- 打开终端,运行:
26
-
27
- ```bash
28
- npx most-box
29
- ```
30
-
31
- 浏览器自动访问 **http://127.0.0.1:1976**
32
-
33
- ## 需求
34
-
35
- - Node.js >= 18 ([下载地址](https://nodejs.org))
36
-
37
- ## 开发
38
-
39
- ```bash
40
- git clone <your-repo-url>
41
- cd most
42
- npm i
43
- npm start
44
- ```
45
-
46
- ## 测试
47
-
48
- ```bash
49
- npm test # 运行全部测试
50
- npm run test:unit # 只运行单元测试
51
- ```
52
-
53
- ## 访问场景
54
-
55
- | 场景 | 命令 | 访问地址 |
56
- | ---- | ------------------------------------------ | ------------------------- |
57
- | 本地 | `npx most-box` | `http://127.0.0.1:1976` |
58
- | 内网 | `set MOSTBOX_HOST=0.0.0.0 && npx most-box` | `http://<IP>:1976` |
59
- | 外网 | Caddy 反向代理 | `https://your-domain.com` |
60
-
61
- ### 内网访问
62
-
63
- ```bash
64
- set MOSTBOX_HOST=0.0.0.0
65
- npx most-box
66
- ```
67
-
68
- ### 外网访问(Caddy)
69
-
70
- ```caddy
71
- mostbox.example.com {
72
- reverse_proxy localhost:1976
73
- }
74
- ```
75
-
76
- ## 核心功能
77
-
78
- 1. **确定性 P2P 文件发布**
79
- - 采用标准 IPFS UnixFS Chunking 算法计算 CID v1
80
- - 相同文件生成一致的 CID 链接
81
-
82
- 2. **大文件流式传输**
83
- - 支持 GB 级别超大文件的发布与下载
84
-
85
- 3. **完整性校验**
86
- - 下载完成后自动验证 CID,防止数据篡改
87
-
88
- 4. **自定义 most:// 链接**
89
- - 分享文件生成 `most://<cid>` 格式链接
90
- - 接收方通过链接直接下载,无需其他配置
91
-
92
- ## 常见问题
93
-
94
- ### 文件存储在哪里?
95
-
96
- 文件以 **P2P 方式** 存储在分享者和接收者的设备上。当文件被分享时,内容会被分片存储在 P2P 网络中。**没有中心化服务器**,真正实现去中心化。
97
-
98
- ### 如何分享文件给其他人?
99
-
100
- 1. 打开 MostBox Web 界面
101
- 2. 上传文件或文件夹
102
- 3. 点击「复制链接」获取 `most://<cid>` 链接
103
- 4. 将链接发送给接收者
104
-
105
- ### most:// 链接是什么?
106
-
107
- `most://` 是 MostBox 自定义的协议链接,格式为 `most://<cid>`。接收方安装 MostBox 后,点击链接即可自动下载文件。
108
-
109
- ### 支持大文件吗?
110
-
111
- 支持。目前已测试通过 **GB 级别**的大文件传输,采用流式处理,内存占用低。
112
-
113
- ### 如何在其他设备上下载文件?
114
-
115
- 确保设备已安装 Node.js >= 18,然后运行:
116
-
117
- ```bash
118
- npx most-box
119
- ```
120
-
121
- 浏览器访问 `http://127.0.0.1:1976`,输入链接即可下载。
122
-
123
- ## 路线图
124
-
125
- ### v1.0(当前版本)
126
-
127
- - P2P 文件上传与下载
128
- - ✅ 确定性 CID 生成
129
- - ✅ 大文件流式传输
130
- - ✅ most:// 链接分享
131
- - Web UI 界面
132
-
133
- ### 长期规划
134
-
135
- - [ ] 浏览器扩展
136
- - [ ] 移动端支持(iOS/Android)
137
- - [ ] 桌面客户端
138
-
139
- ## 技术栈
140
-
141
- - **Hyperswarm** — P2P 网络发现与连接
142
- - **Hyperdrive** — 分布式文件存储
143
- - **Corestore** — Hypercore 存储管理
144
- - **IPFS UnixFS Importer** — CID 计算
145
- - **Node.js HTTP** — 零依赖的 HTTP + WebSocket 服务
146
- - **React** — Web UI
147
-
148
- ## 社区
149
-
150
- - **微信**:微信号 `most-box`(自动通过好友申请)
151
- - **GitHub Discussions**:[提出需求 & 技术讨论](../../discussions)
152
- - **问题反馈**:[Github issues](../../issues)
153
-
154
- ## 许可证
155
-
156
- MIT
1
+ # MostBox:你的数字魔盒
2
+
3
+ [![npm version](https://img.shields.io/npm/v/most-box)](https://npmjs.com/package/most-box)
4
+ [![Node.js version](https://img.shields.io/badge/node-%3E%3D18-brightgreen)](https://nodejs.org)
5
+ [![License](https://img.shields.io/badge/license-MIT-blue)](LICENSE)
6
+
7
+ > P2P 文件分享应用。基于 Hyperswarm/Hyperdrive 的去中心化文件分发。
8
+
9
+ ## 为什么用 MostBox?
10
+
11
+ | 特性 | MostBox | 微信/QQ | 网盘 |
12
+ | ------------------- | ------- | ------- | ---- |
13
+ | 🔒 无需注册 | ✅ | ❌ | ❌ |
14
+ | 🚀 P2P直连,不限速 | ✅ | ❌ | 限流 |
15
+ | 💾 去中心化存储 | ✅ | ❌ | ❌ |
16
+ | 🌐 开源免费,自托管 | ✅ | ❌ | |
17
+ | 📦 无限文件大小 | ✅ | ❌ | 限流 |
18
+
19
+ ## 演示
20
+
21
+ 在线体验:[Most.Box](https://Most.Box)
22
+
23
+ ## 🚀 立即使用
24
+
25
+ ### 方式一:npm 包(推荐)
26
+
27
+ 打开终端,运行:
28
+
29
+ ```bash
30
+ npx most-box@latest
31
+ ```
32
+
33
+ > 使用 `@latest` 确保每次运行最新版本。
34
+
35
+ 浏览器自动访问 **http://localhost:1976**
36
+
37
+ ### 方式二:桌面客户端
38
+
39
+ 前往 [Most.Box](https://Most.Box/download) 下载桌面客户端,支持 Windows、macOS 和 Linux。
40
+
41
+ ## 需求
42
+
43
+ - Node.js >= 18 ([下载地址](https://nodejs.org))
44
+
45
+ ## 开发
46
+
47
+ ```bash
48
+ git clone <your-repo-url>
49
+ cd most
50
+ npm i
51
+ npm start
52
+ ```
53
+
54
+ ## 测试
55
+
56
+ ```bash
57
+ npm test # 运行全部测试
58
+ npm run test:unit # 只运行单元测试
59
+ ```
60
+
61
+ ## 访问场景
62
+
63
+ | 场景 | 命令 | 访问地址 |
64
+ | ---- | ------------------------------------------ | ------------------------- |
65
+ | 本地 | `npx most-box` | `http://localhost:1976` |
66
+ | 内网 | `set MOSTBOX_HOST=0.0.0.0 && npx most-box` | `http://<IP>:1976` |
67
+ | 外网 | Caddy 反向代理 | `https://your-domain.com` |
68
+
69
+ ### 内网访问
70
+
71
+ ```bash
72
+ set MOSTBOX_HOST=0.0.0.0
73
+ npx most-box
74
+ ```
75
+
76
+ ### 外网访问(Caddy)
77
+
78
+ ```caddy
79
+ mostbox.example.com {
80
+ reverse_proxy localhost:1976
81
+ }
82
+ ```
83
+
84
+ ## 核心功能
85
+
86
+ 1. **确定性 P2P 文件发布**
87
+ - 采用标准 IPFS UnixFS Chunking 算法计算 CID v1
88
+ - 相同文件生成一致的 CID 链接
89
+
90
+ 2. **大文件流式传输**
91
+ - 支持 GB 级别超大文件的发布与下载
92
+
93
+ 3. **完整性校验**
94
+ - 下载完成后自动验证 CID,防止数据篡改
95
+
96
+ 4. **自定义 most:// 链接**
97
+ - 分享文件生成 `most://<cid>` 格式链接
98
+ - 接收方通过链接直接下载,无需其他配置
99
+
100
+ 5. **P2P 频道聊天**
101
+ - 创建或加入频道,与朋友实时聊天
102
+ - 消息通过 P2P 网络复制,服务器只是中转
103
+ - 无需中心化服务器,去中心化聊天
104
+
105
+ 6. **网络连通性测试**
106
+ - 内置 Ping 工具检测 P2P 网络状态
107
+
108
+ ## 常见问题
109
+
110
+ ### 文件存储在哪里?
111
+
112
+ 文件以 **P2P 方式** 存储在分享者和接收者的设备上。当文件被分享时,内容会被分片存储在 P2P 网络中。**没有中心化服务器**,真正实现去中心化。
113
+
114
+ ### 如何分享文件给其他人?
115
+
116
+ 1. 打开 MostBox Web 界面
117
+ 2. 上传文件或文件夹
118
+ 3. 点击「复制链接」获取 `most://<cid>` 链接
119
+ 4. 将链接发送给接收者
120
+
121
+ ### most:// 链接是什么?
122
+
123
+ `most://` 是 MostBox 自定义的协议链接,格式为 `most://<cid>`。接收方安装 MostBox 后,点击链接即可自动下载文件。
124
+
125
+ ### 支持大文件吗?
126
+
127
+ 支持。目前已测试通过 **GB 级别**的大文件传输,采用流式处理,内存占用低。
128
+
129
+ ### 频道聊天是什么?
130
+
131
+ 频道聊天是 MostBox P2P 即时通讯功能:
132
+
133
+ - 创建一个频道(如 `alice` 或 `team-project`)
134
+ - 将频道名称分享给朋友
135
+ - 朋友加入后即可实时聊天
136
+ - 消息通过 P2P 网络加密传输,服务器只负责建立连接
137
+
138
+ ### 如何使用频道聊天?
139
+
140
+ 1. 点击左侧「频道」进入聊天页面
141
+ 2. 点击「创建频道」创建新频道
142
+ 3. 将频道名称分享给朋友
143
+ 4. 朋友打开同一页面,输入频道名称加入
144
+ 5. 开始聊天!
145
+
146
+ ### 如何在其他设备上下载文件?
147
+
148
+ 确保设备已安装 Node.js >= 18,然后运行:
149
+
150
+ ```bash
151
+ npx most-box
152
+ ```
153
+
154
+ 浏览器访问 `http://localhost:1976`,输入链接即可下载。
155
+
156
+ 或者前往 [Most.Box](https://Most.Box/download) 下载桌面客户端。
157
+
158
+ ## 路线图
159
+
160
+ ### v1.0(当前版本)
161
+
162
+ - ✅ P2P 文件上传与下载
163
+ - ✅ 确定性 CID 生成
164
+ - ✅ 大文件流式传输
165
+ - ✅ most:// 链接分享
166
+ - ✅ Web UI 界面
167
+ - ✅ P2P 频道聊天
168
+ - ✅ 去中心化彩票
169
+ - ✅ 网络连通性测试
170
+ - ✅ Electron 桌面客户端
171
+
172
+ ### 长期规划
173
+
174
+ - [ ] 下载体验优化 - 检测是否可下载
175
+ - [ ] P2P 多人视频/语音通话
176
+ - 基于 WebRTC 的端到端加密通话
177
+ - 频道内一键发起通话
178
+ - 屏幕共享与文字聊天
179
+ - [ ] 浏览器扩展
180
+ - [ ] 移动端支持(iOS/Android)
181
+
182
+ ## 技术栈
183
+
184
+ - **前端**: React 19, Next.js 16, TypeScript, Zustand, Lucide React
185
+ - **后端**: Hono + @hono/node-server + WebSocket
186
+ - **P2P**: Hyperswarm 4.x, Hyperdrive 13.x, Corestore 7.x
187
+ - **Web3**: ethers.js, Hardhat, Solidity, EIP-712
188
+ - **桌面**: Electron 41, electron-builder
189
+ - **测试**: Node.js built-in test runner
190
+
191
+ ## CI/CD
192
+
193
+ 发布新版本时,推送 tag 即可自动构建:
194
+
195
+ ```bash
196
+ git tag v0.0.7
197
+ git push origin v0.0.7
198
+ ```
199
+
200
+ 触发后自动执行:
201
+ 1. **npm 包发布** — 发布 `most-box` 到 npm registry
202
+ 2. **Windows 打包** — 构建 `.exe` 安装包(x64 + arm64)
203
+ 3. **macOS 打包** — 构建 `.dmg` 安装包(x64 + arm64)
204
+ 4. **Linux 打包** — 构建 `.AppImage` 安装包(x64 + arm64)
205
+ 5. **GitHub Release** — 创建 Release 并上传所有安装包
206
+
207
+ ### 配置 Secrets
208
+
209
+ 在仓库 Settings → Secrets and variables → Actions 中添加:
210
+
211
+ | Secret | 说明 |
212
+ |--------|------|
213
+ | `NPM_TOKEN` | npm 发布令牌(`npm token create` 生成) |
214
+
215
+ ## 社区
216
+
217
+ - **GitHub Discussions**:[提出需求 & 技术讨论](../../discussions)
218
+ - **问题反馈**:[Github issues](../../issues)
219
+
220
+ ## 许可证
221
+
222
+ MIT
@@ -0,0 +1,67 @@
1
+ import { app, BrowserWindow, Menu } from 'electron'
2
+ import path from 'node:path'
3
+ import { fileURLToPath } from 'node:url'
4
+
5
+ const __dirname = path.dirname(fileURLToPath(import.meta.url))
6
+ const PORT = Number(process.env.MOSTBOX_PORT) || 1976
7
+
8
+ let mainWindow = null
9
+ let engine = null
10
+
11
+ function createWindow() {
12
+ mainWindow = new BrowserWindow({
13
+ width: 1200,
14
+ height: 800,
15
+ minWidth: 800,
16
+ minHeight: 600,
17
+ title: 'MostBox',
18
+ autoHideMenuBar: true,
19
+ webPreferences: {
20
+ nodeIntegration: false,
21
+ contextIsolation: true,
22
+ preload: path.join(__dirname, 'preload.js'),
23
+ },
24
+ })
25
+
26
+ mainWindow.loadURL(`http://localhost:${PORT}`)
27
+
28
+ mainWindow.on('closed', () => {
29
+ mainWindow = null
30
+ })
31
+ }
32
+
33
+ async function startServer() {
34
+ process.env.ELECTRON_APP = 'true'
35
+
36
+ const { main } = await import('../server/index.js')
37
+ engine = await main()
38
+ }
39
+
40
+ app.whenReady().then(async () => {
41
+ try {
42
+ await startServer()
43
+ createWindow()
44
+ Menu.setApplicationMenu(null)
45
+
46
+ app.on('activate', () => {
47
+ if (BrowserWindow.getAllWindows().length === 0) {
48
+ createWindow()
49
+ }
50
+ })
51
+ } catch (err) {
52
+ console.error('[Electron] Failed to start server:', err)
53
+ app.quit()
54
+ }
55
+ })
56
+
57
+ app.on('window-all-closed', () => {
58
+ if (process.platform !== 'darwin') {
59
+ app.quit()
60
+ }
61
+ })
62
+
63
+ app.on('before-quit', async () => {
64
+ if (engine && engine.stop) {
65
+ await engine.stop()
66
+ }
67
+ })
@@ -0,0 +1,15 @@
1
+ <!DOCTYPE html><html lang="zh-CN" data-scroll-behavior="smooth"><head><meta charSet="UTF-8"/><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="stylesheet" href="/_next/static/chunks/0_wia9ofmsi1c.css" data-precedence="next"/><link rel="preload" as="script" fetchPriority="low" href="/_next/static/chunks/0bzupvr5gt3k9.js"/><script src="/_next/static/chunks/0pqt~8bl3ukh4.js" async=""></script><script src="/_next/static/chunks/0n~dq4kpx9xxx.js" async=""></script><script src="/_next/static/chunks/0174xh3wfsjm1.js" async=""></script><script src="/_next/static/chunks/turbopack-0a_g3u0ud~jb8.js" async=""></script><script src="/_next/static/chunks/0jl~j62iz2uvr.js" async=""></script><script src="/_next/static/chunks/0d3shmwh5_nmn.js" async=""></script><script src="/_next/static/chunks/11dalasm30arx.js" async=""></script><meta name="robots" content="noindex"/><link rel="icon" href="/favicon.ico"/><meta name="theme-color" content="#5e6ad2"/><title>MostBox</title><meta name="description" content="P2P 文件分享,无需注册"/><script>
2
+ (function() {
3
+ var theme = localStorage.getItem('theme');
4
+ if (theme === 'dark' || (!theme && window.matchMedia('(prefers-color-scheme: dark)').matches)) {
5
+ document.documentElement.setAttribute('data-theme', 'dark');
6
+ }
7
+ })();
8
+ </script><script src="/_next/static/chunks/03~yq9q893hmn.js" noModule=""></script></head><body><div hidden=""><!--$--><!--/$--></div><script>
9
+ window.onerror = function(message, source, lineno, colno, error) {
10
+ console.error('[Global Error]', { message, source, lineno, colno, error });
11
+ };
12
+ window.onunhandledrejection = function(event) {
13
+ console.error('[Unhandled Promise Rejection]', event.reason);
14
+ };
15
+ </script><div class="not-found-page"><div class="not-found-card"><div class="not-found-icon"><svg xmlns="http://www.w3.org/2000/svg" width="48" height="48" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-compass" aria-hidden="true"><circle cx="12" cy="12" r="10"></circle><path d="m16.24 7.76-1.804 5.411a2 2 0 0 1-1.265 1.265L7.76 16.24l1.804-5.411a2 2 0 0 1 1.265-1.265z"></path></svg></div><h1 class="not-found-title">页面未找到</h1><p class="not-found-desc">你访问的页面似乎已经迷失在 P2P 网络中了</p><div class="not-found-actions"><button class="not-found-btn-secondary"><svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-arrow-left" aria-hidden="true"><path d="m12 19-7-7 7-7"></path><path d="M19 12H5"></path></svg>上一页</button><a class="not-found-btn-primary" href="/"><svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-house" aria-hidden="true"><path d="M15 21v-8a1 1 0 0 0-1-1h-4a1 1 0 0 0-1 1v8"></path><path d="M3 10a2 2 0 0 1 .709-1.528l7-6a2 2 0 0 1 2.582 0l7 6A2 2 0 0 1 21 10v9a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z"></path></svg>回首页</a></div></div></div><!--$--><!--/$--><script src="/_next/static/chunks/0bzupvr5gt3k9.js" id="_R_" async=""></script><script>(self.__next_f=self.__next_f||[]).push([0])</script><script>self.__next_f.push([1,"1:\"$Sreact.fragment\"\n2:I[14232,[\"/_next/static/chunks/0jl~j62iz2uvr.js\",\"/_next/static/chunks/0d3shmwh5_nmn.js\"],\"ErrorBoundary\"]\n3:I[39756,[\"/_next/static/chunks/0jl~j62iz2uvr.js\",\"/_next/static/chunks/0d3shmwh5_nmn.js\"],\"default\"]\n4:I[37457,[\"/_next/static/chunks/0jl~j62iz2uvr.js\",\"/_next/static/chunks/0d3shmwh5_nmn.js\"],\"default\"]\n5:I[36768,[\"/_next/static/chunks/0jl~j62iz2uvr.js\",\"/_next/static/chunks/0d3shmwh5_nmn.js\",\"/_next/static/chunks/11dalasm30arx.js\"],\"default\"]\n6:I[47257,[\"/_next/static/chunks/0jl~j62iz2uvr.js\",\"/_next/static/chunks/0d3shmwh5_nmn.js\"],\"ClientPageRoot\"]\n9:I[97367,[\"/_next/static/chunks/0jl~j62iz2uvr.js\",\"/_next/static/chunks/0d3shmwh5_nmn.js\"],\"OutletBoundary\"]\na:\"$Sreact.suspense\"\nd:I[97367,[\"/_next/static/chunks/0jl~j62iz2uvr.js\",\"/_next/static/chunks/0d3shmwh5_nmn.js\"],\"ViewportBoundary\"]\nf:I[97367,[\"/_next/static/chunks/0jl~j62iz2uvr.js\",\"/_next/static/chunks/0d3shmwh5_nmn.js\"],\"MetadataBoundary\"]\n11:I[68027,[\"/_next/static/chunks/0jl~j62iz2uvr.js\",\"/_next/static/chunks/0d3shmwh5_nmn.js\"],\"default\",1]\n:HL[\"/_next/static/chunks/0_wia9ofmsi1c.css\",\"style\"]\n"])</script><script>self.__next_f.push([1,"0:{\"P\":null,\"c\":[\"\",\"_not-found\",\"\"],\"q\":\"\",\"i\":false,\"f\":[[[\"\",{\"children\":[\"/_not-found\",{\"children\":[\"__PAGE__\",{}]}]},\"$undefined\",\"$undefined\",16],[[\"$\",\"$1\",\"c\",{\"children\":[[[\"$\",\"link\",\"0\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/chunks/0_wia9ofmsi1c.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}],[\"$\",\"script\",\"script-0\",{\"src\":\"/_next/static/chunks/0jl~j62iz2uvr.js\",\"async\":true,\"nonce\":\"$undefined\"}],[\"$\",\"script\",\"script-1\",{\"src\":\"/_next/static/chunks/0d3shmwh5_nmn.js\",\"async\":true,\"nonce\":\"$undefined\"}]],[\"$\",\"html\",null,{\"lang\":\"zh-CN\",\"suppressHydrationWarning\":true,\"data-scroll-behavior\":\"smooth\",\"children\":[[\"$\",\"head\",null,{\"children\":[[\"$\",\"meta\",null,{\"charSet\":\"UTF-8\"}],[\"$\",\"meta\",null,{\"name\":\"viewport\",\"content\":\"width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no\"}],[\"$\",\"link\",null,{\"rel\":\"icon\",\"href\":\"/favicon.ico\"}],[\"$\",\"meta\",null,{\"name\":\"theme-color\",\"content\":\"#5e6ad2\"}],[\"$\",\"script\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"\\n (function() {\\n var theme = localStorage.getItem('theme');\\n if (theme === 'dark' || (!theme \u0026\u0026 window.matchMedia('(prefers-color-scheme: dark)').matches)) {\\n document.documentElement.setAttribute('data-theme', 'dark');\\n }\\n })();\\n \"}}]]}],[\"$\",\"body\",null,{\"children\":[\"$\",\"$L2\",null,{\"children\":[[\"$\",\"script\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"\\n window.onerror = function(message, source, lineno, colno, error) {\\n console.error('[Global Error]', { message, source, lineno, colno, error });\\n };\\n window.onunhandledrejection = function(event) {\\n console.error('[Unhandled Promise Rejection]', event.reason);\\n };\\n \"}}],[\"$\",\"$L3\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L4\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":[[\"$\",\"$L5\",null,{}],[]],\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]]}]}]]}]]}],{\"children\":[[\"$\",\"$1\",\"c\",{\"children\":[null,[\"$\",\"$L3\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L4\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]]}],{\"children\":[[\"$\",\"$1\",\"c\",{\"children\":[[\"$\",\"$L6\",null,{\"Component\":\"$5\",\"serverProvidedParams\":{\"searchParams\":{},\"params\":{},\"promises\":[\"$@7\",\"$@8\"]}}],[[\"$\",\"script\",\"script-0\",{\"src\":\"/_next/static/chunks/11dalasm30arx.js\",\"async\":true,\"nonce\":\"$undefined\"}]],[\"$\",\"$L9\",null,{\"children\":[\"$\",\"$a\",null,{\"name\":\"Next.MetadataOutlet\",\"children\":\"$@b\"}]}]]}],{},null,false,null]},null,false,\"$@c\"]},null,false,null],[\"$\",\"$1\",\"h\",{\"children\":[[\"$\",\"meta\",null,{\"name\":\"robots\",\"content\":\"noindex\"}],[\"$\",\"$Ld\",null,{\"children\":\"$Le\"}],[\"$\",\"div\",null,{\"hidden\":true,\"children\":[\"$\",\"$Lf\",null,{\"children\":[\"$\",\"$a\",null,{\"name\":\"Next.Metadata\",\"children\":\"$L10\"}]}]}],null]}],false]],\"m\":\"$undefined\",\"G\":[\"$11\",[[\"$\",\"link\",\"0\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/chunks/0_wia9ofmsi1c.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}]]],\"S\":true,\"h\":null,\"s\":\"$undefined\",\"l\":\"$undefined\",\"p\":\"$undefined\",\"d\":\"$undefined\",\"b\":\"alUUgRz4oMlw4EtULOYfV\"}\n"])</script><script>self.__next_f.push([1,"12:[]\nc:\"$W12\"\n7:{}\n8:\"$0:f:0:1:1:children:1:children:0:props:children:0:props:serverProvidedParams:params\"\n"])</script><script>self.__next_f.push([1,"e:[[\"$\",\"meta\",\"0\",{\"charSet\":\"utf-8\"}],[\"$\",\"meta\",\"1\",{\"name\":\"viewport\",\"content\":\"width=device-width, initial-scale=1\"}]]\n"])</script><script>self.__next_f.push([1,"b:null\n10:[[\"$\",\"title\",\"0\",{\"children\":\"MostBox\"}],[\"$\",\"meta\",\"1\",{\"name\":\"description\",\"content\":\"P2P 文件分享,无需注册\"}]]\n"])</script></body></html>
package/out/404.html ADDED
@@ -0,0 +1,15 @@
1
+ <!DOCTYPE html><html lang="zh-CN" data-scroll-behavior="smooth"><head><meta charSet="UTF-8"/><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="stylesheet" href="/_next/static/chunks/0_wia9ofmsi1c.css" data-precedence="next"/><link rel="preload" as="script" fetchPriority="low" href="/_next/static/chunks/0bzupvr5gt3k9.js"/><script src="/_next/static/chunks/0pqt~8bl3ukh4.js" async=""></script><script src="/_next/static/chunks/0n~dq4kpx9xxx.js" async=""></script><script src="/_next/static/chunks/0174xh3wfsjm1.js" async=""></script><script src="/_next/static/chunks/turbopack-0a_g3u0ud~jb8.js" async=""></script><script src="/_next/static/chunks/0jl~j62iz2uvr.js" async=""></script><script src="/_next/static/chunks/0d3shmwh5_nmn.js" async=""></script><script src="/_next/static/chunks/11dalasm30arx.js" async=""></script><meta name="robots" content="noindex"/><link rel="icon" href="/favicon.ico"/><meta name="theme-color" content="#5e6ad2"/><title>MostBox</title><meta name="description" content="P2P 文件分享,无需注册"/><script>
2
+ (function() {
3
+ var theme = localStorage.getItem('theme');
4
+ if (theme === 'dark' || (!theme && window.matchMedia('(prefers-color-scheme: dark)').matches)) {
5
+ document.documentElement.setAttribute('data-theme', 'dark');
6
+ }
7
+ })();
8
+ </script><script src="/_next/static/chunks/03~yq9q893hmn.js" noModule=""></script></head><body><div hidden=""><!--$--><!--/$--></div><script>
9
+ window.onerror = function(message, source, lineno, colno, error) {
10
+ console.error('[Global Error]', { message, source, lineno, colno, error });
11
+ };
12
+ window.onunhandledrejection = function(event) {
13
+ console.error('[Unhandled Promise Rejection]', event.reason);
14
+ };
15
+ </script><div class="not-found-page"><div class="not-found-card"><div class="not-found-icon"><svg xmlns="http://www.w3.org/2000/svg" width="48" height="48" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-compass" aria-hidden="true"><circle cx="12" cy="12" r="10"></circle><path d="m16.24 7.76-1.804 5.411a2 2 0 0 1-1.265 1.265L7.76 16.24l1.804-5.411a2 2 0 0 1 1.265-1.265z"></path></svg></div><h1 class="not-found-title">页面未找到</h1><p class="not-found-desc">你访问的页面似乎已经迷失在 P2P 网络中了</p><div class="not-found-actions"><button class="not-found-btn-secondary"><svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-arrow-left" aria-hidden="true"><path d="m12 19-7-7 7-7"></path><path d="M19 12H5"></path></svg>上一页</button><a class="not-found-btn-primary" href="/"><svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-house" aria-hidden="true"><path d="M15 21v-8a1 1 0 0 0-1-1h-4a1 1 0 0 0-1 1v8"></path><path d="M3 10a2 2 0 0 1 .709-1.528l7-6a2 2 0 0 1 2.582 0l7 6A2 2 0 0 1 21 10v9a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z"></path></svg>回首页</a></div></div></div><!--$--><!--/$--><script src="/_next/static/chunks/0bzupvr5gt3k9.js" id="_R_" async=""></script><script>(self.__next_f=self.__next_f||[]).push([0])</script><script>self.__next_f.push([1,"1:\"$Sreact.fragment\"\n2:I[14232,[\"/_next/static/chunks/0jl~j62iz2uvr.js\",\"/_next/static/chunks/0d3shmwh5_nmn.js\"],\"ErrorBoundary\"]\n3:I[39756,[\"/_next/static/chunks/0jl~j62iz2uvr.js\",\"/_next/static/chunks/0d3shmwh5_nmn.js\"],\"default\"]\n4:I[37457,[\"/_next/static/chunks/0jl~j62iz2uvr.js\",\"/_next/static/chunks/0d3shmwh5_nmn.js\"],\"default\"]\n5:I[36768,[\"/_next/static/chunks/0jl~j62iz2uvr.js\",\"/_next/static/chunks/0d3shmwh5_nmn.js\",\"/_next/static/chunks/11dalasm30arx.js\"],\"default\"]\n6:I[47257,[\"/_next/static/chunks/0jl~j62iz2uvr.js\",\"/_next/static/chunks/0d3shmwh5_nmn.js\"],\"ClientPageRoot\"]\n9:I[97367,[\"/_next/static/chunks/0jl~j62iz2uvr.js\",\"/_next/static/chunks/0d3shmwh5_nmn.js\"],\"OutletBoundary\"]\na:\"$Sreact.suspense\"\nd:I[97367,[\"/_next/static/chunks/0jl~j62iz2uvr.js\",\"/_next/static/chunks/0d3shmwh5_nmn.js\"],\"ViewportBoundary\"]\nf:I[97367,[\"/_next/static/chunks/0jl~j62iz2uvr.js\",\"/_next/static/chunks/0d3shmwh5_nmn.js\"],\"MetadataBoundary\"]\n11:I[68027,[\"/_next/static/chunks/0jl~j62iz2uvr.js\",\"/_next/static/chunks/0d3shmwh5_nmn.js\"],\"default\",1]\n:HL[\"/_next/static/chunks/0_wia9ofmsi1c.css\",\"style\"]\n"])</script><script>self.__next_f.push([1,"0:{\"P\":null,\"c\":[\"\",\"_not-found\",\"\"],\"q\":\"\",\"i\":false,\"f\":[[[\"\",{\"children\":[\"/_not-found\",{\"children\":[\"__PAGE__\",{}]}]},\"$undefined\",\"$undefined\",16],[[\"$\",\"$1\",\"c\",{\"children\":[[[\"$\",\"link\",\"0\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/chunks/0_wia9ofmsi1c.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}],[\"$\",\"script\",\"script-0\",{\"src\":\"/_next/static/chunks/0jl~j62iz2uvr.js\",\"async\":true,\"nonce\":\"$undefined\"}],[\"$\",\"script\",\"script-1\",{\"src\":\"/_next/static/chunks/0d3shmwh5_nmn.js\",\"async\":true,\"nonce\":\"$undefined\"}]],[\"$\",\"html\",null,{\"lang\":\"zh-CN\",\"suppressHydrationWarning\":true,\"data-scroll-behavior\":\"smooth\",\"children\":[[\"$\",\"head\",null,{\"children\":[[\"$\",\"meta\",null,{\"charSet\":\"UTF-8\"}],[\"$\",\"meta\",null,{\"name\":\"viewport\",\"content\":\"width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no\"}],[\"$\",\"link\",null,{\"rel\":\"icon\",\"href\":\"/favicon.ico\"}],[\"$\",\"meta\",null,{\"name\":\"theme-color\",\"content\":\"#5e6ad2\"}],[\"$\",\"script\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"\\n (function() {\\n var theme = localStorage.getItem('theme');\\n if (theme === 'dark' || (!theme \u0026\u0026 window.matchMedia('(prefers-color-scheme: dark)').matches)) {\\n document.documentElement.setAttribute('data-theme', 'dark');\\n }\\n })();\\n \"}}]]}],[\"$\",\"body\",null,{\"children\":[\"$\",\"$L2\",null,{\"children\":[[\"$\",\"script\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"\\n window.onerror = function(message, source, lineno, colno, error) {\\n console.error('[Global Error]', { message, source, lineno, colno, error });\\n };\\n window.onunhandledrejection = function(event) {\\n console.error('[Unhandled Promise Rejection]', event.reason);\\n };\\n \"}}],[\"$\",\"$L3\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L4\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":[[\"$\",\"$L5\",null,{}],[]],\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]]}]}]]}]]}],{\"children\":[[\"$\",\"$1\",\"c\",{\"children\":[null,[\"$\",\"$L3\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L4\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]]}],{\"children\":[[\"$\",\"$1\",\"c\",{\"children\":[[\"$\",\"$L6\",null,{\"Component\":\"$5\",\"serverProvidedParams\":{\"searchParams\":{},\"params\":{},\"promises\":[\"$@7\",\"$@8\"]}}],[[\"$\",\"script\",\"script-0\",{\"src\":\"/_next/static/chunks/11dalasm30arx.js\",\"async\":true,\"nonce\":\"$undefined\"}]],[\"$\",\"$L9\",null,{\"children\":[\"$\",\"$a\",null,{\"name\":\"Next.MetadataOutlet\",\"children\":\"$@b\"}]}]]}],{},null,false,null]},null,false,\"$@c\"]},null,false,null],[\"$\",\"$1\",\"h\",{\"children\":[[\"$\",\"meta\",null,{\"name\":\"robots\",\"content\":\"noindex\"}],[\"$\",\"$Ld\",null,{\"children\":\"$Le\"}],[\"$\",\"div\",null,{\"hidden\":true,\"children\":[\"$\",\"$Lf\",null,{\"children\":[\"$\",\"$a\",null,{\"name\":\"Next.Metadata\",\"children\":\"$L10\"}]}]}],null]}],false]],\"m\":\"$undefined\",\"G\":[\"$11\",[[\"$\",\"link\",\"0\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/chunks/0_wia9ofmsi1c.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}]]],\"S\":true,\"h\":null,\"s\":\"$undefined\",\"l\":\"$undefined\",\"p\":\"$undefined\",\"d\":\"$undefined\",\"b\":\"alUUgRz4oMlw4EtULOYfV\"}\n"])</script><script>self.__next_f.push([1,"12:[]\nc:\"$W12\"\n7:{}\n8:\"$0:f:0:1:1:children:1:children:0:props:children:0:props:serverProvidedParams:params\"\n"])</script><script>self.__next_f.push([1,"e:[[\"$\",\"meta\",\"0\",{\"charSet\":\"utf-8\"}],[\"$\",\"meta\",\"1\",{\"name\":\"viewport\",\"content\":\"width=device-width, initial-scale=1\"}]]\n"])</script><script>self.__next_f.push([1,"b:null\n10:[[\"$\",\"title\",\"0\",{\"children\":\"MostBox\"}],[\"$\",\"meta\",\"1\",{\"name\":\"description\",\"content\":\"P2P 文件分享,无需注册\"}]]\n"])</script></body></html>
@@ -0,0 +1,11 @@
1
+ 1:"$Sreact.fragment"
2
+ 2:I[47257,["/_next/static/chunks/0jl~j62iz2uvr.js","/_next/static/chunks/0d3shmwh5_nmn.js"],"ClientPageRoot"]
3
+ 3:I[31713,["/_next/static/chunks/0jl~j62iz2uvr.js","/_next/static/chunks/0d3shmwh5_nmn.js","/_next/static/chunks/02ou_44kkb5dz.js"],"default"]
4
+ 6:I[97367,["/_next/static/chunks/0jl~j62iz2uvr.js","/_next/static/chunks/0d3shmwh5_nmn.js"],"OutletBoundary"]
5
+ 7:"$Sreact.suspense"
6
+ :HL["/_next/static/chunks/0_-ccbcyh_o30.css","style"]
7
+ :HL["/_next/static/chunks/0imvn_arv36xt.css","style"]
8
+ 0:{"rsc":["$","$1","c",{"children":[["$","$L2",null,{"Component":"$3","serverProvidedParams":{"searchParams":{},"params":{},"promises":["$@4","$@5"]}}],[["$","link","0",{"rel":"stylesheet","href":"/_next/static/chunks/0_-ccbcyh_o30.css","precedence":"next"}],["$","link","1",{"rel":"stylesheet","href":"/_next/static/chunks/0imvn_arv36xt.css","precedence":"next"}],["$","script","script-0",{"src":"/_next/static/chunks/02ou_44kkb5dz.js","async":true}]],["$","$L6",null,{"children":["$","$7",null,{"name":"Next.MetadataOutlet","children":"$@8"}]}]]}],"isPartial":false,"staleTime":300,"varyParams":null,"buildId":"alUUgRz4oMlw4EtULOYfV"}
9
+ 4:{}
10
+ 5:"$0:rsc:props:children:0:props:serverProvidedParams:params"
11
+ 8:null
@@ -0,0 +1,21 @@
1
+ 1:"$Sreact.fragment"
2
+ 2:I[14232,["/_next/static/chunks/0jl~j62iz2uvr.js","/_next/static/chunks/0d3shmwh5_nmn.js"],"ErrorBoundary"]
3
+ 3:I[39756,["/_next/static/chunks/0jl~j62iz2uvr.js","/_next/static/chunks/0d3shmwh5_nmn.js"],"default"]
4
+ 4:I[37457,["/_next/static/chunks/0jl~j62iz2uvr.js","/_next/static/chunks/0d3shmwh5_nmn.js"],"default"]
5
+ 5:I[36768,["/_next/static/chunks/0jl~j62iz2uvr.js","/_next/static/chunks/0d3shmwh5_nmn.js","/_next/static/chunks/11dalasm30arx.js"],"default"]
6
+ 6:I[47257,["/_next/static/chunks/0jl~j62iz2uvr.js","/_next/static/chunks/0d3shmwh5_nmn.js"],"ClientPageRoot"]
7
+ 7:I[31713,["/_next/static/chunks/0jl~j62iz2uvr.js","/_next/static/chunks/0d3shmwh5_nmn.js","/_next/static/chunks/02ou_44kkb5dz.js"],"default"]
8
+ a:I[97367,["/_next/static/chunks/0jl~j62iz2uvr.js","/_next/static/chunks/0d3shmwh5_nmn.js"],"OutletBoundary"]
9
+ b:"$Sreact.suspense"
10
+ d:I[97367,["/_next/static/chunks/0jl~j62iz2uvr.js","/_next/static/chunks/0d3shmwh5_nmn.js"],"ViewportBoundary"]
11
+ f:I[97367,["/_next/static/chunks/0jl~j62iz2uvr.js","/_next/static/chunks/0d3shmwh5_nmn.js"],"MetadataBoundary"]
12
+ 11:I[68027,["/_next/static/chunks/0jl~j62iz2uvr.js","/_next/static/chunks/0d3shmwh5_nmn.js"],"default",1]
13
+ :HL["/_next/static/chunks/0_wia9ofmsi1c.css","style"]
14
+ :HL["/_next/static/chunks/0_-ccbcyh_o30.css","style"]
15
+ :HL["/_next/static/chunks/0imvn_arv36xt.css","style"]
16
+ 0:{"P":null,"c":["",""],"q":"","i":false,"f":[[["",{"children":["__PAGE__",{}]},"$undefined","$undefined",16],[["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"/_next/static/chunks/0_wia9ofmsi1c.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}],["$","script","script-0",{"src":"/_next/static/chunks/0jl~j62iz2uvr.js","async":true,"nonce":"$undefined"}],["$","script","script-1",{"src":"/_next/static/chunks/0d3shmwh5_nmn.js","async":true,"nonce":"$undefined"}]],["$","html",null,{"lang":"zh-CN","suppressHydrationWarning":true,"data-scroll-behavior":"smooth","children":[["$","head",null,{"children":[["$","meta",null,{"charSet":"UTF-8"}],["$","meta",null,{"name":"viewport","content":"width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no"}],["$","link",null,{"rel":"icon","href":"/favicon.ico"}],["$","meta",null,{"name":"theme-color","content":"#5e6ad2"}],["$","script",null,{"dangerouslySetInnerHTML":{"__html":"\n (function() {\n var theme = localStorage.getItem('theme');\n if (theme === 'dark' || (!theme && window.matchMedia('(prefers-color-scheme: dark)').matches)) {\n document.documentElement.setAttribute('data-theme', 'dark');\n }\n })();\n "}}]]}],["$","body",null,{"children":["$","$L2",null,{"children":[["$","script",null,{"dangerouslySetInnerHTML":{"__html":"\n window.onerror = function(message, source, lineno, colno, error) {\n console.error('[Global Error]', { message, source, lineno, colno, error });\n };\n window.onunhandledrejection = function(event) {\n console.error('[Unhandled Promise Rejection]', event.reason);\n };\n "}}],["$","$L3",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L4",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":[["$","$L5",null,{}],[]],"forbidden":"$undefined","unauthorized":"$undefined"}]]}]}]]}]]}],{"children":[["$","$1","c",{"children":[["$","$L6",null,{"Component":"$7","serverProvidedParams":{"searchParams":{},"params":{},"promises":["$@8","$@9"]}}],[["$","link","0",{"rel":"stylesheet","href":"/_next/static/chunks/0_-ccbcyh_o30.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}],["$","link","1",{"rel":"stylesheet","href":"/_next/static/chunks/0imvn_arv36xt.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}],["$","script","script-0",{"src":"/_next/static/chunks/02ou_44kkb5dz.js","async":true,"nonce":"$undefined"}]],["$","$La",null,{"children":["$","$b",null,{"name":"Next.MetadataOutlet","children":"$@c"}]}]]}],{},null,false,null]},null,false,null],["$","$1","h",{"children":[null,["$","$Ld",null,{"children":"$Le"}],["$","div",null,{"hidden":true,"children":["$","$Lf",null,{"children":["$","$b",null,{"name":"Next.Metadata","children":"$L10"}]}]}],null]}],false]],"m":"$undefined","G":["$11",[["$","link","0",{"rel":"stylesheet","href":"/_next/static/chunks/0_wia9ofmsi1c.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}]]],"S":true,"h":null,"s":"$undefined","l":"$undefined","p":"$undefined","d":"$undefined","b":"alUUgRz4oMlw4EtULOYfV"}
17
+ 8:{}
18
+ 9:"$0:f:0:1:1:children:0:props:children:0:props:serverProvidedParams:params"
19
+ e:[["$","meta","0",{"charSet":"utf-8"}],["$","meta","1",{"name":"viewport","content":"width=device-width, initial-scale=1"}]]
20
+ c:null
21
+ 10:[["$","title","0",{"children":"MostBox"}],["$","meta","1",{"name":"description","content":"P2P 文件分享,无需注册"}]]
@@ -0,0 +1,5 @@
1
+ 1:"$Sreact.fragment"
2
+ 2:I[97367,["/_next/static/chunks/0jl~j62iz2uvr.js","/_next/static/chunks/0d3shmwh5_nmn.js"],"ViewportBoundary"]
3
+ 3:I[97367,["/_next/static/chunks/0jl~j62iz2uvr.js","/_next/static/chunks/0d3shmwh5_nmn.js"],"MetadataBoundary"]
4
+ 4:"$Sreact.suspense"
5
+ 0:{"rsc":["$","$1","h",{"children":[null,["$","$L2",null,{"children":[["$","meta","0",{"charSet":"utf-8"}],["$","meta","1",{"name":"viewport","content":"width=device-width, initial-scale=1"}]]}],["$","div",null,{"hidden":true,"children":["$","$L3",null,{"children":["$","$4",null,{"name":"Next.Metadata","children":[["$","title","0",{"children":"MostBox"}],["$","meta","1",{"name":"description","content":"P2P 文件分享,无需注册"}]]}]}]}],null]}],"isPartial":false,"staleTime":300,"varyParams":null,"buildId":"alUUgRz4oMlw4EtULOYfV"}