spacetimedb-reducers について
spacetimedb-reducersは、SpacetimeDBのreducerとトランザクション型サーバーロジックを実装するためのスキルです。テーブルアクセス、ロールバック、ライフサイクルreducerに加え、TypeScript、C#、Rust、C++のパターンを扱います。
主な機能
- 01複数言語のreducerパターン
- 02トランザクション変更とロールバックの指針
- 03インデックス付きテーブルアクセス
- 04ライフサイクルreducerの参照
- 05エラー処理の指針
活用シーン
- 01トランザクション型のテーブル変更の実装
- 02reducer内での行の検証と更新
- 03ライフサイクルイベントの処理
- 04reducerでの外部I/Oの回避
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ danmossa/ spacetimedb-skills --skill spacetimedb-reducersインストール後、Claude Code で/spacetimedb-reducersを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
references/functions-reducers-error-handling.mdfunctions-reducers-lifecycle.mdfunctions-reducers-reducer-context.mdfunctions-reducers.mdfunctions.md詳細
このスキルは、リデューサーの実装とトランザクション型サーバーロジックに使用します。
リデューサーの基本パターン
リデューサーは、テーブルを変更するトランザクションのエントリーポイントです。リデューサーが成功すると、すべてのテーブル変更がコミットされます。例外のスロー、エラーの返却、またはパニックが発生した場合は、変更がすべてロールバックされます。
TypeScript のリデューサーの形式:
export const create_user = spacetimedb.reducer(
{ name: t.string(), email: t.string() },
(ctx, { name, email }) => {
if (name === "") throw new Error("Name cannot be empty");
ctx.db.user.insert({ id: 0n, name, email });
},
);
言語ごとのシグネチャ:
- TypeScript:
spacetimedb.reducer(args, (ctx, args) => { ... })。引数がない場合はspacetimedb.reducer((ctx) => { ... })を使用します。 - C#:
[SpacetimeDB.Reducer] public static void Name(ReducerContext ctx, ...)。 - Rust:
#[spacetimedb::reducer] pub fn name(ctx: &ReducerContext, ...) -> Result<(), String>。テーブルメソッドを使用するには、spacetimedb::Tableをインポートします。 - ライフサイクルリデューサーには、言語の構文に応じて
init、client_connected、client_disconnectedの各バリアントを使用します。
テーブルへのアクセス
- 生成されたテーブルハンドルから行を挿入します。自動インクリメントフィールドには、トリガー値(
0、0nなど)を使用します。 - 主キーまたは一意インデックスから行を1つ検索します。TypeScript では
ctx.db.user.id.find(id)、C# ではctx.Db.User.Id.Find(id)、Rust ではctx.db.user().id().find(id)を使用します。 - インデックス付きの列から複数の行を絞り込みます。テーブルの行数が少ないと分かっている場合を除き、負荷の高い処理では
iter()による全件走査を避けてください。 - 行を検索して変更した後、同じ主キーインデックスの更新メソッドを呼び出して更新します。
- 可能な場合は、主キー、一意の値、またはインデックス付きのフィルターを使って削除します。
- SpacetimeDB 2.0 で呼び出し元の ID を取得するには、TypeScript/C# では
ctx.sender、Rust/C++ ではctx.sender()を使用します。
トランザクションに関するガイダンス
- リデューサーは短く決定的な処理にします。外部 I/O はプロシージャに移します。
- ネストされたリデューサー呼び出しは同じトランザクションを共有し、個別にコミットされることはありません。
- 言語で使用できる場合は、想定される検証エラーを呼び出し元に返します。パニックやチェックされない例外は、プログラミング上の誤りに限って使用します。
- スケジュールされたリデューサーはスケジュールテーブルの行から実行されるため、クライアントの送信者が存在しない場合があります。
リファレンスマップ
| 必要な内容 | 開く |
|---|---|
| リデューサーの基本とテーブルへのアクセス | references/functions-reducers.md |
| ライフサイクルリデューサー | references/functions-reducers-lifecycle.md |
| リデューサーのコンテキスト | references/functions-reducers-reducer-context.md |
| エラー処理 | references/functions-reducers-error-handling.md |
| 関数のカテゴリ | references/functions.md |
ガイダンス
- リデューサーをトランザクションとして扱い、副作用とエラーの動作をリファレンスの仕様に合わせてください。
- プロジェクトの SpacetimeDB のバージョンに応じて
ctx.sender/ctx.sender()を使用します。1.0 から 2.0 への移行では、spacetimedb-upgrade を読み込んでください。 - スキーマに関する質問は、spacetimedb-tables を参照してください。
コメント
Markdown 対応