loading...

cowboy_websocket の call_result が変わっている

voluntas profile image voluntas ・1 min read

Cowboy の WebSocket の call_result が gen_server っぽい書き方から独自の書き方に(結構前に)切り替わっています。おそらく 3.0 で今の書き方が deprecated になると思うので、準備しておきましょう。

{ok, State}{reply, [frame()], State} から {[], State} という [] ベースの書き方になりました。この [] の中にコマンドを追加していきます。

text の値を戻す場合は {text, <<"abc">>} とかを入れます。何もしないときは [] のままです。

終了するときは close フレームを投げます。今まであった stop はもうなくなりましたので、終了する場合はかならず close フレームを投げる必要があります。これ相当良い変更だと思います。

{[{close, Code, Reason}], State} 感じです。 Code は WebSocket の RFC を読むと良いです。

https://triple-underscore.github.io/RFC6455-ja.html#section-7.1.5

簡単に書き換えられるので早いうちに書き換えていきましょう。

参考

call_result

https://github.com/ninenines/cowboy/blob/master/src/cowboy_websocket.erl#L30-L38

-type commands() :: [cow_ws:frame()
    | {active, boolean()}
    | {deflate, boolean()}
    | {set_options, map()}
    | {shutdown_reason, any()}
].
-export_type([commands/0]).

-type call_result(State) :: {commands(), State} | {commands(), State, hibernate}.

-type deprecated_call_result(State) :: {ok, State}
    | {ok, State, hibernate}
    | {reply, cow_ws:frame() | [cow_ws:frame()], State}
    | {reply, cow_ws:frame() | [cow_ws:frame()], State, hibernate}
    | {stop, State}.

cow_ws:frame()

https://github.com/ninenines/cowlib/blob/master/src/cow_ws.erl#L57

-type frame() :: close | ping | pong
    | {text | binary | close | ping | pong, iodata()}
    | {close, close_code(), iodata()}
    | {fragment, fin | nofin, text | binary | continuation, iodata()}.

Posted on by:

voluntas profile

voluntas

@voluntas

A software developer using Erlang/OTP at work. Founder of 時雨堂 (shiguredo).

Discussion

pic
Editor guide