/// <summary> /// WebSocket接続を現在の設定から接続する。 /// </summary> /// <returns>処理状態。</returns> private IObservable <Unit> Reconnect() { return(Observable.Defer(() => { try { // 既に接続済みの場合は一旦終了する this.Close(); // 接続を確立し、リクエスト受け取り用の処理を登録 var conn = new WebSocketRpcConnection(this.url); conn.Connect(); conn.RequestHandler = this.Receive; // 自動的にログインAPIも呼ぶ return conn.Call("login", new Dictionary <string, object>() { { "id", this.playerId }, { "token", this.token }, }).Select(_ => { // 確立したコネクションを保存 // TODO: OnCloseイベントなどに、コネクションエラー時の再接続を登録する this.conn = conn; return Unit.Default; }); } catch (Exception e) { return Observable.Throw <Unit>(e); } })); }
/// <summary> /// WebSocket接続を終了する。 /// </summary> public void Close() { var conn = this.conn; if (conn != null) { this.conn = null; conn.Close(); } }
/// <summary> /// JSON-RPC2リクエストを受け取る。 /// </summary> /// <param name="method">メソッド名。</param> /// <param name="param">引数。</param> /// <param name="id">ID。</param> /// <param name="conn">リクエストを受け取ったコネクション。</param> /// <returns>メソッドの戻り値。</returns> private async Task <object> Receive(string method, object param, object id, WebSocketRpcConnection conn) { // 登録されているメソッドを実行する WebSocketRpcConnection.RequestHandlerDelegate func; if (!this.Methods.TryGetValue(method, out func)) { throw new JsonRpc2Exception(JsonRpc2Exception.ErrorCode.MethodNotFound); } return(await func(method, param, id, conn)); }