import {IncomingMessage, ServerResponse} from "node:http"

type ContentSecurityPolicyDirectiveValueFunction = (req: IncomingMessage, res: ServerResponse) => string
type ContentSecurityPolicyDirectiveValue = string | ContentSecurityPolicyDirectiveValueFunction
type ContentSecurityPolicyDirectives = Record<string, null | Iterable<ContentSecurityPolicyDirectiveValue> | typeof dangerouslyDisableDefaultSrc>
type ContentSecurityPolicyOptions = {
	reportOnly?: boolean
} & (
	| {
			useDefaults?: true
			directives?: ContentSecurityPolicyDirectives
	  }
	| {
			useDefaults: false
			directives: ContentSecurityPolicyDirectives
	  }
)
type ContentSecurityPolicy = {
	(options?: Readonly<ContentSecurityPolicyOptions>): (req: IncomingMessage, res: ServerResponse, next: (err?: Error) => void) => void
	getDefaultDirectives: typeof getDefaultDirectives
	dangerouslyDisableDefaultSrc: typeof dangerouslyDisableDefaultSrc
}
declare const dangerouslyDisableDefaultSrc: unique symbol
declare const getDefaultDirectives: () => Record<string, Iterable<ContentSecurityPolicyDirectiveValue>>
declare const contentSecurityPolicy: ContentSecurityPolicy

export {dangerouslyDisableDefaultSrc, contentSecurityPolicy as default, getDefaultDirectives}
export type {ContentSecurityPolicyOptions}
