比较 Discourse 显示的 post 和我的
日期 [date=2024-08-08 timezone="Asia/Shanghai"]
2024-08-07T16:00:00Z
图片 

<>
内 URL 自动形成链接 <https://chat.xjtu.app>
https://chat.xjtu.app
https://
链接获取预览 https://xjtu.app/t/announcing-xjtu-men-chat-service-based-on-matrix/9196
Announcing xjtu.app chat service based on Matrix
Mermaid
BBCode [right] 靠右对齐 [/right]
靠右对齐
\TeX 数学公式 (
原版 Lexical 支持) $TL \ge 2 $
TL \ge 2
Footnote A sentence that needs a footnote. ^[The footnote]
A sentence that needs a footnote.
Embedded PDF reader
Spoiler Alert [spoiler]This is a spoiler[/spoiler]
This is a spoiler
<hr>
---
另外,把 https://xjtu.app/raw/127 markdown 文本粘贴到 Svelte-Lexical 编辑器里(lexical 编辑器支持在 WYSIWYG 和 Markdown 模式之间切换),编辑器预览界面均不支持以上功能,但由于目前所有的 post 都存在 Discourse 里,由 Discourse 转成 html,所以最终 post 里可以正常显示。
最近找 AI 写了一个 基于 WebRTC 的 P2P 聊天 的功能,感觉很好玩,主要就是这两个文件:
当新用户访问 https://east.xjtu.app/chat 的时候,首先访问 discovery server/signaling server,它会告诉你其他 peer 在哪里,帮助你和其他用户建立直接或基于转发的连接(这是牛逼的 WebRTC 技术的一部分,除了聊天,还可以传输任意文件、建立音视频通话、在线会议、…)。
当任意用户加入时,其他所有 peer 会将储存在本地浏览器的聊天消息发送给新用户,无须(当前也未实现)和中央服务器通信。
这一功能还很不完善,例如:
- 建立直接连接的成功率不高
- 当没有其他 peer 在线时无法发送消息。
但是很好玩。
我发现了Web App 的局限,不能监听在某个端口,或者 multicast IP(像 https://localsend.org/ 一样),也不能扫描整个网段里的全部 IP 的某些端口并连接。
如果用 Native App,比较理想的状态是:
flowchart LR
A[启动 App] --> B[监听 0.0.0.0 的 XX 端口供连接] & C[搜索所有 NIC 的网段里的全部主机的 XX 端口] & D[连接 discovery-server]
B & C & D--> Z[peers 间建立直接连接]
然后借助 DHT 等技术,进行分布式信息存储。
借助所有可用的物理信道:
再类似 multi-path TCP / QUIC,如果每个用户需要和某个远在家乡的服务器进行通信,可以将数据包由线路最好的几个 peers 转发。
关于跨平台的技术选择,我曾经调研过:(tl;dr 没有一个好用的)
GitHub - localsend/localsend: An open-source cross-platform alternative to AirDrop 这个(Native)App 我觉得是很牛逼的(有类似功能的 WebApp:GitHub - ShareDropio/sharedrop: Easy P2P file transfer powered by WebRTC - inspired by Apple AirDrop 有时候无法传输成功),他用的是 Flutter,我 clone 下来,结果试了半天无法在 Android 上编译运行(gradle 相关的报错让人摸不着头脑)。看了一会代码,Flutter 和它使用的语言 Dart 我无法接受。
WebRTC 会导致 IP 地址泄漏,我一般都直接关了 
除非用户格外设置,否则 webrtc 不能绕过 vpn 和 tun 模式的代理
1 个赞