SurrealSessionThe 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.
namespaceReturns the currently selected namespace for this session.
Type: string | undefined
Example:
console.log(session.namespace); // "my_namespace"
databaseReturns the currently selected database for this session.
Type: string | undefined
Example:
console.log(session.database); // "my_database"
accessTokenReturns the current authentication access token for this session.
Type: string | undefined
Example:
if (session.accessToken) { console.log('Session is authenticated'); }
parametersReturns all parameters currently defined on the session.
Type: Record<string, unknown>
Example:
console.log(session.parameters); // { user_id: '123', role: 'admin' }
sessionReturns the unique session ID. For the default session, undefined is returned.
Type: Uuid | undefined
Example:
const sessionId = session.session; console.log('Session ID:', sessionId);
isValidReturns 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'); }
.forkSession()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 Syntaxsession.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();
.closeSession()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 Syntaxsession.closeSession()
Promise<void> - Resolves when the session is closed
await session.closeSession(); console.log(session.isValid); // false
.beginTransaction()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 Syntaxsession.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); }
.use()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 Syntaxsession.use(what)
| Parameter | Type | Description |
|---|---|---|
what required | NamespaceDatabase | null | Object specifying namespace and/or database to switch to. |
Promise<NamespaceDatabase> - The newly selected namespace and database
Switch Both Namespace and Databaseawait session.use({ namespace: 'production', database: 'main' });
Switch Only Databaseawait session.use({ database: 'analytics' }); // Namespace remains unchanged
Unset Databaseawait session.use({ database: null }); // Database is now undefined
.set()Define a variable for the current session. Variables can be used in SurrealQL queries with the $ prefix.
Method Syntaxsession.set(variable, value)
| Parameter | Type | Description |
|---|---|---|
variable required | string | The name of the variable (without the $ prefix). |
value required | unknown | The 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();
.unset()Remove a variable from the current session.
Method Syntaxsession.unset(variable)
| Parameter | Type | Description |
|---|---|---|
variable required | string | The name of the variable to remove (without the $ prefix). |
Promise<void> - Resolves when the variable is removed
await session.unset('user_id');
.reset()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 Syntaxsession.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); // {}
.signup()Sign up a new record user to the SurrealDB instance.
NoteWhen this method is called, the
authenticationproperty passed toconnect()will be ignored. You are responsible for handling session invalidation by listening to theauthevent.
Method Syntaxsession.signup(auth)
| Parameter | Type | Description |
|---|---|---|
auth required | AccessRecordAuth | The 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);
.signin()Sign in to the SurrealDB instance with authentication credentials.
NoteWhen this method is called, the
authenticationproperty passed toconnect()will be ignored. You are responsible for handling session invalidation by listening to theauthevent.
Method Syntaxsession.signin(auth)
| Parameter | Type | Description |
|---|---|---|
auth required | AnyAuth | Authentication details (system user, record user, or access method). |
Promise<Tokens> - The authentication tokens
System User Authenticationconst tokens = await session.signin({ username: 'root', password: 'root' });
Record User Authenticationconst tokens = await session.signin({ namespace: 'my_namespace', database: 'my_database', access: 'user_access', variables: { email: 'user@example.com', password: 'secure_password' } });
.authenticate()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.
NoteWhen this method is called, the
authenticationproperty passed toconnect()will be ignored. You are responsible for handling session invalidation by listening to theauthevent.
Method Syntaxsession.authenticate(token)
| Parameter | Type | Description |
|---|---|---|
token required | string | Tokens | The access token string or tokens object with access and refresh tokens. |
Promise<Tokens> - The authentication tokens (may include new refresh token)
Authenticate with Access Tokenawait session.authenticate(accessToken);
Authenticate with Refresh Tokenconst 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()Invalidate the authentication for the current session, signing the user out.
Method Syntaxsession.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.
authEmitted 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'); } });
usingEmitted 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()Subscribe to session events.
Method Syntaxsession.subscribe(event, listener)
| Parameter | Type | Description |
|---|---|---|
event required | keyof SessionEvents | The event name to subscribe to (“auth” or “using”). |
listener required | Function | Callback 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:
query() - Execute raw SurrealQLselect() - Select recordscreate() - Create recordsinsert() - Insert recordsupdate() - Update recordsupsert() - Upsert recordsdelete() - Delete recordsrelate() - Create graph relationshipslive() - Subscribe to live queriesrun() - Execute functionsapi - Access user-defined APIsimport { 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();