100 Commits
Author SHA1 Message Date
layue13 eca0102c06 Merge pull request #18 from layue13/fix/listener-close-quiet-period
Build and publish / build (push) Successful in 5m6s
Build and publish / publish (push) Successful in 45s
fix: 关闭监听器时同时关闭 boss 与 worker 事件循环
2026-10-24 01:13:08 +08:00
layue13andClaude Opus 5.5 39e7f11a96 fix: 关闭监听器时同时关闭 boss 与 worker 事件循环
ProxySessionListener.close() 原先等 boss 组 shutdownGracefully 完成后才开始关闭
worker 组。两组各自要等 2 秒静默期,所以每次 close 至少约 4 秒。测试用
close().get(5, SECONDS) 收尾,在较慢的 Gitea runner 上 SessionTransferTest 有两个
用例因此超时(run 14129);本机 SessionTransferTest 每个用例也都在 4.16 秒以上,最慢
5.18 秒。

改为同时开始关闭两组,两者都结束后再完成 shutdown。各组仍保留默认静默期,关闭前已
提交的任务照常执行。本机 SessionTransferTest 单用例中位数 4.19 秒降到 2.15 秒,最慢
5.18 秒降到 3.13 秒。

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-24 01:05:53 +08:00
layue13 2ae0af8bae Merge pull request #15 from layue13/perf/client-websocket-codec
perf(client-mod): one WebSocket message per batch, TCP_NODELAY on ws/wss
2026-10-23 17:50:15 +08:00
layue13 cd57bef0fd Merge pull request #14 from layue13/perf/websocket-cdn
perf: WebSocket 经 CDN:wss 改用 BoringSSL、保活 Ping、整合包形态基准
2026-10-23 17:50:11 +08:00
layue13 590e594e59 Merge pull request #17 from layue13/fix/shutdown-accept-flake
test: 修复 shutdownWhileAccepting… 在 Linux 上的偶发超时
2026-10-23 17:50:07 +08:00
layue13andClaude Opus 5.5 6d196a83bb test: 修复关闭监听时半开连接导致的偶发超时
shutdownWhileAcceptingClientsClosesEveryRegisteredSession 在 Linux CI 上偶发
SocketTimeoutException。在 Docker(Linux, 4 CPU)中复现 3/80,超时时 ss -tan 显示
卡住的客户端为 ESTAB,而服务端端口上没有该四元组的任何 socket:内核在监听 socket
关闭的竞争窗口内丢弃了握手的最后一个 ACK 且不发 RST,Netty 从未 accept 这条连接,
客户端不发数据就永远收不到任何东西。

读超时时改为写一个字节并要求收到 RST:无服务端 socket 必然回 RST;若代理 accept
后泄漏了连接,字节会被接收、读仍然超时,测试依旧失败。修复后 Docker 中 150/150 通过,
其中 8 次走到半开分支。

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-23 17:36:30 +08:00
layue13 8cd0dcaaa0 Merge pull request #16 from layue13/fix/plugin-disable-deadlock
fix: 关闭插件宿主时不再持有宿主锁等待 onDisable
2026-10-23 17:12:21 +08:00
layue13andClaude Opus 5.5 85f56d042c fix: 关闭插件宿主时不再持有宿主锁等待 onDisable
- PluginHost.close() 原本整个方法持有宿主锁,包括等待各插件 onDisable 的最长 10 秒。插件在
  onDisable 里关闭自己的命令注册(文档推荐的做法)时,CommandService 的注销要拿同一把锁,
  于是一直等到截止时间被放弃:onDisable 后面的清理(线程池、数据库连接池)不会执行,日志里
  出现 “onDisable exceeded shutdown deadline”。AetherShard 每次停机都会遇到
- 现在只在 onDisable 之前和之后的步骤持锁,等待插件时不持锁;每个插件的 deactivateAndRemove
  仍在锁内。同时调用 close() 的第二个线程等第一个完成后返回,与之前被锁挡住时的效果一致
- PluginHostTest:插件在 onDisable 里关闭命令注册,close() 远早于截止时间返回且 onDisable
  执行完;修复前该测试失败

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-23 16:47:13 +08:00
layue13andClaude Opus 5.5 b72c609aec perf(client-mod): keep the batching encoder, drop the slice decoder
Verdict of the 2026-10-23 client codec record: ClientFrameEncoder sends
12x fewer messages at 51-56% less event-loop CPU per packet and is kept.
ClientFrameDecoder missed the rule (codec-only CPU -8-18% with
overlapping ranges; worse once vanilla's splitter runs behind it), so the
client keeps Netty's WebSocket13FrameDecoder. README protocol notes cover
TCP_NODELAY and one message per batch.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-23 16:44:35 +08:00
layue13andClaude Opus 5.5 b7d6497ca8 perf: WebSocket 经 CDN:wss 改用 BoringSSL、保活 Ping、整合包形态基准
- ProxySessionBenchmark 新增 --profile modded(仿大型整合包的双向包组与 2 MiB 登录突发,逐字节校验)、
  --websocket-tls 1(keytool 一次性证书的 wss)和 --client-coalesce 1。
- wss 监听改用随包附带的 BoringSSL(netty-tcnative-boringssl-static 2.0.84):TLS 占 wss 代理 I/O CPU 的 55%,
  换用后每帧 CPU 在每一对配对测量中都更低(窗口 1 -22%,窗口 8 -36%),帧率 +31%/+34%;其他平台回落 JDK,
  启动日志标明所用实现。jar 由 10.4 MB 增至 16.5 MB。
- 新增 websocket.pingIntervalSeconds(默认 30,0 关闭):升级后代理静默不超过该时长,期间无写出就发空 Ping,
  避免 CDN/负载均衡在安静的登录、选服阶段按空闲超时断开。IdleStateHandler 版本在窗口 8 多耗 7.6% CPU,
  未达规则;改为写时置位标志、每半个间隔检查的实现,JFR 中几乎不可见。
- 文档:WebSocket 接入新增“经 CDN 部署”,更正消息大小描述;记录见
  testing/benchmarks/results/2026-10-23-websocket-cdn.md。

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-23 16:40:48 +08:00
layue13andClaude Opus 5.5 1decc44081 perf(client-mod): candidate WebSocket codec, codecBenchmark and decision rule
TCP_NODELAY on ws/wss; ClientFrameEncoder (one message per batch) and
ClientFrameDecoder (retained slices) with tests. The decision rule is
recorded before the measured runs; the verdict follows in a later commit.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-23 16:29:46 +08:00
layue13 6224d3deb4 Merge pull request #13 from layue13/feat/admin-console
feat: 管理控制台(JLine)与内置命令
2026-10-23 15:50:18 +08:00
layue13andClaude Opus 5.5 284c2f81cf feat: 管理控制台(JLine)与内置命令
- core.admin.AdminView:在线玩家(地址、TCP/WebSocket、所在服务器、在线时长)、服务器
  (地址、人数、来源)与状态(版本、运行时长、传输层、监听地址、堆内存、最近 10 分钟活动)
  的只读快照;不从控制台线程直接读取会话状态
- Session 在发布玩家时记录连接详情;ProxySessionListener.onlinePlayers()
- ConnectionLog 用 RecentCounter(10 个一分钟桶)统计加入、离开、拒绝、转服与失败;
  连接数上限与插件池拒绝计入过载
- app.console:Console 在终端中使用 JLine(提示符固定在底部、历史、Tab 补全),否则按行读取
  标准输入;ConsoleLogAppender 让日志打印在提示符上方并为警告/错误着色
- 内置命令 help/list/servers/player/status/send/kick/loglevel/stop,先于插件控制台命令;
  同名插件命令在启动时警告;send/kick/loglevel/stop 写入 moonbridge.admin
- 依赖:JLine 3.30.17(reader、terminal、FFM 提供者),logback 改为编译期依赖
- 文档:operations.md 控制台命令、logging.md、CLAUDE.md

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-22 21:59:09 +08:00
layue13 1d712ac5c6 Merge pull request #12 from layue13/perf/websocket-coalescing
perf: WebSocket 出站每次 flush 合并为一条二进制消息
2026-10-22 21:24:08 +08:00
layue13andClaude Opus 5.5 21a5adf18d perf: WebSocket 出站每次 flush 合并为一条二进制消息
- WebSocketFrameAdapter:flush 前写入的字节用 CoalescingBufferQueue 合并为一条
  BinaryWebSocketFrame,最大 64 KiB。之前每个 Minecraft 帧一条消息,而 Netty 的编码器对
  小于 1 KiB 的消息每条都分配并复制一次。每次写入的 promise 在承载它的消息写出时完成;
  未 flush 的写入在关闭时失败并释放;排队字节计入通道可写性。入站不变
- ProxySessionBenchmark:新增 --websocket 1,代理阶段客户端走 ws://
- 记录 testing/benchmarks/results/2026-10-22-websocket-coalescing:burst32 每帧 CPU 低 21%
  且范围不重叠、吞吐更高;window 1 无变化;window 16 噪声大,补跑 3 对后合计无回退。
  满足事先规则,采用

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-22 20:56:00 +08:00
layue13 0253130760 Merge pull request #11 from layue13/feat/spigot-profile-adapter
perf: Spigot/CraftBukkit 1.7.10 上读取 GameProfile 也不再用反射
2026-10-22 20:23:49 +08:00
layue13andClaude Opus 5.5 547ba98f8f perf: Spigot/CraftBukkit 1.7.10 上读取 GameProfile 也不再用反射
- SpigotProfileAccess:直接调用 org.bukkit.craftbukkit.v1_7_R4.entity.CraftPlayer#getProfile
  与重定位到 net.minecraft.util.com.mojang.authlib 的 authlib。签名用 javap 从
  spigot-1.7.10-R0.1-SNAPSHOT(build 1649)和 craftbukkit-1.7.10-R0.1 读取,两者一致;
  五个调用的描述符逐一与 Spigot JAR 核对
- 选择顺序:Uranium → Spigot 1.7.10 → 缓存反射回退
- src/serverStubs 加入对应的编译期副本;verifyBackendJar 额外拒绝 net/minecraft/
- 测试:SpigotProfileAccessTest;文档更新

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-22 20:04:08 +08:00
layue13 36dd9ebb33 Merge pull request #8 from layue13/feat/plugin-dependencies
feat: 插件之间的依赖、类共享与类型化服务
2026-10-22 19:42:23 +08:00
layue13 74afaba6f8 Merge remote-tracking branch 'origin/main' into feat/plugin-dependencies
# Conflicts:
#	proxy/core/src/main/java/dev/moonbridge/core/plugin/PluginHost.java
2026-10-22 19:36:10 +08:00
layue13 d05dca7ada Merge pull request #10 from layue13/feat/zero-reflection
perf: Uranium 上读取 GameProfile 不再用反射,代理用 MethodHandle 创建插件
2026-10-22 19:33:44 +08:00
layue13 ee46cd8068 Merge pull request #9 from layue13/perf/relay-batch-completion
perf: 去掉冷路径上的重复开销,记录未采用的中继批量完成实验
2026-10-22 19:33:31 +08:00
layue13andClaude Opus 5.5 4565af2475 perf: Uranium 上读取 GameProfile 不再用反射,代理用 MethodHandle 创建插件
- 后端:ProfileAccess 按服务器选择访问方式,启动时选一次。Uranium 使用编译进 JAR 的
  UraniumProfileAccess(CraftPlayer#getProfile、authlib 1.5.16,签名来自 TDLM/Uranium 源码与
  authlib 字节码),没有反射;其他服务器(如 Spigot 1.7.10)使用缓存反射回退
  ReflectiveProfileAccess;编译调用链接失败时记警告并改用回退
- 剥离会话证明的算法只保留一份,两种访问方式共用
- src/serverStubs:只用于编译和测试的服务器类副本,不进 JAR;verifyBackendJar 额外检查
  不含 com/mojang/
- 代理:PluginConstructors 用 MethodHandles.publicLookup().findConstructor 创建插件,
  不再使用 java.lang.reflect 与 ServiceLoader
- 测试:UraniumProfileAccessTest、PluginConstructorsTest;文档说明各服务器的访问方式

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-22 19:19:41 +08:00
layue13andClaude Opus 5.5 25a7d0e1bb test: 转服截止测试把后端连接被重置也视为代理已关闭
cutoverTimesOutWhenOldBackendWriteNeverCompletes 在 CI 上偶发失败:代理在截止后关闭候选
后端连接时,若该连接上还有未读取的后端帧,Linux 会发送 RST,后端读到 Connection reset
而不是 EOF。两者都表示代理已关闭连接。

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-22 18:57:48 +08:00
layue13andClaude Opus 5.5 fc1345d010 perf: 去掉冷路径上的重复开销,并记录未采用的中继批量完成实验
- Message.validateChannel:通道名正则只编译一次(原来每条消息 String.matches 都重新编译),
  长度检查不再分配字节数组
- 后端 OwnedBukkitSessionService:反射查找按接收者类用 ClassValue 缓存(含未找到),
  玩家每次加入不再重复 getMethod
- testing/benchmarks/results/2026-10-22-relay-batch-completion:中继只给每批最后一次写入
  挂完成回调。I/O 线程分配降 22%、中继 lambda 降 97%,但每帧 CPU 只低 2.4% 且范围重叠,
  未达到事先设定的 10% 规则,未采用;补丁随记录保留
- PluginHostTest.placementFailuresOnlyFailTheirOwnRequest:40 ms 超时在负载下可能早于插件
  处理器运行而偶发失败,改为 500 ms 并断言首个请求确实到达插件

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-22 18:34:36 +08:00
layue13andClaude Opus 5.5 fc02bbdda6 feat: 插件之间的依赖、类共享与类型化服务
- 可选的 META-INF/moonbridge-plugin.yml(id、version、main、dependencies,可选依赖),
  没有描述文件的插件照旧加载
- 加载顺序按依赖图(PluginGraph):依赖先 onLoad/onEnable、后 onDisable;缺少依赖、
  依赖未启用、循环依赖、重复 id、描述文件不合法时给出准确原因并启动失败
- PluginClassLoader 在插件 API 与自身之后查找声明的依赖(含传递依赖);只有声明过的依赖可见
- PluginContext.services():每个类型一个提供方,只对提供方和依赖它的插件可见,随停用注销
- PluginContext.plugins():已加载的带描述文件插件(id、版本、依赖)
- plugins.enabled 可以用 id 作键;数据目录仍按实现类名,无需迁移
- LuckPerms 平台插件的描述文件 id 为 luckperms,版本在构建时写入
- 文档:docs/plugins.md「依赖其他插件」

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-22 17:31:35 +08:00
layue13 4ed6162faf Merge pull request #7 from layue13/feat/logging
feat: 运维日志策略、玩家与服务器事件日志、滚动日志文件
2026-10-22 17:05:10 +08:00
layue13 e890645ba5 Merge remote-tracking branch 'origin/main' into feat/logging
# Conflicts:
#	proxy/core/src/test/java/dev/moonbridge/app/ProxyConfigurationTest.java
2026-10-22 16:57:55 +08:00
layue13 0abcb37799 Merge pull request #6 from layue13/fix/batch-1-bugs
fix: 修复代码审查发现的一批缺陷
2026-10-22 16:49:42 +08:00
layue13andClaude Opus 5.5 7f68e5682e feat: 运维日志策略、玩家与服务器事件日志、滚动日志文件
- docs/logging.md 规定各级别写什么、永远不写什么,以及新增日志的做法
- core.log.ConnectionLog 统一写玩家(加入、离开、转服、转服失败、未能加入)和服务器
  (注册、地址变更、注销、不可达/恢复)事件,logger 为 moonbridge.players / moonbridge.servers
- LogText 清理对端与插件文本(控制字符、双向文字控制字符、长度上限),防止伪造日志行
- logging.playerAddresses 开关:false 时玩家地址写成 [hidden]
- Session 记录结束原因(先记录者为准),在 closePair 中写离开或未能加入的原因
- 合并的 WARN(ThrottledWarning):连接数上限、插件命令/补全/事件/初次选服过载
- 控制通道:租约过期、注册被拒(按地址和原因去重);插件启用/停用;启动与关闭摘要
- logback:控制台 + logs/latest.log,按天压缩滚动保留 14 天;测试只写控制台

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-22 16:44:27 +08:00
layue13andClaude Opus 5.5 3f8e14f54d fix: 修复代码审查发现的一批缺陷
- 控制通道:注册字段长度上限统一放在 messaging 的 ControlHandshakeLimits,后端启动时
  按代理的上限校验,不再出现后端接受、代理每次重连都拒绝的配置;后端按阶段记录连接、
  注册与断线失败(每类只记一次,不含对端数据),配置错误时输出具体缺失的键
- 转服登录:握手与 Login Start 的写入合并为 SessionChannels.writeBackendLogin,
  Login Start 无法编码时关闭通道释放已排队的握手,不再泄漏缓冲区
- 命令:插件提供的 CommandSource 的 player()/reply() 不再在宿主锁内调用
- 配置:插件条目没有设置时视为空设置而不是空指针;--validate-config 也检查同一后端名的
  密钥冲突;地址解析不再做 DNS,后端地址按目录使用的 URI 规则校验
- WebSocket:IPv4 映射写法(::ffff:a.b.c.d)的可信代理现在能匹配 IPv4 对端

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-22 15:40:57 +08:00
layue13 192eca2a46 Merge pull request #5 from layue13/refactor/repo-layout
refactor: 精简仓库根目录与代理发行包
2026-10-22 15:03:28 +08:00
layue13andClaude Opus 5.5 afea023bce build: 代理发行包改为单个可运行的 moonbridge.jar
发行包去掉 bin/ 启动脚本和 lib/ 下的 42 个依赖 jar,改为与其他代理服务端一样
用 java -jar moonbridge.jar 启动:
- proxy-core 用 shadow 打出含全部依赖的 moonbridge.jar(合并 META-INF/services,
  清单写入 Main-Class、Multi-Release 与 Enable-Native-Access: ALL-UNNAMED)
- 泄漏检测默认关闭改由 ProxyMain 在加载 Netty 前设置,显式 -D 仍优先
- 移除不再使用的 application 约定插件
- 安装包检查、烟测与基准脚本改用发行包根目录作 classpath;文档同步

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-22 15:00:14 +08:00
layue13andClaude Opus 5.5 789648c82f refactor: 仓库根目录按用途分组
- proxy/:core、plugin-api、luckperms 及其上游子模块 vendor/luckperms
- messaging/、backend/ 保持在根目录(messaging 是代理与后端共用的 API)
- build-logic/(原 proxy-build-logic)
- testing/:smoke/ 与 benchmarks/,不进入发行物

Gradle 项目名不变(settings.gradle.kts 映射目录),任务路径与 Maven 坐标照旧。
脚本的仓库根定位、文档与记录中的链接同步更新。

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-22 14:34:01 +08:00
layue13andClaude Opus 5.5 7664c1cf60 build: 代理发行包只保留运行所需内容
发行包根目录去掉 docs/、smoke/results/、benchmarks/results/ 和 backend/,
只剩 bin/、lib/、config/、README(-Pluckperms 时另有 plugins/)。
后端 jar 已由 release 单独放在 build/release/backend/;channel-java8 烟测改为
从 backend/build/libs 取后端 jar。文档同步。

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-22 14:19:36 +08:00
layue13 480999a448 Merge pull request #4 from layue13/refactor/build-and-modules
重构构建与模块:后端 5 合 2、LuckPerms 可选构建、统一 release
2026-10-21 03:26:15 -07:00
layue13 d904410c4b Merge pull request #3 from layue13/feat/websocket-transport
WebSocket 玩家监听(与 TCP 并存)+ 1.7.10 客户端 mod + 文档整理
2026-10-21 03:25:59 -07:00
layue13andClaude Sonnet 5.5 e9a916a192 ci: 统一 workflow 写法,并把 Maven 密钥限定在独立的 publish 任务 [skip ci]
[skip ci]

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-15 16:44:09 +00:00
layue13andClaude Sonnet 5.5 13a3a15dee Merge branch 'chore/bench-record-and-test-timeout'
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-06 07:50:43 -07:00
layue13andClaude Sonnet 5.5 c5fe042173 Record session split benchmark and relax a timing-sensitive messaging test
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-06 07:50:32 -07:00
layue13andClaude Sonnet 5.5 0ad66b6e1d Merge branch 'refactor/split-session': split Session, PluginHost and control classes
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-06 04:17:16 -07:00
layue13andClaude Sonnet 5.5 aed2d5ca93 Extract ClientControl from Session, narrow package visibility, document layers
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-06 04:08:31 -07:00
layue13andClaude Sonnet 5.5 fc951bfb7b Split LocalMessaging operations and failure helpers; deduplicate outbound dispatch
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-06 03:25:20 -07:00
layue13andClaude Sonnet 5.5 765dcffeaa Split BackendChannelClient into session, dispatcher and operation classes
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-06 03:24:17 -07:00
layue13andClaude Sonnet 5.5 4b9f240c1b Split BackendControlService into registry, router, exchange and writer
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-06 03:22:51 -07:00
layue13andClaude Sonnet 5.5 22739ed0c4 Split PluginHost into lifecycle, event, command and placement services
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-06 03:19:50 -07:00
layue13andClaude Sonnet 5.5 133e46f25b Split Session into login, routing, transfer and play packages
Session delegates frontend login to FrontendLogin, first-backend dialing to
InitialRouter and the whole transfer state machine to TransferCoordinator
behind the TransferHost port. Per-frame PLAY handlers move to session.play and
dialing helpers to session.channel. Relay hot path is unchanged.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-06 03:16:09 -07:00
layue13 1efbbafbad Merge pull request #2: add CLAUDE.md
Add CLAUDE.md
2026-10-05 18:17:03 -07:00
layue13 c834879640 Merge pull request #1: batch relay flushes, native transport, leak gate, Session helpers
Batch relay flushes, native transport, leak gate, Session helpers
2026-10-05 18:14:22 -07:00
layue13 15e5abb325 Default permission storage to MariaDB 13.0.2 and verify recovery 2026-10-02 05:30:59 +08:00
layue13 21e6006104 Revert "Merge pull request 'Authenticate shared backend sessions before Join' (#20) from feature/early-backend-session into main"
This reverts commit 08eb4454f4, reversing
changes made to 043123e168.
2026-10-01 06:27:29 +08:00
layue13 631b623a3f Revert "Merge pull request 'Exercise Uranium authoritative loading on real transfers' (#21) from test/uranium-player-data-authority into main"
This reverts commit a2382b2bd5, reversing
changes made to 08eb4454f4.
2026-10-01 06:27:29 +08:00
layue13 9675fa42e6 Exercise Uranium authoritative player loading on real transfers 2026-10-01 05:55:18 +08:00
layue13 66762ac8bb Authenticate backend player sessions before Join 2026-10-01 05:00:01 +08:00
layue13 d7e3f13d66 Simplify source release confirmation API 2026-10-01 04:00:07 +08:00
layue13 1bf903ea35 Measure transfer coordination and default PLAY paths 2026-10-01 03:30:45 +08:00
layue13 e8cc2a72bd Add optional source-release transfer coordination events 2026-10-01 02:39:31 +08:00
layue13 bc6db124a7 Revert "Merge pull request 'Guard all backend transfers and recover failed handoffs' (#17) from feature/transfer-guard-lifecycle into main"
This reverts commit 5d4b80d670, reversing
changes made to a3b13dd47b.
2026-09-30 04:26:17 +08:00
layue13 de825615c2 Add central guarded transfer lifecycle 2026-09-30 03:41:11 +08:00
layue13 80a753abc7 Merge branch 'feature/permissions-luckperms' of https://git.nest.potatolab.uk:8443/layue13/MoonBridge into codex/backend-session-binding 2026-09-28 02:45:48 +08:00
layue13 3278ce74b4 Consume private session proofs before legacy player broadcasts 2026-09-28 02:45:04 +08:00
layue13 fc5f8d4753 Verify native LuckPerms integrations and render translated command output 2026-09-28 02:27:15 +08:00
layue13 63f3f97038 Forward exact session proofs for configured offline backends 2026-09-28 02:09:54 +08:00
layue13 672914cdbe Bind Bukkit players to signed exact proxy sessions 2026-09-28 01:50:28 +08:00
layue13 7f1980269a Add permissions service and native LuckPerms platform 2026-09-28 01:32:31 +08:00
layue13 cea296eeb0 Publish MoonBridge modules under project-specific Maven group 2026-09-28 00:11:41 +08:00
layue13 8401e34639 Make development publishing traceable and polish operator and plugin docs 2026-09-27 23:43:13 +08:00
layue13 c0c8f05110 Decouple directory update regression from snapshot implementation 2026-09-27 23:13:14 +08:00
layue13 14d9b59b05 Assert candidate exhaustion disconnect reason in login regression 2026-09-27 23:10:20 +08:00
layue13 9481403684 Redesign initial player routing with explicit candidates and bounded retries 2026-09-27 23:05:58 +08:00
layue13 64152878d0 Rename project to MoonBridge and expose standalone Bukkit API 2026-09-27 22:39:16 +08:00
layue13 8c2d35b8be feat: name backend host and verify real Uranium lifecycle 2026-09-27 22:16:21 +08:00
layue13 cc817c057c test: complete synthetic read cycle during transfer 2026-09-27 20:01:46 +08:00
layue13 7e045e0ddc feat: unify plugin channel messaging and remove v1 API 2026-09-27 19:00:17 +08:00
layue13 d0aca24839 Merge main backend channel into messages completion 2026-09-27 17:57:21 +08:00
layue13 230f317d0a feat: replace backend discovery with control channel 2026-09-27 02:52:46 +08:00
layue13 1185ae2b2e feat: add Adventure messages and asynchronous command completion 2026-09-27 00:01:02 +08:00
layue13 7fe2c99d6e docs: record current Forge pack acceptance and paired measurements 2026-09-26 22:39:12 +08:00
layue13 47ea7ccdf0 Avoid tiny TCP receive windows in slow-reader regression 2026-09-26 22:08:10 +08:00
layue13 12340e146c Test relay backpressure with real TCP slow readers 2026-09-26 21:58:44 +08:00
layue13 2341e757a7 Simplify login state tracking 2026-09-26 04:39:24 +08:00
layue13 71a958a6ec Bound frame count during login relay transition 2026-09-26 04:32:07 +08:00
layue13 2bd7902556 End pending Forge world transition on session close 2026-09-26 04:24:10 +08:00
layue13 9e60e162c7 Clarify real Forge transfer reliability boundary 2026-09-26 04:18:53 +08:00
layue13 c4c145c571 Record successful real Forge roundtrip control 2026-09-26 04:17:28 +08:00
layue13 b43207400d Document real Forge client Uranium login stall 2026-09-26 04:11:22 +08:00
layue13 abfe8a0306 Capture backend bytes during Uranium login stalls 2026-09-26 04:02:37 +08:00
layue13 a04d275a30 Record coalesced direct-login control 2026-09-26 03:54:55 +08:00
layue13 b70dd6965c Record direct Uranium login isolation check 2026-09-26 03:52:38 +08:00
layue13 db520df97f Record repeated Uranium login stall evidence 2026-09-26 03:48:58 +08:00
layue13 05aba68621 Capture early Uranium login stall evidence 2026-09-26 03:44:25 +08:00
layue13 494cc609ff Explain backend closure during initial login 2026-09-26 03:25:21 +08:00
layue13 1409e55afb Send login disconnect when initial backend deadline expires 2026-09-26 03:10:23 +08:00
layue13 e5df858725 Connect numeric backend addresses without DNS 2026-09-26 02:56:34 +08:00
layue13 ba06e0f7be Record post-transfer synthetic session baseline 2026-09-26 02:37:24 +08:00
layue13 883d439e6b Add diagnostics for intermittent initial login EOF 2026-09-26 02:34:31 +08:00
layue13 a09fc07726 Keep server views as registration snapshots 2026-09-26 02:07:09 +08:00
layue13 2eeb342d74 Exercise Forge round-trip through plugin transfer API 2026-09-26 01:41:20 +08:00
layue13 f0e9abdd57 Record current minimal Forge client transfer smoke 2026-09-26 01:17:34 +08:00
layue13 c909f6a0e2 Await session capacity release in disconnect tests 2026-09-26 01:04:06 +08:00
layue13 112efd839d Wait for capacity cleanup in backend close test 2026-09-26 00:56:37 +08:00