Accept responses where the ID was converted to a String (#66)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index c7f1652..f27cacb 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,7 @@
+## 2.2.3-dev (unreleased)
+
+* Accept responses even if the server converts the ID to a String.
+
## 2.2.2
* Fix `Peer.close()` throwing `Bad state: Future already completed`.
diff --git a/lib/src/client.dart b/lib/src/client.dart
index 33a529c..d89a623 100644
--- a/lib/src/client.dart
+++ b/lib/src/client.dart
@@ -197,7 +197,9 @@
/// resolved.
void _handleSingleResponse(response) {
if (!_isResponseValid(response)) return;
- var request = _pendingRequests.remove(response['id']);
+ var id = response['id'];
+ id = (id is String) ? int.parse(id) : id;
+ var request = _pendingRequests.remove(id);
if (response.containsKey('result')) {
request.completer.complete(response['result']);
} else {
@@ -212,7 +214,9 @@
bool _isResponseValid(response) {
if (response is! Map) return false;
if (response['jsonrpc'] != '2.0') return false;
- if (!_pendingRequests.containsKey(response['id'])) return false;
+ var id = response['id'];
+ id = (id is String) ? int.parse(id) : id;
+ if (!_pendingRequests.containsKey(id)) return false;
if (response.containsKey('result')) return true;
if (!response.containsKey('error')) return false;
diff --git a/test/client/client_test.dart b/test/client/client_test.dart
index c1edbe4..228acbd 100644
--- a/test/client/client_test.dart
+++ b/test/client/client_test.dart
@@ -31,6 +31,27 @@
completion(equals('bar')));
});
+ test('sends a message and returns the response with String id', () {
+ controller.expectRequest((request) {
+ expect(
+ request,
+ allOf([
+ containsPair('jsonrpc', '2.0'),
+ containsPair('method', 'foo'),
+ containsPair('params', {'param': 'value'})
+ ]));
+
+ return {
+ 'jsonrpc': '2.0',
+ 'result': 'bar',
+ 'id': request['id'].toString()
+ };
+ });
+
+ expect(controller.client.sendRequest('foo', {'param': 'value'}),
+ completion(equals('bar')));
+ });
+
test('sends a notification and expects no response', () {
controller.expectRequest((request) {
expect(