sno2wikiのAPI
今あるWS/HTTPのエンドポイント
http://api.sno2wiki.dev/docs/:id
これはドキュメントのパブリックな情報だけを取得できるエンドポイント
200. このIDに結びついたドキュメントはあって,取得可能
403. このIDに結びついたドキュメントはあるが,閲覧禁止
404. このIDに結びついたドキュメントは無い
http://api.sno2wiki.dev/docs/:id/check
おれはこのドキュメントをリアルタイムで閲覧/編集可能か?というのを判定する
ブラウザ側で認証情報を例えばJWTとかで持っておく
この状態でAuthorization: Bearer token付きでGETする(あるいは認証情報なしで)
200. 以下のどれかに該当する場合
このIDに結びついたドキュメントはある
あるいは,このIDに結びついたドキュメントは存在しないが,ユーザは新しくドキュメントを生成,編集する権限がある
更に,このドキュメントを編集可能ならticketが発行される
ticketは,ドキュメントIDとユーザーIDとランダムな値(nonce)のペアから生成されて認証サーバに保存される
nonceが無いと同一人物が複数端末で同じページを見ている時にSocketを区別出来ずに全端末死ぬ
コミット送信する度に,このticketを送りつける必要がある
ws-handlerは認証サーバにこのチケットって正しいですかねえと毎回確認する
ソケット切断時に,ticketは破棄されなければならない
404. 以下のどれかに該当する場合
存在するが,閲覧することは出来ない
存在しないし,新たに追加,編集する権限はない
まとめると
404 -> このドキュメントを閲覧することは出来ない!
200かつticketなし -> このドキュメントは見る専です
200かつticketあり -> このドキュメントは書き込み可です
ws://api.sno2wiki.dev/docs/:id/view
200かつticketなしならこれに接続する
サーバーから
PULL_DOCUMENTメッセージが送られてくるのでその度に随時更新
サーバーへ
接続時にJOINを送り,いまこのドキュメントを誰かが見てますよ〜というのを通知
サーバー側はドキュメントをDBから引っ張ってきたりキャッシュとかを用意する
ws://api.sno2wiki.dev/docs/:id/edit
200かつticketありならこれに接続する
サーバーから
PULL_DOCUMENTメッセージが送られてくるのでその度に随時更新(?)
サーバーへ
接続時にJOINを送る
PUSH_COMMITSメッセージを送って編集履歴を送ってドキュメントの更新を全員に通知させる