import type { Request } from "express";
export type SessionConfig = {
apiToken?: string;
defaultTeamId?: number;
primaryLanguage?: string;
baseUrl?: string;
requestTimeoutMs?: number;
defaultHeadersJson?: string;
authScheme?: "auto" | "personal_token" | "oauth";
allowTools?: string | string[];
denyTools?: string | string[];
};
type QueryValue = string | string[] | undefined;
function pickQueryValue(value: QueryValue): string | undefined {
if (Array.isArray(value)) {
for (let index = value.length - 1; index >= 0; index -= 1) {
const entry = value[index];
if (typeof entry === "string" && entry.trim().length > 0) {
return entry;
}
}
return undefined;
}
if (typeof value === "string") {
return value;
}
return undefined;
}
function toOptionalString(value: QueryValue): string | undefined {
const raw = pickQueryValue(value);
if (!raw) {
return undefined;
}
const trimmed = raw.trim();
return trimmed.length > 0 ? trimmed : undefined;
}
function toOptionalInteger(value: QueryValue): number | undefined {
const raw = pickQueryValue(value);
if (!raw) {
return undefined;
}
const parsed = Number.parseInt(raw, 10);
if (!Number.isFinite(parsed)) {
return undefined;
}
return parsed;
}
function toOptionalList(value: QueryValue): string | string[] | undefined {
if (Array.isArray(value)) {
const entries = value
.map(item => (typeof item === "string" ? item.trim() : ""))
.filter(item => item.length > 0);
if (entries.length === 0) {
return undefined;
}
return entries;
}
return toOptionalString(value);
}
function parseAuthScheme(value: QueryValue): SessionConfig["authScheme"] | undefined {
const raw = toOptionalString(value);
if (!raw) {
return undefined;
}
if (raw === "auto" || raw === "personal_token" || raw === "oauth") {
return raw;
}
return undefined;
}
export function getSessionConfig(req: Request): SessionConfig {
const q = req.query as Record<string, QueryValue>;
const apiToken = toOptionalString(q.apiToken);
const defaultTeamId = toOptionalInteger(q.defaultTeamId);
const validTeamId = defaultTeamId !== undefined && Number.isFinite(defaultTeamId) && defaultTeamId > 0
? defaultTeamId
: undefined;
const requestTimeoutMs = toOptionalInteger(q.requestTimeoutMs);
return {
apiToken: apiToken || undefined,
defaultTeamId: validTeamId,
primaryLanguage: toOptionalString(q.primaryLanguage),
baseUrl: toOptionalString(q.baseUrl),
requestTimeoutMs,
defaultHeadersJson: toOptionalString(q.defaultHeadersJson),
authScheme: parseAuthScheme(q.authScheme) ?? "auto",
allowTools: toOptionalList(q.allowTools),
denyTools: toOptionalList(q.denyTools)
};
}