Skip to content

Commit

Permalink
Merge pull request #15 from Workiva/dart2_compat
Browse files Browse the repository at this point in the history
WP-6538 Dart 2 and DDC compatibility changes.
  • Loading branch information
jayudey-wf authored Apr 24, 2018
2 parents 6679ae8 + 7989051 commit c632cdc
Show file tree
Hide file tree
Showing 15 changed files with 170 additions and 90 deletions.
24 changes: 16 additions & 8 deletions .travis.yml
Original file line number Diff line number Diff line change
@@ -1,12 +1,20 @@
language: dart

dart:
- stable
with_content_shell: true
before_install:
- export DISPLAY=:99.0
- sh -e /etc/init.d/xvfb start
- sleep 3
- dev

# Workaround for issue with sandboxed Chrome in containerized Travis builds.
sudo: required
addons:
chrome: stable

# Re-use downloaded pub packages everywhere.
cache:
directories:
- $HOME/.pub-cache

before_script: npm install
script:
- npm install
- pub run dart_dev test --unit
- pub run dart_dev test --integration
- pub run dart_dev analyze
- ./tool/travis.sh test
14 changes: 8 additions & 6 deletions analysis_options.yaml
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
# analysis_options.yaml docs: https://www.dartlang.org/guides/language/analysis-options
analyzer:
strong-mode: true

linter:
rules:
- cancel_subscriptions
- close_sinks
# Strong mode is required. Applies to the current project.
strong-mode:
# When compiling to JS, both implicit options apply to the current
# project and all dependencies. They are useful to find possible
# Type fixes or areas for explicit typing.
implicit-casts: true
implicit-dynamic: true
7 changes: 4 additions & 3 deletions lib/sockjs_client.dart
Original file line number Diff line number Diff line change
@@ -1,10 +1,11 @@
library sockjs_client;

import "dart:html" as html;
import "dart:convert";
import "dart:async";
import "dart:html" as html;
import "dart:js";

import "package:dart2_constant/convert.dart" as convert;

import "src/events.dart" as event;
import "src/utils.dart" as utils;

Expand Down Expand Up @@ -38,4 +39,4 @@ class Protocol {
Map<String, Protocol> PROTOCOLS = {
"websocket": new Protocol(create:WebSocketTransport.create, enabled: WebSocketTransport.enabled, roundTrips: WebSocketTransport.roundTrips),
"xhr-streaming": new Protocol(create:XhrStreamingTransport.create, enabled: XhrStreamingTransport.enabled, roundTrips: XhrStreamingTransport.roundTrips)
};
};
29 changes: 15 additions & 14 deletions lib/src/ajax.dart
Original file line number Diff line number Diff line change
Expand Up @@ -6,18 +6,18 @@ class StatusEvent extends event.Event {
StatusEvent(String type, [this.status = 0, this.text = ""]) : super(type);
}

typedef AbstractXHRObject AjaxObjectFactory(String method, String baseUrl, {bool noCredentials, payload});
typedef AbstractXHRObject AjaxObjectFactory(String method, String baseUrl, {bool noCredentials, dynamic payload});

class AbstractXHRObject extends Object with event.Emitter {

html.HttpRequest xhr;
StreamSubscription changeSubscription;

Stream get onChunk => this["chunk"];
Stream get onFinish => this["finish"];
Stream get onTimeout => this["timeout"];
Stream<StatusEvent> get onChunk => getEventStream<StatusEvent>('chunk');
Stream<StatusEvent> get onFinish => getEventStream<StatusEvent>('finish');
Stream<StatusEvent> get onTimeout => getEventStream<StatusEvent>('timeout');

_start(method, url, payload, {bool noCredentials: false, headers}) {
void _start(String method, String url, dynamic payload, {bool noCredentials: false, Map<String, String> headers}) {

try {
xhr = new html.HttpRequest();
Expand Down Expand Up @@ -61,10 +61,11 @@ class AbstractXHRObject extends Object with event.Emitter {
xhr.send(payload);
}

_readyStateHandler(html.Event evt) {
void _readyStateHandler(html.Event evt) {
switch (xhr.readyState) {
case 3:
var text, status;
String text;
int status;
// IE doesn't like peeking into responseText or status
// on Microsoft.XMLHTTP and readystate=3
try {
Expand All @@ -83,7 +84,7 @@ class AbstractXHRObject extends Object with event.Emitter {
}
}

_cleanup([abort = false]) {
void _cleanup([bool abort = false]) {

if (xhr == null) return;
// utils.unload_del(that.unload_ref);
Expand All @@ -99,39 +100,39 @@ class AbstractXHRObject extends Object with event.Emitter {
//that.unload_ref = that.xhr = null;
}

close() {
void close() {
// TODO(nelsonsilva) - nuke();
_cleanup(true);
}
}

class XHRCorsObject extends AbstractXHRObject {
XHRCorsObject(method, url, {headers, noCredentials, payload}) {
XHRCorsObject(String method, String url, {Map<String, String> headers, bool noCredentials, dynamic payload}) {
Timer.run(() =>_start(method, url, payload, noCredentials: noCredentials != null ? noCredentials : false));
}
}



class XHRLocalObject extends AbstractXHRObject {
XHRLocalObject(method, url, {headers, noCredentials, payload}) {
XHRLocalObject(String method, String url, {Map<String, String> headers, bool noCredentials, dynamic payload}) {
Timer.run(() =>_start(method, url, payload, noCredentials: noCredentials != null ? noCredentials : true));
}
}

AbstractXHRObject XHRLocalObjectFactory(String method, String baseUrl, {bool noCredentials, payload}) {
AbstractXHRObject XHRLocalObjectFactory(String method, String baseUrl, {bool noCredentials, dynamic payload}) {
return new XHRLocalObject(method, baseUrl, noCredentials: noCredentials, payload: payload);
}

AbstractXHRObject XHRCorsObjectFactory(String method, String baseUrl, {bool noCredentials, payload}) {
AbstractXHRObject XHRCorsObjectFactory(String method, String baseUrl, {bool noCredentials, dynamic payload}) {
return new XHRCorsObject(method, baseUrl, noCredentials: noCredentials, payload: payload);
}

// 1. Is natively via XHR
// 2. Is natively via XDR
// 3. Nope, but postMessage is there so it should work via the Iframe.
// 4. Nope, sorry.
isXHRCorsCapable() {
int isXHRCorsCapable() {
return 1;

/*
Expand Down
48 changes: 24 additions & 24 deletions lib/src/client.dart
Original file line number Diff line number Diff line change
Expand Up @@ -4,13 +4,13 @@ class CloseEvent extends event.Event {
int code;
String reason;
bool wasClean;
var lastEvent;
dynamic lastEvent;

CloseEvent({this.code, this.reason, this.wasClean, this.lastEvent}) : super("close");
}

class MessageEvent extends event.Event {
var data;
String data;
MessageEvent(this.data) : super("message");
}

Expand All @@ -22,22 +22,22 @@ class Client extends Object with event.Emitter {
String _baseUrl;
String server = null;
String protocol = null;
List _protocols = [];
List<String> _protocols = <String>[];

int readyState = CONNECTING;

Info info;
num rtt;
num rto;
List<String> protocolsWhitelist = [];
List<String> protocolsWhitelist = <String>[];
num roundTrips;
num timeout;

bool noCredentials;

var _ir;
InfoReceiver _ir;

var _transport = null;
dynamic _transport = null;
Timer _transportTref;

Client(String url, {this.devel: false,
Expand Down Expand Up @@ -68,15 +68,15 @@ class Client extends Object with event.Emitter {
});
}

Stream get onOpen => this["open"];
Stream get onMessage => this["message"];
Stream get onClose => this["close"];
Stream get onHeartbeat => this["heartbeat"];
Stream<event.Event> get onOpen => getEventStream<event.Event>('open');
Stream<MessageEvent> get onMessage => getEventStream<MessageEvent>('message');
Stream<CloseEvent> get onClose => getEventStream<CloseEvent>('close');
Stream<event.Event> get onHeartbeat => getEventStream<event.Event>('heartbeat');

void close([int code, String reason]) {
if (_transport != null) {
if (_transport is WebSocketTransport) {
_transport.doClose(code, reason);
_transport.doClose(code ?? 1000, reason);
} else if (_transport is XhrStreamingTransport) {
if (code == null) {
code = 0;
Expand All @@ -89,7 +89,7 @@ class Client extends Object with event.Emitter {
}
}

send(data) {
bool send(String data) {
if (readyState == CONNECTING) {
throw 'INVALID_STATE_ERR';
}
Expand All @@ -99,14 +99,14 @@ class Client extends Object with event.Emitter {
return true;
}

_didClose([int code = 0, String reason = "", bool force = false]) {
void _didClose([int code = 0, String reason = "", bool force = false]) {
if (readyState != CONNECTING &&
readyState != OPEN &&
readyState != CLOSING) {
throw 'INVALID_STATE_ERR';
}
if (_ir != null) {
_ir.nuke();
// _ir.nuke();
_ir = null;
}

Expand Down Expand Up @@ -135,7 +135,7 @@ class Client extends Object with event.Emitter {
Timer.run(() => dispatch(close_event));
}

_dispatchOpen() {
void _dispatchOpen() {
if (readyState == CONNECTING) {
if (_transportTref != null) {
_transportTref.cancel();
Expand All @@ -150,21 +150,21 @@ class Client extends Object with event.Emitter {
}
}

_dispatchMessage(data) {
void _dispatchMessage(String data) {
if (readyState != OPEN) {
return;
return;
}
dispatch(new MessageEvent(data));
}

_dispatchHeartbeat() {
void _dispatchHeartbeat() {
if (readyState != OPEN) {
return;
}
dispatch("heartbeat");
}

_didMessage(String data) {
void _didMessage(String data) {
var type = data[0];
switch(type) {
case 'o':
Expand All @@ -173,21 +173,21 @@ class Client extends Object with event.Emitter {
case 'a':
var s = data.substring(1);
if (s == null) s = '[]';
var payload = JSON.decode(s);
var payload = convert.json.decode(s);
for(var i=0; i < payload.length; i++){
_dispatchMessage(payload[i]);
}
break;
case 'm':
var s = data.substring(1);
if (s == null) s = 'null';
var payload = JSON.decode(s);
var payload = convert.json.decode(s);
_dispatchMessage(payload);
break;
case 'c':
var s = data.substring(1);
if (s == null) s = '[]';
var payload = JSON.decode(s);
var payload = convert.json.decode(s);
_didClose(payload[0], payload[1]);
break;
case 'h':
Expand Down Expand Up @@ -258,10 +258,10 @@ class Client extends Object with event.Emitter {
}
}

_applyInfo(var info) {
_applyInfo(Info info) {
this.info = info;
this.rto = utils.countRTO(rtt);
var probed = utils.probeProtocols();
final probed = utils.probeProtocols();
_protocols = utils.detectProtocols(probed, protocolsWhitelist, info);
}

Expand Down
6 changes: 5 additions & 1 deletion lib/src/events.dart
Original file line number Diff line number Diff line change
Expand Up @@ -12,9 +12,13 @@ class Emitter {
final _evtController = new StreamController<Event>.broadcast();

Stream<Event> operator[] (type) => _evtController.stream.where((e) => e.type == type);

Stream<T> getEventStream<T extends Event>(String type) {
return _evtController.stream.where((e) => e.type == type).map((e) => e as T);
}

dispatch(evtOrType) {
var evt = (evtOrType is String) ? new Event(evtOrType) : evtOrType;
_evtController.add(evt);
}
}
}
10 changes: 5 additions & 5 deletions lib/src/info.dart
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ class Info {

Info.fromJSON(Map json) {
websocket = json["websocket"];
origins = json["origins"];
origins = new List<String>.from(json["origins"]);
cookieNeeded = json["cookie_needed"];
entropy = json["entropy"];
nullOrigin = (html.document.domain == null);
Expand All @@ -26,7 +26,7 @@ abstract class InfoReceiver extends Object with event.Emitter {

InfoReceiver._();

Stream<event.Event> get onFinish => this["finish"];
Stream<InfoReceiverEvent> get onFinish => getEventStream<InfoReceiverEvent>('finish');

factory InfoReceiver.forURL(String baseUrl) {
if (utils.isSameOriginUrl(baseUrl)) {
Expand Down Expand Up @@ -62,12 +62,12 @@ class AjaxInfoReceiver extends InfoReceiver {

var tref = new Timer(new Duration(milliseconds:8000), () => dispatch("timeout"));

xo.onFinish.listen( (StatusEvent evt) {
xo.onFinish.listen((StatusEvent evt) {
tref.cancel();
tref = null;
if (evt.status == 200) {
var rtt = new DateTime.now().millisecondsSinceEpoch - t0;
var info = new Info.fromJSON(JSON.decode(evt.text));
var info = new Info.fromJSON(convert.json.decode(evt.text));
dispatch(new InfoReceiverEvent("finish", info, rtt));
} else {
dispatch(new InfoReceiverEvent("finish"));
Expand Down Expand Up @@ -135,7 +135,7 @@ class WInfoReceiverIframe {
var ir = new AjaxInfoReceiver(baseUrl, XHRLocalObjectFactory);
ir.onFinish.listen( (event.Event evt) {
if (evt is InfoReceiverEvent) {
ri._didMessage('m${JSON.encode([evt.info, evt.rtt])}');
ri._didMessage('m${convert.json.encode([evt.info, evt.rtt])}');
}
ri._didClose();
});
Expand Down
Loading

0 comments on commit c632cdc

Please sign in to comment.