-
Notifications
You must be signed in to change notification settings - Fork 185
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
add io_websocket transport for switching the implementation of dart.l…
…ibrary.html and dart.library.io on #4 Flutter Port
- Loading branch information
1 parent
d26a257
commit 88a2a09
Showing
9 changed files
with
385 additions
and
156 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,19 @@ | ||
// Copyright (C) 2019 Potix Corporation. All Rights Reserved | ||
// History: 2019-01-21 12:15 | ||
// Author: jumperchen<[email protected]> | ||
import 'package:socket_io_client/src/engine/transport/io_websocket_transport.dart'; | ||
import 'package:socket_io_client/src/engine/transport/transport.dart'; | ||
|
||
class Transports { | ||
static List<String> upgradesTo(String from) { | ||
if ("polling" == from) { | ||
return ["websocket"]; | ||
} | ||
return []; | ||
} | ||
|
||
static Transport newInstance(String name, options) { | ||
// only support websocket here. | ||
return new IOWebSocketTransport(options); | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,169 @@ | ||
// Copyright (C) 2019 Potix Corporation. All Rights Reserved | ||
// History: 2019-01-21 12:13 | ||
// Author: jumperchen<[email protected]> | ||
|
||
import 'dart:async'; | ||
import 'dart:io'; | ||
//import 'dart:html'; | ||
import 'package:logging/logging.dart'; | ||
import 'package:socket_io_client/src/engine/transport/transport.dart'; | ||
import 'package:socket_io_common/src/engine/parser/parser.dart'; | ||
import 'package:socket_io_client/src/engine/parseqs.dart'; | ||
|
||
class IOWebSocketTransport extends Transport { | ||
static Logger _logger = | ||
new Logger('socket_io_client:transport.IOWebSocketTransport'); | ||
|
||
String name = 'websocket'; | ||
var protocols; | ||
|
||
bool supportsBinary; | ||
Map perMessageDeflate; | ||
WebSocket ws; | ||
|
||
IOWebSocketTransport(Map opts) : super(opts) { | ||
var forceBase64 = (opts != null && opts['forceBase64']); | ||
this.supportsBinary = !forceBase64; | ||
this.perMessageDeflate = opts['perMessageDeflate']; | ||
this.protocols = opts['protocols']; | ||
} | ||
|
||
void doOpen() async { | ||
var uri = this.uri(); | ||
var protocols = this.protocols; | ||
|
||
try { | ||
this.ws = await WebSocket.connect(uri, protocols: protocols); | ||
} catch (err) { | ||
return this.emit('error', err); | ||
} | ||
|
||
// if (this.ws.binaryType == null) { | ||
// this.supportsBinary = false; | ||
// } | ||
// | ||
// this.ws.binaryType = 'arraybuffer'; | ||
|
||
this.addEventListeners(); | ||
} | ||
|
||
/** | ||
* Adds event listeners to the socket | ||
* | ||
* @api private | ||
*/ | ||
void addEventListeners() { | ||
bool isOpen = false; | ||
this.ws.listen((data) { | ||
if (isOpen != true) { | ||
onOpen(); | ||
isOpen = true; | ||
} | ||
onData(data); | ||
}, onDone: () => onClose(), onError: (_) => onError('websocket error')); | ||
} | ||
|
||
/** | ||
* Writes data to socket. | ||
* | ||
* @param {Array} array of packets. | ||
* @api private | ||
*/ | ||
write(List packets) { | ||
this.writable = false; | ||
|
||
var done = () { | ||
emit('flush'); | ||
|
||
// fake drain | ||
// defer to next tick to allow Socket to clear writeBuffer | ||
Timer.run(() { | ||
writable = true; | ||
emit('drain'); | ||
}); | ||
}; | ||
|
||
int total = packets.length; | ||
// encodePacket efficient as it uses WS framing | ||
// no need for encodePayload | ||
packets.forEach((packet) { | ||
PacketParser.encodePacket(packet, | ||
supportsBinary: supportsBinary, fromClient: true, callback: (data) { | ||
// Sometimes the websocket has already been closed but the browser didn't | ||
// have a chance of informing us about it yet, in that case send will | ||
// throw an error | ||
try { | ||
// TypeError is thrown when passing the second argument on Safari | ||
ws.add(data); | ||
} catch (e) { | ||
_logger.fine('websocket closed before onclose event'); | ||
} | ||
|
||
if (--total == 0) done(); | ||
}); | ||
}); | ||
} | ||
|
||
/** | ||
* Closes socket. | ||
* | ||
* @api private | ||
*/ | ||
doClose() { | ||
this.ws?.close(); | ||
} | ||
|
||
/** | ||
* Generates uri for connection. | ||
* | ||
* @api private | ||
*/ | ||
uri() { | ||
var query = this.query ?? {}; | ||
var schema = this.secure ? 'wss' : 'ws'; | ||
var port = ''; | ||
|
||
// avoid port if default for schema | ||
if (this.port != null && | ||
(('wss' == schema && this.port != 443) || | ||
('ws' == schema && this.port != 80))) { | ||
port = ':${this.port}'; | ||
} | ||
|
||
// append timestamp to URI | ||
if (this.timestampRequests == true) { | ||
query[this.timestampParam] = | ||
new DateTime.now().millisecondsSinceEpoch.toRadixString(36); | ||
} | ||
|
||
// communicate binary support capabilities | ||
if (this.supportsBinary == false) { | ||
query['b64'] = 1; | ||
} | ||
|
||
var queryString = encode(query); | ||
|
||
// prepend ? to query | ||
if (queryString.isNotEmpty) { | ||
queryString = '?$queryString'; | ||
} | ||
|
||
var ipv6 = this.hostname.contains(':'); | ||
return schema + | ||
'://' + | ||
(ipv6 ? '[' + this.hostname + ']' : this.hostname) + | ||
port + | ||
this.path + | ||
queryString; | ||
} | ||
// | ||
// /** | ||
// * Feature detection for WebSocket. | ||
// * | ||
// * @return {Boolean} whether this transport is available. | ||
// * @api public | ||
// */ | ||
// check() { | ||
// return !!WebSocket && !('__initialize' in WebSocket && this.name === WS.prototype.name); | ||
// } | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.