• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

microsoft / botbuilder-js / 12751184555

13 Jan 2025 04:03PM UTC coverage: 84.564% (-0.05%) from 84.618%
12751184555

Pull #4834

github

web-flow
Merge 128d6b3ea into 428a1cdfc
Pull Request #4834: refactor: [#4759] Migrate off @azure/core-http

8238 of 10899 branches covered (75.58%)

Branch coverage included in aggregate %.

129 of 148 new or added lines in 22 files covered. (87.16%)

6 existing lines in 3 files now uncovered.

20534 of 23125 relevant lines covered (88.8%)

7297.83 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

97.22
/libraries/botframework-streaming/src/webSocket/webSocketServer.ts
1
/**
2
 * @module botframework-streaming
3
 */
4
/**
5
 * Copyright (c) Microsoft Corporation. All rights reserved.
6
 * Licensed under the MIT License.
7
 */
8
import { ProtocolAdapter } from '../protocolAdapter';
2✔
9
import { RequestHandler } from '../requestHandler';
10
import { StreamingRequest } from '../streamingRequest';
11
import { RequestManager } from '../payloads';
2✔
12
import { PayloadReceiver, PayloadSender, TransportDisconnectedEvent } from '../payloadTransport';
2✔
13
import { WebSocketTransport } from './webSocketTransport';
2✔
14
import { ISocket, IStreamingTransportServer, IReceiveResponse } from '../interfaces';
15

16
/**
17
 * Web socket based server to be used as streaming transport.
18
 */
19
export class WebSocketServer implements IStreamingTransportServer {
2✔
20
    private readonly _url: string;
21
    private readonly _requestHandler: RequestHandler;
22
    private readonly _sender: PayloadSender;
23
    private readonly _receiver: PayloadReceiver;
24
    private readonly _requestManager: RequestManager;
25
    private readonly _protocolAdapter: ProtocolAdapter;
26
    private readonly _webSocketTransport: WebSocketTransport;
27
    private _closedSignal;
28
    private _socket: ISocket;
29

30
    /**
31
     * Creates a new instance of the [WebSocketServer](xref:botframework-streaming.WebSocketServer) class.
32
     *
33
     * @param socket The underlying web socket.
34
     * @param requestHandler Optional [RequestHandler](xref:botframework-streaming.RequestHandler) to process incoming messages received by this server.
35
     */
36
    constructor(socket: ISocket, requestHandler?: RequestHandler) {
37
        if (!socket) {
38✔
38
            throw new TypeError('WebSocketServer: Missing socket parameter');
2✔
39
        }
40

41
        this._socket = socket;
36✔
42
        this._webSocketTransport = new WebSocketTransport(socket);
36✔
43
        this._requestHandler = requestHandler;
36✔
44

45
        this._requestManager = new RequestManager();
36✔
46

47
        this._sender = new PayloadSender();
36✔
48
        this._sender.disconnected = this.onConnectionDisconnected.bind(this);
36✔
49
        this._receiver = new PayloadReceiver();
36✔
50
        this._receiver.disconnected = this.onConnectionDisconnected.bind(this);
36✔
51

52
        this._protocolAdapter = new ProtocolAdapter(
36✔
53
            this._requestHandler,
54
            this._requestManager,
55
            this._sender,
56
            this._receiver,
57
        );
58

59
        this._closedSignal = (x: string): string => {
36✔
60
            return x;
36✔
61
        };
62
    }
63

64
    /**
65
     * Examines the stored [ISocket](xref:botframework-streaming.ISocket) and returns `true` if the socket connection is open.
66
     *
67
     * @returns `true` if the underlying websocket is ready and availble to send messages, otherwise `false`.
68
     */
69
    get isConnected(): boolean {
UNCOV
70
        return this._socket.isConnected;
×
71
    }
72

73
    /**
74
     * Used to establish the connection used by this server and begin listening for incoming messages.
75
     *
76
     * @returns A promise to handle the server listen operation. This task will not resolve as long as the server is running.
77
     */
78
    async start(): Promise<string> {
79
        this._sender.connect(this._webSocketTransport);
36✔
80
        this._receiver.connect(this._webSocketTransport);
36✔
81

82
        return this._closedSignal;
36✔
83
    }
84

85
    /**
86
     * Task used to send data over this server connection.
87
     *
88
     * @param request The streaming request to send.
89
     * @returns A promise that will produce an instance of receive response on completion of the send operation.
90
     */
91
    async send(request: StreamingRequest): Promise<IReceiveResponse> {
92
        return this._protocolAdapter.sendRequest(request);
4✔
93
    }
94

95
    /**
96
     * Stop this server.
97
     */
98
    disconnect(): void {
99
        this._sender.disconnect(new TransportDisconnectedEvent('Disconnect was called.'));
10✔
100
        this._receiver.disconnect(new TransportDisconnectedEvent('Disconnect was called.'));
10✔
101
    }
102

103
    /**
104
     * @param sender The PayloadReceiver or PayloadSender that triggered or received a disconnect.
105
     * @param e TransportDisconnectedEvent
106
     */
107
    private onConnectionDisconnected(sender: PayloadReceiver | PayloadSender, e?: TransportDisconnectedEvent): void {
108
        if (this._closedSignal) {
168,122✔
109
            this._closedSignal('close');
36✔
110
            this._closedSignal = null;
36✔
111
        }
112

113
        if (sender === this._sender) {
168,122✔
114
            this._receiver.disconnect(e);
84,053✔
115
        }
116

117
        if (sender === this._receiver) {
168,073✔
118
            this._sender.disconnect(e);
84,069✔
119
        }
120
    }
121
}
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc