Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
97 changes: 97 additions & 0 deletions index.d.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,97 @@
/// <reference types="node" />
import * as fastify from 'fastify';
import { IncomingMessage, ServerResponse, Server } from 'http';
import { Plugin } from 'fastify';
import * as WebSocket from 'ws';
import { Duplex } from 'stream';

declare module 'fastify' {
interface RouteShorthandOptions<
HttpServer,
HttpRequest,
HttpResponse,
Query,
Params,
Headers,
Body
> {
websocket?: boolean;
}
interface FastifyInstance<
HttpServer = Server,
HttpRequest = IncomingMessage,
HttpResponse = ServerResponse
> {
get<
Query = DefaultQuery,
Params = DefaultParams,
Headers = DefaultHeaders,
Body = DefaultBody
>(
url: string,
opts: RouteShorthandOptions<
HttpServer,
HttpRequest,
HttpResponse,
Query,
Params,
Headers,
Body
>,
handler?: WebsocketHandler<HttpRequest, HttpResponse>
): FastifyInstance<HttpServer, HttpRequest, HttpResponse>;
}

interface RouteOptions<
HttpServer = Server,
HttpRequest = IncomingMessage,
HttpResponse = ServerResponse,
Query = DefaultQuery,
Params = DefaultParams,
Headers = DefaultHeaders,
Body = DefaultBody
> {
wsHandler?: WebsocketHandler<
HttpRequest,
HttpResponse,
Query,
Params,
Headers,
Body
>;
}

export type WebsocketHandler<
HttpRequest = IncomingMessage,
HttpResponse = ServerResponse,
Query = DefaultQuery,
Params = DefaultParams,
Headers = DefaultHeaders,
Body = DefaultBody
> = (
this: FastifyInstance<Server, HttpRequest, HttpResponse>,
connection: websocketPlugin.SocketStream,
request: FastifyRequest<HttpRequest, Query, Params, Headers, Body>,
params?: { [key: string]: any }
) => void | Promise<any>;
}

declare namespace websocketPlugin {
export interface SocketStream extends Duplex {
socket: WebSocket;
}

export interface PluginOptions {
handle: (connection: SocketStream) => void;
options: WebSocket.ServerOptions;
}
}

declare const websocketPlugin: Plugin<
Server,
IncomingMessage,
ServerResponse,
websocketPlugin.PluginOptions
>;

export = websocketPlugin;
12 changes: 10 additions & 2 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,16 @@
"version": "1.0.0",
"description": "basic websocket support for fastify",
"main": "index.js",
"types": "index.d.ts",
"tsd": {
"directory": "./test/types"
},
"scripts": {
"lint": "standard | snazzy",
"unit": "tap \"test/*.js\"",
"test": "npm run lint && npm run unit"
"test:js": "npm run lint && npm run unit",
"test:ts": "tsd",
"test": "npm run test:js && npm run test:ts"
},
"repository": {
"type": "git",
Expand All @@ -23,11 +29,13 @@
},
"homepage": "https://github.com/fastify/fastify-websocket#readme",
"devDependencies": {
"@types/ws": "^6.0.3",
"fastify": "^2.4.1",
"pre-commit": "^1.2.2",
"snazzy": "^8.0.0",
"standard": "^14.0.2",
"tap": "^12.7.0"
"tap": "^12.7.0",
"tsd": "^0.11.0"
},
"dependencies": {
"fastify-plugin": "^1.5.0",
Expand Down
19 changes: 19 additions & 0 deletions test/types/index.test-d.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
const wsPlugin = require('../..');
const fastify = require('fastify');
import { SocketStream } from '../..';
import { WebsocketHandler, FastifyRequest, FastifyInstance } from 'fastify';
import { expectType } from 'tsd';

const app: FastifyInstance = fastify();
app.register(wsPlugin);

const handler: WebsocketHandler = (
connection: SocketStream,
req: FastifyRequest,
params
) => {
expectType<SocketStream>(connection);
expectType<{ [key: string]: any } | undefined>(params);
};

app.get('/', { websocket: true }, handler);
11 changes: 11 additions & 0 deletions tsconfig.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
{
"compilerOptions": {
"target": "es6",
"lib": ["es2015"],
"module": "commonjs",
"noEmit": true,
"strict": true,
"noImplicitAny": true
},
"includes": ["./test/types/*.test-d.ts", "index.d.ts"]
}