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/pkgs/json_rpc_2/CHANGELOG.md b/pkgs/json_rpc_2/CHANGELOG.md index 7de0e87..524cbad 100644 --- a/pkgs/json_rpc_2/CHANGELOG.md +++ b/pkgs/json_rpc_2/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/pkgs/json_rpc_2/lib/src/client.dart b/pkgs/json_rpc_2/lib/src/client.dart index 763a987..951f927 100644 --- a/pkgs/json_rpc_2/lib/src/client.dart +++ b/pkgs/json_rpc_2/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); +}