@graphql-mesh/serve-runtime
Version:
39 lines (38 loc) • 1.66 kB
JavaScript
import { createGraphQLError, isAsyncIterable, Repeater } from 'graphql-yoga';
export function useCompleteSubscriptionsOnSchemaChange() {
const activeSubs = [];
return {
onSchemaChange() {
while (activeSubs.length) {
activeSubs.pop()?.();
}
},
onSubscribe() {
return {
onSubscribeResult({ result, setResult }) {
if (isAsyncIterable(result)) {
setResult(Repeater.race([
result,
new Repeater((_push, stop) => {
function complete() {
stop(createGraphQLError('subscription has been closed due to a schema reload', {
extensions: {
code: 'SUBSCRIPTION_SCHEMA_RELOAD',
},
}));
}
activeSubs.push(complete);
// eslint-disable-next-line @typescript-eslint/no-floating-promises
stop.then(() => {
// eslint-disable-next-line @typescript-eslint/no-floating-promises
result.return?.();
activeSubs.splice(activeSubs.indexOf(complete), 1);
});
}),
]));
}
},
};
},
};
}