1
1
import { lstat } from 'fs' ;
2
+ import { Transform } from "stream" ;
3
+ import { create } from "domain" ;
2
4
3
5
/** @license React v16.2.0
4
6
* react-dom-server.node.development.js
@@ -2387,7 +2389,6 @@ var ReactDOMServerRenderer = function () {
2387
2389
out += outCopy . substring ( bookmark , outCopy . length ) ;
2388
2390
}
2389
2391
} else {
2390
- // console.log(out.length, streamingStart);
2391
2392
streamingStart . sliceStartCount += out . length ;
2392
2393
}
2393
2394
return out ;
@@ -2650,7 +2651,7 @@ var ReactDOMServerRenderer = function () {
2650
2651
async function renderToString ( element , cache , memLife = 0 ) {
2651
2652
// If and only if using memcached, pass the lifetime of your cache entry (in seconds) into 'memLife'.
2652
2653
var renderer = new ReactDOMServerRenderer ( element , false ) ;
2653
- var markup = await renderer . read ( Infinity , cache , memLife ) ;
2654
+ var markup = await renderer . read ( Infinity , cache , false , null , memLife ) ;
2654
2655
return markup ;
2655
2656
}
2656
2657
@@ -2659,9 +2660,9 @@ async function renderToString(element, cache, memLife=0) {
2659
2660
* such as data-react-id that React uses internally.
2660
2661
* See https://reactjs.org/docs/react-dom-server.html#rendertostaticmarkup
2661
2662
*/
2662
- function renderToStaticMarkup ( element , cache ) {
2663
+ function renderToStaticMarkup ( element , cache , memLife = 0 ) {
2663
2664
var renderer = new ReactDOMServerRenderer ( element , true ) ;
2664
- var markup = renderer . read ( Infinity , cache ) ;
2665
+ var markup = renderer . read ( Infinity , cache , false , null , memLife ) ;
2665
2666
return markup ;
2666
2667
}
2667
2668
@@ -2698,15 +2699,6 @@ var ReactMarkupReadableStream = function (_Readable) {
2698
2699
this . streamingStart ,
2699
2700
this . memLife ) ;
2700
2701
this . push ( readOutput ) ;
2701
- // this.push(
2702
- // this.partialRenderer.read(
2703
- // size,
2704
- // this.cache,
2705
- // true,
2706
- // this.streamingStart,
2707
- // this.memLife
2708
- // )
2709
- // );
2710
2702
} catch ( err ) {
2711
2703
this . emit ( 'error' , err ) ;
2712
2704
}
@@ -2736,10 +2728,57 @@ function renderToNodeStream(element, cache, streamingStart, memLife=0) {
2736
2728
* such as data-react-id that React uses internally.
2737
2729
* See https://reactjs.org/docs/react-dom-stream.html#rendertostaticnodestream
2738
2730
*/
2739
- function renderToStaticNodeStream ( element ) {
2740
- return new ReactMarkupReadableStream ( element , true ) ;
2731
+ function renderToStaticNodeStream ( element , cache , streamingStart , memLife = 0 ) {
2732
+ return new ReactMarkupReadableStream ( element , true , cache , streamingStart , memLife ) ;
2741
2733
}
2742
2734
2735
+ function createCacheStream ( cache , streamingStart , memLife = 0 ) {
2736
+ const bufferedChunks = [ ] ;
2737
+ return new Transform ( {
2738
+ // transform() is called with each chunk of data
2739
+ transform ( data , enc , cb ) {
2740
+ // We store the chunk of data (which is a Buffer) in memory
2741
+ bufferedChunks . push ( data ) ;
2742
+ // Then pass the data unchanged onwards to the next stream
2743
+ cb ( null , data ) ;
2744
+ } ,
2745
+
2746
+ // flush() is called when everything is done
2747
+ flush ( cb ) {
2748
+ // We concatenate all the buffered chunks of HTML to get the full HTML, then cache it at "key"
2749
+ let html = bufferedChunks . join ( "" ) ;
2750
+ delete streamingStart . sliceStartCount ;
2751
+
2752
+ for ( let component in streamingStart ) {
2753
+ let tagStack = [ ] ;
2754
+ let tagStart ;
2755
+ let tagEnd ;
2756
+
2757
+ do {
2758
+ if ( ! tagStart ) tagStart = streamingStart [ component ] ;
2759
+ else tagStart = ( html [ tagEnd ] === '<' ) ? tagEnd : html . indexOf ( '<' , tagEnd ) ;
2760
+ tagEnd = html . indexOf ( '>' , tagStart ) + 1 ;
2761
+ // Skip stack logic for void/self-closing elements and HTML comments
2762
+ if ( html [ tagEnd - 2 ] !== '/' && html [ tagStart + 1 ] !== '!' ) {
2763
+ // Push opening tags onto stack; pop closing tags off of stack
2764
+ if ( html [ tagStart + 1 ] !== '/' ) tagStack . push ( html . slice ( tagStart , tagEnd ) ) ;
2765
+ else tagStack . pop ( ) ;
2766
+ }
2767
+ } while ( tagStack . length !== 0 ) ;
2768
+ // cache component by slicing 'html'
2769
+ if ( memLife ) {
2770
+ cache . set ( component , html . slice ( streamingStart [ component ] , tagEnd ) , memLife , ( err ) => {
2771
+ if ( err ) console . log ( err )
2772
+ } ) ;
2773
+ } else {
2774
+ cache . set ( component , html . slice ( streamingStart [ component ] , tagEnd ) ) ;
2775
+ }
2776
+ }
2777
+ cb ( ) ;
2778
+ }
2779
+ } ) ;
2780
+ } ;
2781
+
2743
2782
class ComponentCache {
2744
2783
constructor ( config = { } ) {
2745
2784
@@ -2775,6 +2814,7 @@ var ReactDOMServerNode = {
2775
2814
renderToNodeStream : renderToNodeStream ,
2776
2815
renderToStaticNodeStream : renderToStaticNodeStream ,
2777
2816
ComponentCache : ComponentCache ,
2817
+ createCacheStream : createCacheStream ,
2778
2818
version : ReactVersion
2779
2819
} ;
2780
2820
0 commit comments