@relaycorp/ws-mock
Advanced tools
Comparing version 1.2.0 to 1.3.0
export { MockClient } from './lib/MockClient'; | ||
export { MockPeer } from './lib/MockPeer'; | ||
export { MockServer } from './lib/MockServer'; | ||
export * from './lib/MockServerAction'; | ||
export { CloseFrame } from './lib/CloseFrame'; | ||
export { createMockWebSocketStream } from './lib/stream'; |
"use strict"; | ||
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { | ||
if (k2 === undefined) k2 = k; | ||
Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } }); | ||
}) : (function(o, m, k, k2) { | ||
if (k2 === undefined) k2 = k; | ||
o[k2] = m[k]; | ||
})); | ||
var __exportStar = (this && this.__exportStar) || function(m, exports) { | ||
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p); | ||
}; | ||
Object.defineProperty(exports, "__esModule", { value: true }); | ||
exports.createMockWebSocketStream = exports.MockPeer = exports.MockClient = void 0; | ||
exports.createMockWebSocketStream = exports.MockServer = exports.MockPeer = exports.MockClient = void 0; | ||
var MockClient_1 = require("./lib/MockClient"); | ||
@@ -8,4 +18,7 @@ Object.defineProperty(exports, "MockClient", { enumerable: true, get: function () { return MockClient_1.MockClient; } }); | ||
Object.defineProperty(exports, "MockPeer", { enumerable: true, get: function () { return MockPeer_1.MockPeer; } }); | ||
var MockServer_1 = require("./lib/MockServer"); | ||
Object.defineProperty(exports, "MockServer", { enumerable: true, get: function () { return MockServer_1.MockServer; } }); | ||
__exportStar(require("./lib/MockServerAction"), exports); | ||
var stream_1 = require("./lib/stream"); | ||
Object.defineProperty(exports, "createMockWebSocketStream", { enumerable: true, get: function () { return stream_1.createMockWebSocketStream; } }); | ||
//# sourceMappingURL=index.js.map |
/// <reference types="node" /> | ||
import { EventEmitter } from 'events'; | ||
import { Data as WSData } from 'ws'; | ||
import { CloseFrame } from './CloseFrame'; | ||
import { MockWebSocket } from './MockWebSocket'; | ||
export declare abstract class MockPeer extends EventEmitter { | ||
export declare abstract class MockPeer { | ||
protected readonly peerWebSocket: MockWebSocket; | ||
get wasConnectionClosed(): boolean; | ||
disconnect(code?: number, reason?: string): void; | ||
close(code?: number, reason?: string): void; | ||
abort(error: Error): void; | ||
send(message: Buffer | string): Promise<void>; | ||
send(message: WSData): Promise<void>; | ||
receive(): Promise<WSData>; | ||
popLastPeerMessage(): WSData | undefined; | ||
waitForPeerClosure(): Promise<CloseFrame>; | ||
get peerCloseFrame(): CloseFrame | null; | ||
protected convertBinaryType(message: Buffer | ArrayBuffer | readonly Buffer[]): Buffer | ArrayBuffer | readonly Buffer[]; | ||
private requireConnectionStillOpen; | ||
} |
"use strict"; | ||
Object.defineProperty(exports, "__esModule", { value: true }); | ||
exports.MockPeer = void 0; | ||
const events_1 = require("events"); | ||
const MockWebSocket_1 = require("./MockWebSocket"); | ||
class MockPeer extends events_1.EventEmitter { | ||
class MockPeer { | ||
constructor() { | ||
super(...arguments); | ||
this.peerWebSocket = new MockWebSocket_1.MockWebSocket(); | ||
@@ -14,3 +12,3 @@ } | ||
} | ||
disconnect(code, reason) { | ||
close(code, reason) { | ||
this.peerWebSocket.emit('close', code, reason); | ||
@@ -23,5 +21,6 @@ } | ||
this.requireConnectionStillOpen(); | ||
const messageSerialized = typeof message === 'string' ? message : this.convertBinaryType(message); | ||
return new Promise((resolve) => { | ||
this.peerWebSocket.once('message', resolve); | ||
this.peerWebSocket.emit('message', message); | ||
this.peerWebSocket.emit('message', messageSerialized); | ||
}); | ||
@@ -43,2 +42,12 @@ } | ||
} | ||
get peerCloseFrame() { | ||
return this.peerWebSocket.closeFrame; | ||
} | ||
convertBinaryType(message) { | ||
const binaryType = this.peerWebSocket.binaryType; | ||
if (binaryType === 'nodebuffer') { | ||
return Buffer.isBuffer(message) ? message : Buffer.from(message); | ||
} | ||
throw new Error(`Unsupported WebSocket.binaryType (${binaryType}); feel free to open a PR`); | ||
} | ||
requireConnectionStillOpen() { | ||
@@ -45,0 +54,0 @@ if (this.wasConnectionClosed) { |
@@ -0,3 +1,8 @@ | ||
import WebSocket from 'ws'; | ||
import { MockPeer } from './MockPeer'; | ||
import { MockServerAction } from './MockServerAction'; | ||
export declare class MockServer extends MockPeer { | ||
get mockClientWebSocket(): WebSocket; | ||
runActions(...actions: readonly MockServerAction[]): Promise<void>; | ||
acceptConnection(): Promise<void>; | ||
} |
@@ -6,4 +6,18 @@ "use strict"; | ||
class MockServer extends MockPeer_1.MockPeer { | ||
get mockClientWebSocket() { | ||
return this.peerWebSocket; | ||
} | ||
async runActions(...actions) { | ||
for (const action of actions) { | ||
await action.run(this); | ||
} | ||
} | ||
async acceptConnection() { | ||
await new Promise((resolve) => { | ||
this.peerWebSocket.once('open', resolve); | ||
this.peerWebSocket.emit('open'); | ||
}); | ||
} | ||
} | ||
exports.MockServer = MockServer; | ||
//# sourceMappingURL=MockServer.js.map |
@@ -7,2 +7,3 @@ /// <reference types="node" /> | ||
export declare class MockWebSocket extends EventEmitter { | ||
binaryType: 'nodebuffer' | 'arraybuffer'; | ||
protected ownCloseFrame: CloseFrame | null; | ||
@@ -9,0 +10,0 @@ protected readonly messagesSent: WSData[]; |
@@ -10,2 +10,4 @@ "use strict"; | ||
// tslint:disable-next-line:readonly-keyword | ||
this.binaryType = 'nodebuffer'; | ||
// tslint:disable-next-line:readonly-keyword | ||
this.ownCloseFrame = null; | ||
@@ -12,0 +14,0 @@ // tslint:disable-next-line:readonly-array |
export { MockClient } from './lib/MockClient'; | ||
export { MockPeer } from './lib/MockPeer'; | ||
export { MockServer } from './lib/MockServer'; | ||
export * from './lib/MockServerAction'; | ||
export { CloseFrame } from './lib/CloseFrame'; | ||
export { createMockWebSocketStream } from './lib/stream'; |
export { MockClient } from './lib/MockClient'; | ||
export { MockPeer } from './lib/MockPeer'; | ||
export { MockServer } from './lib/MockServer'; | ||
export * from './lib/MockServerAction'; | ||
export { createMockWebSocketStream } from './lib/stream'; | ||
//# sourceMappingURL=index.js.map |
/// <reference types="node" /> | ||
import { EventEmitter } from 'events'; | ||
import { Data as WSData } from 'ws'; | ||
import { CloseFrame } from './CloseFrame'; | ||
import { MockWebSocket } from './MockWebSocket'; | ||
export declare abstract class MockPeer extends EventEmitter { | ||
export declare abstract class MockPeer { | ||
protected readonly peerWebSocket: MockWebSocket; | ||
get wasConnectionClosed(): boolean; | ||
disconnect(code?: number, reason?: string): void; | ||
close(code?: number, reason?: string): void; | ||
abort(error: Error): void; | ||
send(message: Buffer | string): Promise<void>; | ||
send(message: WSData): Promise<void>; | ||
receive(): Promise<WSData>; | ||
popLastPeerMessage(): WSData | undefined; | ||
waitForPeerClosure(): Promise<CloseFrame>; | ||
get peerCloseFrame(): CloseFrame | null; | ||
protected convertBinaryType(message: Buffer | ArrayBuffer | readonly Buffer[]): Buffer | ArrayBuffer | readonly Buffer[]; | ||
private requireConnectionStillOpen; | ||
} |
@@ -1,6 +0,4 @@ | ||
import { EventEmitter } from 'events'; | ||
import { MockWebSocket } from './MockWebSocket'; | ||
export class MockPeer extends EventEmitter { | ||
export class MockPeer { | ||
constructor() { | ||
super(...arguments); | ||
this.peerWebSocket = new MockWebSocket(); | ||
@@ -11,3 +9,3 @@ } | ||
} | ||
disconnect(code, reason) { | ||
close(code, reason) { | ||
this.peerWebSocket.emit('close', code, reason); | ||
@@ -20,5 +18,6 @@ } | ||
this.requireConnectionStillOpen(); | ||
const messageSerialized = typeof message === 'string' ? message : this.convertBinaryType(message); | ||
return new Promise((resolve) => { | ||
this.peerWebSocket.once('message', resolve); | ||
this.peerWebSocket.emit('message', message); | ||
this.peerWebSocket.emit('message', messageSerialized); | ||
}); | ||
@@ -40,2 +39,12 @@ } | ||
} | ||
get peerCloseFrame() { | ||
return this.peerWebSocket.closeFrame; | ||
} | ||
convertBinaryType(message) { | ||
const binaryType = this.peerWebSocket.binaryType; | ||
if (binaryType === 'nodebuffer') { | ||
return Buffer.isBuffer(message) ? message : Buffer.from(message); | ||
} | ||
throw new Error(`Unsupported WebSocket.binaryType (${binaryType}); feel free to open a PR`); | ||
} | ||
requireConnectionStillOpen() { | ||
@@ -42,0 +51,0 @@ if (this.wasConnectionClosed) { |
@@ -0,3 +1,8 @@ | ||
import WebSocket from 'ws'; | ||
import { MockPeer } from './MockPeer'; | ||
import { MockServerAction } from './MockServerAction'; | ||
export declare class MockServer extends MockPeer { | ||
get mockClientWebSocket(): WebSocket; | ||
runActions(...actions: readonly MockServerAction[]): Promise<void>; | ||
acceptConnection(): Promise<void>; | ||
} |
import { MockPeer } from './MockPeer'; | ||
export class MockServer extends MockPeer { | ||
get mockClientWebSocket() { | ||
return this.peerWebSocket; | ||
} | ||
async runActions(...actions) { | ||
for (const action of actions) { | ||
await action.run(this); | ||
} | ||
} | ||
async acceptConnection() { | ||
await new Promise((resolve) => { | ||
this.peerWebSocket.once('open', resolve); | ||
this.peerWebSocket.emit('open'); | ||
}); | ||
} | ||
} | ||
//# sourceMappingURL=MockServer.js.map |
@@ -7,2 +7,3 @@ /// <reference types="node" /> | ||
export declare class MockWebSocket extends EventEmitter { | ||
binaryType: 'nodebuffer' | 'arraybuffer'; | ||
protected ownCloseFrame: CloseFrame | null; | ||
@@ -9,0 +10,0 @@ protected readonly messagesSent: WSData[]; |
@@ -7,2 +7,4 @@ import { EventEmitter } from 'events'; | ||
// tslint:disable-next-line:readonly-keyword | ||
this.binaryType = 'nodebuffer'; | ||
// tslint:disable-next-line:readonly-keyword | ||
this.ownCloseFrame = null; | ||
@@ -9,0 +11,0 @@ // tslint:disable-next-line:readonly-array |
{ | ||
"name": "@relaycorp/ws-mock", | ||
"version": "1.2.0", | ||
"version": "1.3.0", | ||
"author": { | ||
@@ -5,0 +5,0 @@ "email": "no-reply@relaycorp.tech", |
@@ -16,9 +16,9 @@ # @relaycorp/ws-mock | ||
```javascript | ||
test('Challenge should be sent as soon as client connects', async () => { | ||
const client = new MockClient(wsServer); | ||
await client.connect(); | ||
test('Challenge should be sent as soon as client connects', async () => { | ||
const client = new MockClient(wsServer); | ||
await client.connect(); | ||
const challengeSerialized = await client.receive(); | ||
expect(challengeSerialized).toBeInstanceOf(ArrayBuffer); | ||
}); | ||
const challengeSerialized = await client.receive(); | ||
expect(challengeSerialized).toBeInstanceOf(ArrayBuffer); | ||
}); | ||
``` | ||
@@ -30,16 +30,31 @@ | ||
Simply initialise `MockServer` with the `ws` client connection you wish to test. For example: | ||
You basically need to initialise `MockServer` and replace the default export from `ws` with a mock WebSocket. Here's an example with Jest: | ||
```javascript | ||
test('Server message should be played back', async () => { | ||
const mockConnection = new MockConnection(); | ||
const mockServer = new MockServer(mockConnection); | ||
const clientUnderTest = new ClientUnderTest(mockConnection); | ||
let mockServer: MockServer; | ||
beforeEach(() => { | ||
mockServer = new MockServer(); | ||
}); | ||
jest.mock('ws', () => ({ | ||
__esModule: true, | ||
default: jest.fn().mockImplementation(() => mockServer.mockClientWebSocket), | ||
})); | ||
clientUnderTest.connectToServer(); | ||
mockServer.send('foo'); | ||
test('Server message should be played back', async () => { | ||
const clientUnderTest = new ClientUnderTest(); | ||
const messageToEcho = 'foo'; | ||
const clientResponse = await mockServer.receive(); | ||
expect(clientResponse).toEqual('foo'); | ||
}); | ||
await Promise.all([ | ||
clientUnderTest.connectToServerAndInteractWithIt(), | ||
// Configure the mock server to accept the incoming connection and return a message straightaway | ||
mockServer.runActions( | ||
new AcceptConnectionAction(), | ||
new SendMessageAction(messageToEcho), | ||
), | ||
]); | ||
// Check that the client sent the message back to the server: | ||
const clientResponse = await mockServer.receive(); | ||
expect(clientResponse).toEqual(messageToEcho); | ||
}); | ||
``` | ||
@@ -57,3 +72,5 @@ | ||
jest.spyOn(WebSocket, 'createWebSocketStream').mockImplementation(createMockWebSocketStream); | ||
jest | ||
.spyOn(WebSocket, 'createWebSocketStream') | ||
.mockImplementation(createMockWebSocketStream); | ||
``` |
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Major refactor
Supply chain riskPackage has recently undergone a major refactor. It may be unstable or indicate significant internal changes. Use caution when updating to versions that include significant changes.
Found 1 instance in 1 package
43401
51
670
74
4