:ambulance: 东迁,启动 :rocket:
🚑️ 你站准备东迁了
国内用户可以点击 east.xjtu.app 或 网站顶部的 ❯ 进行尝鲜 当小白鼠测试
当前正在开发中,很多基本功能都没有
用户界面(相比于当前的 Discouse)很简陋,唯一的优势可能是快(?)
🚀 加速,启动
针对国内用户网络卡顿的问题,尝试通过”offline-first“这一设计理念缓解:
- 所有的 编辑、保存、查看 操作在 本地 进行
- 后台自动与服务器进行数据同步
🍧 Svelte makes (full stack developer's) life easier
SvelteKit 相比于当前网站 Discourse 的 Ember.js+Rails 技术栈组合,代码的难度显著下降. (当然,等复杂性上来之后这个观点个成立还有待观察)
喜欢搞开发的童鞋可以给这个仓库贡献代码哦:
https://github.com/fokx/svelte-forum
😇 东迁了,那这个 Discourse 网站怎么办?
Who cares?

增加了回复功能
界面太丑

开发了 12 个小时就开发了这么点内容,这是否
雏形可用,欢迎测试
回复完页面不刷新
最底下的帖子点击恢复按钮展开的编辑器在屏幕外,需要人工向下滚动
夜晚开发爽,明天还要上班,艹了
我感觉做这个有点做上瘾了
上班睡
技术毒品 🤗
github 未备案,涉嫌违法须谨慎
为美利坚民族伟大复兴不懈奋斗
你生来违法
有了在线人数我就知道是谁在吐脏水。我给你记下来
为美利坚民族伟大复兴不懈奋斗
是记在小本本上吗?
今日又更新了一下,主要包含:
- 让 Discourse cooked 的图片和链接的 html 显示好看点
- 全局 threaded / flat view toggle

明天要做的:
显示列表
通过 highlight.js 显示代码高亮
原来不能替 admin 勾代办事件 ![]()
以管理人员别名用户的身份只能编辑管理人员别名帖子。
--.-..-....-..----.
今天完成了昨天的计划,并且
- 可以正常显示标题里面的 emoji
明天没有计划,按照惯例周末会出去玩,待家里容易玉玉
今天加了一个小功能,在话题页,点击顶部的❯可以导航到 East 对应的话题,在 East 点击 〈 可以导航到 West 的话题
最近遇到一些 setbacks,感觉自己无法解决了,遂拉了一个分支,给别人/以后处理了。
discourse 会把 post 的 markdown 初步转换成 html,结果称为 cooked,我的代码里直接用 svelte 里的{@render children()}展示了。为了支持以下功能,我需要在所有组件 mount 完成后进行后处理,我目前还没找到在什么地方写后处理代码。
- 添加 mermaid 支持:
访问 topic 时,等所有,我的 <Post> 是递归调用 mount 所有的回复的,mermaid 的 render() 是异步函数,调试时我发现 mermaid 代码块被 render 了多次,结果就是 render 的结果不是 svg 了 😅 。
- 网页内联 PDF
我将 cooked 转成 dom,通过 domutils 进行操作,再转成 html,再用 svelte 的 render()。再在后处理代码中修改 <iframe>.
分支:
https://github.com/fokx/svelte-forum/tree/support-mermaid-and-embed-pdf
目前有一些问题,这个仓库移植使用 React 编写的 Lexical 功能不全,
比较 Discourse 显示的 post 和我的
日期 <span class="local-date" data-date="2024-08-08" data-timezone="Asia/Shanghai">Aug 8, 2024 (Asia/Shanghai)</span> Aug 8, 2024 (Asia/Shanghai)
图片  
<> 内 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 `
靠右对齐
`
靠右对齐
\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 <span class="spoiler">This is a spoiler</span> This is a spoiler
<hr> ---
另外,把 /raw/127 markdown 文本粘贴到 Svelte-Lexical 编辑器里(lexical 编辑器支持在 WYSIWYG 和 Markdown 模式之间切换),编辑器预览界面均不支持以上功能,但由于目前所有的 post 都存在 Discourse 里,由 Discourse 转成 html,所以最终 post 里可以正常显示。
The footnote ↩︎
三步走战略
-
不考虑"离线优先"的设计思想,完成基础 CRUD 功能。用 UI 库 https://svelte-5-ui-lib.codewithshin.com/ 搭建框架,参考 Old Reddit / Lemmy, Discourse, 国产 App 的社交功能界面 进行设计,主要面向移动端,兼顾桌面端界面 (responsive design)
-
借助 service worker 和 Dexie(把数据存在浏览器的 IndexdedDB 里), 实现 App 的离线可用和自动数据同步
-
参考 Discourse/Lemmy 逐步丰富功能,新增特色功能,例如 P2P 数据传输和分布式存储
最近找 AI 写了一个 基于 WebRTC 的 P2P 聊天 的功能,感觉很好玩,主要就是这两个文件:
https://github.com/fokx/svelte-forum/blob/main/src/lib/server/discovery-server.ts
https://github.com/fokx/svelte-forum/blob/main/src/routes/chat/%2Bpage.svelte
当新用户访问 https://east.xjtu.app/chat 的时候,首先访问 discovery server/signaling server,它会告诉你其他 peer 在哪里,帮助你和其他用户建立直接或基于转发的连接(这是牛逼的 WebRTC 技术的一部分,除了聊天,还可以传输任意文件、建立音视频通话、在线会议、...)。
当任意用户加入时,其他所有 peer 会将储存在本地浏览器的聊天消息发送给新用户,无须(当前也未实现)和中央服务器通信。
这一功能还很不完善,例如:
- 建立直接连接的成功率不高
- 当没有其他 peer 在线时无法发送消息。
但是很好玩。
我发现了Web App 的局限,不能监听在某个端口,或者 multicast IP(像 LocalSend: Share files to nearby devices 一样),也不能扫描整个网段里的全部 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 等技术,进行分布式信息存储。
借助所有可用的物理信道:
- 常规 (Wireless)LAN, cellular network
- Bluetooth LE (like GitHub - berty/berty: Berty is a secure peer-to-peer messaging app that works with or without internet access, cellular data or trust in the network )
- NFC
- Soft AP (Wifi hotspot)
再类似 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 模式的代理