type ShugoiErrorCode = 'invalid_site_key' | 'site_key_validation_failed' | 'api_unreachable' | 'api_timeout' | 'missing_site_key' | 'unexpected_api_response' | 'internal_error'; declare class ShugoiError extends Error { readonly code: ShugoiErrorCode; readonly cause?: unknown | undefined; constructor(code: ShugoiErrorCode, message: string, cause?: unknown | undefined); } type Locale = 'fr' | 'en'; declare function storeHtml(token: string, html: string, contentReplaceOn?: boolean): void; declare function verifyRenderGrant(mid: string | undefined, grant: string | undefined, token?: string, ip?: string, expectedSiteKey?: string): boolean; declare function renderResponseData(token: string, locale?: Locale, configUrl?: string, mid?: string, grant?: string, ip?: string, expectedSiteKey?: string, _secret?: string): Promise<{ html?: string; error?: string; blocked?: boolean; reason?: string; message?: string; title?: string; }>; declare function handleRender(token: string, res: { setHeader?: (k: string, v: string) => void; send?: (body: string) => void; end?: (body: string) => void; }, configUrl?: string, mid?: string, grant?: string, ip?: string, expectedSiteKey?: string, baseUrl?: string, _secret?: string): Promise; declare function signToken(siteKey: string, timestamp: number, secretOverride?: string): { token: string; }; declare function fetchWhitelistForSiteKey(siteKey: string, baseUrl: string): Promise; declare function __clearConfigCache(): void; declare function generateSkeleton(siteKey: string, token: string, baseUrl: string, restrictedAccess?: boolean, whitelist?: string[], renderUrl?: string, locale?: Locale, flags?: Record, clockts?: number, signingSecret?: string, timingLogs?: boolean): Promise; declare function injectGuardScripts(html: string, siteKey: string, baseUrl: string, whitelist?: string[] | null, restrictedAccess?: boolean, signingSecret?: string, req?: unknown, _allowedOrigins?: string[], locale?: Locale, clockts?: number, timingLogs?: boolean): Promise; /** Options communes au middleware Express et au plugin Fastify. */ interface ShugoiCoreOptions { /** Votre siteKey Shugoi. Requis. */ siteKey: string; /** Secret du site. Active la validation de clé et la signature des tokens. */ secret?: string; /** Secret HMAC de signature. Par défaut : `secret`. */ signingSecret?: string; /** Chemins qui contournent toute protection. Défaut : ['/api', '/legal'] */ allowlist?: string[]; /** User-Agents bloqués. Défaut : DEFAULT_HEADLESS_PATTERNS */ headlessPatterns?: RegExp[]; /** Bots légitimes toujours autorisés (et exemptés de split-render). Défaut : DEFAULT_BOT_WHITELIST */ botWhitelist?: RegExp[]; /** URL de base de l'API. Défaut : 'https://shugoi.com/api/v1' */ baseUrl?: string; /** URL interne pour les appels serveur-serveur (évite le deadlock via Cloudflare). Défaut : baseUrl */ internalUrl?: string; /** Logs console. Défaut : false */ debug?: boolean; /** Affiche les mesures de performance `[SHUGOI-TIMING]` dans le navigateur. Défaut : false */ timingLogs?: boolean; /** Injecte les guards dans le HTML. Défaut : true */ autoInject?: boolean; /** Affiche la page « accès restreint » aux machines non whitelistées. Défaut : false */ restrictedAccess?: boolean; /** Directives CSP additionnelles, fusionnées avec les défauts. */ extraDirectives?: Record; /** false = ne gère pas du tout la CSP. Défaut : true */ csp?: boolean; /** Code HTTP des pages de blocage. Défaut : 403 */ blockStatus?: number; /** Langue des pages de blocage. Défaut : détection via Accept-Language, fallback 'en' */ locale?: 'fr' | 'en'; /** Remplace entièrement la page de blocage. */ blockPage?: (ctx: BlockPageContext) => string; /** Active le split-render (skeleton + eval). Défaut : true */ splitRender?: boolean; /** Stocke le HTML sur disque (nécessaire en cluster PM2). Défaut : false */ multiProcess?: boolean; /** Vérifie par DNS inverse que les robots whitelistés viennent bien de leurs plages * officielles (Googlebot, Bingbot…). Défaut : true. * Mettre à false uniquement si le DNS sortant est bloqué sur votre infrastructure. */ verifyBots?: boolean; /** Journaliser les IP des bots whitelistés (diagnostic embeds Discord/Twitter). */ logBotIps?: boolean; } interface BlockPageContext { reason: 'rate_limit' | 'headless' | 'content_replacement' | 'restricted'; title: string; message: string; badge: string; host?: string; remainingSeconds?: number; locale: 'fr' | 'en'; } type ShugoiMiddlewareOptions = ShugoiCoreOptions; type ShugoiPluginOptions = ShugoiCoreOptions; interface ScriptTagsOptions { siteKey: string; baseUrl?: string; signingSecret?: string; restrictedAccess?: boolean; whitelist?: string[]; /** Affiche les mesures de performance `[SHUGOI-TIMING]` dans le navigateur. Défaut : false */ timingLogs?: boolean; } interface ScriptTagsResult { /** Balise