本文へスキップ
目次・ページ一覧

開発者向け技術情報 / システム構成

資料配信とPowerPoint連携

資料の配信経路

講義中の表示位置はPostgreSQL、PDF本体はPrivate R2で管理する。学生端末とDisplayは講義状態から表示する資料とページを決め、Asset Workerを通してPDFを取得する。画面の映像を転送する方式ではなく、各ブラウザがPDFを描画する構成である。

表示位置とPDFの配信経路
講義の進行
教員画面 / Bridge

現在の資料・ページを更新

更新
PostgreSQL

資料ID・ページ位置

状態を返却
学生・Display

表示対象のページを決定

資料の取得
Private R2

PDF本体・公開状態

読出し
Asset Worker

閲覧権限・公開状態を検証

Range配信
学生・Display

必要なデータを取得・描画

Asset Workerは閲覧権限と公開状態を確認してからPDFを返す。HTTP Rangeに対応し、ブラウザは必要なバイト範囲を指定して取得できる。ページの変更通知にPDF本体を含める必要はない。

資料の公開手順

資料の追加は、アップロード、公開準備、配信側の有効化、DBへの確定という段階で進める。アップロード済みのファイルが、そのまま学生の閲覧対象になることはない。

DBと配信側の公開処理
Edge Functions / DB公開台帳・講義の資料一覧Asset Worker / R2PDF本体・配信用マニフェスト
ファイルの受信結果を台帳に記録←ハッシュ・容量を検証して保存
公開準備を指示→資料を非公開の状態で登録
公開先の世代番号を記録し、有効化を指示→公開状態と世代番号を更新
結果を照合し、資料一覧・世代番号・表示状態を一括確定←更新後の世代番号とETagを返す

R2側のマニフェストは、配信対象のファイルと公開状態を記録する一覧である。DB側の公開台帳は処理の進行を記録する。Edge Functionsが両者の応答を照合し、配信側の有効化を確認した後に、DBの資料一覧と講義の表示状態を更新する。

DBとR2の整合性

DBとR2は独立した保存先であり、両方の更新を一つのトランザクションで確定することはできない。そのため、公開処理の識別、競合する更新の検出、閲覧時の世代照合を組み合わせて整合性を保つ。

識別情報役割
公開ID・操作ID再試行が同じ公開処理であることを識別する。台帳と配信側の記録から完了済みの段階を確認する。
マニフェストのETag読み取り後に別の処理がマニフェストを更新していないかを照合する。公開の取り消し時にも確認する。
閲覧世代(access_version)閲覧チケットと配信側の公開状態を照合する。一致しない世代のチケットでは配信しない。

配信側の更新だけが完了し、応答が失われると、DBとR2の世代番号が一時的に一致しないことがある。この間は閲覧を拒否し、未確定の組み合わせで資料を返さない。同じIDで再試行すると、配信側の完了状態を確認してDBの確定へ進める。

講義終了後に届いた公開要求は取り消す。取り消しの際も対象資料・世代・ETagを確認し、後続の公開結果を上書きしない。終了・削除の記録は残し、遅れた要求で資料が再び公開されることを防ぐ。

PowerPoint連携

Windows上のPresenter Bridgeは、COMを通じてPowerPointの現在のスライドを観測する。対応するPDFのページ位置をGateway・Edge Functions経由でDBへ送り、ブラウザ操作と同じ講義状態の配信経路へ接続する。

PowerPointから講義状態への反映
  1. PowerPoint現在のスライドをCOMで取得
  2. Presenter Bridge送信待ちの位置を最新値に更新
  3. Gateway / DB資料の対応と要求の連番を確認
  4. 各端末講義状態を取得し、該当ページを表示

Bridgeは、送信中の位置、次に送る位置、サーバーで確認済みの位置を別々に保持する。送信中にスライドが進んだ場合は、待機中の位置を最新値へ置き換える。通信遅延で操作が蓄積しても、過去の位置を順番に送らず、現在位置へ追従する。

応答を確認できない要求は、未反映とは断定できない。そのため未確認の送信がある間は、現在位置が以前の確認済み位置と同じでも送信を省略しない。DB側では同一要求の再送を識別し、古い連番の更新は拒否する。

接続時に確認したPDFやPowerPointの内容が変わった場合は接続を失効させる。連携対象は対応付けた資料のページ位置であり、PowerPointのアニメーションや動画は配信しない。

実装参照 8件