Skip to content

Commit ad9912a

Browse files
committed
Resolve #132 Migrating to null safety for Dart
1 parent 7e728f5 commit ad9912a

12 files changed

+302
-285
lines changed

CHANGELOG.md

+7
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,10 @@
1+
## 1.0.0-nullsafety.0
2+
3+
**New Feature:**
4+
5+
* [#132](https://github.com/rikulo/socket.io-client-dart/issues/132) Migrating to null safety for Dart
6+
7+
18
## 0.9.12
29

310
**New Feature:**

lib/src/engine/socket.dart

+66-69
Original file line numberDiff line numberDiff line change
@@ -29,44 +29,44 @@ final Logger _logger = Logger('socket_io_client:engine.Socket');
2929
/// @api public
3030
///
3131
class Socket extends EventEmitter {
32-
Map opts;
33-
Uri uri;
34-
bool secure;
35-
bool agent;
36-
String hostname;
37-
int port;
38-
Map query;
39-
bool upgrade;
40-
String path;
41-
bool forceJSONP;
42-
bool jsonp;
43-
bool forceBase64;
44-
bool enablesXDR;
45-
String timestampParam;
32+
late Map opts;
33+
late Uri uri;
34+
late bool secure;
35+
bool? agent;
36+
late String hostname;
37+
int? port;
38+
late Map query;
39+
bool? upgrade;
40+
late String path;
41+
bool? forceJSONP;
42+
bool? jsonp;
43+
bool? forceBase64;
44+
bool? enablesXDR;
45+
String? timestampParam;
4646
var timestampRequests;
47-
List<String> transports;
48-
Map transportOptions;
49-
String readyState;
50-
List writeBuffer;
51-
int prevBufferLen;
52-
int policyPort;
53-
bool rememberUpgrade;
47+
late List<String> transports;
48+
late Map transportOptions;
49+
String readyState = '';
50+
List writeBuffer = [];
51+
int prevBufferLen = 0;
52+
int? policyPort;
53+
bool? rememberUpgrade;
5454
var binaryType;
55-
bool onlyBinaryUpgrades;
56-
Map perMessageDeflate;
57-
String id;
58-
List upgrades;
59-
int pingInterval;
60-
int pingTimeout;
61-
Timer pingIntervalTimer;
62-
Timer pingTimeoutTimer;
63-
int requestTimeout;
64-
Transport transport;
65-
bool supportsBinary;
66-
bool upgrading;
67-
Map extraHeaders;
68-
69-
Socket(String uri, Map opts) {
55+
bool? onlyBinaryUpgrades;
56+
late Map perMessageDeflate;
57+
String? id;
58+
late List upgrades;
59+
late int pingInterval;
60+
late int pingTimeout;
61+
Timer? pingIntervalTimer;
62+
Timer? pingTimeoutTimer;
63+
int? requestTimeout;
64+
Transport? transport;
65+
bool? supportsBinary;
66+
bool? upgrading;
67+
Map? extraHeaders;
68+
69+
Socket(String uri, Map? opts) {
7070
opts = opts ?? <dynamic, dynamic>{};
7171

7272
if (uri.isNotEmpty) {
@@ -115,9 +115,6 @@ class Socket extends EventEmitter {
115115
timestampRequests = opts['timestampRequests'];
116116
transports = opts['transports'] ?? ['polling', 'websocket'];
117117
transportOptions = opts['transportOptions'] ?? {};
118-
readyState = '';
119-
writeBuffer = [];
120-
prevBufferLen = 0;
121118
policyPort = opts['policyPort'] ?? 843;
122119
rememberUpgrade = opts['rememberUpgrade'] ?? false;
123120
binaryType = null;
@@ -277,8 +274,8 @@ class Socket extends EventEmitter {
277274
_logger.fine('setting transport ${transport?.name}');
278275

279276
if (this.transport != null) {
280-
_logger.fine('clearing existing transport ${this.transport?.name}');
281-
this.transport.clearListeners();
277+
_logger.fine('clearing existing transport ${this.transport!.name}');
278+
this.transport!.clearListeners();
282279
}
283280

284281
// set up transport
@@ -299,31 +296,31 @@ class Socket extends EventEmitter {
299296
/// @api private
300297
void probe(name) {
301298
_logger.fine('probing transport "$name"');
302-
var transport = createTransport(name, {'probe': true});
299+
Transport? transport = createTransport(name, {'probe': true});
303300
var failed = false;
304301
var cleanup;
305302
priorWebsocketSuccess = false;
306303

307304
var onTransportOpen = (_) {
308305
if (onlyBinaryUpgrades == true) {
309306
var upgradeLosesBinary =
310-
supportsBinary == false && transport.supportsBinary;
307+
supportsBinary == false && transport!.supportsBinary == false;
311308
failed = failed || upgradeLosesBinary;
312309
}
313310
if (failed) return;
314311

315312
_logger.fine('probe transport "$name" opened');
316-
transport.send([
313+
transport!.send([
317314
{'type': 'ping', 'data': 'probe'}
318315
]);
319-
transport.once('packet', (msg) {
316+
transport!.once('packet', (msg) {
320317
if (failed) return;
321318
if ('pong' == msg['type'] && 'probe' == msg['data']) {
322319
_logger.fine('probe transport "$name" pong');
323320
upgrading = true;
324321
emit('upgrading', transport);
325322
if (transport == null) return;
326-
priorWebsocketSuccess = 'websocket' == transport.name;
323+
priorWebsocketSuccess = 'websocket' == transport!.name;
327324

328325
_logger.fine('pausing current transport "${transport?.name}"');
329326
if (this.transport is PollingTransport) {
@@ -335,7 +332,7 @@ class Socket extends EventEmitter {
335332
cleanup();
336333

337334
setTransport(transport);
338-
transport.send([
335+
transport!.send([
339336
{'type': 'upgrade'}
340337
]);
341338
emit('upgrade', transport);
@@ -347,7 +344,7 @@ class Socket extends EventEmitter {
347344
} else {
348345
_logger.fine('probe transport "$name" failed');
349346
emit('upgradeError',
350-
{'error': 'probe error', 'transport': transport.name});
347+
{'error': 'probe error', 'transport': transport!.name});
351348
}
352349
});
353350
};
@@ -360,7 +357,7 @@ class Socket extends EventEmitter {
360357

361358
cleanup();
362359

363-
transport.close();
360+
transport!.close();
364361
transport = null;
365362
};
366363

@@ -372,7 +369,7 @@ class Socket extends EventEmitter {
372369
_logger.fine('probe transport "$name" failed because of error: $err');
373370

374371
emit('upgradeError',
375-
{'error': 'probe error: $err', 'transport': oldTransport.name});
372+
{'error': 'probe error: $err', 'transport': oldTransport!.name});
376373
};
377374

378375
var onTransportClose = (_) => onerror('transport closed');
@@ -382,29 +379,29 @@ class Socket extends EventEmitter {
382379

383380
// When the socket is upgraded while we're probing
384381
var onupgrade = (to) {
385-
if (transport != null && to.name != transport.name) {
382+
if (transport != null && to.name != transport!.name) {
386383
_logger.fine('"${to?.name}" works - aborting "${transport?.name}"');
387384
freezeTransport();
388385
}
389386
};
390387

391388
// Remove all listeners on the transport and on self
392389
cleanup = () {
393-
transport.off('open', onTransportOpen);
394-
transport.off('error', onerror);
395-
transport.off('close', onTransportClose);
390+
transport!.off('open', onTransportOpen);
391+
transport!.off('error', onerror);
392+
transport!.off('close', onTransportClose);
396393
off('close', onclose);
397394
off('upgrading', onupgrade);
398395
};
399396

400-
transport.once('open', onTransportOpen);
401-
transport.once('error', onerror);
402-
transport.once('close', onTransportClose);
397+
transport!.once('open', onTransportOpen);
398+
transport!.once('error', onerror);
399+
transport!.once('close', onTransportClose);
403400

404401
once('close', onclose);
405402
once('upgrading', onupgrade);
406403

407-
transport.open();
404+
transport!.open();
408405
}
409406

410407
///
@@ -414,7 +411,7 @@ class Socket extends EventEmitter {
414411
void onOpen() {
415412
_logger.fine('socket open');
416413
readyState = 'open';
417-
priorWebsocketSuccess = 'websocket' == transport.name;
414+
priorWebsocketSuccess = 'websocket' == transport!.name;
418415
emit('open');
419416
flush();
420417

@@ -479,7 +476,7 @@ class Socket extends EventEmitter {
479476
void onHandshake(Map data) {
480477
emit('handshake', data);
481478
id = data['sid'];
482-
transport.query['sid'] = data['sid'];
479+
transport!.query!['sid'] = data['sid'];
483480
upgrades = filterUpgrades(data['upgrades']);
484481
pingInterval = data['pingInterval'];
485482
pingTimeout = data['pingTimeout'];
@@ -554,11 +551,11 @@ class Socket extends EventEmitter {
554551
/// @api private
555552
void flush() {
556553
if ('closed' != readyState &&
557-
transport.writable == true &&
554+
transport!.writable == true &&
558555
upgrading != true &&
559556
writeBuffer.isNotEmpty) {
560557
_logger.fine('flushing ${writeBuffer.length} packets in socket');
561-
transport.send(writeBuffer);
558+
transport!.send(writeBuffer);
562559
// keep track of current length of writeBuffer
563560
// splice writeBuffer and callbackBuffer on `drain`
564561
prevBufferLen = writeBuffer.length;
@@ -574,9 +571,9 @@ class Socket extends EventEmitter {
574571
/// @param {Object} options.
575572
/// @return {Socket} for chaining.
576573
/// @api public
577-
Socket write(msg, options, [EventHandler fn]) => send(msg, options, fn);
574+
Socket write(msg, options, [EventHandler? fn]) => send(msg, options, fn);
578575

579-
Socket send(msg, options, [EventHandler fn]) {
576+
Socket send(msg, options, [EventHandler? fn]) {
580577
sendPacket(type: 'message', data: msg, options: options, callback: fn);
581578
return this;
582579
}
@@ -589,7 +586,7 @@ class Socket extends EventEmitter {
589586
/// @param {Object} options.
590587
/// @param {Function} callback function.
591588
/// @api private
592-
void sendPacket({type, data, options, EventHandler callback}) {
589+
void sendPacket({type, data, options, EventHandler? callback}) {
593590
if ('closing' == readyState || 'closed' == readyState) {
594591
return;
595592
}
@@ -612,7 +609,7 @@ class Socket extends EventEmitter {
612609
var close = () {
613610
onClose('forced close');
614611
_logger.fine('socket closing - telling transport to close');
615-
transport.close();
612+
transport!.close();
616613
};
617614

618615
var temp;
@@ -678,13 +675,13 @@ class Socket extends EventEmitter {
678675
pingTimeoutTimer?.cancel();
679676

680677
// stop event from firing again for transport
681-
transport.off('close');
678+
transport!.off('close');
682679

683680
// ensure transport won't stay open
684-
transport.close();
681+
transport!.close();
685682

686683
// ignore further transport communication
687-
transport.clearListeners();
684+
transport!.clearListeners();
688685

689686
// set ready state
690687
readyState = 'closed';

lib/src/engine/transport/io_websocket_transport.dart

+12-12
Original file line numberDiff line numberDiff line change
@@ -16,17 +16,17 @@ class IOWebSocketTransport extends Transport {
1616
Logger('socket_io_client:transport.IOWebSocketTransport');
1717

1818
@override
19-
String name = 'websocket';
19+
String? name = 'websocket';
2020
var protocols;
2121

2222
@override
23-
bool supportsBinary;
24-
Map perMessageDeflate;
25-
Map extraHeaders;
26-
WebSocket ws;
23+
bool? supportsBinary;
24+
Map? perMessageDeflate;
25+
Map<String, dynamic>? extraHeaders;
26+
WebSocket? ws;
2727

2828
IOWebSocketTransport(Map opts) : super(opts) {
29-
var forceBase64 = (opts != null && opts['forceBase64']);
29+
var forceBase64 = opts['forceBase64'];
3030
supportsBinary = !forceBase64;
3131
perMessageDeflate = opts['perMessageDeflate'];
3232
protocols = opts['protocols'];
@@ -45,11 +45,11 @@ class IOWebSocketTransport extends Transport {
4545
return emit('error', err);
4646
}
4747

48-
// if (this.ws.binaryType == null) {
48+
// if (this.ws?.binaryType == null) {
4949
// this.supportsBinary = false;
5050
// }
5151
//
52-
// this.ws.binaryType = 'arraybuffer';
52+
// this.ws?.binaryType = 'arraybuffer';
5353

5454
addEventListeners();
5555
}
@@ -59,7 +59,7 @@ class IOWebSocketTransport extends Transport {
5959
/// @api private
6060
void addEventListeners() {
6161
var isOpen = false;
62-
ws.listen((data) {
62+
ws?.listen((data) {
6363
if (isOpen != true) {
6464
onOpen();
6565
isOpen = true;
@@ -99,9 +99,9 @@ class IOWebSocketTransport extends Transport {
9999
try {
100100
// TypeError is thrown when passing the second argument on Safari
101101
if (data is ByteBuffer) {
102-
ws.add(data.asUint8List());
102+
ws?.add(data.asUint8List());
103103
} else {
104-
ws.add(data);
104+
ws?.add(data);
105105
}
106106
} catch (e) {
107107
_logger.fine('websocket closed before onclose event');
@@ -127,7 +127,7 @@ class IOWebSocketTransport extends Transport {
127127
/// @api private
128128
String uri() {
129129
var query = this.query ?? {};
130-
var schema = secure ? 'wss' : 'ws';
130+
var schema = secure == true ? 'wss' : 'ws';
131131
var port = '';
132132

133133
// avoid port if default for schema
+19
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
// Copyright (C) 2020 Potix Corporation. All Rights Reserved
2+
// History: 2020/11/10 12:30 PM
3+
// Author: jumperchen<[email protected]>
4+
@JS()
5+
library js_map;
6+
7+
import 'package:js/js.dart';
8+
9+
@JS('Array')
10+
class JsArray {
11+
external factory JsArray();
12+
external int push(element);
13+
external dynamic pop();
14+
external int get length;
15+
}
16+
17+
@JS('self')
18+
// ignore: always_declare_return_types
19+
external get self;

0 commit comments

Comments
 (0)