8
8
/// 22/02/2017, Created by jumperchen
9
9
///
10
10
/// Copyright (C) 2017 Potix Corporation. All Rights Reserved.
11
+ import 'dart:async' ;
11
12
import 'dart:io' ;
12
13
import 'package:logging/logging.dart' ;
13
14
import 'package:socket_io/src/client.dart' ;
@@ -40,6 +41,24 @@ class Server {
40
41
StreamServer ? httpServer;
41
42
Engine ? engine;
42
43
Encoder encoder = Encoder ();
44
+ Future <bool >? _ready;
45
+
46
+ /// Server is ready
47
+ ///
48
+ /// @return a Future that resolves to true whenever the server is ready
49
+ /// @api public
50
+ Future <bool > get ready => _ready ?? Future .value (false );
51
+
52
+ /// Server's port
53
+ ///
54
+ /// @return the port number where the server is listening
55
+ /// @api public
56
+ int ? get port {
57
+ if (httpServer == null || httpServer! .channels.isEmpty) {
58
+ return null ;
59
+ }
60
+ return httpServer! .channels[0 ].port;
61
+ }
43
62
44
63
/// Server constructor.
45
64
///
@@ -54,7 +73,12 @@ class Server {
54
73
origins (options.containsKey ('origins' ) ? options['origins' ] : '*:*' );
55
74
sockets = of ('/' );
56
75
if (server != null ) {
57
- attach (server, options);
76
+ _ready = Future (() async {
77
+ await attach (server, options);
78
+ return true ;
79
+ });
80
+ } else {
81
+ _ready = Future .value (true );
58
82
}
59
83
}
60
84
@@ -172,7 +196,6 @@ class Server {
172
196
/// @param {String} origins
173
197
/// @return {Server|Adapter} self when setting or value when getting
174
198
/// @api public
175
-
176
199
dynamic origins ([String ? v]) {
177
200
if (v == null || v.isEmpty) return _origins;
178
201
@@ -186,8 +209,8 @@ class Server {
186
209
/// @param {Object} options passed to engine.io
187
210
/// @return {Server} self
188
211
/// @api public
189
- void listen (srv, [Map ? opts]) {
190
- attach (srv, opts);
212
+ Future < void > listen (srv, [Map ? opts]) async {
213
+ await attach (srv, opts);
191
214
}
192
215
193
216
/// Attaches socket.io to a server or port.
@@ -196,7 +219,7 @@ class Server {
196
219
/// @param {Object} options passed to engine.io
197
220
/// @return {Server} self
198
221
/// @api public
199
- Server attach (dynamic srv, [Map ? opts]) {
222
+ Future < Server > attach (dynamic srv, [Map ? opts]) async {
200
223
if (srv is Function ) {
201
224
var msg = 'You are trying to attach socket.io to an express '
202
225
'request handler function. Please pass a http.Server instance.' ;
@@ -221,7 +244,7 @@ class Server {
221
244
_logger.fine ('creating http server and binding to $srv ' );
222
245
var port = srv.toInt ();
223
246
var server = StreamServer ();
224
- server.start (port: port);
247
+ await server.start (port: port);
225
248
// HttpServer.bind(InternetAddress.ANY_IP_V4, port).then((
226
249
// HttpServer server) {
227
250
// this.httpServer = server;
@@ -231,6 +254,7 @@ class Server {
231
254
//// response.close();
232
255
//// });
233
256
257
+ var completer = Completer ();
234
258
var connectPacket = {'type' : CONNECT , 'nsp' : '/' };
235
259
encoder.encode (connectPacket, (encodedPacket) {
236
260
// the CONNECT packet will be merged with Engine.IO handshake,
@@ -249,7 +273,10 @@ class Server {
249
273
250
274
// bind to engine events
251
275
bind (engine! );
276
+
277
+ completer.complete ();
252
278
});
279
+ await completer.future;
253
280
// });
254
281
} else {
255
282
var connectPacket = {'type' : CONNECT , 'nsp' : '/' };
@@ -351,7 +378,6 @@ class Server {
351
378
/// @param {String} nsp name
352
379
/// @param {Function} optional, nsp `connection` ev handler
353
380
/// @api public
354
-
355
381
Namespace of (name, [fn]) {
356
382
if (name.toString ()[0 ] != '/' ) {
357
383
name = '/' + name;
@@ -368,17 +394,20 @@ class Server {
368
394
369
395
/// Closes server connection
370
396
///
397
+ /// @return a Future that resolves when the httpServer is closed
371
398
/// @api public
372
- void close () {
399
+ Future < void > close () async {
373
400
nsps['/' ]! .sockets.toList (growable: false ).forEach ((socket) {
374
401
socket.onclose ();
375
402
});
376
403
377
404
engine? .close ();
378
405
379
406
if (httpServer != null ) {
380
- httpServer! .stop ();
407
+ await httpServer! .stop ();
381
408
}
409
+
410
+ _ready = null ;
382
411
}
383
412
384
413
// redirect to sockets method
0 commit comments