Improve stack traces for error responses.
This tracks the stack chain when the request is made and uses it if the
response fails.
R=rnystrom@google.com
Review URL: https://codereview.chromium.org//1341933002 .
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 7de0e87..524cbad 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -8,6 +8,8 @@
* Fix a race condition in `Server` where a `StateError` could be thrown if the
connection was closed in the middle of handling a request.
+* Improve stack traces for error responses.
+
## 1.1.1
* Update the README to match the current API.
diff --git a/lib/src/client.dart b/lib/src/client.dart
index 763a987..951f927 100644
--- a/lib/src/client.dart
+++ b/lib/src/client.dart
@@ -28,9 +28,8 @@
/// Each element is a JSON-serializable object.
List _batch;
- /// The map of request ids for pending requests to [Completer]s that will be
- /// completed with those requests' responses.
- final _pendingRequests = new Map<int, Completer>();
+ /// The map of request ids to pending requests.
+ final _pendingRequests = new Map<int, _Request>();
/// Returns a [Future] that completes when the connection is closed.
///
@@ -97,7 +96,7 @@
_send(method, parameters, id);
var completer = new Completer.sync();
- _pendingRequests[id] = completer;
+ _pendingRequests[id] = new _Request(completer, new Chain.current());
return completer.future;
}
@@ -174,15 +173,15 @@
/// resolved.
void _handleSingleResponse(response) {
if (!_isResponseValid(response)) return;
- var completer = _pendingRequests.remove(response["id"]);
+ var request = _pendingRequests.remove(response["id"]);
if (response.containsKey("result")) {
- completer.complete(response["result"]);
+ request.completer.complete(response["result"]);
} else {
- completer.completeError(new RpcException(
+ request.completer.completeError(new RpcException(
response["error"]["code"],
response["error"]["message"],
data: response["error"]["data"]),
- new Chain.current());
+ request.chain);
}
}
@@ -201,3 +200,14 @@
return true;
}
}
+
+/// A pending request to the server.
+class _Request {
+ /// The completer to use to complete the response future.
+ final Completer completer;
+
+ /// The stack chain from where the request was made.
+ final Chain chain;
+
+ _Request(this.completer, this.chain);
+}