Skip to main content

Remote RxStorage

The Remote RxStorage is made to use a remote storage and communicate with it over an asynchronous message channel. The remote part could be on another JavaScript process or even on a different host machine. The remote storage plugin is used in many RxDB plugins like the worker or the electron plugin.

Usage​

The remote storage communicates over a message channel which has to implement the messageChannelCreator function which returns an object that has a messages$ observable and a send() function on both sides and a close() function that closes the RemoteMessageChannel.

// on the client
import { getRxStorageRemote } from 'rxdb/plugins/storage-remote';
const storage = getRxStorageRemote({
identifier: 'my-id',
mode: 'storage',
messageChannelCreator: () => Promise.resolve({
messages$: new Subject(),
send(msg) {
// send to remote storage
}
})
});
const myDb = await createRxDatabase({
storage
});

// on the remote
import { getRxStorageLocalstorage } from 'rxdb/plugins/storage-localstorage';
import { exposeRxStorageRemote } from 'rxdb/plugins/storage-remote';
exposeRxStorageRemote({
storage: getRxStorageLocalstorage(),
messages$: new Subject(),
send(msg){
// send to other side
}
});

Usage with a Websocket server​

The remote storage plugin contains helper functions to create a remote storage over a WebSocket server. This is often used in Node.js to give one microservice access to another services database without having to replicate the full database state.

// server.js
import { getRxStorageMemory } from 'rxdb/plugins/storage-memory';
import { startRxStorageRemoteWebsocketServer } from 'rxdb/plugins/storage-remote-websocket';

// either you can create the server based on a RxDatabase
const serverBasedOnDatabase = await startRxStorageRemoteWebsocketServer({
port: 8080,
database: myRxDatabase
});

// or you can create the server based on a pure RxStorage
const serverBasedOn = await startRxStorageRemoteWebsocketServer({
port: 8080,
storage: getRxStorageMemory()
});
// client.js

import { getRxStorageRemoteWebsocket } from 'rxdb/plugins/storage-remote-websocket';
const myDb = await createRxDatabase({
storage: getRxStorageRemoteWebsocket({
url: 'ws://example.com:8080'
})
});

Sending custom messages​

The remote storage can also be used to send custom messages to and from the remote instance.

One the remote you have to define a customRequestHandler like:

const serverBasedOnDatabase = await startRxStorageRemoteWebsocketServer({
port: 8080,
database: myRxDatabase,
async customRequestHandler(msg){
// here you can return any JSON object as an 'answer'
return {
foo: 'bar'
};
}
});

On the client instance you can then call the customRequest() method:

const storage = getRxStorageRemoteWebsocket({
url: 'ws://example.com:8080'
});
const answer = await storage.customRequest({ bar: 'foo' });
console.dir(answer); // > { foo: 'bar' }

RxDB: The Fastest and Most Reliable Local Database

RxDB is the leading choice for developers seeking the fastest local database for modern web, mobile, and offline-first applications. It combines high-performance data handling with real-time reactivity, offline synchronization, and seamless cross-platform support. Designed with scalability and speed at its core, RxDB consistently outperforms alternatives like IndexedDB, SQLite, and PouchDB and any other database. It is the easiest to set up and learn. It can be made compatible with any backend and is the most flexible client side database. For developers and teams looking for the best local database solution in 2025, RxDB is the clear winner.

✕