camphor- / relaym-server Goto Github PK
View Code? Open in Web Editor NEW🎧. RelaymのサーバーサイドAPI
Home Page: https://relaym.camph.net
License: MIT License
🎧. RelaymのサーバーサイドAPI
Home Page: https://relaym.camph.net
License: MIT License
曲を検索する /search
APIを実装
type
は track
https://github.com/camphor-/relaym-server/blob/master/docs/api.md#get-search
データベースに関するドキュメントを作成する。
devのdockerImage名をrelaym-server-devに変更する
prodとimage名を分けたいので、relaym-server-dev, relaym-server-prodにする
セッションのタイマーはオンメモリで持っているためサーバが再起動されるとなくなってしまう。
その対策として、WebSocket接続時にタイマーがないならタイマーを生成するというロジックを書いてある(コメントアウトしている)
https://github.com/camphor-/relaym-server/blob/master/usecase/session.go#L179-L193
ただ、この実装でうまくいくか分からないので、サーバを再起動したときにセッションのタイマーがちゃんと復活されるか確認したい。
SpotifyのOAuth2認証を行えるようにする。
ユーザの情報をDBに保存したり、アクセストークンを更新したりする処理はOut of Scopeです。 #11
非同期でリクエストされるのではなく、aタグで飛んできます。
内部で処理が終わったらSpotifyの認証画面にリダイレクトされます。
redirect_url
: Spotifyの認証が終わった後リダイレクトされるクライアントのURLを指定しますステータスコード | 説明 |
---|---|
302 | Spotifyの認証画面にリダイレクト |
Spotifyの認証が終わった際にリダイレクトされてくるAPIです。
ステータスコード | 説明 |
---|---|
302 | GET /login で受け取ったredirect_url にリダイレクト |
PUT /sessions/:id/playback
が500を返すようになった
ログイン後APIを叩くと必ず起きる
{"time":"2020-05-30T15:08:23.48358+09:00","level":"ERROR","prefix":"echo","file":"session.go","line":"126","message":"change playback: play sessionID=480f9793-40b4-44f7-abdf-8ba7c27980b0: call play api: token not found"}
{"time":"2020-05-30T15:08:23.483622+09:00","id":"","remote_ip":"::1","host":"relaym.local:8080","method":"PUT","uri":"/api/v3/sessions/480f9793-40b4-44f7-abdf-8ba7c27980b0/playback","user_agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36","status":500,"error":"code=500, message=Internal Server Error","latency":9130605,"latency_human":"9.130605ms","bytes_in":16,"bytes_out":36}
既に「次に再生される曲」に曲が詰まれてある状態でセッションを開始すると、 1曲目は新規の曲が再生されるが、残りのキューの曲は「次に再生される曲」の後に再生されてしまう。
このとき曲の順番は
A,C,Bとなってしまう。
<img src="https://user-images.githubusercontent.com/30015728/84969626-0b1c6180-b154-11ea-8dfa-6fa671605c66.png" width="300px")
PlayWithTracks()
で曲を追加すると、1曲目が「再生中」、それ以降が「再生待ち」に追加されるAddToQueue()
で追加すると「次に再生される曲」に追加される優先度は「次に再生される曲」の方が高いので、AddToQueue
の方が先に読まれてしまう。
PlayWithTracks()
の中で
Play()
で再生中にするAddToQueue
でキューに追加する実装に変更する
開発時に使えるdev環境を構築する
GET /users/me を実装 する。
https://github.com/camphor-/relaym-server/blob/master/docs/api.md#get-usersme
WebSocketを接続して数分たった後にメッセージを送信しようとするとエラーになる
細かいところは調査中
failed to WriteJSON: write tcp [::1]:8080->[::1]:52796: i/o timeout
まだ分からん
アプリケーションアーキテクチャに関するドキュメントを作成する。
GET /sessions/:idを実装を実装する
https://github.com/camphor-/relaym-server/blob/master/docs/api.md#get-sessionsid
同期チェックに失敗した後に、セッションを再開するときの復帰処理を実装する
https://github.com/camphor-/relaym-server/blob/master/docs/api.md#resume
復帰処理は #66 と処理が共通化できそう
https://github.com/camphor-/relaym-server/blob/master/domain/entity/track.go#L39
ログイン中のユーザのデバイス一覧を取得するAPIを作成します。
https://github.com/camphor-/relaym-server/blob/master/docs/api.md#get-usersmedevices
曲の追加などのイベントをWebSocketで送るエンドポイントを追加する
https://github.com/camphor-/relaym-server/blob/master/docs/api.md#get-wsid
POST /sessions/:id/queue
を実装する。
#14 の後
https://github.com/camphor-/relaym-server/blob/master/docs/api.md#post-sessionsidqueue
PUT /sessions/:id/devices
を実装する。
#14 の後
https://github.com/camphor-/relaym-server/blob/master/docs/api.md#put-sessionsiddevices
現在、 echoのロガーを使ってjsonのログを吐いているが、これだと他のパッケージでログを吐けない。
logging package を作るなどして、どこからでもログを吐けるようにする
Sessionの1曲目がSpotifyから再生できるようにする。
PLAY
だけでよい
https://github.com/camphor-/relaym-server/blob/master/docs/api.md#put-sessionsidplayback
https://github.com/camphor-/relaym-server/blob/master/docs/definition.md
Spotify側のアプリを操作されると同期が取れなくなるので、それをキャッチできるようにする
https://github.com/camphor-/relaym-server/blob/master/docs/api.md#interrupt
曲が終わった後、次の曲が再生されるようにする。
STOP
にするこのSpotify APIを使えばできそう
https://developer.spotify.com/documentation/web-api/reference-beta/#endpoint-add-to-queue
リピートがオンになってると、最後の曲の後ループしてしまう可能性があるので注意する
Echo dotで再生時、たまに曲が正常に始まるがRelaym側で再生状態にならない。
再生開始までに他のデバイスより時間がかかるのが原因…?
このとき再生順序が、
A,T,B,Cとなってしまう
#81 と合わせて良い感じの解決方法を考える必要がありそう
TODOでコメントしているデバイスIDを空にしてSpotify APIを叩いているところで、ちゃんとデバイスIDを使うようにする。
1曲目の再生スタート時に別の曲の再生途中だとその曲が流れてしまう 。
本来であればキューに追加した1曲目が再生されてほしい。
Add Queueを毎回しないことで対応した #70
GET /users/me/devices
を実装する。
ログインしているユーザがSpotifyを起動している端末を取得できる
GET https://api.spotify.com/v1/me/player/devices
https://developer.spotify.com/documentation/web-api/reference-beta/
https://github.com/camphor-/relaym-server/blob/master/docs/api.md#get-usersmedevices
デバイスがオフラインのときにE2Eテストを走らすと500が返ってくる
デバイスをオフラインにしてe2eを実行
{"time":"2020-06-18T16:11:41.555162+09:00","id":"","remote_ip":"::1","host":"relaym.local:8080","method":"GET","uri":"/api/v3/users/me","user_agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.97 Safari/537.36","status":200,"error":"","latency":242819690,"latency_human":"242.81969ms","bytes_in":0,"bytes_out":117}
{"time":"2020-06-18T16:11:41.784802+09:00","id":"","remote_ip":"::1","host":"relaym.local:8080","method":"GET","uri":"/api/v3/users/me/devices","user_agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.97 Safari/537.36","status":200,"error":"","latency":219288627,"latency_human":"219.288627ms","bytes_in":0,"bytes_out":115}
{"time":"2020-06-18T16:11:41.804416+09:00","id":"","remote_ip":"::1","host":"relaym.local:8080","method":"POST","uri":"/api/v3/sessions","user_agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.97 Safari/537.36","status":201,"error":"","latency":14292822,"latency_human":"14.292822ms","bytes_in":15,"bytes_out":221}
{"time":"2020-06-18T16:11:41.82208+09:00","level":"DEBUG","prefix":"application","file":"hub.go","line":"52","event":{"type":"ADDTRACK"},"message":"push message","sessionID":"a68456b1-5df3-4e97-b3ba-8a873c48c91c"}
{"time":"2020-06-18T16:11:41.822107+09:00","id":"","remote_ip":"::1","host":"relaym.local:8080","method":"POST","uri":"/api/v3/sessions/a68456b1-5df3-4e97-b3ba-8a873c48c91c/queue","user_agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.97 Safari/537.36","status":204,"error":"","latency":12141581,"latency_human":"12.141581ms","bytes_in":46,"bytes_out":0}
{"time":"2020-06-18T16:11:41.840561+09:00","level":"DEBUG","prefix":"application","file":"hub.go","line":"52","event":{"type":"ADDTRACK"},"message":"push message","sessionID":"a68456b1-5df3-4e97-b3ba-8a873c48c91c"}
{"time":"2020-06-18T16:11:41.84058+09:00","id":"","remote_ip":"::1","host":"relaym.local:8080","method":"POST","uri":"/api/v3/sessions/a68456b1-5df3-4e97-b3ba-8a873c48c91c/queue","user_agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.97 Safari/537.36","status":204,"error":"","latency":13396891,"latency_human":"13.396891ms","bytes_in":46,"bytes_out":0}
{"time":"2020-06-18T16:11:41.973607+09:00","level":"DEBUG","prefix":"application","file":"session.go","line":"133","message":"playORResume sessionID=a68456b1-5df3-4e97-b3ba-8a873c48c91c: call set repeat off api: spotify api: set repeat mode: Player command failed: No active device found: active device not found"}
{"time":"2020-06-18T16:11:41.973669+09:00","id":"","remote_ip":"::1","host":"relaym.local:8080","method":"PUT","uri":"/api/v3/sessions/a68456b1-5df3-4e97-b3ba-8a873c48c91c/playback","user_agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.97 Safari/537.36","status":403,"error":"code=403, message=active device not found","latency":128084718,"latency_human":"128.084718ms","bytes_in":16,"bytes_out":38}
{"time":"2020-06-18T16:11:47.086178+09:00","level":"DEBUG","prefix":"application","file":"sync_check_timer.go","line":"74","message":"stop timer","sessionID":"a68456b1-5df3-4e97-b3ba-8a873c48c91c"}
{"time":"2020-06-18T16:11:47.086232+09:00","level":"DEBUG","prefix":"application","file":"sync_check_timer.go","line":"84","message":"timer not existed","sessionID":"a68456b1-5df3-4e97-b3ba-8a873c48c91c"}
{"time":"2020-06-18T16:11:47.086327+09:00","level":"ERROR","prefix":"application","file":"session.go","line":"136","error":"pause sessionID=a68456b1-5df3-4e97-b3ba-8a873c48c91c: move to pause id=a68456b1-5df3-4e97-b3ba-8a873c48c91c: state type from STOP to Pause: change session state is not permits","message":"failed to change playback"}
{"time":"2020-06-18T16:11:47.086369+09:00","id":"","remote_ip":"::1","host":"relaym.local:8080","method":"PUT","uri":"/api/v3/sessions/a68456b1-5df3-4e97-b3ba-8a873c48c91c/playback","user_agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.97 Safari/537.36","status":500,"error":"code=500, message=Internal Server Error","latency":104997355,"latency_human":"104.997355ms","bytes_in":17,"bytes_out":36}
{"time":"2020-06-18T16:11:52.214022+09:00","level":"DEBUG","prefix":"application","file":"session.go","line":"133","message":"playORResume sessionID=a68456b1-5df3-4e97-b3ba-8a873c48c91c: call set repeat off api: spotify api: set repeat mode: Player command failed: No active device found: active device not found"}
{"time":"2020-06-18T16:11:52.214064+09:00","id":"","remote_ip":"::1","host":"relaym.local:8080","method":"PUT","uri":"/api/v3/sessions/a68456b1-5df3-4e97-b3ba-8a873c48c91c/playback","user_agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.97 Safari/537.36","status":403,"error":"code=403, message=active device not found","latency":111172704,"latency_human":"111.172704ms","bytes_in":16,"bytes_out":38}
{"time":"2020-06-18T16:11:52.239199+09:00","level":"DEBUG","prefix":"application","file":"hub.go","line":"52","event":{"type":"ADDTRACK"},"message":"push message","sessionID":"a68456b1-5df3-4e97-b3ba-8a873c48c91c"}
{"time":"2020-06-18T16:11:52.239242+09:00","id":"","remote_ip":"::1","host":"relaym.local:8080","method":"POST","uri":"/api/v3/sessions/a68456b1-5df3-4e97-b3ba-8a873c48c91c/queue","user_agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.97 Safari/537.36","status":204,"error":"","latency":18787554,"latency_human":"18.787554ms","bytes_in":46,"bytes_out":0}
session.queueが空の時にGET /sessions/:idが正常に動作しない
{"time":"2020-06-17T08:15:07.830573+09:00","level":"DEBUG","prefix":"echo","file":"session.go","line":"60","message":"getSession from db: get tracks: track_uris=[]: get track uris=[]: invalid id"}
仮実装として、ログインセッションをオンメモリで持つ実装をしていたが、これをMySQLで実装する。
なお、ドキュメントでRedisと書いていたが、ミドルウェアが増えると複雑になるのでMySQLに統一する。パフォーマンスが出ないならそのタイミングで移行を検討する
https://github.com/camphor-/relaym-server/blob/master/database/auth.go#L61-L67
アーキテクチャに関するドキュメントを作成する。
意図しないタイミングでInterruptが送られてくることがある
いまいち分かってない。
全ての再生が終わった後に、追加で曲を追加するとINTERRUPT送られてくる匂いを感じている。
その他のパターンもありそう
Sessionの曲を一時停止できるようにする。
PLAY
を送ることで再生が再開されるPAUSE
をしても成功のレスポンスを返すPAUSE
だけでよい
https://github.com/camphor-/relaym-server/blob/master/docs/api.md#put-sessionsidplayback
https://github.com/camphor-/relaym-server/blob/master/docs/definition.md
アクセストークンの有効期限が切れていたら、リフレッシュトークンを使って再度アクセストークンを取得する。
#11 の後
Goのoauth2 packageには有効期限を確かめるメソッドがあります。
https://pkg.go.dev/golang.org/x/oauth2?tab=doc#Token.Valid
Spotify APIのライブラリ側のissue
zmb3/spotify#108
Goのテストや静的解析を実行する。
全ての再生が終わった後再生を始めると1曲目から再生されてしまう 。
意図した挙動は、再生が終わった後に追加された曲が再生されること。
バルクでSpotifyに追加するときに、QueueHead以降のものだけを追加するように修正する
https://github.com/camphor-/relaym-server/blob/master/usecase/session.go#L120-L130
GetSessionで存在しないsessionIDを渡しても404でなく500が帰る
ref: https://github.com/camphor-/relaym-server/blob/master/docs/api.md#get-sessionsid
GetSessionで存在しないsessionIDを渡す
.playback.state.progress
がない
https://github.com/camphor-/relaym-server/blob/master/docs/api.md#get-sessionsid
セッションやキューを読み書きするリポジトリを実装する。
すこし重たいので、テーブル設計とrepositoryの実装でPRを分けたほうが良いです。
API仕様をみつつ必要なデータベースのカラムを考える。
OAuth成功時にアクセストークンをMySQLに保存する
/callback
のエンドポイントから保存する処理を呼ぶhttps://github.com/camphor-/relaym-server/pull/37#discussion_r422262759
利便性の面から、Spotifyにログインしていなくてもセッションに参加できるようにする。
https://github.com/camphor-/relaym-server/pull/37#discussion_r422252586
セッションの作成者しか再生の操作ができなかったが、参加者であれば誰でも操作できるようにする。
頑張ってProd環境を構築する
現状の仕組みだと、セッションのURLさえわかれば誰でも作成者のSpotifyを乗っとれてしまう。
使用後のURLがいつまでも有効なため、これは運用が長期に渡るほど問題になるので、対策を考えたい。
時々、1曲目を再生してから、2曲目に移行しない。
謎
Spotifyのプレイヤーを直接操作して以下のログがでてからうまく動作しなくなったので何かこの辺りの処理と関係があるのかもしれない。知らんけど…
&{d82dc39d-582f-4b8f-8c05-a3ddaf9e7646 test c7b07b1a-4014-46ea-b82f-a0ee113d0817 PLAY 2 [0xc000203770 0xc0002037a0 0xc0002037d0]}
session playing different track: queue track spotify:track:06QTSGUEgcmKwiEJ0IMPig, but playing track &{spotify:track:5uQ0vKy2973Y9IUCd1wMEF 5uQ0vKy2973Y9IUCd1wMEF 新芽探して 45.759s [0xc0003d77c0] https://open.spotify.com/track/5uQ073Y9IUCd1wMEF 0xc000203980}
この後の操作では
{"time":"2020-06-17T15:45:14.701279+09:00","id":"","remote_ip":"::1","host":"relaym.local:8080","method":"PUT","uri":"/api/v3/sessions/d82dc39d-582f-4b8f-8c05-a3ddaf9e7646/playback","user_agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.97 Safari/537.36","status":202,"error":"","latency":816014511,"latency_human":"816.014511ms","bytes_in":16,"bytes_out":0}
39.855s
{"time":"2020-06-17T15:45:26.626008+09:00","id":"","remote_ip":"::1","host":"relaym.local:8080","method":"GET","uri":"/api/v3/sessions/d82dc39d-582f-4b8f-8c05-a3ddaf9e7646/","user_agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.97 Safari/537.36","status":200,"error":"","latency":321468887,"latency_human":"321.468887ms","bytes_in":0,"bytes_out":1574}
&{d82dc39d-582f-4b8f-8c05-a3ddaf9e7646 test c7b07b1a-4014-46ea-b82f-a0ee113d0817 PLAY 1 [0xc000202a80 0xc000202ab0]}
13.523s
{"time":"2020-06-17T15:46:22.245677+09:00","id":"","remote_ip":"::1","host":"relaym.local:8080","method":"POST","uri":"/api/v3/sessions/d82dc39d-582f-4b8f-8c05-a3ddaf9e7646/queue","user_agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.97 Safari/537.36","status":204,"error":"","latency":209221479,"latency_human":"209.221479ms","bytes_in":46,"bytes_out":0}
&{d82dc39d-582f-4b8f-8c05-a3ddaf9e7646 test c7b07b1a-4014-46ea-b82f-a0ee113d0817 PLAY 2 [0xc000203770 0xc0002037a0 0xc0002037d0]}
session playing different track: queue track spotify:track:06QTSGUEgcmKwiEJ0IMPig, but playing track &{spotify:track:5uQ0vKy2973Y9IUCd1wMEF 5uQ0vKy2973Y9IUCd1wMEF 新芽探して 45.759s [0xc0003d77c0] https://open.spotify.com/track/5uQ073Y9IUCd1wMEF 0xc000203980}
{"time":"2020-06-17T15:46:39.765812+09:00","id":"","remote_ip":"::1","host":"relaym.local:8080","method":"GET","uri":"/api/v3/users/me","user_agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.97 Safari/537.36","status":200,"error":"","latency":89650218,"latency_human":"89.650218ms","bytes_in":0,"bytes_out":140}
{"time":"2020-06-17T15:46:39.865782+09:00","id":"","remote_ip":"::1","host":"relaym.local:8080","method":"GET","uri":"/api/v3/users/me/devices","user_agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.97 Safari/537.36","status":200,"error":"","latency":94237935,"latency_human":"94.237935ms","bytes_in":0,"bytes_out":315}
{"time":"2020-06-17T15:46:39.885708+09:00","id":"","remote_ip":"::1","host":"relaym.local:8080","method":"POST","uri":"/api/v3/sessions","user_agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.97 Safari/537.36","status":201,"error":"","latency":13059394,"latency_human":"13.059394ms","bytes_in":15,"bytes_out":227}
{"time":"2020-06-17T15:46:39.904446+09:00","id":"","remote_ip":"::1","host":"relaym.local:8080","method":"POST","uri":"/api/v3/sessions/56c75adc-3d94-4ae7-8f37-a8ade1668983/queue","user_agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.97 Safari/537.36","status":204,"error":"","latency":13486792,"latency_human":"13.486792ms","bytes_in":46,"bytes_out":0}
{"time":"2020-06-17T15:46:39.923466+09:00","id":"","remote_ip":"::1","host":"relaym.local:8080","method":"POST","uri":"/api/v3/sessions/56c75adc-3d94-4ae7-8f37-a8ade1668983/queue","user_agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.97 Safari/537.36","status":204,"error":"","latency":13254183,"latency_human":"13.254183ms","bytes_in":46,"bytes_out":0}
{"time":"2020-06-17T15:46:40.859771+09:00","id":"","remote_ip":"::1","host":"relaym.local:8080","method":"PUT","uri":"/api/v3/sessions/56c75adc-3d94-4ae7-8f37-a8ade1668983/playback","user_agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.97 Safari/537.36","status":202,"error":"","latency":931340476,"latency_human":"931.340476ms","bytes_in":16,"bytes_out":0}
40.064s
{"time":"2020-06-17T15:46:49.226604+09:00","id":"","remote_ip":"::1","host":"relaym.local:8080","method":"GET","uri":"/api/v3/sessions/56c75adc-3d94-4ae7-8f37-a8ade1668983/","user_agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.97 Safari/537.36","status":200,"error":"","latency":162861151,"latency_human":"162.861151ms","bytes_in":0,"bytes_out":1576}
{"time":"2020-06-17T15:47:54.792113+09:00","id":"","remote_ip":"::1","host":"relaym.local:8080","method":"GET","uri":"/api/v3/sessions/56c75adc-3d94-4ae7-8f37-a8ade1668983/","user_agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.97 Safari/537.36","status":200,"error":"","latency":179408490,"latency_human":"179.40849ms","bytes_in":0,"bytes_out":1576}
{"time":"2020-06-17T15:47:59.326295+09:00","id":"","remote_ip":"::1","host":"relaym.local:8080","method":"GET","uri":"/api/v3/users/me","user_agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.97 Safari/537.36","status":200,"error":"","latency":176662558,"latency_human":"176.662558ms","bytes_in":0,"bytes_out":140}
{"time":"2020-06-17T15:47:59.484326+09:00","id":"","remote_ip":"::1","host":"relaym.local:8080","method":"GET","uri":"/api/v3/users/me/devices","user_agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.97 Safari/537.36","status":200,"error":"","latency":153041961,"latency_human":"153.041961ms","bytes_in":0,"bytes_out":315}
{"time":"2020-06-17T15:47:59.505681+09:00","id":"","remote_ip":"::1","host":"relaym.local:8080","method":"POST","uri":"/api/v3/sessions","user_agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.97 Safari/537.36","status":201,"error":"","latency":14128185,"latency_human":"14.128185ms","bytes_in":15,"bytes_out":227}
{"time":"2020-06-17T15:47:59.525643+09:00","id":"","remote_ip":"::1","host":"relaym.local:8080","method":"POST","uri":"/api/v3/sessions/8ad2607c-ba7d-404a-bbac-daee0ac6b9b0/queue","user_agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.97 Safari/537.36","status":204,"error":"","latency":14841316,"latency_human":"14.841316ms","bytes_in":46,"bytes_out":0}
{"time":"2020-06-17T15:47:59.548645+09:00","id":"","remote_ip":"::1","host":"relaym.local:8080","method":"POST","uri":"/api/v3/sessions/8ad2607c-ba7d-404a-bbac-daee0ac6b9b0/queue","user_agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.97 Safari/537.36","status":204,"error":"","latency":17015741,"latency_human":"17.015741ms","bytes_in":46,"bytes_out":0}
{"time":"2020-06-17T15:48:00.718509+09:00","id":"","remote_ip":"::1","host":"relaym.local:8080","method":"PUT","uri":"/api/v3/sessions/8ad2607c-ba7d-404a-bbac-daee0ac6b9b0/playback","user_agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.97 Safari/537.36","status":202,"error":"","latency":1164800978,"latency_human":"1.164800978s","bytes_in":16,"bytes_out":0}
40.059s
{"time":"2020-06-17T15:48:09.176102+09:00","id":"","remote_ip":"::1","host":"relaym.local:8080","method":"GET","uri":"/api/v3/sessions/8ad2607c-ba7d-404a-bbac-daee0ac6b9b0/","user_agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.97 Safari/537.36","status":200,"error":"","latency":246266488,"latency_human":"246.266488ms","bytes_in":0,"bytes_out":1576}
{"time":"2020-06-17T15:49:15.252935+09:00","id":"","remote_ip":"::1","host":"relaym.local:8080","method":"GET","uri":"/api/v3/sessions/8ad2607c-ba7d-404a-bbac-daee0ac6b9b0/","user_agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.97 Safari/537.36","status":200,"error":"","latency":512515585,"latency_human":"512.515585ms","bytes_in":0,"bytes_out":1576}
{"time":"2020-06-17T15:49:38.428509+09:00","id":"","remote_ip":"::1","host":"relaym.local:8080","method":"GET","uri":"/api/v3/users/me","user_agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.97 Safari/537.36","status":200,"error":"","latency":485544353,"latency_human":"485.544353ms","bytes_in":0,"bytes_out":140}
{"time":"2020-06-17T15:49:38.780333+09:00","id":"","remote_ip":"::1","host":"relaym.local:8080","method":"GET","uri":"/api/v3/users/me/devices","user_agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.97 Safari/537.36","status":200,"error":"","latency":345794954,"latency_human":"345.794954ms","bytes_in":0,"bytes_out":315}
{"time":"2020-06-17T15:49:38.806689+09:00","id":"","remote_ip":"::1","host":"relaym.local:8080","method":"POST","uri":"/api/v3/sessions","user_agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.97 Safari/537.36","status":201,"error":"","latency":17035711,"latency_human":"17.035711ms","bytes_in":15,"bytes_out":227}
{"time":"2020-06-17T15:49:38.82734+09:00","id":"","remote_ip":"::1","host":"relaym.local:8080","method":"POST","uri":"/api/v3/sessions/fed77ba2-349a-4df4-b3de-b183158a09d7/queue","user_agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.97 Safari/537.36","status":204,"error":"","latency":15296904,"latency_human":"15.296904ms","bytes_in":46,"bytes_out":0}
{"time":"2020-06-17T15:49:38.848952+09:00","id":"","remote_ip":"::1","host":"relaym.local:8080","method":"POST","uri":"/api/v3/sessions/fed77ba2-349a-4df4-b3de-b183158a09d7/queue","user_agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.97 Safari/537.36","status":204,"error":"","latency":14024337,"latency_human":"14.024337ms","bytes_in":46,"bytes_out":0}
{"time":"2020-06-17T15:49:40.32785+09:00","id":"","remote_ip":"::1","host":"relaym.local:8080","method":"PUT","uri":"/api/v3/sessions/fed77ba2-349a-4df4-b3de-b183158a09d7/playback","user_agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.97 Safari/537.36","status":202,"error":"","latency":1473746135,"latency_human":"1.473746135s","bytes_in":16,"bytes_out":0}
39.967s
{"time":"2020-06-17T15:49:49.19527+09:00","id":"","remote_ip":"::1","host":"relaym.local:8080","method":"GET","uri":"/api/v3/sessions/fed77ba2-349a-4df4-b3de-b183158a09d7/","user_agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.97 Safari/537.36","status":200,"error":"","latency":809213462,"latency_human":"809.213462ms","bytes_in":0,"bytes_out":1574}
{"time":"2020-06-17T15:50:55.69981+09:00","id":"","remote_ip":"::1","host":"relaym.local:8080","method":"GET","uri":"/api/v3/sessions/fed77ba2-349a-4df4-b3de-b183158a09d7/","user_agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.97 Safari/537.36","status":200,"error":"","latency":184547215,"latency_human":"184.547215ms","bytes_in":0,"bytes_out":1574}
{"time":"2020-06-17T15:50:59.454844+09:00","id":"","remote_ip":"::1","host":"relaym.local:8080","method":"GET","uri":"/api/v3/sessions/fed77ba2-349a-4df4-b3de-b183158a09d7/","user_agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.97 Safari/537.36","status":200,"error":"","latency":168935218,"latency_human":"168.935218ms","bytes_in":0,"bytes_out":1574}
{"time":"2020-06-17T15:51:10.425086+09:00","id":"","remote_ip":"::1","host":"relaym.local:8080","method":"GET","uri":"/api/v3/sessions/fed77ba2-349a-4df4-b3de-b183158a09d7/","user_agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.97 Safari/537.36","status":200,"error":"","latency":251831403,"latency_human":"251.831403ms","bytes_in":0,"bytes_out":1574}
{"time":"2020-06-17T15:51:12.777558+09:00","id":"","remote_ip":"::1","host":"relaym.local:8080","method":"GET","uri":"/api/v3/sessions/fed77ba2-349a-4df4-b3de-b183158a09d7/","user_agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.97 Safari/537.36","status":200,"error":"","latency":237854461,"latency_human":"237.854461ms","bytes_in":0,"bytes_out":1574}
{"time":"2020-06-17T15:51:42.946031+09:00","id":"","remote_ip":"::1","host":"relaym.local:8080","method":"GET","uri":"/api/v3/sessions/fed77ba2-349a-4df4-b3de-b183158a09d7/","user_agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.97 Safari/537.36","status":200,"error":"","latency":366246073,"latency_human":"366.246073ms","bytes_in":0,"bytes_out":1574}
{"time":"2020-06-17T15:52:21.298962+09:00","id":"","remote_ip":"::1","host":"relaym.local:8080","method":"GET","uri":"/api/v3/users/me","user_agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.97 Safari/537.36","status":200,"error":"","latency":210370044,"latency_human":"210.370044ms","bytes_in":0,"bytes_out":140}
{"time":"2020-06-17T15:52:21.473713+09:00","id":"","remote_ip":"::1","host":"relaym.local:8080","method":"GET","uri":"/api/v3/users/me/devices","user_agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.97 Safari/537.36","status":200,"error":"","latency":167234508,"latency_human":"167.234508ms","bytes_in":0,"bytes_out":315}
{"time":"2020-06-17T15:52:21.495944+09:00","id":"","remote_ip":"::1","host":"relaym.local:8080","method":"POST","uri":"/api/v3/sessions","user_agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.97 Safari/537.36","status":201,"error":"","latency":15736408,"latency_human":"15.736408ms","bytes_in":15,"bytes_out":227}
{"time":"2020-06-17T15:52:21.514833+09:00","id":"","remote_ip":"::1","host":"relaym.local:8080","method":"POST","uri":"/api/v3/sessions/e16b726b-1402-4a42-9847-86a7038206fc/queue","user_agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.97 Safari/537.36","status":204,"error":"","latency":13255847,"latency_human":"13.255847ms","bytes_in":46,"bytes_out":0}
{"time":"2020-06-17T15:52:21.534664+09:00","id":"","remote_ip":"::1","host":"relaym.local:8080","method":"POST","uri":"/api/v3/sessions/e16b726b-1402-4a42-9847-86a7038206fc/queue","user_agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.97 Safari/537.36","status":204,"error":"","latency":14984152,"latency_human":"14.984152ms","bytes_in":46,"bytes_out":0}
{"time":"2020-06-17T15:52:22.628305+09:00","id":"","remote_ip":"::1","host":"relaym.local:8080","method":"PUT","uri":"/api/v3/sessions/e16b726b-1402-4a42-9847-86a7038206fc/playback","user_agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.97 Safari/537.36","status":202,"error":"","latency":1087790486,"latency_human":"1.087790486s","bytes_in":16,"bytes_out":0}
40.009s
{"time":"2020-06-17T15:52:55.845103+09:00","id":"","remote_ip":"::1","host":"relaym.local:8080","method":"GET","uri":"/api/v3/sessions/e16b726b-1402-4a42-9847-86a7038206fc/","user_agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.97 Safari/537.36","status":200,"error":"","latency":332134364,"latency_human":"332.134364ms","bytes_in":0,"bytes_out":1574}
(途中からおかしい)
わからん
sessionのもつDeviceIDからデバイスの情報を取得しGET /sessions/:idの際に一緒に返す
(現状todoになってる部分)
ref #14
https://github.com/camphor-/relaym-server/blob/master/docs/api.md#get-sessionsid
ローカル開発環境に関するドキュメントを作成する。
溜まっている雑多なTODOコメントを消化
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.