1. /**
    
  2.  * Copyright (c) Meta Platforms, Inc. and affiliates.
    
  3.  *
    
  4.  * This source code is licensed under the MIT license found in the
    
  5.  * LICENSE file in the root directory of this source tree.
    
  6.  *
    
  7.  * @flow
    
  8.  */
    
  9. 
    
  10. import type {Thenable} from 'shared/ReactTypes.js';
    
  11. 
    
  12. import type {Response} from 'react-client/src/ReactFlightClient';
    
  13. 
    
  14. import type {
    
  15.   SSRModuleMap,
    
  16.   ModuleLoading,
    
  17. } from 'react-client/src/ReactFlightClientConfig';
    
  18. 
    
  19. type SSRManifest = {
    
  20.   moduleMap: SSRModuleMap,
    
  21.   moduleLoading: ModuleLoading,
    
  22. };
    
  23. 
    
  24. import type {Readable} from 'stream';
    
  25. 
    
  26. import {
    
  27.   createResponse,
    
  28.   getRoot,
    
  29.   reportGlobalError,
    
  30.   processBinaryChunk,
    
  31.   close,
    
  32. } from 'react-client/src/ReactFlightClient';
    
  33. 
    
  34. import {createServerReference as createServerReferenceImpl} from 'react-client/src/ReactFlightReplyClient';
    
  35. 
    
  36. function noServerCall() {
    
  37.   throw new Error(
    
  38.     'Server Functions cannot be called during initial render. ' +
    
  39.       'This would create a fetch waterfall. Try to use a Server Component ' +
    
  40.       'to pass data to Client Components instead.',
    
  41.   );
    
  42. }
    
  43. 
    
  44. export function createServerReference<A: Iterable<any>, T>(
    
  45.   id: any,
    
  46.   callServer: any,
    
  47. ): (...A) => Promise<T> {
    
  48.   return createServerReferenceImpl(id, noServerCall);
    
  49. }
    
  50. 
    
  51. export type Options = {
    
  52.   nonce?: string,
    
  53. };
    
  54. 
    
  55. function createFromNodeStream<T>(
    
  56.   stream: Readable,
    
  57.   ssrManifest: SSRManifest,
    
  58.   options?: Options,
    
  59. ): Thenable<T> {
    
  60.   const response: Response = createResponse(
    
  61.     ssrManifest.moduleMap,
    
  62.     ssrManifest.moduleLoading,
    
  63.     noServerCall,
    
  64.     options && typeof options.nonce === 'string' ? options.nonce : undefined,
    
  65.   );
    
  66.   stream.on('data', chunk => {
    
  67.     processBinaryChunk(response, chunk);
    
  68.   });
    
  69.   stream.on('error', error => {
    
  70.     reportGlobalError(response, error);
    
  71.   });
    
  72.   stream.on('end', () => close(response));
    
  73.   return getRoot(response);
    
  74. }
    
  75. 
    
  76. export {createFromNodeStream};