Merge pull request #1074 from rstudio/reconnect

Reconnect
This commit is contained in:
Joe Cheng
2016-03-29 09:53:20 -07:00
11 changed files with 426 additions and 31 deletions

View File

@@ -3,6 +3,10 @@
#' These functions show and remove notifications in a Shiny application.
#'
#' @param ui Content of message.
#' @param action Message content that represents an action. For example, this
#' could be a link that the user can click on. This is separate from \code{ui}
#' so customized layouts can handle the main notification content separately
#' from action content.
#' @param duration Number of seconds to display the message before it
#' disappears. Use \code{NULL} to make the message not automatically
#' disappear.
@@ -28,7 +32,9 @@
#' ),
#' server = function(input, output) {
#' observeEvent(input$show, {
#' showNotification("Message text")
#' showNotification("Message text",
#' action = a(href = "javascript:location.reload();", "Reload page")
#' )
#' })
#' }
#' )
@@ -61,8 +67,9 @@
#' )
#' }
#' @export
showNotification <- function(ui, duration = 5, closeButton = TRUE,
id = NULL, type = c("default", "message", "warning", "error"),
showNotification <- function(ui, action = NULL, duration = 5,
closeButton = TRUE, id = NULL,
type = c("default", "message", "warning", "error"),
session = getDefaultReactiveDomain())
{
@@ -70,11 +77,13 @@ showNotification <- function(ui, duration = 5, closeButton = TRUE,
id <- randomID()
res <- processDeps(ui, session)
actionRes <- processDeps(action, session)
session$sendNotification("show",
list(
html = res$html,
deps = res$deps,
action = actionRes$html,
deps = c(res$deps, actionRes$deps),
duration = if (!is.null(duration)) duration * 1000,
closeButton = closeButton,
id = id,

View File

@@ -241,6 +241,18 @@ workerId <- local({
#' This is the request that was used to initiate the websocket connection
#' (as opposed to the request that downloaded the web page for the app).
#' }
#' \item{allowReconnect(value)}{
#' If \code{value} is \code{TRUE} and run in a hosting environment (Shiny
#' Server or Connect) with reconnections enabled, then when the session ends
#' due to the network connection closing, the client will attempt to
#' reconnect to the server. If a reconnection is successful, the browser will
#' send all the current input values to the new session on the server, and
#' the server will recalculate any outputs and send them back to the client.
#' If \code{value} is \code{FALSE}, reconnections will be disabled (this is
#' the default state). If \code{"force"}, then the client browser will always
#' attempt to reconnect. The only reason to use \code{"force"} is for testing
#' on a local connection (without Shiny Server or Connect).
#' }
#' \item{sendCustomMessage(type, message)}{
#' Sends a custom message to the web page. \code{type} must be a
#' single-element character vector giving the type of message, while
@@ -530,6 +542,14 @@ ShinySession <- R6Class(
setShowcase = function(value) {
private$showcase <- !is.null(value) && as.logical(value)
},
allowReconnect = function(value) {
if (!(identical(value, TRUE) || identical(value, FALSE) || identical(value, "force"))) {
stop('value must be TRUE, FALSE, or "force"')
}
private$write(toJSON(list(allowReconnect = value)))
},
defineOutput = function(name, func, label) {
"Binds an output generating function to this name. The function can either
take no parameters, or have named parameters for \\code{name} and