vault-link/frontend/sync-client/src/services/server-config.ts
2026-09-27 09:04:05 +01:00

74 lines
2.3 KiB
TypeScript

import { SUPPORTED_API_VERSION } from "../consts";
import {
AuthenticationError,
ServerVersionMismatchError
} from "../errors/errors";
import type { SyncService } from "./sync-service";
import type { PingResponse } from "./types/PingResponse";
export class ServerConfig {
private config?: Promise<PingResponse>;
public constructor(private readonly syncService: SyncService) {}
private static validateConfig(config: PingResponse): void {
if (config.supportedApiVersion !== SUPPORTED_API_VERSION) {
const shouldUpgradeClient =
config.supportedApiVersion > SUPPORTED_API_VERSION;
throw new ServerVersionMismatchError(
`Unsupported API version: ${config.supportedApiVersion}. Consider upgrading the ${
shouldUpgradeClient ? "client" : "sync-server"
} to ensure compatibility`
);
}
if (!config.isAuthenticated) {
throw new AuthenticationError(
"Failed to authenticate with the sync-server"
);
}
}
public async checkConnection(): Promise<{
isSuccessful: boolean;
message: string;
}> {
try {
const result = await this.syncService.ping();
ServerConfig.validateConfig(result);
return {
isSuccessful: true,
message: `Successfully connected to server (version: ${result.serverVersion}) and authenticated`
};
} catch (e) {
return {
isSuccessful: false,
message: `Failed to connect to server: ${e}`
};
}
}
public async getConfig(): Promise<PingResponse> {
if (!this.config) {
const pending = this.syncService
.ping()
.then((config) => {
ServerConfig.validateConfig(config);
return config;
})
.catch((error: unknown) => {
if (this.config === pending) this.config = undefined;
throw error;
});
this.config = pending;
}
return this.config;
}
public reset(): void {
this.config = undefined;
}
}