import * as fastify from 'fastify' import { ContextConfigDefault, FastifyBaseLogger, FastifyInstance, FastifyPluginCallback, FastifyRequest, FastifySchema, FastifyTypeProvider, FastifyTypeProviderDefault, RawReplyDefaultExpression, RawRequestDefaultExpression, RawServerBase, RawServerDefault, RequestGenericInterface } from 'fastify' import { preCloseAsyncHookHandler, preCloseHookHandler } from 'fastify/types/hooks' import { FastifyReply } from 'fastify/types/reply' import { RouteGenericInterface } from 'fastify/types/route' import { IncomingMessage, Server, ServerResponse } from 'node:http' import * as WebSocket from 'ws' interface WebsocketRouteOptions< RawServer extends RawServerBase = RawServerDefault, RawRequest extends RawRequestDefaultExpression = RawRequestDefaultExpression, RequestGeneric extends RequestGenericInterface = RequestGenericInterface, ContextConfig = ContextConfigDefault, SchemaCompiler extends FastifySchema = FastifySchema, TypeProvider extends FastifyTypeProvider = FastifyTypeProviderDefault, Logger extends FastifyBaseLogger = FastifyBaseLogger > { wsHandler?: fastifyWebsocket.WebsocketHandler; } declare module 'fastify' { interface RouteShorthandOptions< // eslint-disable-next-line @typescript-eslint/no-unused-vars RawServer extends RawServerBase = RawServerDefault > { websocket?: boolean; } interface InjectWSOption { onInit?: (ws: WebSocket.WebSocket) => void onOpen?: (ws: WebSocket.WebSocket) => void } type InjectWSFn = ((path?: string, upgradeContext?: Partial, options?: InjectWSOption) => Promise) // eslint-disable-next-line @typescript-eslint/no-unused-vars interface FastifyInstance { websocketServer: WebSocket.Server, injectWS: InjectWSFn } interface FastifyRequest { ws: boolean } interface RouteShorthandMethod< RawServer extends RawServerBase = RawServerDefault, RawRequest extends RawRequestDefaultExpression = RawRequestDefaultExpression, RawReply extends RawReplyDefaultExpression = RawReplyDefaultExpression, TypeProvider extends FastifyTypeProvider = FastifyTypeProviderDefault, Logger extends FastifyBaseLogger = FastifyBaseLogger > { ( path: string, opts: RouteShorthandOptions & { websocket: true }, // this creates an overload that only applies these different types if the handler is for websockets handler?: fastifyWebsocket.WebsocketHandler ): FastifyInstance; } interface RouteOptions< RawServer extends RawServerBase = RawServerDefault, RawRequest extends RawRequestDefaultExpression = RawRequestDefaultExpression, // eslint-disable-next-line @typescript-eslint/no-unused-vars RawReply extends RawReplyDefaultExpression = RawReplyDefaultExpression, RouteGeneric extends RouteGenericInterface = RouteGenericInterface, ContextConfig = ContextConfigDefault, SchemaCompiler = fastify.FastifySchema, TypeProvider extends FastifyTypeProvider = FastifyTypeProviderDefault, Logger extends FastifyBaseLogger = FastifyBaseLogger > extends WebsocketRouteOptions { } } type FastifyWebsocket = FastifyPluginCallback declare namespace fastifyWebsocket { interface WebSocketServerOptions extends Omit { } export type WebsocketHandler< RawServer extends RawServerBase = RawServerDefault, RawRequest extends RawRequestDefaultExpression = RawRequestDefaultExpression, RequestGeneric extends RequestGenericInterface = RequestGenericInterface, ContextConfig = ContextConfigDefault, SchemaCompiler extends FastifySchema = FastifySchema, TypeProvider extends FastifyTypeProvider = FastifyTypeProviderDefault, Logger extends FastifyBaseLogger = FastifyBaseLogger > = ( this: FastifyInstance, socket: WebSocket.WebSocket, request: FastifyRequest ) => void | Promise export interface WebsocketPluginOptions { errorHandler?: (this: FastifyInstance, error: Error, socket: WebSocket.WebSocket, request: FastifyRequest, reply: FastifyReply) => void; options?: WebSocketServerOptions; preClose?: preCloseHookHandler | preCloseAsyncHookHandler; } export interface RouteOptions< RawServer extends RawServerBase = RawServerDefault, RawRequest extends RawRequestDefaultExpression = RawRequestDefaultExpression, RawReply extends RawReplyDefaultExpression = RawReplyDefaultExpression, RouteGeneric extends RouteGenericInterface = RouteGenericInterface, ContextConfig = ContextConfigDefault, SchemaCompiler extends fastify.FastifySchema = fastify.FastifySchema, TypeProvider extends FastifyTypeProvider = FastifyTypeProviderDefault, Logger extends FastifyBaseLogger = FastifyBaseLogger > extends fastify.RouteOptions, WebsocketRouteOptions { } export type WebSocket = WebSocket.WebSocket export const fastifyWebsocket: FastifyWebsocket export { fastifyWebsocket as default } } declare function fastifyWebsocket (...params: Parameters): ReturnType export = fastifyWebsocket