1
0

parse-context.ts 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  1. import { ArgumentsHost, ExecutionContext } from '@nestjs/common';
  2. import { GqlExecutionContext } from '@nestjs/graphql';
  3. import { Request, Response } from 'express';
  4. import { GraphQLResolveInfo } from 'graphql';
  5. export type RestContext = { req: Request; res: Response; isGraphQL: false; info: undefined };
  6. export type GraphQLContext = {
  7. req: Request;
  8. res: Response;
  9. isGraphQL: true;
  10. info: GraphQLResolveInfo;
  11. };
  12. /**
  13. * Parses in the Nest ExecutionContext of the incoming request, accounting for both
  14. * GraphQL & REST requests.
  15. */
  16. export function parseContext(context: ExecutionContext | ArgumentsHost): RestContext | GraphQLContext {
  17. // TODO: Remove this check once this issue is resolved: https://github.com/nestjs/graphql/pull/1469
  18. if ((context as ExecutionContext).getHandler?.()?.name === '__resolveType') {
  19. return {
  20. req: context.getArgs()[1].req,
  21. res: context.getArgs()[1].res,
  22. isGraphQL: false,
  23. info: undefined,
  24. };
  25. }
  26. const graphQlContext = GqlExecutionContext.create(context as ExecutionContext);
  27. const info = graphQlContext.getInfo();
  28. let req: Request;
  29. let res: Response;
  30. if (info) {
  31. const ctx = graphQlContext.getContext();
  32. req = ctx.req;
  33. res = ctx.res;
  34. } else {
  35. req = context.switchToHttp().getRequest();
  36. res = context.switchToHttp().getResponse();
  37. }
  38. return {
  39. req,
  40. res,
  41. info,
  42. isGraphQL: !!info,
  43. };
  44. }