graphile-build
Version:
Build a GraphQL schema from plugins
68 lines (61 loc) • 2.44 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = void 0;
function isValidSubscription(Subscription) {
try {
if (!Subscription) {
return false;
}
if (Object.keys(Subscription.getFields()).length === 0) {
return false;
}
} catch (e) {
return false;
}
return true;
}
const description = `The root subscription type: contains realtime events you can subscribe to with the \`subscription\` operation.`;
const liveDescription = `The root subscription type: contains events and live queries you can subscribe to with the \`subscription\` operation.
#### Live Queries
Live query fields are differentiated by containing \`(live)\` at the end of their description, \
they are added for each field in the \`Query\` type. \
When you subscribe to a live query field, the selection set will be evaluated and sent to the \
client, and then most things\\* that would cause the output of the selection set to change \
will trigger the selection set to be re-evaluated and the results to be re-sent to the client.
_(\\* Not everything: typically only changes to persisted data referenced by the query are detected, not computed fields.)_
Live queries can be very expensive, so try and keep them small and focussed.
#### Events
Event fields will run their selection set when, and only when, the specified server-side event occurs. \
This makes them a lot more efficient than Live Queries, but it is still recommended that you keep payloads fairly small.`;
var SubscriptionPlugin = async function SubscriptionPlugin(builder, {
live
}) {
builder.hook("GraphQLSchema", (schema, build) => {
const {
newWithHooks,
extend,
graphql: {
GraphQLObjectType
},
inflection
} = build;
const Subscription = newWithHooks(GraphQLObjectType, {
name: inflection.builtin("Subscription"),
description: build.wrapDescription(live ? liveDescription : description, "type")
}, {
__origin: `graphile-build built-in (root subscription type)`,
isRootSubscription: true
}, true);
if (isValidSubscription(Subscription)) {
return extend(schema, {
subscription: Subscription
}, "Adding subscription type to schema");
} else {
return schema;
}
}, ["Subscription"], [], ["Query"]);
};
exports.default = SubscriptionPlugin;
//# sourceMappingURL=SubscriptionPlugin.js.map