vault-link/frontend/test-support/sync-server-fixture.ts
2026-09-21 21:29:52 +01:00

94 lines
2.8 KiB
TypeScript

import assert from "node:assert/strict";
import { resolve } from "node:path";
import { randomUUID } from "node:crypto";
import { ServerControl } from "../deterministic-tests/src/server-control";
import { Logger } from "sync-client";
import { SyncClient } from "../sync-client/src/sync-client";
import { MemoryDisk, MemoryPersistence } from "./storage";
const root = resolve(__dirname, "../..");
const token = "test-token-change-me";
export const bytes = (s: string) => new TextEncoder().encode(s);
const headers = {
Authorization: `Bearer ${token}`,
"Content-Type": "application/json",
"Device-Id": "audit"
};
export async function fixture() {
const server = new ServerControl(
root + "/sync-server/target/release/sync_server",
root + "/sync-server/config-e2e.yml",
new Logger()
);
await server.start();
const vault = randomUUID(),
url = server.remoteUri + "/vaults/" + vault;
const put = async (path: string, data: unknown) => {
const r = await fetch(url + path, {
method: "PUT",
headers,
body: JSON.stringify(data)
});
assert(r.ok, await r.clone().text());
return r.json();
};
const get = async (path: string) => {
const r = await fetch(url + path, { headers });
assert(r.ok);
return r.json();
};
const disk = new MemoryDisk();
const store = new MemoryPersistence({
settings: {
remoteUri: server.remoteUri,
vaultName: vault,
token,
isSyncEnabled: true,
syncIntervalMs: 0,
networkRetryIntervalMs: 0,
requestTimeoutMs: 5000
}
});
let fetchHook: typeof fetch | undefined;
const createClient = () =>
SyncClient.create({
fs: disk,
persistence: store,
fetch: (...args) =>
fetchHook ? fetchHook(...args) : fetch(...args)
});
let client = await createClient();
const content = (text: string, parentVersionId: number | null = null) => ({
requestId: randomUUID(),
parentVersionId,
content: {
type: "Snapshot",
value: Buffer.from(text).toString("base64")
}
});
return {
server,
disk,
store,
get client() {
return client;
},
reopenClient: async () => {
await client.destroy();
client = await createClient();
},
url,
headers,
put,
get,
content,
setFetchHook: (hook: typeof fetch) => {
fetchHook = hook;
},
dispose: async () => {
await client.destroy();
await server.stop();
}
};
}
export { randomUUID };