mcpField
S
spacetimedb-reducers

spacetimedb-reducers

github.com/danmossa開発2168 回インストール19 週間前に更新
リポジトリ

spacetimedb-reducers について

spacetimedb-reducersは、SpacetimeDBのreducerとトランザクション型サーバーロジックを実装するためのスキルです。テーブルアクセス、ロールバック、ライフサイクルreducerに加え、TypeScript、C#、Rust、C++のパターンを扱います。

主な機能

  1. 01複数言語のreducerパターン
  2. 02トランザクション変更とロールバックの指針
  3. 03インデックス付きテーブルアクセス
  4. 04ライフサイクルreducerの参照
  5. 05エラー処理の指針

活用シーン

  1. 01トランザクション型のテーブル変更の実装
  2. 02reducer内での行の検証と更新
  3. 03ライフサイクルイベントの処理
  4. 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.md
functions-reducers-lifecycle.md
functions-reducers-reducer-context.md
functions-reducers.md
functions.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 を参照してください。

コメント