silverbullet/cmd/plug_run.ts

121 lines
3.1 KiB
TypeScript
Raw Normal View History

2024-07-30 23:24:17 +08:00
import { resolve } from "@std/path";
import assets from "../dist/plug_asset_bundle.json" with { type: "json" };
import { determineDatabaseBackend } from "../server/db_backend.ts";
2024-07-30 23:33:33 +08:00
import type { KvPrimitives } from "$lib/data/kv_primitives.ts";
2024-02-09 04:06:04 +08:00
import { DiskSpacePrimitives } from "$common/spaces/disk_space_primitives.ts";
import { ServerSystem } from "../server/server_system.ts";
import { AssetBundlePlugSpacePrimitives } from "$common/spaces/asset_bundle_space_primitives.ts";
import { LocalShell } from "../server/shell_backend.ts";
import { Hono } from "hono/mod.ts";
2024-02-09 04:06:04 +08:00
import { DataStore } from "$lib/data/datastore.ts";
import { DataStoreMQ } from "$lib/data/mq.datastore.ts";
import { EventHook } from "../common/hooks/event.ts";
2024-02-09 04:06:04 +08:00
import { sleep } from "$lib/async.ts";
import { AssetBundle } from "$lib/asset_bundle/bundle.ts";
2024-08-15 22:39:06 +08:00
import {
type ConfigContainer,
defaultConfig,
} from "@silverbulletmd/silverbullet/type/config";
2023-08-05 00:56:55 +08:00
export async function plugRunCommand(
{
2023-08-12 02:37:13 +08:00
hostname,
port,
2023-08-05 00:56:55 +08:00
}: {
2023-08-12 02:37:13 +08:00
hostname?: string;
port?: number;
2023-08-05 00:56:55 +08:00
},
spacePath: string,
2023-08-12 02:37:13 +08:00
functionName: string | undefined,
2023-08-05 00:56:55 +08:00
...args: string[]
) {
spacePath = resolve(spacePath);
2023-08-05 00:56:55 +08:00
console.log("Space path", spacePath);
console.log("Function to run:", functionName, "with arguments", args);
const kvPrimitives = await determineDatabaseBackend(spacePath);
if (!kvPrimitives) {
console.error("Cannot run plugs in databaseless mode.");
return;
}
2023-08-05 00:56:55 +08:00
try {
const result = await runPlug(
spacePath,
functionName,
args,
new AssetBundle(assets),
kvPrimitives,
2023-08-12 02:37:13 +08:00
port,
hostname,
2023-08-05 00:56:55 +08:00
);
2023-08-15 13:55:07 +08:00
if (result) {
console.log("Output", result);
}
kvPrimitives.close();
2023-08-12 02:37:13 +08:00
Deno.exit(0);
2023-08-05 00:56:55 +08:00
} catch (e: any) {
console.error(e.message);
Deno.exit(1);
}
}
2024-02-09 04:06:04 +08:00
export async function runPlug(
spacePath: string,
functionName: string | undefined,
args: any[] = [],
2024-02-09 04:06:04 +08:00
builtinAssetBundle: AssetBundle,
kvPrimitives: KvPrimitives,
httpServerPort?: number,
httpHostname?: string,
) {
const serverController = new AbortController();
const app = new Hono();
const ds = new DataStore(kvPrimitives);
const mq = new DataStoreMQ(ds);
const eventHook = new EventHook();
// TODO: Actually load config from the space
const configContainer: ConfigContainer = {
config: defaultConfig,
loadConfig: () => Promise.resolve(),
};
2024-02-09 04:06:04 +08:00
const serverSystem = new ServerSystem(
new AssetBundlePlugSpacePrimitives(
new DiskSpacePrimitives(spacePath),
builtinAssetBundle,
),
kvPrimitives,
new LocalShell(spacePath),
mq,
ds,
eventHook,
false,
true,
configContainer,
2024-02-09 04:06:04 +08:00
);
await serverSystem.init(true);
if (httpHostname && httpServerPort) {
Deno.serve({
hostname: httpHostname,
port: httpServerPort,
signal: serverController.signal,
}, app.fetch);
}
if (functionName) {
const result = await serverSystem.system.invokeFunction(functionName, args);
await serverSystem.close();
serverController.abort();
return result;
} else {
console.log("Running in server mode, use Ctrl-c to stop");
while (true) {
await sleep(1000);
}
}
}