import * as plugins from './plugins.js';
/**
 * Content Security Policy configuration
 * Each directive can be a string or array of sources
 */
export interface IContentSecurityPolicy {
    /** Fallback for other directives */
    defaultSrc?: string | string[];
    /** Valid sources for scripts */
    scriptSrc?: string | string[];
    /** Valid sources for stylesheets */
    styleSrc?: string | string[];
    /** Valid sources for images */
    imgSrc?: string | string[];
    /** Valid sources for fonts */
    fontSrc?: string | string[];
    /** Valid sources for AJAX, WebSockets, etc. */
    connectSrc?: string | string[];
    /** Valid sources for media (audio/video) */
    mediaSrc?: string | string[];
    /** Valid sources for frames */
    frameSrc?: string | string[];
    /** Valid sources for <object>, <embed>, <applet> */
    objectSrc?: string | string[];
    /** Valid sources for web workers */
    workerSrc?: string | string[];
    /** Valid sources for form actions */
    formAction?: string | string[];
    /** Controls which URLs can embed the page */
    frameAncestors?: string | string[];
    /** Restricts URLs for <base> element */
    baseUri?: string | string[];
    /** Report violations to this URL */
    reportUri?: string;
    /** Report violations to this endpoint */
    reportTo?: string;
    /** Upgrade insecure requests to HTTPS */
    upgradeInsecureRequests?: boolean;
    /** Block all mixed content */
    blockAllMixedContent?: boolean;
}
/**
 * Security headers configuration
 */
export interface ISecurityHeaders {
    /** Content Security Policy */
    csp?: IContentSecurityPolicy;
    /** X-Frame-Options: DENY, SAMEORIGIN, or ALLOW-FROM uri */
    xFrameOptions?: 'DENY' | 'SAMEORIGIN' | string;
    /** X-Content-Type-Options: nosniff */
    xContentTypeOptions?: boolean;
    /** X-XSS-Protection header (legacy, but still useful) */
    xXssProtection?: boolean | string;
    /** Referrer-Policy header */
    referrerPolicy?: 'no-referrer' | 'no-referrer-when-downgrade' | 'origin' | 'origin-when-cross-origin' | 'same-origin' | 'strict-origin' | 'strict-origin-when-cross-origin' | 'unsafe-url';
    /** Strict-Transport-Security (HSTS) max-age in seconds */
    hstsMaxAge?: number;
    /** Include subdomains in HSTS */
    hstsIncludeSubDomains?: boolean;
    /** HSTS preload flag */
    hstsPreload?: boolean;
    /** Permissions-Policy (formerly Feature-Policy) */
    permissionsPolicy?: Record<string, string[]>;
    /** Cross-Origin-Opener-Policy */
    crossOriginOpenerPolicy?: 'unsafe-none' | 'same-origin-allow-popups' | 'same-origin';
    /** Cross-Origin-Embedder-Policy */
    crossOriginEmbedderPolicy?: 'unsafe-none' | 'require-corp' | 'credentialless';
    /** Cross-Origin-Resource-Policy */
    crossOriginResourcePolicy?: 'same-site' | 'same-origin' | 'cross-origin';
}
/**
 * Bundled content item - matches tsbundle output format
 */
export interface IBundledContentItem {
    path: string;
    contentBase64: string;
}
export interface IServerOptions {
    /**
     * serve a particular directory
     */
    serveDir?: string;
    /**
     * Bundled content to serve from memory (higher priority than filesystem)
     * Accepts array format from tsbundle: { path: string; contentBase64: string }[]
     */
    bundledContent?: IBundledContentItem[];
    /**
     * inject a reload script that takes care of live reloading
     */
    injectReload?: boolean;
    /**
     * watch the serve directory?
     */
    watch?: boolean;
    cors: boolean;
    /**
     * a default answer given in case there is no other handler.
     */
    defaultAnswer?: () => Promise<string>;
    /**
     * will try to reroute traffic to an ssl connection using headers
     */
    forceSsl?: boolean;
    /**
     * allows serving manifests
     */
    manifest?: plugins.smartmanifest.ISmartManifestConstructorOptions;
    /**
     * the port to listen on
     */
    port?: number | string;
    publicKey?: string;
    privateKey?: string;
    sitemap?: boolean;
    feed?: boolean;
    robots?: boolean;
    domain?: string;
    /**
     * convey information about the app being served
     */
    appVersion?: string;
    feedMetadata?: plugins.smartfeed.IFeedOptions;
    articleGetterFunction?: () => Promise<plugins.tsclass.content.IArticle[]>;
    blockWaybackMachine?: boolean;
    /**
     * SPA fallback - serve index.html for non-file routes (e.g., /login, /dashboard)
     * Useful for single-page applications with client-side routing
     */
    spaFallback?: boolean;
    /**
     * Security headers configuration (CSP, HSTS, X-Frame-Options, etc.)
     */
    securityHeaders?: ISecurityHeaders;
    /**
     * Response compression configuration
     * Set to true for defaults (brotli + gzip), false to disable, or provide detailed config
     */
    compression?: plugins.smartserve.ICompressionConfig | boolean;
    /**
     * Disable all client-side caching by setting appropriate headers
     * Useful for development or when content changes frequently
     */
    noCache?: boolean;
}
export type THttpMethod = 'GET' | 'POST' | 'PUT' | 'DELETE' | 'PATCH' | 'HEAD' | 'OPTIONS' | 'ALL';
export interface IRouteHandler {
    (ctx: plugins.smartserve.IRequestContext): Promise<Response | null>;
}
export declare class TypedServer {
    options: IServerOptions;
    smartServe: plugins.smartserve.SmartServe;
    smartwatchInstance: plugins.smartwatch.Smartwatch;
    serveDirHashSubject: plugins.smartrx.rxjs.ReplaySubject<string>;
    serveHash: string;
    typedsocket: plugins.typedsocket.TypedSocket;
    typedrouter: plugins.typedrequest.TypedRouter<plugins.typedrequestInterfaces.ITypedRequest>;
    private sitemapHelper;
    private smartmanifestInstance;
    private devToolsController;
    private typedRequestController;
    private builtInRoutesController;
    private fileServer;
    private bundledContentMap;
    private bundledContentHash;
    lastReload: number;
    ended: boolean;
    constructor(optionsArg: IServerOptions);
    /**
     * Access sitemap URLs (for adding/replacing)
     */
    get sitemap(): SitemapHelper;
    /**
     * Add a custom route handler
     * Supports Express-style path patterns like '/path/:param' and '/path/*splat'
     * @param path - The route path pattern
     * @param method - HTTP method (GET, POST, PUT, DELETE, PATCH, ALL)
     * @param handler - Async function that receives IRequestContext and returns Response or null
     */
    addRoute(path: string, method: THttpMethod, handler: IRouteHandler): void;
    /**
     * Initialize bundled content from base64-encoded files
     */
    private initializeBundledContent;
    /**
     * Get MIME type for a file path
     */
    private getMimeType;
    /**
     * Serve bundled content from memory
     */
    private serveBundledContent;
    /**
     * Serve bundled HTML with reload script injection
     */
    private serveBundledHtmlWithInjection;
    /**
     * inits and starts the server
     */
    start(): Promise<void>;
    /**
     * Create an IRequestContext from a Request
     */
    private createContext;
    /**
     * Build CSP header string from configuration
     */
    private buildCspHeader;
    /**
     * Apply all configured headers (CORS, security, cache control) to a response
     */
    private applyResponseHeaders;
    /**
     * Main request handler - routes to appropriate sub-handlers
     */
    private handleRequest;
    /**
     * Internal request handler - routes to appropriate sub-handlers
     */
    private handleRequestInternal;
    /**
     * Handle HTML files with reload script injection
     */
    private handleHtmlWithInjection;
    /**
     * reloads the page
     */
    reload(): Promise<void>;
    /**
     * Stops the server and cleans up resources
     */
    stop(): Promise<void>;
    /**
     * Calculates a hash of the served directory for cache busting
     */
    createServeDirHash(): Promise<void>;
}
/**
 * Sitemap helper class
 */
declare class SitemapHelper {
    urls: plugins.smartsitemap.ISitemapUrl[];
    constructor(domain?: string);
    createSitemap(): Promise<string>;
    createSitemapNews(articles: plugins.tsclass.content.IArticle[]): Promise<string>;
    replaceUrls(urlsArg: plugins.smartsitemap.ISitemapUrl[]): void;
    addUrls(urlsArg: plugins.smartsitemap.ISitemapUrl[]): void;
}
export {};
