feat: Add chat embeds v1
Youtube and Website metadata embeds
This commit is contained in:
@@ -4,18 +4,28 @@ import { resolveRuntimePath } from '../runtime-paths';
|
||||
|
||||
export type ServerHttpProtocol = 'http' | 'https';
|
||||
|
||||
export interface LinkPreviewConfig {
|
||||
enabled: boolean;
|
||||
cacheTtlMinutes: number;
|
||||
maxCacheSizeMb: number;
|
||||
}
|
||||
|
||||
export interface ServerVariablesConfig {
|
||||
klipyApiKey: string;
|
||||
releaseManifestUrl: string;
|
||||
serverPort: number;
|
||||
serverProtocol: ServerHttpProtocol;
|
||||
serverHost: string;
|
||||
linkPreview: LinkPreviewConfig;
|
||||
}
|
||||
|
||||
const DATA_DIR = resolveRuntimePath('data');
|
||||
const VARIABLES_FILE = path.join(DATA_DIR, 'variables.json');
|
||||
const DEFAULT_SERVER_PORT = 3001;
|
||||
const DEFAULT_SERVER_PROTOCOL: ServerHttpProtocol = 'http';
|
||||
const DEFAULT_LINK_PREVIEW_CACHE_TTL_MINUTES = 7200;
|
||||
const DEFAULT_LINK_PREVIEW_MAX_CACHE_SIZE_MB = 50;
|
||||
const HARD_MAX_CACHE_SIZE_MB = 50;
|
||||
|
||||
function normalizeKlipyApiKey(value: unknown): string {
|
||||
return typeof value === 'string' ? value.trim() : '';
|
||||
@@ -66,6 +76,27 @@ function normalizeServerPort(value: unknown, fallback = DEFAULT_SERVER_PORT): nu
|
||||
: fallback;
|
||||
}
|
||||
|
||||
function normalizeLinkPreviewConfig(value: unknown): LinkPreviewConfig {
|
||||
const raw = (value && typeof value === 'object' && !Array.isArray(value))
|
||||
? value as Record<string, unknown>
|
||||
: {};
|
||||
const enabled = typeof raw.enabled === 'boolean'
|
||||
? raw.enabled
|
||||
: true;
|
||||
const cacheTtl = typeof raw.cacheTtlMinutes === 'number'
|
||||
&& Number.isFinite(raw.cacheTtlMinutes)
|
||||
&& raw.cacheTtlMinutes >= 0
|
||||
? raw.cacheTtlMinutes
|
||||
: DEFAULT_LINK_PREVIEW_CACHE_TTL_MINUTES;
|
||||
const maxSize = typeof raw.maxCacheSizeMb === 'number'
|
||||
&& Number.isFinite(raw.maxCacheSizeMb)
|
||||
&& raw.maxCacheSizeMb >= 0
|
||||
? Math.min(raw.maxCacheSizeMb, HARD_MAX_CACHE_SIZE_MB)
|
||||
: DEFAULT_LINK_PREVIEW_MAX_CACHE_SIZE_MB;
|
||||
|
||||
return { enabled, cacheTtlMinutes: cacheTtl, maxCacheSizeMb: maxSize };
|
||||
}
|
||||
|
||||
function hasEnvironmentOverride(value: string | undefined): value is string {
|
||||
return typeof value === 'string' && value.trim().length > 0;
|
||||
}
|
||||
@@ -111,7 +142,8 @@ export function ensureVariablesConfig(): ServerVariablesConfig {
|
||||
releaseManifestUrl: normalizeReleaseManifestUrl(remainingParsed.releaseManifestUrl),
|
||||
serverPort: normalizeServerPort(remainingParsed.serverPort),
|
||||
serverProtocol: normalizeServerProtocol(remainingParsed.serverProtocol),
|
||||
serverHost: normalizeServerHost(remainingParsed.serverHost ?? legacyServerIpAddress)
|
||||
serverHost: normalizeServerHost(remainingParsed.serverHost ?? legacyServerIpAddress),
|
||||
linkPreview: normalizeLinkPreviewConfig(remainingParsed.linkPreview)
|
||||
};
|
||||
const nextContents = JSON.stringify(normalized, null, 2) + '\n';
|
||||
|
||||
@@ -124,7 +156,8 @@ export function ensureVariablesConfig(): ServerVariablesConfig {
|
||||
releaseManifestUrl: normalized.releaseManifestUrl,
|
||||
serverPort: normalized.serverPort,
|
||||
serverProtocol: normalized.serverProtocol,
|
||||
serverHost: normalized.serverHost
|
||||
serverHost: normalized.serverHost,
|
||||
linkPreview: normalized.linkPreview
|
||||
};
|
||||
}
|
||||
|
||||
@@ -169,3 +202,7 @@ export function getServerHost(): string | undefined {
|
||||
export function isHttpsServerEnabled(): boolean {
|
||||
return getServerProtocol() === 'https';
|
||||
}
|
||||
|
||||
export function getLinkPreviewConfig(): LinkPreviewConfig {
|
||||
return getVariablesConfig().linkPreview;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user