diff --git a/CHANGELOG.md b/CHANGELOG.md index 0257f55..4d85d6d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,8 +1,9 @@ -## 1.0.0-nullsafety.0 +## 2.0.0-beta.1 **New Feature:** -* [#132](https://github.com/rikulo/socket.io-client-dart/issues/132) Migrating to null safety for Dart +* [#130](https://github.com/rikulo/socket.io-client-dart/issues/130) Cannot connect to socket.io V3 +* [#106](https://github.com/rikulo/socket.io-client-dart/issues/106) Can we combine emitWithBinary to emit? ## 0.9.12 diff --git a/README.md b/README.md index 00c6580..7704a98 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,13 @@ # socket.io-client-dart -Port of awesome JavaScript Node.js library - [Socket.io-client v2.0.1](https://github.com/socketio/socket.io-client) - in Dart +Port of awesome JavaScript Node.js library - [Socket.io-client v2.0.1~v3.0.3](https://github.com/socketio/socket.io-client) - in Dart + +### Version info: + +| socket.io-client-dart | Socket.io Server +-------------------|---------------- +`v0.9.*` ~ `v1.* ` | `v2.*` +`v2.*` | `v3.*` ## Usage diff --git a/example/README.md b/example/README.md index f61b0b9..e876c9c 100644 --- a/example/README.md +++ b/example/README.md @@ -1,6 +1,13 @@ # socket.io-client-dart -Port of awesome JavaScript Node.js library - [Socket.io-client v2.0.1](https://github.com/socketio/socket.io-client) - in Dart +Port of awesome JavaScript Node.js library - [Socket.io-client v2.0.1~v3.0.3](https://github.com/socketio/socket.io-client) - in Dart + +### Version info: + +| socket.io-client-dart | Socket.io Server +-------------------|---------------- +`v0.9.*` ~ `v1.* ` | `v2.*` +`v2.*` | `v3.*` ## Usage diff --git a/lib/src/engine/socket.dart b/lib/src/engine/socket.dart index 55a03ab..2d3c76f 100644 --- a/lib/src/engine/socket.dart +++ b/lib/src/engine/socket.dart @@ -449,8 +449,9 @@ class Socket extends EventEmitter { onHandshake(json.decode(data ?? 'null')); break; - case 'pong': - setPing(); + case 'ping': + resetPingTimeout(); + sendPacket(type: 'pong'); emit('pong'); break; @@ -468,6 +469,18 @@ class Socket extends EventEmitter { } } + /// + ///Sets and resets ping timeout timer based on server pings. + /// @api private + /// + void resetPingTimeout() { + pingTimeoutTimer?.cancel(); + pingTimeoutTimer = + Timer(Duration(milliseconds: pingInterval + pingTimeout), () { + onClose('ping timeout'); + }); + } + /// /// Called upon handshake completion. /// @@ -483,48 +496,33 @@ class Socket extends EventEmitter { onOpen(); // In case open handler closes socket if ('closed' == readyState) return; - setPing(); + resetPingTimeout(); // Prolong liveness of socket on heartbeat - off('heartbeat', onHeartbeat); - on('heartbeat', onHeartbeat); + // off('heartbeat', onHeartbeat); + // on('heartbeat', onHeartbeat); } /// /// Resets ping timeout. /// /// @api private - void onHeartbeat(timeout) { - pingTimeoutTimer?.cancel(); - pingTimeoutTimer = Timer( - Duration(milliseconds: timeout ?? (pingInterval + pingTimeout)), () { - if ('closed' == readyState) return; - onClose('ping timeout'); - }); - } - - /// - /// Pings server every `this.pingInterval` and expects response - /// within `this.pingTimeout` or closes connection. - /// - /// @api private - void setPing() { - pingIntervalTimer?.cancel(); - pingIntervalTimer = Timer(Duration(milliseconds: pingInterval), () { - _logger - .fine('writing ping packet - expecting pong within ${pingTimeout}ms'); - ping(); - onHeartbeat(pingTimeout); - }); - } + // void onHeartbeat(timeout) { + // pingTimeoutTimer?.cancel(); + // pingTimeoutTimer = Timer( + // Duration(milliseconds: timeout ?? (pingInterval + pingTimeout)), () { + // if ('closed' == readyState) return; + // onClose('ping timeout'); + // }); + // } /// /// Sends a ping packet. /// /// @api private - void ping() { - sendPacket(type: 'ping', callback: (_) => emit('ping')); - } + // void ping() { + // sendPacket(type: 'ping', callback: (_) => emit('ping')); + // } /// /// Called on `drain` event diff --git a/lib/src/engine/transport/polling_transport.dart b/lib/src/engine/transport/polling_transport.dart index ce13337..f67e8c4 100644 --- a/lib/src/engine/transport/polling_transport.dart +++ b/lib/src/engine/transport/polling_transport.dart @@ -127,8 +127,7 @@ abstract class PollingTransport extends Transport { }; // decode payload - PacketParser.decodePayload(data, - binaryType: socket?.binaryType != true, callback: callback); + PacketParser.decodePayload(data, socket!.binaryType).forEach(callback); // if an event did not trigger closing if ('closed' != readyState) { @@ -185,8 +184,7 @@ abstract class PollingTransport extends Transport { self.emit('drain'); }; - PacketParser.encodePayload(packets, supportsBinary: supportsBinary != false, - callback: (data) { + PacketParser.encodePayload(packets, callback: (data) { self.doWrite(data, callbackfn); }); } diff --git a/lib/src/engine/transport/transport.dart b/lib/src/engine/transport/transport.dart index d63b3b6..bf21d13 100644 --- a/lib/src/engine/transport/transport.dart +++ b/lib/src/engine/transport/transport.dart @@ -117,8 +117,7 @@ abstract class Transport extends EventEmitter { /// @param {String} data /// @api private void onData(data) { - var packet = PacketParser.decodePacket(data, - binaryType: socket?.binaryType, utf8decode: false); + var packet = PacketParser.decodePacket(data, socket!.binaryType); onPacket(packet); } diff --git a/lib/src/manager.dart b/lib/src/manager.dart index baec973..fcaeb10 100644 --- a/lib/src/manager.dart +++ b/lib/src/manager.dart @@ -257,7 +257,7 @@ class Manager extends EventEmitter { var socket = engine; subs.add(util.on(socket, 'data', ondata)); subs.add(util.on(socket, 'ping', onping)); - subs.add(util.on(socket, 'pong', onpong)); + // subs.add(util.on(socket, 'pong', onpong)); subs.add(util.on(socket, 'error', onerror)); subs.add(util.on(socket, 'close', onclose)); subs.add(util.on(decoder, 'decoded', ondecoded)); @@ -278,9 +278,9 @@ class Manager extends EventEmitter { /// /// @api private /// - void onpong([_]) { - emitAll('pong', DateTime.now().millisecondsSinceEpoch - lastPing!); - } + // void onpong([_]) { + // emitAll('pong', DateTime.now().millisecondsSinceEpoch - lastPing); + // } /// /// Called with data. @@ -366,20 +366,18 @@ class Manager extends EventEmitter { packet['nsp'] += '''?${packet['query']}'''; } - if (encoding != true) { - // encode, then write to engine with result - encoding = true; - encoder.encode(packet, (encodedPackets) { - for (var i = 0; i < encodedPackets.length; i++) { - engine.write(encodedPackets[i], packet['options']); - } - encoding = false; - processPacketQueue(); - }); - } else { - // add packet to the queue - packetBuffer.add(packet); + // if (encoding != true) { + // encode, then write to engine with result + // encoding = true; + var encodedPackets = encoder.encode(packet); + + for (var i = 0; i < encodedPackets.length; i++) { + engine.write(encodedPackets[i], packet['options']); } + // } else { + // add packet to the queue + // packetBuffer.add(packet); + // } } /// diff --git a/lib/src/socket.dart b/lib/src/socket.dart index aba6856..5f07b95 100644 --- a/lib/src/socket.dart +++ b/lib/src/socket.dart @@ -123,10 +123,6 @@ class Socket extends EventEmitter { emitWithAck(event, data); } - void emitWithBinary(String event, [data]) { - emitWithAck(event, data, binary: true); - } - /// /// Emits to this client. /// @@ -147,7 +143,7 @@ class Socket extends EventEmitter { } var packet = { - 'type': binary ? BINARY_EVENT : EVENT, + 'type': EVENT, 'data': sendData, 'options': {'compress': flags?.isNotEmpty == true && flags!['compress']} }; @@ -186,13 +182,13 @@ class Socket extends EventEmitter { _logger.fine('transport is open - connecting'); // write connect packet if necessary - if ('/' != nsp) { - if (query?.isNotEmpty == true) { - packet({'type': CONNECT, 'query': query}); - } else { - packet({'type': CONNECT}); - } + // if ('/' != nsp) { + if (query?.isNotEmpty == true) { + packet({'type': CONNECT, 'query': query}); + } else { + packet({'type': CONNECT}); } + // } } /// @@ -242,7 +238,7 @@ class Socket extends EventEmitter { ondisconnect(); break; - case ERROR: + case CONNECT_ERROR: emit('error', packet['data']); break; } diff --git a/pubspec.yaml b/pubspec.yaml index e5a6757..5c08da7 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,6 +1,6 @@ name: socket_io_client description: Dartlang port of socket.io-client for web, flutter, dartvm to use -version: 1.0.0-nullsafety.0 +version: 2.0.0-beta-nullsafety.0 homepage: https://www.zkoss.org repository: https://github.com/rikulo/socket.io-client-dart issue_tracker: https://github.com/rikulo/socket.io-client-dart/issues @@ -9,14 +9,13 @@ environment: sdk: '>=2.12.0-0 <3.0.0' dependencies: - socket_io_common: '^1.0.0-nullsafety.1' - js: '^0.6.3-nullsafety.3' - logging: '^1.0.0-nullsafety.0' - -dependency_overrides: logging: '^1.0.0-nullsafety.0' + socket_io_common: '^2.0.0-beta-nullsafety.0' dev_dependencies: - socket_io: any - build_runner: any - build_web_compilers: any + test: ">=1.3.0 <2.0.0" +# build_runner: any +# build_web_compilers: any +# socket_io: any // support Socket.io v2.* only + + diff --git a/test/io_client.dart b/test/io_client.dart index 67008c2..11f569d 100644 --- a/test/io_client.dart +++ b/test/io_client.dart @@ -5,18 +5,24 @@ import 'dart:async'; import 'package:socket_io_client/socket_io_client.dart' as io; void main() { - var socket = io.io('http://localhost:3000', { - 'transports': ['websocket'], - 'extraHeaders': {'foo': 'bar'} - }); - socket.on('connect', (_) { - print('connect'); - socket.emit('msg', 'init'); + var socket = io.io( + 'http://localhost:3000', + io.OptionBuilder() + .setTransports(['websocket']) + // .disableAutoConnect() + .build()); + + // socket.connect(); + + socket.onConnect((_) { + socket.emit('toServer', 'init'); + var count = 0; Timer.periodic(const Duration(seconds: 1), (Timer countDownTimer) { - socket.emit('msg', count++); + socket.emit('toServer', count++); }); }); + socket.on('event', (data) => print(data)); socket.on('disconnect', (_) => print('disconnect')); socket.on('fromServer', (_) => print(_)); diff --git a/test/server.dart b/test/server.dart.txt similarity index 90% rename from test/server.dart rename to test/server.dart.txt index b822b7c..accd40b 100644 --- a/test/server.dart +++ b/test/server.dart.txt @@ -10,6 +10,7 @@ * * Copyright (C) 2017 Potix Corporation. All Rights Reserved. */ + /// Socket.io-dart server does not support Socket.io v3 spec. import 'package:socket_io/socket_io.dart'; void main() { diff --git a/test_nodejs/io_client.js b/test_nodejs/io_client.js new file mode 100644 index 0000000..78d6ea6 --- /dev/null +++ b/test_nodejs/io_client.js @@ -0,0 +1,27 @@ +/** + * io_client.js + * + * Purpose: + * + * Description: + * + * History: + * 2020/5/29, Created by jumperchen + * + * Copyright (C) 2020 Potix Corporation. All Rights Reserved. + */ +'use strict'; +const io = require('socket.io-client'); + +var socket = io('http://localhost:3000', { + transports: ['websocket'], + autoConnect: false +}); +socket.on('connect', function(){ + console.log('connect'); + socket.emit('msg', 'hi') +}); +socket.connect(); +socket.on('connect_error', function(){console.log('connect_error')}); +socket.on('event', function(data){}); +socket.on('disconnect', function(){console.log('disconnect')}); diff --git a/test_nodejs/package.json b/test_nodejs/package.json index fe4bcf8..0145b89 100644 --- a/test_nodejs/package.json +++ b/test_nodejs/package.json @@ -3,6 +3,8 @@ "version": "0.0.1", "description": "my first socket.io app", "dependencies": { - "socket.io": "^2.3.0" + "express": "^4.17.1", + "socket.io": "^3.0.3", + "socket.io-client": "^3.0.3" } } diff --git a/test_nodejs/server.js b/test_nodejs/server.js index 66ef26d..74be9d7 100644 --- a/test_nodejs/server.js +++ b/test_nodejs/server.js @@ -11,21 +11,16 @@ * Copyright (C) 2019 Potix Corporation. All Rights Reserved. */ 'use strict'; -var http = require('http').createServer(); -var io = require('socket.io')(http); - -io.on('connection', function(socket){ - console.log('connection default namespace'); - socket.on('msg', function (data, ack) { - if (ack != null) { - ack(1, 2, 3); - } - console.log(`data from default => ${data}`); - socket.emit('fromServer', `${data}`); +const app = require('express')(); +const server = require('http').createServer(app); +const io = require('socket.io')(server); +io.on('connection', userSocket => { + console.log('connected'); + userSocket.on('toServer', data => { + userSocket.emit('fromServer', data); }); }); - -http.listen(3000, function(){ +server.listen(3000, function(){ console.log('listening on *:3000'); });