diff --git a/lib/jsonpadding.dart b/lib/jsonpadding.dart index 02d7f6a..369014b 100644 --- a/lib/jsonpadding.dart +++ b/lib/jsonpadding.dart @@ -1,10 +1,17 @@ // Copyright (c) 2016, . All rights reserved. Use of this source code // is governed by a BSD-style license that can be found in the LICENSE file. -import 'src/jsonp_call.dart'; import 'dart:async'; +import 'src/jsonp_call.dart'; -Future jsonp(dynamic uri) => new JsonpCall(uri).call(); +Future jsonp(dynamic uri, {String param, Duration timeout}) => + new JsonpCall(uri, param: param, timeout: timeout).call(); class Jsonp { - Future get(dynamic uri) => jsonp(uri); + final String param; + final Duration timeout; + + Jsonp({this.param, this.timeout}); + + Future get(dynamic uri, {String param, Duration timeout}) => + jsonp(uri, param: param ?? this.param, timeout: timeout ?? this.timeout); } diff --git a/lib/src/jsonp_call.dart b/lib/src/jsonp_call.dart index 4bd1354..acaddf6 100644 --- a/lib/src/jsonp_call.dart +++ b/lib/src/jsonp_call.dart @@ -1,8 +1,8 @@ // Copyright (c) 2016, . All rights reserved. Use of this source code // is governed by a BSD-style license that can be found in the LICENSE file. +import 'dart:async'; import 'dart:html'; import 'dart:js'; -import 'dart:async'; int _requestId = 0; @@ -12,11 +12,17 @@ class JsonpCall { final ScriptElement script = new ScriptElement(); final String callback = _createId(); Uri uri; + String _param = 'callback'; + final Duration timeout; + Timer _timer; - JsonpCall(dynamic uri) { + JsonpCall(dynamic uri, {String param, this.timeout}) { + _param = param ?? _param; this.uri = _createUri(uri, callback); } + bool get hasTimeout => timeout != null; + Future call() { Completer completer = new Completer(); context[callback] = completer.complete; @@ -24,11 +30,19 @@ class JsonpCall { script.onError.listen((_) { completer.completeError('Failed to load $uri'); }); + document.body.append(script); + + if (hasTimeout) { + _timer = new Timer(timeout, + () => completer.completeError(new TimeoutException(null, timeout))); + } + return completer.future.whenComplete(_cleanup); } void _cleanup() { + _timer?.cancel(); script.remove(); context.deleteProperty(callback); } @@ -36,7 +50,7 @@ class JsonpCall { Uri _createUri(dynamic uri, String callback) { uri = (uri is Uri) ? uri : Uri.parse(uri); Map parameters = new Map.from(uri.queryParameters); - parameters['callback'] = callback; + parameters[_param] = callback; return uri.replace(queryParameters: parameters); } }