同期セッションの管理 - Node.js SDK
項目一覧
Atlas Device Sync を使用すると、Node.js SDK は 同期セッション を使用して、バックグラウンドで Atlas とデータを同期します。 同期された Realm を開くたびに同期セッションが開始されます。
前提条件
同期セッションを管理する前に、次の操作を実行する必要があります。
同期セッションにアクセス
同期された Realm を開くと、 Realm.syncSessionプロパティを使用してその同期セッションにアクセスできます。
const realm = await Realm.open(config); const syncSession = realm.syncSession;
同期セッションの一時停止または再開
同期された Realm を起動すると、同期セッションが開始されます。 Realm で同期セッションを一時停止および再開できます。 同期セッションを一時停止すると、その Realm の同期セッションのみが一時停止されます。 オープンしている Realm が複数ある場合、一時停止しても他の Realm の同期セッションには影響しません。
同期を一時停止するには、 syncSession.一時停止() 使用して複数のドキュメントを挿入できます。 同期を再開するには、 syncSession.resume() 使用して複数のドキュメントを挿入できます。
const behaviorConfiguration = { type: "openImmediately", }; const config = { schema: [DogSchema], sync: { user: app.currentUser, partitionValue: "MyPartitionValue", newRealmFileBehavior: behaviorConfiguration, existingRealmFileBehavior: behaviorConfiguration, }, }; const realm = await Realm.open(config); const pauseSyncSession = () => { realm.syncSession?.pause(); }; const resumeSyncSession = () => { realm.syncSession?.resume(); };
const behaviorConfiguration: Realm.OpenRealmBehaviorConfiguration = { type: Realm.OpenRealmBehaviorType.OpenImmediately, }; const config: Realm.Configuration = { schema: [DogSchema], sync: { user: app.currentUser!, partitionValue: "MyPartitionValue", newRealmFileBehavior: behaviorConfiguration, existingRealmFileBehavior: behaviorConfiguration, }, }; const realm = await Realm.open(config); const pauseSyncSession = () => { realm.syncSession?.pause(); }; const resumeSyncSession = () => { realm.syncSession?.resume(); };
同期セッションを一時停止するタイミング
ほとんどのアプリケーションでは、同期セッションを手動で一時停止して再開する必要はありません。 ただし、同期セッションを一時停止または一時停止する必要がある状況もいくつかあります。
ユーザーが特定のアクションを実行した後にのみ同期したい場合
特定の時間のみ同期したい場合
ネットワーク接続が不十分な場合、同期は試行しないでください
同期セッションを明示的に接続するよう強制したい場合
ネットワーク接続が不十分な場合、ネットワーク接続を確立しようとすると、ユーザーのデバイスのバックアップが枯渇する可能性があります。
同期セッションを明示的に接続するよう 強制する 場合は、一時的にオフラインであることがほとんどです。 同期クライアントは接続を試み、失敗すると指数バックオフになります。 長時間オフラインになると、クライアントがすぐに再接続されないことがあります。 同期セッションを一時停止および再開すると、接続が明示的に強制されます。
同期セッションを一時停止するときは、次の点に注意してください。
クライアントがクライアントの最大オフライン時間よりも長時間オフラインになると、クライアントは同期を再開できなくなり、クライアント リセットを実行する必要があります。
同期セッションを一時停止すると、両方の方向で一時停止されます。 アプリがデバイスで行った変更はバックエンドと同期されず、バックエンドまたは他のデバイス上のデータに対する変更はデバイスに同期されません。 アップロードのみを一時停止したり、ダウンロードのみを一時停止したりする方法はありません。
クライアントがバックエンドとの同期を永続的に停止する場合は、同期セッションを一時停止しないでください。 同期を永続的に停止するには、同期された Realm の内容を同期されていない Realm にコピーし、クライアントで同期されていない Realm を使用します。
無期限の同期を停止するために、同期を一時停止しないでください。 この機能は、これらのユースケース向けに設計またはテストされていません。 この方法で使用すると、さまざまな問題が発生する可能性があります。
アップロードとダウンロードを待機する
すべての変更が同期された Realm から Atlas にアップロードされるのを非同期に待機するには、 updateAllLocalchanges()を呼び出します。 このメソッドは、すべての変更がアップロードされたときに true を返します。
realm.write(() => { realm.create(Doggie, { _id: new BSON.ObjectID(), owner_id: app.currentUser!.id, name: "Maui", age: 3, }); }); await realm.syncSession?.uploadAllLocalChanges();
Atlas のすべての変更が Device Sync サーバーから同期された Realm にダウンロードされるまで非同期に待機するには、 DownloadAllServerChecks()を呼び出します。 このメソッドは、すべての変更がダウンロードされたときに true を返します。
await realm.syncSession?.downloadAllServerChanges();
アプリ構成でリクエスト タイムアウトを指定できます。 タイムアウトを指定すると、 BaseSyncConfigurationで cancelWaitsOnNonFatalErrors
を設定できます。 true
とタイムアウト間隔が経過すると、アップロードとダウンロードを待機しているすべての未処理の作業がキャンセルされます。 この設定が false の場合、アップロードとダウンロードを待機してもキャンセルされません。これは、Realm がこれらのタイムアウトを致命的でないエラーとして扱うためです。
詳細については、「 アプリ クライアントのタイムアウトの設定と、タイムアウト後に非同期操作をキャンセルする 」を参照してください。
同期セッションのアップロードとダウンロードの進行状況を確認
同期セッションのアップロードとダウンロードの進行状況を確認するには、 syncSession.addProgressNotification() メソッドを使用して進行状況通知を追加します 使用して複数のドキュメントを挿入できます。
syncSession.addProgressNotification()
メソッドは次の 3 つのパラメータを取ります。
direction
パラメータ。 データをアップロードするための通知を登録するには、 を"upload"
に設定します。 データのダウンロードの通知を登録するには、 を"download"
に設定します。mode
パラメータ。 syncSession.removeProgressNotification()を使用してコールバックが登録解除されるまで通知が継続されるようにするには、 を"reportIndefinitely"
に設定します。 現在転送可能なバイトのみが同期されるまで通知を継続するには、 を"forCurrentlyOutstandingWork"
に設定します。transferred
とtransferable
の引数を持つコールバック関数パラメーター。transferred
はすでに転送されている現在のバイト数です。transferable
は、すでに転送された合計バイト数と転送保留中のバイト数の合計です。
注意
Flexible Sync の進行状況通知はまだ完全にはサポートされていません。 Flexible Sync を使用している場合、 は変更が統合された後にのみダウンロードを報告します。 パーティションベースの同期では、変更のダウンロードが進行状況に応じて継続的な通知が行われます。 アップロードにより、両方の同期モードにおいて進行中の進行状況通知が報告されます。
例
次の例では、アプリケーション開発者は、 syncSession
のコールバックを登録して、アップロード イベントを無期限に待機します。 開発者は Realm に書き込み、 syncSession
通知コールバックの登録を解除します。
const behaviorConfiguration = { type: "openImmediately", }; const config = { schema: [DogSchema], sync: { user: app.currentUser, partitionValue: "MyPartitionValue", newRealmFileBehavior: behaviorConfiguration, existingRealmFileBehavior: behaviorConfiguration, }, }; const realm = await Realm.open(config); const handleNotifcationRemoval = (transferred, transferable) => { console.log(`There were ${transferable} transferable bytes total.`); console.log(`${transferred} bytes were transferred.`); }; const handleNotifications = (transferred, transferable) => { if (transferred === transferable) { console.log( `${transferred} bytes of ${transferable} were transferred.` ); // Remove progress notification. realm.syncSession?.removeProgressNotification(handleNotifcationRemoval); } }; realm.syncSession?.addProgressNotification( "upload", "reportIndefinitely", handleNotifications ); // Upload a Realm object. const dog = realm.write(() => { return realm.create("Dog", { _id: new Realm.BSON.ObjectID(), MyPartitionValue: "MyPartitionValue", name: "Fido", age: 2, }); });
const behaviorConfiguration: Realm.OpenRealmBehaviorConfiguration = { type: Realm.OpenRealmBehaviorType.OpenImmediately, }; const config: Realm.Configuration = { schema: [DogSchema], sync: { user: app.currentUser!, partitionValue: "MyPartitionValue", newRealmFileBehavior: behaviorConfiguration, existingRealmFileBehavior: behaviorConfiguration, }, }; const realm = await Realm.open(config); const handleNotifcationRemoval = ( transferred: number, transferable: number ) => { console.log(`There were ${transferable} transferable bytes total.`); console.log(`${transferred} bytes were transferred.`); }; const handleNotifications = (transferred: number, transferable: number) => { if (transferred === transferable) { console.log( `${transferred} bytes of ${transferable} were transferred.` ); // Remove progress notification. realm.syncSession?.removeProgressNotification(handleNotifcationRemoval); } }; realm.syncSession?.addProgressNotification( Realm.ProgressDirection.Upload, Realm.ProgressMode.ReportIndefinitely, handleNotifications ); // Upload a Realm object. const dog = realm.write(() => { return realm.create("Dog", { _id: new Realm.BSON.ObjectID(), MyPartitionValue: "MyPartitionValue", name: "Fido", age: 2, }); });
ネットワーク接続の確認
サーバーへの接続の現在の状態を確認するには、 syncSession. connectionState() メソッドを 使用して複数のドキュメントを挿入できます。
Realm のオフラインファーストの設計により、現在のネットワーク接続状態を確認する必要は通常ありません。 つまり、アプリがサーバーへの接続の現在の状態を取得する必要がある場合は、 syncSession.connectionState()
メソッドが利用できます。
const config = { schema: [DogSchema], sync: { user: app.currentUser, partitionValue: "MyPartitionValue", }, }; const realm = await Realm.open(config); const connectionState = realm.syncSession?.connectionState;
const config: Realm.Configuration = { schema: [DogSchema], sync: { user: app.currentUser!, partitionValue: "MyPartitionValue", }, }; const realm = await Realm.open(config); const connectionState = realm.syncSession?.connectionState;
複数の同期セッション
セッションマルチ プレフィックスを有効にする を使用して、 Realmアプリの複数の同期セッションを統合します。ファイル記述子の制限に達するというエラーが表示され、かつ多数の同期セッションを使用していることがわかっている場合にのみ、セッションマルチプレフィックスを使用してください。
セッションのマルチプレフィックスを有効にするには、 Realm.App.Sync.enableSession Multilessing()を呼び出します Realm.Appで起動する
例
Realm.App.Sync.enableSessionMultiplexing(app);