Supabase Rust
Rust クライアントライブラリ for Supabase - JavaScript版 supabase-js と互換性を持つRust実装です。
Supabase JS との互換性と実装完成度
このセクションでは、各モジュールの現在の実装状況とJavaScript版Supabase (v2.x) との互換性を説明します。
全体概要
モジュール | 実装状況 | 互換API比率 | 備考 |
---|---|---|---|
Auth | 80% | 32/40 | 主要認証機能実装済み、一部MFA機能は開発中 |
PostgresT | 85% | 25/30 | トランザクション対応済み、高度なフィルタリング対応 |
Storage | 90% | 18/20 | 画像変換機能など一部JS版より機能拡張 |
Realtime | 70% | 10/14 | 基本的なPubSub、Postgres変更監視対応 |
Functions | 65% | 4/6 | 基本的な関数呼び出し対応 |
詳細互換性レポート
Auth (@supabase/auth-js
)
互換API: 32/40 (80%)
- ✅ メール/パスワードでのサインアップ・サインイン
- ✅ セッション管理 (取得・更新・破棄)
- ✅ パスワードリセット
- ✅ OAuthプロバイダ認証 (Google, GitHub, Facebookなど全12プロバイダ対応)
- ✅ ワンタイムパスワード(OTP)認証
- ✅ ユーザー情報取得・更新
- ✅ メール確認フロー
- ✅ 匿名認証
- ✅ 電話番号認証
- ⚠️ 多要素認証(MFA) - 基本機能実装済み、一部高度な機能開発中
- ⚠️ JWT検証 - 基本実装済み、高度な検証機能開発中
- ❌ 管理者用メソッド - 現在未実装
PostgresT (@supabase/postgrest-js
)
互換API: 25/30 (85%)
- ✅ テーブル/ビューに対する基本CRUD操作
- ✅ 複雑なフィルタリング(条件演算子、JSON操作、全文検索)
- ✅ ORDER BY, LIMIT, OFFSET, RANGEによる結果制御
- ✅ トランザクションサポート(セーブポイント、ロールバック対応)
- ✅ RPC(リモートプロシージャコール)
- ✅ 結果件数取得オプション
- ✅ レスポンスフォーマット制御(CSV出力対応)
- ✅ 単一/複数行処理の最適化
- ⚠️ 関係性自動展開 - 基本実装済み、ネスト関係は開発中
- ❌ Row Level Security(RLS)向け高度なポリシー対応 - 開発中
Storage (@supabase/storage-js
)
互換API: 18/20 (90%)
- ✅ バケット管理(作成・取得・更新・削除)
- ✅ ファイル操作(アップロード・ダウンロード・一覧取得・削除)
- ✅ ファイル移動・コピー
- ✅ 署名付きURL生成
- ✅ 公開URL生成
- ✅ マルチパートアップロード(大容量ファイル対応)
- ✅ 画像変換機能(リサイズ・フォーマット変換・品質制御)
- ⚠️ フォルダ操作 - 基本実装済み、再帰的操作は開発中
- ⚠️ アクセス制御 - 基本実装済み、詳細なポリシー対応は開発中
Realtime (@supabase/realtime-js
)
互換API: 10/14 (70%)
- ✅ チャンネル作成・管理
- ✅ ブロードキャストメッセージング
- ✅ Postgres変更監視(INSERT/UPDATE/DELETE)
- ✅ イベントフィルタリング
- ✅ 自動再接続機能
- ⚠️ Presence機能 - 基本実装済み、状態同期は改善中
- ❌ Channel Status Notifications - 開発中
- ❌ 複雑なJOINテーブル監視 - 計画中
Functions (@supabase/functions-js
)
互換API: 4/6 (65%)
- ✅ Edge関数呼び出し
- ✅ パラメータ付き関数実行
- ✅ 認証統合
- ✅ エラーハンドリング
- ❌ ストリーミングレスポンス - 開発中
- ❌ バイナリデータ対応 - 計画中
今後の開発予定
-
優先実装項目:
- Admin API機能の完全実装
- Row Level Security (RLS)向け高度な機能
- ストリーミングレスポンス対応
-
クロスプラットフォーム対応強化:
- WASM対応(ブラウザでの利用)
- 軽量クライアント実装(組み込み環境向け)
-
パフォーマンス最適化:
- 非同期処理の効率化
- バッチ処理のサポート強化
Features
- Authentication: Sign up, sign in, sign out, reset password, etc.
- Database: Query, insert, update, delete, and filter data with PostgREST.
- Storage: Upload, download, and manage files.
- Realtime: Subscribe to database changes.
- Functions: Call serverless functions.
Recently Completed Implementations
The following features have been fully implemented with improved error handling and functionality:
Storage
- Image transformation with resize, format conversion, and quality control
- Multipart uploads for large files
- Public and signed URL generation for transformed images
- S3-compatible API support
Realtime
- Enhanced channel subscriptions with automatic reconnection
- Advanced filtering for database changes
- Event-specific callbacks with typed payloads
- Presence tracking for real-time user state
PostgreST
- Transaction support with savepoints and rollbacks
- Advanced query building with joins and relationships
- CSV export functionality
- Comprehensive error handling for database operations
Installation
Add this to your Cargo.toml
:
[]
= "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?;