diff --git a/lib/index.js b/lib/index.js index bfcb715..405615d 100644 --- a/lib/index.js +++ b/lib/index.js @@ -221,3 +221,4 @@ function getSecret(request, secret, token, callback) { }; exports.authorize = authorize; +exports.UnauthorizedError = UnauthorizedError; diff --git a/package.json b/package.json index ba5258a..8a8ff41 100644 --- a/package.json +++ b/package.json @@ -3,6 +3,7 @@ "version": "4.5.0", "description": "authenticate socket.io connections using JWTs", "main": "lib/index.js", + "types": "./types/index.d.ts", "keywords": [ "socket", "socket.io", @@ -22,6 +23,7 @@ }, "license": "MIT", "dependencies": { + "@types/socket.io": "~1.4.29", "jsonwebtoken": "^5.0.0", "xtend": "~2.1.2" }, diff --git a/types/index.d.ts b/types/index.d.ts new file mode 100644 index 0000000..9e6c428 --- /dev/null +++ b/types/index.d.ts @@ -0,0 +1,70 @@ +/** + * This module allows to authenticate socket.io connections with JWTs. + * This is especially if you do not want to use cookies in a single page application. + */ + +/// + +declare module 'socketio-jwt' { + + /** + * Defines possible errors for the secret-callback. + */ + interface ISocketIOError { + readonly code: string; + readonly message: string; + } + + /** + * Callback gets called, if secret is given dynamically. + */ + interface ISocketCallback { + (err: ISocketIOError, success: string): void; + } + + interface ISocketIOMiddleware { + (socket: SocketIO.Socket, fn: (err?: any) => void): void; + } + + interface IOptions { + additional_auth?: (decoded: object, onSuccess: () => void, onError: (err: (string | ISocketIOError), code: string) => void) => void; + + callback?: (false | number); + secret: (string | ((request: any, decodedToken: object, callback: ISocketCallback) => void)); + + decodedPropertyName?: string; + auth_header_required?: boolean; + handshake?: boolean; + required?: boolean; + timeout?: number; + } + + function authorize(options: IOptions/*, onConnection: Function*/): ISocketIOMiddleware; + + interface UnauthorizedError extends Error { + readonly message: string; + readonly inner: object; + readonly data: { message: string, code: string, type: 'UnauthorizedError' } + } + + var UnauthorizedError: { + prototype: UnauthorizedError; + new (code: string, error: { message: string }): UnauthorizedError; + } + + /** + * This is an augmented version of the SocketIO.Server. + * It knows the 'authenticated' event and should be extended in future. + * @see SocketIO.Server + */ + export interface JWTServer extends SocketIO.Server { + + /** + * The event gets fired when a new connection is authenticated via JWT. + * @param event The event being fired: 'authenticated' + * @param listener A listener that should take one parameter of type Socket + * @return The default '/' Namespace + */ + on(event: ('authenticated' | string), listener: (socket: SocketIO.Socket) => void): SocketIO.Namespace; + } +}