カレンダーとスケジュール
Control Center は Google Calendar に接続し、あなたの一日の予定がフリートの隣に並ぶようにします。予定を同期し、月・週・日・アジェンダの各ビューに表示し、ミーティングの開始前に通知し、任意の予定を録音・要約されたミーティングに変えます。
Google 側で変更するもの
「Google 側で変更するもの」というセクションほとんど何も変更しません。このインテグレーションは予定を取り込んで表示するだけです。予定の作成、編集、削除、招待への返信は行いません。組み込みであれ持ち込みであれ、すべてのデバイスコード接続は calendar.readonly と openid email を要求します。
予定はサーバー上のワークスペース自身のデータベース(<dataDir>/<workspaceId>/workspace.db)に同期され、すべてのクライアントが RPC 経由で描画します。Google の資格情報を保持するクライアントはありません。
ワークスペースごとのアカウント
「ワークスペースごとのアカウント」というセクションカレンダーアカウントは、Control Center の他のすべてと同様にワークスペース単位です。各ワークスペースは独自の Google アカウント(複数でも可)を接続し、あるワークスペースの予定やトークンが別のワークスペースから見えることはありません。ワークスペースを切り替えると、表示されるカレンダーも切り替わります。
1 つのワークスペースは、仕事用と個人用など、複数の Google アカウントを接続でき、それらの予定は同じビューにマージされます。
サインインがデバイスコードである理由
「サインインがデバイスコードである理由」というセクションヘッドレスの cc_server には OAuth リダイレクトを受け取るブラウザーがありません。そのためリダイレクトは使わず、デバイスコードグラント(RFC 8628)で認可します。サーバーは短いユーザーコードと Google の URL を表示し、ブラウザーがある任意のデバイスで承認すると、サーバーは承認されるまでポーリングします。ヘッドレスインストールでアカウントを接続できるのは、ホストすべきリダイレクトエンドポイントが存在しないからです。
自分の資格情報を持ち込む前に知っておくべき帰結は次のとおりです。クライアントタイプは Google の「TV and Limited Input devices」でなければなりません。Google はそのクライアントタイプに許可リストのスコープしか付与せず、Calendar が許可されていないプロジェクトでは invalid_scope で失敗します。その場合は代わりにループバックまたは Web クライアントが必要です。
トークンがサーバーから出ることはありません。サーバーのデータディレクトリにある secrets.json に、google_google:<workspaceId>:<email> というキーで、データベースと同じ場所に、同じホストファイルシステムの信頼境界の下で書き込まれます。サーバーはアクセスを自動的に更新し、Google がアカウントを恒久的に無効化した場合(セッションが取り消されたか長期間失効した場合)は、CalendarAuthExpired を発行し、黙って失敗する代わりに再接続バナーを表示します。
ソースからのビルドには Google の資格情報が一切含まれません。クライアント ID とシークレットは自分で用意します。公式リリースビルドには機密性のないデバイスコードクライアントが組み込まれており、接続フローがすぐに機能します。サーバーが保存するのはそれを参照するマーカーだけで、コピーは保存しません。環境変数の GOOGLE_OAUTH_CLIENT_ID(およびそのシークレット)は、組み込みのペアより常に優先されます。--google-client-id フラグは意図的に存在しません。不明なフラグは無視され、コマンドライン上のシークレットは ps から読めてしまうためです。
独自の Google プロジェクトを実行する方法については、Google Calendar を接続を参照してください。
サーバーは、接続された各アカウントの予定のローリングウィンドウ(プライマリだけでなく、そのアカウントのすべてのカレンダー)を 2 分ごとに取得し、さらにオンデマンド(起動時、接続時、手動更新時)でも取得します。この短い間隔を許容できるのは、スキャンが増分式だからです。各カレンダーは独自の同期トークンを持つため、変更のないカレンダーのコストは 5 か月分のウィンドウを再取得するのではなく、ほぼ空のレスポンス 1 回で済みます。
繰り返し予定はサーバー側で展開されるため、クライアントが繰り返しルールを解析することはありません。現在のウィンドウ外の月に移動すると、その範囲が遅延読み込みされます。削除された予定や範囲外に移動した予定は、次の同期で整合が取られて消えます。
| ビュー | 表示内容 |
|---|---|
| 月 | 1 か月分のグリッド(kalender パッケージを使用) |
| 週 | 1 週間の時間指定の予定をタイムグリッドに表示 |
| 日 | 1 日の時間指定の予定をタイムグリッドに表示 |
| アジェンダ | 今後の予定のスクロール可能なリスト |
カレンダーは /calendar で開きます。予定を選択すると、その詳細が /calendar/:eventId で開きます。選択したビューはそのクライアント自身の設定に保存されるため、別のデバイスには引き継がれません。
ミーティングのアラート
「ミーティングのアラート」というセクション1 分ごとに実行されるスケジューラーが、設定可能なリード時間内に始まる予定をスキャンし、**「まもなく会議開始」**通知(MeetingStartingSoon ドメインイベント)を発火します。通知には参加 URL がある場合はそれが含まれ、クリックすると予定の詳細が開きます。アラートは予定の alertedAt に対して重複排除されるため、再起動をまたいでも同じミーティングが二重にアラートされることはなく、アプリが終了している間に開始時刻を過ぎた予定が後から再生されることもありません。
つまずきやすい制限が 2 つあります。スケジューラーはデスクトップのクライアント側で、現在開いているワークスペースに対してのみ実行されます。開いていないワークスペースではアラートは発生しません。また、Web ビルドには OS 通知のパイプラインがまったくないため、こちらもアラートは発生しません。
録音とリンク
「録音とリンク」というセクションカレンダーの予定から、その予定のタイトルを引き継いだミーティングの録音を開始できます。Control Center は録音と予定の間に 1 対 1 のリンクを保存するため、ミーティングのノートとカレンダーの項目は、どちらの機能が他方に依存することなく結び付いたままになります。
録音を開始してリンクはデスクトップ専用です。Web クライアントでは、この操作は録音を利用できないと報告します。ただし、ミーティング画面自体の録音フローはブラウザーでも機能します。
関連項目
「関連項目」というセクション- ミーティングと文字起こし: 録音を開始した後に何が起こるか
- ワークスペースと分離: カレンダーアカウントがワークスペース単位である理由
- ドメインイベント:
MeetingStartingSoonとCalendarAuthExpired - Google Calendar を接続
- ミーティングを録画して要約