Dead simple middleware for R Shiny.
tower
is a simple library for adding middleware to Shiny
applications. It is inspired by the tower crate for Rust. It
is designed to enable package authors and Shiny developers to extend
Shiny a little bit more than what is usually possible.
You can use tower
to add middlewares that forward,
modify, or intercept requests in Shiny applications. This can be useful
for adding logging, authentication, caching, or routing to your Shiny
applications.
You can install the development version of tower
from
GitHub with:
# install.packages("remotes")
::install_github("ixpantia/tower") remotes
We may want to add a new route to our Shiny application that adds a
count to a counter every time a user visits the route. We can do this
with tower
by adding a middleware that intercepts the
request and increments the counter.
library(shiny)
library(tower)
# Counter environment
<- new.env()
global_counter $count <- 0
global_counter
# Middleware to increment the counter
<- function(req) {
increment_counter $count <- global_counter$count + 1
global_counterresponse_builder() |>
add_body(paste("Counter is now", global_counter$count)) |>
build_response()
}
# A very empty Shiny app (not necesarry for the demo)
<- fluidPage()
ui <- function(input, output, session) {}
server
shinyApp(ui, server) |>
create_tower() |>
add_get_route("/counter", increment_counter) |>
build_tower()
If you run the code above and visit the route /counter
in your browser, you will see the counter increment every time you visit
the route.
Basically, tower
adds layers to a Shiny application. A
layer is a function that takes a request and returns either a response
or NULL. If a layer returns a response, the response is sent to the
client and the request is not forwarded to the next layer. If a layer
returns NULL, the request is forwarded to the next layer.