Skip to content

Commit f0122a0

Browse files
authored
Merge pull request #80 from kuzzleio/2.3.1-proposal
Release 2.4.1
2 parents db156dd + 96c44a0 commit f0122a0

File tree

8 files changed

+234
-127
lines changed

8 files changed

+234
-127
lines changed

.ci/doc/project/pubspec.yaml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,9 @@ name: Tests
22
version: 1.0.0
33
description: Dart SDK doc snippet test project
44

5+
environment:
6+
sdk: ">=2.7.0 <3.0.0"
7+
58
dependencies:
69
kuzzle:
710
path: /mnt/

lib/src/protocols/http.dart

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,18 @@
11
import 'dart:convert';
2-
import 'dart:io';
32

4-
import 'package:http/io_client.dart';
3+
import 'package:http/http.dart';
54
import 'package:kuzzle/src/kuzzle/request.dart';
65
import 'package:kuzzle/src/kuzzle/response.dart';
76
import 'package:kuzzle/src/protocols/abstract.dart';
7+
import 'package:kuzzle/src/protocols/http_client_io.dart'
8+
if (dart.library.html) 'package:kuzzle/src/protocols/http_client_browser.dart';
89

910
class HttpProtocol extends KuzzleProtocol {
1011
HttpProtocol(Uri uri, {bool acceptBadCertificate = false}) : super(uri) {
11-
_client = HttpClient()
12-
..badCertificateCallback =
13-
((cert, host, port) => acceptBadCertificate);
14-
_ioClient = IOClient(_client);
12+
_ioClient = createHttpClient(acceptBadCertificate: acceptBadCertificate);
1513
}
1614

17-
HttpClient _client;
18-
IOClient _ioClient;
15+
BaseClient _ioClient;
1916

2017
@override
2118
Future<void> connect() async {
@@ -50,7 +47,7 @@ class HttpProtocol extends KuzzleProtocol {
5047
return Future.error(res);
5148
}
5249
return Future.value(
53-
KuzzleResponse.fromJson(jsonDecode(res.body) as Map<String, dynamic>),
50+
KuzzleResponse.fromJson(jsonDecode(utf8.decode(res.bodyBytes)) as Map<String, dynamic>),
5451
);
5552
}
5653
}
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
import 'package:http/browser_client.dart';
2+
import 'package:http/http.dart';
3+
4+
BaseClient createHttpClient({bool acceptBadCertificate = false}) {
5+
return BrowserClient();
6+
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
import 'dart:io';
2+
3+
import 'package:http/http.dart';
4+
import 'package:http/io_client.dart';
5+
6+
BaseClient createHttpClient({bool acceptBadCertificate = false}) {
7+
final client = HttpClient()
8+
..badCertificateCallback = ((cert, host, port) => acceptBadCertificate);
9+
return IOClient(client);
10+
}

lib/src/protocols/websocket.dart

Lines changed: 6 additions & 117 deletions
Original file line numberDiff line numberDiff line change
@@ -1,127 +1,16 @@
1-
import 'dart:async';
2-
import 'dart:convert';
3-
import 'dart:io';
4-
import 'package:kuzzle/src/kuzzle/response.dart';
5-
import 'package:pedantic/pedantic.dart';
1+
import 'package:kuzzle/src/protocols/websocket_io.dart'
2+
if (dart.library.html) 'package:kuzzle/src/protocols/websocket_browser.dart';
63

7-
import '../kuzzle/errors.dart';
8-
import '../kuzzle/request.dart';
9-
10-
import 'abstract.dart';
11-
import 'events.dart';
12-
13-
class WebSocketProtocol extends KuzzleProtocol {
4+
class WebSocketProtocol extends KuzzleWebSocket {
145
WebSocketProtocol(
156
Uri uri, {
167
bool autoReconnect = true,
178
Duration reconnectionDelay,
189
Duration pingInterval,
19-
}) : _pingInterval = pingInterval,
20-
super(
10+
}) : super(
2111
uri,
2212
autoReconnect: autoReconnect,
23-
reconnectionDelay: reconnectionDelay
13+
reconnectionDelay: reconnectionDelay,
14+
pingInterval: pingInterval,
2415
);
25-
26-
String _lastUrl;
27-
WebSocket _webSocket;
28-
StreamSubscription _subscription;
29-
Duration _pingInterval;
30-
Duration get pingInterval => _pingInterval;
31-
set pingInterval(Duration value) {
32-
_pingInterval = value;
33-
_webSocket?.pingInterval = value;
34-
}
35-
36-
@override
37-
Future<void> connect() async {
38-
final url = '${uri.scheme}://${uri.host}:${uri.port}';
39-
40-
await super.connect();
41-
42-
if (url != _lastUrl) {
43-
wasConnected = false;
44-
_lastUrl = url;
45-
}
46-
47-
await _subscription?.cancel();
48-
_subscription = null;
49-
50-
await _webSocket?.close();
51-
_webSocket = null;
52-
53-
try {
54-
_webSocket = await WebSocket.connect(url);
55-
} on IOException {
56-
if (wasConnected) {
57-
clientNetworkError(
58-
KuzzleError('WebSocketProtocol: Unable to connect to $url'));
59-
60-
return;
61-
}
62-
63-
rethrow;
64-
}
65-
66-
_webSocket.pingInterval = _pingInterval;
67-
68-
_subscription = _webSocket.listen(_handlePayload,
69-
onError: _handleError, onDone: _handleDone);
70-
71-
clientConnected();
72-
73-
unawaited(_webSocket.done.then((error) {
74-
// print('WebSocketProtocol done');
75-
// print(error.runtimeType);
76-
clientNetworkError(
77-
KuzzleError('WebSocketProtocol: connection with $url closed'));
78-
}));
79-
}
80-
81-
@override
82-
Future<KuzzleResponse> send(KuzzleRequest request) {
83-
if (_webSocket != null && _webSocket.readyState == WebSocket.open) {
84-
_webSocket.add(json.encode(request));
85-
}
86-
return null;
87-
}
88-
89-
@override
90-
void close() {
91-
super.close();
92-
93-
removeAllListeners();
94-
stopRetryingToConnect = true;
95-
wasConnected = false;
96-
97-
_subscription?.cancel();
98-
_subscription = null;
99-
100-
_webSocket?.close();
101-
_webSocket = null;
102-
}
103-
104-
void _handlePayload(dynamic payload) {
105-
emit(ProtocolEvents.NETWORK_ON_RESPONSE_RECEIVED, [payload]);
106-
}
107-
108-
void _handleError(dynamic error, StackTrace stackTrace) {
109-
if (error is Error) {
110-
clientNetworkError(error);
111-
} else {
112-
clientNetworkError(KuzzleError('websocket.onError'));
113-
}
114-
}
115-
116-
void _handleDone() {
117-
if (_webSocket.closeCode == 1000) {
118-
clientDisconnected();
119-
} else if (wasConnected) {
120-
clientNetworkError(
121-
KuzzleError('clientNetworkError',
122-
_webSocket.closeReason,
123-
_webSocket.closeCode)
124-
);
125-
}
126-
}
12716
}
Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
import 'dart:async';
2+
import 'dart:convert';
3+
import 'dart:html';
4+
import 'package:kuzzle/src/kuzzle/response.dart';
5+
6+
import '../kuzzle/errors.dart';
7+
import '../kuzzle/request.dart';
8+
9+
import 'abstract.dart';
10+
import 'events.dart';
11+
12+
class KuzzleWebSocket extends KuzzleProtocol {
13+
KuzzleWebSocket(
14+
Uri uri, {
15+
bool autoReconnect = true,
16+
Duration reconnectionDelay,
17+
this.pingInterval,
18+
}) : super(uri,
19+
autoReconnect: autoReconnect, reconnectionDelay: reconnectionDelay);
20+
21+
String _lastUrl;
22+
WebSocket _webSocket;
23+
StreamSubscription _subscription;
24+
Duration pingInterval;
25+
Completer<void> _connected = Completer();
26+
27+
@override
28+
Future<void> connect() async {
29+
final url = '${uri.scheme}://${uri.host}:${uri.port}';
30+
31+
_webSocket ??= WebSocket(url);
32+
33+
await super.connect();
34+
35+
if (url != _lastUrl) {
36+
wasConnected = false;
37+
_lastUrl = url;
38+
}
39+
40+
await _subscription?.cancel();
41+
_subscription = null;
42+
43+
_subscription = _webSocket.onMessage.listen(_handlePayload);
44+
_webSocket.onError.listen(_handleError);
45+
_webSocket.onClose.listen(_handleDone);
46+
47+
_webSocket.onOpen.listen((_) {
48+
clientConnected();
49+
_connected.complete();
50+
});
51+
return _connected.future;
52+
}
53+
54+
@override
55+
Future<KuzzleResponse> send(KuzzleRequest request) {
56+
if (_webSocket != null && _webSocket.readyState == WebSocket.OPEN) {
57+
_webSocket.sendString(json.encode(request));
58+
}
59+
return null;
60+
}
61+
62+
@override
63+
void close() {
64+
super.close();
65+
66+
removeAllListeners();
67+
stopRetryingToConnect = true;
68+
wasConnected = false;
69+
70+
_subscription?.cancel();
71+
_subscription = null;
72+
73+
_webSocket?.close();
74+
_webSocket = null;
75+
}
76+
77+
void _handlePayload(MessageEvent payload) {
78+
emit(ProtocolEvents.NETWORK_ON_RESPONSE_RECEIVED, [payload.data]);
79+
}
80+
81+
void _handleError(Event event) {
82+
clientNetworkError(event);
83+
}
84+
85+
void _handleDone(Event event) {
86+
clientDisconnected();
87+
}
88+
}

0 commit comments

Comments
 (0)