serverpod-sessions について
Serverpodのセッションの有効期間、種類、安全な手動管理方法を説明するスキルです。クリーンアップやエラーログ、リクエスト終了後のセッション利用を避ける方法も扱います。
主な機能
- 01セッションの種類と有効期間
- 02セッションの自動ライフサイクル管理
- 03withSessionによる手動セッション管理
- 04クリーンアップコールバック
- 05クローズ済みセッションの利用防止
活用シーン
- 01タスクに適したセッション種別の選択
- 02内部処理用セッションの管理
- 03リクエスト終了後のセッション利用回避
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ serverpod/ serverpod --skill serverpod-sessionsインストール後、Claude Code で/serverpod-sessionsを入力して読み込まれたか確認します。
詳細
Serverpod セッション
セッションは、データベース、キャッシュ、ストレージ、メッセージ、パスワード、ログへのアクセスを提供します。フレームワークがセッションを自動的に作成して閉じるため、手動で管理する必要があるのは InternalSession だけです。リクエスト、ストリーム、または Future の呼び出しを超えて処理を続ける場合、そのリクエストのセッションを保存しないでください。
セッションの種類
| 種類 | 作成対象 | ライフタイム |
|---|---|---|
| MethodCallSession | エンドポイントメソッド | 単一のリクエスト |
| WebCallSession | Web サーバールート | 単一のリクエスト |
| MethodStreamSession | ストリームメソッド | ストリームの継続中 |
| FutureCallSession | Future 呼び出し | タスクの実行中 |
| InternalSession | 手動作成 | 閉じられるまで |
手動セッション(InternalSession)
セッションを自動的に閉じ、コールバックで例外が発生した場合にエラーとスタックトレースをログに記録する withSession を優先してください。
await Serverpod.instance.withSession((session) async {
await doWork(session);
});
コールバックとしてライフタイムを表現できない場合は、セッションを手動で作成し、必ず finally ブロックで閉じてください。
var session = await Serverpod.instance.createSession();
try {
await doWork(session);
} finally {
await session.close();
}
セッションを閉じないとメモリリークが発生し、ログが永続化されません。閉じたセッションを使用すると StateError がスローされます。
クリーンアップコールバック
session.addWillCloseListener((session) async {
// Runs just before session closes (all session types)
});
よくある落とし穴:メソッドの戻り値を受け取った後にセッションを使用する
エンドポイントが戻ると、セッションは閉じられます。後で使用するためにセッションを保持しないでください。
// BAD — session already closed when callback runs
Timer(Duration(seconds: 5), () => user.updateLastSeen(session));
修正方法: Future 呼び出し(session.serverpod.futureCalls.callWithDelay(...))を使用するか、Serverpod.instance.withSession(...) を使ってコールバック内で新しいセッションを開いてください。
コメント
Markdown 対応