@@ -27,6 +27,7 @@ var checkPropTypes = require('prop-types/checkPropTypes');
27
27
var camelizeStyleName = require ( 'fbjs/lib/camelizeStyleName' ) ;
28
28
var stream = require ( 'stream' ) ;
29
29
var lru = require ( 'lru-cache' ) ;
30
+ var { promisify} = require ( 'util' ) ;
30
31
31
32
/**
32
33
* WARNING: DO NOT manually require this module.
@@ -2204,7 +2205,11 @@ var ReactDOMServerRenderer = function () {
2204
2205
// TODO: type this more strictly:
2205
2206
2206
2207
2207
- ReactDOMServerRenderer . prototype . read = function read ( bytes , cache ) {
2208
+ ReactDOMServerRenderer . prototype . read = async function read ( bytes , cache ) {
2209
+ // Promisify the get method, which is asynchronous for Redis
2210
+ const getAsync = promisify ( cache . get ) . bind ( cache ) ;
2211
+ let continueLoop = true ;
2212
+ // Store starting locations of about-to-be-cached HTML within 'out'
2208
2213
const start = { } ;
2209
2214
if ( this . exhausted ) {
2210
2215
return null ;
@@ -2228,21 +2233,25 @@ var ReactDOMServerRenderer = function () {
2228
2233
}
2229
2234
continue ;
2230
2235
}
2231
-
2232
2236
var child = frame . children [ frame . childIndex ++ ] ;
2233
2237
{
2234
2238
setCurrentDebugStack ( this . stack ) ;
2235
2239
}
2236
2240
2237
- // IF THE CHILD HAS A CACHEKEY PROPERTY ON IT
2238
- if ( child . props . cache ) {
2241
+ // CACHING LOGIC: EXECUTES IF THE CHILD HAS A 'CACHE' PROP ON IT
2242
+ if ( child . props && child . props . cache ) {
2243
+ // Create unique cacheKey as a function of component name and props
2239
2244
const cacheKey = child . type . name + JSON . stringify ( child . props ) ;
2240
- if ( ! cache . storage . get ( cacheKey ) ) {
2245
+
2246
+ // Check cache (async function)
2247
+ const reply = await getAsync ( cacheKey ) ;
2248
+ if ( reply ) {
2249
+ out += reply ;
2250
+ } else {
2241
2251
start [ cacheKey ] = out . length ;
2242
2252
out += this . render ( child , frame . context , frame . domNamespace ) ;
2243
- } else {
2244
- out += cache . storage . get ( cacheKey ) ;
2245
2253
}
2254
+
2246
2255
} else {
2247
2256
out += this . render ( child , frame . context , frame . domNamespace ) ;
2248
2257
}
@@ -2252,13 +2261,14 @@ var ReactDOMServerRenderer = function () {
2252
2261
}
2253
2262
}
2254
2263
2255
- for ( let component in start ) {
2264
+ // Add newly marked items to the cache:
2265
+ for ( let cacheKey in start ) {
2256
2266
let tagStack = [ ] ;
2257
2267
let tagStart ;
2258
2268
let tagEnd ;
2259
2269
2260
2270
do {
2261
- if ( ! tagStart ) tagStart = start [ component ] ;
2271
+ if ( ! tagStart ) tagStart = start [ cacheKey ] ;
2262
2272
else tagStart = ( out [ tagEnd ] === '<' ) ? tagEnd : out . indexOf ( '<' , tagEnd )
2263
2273
tagEnd = out . indexOf ( '>' , tagStart ) + 1 ;
2264
2274
// Skip stack logic for void/self-closing elements
@@ -2270,7 +2280,7 @@ var ReactDOMServerRenderer = function () {
2270
2280
} while ( tagStack . length !== 0 ) ;
2271
2281
2272
2282
// cache component by slicing 'out'
2273
- cache . storage . set ( component , out . slice ( start [ component ] , tagEnd ) ) ;
2283
+ cache . set ( cacheKey , out . slice ( start [ cacheKey ] , tagEnd ) ) ;
2274
2284
}
2275
2285
return out ;
2276
2286
} ;
@@ -2529,9 +2539,9 @@ var ReactDOMServerRenderer = function () {
2529
2539
* server.
2530
2540
* See https://reactjs.org/docs/react-dom-server.html#rendertostring
2531
2541
*/
2532
- function renderToString ( element , cache ) {
2542
+ async function renderToString ( element , cache ) {
2533
2543
var renderer = new ReactDOMServerRenderer ( element , false ) ;
2534
- var markup = renderer . read ( Infinity , cache ) ;
2544
+ var markup = await renderer . read ( Infinity , cache ) ;
2535
2545
return markup ;
2536
2546
}
2537
2547
@@ -2613,8 +2623,17 @@ class ComponentCache {
2613
2623
length : ( n , key ) => {
2614
2624
return n . length + key . length ;
2615
2625
}
2616
- } ) ;
2626
+ } ) ;
2627
+ }
2628
+
2629
+ get ( cacheKey , cb ) {
2630
+ let reply = this . storage . get ( cacheKey ) ;
2631
+ // return reply;
2632
+ cb ( null , reply ) ;
2633
+ }
2617
2634
2635
+ set ( cacheKey , html ) {
2636
+ this . storage . set ( cacheKey , html ) ;
2618
2637
}
2619
2638
}
2620
2639
0 commit comments