Use surrealdb.js in workers!
npm install surrealdb.workerThe main thread is full of stuff that don't need to be there. Also when you have
an Application where each client connects via WebSocket to SurrealDB that will
be a lot of open connections.
This package enables you to use 1 Connection per browser (NOT per tab). All
Connection related stuff (basicly most querys) has to be moved into a single
config object that lives in the Worker.
> NOTE: If the browser of the user supports SharedWorker it is a good idea to
> use it!
This is build with live querys in mind so as soon as they are available they are
added here.
This needs the Lock API! See https://caniuse.com/mdn-api_lock for support.
Uncompressed (but minified) you add arround 5KB to your page. With gzip or
brotli you get that to 1-2KB!
``ts
import { setupWorker } from "surrealdb.worker/dist/worker.js";
export const config = {
/* /
};
setupWorker(config).then((init) => {
// When this runs the Worker only exists once!
// This only runs again (in a different worker) if
// The worker is killed (because tab closed + SharedWorker not supported)
init('http://localhost:8000/rpc');
});
`
`ts
import { strartWorker } from "surrealdb.worker/dist/worker.setup.js";
strartWorker(new URL("./path/to/worker/file", import.meta.url));
`
`ts
import { config } from "./path/to/worker/file";
import { setupClient } from "surrealdb.worker/dist/client.js";
const client = setupClient
// For vue
import { vue } from "surrealdb.worker/dist/framework/vue.js";
const vueClient = vue
`
As I will use this with Vue I added a wrapper for that. I also added a react
wrapper but I don't know if that works / what the best practices for that are.
You want to add other frameworks? Feel free to create a PR for this!
, startWorker and setupClient calls.Vite support
You can import a small vite plugin:`ts
import surrealdbWorker from "surrealdb.worker/vite/plugin.js"export default {
/... /
plugins: [
/... /
surrealdbWorker()
/... /
],
/... /
}
`This allowes imports like this:
`ts
import setup from 'sdb.w:default:./path/to/worker/file'
const promiseThatNeverResolves = setup()
`Why imports like
surrealdb.worker/dist/...`