/// <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> /// JSON-RPC2リクエストを送信する。 /// </summary> /// <param name="method">メソッド名。</param> /// <param name="param">引数のJSONオブジェクト(MiniJSONで変換可能な型のみ)。</param> /// <returns>メソッドの戻り値。</returns> public IObservable <string> Call(string method, object param = null) { return(this.taskRunner.Enqueue <string>( this.ExceptionFilter( this.ObservableConn().SelectMany((conn) => conn.Call(method, param))))); }