Skip to content

refactor: 全体を見直して、ずれを直し、使っていないコードを片づける - #62

Merged
5ym merged 6 commits into
mainfrom
chore/review
Oct 12, 2026
Merged

5ym merged 6 commits into
mainfrom
chore/review

Conversation

@5ym

@5ym 5ym commented Oct 12, 2026

Copy link
Copy Markdown
Contributor

3 つに分けて見直した(サーバー、画面の復号と描画、接続と中継)。動きは変えていない。直したバグは統計とログの小さなものだけ。

サーバー

  • QUIC のコールバックで出た例外が、どこにも残っていなかった。ログに書く
  • 自動更新の MSI のログが、data_dir を変えると mado.log と別の場所になっていた
  • /ws と /wt の中継の後始末を Relay.Serve にまとめた(ログと数え方がずれていた)
  • 使っていないもの(datagram の送信など)を外し、中間証明書の取り出しなど重なっていた処理をまとめた。5972 → 5905 行

画面の復号と描画

  • タイルを矩形で切る処理(3 か所)、矩形の重なり、BGRA→RGBA、YUV444 の CPU 版の共通部分をまとめた
  • 試験でしか使っていなかった ProgressiveDecoder を消した
  • AVC444 の時間の統計が 1ms 未満を切り捨てて足していた
  • 約 6368 → 6295 行

接続と中継

  • コメントのずれを 9 か所直した(connectionType は常に LAN、GFX は H.264 なしでも使う、など)
  • 使っていないコードと定数を消し、同じ処理をまとめた。5563 → 5509 行

そのほか

  • トレイ: 自動更新が止まっているとき「最新は 」と空の版を出していた
  • README / docs: AVC444 の時間、connectionType と見た目の指定、送る量を減らす工夫、listen とファイアウォール、/status の中身、/logout、MSI のログの場所
  • 試験用 mini-mado を今の Relay に合わせた

試験: .NET 89 件、web 298 件、tsc、biome、build:web。Windows の実機での確認はまだ(試験用 VM が止まっている)。

🤖 Generated with Claude Code

https://claude.ai/code/session_01M2BadDnB3uH3FDGjaPMP4J

5ym and others added 5 commits October 12, 2026 19:57
- 自動検出を頼まないときも connectionType は LAN。mcs.ts のコメントを直す
- GFX を H.264 と書いていたコメントを直す(connect.ts、channels.ts)
- establish() は WebSocket だけでなく WebTransport からも来る。コメントを直す
- 使っていないものを消す: RdpClient.errorInfo、ChunkStream.isClosed、
  Clipboard.remoteHasText、PDUTYPE / PDUTYPE2 / CONTROL / PROTOCOL の使わない値
- 中だけで使うものは export しない(pdu.ts の RFX まわり、cliprdr.ts、input.ts の PTR など)
- 重なりを減らす: トークンの取得、中止のときの文言と後片付け、ChunkStream の待ち、
  RdpClient のチャネルへの送信、診断の GFX の行
- NTLM の unseal の文言、ツールのコメントを直す

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01M2BadDnB3uH3FDGjaPMP4J
- タイルを矩形で切る処理が 3 か所にあったのを rfx.ts の cutTile にまとめる(GFX の RemoteFX、Progressive、Surface Commands)
- 試験でしか使っていなかった ProgressiveDecoder を消す。試験は ProgressiveTiles と ProgressiveFrame で gfx.ts と同じ道を通す
- Progressive の通常の帯の表を rfx.ts の BANDS と共用する
- 矩形の重なりを gfx.ts の clipRect にまとめ、clampRects も gfx.ts へ移す
- Yuv444 と Yuv444GlRef の共通部分(3 面、draw、close)を基底クラスにまとめる。evenRect の繰り返しを evenRects にする
- 32 ビットの BGRA から RGBA への変換を bitmap.ts の bgraToRgba にまとめる。LITTLE_ENDIAN も 1 つにする
- GfxClient の totalFrames を stats.frames にまとめる。面を捨てるときの処理を forgetSurface にまとめる
- MapSurfaceToOutput と MapSurfaceToScaledOutput の同じ処理をまとめる
- AVC444 の時間の統計を 1 回ごとに丸めていたのをやめる。1ms 未満が 0 に切り捨てられて合計が小さく出ていた
- Surface Commands の使わない destRight / destBottom を引数から外す
- ポインタの効かない分岐、autoscale の重なった条件、ClearCodec の余分な代入を消す
- コメントを短い文に直す

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01M2BadDnB3uH3FDGjaPMP4J
- /ws と /wt の中継の後始末を Relay.Serve にまとめる。接続の数、開け閉めのログ、思わぬ誤りのログを同じにする
- QUIC の接続のコールバックで出た例外を捨てていたのを、ログに残す(OnShutdown を誰も付けていなかった)
- 自動更新の MSI のログを mado.log と同じ logs に置く。data_dir を変えたときに場所がずれていた
- 使っていないものを外す: datagram の送信、ReadSettings、PeerSettings、セッションの Authority / Gate / IsClosed、
  RelayTokens.TtlSeconds、H3 の使っていない定数、ApiJson の使っていない型
- 中間証明書の取り出しを Acme.Intermediates にまとめる。DaysLeft で証明書を Dispose する
- 待ち受けのアドレスの解釈、401 の返事、WebAssets の有無の確かめと返すのを 1 か所にする
- コメントを直す: 宙に浮いていた QUIC_ADDR の説明、ApiJson の説明(ACME は使わない)、Qpack の文字列、
  Program.cs の道の一覧(/logout と /update)、csproj の libmsquic、wxs のビルド例の版

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01M2BadDnB3uH3FDGjaPMP4J
@claude

claude Bot commented Oct 12, 2026 •

Copy link
Copy Markdown

Claude finished @5ym's task in 27s —— View job


レビュー結果

主にサーバー側(Relay.Serve、QUIC、Updater、トレイ)の差分を読んだ。web 側 (web/rdp/*) の差分は読んでいない。そこはテストと tsc に任せる。ビルドとテストも走らせていない。

指摘するほどの不具合は見つからなかった。

確認できた点:

  • Relay.Serve: sessions(+1) / sessions(-1) と open/close ログが try/finally で対になっている。/ws と /wt で数え方とログが揃う。Serve_は数を戻して開け閉めをログに残す というテストも追加されている。
  • QuicConnection.OnError: 例外を握りつぶさず webtransport: コールバックで例外 としてログに出す。WebTransport.cs:75 で配線済み。
  • s.Abort(0x100) → H3.NoError: 値は同じ 0x100 (Http3.cs:149) なので動作は変わらない。
  • MSI ログの場所: Updater に logDir を渡すようにし、mado.log と同じ場所になった。Program.cs:60 とテストの呼び出しも更新済み。
  • Acme.Intermediates: 先頭を葉証明書とみなして外す。以前の Thumbprint 比較より単純。ACME が返す PEM は葉が先頭なので問題ない。
  • トレイの空の版: 最新版が空のときは専用のメッセージを返す。

要確認(軽微)

  • Acme.Intermediates は PEM の先頭が葉であることを前提にしている。ACME 以外の PEM を読み込む経路があるなら、順序の保証を確認するとよい。
  • PR 本文にあるとおり、Windows 実機での確認がまだ。QUIC 周りの構造体 (QuicConnectionEvent) を削ったので、実機で WebTransport の接続を一度確かめてからマージするとよい。

テスト: Serve の新規テストは妥当。トレイの空の版の分岐と MSI ログの場所には新しいテストがない。トレイは UI 側なので、無くても許容範囲。

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01M2BadDnB3uH3FDGjaPMP4J
@claude

claude Bot commented Oct 12, 2026 •

Copy link
Copy Markdown

Claude finished @5ym's task in 21s —— View job


レビュー結果

サーバー側に加えて、web 側の yuv444.ts / rfx.ts / bitmap.ts の差分も読んだ。ビルドとテストは走らせていない。

指摘するべき不具合は見つからなかった。

  • cutTile: 幅が TILE のときは subarray で切り出して写さない。yccToRgba はタイルごとに新しい Uint8ClampedArray を作るので、使い回しによる上書きは起きない。
  • bgraToRgba: bitmap.ts が rfx.ts から LITTLE_ENDIAN を import する。rfx.ts 側は bytes しか import していないので循環はない。
  • Yuv444 / Yuv444GlRef: 共通部分を CpuYuv444 に移した。draw / close / 初期値(Y=0、U=V=128)は元と同じ。evenRects は元のループと同じ結果になる。
  • clampRects: yuv444.ts からは消したが、gfx.ts に同名の関数が残っていて、テストもそちらを参照している。
  • サーバー: 前回のレビューで挙げた Relay.Serve、QUIC の OnError、Updater の logDir は、読んだ範囲では問題なかった。

要確認(軽微)

  • Acme.Intermediates は、PEM の先頭が葉証明書であることを前提にしている。ACME の応答ならそのとおりだが、ほかの経路から PEM を読むなら順序を確認してほしい。
  • Windows 実機での確認がまだ。QuicConnectionEvent まわりの構造体を削ったので、マージ前に WebTransport の接続を一度確かめてほしい。

テスト

  • Serve の新規テストは妥当。
  • ProgressiveDecoder の削除に合わせて progressive.test.ts も更新されている。
  • トレイの空の版の分岐と MSI のログの場所には新しいテストがない。UI 側とパス決めなので、無くても許容範囲。

@5ym
5ym merged commit a2f1d50 into main Oct 12, 2026
3 checks passed
@5ym
5ym deleted the chore/review branch October 12, 2026 11:30
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant