🤩

cowboy_websocket の call_result が変わっている

2020/11/18に公開

Cowboy の WebSocket の call_result が gen_server っぽい書き方から独自の書き方に(結構前に)切り替わっています。おそらく Cowboy 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-L44

-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()}.

Discussion