blob: 47e184a948b7c09a8fc465319ca7bd07fb959e3f [file] [log] [blame]
// Copyright (c) 2012, 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.
/**
* Web socket status codes used when closing a web socket connection.
*/
abstract class WebSocketStatus {
static const int NORMAL_CLOSURE = 1000;
static const int GOING_AWAY = 1001;
static const int PROTOCOL_ERROR = 1002;
static const int UNSUPPORTED_DATA = 1003;
static const int RESERVED_1004 = 1004;
static const int NO_STATUS_RECEIVED = 1005;
static const int ABNORMAL_CLOSURE = 1006;
static const int INVALID_FRAME_PAYLOAD_DATA = 1007;
static const int POLICY_VIOLATION = 1008;
static const int MESSAGE_TOO_BIG = 1009;
static const int MISSING_MANDATORY_EXTENSION = 1010;
static const int INTERNAL_SERVER_ERROR = 1011;
static const int RESERVED_1015 = 1015;
}
/**
* The web socket protocol is implemented by a HTTP server handler
* which can be instantiated like this:
*
* WebSocketHandler wsHandler = new WebSocketHandler();
*
* and then its onRequest method can be assigned to the HTTP server, e.g.
*
* server.defaultHandler = wsHandler.onRequest;
*
* or
*
* server.addRequestHandler((req) => req.path == "/ws",
* wsHandler.onRequest);
*
* This handler strives to implement web sockets as specified by RFC6455.
*/
abstract class WebSocketHandler {
factory WebSocketHandler() => new _WebSocketHandler();
/**
* Request handler to be registered with the HTTP server.
*/
void onRequest(HttpRequest request, HttpResponse response);
/**
* Sets the callback to be called when a new web socket connection
* has been established.
*/
void set onOpen(callback(WebSocketConnection connection));
}
/**
* Server web socket connection.
*/
abstract class WebSocketConnection {
/**
* Sets the callback to be called when a message have been
* received. The type on [message] is either [:String:] or
* [:List<int>:] depending on whether it is a text or binary
* message. If the message is empty [message] will be [:null:].
*/
void set onMessage(void callback(message));
/**
* Sets the callback to be called when the web socket connection is
* closed. [status] indicate the reason for closing. For network
* errors the value of [status] will be
* WebSocketStatus.ABNORMAL_CLOSURE]. In this callbach it is
* possible to call [close] if [close] has not already been called.
* If [close] has still not been called after the close callback
* returns the received close status will automatically be echoed
* back to the other end to finish the close handshake.
*/
void set onClosed(void callback(int status, String reason));
/**
* Sends a message. The [message] must be a [:String:] a
* [:List<int>:] or [:null:].
*/
send(Object message);
/**
* Close the web socket connection. The default value for [status]
* and [reason] are [:null:].
*/
close([int status, String reason]);
/**
* WebSocketConnection is hashable.
*/
int hashCode();
}
/**
* Client web socket connection.
*/
abstract class WebSocketClientConnection {
/**
* Creates a new web socket client connection based on a HTTP client
* connection. The HTTP client connection must be freshly opened.
*/
factory WebSocketClientConnection(HttpClientConnection conn,
[List<String> protocols]) {
return new _WebSocketClientConnection(conn, protocols);
}
/**
* Sets the callback to be called when the request object for the
* opening handshake request is ready. This callback can be used if
* one need to add additional headers to the opening handshake
* request.
*/
void set onRequest(void callback(HttpClientRequest request));
/**
* Sets the callback to be called when a web socket connection has
* been established.
*/
void set onOpen(void callback());
/**
* Sets the callback to be called when a message have been
* received. The type of [message] is either [:String:] or
* [:List<int>:] depending on whether it is a text or binary
* message. If the message is empty [message] will be [:null:].
*/
void set onMessage(void callback(message));
/**
* Sets the callback to be called when the web socket connection is
* closed. [status] indicate the reason for closing. For network
* errors the value of [status] will be
* WebSocketStatus.ABNORMAL_CLOSURE].
*/
void set onClosed(void callback(int status, String reason));
/**
* Sets the callback to be called when the response object for the
* opening handshake did not cause a web socket connection
* upgrade. This will be called in case the response status code is
* not 101 (Switching Protocols). If this callback is not set the
* [:onError:] callback will be called if the server did not upgrade
* the connection.
*/
void set onNoUpgrade(void callback(HttpClientResponse response));
/**
* Sends a message. The [message] must be a [:String:] or a
* [:List<int>:]. To send an empty message use either an empty
* [:String:] or an empty [:List<int>:]. [:null:] cannot be used.
*/
send(message);
/**
* Close the web socket connection. The default value for [status]
* and [reason] are [:null:].
*/
close([int status, String reason]);
/**
* WebSocketClientConnection is hashable.
*/
int hashCode();
}
/**
* Base class for the events generated by the W3C complient browser
* API for web sockets.
*/
abstract class Event { }
/**
* Event delivered when there is data on a web socket connection.
*/
abstract class MessageEvent extends Event {
/**
* The type of [message] is either [:String:] or [:List<int>:]
* depending on whether it is a text or binary message. If the
* message is empty [message] will be [:null:]
*/
get data;
}
/**
* Event delivered when a web socket connection is closed.
*/
abstract class CloseEvent extends Event {
/**
* Returns whether the connection was closed cleanly or not.
*/
bool get wasClean;
/**
* Returns the web socket connection close code provided by the
* server.
*/
int get code;
/**
* Returns the web socket connection close reason provided by the
* server.
*/
String get reason;
}
/**
* Alternative web socket client interface. This interface is compliant
* with the W3C browser API for web sockets specified in
* http://dev.w3.org/html5/websockets/.
*/
abstract class WebSocket {
/**
* Possible states of the connection.
*/
static const int CONNECTING = 0;
static const int OPEN = 1;
static const int CLOSING = 2;
static const int CLOSED = 3;
/**
* Create a new web socket connection. The URL supplied in [url]
* must use the scheme [:ws:]. The [protocols] argument is either a
* [:String:] or [:List<String>:] specifying the subprotocols the
* client is willing to speak.
*/
factory WebSocket(String url, [protocols]) => new _WebSocket(url, protocols);
/**
* Returns the current state of the connection.
*/
int get readyState;
/**
* Returns the number of bytes currently buffered for transmission.
*/
int get bufferedAmount;
/**
* Sets the callback to be called when a web socket connection has
* been established.
*/
void set onopen(void callback());
/**
* Sets the callback to be called when the web socket connection
* encountered an error.
*/
void set onerror(void callback(e));
/**
* Sets the callback to be called when the web socket connection is
* closed.
*/
void set onclose(void callback(CloseEvent event));
/**
* The extensions property is initially the empty string. After the
* web socket connection is established this string reflects the
* extensions used by the server.
*/
String get extensions;
/**
* The protocol property is initially the empty string. After the
* web socket connection is established the value is the subprotocol
* selected by the server. If no subprotocol is negotiated the
* value will remain [:null:].
*/
String get protocol;
/**
* Closes the web socket connection.
*/
void close(int code, String reason);
/**
* Sets the callback to be called when a message have been
* received.
*/
void set onmessage(void callback(MessageEvent event));
/**
* Sends data on the web socket connection. The data in [data] must
* be either a [:String:] or [:List<int>:] holding bytes.
*/
void send(data);
}
class WebSocketException implements Exception {
const WebSocketException([String this.message = ""]);
String toString() => "WebSocketException: $message";
final String message;
}