v1.5.2 と v1.6.3 における CSA サーバーへの接続エラーに関する改善 - sunfish-shogi/electron-shogi GitHub Wiki

はじめに

v1.5.2 及び v1.6.3 では CSA サーバーへの接続が失敗した場合のエラー処理が改善されました。 (v1.7.0-alpha.4 以降にも同じ修正が含まれる予定です。)

以下、その内容を解説します。

改善前の動作

CSA サーバーへの接続を試みた際、ソケットの作成に失敗すると

A JavaScript error occured in the main process
Uncaught Exception:
(以下略)

という内容とともにメッセージボックスが表示されます。

スクリーンショット (29)

この状態が発生すると、自動再ログインを有効にしていてもメインプロセスの処理がブロックされるため、 OK ボタンを押してメッセージボックスを閉じるまでサーバーへの接続が再試行されません。

つまり、連続対局中に人が離席している状態でこの事象が発生すると、人が戻ってきて操作をするまで次の対局を開始できません。

改善後の動作

当該メッセージボックスは出現せず、 Electron 将棋の通常のエラーメッセージのみが表示され、サーバーへの接続が自動で再試行されます。

変更内容の技術的な詳細

CSA サーバーが落ちている等でソケットの作成に失敗すると uncaughtException イベントが発生し、デフォルト動作ではメッセージボックスを表示するようです。 これは Electron フレームワークの仕様だと思われます。 https://github.com/electron/electron/blob/v23.2.2/lib/browser/init.ts#L22-L38

今回の修正では Electron 将棋側で uncaughtException イベントをハンドリングして、 Electron 将棋のエラーメッセージ及びエラーログの処理に流すようにしました。 https://github.com/sunfish-shogi/electron-shogi/pull/456/files

その他、調査時のメモは https://github.com/sunfish-shogi/electron-shogi/issues/328 を参照してください。

v1.5 と v1.6 の違い

v1.5.2 と v1.6.3 のパッチバージョンアップデート自体は同じ内容ですが、再接続時の動作には v1.5 と v1.6 の間でもともと違いがあります。

v1.6 ではサーバーへの接続やログインを再試行する際に 10 秒のインターバルを設けています。また、インターバル中にキャンセルができるようになっています。

v1.5.x ではインターバルが無いため、 v1.5.2 でメッセージボックスが出なくなったことにより、サーバーに到達できない状態が継続すると高頻度で再試行を行います。