GraphQL サブスクリプションと subscriptions-transport-ws で高速サーバーを使用しています。
特定のチャネルでサブスクリプションをセットアップしました。
...
const subscriptionManager = new SubscriptionManager({
schema: executableSchema,
pubsub: pubsub,
setupFunctions: {
testRunChanged: (options, args) => {
return {
testRunChangedChannel: {
filter: (testRun) => {
return testRun.id === args.testRunId;
}
},
};
},
},
});
...
ミューテーションが受信されると、サーバー上でプロセスが開始され、終了時にテスト実行のデータベース エントリが更新されます。データベース アクションの update promise が渡されると、クライアントに通知する必要があります。
pubsub から発行機能を使用して、サブスクリプション マネージャーは更新されたテスト実行に関する情報を取得します。
...
RunningTestDbService.setToFinished(testRun).then(updatedTestRun => {
pubsub.publish("testRunChangedChannel", updatedTestRun);
})
...
サブスクリプション マネージャーが、公開された testRun とサブスクライブされた testRunId に応じてサブスクリプションをフィルター処理した後、サブスクリプション リゾルバー関数が呼び出されます。クライアントを更新するには、更新されたテスト ランを再度フェッチする必要があります。
サブスクリプション リゾルバー関数内で公開されたテスト実行オブジェクトを取得するにはどうすればよいですか?
サブスクリプションとリゾルバーは次のようになります。
...
`testRunChanged(testRunId: ID!): TestRun!`
...
Subscription: {
testRunChanged(_, { testRunId }) {
// need to fetch the test run from database again
return TestRunDbService.getTestRunWith(testRunId);
},
},
...