Eburones

User sessions for ambiorix.

Installation

# install.packages("remotes")
remotes::install_github("ambiorix-web/eburones")

Example

Simply use the eburones middleware.

Local

⚠️ The local backend should only be used for local development, never in production. It will also not properly track sessions with belgic.

library(eburones)
library(ambiorix)

app <- Ambiorix$new()

app$use(eburones())

app$get("/", \(req, res){
  print(req$session)
  res$send("Hello there!")
})

app$start()

Below is an example to track page views. We create a callback function that returns a list containing the number of page views. This callback is run at every request for the session, we increment it at every visit.

library(eburones)
library(ambiorix)

app <- Ambiorix$new()

pv <- \(req, res) {

  # no session = new user
  if(is.null(req$session))
    return(
      list(
        page_views = 1L
      )
    )

  # existing user = increment
  list(
    page_views = req$session$page_views + 1L
  ) 
}

app$use(
  eburones(callback = pv)
)

app$get("/", \(req, res){
  res$sendf("Hello there for the %s time", req$session$page_views)
})

app$start()

DBI

There is a DBI backend. We implement the same page view tracker as above. One difference is that the DBI backend expects the callback to return a data.frame of 1 row.

library(eburones)
library(ambiorix)

app <- Ambiorix$new()

pv <- \(req, res) {

  # new user return a data.frame
  if(is.null(req$session))
    return(
      data.frame(
        page_views = 1L
      )
    )

  # we need to return a data.frame (1 row)
  data.frame(
    page_views = req$session$page_views + 1L
  ) 
}

# we create a connection to a database (SQLite in this case)
con <- DBI::dbConnect(RSQLite::SQLite(), ":memory:"o)

# we need to create the table we'll use to store sessions
# it must contain a key column where user token will be stored
DBI::dbExecute(
  con,
  "CREATE TABLE sessions (
    key TEXT,
    page_views INTEGER
  )"
)

backend <- DBI$new(con, "sessions")

app$use(
  eburones(backend = backend, callback = pv)
)

app$get("/", \(req, res){
  res$sendf("Hello there for the %s time", req$session$page_views)
})

app$start()