nuxt-surrealdb
Version:
A Nuxt module aimed to simplify the use of SurrealDB
56 lines (55 loc) • 1.88 kB
JavaScript
import { Surreal, Features, createRemoteEngines } from "surrealdb";
import { defu } from "defu";
import { useRuntimeConfig } from "#imports";
import { surrealHooks } from "./surreal-hooks.js";
import {
H3_CONTEXT_SURREAL_CLIENT
} from "../internal.js";
let client = null;
export async function useSurreal(event) {
if (event && event.context[H3_CONTEXT_SURREAL_CLIENT] && event.context[H3_CONTEXT_SURREAL_CLIENT].isValid) {
return event.context[H3_CONTEXT_SURREAL_CLIENT];
}
const {
public: { surrealdb: {
local: _pubLocal,
memory: _pubMemory,
...pubSurrealdb
} = {} },
surrealdb: {
local: _srvLocal,
memory: _srvMemory,
...srvSurrealdb
} = {}
} = useRuntimeConfig(event);
if (!client) {
client = new Surreal({
engines: createRemoteEngines()
});
if (!client.isConnected) {
const config = defu(srvSurrealdb, pubSurrealdb);
await surrealHooks.callHookParallel("surrealdb:connecting", { client, config });
if (config.endpoint && config.autoConnect !== false) {
let endpoint = config.endpoint;
if (config.preferHttp !== false) {
endpoint = endpoint.replace(/^ws/, "http");
}
const isConnected = await client.connect(endpoint, config.connectOptions);
if (isConnected) {
await surrealHooks.callHookParallel("surrealdb:connected", { client });
}
}
}
}
if (!event) {
return client;
}
if (!client.isFeatureSupported(Features.Sessions)) {
new Error("[nuxt-surrealdb] Sessions are not supported by the connected SurrealDB instance.");
return client;
}
const session = await client[srvSurrealdb.session === "fork" ? "forkSession" : "newSession"]();
event.context.surrealdb = session;
await surrealHooks.callHookParallel("surrealdb:session:init", { session, event });
return session;
}