From 7b59c3e10b95d94004caa74ed677f68785864c56 Mon Sep 17 00:00:00 2001 From: Damodar Lohani Date: Thu, 17 Feb 2022 01:22:48 +0000 Subject: [PATCH 01/15] remove unused file --- src/SDK/Language/Flutter.php | 12 ------------ templates/flutter/lib/package.dart.twig | 3 --- templates/flutter/lib/src/redirect_browser.dart.twig | 5 ----- templates/flutter/lib/src/redirect_stub.dart.twig | 2 -- 4 files changed, 22 deletions(-) delete mode 100644 templates/flutter/lib/src/redirect_browser.dart.twig delete mode 100644 templates/flutter/lib/src/redirect_stub.dart.twig diff --git a/src/SDK/Language/Flutter.php b/src/SDK/Language/Flutter.php index 01acf16d7..6bca6768f 100644 --- a/src/SDK/Language/Flutter.php +++ b/src/SDK/Language/Flutter.php @@ -163,18 +163,6 @@ public function getFiles() 'template' => 'flutter/lib/src/interceptor.dart.twig', 'minify' => false, ], - [ - 'scope' => 'default', - 'destination' => '/lib/src/redirect_browser.dart', - 'template' => 'flutter/lib/src/redirect_browser.dart.twig', - 'minify' => false, - ], - [ - 'scope' => 'default', - 'destination' => '/lib/src/redirect_stub.dart', - 'template' => 'flutter/lib/src/redirect_stub.dart.twig', - 'minify' => false, - ], [ 'scope' => 'default', 'destination' => '/lib/src/response.dart', diff --git a/templates/flutter/lib/package.dart.twig b/templates/flutter/lib/package.dart.twig index a809e5877..8f9f9dd4e 100644 --- a/templates/flutter/lib/package.dart.twig +++ b/templates/flutter/lib/package.dart.twig @@ -3,9 +3,6 @@ library {{ language.params.packageName }}; import 'dart:async'; import 'dart:typed_data'; import 'package:http/http.dart' as http; -import 'package:flutter/foundation.dart'; -import 'src/redirect_stub.dart' - if (dart.library.html) 'src/redirect_browser.dart'; import 'src/enums.dart'; import 'src/client.dart'; import 'src/service.dart'; diff --git a/templates/flutter/lib/src/redirect_browser.dart.twig b/templates/flutter/lib/src/redirect_browser.dart.twig deleted file mode 100644 index 85aebc5d0..000000000 --- a/templates/flutter/lib/src/redirect_browser.dart.twig +++ /dev/null @@ -1,5 +0,0 @@ -import 'dart:html'; - -void redirect(String url) { - window.location.href = url; -} diff --git a/templates/flutter/lib/src/redirect_stub.dart.twig b/templates/flutter/lib/src/redirect_stub.dart.twig deleted file mode 100644 index 0200010e3..000000000 --- a/templates/flutter/lib/src/redirect_stub.dart.twig +++ /dev/null @@ -1,2 +0,0 @@ -void redirect(String url) => - throw UnsupportedError('Cannot redirect to url without dart:html'); \ No newline at end of file From 81da9c805478182640674e10207b9f9eb7aa120a Mon Sep 17 00:00:00 2001 From: Damodar Lohani Date: Thu, 17 Feb 2022 01:39:09 +0000 Subject: [PATCH 02/15] more code improvements --- .../flutter/lib/services/service.dart.twig | 10 ++++--- .../flutter/lib/src/client_browser.dart.twig | 13 ++++----- templates/flutter/lib/src/client_io.dart.twig | 28 ++++++++----------- 3 files changed, 24 insertions(+), 27 deletions(-) diff --git a/templates/flutter/lib/services/service.dart.twig b/templates/flutter/lib/services/service.dart.twig index dc9758cae..75608e4cd 100644 --- a/templates/flutter/lib/services/service.dart.twig +++ b/templates/flutter/lib/services/service.dart.twig @@ -16,7 +16,7 @@ class {{ service.name | caseUcfirst }} extends Service { /// {% endif %} {% if method.type == 'webAuth' %}Future{% elseif method.type == 'location' %} Future {% else %} {% if method.responseModel and method.responseModel != 'any' %}Future{% else %}Future{% endif %}{% endif %} {{ method.name | caseCamel }}({{ _self.method_parameters(method.parameters) }}) async { - final String path = '{{ method.path }}'{% for parameter in method.parameters.path %}.replaceAll('{{ '{' }}{{ parameter.name | caseCamel }}{{ '}' }}', {{ parameter.name | caseCamel | escapeKeyword }}){% endfor %}; + const String path = '{{ method.path }}'{% for parameter in method.parameters.path %}.replaceAll('{{ '{' }}{{ parameter.name | caseCamel }}{{ '}' }}', {{ parameter.name | caseCamel | escapeKeyword }}){% endfor %}; final Map params = { {% for parameter in method.parameters.query %} @@ -61,9 +61,11 @@ class {{ service.name | caseUcfirst }} extends Service { return client.webAuth(url); {% elseif method.type == 'location' %} - params.keys.forEach((key) {if (params[key] is int || params[key] is double) { - params[key] = params[key].toString(); - }}); + for (var key in params.keys) { + if (params[key] is int || params[key] is double) { + params[key] = params[key].toString(); + } + } final res = await client.call(HttpMethod.{{ method.method | caseLower }}, path: path, params: params, responseType: ResponseType.bytes); return res.data; diff --git a/templates/flutter/lib/src/client_browser.dart.twig b/templates/flutter/lib/src/client_browser.dart.twig index 9c80f85e2..1c2211fd0 100644 --- a/templates/flutter/lib/src/client_browser.dart.twig +++ b/templates/flutter/lib/src/client_browser.dart.twig @@ -42,7 +42,7 @@ class ClientBrowser extends ClientBase with ClientMixin { {% endfor %} }; - this.config = {}; + config = {}; assert(_endPoint.startsWith(RegExp("http://|https://")), "endPoint $_endPoint must start with 'http'"); @@ -71,7 +71,7 @@ class ClientBrowser extends ClientBase with ClientMixin { @override ClientBrowser setEndpoint(String endPoint) { - this._endPoint = endPoint; + _endPoint = endPoint; _endPointRealtime = endPoint .replaceFirst('https://', 'wss://') .replaceFirst('http://', 'ws://'); @@ -91,7 +91,6 @@ class ClientBrowser extends ClientBase with ClientMixin { return this; } - @override Future init() async { if (html.window.localStorage.keys.contains('cookieFallback')) { addHeader('x-fallback-cookies', @@ -107,13 +106,13 @@ class ClientBrowser extends ClientBase with ClientMixin { Map params = const {}, ResponseType? responseType, }) async { - await this.init(); + await init(); late http.Response res; - http.BaseRequest request = this.prepareRequest( + http.BaseRequest request = prepareRequest( method, uri: Uri.parse(_endPoint + path), - headers: {...this._headers!, ...headers}, + headers: {..._headers!, ...headers}, params: params, ); try { @@ -127,7 +126,7 @@ class ClientBrowser extends ClientBase with ClientMixin { addHeader('X-Fallback-Cookies', cookieFallback); html.window.localStorage['cookieFallback'] = cookieFallback; } - return this.prepareResponse(res, responseType: responseType); + return prepareResponse(res, responseType: responseType); } catch (e) { if (e is {{spec.title | caseUcfirst}}Exception) { rethrow; diff --git a/templates/flutter/lib/src/client_io.dart.twig b/templates/flutter/lib/src/client_io.dart.twig index e50f85cdc..1ff7141cf 100644 --- a/templates/flutter/lib/src/client_io.dart.twig +++ b/templates/flutter/lib/src/client_io.dart.twig @@ -44,7 +44,7 @@ class ClientIO extends ClientBase with ClientMixin { ClientIO({ String endPoint = 'https://appwrite.io/v1', - this.selfSigned = false, + selfSigned = false, }) : _endPoint = endPoint { _nativeClient = HttpClient() ..badCertificateCallback = @@ -53,7 +53,7 @@ class ClientIO extends ClientBase with ClientMixin { _endPointRealtime = endPoint .replaceFirst('https://', 'wss://') .replaceFirst('http://', 'ws://'); - this._headers = { + _headers = { 'content-type': 'application/json', 'x-sdk-version': '{{spec.title | caseDash}}:{{ language.name | caseLower }}:{{ sdk.version }}', {% for key,header in spec.global.defaultHeaders %} @@ -61,7 +61,7 @@ class ClientIO extends ClientBase with ClientMixin { {% endfor %} }; - this.config = {}; + config = {}; assert(_endPoint.startsWith(RegExp("http://|https://")), "endPoint $_endPoint must start with 'http'"); @@ -93,7 +93,7 @@ class ClientIO extends ClientBase with ClientMixin { @override ClientIO setSelfSigned({bool status = true}) { - this.selfSigned = status; + selfSigned = status; _nativeClient.badCertificateCallback = ((X509Certificate cert, String host, int port) => status); return this; @@ -101,7 +101,7 @@ class ClientIO extends ClientBase with ClientMixin { @override ClientIO setEndpoint(String endPoint) { - this._endPoint = endPoint; + _endPoint = endPoint; _endPointRealtime = endPoint .replaceFirst('https://', 'wss://') .replaceFirst('http://', 'ws://'); @@ -125,7 +125,7 @@ class ClientIO extends ClientBase with ClientMixin { // if web skip cookie implementation and origin header as those are automatically handled by browsers final Directory cookieDir = await _getCookiePath(); _cookieJar = PersistCookieJar(storage: FileStorage(cookieDir.path)); - this._interceptors.add(CookieManager(_cookieJar)); + _interceptors.add(CookieManager(_cookieJar)); PackageInfo packageInfo = await PackageInfo.fromPlatform(); addHeader('Origin', 'appwrite-${Platform.operatingSystem}://${packageInfo.packageName}'); @@ -169,9 +169,7 @@ class ClientIO extends ClientBase with ClientMixin { Future _interceptRequest(http.BaseRequest request) async { final body = (request is http.Request) ? request.body : ''; for (final i in _interceptors) { - if (i is Interceptor) { - request = await i.onRequest(request); - } + request = await i.onRequest(request); } if (request is http.Request) { @@ -187,9 +185,7 @@ class ClientIO extends ClientBase with ClientMixin { Future _interceptResponse(http.Response response) async { final body = response.body; for (final i in _interceptors) { - if (i is Interceptor) { - response = await i.onResponse(response); - } + response = await i.onResponse(response); } assert( @@ -231,14 +227,14 @@ class ClientIO extends ClientBase with ClientMixin { ResponseType? responseType, }) async { if (!_initialized) { - await this.init(); + await init(); } late http.Response res; - http.BaseRequest request = this.prepareRequest( + http.BaseRequest request = prepareRequest( method, uri: Uri.parse(_endPoint + path), - headers: {...this._headers!, ...headers}, + headers: {..._headers!, ...headers}, params: params, ); @@ -248,7 +244,7 @@ class ClientIO extends ClientBase with ClientMixin { res = await toResponse(streamedResponse); res = await _interceptResponse(res); - return this.prepareResponse( + return prepareResponse( res, responseType: responseType, ); From 6d771b0b4de9fa38a5dfbc967cc222dc7569a6c4 Mon Sep 17 00:00:00 2001 From: Damodar Lohani Date: Thu, 17 Feb 2022 01:46:51 +0000 Subject: [PATCH 03/15] remove foreach loop --- .../flutter/lib/src/realtime_mixin.dart.twig | 27 ++++++++++--------- 1 file changed, 14 insertions(+), 13 deletions(-) diff --git a/templates/flutter/lib/src/realtime_mixin.dart.twig b/templates/flutter/lib/src/realtime_mixin.dart.twig index 0284b7e55..d76873063 100644 --- a/templates/flutter/lib/src/realtime_mixin.dart.twig +++ b/templates/flutter/lib/src/realtime_mixin.dart.twig @@ -1,5 +1,6 @@ import 'dart:async'; import 'dart:convert'; +import 'package:flutter/foundation.dart'; import 'package:web_socket_channel/web_socket_channel.dart'; import 'package:web_socket_channel/status.dart'; import 'exception.dart'; @@ -65,9 +66,9 @@ mixin RealtimeMixin { break; case 'event': final message = RealtimeMessage.fromMap(data.data); - message.channels.forEach((channel) { - if (this._channels[channel] != null) { - this._channels[channel]!.forEach((stream) { + for(var channel in message.channels) { + if (_channels[channel] != null) { + for( var stream in _channels[channel]!) { stream.sink.add(message); }); } @@ -106,24 +107,24 @@ mixin RealtimeMixin { RealtimeSubscription subscribeTo(List channels) { StreamController controller = StreamController.broadcast(); - channels.forEach((channel) { - if (!this._channels.containsKey(channel)) { - this._channels[channel] = []; + for(var channel in channels) { + if (!_channels.containsKey(channel)) { + _channels[channel] = []; } - this._channels[channel]!.add(controller); + _channels[channel]!.add(controller); }); Future.delayed(Duration.zero, () => _createSocket()); RealtimeSubscription subscription = RealtimeSubscription( stream: controller.stream, close: () async { controller.close(); - channels.forEach((channel) { - this._channels[channel]!.remove(controller); - if (this._channels[channel]!.isEmpty) { - this._channels.remove(channel); + for(var channel in channels) { + _channels[channel]!.remove(controller); + if (_channels[channel]!.isEmpty) { + _channels.remove(channel); } }); - if(this._channels.isNotEmpty) { + if(_channels.isNotEmpty) { await Future.delayed(Duration.zero, () => _createSocket()); } else { await _closeConnection(); @@ -136,7 +137,7 @@ mixin RealtimeMixin { if (response.data['code'] == 1008) { throw {{spec.title | caseUcfirst}}Exception(response.data["message"], response.data["code"]); } else { - print("Reconnecting in one second."); + debugPrint("Reconnecting in one second."); Future.delayed(const Duration(seconds: 1), () { _createSocket(); }); From b47c54c585a2ba201ce4ab77d2e6b170c1fe566e Mon Sep 17 00:00:00 2001 From: Damodar Lohani Date: Thu, 17 Feb 2022 01:59:23 +0000 Subject: [PATCH 04/15] more improvements --- templates/dart/lib/src/enums.dart.twig | 2 +- templates/flutter/lib/services/service.dart.twig | 2 +- templates/flutter/lib/src/client_browser.dart.twig | 4 +++- templates/flutter/lib/src/client_io.dart.twig | 2 +- templates/flutter/lib/src/enums.dart.twig | 2 +- templates/flutter/lib/src/realtime_browser.dart.twig | 4 ++-- templates/flutter/lib/src/realtime_io.dart.twig | 5 +++-- templates/flutter/lib/src/realtime_mixin.dart.twig | 2 +- 8 files changed, 13 insertions(+), 10 deletions(-) diff --git a/templates/dart/lib/src/enums.dart.twig b/templates/dart/lib/src/enums.dart.twig index fad995ed6..9f84bd939 100644 --- a/templates/dart/lib/src/enums.dart.twig +++ b/templates/dart/lib/src/enums.dart.twig @@ -2,7 +2,7 @@ enum HttpMethod { get, post, put, delete, patch } extension HttpMethodString on HttpMethod { String name() { - return this.toString().split('.').last.toUpperCase(); + return toString().split('.').last.toUpperCase(); } } diff --git a/templates/flutter/lib/services/service.dart.twig b/templates/flutter/lib/services/service.dart.twig index 75608e4cd..113b04aca 100644 --- a/templates/flutter/lib/services/service.dart.twig +++ b/templates/flutter/lib/services/service.dart.twig @@ -16,7 +16,7 @@ class {{ service.name | caseUcfirst }} extends Service { /// {% endif %} {% if method.type == 'webAuth' %}Future{% elseif method.type == 'location' %} Future {% else %} {% if method.responseModel and method.responseModel != 'any' %}Future{% else %}Future{% endif %}{% endif %} {{ method.name | caseCamel }}({{ _self.method_parameters(method.parameters) }}) async { - const String path = '{{ method.path }}'{% for parameter in method.parameters.path %}.replaceAll('{{ '{' }}{{ parameter.name | caseCamel }}{{ '}' }}', {{ parameter.name | caseCamel | escapeKeyword }}){% endfor %}; + {% if method.parameters.path.length > 0 %}final{% else %}const{% endif %} String path = '{{ method.path }}'{% for parameter in method.parameters.path %}.replaceAll('{{ '{' }}{{ parameter.name | caseCamel }}{{ '}' }}', {{ parameter.name | caseCamel | escapeKeyword }}){% endfor %}; final Map params = { {% for parameter in method.parameters.query %} diff --git a/templates/flutter/lib/src/client_browser.dart.twig b/templates/flutter/lib/src/client_browser.dart.twig index 1c2211fd0..91f3ae130 100644 --- a/templates/flutter/lib/src/client_browser.dart.twig +++ b/templates/flutter/lib/src/client_browser.dart.twig @@ -1,4 +1,5 @@ import 'dart:html' as html; +import 'package:flutter/foundation.dart'; import 'package:flutter_web_auth/flutter_web_auth.dart'; import 'package:http/http.dart' as http; import 'package:http/browser_client.dart'; @@ -99,6 +100,7 @@ class ClientBrowser extends ClientBase with ClientMixin { _httpClient.withCredentials = true; } + @override Future call( HttpMethod method, { String path = '', @@ -121,7 +123,7 @@ class ClientBrowser extends ClientBase with ClientMixin { final cookieFallback = res.headers['x-fallback-cookies']; if (cookieFallback != null) { - print( + debugPrint( 'Appwrite is using localStorage for session management. Increase your security by adding a custom domain as your API endpoint.'); addHeader('X-Fallback-Cookies', cookieFallback); html.window.localStorage['cookieFallback'] = cookieFallback; diff --git a/templates/flutter/lib/src/client_io.dart.twig b/templates/flutter/lib/src/client_io.dart.twig index 1ff7141cf..78496d5e1 100644 --- a/templates/flutter/lib/src/client_io.dart.twig +++ b/templates/flutter/lib/src/client_io.dart.twig @@ -44,7 +44,7 @@ class ClientIO extends ClientBase with ClientMixin { ClientIO({ String endPoint = 'https://appwrite.io/v1', - selfSigned = false, + this.selfSigned = false, }) : _endPoint = endPoint { _nativeClient = HttpClient() ..badCertificateCallback = diff --git a/templates/flutter/lib/src/enums.dart.twig b/templates/flutter/lib/src/enums.dart.twig index fad995ed6..9f84bd939 100644 --- a/templates/flutter/lib/src/enums.dart.twig +++ b/templates/flutter/lib/src/enums.dart.twig @@ -2,7 +2,7 @@ enum HttpMethod { get, post, put, delete, patch } extension HttpMethodString on HttpMethod { String name() { - return this.toString().split('.').last.toUpperCase(); + return toString().split('.').last.toUpperCase(); } } diff --git a/templates/flutter/lib/src/realtime_browser.dart.twig b/templates/flutter/lib/src/realtime_browser.dart.twig index 60d6ca735..d5599233e 100644 --- a/templates/flutter/lib/src/realtime_browser.dart.twig +++ b/templates/flutter/lib/src/realtime_browser.dart.twig @@ -16,8 +16,8 @@ class RealtimeBrowser extends RealtimeBase with RealtimeMixin { RealtimeBrowser(Client client) { this.client = client; - this.getWebSocket = _getWebSocket; - this.getFallbackCookie = _getFallbackCookie; + getWebSocket = _getWebSocket; + getFallbackCookie = _getFallbackCookie; } Future _getWebSocket(Uri uri) async { diff --git a/templates/flutter/lib/src/realtime_io.dart.twig b/templates/flutter/lib/src/realtime_io.dart.twig index 9cda756a4..c82d7dcda 100644 --- a/templates/flutter/lib/src/realtime_io.dart.twig +++ b/templates/flutter/lib/src/realtime_io.dart.twig @@ -2,6 +2,7 @@ import 'dart:async'; import 'dart:convert'; import 'dart:io'; import 'dart:math'; +import 'package:flutter/foundation.dart'; import 'package:web_socket_channel/io.dart'; import 'package:web_socket_channel/web_socket_channel.dart'; import 'cookie_manager.dart'; @@ -17,7 +18,7 @@ class RealtimeIO extends RealtimeBase with RealtimeMixin { RealtimeIO(Client client) { this.client = client; - this.getWebSocket = _getWebSocket; + getWebSocket = _getWebSocket; } Future _getWebSocket(Uri uri) async { @@ -53,7 +54,7 @@ class RealtimeIO extends RealtimeBase with RealtimeMixin { var client = HttpClient(context: SecurityContext()); client.badCertificateCallback = (X509Certificate cert, String host, int port) { - print('{{spec.title | caseUcfirst}}Realtime: Allow self-signed certificate'); + debugPrint('{{spec.title | caseUcfirst}}Realtime: Allow self-signed certificate'); return true; }; diff --git a/templates/flutter/lib/src/realtime_mixin.dart.twig b/templates/flutter/lib/src/realtime_mixin.dart.twig index d76873063..a6a72c730 100644 --- a/templates/flutter/lib/src/realtime_mixin.dart.twig +++ b/templates/flutter/lib/src/realtime_mixin.dart.twig @@ -39,7 +39,7 @@ mixin RealtimeMixin { _lastUrl = uri.toString(); _websok = await getWebSocket(uri); } - print('subscription: $_lastUrl'); + debugPrint('subscription: $_lastUrl'); try { _websok?.stream.listen((response) { From f13af5bb5caf06fd5aacb16aee194c3b8ba485f0 Mon Sep 17 00:00:00 2001 From: Damodar Lohani Date: Thu, 17 Feb 2022 02:01:26 +0000 Subject: [PATCH 05/15] fix --- templates/flutter/lib/src/client_mixin.dart.twig | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/templates/flutter/lib/src/client_mixin.dart.twig b/templates/flutter/lib/src/client_mixin.dart.twig index 2c8af7103..030e9dd9a 100644 --- a/templates/flutter/lib/src/client_mixin.dart.twig +++ b/templates/flutter/lib/src/client_mixin.dart.twig @@ -40,7 +40,7 @@ class ClientMixin { } else if (method == HttpMethod.get) { final encoded = {}; if (params.isNotEmpty) { - params.keys.forEach((key) { + for (var key in params.keys) { if (params[key] is int || params[key] is double) { encoded[key] = params[key].toString(); } else if (params[key] is List) { From 21240613dd35ceaed671d8ebb982985472fade1d Mon Sep 17 00:00:00 2001 From: Damodar Lohani Date: Thu, 17 Feb 2022 02:21:42 +0000 Subject: [PATCH 06/15] more fixes from static analysis --- templates/flutter/lib/services/service.dart.twig | 2 +- templates/flutter/lib/src/client_mixin.dart.twig | 2 +- templates/flutter/lib/src/realtime_mixin.dart.twig | 8 ++++---- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/templates/flutter/lib/services/service.dart.twig b/templates/flutter/lib/services/service.dart.twig index 113b04aca..923b57501 100644 --- a/templates/flutter/lib/services/service.dart.twig +++ b/templates/flutter/lib/services/service.dart.twig @@ -16,7 +16,7 @@ class {{ service.name | caseUcfirst }} extends Service { /// {% endif %} {% if method.type == 'webAuth' %}Future{% elseif method.type == 'location' %} Future {% else %} {% if method.responseModel and method.responseModel != 'any' %}Future{% else %}Future{% endif %}{% endif %} {{ method.name | caseCamel }}({{ _self.method_parameters(method.parameters) }}) async { - {% if method.parameters.path.length > 0 %}final{% else %}const{% endif %} String path = '{{ method.path }}'{% for parameter in method.parameters.path %}.replaceAll('{{ '{' }}{{ parameter.name | caseCamel }}{{ '}' }}', {{ parameter.name | caseCamel | escapeKeyword }}){% endfor %}; + {% if method.parameters.path | length > 0 %}final{% else %}const{% endif %} String path = '{{ method.path }}'{% for parameter in method.parameters.path %}.replaceAll('{{ '{' }}{{ parameter.name | caseCamel }}{{ '}' }}', {{ parameter.name | caseCamel | escapeKeyword }}){% endfor %}; final Map params = { {% for parameter in method.parameters.query %} diff --git a/templates/flutter/lib/src/client_mixin.dart.twig b/templates/flutter/lib/src/client_mixin.dart.twig index 030e9dd9a..00b77b8a5 100644 --- a/templates/flutter/lib/src/client_mixin.dart.twig +++ b/templates/flutter/lib/src/client_mixin.dart.twig @@ -48,7 +48,7 @@ class ClientMixin { } else { encoded[key] = params[key]; } - }); + } } uri = Uri( fragment: uri.fragment, diff --git a/templates/flutter/lib/src/realtime_mixin.dart.twig b/templates/flutter/lib/src/realtime_mixin.dart.twig index a6a72c730..fdab24120 100644 --- a/templates/flutter/lib/src/realtime_mixin.dart.twig +++ b/templates/flutter/lib/src/realtime_mixin.dart.twig @@ -70,9 +70,9 @@ mixin RealtimeMixin { if (_channels[channel] != null) { for( var stream in _channels[channel]!) { stream.sink.add(message); - }); + } } - }); + } break; } }); @@ -112,7 +112,7 @@ mixin RealtimeMixin { _channels[channel] = []; } _channels[channel]!.add(controller); - }); + } Future.delayed(Duration.zero, () => _createSocket()); RealtimeSubscription subscription = RealtimeSubscription( stream: controller.stream, @@ -123,7 +123,7 @@ mixin RealtimeMixin { if (_channels[channel]!.isEmpty) { _channels.remove(channel); } - }); + } if(_channels.isNotEmpty) { await Future.delayed(Duration.zero, () => _createSocket()); } else { From 70d61531c1469f6fbf0eb73567d64586a61634d5 Mon Sep 17 00:00:00 2001 From: Damodar Lohani Date: Thu, 17 Feb 2022 02:38:56 +0000 Subject: [PATCH 07/15] fix dart analysis --- templates/dart/lib/services/service.dart.twig | 4 +-- templates/dart/lib/src/client_base.dart.twig | 5 ++++ .../dart/lib/src/client_browser.dart.twig | 19 +++++++++---- templates/dart/lib/src/client_io.dart.twig | 28 +++++++++++-------- templates/dart/lib/src/client_mixin.dart.twig | 12 ++++---- templates/dart/lib/src/exception.dart.twig | 1 + templates/dart/pubspec.yaml.twig | 3 +- 7 files changed, 45 insertions(+), 27 deletions(-) diff --git a/templates/dart/lib/services/service.dart.twig b/templates/dart/lib/services/service.dart.twig index fa002649d..508e320e2 100644 --- a/templates/dart/lib/services/service.dart.twig +++ b/templates/dart/lib/services/service.dart.twig @@ -38,9 +38,9 @@ class {{ service.name | caseUcfirst }} extends Service { }; {% if method.type == 'location' %} - params.keys.forEach((key) {if (params[key] is int || params[key] is double) { + for(var key in params.keys) {if (params[key] is int || params[key] is double) { params[key] = params[key].toString(); - }}); + }} final res = await client.call(HttpMethod.{{ method.method | caseLower }}, path: path, params: params, responseType: ResponseType.bytes); return res.data; diff --git a/templates/dart/lib/src/client_base.dart.twig b/templates/dart/lib/src/client_base.dart.twig index 0e88e130e..b0c41ffeb 100644 --- a/templates/dart/lib/src/client_base.dart.twig +++ b/templates/dart/lib/src/client_base.dart.twig @@ -7,15 +7,20 @@ abstract class ClientBase implements Client { {% if header.description %} /// {{header.description}} {% endif %} + @override ClientBase set{{header.key | caseUcfirst}}(value); {% endfor %} + @override ClientBase setSelfSigned({bool status = true}); + @override ClientBase setEndpoint(String endPoint); + @override ClientBase addHeader(String key, String value); + @override Future call( HttpMethod method, { String path = '', diff --git a/templates/dart/lib/src/client_browser.dart.twig b/templates/dart/lib/src/client_browser.dart.twig index 8a1ef5c07..5590d0c20 100644 --- a/templates/dart/lib/src/client_browser.dart.twig +++ b/templates/dart/lib/src/client_browser.dart.twig @@ -15,6 +15,7 @@ ClientBase createClient({ class ClientBrowser extends ClientBase with ClientMixin { String _endPoint; Map? _headers; + @override late Map config; late BrowserClient _httpClient; @@ -31,18 +32,20 @@ class ClientBrowser extends ClientBase with ClientMixin { {% endfor %} }; - this.config = {}; + config = {}; assert(_endPoint.startsWith(RegExp("http://|https://")), "endPoint $_endPoint must start with 'http'"); } + @override String get endPoint => _endPoint; {% for header in spec.global.headers %} {% if header.description %} /// {{header.description}} {% endif %} + @override ClientBrowser set{{header.key | caseUcfirst}}(value) { config['{{ header.key | caseCamel }}'] = value; addHeader('{{header.name}}', value); @@ -50,20 +53,24 @@ class ClientBrowser extends ClientBase with ClientMixin { } {% endfor %} + @override ClientBrowser setSelfSigned({bool status = true}) { return this; } + @override ClientBrowser setEndpoint(String endPoint) { - this._endPoint = endPoint; + _endPoint = endPoint; return this; } + @override ClientBrowser addHeader(String key, String value) { _headers![key] = value; return this; } + @override Future call( HttpMethod method, { String path = '', @@ -72,20 +79,20 @@ class ClientBrowser extends ClientBase with ClientMixin { ResponseType? responseType, }) async { late http.Response res; - http.BaseRequest request = this.prepareRequest( + http.BaseRequest request = prepareRequest( method, uri: Uri.parse(_endPoint + path), - headers: {...this._headers!, ...headers}, + headers: {..._headers!, ...headers}, params: params, ); try { final streamedResponse = await _httpClient.send(request); res = await toResponse(streamedResponse); - return this.prepareResponse(res, responseType: responseType); + return prepareResponse(res, responseType: responseType); } catch (e) { if (e is {{spec.title | caseUcfirst}}Exception) { - throw e; + rethrow; } throw {{spec.title | caseUcfirst}}Exception(e.toString()); } diff --git a/templates/dart/lib/src/client_io.dart.twig b/templates/dart/lib/src/client_io.dart.twig index 85913e824..47ef2c960 100644 --- a/templates/dart/lib/src/client_io.dart.twig +++ b/templates/dart/lib/src/client_io.dart.twig @@ -19,8 +19,8 @@ ClientBase createClient({ class ClientIO extends ClientBase with ClientMixin { String _endPoint; Map? _headers; + @override late Map config; - bool _initialized = false; late http.Client _httpClient; late HttpClient _nativeClient; @@ -28,12 +28,12 @@ class ClientIO extends ClientBase with ClientMixin { String endPoint = '{{ spec.endpoint }}', bool selfSigned = false, }) : _endPoint = endPoint { - _nativeClient = new HttpClient() + _nativeClient = HttpClient() ..badCertificateCallback = ((X509Certificate cert, String host, int port) => selfSigned); - _httpClient = new IOClient(_nativeClient); - this._endPoint = endPoint; - this._headers = { + _httpClient = IOClient(_nativeClient); + _endPoint = endPoint; + _headers = { 'content-type': 'application/json', 'x-sdk-version': '{{spec.title | caseDash}}:{{ language.name | caseLower }}:{{ sdk.version }}', {% for key,header in spec.global.defaultHeaders %} @@ -41,18 +41,20 @@ class ClientIO extends ClientBase with ClientMixin { {% endfor %} }; - this.config = {}; + config = {}; assert(_endPoint.startsWith(RegExp("http://|https://")), "endPoint $_endPoint must start with 'http'"); } + @override String get endPoint => _endPoint; {% for header in spec.global.headers %} {% if header.description %} /// {{header.description}} {% endif %} + @override ClientIO set{{header.key | caseUcfirst}}(value) { config['{{ header.key | caseCamel }}'] = value; addHeader('{{header.name}}', value); @@ -60,22 +62,26 @@ class ClientIO extends ClientBase with ClientMixin { } {% endfor %} + @override ClientIO setSelfSigned({bool status = true}) { _nativeClient.badCertificateCallback = ((X509Certificate cert, String host, int port) => status); return this; } + @override ClientIO setEndpoint(String endPoint) { - this._endPoint = endPoint; + _endPoint = endPoint; return this; } + @override ClientIO addHeader(String key, String value) { _headers![key] = value; return this; } + @override Future call( HttpMethod method, { String path = '', @@ -84,23 +90,23 @@ class ClientIO extends ClientBase with ClientMixin { ResponseType? responseType, }) async { late http.Response res; - http.BaseRequest request = this.prepareRequest( + http.BaseRequest request = prepareRequest( method, uri: Uri.parse(_endPoint + path), - headers: {...this._headers!, ...headers}, + headers: {..._headers!, ...headers}, params: params, ); try { final streamedResponse = await _httpClient.send(request); res = await toResponse(streamedResponse); - return this.prepareResponse( + return prepareResponse( res, responseType: responseType, ); } catch (e) { if (e is {{spec.title | caseUcfirst}}Exception) { - throw e; + rethrow; } throw {{spec.title | caseUcfirst}}Exception(e.toString()); } diff --git a/templates/dart/lib/src/client_mixin.dart.twig b/templates/dart/lib/src/client_mixin.dart.twig index e583a16fd..e860ed59c 100644 --- a/templates/dart/lib/src/client_mixin.dart.twig +++ b/templates/dart/lib/src/client_mixin.dart.twig @@ -40,7 +40,7 @@ class ClientMixin { } else if (method == HttpMethod.get) { final encoded = {}; if (params.isNotEmpty) { - params.keys.forEach((key) { + for(var key in params.keys) { if (params[key] is int || params[key] is double) { encoded[key] = params[key].toString(); } else if (params[key] is List) { @@ -48,7 +48,7 @@ class ClientMixin { } else { encoded[key] = params[key]; } - }); + } } uri = Uri( fragment: uri.fragment, @@ -67,9 +67,7 @@ class ClientMixin { } Response prepareResponse(http.Response res, {ResponseType? responseType}) { - if (responseType == null) { - responseType = ResponseType.json; - } + responseType ??= ResponseType.json; if (res.statusCode >= 400) { if ((res.headers['content-type'] ?? '').contains('application/json')) { final response = json.decode(res.body); @@ -82,7 +80,7 @@ class ClientMixin { throw {{spec.title | caseUcfirst}}Exception(res.body); } } - var data; + dynamic data; if ((res.headers['content-type'] ?? '').contains('application/json')) { if (responseType == ResponseType.json) { data = json.decode(res.body); @@ -103,7 +101,7 @@ class ClientMixin { Future toResponse(http.StreamedResponse streamedResponse) async { if(streamedResponse.statusCode == 204) { - return new http.Response('', + return http.Response('', streamedResponse.statusCode, headers: streamedResponse.headers.map((k,v) => k.toLowerCase()=='content-type' ? MapEntry(k, 'text/plain') : MapEntry(k,v)), request: streamedResponse.request, diff --git a/templates/dart/lib/src/exception.dart.twig b/templates/dart/lib/src/exception.dart.twig index a16015b19..17796ba0f 100644 --- a/templates/dart/lib/src/exception.dart.twig +++ b/templates/dart/lib/src/exception.dart.twig @@ -5,6 +5,7 @@ class {{spec.title | caseUcfirst}}Exception implements Exception { {{spec.title | caseUcfirst}}Exception([this.message = "", this.code, this.response]); + @override String toString() { if (message == null) return "{{spec.title | caseUcfirst}}Exception"; return "{{spec.title | caseUcfirst}}Exception: $message (${code ?? 0})"; diff --git a/templates/dart/pubspec.yaml.twig b/templates/dart/pubspec.yaml.twig index 8cc5568e3..1c37b4f7e 100644 --- a/templates/dart/pubspec.yaml.twig +++ b/templates/dart/pubspec.yaml.twig @@ -11,4 +11,5 @@ dependencies: http: ^0.13.4 dev_dependencies: - test: ^1.16.8 \ No newline at end of file + test: ^1.16.8 + lints: ^1.0.1 \ No newline at end of file From a5b350c752e8d7837f59d0925cfcac5ceaebef16 Mon Sep 17 00:00:00 2001 From: Damodar Lohani Date: Thu, 17 Feb 2022 02:51:49 +0000 Subject: [PATCH 08/15] flutter binding --- tests/languages/flutter/tests.dart | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tests/languages/flutter/tests.dart b/tests/languages/flutter/tests.dart index 75cd1760d..9f4744e91 100644 --- a/tests/languages/flutter/tests.dart +++ b/tests/languages/flutter/tests.dart @@ -1,7 +1,9 @@ +import 'package:flutter/material.dart'; import '../lib/packageName.dart'; import '../lib/models.dart'; void main() async { + WidgetsFlutterBinding.ensureInitialized(); Client client = Client(); Foo foo = Foo(client); Bar bar = Bar(client); From 6e53313dcec5e72a06161535feccd76f0a1f25cc Mon Sep 17 00:00:00 2001 From: Damodar Lohani Date: Thu, 17 Feb 2022 08:25:44 +0000 Subject: [PATCH 09/15] fix package info version without issue --- templates/flutter/pubspec.yaml.twig | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/templates/flutter/pubspec.yaml.twig b/templates/flutter/pubspec.yaml.twig index 9c94c171d..c074a5260 100644 --- a/templates/flutter/pubspec.yaml.twig +++ b/templates/flutter/pubspec.yaml.twig @@ -14,7 +14,7 @@ dependencies: device_info_plus: ^3.2.0 flutter_web_auth: ^0.4.0 http: ^0.13.4 - package_info_plus: ^1.3.0 + package_info_plus: 1.3.0 path_provider: ^2.0.8 web_socket_channel: ^2.1.0 From 4b1b88e13ca4e2e1501077c98cc5e60e43ff479f Mon Sep 17 00:00:00 2001 From: Damodar Lohani Date: Tue, 22 Feb 2022 13:53:25 +0545 Subject: [PATCH 10/15] update package info to latest --- templates/flutter/pubspec.yaml.twig | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/templates/flutter/pubspec.yaml.twig b/templates/flutter/pubspec.yaml.twig index c074a5260..241073e20 100644 --- a/templates/flutter/pubspec.yaml.twig +++ b/templates/flutter/pubspec.yaml.twig @@ -14,7 +14,7 @@ dependencies: device_info_plus: ^3.2.0 flutter_web_auth: ^0.4.0 http: ^0.13.4 - package_info_plus: 1.3.0 + package_info_plus: ^1.4.0 path_provider: ^2.0.8 web_socket_channel: ^2.1.0 From 78d124381cf7e006b8fa97b95c8d7927cf028a0c Mon Sep 17 00:00:00 2001 From: Damodar Lohani Date: Tue, 22 Feb 2022 08:25:55 +0000 Subject: [PATCH 11/15] fixed with previous version --- templates/flutter/pubspec.yaml.twig | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/templates/flutter/pubspec.yaml.twig b/templates/flutter/pubspec.yaml.twig index 241073e20..c074a5260 100644 --- a/templates/flutter/pubspec.yaml.twig +++ b/templates/flutter/pubspec.yaml.twig @@ -14,7 +14,7 @@ dependencies: device_info_plus: ^3.2.0 flutter_web_auth: ^0.4.0 http: ^0.13.4 - package_info_plus: ^1.4.0 + package_info_plus: 1.3.0 path_provider: ^2.0.8 web_socket_channel: ^2.1.0 From b7a113e16f6d7ec5e00a632cdc89e19fff42f8d2 Mon Sep 17 00:00:00 2001 From: Damodar Lohani Date: Tue, 22 Feb 2022 13:06:59 +0000 Subject: [PATCH 12/15] nor required as handled in client --- templates/dart/lib/services/service.dart.twig | 4 ---- templates/flutter/lib/services/service.dart.twig | 6 ------ 2 files changed, 10 deletions(-) diff --git a/templates/dart/lib/services/service.dart.twig b/templates/dart/lib/services/service.dart.twig index 508e320e2..ca805c5ff 100644 --- a/templates/dart/lib/services/service.dart.twig +++ b/templates/dart/lib/services/service.dart.twig @@ -38,10 +38,6 @@ class {{ service.name | caseUcfirst }} extends Service { }; {% if method.type == 'location' %} - for(var key in params.keys) {if (params[key] is int || params[key] is double) { - params[key] = params[key].toString(); - }} - final res = await client.call(HttpMethod.{{ method.method | caseLower }}, path: path, params: params, responseType: ResponseType.bytes); return res.data; {% else %} diff --git a/templates/flutter/lib/services/service.dart.twig b/templates/flutter/lib/services/service.dart.twig index 923b57501..e31cefe38 100644 --- a/templates/flutter/lib/services/service.dart.twig +++ b/templates/flutter/lib/services/service.dart.twig @@ -61,12 +61,6 @@ class {{ service.name | caseUcfirst }} extends Service { return client.webAuth(url); {% elseif method.type == 'location' %} - for (var key in params.keys) { - if (params[key] is int || params[key] is double) { - params[key] = params[key].toString(); - } - } - final res = await client.call(HttpMethod.{{ method.method | caseLower }}, path: path, params: params, responseType: ResponseType.bytes); return res.data; {% else %} From c6695c054d4fc49a64e905369c2beddb05dbfb59 Mon Sep 17 00:00:00 2001 From: Damodar Lohani Date: Tue, 22 Feb 2022 13:13:11 +0000 Subject: [PATCH 13/15] use map instead --- templates/dart/lib/src/client_mixin.dart.twig | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/templates/dart/lib/src/client_mixin.dart.twig b/templates/dart/lib/src/client_mixin.dart.twig index e860ed59c..75ba699cc 100644 --- a/templates/dart/lib/src/client_mixin.dart.twig +++ b/templates/dart/lib/src/client_mixin.dart.twig @@ -38,24 +38,23 @@ class ClientMixin { }); } } else if (method == HttpMethod.get) { - final encoded = {}; if (params.isNotEmpty) { - for(var key in params.keys) { - if (params[key] is int || params[key] is double) { - encoded[key] = params[key].toString(); - } else if (params[key] is List) { - encoded[key + "[]"] = params[key]; - } else { - encoded[key] = params[key]; + params = params.map((key, value){ + if (value is int || value is double) { + return MapEntry(key, value.toString()); + } + if (value is List) { + return MapEntry(key + "[]", value); } - } + return MapEntry(key, value); + }); } uri = Uri( fragment: uri.fragment, path: uri.path, host: uri.host, scheme: uri.scheme, - queryParameters: encoded, + queryParameters: params, port: uri.port); request = http.Request(method.name(), uri); } else { From 455d66a8bd82327386645e927adbc849c9c57268 Mon Sep 17 00:00:00 2001 From: Damodar Lohani Date: Tue, 22 Feb 2022 13:13:32 +0000 Subject: [PATCH 14/15] use map over for loop --- .../flutter/lib/src/client_mixin.dart.twig | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/templates/flutter/lib/src/client_mixin.dart.twig b/templates/flutter/lib/src/client_mixin.dart.twig index 00b77b8a5..75ba699cc 100644 --- a/templates/flutter/lib/src/client_mixin.dart.twig +++ b/templates/flutter/lib/src/client_mixin.dart.twig @@ -38,24 +38,23 @@ class ClientMixin { }); } } else if (method == HttpMethod.get) { - final encoded = {}; if (params.isNotEmpty) { - for (var key in params.keys) { - if (params[key] is int || params[key] is double) { - encoded[key] = params[key].toString(); - } else if (params[key] is List) { - encoded[key + "[]"] = params[key]; - } else { - encoded[key] = params[key]; + params = params.map((key, value){ + if (value is int || value is double) { + return MapEntry(key, value.toString()); + } + if (value is List) { + return MapEntry(key + "[]", value); } - } + return MapEntry(key, value); + }); } uri = Uri( fragment: uri.fragment, path: uri.path, host: uri.host, scheme: uri.scheme, - queryParameters: encoded, + queryParameters: params, port: uri.port); request = http.Request(method.name(), uri); } else { From 0e12987a824727721ee40a6fdc0c2add00b21c74 Mon Sep 17 00:00:00 2001 From: Damodar Lohani Date: Wed, 23 Feb 2022 07:10:19 +0000 Subject: [PATCH 15/15] fix issue --- templates/flutter/lib/package.dart.twig | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/templates/flutter/lib/package.dart.twig b/templates/flutter/lib/package.dart.twig index df7695369..f24c341ef 100644 --- a/templates/flutter/lib/package.dart.twig +++ b/templates/flutter/lib/package.dart.twig @@ -6,7 +6,7 @@ import 'package:http/http.dart' as http; import 'package:flutter/foundation.dart'; import 'src/chunked_upload_stub.dart' if (dart.library.io) 'src/chunked_upload_io.dart'; -import 'src/en.ums.dart'; +import 'src/enums.dart'; import 'src/client.dart'; import 'src/service.dart'; import 'src/input_file.dart';