| // Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file | |
| // for details. All rights reserved. Use of this source code is governed by a | |
| // BSD-style license that can be found in the LICENSE file. | |
| import 'dart:async'; | |
| import 'dart:io' show HttpClient, WebSocket; | |
| import 'package:web_socket/io_web_socket.dart' show IOWebSocket; | |
| import 'adapter_web_socket_channel.dart'; | |
| import 'src/channel.dart'; | |
| import 'src/exception.dart'; | |
| /// A [WebSocketChannel] that communicates using a `dart:io` [WebSocket]. | |
| class IOWebSocketChannel extends AdapterWebSocketChannel { | |
| /// Creates a new WebSocket connection. | |
| /// | |
| /// Connects to [url] using [WebSocket.connect] and returns a channel that can | |
| /// be used to communicate over the resulting socket. The [url] may be either | |
| /// a [String] or a [Uri]. The [protocols] and [headers] parameters are the | |
| /// same as [WebSocket.connect]. | |
| /// | |
| /// [pingInterval] controls the interval for sending ping signals. If a ping | |
| /// message is not answered by a pong message from the peer, the WebSocket is | |
| /// assumed disconnected and the connection is closed with a `goingAway` code. | |
| /// When a ping signal is sent, the pong message must be received within | |
| /// [pingInterval]. It defaults to `null`, indicating that ping messages are | |
| /// disabled. | |
| /// | |
| /// [connectTimeout] determines how long to wait for [WebSocket.connect] | |
| /// before throwing a [TimeoutException]. If connectTimeout is null then the | |
| /// connection process will never time-out. | |
| /// | |
| /// If there's an error connecting, the channel's stream emits a | |
| /// [WebSocketChannelException] wrapping that error and then closes. | |
| factory IOWebSocketChannel.connect( | |
| Object url, { | |
| Iterable<String>? protocols, | |
| Map<String, dynamic>? headers, | |
| Duration? pingInterval, | |
| Duration? connectTimeout, | |
| HttpClient? customClient, | |
| }) { | |
| var webSocketFuture = WebSocket.connect( | |
| url.toString(), | |
| headers: headers, | |
| protocols: protocols, | |
| customClient: customClient, | |
| ).then((webSocket) => webSocket..pingInterval = pingInterval); | |
| if (connectTimeout != null) { | |
| webSocketFuture = webSocketFuture.timeout(connectTimeout); | |
| } | |
| return IOWebSocketChannel(webSocketFuture); | |
| } | |
| /// Creates a channel wrapping [webSocket]. | |
| IOWebSocketChannel(FutureOr<WebSocket> webSocket) | |
| : super(webSocket is Future<WebSocket> | |
| ? webSocket.then(IOWebSocket.fromWebSocket) as FutureOr<IOWebSocket> | |
| : IOWebSocket.fromWebSocket(webSocket)); | |
| } |