/// import type { Context, Initializer } from 'worktop'; import type { Promisable, Strict } from 'worktop/utils'; import type { Durable } from 'worktop/cfw.durable'; import type { WebSocket } from 'worktop/cfw.ws'; import type { KV } from 'worktop/cfw.kv'; declare global { const WebSocketPair: { new(): { /** the `client` socket */ 0: WebSocket, /** the `server` socket */ 1: WebSocket, }; }; interface CacheStorage { default: Cache; } interface Request { cf: IncomingCloudflareProperties; } interface ResponseInit { webSocket?: WebSocket; } interface FetchEvent { passThroughOnException(): void; } function addEventListener( type: 'scheduled', handler: (event: CronEvent) => Promisable ): void; } export interface Bindings { [name: string]: string | CryptoKey | KV.Namespace | Durable.Namespace | Module.Service; } export type FetchHandler = ( request: Request, bindings: Strict, context: { bindings?: Bindings; waitUntil(f: any): void; passThroughOnException(): void; } ) => Promisable; export type CronHandler = ( event: Omit, bindings: Strict, context: { bindings?: Bindings; waitUntil(f: any): void; } ) => Promisable; export interface CronEvent { type: 'scheduled'; /** * The CRON trigger * @example "23 59 LW * *" */ cron: string; /** * Milliseconds since UNIX epoch. * @example new Date(evt.scheduledTime) */ scheduledTime: number; /** * Method wrapper for event's action handler. */ waitUntil(f: Promisable): void; } /** * Cloudflare Request Metadata/Properties * @see https://developers.cloudflare.com/workers/runtime-apis/request#incomingrequestcfproperties * @see https://github.com/cloudflare/workers-types/blob/master/overrides/cf.d.ts */ export interface IncomingCloudflareProperties { /** * The ASN of the incoming request * @example 395747 **/ asn: number; /** * The organisation which owns the ASN of the incoming request. * @example "Google Cloud" */ asOrganization: string; botManagement?: { score: number; staticResource: boolean; verifiedBot: boolean; }; /** * Round-trip time (in ms) from client to the colo data center that the request hit */ clientTcpRtt: number; clientTrustScore?: number; /** * The three-letter `IATA` airport code of the data center that the request hit * @example "DFW" */ colo: string; /** * The two-letter country code in the request. * @note This is the same value as that provided in the `CF-IPCountry` header * @example "US" */ country: string | null; /** * The HTTP Protocol * @example "HTTP/2" */ httpProtocol: string; /** * The browser-requested prioritization information in the request object * @example "weight=192;exclusive=0;group=3;group-weight=127" */ requestPriority?: string; /** * The cipher for the connection to Cloudflare * @example "AEAD-AES128-GCM-SHA256" */ tlsCipher: string; /** * @note Requires Cloudflare Access or API Shield */ tlsClientAuth?: { certIssuerDN: string; certIssuerDNLegacy: string; certPresented: '0' | '1'; certSubjectDNLegacy: string; certSubjectDN: string; /** @example "Dec 22 19:39:00 2018 GMT" */ certNotBefore: string; /** @example "Dec 22 19:39:00 2018 GMT" */ certNotAfter: string; certFingerprintSHA1: string; certSerial: string; /** @example "SUCCESS", "FAILED:reason", "NONE" */ certVerified: string; }; /** * The TLS version of the connection to Cloudflare * @example "TLSv1.3" */ tlsVersion: string; /** * City of the incoming request * @example "Austin" **/ city?: string; /** * Continent of the incoming request * @example "NA" **/ continent?: string; /** * Latitude of the incoming request * @example "30.27130" **/ latitude?: string; /** * Longitude of the incoming request * @example "-97.74260" **/ longitude?: string; /** * Postal code of the incoming request * @example "78701" **/ postalCode?: string; /** * Metro code (DMA) of the incoming request * @example "635" **/ metroCode?: string; /** * If known, the `ISO 3166-2` name for the first level region associated with the IP address of the incoming request * @example "Texas" **/ region?: string; /** * If known, the `ISO 3166-2` code for the first level region associated with the IP address of the incoming request * @example "TX" **/ regionCode?: string; /** * Timezone of the incoming request * @example "America/Chicago". **/ timezone: string; } export namespace Module { export interface Service { fetch: typeof fetch; } export interface Worker { fetch?: FetchHandler; scheduled?: CronHandler; } export interface Context { bindings?: Bindings; waitUntil(f: any): void; passThroughOnException?(): void; } } /** * Tiny helper for easy TypeScript definition inferences */ export function define< B extends Bindings = Bindings >(worker: Module.Worker): Module.Worker; /** * Generate a Module Worker definition from a Module `Initializer` function. * @example export default cfw.start(API.run); */ export function start< C extends Context = Context, B extends Bindings = Bindings, >(run: Initializer): { fetch: FetchHandler; } /** * Attach the `Initializer` function as a "fetch" event listener. * @note This is the same as `start` from `worktop/sw` but auto-loads * the type definitions for the Cloudflare runtime environment. * @example cfw.listen(API.run); */ export function listen< C extends Context = Context >(run: Initializer): void;