Saltar al contenido

API de Astro Session Driver

Las sesiones de Astro te permiten compartir datos entre solicitudes para páginas renderizadas bajo demanda. Requieren un Astro Session Driver para almacenar los datos de sesión.

Astro exporta drivers de sesión integrados desde astro/config:

import { sessionDrivers } from 'astro/config'

Cualquier driver de unstorage puede usarse, por ejemplo:

astro.config.mjs
import { defineConfig, sessionDrivers } from 'astro/config'
export default defineConfig({
session: {
driver: sessionDrivers.redis({
url: process.env.REDIS_URL
}),
}
})

Un driver de sesión está compuesto por dos partes:

Un SessionDriverConfig es un objeto que contiene un entrypoint de runtime obligatorio y una config opcional. El método preferido para implementarlo es exportar una función que devuelva este objeto y tome la configuración como un parámetro opcional.

El siguiente ejemplo define una configuración de driver en memoria:

driver/config.ts
import type { SessionDriverConfig } from 'astro'
export interface Config {
max?: number;
}
export function memoryDriver(config: Config = {}): SessionDriverConfig {
return {
entrypoint: new URL('./runtime.js', import.meta.url),
config,
}
}

Luego se registra en la configuración de Astro:

astro.config.ts
import { defineConfig } from 'astro/config'
import { memoryDriver } from './driver/config'
export default defineConfig({
session: {
driver: memoryDriver({
max: 500
})
}
})

Type: string | URL

Añadido en: astro@6.0.0

Define el entrypoint para la implementación del driver.

Type: Record<string, any> | undefined

Añadido en: astro@6.0.0

Define la configuración serializable pasada a la implementación del driver en tiempo de ejecución.

Un SessionDriver es un objeto responsable de almacenar, recuperar y eliminar datos al usar sesiones en tiempo de ejecución (ej. context.session.set()). Puedes implementarlo en tu módulo de driver de sesión exportando una función por defecto que tome la configuración del driver como parámetro.

El siguiente ejemplo implementa un driver en memoria:

driver/runtime.ts
import type { SessionDriver } from 'astro'
import type { Config } from './config'
import { LRUCache } from 'lru-cache'
export default function(config: Config): SessionDriver {
const cache = new LRUCache({ max: config.max })
return {
setItem: async (key, value) => {
cache.set(key, value)
},
getItem: async (key) => {
return cache.get(key)
},
removeItem: async (key) => {
cache.delete(key)
},
}
}

Type: (key: string, value: any) => Promise<void>

Añadido en: astro@6.0.0

Define una función que establece datos de sesión por clave.

Type: (key: string) => Promise<any>

Añadido en: astro@6.0.0

Define una función que recupera datos de sesión por clave.

Type: (key: string) => Promise<void>

Añadido en: astro@6.0.0

Define una función que elimina datos de sesión por clave.

Los tipos de driver de Unstorage son compatibles con el tipo SessionDriver de Astro.

Eso significa que puedes usar un export del paquete unstorage como entrypoint. Por ejemplo:

driver/config.ts
import type { SessionDriverConfig } from 'astro'
export function configuredRedisDriver(): SessionDriverConfig {
return {
entrypoint: 'unstorage/drivers/redis',
config: {
tls: true
}
}
}

Alternativamente, puedes importar y usar un driver de unstorage directamente en la implementación. Por ejemplo:

driver/runtime.ts
import type { SessionDriver } from 'astro'
import redisDriver from "unstorage/drivers/redis";
export default function(config): SessionDriver {
return redisDriver({
...config,
tls: true
})
}
Contribuir Comunidad Patrocinar