declare module "glfw-raub" {
	type EventEmitter = import('node:events').EventEmitter;
	
	type TWindowMode = 'windowed' | 'borderless' | 'fullscreen';
	
	type TSize = Readonly<{ width: number; height: number }>;
	
	type TPos = Readonly<{ x: number; y: number }>;
	
	type TCbVoid = () => void;
	
	type TRect = TSize & TPos & {
		left: number;
		top: number;
		right: number;
		bottom: number;
	};
	
	/* Image data for icons and cursors. */
	type TImageData = TSize & Readonly<{
		data: Buffer;
		noflip?: boolean;
	}>;
	
	type TMonitorMode = TSize & Readonly<{
		/** Refresh rate. */
		rate: number;
	}>;
	
	type TMonitor = TMonitorMode & {
		/** Is this screen primary. */
		is_primary: boolean;
		/** Screen name. */
		name: string;
		/** Global position x of the screen. */
		pos_x: number;
		/** Global position y of the screen. */
		pos_y: number;
		/** Screen width in mm. */
		width_mm: number;
		/** Screen height in mm. */
		height_mm: number;
		/** An array of supported display modes. */
		modes: ReadonlyArray<TMonitorMode>;
	};
	
	type TEvent = {
		type: string;
		[key: string]: any;
	};
	
	type TMouseEvent = TEvent & {
		buttons: number;
		clientX: number;
		clientY: number;
		pageX: number;
		pageY: number;
		x: number;
		y: number;
		shiftKey: boolean;
		ctrlKey: boolean;
		altKey: boolean;
		metaKey: boolean;
	};
	
	type TMouseMoveEvent = TMouseEvent & {
		movementX: number;
		movementY: number;
	};
	
	type TMouseButtonEvent = TMouseEvent & {
		button: number;
		which: number;
	};
	
	type TMouseScrollEvent = TMouseEvent & {
		deltaX: number;
		deltaY: number;
		deltaZ: number;
		wheelDeltaX: number;
		wheelDeltaY: number;
		wheelDelta: number;
	};
	
	type TJoystickEvent = TEvent & {
		id: number;
		event: number;
	};
	
	type TKeyEvent = TEvent & {
		repeat: boolean;
		altKey: boolean;
		ctrlKey: boolean;
		metaKey: boolean;
		shiftKey: boolean;
		code: string | null;
		key: string | null;
		which: number;
		charCode: number;
	};
	
	type TDropEvent = TEvent & {
		dataTransfer: Readonly<{ [key: string]: never }>
		dropEffect: 'none';
		effectAllowed: 'all';
		files: ReadonlyArray<string>;
		items: ReadonlyArray<string>;
		types: ReadonlyArray<never>;
	};
	
	type TIconifyEvent = TEvent & {
		iconified: boolean;
	};
	
	type TPosEvent = TEvent & TPos;
	
	type TSizeEvent = TEvent & TSize;
	
	type TEventCb<T extends TEvent> = (event: T) => (void | boolean);
	
	type TCbField<T extends TEvent> = TEventCb<T> | ReadonlyArray<TEventCb<T>>;
	
	export type TWindowOpts = Readonly<Partial<{
		/** Major OpenGL version to be used. Default is 2. */
		major: number;
		/** Minor OpenGL version to be used. Default is 1. */
		minor: number;
		/** Window title, takes current directory as default. Default is $PWD. */
		width: number;
		/** Window initial width. Default is 800. */
		height: number;
		/** Window initial height. Default is 600. */
		display: number;
		/** Display id to open window on a specific display. Default is undefined. */
		vsync: boolean;
		/** If vsync should be used. Default is false. */
		autoIconify: boolean;
		/** If the window is fullscreen, takes presedence over `mode`. Default is false. */
		fullscreen: boolean;
		/** One of `'windowed', 'borderless', 'fullscreen'`. Default is 'windowed'. */
		mode: TWindowMode;
		/** If fullscreen windows should iconify automatically on focus loss. Default is true. */
		decorated: boolean;
		/** Multisample antialiasing level. Default is 2. */
		msaa: number;
		/** Winodw icon. Default is null. */
		icon: TImageData;
		/** If window has borders (use `false` for borderless fullscreen). Default is true. */
		title: string;
		/** Make window resizable. Default is true. */
		resizable: boolean;
		/**
		 * This callback is called right before the window creation.
		 *
		 * `window` - a reference to the Window object (`this`).
		 * `glfw` - is a reference to GLFW module, just in case if needed.
		 */
		onBeforeWindow: (window: Window, glfw: unknown) => void;
	}>>;

	type TWindowPtr = number;
	type TVkInstancePtr = number;
	type TVkSurfacePtr = number;
	type TVkDevicePtr = number;
	type TVkPhysicalDevicePtr = number;
	type TVkProcedurePtr = number;
	type TVkAllocationCallbacksPtr = number;
	type TFnWindow = (window: TWindowPtr) => void;
	
	/**
	 * GLFW Window API wrapper.
	 *
	 * Window is a higher-level js-wrapper for GLFW API.
	 * It helps managing window instances. It also extends
	 * EventEmitter to provide event-handling.
	 */
	export class Window implements EventEmitter {
		constructor(opts?: TWindowOpts);
		
		/** The ratio between physical and logical pixels, e.g 2 for Retina. Default is 1.*/
		readonly ratio: number;
		
		/** Alias for ratio. */
		readonly devicePixelRatio: number;
		
		/** GLFW window pointer. Literally, the pointer from C++. */
		readonly handle: number;
		
		/** Always 0. */
		readonly scrollX: number;
		
		/** Always 0. */
		readonly scrollY: number;
		
		/** Number of msaa samples. */
		readonly msaa: number;
		
		/** OpenGL vendor info. */
		readonly version: string;
		
		/** The size of allocated framebuffer, same as pxSize. */
		readonly framebufferSize: Readonly<{ width: number; height: number }>;
		
		/** Which OpenGL context is now current. */
		readonly currentContext: number;
		
		/** Platform device (e.g. `wglGetCurrentDC()` or `glfwGetX11Display()`). */
		readonly platformDevice: number;
		
		/** Platform-specific window handle (e.g. Windows HWND). */
		readonly platformWindow: number;
		
		/** Platform OpenGL context ID for this window. */
		readonly platformContext: number;
		
		/**
		 * Window display mode. Default is 'windowed'.
		 *
		 * One of: 'windowed', 'borderless', 'fullscreen'.
		 * Here 'borderless' emulates fullscreen by a frameless, screen-sized window.
		 * When this property is changed, a new window is created and the old is hidden.
		 */
		mode: TWindowMode;
		
		/**
		 * Width in LOGICAL pixels.
		 *
		 * For Retina - twice the window size.
		 */
		width: number;
		
		/**
		 * Height in LOGICAL pixels.
		 *
		 * For Retina - twice the window size.
		 */
		height: number;
		
		/** Alias for width. */
		offsetWidth: number;
		
		/** Alias for height. */
		offsetHeight: number;
		
		/** Alias for width. */
		w: number;
		
		/** Alias for height. */
		h: number;
		
		/** An Array, containing LOGICAL width and height. */
		wh: [number, number];
		
		/** An Object, containing LOGICAL width and height. */
		pxSize: TSize;
		
		/** Alias for width. */
		innerWidth: number;
		
		/** Alias for height. */
		innerHeight: number;
		
		/** Alias for width. */
		clientWidth: number;
		
		/** Alias for height. */
		clientHeight: number;
		
		/**
		 * Alias for .on('keydown', cb).
		 *
		 * Setter adds a new callback.
		 * Getter returns an Array of currently existing callbacks.
		 */
		onkeydown: TCbField<TKeyEvent>;
		
		/**
		 * Alias for .on('keyup', cb).
		 *
		 * Setter adds a new callback.
		 * Getter returns an Array of currently existing callbacks.
		 */
		onkeyup: TCbField<TKeyEvent>;
		
		/**
		 * Alias for .on('mousedown', cb).
		 *
		 * Setter adds a new callback.
		 * Getter returns an Array of currently existing callbacks.
		 */
		onmousedown: TCbField<TMouseButtonEvent>;
		
		/**
		 * Alias for .on('mouseup', cb).
		 *
		 * Setter adds a new callback.
		 * Getter returns an Array of currently existing callbacks.
		 */
		onmouseup: TCbField<TMouseButtonEvent>;
		
		/**
		 * Alias for .on('wheel', cb).
		 *
		 * Setter adds a new callback.
		 * Getter returns an Array of currently existing callbacks.
		 */
		onwheel: TCbField<TMouseScrollEvent>;
		
		/**
		 * Alias for .on('mousewheel', cb).
		 *
		 * Setter adds a new callback.
		 * Getter returns an Array of currently existing callbacks.
		 */
		onmousewheel: TCbField<TMouseScrollEvent>;
		
		/**
		 * Alias for .on('resize', cb).
		 *
		 * Setter adds a new callback.
		 * Getter returns an Array of currently existing callbacks.
		 */
		onresize: TCbField<TSizeEvent>;
		
		/** An Object, containing PHYSICAL width and height of the window. */
		size: TSize;

		/** Boolean, sets window resizability */
		resizable: boolean;

		/**
		 * Alias for .on('keydown', cb).
		 *
		 * Setter adds a new callback.
		 * Getter returns an Array of currently existing callbacks.
		 */
		title: string;
		
		/**
		 * Window icon in RGBA format.
		 *
		 * Consider using image-raub Image implementation.
		 * The given image is vertically flipped if noflip is not set to true.
		 * @see https://github.com/node-3d/image-raub
		 * @see https://github.com/node-3d/glfw-raub/examples/icon.js
		 * */
		icon: TImageData | unknown;
		
		/** If the window is going to be closed. */
		shouldClose: boolean;
		
		/** Window position X-coordinate on the screen. */
		x: number;
		
		/** Window position Y-coordinate on the screen. */
		y: number;
		
		/** An Object, containing the window position coordinates. */
		pos: TPos;
		
		/** An Object, containing the cursor position coordinates. */
		cursorPos: TPos;
		
		/** Get a monitor having the most overlap with this window. */
		getCurrentMonitor(): TMonitor;
		
		/**
		 * Gets a browserlike rect of this window.
		 *
		 * @see https://developer.mozilla.org/en-US/docs/Web/API/Element/getBoundingClientRect
		 */
		getBoundingClientRect(): TRect;
		
		/**
		 * Get key state (GLFW_PRESS/GLFW_RELEASE).
		 *
		 * @see https://www.glfw.org/docs/latest/group__keys.html
		 */
		getKey(key: number): number;
		
		/**
		 * Get mouse button state (GLFW_PRESS/GLFW_RELEASE).
		 *
		 * @see https://www.glfw.org/docs/latest/group__buttons.html
		 */
		getMouseButton(button: number): number;
		
		/**
		 * Get window attribute.
		 *
		 * @see https://www.glfw.org/docs/latest/window_guide.html#window_attribs
		 */
		getWindowAttrib(attrib: number): number;
		
		/** Set input mode option. */
		setInputMode(mode: number, value: number): void;
		
		/** Swaps the front and back buffers of the window. */
		swapBuffers(): void;
		
		/** Make this window's GL context current. */
		makeCurrent(): void;
		
		/** Destroy the GLFW window. */
		destroy(): void;
		
		/** Minimize the window. */
		iconify(): void;
		
		/** Restore the window if it was previously iconified or maximized. */
		restore(): void;
		
		/** Hide the window. */
		hide(): void;
		
		/** Show the window, if it is hidden. */
		show(): void;
		
		/**
		 * Add event listener.
		 *
		 * 'blur' - window [focus lost](https://developer.mozilla.org/en-US/docs/Web/Events/blur)
		 * 'click' - mouse button [clicked](https://developer.mozilla.org/en-US/docs/Web/Events/click)
		 * 'drop' - drag-[dropped](https://developer.mozilla.org/en-US/docs/Web/Events/drop) some files on the window
		 * 'focus' - window [focus gained](https://developer.mozilla.org/en-US/docs/Web/Events/focus)
		 * 'focusin' - window [focus gained](https://developer.mozilla.org/en-US/docs/Web/Events/focusin)
		 * 'focusout' - window [focus lost](https://developer.mozilla.org/en-US/docs/Web/Events/focusout)
		 * 'resize' - render-surface resized (values in pixels) `{ width, height }`
		 * 'iconifiy' - window was iconified
		 * 'keydown' - keyboard [key down](https://developer.mozilla.org/en-US/docs/Web/Events/keydown)
		 * 'keyup' - keyboard [key up](https://developer.mozilla.org/en-US/docs/Web/Events/keyup)
		 * 'mousedown' - mouse [button down](https://developer.mozilla.org/en-US/docs/Web/Events/mousedown)
		 * 'mouseenter' - mouse [entered](https://developer.mozilla.org/en-US/docs/Web/Events/mouseenter) the window
		 * 'mouseleave' - mouse [left](https://developer.mozilla.org/en-US/docs/Web/Events/mouseleave) the window
		 * 'mouseup' - mouse [button up](https://developer.mozilla.org/en-US/docs/Web/Events/mouseup)
		 * 'quit' - window closed
		 * 'refresh' - window needs to be redrawn
		 * 'wresize' - window frame resized (NOT really pixels) `{ width, height }`
		 * 'wheel' - mouse [wheel rotation](https://developer.mozilla.org/en-US/docs/Web/Events/wheel)
		 * 'move' - window moved `{ x, y }`
		 * Note: `keypress` event is not supported.
		 */
		on(name: string, cb: (event: TEvent) => (void | boolean)): this;
		
		/** Alias for `emit`, type is expected inside the event object. */
		dispatchEvent(event: TEvent): void;
		
		/** Alias for `on`. */
		addEventListener(name: string, cb: (event: TEvent) => (void | boolean)): this;
		
		/** Alias for `removeListener`. */
		removeEventListener(name: string): void;
		
		/** BOUND `requestAnimationFrame` method, returns a timer id. */
		requestAnimationFrame(cb: (dateNow: number) => void): number;
		
		/** BOUND `cancelAnimationFrame` method. Cancels by id. */
		cancelAnimationFrame(id: number): void;
		
		/**
		 * BOUND optimized single-frame method, returns a timer id.
		 *
		 * This method comes with a limitation that it should only have 1 call per frame.
		 * Similar to `requestAnimationFrame` it will issue a `setImmediate`, but will not
		 * need to create a new arrow function for it to run.
		*/
		frame(cb: (dateNow: number) => void): number;
		
		/**
		 * BOUND optimized loop method that will continuously generate frames with given `cb`.
		 *
		 * The returned function may be called to break the loop.
		*/
		loop(cb: (dateNow: number) => void): (() => void);
		
		// ------ implements EventEmitter
		
		addListener(eventName: string | symbol, listener: (...args: any[]) => void): this;
		once(eventName: string | symbol, listener: (...args: any[]) => void): this;
		removeListener(eventName: string | symbol, listener: (...args: any[]) => void): this;
		off(eventName: string | symbol, listener: (...args: any[]) => void): this;
		removeAllListeners(event?: string | symbol): this;
		setMaxListeners(n: number): this;
		getMaxListeners(): number;
		listeners(eventName: string | symbol): Function[];
		rawListeners(eventName: string | symbol): Function[];
		emit(eventName: string | symbol, ...args: any[]): boolean;
		listenerCount(eventName: string | symbol, listener?: Function): number;
		prependListener(eventName: string | symbol, listener: (...args: any[]) => void): this;
		prependOnceListener(eventName: string | symbol, listener: (...args: any[]) => void): this;
		eventNames(): Array<string | symbol>;
	}
	
	
	export type TDocumentOpts = TWindowOpts & Readonly<Partial<{
		/**
		 * If the window should ignore the default quit signals.
		 *
		 * E.g.: process 'SIGINT', document 'quit', and ESC press if `autoEsc` enabled.
		 */
		ignoreQuit: boolean;
		
		/**
		 * If window has the default key handlers for fullscreen.
		 * 
		 * * CTRL+F - borderless fullscreen window.
		 * * CTRL+ALT+F - real, exclusive fullscreen mode.
		 * * CTRL+SHIFT+F - back to windowed.
		 */
		autoFullscreen: boolean;
		
		/**
		 * Handle ESC key to close window automatically.
		 *
		 * Does nothing if `ignoreQuit` is enabled.
		 */
		autoEsc: boolean;
	}>>;
	
	/**
	 * Web-like Document.
	 *
	 * Document extends Window to provide an additional web-style compatibility layer.
	 * As name suggests, objects of such class will mimic the behavior and properties of
	 * your typical browser window.document. But also it is a Window, at the same time.
	 * And it is incomplete at this point: you still have to provide an Image class of
	 * your choice and WebGL context (implementation).
	 * Two static methods are designated for this: setImage and setWebgl.
	 */
	export class Document extends Window {
		/**
		 * Set `Image` implementation.
		 *
		 * For example, [this Image implementation](https://github.com/raub/node-image).
		 * Also sets global.HTMLImageElement.
		 */
		static setImage(Image: unknown): void;
		
		/**
		 * Set `WebGL` implementation.
		 *
		 * For example, [this WebGL implementation](https://github.com/raub/node-webgl).
		 */
		static setWebgl(Webgl: unknown): void;
		
		constructor(opts?: TDocumentOpts);
		
		/** Returns `this`. */
		readonly body: Document;
		
		/** Set `glfw.CURSOR` mode to `glfw.CURSOR_DISABLED`. */
		setPointerCapture(): void;
		
		/** Set `glfw.CURSOR` mode to `glfw.CURSOR_NORMAL`. */
		releasePointerCapture(): void;
		
		/**
		 * Mimics web-element `style` property.
		 *
		 * But only `width` and `height` matters.
		 */
		readonly style: TSize;
		
		/** Returns `Document.webgl`, set through `Document.setWebgl`. */
		readonly context: Readonly<{ [key: string]: unknown }>;
		
		/** Returns `Document.webgl`, set through `Document.setWebgl`. */
		getContext(kind: string): Readonly<{ [key: string]: unknown }>;
		
		/** Returns `this`. */
		getElementById(id: string): Document;
		
		/** If contains 'canvas', returns `this`, otherwise `null`. */
		getElementsByTagName(tag: string): ReadonlyArray<Document>;
		
		/** Does nothing. */
		appendChild(): void;
		
		/** Returns the result of `createElement(tag)` */
		createElementNS(unused: unknown, tag: string): void;
		
		/**
		 * Fake createElement.
		 *
		 * For `'canvas'` returns `this` for *the first call*,
		 * then returns new instances of canvas-like object capable of using 2d or 3d context.
		 * This is done for some web APIs like three.js, which create additional canvases.
		 * For `'image'` returns `new Document.Image`, as per `Document.setImage`.
		 */
		createElement(tag: string): Document;
	}

	/**
	 * Hide the terminal window.
	 *
	 * **Windows ONLY** hides the console window, but only in case
	 * this console window is property of this process. For instance this works if you use
	 * `pkg` module to bundle your app, and then doubleclick the EXE. But if you are running
	 * a command, like `node script.js`, then this won't hide the window. **It's safe to call
	 * this function on all platforms, but it will be ignored, unless the platform is Windows**.
	 */
	const hideConsole: TCbVoid;
	
	/**
	 * Show the terminal window.
	 *
	 * **Windows ONLY** shows the console window
	 * if it was previously hidden with `glfw.hideConsole()`.
	 */
	const showConsole: TCbVoid;
	
	/** Draws a test scene, used in examples here. */
	const testScene: (w: number, h: number, z: number) => void;
	
	/** Draws a test scene, that reacts to a joystick. */
	const testJoystick: TCbVoid;
	
	const init: TCbVoid;
	const initHint: (hint: number, value: number) => void;
	const terminate: TCbVoid;
	const getVersion: () => Readonly<{
		major: number;
		minor: number;
		rev: number;
	}>;
	const getVersionString: () => string;
	const getError: () => string;
	const getTime: () => number;
	const setTime: (time: number) => void;
	const getMonitors: () => ReadonlyArray<TMonitor>;
	const getPrimaryMonitor: () => TMonitor;
	const windowHint: (hint: number, value: number) => void;
	const windowHintString: (hint: number, value: string) => void;
	const defaultWindowHints: TCbVoid;
	const joystickPresent: () => boolean;
	const getJoystickAxes: (id: number) => string;
	const getJoystickButtons: (id: number) => string;
	const getJoystickName: (id: number) => string;
	
	/**
	 * Create a GLFW window.
	 *
	 * This function differs from GLFW Docs signature due to JS specifics.
	 * Here `emitter` is any object having a **BOUND** `emit()` method.
	 * It will be used to transmit GLFW events.
	 */
	const createWindow: (
		width: number,
		height: number,
		emitter: Readonly<{ emit: (name: string, event: TEvent ) => void }>,
		title: string,
		monitor: number,
		isNoApi: boolean,
	) => TWindowPtr;
	
	const destroyWindow: TFnWindow;
	const setWindowTitle: (window: TWindowPtr, title: string) => void;
	const setWindowIcon: (window: TWindowPtr, icon: TImageData) => void;
	const getWindowSize: (window: TWindowPtr) => TSize;
	const getWindowFrameSize: (window: TWindowPtr) => Readonly<{
		left: number;
		top: number;
		right: number;
		bottom: number;
	}>;
	const getWindowContentScale: (window: TWindowPtr) => Readonly<{
		xscale: number;
		yscale: number;
	}>;
	const setWindowSize: (window: TWindowPtr, w: number, h: number) => void;
	const setWindowSizeLimits: (
		window: TWindowPtr,
		minwidth: number,
		minheight: number,
		maxwidth: number,
		maxheight: number,
	) => void;
	const setWindowAspectRatio: (window: TWindowPtr, numer: number, denom: number) => void;
	const setWindowPos: (window: TWindowPtr, x: number, y: number) => void;
	const getWindowPos: (window: TWindowPtr) => TPos;
	const getWindowOpacity: (window: TWindowPtr) => number;
	const setWindowOpacity: (window: TWindowPtr, opacity: number) => void;
	const maximizeWindow: TFnWindow;
	const focusWindow: TFnWindow;
	const requestWindowAttention: TFnWindow;
	const getWindowMonitor: (window: TWindowPtr) => TMonitor;
	const getFramebufferSize: (window: TWindowPtr) => TSize;
	const iconifyWindow: TFnWindow;
	const restoreWindow: TFnWindow;
	const hideWindow: TFnWindow;
	const showWindow: TFnWindow;
	const windowShouldClose: (window: TWindowPtr) => number;
	const setWindowShouldClose: (window: TWindowPtr, shouldClose: number) => void;
	const getWindowAttrib: (window: TWindowPtr, attrib: number) => number;
	const setWindowAttrib: (window: TWindowPtr, attrib: number, value: number) => void;
	const setInputMode: (window: TWindowPtr, mode: number, value: number) => void;
	const getInputMode: (window: TWindowPtr, mode: number) => number;
	const pollEvents: TCbVoid;
	const waitEvents: TCbVoid;
	const waitEventsTimeout: (timeout: number) => void;
	const postEmptyEvent: TCbVoid;
	const getKey: (window: TWindowPtr, key: number) => number;
	const getMouseButton: (window: TWindowPtr, button: number) => number;
	const getCursorPos: (window: TWindowPtr, x: number, y: number) => void;
	const setCursorPos: (window: TWindowPtr) => TPos;
	const makeContextCurrent: TFnWindow;
	const getCurrentContext: () => TWindowPtr;
	const swapBuffers: TFnWindow;
	const swapInterval: (interval: number) => void;
	const extensionSupported: (name: string) => boolean;
	const rawMouseMotionSupported: () => boolean;
	const getKeyName: (key: number, scan: number) => string;
	const getKeyScancode: (key: number) => number;
	const getJoystickHats: (id: string) => ReadonlyArray<number>;
	const joystickIsGamepad: (id: string) => boolean;
	const updateGamepadMappings: (mappings: string) => boolean;
	const getGamepadName: (id: number) => string;
	const getGamepadState: (id: number) => Readonly<{
		buttons: ReadonlyArray<number>;
		axes: ReadonlyArray<number>;
	}>;
	const setClipboardString: (window: TWindowPtr, value: string) => void;
	const getClipboardString: (window: TWindowPtr) => string;
	const getTimerValue: () => number;
	const getTimerFrequency: () => number;
	const platformWindow: (window: TWindowPtr) => number;
	const platformContext: (window: TWindowPtr) => number;
	const platformDevice: (window: TWindowPtr) => number;
	const getPlatform: () => number;
	const platformSupported: (platform: number) => number;
	const getJoystickGUID: (id: number) => (null | string);
	
	const vulkanSupported: () => boolean;
	const getRequiredInstanceExtensions: () => string[];
	const getInstanceProcAddress: (instance: TVkInstancePtr, name: string) => TVkProcedurePtr;
	const getPhysicalDevicePresentationSupport: (
		instance: TVkInstancePtr,
		physicalDevice: TVkPhysicalDevicePtr,
		queueFamily: number,
	) => boolean;
	const createWindowSurface: (
		instance: TVkInstancePtr,
		window: TWindowPtr,
		allocator: TVkAllocationCallbacksPtr,
	) => TVkSurfacePtr;
	const vulkanCreateInstance: () => TVkInstancePtr;
	const vulkanCreateDevice: () => ({
		device: TVkDevicePtr,
		physicalDevice: TVkPhysicalDevicePtr,
		queueFamily: number,
	});
	const vulkanDestroyDevice: (instance: TVkInstancePtr, device: TVkDevicePtr) => void;
	const vulkanDestroyInstance: (instance: TVkInstancePtr) => void;
	
	const VERSION_MAJOR: number;
	const VERSION_MINOR: number;
	const VERSION_REVISION: number;
	const TRUE: number;
	const FALSE: number;
	const RELEASE: number;
	const PRESS: number;
	const REPEAT: number;
	const HAT_CENTERED: number;
	const HAT_UP: number;
	const HAT_RIGHT: number;
	const HAT_DOWN: number;
	const HAT_LEFT: number;
	const HAT_RIGHT_UP: number;
	const HAT_RIGHT_DOWN: number;
	const HAT_LEFT_UP: number;
	const HAT_LEFT_DOWN: number;
	const KEY_UNKNOWN: number;
	const KEY_SPACE: number;
	const KEY_APOSTROPHE: number;
	const KEY_COMMA: number;
	const KEY_MINUS: number;
	const KEY_PERIOD: number;
	const KEY_SLASH: number;
	const KEY_0: number;
	const KEY_1: number;
	const KEY_2: number;
	const KEY_3: number;
	const KEY_4: number;
	const KEY_5: number;
	const KEY_6: number;
	const KEY_7: number;
	const KEY_8: number;
	const KEY_9: number;
	const KEY_SEMICOLON: number;
	const KEY_EQUAL: number;
	const KEY_A: number;
	const KEY_B: number;
	const KEY_C: number;
	const KEY_D: number;
	const KEY_E: number;
	const KEY_F: number;
	const KEY_G: number;
	const KEY_H: number;
	const KEY_I: number;
	const KEY_J: number;
	const KEY_K: number;
	const KEY_L: number;
	const KEY_M: number;
	const KEY_N: number;
	const KEY_O: number;
	const KEY_P: number;
	const KEY_Q: number;
	const KEY_R: number;
	const KEY_S: number;
	const KEY_T: number;
	const KEY_U: number;
	const KEY_V: number;
	const KEY_W: number;
	const KEY_X: number;
	const KEY_Y: number;
	const KEY_Z: number;
	const KEY_LEFT_BRACKET: number;
	const KEY_BACKSLASH: number;
	const KEY_RIGHT_BRACKET: number;
	const KEY_GRAVE_ACCENT: number;
	const KEY_WORLD_1: number;
	const KEY_WORLD_2: number;
	const KEY_ESCAPE: number;
	const KEY_ENTER: number;
	const KEY_TAB: number;
	const KEY_BACKSPACE: number;
	const KEY_INSERT: number;
	const KEY_DELETE: number;
	const KEY_RIGHT: number;
	const KEY_LEFT: number;
	const KEY_DOWN: number;
	const KEY_UP: number;
	const KEY_PAGE_UP: number;
	const KEY_PAGE_DOWN: number;
	const KEY_HOME: number;
	const KEY_END: number;
	const KEY_CAPS_LOCK: number;
	const KEY_SCROLL_LOCK: number;
	const KEY_NUM_LOCK: number;
	const KEY_PRINT_SCREEN: number;
	const KEY_PAUSE: number;
	const KEY_F1: number;
	const KEY_F2: number;
	const KEY_F3: number;
	const KEY_F4: number;
	const KEY_F5: number;
	const KEY_F6: number;
	const KEY_F7: number;
	const KEY_F8: number;
	const KEY_F9: number;
	const KEY_F10: number;
	const KEY_F11: number;
	const KEY_F12: number;
	const KEY_F13: number;
	const KEY_F14: number;
	const KEY_F15: number;
	const KEY_F16: number;
	const KEY_F17: number;
	const KEY_F18: number;
	const KEY_F19: number;
	const KEY_F20: number;
	const KEY_F21: number;
	const KEY_F22: number;
	const KEY_F23: number;
	const KEY_F24: number;
	const KEY_F25: number;
	const KEY_KP_0: number;
	const KEY_KP_1: number;
	const KEY_KP_2: number;
	const KEY_KP_3: number;
	const KEY_KP_4: number;
	const KEY_KP_5: number;
	const KEY_KP_6: number;
	const KEY_KP_7: number;
	const KEY_KP_8: number;
	const KEY_KP_9: number;
	const KEY_KP_DECIMAL: number;
	const KEY_KP_DIVIDE: number;
	const KEY_KP_MULTIPLY: number;
	const KEY_KP_SUBTRACT: number;
	const KEY_KP_ADD: number;
	const KEY_KP_ENTER: number;
	const KEY_KP_EQUAL: number;
	const KEY_LEFT_SHIFT: number;
	const KEY_LEFT_CONTROL: number;
	const KEY_LEFT_ALT: number;
	const KEY_LEFT_SUPER: number;
	const KEY_RIGHT_SHIFT: number;
	const KEY_RIGHT_CONTROL: number;
	const KEY_RIGHT_ALT: number;
	const KEY_RIGHT_SUPER: number;
	const KEY_MENU: number;
	const KEY_LAST: number;
	const MOD_SHIFT: number;
	const MOD_CONTROL: number;
	const MOD_ALT: number;
	const MOD_SUPER: number;
	const MOD_CAPS_LOCK: number;
	const MOD_NUM_LOCK: number;
	const MOUSE_BUTTON_1: number;
	const MOUSE_BUTTON_2: number;
	const MOUSE_BUTTON_3: number;
	const MOUSE_BUTTON_4: number;
	const MOUSE_BUTTON_5: number;
	const MOUSE_BUTTON_6: number;
	const MOUSE_BUTTON_7: number;
	const MOUSE_BUTTON_8: number;
	const MOUSE_BUTTON_LAST: number;
	const MOUSE_BUTTON_LEFT: number;
	const MOUSE_BUTTON_RIGHT: number;
	const MOUSE_BUTTON_MIDDLE: number;
	const JOYSTICK_1: number;
	const JOYSTICK_2: number;
	const JOYSTICK_3: number;
	const JOYSTICK_4: number;
	const JOYSTICK_5: number;
	const JOYSTICK_6: number;
	const JOYSTICK_7: number;
	const JOYSTICK_8: number;
	const JOYSTICK_9: number;
	const JOYSTICK_10: number;
	const JOYSTICK_11: number;
	const JOYSTICK_12: number;
	const JOYSTICK_13: number;
	const JOYSTICK_14: number;
	const JOYSTICK_15: number;
	const JOYSTICK_16: number;
	const JOYSTICK_LAST: number;
	const GAMEPAD_BUTTON_A: number;
	const GAMEPAD_BUTTON_B: number;
	const GAMEPAD_BUTTON_X: number;
	const GAMEPAD_BUTTON_Y: number;
	const GAMEPAD_BUTTON_LEFT_BUMPER: number;
	const GAMEPAD_BUTTON_RIGHT_BUMPER: number;
	const GAMEPAD_BUTTON_BACK: number;
	const GAMEPAD_BUTTON_START: number;
	const GAMEPAD_BUTTON_GUIDE: number;
	const GAMEPAD_BUTTON_LEFT_THUMB: number;
	const GAMEPAD_BUTTON_RIGHT_THUMB: number;
	const GAMEPAD_BUTTON_DPAD_UP: number;
	const GAMEPAD_BUTTON_DPAD_RIGHT: number;
	const GAMEPAD_BUTTON_DPAD_DOWN: number;
	const GAMEPAD_BUTTON_DPAD_LEFT: number;
	const GAMEPAD_BUTTON_LAST: number;
	const GAMEPAD_BUTTON_CROSS: number;
	const GAMEPAD_BUTTON_CIRCLE: number;
	const GAMEPAD_BUTTON_SQUARE: number;
	const GAMEPAD_BUTTON_TRIANGLE: number;
	const GAMEPAD_AXIS_LEFT_X: number;
	const GAMEPAD_AXIS_LEFT_Y: number;
	const GAMEPAD_AXIS_RIGHT_X: number;
	const GAMEPAD_AXIS_RIGHT_Y: number;
	const GAMEPAD_AXIS_LEFT_TRIGGER: number;
	const GAMEPAD_AXIS_RIGHT_TRIGGER: number;
	const GAMEPAD_AXIS_LAST: number;
	const NO_ERROR: number;
	const NOT_INITIALIZED: number;
	const NO_CURRENT_CONTEXT: number;
	const INVALID_ENUM: number;
	const INVALID_VALUE: number;
	const OUT_OF_MEMORY: number;
	const API_UNAVAILABLE: number;
	const VERSION_UNAVAILABLE: number;
	const PLATFORM_ERROR: number;
	const FORMAT_UNAVAILABLE: number;
	const NO_WINDOW_CONTEXT: number;
	const CURSOR_UNAVAILABLE: number;
	const FEATURE_UNAVAILABLE: number;
	const FEATURE_UNIMPLEMENTED: number;
	const PLATFORM_UNAVAILABLE: number;
	const FOCUSED: number;
	const ICONIFIED: number;
	const RESIZABLE: number;
	const VISIBLE: number;
	const DECORATED: number;
	const AUTO_ICONIFY: number;
	const FLOATING: number;
	const MAXIMIZED: number;
	const CENTER_CURSOR: number;
	const TRANSPARENT_FRAMEBUFFER: number;
	const HOVERED: number;
	const FOCUS_ON_SHOW: number;
	const MOUSE_PASSTHROUGH: number;
	const POSITION_X: number;
	const POSITION_Y: number;
	const RED_BITS: number;
	const GREEN_BITS: number;
	const BLUE_BITS: number;
	const ALPHA_BITS: number;
	const DEPTH_BITS: number;
	const STENCIL_BITS: number;
	const ACCUM_RED_BITS: number;
	const ACCUM_GREEN_BITS: number;
	const ACCUM_BLUE_BITS: number;
	const ACCUM_ALPHA_BITS: number;
	const AUX_BUFFERS: number;
	const STEREO: number;
	const SAMPLES: number;
	const SRGB_CAPABLE: number;
	const REFRESH_RATE: number;
	const DOUBLEBUFFER: number;
	const CLIENT_API: number;
	const CONTEXT_VERSION_MAJOR: number;
	const CONTEXT_VERSION_MINOR: number;
	const CONTEXT_REVISION: number;
	const CONTEXT_ROBUSTNESS: number;
	const OPENGL_FORWARD_COMPAT: number;
	const CONTEXT_DEBUG: number;
	const OPENGL_DEBUG_CONTEXT: number;
	const OPENGL_PROFILE: number;
	const CONTEXT_RELEASE_BEHAVIOR: number;
	const CONTEXT_NO_ERROR: number;
	const CONTEXT_CREATION_API: number;
	const SCALE_TO_MONITOR: number;
	const SCALE_FRAMEBUFFER: number;
	const COCOA_RETINA_FRAMEBUFFER: number;
	const COCOA_FRAME_NAME: number;
	const COCOA_GRAPHICS_SWITCHING: number;
	const X11_CLASS_NAME: number;
	const X11_INSTANCE_NAME: number;
	const NO_API: number;
	const OPENGL_API: number;
	const OPENGL_ES_API: number;
	const NO_ROBUSTNESS: number;
	const NO_RESET_NOTIFICATION: number;
	const LOSE_CONTEXT_ON_RESET: number;
	const OPENGL_ANY_PROFILE: number;
	const OPENGL_CORE_PROFILE: number;
	const OPENGL_COMPAT_PROFILE: number;
	const CURSOR: number;
	const STICKY_KEYS: number;
	const STICKY_MOUSE_BUTTONS: number;
	const LOCK_KEY_MODS: number;
	const RAW_MOUSE_MOTION: number;
	const CURSOR_NORMAL: number;
	const CURSOR_HIDDEN: number;
	const CURSOR_DISABLED: number;
	const CURSOR_CAPTURED: number;
	const ARROW_CURSOR: number;
	const IBEAM_CURSOR: number;
	const CROSSHAIR_CURSOR: number;
	const HAND_CURSOR: number;
	const HRESIZE_CURSOR: number;
	const VRESIZE_CURSOR: number;
	const POINTING_HAND_CURSOR: number;
	const RESIZE_EW_CURSOR: number;
	const RESIZE_NS_CURSOR: number;
	const RESIZE_NWSE_CURSOR: number;
	const RESIZE_NESW_CURSOR: number;
	const RESIZE_ALL_CURSOR: number;
	const NOT_ALLOWED_CURSOR: number;
	const ANY_RELEASE_BEHAVIOR: number;
	const RELEASE_BEHAVIOR_FLUSH: number;
	const RELEASE_BEHAVIOR_NONE: number;
	const NATIVE_CONTEXT_API: number;
	const EGL_CONTEXT_API: number;
	const OSMESA_CONTEXT_API: number;
	const WIN32_KEYBOARD_MENU: number;
	const WIN32_SHOWDEFAULT: number;
	const WAYLAND_APP_ID: number;
	const ANGLE_PLATFORM_TYPE_NONE: number;
	const ANGLE_PLATFORM_TYPE_OPENGL: number;
	const ANGLE_PLATFORM_TYPE_OPENGLES: number;
	const ANGLE_PLATFORM_TYPE_D3D9: number;
	const ANGLE_PLATFORM_TYPE_D3D11: number;
	const ANGLE_PLATFORM_TYPE_VULKAN: number;
	const ANGLE_PLATFORM_TYPE_METAL: number;
	const WAYLAND_PREFER_LIBDECOR: number;
	const WAYLAND_DISABLE_LIBDECOR: number;
	const ANGLE_PLATFORM_TYPE: number;
	const PLATFORM: number;
	const X11_XCB_VULKAN_SURFACE: number;
	const WAYLAND_LIBDECOR: number;
	const ANY_PLATFORM: number;
	const PLATFORM_WIN32: number;
	const PLATFORM_COCOA: number;
	const PLATFORM_WAYLAND: number;
	const PLATFORM_X11: number;
	const PLATFORM_NULL: number;
	const CONNECTED: number;
	const DISCONNECTED: number;
	const JOYSTICK_HAT_BUTTONS: number;
	const COCOA_CHDIR_RESOURCES: number;
	const COCOA_MENUBAR: number;
	const DONT_CARE: number;
	const ANY_POSITION: number;

	/**
	 * Human-readable names for keyboard keys.
	 */
	const keyNames: Record<number, string>;
	
	/**
	 * Human-readable names for keyboard key codes (includes `keyNames`).
	 */
	const codeNames: Record<number, string>;
	
	/**
	 * Additional key codes for keyboard events - conversion from GLFW codes to web.
	 */
	const extraCodes: Record<number, number>;
}