@@ -844,18 +844,21 @@ Dash <- R6::R6Class(
844
844
# ' @param description Character. A description of the resource.
845
845
# '
846
846
callback_context.record_timing = function (name ,
847
- duration = NULL ,
847
+ duration = NULL ,
848
848
description = NULL ) {
849
- timing_information <- self $ server $ get_data( " timing-information " )
849
+ timing_information_ <- attributes(dynGet( " request " )) $ timing_information
850
850
851
- if (name %in% timing_information ) {
851
+ if (name %in% timing_information_ ) {
852
852
stop(paste0(" Duplicate resource name " , name , " found." ), call. = FALSE )
853
853
}
854
854
855
- timing_information [[name ]] <- list (" dur" = round(duration * 1000 ),
856
- " desc" = description )
855
+ timing_information_ [[name ]] <- list (" dur" = round(duration * 1000 ),
856
+ " desc" = description )
857
857
858
- self $ server $ set_data(" timing-information" , timing_information )
858
+ self $ server $ set_data(" timing-information" , timing_information_ )
859
+
860
+ evalq(attr(req , " timing_information" ) <- app $ server $ get_data(" timing-information" ),
861
+ envir = countEnclosingFrames(" request" ))
859
862
},
860
863
861
864
# ------------------------------------------------------------------------
@@ -1246,37 +1249,43 @@ Dash <- R6::R6Class(
1246
1249
self $ config $ props_check <- dev_tools_props_check
1247
1250
1248
1251
if (private $ debug && self $ config $ ui ) {
1249
- self $ server $ on(' before-request' , function (server , ... ) {
1250
- self $ server $ set_data( " timing_information" , list (
1252
+ self $ server $ on(' before-request' , function (server , request , ... ) {
1253
+ attr( request , " timing_information" ) <- list (
1251
1254
" __dash_server" = list (
1252
1255
" dur" = as.numeric(Sys.time()),
1253
1256
" desc" = NULL
1254
1257
)
1255
- ))
1258
+ )
1256
1259
})
1257
1260
1258
1261
self $ server $ on(' request' , function (server , request , ... ) {
1259
- timing_information <- self $ server $ get_data( ' timing-information ' )
1260
- dash_total <- timing_information [[' __dash_server' ]]
1261
- dash_total [[' dur' ]] <- round(as.numeric(Sys.time() - dash_total [[' dur' ]]) * 1000 )
1262
-
1262
+ timing_information_ <- attr( request , " timing_information " )
1263
+ dash_total <- timing_information_ [[' __dash_server' ]]
1264
+ dash_total [[' dur' ]] <- round(( as.numeric(Sys.time() ) - dash_total [[' dur' ]]) * 1000 )
1265
+
1263
1266
request $ response $ append_header(' Server-Timing' ,
1264
1267
paste0(' dash_total;dur=' , dash_total [[' dur' ]]))
1265
1268
1266
- for ( item in seq_along( timing_information )) {
1267
- header_content <- paste0( names(timing_information [ item ]), ' ; ' )
1269
+ # ensure dash_server is not returned within the header
1270
+ timing_information_ <- timing_information_ [ names(timing_information_ ) != " __dash_server " ]
1268
1271
1269
- if (! is.null(timing_information [[item ]]$ desc )) {
1270
- header_content <- paste0(header_content , ' desc="' , timing_information [[item ]]$ desc , ' "' )
1272
+ for (item in seq_along(timing_information_ )) {
1273
+ header_content <- paste0(names(timing_information_ [item ]), ' ;' )
1274
+
1275
+ if (! is.null(timing_information_ [[item ]]$ desc )) {
1276
+ header_content <- paste0(header_content , ' desc="' , timing_information_ [[item ]]$ desc , ' "' )
1271
1277
}
1272
1278
1273
- if (! is.null(timing_information [[item ]]$ dur )) {
1274
- header_content <- paste0(header_content , ' ;dur=' , timing_information [[item ]]$ dur )
1279
+ if (! is.null(timing_information_ [[item ]]$ dur )) {
1280
+ header_content <- paste0(header_content , ' ;dur=' , timing_information_ [[item ]]$ dur )
1275
1281
}
1276
1282
1277
1283
request $ response $ append_header(' Server-Timing' ,
1278
1284
header_content )
1279
1285
}
1286
+
1287
+ # flush the context (probably unnecessary, but to be overly safe)
1288
+ attr(request , " timing_information" ) <- list ()
1280
1289
})
1281
1290
}
1282
1291
@@ -1386,16 +1395,13 @@ Dash <- R6::R6Class(
1386
1395
1387
1396
# reset the timestamp so we're able to determine when the last cycle end occurred
1388
1397
private $ last_cycle <- as.integer(Sys.time())
1389
-
1390
- # flush the context to prepare for the next request cycle
1391
- self $ server $ set_data(" timing_information" , list ())
1392
1398
})
1393
1399
} else if (hot_reload == TRUE & is.null(source_dir )) {
1394
1400
message(" \U {26A0} No source directory information available; hot reloading has been disabled.\n Please ensure that you are loading your Dash for R application using source().\n " )
1395
1401
} else if (hot_reload == FALSE && private $ debug && self $ config $ ui ) {
1396
1402
self $ server $ on(" cycle-end" , function (server , ... ) {
1397
- # flush the context to prepare for the next request cycle
1398
- self $ server $ set_data(" timing_information " , list ())
1403
+ # ensure the timing-information store is flushed
1404
+ self $ server $ set_data(" timing-information " , list ())
1399
1405
})
1400
1406
}
1401
1407
0 commit comments