SurrealSession

The SurrealSession class represents a scoped contextual session attached to a SurrealDB connection. It provides authentication, session configuration, and inherits all query execution methods from SurrealQueryable.

Sessions allow you to maintain isolated contexts with their own namespace, database, variables, and authentication state, while sharing the underlying connection.

Extends: SurrealQueryable

Extended by: Surreal

Source: api/session.ts

The constructor is typically not called directly. Use Surreal.newSession() or forkSession() to create new sessions.

Returns the currently selected namespace for this session.

Type: string | undefined

Example:

console.log(session.namespace); // "my_namespace"

Returns the currently selected database for this session.

Type: string | undefined

Example:

console.log(session.database); // "my_database"

Returns the current authentication access token for this session.

Type: string | undefined

Example:

if (session.accessToken) {
console.log('Session is authenticated');
}

Returns all parameters currently defined on the session.

Type: Record<string, unknown>

Example:

console.log(session.parameters); // { user_id: '123', role: 'admin' }

Returns the unique session ID. For the default session, undefined is returned.

Type: Uuid | undefined

Example:

const sessionId = session.session;
console.log('Session ID:', sessionId);

Returns whether the session is valid and can be used. This is always true for the default session, but will be false for sessions that have been disposed via reset() or closeSession().

Type: boolean

Example:

if (session.isValid) {
await session.select('users');
} else {
console.log('Session has been closed');
}

Create a new session by cloning the current session. The new session inherits all properties from the parent session including namespace, database, variables, and authentication state.

Sessions are automatically restored when the connection reconnects. Call reset() on the created session to destroy it.

Method Syntax

session.forkSession()

Promise<SurrealSession> - A new session instance

// Create a forked session that inherits parent state
const childSession = await session.forkSession();

// The child inherits parent's namespace and database
console.log(childSession.namespace); // Same as parent
console.log(childSession.database); // Same as parent

// But can be changed independently
await childSession.use({ database: 'other_db' });

// Parent session remains unchanged
console.log(session.database); // Original database
console.log(childSession.database); // 'other_db'

// Clean up when done
await childSession.reset();

Closes the current session and disposes of it. After this method is called, the session cannot be used again, and isValid will return false.

Method Syntax

session.closeSession()

Promise<void> - Resolves when the session is closed

await session.closeSession();
console.log(session.isValid); // false

Create a new transaction scoped to the current session. Transactions allow you to execute multiple queries atomically.

Call commit() on the transaction to apply changes, or cancel() to discard them.

Method Syntax

session.beginTransaction()

Promise<SurrealTransaction> - A new SurrealTransaction instance

// Start a transaction
const txn = await session.beginTransaction();

try {
// Execute queries within the transaction
await txn.create(new RecordId('users', 'john'), {
content: { name: 'John Doe', email: 'john@example.com' }
});

await txn.create(new RecordId('posts', '1'), {
content: { author: new RecordId('users', 'john'), title: 'Hello' }
});

// Commit all changes atomically
await txn.commit();
console.log('Transaction committed successfully');
} catch (error) {
// Roll back on error
await txn.cancel();
console.error('Transaction cancelled:', error);
}

Switch to the specified namespace and/or database for this session.

Leaving the namespace or database undefined will leave the current value unchanged, while passing null will unset the selected namespace or database.

Method Syntax

session.use(what)
ParameterTypeDescription
what NamespaceDatabase | nullObject specifying namespace and/or database to switch to.

Promise<NamespaceDatabase> - The newly selected namespace and database

Switch Both Namespace and Database

await session.use({ 
namespace: 'production',
database: 'main'
});

Switch Only Database

await session.use({ 
database: 'analytics'
});
// Namespace remains unchanged

Unset Database

await session.use({ 
database: null
});
// Database is now undefined

Define a variable for the current session. Variables can be used in SurrealQL queries with the $ prefix.

Method Syntax

session.set(variable, value)
ParameterTypeDescription
variable stringThe name of the variable (without the $ prefix).
value unknownThe value to assign to the variable.

Promise<void> - Resolves when the variable is set

// Set a variable
await session.set('user_id', '12345');

// Use it in a query
const result = await session.query(
'SELECT * FROM posts WHERE author = $user_id'
).collect();

Remove a variable from the current session.

Method Syntax

session.unset(variable)
ParameterTypeDescription
variable stringThe name of the variable to remove (without the $ prefix).

Promise<void> - Resolves when the variable is removed

await session.unset('user_id');

Resets the current session to its initial state, clearing authentication state, variables, and selected namespace/database.

For non-default sessions, this also closes and disposes of the session.

Method Syntax

session.reset()

Promise<void> - Resolves when the session is reset

// Reset session to clean state
await session.reset();

// Session is now cleared
console.log(session.namespace); // undefined
console.log(session.accessToken); // undefined
console.log(session.parameters); // {}

Sign up a new record user to the SurrealDB instance.

Method Syntax

session.signup(auth)
ParameterTypeDescription
auth AccessRecordAuthThe authentication details including access method and record data.

Promise<Tokens> - The authentication tokens (access and refresh tokens)

const tokens = await session.signup({
namespace: 'my_namespace',
database: 'my_database',
access: 'user_access',
variables: {
email: 'user@example.com',
password: 'secure_password',
name: 'John Doe'
}
});

console.log('Access token:', tokens.access);
console.log('Refresh token:', tokens.refresh);

Sign in to the SurrealDB instance with authentication credentials.

Method Syntax

session.signin(auth)
ParameterTypeDescription
auth AnyAuthAuthentication details (system user, record user, or access method).

Promise<Tokens> - The authentication tokens

System User Authentication

const tokens = await session.signin({
username: 'root',
password: 'root'
});

Record User Authentication

const tokens = await session.signin({
namespace: 'my_namespace',
database: 'my_database',
access: 'user_access',
variables: {
email: 'user@example.com',
password: 'secure_password'
}
});

Authenticate the session using an existing access token or access and refresh token combination.

When authenticating with a refresh token, a new refresh token will be issued and returned.

Method Syntax

session.authenticate(token)
ParameterTypeDescription
token string | TokensThe access token string or tokens object with access and refresh tokens.

Promise<Tokens> - The authentication tokens (may include new refresh token)

Authenticate with Access Token

await session.authenticate(accessToken);

Authenticate with Refresh Token

const newTokens = await session.authenticate({
access: oldAccessToken,
refresh: refreshToken
});

// Store new tokens
console.log('New access token:', newTokens.access);
console.log('New refresh token:', newTokens.refresh);

Invalidate the authentication for the current session, signing the user out.

Method Syntax

session.invalidate()

Promise<void> - Resolves when authentication is invalidated

await session.invalidate();
console.log('User signed out');

The SurrealSession class emits events that you can subscribe to for tracking session state changes.

Emitted when the authentication state changes for this session.

Payload: [tokens: Tokens | null] - The new authentication tokens, or null if invalidated

Example:

session.subscribe('auth', (tokens) => {
if (tokens) {
console.log('Authenticated with token:', tokens.access);
} else {
console.log('Authentication invalidated');
}
});

Emitted when the namespace or database changes for this session.

Payload: [using: NamespaceDatabase] - Object containing the new namespace and database

Example:

session.subscribe('using', (using) => {
console.log('Now using:', using.namespace, '/', using.database);
});

Subscribe to session events.

Method Syntax

session.subscribe(event, listener)
ParameterTypeDescription
event keyof SessionEventsThe event name to subscribe to ("auth" or "using").
listener FunctionCallback function invoked when the event is emitted.

() => void - An unsubscribe function

const unsubscribe = session.subscribe('auth', (tokens) => {
console.log('Auth changed:', tokens);
});

// Later, unsubscribe
unsubscribe();

As SurrealSession extends SurrealQueryable, it inherits all query execution methods:

import { Surreal } from 'surrealdb';

const db = new Surreal();
await db.connect('ws://localhost:8000');

// Use the default session
await db.use({ namespace: 'test', database: 'test' });

// Sign in
await db.signin({
username: 'root',
password: 'root'
});

// Create an isolated session
const session = await db.newSession();

// Configure the session
await session.use({
namespace: 'production',
database: 'main'
});

// Set session variables
await session.set('user_role', 'admin');

// Subscribe to session events
session.subscribe('auth', (tokens) => {
console.log('Session auth changed:', tokens ? 'authenticated' : 'signed out');
});

session.subscribe('using', (using) => {
console.log('Using:', using);
});

// Authenticate as a record user
const tokens = await session.signin({
namespace: 'production',
database: 'main',
access: 'user_access',
variables: {
email: 'user@example.com',
password: 'password'
}
});

// Execute queries in the session context
const users = await session.select('users');

// Start a transaction
const txn = await session.beginTransaction();
await txn.create('logs:1', { content: { message: 'User logged in' } });
await txn.commit();

// Fork the session to create an isolated copy
const childSession = await session.forkSession();
await childSession.use({ database: 'analytics' });

// Clean up
await childSession.reset();
await session.closeSession();

Was this page helpful?