httpBatching.js 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. import { newHTTPGraphQLHead, runHttpQuery } from './runHttpQuery.js';
  2. import { BadRequestError } from './internalErrorClasses.js';
  3. async function runBatchedHttpQuery({ server, batchRequest, body, contextValue, schemaDerivedData, internals, }) {
  4. if (body.length === 0) {
  5. throw new BadRequestError('No operations found in request.');
  6. }
  7. const sharedResponseHTTPGraphQLHead = newHTTPGraphQLHead();
  8. const responseBodies = await Promise.all(body.map(async (bodyPiece) => {
  9. const singleRequest = {
  10. ...batchRequest,
  11. body: bodyPiece,
  12. };
  13. const response = await runHttpQuery({
  14. server,
  15. httpRequest: singleRequest,
  16. contextValue,
  17. schemaDerivedData,
  18. internals,
  19. sharedResponseHTTPGraphQLHead,
  20. });
  21. if (response.body.kind === 'chunked') {
  22. throw Error('Incremental delivery is not implemented for batch requests');
  23. }
  24. return response.body.string;
  25. }));
  26. return {
  27. ...sharedResponseHTTPGraphQLHead,
  28. body: { kind: 'complete', string: `[${responseBodies.join(',')}]` },
  29. };
  30. }
  31. export async function runPotentiallyBatchedHttpQuery(server, httpGraphQLRequest, contextValue, schemaDerivedData, internals) {
  32. if (!(httpGraphQLRequest.method === 'POST' &&
  33. Array.isArray(httpGraphQLRequest.body))) {
  34. return await runHttpQuery({
  35. server,
  36. httpRequest: httpGraphQLRequest,
  37. contextValue,
  38. schemaDerivedData,
  39. internals,
  40. sharedResponseHTTPGraphQLHead: null,
  41. });
  42. }
  43. if (internals.allowBatchedHttpRequests) {
  44. return await runBatchedHttpQuery({
  45. server,
  46. batchRequest: httpGraphQLRequest,
  47. body: httpGraphQLRequest.body,
  48. contextValue,
  49. schemaDerivedData,
  50. internals,
  51. });
  52. }
  53. throw new BadRequestError('Operation batching disabled.');
  54. }
  55. //# sourceMappingURL=httpBatching.js.map