Skip to main content

Eburones

User sessions for ambiorix.

Installation

# install.packages("remotes")
remotes::install_github("devOpifex/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()