Tablebox ドキュメントサイト English

プロジェクトの管理

Manager は PaaS の側を保ちます。プロジェクト、キー、リンク、環境変数、取り外し、閉鎖、使用量、上限です。Console か管理 API で使います。人がやり取りするものは Relay を通り、Manager はその道筋には入りません。

Console

Console には GitHub でサインインし、自分のプロジェクトを、英語か日本語で、デスクトップでもスマホでも見て管理します。プロジェクト、キー、リンク、環境変数の削除、参加者の取り外し、範囲の閉鎖は、どれも先に確認を求めます。

画面 見せるもの すること
プロジェクト一覧 各プロジェクトの名前、状態、今月のバイト数 プロジェクトを作る、開く
プロジェクト ID、Relay の URL、状態、上限 名前を変える、削除する、月間のバイト数と接続数の上限を決める
キー ID と作成日時 キーを作る(シークレットは一度だけ表示)、削除する
リンク ID、ルート、パターン、作成日時 リンクを作る、ID をコピーする、削除する
環境変数 名前と更新日時 値を設定する・置き換える、削除する
参加者 取り外し: sub、パス、日時 sub を、パスを限って取り外すこともできる
範囲 閉鎖: パス、日時 パスを閉じる
使用量 選んだ月の日ごとの送受信バイト数、接続分数、最大同時接続数。月の合計と上限

パスとパターンは、API と同じく、プロジェクトのルートからの相対で入力します。

管理 API

API は Manager API のアドレス(リファレンス)の /v1 にあり、本体は JSON です。呼び出しはキーで認証し(Authorization: Basic base64({key id}:{secret}))、そのキーのプロジェクトに働きます。Console はセッションで呼びます。エラーは HTTP のステータスと {"code", "message"} で、bad-request(400。message が誤った項目を示す)、unauthenticated(401)、forbidden(403。キーでプロジェクトを一覧・作成しようとした)、not-found(404。管理していないプロジェクトにも)、internal(500)です。

呼び出し 本体 結果
GET /projects, POST /projects(Console だけ) {name} [Project], Project
GET, PATCH, DELETE /projects/{p} {name?, limits?} Project
GET /projects/{p}/keys, POST [{id, created}], {id, secret, created}
DELETE /projects/{p}/keys/{id}
GET /projects/{p}/links, POST {root, publish, subscribe} [Link], Link
DELETE /projects/{p}/links/{id}
GET /projects/{p}/variables [{name, updated}]
PUT /projects/{p}/variables/{name}, DELETE {value}
GET /projects/{p}/removals, POST {sub, path?} [{sub, path, at}], その取り外し
GET /projects/{p}/closings, POST {path} [{path, at}], その閉鎖
GET /projects/{p}/usage?from={day}&to={day} [{day, bytesIn, bytesOut, seconds, peakConnections}]
TypeScript(Node) · manage.ts
// The management API with a project key: a link, a variable, a limit, a removal, a closing and this month's usage.
const auth = `Basic ${btoa(`${process.env.TABLEBOX_KEY_ID}:${process.env.TABLEBOX_KEY_SECRET}`)}`;
const project = `${process.env.TABLEBOX_MANAGER_URL}/v1/projects/${process.env.TABLEBOX_PROJECT}`;

async function call(method: string, path: string, body?: unknown) {
  const reply = await fetch(project + path, {
    method, headers: { authorization: auth, 'content-type': 'application/json' }, body: JSON.stringify(body),
  });
  if (!reply.ok) throw new Error(`${method} ${path}: ${reply.status} ${await reply.text()}`);
  return reply.status === 204 ? undefined : reply.json();
}

const link = await call('POST', '/links', { root: 'rooms/42', publish: ['{id}/**'], subscribe: ['**'] });
console.log(`link ${link.id} for rooms/42`);
await call('PUT', '/variables/STORAGE_BUCKET', { value: 'my-bucket' });
await call('PATCH', '', { limits: { connections: 1_000 } });
await call('POST', '/removals', { sub: 'mallory', path: 'rooms/42' });
await call('POST', '/closings', { path: 'rooms/41' });
const today = new Date().toISOString().slice(0, 10);
console.log(await call('GET', `/usage?from=${today.slice(0, 8)}01&to=${today}`));

キー、リンク、環境変数

取り外しと閉鎖

上限と使用量

月間のバイト数の上限(UTC の暦月の送受信バイト数)と接続数の上限を、それぞれ任意で決めます。バイト数の上限に達すると、プロジェクトは月が終わるか上限が上がるまで stopped になり、プログラムのものも含めてすべてのセッションが limit で閉じ、新しいものは拒否されます。接続数の上限に達すると、数がそこにある間 full になり、新しいセッションは limit で拒否され、開いているものは続きます。上限は、Relay が一回の報告の間隔(10 秒)に運ぶ分と、変更が届くまでの時間の分だけ超えることがあります。

使用量は、プロジェクトと UTC の日ごとに、Relay に出入りしたバイト数、接続秒数、最大同時接続数を、プログラムのセッションも含めて数え、1 分以内に見えるようになります。

Manager が止まっている間

進行中のセッションは続きます。Relay は最後に読んだ状態で、自分を再起動した後も、受け入れ、取り外し、上限を行い、プログラムは最後に読んだ環境変数で動き続けます。Console と API は使えません。取り外し、閉鎖、設定は Manager が戻ってから効き、その間に数えた使用量もそのときに報告されます。