From d2a3242b8693be32147647d3291c25f26d934af7 Mon Sep 17 00:00:00 2001 From: Piotr Roszatycki Date: Sun, 4 Feb 2018 16:35:09 +0100 Subject: [PATCH 1/4] New typings for simple-websocket --- types/simple-websocket/index.d.ts | 33 +++++++++++++++ types/simple-websocket/server.d.ts | 40 +++++++++++++++++++ .../simple-websocket-tests.ts | 29 ++++++++++++++ types/simple-websocket/tsconfig.json | 24 +++++++++++ types/simple-websocket/tslint.json | 1 + 5 files changed, 127 insertions(+) create mode 100644 types/simple-websocket/index.d.ts create mode 100644 types/simple-websocket/server.d.ts create mode 100644 types/simple-websocket/simple-websocket-tests.ts create mode 100644 types/simple-websocket/tsconfig.json create mode 100644 types/simple-websocket/tslint.json diff --git a/types/simple-websocket/index.d.ts b/types/simple-websocket/index.d.ts new file mode 100644 index 0000000000..d7ea924aff --- /dev/null +++ b/types/simple-websocket/index.d.ts @@ -0,0 +1,33 @@ +// Type definitions for simple-websocket 6.0 +// Project: https://github.com/feross/simple-websocket +// Definitions by: Piotr Roszatycki +// Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped + +/// + +import { Duplex, DuplexOptions } from 'stream'; +import WebSocket = require('ws'); + +declare namespace Socket { + interface Options extends DuplexOptions { + /** websocket server url */ + url?: string; + /** raw websocket instance to wrap */ + socket?: WebSocket; + } + + let WEBSOCKET_SUPPORT: boolean; +} + +declare class Socket extends Duplex { + constructor(options: Socket.Options | string); + + /** Send text/binary data to the WebSocket server */ + send(chunk: any): void; + + // TODO destroy method not compatible with Duplex + // destroy(err?: Error): void; + // destroy(callback?: (err?: Error) => void): void; +} + +export = Socket; diff --git a/types/simple-websocket/server.d.ts b/types/simple-websocket/server.d.ts new file mode 100644 index 0000000000..a1e6c7a703 --- /dev/null +++ b/types/simple-websocket/server.d.ts @@ -0,0 +1,40 @@ +/// + +import { EventEmitter } from 'events'; +import * as http from 'http'; +import * as net from 'net'; +import WebSocket = require('ws'); + +import Socket = require('.'); + +declare namespace SocketServer { + type Options = WebSocket.ServerOptions; +} + +declare class SocketServer extends EventEmitter { + options: SocketServer.Options; + path: string; + clients: Set; + + constructor(options?: SocketServer.Options, callback?: () => void); + + close(cb?: (err?: Error) => void): void; + handleUpgrade(request: http.IncomingMessage, socket: net.Socket, + upgradeHead: Buffer, callback: (client: WebSocket) => void): void; + shouldHandle(request: http.IncomingMessage): boolean; + + // Events + on(event: 'connection', cb: (socket: Socket, request: http.IncomingMessage) => void): this; + on(event: 'error', cb: (error: Error) => void): this; + on(event: 'headers', cb: (headers: string[], request: http.IncomingMessage) => void): this; + on(event: 'listening', cb: () => void): this; + on(event: string | symbol, listener: (...args: any[]) => void): this; + + addListener(event: 'connection', cb: (client: Socket) => void): this; + addListener(event: 'error', cb: (err: Error) => void): this; + addListener(event: 'headers', cb: (headers: string[], request: http.IncomingMessage) => void): this; + addListener(event: 'listening', cb: () => void): this; + addListener(event: string | symbol, listener: (...args: any[]) => void): this; +} + +export = SocketServer; diff --git a/types/simple-websocket/simple-websocket-tests.ts b/types/simple-websocket/simple-websocket-tests.ts new file mode 100644 index 0000000000..9d7d9af1ca --- /dev/null +++ b/types/simple-websocket/simple-websocket-tests.ts @@ -0,0 +1,29 @@ +import Socket = require('simple-websocket'); + +if (Socket.WEBSOCKET_SUPPORT) { + const socket = new Socket('ws://echo.websocket.org'); + socket.on('connect', () => { + // socket is connected! + socket.send('sup!'); + }); + + socket.on('data', (data: string | Buffer) => { + console.log('got message: ' + data); + // socket.destroy(() => { + // console.log('socket destroyed'); + // }); + }); +} + +import Server = require('simple-websocket/server'); + +const server = new Server({ port: 8080 }); // see `ws` docs for other options + +server.on('connection', (socket: Socket) => { + socket.write('pong'); + socket.on('data', (data: string | Buffer) => {}); + socket.on('close', () => {}); + socket.on('error', (err: Error) => {}); +}); + +server.close(); diff --git a/types/simple-websocket/tsconfig.json b/types/simple-websocket/tsconfig.json new file mode 100644 index 0000000000..09935e03b6 --- /dev/null +++ b/types/simple-websocket/tsconfig.json @@ -0,0 +1,24 @@ +{ + "compilerOptions": { + "module": "commonjs", + "lib": [ + "es6" + ], + "noImplicitAny": true, + "noImplicitThis": true, + "strictFunctionTypes": true, + "strictNullChecks": true, + "baseUrl": "../", + "typeRoots": [ + "../" + ], + "types": [], + "noEmit": true, + "forceConsistentCasingInFileNames": true + }, + "files": [ + "index.d.ts", + "server.d.ts", + "simple-websocket-tests.ts" + ] +} diff --git a/types/simple-websocket/tslint.json b/types/simple-websocket/tslint.json new file mode 100644 index 0000000000..3db14f85ea --- /dev/null +++ b/types/simple-websocket/tslint.json @@ -0,0 +1 @@ +{ "extends": "dtslint/dt.json" } From 5592de580aca19f0f6ed705ddb8266f7082798c5 Mon Sep 17 00:00:00 2001 From: Piotr Roszatycki Date: Tue, 20 Feb 2018 16:46:33 +0100 Subject: [PATCH 2/4] Compatible with simple-socket 7.0 --- types/simple-websocket/index.d.ts | 33 ++++----- types/simple-websocket/server.d.ts | 70 +++++++++++++------ .../simple-websocket-tests.ts | 13 ++-- types/simple-websocket/tsconfig.json | 3 +- 4 files changed, 71 insertions(+), 48 deletions(-) diff --git a/types/simple-websocket/index.d.ts b/types/simple-websocket/index.d.ts index d7ea924aff..5e79241ff1 100644 --- a/types/simple-websocket/index.d.ts +++ b/types/simple-websocket/index.d.ts @@ -1,33 +1,28 @@ -// Type definitions for simple-websocket 6.0 +// Type definitions for simple-websocket 7.0 // Project: https://github.com/feross/simple-websocket // Definitions by: Piotr Roszatycki // Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped /// -import { Duplex, DuplexOptions } from 'stream'; -import WebSocket = require('ws'); +import { Duplex, DuplexOptions } from "stream"; +import WebSocket from "ws"; -declare namespace Socket { - interface Options extends DuplexOptions { - /** websocket server url */ - url?: string; - /** raw websocket instance to wrap */ - socket?: WebSocket; - } - - let WEBSOCKET_SUPPORT: boolean; +export interface SocketOptions extends DuplexOptions { + /** websocket server url */ + url?: string; + /** raw websocket instance to wrap */ + socket?: WebSocket; } -declare class Socket extends Duplex { - constructor(options: Socket.Options | string); +export default class Socket extends Duplex { + static WEBSOCKET_SUPPORT: boolean; + + constructor(options: SocketOptions | string); /** Send text/binary data to the WebSocket server */ send(chunk: any): void; - // TODO destroy method not compatible with Duplex - // destroy(err?: Error): void; - // destroy(callback?: (err?: Error) => void): void; + /** Destroy and cleanup this websocket connection */ + destroy(err?: Error): void; } - -export = Socket; diff --git a/types/simple-websocket/server.d.ts b/types/simple-websocket/server.d.ts index a1e6c7a703..b9694444f0 100644 --- a/types/simple-websocket/server.d.ts +++ b/types/simple-websocket/server.d.ts @@ -1,22 +1,20 @@ /// -import { EventEmitter } from 'events'; -import * as http from 'http'; -import * as net from 'net'; -import WebSocket = require('ws'); +import { EventEmitter } from "events"; +import * as http from "http"; +import * as net from "net"; +import WebSocket from "ws"; -import Socket = require('.'); +import Socket from "."; -declare namespace SocketServer { - type Options = WebSocket.ServerOptions; -} +export type SocketServerOptions = WebSocket.ServerOptions; -declare class SocketServer extends EventEmitter { - options: SocketServer.Options; +export default class SocketServer extends EventEmitter { + options: SocketServerOptions; path: string; clients: Set; - constructor(options?: SocketServer.Options, callback?: () => void); + constructor(options?: SocketServerOptions, callback?: () => void); close(cb?: (err?: Error) => void): void; handleUpgrade(request: http.IncomingMessage, socket: net.Socket, @@ -24,17 +22,45 @@ declare class SocketServer extends EventEmitter { shouldHandle(request: http.IncomingMessage): boolean; // Events - on(event: 'connection', cb: (socket: Socket, request: http.IncomingMessage) => void): this; - on(event: 'error', cb: (error: Error) => void): this; - on(event: 'headers', cb: (headers: string[], request: http.IncomingMessage) => void): this; - on(event: 'listening', cb: () => void): this; + addListener(event: "connection", cb: (client: Socket) => void): this; + addListener(event: "error", cb: (err: Error) => void): this; + addListener(event: "headers", cb: (headers: string[], request: http.IncomingMessage) => void): this; + addListener(event: "listening", cb: () => void): this; + addListener(event: string | symbol, listener: (...args: any[]) => void): this; + + emit(event: "connection", socket: Socket): boolean; + emit(event: "error", error: Error): boolean; + emit(event: "headers", headers: string[], request: http.IncomingMessage): boolean; + emit(event: "listening"): boolean; + emit(event: string | symbol, ...args: any[]): boolean; + + on(event: "connection", cb: (socket: Socket, request: http.IncomingMessage) => void): this; + on(event: "error", cb: (error: Error) => void): this; + on(event: "headers", cb: (headers: string[], request: http.IncomingMessage) => void): this; + on(event: "listening", cb: () => void): this; on(event: string | symbol, listener: (...args: any[]) => void): this; - addListener(event: 'connection', cb: (client: Socket) => void): this; - addListener(event: 'error', cb: (err: Error) => void): this; - addListener(event: 'headers', cb: (headers: string[], request: http.IncomingMessage) => void): this; - addListener(event: 'listening', cb: () => void): this; - addListener(event: string | symbol, listener: (...args: any[]) => void): this; -} + once(event: "connection", cb: (socket: Socket, request: http.IncomingMessage) => void): this; + once(event: "error", cb: (error: Error) => void): this; + once(event: "headers", cb: (headers: string[], request: http.IncomingMessage) => void): this; + once(event: "listening", cb: () => void): this; + once(event: string | symbol, listener: (...args: any[]) => void): this; -export = SocketServer; + prependListener(event: "connection", cb: (client: Socket) => void): this; + prependListener(event: "error", cb: (err: Error) => void): this; + prependListener(event: "headers", cb: (headers: string[], request: http.IncomingMessage) => void): this; + prependListener(event: "listening", cb: () => void): this; + prependListener(event: string | symbol, listener: (...args: any[]) => void): this; + + prependOnceListener(event: "connection", cb: (client: Socket) => void): this; + prependOnceListener(event: "error", cb: (err: Error) => void): this; + prependOnceListener(event: "headers", cb: (headers: string[], request: http.IncomingMessage) => void): this; + prependOnceListener(event: "listening", cb: () => void): this; + prependOnceListener(event: string | symbol, listener: (...args: any[]) => void): this; + + removeListener(event: "connection", cb: (client: Socket) => void): this; + removeListener(event: "error", cb: (err: Error) => void): this; + removeListener(event: "headers", cb: (headers: string[], request: http.IncomingMessage) => void): this; + removeListener(event: "listening", cb: () => void): this; + removeListener(event: string | symbol, listener: (...args: any[]) => void): this; +} diff --git a/types/simple-websocket/simple-websocket-tests.ts b/types/simple-websocket/simple-websocket-tests.ts index 9d7d9af1ca..9103d1c191 100644 --- a/types/simple-websocket/simple-websocket-tests.ts +++ b/types/simple-websocket/simple-websocket-tests.ts @@ -1,4 +1,4 @@ -import Socket = require('simple-websocket'); +import Socket from "simple-websocket"; if (Socket.WEBSOCKET_SUPPORT) { const socket = new Socket('ws://echo.websocket.org'); @@ -9,15 +9,16 @@ if (Socket.WEBSOCKET_SUPPORT) { socket.on('data', (data: string | Buffer) => { console.log('got message: ' + data); - // socket.destroy(() => { - // console.log('socket destroyed'); - // }); + }); + + socket.on('error', (err: Error) => { + socket.destroy(err); }); } -import Server = require('simple-websocket/server'); +import Server from "simple-websocket/server"; -const server = new Server({ port: 8080 }); // see `ws` docs for other options +const server = new Server({ port: 8080 }); server.on('connection', (socket: Socket) => { socket.write('pong'); diff --git a/types/simple-websocket/tsconfig.json b/types/simple-websocket/tsconfig.json index 09935e03b6..06b0fdd9da 100644 --- a/types/simple-websocket/tsconfig.json +++ b/types/simple-websocket/tsconfig.json @@ -14,7 +14,8 @@ ], "types": [], "noEmit": true, - "forceConsistentCasingInFileNames": true + "forceConsistentCasingInFileNames": true, + "esModuleInterop": true }, "files": [ "index.d.ts", From ade295856bf971b2d3cb2b294ce0aebef88e1ea0 Mon Sep 17 00:00:00 2001 From: Piotr Roszatycki Date: Tue, 20 Feb 2018 17:58:13 +0100 Subject: [PATCH 3/4] dtslint: fix no-import-default-of-export-equals --- types/simple-websocket/index.d.ts | 2 +- types/simple-websocket/server.d.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/types/simple-websocket/index.d.ts b/types/simple-websocket/index.d.ts index 5e79241ff1..fa4a5d492c 100644 --- a/types/simple-websocket/index.d.ts +++ b/types/simple-websocket/index.d.ts @@ -6,7 +6,7 @@ /// import { Duplex, DuplexOptions } from "stream"; -import WebSocket from "ws"; +import WebSocket = require("ws"); export interface SocketOptions extends DuplexOptions { /** websocket server url */ diff --git a/types/simple-websocket/server.d.ts b/types/simple-websocket/server.d.ts index b9694444f0..ec88a300ff 100644 --- a/types/simple-websocket/server.d.ts +++ b/types/simple-websocket/server.d.ts @@ -3,7 +3,7 @@ import { EventEmitter } from "events"; import * as http from "http"; import * as net from "net"; -import WebSocket from "ws"; +import WebSocket = require("ws"); import Socket from "."; From 7f4c340aa99f88990a40781f06705fb96447d15e Mon Sep 17 00:00:00 2001 From: Piotr Roszatycki Date: Mon, 5 Mar 2018 10:39:13 +0100 Subject: [PATCH 4/4] Compatibility with TypeScript < 2.7 --- types/simple-websocket/index.d.ts | 18 +++++++++++------- types/simple-websocket/server.d.ts | 14 +++++++++----- .../simple-websocket/simple-websocket-tests.ts | 4 ++-- 3 files changed, 22 insertions(+), 14 deletions(-) diff --git a/types/simple-websocket/index.d.ts b/types/simple-websocket/index.d.ts index fa4a5d492c..7e2ec0f6b8 100644 --- a/types/simple-websocket/index.d.ts +++ b/types/simple-websocket/index.d.ts @@ -8,17 +8,19 @@ import { Duplex, DuplexOptions } from "stream"; import WebSocket = require("ws"); -export interface SocketOptions extends DuplexOptions { - /** websocket server url */ - url?: string; - /** raw websocket instance to wrap */ - socket?: WebSocket; +declare namespace Socket { + interface Options extends DuplexOptions { + /** websocket server url */ + url?: string; + /** raw websocket instance to wrap */ + socket?: WebSocket; + } } -export default class Socket extends Duplex { +declare class Socket extends Duplex { static WEBSOCKET_SUPPORT: boolean; - constructor(options: SocketOptions | string); + constructor(options: Socket.Options | string); /** Send text/binary data to the WebSocket server */ send(chunk: any): void; @@ -26,3 +28,5 @@ export default class Socket extends Duplex { /** Destroy and cleanup this websocket connection */ destroy(err?: Error): void; } + +export = Socket; diff --git a/types/simple-websocket/server.d.ts b/types/simple-websocket/server.d.ts index ec88a300ff..72f4c59c30 100644 --- a/types/simple-websocket/server.d.ts +++ b/types/simple-websocket/server.d.ts @@ -5,16 +5,18 @@ import * as http from "http"; import * as net from "net"; import WebSocket = require("ws"); -import Socket from "."; +import Socket = require("."); -export type SocketServerOptions = WebSocket.ServerOptions; +declare namespace SocketServer { + type Options = WebSocket.ServerOptions; +} -export default class SocketServer extends EventEmitter { - options: SocketServerOptions; +declare class SocketServer extends EventEmitter { + options: SocketServer.Options; path: string; clients: Set; - constructor(options?: SocketServerOptions, callback?: () => void); + constructor(options?: SocketServer.Options, callback?: () => void); close(cb?: (err?: Error) => void): void; handleUpgrade(request: http.IncomingMessage, socket: net.Socket, @@ -64,3 +66,5 @@ export default class SocketServer extends EventEmitter { removeListener(event: "listening", cb: () => void): this; removeListener(event: string | symbol, listener: (...args: any[]) => void): this; } + +export = SocketServer; diff --git a/types/simple-websocket/simple-websocket-tests.ts b/types/simple-websocket/simple-websocket-tests.ts index 9103d1c191..0a31b08f22 100644 --- a/types/simple-websocket/simple-websocket-tests.ts +++ b/types/simple-websocket/simple-websocket-tests.ts @@ -1,4 +1,4 @@ -import Socket from "simple-websocket"; +import Socket = require("simple-websocket"); if (Socket.WEBSOCKET_SUPPORT) { const socket = new Socket('ws://echo.websocket.org'); @@ -16,7 +16,7 @@ if (Socket.WEBSOCKET_SUPPORT) { }); } -import Server from "simple-websocket/server"; +import Server = require("simple-websocket/server"); const server = new Server({ port: 8080 });