receipt
コマンド 1 つがどのように終わったかを記録した receipt を読む
メッセージ、制御(interrupt・pause・resume・close・terminate・復旧判断・プロファイル変更)、push のリクエストと判断、アカウント・キーの管理といったコマンドは、receipt を残す。receipt には、誰が(actor)、何を(operation、target_ref)したか、そしてどのように終わったか(status、result、error)が入る。非同期コマンドはレスポンスの receipt_status が accepted で、終わったかどうかは receipt を読み直して確認する。scope は sessions:read である。
status | 意味 |
|---|---|
accepted | 受け付けたが、まだ終わっていない |
succeeded | 終わった。結果は result |
failed | 拒否または失敗した。理由は error と result.refusal |
unknown | 結果が不明である |
読む
レスポンスの receipt_id で receipts.get(GET /v1/receipts/{id})を呼ぶ。拒否で作ったリクエストの receipt を読む。
const pr = await werft.sessions.pushRequests.get(sessionId, second.id);
for (const id of [pr.request_receipt_id, pr.resolution_receipt_id]) {
if (!id) continue;
const receipt = await werft.receipts.get(id);
const result = receipt.result as { action?: string | null } | null;
console.log(receipt.operation, receipt.status, result?.action);
}request_push succeeded null
resolve_push succeeded reject拒否されたリクエストは、エラー本文の error.details.receipt_id がその receipt を指す。拒否にも記録が残るということである。
名前を変える前のバージョンのサーバーが残した承認・拒否の receipt は、operation が decide_push で、値は result.decision にある。再び判断した試行の refusal は already_decided である。過去の receipt はそのまま読める。
終わるまで待つ
非同期の制御の receipt は、accepted から succeeded または failed に変わる。待っている間に別の結果が出ても止まるように、両方を見る。SDK の waitForReceipt は、accepted 以外の値になるまで待つ。
import { waitForReceipt } from "@werft-ai/sdk";
const { revision } = await werft.sessions.get(sessionId);
const paused = await werft.sessions.pause(sessionId, {
expected_revision: revision,
reason: "lunch",
});
const receipt = await waitForReceipt(werft, paused.receipt_id);
const state = receipt.result as { resulting_admission_state?: string } | null;
console.log(receipt.operation, receipt.status, state?.resulting_admission_state);pause succeeded pausedreceipt には秘密の値は入らない。他人の範囲にある receipt は 404 になる。
次のステップ
- GitHub: push したブランチで PR を開き、コメントを付ける