Supabase Rust
Rust クライアントライブラリ for Supabase - JavaScript版 supabase-js と互換性を持つRust実装です。
機能
- 💾 Database: PostgreSQLデータベースへの接続とデータの操作(QueryBuilder, RPC)
- 🔐 Auth: ユーザーの認証と管理(サインアップ、サインイン、セッション管理)
- 📁 Storage: 大容量ファイルの保存と管理(アップロード、ダウンロード、一覧取得)
- 🔄 Realtime: リアルタイムデータ変更の購読
- 🔥 Edge Functions: サーバーレス関数の実行
- 🔍 PostgREST: 高度なフィルタリングと関係性のクエリ
インストール
[]
= "0.1.0"
= { = "1", = ["full"] }
= { = "1.0", = ["derive"] }
= "1.0"
基本的な使い方
クライアント初期化
use *;
async
データベース操作
// データの取得
let data = supabase
.from
.select
.execute
.await?;
println!;
// フィルタリング
let filtered_data = supabase
.from
.select
.eq
.order
.limit
.execute
.await?;
// 複雑な結合クエリ
let joined_data = supabase
.from
.select
.include
.inner_join
.execute
.await?;
// 全文検索
let search_results = supabase
.from
.select
.text_search
.execute
.await?;
// CSVエクスポート
let csv_data = supabase
.from
.select
.limit
.export_csv
.await?;
// ファイルとして保存
write?;
// データの挿入
let new_record = json!;
let insert_result = supabase
.from
.insert
.execute
.await?;
// データの更新
let update_result = supabase
.from
.update
.eq
.execute
.await?;
// データの削除
let delete_result = supabase
.from
.delete
.eq
.execute
.await?;
// RPC関数の呼び出し
let rpc_result = supabase
.rpc
.execute
.await?;
トランザクション
// トランザクションを開始
let transaction = supabase
.from
.begin_transaction
.await?;
// トランザクション内で複数の操作を実行
// 1. データの挿入
let insert_result = transaction
.from
.insert
.execute
.await?;
let user_id = insert_result.as_i64.unwrap;
// 2. 関連データの挿入
let profile_result = transaction
.from
.insert
.execute
.await?;
// 3. セーブポイントを作成
transaction.savepoint.await?;
// 4. データの更新
transaction
.from
.update
.eq
.execute
.await?;
// 5. トランザクションをコミット
transaction.commit.await?;
// エラー処理を含む例
let transaction = supabase
.from
.begin_transaction
.await?;
transaction
.from
.insert
.execute
.await?;
// セーブポイントを作成
transaction.savepoint.await?;
// 何らかの条件でロールバックが必要になった場合
if some_condition else if another_condition else
認証
// ユーザー登録
let auth_response = supabase
.auth
.sign_up
.await?;
// ログイン
let auth_response = supabase
.auth
.sign_in_with_password
.await?;
// 現在のユーザー情報の取得
let user = supabase.auth.get_user.await?;
// セッションの更新
let session = supabase.auth.refresh_session.await?;
// ログアウト
supabase.auth.sign_out.await?;
// パスワードリセット
supabase
.auth
.reset_password_for_email
.await?;
// メール確認機能
// メール確認リクエストの送信
let options = EmailConfirmOptions ;
supabase
.auth
.send_confirm_email_request
.await?;
// メール確認トークンの検証(確認リンクからのトークン)
let session = supabase
.auth
.verify_email
.await?;
println!;
// パスワードリセットトークンの検証と新パスワード設定
let session = supabase
.auth
.verify_password_reset
.await?;
println!;
OAuth認証
// OAuth認証URLの生成
let auth_url = supabase
.auth
.get_oauth_sign_in_url;
println!;
// コールバックからのコードを使用してセッションを取得
let session = supabase
.auth
.exchange_code_for_session
.await?;
println!;
Storage
// ファイルのアップロード
let upload_result = supabase
.storage
.from
.upload
.await?;
// ファイルダウンロード
let file_data = supabase
.storage
.from
.download
.await?;
// ファイル一覧の取得
let files = supabase
.storage
.from
.list
.await?;
// 公開URLの生成
let public_url = supabase
.storage
.from
.get_public_url;
// 署名付きURLの生成
let signed_url = supabase
.storage
.from
.create_signed_url
.await?;
// 画像変換
let transform_options = new
.with_width
.with_height
.with_resize
.with_format
.with_quality;
// 変換された画像を取得
let transformed_image = supabase
.storage
.from
.transform_image
.await?;
// 変換された画像の公開URLを取得
let public_transform_url = supabase
.storage
.from
.get_public_transform_url;
// 変換された画像の署名付きURLを取得
let signed_transform_url = supabase
.storage
.from
.create_signed_transform_url
.await?;
// ファイルの削除
supabase
.storage
.from
.remove
.await?;
大容量ファイルのチャンクアップロード
// 大きなファイルをチャンクでアップロードする
let file_path = new;
let result = supabase
.storage
.from
.upload_large_file
.await?;
println!;
// 手動でマルチパートアップロードを制御する場合
// 1. マルチパートアップロードを初期化
let init_result = supabase
.storage
.from
.initiate_multipart_upload
.await?;
// 2. チャンクを個別にアップロード
let chunk_data = from; // 実際のデータ
let part_result = supabase
.storage
.from
.upload_part
.await?;
// 3. マルチパートアップロードを完了
let complete_result = supabase
.storage
.from
.complete_multipart_upload
.await?;
Realtime
// リアルタイム購読
let _subscription = supabase
.channel
.on
.subscribe
.await?;
// カスタムチャネルの購読
let _broadcast_subscription = supabase
.channel
.on
.subscribe
.await?;
// 購読解除
// subscriptionが破棄されると自動的に購読解除されます
リアルタイム接続の管理
// カスタム接続オプションでリアルタイムクライアントを初期化
let options = RealtimeClientOptions ;
// 接続状態の変更を監視
let realtime = supabase.realtime;
let mut state_receiver = realtime.on_state_change;
// 別スレッドで状態変更を監視
spawn;
// テーブル変更の購読
let _subscription = supabase
.channel
.on
.subscribe
.await?;
// 手動で接続を終了
supabase.realtime.disconnect.await?;
Edge Functions
// Edge Functionの呼び出し
let function_result = supabase
.functions
.
.await?;
エラーハンドリング
match supabase.from.select.execute.await
実行環境
- サポートRust バージョン: 1.65以上
tokio
ランタイム上での非同期操作
互換性
Supabase Rustは、JavaScript版 supabase-js と互換性を持つように設計されています。APIの設計は類似していますが、Rustの言語仕様に合わせた実装になっています。
現在の実装では、supabase-jsの主要機能を提供していますが、一部の高度な機能はまだ実装中です。詳細は「開発状況」セクションをご覧ください。
開発状況
機能カバレッジ(supabase-jsとの比較)
機能 | supabase-js (TypeScript) | supabase-rust | カバレッジ |
---|---|---|---|
データベース (PostgreSQL) | ✅ 完全実装 | ✅ 完全実装 | 90% |
認証 (Auth) | ✅ 完全実装 | ✅ 基本実装済み | 90% |
ストレージ (Storage) | ✅ 完全実装 | ✅ 基本実装済み | 95% |
リアルタイム (Realtime) | ✅ 完全実装 | ✅ 基本実装済み | 95% |
Edge Functions | ✅ 完全実装 | ✅ 基本実装済み | 85% |
TypeScript/型安全 | ✅ 完全実装 | ✅ Rustの型システム | 90% |
詳細状況
データベース機能 (90%)
- ✅ 基本的なSELECT, INSERT, UPDATE, DELETEオペレーション
- ✅ 基本的なフィルタリング
- ✅ RPC関数呼び出し
- ✅ 基本的なリレーションシップクエリ
- ✅ 複雑な結合クエリ(内部結合、外部結合、子テーブル含める)
- ✅ 高度なPostgREST機能(全文検索、地理空間データ検索、グループ化)
- ✅ CSVエクスポート機能
- ✅ 行レベルセキュリティ(RLS)対応
- ✅ トランザクション処理
認証 (90%)
- ✅ メール・パスワード認証
- ✅ 基本的なセッション管理
- ✅ ユーザー情報取得
- ✅ パスワードリセット
- ✅ OAuth認証
- ✅ 多要素認証(MFA)
- ✅ 匿名認証
- ✅ 電話番号認証
- ✅ メール確認機能
ストレージ (95%)
- ✅ ファイルアップロード/ダウンロード
- ✅ バケット管理
- ✅ ファイル一覧取得
- ✅ 公開URL生成
- ✅ 基本的な署名付きURL
- ✅ 大容量ファイルのチャンクアップロード
- ✅ 画像変換機能(リサイズ、フォーマット変換、画質調整)
- ✅ S3互換APIのサポート
リアルタイム (95%)
- ✅ データベース変更監視
- ✅ カスタムチャネル購読
- ✅ 切断・再接続のロバスト性
- ✅ Presenceサポート
- ✅ 高度なリアルタイムフィルタリング
Edge Functions (85%)
- ✅ 基本的な関数呼び出し
- ✅ 高度なパラメータサポート
- ✅ 詳細なエラーハンドリング
- ✅ 異なるレスポンス形式(JSON, テキスト, バイナリ)のサポート
- ✅ ストリーミングレスポンスのサポート
- 🔄 ストリームの自動変換機能の拡張(実装中)
今後の開発予定
-
データベース機能の強化:
- 複雑な結合クエリの最適化
- データベースプールの管理と効率化
-
認証の拡張:
- WebAuthn/パスキーサポートの追加
- 組織機能のサポート
- 詳細な権限管理の実装
-
ストレージの拡張:
- S3互換API機能の拡張
- 大容量ファイル処理の最適化
- バケット権限管理の詳細制御
-
リアルタイム機能の強化:
- バッチ購読処理の最適化
- オフライン同期サポート
-
Edge Functions拡張:
- Deno/Rustランタイムサポート
- ウェブフック統合
- ローカル開発環境との連携
-
パフォーマンスとセキュリティ:
- メモリ使用量の最適化
- スレッド安全性の強化
- 暗号化機能の拡張
匿名認証
// 匿名認証でサインイン
let anonymous_session = supabase
.auth
.sign_in_anonymously
.await?;
println!;
電話番号認証
// 電話番号認証 - ステップ1: 認証コード送信
let verification = supabase
.auth
.send_verification_code
.await?;
println!;
println!;
println!;
// 電話番号認証 - ステップ2: コード検証とサインイン
// ユーザーがSMSで受け取ったコード
let sms_code = "123456"; // 実際の例ではユーザー入力から取得
let session = supabase
.auth
.verify_phone_code
.await?;
println!;
ストリーミングレスポンス (Edge Functions)
// ストリーミングレスポンスの取得
let stream = supabase
.functions
.
.await?;
// バイトストリームから行ストリームに変換
let line_stream = supabase.functions.stream_to_lines;
// ストリームを処理
pin!;
while let Some = line_stream.next.await
// JSONストリームを直接取得
let json_stream = supabase
.functions
.
.await?;
// JSONイベントを処理
pin!;
while let Some = json_stream.next.await
コントリビューション
バグ報告、機能リクエスト、プルリクエストなど、あらゆる形でのコントリビューションを歓迎します。詳細はコントリビューションガイドをご覧ください。
ライセンス
貢献
貢献は歓迎します!詳細は CONTRIBUTING.md をご覧ください。
セキュリティ
セキュリティ上の脆弱性を発見した場合は、SECURITY.mdに記載されている連絡先に報告してください。
多要素認証(MFA)
// MFAを使用したサインイン - 第一ステップ
let result = supabase
.auth
.sign_in_with_password_mfa
.await?;
// 結果の処理
match result
// MFA TOTPファクターの登録
let setup_info = supabase
.auth
.enroll_totp
.await?;
println!;
println!;
// TOTPの検証と有効化
let factor = supabase
.auth
.verify_totp
.await?;
println!;
// ユーザーのMFAファクター一覧を取得
let factors = supabase
.auth
.list_factors
.await?;
for factor in factors
// MFAファクターの削除
supabase
.auth
.unenroll_factor
.await?;
Presenceサポート
// Presenceを使用してユーザーのオンライン状態を追跡
let channel = supabase
.channel;
// Presenceの変更を監視
let _subscription = channel
.on_presence
.subscribe
.await?;
// ユーザー状態を追跡
let user_id = "user-123";
let user_data = json!;
// Presenceの状態を設定
channel
.track_presence
.await?;
// Presenceの状態を同期
let mut presence_state = new;
// 状態更新時に同期
presence_state.sync;
// 現在オンラインのユーザー一覧を取得
let online_users = presence_state.list;
println!;
拡張されたEdge Functions
// 様々なレスポンスタイプに対応
// JSON応答を取得
let json_result = supabase
.functions
.
.await?;
println!;
// テキスト応答を取得
let text_result = supabase
.functions
.
.await?;
println!;
// タイムアウトを設定
let options = FunctionOptions ;
// 詳細な応答情報を取得
let response = supabase
.functions
.
.await?;
println!;
println!;
println!;
// エラーハンドリング
match supabase.functions..await
S3互換APIの使用
// S3互換APIの使用例
use S3Options;
use HashMap;
use Bytes;
// S3互換オプションを設定
let s3_options = S3Options ;
// S3互換クライアントを取得
let storage_client = supabase.storage;
let bucket_client = storage_client.from;
let s3_client = bucket_client.s3_compatible;
// オブジェクトをアップロード
let content = "This is a test file";
let data = from;
s3_client.put_object.await?;
// オブジェクトをダウンロード
let downloaded_data = s3_client.get_object.await?;
let text = String from_utf8_lossy;
// メタデータを取得
let metadata = s3_client.head_object.await?;
// オブジェクト一覧を取得
let objects = s3_client.list_objects.await?;
// オブジェクトをコピー
s3_client.copy_object.await?;
// オブジェクトを削除
s3_client.delete_object.await?;
高度なリアルタイムフィルタリング
// 高度なリアルタイムフィルタリングの使用例
use ;
// リアルタイムクライアントを取得
let realtime = supabase.realtime;
// 完了済みタスクだけを監視するチャンネルを作成
let channel = realtime
.channel
.on
.subscribe
.await?;
// 複合条件によるフィルタリング
let complex_channel = realtime
.channel
.on
.subscribe
.await?;
// 使用可能なフィルター演算子:
// .eq() - 等しい
// .neq() - 等しくない
// .gt() - より大きい
// .gte() - 以上
// .lt() - より小さい
// .lte() - 以下
// .in_values() - いずれかの値に一致
// .contains() - 配列に含まれる
// .like() - ワイルドカードマッチング
// .ilike() - 大文字小文字を区別しないワイルドカードマッチング
// カスタムフィルターを直接作成する場合
let custom_channel = realtime
.channel
.on
.subscribe
.await?;