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. export type Options = {
    
  44.   nonce?: string,
    
  45. };
    
  46. 
    
  47. export function createServerReference<A: Iterable<any>, T>(
    
  48.   id: any,
    
  49.   callServer: any,
    
  50. ): (...A) => Promise<T> {
    
  51.   return createServerReferenceImpl(id, noServerCall);
    
  52. }
    
  53. 
    
  54. function createFromNodeStream<T>(
    
  55.   stream: Readable,
    
  56.   ssrManifest: SSRManifest,
    
  57.   options?: Options,
    
  58. ): Thenable<T> {
    
  59.   const response: Response = createResponse(
    
  60.     ssrManifest.moduleMap,
    
  61.     ssrManifest.moduleLoading,
    
  62.     noServerCall,
    
  63.     options && typeof options.nonce === 'string' ? options.nonce : undefined,
    
  64.   );
    
  65.   stream.on('data', chunk => {
    
  66.     processBinaryChunk(response, chunk);
    
  67.   });
    
  68.   stream.on('error', error => {
    
  69.     reportGlobalError(response, error);
    
  70.   });
    
  71.   stream.on('end', () => close(response));
    
  72.   return getRoot(response);
    
  73. }
    
  74. 
    
  75. export {createFromNodeStream};