• Start

Languages

/

JavaScript

/

Concepts

Embedded engines

Run SurrealDB as an embedded database in the browser or on the server using the WebAssembly and Node.js engine plugins.

The JavaScript SDK supports running SurrealDB as an embedded database through two engine plugins. Choose the one that matches your environment:

EnginePackageEnvironmentStorage options
WebAssembly@surrealdb/wasmBrowsersmem://, indxdb://
Node.js@surrealdb/nodeNode.js, Bun, Denomem://, rocksdb://, surrealkv://

Both plugins work with ES modules (import), not CommonJS (require).

The @surrealdb/wasm package runs SurrealDB inside a browser environment. It supports in-memory databases and persistent storage via IndexedDB, and can optionally run inside a Web Worker to keep the main thread responsive.

npm install --save @surrealdb/wasm
import { Surreal, createRemoteEngines } from 'surrealdb';
import { createWasmEngines } from '@surrealdb/wasm';

const db = new Surreal({
engines: {
...createRemoteEngines(),
...createWasmEngines(),
},
});

await db.connect('mem://');
// or persist with IndexedDB:
await db.connect('indxdb://myapp');

Offload database operations from the main thread to keep your interface responsive:

import { Surreal, createRemoteEngines } from 'surrealdb';
import { createWasmWorkerEngines } from '@surrealdb/wasm';
import WorkerAgent from '@surrealdb/wasm/worker?worker';

const db = new Surreal({
engines: {
...createRemoteEngines(),
...createWasmWorkerEngines({
createWorker: () => new WorkerAgent(),
}),
},
});

await db.connect('mem://');

If you are using a bundler like Vite, you may need to exclude the WASM package from dependency optimisation and enable top-level await:

vite.config.js

export default {
optimizeDeps: {
exclude: ['@surrealdb/wasm'],
esbuildOptions: {
target: 'esnext',
},
},
esbuild: {
supported: {
'top-level-await': true,
},
},
};

The @surrealdb/node package runs SurrealDB within Node.js, Bun, or Deno. It supports in-memory databases and persistent storage via RocksDB and SurrealKV.

npm install --save @surrealdb/node
import { Surreal, createRemoteEngines } from 'surrealdb';
import { createNodeEngines } from '@surrealdb/node';

const db = new Surreal({
engines: {
...createRemoteEngines(),
...createNodeEngines(),
},
});

await db.connect('mem://');
// or persist with SurrealKV:
await db.connect('surrealkv://./data');

To enable versioned storage for temporal queries, append ?versioned=true to the connection string:

await db.connect('surrealkv://./data?versioned=true');

When using the Node.js engine, you must close the connection with .close() when you are done to ensure the database is properly shut down:

await db.close();

Was this page helpful?