most-box 0.0.4 → 0.0.7

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 (187) hide show
  1. package/LICENSE +21 -21
  2. package/README.md +222 -182
  3. package/electron/main.js +67 -0
  4. package/out/404/index.html +2 -2
  5. package/out/404.html +2 -2
  6. package/out/__next.__PAGE__.txt +6 -4
  7. package/out/__next._full.txt +20 -17
  8. package/out/__next._head.txt +3 -3
  9. package/out/__next._index.txt +6 -5
  10. package/out/__next._tree.txt +4 -2
  11. package/out/_next/static/chunks/003jnm.v5tzw5.js +1 -0
  12. package/out/_next/static/chunks/00re8v.gbcywn.js +1 -0
  13. package/out/_next/static/chunks/00s106sbq8t9v.js +1 -0
  14. package/out/_next/static/chunks/012hi627qrdnn.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/02~o2nmo5pmy1.js +1 -0
  18. package/out/_next/static/chunks/07t.dhhokszz5.css +1 -0
  19. package/out/_next/static/chunks/0_wia9ofmsi1c.css +2 -0
  20. package/out/_next/static/chunks/0ah8fihozo2_u.js +5 -0
  21. package/out/_next/static/chunks/0bzupvr5gt3k9.js +31 -0
  22. package/out/_next/static/chunks/0d3shmwh5_nmn.js +1 -0
  23. package/out/_next/static/chunks/0e_h0d3ekzks8.css +1 -0
  24. package/out/_next/static/chunks/0gdluj423gso1.js +1 -0
  25. package/out/_next/static/chunks/0gmoiq06srjay.css +1 -0
  26. package/out/_next/static/chunks/0ho~log~~-jwp.css +1 -0
  27. package/out/_next/static/chunks/0imkasy7kb67u.js +1 -0
  28. package/out/_next/static/chunks/0jjc_b9q_ldi2.js +1 -0
  29. package/out/_next/static/chunks/0jl~j62iz2uvr.js +1 -0
  30. package/out/_next/static/chunks/0lqslm813wk_h.js +1 -0
  31. package/out/_next/static/chunks/{0bogtdbh.dcu1.js → 0n~dq4kpx9xxx.js} +1 -1
  32. package/out/_next/static/chunks/0pqt~8bl3ukh4.js +4 -0
  33. package/out/_next/static/chunks/0q782fxxd0lx~.js +1 -0
  34. package/out/_next/static/chunks/0qub_r0x_r-e9.css +1 -0
  35. package/out/_next/static/chunks/0slwj0c46k5cu.js +1 -0
  36. package/out/_next/static/chunks/0sorqk.oc6b7j.css +1 -0
  37. package/out/_next/static/chunks/0tapzqc6hgvx-.js +1 -0
  38. package/out/_next/static/chunks/0xsc7z5x8n7wg.js +1 -0
  39. package/out/_next/static/chunks/0zm~gys2jwl0g.js +1 -0
  40. package/out/_next/static/chunks/turbopack-0a_g3u0ud~jb8.js +1 -0
  41. package/out/_not-found/__next._full.txt +19 -15
  42. package/out/_not-found/__next._head.txt +3 -3
  43. package/out/_not-found/__next._index.txt +6 -5
  44. package/out/_not-found/__next._not-found.__PAGE__.txt +9 -0
  45. package/out/_not-found/__next._not-found.txt +3 -3
  46. package/out/_not-found/__next._tree.txt +2 -2
  47. package/out/_not-found/index.html +2 -2
  48. package/out/_not-found/index.txt +19 -15
  49. package/out/app/__next._full.txt +20 -0
  50. package/out/app/__next._head.txt +5 -0
  51. package/out/app/__next._index.txt +7 -0
  52. package/out/app/__next._tree.txt +2 -0
  53. package/out/app/__next.app.__PAGE__.txt +9 -0
  54. package/out/app/__next.app.txt +5 -0
  55. package/out/app/index.html +15 -0
  56. package/out/app/index.txt +20 -0
  57. package/out/changelog/__next._full.txt +22 -0
  58. package/out/changelog/__next._head.txt +5 -0
  59. package/out/changelog/__next._index.txt +7 -0
  60. package/out/changelog/__next._tree.txt +3 -0
  61. package/out/changelog/__next.changelog.__PAGE__.txt +10 -0
  62. package/out/changelog/__next.changelog.txt +5 -0
  63. package/out/changelog/index.html +15 -0
  64. package/out/changelog/index.txt +22 -0
  65. package/out/chat/__next._full.txt +20 -18
  66. package/out/chat/__next._head.txt +3 -3
  67. package/out/chat/__next._index.txt +6 -5
  68. package/out/chat/__next._tree.txt +3 -3
  69. package/out/chat/__next.chat.__PAGE__.txt +9 -0
  70. package/out/chat/__next.chat.txt +5 -4
  71. package/out/chat/index.html +2 -2
  72. package/out/chat/index.txt +20 -18
  73. package/out/docs/__next._full.txt +22 -0
  74. package/out/docs/__next._head.txt +5 -0
  75. package/out/docs/__next._index.txt +7 -0
  76. package/out/docs/__next._tree.txt +3 -0
  77. package/out/docs/__next.docs.__PAGE__.txt +10 -0
  78. package/out/docs/__next.docs.txt +5 -0
  79. package/out/docs/getting-started/__next._full.txt +22 -0
  80. package/out/docs/getting-started/__next._head.txt +5 -0
  81. package/out/docs/getting-started/__next._index.txt +7 -0
  82. package/out/docs/getting-started/__next._tree.txt +3 -0
  83. package/out/docs/getting-started/__next.docs.getting-started.__PAGE__.txt +10 -0
  84. package/out/docs/getting-started/__next.docs.getting-started.txt +5 -0
  85. package/out/docs/getting-started/__next.docs.txt +5 -0
  86. package/out/docs/getting-started/index.html +15 -0
  87. package/out/docs/getting-started/index.txt +22 -0
  88. package/out/docs/index.html +15 -0
  89. package/out/docs/index.txt +22 -0
  90. package/out/download/__next._full.txt +34 -0
  91. package/out/download/__next._head.txt +5 -0
  92. package/out/download/__next._index.txt +7 -0
  93. package/out/download/__next._tree.txt +4 -0
  94. package/out/download/__next.download.__PAGE__.txt +16 -0
  95. package/out/download/__next.download.txt +5 -0
  96. package/out/download/index.html +15 -0
  97. package/out/download/index.txt +34 -0
  98. package/out/fonts/jetbrains-mono-latin-400-normal.woff2 +0 -0
  99. package/out/fonts/jetbrains-mono-latin-500-normal.woff2 +0 -0
  100. package/out/fonts/jetbrains-mono-latin-600-normal.woff2 +0 -0
  101. package/out/fonts/jetbrains-mono-latin-700-normal.woff2 +0 -0
  102. package/out/index.html +2 -2
  103. package/out/index.txt +20 -17
  104. package/out/ping/__next._full.txt +21 -0
  105. package/out/ping/__next._head.txt +5 -0
  106. package/out/ping/__next._index.txt +7 -0
  107. package/out/ping/__next._tree.txt +4 -0
  108. package/out/ping/__next.ping.__PAGE__.txt +10 -0
  109. package/out/ping/__next.ping.txt +5 -0
  110. package/out/ping/index.html +15 -0
  111. package/out/ping/index.txt +21 -0
  112. package/out/pwa-512x512.png +0 -0
  113. package/out/web3/__next._full.txt +21 -0
  114. package/out/web3/__next._head.txt +5 -0
  115. package/out/web3/__next._index.txt +7 -0
  116. package/out/web3/__next._tree.txt +3 -0
  117. package/out/web3/__next.web3.__PAGE__.txt +9 -0
  118. package/out/web3/__next.web3.txt +6 -0
  119. package/out/web3/ed25519/__next._full.txt +20 -0
  120. package/out/web3/ed25519/__next._head.txt +5 -0
  121. package/out/web3/ed25519/__next._index.txt +7 -0
  122. package/out/web3/ed25519/__next._tree.txt +3 -0
  123. package/out/web3/ed25519/__next.web3.ed25519.__PAGE__.txt +6 -0
  124. package/out/web3/ed25519/__next.web3.ed25519.txt +5 -0
  125. package/out/web3/ed25519/__next.web3.txt +6 -0
  126. package/out/web3/ed25519/index.html +1 -0
  127. package/out/web3/ed25519/index.txt +20 -0
  128. package/out/web3/index.html +15 -0
  129. package/out/web3/index.txt +21 -0
  130. package/out/web3/tools/__next._full.txt +20 -0
  131. package/out/web3/tools/__next._head.txt +5 -0
  132. package/out/web3/tools/__next._index.txt +7 -0
  133. package/out/web3/tools/__next._tree.txt +3 -0
  134. package/out/web3/tools/__next.web3.tools.__PAGE__.txt +6 -0
  135. package/out/web3/tools/__next.web3.tools.txt +5 -0
  136. package/out/web3/tools/__next.web3.txt +6 -0
  137. package/out/web3/tools/index.html +1 -0
  138. package/out/web3/tools/index.txt +20 -0
  139. package/package.json +162 -53
  140. package/public/fonts/jetbrains-mono-latin-400-normal.woff2 +0 -0
  141. package/public/fonts/jetbrains-mono-latin-500-normal.woff2 +0 -0
  142. package/public/fonts/jetbrains-mono-latin-600-normal.woff2 +0 -0
  143. package/public/fonts/jetbrains-mono-latin-700-normal.woff2 +0 -0
  144. package/public/pwa-512x512.png +0 -0
  145. package/server/cli.js +3 -0
  146. package/server/index.js +995 -0
  147. package/{src → server/src}/config.js +51 -50
  148. package/{src → server/src}/core/cid.js +157 -150
  149. package/{src → server/src}/index.js +1952 -1669
  150. package/server/src/utils/api.js +68 -0
  151. package/server/src/utils/avatar.js +11 -0
  152. package/{src → server/src}/utils/errors.js +70 -66
  153. package/server/src/utils/mostWallet.js +42 -0
  154. package/server/src/utils/mp.js +105 -0
  155. package/{src → server/src}/utils/security.js +173 -169
  156. package/server/src/utils/userIdentity.js +93 -0
  157. package/cli.js +0 -2
  158. package/out/_next/static/chunks/00l-yd3t8dvwz.js +0 -5
  159. package/out/_next/static/chunks/03k8t3tgym~8~.js +0 -1
  160. package/out/_next/static/chunks/09vfh8lfuacc0.css +0 -1
  161. package/out/_next/static/chunks/0dbhjjzl8qfwv.js +0 -1
  162. package/out/_next/static/chunks/0f73psqhr8dre.css +0 -1
  163. package/out/_next/static/chunks/0fbi7z4_.4j1j.js +0 -1
  164. package/out/_next/static/chunks/0ht900cau6_ur.js +0 -31
  165. package/out/_next/static/chunks/0ohm.ia-4ec60.js +0 -1
  166. package/out/_next/static/chunks/0u5ydb-f0.vxl.js +0 -1
  167. package/out/_next/static/chunks/14t2m1on-s5v~.js +0 -1
  168. package/out/_next/static/chunks/turbopack-076ce9exut_h3.js +0 -1
  169. package/out/_not-found/__next._not-found/__PAGE__.txt +0 -5
  170. package/out/app.css +0 -1535
  171. package/out/bundle.js +0 -107
  172. package/out/bundle.js.map +0 -7
  173. package/out/chat/__next.chat/__PAGE__.txt +0 -9
  174. package/out/chat-page.js +0 -112
  175. package/out/chat.css +0 -378
  176. package/out/index.js +0 -148
  177. package/public/app.css +0 -1535
  178. package/public/bundle.js +0 -107
  179. package/public/bundle.js.map +0 -7
  180. package/public/chat-page.js +0 -112
  181. package/public/chat.css +0 -378
  182. package/public/index.js +0 -148
  183. package/server.js +0 -880
  184. package/src/utils/api.js +0 -6
  185. /package/out/_next/static/{0h4f4QFk_KC9FlSRfQACk → sV38nXrv3xVVO6wvSdFlZ}/_buildManifest.js +0 -0
  186. /package/out/_next/static/{0h4f4QFk_KC9FlSRfQACk → sV38nXrv3xVVO6wvSdFlZ}/_clientMiddlewareManifest.js +0 -0
  187. /package/out/_next/static/{0h4f4QFk_KC9FlSRfQACk → sV38nXrv3xVVO6wvSdFlZ}/_ssgManifest.js +0 -0
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,182 +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
- 5. **P2P 频道聊天**
93
- - 创建或加入频道,与朋友实时聊天
94
- - 消息通过 P2P 网络复制,服务器只是中转
95
- - 无需中心化服务器,去中心化聊天
96
-
97
- ## 常见问题
98
-
99
- ### 文件存储在哪里?
100
-
101
- 文件以 **P2P 方式** 存储在分享者和接收者的设备上。当文件被分享时,内容会被分片存储在 P2P 网络中。**没有中心化服务器**,真正实现去中心化。
102
-
103
- ### 如何分享文件给其他人?
104
-
105
- 1. 打开 MostBox Web 界面
106
- 2. 上传文件或文件夹
107
- 3. 点击「复制链接」获取 `most://<cid>` 链接
108
- 4. 将链接发送给接收者
109
-
110
- ### most:// 链接是什么?
111
-
112
- `most://` MostBox 自定义的协议链接,格式为 `most://<cid>`。接收方安装 MostBox 后,点击链接即可自动下载文件。
113
-
114
- ### 支持大文件吗?
115
-
116
- 支持。目前已测试通过 **GB 级别**的大文件传输,采用流式处理,内存占用低。
117
-
118
- ### 频道聊天是什么?
119
-
120
- 频道聊天是 MostBox 的 P2P 即时通讯功能:
121
- - 创建一个频道(如 `alice` 或 `team-project`)
122
- - 将频道名称分享给朋友
123
- - 朋友加入后即可实时聊天
124
- - 消息通过 P2P 网络加密传输,服务器只负责建立连接
125
-
126
- ### 如何使用频道聊天?
127
-
128
- 1. 点击左侧「频道」进入聊天页面
129
- 2. 点击「创建频道」创建新频道
130
- 3. 将频道名称分享给朋友
131
- 4. 朋友打开同一页面,输入频道名称加入
132
- 5. 开始聊天!
133
-
134
- ### 如何在其他设备上下载文件?
135
-
136
- 确保设备已安装 Node.js >= 18,然后运行:
137
-
138
- ```bash
139
- npx most-box
140
- ```
141
-
142
- 浏览器访问 `http://127.0.0.1:1976`,输入链接即可下载。
143
-
144
- ## 路线图
145
-
146
- ### v1.0(当前版本)
147
-
148
- - P2P 文件上传与下载
149
- - ✅ 确定性 CID 生成
150
- - ✅ 大文件流式传输
151
- - most:// 链接分享
152
- - ✅ Web UI 界面
153
- - ✅ P2P 频道聊天
154
-
155
- ### 长期规划
156
-
157
- - [ ] P2P 多人视频/语音通话
158
- - 基于 WebRTC 的端到端加密通话
159
- - 频道内一键发起通话
160
- - 屏幕共享与文字聊天
161
- - [ ] 浏览器扩展
162
- - [ ] 移动端支持(iOS/Android)
163
- - [ ] 桌面客户端
164
-
165
- ## 技术栈
166
-
167
- - **Hyperswarm** P2P 网络发现与连接
168
- - **Hyperdrive** — 分布式文件存储
169
- - **Corestore** Hypercore 存储管理
170
- - **IPFS UnixFS Importer** — CID 计算
171
- - **Node.js HTTP** — 零依赖的 HTTP + WebSocket 服务
172
- - **React** — Web UI
173
-
174
- ## 社区
175
-
176
- - **微信**:微信号 `most-box`(自动通过好友申请)
177
- - **GitHub Discussions**:[提出需求 & 技术讨论](../../discussions)
178
- - **问题反馈**:[Github issues](../../issues)
179
-
180
- ## 许可证
181
-
182
- 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
+ - Electron 桌面客户端
170
+
171
+ ### 长期规划
172
+
173
+ - [ ] 下载体验优化 - 检测是否可下载
174
+ - [ ] P2P 多人视频/语音通话
175
+ - 基于 WebRTC 的端到端加密通话
176
+ - 频道内一键发起通话
177
+ - 屏幕共享与文字聊天
178
+ - [ ] 浏览器扩展
179
+ - [ ] 移动端支持(iOS/Android)
180
+
181
+ ## 技术栈
182
+
183
+ - **前端**: React 19, Next.js 16, TypeScript, Zustand, Lucide React
184
+ - **后端**: Hono + @hono/node-server + WebSocket
185
+ - **P2P**: Hyperswarm 4.x, Hyperdrive 13.x, Corestore 7.x
186
+ - **Web3**: ethers.js, Hardhat, Solidity, EIP-712
187
+ - **桌面**: Electron 41, electron-builder
188
+ - **测试**: Node.js built-in test runner
189
+
190
+ ## CI/CD
191
+
192
+ 发布新版本时,推送 tag 即可自动构建:
193
+
194
+ ```bash
195
+ git tag v0.0.7
196
+ git push origin v0.0.7
197
+ ```
198
+
199
+ 触发后自动执行:
200
+ 1. **npm 包发布** — 发布 `most-box` 到 npm registry
201
+ 2. **Windows 打包** — 构建 `.exe` 安装包(x64 + arm64)并上传 Release
202
+ 3. **macOS 打包** — 构建 `.dmg` 安装包(x64 + arm64)并上传 Release
203
+ 4. **Linux 打包** — 构建 `.AppImage` 安装包(x64 + arm64)并上传 Release
204
+
205
+ electron-builder 自动创建 GitHub 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', () => {
64
+ if (engine && engine.stop) {
65
+ engine.stop().catch(() => {})
66
+ }
67
+ })
@@ -1,4 +1,4 @@
1
- <!DOCTYPE html><html lang="zh-CN"><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/09vfh8lfuacc0.css" data-precedence="next"/><link rel="preload" as="script" fetchPriority="low" href="/_next/static/chunks/0ht900cau6_ur.js"/><script src="/_next/static/chunks/00l-yd3t8dvwz.js" async=""></script><script src="/_next/static/chunks/0bogtdbh.dcu1.js" async=""></script><script src="/_next/static/chunks/turbopack-076ce9exut_h3.js" async=""></script><script src="/_next/static/chunks/0u5ydb-f0.vxl.js" async=""></script><script src="/_next/static/chunks/0dbhjjzl8qfwv.js" async=""></script><meta name="robots" content="noindex"/><link rel="icon" href="/favicon.ico"/><title>404: This page could not be found.</title><title>MostBox 文件管理</title><meta name="description" content="MostBox P2P 文件管理"/><script>
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"/><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/02~o2nmo5pmy1.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
2
  (function() {
3
3
  var theme = localStorage.getItem('theme');
4
4
  if (theme === 'dark' || (!theme && window.matchMedia('(prefers-color-scheme: dark)').matches)) {
@@ -12,4 +12,4 @@
12
12
  window.onunhandledrejection = function(event) {
13
13
  console.error('[Unhandled Promise Rejection]', event.reason);
14
14
  };
15
- </script><div style="font-family:system-ui,&quot;Segoe UI&quot;,Roboto,Helvetica,Arial,sans-serif,&quot;Apple Color Emoji&quot;,&quot;Segoe UI Emoji&quot;;height:100vh;text-align:center;display:flex;flex-direction:column;align-items:center;justify-content:center"><div><style>body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}</style><h1 class="next-error-h1" style="display:inline-block;margin:0 20px 0 0;padding:0 23px 0 0;font-size:24px;font-weight:500;vertical-align:top;line-height:49px">404</h1><div style="display:inline-block"><h2 style="font-size:14px;font-weight:400;line-height:49px;margin:0">This page could not be found.</h2></div></div></div><!--$--><!--/$--><script src="/_next/static/chunks/0ht900cau6_ur.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[17279,[\"/_next/static/chunks/0u5ydb-f0.vxl.js\",\"/_next/static/chunks/0dbhjjzl8qfwv.js\"],\"ErrorBoundary\"]\n3:I[39756,[\"/_next/static/chunks/0u5ydb-f0.vxl.js\",\"/_next/static/chunks/0dbhjjzl8qfwv.js\"],\"default\"]\n4:I[37457,[\"/_next/static/chunks/0u5ydb-f0.vxl.js\",\"/_next/static/chunks/0dbhjjzl8qfwv.js\"],\"default\"]\n5:I[97367,[\"/_next/static/chunks/0u5ydb-f0.vxl.js\",\"/_next/static/chunks/0dbhjjzl8qfwv.js\"],\"OutletBoundary\"]\n6:\"$Sreact.suspense\"\n9:I[97367,[\"/_next/static/chunks/0u5ydb-f0.vxl.js\",\"/_next/static/chunks/0dbhjjzl8qfwv.js\"],\"ViewportBoundary\"]\nb:I[97367,[\"/_next/static/chunks/0u5ydb-f0.vxl.js\",\"/_next/static/chunks/0dbhjjzl8qfwv.js\"],\"MetadataBoundary\"]\nd:I[68027,[\"/_next/static/chunks/0u5ydb-f0.vxl.js\",\"/_next/static/chunks/0dbhjjzl8qfwv.js\"],\"default\",1]\n:HL[\"/_next/static/chunks/09vfh8lfuacc0.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/09vfh8lfuacc0.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}],[\"$\",\"script\",\"script-0\",{\"src\":\"/_next/static/chunks/0u5ydb-f0.vxl.js\",\"async\":true,\"nonce\":\"$undefined\"}],[\"$\",\"script\",\"script-1\",{\"src\":\"/_next/static/chunks/0dbhjjzl8qfwv.js\",\"async\":true,\"nonce\":\"$undefined\"}]],[\"$\",\"html\",null,{\"lang\":\"zh-CN\",\"suppressHydrationWarning\":true,\"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\"}],[\"$\",\"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\":[[[\"$\",\"title\",null,{\"children\":\"404: This page could not be found.\"}],[\"$\",\"div\",null,{\"style\":{\"fontFamily\":\"system-ui,\\\"Segoe UI\\\",Roboto,Helvetica,Arial,sans-serif,\\\"Apple Color Emoji\\\",\\\"Segoe UI Emoji\\\"\",\"height\":\"100vh\",\"textAlign\":\"center\",\"display\":\"flex\",\"flexDirection\":\"column\",\"alignItems\":\"center\",\"justifyContent\":\"center\"},\"children\":[\"$\",\"div\",null,{\"children\":[[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}\"}}],[\"$\",\"h1\",null,{\"className\":\"next-error-h1\",\"style\":{\"display\":\"inline-block\",\"margin\":\"0 20px 0 0\",\"padding\":\"0 23px 0 0\",\"fontSize\":24,\"fontWeight\":500,\"verticalAlign\":\"top\",\"lineHeight\":\"49px\"},\"children\":404}],[\"$\",\"div\",null,{\"style\":{\"display\":\"inline-block\"},\"children\":[\"$\",\"h2\",null,{\"style\":{\"fontSize\":14,\"fontWeight\":400,\"lineHeight\":\"49px\",\"margin\":0},\"children\":\"This page could not be found.\"}]}]]}]}]],[]],\"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\":[[[\"$\",\"title\",null,{\"children\":\"404: This page could not be found.\"}],[\"$\",\"div\",null,{\"style\":\"$0:f:0:1:0:props:children:1:props:children:1:props:children:props:children:1:props:notFound:0:1:props:style\",\"children\":[\"$\",\"div\",null,{\"children\":[[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}\"}}],[\"$\",\"h1\",null,{\"className\":\"next-error-h1\",\"style\":\"$0:f:0:1:0:props:children:1:props:children:1:props:children:props:children:1:props:notFound:0:1:props:children:props:children:1:props:style\",\"children\":404}],[\"$\",\"div\",null,{\"style\":\"$0:f:0:1:0:props:children:1:props:children:1:props:children:props:children:1:props:notFound:0:1:props:children:props:children:2:props:style\",\"children\":[\"$\",\"h2\",null,{\"style\":\"$0:f:0:1:0:props:children:1:props:children:1:props:children:props:children:1:props:notFound:0:1:props:children:props:children:2:props:children:props:style\",\"children\":\"This page could not be found.\"}]}]]}]}]],null,[\"$\",\"$L5\",null,{\"children\":[\"$\",\"$6\",null,{\"name\":\"Next.MetadataOutlet\",\"children\":\"$@7\"}]}]]}],{},null,false,null]},null,false,\"$@8\"]},null,false,null],[\"$\",\"$1\",\"h\",{\"children\":[[\"$\",\"meta\",null,{\"name\":\"robots\",\"content\":\"noindex\"}],[\"$\",\"$L9\",null,{\"children\":\"$La\"}],[\"$\",\"div\",null,{\"hidden\":true,\"children\":[\"$\",\"$Lb\",null,{\"children\":[\"$\",\"$6\",null,{\"name\":\"Next.Metadata\",\"children\":\"$Lc\"}]}]}],null]}],false]],\"m\":\"$undefined\",\"G\":[\"$d\",[[\"$\",\"link\",\"0\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/chunks/09vfh8lfuacc0.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}]]],\"S\":true,\"h\":null,\"s\":\"$undefined\",\"l\":\"$undefined\",\"p\":\"$undefined\",\"d\":\"$undefined\",\"b\":\"0h4f4QFk_KC9FlSRfQACk\"}\n"])</script><script>self.__next_f.push([1,"e:[]\n8:\"$We\"\n"])</script><script>self.__next_f.push([1,"a:[[\"$\",\"meta\",\"0\",{\"charSet\":\"utf-8\"}],[\"$\",\"meta\",\"1\",{\"name\":\"viewport\",\"content\":\"width=device-width, initial-scale=1\"}]]\n"])</script><script>self.__next_f.push([1,"7:null\nc:[[\"$\",\"title\",\"0\",{\"children\":\"MostBox 文件管理\"}],[\"$\",\"meta\",\"1\",{\"name\":\"description\",\"content\":\"MostBox P2P 文件管理\"}]]\n"])</script></body></html>
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/02~o2nmo5pmy1.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\"}],[\"$\",\"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/02~o2nmo5pmy1.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\":\"sV38nXrv3xVVO6wvSdFlZ\"}\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>