schemaInstrumentation.js 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. import { getNamedType, GraphQLObjectType, defaultFieldResolver, } from 'graphql';
  2. export const symbolExecutionDispatcherWillResolveField = Symbol('apolloServerExecutionDispatcherWillResolveField');
  3. export const symbolUserFieldResolver = Symbol('apolloServerUserFieldResolver');
  4. const symbolPluginsEnabled = Symbol('apolloServerPluginsEnabled');
  5. export function enablePluginsForSchemaResolvers(schema) {
  6. if (pluginsEnabledForSchemaResolvers(schema)) {
  7. return schema;
  8. }
  9. Object.defineProperty(schema, symbolPluginsEnabled, {
  10. value: true,
  11. });
  12. const typeMap = schema.getTypeMap();
  13. Object.values(typeMap).forEach((type) => {
  14. if (!getNamedType(type).name.startsWith('__') &&
  15. type instanceof GraphQLObjectType) {
  16. const fields = type.getFields();
  17. Object.values(fields).forEach((field) => {
  18. wrapField(field);
  19. });
  20. }
  21. });
  22. return schema;
  23. }
  24. export function pluginsEnabledForSchemaResolvers(schema) {
  25. return !!schema[symbolPluginsEnabled];
  26. }
  27. function wrapField(field) {
  28. const originalFieldResolve = field.resolve;
  29. field.resolve = (source, args, contextValue, info) => {
  30. const willResolveField = contextValue?.[symbolExecutionDispatcherWillResolveField];
  31. const userFieldResolver = contextValue?.[symbolUserFieldResolver];
  32. const didResolveField = typeof willResolveField === 'function' &&
  33. willResolveField({ source, args, contextValue, info });
  34. const fieldResolver = originalFieldResolve || userFieldResolver || defaultFieldResolver;
  35. try {
  36. const result = fieldResolver(source, args, contextValue, info);
  37. if (typeof didResolveField === 'function') {
  38. whenResultIsFinished(result, didResolveField);
  39. }
  40. return result;
  41. }
  42. catch (error) {
  43. if (typeof didResolveField === 'function') {
  44. didResolveField(error);
  45. }
  46. throw error;
  47. }
  48. };
  49. }
  50. function isPromise(x) {
  51. return x && typeof x.then === 'function';
  52. }
  53. export function whenResultIsFinished(result, callback) {
  54. if (isPromise(result)) {
  55. result.then((r) => whenResultIsFinished(r, callback), (err) => callback(err));
  56. }
  57. else if (Array.isArray(result)) {
  58. if (result.some(isPromise)) {
  59. Promise.all(result).then((r) => callback(null, r), (err) => callback(err));
  60. }
  61. else {
  62. callback(null, result);
  63. }
  64. }
  65. else {
  66. callback(null, result);
  67. }
  68. }
  69. //# sourceMappingURL=schemaInstrumentation.js.map