From 29033cfedf5a81291dc6ac073396ae4c7d10336d Mon Sep 17 00:00:00 2001 From: Guilherme Caldas Date: Sun, 22 Dec 2019 01:32:23 -0300 Subject: [PATCH 01/20] Rename analysis_options and enable default Google rules Based on https://dart.dev/guides/language/analysis-options#default-google-rules-pedantic --- .analysis_options => analysis_options.yaml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) rename .analysis_options => analysis_options.yaml (81%) diff --git a/.analysis_options b/analysis_options.yaml similarity index 81% rename from .analysis_options rename to analysis_options.yaml index 1030240..3c0d8b3 100644 --- a/.analysis_options +++ b/analysis_options.yaml @@ -2,9 +2,10 @@ # # The commented part below is just for inspiration. Read the guide here: # https://www.dartlang.org/guides/language/analysis-options +include: package:pedantic/analysis_options.yaml - analyzer: - strong-mode: true +# analyzer: +# strong-mode: true # exclude: # - path/to/excluded/files/** # linter: From c30268d672c1d0b29405229fab60f79d6ebf2577 Mon Sep 17 00:00:00 2001 From: Guilherme Caldas Date: Sun, 22 Dec 2019 01:33:02 -0300 Subject: [PATCH 02/20] Remove unnecessary new keyword --- lib/src/adapter/adapter.dart | 6 +++--- lib/src/client.dart | 8 ++++---- lib/src/engine/connect.dart | 4 ++-- lib/src/engine/engine.dart | 2 +- lib/src/engine/server.dart | 12 ++++++------ lib/src/engine/socket.dart | 10 +++++----- lib/src/engine/transport/jsonp_transport.dart | 16 ++++++++-------- .../engine/transport/polling_transport.dart | 13 ++++++------- lib/src/engine/transport/transports.dart | 10 +++++----- .../engine/transport/websocket_transport.dart | 2 +- lib/src/namespace.dart | 4 ++-- lib/src/server.dart | 18 +++++++++--------- lib/src/socket.dart | 8 ++++---- lib/src/util/event_emitter.dart | 14 +++++++------- test/socket.test.dart | 2 +- 15 files changed, 64 insertions(+), 65 deletions(-) diff --git a/lib/src/adapter/adapter.dart b/lib/src/adapter/adapter.dart index eba3cb3..d1fe863 100644 --- a/lib/src/adapter/adapter.dart +++ b/lib/src/adapter/adapter.dart @@ -29,9 +29,9 @@ abstract class Adapter { static Adapter newInstance(String key, Namespace nsp) { if ('default' == key) { - return new _MemoryStoreAdapter(nsp); + return _MemoryStoreAdapter(nsp); } - throw new UnimplementedError('not supported other adapter yet.'); + throw UnimplementedError('not supported other adapter yet.'); } } @@ -60,7 +60,7 @@ class _MemoryStoreAdapter extends EventEmitter implements Adapter { add(String id, String room, [fn([_])]) { this.sids[id] = this.sids[id] ?? {}; this.sids[id][room] = true; - this.rooms[room] = this.rooms[room] ?? new _Room(); + this.rooms[room] = this.rooms[room] ?? _Room(); this.rooms[room].add(id); if (fn != null) scheduleMicrotask(() => fn(null)); } diff --git a/lib/src/client.dart b/lib/src/client.dart index ac41161..cc2cd64 100644 --- a/lib/src/client.dart +++ b/lib/src/client.dart @@ -26,7 +26,7 @@ class Client { List sockets = []; Map nsps = {}; List connectBuffer = []; - Logger _logger = new Logger('socket_io:Client'); + Logger _logger = Logger('socket_io:Client'); /** * Client constructor. @@ -36,8 +36,8 @@ class Client { * @api private */ Client(Server this.server, Socket this.conn) { - this.encoder = new Encoder(); - this.decoder = new Decoder(); + this.encoder = Encoder(); + this.decoder = Decoder(); this.id = conn.id; this.request = conn.connect.request; this.setup(); @@ -227,7 +227,7 @@ class Client { // `nsps` and `sockets` are cleaned up seamlessly if (this.sockets.isNotEmpty) { - new List.from(this.sockets).forEach((socket) { + List.from(this.sockets).forEach((socket) { socket.onclose(reason); }); this.sockets.clear(); diff --git a/lib/src/engine/connect.dart b/lib/src/engine/connect.dart index 707cce4..13e93c8 100644 --- a/lib/src/engine/connect.dart +++ b/lib/src/engine/connect.dart @@ -31,12 +31,12 @@ class SocketConnect extends HttpConnectWrapper { Future get done { if (_completed == true) { - return new Future.value('done'); + return Future.value('done'); } if (_socket != null) return _socket.done; else { - _done = new Completer(); + _done = Completer(); return _done.future; } } diff --git a/lib/src/engine/engine.dart b/lib/src/engine/engine.dart index 24e6ddd..242b87f 100644 --- a/lib/src/engine/engine.dart +++ b/lib/src/engine/engine.dart @@ -15,7 +15,7 @@ import 'package:socket_io/src/util/event_emitter.dart'; class Engine extends EventEmitter { static Engine attach(server, [Map options]) { - var engine = new Server(options); + var engine = Server(options); engine.attachTo(server, options); return engine; } diff --git a/lib/src/engine/server.dart b/lib/src/engine/server.dart index 21a9869..a62324c 100644 --- a/lib/src/engine/server.dart +++ b/lib/src/engine/server.dart @@ -43,7 +43,7 @@ const Map ServerErrorMessages = const { }; class Server extends Engine { - static final Logger _logger = new Logger("socket_io:engine.Server"); + static final Logger _logger = Logger("socket_io:engine.Server"); Map clients; int clientsCount; int pingTimeout; @@ -59,7 +59,7 @@ class Server extends Engine { Map perMessageDeflate; Map httpCompression; dynamic initialPacket; - Uuid _uuid = new Uuid(); + Uuid _uuid = Uuid(); Server([Map opts]) { clients = {}; @@ -301,7 +301,7 @@ class Server extends Engine { sendErrorMessage(req, ServerErrors.BAD_REQUEST); return; } - var socket = new Socket(id, this, transport, connect); + var socket = Socket(id, this, transport, connect); if (false != this.cookie) { transport.on('headers', (headers) { @@ -418,7 +418,7 @@ class Server extends Engine { attachTo(StreamServer server, Map options) { options = options ?? {}; var path = - (options['path'] ?? '/engine.io').replaceFirst(new RegExp(r"\/$"), ''); + (options['path'] ?? '/engine.io').replaceFirst(RegExp(r"\/$"), ''); // normalize path path += '/'; @@ -432,12 +432,12 @@ class Server extends Engine { this.transports.contains('websocket')) { // print('init websocket... ${req.uri}'); var socket = await WebSocketTransformer.upgrade(req); - var socketConnect = new SocketConnect.fromWebSocket(connect, socket); + var socketConnect = SocketConnect.fromWebSocket(connect, socket); socketConnect.dataset['options'] = options; this.handleUpgrade(socketConnect); return socketConnect.done; } else { - var socketConnect = new SocketConnect(connect); + var socketConnect = SocketConnect(connect); socketConnect.dataset['options'] = options; this.handleRequest(socketConnect); return socketConnect.done; diff --git a/lib/src/engine/socket.dart b/lib/src/engine/socket.dart index e3f76be..0bbc65b 100644 --- a/lib/src/engine/socket.dart +++ b/lib/src/engine/socket.dart @@ -25,7 +25,7 @@ import 'package:socket_io/src/util/event_emitter.dart'; * @api private */ class Socket extends EventEmitter { - static final Logger _logger = new Logger("socket_io:engine.Socket"); + static final Logger _logger = Logger("socket_io:engine.Socket"); String id; Server server; Transport transport; @@ -147,8 +147,8 @@ class Socket extends EventEmitter { if (this.pingTimeoutTimer != null) { this.pingTimeoutTimer.cancel(); } - this.pingTimeoutTimer = new Timer( - new Duration( + this.pingTimeoutTimer = Timer( + Duration( milliseconds: this.server.pingInterval + this.server.pingTimeout), () { this.onClose('ping timeout'); @@ -199,7 +199,7 @@ class Socket extends EventEmitter { Map cleanupFn = {}; // set transport upgrade timer this.upgradeTimeoutTimer = - new Timer(new Duration(milliseconds: this.server.upgradeTimeout), () { + Timer(Duration(milliseconds: this.server.upgradeTimeout), () { _logger.fine('client did not complete upgrade - closing transport'); cleanupFn['cleanup'](); if ('open' == transport.readyState) { @@ -227,7 +227,7 @@ class Socket extends EventEmitter { this.checkIntervalTimer.cancel(); } this.checkIntervalTimer = - new Timer.periodic(new Duration(milliseconds: 100), (_) => check()); + Timer.periodic(Duration(milliseconds: 100), (_) => check()); } else if ('upgrade' == packet['type'] && this.readyState != 'closed') { _logger.fine('got upgrade packet - upgrading'); cleanupFn['cleanup'](); diff --git a/lib/src/engine/transport/jsonp_transport.dart b/lib/src/engine/transport/jsonp_transport.dart index 969a44c..ceaada7 100644 --- a/lib/src/engine/transport/jsonp_transport.dart +++ b/lib/src/engine/transport/jsonp_transport.dart @@ -20,7 +20,7 @@ class JSONPTransport extends PollingTransport { JSONPTransport(SocketConnect connect) : super(connect) { this.head = '___eio[' + (connect.request.uri.queryParameters['j'] ?? '') - .replaceAll(new RegExp('[^0-9]'), '') + + .replaceAll(RegExp('[^0-9]'), '') + ']('; this.foot = ');'; } @@ -38,13 +38,13 @@ class JSONPTransport extends PollingTransport { if (data is String) { // client will send already escaped newlines as \\\\n and newlines as \\n // \\n must be replaced with \n and \\\\n with \\n - data = data.replaceAllMapped(new RegExp(r'(\\)?\\n'), (match) { - throw new UnimplementedError('Not implemented yet'); + data = data.replaceAllMapped(RegExp(r'(\\)?\\n'), (match) { + throw UnimplementedError('Not implemented yet'); // print(match); // match // return slashes ? match : '\n'; }); - super.onData(data.replaceAll(new RegExp(r'\\\\n'), '\\n')); + super.onData(data.replaceAll(RegExp(r'\\\\n'), '\\n')); } } @@ -58,8 +58,8 @@ class JSONPTransport extends PollingTransport { // see: http://timelessrepo.com/json-isnt-a-javascript-subset var js = json .encode(data) - .replaceAll(new RegExp(r'\u2028'), '\\u2028') - .replaceAll(new RegExp(r'\u2029'), '\\u2029'); + .replaceAll(RegExp(r'\u2028'), '\\u2028') + .replaceAll(RegExp(r'\u2029'), '\\u2029'); // prepare response data = this.head + js + this.foot; @@ -68,8 +68,8 @@ class JSONPTransport extends PollingTransport { } static Map parse(String query) { - var search = new RegExp('([^&=]+)=?([^&]*)'); - var result = new Map(); + var search = RegExp('([^&=]+)=?([^&]*)'); + var result = Map(); // Get rid off the beginning ? in query strings. if (query.startsWith('?')) query = query.substring(1); diff --git a/lib/src/engine/transport/polling_transport.dart b/lib/src/engine/transport/polling_transport.dart index 4a64b66..eb93a1f 100644 --- a/lib/src/engine/transport/polling_transport.dart +++ b/lib/src/engine/transport/polling_transport.dart @@ -25,8 +25,7 @@ class PollingTransport extends Transport { @override bool get supportsFraming => false; - static final Logger _logger = - new Logger('socket_io:transport.PollingTransport'); + static final Logger _logger = Logger('socket_io:transport.PollingTransport'); int closeTimeout; Function shouldClose; SocketConnect dataReq; @@ -133,9 +132,9 @@ class PollingTransport extends Transport { contentLength = utf8.encode(chunks).length; } else { if (chunks is String) { - chunks += new String.fromCharCodes(data); + chunks += String.fromCharCodes(data); } else { - chunks.addAll(new String.fromCharCodes(data) + chunks.addAll(String.fromCharCodes(data) .split(',') .map((s) => int.parse(s)) .toList()); @@ -292,7 +291,7 @@ class PollingTransport extends Transport { if (headers.containsKey(HttpHeaders.contentEncodingHeader)) { res.add(data); } else { - res.write(new String.fromCharCodes(data)); + res.write(String.fromCharCodes(data)); } connect.close(); } @@ -333,7 +332,7 @@ class PollingTransport extends Transport { headers[HttpHeaders.contentEncodingHeader] = encoding; respond(hasGzip ? gzip.encode(utf8.encode( - data is List ? new String.fromCharCodes(data as List) : data)) + data is List ? String.fromCharCodes(data as List) : data)) : data); // }); } @@ -372,7 +371,7 @@ class PollingTransport extends Transport { _logger.fine('transport not writable - buffering orderly close'); this.shouldClose = onClose; closeTimeoutTimer = - new Timer(new Duration(milliseconds: this.closeTimeout), onClose); + Timer(Duration(milliseconds: this.closeTimeout), onClose); } } diff --git a/lib/src/engine/transport/transports.dart b/lib/src/engine/transport/transports.dart index e44b02a..8ad818b 100644 --- a/lib/src/engine/transport/transports.dart +++ b/lib/src/engine/transport/transports.dart @@ -28,21 +28,21 @@ class Transports { static Transport newInstance(String name, SocketConnect connect) { if ('websocket' == name) { - return new WebSocketTransport(connect); + return WebSocketTransport(connect); } else if ('polling' == name) { if (connect.request.uri.queryParameters.containsKey('j')) { - return new JSONPTransport(connect); + return JSONPTransport(connect); } else { - return new XHRTransport(connect); + return XHRTransport(connect); } } else { - throw new UnsupportedError('Unknown transport $name'); + throw UnsupportedError('Unknown transport $name'); } } } abstract class Transport extends EventEmitter { - static Logger _logger = new Logger('socket_io:transport.Transport'); + static Logger _logger = Logger('socket_io:transport.Transport'); double maxHttpBufferSize; Map httpCompression; Map perMessageDeflate; diff --git a/lib/src/engine/transport/websocket_transport.dart b/lib/src/engine/transport/websocket_transport.dart index 474353d..d870adc 100644 --- a/lib/src/engine/transport/websocket_transport.dart +++ b/lib/src/engine/transport/websocket_transport.dart @@ -16,7 +16,7 @@ import 'package:socket_io_common/src/engine/parser/parser.dart'; import 'package:socket_io/src/engine/transport/transports.dart'; class WebSocketTransport extends Transport { - static Logger _logger = new Logger('socket_io:transport.WebSocketTransport'); + static Logger _logger = Logger('socket_io:transport.WebSocketTransport'); bool get handlesUpgrades => true; bool get supportsFraming => true; StreamSubscription subscription; diff --git a/lib/src/namespace.dart b/lib/src/namespace.dart index 19fd449..7966ce0 100644 --- a/lib/src/namespace.dart +++ b/lib/src/namespace.dart @@ -43,7 +43,7 @@ class Namespace extends EventEmitter { List rooms = []; Map flags = {}; Adapter adapter; - Logger _logger = new Logger('socket_io:Namespace'); + Logger _logger = Logger('socket_io:Namespace'); /** * Namespace constructor. @@ -137,7 +137,7 @@ class Namespace extends EventEmitter { */ add(Client client, query, fn) { _logger.fine('adding socket to nsp ${this.name}'); - var socket = new Socket(this, client, query); + var socket = Socket(this, client, query); var self = this; this.run(socket, (err) { // don't use Timer.run() here diff --git a/lib/src/server.dart b/lib/src/server.dart index de7c42c..c403e9a 100644 --- a/lib/src/server.dart +++ b/lib/src/server.dart @@ -31,7 +31,7 @@ Map oldSettings = { "destroy buffer size": "maxHttpBufferSize" }; -final Logger _logger = new Logger('socket_io:Server'); +final Logger _logger = Logger('socket_io:Server'); class Server { // Namespaces @@ -60,7 +60,7 @@ class Server { this.adapter = options.containsKey('adapter') ? options['adapter'] : 'default'; this.origins(options.containsKey('origins') ? options['origins'] : '*:*'); - this.encoder = new Encoder(); + this.encoder = Encoder(); this.sockets = this.of('/'); if (server != null) { this.attach(server, options); @@ -134,11 +134,11 @@ class Server { this.use((socket, next) { val(socket.request, (err, authorized) { if (err) { - return next(new Exception(err)); + return next(Exception(err)); } ; if (!authorized) { - return next(new Exception('Not authorized')); + return next(Exception('Not authorized')); } next(); @@ -166,7 +166,7 @@ class Server { */ path([String v]) { if (v == null || v.isEmpty) return this._path; - this._path = v.replaceFirst(new RegExp(r'/\/$/'), ''); + this._path = v.replaceFirst(RegExp(r'/\/$/'), ''); return this; } @@ -227,7 +227,7 @@ class Server { if (srv is Function) { String msg = 'You are trying to attach socket.io to an express ' + 'request handler function. Please pass a http.Server instance.'; - throw new Exception(msg); + throw Exception(msg); } // handle a port as a string @@ -247,7 +247,7 @@ class Server { if (srv is num) { _logger.fine('creating http server and binding to $srv'); int port = srv; - StreamServer server = new StreamServer(); + StreamServer server = StreamServer(); server.start(port: port); // HttpServer.bind(InternetAddress.ANY_IP_V4, port).then(( // HttpServer server) { @@ -376,7 +376,7 @@ class Server { */ onconnection(conn) { _logger.fine('incoming connection with id ${conn.id}'); - Client client = new Client(this, conn); + Client client = Client(this, conn); client.connect('/'); return this; } @@ -396,7 +396,7 @@ class Server { if (!this.nsps.containsKey(name)) { _logger.fine('initializing namespace $name'); - Namespace nsp = new Namespace(this, name); + Namespace nsp = Namespace(this, name); this.nsps[name] = nsp; } if (fn != null) this.nsps[name].on('connect', fn); diff --git a/lib/src/socket.dart b/lib/src/socket.dart index e0a66ca..d3bc9de 100644 --- a/lib/src/socket.dart +++ b/lib/src/socket.dart @@ -92,16 +92,16 @@ class Socket extends EventEmitter { var requestQuery = this.request.uri.queryParameters; //if socket-specific query exist, replace query strings in requestQuery return query != null - ? (new Map.from(query)..addAll(requestQuery)) + ? (Map.from(query)..addAll(requestQuery)) : requestQuery; }; return { 'headers': this.request.headers, - 'time': new DateTime.now().toString(), + 'time': DateTime.now().toString(), 'address': this.conn.remoteAddress, 'xdomain': this.request.headers.value('origin') != null, // TODO 'secure': ! !this.request.connectionInfo.encrypted, - 'issued': new DateTime.now().millisecondsSinceEpoch, + 'issued': DateTime.now().millisecondsSinceEpoch, 'url': this.request.uri.path, 'query': buildQuery() }; @@ -151,7 +151,7 @@ class Socket extends EventEmitter { if (ack != null) { if (this.roomList.isNotEmpty || flags['broadcast'] == true) { - throw new UnsupportedError( + throw UnsupportedError( 'Callbacks are not supported when broadcasting'); } diff --git a/lib/src/util/event_emitter.dart b/lib/src/util/event_emitter.dart index bb952b0..3648d83 100644 --- a/lib/src/util/event_emitter.dart +++ b/lib/src/util/event_emitter.dart @@ -35,8 +35,8 @@ class EventEmitter { * Constructor */ EventEmitter() { - this._events = new HashMap>(); - this._eventsOnce = new HashMap>(); + this._events = HashMap>(); + this._eventsOnce = HashMap>(); } /** @@ -47,7 +47,7 @@ class EventEmitter { final list0 = this._events[event]; // todo: try to optimize this. Maybe remember the off() handlers and remove later? // handler might be off() inside handler; make a copy first - final list = list0 != null ? new List.from(list0) : null; + final list = list0 != null ? List.from(list0) : null; list?.forEach((handler) { handler(data); }); @@ -61,7 +61,7 @@ class EventEmitter { * This function binds the [handler] as a listener to the [event] */ void on(String event, EventHandler handler) { - this._events.putIfAbsent(event, () => new List()); + this._events.putIfAbsent(event, () => List()); this._events[event].add(handler); } @@ -71,7 +71,7 @@ class EventEmitter { * it is removed. */ void once(String event, EventHandler handler) { - this._eventsOnce.putIfAbsent(event, () => new List()); + this._eventsOnce.putIfAbsent(event, () => List()); this._eventsOnce[event].add(handler); } @@ -98,8 +98,8 @@ class EventEmitter { * This function unbinds all the handlers for all the events. */ void clearListeners() { - this._events = new HashMap>(); - this._eventsOnce = new HashMap>(); + this._events = HashMap>(); + this._eventsOnce = HashMap>(); } /** diff --git a/test/socket.test.dart b/test/socket.test.dart index a13e920..8af6313 100644 --- a/test/socket.test.dart +++ b/test/socket.test.dart @@ -17,7 +17,7 @@ import 'package:socket_io/socket_io.dart'; main() { group('Socket IO', () { test('Start standalone server', () async { - var io = new Server(); + var io = Server(); var nsp = io.of('/some'); nsp.on('connection', (client) { print('connection /some'); From 8e54616d5b896d0cfe39b862f61f6586e467a4f5 Mon Sep 17 00:00:00 2001 From: Guilherme Caldas Date: Sun, 22 Dec 2019 02:15:32 -0300 Subject: [PATCH 03/20] Remove unnecessary this Following the guideline: "Don't access members with this unless avoiding shadowing" --- lib/src/adapter/adapter.dart | 70 +++--- lib/src/client.dart | 82 +++---- lib/src/engine/server.dart | 102 ++++---- lib/src/engine/socket.dart | 222 +++++++++--------- lib/src/engine/transport/jsonp_transport.dart | 6 +- .../engine/transport/polling_transport.dart | 72 +++--- lib/src/engine/transport/transports.dart | 26 +- .../engine/transport/websocket_transport.dart | 10 +- lib/src/namespace.dart | 37 ++- lib/src/server.dart | 96 ++++---- lib/src/socket.dart | 134 +++++------ lib/src/util/event_emitter.dart | 40 ++-- 12 files changed, 448 insertions(+), 449 deletions(-) diff --git a/lib/src/adapter/adapter.dart b/lib/src/adapter/adapter.dart index d1fe863..3077df0 100644 --- a/lib/src/adapter/adapter.dart +++ b/lib/src/adapter/adapter.dart @@ -43,9 +43,9 @@ class _MemoryStoreAdapter extends EventEmitter implements Adapter { Namespace nsp; _MemoryStoreAdapter(nsp) { this.nsp = nsp; - this.rooms = {}; - this.sids = {}; - this.encoder = nsp.server.encoder; + rooms = {}; + sids = {}; + encoder = nsp.server.encoder; } /** @@ -58,10 +58,10 @@ class _MemoryStoreAdapter extends EventEmitter implements Adapter { */ add(String id, String room, [fn([_])]) { - this.sids[id] = this.sids[id] ?? {}; - this.sids[id][room] = true; - this.rooms[room] = this.rooms[room] ?? _Room(); - this.rooms[room].add(id); + sids[id] = sids[id] ?? {}; + sids[id][room] = true; + rooms[room] = rooms[room] ?? _Room(); + rooms[room].add(id); if (fn != null) scheduleMicrotask(() => fn(null)); } @@ -74,11 +74,11 @@ class _MemoryStoreAdapter extends EventEmitter implements Adapter { * @api public */ del(String id, String room, [fn([_])]) { - this.sids[id] = this.sids[id] ?? {}; - this.sids[id].remove(room); - if (this.rooms.containsKey(room)) { - this.rooms[room].del(id); - if (this.rooms[room].length == 0) this.rooms.remove(room); + sids[id] = sids[id] ?? {}; + sids[id].remove(room); + if (rooms.containsKey(room)) { + rooms[room].del(id); + if (rooms[room].length == 0) rooms.remove(room); } if (fn != null) scheduleMicrotask(() => fn(null)); @@ -92,16 +92,16 @@ class _MemoryStoreAdapter extends EventEmitter implements Adapter { * @api public */ delAll(String id, [fn([_])]) { - var rooms = this.sids[id]; + var rooms = sids[id]; if (rooms != null) { for (var room in rooms.keys) { - if (this.rooms.containsKey(room)) { - this.rooms[room].del(id); - if (this.rooms[room].length == 0) this.rooms.remove(room); + if (rooms.containsKey(room)) { + rooms[room].del(id); + if (rooms[room].length == 0) rooms.remove(room); } } } - this.sids.remove(id); + sids.remove(id); if (fn != null) scheduleMicrotask(() => fn(null)); } @@ -130,17 +130,17 @@ class _MemoryStoreAdapter extends EventEmitter implements Adapter { var ids = {}; var socket; - packet['nsp'] = this.nsp.name; - this.encoder.encode(packet, (encodedPackets) { + packet['nsp'] = nsp.name; + encoder.encode(packet, (encodedPackets) { if (rooms.isNotEmpty) { for (var i = 0; i < rooms.length; i++) { - var room = this.rooms[rooms[i]]; + var room = rooms[rooms[i]]; if (room == null) continue; var sockets = room.sockets; for (var id in sockets.keys) { if (sockets.containsKey(id)) { if (ids[id] != null || except.indexOf(id) >= 0) continue; - socket = this.nsp.connected[id]; + socket = nsp.connected[id]; if (socket != null) { socket.packet(encodedPackets, packetOpts); ids[id] = true; @@ -149,9 +149,9 @@ class _MemoryStoreAdapter extends EventEmitter implements Adapter { } } } else { - for (var id in this.sids.keys) { + for (var id in sids.keys) { if (except.indexOf(id) >= 0) continue; - socket = this.nsp.connected[id]; + socket = nsp.connected[id]; if (socket != null) socket.packet(encodedPackets, packetOpts); } } @@ -174,13 +174,13 @@ class _MemoryStoreAdapter extends EventEmitter implements Adapter { if (rooms.isNotEmpty) { for (var i = 0; i < rooms.length; i++) { - var room = this.rooms[rooms[i]]; + var room = rooms[rooms[i]]; if (room == null) continue; var sockets = room.sockets; for (var id in sockets.keys) { if (sockets.containsKey(id)) { if (ids[id] != null) continue; - socket = this.nsp.connected[id]; + socket = nsp.connected[id]; if (socket != null) { sids.add(id); ids[id] = true; @@ -190,7 +190,7 @@ class _MemoryStoreAdapter extends EventEmitter implements Adapter { } } else { for (var id in this.sids.keys) { - socket = this.nsp.connected[id]; + socket = nsp.connected[id]; if (socket != null) sids.add(id); } } @@ -206,7 +206,7 @@ class _MemoryStoreAdapter extends EventEmitter implements Adapter { * @api public */ clientRooms(String id, [fn(err, [_])]) { - var rooms = this.sids[id]; + var rooms = sids[id]; if (fn != null) scheduleMicrotask(() => fn(null, rooms?.keys)); } } @@ -220,8 +220,8 @@ class _Room { Map sockets; int length; _Room() { - this.sockets = {}; - this.length = 0; + sockets = {}; + length = 0; } /** @@ -231,9 +231,9 @@ class _Room { * @api private */ add(String id) { - if (!this.sockets.containsKey(id)) { - this.sockets[id] = true; - this.length++; + if (!sockets.containsKey(id)) { + sockets[id] = true; + length++; } } @@ -244,9 +244,9 @@ class _Room { * @api private */ del(String id) { - if (this.sockets.containsKey(id)) { - this.sockets.remove(id); - this.length--; + if (sockets.containsKey(id)) { + sockets.remove(id); + length--; } } } diff --git a/lib/src/client.dart b/lib/src/client.dart index cc2cd64..e0745ec 100644 --- a/lib/src/client.dart +++ b/lib/src/client.dart @@ -36,11 +36,11 @@ class Client { * @api private */ Client(Server this.server, Socket this.conn) { - this.encoder = Encoder(); - this.decoder = Decoder(); - this.id = conn.id; - this.request = conn.connect.request; - this.setup(); + encoder = Encoder(); + decoder = Decoder(); + id = conn.id; + request = conn.connect.request; + setup(); } /** @@ -49,10 +49,10 @@ class Client { * @api private */ setup() { - this.decoder.on('decoded', this.ondecoded); - this.conn.on('data', this.ondata); - this.conn.on('error', this.onerror); - this.conn.on('close', this.onclose); + decoder.on('decoded', ondecoded); + conn.on('data', ondata); + conn.on('error', onerror); + conn.on('close', onclose); } /** @@ -63,13 +63,13 @@ class Client { */ connect(name, [query]) { _logger.fine('connecting to namespace $name'); - if (!this.server.nsps.containsKey(name)) { - this.packet({'type': ERROR, 'nsp': name, 'data': 'Invalid namespace'}); + if (!server.nsps.containsKey(name)) { + packet({'type': ERROR, 'nsp': name, 'data': 'Invalid namespace'}); return; } - var nsp = this.server.of(name); - if ('/' != name && !this.nsps.containsKey('/')) { - this.connectBuffer.add(name); + var nsp = server.of(name); + if ('/' != name && !nsps.containsKey('/')) { + connectBuffer.add(name); return; } @@ -93,12 +93,12 @@ class Client { disconnect() { // we don't use a for loop because the length of // `sockets` changes upon each iteration - this.sockets.toList().forEach((socket) { + sockets.toList().forEach((socket) { socket.disconnect(); }); - this.sockets.clear(); + sockets.clear(); - this.close(); + close(); } /** @@ -107,11 +107,11 @@ class Client { * @api private */ remove(socket) { - var i = this.sockets.indexOf(socket); + var i = sockets.indexOf(socket); if (i >= 0) { - var nsp = this.sockets[i].nsp.name; - this.sockets.removeAt(i); - this.nsps.remove(nsp); + var nsp = sockets[i].nsp.name; + sockets.removeAt(i); + nsps.remove(nsp); } else { _logger.fine('ignoring remove for ${socket.id}'); } @@ -123,10 +123,10 @@ class Client { * @api private */ close() { - if ('open' == this.conn.readyState) { + if ('open' == conn.readyState) { _logger.fine('forcing transport close'); - this.conn.close(); - this.onclose('forced server close'); + conn.close(); + onclose('forced server close'); } } @@ -148,11 +148,11 @@ class Client { } } - if ('open' == this.conn.readyState) { + if ('open' == conn.readyState) { _logger.fine('writing packet $packet'); if (opts['preEncoded'] != true) { // not broadcasting, need to encode - this.encoder.encode(packet, (encodedPackets) { + encoder.encode(packet, (encodedPackets) { // encode, then write results to engine writeToEngine(encodedPackets); }); @@ -173,10 +173,10 @@ class Client { ondata(data) { // try/catch is needed for protocol violations (GH-1880) try { - this.decoder.add(data); + decoder.add(data); } catch (e, st) { _logger.severe(e, st); - this.onerror(e); + onerror(e); } } @@ -189,9 +189,9 @@ class Client { if (CONNECT == packet['type']) { final nsp = packet['nsp']; final uri = Uri.parse(nsp); - this.connect(uri.path, uri.queryParameters); + connect(uri.path, uri.queryParameters); } else { - var socket = this.nsps[packet['nsp']]; + var socket = nsps[packet['nsp']]; if (socket != null) { socket.onpacket(packet); } else { @@ -207,10 +207,10 @@ class Client { * @api private */ onerror(err) { - this.sockets.forEach((socket) { + sockets.forEach((socket) { socket.onerror(err); }); - this.onclose('client error'); + onclose('client error'); } /** @@ -223,16 +223,16 @@ class Client { _logger.fine('client close with reason $reason'); // ignore a potential subsequent `close` event - this.destroy(); + destroy(); // `nsps` and `sockets` are cleaned up seamlessly - if (this.sockets.isNotEmpty) { - List.from(this.sockets).forEach((socket) { + if (sockets.isNotEmpty) { + List.from(sockets).forEach((socket) { socket.onclose(reason); }); - this.sockets.clear(); + sockets.clear(); } - this.decoder.destroy(); // clean up decoder + decoder.destroy(); // clean up decoder } /** @@ -241,9 +241,9 @@ class Client { * @api private */ destroy() { - this.conn.off('data', this.ondata); - this.conn.off('error', this.onerror); - this.conn.off('close', this.onclose); - this.decoder.off('decoded', this.ondecoded); + conn.off('data', ondata); + conn.off('error', onerror); + conn.off('close', onclose); + decoder.off('decoded', ondecoded); } } diff --git a/lib/src/engine/server.dart b/lib/src/engine/server.dart index a62324c..5557bcc 100644 --- a/lib/src/engine/server.dart +++ b/lib/src/engine/server.dart @@ -63,40 +63,40 @@ class Server extends Engine { Server([Map opts]) { clients = {}; - this.clientsCount = 0; + clientsCount = 0; opts = opts ?? {}; - this.pingTimeout = opts['pingTimeout'] ?? 60000; - this.pingInterval = opts['pingInterval'] ?? 25000; - this.upgradeTimeout = opts['upgradeTimeout'] ?? 10000; - this.maxHttpBufferSize = opts['maxHttpBufferSize'] ?? 10E7; - this.transports = ['polling', 'websocket']; - this.allowUpgrades = false != opts['allowUpgrades']; - this.allowRequest = opts['allowRequest']; - this.cookie = opts['cookie'] == false + pingTimeout = opts['pingTimeout'] ?? 60000; + pingInterval = opts['pingInterval'] ?? 25000; + upgradeTimeout = opts['upgradeTimeout'] ?? 10000; + maxHttpBufferSize = opts['maxHttpBufferSize'] ?? 10E7; + transports = ['polling', 'websocket']; + allowUpgrades = false != opts['allowUpgrades']; + allowRequest = opts['allowRequest']; + cookie = opts['cookie'] == false ? false : opts['cookie'] ?? 'io'; //false != opts.cookie ? (opts.cookie || 'io') : false; - this.cookiePath = opts['cookiePath'] == false + cookiePath = opts['cookiePath'] == false ? false : opts['cookiePath'] ?? '/'; //false != opts.cookiePath ? (opts.cookiePath || '/') : false; - this.cookieHttpOnly = opts['cookieHttpOnly'] != false; + cookieHttpOnly = opts['cookieHttpOnly'] != false; if (!opts.containsKey('perMessageDeflate') || opts['perMessageDeflate'] == true) { - this.perMessageDeflate = + perMessageDeflate = opts['perMessageDeflate'] is Map ? opts['perMessageDeflate'] : {}; - if (!this.perMessageDeflate.containsKey('threshold')) - this.perMessageDeflate['threshold'] = 1024; + if (!perMessageDeflate.containsKey('threshold')) + perMessageDeflate['threshold'] = 1024; } - this.httpCompression = opts['httpCompression'] ?? {}; - if (!this.httpCompression.containsKey('threshold')) - this.httpCompression['threshold'] = 1024; + httpCompression = opts['httpCompression'] ?? {}; + if (!httpCompression.containsKey('threshold')) + httpCompression['threshold'] = 1024; - this.initialPacket = opts['initialPacket']; - this._init(); + initialPacket = opts['initialPacket']; + _init(); } /** @@ -134,7 +134,7 @@ class Server extends Engine { */ List upgrades(transport) { - if (!this.allowUpgrades) return null; + if (!allowUpgrades) return null; return Transports.upgradesTo(transport); } @@ -150,7 +150,7 @@ class Server extends Engine { // transport check var req = connect.request; var transport = req.uri.queryParameters['transport']; - if (this.transports.indexOf(transport) == -1) { + if (transports.indexOf(transport) == -1) { _logger.fine('unknown transport "$transport"'); return fn(ServerErrors.UNKNOWN_TRANSPORT, false); } @@ -158,10 +158,10 @@ class Server extends Engine { // sid check var sid = req.uri.queryParameters['sid']; if (sid != null) { - if (!this.clients.containsKey(sid)) { + if (!clients.containsKey(sid)) { return fn(ServerErrors.UNKNOWN_SID, false); } - if (!upgrade && this.clients[sid].transport.name != transport) { + if (!upgrade && clients[sid].transport.name != transport) { _logger.fine('bad request: unexpected transport without upgrade'); return fn(ServerErrors.BAD_REQUEST, false); } @@ -169,8 +169,8 @@ class Server extends Engine { // handshake is GET only if ('GET' != req.method) return fn(ServerErrors.BAD_HANDSHAKE_METHOD, false); - if (this.allowRequest == null) return fn(null, true); - return this.allowRequest(req, fn); + if (allowRequest == null) return fn(null, true); + return allowRequest(req, fn); } fn(null, true); @@ -184,9 +184,9 @@ class Server extends Engine { close() { _logger.fine('closing all open clients'); - for (var key in this.clients.keys) { - if (this.clients[key] != null) { - this.clients[key].close(true); + for (var key in clients.keys) { + if (clients[key] != null) { + clients[key].close(true); } } // if (this.ws) { @@ -211,7 +211,7 @@ class Server extends Engine { // req.res = res; var self = this; - this.verify(connect, false, (err, success) { + verify(connect, false, (err, success) { if (!success) { sendErrorMessage(req, err); return; @@ -278,7 +278,7 @@ class Server extends Engine { * @api private */ handshake(String transportName, SocketConnect connect) { - var id = this.generateId(connect); + var id = generateId(connect); _logger.fine('handshaking client $id'); var transport; @@ -286,10 +286,10 @@ class Server extends Engine { try { transport = Transports.newInstance(transportName, connect); if ('polling' == transportName) { - transport.maxHttpBufferSize = this.maxHttpBufferSize; - transport.httpCompression = this.httpCompression; + transport.maxHttpBufferSize = maxHttpBufferSize; + transport.httpCompression = httpCompression; } else if ('websocket' == transportName) { - transport.perMessageDeflate = this.perMessageDeflate; + transport.perMessageDeflate = perMessageDeflate; } if (req.uri.hasQuery && req.uri.queryParameters.containsKey('b64')) { @@ -303,13 +303,13 @@ class Server extends Engine { } var socket = Socket(id, this, transport, connect); - if (false != this.cookie) { + if (false != cookie) { transport.on('headers', (headers) { - headers['Set-Cookie'] = '${this.cookie}=${Uri.encodeComponent(id)}' + - (this.cookiePath?.isNotEmpty == true - ? '; Path=${this.cookiePath}' + headers['Set-Cookie'] = '${cookie}=${Uri.encodeComponent(id)}' + + (cookiePath?.isNotEmpty == true + ? '; Path=${cookiePath}' : '') + - (this.cookiePath?.isNotEmpty == true && this.cookieHttpOnly == true + (cookiePath?.isNotEmpty == true && cookieHttpOnly == true ? '; HttpOnly' : ''); }); @@ -317,15 +317,15 @@ class Server extends Engine { transport.onRequest(connect); - this.clients[id] = socket; - this.clientsCount++; + clients[id] = socket; + clientsCount++; socket.once('close', (_) { - this.clients.remove(id); - this.clientsCount--; + clients.remove(id); + clientsCount--; }); - this.emit('connection', socket); + emit('connection', socket); } /** @@ -336,7 +336,7 @@ class Server extends Engine { handleUpgrade(SocketConnect connect) { // this.prepare(req); - this.verify(connect, true, (err, success) { + verify(connect, true, (err, success) { if (!success) { abortConnection(connect, err); return; @@ -348,7 +348,7 @@ class Server extends Engine { // delegate to ws // self.ws.handleUpgrade(req, socket, head, function (conn) { - this.onWebSocket(connect); + onWebSocket(connect); // }); }); } @@ -380,7 +380,7 @@ class Server extends Engine { // req.websocket = socket; if (id != null) { - var client = this.clients[id]; + var client = clients[id]; if (client == null) { _logger.fine('upgrade attempt for closed client'); connect.websocket.close(); @@ -400,11 +400,11 @@ class Server extends Engine { } else { transport.supportsBinary = true; } - transport.perMessageDeflate = this.perMessageDeflate; + transport.perMessageDeflate = perMessageDeflate; client.maybeUpgrade(transport); } } else { - this.handshake(connect.request.uri.queryParameters['transport'], connect); + handshake(connect.request.uri.queryParameters['transport'], connect); } } @@ -429,17 +429,17 @@ class Server extends Engine { _logger.fine('intercepting request for path "$path"'); if (WebSocketTransformer.isUpgradeRequest(req) && - this.transports.contains('websocket')) { + transports.contains('websocket')) { // print('init websocket... ${req.uri}'); var socket = await WebSocketTransformer.upgrade(req); var socketConnect = SocketConnect.fromWebSocket(connect, socket); socketConnect.dataset['options'] = options; - this.handleUpgrade(socketConnect); + handleUpgrade(socketConnect); return socketConnect.done; } else { var socketConnect = SocketConnect(connect); socketConnect.dataset['options'] = options; - this.handleRequest(socketConnect); + handleRequest(socketConnect); return socketConnect.done; } }, preceding: true); diff --git a/lib/src/engine/socket.dart b/lib/src/engine/socket.dart index 0bbc65b..da649c6 100644 --- a/lib/src/engine/socket.dart +++ b/lib/src/engine/socket.dart @@ -43,23 +43,23 @@ class Socket extends EventEmitter { Timer pingTimeoutTimer; Socket(this.id, this.server, this.transport, this.connect) { - this.upgrading = false; - this.upgraded = false; - this.readyState = 'opening'; - this.writeBuffer = []; - this.packetsFn = []; - this.sentCallbackFn = []; - this.cleanupFn = []; + upgrading = false; + upgraded = false; + readyState = 'opening'; + writeBuffer = []; + packetsFn = []; + sentCallbackFn = []; + cleanupFn = []; // Cache IP since it might not be in the req later - this.remoteAddress = connect.request.connectionInfo.remoteAddress; + remoteAddress = connect.request.connectionInfo.remoteAddress; - this.checkIntervalTimer = null; - this.upgradeTimeoutTimer = null; - this.pingTimeoutTimer = null; + checkIntervalTimer = null; + upgradeTimeoutTimer = null; + pingTimeoutTimer = null; - this.setTransport(transport); - this.onOpen(); + setTransport(transport); + onOpen(); } /** @@ -69,24 +69,24 @@ class Socket extends EventEmitter { */ onOpen() { - this.readyState = 'open'; + readyState = 'open'; // sends an `open` packet - this.transport.sid = this.id; - this.sendPacket('open', + transport.sid = id; + sendPacket('open', data: json.encode({ - 'sid': this.id, - 'upgrades': this.getAvailableUpgrades(), - 'pingInterval': this.server.pingInterval, - 'pingTimeout': this.server.pingTimeout + 'sid': id, + 'upgrades': getAvailableUpgrades(), + 'pingInterval': server.pingInterval, + 'pingTimeout': server.pingTimeout })); // if (this.server.initialPacket != null) { // this.sendPacket('message', data: this.server.initialPacket); // } - this.emit('open'); - this.setPingTimeout(); + emit('open'); + setPingTimeout(); } /** @@ -97,29 +97,29 @@ class Socket extends EventEmitter { */ onPacket(packet) { - if ('open' == this.readyState) { + if ('open' == readyState) { // export packet event _logger.fine('packet'); - this.emit('packet', packet); + emit('packet', packet); // Reset ping timeout on any packet, incoming data is a good sign of // other side's liveness - this.setPingTimeout(); + setPingTimeout(); switch (packet['type']) { case 'ping': _logger.fine('got ping'); - this.sendPacket('pong'); - this.emit('heartbeat'); + sendPacket('pong'); + emit('heartbeat'); break; case 'error': - this.onClose('parse error'); + onClose('parse error'); break; case 'message': var data = packet['data']; - this.emit('data', data); - this.emit('message', data); + emit('data', data); + emit('message', data); break; } } else { @@ -135,7 +135,7 @@ class Socket extends EventEmitter { */ onError(err) { _logger.fine('transport error'); - this.onClose('transport error', err); + onClose('transport error', err); } /** @@ -144,14 +144,14 @@ class Socket extends EventEmitter { * @api private */ setPingTimeout() { - if (this.pingTimeoutTimer != null) { - this.pingTimeoutTimer.cancel(); + if (pingTimeoutTimer != null) { + pingTimeoutTimer.cancel(); } - this.pingTimeoutTimer = Timer( + pingTimeoutTimer = Timer( Duration( - milliseconds: this.server.pingInterval + this.server.pingTimeout), + milliseconds: server.pingInterval + server.pingTimeout), () { - this.onClose('ping timeout'); + onClose('ping timeout'); }); } @@ -175,9 +175,9 @@ class Socket extends EventEmitter { this.transport.on('drain', flush); this.transport.once('close', onClose); // this function will manage packet events (also message callbacks) - this.setupSendCallback(); + setupSendCallback(); - this.cleanupFn.add(() { + cleanupFn.add(() { transport.off('error', onError); transport.off('packet', onPacket); transport.off('drain', flush); @@ -195,11 +195,11 @@ class Socket extends EventEmitter { _logger.fine( 'might upgrade socket transport from ${this.transport.name} to ${transport.name}'); - this.upgrading = true; + upgrading = true; Map cleanupFn = {}; // set transport upgrade timer - this.upgradeTimeoutTimer = - Timer(Duration(milliseconds: this.server.upgradeTimeout), () { + upgradeTimeoutTimer = + Timer(Duration(milliseconds: server.upgradeTimeout), () { _logger.fine('client did not complete upgrade - closing transport'); cleanupFn['cleanup'](); if ('open' == transport.readyState) { @@ -222,23 +222,23 @@ class Socket extends EventEmitter { transport.send([ {'type': 'pong', 'data': 'probe'} ]); - this.emit('upgrading', transport); - if (this.checkIntervalTimer != null) { - this.checkIntervalTimer.cancel(); + emit('upgrading', transport); + if (checkIntervalTimer != null) { + checkIntervalTimer.cancel(); } - this.checkIntervalTimer = + checkIntervalTimer = Timer.periodic(Duration(milliseconds: 100), (_) => check()); - } else if ('upgrade' == packet['type'] && this.readyState != 'closed') { + } else if ('upgrade' == packet['type'] && readyState != 'closed') { _logger.fine('got upgrade packet - upgrading'); cleanupFn['cleanup'](); this.transport.discard(); - this.upgraded = true; - this.clearTransport(); - this.setTransport(transport); - this.emit('upgrade', transport); - this.setPingTimeout(); - this.flush(); - if (this.readyState == 'closing') { + upgraded = true; + clearTransport(); + setTransport(transport); + emit('upgrade', transport); + setPingTimeout(); + flush(); + if (readyState == 'closing') { transport.close(() { this.onClose('forced close'); }); @@ -265,24 +265,24 @@ class Socket extends EventEmitter { }; var cleanup = () { - this.upgrading = false; - this.checkIntervalTimer?.cancel(); - this.checkIntervalTimer = null; + upgrading = false; + checkIntervalTimer?.cancel(); + checkIntervalTimer = null; - this.upgradeTimeoutTimer?.cancel(); - this.upgradeTimeoutTimer = null; + upgradeTimeoutTimer?.cancel(); + upgradeTimeoutTimer = null; transport.off('packet', onPacket); transport.off('close', onTransportClose); transport.off('error', onError); - this.off('close', onClose); + off('close', onClose); }; cleanupFn['cleanup'] = cleanup; // define it later transport.on('packet', onPacket); transport.once('close', onTransportClose); transport.once('error', onError); - this.once('close', onClose); + once('close', onClose); } /** @@ -293,22 +293,22 @@ class Socket extends EventEmitter { clearTransport() { var cleanup; - var toCleanUp = this.cleanupFn.length; + var toCleanUp = cleanupFn.length; for (var i = 0; i < toCleanUp; i++) { - cleanup = this.cleanupFn.removeAt(0); + cleanup = cleanupFn.removeAt(0); cleanup(); } // silence further transport errors and prevent uncaught exceptions - this.transport.on('error', (_) { + transport.on('error', (_) { _logger.fine('error triggered by discarded transport'); }); // ensure transport won't stay open - this.transport.close(); + transport.close(); - this.pingTimeoutTimer?.cancel(); + pingTimeoutTimer?.cancel(); } /** @@ -317,22 +317,22 @@ class Socket extends EventEmitter { * `transport error`, `server close`, `transport close` */ onClose(reason, [description]) { - if ('closed' != this.readyState) { - this.readyState = 'closed'; - this.pingTimeoutTimer?.cancel(); - this.checkIntervalTimer?.cancel(); - this.checkIntervalTimer = null; - this.upgradeTimeoutTimer?.cancel(); + if ('closed' != readyState) { + readyState = 'closed'; + pingTimeoutTimer?.cancel(); + checkIntervalTimer?.cancel(); + checkIntervalTimer = null; + upgradeTimeoutTimer?.cancel(); // clean writeBuffer in next tick, so developers can still // grab the writeBuffer on 'close' event scheduleMicrotask(() { - this.writeBuffer = []; + writeBuffer = []; }); - this.packetsFn = []; - this.sentCallbackFn = []; - this.clearTransport(); - this.emit('close', [reason, description]); + packetsFn = []; + sentCallbackFn = []; + clearTransport(); + emit('close', [reason, description]); } } @@ -344,11 +344,11 @@ class Socket extends EventEmitter { setupSendCallback() { // the message was sent successfully, execute the callback var onDrain = (_) { - if (this.sentCallbackFn.isNotEmpty) { - var seqFn = this.sentCallbackFn[0]; + if (sentCallbackFn.isNotEmpty) { + var seqFn = sentCallbackFn[0]; if (seqFn is Function) { _logger.fine('executing send callback'); - seqFn(this.transport); + seqFn(transport); } /** else if (Array.isArray(seqFn)) { _logger.fine('executing batch send callback'); @@ -361,10 +361,10 @@ class Socket extends EventEmitter { } }; - this.transport.on('drain', onDrain); + transport.on('drain', onDrain); - this.cleanupFn.add(() { - this.transport.off('drain', onDrain); + cleanupFn.add(() { + transport.off('drain', onDrain); }); } @@ -379,7 +379,7 @@ class Socket extends EventEmitter { */ send(data, options, [callback]) => write(data, options, callback); write(data, options, [callback]) { - this.sendPacket('message', + sendPacket('message', data: data, options: options, callback: callback); return this; } @@ -396,21 +396,21 @@ class Socket extends EventEmitter { options = options ?? {}; options['compress'] = false != options['compress']; - if ('closing' != this.readyState && 'closed' != this.readyState) { + if ('closing' != readyState && 'closed' != readyState) { // _logger.fine('sending packet "%s" (%s)', type, data); var packet = {'type': type, 'options': options}; if (data != null) packet['data'] = data; // exports packetCreate event - this.emit('packetCreate', packet); + emit('packetCreate', packet); - this.writeBuffer.add(packet); + writeBuffer.add(packet); // add send callback to object, if defined - if (callback != null) this.packetsFn.add(callback); + if (callback != null) packetsFn.add(callback); - this.flush(); + flush(); } } @@ -420,23 +420,23 @@ class Socket extends EventEmitter { * @api private */ flush() { - if ('closed' != this.readyState && - this.transport.writable == true && - this.writeBuffer.length > 0) { + if ('closed' != readyState && + transport.writable == true && + writeBuffer.length > 0) { _logger.fine('flushing buffer to transport'); - this.emit('flush', this.writeBuffer); - this.server.emit('flush', [this, this.writeBuffer]); - var wbuf = this.writeBuffer; - this.writeBuffer = []; - if (this.transport.supportsFraming == false) { - this.sentCallbackFn.add((_) => this.packetsFn.forEach((f) => f(_))); + emit('flush', writeBuffer); + server.emit('flush', [this, writeBuffer]); + var wbuf = writeBuffer; + writeBuffer = []; + if (transport.supportsFraming == false) { + sentCallbackFn.add((_) => packetsFn.forEach((f) => f(_))); } else { - this.sentCallbackFn.addAll(this.packetsFn); + sentCallbackFn.addAll(packetsFn); } - this.packetsFn = []; - this.transport.send(wbuf); - this.emit('drain'); - this.server.emit('drain', this); + packetsFn = []; + transport.send(wbuf); + emit('drain'); + server.emit('drain', this); } } @@ -447,10 +447,10 @@ class Socket extends EventEmitter { */ getAvailableUpgrades() { var availableUpgrades = []; - var allUpgrades = this.server.upgrades(this.transport.name); + var allUpgrades = server.upgrades(transport.name); for (var i = 0, l = allUpgrades.length; i < l; ++i) { var upg = allUpgrades[i]; - if (this.server.transports.contains(upg)) { + if (server.transports.contains(upg)) { availableUpgrades.add(upg); } } @@ -466,15 +466,15 @@ class Socket extends EventEmitter { */ close([discard = false]) { - if ('open' != this.readyState) return; - this.readyState = 'closing'; + if ('open' != readyState) return; + readyState = 'closing'; - if (this.writeBuffer.isNotEmpty) { - this.once('drain', (_) => this.closeTransport(discard)); + if (writeBuffer.isNotEmpty) { + once('drain', (_) => closeTransport(discard)); return; } - this.closeTransport(discard); + closeTransport(discard); } /** @@ -484,7 +484,7 @@ class Socket extends EventEmitter { * @api private */ closeTransport(discard) { - if (discard == true) this.transport.discard(); - this.transport.close(() => this.onClose('forced close')); + if (discard == true) transport.discard(); + transport.close(() => onClose('forced close')); } } diff --git a/lib/src/engine/transport/jsonp_transport.dart b/lib/src/engine/transport/jsonp_transport.dart index ceaada7..08c1336 100644 --- a/lib/src/engine/transport/jsonp_transport.dart +++ b/lib/src/engine/transport/jsonp_transport.dart @@ -18,11 +18,11 @@ class JSONPTransport extends PollingTransport { String head; String foot; JSONPTransport(SocketConnect connect) : super(connect) { - this.head = '___eio[' + + head = '___eio[' + (connect.request.uri.queryParameters['j'] ?? '') .replaceAll(RegExp('[^0-9]'), '') + ']('; - this.foot = ');'; + foot = ');'; } /** @@ -62,7 +62,7 @@ class JSONPTransport extends PollingTransport { .replaceAll(RegExp(r'\u2029'), '\\u2029'); // prepare response - data = this.head + js + this.foot; + data = head + js + foot; super.doWrite(data, options, callback); } diff --git a/lib/src/engine/transport/polling_transport.dart b/lib/src/engine/transport/polling_transport.dart index eb93a1f..e09d606 100644 --- a/lib/src/engine/transport/polling_transport.dart +++ b/lib/src/engine/transport/polling_transport.dart @@ -30,19 +30,19 @@ class PollingTransport extends Transport { Function shouldClose; SocketConnect dataReq; PollingTransport(connect) : super(connect) { - this.closeTimeout = 30 * 1000; - this.maxHttpBufferSize = null; - this.httpCompression = null; - this.name = 'polling'; + closeTimeout = 30 * 1000; + maxHttpBufferSize = null; + httpCompression = null; + name = 'polling'; } onRequest(SocketConnect connect) { var res = connect.response; if ('GET' == connect.request.method) { - this.onPollRequest(connect); + onPollRequest(connect); } else if ('POST' == connect.request.method) { - this.onDataRequest(connect); + onDataRequest(connect); } else { res.statusCode = 500; res.close(); @@ -61,7 +61,7 @@ class PollingTransport extends Transport { if (this.connect != null) { _logger.fine('request overlap'); // assert: this.res, '.req and .res should be (un)set together' - this.onError('overlap from client'); + onError('overlap from client'); this.connect.response.statusCode = 500; this.connect.close(); return; @@ -72,7 +72,7 @@ class PollingTransport extends Transport { this.connect = connect; var onClose = () { - this.onError('poll connection closed prematurely'); + onError('poll connection closed prematurely'); }; var cleanup = () { @@ -83,13 +83,13 @@ class PollingTransport extends Transport { _reqCleanups[connect] = cleanup; _reqCloses[connect] = onClose; - this.writable = true; - this.emit('drain'); + writable = true; + emit('drain'); // if we're still writable but had a pending close, trigger an empty send - if (this.writable && this.shouldClose != null) { + if (writable && shouldClose != null) { _logger.fine('triggering empty send to append close packet'); - this.send([ + send([ {'type': 'noop'} ]); } @@ -101,9 +101,9 @@ class PollingTransport extends Transport { * @api private */ onDataRequest(SocketConnect connect) { - if (this.dataReq != null) { + if (dataReq != null) { // assert: this.dataRes, '.dataReq and .dataRes should be (un)set together' - this.onError('data request overlap from client'); + onError('data request overlap from client'); connect.response.statusCode = 500; connect.close(); return; @@ -112,7 +112,7 @@ class PollingTransport extends Transport { var isBinary = 'application/octet-stream' == connect.request.headers.value('content-type'); - this.dataReq = connect; + dataReq = connect; dynamic chunks = isBinary ? [0] : ''; var self = this; @@ -207,9 +207,9 @@ class PollingTransport extends Transport { * @api private */ onClose() { - if (this.writable == true) { + if (writable == true) { // close pending poll request - this.send([ + send([ {'type': 'noop'} ]); } @@ -223,17 +223,17 @@ class PollingTransport extends Transport { * @api private */ send(List packets) { - this.writable = false; + writable = false; - if (this.shouldClose != null) { + if (shouldClose != null) { _logger.fine('appending close packet to payload'); packets.add({'type': 'close'}); - this.shouldClose(); - this.shouldClose = null; + shouldClose(); + shouldClose = null; } var self = this; - PacketParser.encodePayload(packets, supportsBinary: this.supportsBinary, + PacketParser.encodePayload(packets, supportsBinary: supportsBinary, callback: (data) { var compress = packets.any((packet) { var opt = packet['options']; @@ -252,8 +252,8 @@ class PollingTransport extends Transport { */ write(data, [options]) { _logger.fine('writing "$data"'); - this.doWrite(data, options, () { - Function fn = _reqCleanups.remove(this.connect); + doWrite(data, options, () { + Function fn = _reqCleanups.remove(connect); if (fn != null) fn(); }); } @@ -280,7 +280,7 @@ class PollingTransport extends Transport { res.statusCode = 200; res.headers.clear(); // remove all default headers. - this.headers(this.connect, headers).forEach((k, v) { + this.headers(connect, headers).forEach((k, v) { res.headers.set(k, v); }); try { @@ -303,19 +303,19 @@ class PollingTransport extends Transport { callback(); }; - if (this.httpCompression == null || options['compress'] != true) { + if (httpCompression == null || options['compress'] != true) { respond(data); return; } var len = isString ? utf8.encode(data).length : data.length; - if (len < this.httpCompression['threshold']) { + if (len < httpCompression['threshold']) { respond(data); return; } var encodings = - this.connect.request.headers.value(HttpHeaders.acceptEncodingHeader); + connect.request.headers.value(HttpHeaders.acceptEncodingHeader); var hasGzip = encodings.contains('gzip'); if (!hasGzip && !encodings.contains('deflate')) { respond(data); @@ -348,9 +348,9 @@ class PollingTransport extends Transport { var self = this; Timer closeTimeoutTimer; - if (this.dataReq != null) { + if (dataReq != null) { _logger.fine('aborting ongoing data request'); - this.dataReq = null; + dataReq = null; } var onClose = () { @@ -358,20 +358,20 @@ class PollingTransport extends Transport { if (fn != null) fn(); self.onClose(); }; - if (this.writable == true) { + if (writable == true) { _logger.fine('transport writable - closing right away'); - this.send([ + send([ {'type': 'close'} ]); onClose(); - } else if (this.discarded) { + } else if (discarded) { _logger.fine('transport discarded - closing right away'); onClose(); } else { _logger.fine('transport not writable - buffering orderly close'); - this.shouldClose = onClose; + shouldClose = onClose; closeTimeoutTimer = - Timer(Duration(milliseconds: this.closeTimeout), onClose); + Timer(Duration(milliseconds: closeTimeout), onClose); } } @@ -393,7 +393,7 @@ class PollingTransport extends Transport { headers['X-XSS-Protection'] = '0'; } - this.emit('headers', headers); + emit('headers', headers); return headers; } } diff --git a/lib/src/engine/transport/transports.dart b/lib/src/engine/transport/transports.dart index 8ad818b..c1b554f 100644 --- a/lib/src/engine/transport/transports.dart +++ b/lib/src/engine/transport/transports.dart @@ -56,8 +56,8 @@ abstract class Transport extends EventEmitter { MessageHandler messageHandler; Transport(connect) { - this.readyState = 'open'; - this.discarded = false; + readyState = 'open'; + discarded = false; var options = connect.dataset['options']; if (options != null) { messageHandler = options.containsKey('messageHandlerFactory') @@ -67,7 +67,7 @@ abstract class Transport extends EventEmitter { } void discard() { - this.discarded = true; + discarded = true; } void onRequest(SocketConnect connect) { @@ -75,37 +75,37 @@ abstract class Transport extends EventEmitter { } void close([closeFn()]) { - if ('closed' == this.readyState || 'closing' == this.readyState) return; - this.readyState = 'closing'; - this.doClose(closeFn); + if ('closed' == readyState || 'closing' == readyState) return; + readyState = 'closing'; + doClose(closeFn); } void doClose([callback()]); void onError(msg, [desc]) { - this.writable = false; - if (this.hasListeners('error')) { - this.emit('error', {'msg': msg, 'desc': desc, 'type': 'TransportError'}); + writable = false; + if (hasListeners('error')) { + emit('error', {'msg': msg, 'desc': desc, 'type': 'TransportError'}); } else { _logger.fine('ignored transport error $msg ($desc)'); } } void onPacket(Map packet) { - this.emit('packet', packet); + emit('packet', packet); } onData(data) { if (messageHandler != null) { messageHandler.handle(this, data); } else { - this.onPacket(PacketParser.decodePacket(data)); + onPacket(PacketParser.decodePacket(data)); } } void onClose() { - this.readyState = 'closed'; - this.emit('close'); + readyState = 'closed'; + emit('close'); } void send(List data); diff --git a/lib/src/engine/transport/websocket_transport.dart b/lib/src/engine/transport/websocket_transport.dart index d870adc..7f27fbe 100644 --- a/lib/src/engine/transport/websocket_transport.dart +++ b/lib/src/engine/transport/websocket_transport.dart @@ -21,10 +21,10 @@ class WebSocketTransport extends Transport { bool get supportsFraming => true; StreamSubscription subscription; WebSocketTransport(connect) : super(connect) { - this.name = 'websocket'; + name = 'websocket'; this.connect = connect; subscription = connect.websocket - .listen(this.onData, onError: this.onError, onDone: this.onClose); + .listen(onData, onError: onError, onDone: onClose); writable = true; } @@ -46,7 +46,7 @@ class WebSocketTransport extends Transport { // } // this.writable = false; - this.connect.websocket.add(data); + connect.websocket.add(data); }; // function onEnd (err) { @@ -57,7 +57,7 @@ class WebSocketTransport extends Transport { for (var i = 0; i < packets.length; i++) { var packet = packets[i]; PacketParser.encodePacket(packet, - supportsBinary: this.supportsBinary, + supportsBinary: supportsBinary, callback: (_) => send(_, packet)); } } @@ -73,7 +73,7 @@ class WebSocketTransport extends Transport { } void doClose([fn]) { - this.connect.websocket.close(); + connect.websocket.close(); if (fn != null) fn(); } } diff --git a/lib/src/namespace.dart b/lib/src/namespace.dart index 7966ce0..cac0e35 100644 --- a/lib/src/namespace.dart +++ b/lib/src/namespace.dart @@ -53,7 +53,7 @@ class Namespace extends EventEmitter { * @api private */ Namespace(Server this.server, String this.name) { - this.initAdapter(); + initAdapter(); } /** @@ -64,7 +64,7 @@ class Namespace extends EventEmitter { * @api private */ initAdapter() { - this.adapter = Adapter.newInstance(this.server.adapter, this); + adapter = Adapter.newInstance(server.adapter, this); } /** @@ -74,7 +74,7 @@ class Namespace extends EventEmitter { * @api public */ use(fn) { - this.fns.add(fn); + fns.add(fn); return this; } @@ -124,8 +124,8 @@ class Namespace extends EventEmitter { * @api public */ to(String name) { - rooms = this.rooms?.isNotEmpty == true ? this.rooms : []; - if (!rooms.contains(name)) this.rooms.add(name); + rooms = rooms?.isNotEmpty == true ? rooms : []; + if (!rooms.contains(name)) rooms.add(name); return this; } @@ -136,10 +136,10 @@ class Namespace extends EventEmitter { * @api private */ add(Client client, query, fn) { - _logger.fine('adding socket to nsp ${this.name}'); + _logger.fine('adding socket to nsp ${name}'); var socket = Socket(this, client, query); var self = this; - this.run(socket, (err) { + run(socket, (err) { // don't use Timer.run() here scheduleMicrotask(() { if ('open' == client.conn.readyState) { @@ -172,8 +172,8 @@ class Namespace extends EventEmitter { * @api private */ remove(socket) { - if (this.sockets.contains(socket)) { - this.sockets.remove(socket); + if (sockets.contains(socket)) { + sockets.remove(socket); } else { _logger.fine('ignoring remove for ${socket.id}'); } @@ -196,12 +196,11 @@ class Namespace extends EventEmitter { Map packet = {'type': EVENT, 'data': data}; - this - .adapter - .broadcast(packet, {'rooms': this.rooms, 'flags': this.flags}); + adapter + .broadcast(packet, {'rooms': rooms, 'flags': flags}); - this.rooms = null; - this.flags = null; + rooms = null; + flags = null; } } @@ -216,7 +215,7 @@ class Namespace extends EventEmitter { } write([args]) { - this.emit('message', args); + emit('message', args); return this; } @@ -227,8 +226,8 @@ class Namespace extends EventEmitter { * @api public */ clients(fn([_])) { - this.adapter.clients(this.rooms, fn); - this.rooms = []; + adapter.clients(rooms, fn); + rooms = []; return this; } @@ -240,8 +239,8 @@ class Namespace extends EventEmitter { * @api public */ compress(compress) { - this.flags = this.flags.isEmpty ? this.flags : {}; - this.flags['compress'] = compress; + flags = flags.isEmpty ? flags : {}; + flags['compress'] = compress; return this; } } diff --git a/lib/src/server.dart b/lib/src/server.dart index c403e9a..9cc868b 100644 --- a/lib/src/server.dart +++ b/lib/src/server.dart @@ -54,16 +54,16 @@ class Server { */ Server({server: null, Map options}) { options = options ?? {}; - this.nsps = {}; - this.path(options.containsKey('path') ? options['path'] : '/socket.io'); - this.serveClient(false != options['serveClient']); - this.adapter = + nsps = {}; + path(options.containsKey('path') ? options['path'] : '/socket.io'); + serveClient(false != options['serveClient']); + adapter = options.containsKey('adapter') ? options['adapter'] : 'default'; - this.origins(options.containsKey('origins') ? options['origins'] : '*:*'); - this.encoder = Encoder(); - this.sockets = this.of('/'); + origins(options.containsKey('origins') ? options['origins'] : '*:*'); + encoder = Encoder(); + sockets = of('/'); if (server != null) { - this.attach(server, options); + attach(server, options); } } @@ -83,11 +83,11 @@ class Server { origin = '*'; } - if (!origin.isEmpty && this._origins is Function) { - return this._origins(origin, fn); + if (!origin.isEmpty && _origins is Function) { + return _origins(origin, fn); } - if (this._origins.contains('*:*')) { + if (_origins.contains('*:*')) { return fn(null, true); } @@ -97,9 +97,9 @@ class Server { int defaultPort = 'https:' == parts.scheme ? 443 : 80; int port = parts.port != null ? parts.port : defaultPort; bool ok = - this._origins.indexOf(parts.host + ':' + port.toString()) >= 0 || - this._origins.indexOf(parts.host + ':*') >= 0 || - this._origins.indexOf('*:' + port.toString()) >= 0; + _origins.indexOf(parts.host + ':' + port.toString()) >= 0 || + _origins.indexOf(parts.host + ':*') >= 0 || + _origins.indexOf('*:' + port.toString()) >= 0; return fn(null, ok); } catch (ex) {} @@ -117,10 +117,10 @@ class Server { */ serveClient([bool v]) { if (v == null) { - return this._serveClient; + return _serveClient; } - this._serveClient = v; + _serveClient = v; return this; } @@ -131,7 +131,7 @@ class Server { */ set(String key, [val]) { if ('authorization' == key && val != null) { - this.use((socket, next) { + use((socket, next) { val(socket.request, (err, authorized) { if (err) { return next(Exception(err)); @@ -145,11 +145,11 @@ class Server { }); }); } else if ('origins' == key && val != null) { - this.origins(val); + origins(val); } else if ('resource' == key) { - this.path(val); - } else if (oldSettings[key] && this.engine[oldSettings[key]]) { - this.engine[oldSettings[key]] = val; + path(val); + } else if (oldSettings[key] && engine[oldSettings[key]]) { + engine[oldSettings[key]] = val; } else { _logger.severe('Option $key is not valid. Please refer to the README.'); } @@ -165,8 +165,8 @@ class Server { * @api public */ path([String v]) { - if (v == null || v.isEmpty) return this._path; - this._path = v.replaceFirst(RegExp(r'/\/$/'), ''); + if (v == null || v.isEmpty) return _path; + _path = v.replaceFirst(RegExp(r'/\/$/'), ''); return this; } @@ -177,13 +177,13 @@ class Server { * @return {Server|Adapter} self when setting or value when getting * @api public */ - String get adapter => this._adapter; + String get adapter => _adapter; void set adapter(String v) { - this._adapter = v; + _adapter = v; if (nsps.isNotEmpty) { - this.nsps.forEach((dynamic i, Namespace nsp) { - this.nsps[i].initAdapter(); + nsps.forEach((dynamic i, Namespace nsp) { + nsps[i].initAdapter(); }); } } @@ -197,9 +197,9 @@ class Server { */ origins([String v]) { - if (v == null || v.isEmpty) return this._origins; + if (v == null || v.isEmpty) return _origins; - this._origins = v; + _origins = v; return this; } @@ -239,10 +239,10 @@ class Server { } // set engine.io path to `/socket.io` if (!opts.containsKey('path')) { - opts['path'] = this.path(); + opts['path'] = path(); } // set origins verification - opts['allowRequest'] = this.checkRequest; + opts['allowRequest'] = checkRequest; if (srv is num) { _logger.fine('creating http server and binding to $srv'); @@ -259,44 +259,44 @@ class Server { //// }); var connectPacket = {'type': CONNECT, 'nsp': '/'}; - this.encoder.encode(connectPacket, (encodedPacket) { + encoder.encode(connectPacket, (encodedPacket) { // the CONNECT packet will be merged with Engine.IO handshake, // to reduce the number of round trips opts['initialPacket'] = encodedPacket; _logger.fine('creating engine.io instance with opts $opts'); // initialize engine - this.engine = Engine.attach(server, opts); + engine = Engine.attach(server, opts); // attach static file serving // if (self._serveClient) self.attachServe(srv); // Export http server - this.httpServer = server; + httpServer = server; // bind to engine events - this.bind(this.engine); + bind(engine); }); // }); } else { var connectPacket = {'type': CONNECT, 'nsp': '/'}; - this.encoder.encode(connectPacket, (encodedPacket) { + encoder.encode(connectPacket, (encodedPacket) { // the CONNECT packet will be merged with Engine.IO handshake, // to reduce the number of round trips opts['initialPacket'] = encodedPacket; _logger.fine('creating engine.io instance with opts $opts'); // initialize engine - this.engine = Engine.attach(srv, opts); + engine = Engine.attach(srv, opts); // attach static file serving // if (self._serveClient) self.attachServe(srv); // Export http server - this.httpServer = srv; + httpServer = srv; // bind to engine events - this.bind(this.engine); + bind(engine); }); } @@ -363,7 +363,7 @@ class Server { */ bind(engine) { this.engine = engine; - this.engine.on('connection', this.onconnection); + this.engine.on('connection', onconnection); return this; } @@ -394,13 +394,13 @@ class Server { name = '/' + name; } - if (!this.nsps.containsKey(name)) { + if (!nsps.containsKey(name)) { _logger.fine('initializing namespace $name'); Namespace nsp = Namespace(this, name); - this.nsps[name] = nsp; + nsps[name] = nsp; } - if (fn != null) this.nsps[name].on('connect', fn); - return this.nsps[name]; + if (fn != null) nsps[name].on('connect', fn); + return nsps[name]; } /** @@ -409,14 +409,14 @@ class Server { * @api public */ close() { - this.nsps['/'].sockets.forEach((socket) { + nsps['/'].sockets.forEach((socket) { socket.onclose(); }); - this.engine.close(); + engine.close(); - if (this.httpServer != null) { - this.httpServer.stop(); + if (httpServer != null) { + httpServer.stop(); } } diff --git a/lib/src/socket.dart b/lib/src/socket.dart index d3bc9de..a24efaf 100644 --- a/lib/src/socket.dart +++ b/lib/src/socket.dart @@ -74,12 +74,12 @@ class Socket extends EventEmitter { Map data = {}; Socket(this.nsp, this.client, query) { - this.server = nsp.server; - this.adapter = this.nsp.adapter; - this.id = client.id; - this.request = client.request; - this.conn = client.conn; - this.handshake = this.buildHandshake(query); + server = nsp.server; + adapter = nsp.adapter; + id = client.id; + request = client.request; + conn = client.conn; + handshake = buildHandshake(query); } /** @@ -89,39 +89,39 @@ class Socket extends EventEmitter { */ buildHandshake(query) { final buildQuery = () { - var requestQuery = this.request.uri.queryParameters; + var requestQuery = request.uri.queryParameters; //if socket-specific query exist, replace query strings in requestQuery return query != null ? (Map.from(query)..addAll(requestQuery)) : requestQuery; }; return { - 'headers': this.request.headers, + 'headers': request.headers, 'time': DateTime.now().toString(), - 'address': this.conn.remoteAddress, - 'xdomain': this.request.headers.value('origin') != null, + 'address': conn.remoteAddress, + 'xdomain': request.headers.value('origin') != null, // TODO 'secure': ! !this.request.connectionInfo.encrypted, 'issued': DateTime.now().millisecondsSinceEpoch, - 'url': this.request.uri.path, + 'url': request.uri.path, 'query': buildQuery() }; } Socket get json { - this.flags = this.flags ?? {}; - this.flags['json'] = true; + flags = flags ?? {}; + flags['json'] = true; return this; } Socket get volatile { - this.flags = this.flags ?? {}; - this.flags['volatile'] = true; + flags = flags ?? {}; + flags['volatile'] = true; return this; } Socket get broadcast { - this.flags = this.flags ?? {}; - this.flags['broadcast'] = true; + flags = flags ?? {}; + flags['broadcast'] = true; return this; } @@ -150,22 +150,22 @@ class Socket extends EventEmitter { var flags = this.flags ?? {}; if (ack != null) { - if (this.roomList.isNotEmpty || flags['broadcast'] == true) { + if (roomList.isNotEmpty || flags['broadcast'] == true) { throw UnsupportedError( 'Callbacks are not supported when broadcasting'); } - this.acks['${this.nsp.ids}'] = ack; - packet['id'] = '${this.nsp.ids++}'; + acks['${nsp.ids}'] = ack; + packet['id'] = '${nsp.ids++}'; } packet['type'] = binary ? BINARY_EVENT : EVENT; packet['data'] = sendData; - if (this.roomList.isNotEmpty || flags['broadcast'] == true) { - this.adapter.broadcast(packet, { - 'except': [this.id], - 'rooms': this.roomList, + if (roomList.isNotEmpty || flags['broadcast'] == true) { + adapter.broadcast(packet, { + 'except': [id], + 'rooms': roomList, 'flags': flags }); } else { @@ -175,7 +175,7 @@ class Socket extends EventEmitter { } // // reset flags - this.roomList = []; + roomList = []; this.flags = null; // } // return this; @@ -190,7 +190,7 @@ class Socket extends EventEmitter { * @api public */ to(String name) { - if (!this.roomList.contains(name)) this.roomList.add(name); + if (!roomList.contains(name)) roomList.add(name); return this; } @@ -201,11 +201,11 @@ class Socket extends EventEmitter { * @api public */ send(_) { - this.write(_); + write(_); } write(List data) { - this.emit('message', data); + emit('message', data); return this; } @@ -219,11 +219,11 @@ class Socket extends EventEmitter { packet(packet, [opts]) { // ignore preEncoded = true. if (packet is Map) { - packet['nsp'] = this.nsp.name; + packet['nsp'] = nsp.name; } opts = opts ?? {}; opts['compress'] = false != opts['compress']; - this.client.packet(packet, opts); + client.packet(packet, opts); } /** @@ -236,14 +236,14 @@ class Socket extends EventEmitter { */ join(room, [fn]) { // debug('joining room %s', room); - if (this.roomMap.containsKey(room)) { + if (roomMap.containsKey(room)) { if (fn != null) fn(null); return this; } - this.adapter.add(this.id, room, ([err]) { + adapter.add(id, room, ([err]) { if (err != null) return fn?.call(err); // _logger.info('joined room %s', room); - this.roomMap[room] = room; + roomMap[room] = room; if (fn != null) fn(null); }); return this; @@ -259,10 +259,10 @@ class Socket extends EventEmitter { */ leave(room, fn) { // debug('leave room %s', room); - this.adapter.del(this.id, room, ([err]) { + adapter.del(id, room, ([err]) { if (err != null) return fn?.call(err); // _logger.info('left room %s', room); - this.roomMap.remove(room); + roomMap.remove(room); fn?.call(null); }); return this; @@ -275,8 +275,8 @@ class Socket extends EventEmitter { */ leaveAll() { - this.adapter.delAll(this.id); - this.roomMap = {}; + adapter.delAll(id); + roomMap = {}; } /** @@ -288,9 +288,9 @@ class Socket extends EventEmitter { onconnect() { // debug('socket connected - writing packet'); - this.nsp.connected[this.id] = this; - this.join(this.id); - this.packet({'type': CONNECT}); + nsp.connected[id] = this; + join(id); + packet({'type': CONNECT}); } /** @@ -304,27 +304,27 @@ class Socket extends EventEmitter { // debug('got packet %j', packet); switch (packet['type']) { case EVENT: - this.onevent(packet); + onevent(packet); break; case BINARY_EVENT: - this.onevent(packet); + onevent(packet); break; case ACK: - this.onack(packet); + onack(packet); break; case BINARY_ACK: - this.onack(packet); + onack(packet); break; case DISCONNECT: - this.ondisconnect(); + ondisconnect(); break; case ERROR: - this.emit('error', packet['data']); + emit('error', packet['data']); } } @@ -340,7 +340,7 @@ class Socket extends EventEmitter { if (null != packet['id']) { // debug('attaching ack callback to event'); - args.add(this.ack(packet['id'])); + args.add(ack(packet['id'])); } // dart doesn't support "String... rest" syntax. @@ -381,7 +381,7 @@ class Socket extends EventEmitter { * @api private */ onack(packet) { - Function ack = this.acks.remove(packet['id']); + Function ack = acks.remove(packet['id']); if (ack is Function) { // debug('calling ack %s with %j', packet.id, packet.data); Function.apply(ack, packet['data']); @@ -397,7 +397,7 @@ class Socket extends EventEmitter { */ ondisconnect() { // debug('got disconnect packet'); - this.onclose('client namespace disconnect'); + onclose('client namespace disconnect'); } /** @@ -406,8 +406,8 @@ class Socket extends EventEmitter { * @api private */ onerror(err) { - if (this.hasListeners('error')) { - this.emit('error', err); + if (hasListeners('error')) { + emit('error', err); } else { // console.error('Missing error handler on `socket`.'); // console.error(err.stack); @@ -422,16 +422,16 @@ class Socket extends EventEmitter { * @api private */ onclose([reason]) { - if (!this.connected) return this; + if (!connected) return this; // debug('closing socket - reason %s', reason); - this.emit('disconnecting', reason); - this.leaveAll(); - this.nsp.remove(this); - this.client.remove(this); - this.connected = false; - this.disconnected = true; - this.nsp.connected.remove(this.id); - this.emit('disconnect', reason); + emit('disconnecting', reason); + leaveAll(); + nsp.remove(this); + client.remove(this); + connected = false; + disconnected = true; + nsp.connected.remove(id); + emit('disconnect', reason); } /** @@ -441,7 +441,7 @@ class Socket extends EventEmitter { * @api private */ error(err) { - this.packet({'type': ERROR, 'data': err}); + packet({'type': ERROR, 'data': err}); } /** @@ -453,12 +453,12 @@ class Socket extends EventEmitter { */ disconnect([close]) { - if (!this.connected) return this; + if (!connected) return this; if (close == true) { - this.client.disconnect(); + client.disconnect(); } else { - this.packet({'type': DISCONNECT}); - this.onclose('server namespace disconnect'); + packet({'type': DISCONNECT}); + onclose('server namespace disconnect'); } return this; } @@ -471,8 +471,8 @@ class Socket extends EventEmitter { * @api public */ compress(compress) { - this.flags = this.flags ?? {}; - this.flags['compress'] = compress; + flags = flags ?? {}; + flags['compress'] = compress; return this; } } diff --git a/lib/src/util/event_emitter.dart b/lib/src/util/event_emitter.dart index 3648d83..ee1ea2d 100644 --- a/lib/src/util/event_emitter.dart +++ b/lib/src/util/event_emitter.dart @@ -35,8 +35,8 @@ class EventEmitter { * Constructor */ EventEmitter() { - this._events = HashMap>(); - this._eventsOnce = HashMap>(); + _events = HashMap>(); + _eventsOnce = HashMap>(); } /** @@ -44,7 +44,7 @@ class EventEmitter { * to [event] and passes them [data]. */ void emit(String event, [dynamic data]) { - final list0 = this._events[event]; + final list0 = _events[event]; // todo: try to optimize this. Maybe remember the off() handlers and remove later? // handler might be off() inside handler; make a copy first final list = list0 != null ? List.from(list0) : null; @@ -52,7 +52,7 @@ class EventEmitter { handler(data); }); - this._eventsOnce.remove(event)?.forEach((EventHandler handler) { + _eventsOnce.remove(event)?.forEach((EventHandler handler) { handler(data); }); } @@ -61,8 +61,8 @@ class EventEmitter { * This function binds the [handler] as a listener to the [event] */ void on(String event, EventHandler handler) { - this._events.putIfAbsent(event, () => List()); - this._events[event].add(handler); + _events.putIfAbsent(event, () => List()); + _events[event].add(handler); } /** @@ -71,8 +71,8 @@ class EventEmitter { * it is removed. */ void once(String event, EventHandler handler) { - this._eventsOnce.putIfAbsent(event, () => List()); - this._eventsOnce[event].add(handler); + _eventsOnce.putIfAbsent(event, () => List()); + _eventsOnce[event].add(handler); } /** @@ -80,17 +80,17 @@ class EventEmitter { */ void off(String event, [EventHandler handler]) { if (handler != null) { - this._events[event]?.remove(handler); - this._eventsOnce[event]?.remove(handler); - if (this._events[event]?.isEmpty == true) { - this._events.remove(event); + _events[event]?.remove(handler); + _eventsOnce[event]?.remove(handler); + if (_events[event]?.isEmpty == true) { + _events.remove(event); } - if (this._eventsOnce[event]?.isEmpty == true) { - this._eventsOnce.remove(event); + if (_eventsOnce[event]?.isEmpty == true) { + _eventsOnce.remove(event); } } else { - this._events.remove(event); - this._eventsOnce.remove(event); + _events.remove(event); + _eventsOnce.remove(event); } } @@ -98,15 +98,15 @@ class EventEmitter { * This function unbinds all the handlers for all the events. */ void clearListeners() { - this._events = HashMap>(); - this._eventsOnce = HashMap>(); + _events = HashMap>(); + _eventsOnce = HashMap>(); } /** * Returns whether the event has registered. */ bool hasListeners(String event) { - return this._events[event]?.isNotEmpty == true || - this._eventsOnce[event]?.isNotEmpty == true; + return _events[event]?.isNotEmpty == true || + _eventsOnce[event]?.isNotEmpty == true; } } From 9805c450b9d4c526657b0c92d7bc66fd46debbad Mon Sep 17 00:00:00 2001 From: Guilherme Caldas Date: Sun, 22 Dec 2019 02:36:30 -0300 Subject: [PATCH 04/20] Convert documentation to line documentation comments Following the guideline in: https://dart.dev/guides/language/effective-dart/documentation#do-use--doc-comments-to-document-members-and-types --- lib/src/adapter/adapter.dart | 113 ++++----- lib/src/client.dart | 110 ++++----- lib/src/engine/connect.dart | 4 +- lib/src/engine/engine.dart | 10 +- lib/src/engine/server.dart | 138 +++++------ lib/src/engine/socket.dart | 156 +++++-------- lib/src/engine/transport/jsonp_transport.dart | 18 +- .../engine/transport/polling_transport.dart | 84 +++---- lib/src/engine/transport/xhr_transport.dart | 22 +- lib/src/namespace.dart | 126 ++++------- lib/src/server.dart | 154 ++++++------- lib/src/socket.dart | 214 +++++++----------- lib/src/util/event_emitter.dart | 50 ++-- 13 files changed, 476 insertions(+), 723 deletions(-) diff --git a/lib/src/adapter/adapter.dart b/lib/src/adapter/adapter.dart index 3077df0..1d258a1 100644 --- a/lib/src/adapter/adapter.dart +++ b/lib/src/adapter/adapter.dart @@ -48,14 +48,12 @@ class _MemoryStoreAdapter extends EventEmitter implements Adapter { encoder = nsp.server.encoder; } - /** - * Adds a socket to a room. - * - * @param {String} socket id - * @param {String} room name - * @param {Function} callback - * @api public - */ + /// Adds a socket to a room. + /// + /// @param {String} socket id + /// @param {String} room name + /// @param {Function} callback + /// @api public add(String id, String room, [fn([_])]) { sids[id] = sids[id] ?? {}; @@ -65,14 +63,12 @@ class _MemoryStoreAdapter extends EventEmitter implements Adapter { if (fn != null) scheduleMicrotask(() => fn(null)); } - /** - * Removes a socket from a room. - * - * @param {String} socket id - * @param {String} room name - * @param {Function} callback - * @api public - */ + /// Removes a socket from a room. + /// + /// @param {String} socket id + /// @param {String} room name + /// @param {Function} callback + /// @api public del(String id, String room, [fn([_])]) { sids[id] = sids[id] ?? {}; sids[id].remove(room); @@ -84,13 +80,11 @@ class _MemoryStoreAdapter extends EventEmitter implements Adapter { if (fn != null) scheduleMicrotask(() => fn(null)); } - /** - * Removes a socket from all rooms it's joined. - * - * @param {String} socket id - * @param {Function} callback - * @api public - */ + /// Removes a socket from all rooms it's joined. + /// + /// @param {String} socket id + /// @param {Function} callback + /// @api public delAll(String id, [fn([_])]) { var rooms = sids[id]; if (rooms != null) { @@ -106,17 +100,15 @@ class _MemoryStoreAdapter extends EventEmitter implements Adapter { if (fn != null) scheduleMicrotask(() => fn(null)); } - /** - * Broadcasts a packet. - * - * Options: - * - `flags` {Object} flags for this packet - * - `except` {Array} sids that should be excluded - * - `rooms` {Array} list of rooms to broadcast to - * - * @param {Object} packet object - * @api public - */ + /// Broadcasts a packet. + /// + /// Options: + /// - `flags` {Object} flags for this packet + /// - `except` {Array} sids that should be excluded + /// - `rooms` {Array} list of rooms to broadcast to + /// + /// @param {Object} packet object + /// @api public broadcast(Map packet, [Map opts]) { opts = opts ?? {}; List rooms = opts['rooms'] ?? []; @@ -158,13 +150,11 @@ class _MemoryStoreAdapter extends EventEmitter implements Adapter { }); } - /** - * Gets a list of clients by sid. - * - * @param {Array} explicit set of rooms to check. - * @param {Function} callback - * @api public - */ + /// Gets a list of clients by sid. + /// + /// @param {Array} explicit set of rooms to check. + /// @param {Function} callback + /// @api public clients(List rooms, [fn([_])]) { rooms = rooms ?? []; @@ -198,24 +188,21 @@ class _MemoryStoreAdapter extends EventEmitter implements Adapter { if (fn != null) scheduleMicrotask(() => fn(sids)); } - /** - * Gets the list of rooms a given client has joined. - * - * @param {String} socket id - * @param {Function} callback - * @api public - */ + /// Gets the list of rooms a given client has joined. + /// + /// @param {String} socket id + /// @param {Function} callback + /// @api public clientRooms(String id, [fn(err, [_])]) { var rooms = sids[id]; if (fn != null) scheduleMicrotask(() => fn(null, rooms?.keys)); } } -/** - * Room constructor. - * - * @api private - */ + +/// Room constructor. +/// +/// @api private class _Room { Map sockets; int length; @@ -224,12 +211,10 @@ class _Room { length = 0; } - /** - * Adds a socket to a room. - * - * @param {String} socket id - * @api private - */ + /// Adds a socket to a room. + /// + /// @param {String} socket id + /// @api private add(String id) { if (!sockets.containsKey(id)) { sockets[id] = true; @@ -237,12 +222,10 @@ class _Room { } } - /** - * Removes a socket from a room. - * - * @param {String} socket id - * @api private - */ + /// Removes a socket from a room. + /// + /// @param {String} socket id + /// @api private del(String id) { if (sockets.containsKey(id)) { sockets.remove(id); diff --git a/lib/src/client.dart b/lib/src/client.dart index e0745ec..75011b4 100644 --- a/lib/src/client.dart +++ b/lib/src/client.dart @@ -28,13 +28,11 @@ class Client { List connectBuffer = []; Logger _logger = Logger('socket_io:Client'); - /** - * Client constructor. - * - * @param {Server} server instance - * @param {Socket} connection - * @api private - */ + /// Client constructor. + /// + /// @param {Server} server instance + /// @param {Socket} connection + /// @api private Client(Server this.server, Socket this.conn) { encoder = Encoder(); decoder = Decoder(); @@ -43,11 +41,9 @@ class Client { setup(); } - /** - * Sets up event listeners. - * - * @api private - */ + /// Sets up event listeners. + /// + /// @api private setup() { decoder.on('decoded', ondecoded); conn.on('data', ondata); @@ -55,12 +51,10 @@ class Client { conn.on('close', onclose); } - /** - * Connects a client to a namespace. - * - * @param {String} namespace name - * @api private - */ + /// Connects a client to a namespace. + /// + /// @param {String} namespace name + /// @api private connect(name, [query]) { _logger.fine('connecting to namespace $name'); if (!server.nsps.containsKey(name)) { @@ -85,11 +79,9 @@ class Client { }); } - /** - * Disconnects from all namespaces and closes transport. - * - * @api private - */ + /// Disconnects from all namespaces and closes transport. + /// + /// @api private disconnect() { // we don't use a for loop because the length of // `sockets` changes upon each iteration @@ -101,11 +93,9 @@ class Client { close(); } - /** - * Removes a socket. Called by each `Socket`. - * - * @api private - */ + /// Removes a socket. Called by each `Socket`. + /// + /// @api private remove(socket) { var i = sockets.indexOf(socket); if (i >= 0) { @@ -117,11 +107,9 @@ class Client { } } - /** - * Closes the underlying connection. - * - * @api private - */ + /// Closes the underlying connection. + /// + /// @api private close() { if ('open' == conn.readyState) { _logger.fine('forcing transport close'); @@ -130,13 +118,11 @@ class Client { } } - /** - * Writes a packet to the transport. - * - * @param {Object} packet object - * @param {Object} options - * @api private - */ + /// Writes a packet to the transport. + /// + /// @param {Object} packet object + /// @param {Object} options + /// @api private packet(packet, [Map opts]) { var self = this; opts = opts ?? {}; @@ -165,11 +151,9 @@ class Client { } } - /** - * Called with incoming transport data. - * - * @api private - */ + /// Called with incoming transport data. + /// + /// @api private ondata(data) { // try/catch is needed for protocol violations (GH-1880) try { @@ -180,11 +164,9 @@ class Client { } } - /** - * Called when parser fully decodes a packet. - * - * @api private - */ + /// Called when parser fully decodes a packet. + /// + /// @api private ondecoded(packet) { if (CONNECT == packet['type']) { final nsp = packet['nsp']; @@ -200,12 +182,10 @@ class Client { } } - /** - * Handles an error. - * - * @param {Objcet} error object - * @api private - */ + /// Handles an error. + /// + /// @param {Objcet} error object + /// @api private onerror(err) { sockets.forEach((socket) { socket.onerror(err); @@ -213,12 +193,10 @@ class Client { onclose('client error'); } - /** - * Called upon transport close. - * - * @param {String} reason - * @api private - */ + /// Called upon transport close. + /// + /// @param {String} reason + /// @api private onclose(reason) { _logger.fine('client close with reason $reason'); @@ -235,11 +213,9 @@ class Client { decoder.destroy(); // clean up decoder } - /** - * Cleans up event listeners. - * - * @api private - */ + /// Cleans up event listeners. + /// + /// @api private destroy() { conn.off('data', ondata); conn.off('error', onerror); diff --git a/lib/src/engine/connect.dart b/lib/src/engine/connect.dart index 13e93c8..ca152f7 100644 --- a/lib/src/engine/connect.dart +++ b/lib/src/engine/connect.dart @@ -41,9 +41,7 @@ class SocketConnect extends HttpConnectWrapper { } } - /** - * Closes the current connection. - */ + /// Closes the current connection. void close() { if (_done != null) { _done.complete('done'); diff --git a/lib/src/engine/engine.dart b/lib/src/engine/engine.dart index 242b87f..32f2cd0 100644 --- a/lib/src/engine/engine.dart +++ b/lib/src/engine/engine.dart @@ -22,12 +22,10 @@ class Engine extends EventEmitter { dynamic operator [](Object key) {} - /** - * Associates the [key] with the given [value]. - * - * If the key was already in the map, its associated value is changed. - * Otherwise the key-value pair is added to the map. - */ + /// Associates the [key] with the given [value]. + /// + /// If the key was already in the map, its associated value is changed. + /// Otherwise the key-value pair is added to the map. void operator []=(String key, dynamic value) {} // init() {} // upgrades() {} diff --git a/lib/src/engine/server.dart b/lib/src/engine/server.dart index 5557bcc..d64b0e1 100644 --- a/lib/src/engine/server.dart +++ b/lib/src/engine/server.dart @@ -20,12 +20,10 @@ import 'package:socket_io/src/engine/transport/transports.dart'; import 'package:stream/stream.dart'; import 'package:uuid/uuid.dart'; -/** - * Server constructor. - * - * @param {Object} options - * @api public - */ +/// Server constructor. +/// +/// @param {Object} options +/// @api public class ServerErrors { static const int UNKNOWN_TRANSPORT = 0; static const int UNKNOWN_SID = 1; @@ -99,11 +97,9 @@ class Server extends Engine { _init(); } - /** - * Initialize websocket server - * - * @api private - */ + /// Initialize websocket server + /// + /// @api private _init() { // if (this.transports.indexOf('websocket') == -1) return; @@ -126,25 +122,21 @@ class Server extends Engine { // }); } - /** - * Returns a list of available transports for upgrade given a certain transport. - * - * @return {Array} - * @api public - */ + /// Returns a list of available transports for upgrade given a certain transport. + /// + /// @return {Array} + /// @api public List upgrades(transport) { if (!allowUpgrades) return null; return Transports.upgradesTo(transport); } - /** - * Verifies a request. - * - * @param {http.IncomingMessage} - * @return {Boolean} whether the request is valid - * @api private - */ + /// Verifies a request. + /// + /// @param {http.IncomingMessage} + /// @return {Boolean} whether the request is valid + /// @api private verify(SocketConnect connect, bool upgrade, fn) { // transport check @@ -176,11 +168,9 @@ class Server extends Engine { fn(null, true); } - /** - * Closes all clients. - * - * @api public - */ + /// Closes all clients. + /// + /// @api public close() { _logger.fine('closing all open clients'); @@ -196,13 +186,11 @@ class Server extends Engine { // } } - /** - * Handles an Engine.IO HTTP request. - * - * @param {http.IncomingMessage} request - * @param {http.ServerResponse|http.OutgoingMessage} response - * @api public - */ + /// Handles an Engine.IO HTTP request. + /// + /// @param {http.IncomingMessage} request + /// @param {http.ServerResponse|http.OutgoingMessage} response + /// @api public handleRequest(SocketConnect connect) { var req = connect.request; @@ -227,13 +215,11 @@ class Server extends Engine { }); } - /** - * Sends an Engine.IO Error Message - * - * @param {http.ServerResponse} response - * @param {code} error code - * @api private - */ + /// Sends an Engine.IO Error Message + /// + /// @param {http.ServerResponse} response + /// @param {code} error code + /// @api private static sendErrorMessage(HttpRequest req, code) { var res = req.response; @@ -259,24 +245,20 @@ class Server extends Engine { json.encode({'code': code, 'message': ServerErrorMessages[code]})); } - /** - * generate a socket id. - * Overwrite this method to generate your custom socket id - * - * @param {Object} request object - * @api public - */ + /// generate a socket id. + /// Overwrite this method to generate your custom socket id + /// + /// @param {Object} request object + /// @api public generateId(SocketConnect connect) { return _uuid.v1().replaceAll('-', ''); } - /** - * Handshakes a new client. - * - * @param {String} transport name - * @param {Object} request object - * @api private - */ + /// Handshakes a new client. + /// + /// @param {String} transport name + /// @param {Object} request object + /// @api private handshake(String transportName, SocketConnect connect) { var id = generateId(connect); @@ -328,11 +310,9 @@ class Server extends Engine { emit('connection', socket); } - /** - * Handles an Engine.IO HTTP Upgrade. - * - * @api public - */ + /// Handles an Engine.IO HTTP Upgrade. + /// + /// @api public handleUpgrade(SocketConnect connect) { // this.prepare(req); @@ -353,12 +333,10 @@ class Server extends Engine { }); } - /** - * Called upon a ws.io connection. - * - * @param {ws.Socket} websocket - * @api private - */ + /// Called upon a ws.io connection. + /// + /// @param {ws.Socket} websocket + /// @api private onWebSocket(SocketConnect connect) { // socket.listen((_) {}, @@ -408,13 +386,11 @@ class Server extends Engine { } } - /** - * Captures upgrade requests for a http.Server. - * - * @param {http.Server} server - * @param {Object} options - * @api public - */ + /// Captures upgrade requests for a http.Server. + /// + /// @param {http.Server} server + /// @param {Object} options + /// @api public attachTo(StreamServer server, Map options) { options = options ?? {}; var path = @@ -445,13 +421,11 @@ class Server extends Engine { }, preceding: true); } - /** - * Closes the connection - * - * @param {net.Socket} socket - * @param {code} error code - * @api private - */ + /// Closes the connection + /// + /// @param {net.Socket} socket + /// @param {code} error code + /// @api private static abortConnection(SocketConnect connect, code) { var socket = connect.websocket; diff --git a/lib/src/engine/socket.dart b/lib/src/engine/socket.dart index da649c6..94e9540 100644 --- a/lib/src/engine/socket.dart +++ b/lib/src/engine/socket.dart @@ -19,11 +19,9 @@ import 'package:socket_io/src/engine/server.dart'; import 'package:socket_io/src/engine/transport/transports.dart'; import 'package:socket_io/src/util/event_emitter.dart'; -/** - * Client class (abstract). - * - * @api private - */ +/// Client class (abstract). +/// +/// @api private class Socket extends EventEmitter { static final Logger _logger = Logger("socket_io:engine.Socket"); String id; @@ -62,11 +60,9 @@ class Socket extends EventEmitter { onOpen(); } - /** - * Called upon transport considered open. - * - * @api private - */ + /// Called upon transport considered open. + /// + /// @api private onOpen() { readyState = 'open'; @@ -89,12 +85,10 @@ class Socket extends EventEmitter { setPingTimeout(); } - /** - * Called upon transport packet. - * - * @param {Object} packet - * @api private - */ + /// Called upon transport packet. + /// + /// @param {Object} packet + /// @api private onPacket(packet) { if ('open' == readyState) { @@ -127,22 +121,18 @@ class Socket extends EventEmitter { } } - /** - * Called upon transport error. - * - * @param {Error} error object - * @api private - */ + /// Called upon transport error. + /// + /// @param {Error} error object + /// @api private onError(err) { _logger.fine('transport error'); onClose('transport error', err); } - /** - * Sets and resets ping timeout timer based on client pings. - * - * @api private - */ + /// Sets and resets ping timeout timer based on client pings. + /// + /// @api private setPingTimeout() { if (pingTimeoutTimer != null) { pingTimeoutTimer.cancel(); @@ -155,12 +145,10 @@ class Socket extends EventEmitter { }); } - /** - * Attaches handlers for the given transport. - * - * @param {Transport} transport - * @api private - */ + /// Attaches handlers for the given transport. + /// + /// @param {Transport} transport + /// @api private setTransport(Transport transport) { var onError = this.onError; var onPacket = this.onPacket; @@ -185,12 +173,10 @@ class Socket extends EventEmitter { }); } - /** - * Upgrades socket to the given transport - * - * @param {Transport} transport - * @api private - */ + /// Upgrades socket to the given transport + /// + /// @param {Transport} transport + /// @api private maybeUpgrade(transport) { _logger.fine( 'might upgrade socket transport from ${this.transport.name} to ${transport.name}'); @@ -285,11 +271,9 @@ class Socket extends EventEmitter { once('close', onClose); } - /** - * Clears listeners and timers associated with current transport. - * - * @api private - */ + /// Clears listeners and timers associated with current transport. + /// + /// @api private clearTransport() { var cleanup; @@ -311,11 +295,9 @@ class Socket extends EventEmitter { pingTimeoutTimer?.cancel(); } - /** - * Called upon transport considered closed. - * Possible reasons: `ping timeout`, `client error`, `parse error`, - * `transport error`, `server close`, `transport close` - */ + /// Called upon transport considered closed. + /// Possible reasons: `ping timeout`, `client error`, `parse error`, + /// `transport error`, `server close`, `transport close` onClose(reason, [description]) { if ('closed' != readyState) { readyState = 'closed'; @@ -336,11 +318,9 @@ class Socket extends EventEmitter { } } - /** - * Setup and manage send callback - * - * @api private - */ + /// Setup and manage send callback + /// + /// @api private setupSendCallback() { // the message was sent successfully, execute the callback var onDrain = (_) { @@ -368,15 +348,13 @@ class Socket extends EventEmitter { }); } - /** - * Sends a message packet. - * - * @param {String} message - * @param {Object} options - * @param {Function} callback - * @return {Socket} for chaining - * @api public - */ + /// Sends a message packet. + /// + /// @param {String} message + /// @param {Object} options + /// @param {Function} callback + /// @return {Socket} for chaining + /// @api public send(data, options, [callback]) => write(data, options, callback); write(data, options, [callback]) { sendPacket('message', @@ -384,14 +362,12 @@ class Socket extends EventEmitter { return this; } - /** - * Sends a packet. - * - * @param {String} packet type - * @param {String} optional, data - * @param {Object} options - * @api private - */ + /// Sends a packet. + /// + /// @param {String} packet type + /// @param {String} optional, data + /// @param {Object} options + /// @api private sendPacket(type, {data, options, callback}) { options = options ?? {}; options['compress'] = false != options['compress']; @@ -414,11 +390,9 @@ class Socket extends EventEmitter { } } - /** - * Attempts to flush the packets buffer. - * - * @api private - */ + /// Attempts to flush the packets buffer. + /// + /// @api private flush() { if ('closed' != readyState && transport.writable == true && @@ -440,11 +414,9 @@ class Socket extends EventEmitter { } } - /** - * Get available upgrades for this socket. - * - * @api private - */ + /// Get available upgrades for this socket. + /// + /// @api private getAvailableUpgrades() { var availableUpgrades = []; var allUpgrades = server.upgrades(transport.name); @@ -457,13 +429,11 @@ class Socket extends EventEmitter { return availableUpgrades; } - /** - * Closes the socket and underlying transport. - * - * @param {Boolean} optional, discard - * @return {Socket} for chaining - * @api public - */ + /// Closes the socket and underlying transport. + /// + /// @param {Boolean} optional, discard + /// @return {Socket} for chaining + /// @api public close([discard = false]) { if ('open' != readyState) return; @@ -477,12 +447,10 @@ class Socket extends EventEmitter { closeTransport(discard); } - /** - * Closes the underlying transport. - * - * @param {Boolean} discard - * @api private - */ + /// Closes the underlying transport. + /// + /// @param {Boolean} discard + /// @api private closeTransport(discard) { if (discard == true) transport.discard(); transport.close(() => onClose('forced close')); diff --git a/lib/src/engine/transport/jsonp_transport.dart b/lib/src/engine/transport/jsonp_transport.dart index 08c1336..c1ad1d7 100644 --- a/lib/src/engine/transport/jsonp_transport.dart +++ b/lib/src/engine/transport/jsonp_transport.dart @@ -25,12 +25,10 @@ class JSONPTransport extends PollingTransport { foot = ');'; } - /** - * Handles incoming data. - * Due to a bug in \n handling by browsers, we expect a escaped string. - * - * @api private - */ + /// Handles incoming data. + /// Due to a bug in \n handling by browsers, we expect a escaped string. + /// + /// @api private onData(data) { // we leverage the qs module so that we get built-in DoS protection // and the fast alternative to decodeURIComponent @@ -48,11 +46,9 @@ class JSONPTransport extends PollingTransport { } } - /** - * Performs the write. - * - * @api private - */ + /// Performs the write. + /// + /// @api private doWrite(data, options, [callback]) { // we must output valid javascript, not valid json // see: http://timelessrepo.com/json-isnt-a-javascript-subset diff --git a/lib/src/engine/transport/polling_transport.dart b/lib/src/engine/transport/polling_transport.dart index e09d606..f35855c 100644 --- a/lib/src/engine/transport/polling_transport.dart +++ b/lib/src/engine/transport/polling_transport.dart @@ -52,11 +52,9 @@ class PollingTransport extends Transport { Map _reqCleanups = {}; Map _reqCloses = {}; - /** - * The client sends a request awaiting for us to send data. - * - * @api private - */ + /// The client sends a request awaiting for us to send data. + /// + /// @api private onPollRequest(SocketConnect connect) { if (this.connect != null) { _logger.fine('request overlap'); @@ -95,11 +93,9 @@ class PollingTransport extends Transport { } } - /** - * The client sends a request with data. - * - * @api private - */ + /// The client sends a request with data. + /// + /// @api private onDataRequest(SocketConnect connect) { if (dataReq != null) { // assert: this.dataRes, '.dataReq and .dataRes should be (un)set together' @@ -175,12 +171,10 @@ class PollingTransport extends Transport { } } - /** - * Processes the incoming data payload. - * - * @param {String} encoded payload - * @api private - */ + /// Processes the incoming data payload. + /// + /// @param {String} encoded payload + /// @api private onData(data) { _logger.fine('received "$data"'); if (messageHandler != null) { @@ -201,11 +195,9 @@ class PollingTransport extends Transport { } } - /** - * Overrides onClose. - * - * @api private - */ + /// Overrides onClose. + /// + /// @api private onClose() { if (writable == true) { // close pending poll request @@ -216,12 +208,10 @@ class PollingTransport extends Transport { super.onClose(); } - /** - * Writes a packet payload. - * - * @param {Object} packet - * @api private - */ + /// Writes a packet payload. + /// + /// @param {Object} packet + /// @api private send(List packets) { writable = false; @@ -243,13 +233,11 @@ class PollingTransport extends Transport { }); } - /** - * Writes data as response to poll request. - * - * @param {String} data - * @param {Object} options - * @api private - */ + /// Writes data as response to poll request. + /// + /// @param {String} data + /// @param {Object} options + /// @api private write(data, [options]) { _logger.fine('writing "$data"'); doWrite(data, options, () { @@ -258,11 +246,9 @@ class PollingTransport extends Transport { }); } - /** - * Performs the write. - * - * @api private - */ + /// Performs the write. + /// + /// @api private doWrite(data, options, [callback]) { var self = this; @@ -337,11 +323,9 @@ class PollingTransport extends Transport { // }); } - /** - * Closes the transport. - * - * @api private - */ + /// Closes the transport. + /// + /// @api private doClose([fn()]) { _logger.fine('closing'); @@ -375,13 +359,11 @@ class PollingTransport extends Transport { } } - /** - * Returns headers for a response. - * - * @param {http.IncomingMessage} request - * @param {Object} extra headers - * @api private - */ + /// Returns headers for a response. + /// + /// @param {http.IncomingMessage} request + /// @param {Object} extra headers + /// @api private headers(SocketConnect connect, [Map headers]) { headers = headers ?? {}; diff --git a/lib/src/engine/transport/xhr_transport.dart b/lib/src/engine/transport/xhr_transport.dart index 7888ba2..cd08cdf 100644 --- a/lib/src/engine/transport/xhr_transport.dart +++ b/lib/src/engine/transport/xhr_transport.dart @@ -17,12 +17,10 @@ import 'package:socket_io/src/engine/transport/polling_transport.dart'; class XHRTransport extends PollingTransport { XHRTransport(SocketConnect connect) : super(connect); - /** - * Overrides `onRequest` to handle `OPTIONS`.. - * - * @param {http.IncomingMessage} - * @api private - */ + /// Overrides `onRequest` to handle `OPTIONS`.. + /// + /// @param {http.IncomingMessage} + /// @api private onRequest(SocketConnect connect) { HttpRequest req = connect.request; if ('OPTIONS' == req.method) { @@ -40,13 +38,11 @@ class XHRTransport extends PollingTransport { } } - /** - * Returns headers for a response. - * - * @param {http.IncomingMessage} request - * @param {Object} extra headers - * @api private - */ + /// Returns headers for a response. + /// + /// @param {http.IncomingMessage} request + /// @param {Object} extra headers + /// @api private headers(SocketConnect connect, [Map headers]) { headers = headers ?? {}; var req = connect.request; diff --git a/lib/src/namespace.dart b/lib/src/namespace.dart index cac0e35..fcf13bc 100644 --- a/lib/src/namespace.dart +++ b/lib/src/namespace.dart @@ -19,18 +19,14 @@ import 'package:socket_io/src/server.dart'; import 'package:socket_io/src/socket.dart'; import 'package:socket_io/src/util/event_emitter.dart'; -/** - * Blacklisted events. - */ +/// Blacklisted events. List events = [ 'connect', // for symmetry with client 'connection', 'newListener' ]; -/** - * Flags. - */ +/// Flags. List flags = ['json', 'volatile']; class Namespace extends EventEmitter { @@ -45,46 +41,38 @@ class Namespace extends EventEmitter { Adapter adapter; Logger _logger = Logger('socket_io:Namespace'); - /** - * Namespace constructor. - * - * @param {Server} server instance - * @param {Socket} name - * @api private - */ + /// Namespace constructor. + /// + /// @param {Server} server instance + /// @param {Socket} name + /// @api private Namespace(Server this.server, String this.name) { initAdapter(); } - /** - * Initializes the `Adapter` for this nsp. - * Run upon changing adapter by `Server#adapter` - * in addition to the constructor. - * - * @api private - */ + /// Initializes the `Adapter` for this nsp. + /// Run upon changing adapter by `Server#adapter` + /// in addition to the constructor. + /// + /// @api private initAdapter() { adapter = Adapter.newInstance(server.adapter, this); } - /** - * Sets up namespace middleware. - * - * @return {Namespace} self - * @api public - */ + /// Sets up namespace middleware. + /// + /// @return {Namespace} self + /// @api public use(fn) { fns.add(fn); return this; } - /** - * Executes the middleware for an incoming client. - * - * @param {Socket} socket that will get added - * @param {Function} last fn call in the middleware - * @api private - */ + /// Executes the middleware for an incoming client. + /// + /// @param {Socket} socket that will get added + /// @param {Function} last fn call in the middleware + /// @api private run(socket, fn) { var fns = this.fns.sublist(0); if (fns.isEmpty) return fn(null); @@ -116,25 +104,21 @@ class Namespace extends EventEmitter { // to(name); // } - /** - * Targets a room when emitting. - * - * @param {String} name - * @return {Namespace} self - * @api public - */ + /// Targets a room when emitting. + /// + /// @param {String} name + /// @return {Namespace} self + /// @api public to(String name) { rooms = rooms?.isNotEmpty == true ? rooms : []; if (!rooms.contains(name)) rooms.add(name); return this; } - /** - * Adds a new client. - * - * @return {Socket} - * @api private - */ + /// Adds a new client. + /// + /// @return {Socket} + /// @api private add(Client client, query, fn) { _logger.fine('adding socket to nsp ${name}'); var socket = Socket(this, client, query); @@ -166,11 +150,9 @@ class Namespace extends EventEmitter { return socket; } - /** - * Removes a client. Called by each `Socket`. - * - * @api private - */ + /// Removes a client. Called by each `Socket`. + /// + /// @api private remove(socket) { if (sockets.contains(socket)) { sockets.remove(socket); @@ -179,12 +161,10 @@ class Namespace extends EventEmitter { } } - /** - * Emits to all clients. - * - * @return {Namespace} self - * @api public - */ + /// Emits to all clients. + /// + /// @return {Namespace} self + /// @api public emit(ev, [dynamic arg]) { if (events.contains(ev)) { super.emit(ev, arg); @@ -204,12 +184,10 @@ class Namespace extends EventEmitter { } } - /** - * Sends a `message` event to all clients. - * - * @return {Namespace} self - * @api public - */ + /// Sends a `message` event to all clients. + /// + /// @return {Namespace} self + /// @api public send([args]) { write(args); } @@ -219,25 +197,21 @@ class Namespace extends EventEmitter { return this; } - /** - * Gets a list of clients. - * - * @return {Namespace} self - * @api public - */ + /// Gets a list of clients. + /// + /// @return {Namespace} self + /// @api public clients(fn([_])) { adapter.clients(rooms, fn); rooms = []; return this; } - /** - * Sets the compress flag. - * - * @param {Boolean} if `true`, compresses the sending data - * @return {Socket} self - * @api public - */ + /// Sets the compress flag. + /// + /// @param {Boolean} if `true`, compresses the sending data + /// @return {Socket} self + /// @api public compress(compress) { flags = flags.isEmpty ? flags : {}; flags['compress'] = compress; diff --git a/lib/src/server.dart b/lib/src/server.dart index 9cc868b..63b2ce1 100644 --- a/lib/src/server.dart +++ b/lib/src/server.dart @@ -21,9 +21,7 @@ import 'package:stream/stream.dart'; /** * Socket.IO client source. */ -/** - * Old settings for backwards compatibility - */ +/// Old settings for backwards compatibility Map oldSettings = { "transports": "transports", "heartbeat timeout": "pingTimeout", @@ -45,13 +43,11 @@ class Server { Engine engine; Encoder encoder; - /** - * Server constructor. - * - * @param {http.Server|Number|Object} http server, port or options - * @param {Object} options - * @api public - */ + /// Server constructor. + /// + /// @param {http.Server|Number|Object} http server, port or options + /// @param {Object} options + /// @api public Server({server: null, Map options}) { options = options ?? {}; nsps = {}; @@ -67,12 +63,10 @@ class Server { } } - /** - * Server request verification function, that checks for allowed origins - * - * @param {http.IncomingMessage} request - * @param {Function} callback to be called with the result: `fn(err, success)` - */ + /// Server request verification function, that checks for allowed origins + /// + /// @param {http.IncomingMessage} request + /// @param {Function} callback to be called with the result: `fn(err, success)` checkRequest(HttpRequest req, [Function fn]) { String origin = req.headers.value('origin') != null ? req.headers.value('origin') @@ -108,13 +102,11 @@ class Server { fn(null, false); } - /** - * Sets/gets whether client code is being served. - * - * @param {Boolean} whether to serve client code - * @return {Server|Boolean} self when setting or value when getting - * @api public - */ + /// Sets/gets whether client code is being served. + /// + /// @param {Boolean} whether to serve client code + /// @return {Server|Boolean} self when setting or value when getting + /// @api public serveClient([bool v]) { if (v == null) { return _serveClient; @@ -124,11 +116,9 @@ class Server { return this; } - /** - * Backwards compatiblity. - * - * @api public - */ + /// Backwards compatiblity. + /// + /// @api public set(String key, [val]) { if ('authorization' == key && val != null) { use((socket, next) { @@ -157,26 +147,22 @@ class Server { return this; } - /** - * Sets the client serving path. - * - * @param {String} pathname - * @return {Server|String} self when setting or value when getting - * @api public - */ + /// Sets the client serving path. + /// + /// @param {String} pathname + /// @return {Server|String} self when setting or value when getting + /// @api public path([String v]) { if (v == null || v.isEmpty) return _path; _path = v.replaceFirst(RegExp(r'/\/$/'), ''); return this; } - /** - * Sets the adapter for rooms. - * - * @param {Adapter} pathname - * @return {Server|Adapter} self when setting or value when getting - * @api public - */ + /// Sets the adapter for rooms. + /// + /// @param {Adapter} pathname + /// @return {Server|Adapter} self when setting or value when getting + /// @api public String get adapter => _adapter; void set adapter(String v) { @@ -188,13 +174,11 @@ class Server { } } - /** - * Sets the allowed origins for requests. - * - * @param {String} origins - * @return {Server|Adapter} self when setting or value when getting - * @api public - */ + /// Sets the allowed origins for requests. + /// + /// @param {String} origins + /// @return {Server|Adapter} self when setting or value when getting + /// @api public origins([String v]) { if (v == null || v.isEmpty) return _origins; @@ -203,26 +187,22 @@ class Server { return this; } - /** - * Attaches socket.io to a server or port. - * - * @param {http.Server|Number} server or port - * @param {Object} options passed to engine.io - * @return {Server} self - * @api public - */ + /// Attaches socket.io to a server or port. + /// + /// @param {http.Server|Number} server or port + /// @param {Object} options passed to engine.io + /// @return {Server} self + /// @api public listen(srv, [Map opts]) { attach(srv, opts); } - /** - * Attaches socket.io to a server or port. - * - * @param {http.Server|Number} server or port - * @param {Object} options passed to engine.io - * @return {Server} self - * @api public - */ + /// Attaches socket.io to a server or port. + /// + /// @param {http.Server|Number} server or port + /// @param {Object} options passed to engine.io + /// @return {Server} self + /// @api public attach(srv, [Map opts]) { if (srv is Function) { String msg = 'You are trying to attach socket.io to an express ' + @@ -354,26 +334,22 @@ class Server { // res.end(clientSource); // } - /** - * Binds socket.io to an engine.io instance. - * - * @param {engine.Server} engine.io (or compatible) server - * @return {Server} self - * @api public - */ + /// Binds socket.io to an engine.io instance. + /// + /// @param {engine.Server} engine.io (or compatible) server + /// @return {Server} self + /// @api public bind(engine) { this.engine = engine; this.engine.on('connection', onconnection); return this; } - /** - * Called with each incoming transport connection. - * - * @param {engine.Socket} socket - * @return {Server} self - * @api public - */ + /// Called with each incoming transport connection. + /// + /// @param {engine.Socket} socket + /// @return {Server} self + /// @api public onconnection(conn) { _logger.fine('incoming connection with id ${conn.id}'); Client client = Client(this, conn); @@ -381,13 +357,11 @@ class Server { return this; } - /** - * Looks up a namespace. - * - * @param {String} nsp name - * @param {Function} optional, nsp `connection` ev handler - * @api public - */ + /// Looks up a namespace. + /// + /// @param {String} nsp name + /// @param {Function} optional, nsp `connection` ev handler + /// @api public of(name, [fn]) { if (name.toString()[0] != '/') { @@ -403,11 +377,9 @@ class Server { return nsps[name]; } - /** - * Closes server connection - * - * @api public - */ + /// Closes server connection + /// + /// @api public close() { nsps['/'].sockets.forEach((socket) { socket.onclose(); diff --git a/lib/src/socket.dart b/lib/src/socket.dart index a24efaf..250caa5 100644 --- a/lib/src/socket.dart +++ b/lib/src/socket.dart @@ -23,11 +23,9 @@ import 'package:socket_io/src/util/event_emitter.dart'; // //module.exports = exports = Socket; -/** - * Blacklisted events. - * - * @api public - */ +/// Blacklisted events. +/// +/// @api public List events = [ 'error', @@ -37,11 +35,9 @@ List events = [ 'removeListener' ]; -/** - * Flags. - * - * @api private - */ +/// Flags. +/// +/// @api private List flags = ['json', 'volatile', 'broadcast']; const List EVENTS = const [ @@ -82,11 +78,9 @@ class Socket extends EventEmitter { handshake = buildHandshake(query); } - /** - * Builds the `handshake` BC object - * - * @api private - */ + /// Builds the `handshake` BC object + /// + /// @api private buildHandshake(query) { final buildQuery = () { var requestQuery = request.uri.queryParameters; @@ -133,12 +127,10 @@ class Socket extends EventEmitter { emitWithAck(event, data, binary: true); } - /** - * Emits to this client. - * - * @return {Socket} self - * @api public - */ + /// Emits to this client. + /// + /// @return {Socket} self + /// @api public void emitWithAck(String event, dynamic data, {Function ack, bool binary = false}) { if (EVENTS.contains(event)) { @@ -182,24 +174,20 @@ class Socket extends EventEmitter { } } - /** - * Targets a room when broadcasting. - * - * @param {String} name - * @return {Socket} self - * @api public - */ + /// Targets a room when broadcasting. + /// + /// @param {String} name + /// @return {Socket} self + /// @api public to(String name) { if (!roomList.contains(name)) roomList.add(name); return this; } - /** - * Sends a `message` event. - * - * @return {Socket} self - * @api public - */ + /// Sends a `message` event. + /// + /// @return {Socket} self + /// @api public send(_) { write(_); } @@ -209,13 +197,11 @@ class Socket extends EventEmitter { return this; } - /** - * Writes a packet. - * - * @param {Object} packet object - * @param {Object} options - * @api private - */ + /// Writes a packet. + /// + /// @param {Object} packet object + /// @param {Object} options + /// @api private packet(packet, [opts]) { // ignore preEncoded = true. if (packet is Map) { @@ -226,14 +212,12 @@ class Socket extends EventEmitter { client.packet(packet, opts); } - /** - * Joins a room. - * - * @param {String} room - * @param {Function} optional, callback - * @return {Socket} self - * @api private - */ + /// Joins a room. + /// + /// @param {String} room + /// @param {Function} optional, callback + /// @return {Socket} self + /// @api private join(room, [fn]) { // debug('joining room %s', room); if (roomMap.containsKey(room)) { @@ -249,14 +233,12 @@ class Socket extends EventEmitter { return this; } - /** - * Leaves a room. - * - * @param {String} room - * @param {Function} optional, callback - * @return {Socket} self - * @api private - */ + /// Leaves a room. + /// + /// @param {String} room + /// @param {Function} optional, callback + /// @return {Socket} self + /// @api private leave(room, fn) { // debug('leave room %s', room); adapter.del(id, room, ([err]) { @@ -268,23 +250,19 @@ class Socket extends EventEmitter { return this; } - /** - * Leave all rooms. - * - * @api private - */ + /// Leave all rooms. + /// + /// @api private leaveAll() { adapter.delAll(id); roomMap = {}; } - /** - * Called by `Namespace` upon succesful - * middleware execution (ie: authorization). - * - * @api private - */ + /// Called by `Namespace` upon succesful + /// middleware execution (ie: authorization). + /// + /// @api private onconnect() { // debug('socket connected - writing packet'); @@ -293,12 +271,10 @@ class Socket extends EventEmitter { packet({'type': CONNECT}); } - /** - * Called with each packet. Called by `Client`. - * - * @param {Object} packet - * @api private - */ + /// Called with each packet. Called by `Client`. + /// + /// @param {Object} packet + /// @api private onpacket(packet) { // debug('got packet %j', packet); @@ -328,12 +304,10 @@ class Socket extends EventEmitter { } } - /** - * Called upon event packet. - * - * @param {Object} packet object - * @api private - */ + /// Called upon event packet. + /// + /// @param {Object} packet object + /// @api private onevent(packet) { List args = packet['data'] ?? []; // debug('emitting event %j', args); @@ -351,12 +325,10 @@ class Socket extends EventEmitter { } } - /** - * Produces an ack callback to emit with an event. - * - * @param {Number} packet id - * @api private - */ + /// Produces an ack callback to emit with an event. + /// + /// @param {Number} packet id + /// @api private Function ack(id) { var sent = false; return (_) { @@ -375,11 +347,9 @@ class Socket extends EventEmitter { }; } - /** - * Called upon ack packet. - * - * @api private - */ + /// Called upon ack packet. + /// + /// @api private onack(packet) { Function ack = acks.remove(packet['id']); if (ack is Function) { @@ -390,21 +360,17 @@ class Socket extends EventEmitter { } } - /** - * Called upon client disconnect packet. - * - * @api private - */ + /// Called upon client disconnect packet. + /// + /// @api private ondisconnect() { // debug('got disconnect packet'); onclose('client namespace disconnect'); } - /** - * Handles a client error. - * - * @api private - */ + /// Handles a client error. + /// + /// @api private onerror(err) { if (hasListeners('error')) { emit('error', err); @@ -414,13 +380,11 @@ class Socket extends EventEmitter { } } - /** - * Called upon closing. Called by `Client`. - * - * @param {String} reason - * @param {Error} optional error object - * @api private - */ + /// Called upon closing. Called by `Client`. + /// + /// @param {String} reason + /// @param {Error} optional error object + /// @api private onclose([reason]) { if (!connected) return this; // debug('closing socket - reason %s', reason); @@ -434,23 +398,19 @@ class Socket extends EventEmitter { emit('disconnect', reason); } - /** - * Produces an `error` packet. - * - * @param {Object} error object - * @api private - */ + /// Produces an `error` packet. + /// + /// @param {Object} error object + /// @api private error(err) { packet({'type': ERROR, 'data': err}); } - /** - * Disconnects this client. - * - * @param {Boolean} if `true`, closes the underlying connection - * @return {Socket} self - * @api public - */ + /// Disconnects this client. + /// + /// @param {Boolean} if `true`, closes the underlying connection + /// @return {Socket} self + /// @api public disconnect([close]) { if (!connected) return this; @@ -463,13 +423,11 @@ class Socket extends EventEmitter { return this; } - /** - * Sets the compress flag. - * - * @param {Boolean} if `true`, compresses the sending data - * @return {Socket} self - * @api public - */ + /// Sets the compress flag. + /// + /// @param {Boolean} if `true`, compresses the sending data + /// @return {Socket} self + /// @api public compress(compress) { flags = flags ?? {}; flags['compress'] = compress; diff --git a/lib/src/util/event_emitter.dart b/lib/src/util/event_emitter.dart index ee1ea2d..b53222c 100644 --- a/lib/src/util/event_emitter.dart +++ b/lib/src/util/event_emitter.dart @@ -12,37 +12,25 @@ */ import 'dart:collection' show HashMap; -/** - * Handler type for handling the event emitted by an [EventEmitter]. - */ +/// Handler type for handling the event emitted by an [EventEmitter]. typedef dynamic EventHandler(T data); -/** - * Generic event emitting and handling. - */ +/// Generic event emitting and handling. class EventEmitter { - /** - * Mapping of events to a list of event handlers - */ + /// Mapping of events to a list of event handlers Map> _events; - /** - * Mapping of events to a list of one-time event handlers - */ + /// Mapping of events to a list of one-time event handlers Map> _eventsOnce; - /** - * Constructor - */ + /// Constructor EventEmitter() { _events = HashMap>(); _eventsOnce = HashMap>(); } - /** - * This function triggers all the handlers currently listening - * to [event] and passes them [data]. - */ + /// This function triggers all the handlers currently listening + /// to [event] and passes them [data]. void emit(String event, [dynamic data]) { final list0 = _events[event]; // todo: try to optimize this. Maybe remember the off() handlers and remove later? @@ -57,27 +45,21 @@ class EventEmitter { }); } - /** - * This function binds the [handler] as a listener to the [event] - */ + /// This function binds the [handler] as a listener to the [event] void on(String event, EventHandler handler) { _events.putIfAbsent(event, () => List()); _events[event].add(handler); } - /** - * This function binds the [handler] as a listener to the first - * occurrence of the [event]. When [handler] is called once, - * it is removed. - */ + /// This function binds the [handler] as a listener to the first + /// occurrence of the [event]. When [handler] is called once, + /// it is removed. void once(String event, EventHandler handler) { _eventsOnce.putIfAbsent(event, () => List()); _eventsOnce[event].add(handler); } - /** - * This function attempts to unbind the [handler] from the [event] - */ + /// This function attempts to unbind the [handler] from the [event] void off(String event, [EventHandler handler]) { if (handler != null) { _events[event]?.remove(handler); @@ -94,17 +76,13 @@ class EventEmitter { } } - /** - * This function unbinds all the handlers for all the events. - */ + /// This function unbinds all the handlers for all the events. void clearListeners() { _events = HashMap>(); _eventsOnce = HashMap>(); } - /** - * Returns whether the event has registered. - */ + /// Returns whether the event has registered. bool hasListeners(String event) { return _events[event]?.isNotEmpty == true || _eventsOnce[event]?.isNotEmpty == true; From 47748c948b7a083e9860d6cf79560f51fee2f50f Mon Sep 17 00:00:00 2001 From: Guilherme Caldas Date: Sun, 22 Dec 2019 02:43:40 -0300 Subject: [PATCH 05/20] Add @override annotation to overridden members Following the guideline: "Annotate overridden members" --- lib/src/adapter/adapter.dart | 9 +++++++++ lib/src/engine/server.dart | 1 + lib/src/engine/transport/jsonp_transport.dart | 2 ++ lib/src/engine/transport/polling_transport.dart | 5 +++++ lib/src/engine/transport/websocket_transport.dart | 5 +++++ lib/src/engine/transport/xhr_transport.dart | 2 ++ lib/src/namespace.dart | 1 + lib/src/socket.dart | 1 + 8 files changed, 26 insertions(+) diff --git a/lib/src/adapter/adapter.dart b/lib/src/adapter/adapter.dart index 1d258a1..2056002 100644 --- a/lib/src/adapter/adapter.dart +++ b/lib/src/adapter/adapter.dart @@ -36,8 +36,11 @@ abstract class Adapter { } class _MemoryStoreAdapter extends EventEmitter implements Adapter { + @override Map nsps = {}; + @override Map rooms; + @override Map sids; Encoder encoder; Namespace nsp; @@ -55,6 +58,7 @@ class _MemoryStoreAdapter extends EventEmitter implements Adapter { /// @param {Function} callback /// @api public + @override add(String id, String room, [fn([_])]) { sids[id] = sids[id] ?? {}; sids[id][room] = true; @@ -69,6 +73,7 @@ class _MemoryStoreAdapter extends EventEmitter implements Adapter { /// @param {String} room name /// @param {Function} callback /// @api public + @override del(String id, String room, [fn([_])]) { sids[id] = sids[id] ?? {}; sids[id].remove(room); @@ -85,6 +90,7 @@ class _MemoryStoreAdapter extends EventEmitter implements Adapter { /// @param {String} socket id /// @param {Function} callback /// @api public + @override delAll(String id, [fn([_])]) { var rooms = sids[id]; if (rooms != null) { @@ -109,6 +115,7 @@ class _MemoryStoreAdapter extends EventEmitter implements Adapter { /// /// @param {Object} packet object /// @api public + @override broadcast(Map packet, [Map opts]) { opts = opts ?? {}; List rooms = opts['rooms'] ?? []; @@ -155,6 +162,7 @@ class _MemoryStoreAdapter extends EventEmitter implements Adapter { /// @param {Array} explicit set of rooms to check. /// @param {Function} callback /// @api public + @override clients(List rooms, [fn([_])]) { rooms = rooms ?? []; @@ -193,6 +201,7 @@ class _MemoryStoreAdapter extends EventEmitter implements Adapter { /// @param {String} socket id /// @param {Function} callback /// @api public + @override clientRooms(String id, [fn(err, [_])]) { var rooms = sids[id]; if (fn != null) scheduleMicrotask(() => fn(null, rooms?.keys)); diff --git a/lib/src/engine/server.dart b/lib/src/engine/server.dart index d64b0e1..f264d9b 100644 --- a/lib/src/engine/server.dart +++ b/lib/src/engine/server.dart @@ -172,6 +172,7 @@ class Server extends Engine { /// /// @api public + @override close() { _logger.fine('closing all open clients'); for (var key in clients.keys) { diff --git a/lib/src/engine/transport/jsonp_transport.dart b/lib/src/engine/transport/jsonp_transport.dart index c1ad1d7..574ad6f 100644 --- a/lib/src/engine/transport/jsonp_transport.dart +++ b/lib/src/engine/transport/jsonp_transport.dart @@ -29,6 +29,7 @@ class JSONPTransport extends PollingTransport { /// Due to a bug in \n handling by browsers, we expect a escaped string. /// /// @api private + @override onData(data) { // we leverage the qs module so that we get built-in DoS protection // and the fast alternative to decodeURIComponent @@ -49,6 +50,7 @@ class JSONPTransport extends PollingTransport { /// Performs the write. /// /// @api private + @override doWrite(data, options, [callback]) { // we must output valid javascript, not valid json // see: http://timelessrepo.com/json-isnt-a-javascript-subset diff --git a/lib/src/engine/transport/polling_transport.dart b/lib/src/engine/transport/polling_transport.dart index f35855c..5150787 100644 --- a/lib/src/engine/transport/polling_transport.dart +++ b/lib/src/engine/transport/polling_transport.dart @@ -36,6 +36,7 @@ class PollingTransport extends Transport { name = 'polling'; } + @override onRequest(SocketConnect connect) { var res = connect.response; @@ -175,6 +176,7 @@ class PollingTransport extends Transport { /// /// @param {String} encoded payload /// @api private + @override onData(data) { _logger.fine('received "$data"'); if (messageHandler != null) { @@ -198,6 +200,7 @@ class PollingTransport extends Transport { /// Overrides onClose. /// /// @api private + @override onClose() { if (writable == true) { // close pending poll request @@ -212,6 +215,7 @@ class PollingTransport extends Transport { /// /// @param {Object} packet /// @api private + @override send(List packets) { writable = false; @@ -326,6 +330,7 @@ class PollingTransport extends Transport { /// Closes the transport. /// /// @api private + @override doClose([fn()]) { _logger.fine('closing'); diff --git a/lib/src/engine/transport/websocket_transport.dart b/lib/src/engine/transport/websocket_transport.dart index 7f27fbe..80bb86a 100644 --- a/lib/src/engine/transport/websocket_transport.dart +++ b/lib/src/engine/transport/websocket_transport.dart @@ -17,7 +17,9 @@ import 'package:socket_io/src/engine/transport/transports.dart'; class WebSocketTransport extends Transport { static Logger _logger = Logger('socket_io:transport.WebSocketTransport'); + @override bool get handlesUpgrades => true; + @override bool get supportsFraming => true; StreamSubscription subscription; WebSocketTransport(connect) : super(connect) { @@ -28,6 +30,7 @@ class WebSocketTransport extends Transport { writable = true; } + @override void send(List packets) { var send = (data, Map packet) { _logger.fine('writing "$data"'); @@ -62,6 +65,7 @@ class WebSocketTransport extends Transport { } } + @override void onClose() { super.onClose(); @@ -72,6 +76,7 @@ class WebSocketTransport extends Transport { } } + @override void doClose([fn]) { connect.websocket.close(); if (fn != null) fn(); diff --git a/lib/src/engine/transport/xhr_transport.dart b/lib/src/engine/transport/xhr_transport.dart index cd08cdf..4bdf78b 100644 --- a/lib/src/engine/transport/xhr_transport.dart +++ b/lib/src/engine/transport/xhr_transport.dart @@ -21,6 +21,7 @@ class XHRTransport extends PollingTransport { /// /// @param {http.IncomingMessage} /// @api private + @override onRequest(SocketConnect connect) { HttpRequest req = connect.request; if ('OPTIONS' == req.method) { @@ -43,6 +44,7 @@ class XHRTransport extends PollingTransport { /// @param {http.IncomingMessage} request /// @param {Object} extra headers /// @api private + @override headers(SocketConnect connect, [Map headers]) { headers = headers ?? {}; var req = connect.request; diff --git a/lib/src/namespace.dart b/lib/src/namespace.dart index fcf13bc..1359865 100644 --- a/lib/src/namespace.dart +++ b/lib/src/namespace.dart @@ -165,6 +165,7 @@ class Namespace extends EventEmitter { /// /// @return {Namespace} self /// @api public + @override emit(ev, [dynamic arg]) { if (events.contains(ev)) { super.emit(ev, arg); diff --git a/lib/src/socket.dart b/lib/src/socket.dart index 250caa5..ba798ef 100644 --- a/lib/src/socket.dart +++ b/lib/src/socket.dart @@ -119,6 +119,7 @@ class Socket extends EventEmitter { return this; } + @override void emit(String event, [data]) { emitWithAck(event, data); } From ac368403ddc6c03b50ec87dca7aed8a45e15519e Mon Sep 17 00:00:00 2001 From: Guilherme Caldas Date: Sun, 22 Dec 2019 02:48:58 -0300 Subject: [PATCH 06/20] Replace double quotes by single quotes Following the guideline: "Prefer single quotes where they won't require escape sequences" --- lib/src/engine/server.dart | 4 ++-- lib/src/engine/socket.dart | 2 +- lib/src/engine/transport/transports.dart | 4 ++-- lib/src/server.dart | 8 ++++---- test/socket.test.dart | 4 ++-- 5 files changed, 11 insertions(+), 11 deletions(-) diff --git a/lib/src/engine/server.dart b/lib/src/engine/server.dart index f264d9b..585666c 100644 --- a/lib/src/engine/server.dart +++ b/lib/src/engine/server.dart @@ -41,7 +41,7 @@ const Map ServerErrorMessages = const { }; class Server extends Engine { - static final Logger _logger = Logger("socket_io:engine.Server"); + static final Logger _logger = Logger('socket_io:engine.Server'); Map clients; int clientsCount; int pingTimeout; @@ -395,7 +395,7 @@ class Server extends Engine { attachTo(StreamServer server, Map options) { options = options ?? {}; var path = - (options['path'] ?? '/engine.io').replaceFirst(RegExp(r"\/$"), ''); + (options['path'] ?? '/engine.io').replaceFirst(RegExp(r'\/$'), ''); // normalize path path += '/'; diff --git a/lib/src/engine/socket.dart b/lib/src/engine/socket.dart index 94e9540..7f818a3 100644 --- a/lib/src/engine/socket.dart +++ b/lib/src/engine/socket.dart @@ -23,7 +23,7 @@ import 'package:socket_io/src/util/event_emitter.dart'; /// /// @api private class Socket extends EventEmitter { - static final Logger _logger = Logger("socket_io:engine.Socket"); + static final Logger _logger = Logger('socket_io:engine.Socket'); String id; Server server; Transport transport; diff --git a/lib/src/engine/transport/transports.dart b/lib/src/engine/transport/transports.dart index c1b554f..118a767 100644 --- a/lib/src/engine/transport/transports.dart +++ b/lib/src/engine/transport/transports.dart @@ -20,8 +20,8 @@ import 'package:socket_io/src/util/event_emitter.dart'; class Transports { static List upgradesTo(String from) { - if ("polling" == from) { - return ["websocket"]; + if ('polling' == from) { + return ['websocket']; } return []; } diff --git a/lib/src/server.dart b/lib/src/server.dart index 63b2ce1..ff03403 100644 --- a/lib/src/server.dart +++ b/lib/src/server.dart @@ -23,10 +23,10 @@ import 'package:stream/stream.dart'; */ /// Old settings for backwards compatibility Map oldSettings = { - "transports": "transports", - "heartbeat timeout": "pingTimeout", - "heartbeat interval": "pingInterval", - "destroy buffer size": "maxHttpBufferSize" + 'transports': 'transports', + 'heartbeat timeout': 'pingTimeout', + 'heartbeat interval': 'pingInterval', + 'destroy buffer size': 'maxHttpBufferSize' }; final Logger _logger = Logger('socket_io:Server'); diff --git a/test/socket.test.dart b/test/socket.test.dart index 8af6313..7829725 100644 --- a/test/socket.test.dart +++ b/test/socket.test.dart @@ -23,14 +23,14 @@ main() { print('connection /some'); client.on('msg', (data) { print('data from /some => $data'); - client.emit('fromServer', "ok 2"); + client.emit('fromServer', 'ok 2'); }); }); io.on('connection', (client) { print('connection default namespace'); client.on('msg', (data) { print('data from default => $data'); - client.emit('fromServer', "ok"); + client.emit('fromServer', 'ok'); }); }); io.listen(3000); From 0183e7f119856207acb7e8fbfa4dcd03643f1d43 Mon Sep 17 00:00:00 2001 From: Guilherme Caldas Date: Sun, 22 Dec 2019 02:53:10 -0300 Subject: [PATCH 07/20] Remove type annotation from initializing formals Following the guideline: "Don't type annotate initializing formals" --- lib/src/client.dart | 2 +- lib/src/namespace.dart | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/src/client.dart b/lib/src/client.dart index 75011b4..6fb9447 100644 --- a/lib/src/client.dart +++ b/lib/src/client.dart @@ -33,7 +33,7 @@ class Client { /// @param {Server} server instance /// @param {Socket} connection /// @api private - Client(Server this.server, Socket this.conn) { + Client(this.server, this.conn) { encoder = Encoder(); decoder = Decoder(); id = conn.id; diff --git a/lib/src/namespace.dart b/lib/src/namespace.dart index 1359865..278c422 100644 --- a/lib/src/namespace.dart +++ b/lib/src/namespace.dart @@ -46,7 +46,7 @@ class Namespace extends EventEmitter { /// @param {Server} server instance /// @param {Socket} name /// @api private - Namespace(Server this.server, String this.name) { + Namespace(this.server, this.name) { initAdapter(); } From e287bc8df2879b2c81b092dc542c4d9906ec6f6c Mon Sep 17 00:00:00 2001 From: Guilherme Caldas Date: Sun, 22 Dec 2019 03:40:33 -0300 Subject: [PATCH 08/20] Add return type to methods Following the guideline: "Try adding a return type to the method" --- lib/src/adapter/adapter.dart | 28 +++++------ lib/src/client.dart | 24 +++++----- lib/src/engine/engine.dart | 2 +- lib/src/engine/server.dart | 22 ++++----- lib/src/engine/socket.dart | 32 ++++++------- lib/src/engine/transport/jsonp_transport.dart | 6 +-- .../engine/transport/polling_transport.dart | 20 ++++---- lib/src/engine/transport/transports.dart | 2 +- lib/src/engine/transport/xhr_transport.dart | 4 +- lib/src/namespace.dart | 24 +++++----- lib/src/server.dart | 46 ++++++++++--------- lib/src/socket.dart | 36 +++++++-------- test/socket.test.dart | 2 +- 13 files changed, 125 insertions(+), 123 deletions(-) diff --git a/lib/src/adapter/adapter.dart b/lib/src/adapter/adapter.dart index 2056002..880b01b 100644 --- a/lib/src/adapter/adapter.dart +++ b/lib/src/adapter/adapter.dart @@ -20,12 +20,12 @@ abstract class Adapter { Map rooms; Map sids; - add(String id, String room, [fn([_])]); - del(String id, String room, [fn([_])]); - delAll(String id, [fn([_])]); - broadcast(Map packet, [Map opts]); - clients(List rooms, [fn([_])]); - clientRooms(String id, [fn(err, [_])]); + void add(String id, String room, [fn([_])]); + void del(String id, String room, [fn([_])]); + void delAll(String id, [fn([_])]); + void broadcast(Map packet, [Map opts]); + void clients(List rooms, [fn([_])]); + void clientRooms(String id, [fn(err, [_])]); static Adapter newInstance(String key, Namespace nsp) { if ('default' == key) { @@ -59,7 +59,7 @@ class _MemoryStoreAdapter extends EventEmitter implements Adapter { /// @api public @override - add(String id, String room, [fn([_])]) { + void add(String id, String room, [fn([_])]) { sids[id] = sids[id] ?? {}; sids[id][room] = true; rooms[room] = rooms[room] ?? _Room(); @@ -74,7 +74,7 @@ class _MemoryStoreAdapter extends EventEmitter implements Adapter { /// @param {Function} callback /// @api public @override - del(String id, String room, [fn([_])]) { + void del(String id, String room, [fn([_])]) { sids[id] = sids[id] ?? {}; sids[id].remove(room); if (rooms.containsKey(room)) { @@ -91,7 +91,7 @@ class _MemoryStoreAdapter extends EventEmitter implements Adapter { /// @param {Function} callback /// @api public @override - delAll(String id, [fn([_])]) { + void delAll(String id, [fn([_])]) { var rooms = sids[id]; if (rooms != null) { for (var room in rooms.keys) { @@ -116,7 +116,7 @@ class _MemoryStoreAdapter extends EventEmitter implements Adapter { /// @param {Object} packet object /// @api public @override - broadcast(Map packet, [Map opts]) { + void broadcast(Map packet, [Map opts]) { opts = opts ?? {}; List rooms = opts['rooms'] ?? []; List except = opts['except'] ?? []; @@ -163,7 +163,7 @@ class _MemoryStoreAdapter extends EventEmitter implements Adapter { /// @param {Function} callback /// @api public @override - clients(List rooms, [fn([_])]) { + void clients(List rooms, [fn([_])]) { rooms = rooms ?? []; var ids = {}; @@ -202,7 +202,7 @@ class _MemoryStoreAdapter extends EventEmitter implements Adapter { /// @param {Function} callback /// @api public @override - clientRooms(String id, [fn(err, [_])]) { + void clientRooms(String id, [fn(err, [_])]) { var rooms = sids[id]; if (fn != null) scheduleMicrotask(() => fn(null, rooms?.keys)); } @@ -224,7 +224,7 @@ class _Room { /// /// @param {String} socket id /// @api private - add(String id) { + void add(String id) { if (!sockets.containsKey(id)) { sockets[id] = true; length++; @@ -235,7 +235,7 @@ class _Room { /// /// @param {String} socket id /// @api private - del(String id) { + void del(String id) { if (sockets.containsKey(id)) { sockets.remove(id); length--; diff --git a/lib/src/client.dart b/lib/src/client.dart index 6fb9447..cd38914 100644 --- a/lib/src/client.dart +++ b/lib/src/client.dart @@ -44,7 +44,7 @@ class Client { /// Sets up event listeners. /// /// @api private - setup() { + void setup() { decoder.on('decoded', ondecoded); conn.on('data', ondata); conn.on('error', onerror); @@ -55,7 +55,7 @@ class Client { /// /// @param {String} namespace name /// @api private - connect(name, [query]) { + void connect(name, [query]) { _logger.fine('connecting to namespace $name'); if (!server.nsps.containsKey(name)) { packet({'type': ERROR, 'nsp': name, 'data': 'Invalid namespace'}); @@ -82,7 +82,7 @@ class Client { /// Disconnects from all namespaces and closes transport. /// /// @api private - disconnect() { + void disconnect() { // we don't use a for loop because the length of // `sockets` changes upon each iteration sockets.toList().forEach((socket) { @@ -96,7 +96,7 @@ class Client { /// Removes a socket. Called by each `Socket`. /// /// @api private - remove(socket) { + void remove(socket) { var i = sockets.indexOf(socket); if (i >= 0) { var nsp = sockets[i].nsp.name; @@ -110,7 +110,7 @@ class Client { /// Closes the underlying connection. /// /// @api private - close() { + void close() { if ('open' == conn.readyState) { _logger.fine('forcing transport close'); conn.close(); @@ -123,11 +123,11 @@ class Client { /// @param {Object} packet object /// @param {Object} options /// @api private - packet(packet, [Map opts]) { + void packet(packet, [Map opts]) { var self = this; opts = opts ?? {}; // this writes to the actual connection - writeToEngine(encodedPackets) { + void writeToEngine(encodedPackets) { if (opts['volatile'] != null && !self.conn.transport.writable) return; for (var i = 0; i < encodedPackets.length; i++) { self.conn.write(encodedPackets[i], {'compress': opts['compress']}); @@ -154,7 +154,7 @@ class Client { /// Called with incoming transport data. /// /// @api private - ondata(data) { + void ondata(data) { // try/catch is needed for protocol violations (GH-1880) try { decoder.add(data); @@ -167,7 +167,7 @@ class Client { /// Called when parser fully decodes a packet. /// /// @api private - ondecoded(packet) { + void ondecoded(packet) { if (CONNECT == packet['type']) { final nsp = packet['nsp']; final uri = Uri.parse(nsp); @@ -186,7 +186,7 @@ class Client { /// /// @param {Objcet} error object /// @api private - onerror(err) { + void onerror(err) { sockets.forEach((socket) { socket.onerror(err); }); @@ -197,7 +197,7 @@ class Client { /// /// @param {String} reason /// @api private - onclose(reason) { + void onclose(reason) { _logger.fine('client close with reason $reason'); // ignore a potential subsequent `close` event @@ -216,7 +216,7 @@ class Client { /// Cleans up event listeners. /// /// @api private - destroy() { + void destroy() { conn.off('data', ondata); conn.off('error', onerror); conn.off('close', onclose); diff --git a/lib/src/engine/engine.dart b/lib/src/engine/engine.dart index 32f2cd0..0d11c8e 100644 --- a/lib/src/engine/engine.dart +++ b/lib/src/engine/engine.dart @@ -31,7 +31,7 @@ class Engine extends EventEmitter { // upgrades() {} // verify() {} // prepare() {} - close() {} + void close() {} // handleRequest() {} // handshake() {} } diff --git a/lib/src/engine/server.dart b/lib/src/engine/server.dart index 585666c..b24de54 100644 --- a/lib/src/engine/server.dart +++ b/lib/src/engine/server.dart @@ -101,7 +101,7 @@ class Server extends Engine { /// /// @api private - _init() { + void _init() { // if (this.transports.indexOf('websocket') == -1) return; // if (this.ws) this.ws.close(); @@ -138,7 +138,7 @@ class Server extends Engine { /// @return {Boolean} whether the request is valid /// @api private - verify(SocketConnect connect, bool upgrade, fn) { + void verify(SocketConnect connect, bool upgrade, fn) { // transport check var req = connect.request; var transport = req.uri.queryParameters['transport']; @@ -173,7 +173,7 @@ class Server extends Engine { /// @api public @override - close() { + void close() { _logger.fine('closing all open clients'); for (var key in clients.keys) { if (clients[key] != null) { @@ -193,7 +193,7 @@ class Server extends Engine { /// @param {http.ServerResponse|http.OutgoingMessage} response /// @api public - handleRequest(SocketConnect connect) { + void handleRequest(SocketConnect connect) { var req = connect.request; _logger.fine('handling ${req.method} http request ${req.uri.path}'); // this.prepare(req); @@ -222,7 +222,7 @@ class Server extends Engine { /// @param {code} error code /// @api private - static sendErrorMessage(HttpRequest req, code) { + static void sendErrorMessage(HttpRequest req, code) { var res = req.response; var isForbidden = !ServerErrorMessages.containsKey(code); if (isForbidden) { @@ -251,7 +251,7 @@ class Server extends Engine { /// /// @param {Object} request object /// @api public - generateId(SocketConnect connect) { + String generateId(SocketConnect connect) { return _uuid.v1().replaceAll('-', ''); } @@ -260,7 +260,7 @@ class Server extends Engine { /// @param {String} transport name /// @param {Object} request object /// @api private - handshake(String transportName, SocketConnect connect) { + void handshake(String transportName, SocketConnect connect) { var id = generateId(connect); _logger.fine('handshaking client $id'); @@ -314,7 +314,7 @@ class Server extends Engine { /// Handles an Engine.IO HTTP Upgrade. /// /// @api public - handleUpgrade(SocketConnect connect) { + void handleUpgrade(SocketConnect connect) { // this.prepare(req); verify(connect, true, (err, success) { @@ -339,7 +339,7 @@ class Server extends Engine { /// @param {ws.Socket} websocket /// @api private - onWebSocket(SocketConnect connect) { + void onWebSocket(SocketConnect connect) { // socket.listen((_) {}, // onError: () => _logger.fine('websocket error before upgrade')); @@ -392,7 +392,7 @@ class Server extends Engine { /// @param {http.Server} server /// @param {Object} options /// @api public - attachTo(StreamServer server, Map options) { + void attachTo(StreamServer server, Map options) { options = options ?? {}; var path = (options['path'] ?? '/engine.io').replaceFirst(RegExp(r'\/$'), ''); @@ -428,7 +428,7 @@ class Server extends Engine { /// @param {code} error code /// @api private - static abortConnection(SocketConnect connect, code) { + static void abortConnection(SocketConnect connect, code) { var socket = connect.websocket; if (socket.readyState == HttpStatus.ok) { var message = ServerErrorMessages.containsKey(code) diff --git a/lib/src/engine/socket.dart b/lib/src/engine/socket.dart index 7f818a3..1926435 100644 --- a/lib/src/engine/socket.dart +++ b/lib/src/engine/socket.dart @@ -64,7 +64,7 @@ class Socket extends EventEmitter { /// /// @api private - onOpen() { + void onOpen() { readyState = 'open'; // sends an `open` packet @@ -90,7 +90,7 @@ class Socket extends EventEmitter { /// @param {Object} packet /// @api private - onPacket(packet) { + void onPacket(packet) { if ('open' == readyState) { // export packet event _logger.fine('packet'); @@ -125,7 +125,7 @@ class Socket extends EventEmitter { /// /// @param {Error} error object /// @api private - onError(err) { + void onError(err) { _logger.fine('transport error'); onClose('transport error', err); } @@ -133,7 +133,7 @@ class Socket extends EventEmitter { /// Sets and resets ping timeout timer based on client pings. /// /// @api private - setPingTimeout() { + void setPingTimeout() { if (pingTimeoutTimer != null) { pingTimeoutTimer.cancel(); } @@ -149,7 +149,7 @@ class Socket extends EventEmitter { /// /// @param {Transport} transport /// @api private - setTransport(Transport transport) { + void setTransport(Transport transport) { var onError = this.onError; var onPacket = this.onPacket; var flush = (_) => this.flush(); @@ -177,7 +177,7 @@ class Socket extends EventEmitter { /// /// @param {Transport} transport /// @api private - maybeUpgrade(transport) { + void maybeUpgrade(transport) { _logger.fine( 'might upgrade socket transport from ${this.transport.name} to ${transport.name}'); @@ -274,7 +274,7 @@ class Socket extends EventEmitter { /// Clears listeners and timers associated with current transport. /// /// @api private - clearTransport() { + void clearTransport() { var cleanup; var toCleanUp = cleanupFn.length; @@ -298,7 +298,7 @@ class Socket extends EventEmitter { /// Called upon transport considered closed. /// Possible reasons: `ping timeout`, `client error`, `parse error`, /// `transport error`, `server close`, `transport close` - onClose(reason, [description]) { + void onClose(reason, [description]) { if ('closed' != readyState) { readyState = 'closed'; pingTimeoutTimer?.cancel(); @@ -321,7 +321,7 @@ class Socket extends EventEmitter { /// Setup and manage send callback /// /// @api private - setupSendCallback() { + void setupSendCallback() { // the message was sent successfully, execute the callback var onDrain = (_) { if (sentCallbackFn.isNotEmpty) { @@ -355,8 +355,8 @@ class Socket extends EventEmitter { /// @param {Function} callback /// @return {Socket} for chaining /// @api public - send(data, options, [callback]) => write(data, options, callback); - write(data, options, [callback]) { + void send(data, options, [callback]) => write(data, options, callback); + Socket write(data, options, [callback]) { sendPacket('message', data: data, options: options, callback: callback); return this; @@ -368,7 +368,7 @@ class Socket extends EventEmitter { /// @param {String} optional, data /// @param {Object} options /// @api private - sendPacket(type, {data, options, callback}) { + void sendPacket(type, {data, options, callback}) { options = options ?? {}; options['compress'] = false != options['compress']; @@ -393,7 +393,7 @@ class Socket extends EventEmitter { /// Attempts to flush the packets buffer. /// /// @api private - flush() { + void flush() { if ('closed' != readyState && transport.writable == true && writeBuffer.length > 0) { @@ -417,7 +417,7 @@ class Socket extends EventEmitter { /// Get available upgrades for this socket. /// /// @api private - getAvailableUpgrades() { + List getAvailableUpgrades() { var availableUpgrades = []; var allUpgrades = server.upgrades(transport.name); for (var i = 0, l = allUpgrades.length; i < l; ++i) { @@ -435,7 +435,7 @@ class Socket extends EventEmitter { /// @return {Socket} for chaining /// @api public - close([discard = false]) { + void close([discard = false]) { if ('open' != readyState) return; readyState = 'closing'; @@ -451,7 +451,7 @@ class Socket extends EventEmitter { /// /// @param {Boolean} discard /// @api private - closeTransport(discard) { + void closeTransport(discard) { if (discard == true) transport.discard(); transport.close(() => onClose('forced close')); } diff --git a/lib/src/engine/transport/jsonp_transport.dart b/lib/src/engine/transport/jsonp_transport.dart index 574ad6f..f403fdf 100644 --- a/lib/src/engine/transport/jsonp_transport.dart +++ b/lib/src/engine/transport/jsonp_transport.dart @@ -30,7 +30,7 @@ class JSONPTransport extends PollingTransport { /// /// @api private @override - onData(data) { + void onData(data) { // we leverage the qs module so that we get built-in DoS protection // and the fast alternative to decodeURIComponent data = parse(data)['d']; @@ -51,7 +51,7 @@ class JSONPTransport extends PollingTransport { /// /// @api private @override - doWrite(data, options, [callback]) { + void doWrite(data, options, [callback]) { // we must output valid javascript, not valid json // see: http://timelessrepo.com/json-isnt-a-javascript-subset var js = json @@ -73,7 +73,7 @@ class JSONPTransport extends PollingTransport { if (query.startsWith('?')) query = query.substring(1); // A custom decoder. - decode(String s) => Uri.decodeComponent(s.replaceAll('+', ' ')); + String decode(String s) => Uri.decodeComponent(s.replaceAll('+', ' ')); // Go through all the matches and build the result map. for (Match match in search.allMatches(query)) { diff --git a/lib/src/engine/transport/polling_transport.dart b/lib/src/engine/transport/polling_transport.dart index 5150787..d742698 100644 --- a/lib/src/engine/transport/polling_transport.dart +++ b/lib/src/engine/transport/polling_transport.dart @@ -37,7 +37,7 @@ class PollingTransport extends Transport { } @override - onRequest(SocketConnect connect) { + void onRequest(SocketConnect connect) { var res = connect.response; if ('GET' == connect.request.method) { @@ -56,7 +56,7 @@ class PollingTransport extends Transport { /// The client sends a request awaiting for us to send data. /// /// @api private - onPollRequest(SocketConnect connect) { + void onPollRequest(SocketConnect connect) { if (this.connect != null) { _logger.fine('request overlap'); // assert: this.res, '.req and .res should be (un)set together' @@ -97,7 +97,7 @@ class PollingTransport extends Transport { /// The client sends a request with data. /// /// @api private - onDataRequest(SocketConnect connect) { + void onDataRequest(SocketConnect connect) { if (dataReq != null) { // assert: this.dataRes, '.dataReq and .dataRes should be (un)set together' onError('data request overlap from client'); @@ -177,7 +177,7 @@ class PollingTransport extends Transport { /// @param {String} encoded payload /// @api private @override - onData(data) { + void onData(data) { _logger.fine('received "$data"'); if (messageHandler != null) { messageHandler.handle(this, data); @@ -201,7 +201,7 @@ class PollingTransport extends Transport { /// /// @api private @override - onClose() { + void onClose() { if (writable == true) { // close pending poll request send([ @@ -216,7 +216,7 @@ class PollingTransport extends Transport { /// @param {Object} packet /// @api private @override - send(List packets) { + void send(List packets) { writable = false; if (shouldClose != null) { @@ -242,7 +242,7 @@ class PollingTransport extends Transport { /// @param {String} data /// @param {Object} options /// @api private - write(data, [options]) { + void write(data, [options]) { _logger.fine('writing "$data"'); doWrite(data, options, () { Function fn = _reqCleanups.remove(connect); @@ -253,7 +253,7 @@ class PollingTransport extends Transport { /// Performs the write. /// /// @api private - doWrite(data, options, [callback]) { + void doWrite(data, options, [callback]) { var self = this; // explicit UTF-8 is required for pages not served under utf @@ -331,7 +331,7 @@ class PollingTransport extends Transport { /// /// @api private @override - doClose([fn()]) { + void doClose([fn()]) { _logger.fine('closing'); var self = this; @@ -369,7 +369,7 @@ class PollingTransport extends Transport { /// @param {http.IncomingMessage} request /// @param {Object} extra headers /// @api private - headers(SocketConnect connect, [Map headers]) { + Map headers(SocketConnect connect, [Map headers]) { headers = headers ?? {}; // prevent XSS warnings on IE diff --git a/lib/src/engine/transport/transports.dart b/lib/src/engine/transport/transports.dart index 118a767..b8c6684 100644 --- a/lib/src/engine/transport/transports.dart +++ b/lib/src/engine/transport/transports.dart @@ -95,7 +95,7 @@ abstract class Transport extends EventEmitter { emit('packet', packet); } - onData(data) { + void onData(data) { if (messageHandler != null) { messageHandler.handle(this, data); } else { diff --git a/lib/src/engine/transport/xhr_transport.dart b/lib/src/engine/transport/xhr_transport.dart index 4bdf78b..311221b 100644 --- a/lib/src/engine/transport/xhr_transport.dart +++ b/lib/src/engine/transport/xhr_transport.dart @@ -22,7 +22,7 @@ class XHRTransport extends PollingTransport { /// @param {http.IncomingMessage} /// @api private @override - onRequest(SocketConnect connect) { + void onRequest(SocketConnect connect) { HttpRequest req = connect.request; if ('OPTIONS' == req.method) { var res = req.response; @@ -45,7 +45,7 @@ class XHRTransport extends PollingTransport { /// @param {Object} extra headers /// @api private @override - headers(SocketConnect connect, [Map headers]) { + Map headers(SocketConnect connect, [Map headers]) { headers = headers ?? {}; var req = connect.request; if (req.headers.value('origin') != null) { diff --git a/lib/src/namespace.dart b/lib/src/namespace.dart index 278c422..39eb7dc 100644 --- a/lib/src/namespace.dart +++ b/lib/src/namespace.dart @@ -55,7 +55,7 @@ class Namespace extends EventEmitter { /// in addition to the constructor. /// /// @api private - initAdapter() { + void initAdapter() { adapter = Adapter.newInstance(server.adapter, this); } @@ -63,7 +63,7 @@ class Namespace extends EventEmitter { /// /// @return {Namespace} self /// @api public - use(fn) { + Namespace use(fn) { fns.add(fn); return this; } @@ -73,14 +73,14 @@ class Namespace extends EventEmitter { /// @param {Socket} socket that will get added /// @param {Function} last fn call in the middleware /// @api private - run(socket, fn) { + void run(socket, fn) { var fns = this.fns.sublist(0); if (fns.isEmpty) return fn(null); run0(0, fns, socket, fn); } - static run0(idx, fns, socket, fn) { + static void run0(idx, fns, socket, fn) { return fns[idx](socket, (err) { // upon error, short-circuit if (err) return fn(err); @@ -109,7 +109,7 @@ class Namespace extends EventEmitter { /// @param {String} name /// @return {Namespace} self /// @api public - to(String name) { + Namespace to(String name) { rooms = rooms?.isNotEmpty == true ? rooms : []; if (!rooms.contains(name)) rooms.add(name); return this; @@ -119,7 +119,7 @@ class Namespace extends EventEmitter { /// /// @return {Socket} /// @api private - add(Client client, query, fn) { + Socket add(Client client, query, fn) { _logger.fine('adding socket to nsp ${name}'); var socket = Socket(this, client, query); var self = this; @@ -153,7 +153,7 @@ class Namespace extends EventEmitter { /// Removes a client. Called by each `Socket`. /// /// @api private - remove(socket) { + void remove(socket) { if (sockets.contains(socket)) { sockets.remove(socket); } else { @@ -166,7 +166,7 @@ class Namespace extends EventEmitter { /// @return {Namespace} self /// @api public @override - emit(ev, [dynamic arg]) { + void emit(ev, [dynamic arg]) { if (events.contains(ev)) { super.emit(ev, arg); } else { @@ -189,11 +189,11 @@ class Namespace extends EventEmitter { /// /// @return {Namespace} self /// @api public - send([args]) { + void send([args]) { write(args); } - write([args]) { + Namespace write([args]) { emit('message', args); return this; } @@ -202,7 +202,7 @@ class Namespace extends EventEmitter { /// /// @return {Namespace} self /// @api public - clients(fn([_])) { + Namespace clients(fn([_])) { adapter.clients(rooms, fn); rooms = []; return this; @@ -213,7 +213,7 @@ class Namespace extends EventEmitter { /// @param {Boolean} if `true`, compresses the sending data /// @return {Socket} self /// @api public - compress(compress) { + Namespace compress(compress) { flags = flags.isEmpty ? flags : {}; flags['compress'] = compress; return this; diff --git a/lib/src/server.dart b/lib/src/server.dart index ff03403..6a24da3 100644 --- a/lib/src/server.dart +++ b/lib/src/server.dart @@ -18,6 +18,8 @@ import 'package:socket_io/src/namespace.dart'; import 'package:socket_io_common/src/parser/parser.dart'; import 'package:stream/stream.dart'; +import 'namespace.dart'; + /** * Socket.IO client source. */ @@ -67,7 +69,7 @@ class Server { /// /// @param {http.IncomingMessage} request /// @param {Function} callback to be called with the result: `fn(err, success)` - checkRequest(HttpRequest req, [Function fn]) { + void checkRequest(HttpRequest req, [Function fn]) { String origin = req.headers.value('origin') != null ? req.headers.value('origin') : req.headers.value('referer'); @@ -107,7 +109,7 @@ class Server { /// @param {Boolean} whether to serve client code /// @return {Server|Boolean} self when setting or value when getting /// @api public - serveClient([bool v]) { + dynamic serveClient([bool v]) { if (v == null) { return _serveClient; } @@ -119,7 +121,7 @@ class Server { /// Backwards compatiblity. /// /// @api public - set(String key, [val]) { + Server set(String key, [val]) { if ('authorization' == key && val != null) { use((socket, next) { val(socket.request, (err, authorized) { @@ -152,7 +154,7 @@ class Server { /// @param {String} pathname /// @return {Server|String} self when setting or value when getting /// @api public - path([String v]) { + dynamic path([String v]) { if (v == null || v.isEmpty) return _path; _path = v.replaceFirst(RegExp(r'/\/$/'), ''); return this; @@ -165,7 +167,7 @@ class Server { /// @api public String get adapter => _adapter; - void set adapter(String v) { + set adapter(String v) { _adapter = v; if (nsps.isNotEmpty) { nsps.forEach((dynamic i, Namespace nsp) { @@ -180,7 +182,7 @@ class Server { /// @return {Server|Adapter} self when setting or value when getting /// @api public - origins([String v]) { + dynamic origins([String v]) { if (v == null || v.isEmpty) return _origins; _origins = v; @@ -193,7 +195,7 @@ class Server { /// @param {Object} options passed to engine.io /// @return {Server} self /// @api public - listen(srv, [Map opts]) { + void listen(srv, [Map opts]) { attach(srv, opts); } @@ -203,7 +205,7 @@ class Server { /// @param {Object} options passed to engine.io /// @return {Server} self /// @api public - attach(srv, [Map opts]) { + Server attach(srv, [Map opts]) { if (srv is Function) { String msg = 'You are trying to attach socket.io to an express ' + 'request handler function. Please pass a http.Server instance.'; @@ -339,7 +341,7 @@ class Server { /// @param {engine.Server} engine.io (or compatible) server /// @return {Server} self /// @api public - bind(engine) { + Server bind(engine) { this.engine = engine; this.engine.on('connection', onconnection); return this; @@ -350,7 +352,7 @@ class Server { /// @param {engine.Socket} socket /// @return {Server} self /// @api public - onconnection(conn) { + Server onconnection(conn) { _logger.fine('incoming connection with id ${conn.id}'); Client client = Client(this, conn); client.connect('/'); @@ -363,7 +365,7 @@ class Server { /// @param {Function} optional, nsp `connection` ev handler /// @api public - of(name, [fn]) { + Namespace of(name, [fn]) { if (name.toString()[0] != '/') { name = '/' + name; } @@ -380,7 +382,7 @@ class Server { /// Closes server connection /// /// @api public - close() { + void close() { nsps['/'].sockets.forEach((socket) { socket.onclose(); }); @@ -393,16 +395,16 @@ class Server { } // redirect to sockets method - to(_) => sockets.to(_); - use(_) => sockets.use(_); - send(_) => sockets.send(_); - write(_) => sockets.write(_); - clients(_) => sockets.clients(_); - compress(_) => sockets.compress(_); + Namespace to(_) => sockets.to(_); + Namespace use(_) => sockets.use(_); + void send(_) => sockets.send(_); + Namespace write(_) => sockets.write(_); + Namespace clients(_) => sockets.clients(_); + Namespace compress(_) => sockets.compress(_); // emitter - emit(event, data) => sockets.emit(event, data); - on(event, handler) => sockets.on(event, handler); - once(event, handler) => sockets.once(event, handler); - off(event, handler) => sockets.off(event, handler); + void emit(event, data) => sockets.emit(event, data); + void on(event, handler) => sockets.on(event, handler); + void once(event, handler) => sockets.once(event, handler); + void off(event, handler) => sockets.off(event, handler); } diff --git a/lib/src/socket.dart b/lib/src/socket.dart index ba798ef..ca4bad4 100644 --- a/lib/src/socket.dart +++ b/lib/src/socket.dart @@ -81,7 +81,7 @@ class Socket extends EventEmitter { /// Builds the `handshake` BC object /// /// @api private - buildHandshake(query) { + Map buildHandshake(query) { final buildQuery = () { var requestQuery = request.uri.queryParameters; //if socket-specific query exist, replace query strings in requestQuery @@ -180,7 +180,7 @@ class Socket extends EventEmitter { /// @param {String} name /// @return {Socket} self /// @api public - to(String name) { + Socket to(String name) { if (!roomList.contains(name)) roomList.add(name); return this; } @@ -189,11 +189,11 @@ class Socket extends EventEmitter { /// /// @return {Socket} self /// @api public - send(_) { + void send(_) { write(_); } - write(List data) { + Socket write(List data) { emit('message', data); return this; } @@ -203,7 +203,7 @@ class Socket extends EventEmitter { /// @param {Object} packet object /// @param {Object} options /// @api private - packet(packet, [opts]) { + void packet(packet, [opts]) { // ignore preEncoded = true. if (packet is Map) { packet['nsp'] = nsp.name; @@ -219,7 +219,7 @@ class Socket extends EventEmitter { /// @param {Function} optional, callback /// @return {Socket} self /// @api private - join(room, [fn]) { + Socket join(room, [fn]) { // debug('joining room %s', room); if (roomMap.containsKey(room)) { if (fn != null) fn(null); @@ -240,7 +240,7 @@ class Socket extends EventEmitter { /// @param {Function} optional, callback /// @return {Socket} self /// @api private - leave(room, fn) { + Socket leave(room, fn) { // debug('leave room %s', room); adapter.del(id, room, ([err]) { if (err != null) return fn?.call(err); @@ -255,7 +255,7 @@ class Socket extends EventEmitter { /// /// @api private - leaveAll() { + void leaveAll() { adapter.delAll(id); roomMap = {}; } @@ -265,7 +265,7 @@ class Socket extends EventEmitter { /// /// @api private - onconnect() { + void onconnect() { // debug('socket connected - writing packet'); nsp.connected[id] = this; join(id); @@ -277,7 +277,7 @@ class Socket extends EventEmitter { /// @param {Object} packet /// @api private - onpacket(packet) { + void onpacket(packet) { // debug('got packet %j', packet); switch (packet['type']) { case EVENT: @@ -309,7 +309,7 @@ class Socket extends EventEmitter { /// /// @param {Object} packet object /// @api private - onevent(packet) { + void onevent(packet) { List args = packet['data'] ?? []; // debug('emitting event %j', args); @@ -351,7 +351,7 @@ class Socket extends EventEmitter { /// Called upon ack packet. /// /// @api private - onack(packet) { + void onack(packet) { Function ack = acks.remove(packet['id']); if (ack is Function) { // debug('calling ack %s with %j', packet.id, packet.data); @@ -364,7 +364,7 @@ class Socket extends EventEmitter { /// Called upon client disconnect packet. /// /// @api private - ondisconnect() { + void ondisconnect() { // debug('got disconnect packet'); onclose('client namespace disconnect'); } @@ -372,7 +372,7 @@ class Socket extends EventEmitter { /// Handles a client error. /// /// @api private - onerror(err) { + void onerror(err) { if (hasListeners('error')) { emit('error', err); } else { @@ -386,7 +386,7 @@ class Socket extends EventEmitter { /// @param {String} reason /// @param {Error} optional error object /// @api private - onclose([reason]) { + dynamic onclose([reason]) { if (!connected) return this; // debug('closing socket - reason %s', reason); emit('disconnecting', reason); @@ -403,7 +403,7 @@ class Socket extends EventEmitter { /// /// @param {Object} error object /// @api private - error(err) { + void error(err) { packet({'type': ERROR, 'data': err}); } @@ -413,7 +413,7 @@ class Socket extends EventEmitter { /// @return {Socket} self /// @api public - disconnect([close]) { + Socket disconnect([close]) { if (!connected) return this; if (close == true) { client.disconnect(); @@ -429,7 +429,7 @@ class Socket extends EventEmitter { /// @param {Boolean} if `true`, compresses the sending data /// @return {Socket} self /// @api public - compress(compress) { + Socket compress(compress) { flags = flags ?? {}; flags['compress'] = compress; return this; diff --git a/test/socket.test.dart b/test/socket.test.dart index 7829725..323cd97 100644 --- a/test/socket.test.dart +++ b/test/socket.test.dart @@ -14,7 +14,7 @@ import 'package:test/test.dart'; import 'package:socket_io/socket_io.dart'; -main() { +void main() { group('Socket IO', () { test('Start standalone server', () async { var io = Server(); From 71befe4592ec8599ed3444c19ca27abc935183e2 Mon Sep 17 00:00:00 2001 From: Guilherme Caldas Date: Sun, 22 Dec 2019 03:46:11 -0300 Subject: [PATCH 09/20] Remove type annotation from local variables Following the guideline: "Omit type annotations for local variables" --- lib/src/engine/socket.dart | 2 +- .../engine/transport/polling_transport.dart | 10 +++++----- lib/src/engine/transport/xhr_transport.dart | 4 ++-- lib/src/namespace.dart | 4 ++-- lib/src/server.dart | 18 +++++++++--------- lib/src/socket.dart | 2 +- 6 files changed, 20 insertions(+), 20 deletions(-) diff --git a/lib/src/engine/socket.dart b/lib/src/engine/socket.dart index 1926435..b177af8 100644 --- a/lib/src/engine/socket.dart +++ b/lib/src/engine/socket.dart @@ -182,7 +182,7 @@ class Socket extends EventEmitter { 'might upgrade socket transport from ${this.transport.name} to ${transport.name}'); upgrading = true; - Map cleanupFn = {}; + var cleanupFn = {}; // set transport upgrade timer upgradeTimeoutTimer = Timer(Duration(milliseconds: server.upgradeTimeout), () { diff --git a/lib/src/engine/transport/polling_transport.dart b/lib/src/engine/transport/polling_transport.dart index d742698..2718390 100644 --- a/lib/src/engine/transport/polling_transport.dart +++ b/lib/src/engine/transport/polling_transport.dart @@ -150,7 +150,7 @@ class PollingTransport extends Transport { var headers = {'Content-Type': 'text/html', 'Content-Length': 2}; - HttpResponse res = connect.response; + var res = connect.response; res.statusCode = 200; @@ -245,7 +245,7 @@ class PollingTransport extends Transport { void write(data, [options]) { _logger.fine('writing "$data"'); doWrite(data, options, () { - Function fn = _reqCleanups.remove(connect); + var fn = _reqCleanups.remove(connect); if (fn != null) fn(); }); } @@ -261,12 +261,12 @@ class PollingTransport extends Transport { var contentType = isString ? 'text/plain; charset=UTF-8' : 'application/octet-stream'; - final Map headers = {'Content-Type': contentType}; + final headers = {'Content-Type': contentType}; var respond = (data) { headers[HttpHeaders.contentLengthHeader] = data is String ? utf8.encode(data).length : data.length; - HttpResponse res = self.connect.response; + var res = self.connect.response; res.statusCode = 200; res.headers.clear(); // remove all default headers. @@ -286,7 +286,7 @@ class PollingTransport extends Transport { connect.close(); } } catch (e) { - Function fn = _reqCloses.remove(connect); + var fn = _reqCloses.remove(connect); if (fn != null) fn(); rethrow; } diff --git a/lib/src/engine/transport/xhr_transport.dart b/lib/src/engine/transport/xhr_transport.dart index 311221b..b64e45c 100644 --- a/lib/src/engine/transport/xhr_transport.dart +++ b/lib/src/engine/transport/xhr_transport.dart @@ -23,10 +23,10 @@ class XHRTransport extends PollingTransport { /// @api private @override void onRequest(SocketConnect connect) { - HttpRequest req = connect.request; + var req = connect.request; if ('OPTIONS' == req.method) { var res = req.response; - Map headers = this.headers(connect); + var headers = this.headers(connect); headers['Access-Control-Allow-Headers'] = 'Content-Type'; headers.forEach((key, value) { res.headers.set(key, value); diff --git a/lib/src/namespace.dart b/lib/src/namespace.dart index 39eb7dc..26cacb3 100644 --- a/lib/src/namespace.dart +++ b/lib/src/namespace.dart @@ -173,9 +173,9 @@ class Namespace extends EventEmitter { // @todo check how to handle it with Dart // if (hasBin(args)) { parserType = ParserType.binaryEvent; } // binary - List data = arg == null ? [ev] : [ev, arg]; + var data = arg == null ? [ev] : [ev, arg]; - Map packet = {'type': EVENT, 'data': data}; + var packet = {'type': EVENT, 'data': data}; adapter .broadcast(packet, {'rooms': rooms, 'flags': flags}); diff --git a/lib/src/server.dart b/lib/src/server.dart index 6a24da3..f5383cc 100644 --- a/lib/src/server.dart +++ b/lib/src/server.dart @@ -70,7 +70,7 @@ class Server { /// @param {http.IncomingMessage} request /// @param {Function} callback to be called with the result: `fn(err, success)` void checkRequest(HttpRequest req, [Function fn]) { - String origin = req.headers.value('origin') != null + var origin = req.headers.value('origin') != null ? req.headers.value('origin') : req.headers.value('referer'); @@ -89,10 +89,10 @@ class Server { if (!origin.isEmpty) { try { - Uri parts = Uri.parse(origin); - int defaultPort = 'https:' == parts.scheme ? 443 : 80; - int port = parts.port != null ? parts.port : defaultPort; - bool ok = + var parts = Uri.parse(origin); + var defaultPort = 'https:' == parts.scheme ? 443 : 80; + var port = parts.port != null ? parts.port : defaultPort; + var ok = _origins.indexOf(parts.host + ':' + port.toString()) >= 0 || _origins.indexOf(parts.host + ':*') >= 0 || _origins.indexOf('*:' + port.toString()) >= 0; @@ -207,7 +207,7 @@ class Server { /// @api public Server attach(srv, [Map opts]) { if (srv is Function) { - String msg = 'You are trying to attach socket.io to an express ' + + var msg = 'You are trying to attach socket.io to an express ' + 'request handler function. Please pass a http.Server instance.'; throw Exception(msg); } @@ -229,7 +229,7 @@ class Server { if (srv is num) { _logger.fine('creating http server and binding to $srv'); int port = srv; - StreamServer server = StreamServer(); + var server = StreamServer(); server.start(port: port); // HttpServer.bind(InternetAddress.ANY_IP_V4, port).then(( // HttpServer server) { @@ -354,7 +354,7 @@ class Server { /// @api public Server onconnection(conn) { _logger.fine('incoming connection with id ${conn.id}'); - Client client = Client(this, conn); + var client = Client(this, conn); client.connect('/'); return this; } @@ -372,7 +372,7 @@ class Server { if (!nsps.containsKey(name)) { _logger.fine('initializing namespace $name'); - Namespace nsp = Namespace(this, name); + var nsp = Namespace(this, name); nsps[name] = nsp; } if (fn != null) nsps[name].on('connect', fn); diff --git a/lib/src/socket.dart b/lib/src/socket.dart index ca4bad4..6ed2ecb 100644 --- a/lib/src/socket.dart +++ b/lib/src/socket.dart @@ -138,7 +138,7 @@ class Socket extends EventEmitter { super.emit(event, data); } else { var packet = {}; - List sendData = data == null ? [event] : [event, data]; + var sendData = data == null ? [event] : [event, data]; var flags = this.flags ?? {}; From dfc2d2714134016bb8656c35651b13be58b58c68 Mon Sep 17 00:00:00 2001 From: Guilherme Caldas Date: Sun, 22 Dec 2019 03:57:08 -0300 Subject: [PATCH 10/20] Replace fn parameter by generic function type Following the guideline: "Use generic function type syntax for parameters" --- lib/src/adapter/adapter.dart | 20 +++++++++---------- .../engine/transport/polling_transport.dart | 2 +- lib/src/engine/transport/transports.dart | 4 ++-- lib/src/namespace.dart | 2 +- 4 files changed, 14 insertions(+), 14 deletions(-) diff --git a/lib/src/adapter/adapter.dart b/lib/src/adapter/adapter.dart index 880b01b..97b50f2 100644 --- a/lib/src/adapter/adapter.dart +++ b/lib/src/adapter/adapter.dart @@ -20,12 +20,12 @@ abstract class Adapter { Map rooms; Map sids; - void add(String id, String room, [fn([_])]); - void del(String id, String room, [fn([_])]); - void delAll(String id, [fn([_])]); + void add(String id, String room, [dynamic Function([dynamic]) fn]); + void del(String id, String room, [dynamic Function([dynamic]) fn]); + void delAll(String id, [dynamic Function([dynamic]) fn]); void broadcast(Map packet, [Map opts]); - void clients(List rooms, [fn([_])]); - void clientRooms(String id, [fn(err, [_])]); + void clients(List rooms, [dynamic Function([dynamic]) fn]); + void clientRooms(String id, [dynamic Function(dynamic, [dynamic]) fn]); static Adapter newInstance(String key, Namespace nsp) { if ('default' == key) { @@ -59,7 +59,7 @@ class _MemoryStoreAdapter extends EventEmitter implements Adapter { /// @api public @override - void add(String id, String room, [fn([_])]) { + void add(String id, String room, [dynamic Function([dynamic]) fn]) { sids[id] = sids[id] ?? {}; sids[id][room] = true; rooms[room] = rooms[room] ?? _Room(); @@ -74,7 +74,7 @@ class _MemoryStoreAdapter extends EventEmitter implements Adapter { /// @param {Function} callback /// @api public @override - void del(String id, String room, [fn([_])]) { + void del(String id, String room, [dynamic Function([dynamic]) fn]) { sids[id] = sids[id] ?? {}; sids[id].remove(room); if (rooms.containsKey(room)) { @@ -91,7 +91,7 @@ class _MemoryStoreAdapter extends EventEmitter implements Adapter { /// @param {Function} callback /// @api public @override - void delAll(String id, [fn([_])]) { + void delAll(String id, [dynamic Function([dynamic]) fn]) { var rooms = sids[id]; if (rooms != null) { for (var room in rooms.keys) { @@ -163,7 +163,7 @@ class _MemoryStoreAdapter extends EventEmitter implements Adapter { /// @param {Function} callback /// @api public @override - void clients(List rooms, [fn([_])]) { + void clients(List rooms, [dynamic Function([dynamic]) fn]) { rooms = rooms ?? []; var ids = {}; @@ -202,7 +202,7 @@ class _MemoryStoreAdapter extends EventEmitter implements Adapter { /// @param {Function} callback /// @api public @override - void clientRooms(String id, [fn(err, [_])]) { + void clientRooms(String id, [dynamic Function(dynamic, [dynamic]) fn]) { var rooms = sids[id]; if (fn != null) scheduleMicrotask(() => fn(null, rooms?.keys)); } diff --git a/lib/src/engine/transport/polling_transport.dart b/lib/src/engine/transport/polling_transport.dart index 2718390..f25bbb8 100644 --- a/lib/src/engine/transport/polling_transport.dart +++ b/lib/src/engine/transport/polling_transport.dart @@ -331,7 +331,7 @@ class PollingTransport extends Transport { /// /// @api private @override - void doClose([fn()]) { + void doClose([dynamic Function() fn]) { _logger.fine('closing'); var self = this; diff --git a/lib/src/engine/transport/transports.dart b/lib/src/engine/transport/transports.dart index b8c6684..a679270 100644 --- a/lib/src/engine/transport/transports.dart +++ b/lib/src/engine/transport/transports.dart @@ -74,13 +74,13 @@ abstract class Transport extends EventEmitter { this.connect = connect; } - void close([closeFn()]) { + void close([dynamic Function() closeFn]) { if ('closed' == readyState || 'closing' == readyState) return; readyState = 'closing'; doClose(closeFn); } - void doClose([callback()]); + void doClose([dynamic Function() callback]); void onError(msg, [desc]) { writable = false; diff --git a/lib/src/namespace.dart b/lib/src/namespace.dart index 26cacb3..064c770 100644 --- a/lib/src/namespace.dart +++ b/lib/src/namespace.dart @@ -202,7 +202,7 @@ class Namespace extends EventEmitter { /// /// @return {Namespace} self /// @api public - Namespace clients(fn([_])) { + Namespace clients(dynamic Function([dynamic]) fn) { adapter.clients(rooms, fn); rooms = []; return this; From 0d61322f84c9e01a35623748e40da9f708ba3856 Mon Sep 17 00:00:00 2001 From: Guilherme Caldas Date: Sun, 22 Dec 2019 03:59:47 -0300 Subject: [PATCH 11/20] Add curly braces to flow control structures Following the guideline: "DO use curly braces for all flow control structures" --- lib/src/engine/connect.dart | 4 ++-- lib/src/engine/server.dart | 9 ++++++--- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/lib/src/engine/connect.dart b/lib/src/engine/connect.dart index ca152f7..7855db8 100644 --- a/lib/src/engine/connect.dart +++ b/lib/src/engine/connect.dart @@ -33,9 +33,9 @@ class SocketConnect extends HttpConnectWrapper { if (_completed == true) { return Future.value('done'); } - if (_socket != null) + if (_socket != null) { return _socket.done; - else { + } else { _done = Completer(); return _done.future; } diff --git a/lib/src/engine/server.dart b/lib/src/engine/server.dart index b24de54..c8d32a4 100644 --- a/lib/src/engine/server.dart +++ b/lib/src/engine/server.dart @@ -86,12 +86,14 @@ class Server extends Engine { opts['perMessageDeflate'] == true) { perMessageDeflate = opts['perMessageDeflate'] is Map ? opts['perMessageDeflate'] : {}; - if (!perMessageDeflate.containsKey('threshold')) + if (!perMessageDeflate.containsKey('threshold')) { perMessageDeflate['threshold'] = 1024; + } } httpCompression = opts['httpCompression'] ?? {}; - if (!httpCompression.containsKey('threshold')) + if (!httpCompression.containsKey('threshold')) { httpCompression['threshold'] = 1024; + } initialPacket = opts['initialPacket']; _init(); @@ -159,8 +161,9 @@ class Server extends Engine { } } else { // handshake is GET only - if ('GET' != req.method) + if ('GET' != req.method) { return fn(ServerErrors.BAD_HANDSHAKE_METHOD, false); + } if (allowRequest == null) return fn(null, true); return allowRequest(req, fn); } From 4424e712e9ee5d087c66eee09848b8acf7f5cbd1 Mon Sep 17 00:00:00 2001 From: Guilherme Caldas Date: Sun, 22 Dec 2019 04:03:57 -0300 Subject: [PATCH 12/20] Replace indexOf by contains Following guideline: "Use contains instead of indexOf" --- lib/src/adapter/adapter.dart | 4 ++-- lib/src/engine/server.dart | 2 +- lib/src/engine/transport/polling_transport.dart | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/lib/src/adapter/adapter.dart b/lib/src/adapter/adapter.dart index 97b50f2..0b698f7 100644 --- a/lib/src/adapter/adapter.dart +++ b/lib/src/adapter/adapter.dart @@ -138,7 +138,7 @@ class _MemoryStoreAdapter extends EventEmitter implements Adapter { var sockets = room.sockets; for (var id in sockets.keys) { if (sockets.containsKey(id)) { - if (ids[id] != null || except.indexOf(id) >= 0) continue; + if (ids[id] != null || except.contains(id)) continue; socket = nsp.connected[id]; if (socket != null) { socket.packet(encodedPackets, packetOpts); @@ -149,7 +149,7 @@ class _MemoryStoreAdapter extends EventEmitter implements Adapter { } } else { for (var id in sids.keys) { - if (except.indexOf(id) >= 0) continue; + if (except.contains(id)) continue; socket = nsp.connected[id]; if (socket != null) socket.packet(encodedPackets, packetOpts); } diff --git a/lib/src/engine/server.dart b/lib/src/engine/server.dart index c8d32a4..a68cc46 100644 --- a/lib/src/engine/server.dart +++ b/lib/src/engine/server.dart @@ -144,7 +144,7 @@ class Server extends Engine { // transport check var req = connect.request; var transport = req.uri.queryParameters['transport']; - if (transports.indexOf(transport) == -1) { + if (!transports.contains(transport)) { _logger.fine('unknown transport "$transport"'); return fn(ServerErrors.UNKNOWN_TRANSPORT, false); } diff --git a/lib/src/engine/transport/polling_transport.dart b/lib/src/engine/transport/polling_transport.dart index f25bbb8..f3e81cd 100644 --- a/lib/src/engine/transport/polling_transport.dart +++ b/lib/src/engine/transport/polling_transport.dart @@ -376,7 +376,7 @@ class PollingTransport extends Transport { // https://github.com/LearnBoost/socket.io/pull/1333 var ua = connect.request.headers.value('user-agent'); if (ua != null && - (ua.indexOf(';MSIE') >= 0 || ua.indexOf('Trident/') >= 0)) { + (ua.contains(';MSIE') || ua.contains('Trident/'))) { headers['X-XSS-Protection'] = '0'; } From 51989025ab1ec9963e722954023b8c75b56664a6 Mon Sep 17 00:00:00 2001 From: Guilherme Caldas Date: Sun, 22 Dec 2019 04:08:14 -0300 Subject: [PATCH 13/20] Replace length > 0 and !isEmpty by isNotEmpty Following the guideline: "Use isNotEmpty instead of length" and "Use `isNotEmpty` for Iterables and Maps" --- lib/src/client.dart | 2 +- lib/src/engine/socket.dart | 2 +- lib/src/server.dart | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/lib/src/client.dart b/lib/src/client.dart index cd38914..0124594 100644 --- a/lib/src/client.dart +++ b/lib/src/client.dart @@ -72,7 +72,7 @@ class Client { self.sockets.add(socket); self.nsps[nsp.name] = socket; - if ('/' == nsp.name && self.connectBuffer.length > 0) { + if ('/' == nsp.name && self.connectBuffer.isNotEmpty) { self.connectBuffer.forEach(self.connect); self.connectBuffer = []; } diff --git a/lib/src/engine/socket.dart b/lib/src/engine/socket.dart index b177af8..f37fcf7 100644 --- a/lib/src/engine/socket.dart +++ b/lib/src/engine/socket.dart @@ -396,7 +396,7 @@ class Socket extends EventEmitter { void flush() { if ('closed' != readyState && transport.writable == true && - writeBuffer.length > 0) { + writeBuffer.isNotEmpty) { _logger.fine('flushing buffer to transport'); emit('flush', writeBuffer); server.emit('flush', [this, writeBuffer]); diff --git a/lib/src/server.dart b/lib/src/server.dart index f5383cc..eb015b8 100644 --- a/lib/src/server.dart +++ b/lib/src/server.dart @@ -79,7 +79,7 @@ class Server { origin = '*'; } - if (!origin.isEmpty && _origins is Function) { + if (origin.isNotEmpty && _origins is Function) { return _origins(origin, fn); } @@ -87,7 +87,7 @@ class Server { return fn(null, true); } - if (!origin.isEmpty) { + if (origin.isNotEmpty) { try { var parts = Uri.parse(origin); var defaultPort = 'https:' == parts.scheme ? 443 : 80; From 6f8847b35809feda354b2a4c661f7dd84c38a644 Mon Sep 17 00:00:00 2001 From: Guilherme Caldas Date: Sun, 22 Dec 2019 04:15:53 -0300 Subject: [PATCH 14/20] Make private fields final Following the guidelines: "Private field could be final" --- lib/src/client.dart | 2 +- lib/src/engine/server.dart | 2 +- lib/src/engine/transport/polling_transport.dart | 4 ++-- lib/src/engine/transport/transports.dart | 2 +- lib/src/engine/transport/websocket_transport.dart | 2 +- lib/src/namespace.dart | 2 +- 6 files changed, 7 insertions(+), 7 deletions(-) diff --git a/lib/src/client.dart b/lib/src/client.dart index 0124594..84a37b8 100644 --- a/lib/src/client.dart +++ b/lib/src/client.dart @@ -26,7 +26,7 @@ class Client { List sockets = []; Map nsps = {}; List connectBuffer = []; - Logger _logger = Logger('socket_io:Client'); + final Logger _logger = Logger('socket_io:Client'); /// Client constructor. /// diff --git a/lib/src/engine/server.dart b/lib/src/engine/server.dart index a68cc46..c87f55d 100644 --- a/lib/src/engine/server.dart +++ b/lib/src/engine/server.dart @@ -57,7 +57,7 @@ class Server extends Engine { Map perMessageDeflate; Map httpCompression; dynamic initialPacket; - Uuid _uuid = Uuid(); + final Uuid _uuid = Uuid(); Server([Map opts]) { clients = {}; diff --git a/lib/src/engine/transport/polling_transport.dart b/lib/src/engine/transport/polling_transport.dart index f3e81cd..877c1c0 100644 --- a/lib/src/engine/transport/polling_transport.dart +++ b/lib/src/engine/transport/polling_transport.dart @@ -50,8 +50,8 @@ class PollingTransport extends Transport { } } - Map _reqCleanups = {}; - Map _reqCloses = {}; + final Map _reqCleanups = {}; + final Map _reqCloses = {}; /// The client sends a request awaiting for us to send data. /// diff --git a/lib/src/engine/transport/transports.dart b/lib/src/engine/transport/transports.dart index a679270..49d11dd 100644 --- a/lib/src/engine/transport/transports.dart +++ b/lib/src/engine/transport/transports.dart @@ -42,7 +42,7 @@ class Transports { } abstract class Transport extends EventEmitter { - static Logger _logger = Logger('socket_io:transport.Transport'); + static final Logger _logger = Logger('socket_io:transport.Transport'); double maxHttpBufferSize; Map httpCompression; Map perMessageDeflate; diff --git a/lib/src/engine/transport/websocket_transport.dart b/lib/src/engine/transport/websocket_transport.dart index 80bb86a..2434e78 100644 --- a/lib/src/engine/transport/websocket_transport.dart +++ b/lib/src/engine/transport/websocket_transport.dart @@ -16,7 +16,7 @@ import 'package:socket_io_common/src/engine/parser/parser.dart'; import 'package:socket_io/src/engine/transport/transports.dart'; class WebSocketTransport extends Transport { - static Logger _logger = Logger('socket_io:transport.WebSocketTransport'); + static final Logger _logger = Logger('socket_io:transport.WebSocketTransport'); @override bool get handlesUpgrades => true; @override diff --git a/lib/src/namespace.dart b/lib/src/namespace.dart index 064c770..6c00119 100644 --- a/lib/src/namespace.dart +++ b/lib/src/namespace.dart @@ -39,7 +39,7 @@ class Namespace extends EventEmitter { List rooms = []; Map flags = {}; Adapter adapter; - Logger _logger = Logger('socket_io:Namespace'); + final Logger _logger = Logger('socket_io:Namespace'); /// Namespace constructor. /// From 2638ccc8f333fbad4ad20526711f0a6b65747f5d Mon Sep 17 00:00:00 2001 From: Guilherme Caldas Date: Sun, 22 Dec 2019 04:19:18 -0300 Subject: [PATCH 15/20] Replace declarations by collection literals Following the guidelines: "Use collection literals when possible" --- lib/src/engine/transport/jsonp_transport.dart | 2 +- lib/src/util/event_emitter.dart | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/src/engine/transport/jsonp_transport.dart b/lib/src/engine/transport/jsonp_transport.dart index f403fdf..8caf0c9 100644 --- a/lib/src/engine/transport/jsonp_transport.dart +++ b/lib/src/engine/transport/jsonp_transport.dart @@ -67,7 +67,7 @@ class JSONPTransport extends PollingTransport { static Map parse(String query) { var search = RegExp('([^&=]+)=?([^&]*)'); - var result = Map(); + var result = {}; // Get rid off the beginning ? in query strings. if (query.startsWith('?')) query = query.substring(1); diff --git a/lib/src/util/event_emitter.dart b/lib/src/util/event_emitter.dart index b53222c..82caa18 100644 --- a/lib/src/util/event_emitter.dart +++ b/lib/src/util/event_emitter.dart @@ -47,7 +47,7 @@ class EventEmitter { /// This function binds the [handler] as a listener to the [event] void on(String event, EventHandler handler) { - _events.putIfAbsent(event, () => List()); + _events.putIfAbsent(event, () => []); _events[event].add(handler); } @@ -55,7 +55,7 @@ class EventEmitter { /// occurrence of the [event]. When [handler] is called once, /// it is removed. void once(String event, EventHandler handler) { - _eventsOnce.putIfAbsent(event, () => List()); + _eventsOnce.putIfAbsent(event, () => []); _eventsOnce[event].add(handler); } From 5ddab8ae680377a1c2f881d67c80a6285a24c29c Mon Sep 17 00:00:00 2001 From: Guilherme Caldas Date: Sun, 22 Dec 2019 04:40:47 -0300 Subject: [PATCH 16/20] Apply minor best practices to code Following the guidelines: - Avoid const keyword - Use adjacent strings to concatenate string literals - Don't explicitly initialize variables to null - Prefer using if null operators - Avoid empty catch blocks - Prefer using `??=` over testing for null --- lib/src/engine/server.dart | 10 +++++----- lib/src/engine/transport/xhr_transport.dart | 1 - lib/src/server.dart | 18 ++++++++---------- lib/src/socket.dart | 2 +- 4 files changed, 14 insertions(+), 17 deletions(-) diff --git a/lib/src/engine/server.dart b/lib/src/engine/server.dart index c87f55d..97e0d5d 100644 --- a/lib/src/engine/server.dart +++ b/lib/src/engine/server.dart @@ -32,7 +32,7 @@ class ServerErrors { static const int FORBIDDEN = 4; } -const Map ServerErrorMessages = const { +const Map ServerErrorMessages = { 0: 'Transport unknown', 1: 'Session ID unknown', 2: 'Bad handshake method', @@ -438,10 +438,10 @@ class Server extends Engine { ? ServerErrorMessages[code] : code; var length = utf8.encode(message).length; - socket.add('HTTP/1.1 400 Bad Request\r\n' + - 'Connection: close\r\n' + - 'Content-type: text/html\r\n' + - 'Content-Length: $length\r\n' + + socket.add('HTTP/1.1 400 Bad Request\r\n' + 'Connection: close\r\n' + 'Content-type: text/html\r\n' + 'Content-Length: $length\r\n' '\r\n' + message); } diff --git a/lib/src/engine/transport/xhr_transport.dart b/lib/src/engine/transport/xhr_transport.dart index b64e45c..8e96f03 100644 --- a/lib/src/engine/transport/xhr_transport.dart +++ b/lib/src/engine/transport/xhr_transport.dart @@ -10,7 +10,6 @@ * * Copyright (C) 2017 Potix Corporation. All Rights Reserved. */ -import 'dart:io'; import 'package:socket_io/src/engine/connect.dart'; import 'package:socket_io/src/engine/transport/polling_transport.dart'; diff --git a/lib/src/server.dart b/lib/src/server.dart index eb015b8..267136b 100644 --- a/lib/src/server.dart +++ b/lib/src/server.dart @@ -50,7 +50,7 @@ class Server { /// @param {http.Server|Number|Object} http server, port or options /// @param {Object} options /// @api public - Server({server: null, Map options}) { + Server({server, Map options}) { options = options ?? {}; nsps = {}; path(options.containsKey('path') ? options['path'] : '/socket.io'); @@ -70,9 +70,7 @@ class Server { /// @param {http.IncomingMessage} request /// @param {Function} callback to be called with the result: `fn(err, success)` void checkRequest(HttpRequest req, [Function fn]) { - var origin = req.headers.value('origin') != null - ? req.headers.value('origin') - : req.headers.value('referer'); + var origin = req.headers.value('origin') ?? req.headers.value('referer'); // file:// URLs produce a null Origin which can't be authorized via echo-back if (origin == null || origin.isEmpty) { @@ -91,14 +89,16 @@ class Server { try { var parts = Uri.parse(origin); var defaultPort = 'https:' == parts.scheme ? 443 : 80; - var port = parts.port != null ? parts.port : defaultPort; + var port = parts.port ?? defaultPort; var ok = _origins.indexOf(parts.host + ':' + port.toString()) >= 0 || _origins.indexOf(parts.host + ':*') >= 0 || _origins.indexOf('*:' + port.toString()) >= 0; return fn(null, ok); - } catch (ex) {} + } catch (ex) { + print(ex); + } } fn(null, false); @@ -207,7 +207,7 @@ class Server { /// @api public Server attach(srv, [Map opts]) { if (srv is Function) { - var msg = 'You are trying to attach socket.io to an express ' + + var msg = 'You are trying to attach socket.io to an express ' 'request handler function. Please pass a http.Server instance.'; throw Exception(msg); } @@ -216,9 +216,7 @@ class Server { if (srv is String && int.parse(srv.toString()).toString() == srv) { srv = int.parse(srv.toString()); } - if (opts == null) { - opts = {}; - } + opts ??= {}; // set engine.io path to `/socket.io` if (!opts.containsKey('path')) { opts['path'] = path(); diff --git a/lib/src/socket.dart b/lib/src/socket.dart index 6ed2ecb..3fd37b8 100644 --- a/lib/src/socket.dart +++ b/lib/src/socket.dart @@ -40,7 +40,7 @@ List events = [ /// @api private List flags = ['json', 'volatile', 'broadcast']; -const List EVENTS = const [ +const List EVENTS = [ 'error', 'connect', 'disconnect', From 8b05ec85a673ebaa0f7406a2bed77f76d8224e56 Mon Sep 17 00:00:00 2001 From: Guilherme Caldas Date: Sun, 22 Dec 2019 04:45:15 -0300 Subject: [PATCH 17/20] Format code Code formatted automatically using "dartfmt --fix -w ." --- lib/socket_io.dart | 3 +- lib/src/adapter/adapter.dart | 23 +++---- lib/src/client.dart | 30 +++++---- lib/src/engine/connect.dart | 22 +++---- lib/src/engine/engine.dart | 22 +++---- lib/src/engine/server.dart | 38 +++++------ lib/src/engine/socket.dart | 45 ++++++------- lib/src/engine/transport/jsonp_transport.dart | 22 +++---- .../engine/transport/polling_transport.dart | 28 ++++---- lib/src/engine/transport/transports.dart | 32 +++++---- .../engine/transport/websocket_transport.dart | 32 +++++---- lib/src/engine/transport/xhr_transport.dart | 22 +++---- lib/src/namespace.dart | 41 +++++------- lib/src/server.dart | 66 ++++++++----------- lib/src/socket.dart | 26 ++++---- lib/src/util/event_emitter.dart | 24 ++++--- test/socket.test.dart | 22 +++---- 17 files changed, 224 insertions(+), 274 deletions(-) diff --git a/lib/socket_io.dart b/lib/socket_io.dart index 33bec75..d8148d5 100644 --- a/lib/socket_io.dart +++ b/lib/socket_io.dart @@ -7,4 +7,5 @@ export 'src/engine/transport/jsonp_transport.dart' show JSONPTransport; export 'src/engine/transport/polling_transport.dart' show PollingTransport; export 'src/engine/transport/websocket_transport.dart' show WebSocketTransport; -export 'package:socket_io_common/src/engine/parser/parser.dart' show PacketParser; +export 'package:socket_io_common/src/engine/parser/parser.dart' + show PacketParser; diff --git a/lib/src/adapter/adapter.dart b/lib/src/adapter/adapter.dart index 0b698f7..5c6c7ad 100644 --- a/lib/src/adapter/adapter.dart +++ b/lib/src/adapter/adapter.dart @@ -1,15 +1,13 @@ -/** - * adapter.dart - * - * Purpose: - * - * Description: - * - * History: - * 16/02/2017, Created by jumperchen - * - * Copyright (C) 2017 Potix Corporation. All Rights Reserved. - */ +/// adapter.dart +/// +/// Purpose: +/// +/// Description: +/// +/// History: +/// 16/02/2017, Created by jumperchen +/// +/// Copyright (C) 2017 Potix Corporation. All Rights Reserved. import 'dart:async'; import 'package:socket_io/src/namespace.dart'; import 'package:socket_io_common/src/parser/parser.dart'; @@ -208,7 +206,6 @@ class _MemoryStoreAdapter extends EventEmitter implements Adapter { } } - /// Room constructor. /// /// @api private diff --git a/lib/src/client.dart b/lib/src/client.dart index 84a37b8..3988afb 100644 --- a/lib/src/client.dart +++ b/lib/src/client.dart @@ -1,15 +1,13 @@ -/** - * client.dart - * - * Purpose: - * - * Description: - * - * History: - * 22/02/2017, Created by jumperchen - * - * Copyright (C) 2017 Potix Corporation. All Rights Reserved. - */ +/// client.dart +/// +/// Purpose: +/// +/// Description: +/// +/// History: +/// 22/02/2017, Created by jumperchen +/// +/// Copyright (C) 2017 Potix Corporation. All Rights Reserved. import 'package:logging/logging.dart'; import 'package:socket_io/src/engine/socket.dart'; @@ -58,7 +56,11 @@ class Client { void connect(name, [query]) { _logger.fine('connecting to namespace $name'); if (!server.nsps.containsKey(name)) { - packet({'type': ERROR, 'nsp': name, 'data': 'Invalid namespace'}); + packet({ + 'type': ERROR, + 'nsp': name, + 'data': 'Invalid namespace' + }); return; } var nsp = server.of(name); @@ -205,7 +207,7 @@ class Client { // `nsps` and `sockets` are cleaned up seamlessly if (sockets.isNotEmpty) { - List.from(sockets).forEach((socket) { + List.from(sockets).forEach((socket) { socket.onclose(reason); }); sockets.clear(); diff --git a/lib/src/engine/connect.dart b/lib/src/engine/connect.dart index 7855db8..275fead 100644 --- a/lib/src/engine/connect.dart +++ b/lib/src/engine/connect.dart @@ -1,15 +1,13 @@ -/** - * connect.dart - * - * Purpose: - * - * Description: - * - * History: - * 06/03/2017, Created by jumperchen - * - * Copyright (C) 2017 Potix Corporation. All Rights Reserved. - */ +/// connect.dart +/// +/// Purpose: +/// +/// Description: +/// +/// History: +/// 06/03/2017, Created by jumperchen +/// +/// Copyright (C) 2017 Potix Corporation. All Rights Reserved. import 'package:stream/stream.dart'; import 'dart:async'; import 'dart:io'; diff --git a/lib/src/engine/engine.dart b/lib/src/engine/engine.dart index 0d11c8e..16e4897 100644 --- a/lib/src/engine/engine.dart +++ b/lib/src/engine/engine.dart @@ -1,15 +1,13 @@ -/** - * engine.dart - * - * Purpose: - * - * Description: - * - * History: - * 16/02/2017, Created by jumperchen - * - * Copyright (C) 2017 Potix Corporation. All Rights Reserved. - */ +/// engine.dart +/// +/// Purpose: +/// +/// Description: +/// +/// History: +/// 16/02/2017, Created by jumperchen +/// +/// Copyright (C) 2017 Potix Corporation. All Rights Reserved. import 'package:socket_io/src/engine/server.dart'; import 'package:socket_io/src/util/event_emitter.dart'; diff --git a/lib/src/engine/server.dart b/lib/src/engine/server.dart index 97e0d5d..da93704 100644 --- a/lib/src/engine/server.dart +++ b/lib/src/engine/server.dart @@ -1,15 +1,13 @@ -/** - * server - * - * Purpose: - * - * Description: - * - * History: - * 17/02/2017, Created by jumperchen - * - * Copyright (C) 2017 Potix Corporation. All Rights Reserved. - */ +/// server +/// +/// Purpose: +/// +/// Description: +/// +/// History: +/// 17/02/2017, Created by jumperchen +/// +/// Copyright (C) 2017 Potix Corporation. All Rights Reserved. import 'dart:convert'; import 'dart:io' hide Socket; import 'package:logging/logging.dart'; @@ -57,7 +55,7 @@ class Server extends Engine { Map perMessageDeflate; Map httpCompression; dynamic initialPacket; - final Uuid _uuid = Uuid(); + final Uuid _uuid = Uuid(); Server([Map opts]) { clients = {}; @@ -225,7 +223,7 @@ class Server extends Engine { /// @param {code} error code /// @api private - static void sendErrorMessage(HttpRequest req, code) { + static void sendErrorMessage(HttpRequest req, code) { var res = req.response; var isForbidden = !ServerErrorMessages.containsKey(code); if (isForbidden) { @@ -292,9 +290,7 @@ class Server extends Engine { if (false != cookie) { transport.on('headers', (headers) { headers['Set-Cookie'] = '${cookie}=${Uri.encodeComponent(id)}' + - (cookiePath?.isNotEmpty == true - ? '; Path=${cookiePath}' - : '') + + (cookiePath?.isNotEmpty == true ? '; Path=${cookiePath}' : '') + (cookiePath?.isNotEmpty == true && cookieHttpOnly == true ? '; HttpOnly' : ''); @@ -439,10 +435,10 @@ class Server extends Engine { : code; var length = utf8.encode(message).length; socket.add('HTTP/1.1 400 Bad Request\r\n' - 'Connection: close\r\n' - 'Content-type: text/html\r\n' - 'Content-Length: $length\r\n' - '\r\n' + + 'Connection: close\r\n' + 'Content-type: text/html\r\n' + 'Content-Length: $length\r\n' + '\r\n' + message); } socket.close(); diff --git a/lib/src/engine/socket.dart b/lib/src/engine/socket.dart index f37fcf7..8ced907 100644 --- a/lib/src/engine/socket.dart +++ b/lib/src/engine/socket.dart @@ -1,15 +1,13 @@ -/** - * socket.dart - * - * Purpose: - * - * Description: - * - * History: - * 17/02/2017, Created by jumperchen - * - * Copyright (C) 2017 Potix Corporation. All Rights Reserved. - */ +/// socket.dart +/// +/// Purpose: +/// +/// Description: +/// +/// History: +/// 17/02/2017, Created by jumperchen +/// +/// Copyright (C) 2017 Potix Corporation. All Rights Reserved. import 'dart:async'; import 'dart:convert'; import 'dart:io'; @@ -138,9 +136,7 @@ class Socket extends EventEmitter { pingTimeoutTimer.cancel(); } pingTimeoutTimer = Timer( - Duration( - milliseconds: server.pingInterval + server.pingTimeout), - () { + Duration(milliseconds: server.pingInterval + server.pingTimeout), () { onClose('ping timeout'); }); } @@ -330,14 +326,14 @@ class Socket extends EventEmitter { _logger.fine('executing send callback'); seqFn(transport); } - /** else if (Array.isArray(seqFn)) { - _logger.fine('executing batch send callback'); - for (var l = seqFn.length, i = 0; i < l; i++) { - if ('function' === typeof seqFn[i]) { - seqFn[i](self.transport); - } - } - }*/ + /// else if (Array.isArray(seqFn)) { + /// _logger.fine('executing batch send callback'); + /// for (var l = seqFn.length, i = 0; i < l; i++) { + /// if ('function' === typeof seqFn[i]) { + /// seqFn[i](self.transport); + /// } + /// } + /// } } }; @@ -357,8 +353,7 @@ class Socket extends EventEmitter { /// @api public void send(data, options, [callback]) => write(data, options, callback); Socket write(data, options, [callback]) { - sendPacket('message', - data: data, options: options, callback: callback); + sendPacket('message', data: data, options: options, callback: callback); return this; } diff --git a/lib/src/engine/transport/jsonp_transport.dart b/lib/src/engine/transport/jsonp_transport.dart index 8caf0c9..23de1f9 100644 --- a/lib/src/engine/transport/jsonp_transport.dart +++ b/lib/src/engine/transport/jsonp_transport.dart @@ -1,15 +1,13 @@ -/** - * jsonp_transport.dart - * - * Purpose: - * - * Description: - * - * History: - * 22/02/2017, Created by jumperchen - * - * Copyright (C) 2017 Potix Corporation. All Rights Reserved. - */ +/// jsonp_transport.dart +/// +/// Purpose: +/// +/// Description: +/// +/// History: +/// 22/02/2017, Created by jumperchen +/// +/// Copyright (C) 2017 Potix Corporation. All Rights Reserved. import 'dart:convert'; import 'package:socket_io/src/engine/connect.dart'; import 'package:socket_io/src/engine/transport/polling_transport.dart'; diff --git a/lib/src/engine/transport/polling_transport.dart b/lib/src/engine/transport/polling_transport.dart index 877c1c0..f22c78f 100644 --- a/lib/src/engine/transport/polling_transport.dart +++ b/lib/src/engine/transport/polling_transport.dart @@ -1,15 +1,13 @@ -/** - * polling_transport.dart - * - * Purpose: - * - * Description: - * - * History: - * 22/02/2017, Created by jumperchen - * - * Copyright (C) 2017 Potix Corporation. All Rights Reserved. - */ +/// polling_transport.dart +/// +/// Purpose: +/// +/// Description: +/// +/// History: +/// 22/02/2017, Created by jumperchen +/// +/// Copyright (C) 2017 Potix Corporation. All Rights Reserved. import 'dart:async'; import 'dart:convert'; import 'dart:io'; @@ -359,8 +357,7 @@ class PollingTransport extends Transport { } else { _logger.fine('transport not writable - buffering orderly close'); shouldClose = onClose; - closeTimeoutTimer = - Timer(Duration(milliseconds: closeTimeout), onClose); + closeTimeoutTimer = Timer(Duration(milliseconds: closeTimeout), onClose); } } @@ -375,8 +372,7 @@ class PollingTransport extends Transport { // prevent XSS warnings on IE // https://github.com/LearnBoost/socket.io/pull/1333 var ua = connect.request.headers.value('user-agent'); - if (ua != null && - (ua.contains(';MSIE') || ua.contains('Trident/'))) { + if (ua != null && (ua.contains(';MSIE') || ua.contains('Trident/'))) { headers['X-XSS-Protection'] = '0'; } diff --git a/lib/src/engine/transport/transports.dart b/lib/src/engine/transport/transports.dart index 49d11dd..94dd89f 100644 --- a/lib/src/engine/transport/transports.dart +++ b/lib/src/engine/transport/transports.dart @@ -1,15 +1,13 @@ -/** - * transports.dart - * - * Purpose: - * - * Description: - * - * History: - * 17/02/2017, Created by jumperchen - * - * Copyright (C) 2017 Potix Corporation. All Rights Reserved. - */ +/// transports.dart +/// +/// Purpose: +/// +/// Description: +/// +/// History: +/// 17/02/2017, Created by jumperchen +/// +/// Copyright (C) 2017 Potix Corporation. All Rights Reserved. import 'package:logging/logging.dart'; import 'package:socket_io/src/engine/connect.dart'; import 'package:socket_io_common/src/engine/parser/parser.dart'; @@ -28,21 +26,21 @@ class Transports { static Transport newInstance(String name, SocketConnect connect) { if ('websocket' == name) { - return WebSocketTransport(connect); + return WebSocketTransport(connect); } else if ('polling' == name) { if (connect.request.uri.queryParameters.containsKey('j')) { - return JSONPTransport(connect); + return JSONPTransport(connect); } else { - return XHRTransport(connect); + return XHRTransport(connect); } } else { - throw UnsupportedError('Unknown transport $name'); + throw UnsupportedError('Unknown transport $name'); } } } abstract class Transport extends EventEmitter { - static final Logger _logger = Logger('socket_io:transport.Transport'); + static final Logger _logger = Logger('socket_io:transport.Transport'); double maxHttpBufferSize; Map httpCompression; Map perMessageDeflate; diff --git a/lib/src/engine/transport/websocket_transport.dart b/lib/src/engine/transport/websocket_transport.dart index 2434e78..b2945cc 100644 --- a/lib/src/engine/transport/websocket_transport.dart +++ b/lib/src/engine/transport/websocket_transport.dart @@ -1,22 +1,21 @@ import 'dart:async'; -/** - * websocket_transport.dart - * - * Purpose: - * - * Description: - * - * History: - * 22/02/2017, Created by jumperchen - * - * Copyright (C) 2017 Potix Corporation. All Rights Reserved. - */ +/// websocket_transport.dart +/// +/// Purpose: +/// +/// Description: +/// +/// History: +/// 22/02/2017, Created by jumperchen +/// +/// Copyright (C) 2017 Potix Corporation. All Rights Reserved. import 'package:logging/logging.dart'; import 'package:socket_io_common/src/engine/parser/parser.dart'; import 'package:socket_io/src/engine/transport/transports.dart'; class WebSocketTransport extends Transport { - static final Logger _logger = Logger('socket_io:transport.WebSocketTransport'); + static final Logger _logger = + Logger('socket_io:transport.WebSocketTransport'); @override bool get handlesUpgrades => true; @override @@ -25,8 +24,8 @@ class WebSocketTransport extends Transport { WebSocketTransport(connect) : super(connect) { name = 'websocket'; this.connect = connect; - subscription = connect.websocket - .listen(onData, onError: onError, onDone: onClose); + subscription = + connect.websocket.listen(onData, onError: onError, onDone: onClose); writable = true; } @@ -60,8 +59,7 @@ class WebSocketTransport extends Transport { for (var i = 0; i < packets.length; i++) { var packet = packets[i]; PacketParser.encodePacket(packet, - supportsBinary: supportsBinary, - callback: (_) => send(_, packet)); + supportsBinary: supportsBinary, callback: (_) => send(_, packet)); } } diff --git a/lib/src/engine/transport/xhr_transport.dart b/lib/src/engine/transport/xhr_transport.dart index 8e96f03..af6710e 100644 --- a/lib/src/engine/transport/xhr_transport.dart +++ b/lib/src/engine/transport/xhr_transport.dart @@ -1,15 +1,13 @@ -/** - * xhr_transport.dart - * - * Purpose: - * - * Description: - * - * History: - * 22/02/2017, Created by jumperchen - * - * Copyright (C) 2017 Potix Corporation. All Rights Reserved. - */ +/// xhr_transport.dart +/// +/// Purpose: +/// +/// Description: +/// +/// History: +/// 22/02/2017, Created by jumperchen +/// +/// Copyright (C) 2017 Potix Corporation. All Rights Reserved. import 'package:socket_io/src/engine/connect.dart'; import 'package:socket_io/src/engine/transport/polling_transport.dart'; diff --git a/lib/src/namespace.dart b/lib/src/namespace.dart index 6c00119..6fbf91f 100644 --- a/lib/src/namespace.dart +++ b/lib/src/namespace.dart @@ -1,15 +1,13 @@ -/** - * namespace.dart - * - * Purpose: - * - * Description: - * - * History: - * 17/02/2017, Created by jumperchen - * - * Copyright (C) 2017 Potix Corporation. All Rights Reserved. - */ +/// namespace.dart +/// +/// Purpose: +/// +/// Description: +/// +/// History: +/// 17/02/2017, Created by jumperchen +/// +/// Copyright (C) 2017 Potix Corporation. All Rights Reserved. import 'dart:async'; import 'package:logging/logging.dart'; import 'package:socket_io/src/adapter/adapter.dart'; @@ -93,13 +91,11 @@ class Namespace extends EventEmitter { }); } - /** - * Targets a room when emitting. - * - * @param {String} name - * @return {Namespace} self - * @api public - */ + /// Targets a room when emitting. + /// + /// @param {String} name + /// @return {Namespace} self + /// @api public // in(String name) { // to(name); // } @@ -177,8 +173,7 @@ class Namespace extends EventEmitter { var packet = {'type': EVENT, 'data': data}; - adapter - .broadcast(packet, {'rooms': rooms, 'flags': flags}); + adapter.broadcast(packet, {'rooms': rooms, 'flags': flags}); rooms = null; flags = null; @@ -220,9 +215,7 @@ class Namespace extends EventEmitter { } } -/** - * Apply flags from `Socket`. - */ +/// Apply flags from `Socket`. // @todo //exports.flags.forEach(function(flag){ // Namespace.prototype.__defineGetter__(flag, function(){ diff --git a/lib/src/server.dart b/lib/src/server.dart index 267136b..123eacf 100644 --- a/lib/src/server.dart +++ b/lib/src/server.dart @@ -1,15 +1,13 @@ -/** - * server.dart - * - * Purpose: - * - * Description: - * - * History: - * 22/02/2017, Created by jumperchen - * - * Copyright (C) 2017 Potix Corporation. All Rights Reserved. - */ +/// server.dart +/// +/// Purpose: +/// +/// Description: +/// +/// History: +/// 22/02/2017, Created by jumperchen +/// +/// Copyright (C) 2017 Potix Corporation. All Rights Reserved. import 'dart:io'; import 'package:logging/logging.dart'; import 'package:socket_io/src/client.dart'; @@ -20,9 +18,7 @@ import 'package:stream/stream.dart'; import 'namespace.dart'; -/** - * Socket.IO client source. - */ +/// Socket.IO client source. /// Old settings for backwards compatibility Map oldSettings = { 'transports': 'transports', @@ -55,8 +51,7 @@ class Server { nsps = {}; path(options.containsKey('path') ? options['path'] : '/socket.io'); serveClient(false != options['serveClient']); - adapter = - options.containsKey('adapter') ? options['adapter'] : 'default'; + adapter = options.containsKey('adapter') ? options['adapter'] : 'default'; origins(options.containsKey('origins') ? options['origins'] : '*:*'); encoder = Encoder(); sockets = of('/'); @@ -90,13 +85,12 @@ class Server { var parts = Uri.parse(origin); var defaultPort = 'https:' == parts.scheme ? 443 : 80; var port = parts.port ?? defaultPort; - var ok = - _origins.indexOf(parts.host + ':' + port.toString()) >= 0 || - _origins.indexOf(parts.host + ':*') >= 0 || - _origins.indexOf('*:' + port.toString()) >= 0; + var ok = _origins.indexOf(parts.host + ':' + port.toString()) >= 0 || + _origins.indexOf(parts.host + ':*') >= 0 || + _origins.indexOf('*:' + port.toString()) >= 0; return fn(null, ok); - } catch (ex) { + } catch (ex) { print(ex); } } @@ -283,13 +277,11 @@ class Server { return this; } - /** - * Attaches the static file serving. - * - * @param {Function|http.Server} http server - * @api private - * @todo Include better way to serve files - */ + /// Attaches the static file serving. + /// + /// @param {Function|http.Server} http server + /// @api private + /// @todo Include better way to serve files // attachServe(srv){ // _logger.fine()('attaching client serving req handler'); // var url = this._path + '/socket.io.js'; @@ -307,14 +299,12 @@ class Server { // }) // } - /** - * Handles a request serving `/socket.io.js` - * - * @param {http.Request} req - * @param {http.Response} res - * @api private - * @todo Include better way to serve files - */ + /// Handles a request serving `/socket.io.js` + /// + /// @param {http.Request} req + /// @param {http.Response} res + /// @api private + /// @todo Include better way to serve files // serve(req, res){ // var etag = req.headers['if-none-match']; @@ -394,7 +384,7 @@ class Server { // redirect to sockets method Namespace to(_) => sockets.to(_); - Namespace use(_) => sockets.use(_); + Namespace use(_) => sockets.use(_); void send(_) => sockets.send(_); Namespace write(_) => sockets.write(_); Namespace clients(_) => sockets.clients(_); diff --git a/lib/src/socket.dart b/lib/src/socket.dart index 3fd37b8..14938f7 100644 --- a/lib/src/socket.dart +++ b/lib/src/socket.dart @@ -1,15 +1,13 @@ -/** - * socket.dart - * - * Purpose: - * - * Description: - * - * History: - * 22/02/2017, Created by jumperchen - * - * Copyright (C) 2017 Potix Corporation. All Rights Reserved. - */ +/// socket.dart +/// +/// Purpose: +/// +/// Description: +/// +/// History: +/// 22/02/2017, Created by jumperchen +/// +/// Copyright (C) 2017 Potix Corporation. All Rights Reserved. import 'dart:io'; import 'package:socket_io/src/adapter/adapter.dart'; import 'package:socket_io/src/client.dart'; @@ -17,9 +15,7 @@ import 'package:socket_io_common/src/parser/parser.dart'; import 'package:socket_io/src/namespace.dart'; import 'package:socket_io/src/server.dart'; import 'package:socket_io/src/util/event_emitter.dart'; -/** - * Module exports. - */ +/// Module exports. // //module.exports = exports = Socket; diff --git a/lib/src/util/event_emitter.dart b/lib/src/util/event_emitter.dart index 82caa18..90a1b26 100644 --- a/lib/src/util/event_emitter.dart +++ b/lib/src/util/event_emitter.dart @@ -1,19 +1,17 @@ -/** - * event_emitter.dart - * - * Purpose: - * - * Description: - * - * History: - * 11/23/2016, Created by Henri Chen - * - * Copyright (C) 2016 Potix Corporation. All Rights Reserved. - */ +/// event_emitter.dart +/// +/// Purpose: +/// +/// Description: +/// +/// History: +/// 11/23/2016, Created by Henri Chen +/// +/// Copyright (C) 2016 Potix Corporation. All Rights Reserved. import 'dart:collection' show HashMap; /// Handler type for handling the event emitted by an [EventEmitter]. -typedef dynamic EventHandler(T data); +typedef EventHandler = dynamic Function(T data); /// Generic event emitting and handling. class EventEmitter { diff --git a/test/socket.test.dart b/test/socket.test.dart index 323cd97..9fb3c6f 100644 --- a/test/socket.test.dart +++ b/test/socket.test.dart @@ -1,15 +1,13 @@ -/** - * socket.test.dart - * - * Purpose: - * - * Description: - * - * History: - * 16/02/2017, Created by jumperchen - * - * Copyright (C) 2017 Potix Corporation. All Rights Reserved. - */ +/// socket.test.dart +/// +/// Purpose: +/// +/// Description: +/// +/// History: +/// 16/02/2017, Created by jumperchen +/// +/// Copyright (C) 2017 Potix Corporation. All Rights Reserved. import 'package:test/test.dart'; import 'package:socket_io/socket_io.dart'; From 50b3cef068b69ccee5640bcc289b70d8d5e9e141 Mon Sep 17 00:00:00 2001 From: Guilherme Caldas Date: Mon, 23 Dec 2019 02:13:46 -0300 Subject: [PATCH 18/20] Update pubspec.yaml --- pubspec.yaml | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/pubspec.yaml b/pubspec.yaml index ccc9e0c..919bdd5 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,5 +1,7 @@ name: socket_io -description: Dartlang port of socket.io +description: > + Port of JS/Node library Socket.io. It enables real-time, bidirectional and + event-based communication cross-platform. version: 0.9.0+2 author: jumperchen homepage: https://www.zkoss.org @@ -8,8 +10,10 @@ environment: sdk: '>=2.0.0 <3.0.0' dependencies: - stream: any - socket_io_common: any - uuid: any + stream: ^2.2.1+1 + socket_io_common: ^0.9.0+5 + uuid: ^2.0.4 + logging: ^0.11.3+2 dev_dependencies: test: ">=1.3.0 <2.0.0" + pedantic: ^1.0.0 From 2ae5468846d9a12abc3a84e8f7924eb4b06aedfe Mon Sep 17 00:00:00 2001 From: Guilherme Caldas Date: Mon, 23 Dec 2019 02:20:10 -0300 Subject: [PATCH 19/20] Remove deprecated field author Based on https://dart.dev/tools/pub/pubspec#authorauthors --- pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pubspec.yaml b/pubspec.yaml index 919bdd5..efb37f3 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -3,7 +3,7 @@ description: > Port of JS/Node library Socket.io. It enables real-time, bidirectional and event-based communication cross-platform. version: 0.9.0+2 -author: jumperchen +# author: jumperchen homepage: https://www.zkoss.org environment: From 49a74c892e4ab613479c0ea03b550c37a7f35e2b Mon Sep 17 00:00:00 2001 From: Guilherme Caldas Date: Mon, 23 Dec 2019 02:29:10 -0300 Subject: [PATCH 20/20] Increase version --- CHANGELOG.md | 2 ++ pubspec.yaml | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) create mode 100644 CHANGELOG.md diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..a436cad --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,2 @@ +## 0.9.0+3 +- Apply Pedantic recommendations diff --git a/pubspec.yaml b/pubspec.yaml index efb37f3..b7ea0e9 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -2,7 +2,7 @@ name: socket_io description: > Port of JS/Node library Socket.io. It enables real-time, bidirectional and event-based communication cross-platform. -version: 0.9.0+2 +version: 0.9.0+3 # author: jumperchen homepage: https://www.zkoss.org