From db5211ccdfadf17615cb257d43a0401407db12ad Mon Sep 17 00:00:00 2001 From: mryadavdilip Date: Wed, 9 Apr 2025 17:27:56 +0530 Subject: [PATCH 1/6] problems fixed --- lib/src/engine/socket.dart | 6 ++---- lib/src/server.dart | 2 -- lib/src/socket.dart | 6 +----- pubspec.yaml | 2 +- 4 files changed, 4 insertions(+), 12 deletions(-) diff --git a/lib/src/engine/socket.dart b/lib/src/engine/socket.dart index 34e56ad..dbf46d4 100644 --- a/lib/src/engine/socket.dart +++ b/lib/src/engine/socket.dart @@ -314,10 +314,8 @@ class Socket extends EventEmitter { var onDrain = (_) { if (sentCallbackFn.isNotEmpty) { var seqFn = sentCallbackFn[0]; - if (seqFn is Function) { - _logger.fine('executing send callback'); - seqFn(transport); - } + _logger.fine('executing send callback'); + seqFn(transport); /// else if (Array.isArray(seqFn)) { /// _logger.fine('executing batch send callback'); diff --git a/lib/src/server.dart b/lib/src/server.dart index ba71551..0f8677e 100644 --- a/lib/src/server.dart +++ b/lib/src/server.dart @@ -17,8 +17,6 @@ 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. /// Old settings for backwards compatibility Map oldSettings = { diff --git a/lib/src/socket.dart b/lib/src/socket.dart index 016c08a..fa11149 100644 --- a/lib/src/socket.dart +++ b/lib/src/socket.dart @@ -350,12 +350,8 @@ class Socket extends EventEmitter { /// @api private void onack(packet) { 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']); - } else { -// debug('bad ack %s', packet.id); - } + Function.apply(ack, packet['data']); } /// Called upon client disconnect packet. diff --git a/pubspec.yaml b/pubspec.yaml index b42d222..899a71e 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -8,7 +8,7 @@ repository: https://github.com/rikulo/socket.io-dart issue_tracker: https://github.com/rikulo/socket.io-dart/issues environment: - sdk: '>=2.12.0 <3.0.0' + sdk: '>=2.12.0 <=3.7.0' dependencies: stream: ^3.0.0 From a651675eb0c5f6d6b1712899e034643b7b2bdad1 Mon Sep 17 00:00:00 2001 From: mryadavdilip Date: Wed, 9 Apr 2025 17:51:42 +0530 Subject: [PATCH 2/6] upgraded versions --- lib/src/adapter/adapter.dart | 42 +++++++-------- lib/src/client.dart | 8 ++- .../engine/transport/polling_transport.dart | 5 +- lib/src/engine/transport/transports.dart | 2 +- .../engine/transport/websocket_transport.dart | 3 +- lib/src/server.dart | 53 +++++++++---------- lib/src/socket.dart | 4 +- pubspec.yaml | 14 ++--- 8 files changed, 64 insertions(+), 67 deletions(-) diff --git a/lib/src/adapter/adapter.dart b/lib/src/adapter/adapter.dart index 4d4a08f..3ebb6e1 100644 --- a/lib/src/adapter/adapter.dart +++ b/lib/src/adapter/adapter.dart @@ -128,31 +128,31 @@ class _MemoryStoreAdapter extends EventEmitter implements Adapter { var socket; 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]]; - if (room == null) continue; - var sockets = room.sockets; - for (var id in sockets.keys) { - if (sockets.containsKey(id)) { - if (ids[id] != null || except.contains(id)) continue; - socket = nsp.connected[id]; - if (socket != null) { - socket.packet(encodedPackets, packetOpts); - ids[id] = true; - } + var encodedPackets = encoder.encode(packet); + + if (rooms.isNotEmpty) { + for (var i = 0; i < rooms.length; i++) { + var room = this.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.contains(id)) continue; + socket = nsp.connected[id]; + if (socket != null) { + socket.packet(encodedPackets, packetOpts); + ids[id] = true; } } } - } else { - for (var id in sids.keys) { - if (except.contains(id)) continue; - socket = nsp.connected[id]; - if (socket != null) socket.packet(encodedPackets, packetOpts); - } } - }); + } else { + for (var id in sids.keys) { + if (except.contains(id)) continue; + socket = nsp.connected[id]; + if (socket != null) socket.packet(encodedPackets, packetOpts); + } + } } /// Gets a list of clients by sid. diff --git a/lib/src/client.dart b/lib/src/client.dart index 745ebd5..59cd342 100644 --- a/lib/src/client.dart +++ b/lib/src/client.dart @@ -55,7 +55,7 @@ class Client { _logger.fine('connecting to namespace $name'); if (!server.nsps.containsKey(name)) { packet({ - 'type': ERROR, + 'type': CONNECT_ERROR, 'nsp': name, 'data': 'Invalid namespace' }); @@ -140,10 +140,8 @@ class Client { _logger.fine('writing packet $packet'); if (opts['preEncoded'] != true) { // not broadcasting, need to encode - encoder.encode(packet, (encodedPackets) { - // encode, then write results to engine - writeToEngine(encodedPackets); - }); + var encodedPackets = encoder.encode(packet); + writeToEngine(encodedPackets); } else { // a broadcast pre-encodes a packet writeToEngine(packet); diff --git a/lib/src/engine/transport/polling_transport.dart b/lib/src/engine/transport/polling_transport.dart index 397aad8..fc32e3f 100644 --- a/lib/src/engine/transport/polling_transport.dart +++ b/lib/src/engine/transport/polling_transport.dart @@ -191,7 +191,7 @@ class PollingTransport extends Transport { return true; }; - PacketParser.decodePayload(data, callback: callback); + PacketParser.decodePayload(data, callback); } } @@ -225,8 +225,7 @@ class PollingTransport extends Transport { } var self = this; - PacketParser.encodePayload(packets, supportsBinary: supportsBinary == true, - callback: (data) { + PacketParser.encodePayload(packets, callback: (data) { var compress = packets.any((packet) { var opt = packet['options']; return opt != null && opt['compress'] == true; diff --git a/lib/src/engine/transport/transports.dart b/lib/src/engine/transport/transports.dart index 910e8d3..f2eb996 100644 --- a/lib/src/engine/transport/transports.dart +++ b/lib/src/engine/transport/transports.dart @@ -95,7 +95,7 @@ abstract class Transport extends EventEmitter { if (messageHandler != null) { messageHandler!.handle(this, data); } else { - onPacket(PacketParser.decodePacket(data, utf8decode: true)); + onPacket(PacketParser.decodePacket(data, true)); } } diff --git a/lib/src/engine/transport/websocket_transport.dart b/lib/src/engine/transport/websocket_transport.dart index 4a23115..e0debe5 100644 --- a/lib/src/engine/transport/websocket_transport.dart +++ b/lib/src/engine/transport/websocket_transport.dart @@ -60,7 +60,8 @@ 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 ?? false, + callback: (_) => send(_, packet)); } } diff --git a/lib/src/server.dart b/lib/src/server.dart index 0f8677e..aca1d42 100644 --- a/lib/src/server.dart +++ b/lib/src/server.dart @@ -254,48 +254,47 @@ class Server { var completer = Completer(); var connectPacket = {'type': CONNECT, 'nsp': '/'}; - encoder.encode(connectPacket, (encodedPacket) { - // the CONNECT packet will be merged with Engine.IO handshake, - // to reduce the number of round trips - opts!['initialPacket'] = encodedPacket; + var encodedPacket = encoder.encode(connectPacket); + // 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 - engine = Engine.attach(server, opts); + _logger.fine('creating engine.io instance with opts $opts'); + // initialize engine + engine = Engine.attach(server, opts); - // attach static file serving + // attach static file serving // if (self._serveClient) self.attachServe(srv); - // Export http server - httpServer = server; + // Export http server + httpServer = server; - // bind to engine events - bind(engine!); + // bind to engine events + bind(engine!); + + completer.complete(); - completer.complete(); - }); await completer.future; // }); } else { var connectPacket = {'type': CONNECT, 'nsp': '/'}; - encoder.encode(connectPacket, (encodedPacket) { - // the CONNECT packet will be merged with Engine.IO handshake, - // to reduce the number of round trips - opts!['initialPacket'] = encodedPacket; + var encodedPacket = encoder.encode(connectPacket); + // 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 - engine = Engine.attach(srv, opts); + _logger.fine('creating engine.io instance with opts $opts'); + // initialize engine + engine = Engine.attach(srv, opts); - // attach static file serving + // attach static file serving // if (self._serveClient) self.attachServe(srv); - // Export http server - httpServer = srv; + // Export http server + httpServer = srv; - // bind to engine events - bind(engine!); - }); + // bind to engine events + bind(engine!); } return this; diff --git a/lib/src/socket.dart b/lib/src/socket.dart index fa11149..1945302 100644 --- a/lib/src/socket.dart +++ b/lib/src/socket.dart @@ -297,7 +297,7 @@ class Socket extends EventEmitter { ondisconnect(); break; - case ERROR: + case CONNECT_ERROR: emit('error', packet['data']); } } @@ -397,7 +397,7 @@ class Socket extends EventEmitter { /// @param {Object} error object /// @api private void error(err) { - packet({'type': ERROR, 'data': err}); + packet({'type': CONNECT_ERROR, 'data': err}); } /// Disconnects this client. diff --git a/pubspec.yaml b/pubspec.yaml index 899a71e..65f2c22 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: 1.0.1 +version: 1.0.2 homepage: https://www.zkoss.org repository: https://github.com/rikulo/socket.io-dart issue_tracker: https://github.com/rikulo/socket.io-dart/issues @@ -11,10 +11,10 @@ environment: sdk: '>=2.12.0 <=3.7.0' dependencies: - stream: ^3.0.0 - socket_io_common: ^1.0.1 - uuid: ^3.0.4 - logging: ^1.0.0 + stream: ^4.0.2 + socket_io_common: ^3.1.1 + uuid: ^4.5.1 + logging: ^1.3.0 dev_dependencies: - test: ^1.16.8 - pedantic: ^1.11.0 + test: ^1.25.15 + lints: ^5.1.1 From 4148ebe5ce16a148d6067ac98eb0681576776b0f Mon Sep 17 00:00:00 2001 From: mryadavdilip Date: Wed, 9 Apr 2025 18:10:49 +0530 Subject: [PATCH 3/6] issues --- analysis_options.yaml | 39 +++++++++++++---- lib/src/adapter/adapter.dart | 16 +++---- lib/src/client.dart | 8 ++-- lib/src/engine/server.dart | 20 ++++----- lib/src/engine/socket.dart | 43 +++++++++++-------- lib/src/engine/transport/jsonp_transport.dart | 6 +-- .../engine/transport/polling_transport.dart | 35 +++++++-------- .../engine/transport/websocket_transport.dart | 5 ++- lib/src/namespace.dart | 2 +- lib/src/server.dart | 11 +++-- lib/src/socket.dart | 9 ++-- 11 files changed, 109 insertions(+), 85 deletions(-) diff --git a/analysis_options.yaml b/analysis_options.yaml index 80bb834..35ff3c3 100644 --- a/analysis_options.yaml +++ b/analysis_options.yaml @@ -1,12 +1,35 @@ -# This file allows you to configure the Dart analyzer. +# This file configures the static analysis results for your project (errors, +# warnings, and lints). # -# 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 +# This enables the 'recommended' set of lints from `package:lints`. +# This set helps identify many issues that may lead to problems when running +# or consuming Dart code, and enforces writing Dart using a single, idiomatic +# style and format. +# +# If you want a smaller set of lints you can change this to specify +# 'package:lints/core.yaml'. These are just the most critical lints +# (the recommended set includes the core lints). +# The core lints are also what is used by pub.dev for scoring packages. + +include: package:lints/recommended.yaml analyzer: -# exclude: -# - path/to/excluded/files/** + errors: + dangling_library_doc_comments: ignore + implementation_imports: ignore + no_wildcard_variable_uses: ignore + +# Uncomment the following section to specify additional rules. + # linter: # rules: -# # see catalog here: http://dart-lang.github.io/linter/lints/ -# - hash_and_equals +# - camel_case_types + +# analyzer: +# exclude: +# - path/to/excluded/files/** + +# For more information about the core and recommended set of lints, see +# https://dart.dev/go/core-lints + +# For additional information about configuring this file, see +# https://dart.dev/guides/language/analysis-options diff --git a/lib/src/adapter/adapter.dart b/lib/src/adapter/adapter.dart index 3ebb6e1..8d4a3ff 100644 --- a/lib/src/adapter/adapter.dart +++ b/lib/src/adapter/adapter.dart @@ -10,12 +10,13 @@ /// Copyright (C) 2017 Potix Corporation. All Rights Reserved. import 'dart:async'; import 'package:socket_io/src/namespace.dart'; +import 'package:socket_io/src/socket.dart'; import 'package:socket_io_common/src/parser/parser.dart'; import 'package:socket_io/src/util/event_emitter.dart'; abstract class Adapter { Map nsps = {}; - Map rooms = {}; + Map rooms = {}; Map sids = {}; void add(String id, String room, [dynamic Function([dynamic]) fn]); @@ -37,15 +38,14 @@ class _MemoryStoreAdapter extends EventEmitter implements Adapter { @override Map nsps = {}; @override - Map rooms = {}; + Map rooms = {}; @override Map sids = {}; late Encoder encoder; late Namespace nsp; - _MemoryStoreAdapter(Namespace nsp) { - this.nsp = nsp; + _MemoryStoreAdapter(this.nsp) { encoder = nsp.server.encoder; } @@ -60,7 +60,7 @@ class _MemoryStoreAdapter extends EventEmitter implements Adapter { void add(String id, String room, [dynamic Function([dynamic])? fn]) { sids[id] = sids[id] ?? {}; sids[id]![room] = true; - rooms[room] = rooms[room] ?? _Room(); + rooms[room] = rooms[room] ?? Room(); rooms[room]!.add(id); if (fn != null) scheduleMicrotask(() => fn(null)); } @@ -125,7 +125,7 @@ class _MemoryStoreAdapter extends EventEmitter implements Adapter { 'compress': flags['compress'] }; var ids = {}; - var socket; + Socket? socket; packet['nsp'] = nsp.name; var encodedPackets = encoder.encode(packet); @@ -165,7 +165,7 @@ class _MemoryStoreAdapter extends EventEmitter implements Adapter { [List rooms = const [], dynamic Function([dynamic])? fn]) { var ids = {}; var sids = []; - var socket; + Socket? socket; if (rooms.isNotEmpty) { for (var i = 0; i < rooms.length; i++) { @@ -208,7 +208,7 @@ class _MemoryStoreAdapter extends EventEmitter implements Adapter { /// Room constructor. /// /// @api private -class _Room { +class Room { Map sockets = {}; int length = 0; diff --git a/lib/src/client.dart b/lib/src/client.dart index 59cd342..9a294c7 100644 --- a/lib/src/client.dart +++ b/lib/src/client.dart @@ -187,9 +187,9 @@ class Client { /// @param {Objcet} error object /// @api private void onerror(err) { - sockets.forEach((socket) { + for (var socket in sockets) { socket.onerror(err); - }); + } onclose('client error'); } @@ -205,9 +205,9 @@ class Client { // `nsps` and `sockets` are cleaned up seamlessly if (sockets.isNotEmpty) { - List.from(sockets).forEach((socket) { + for (var socket in List.from(sockets)) { socket.onclose(reason); - }); + } sockets.clear(); } decoder.destroy(); // clean up decoder diff --git a/lib/src/engine/server.dart b/lib/src/engine/server.dart index 4c552bb..9941fb7 100644 --- a/lib/src/engine/server.dart +++ b/lib/src/engine/server.dart @@ -134,7 +134,7 @@ class Server extends Engine { /// @return {Boolean} whether the request is valid /// @api private - void verify(SocketConnect connect, bool upgrade, fn) { + dynamic verify(SocketConnect connect, bool upgrade, fn) { // transport check var req = connect.request; var transport = req.uri.queryParameters['transport']; @@ -261,7 +261,7 @@ class Server extends Engine { var id = generateId(connect); _logger.fine('handshaking client $id'); - var transport; + dynamic transport; var req = connect.request; try { transport = Transports.newInstance(transportName, connect); @@ -285,11 +285,8 @@ class Server extends Engine { if (cookie?.isNotEmpty == true) { transport.on('headers', (headers) { - headers['Set-Cookie'] = '$cookie=${Uri.encodeComponent(id)}' + - (cookiePath?.isNotEmpty == true ? '; Path=$cookiePath' : '') + - (cookiePath?.isNotEmpty == true && cookieHttpOnly == true - ? '; HttpOnly' - : ''); + headers['Set-Cookie'] = + '$cookie=${Uri.encodeComponent(id)}${cookiePath?.isNotEmpty == true ? '; Path=$cookiePath' : ''}${cookiePath?.isNotEmpty == true && cookieHttpOnly == true ? '; HttpOnly' : ''}'; }); } @@ -433,11 +430,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' + - message); + '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 dbf46d4..ab11426 100644 --- a/lib/src/engine/socket.dart +++ b/lib/src/engine/socket.dart @@ -140,10 +140,10 @@ class Socket extends EventEmitter { void setTransport(Transport transport) { var onError = this.onError; var onPacket = this.onPacket; - var flush = (_) => this.flush(); - var onClose = (_) { + flush(_) => this.flush(); + onClose(_) { this.onClose('transport close'); - }; + } this.transport = transport; this.transport.once('error', onError); @@ -182,16 +182,16 @@ class Socket extends EventEmitter { }); // we force a polling cycle to ensure a fast upgrade - var check = () { + check() { if ('polling' == this.transport.name && this.transport.writable == true) { _logger.fine('writing a noop packet to polling for fast upgrade'); this.transport.send([ {'type': 'noop'} ]); } - }; + } - var onPacket = (packet) { + onPacket(packet) { if ('ping' == packet['type'] && 'probe' == packet['data']) { transport.send([ {'type': 'pong', 'data': 'probe'} @@ -221,24 +221,24 @@ class Socket extends EventEmitter { cleanupFn['cleanup'](); transport.close(); } - }; + } - var onError = (err) { + onError(err) { _logger.fine('client did not complete upgrade - $err'); cleanupFn['cleanup'](); transport.close(); transport = null; - }; + } - var onTransportClose = (_) { + onTransportClose(_) { onError('transport closed'); - }; + } - var onClose = (_) { + onClose(_) { onError('socket closed'); - }; + } - var cleanup = () { + cleanup() { upgrading = false; checkIntervalTimer?.cancel(); checkIntervalTimer = null; @@ -250,7 +250,8 @@ class Socket extends EventEmitter { transport.off('close', onTransportClose); transport.off('error', onError); off('close', onClose); - }; + } + cleanupFn['cleanup'] = cleanup; // define it later transport.on('packet', onPacket); transport.once('close', onTransportClose); @@ -263,7 +264,7 @@ class Socket extends EventEmitter { /// /// @api private void clearTransport() { - var cleanup; + dynamic cleanup; var toCleanUp = cleanupFn.length; @@ -311,7 +312,7 @@ class Socket extends EventEmitter { /// @api private void setupSendCallback() { // the message was sent successfully, execute the callback - var onDrain = (_) { + onDrain(_) { if (sentCallbackFn.isNotEmpty) { var seqFn = sentCallbackFn[0]; _logger.fine('executing send callback'); @@ -326,7 +327,7 @@ class Socket extends EventEmitter { /// } /// } } - }; + } transport.on('drain', onDrain); @@ -389,7 +390,11 @@ class Socket extends EventEmitter { var wbuf = writeBuffer; writeBuffer = []; if (transport.supportsFraming == false) { - sentCallbackFn.add((_) => packetsFn.forEach((f) => f(_))); + sentCallbackFn.add((_) { + for (var f in packetsFn) { + return f(); + } + }); } else { sentCallbackFn.addAll(packetsFn); } diff --git a/lib/src/engine/transport/jsonp_transport.dart b/lib/src/engine/transport/jsonp_transport.dart index 86df83e..7e97a4d 100644 --- a/lib/src/engine/transport/jsonp_transport.dart +++ b/lib/src/engine/transport/jsonp_transport.dart @@ -16,10 +16,8 @@ class JSONPTransport extends PollingTransport { late String head; late String foot; JSONPTransport(SocketConnect connect) : super(connect) { - head = '___eio[' + - (connect.request.uri.queryParameters['j'] ?? '') - .replaceAll(RegExp('[^0-9]'), '') + - ']('; + head = + '___eio[${(connect.request.uri.queryParameters['j'] ?? '').replaceAll(RegExp('[^0-9]'), '')}]('; foot = ');'; } diff --git a/lib/src/engine/transport/polling_transport.dart b/lib/src/engine/transport/polling_transport.dart index fc32e3f..0b0193e 100644 --- a/lib/src/engine/transport/polling_transport.dart +++ b/lib/src/engine/transport/polling_transport.dart @@ -67,14 +67,14 @@ class PollingTransport extends Transport { this.connect = connect; - var onClose = () { + onClose() { onError('poll connection closed prematurely'); - }; + } - var cleanup = () { + cleanup() { _reqCloses.remove(connect); this.connect = null; - }; + } _reqCleanups[connect] = cleanup; _reqCloses[connect] = onClose; @@ -111,16 +111,16 @@ class PollingTransport extends Transport { dynamic chunks = isBinary ? [0] : ''; var self = this; StreamSubscription? subscription; - var cleanup = () { + cleanup() { chunks = isBinary ? [0] : ''; if (subscription != null) { subscription.cancel(); } self.dataReq = null; - }; + } - var onData = (List data) { - var contentLength; + onData(List data) { + dynamic contentLength; if (data is String) { chunks += data; contentLength = utf8.encode(chunks).length; @@ -140,9 +140,9 @@ class PollingTransport extends Transport { chunks = ''; connect.close(); } - }; + } - var onEnd = () { + onEnd() { self.onData(chunks); var headers = {'Content-Type': 'text/html', 'Content-Length': 2}; @@ -160,7 +160,7 @@ class PollingTransport extends Transport { res.write('ok'); connect.close(); cleanup(); - }; + } subscription = connect.request.listen(onData, onDone: onEnd); if (!isBinary) { @@ -180,7 +180,7 @@ class PollingTransport extends Transport { messageHandler!.handle(this, data); } else { var self = this; - var callback = (packet, [foo, bar]) { + callback(packet, [foo, bar]) { if ('close' == packet['type']) { _logger.fine('got xhr close packet'); self.onClose(); @@ -189,7 +189,7 @@ class PollingTransport extends Transport { self.onPacket(packet); return true; - }; + } PacketParser.decodePayload(data, callback); } @@ -260,7 +260,7 @@ class PollingTransport extends Transport { final headers = {'Content-Type': contentType}; - var respond = (data) { + respond(data) { headers[HttpHeaders.contentLengthHeader] = data is String ? utf8.encode(data).length : data.length; var res = self.connect!.response; @@ -294,7 +294,7 @@ class PollingTransport extends Transport { } } callback(); - }; + } if (httpCompression == null || options['compress'] != true) { respond(data); @@ -345,11 +345,12 @@ class PollingTransport extends Transport { dataReq = null; } - var onClose = () { + onClose() { if (closeTimeoutTimer != null) closeTimeoutTimer.cancel(); if (fn != null) fn(); self.onClose(); - }; + } + if (writable == true) { _logger.fine('transport writable - closing right away'); send([ diff --git a/lib/src/engine/transport/websocket_transport.dart b/lib/src/engine/transport/websocket_transport.dart index e0debe5..5bd57e8 100644 --- a/lib/src/engine/transport/websocket_transport.dart +++ b/lib/src/engine/transport/websocket_transport.dart @@ -32,7 +32,7 @@ class WebSocketTransport extends Transport { @override void send(List packets) { - var send = (data, Map packet) { + send(data, Map packet) { _logger.fine('writing "$data"'); // always creates a new object since ws modifies it @@ -50,7 +50,7 @@ class WebSocketTransport extends Transport { // this.writable = false; connect!.websocket?.add(data); - }; + } // function onEnd (err) { // if (err) return self.onError('write error', err.stack); @@ -61,6 +61,7 @@ class WebSocketTransport extends Transport { var packet = packets[i]; PacketParser.encodePacket(packet, supportsBinary: supportsBinary ?? false, + // ignore: no_wildcard_variable_uses callback: (_) => send(_, packet)); } } diff --git a/lib/src/namespace.dart b/lib/src/namespace.dart index 192325a..f1821f1 100644 --- a/lib/src/namespace.dart +++ b/lib/src/namespace.dart @@ -71,7 +71,7 @@ class Namespace extends EventEmitter { /// @param {Socket} socket that will get added /// @param {Function} last fn call in the middleware /// @api private - void run(socket, Function fn) { + dynamic run(socket, Function fn) { var fns = this.fns.sublist(0); if (fns.isEmpty) return fn(null); diff --git a/lib/src/server.dart b/lib/src/server.dart index aca1d42..a7cd12e 100644 --- a/lib/src/server.dart +++ b/lib/src/server.dart @@ -84,7 +84,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]) { + dynamic checkRequest(HttpRequest req, [Function? fn]) { var origin = req.headers.value('origin') ?? req.headers.value('referer'); // file:// URLs produce a null Origin which can't be authorized via echo-back @@ -104,9 +104,9 @@ class Server { try { var parts = Uri.parse(origin); var port = parts.port; - 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') >= 0 || + _origins.indexOf('${parts.host}:*') >= 0 || + _origins.indexOf('*:$port') >= 0; return fn!(null, ok); } catch (ex) { @@ -141,7 +141,6 @@ class Server { if (err) { return next(Exception(err)); } - ; if (!authorized) { return next(Exception('Not authorized')); } @@ -377,7 +376,7 @@ class Server { /// @api public Namespace of(name, [fn]) { if (name.toString()[0] != '/') { - name = '/' + name; + name = '/$name'; } if (!nsps.containsKey(name)) { diff --git a/lib/src/socket.dart b/lib/src/socket.dart index 1945302..c3cb7df 100644 --- a/lib/src/socket.dart +++ b/lib/src/socket.dart @@ -54,7 +54,7 @@ class Socket extends EventEmitter { late Adapter adapter; late String id; late HttpRequest request; - var conn; + dynamic conn; Map roomMap = {}; List roomList = []; Map acks = {}; @@ -79,19 +79,20 @@ class Socket extends EventEmitter { /// /// @api private Map buildHandshake(query) { - final buildQuery = () { + buildQuery() { 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': request.headers, 'time': DateTime.now().toString(), 'address': conn.remoteAddress, 'xdomain': request.headers.value('origin') != null, - // TODO 'secure': ! !this.request.connectionInfo.encrypted, + // TODO #57 'secure': ! !this.request.connectionInfo.encrypted, 'issued': DateTime.now().millisecondsSinceEpoch, 'url': request.uri.path, 'query': buildQuery() From 80086e740daa1050a2642d81a651912c248efaa4 Mon Sep 17 00:00:00 2001 From: mryadavdilip Date: Wed, 9 Apr 2025 21:34:18 +0530 Subject: [PATCH 4/6] ip address option --- lib/src/server.dart | 79 ++++++++++++++----------------------------- test/socket.test.dart | 2 +- 2 files changed, 27 insertions(+), 54 deletions(-) diff --git a/lib/src/server.dart b/lib/src/server.dart index a7cd12e..6905a45 100644 --- a/lib/src/server.dart +++ b/lib/src/server.dart @@ -63,16 +63,16 @@ class Server { /// @param {http.Server|Number|Object} http server, port or options /// @param {Object} options /// @api public - Server({server, Map? options}) { + Server({String? address, int? port, Map? options}) { options ??= {}; path(options.containsKey('path') ? options['path'] : '/socket.io'); serveClient(false != options['serveClient']); adapter = options.containsKey('adapter') ? options['adapter'] : 'default'; origins(options.containsKey('origins') ? options['origins'] : '*:*'); sockets = of('/'); - if (server != null) { + if (port != null) { _ready = Future(() async { - await attach(server, options); + await attach(address: address, port: port, opts: options); return true; }); } else { @@ -206,8 +206,8 @@ class Server { /// @param {Object} options passed to engine.io /// @return {Server} self /// @api public - Future listen(srv, [Map? opts]) async { - await attach(srv, opts); + Future listen({String? address, required int port, Map? opts}) async { + await attach(address: address, port: port, opts: opts); } /// Attaches socket.io to a server or port. @@ -216,18 +216,13 @@ class Server { /// @param {Object} options passed to engine.io /// @return {Server} self /// @api public - Future attach(dynamic srv, [Map? opts]) async { - if (srv is Function) { + Future attach({String? address, required int port, Map? opts}) async { + if (port is Function) { var msg = 'You are trying to attach socket.io to an express ' 'request handler function. Please pass a http.Server instance.'; throw Exception(msg); } - // handle a port as a string - if (srv is String && int.parse(srv.toString()).toString() == srv) { - srv = int.parse(srv.toString()); - } - opts ??= {}; // set engine.io path to `/socket.io` @@ -237,11 +232,9 @@ class Server { // set origins verification opts['allowRequest'] = checkRequest; - if (srv is num) { - _logger.fine('creating http server and binding to $srv'); - var port = srv.toInt(); - var server = StreamServer(); - await server.start(port: port); + _logger.fine('creating http server and binding to $port'); + var server = StreamServer(); + await server.start(address: address, port: port); // HttpServer.bind(InternetAddress.ANY_IP_V4, port).then(( // HttpServer server) { // this.httpServer = server; @@ -251,50 +244,30 @@ class Server { //// response.close(); //// }); - var completer = Completer(); - var connectPacket = {'type': CONNECT, 'nsp': '/'}; - var encodedPacket = encoder.encode(connectPacket); - // the CONNECT packet will be merged with Engine.IO handshake, - // to reduce the number of round trips - opts['initialPacket'] = encodedPacket; + var completer = Completer(); + var connectPacket = {'type': CONNECT, 'nsp': '/'}; + var encodedPacket = encoder.encode(connectPacket); + // 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 - engine = Engine.attach(server, opts); + _logger.fine('creating engine.io instance with opts $opts'); + // initialize engine + engine = Engine.attach(server, opts); - // attach static file serving + // attach static file serving // if (self._serveClient) self.attachServe(srv); - // Export http server - httpServer = server; + // Export http server + httpServer = server; - // bind to engine events - bind(engine!); + // bind to engine events + bind(engine!); - completer.complete(); + completer.complete(); - await completer.future; + await completer.future; // }); - } else { - var connectPacket = {'type': CONNECT, 'nsp': '/'}; - var encodedPacket = encoder.encode(connectPacket); - // 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 - engine = Engine.attach(srv, opts); - - // attach static file serving -// if (self._serveClient) self.attachServe(srv); - - // Export http server - httpServer = srv; - - // bind to engine events - bind(engine!); - } return this; } diff --git a/test/socket.test.dart b/test/socket.test.dart index bc9b5f1..44b331e 100644 --- a/test/socket.test.dart +++ b/test/socket.test.dart @@ -31,7 +31,7 @@ void main() { client.emit('fromServer', 'ok'); }); }); - await io.listen(3000); + await io.listen(port: 3000); }); }); } From dcf7b6aec0764e57657b2b71e1bfb59e27b3eabe Mon Sep 17 00:00:00 2001 From: Dilip Yadav Date: Fri, 2 May 2025 22:20:12 +0530 Subject: [PATCH 5/6] Update pubspec.yaml --- pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pubspec.yaml b/pubspec.yaml index 65f2c22..8b6dbb4 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -8,7 +8,7 @@ repository: https://github.com/rikulo/socket.io-dart issue_tracker: https://github.com/rikulo/socket.io-dart/issues environment: - sdk: '>=2.12.0 <=3.7.0' + sdk: '>=2.12.0 <=3.7.2' dependencies: stream: ^4.0.2 From 9600982834e0267564788cb8ed0ab70b980c5552 Mon Sep 17 00:00:00 2001 From: Dilip Yadav Date: Thu, 9 Oct 2025 17:38:58 +0530 Subject: [PATCH 6/6] version --- pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pubspec.yaml b/pubspec.yaml index 65f2c22..aa7c507 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -8,7 +8,7 @@ repository: https://github.com/rikulo/socket.io-dart issue_tracker: https://github.com/rikulo/socket.io-dart/issues environment: - sdk: '>=2.12.0 <=3.7.0' + sdk: '>=2.12.0 <=3.12.0' dependencies: stream: ^4.0.2