🚑 东迁,启动 🚀

比较 Discourse 显示的 post 和我的

日期 [date=2024-08-08 timezone="Asia/Shanghai"] 2024-08-07T16:00:00Z

图片 ![Screenshot_20240524_160004|376x65, 75%](upload://fSGaBlA1vUtpwk34iEE0kd72i4n.avif) Screenshot_20240524_160004

<> 内 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 数学公式 (:warning: 原版 Lexical 支持) $TL \ge 2 $ TL \ge 2

Footnote A sentence that needs a footnote. ^[The footnote] A sentence that needs a footnote. [1]

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 里可以正常显示。


  1. The footnote ↩︎

三步走战略

  1. 不考虑"离线优先"的设计思想,完成基础 CRUD 功能。用 UI 库 https://svelte-5-ui-lib.codewithshin.com/ 搭建框架,参考 Old Reddit / Lemmy, Discourse, 国产 App 的社交功能界面 进行设计,主要面向移动端,兼顾桌面端界面 (responsive design)

  2. 借助 service worker 和 Dexie(把数据存在浏览器的 IndexdedDB 里), 实现 App 的离线可用和自动数据同步

  3. 参考 Discourse/Lemmy 逐步丰富功能,新增特色功能,例如 P2P 数据传输和分布式存储

2 个赞

最近找 AI 写了一个 基于 WebRTC 的 P2P 聊天 的功能,感觉很好玩,主要就是这两个文件:

当新用户访问 https://east.xjtu.app/chat 的时候,首先访问 discovery server/signaling server,它会告诉你其他 peer 在哪里,帮助你和其他用户建立直接或基于转发的连接(这是牛逼的 WebRTC 技术的一部分,除了聊天,还可以传输任意文件、建立音视频通话、在线会议、…)。
当任意用户加入时,其他所有 peer 会将储存在本地浏览器的聊天消息发送给新用户,无须(当前也未实现)和中央服务器通信。

这一功能还很不完善,例如:

  1. 建立直接连接的成功率不高
  2. 当没有其他 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 地址泄漏,我一般都直接关了 :sweat_smile:

除非用户格外设置,否则 webrtc 不能绕过 vpn 和 tun 模式的代理

1 个赞