From 4c2f7d2224bb6a9f7031222f07aa00b5d2f7aa7d Mon Sep 17 00:00:00 2001 From: "Rohit R. Abbadi" Date: Fri, 24 Apr 2020 15:45:29 +0530 Subject: [PATCH 1/9] change logLevel to int --- example/lib/main.dart | 5 +++-- lib/src/codec.dart | 4 ++-- lib/src/spec/constants.dart | 8 ++++++++ lib/src/spec/enums.dart | 8 -------- lib/src/spec/rest/options.dart | 6 +++--- lib/src/spec/spec.dart | 1 + test/ably_api_unit_test.dart | 2 +- 7 files changed, 18 insertions(+), 16 deletions(-) create mode 100644 lib/src/spec/constants.dart diff --git a/example/lib/main.dart b/example/lib/main.dart index 36ff2c1c9..705498e22 100644 --- a/example/lib/main.dart +++ b/example/lib/main.dart @@ -92,9 +92,10 @@ class _MyAppState extends State { void createAblyRest() async { setState(() { _restCreationState = OpState.InProgress; }); + final clientOptions = ably.ClientOptions.fromKey("dBjBRg.FqW4GA:68x_ibgJnyCebDUE"); final clientOptions = ably.ClientOptions.fromKey(_appKey.toString()); clientOptions.environment = 'sandbox'; - clientOptions.logLevel = ably.LogLevel.verbose; + clientOptions.logLevel = ably.LogLevel.VERBOSE; clientOptions.logHandler = ({String msg, ably.AblyException exception}){ print("Custom logger :: $msg $exception"); }; @@ -125,7 +126,7 @@ class _MyAppState extends State { final clientOptions = ably.ClientOptions.fromKey(_appKey.toString()); clientOptions.environment = 'sandbox'; - clientOptions.logLevel = ably.LogLevel.verbose; + clientOptions.logLevel = ably.LogLevel.VERBOSE; clientOptions.logHandler = ({String msg, ably.AblyException exception}){ print("Custom logger :: $msg $exception"); }; diff --git a/lib/src/codec.dart b/lib/src/codec.dart index 5a69213e7..a73664709 100644 --- a/lib/src/codec.dart +++ b/lib/src/codec.dart @@ -39,7 +39,7 @@ class Codec extends StandardMessageCodec { // ClientOptions writeValue(buffer, v.clientId); - writeValue(buffer, v.logLevel.index); + writeValue(buffer, v.logLevel); //TODO handle logHandler writeValue(buffer, v.tls); writeValue(buffer, v.restHost); @@ -98,7 +98,7 @@ class Codec extends StandardMessageCodec { // ClientOptions v.clientId = readValue(buffer) as String; - v.logLevel = LogLevel.values[readValue(buffer) as int]; + v.logLevel = readValue(buffer) as int; //TODO handle logHandler v.tls = readValue(buffer) as bool; v.restHost = readValue(buffer) as String; diff --git a/lib/src/spec/constants.dart b/lib/src/spec/constants.dart new file mode 100644 index 000000000..1c4a17541 --- /dev/null +++ b/lib/src/spec/constants.dart @@ -0,0 +1,8 @@ +class LogLevel{ + static final int NONE = 99; + static final int VERBOSE = 2; + static final int DEBUG = 3; + static final int INFO = 4; + static final int WARN = 5; + static final int ERROR = 6; +} diff --git a/lib/src/spec/enums.dart b/lib/src/spec/enums.dart index b57f15896..f75024a31 100644 --- a/lib/src/spec/enums.dart +++ b/lib/src/spec/enums.dart @@ -69,14 +69,6 @@ enum HttpAuthType { X_ABLY_TOKEN, } -enum LogLevel{ - none, //no logs - errors, //errors only - info, //errors and channel state changes - debug, //high-level debug output - verbose //full debug output -} - enum DevicePushState{ active, failing, diff --git a/lib/src/spec/rest/options.dart b/lib/src/spec/rest/options.dart index 58c5f4c5c..f4b0a73b0 100644 --- a/lib/src/spec/rest/options.dart +++ b/lib/src/spec/rest/options.dart @@ -51,11 +51,11 @@ typedef void LogHandler({String msg, AblyException exception}); class ClientOptions extends AuthOptions { ClientOptions(){ - logLevel = LogLevel.info; + logLevel = 4; } ClientOptions.fromKey(String key): super.fromKey(key){ - logLevel = LogLevel.info; + logLevel = 4; } ///Optional clientId that can be used to specify the identity for this client. @@ -65,7 +65,7 @@ class ClientOptions extends AuthOptions { ///Logger configuration LogHandler logHandler; //optional - LogLevel logLevel; //optional + int logLevel; //optional String restHost; //optional String realtimeHost; //optional diff --git a/lib/src/spec/spec.dart b/lib/src/spec/spec.dart index e817aad07..8d7703d10 100644 --- a/lib/src/spec/spec.dart +++ b/lib/src/spec/spec.dart @@ -13,3 +13,4 @@ export 'realtime/realtime.dart'; export 'push/push.dart'; export 'message.dart'; export 'common.dart'; +export 'constants.dart'; diff --git a/test/ably_api_unit_test.dart b/test/ably_api_unit_test.dart index 527aa13d4..24025e119 100644 --- a/test/ably_api_unit_test.dart +++ b/test/ably_api_unit_test.dart @@ -8,7 +8,7 @@ void main() { test('Default ClientOptions', () { final clientOptions = ClientOptions(); expect(clientOptions.clientId, isNull); - expect(clientOptions.logLevel, LogLevel.info); + expect(clientOptions.logLevel, LogLevel.INFO); expect(clientOptions.logHandler, isNull); expect(clientOptions.tls, isNull); expect(clientOptions.restHost, isNull); From 3bc08f4dac8df5044ecfb77f9959123ce79b5428 Mon Sep 17 00:00:00 2001 From: "Rohit R. Abbadi" Date: Fri, 24 Apr 2020 17:15:05 +0530 Subject: [PATCH 2/9] upgrade dev dependencies --- pubspec.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pubspec.yaml b/pubspec.yaml index 2d89e0ff6..3838631e8 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -16,10 +16,10 @@ dev_dependencies: # Specifying a slightly older version minimum for the 'pure' Dart test package # because the flutter_test package needs an older version of test_api. - test: ^1.9.4 + test: ^1.14.2 # Stricter Linting - pedantic: ^1.0.0 + pedantic: ^1.9.0 # For information on the generic Dart part of this file, see the # following page: https://dart.dev/tools/pub/pubspec From 6f5f1ff0e23f2db449a404e0fa05917f394379b9 Mon Sep 17 00:00:00 2001 From: "Rohit R. Abbadi" Date: Fri, 24 Apr 2020 17:18:35 +0530 Subject: [PATCH 3/9] fix codecs, adding tokenDetails --- ios/Classes/AblyFlutterReader.m | 34 ++++++++++++++++++++++++++++----- 1 file changed, 29 insertions(+), 5 deletions(-) diff --git a/ios/Classes/AblyFlutterReader.m b/ios/Classes/AblyFlutterReader.m index ac132071c..165bf91e5 100644 --- a/ios/Classes/AblyFlutterReader.m +++ b/ios/Classes/AblyFlutterReader.m @@ -18,7 +18,8 @@ @implementation AblyFlutterReader typedef NS_ENUM(UInt8, _Value) { _valueClientOptions = 128, - _valueAblyMessage = 129, + _valueTokenDetails = 129, + _valueAblyMessage = 255, }; -(id)readValueOfType:(const UInt8)type { @@ -26,6 +27,9 @@ -(id)readValueOfType:(const UInt8)type { case _valueClientOptions: return [self readClientOptions]; + case _valueTokenDetails: + return [self readTokenDeatils]; + case _valueAblyMessage: return [self readAblyFlutterMessage]; } @@ -81,7 +85,8 @@ -(ARTClientOptions *)readClientOptions { READ_VALUE(o, authUrl); READ_VALUE(o, authMethod); READ_VALUE(o, key); - READ_VALUE(o, tokenDetails); +// READ_VALUE(o, tokenDetails); + ON_VALUE(^(const id value) { o.tokenDetails = value; }); READ_VALUE(o, authHeaders); READ_VALUE(o, authParams); READ_VALUE(o, queryTime); @@ -90,6 +95,7 @@ -(ARTClientOptions *)readClientOptions { // ClientOptions READ_VALUE(o, clientId); ON_VALUE(^(const id value) { o.logLevel = _logLevel(value); }); + //TODO log handler READ_VALUE(o, tls); READ_VALUE(o, restHost); READ_VALUE(o, realtimeHost); @@ -100,7 +106,6 @@ -(ARTClientOptions *)readClientOptions { READ_VALUE(o, queueMessages); READ_VALUE(o, echoMessages); READ_VALUE(o, recover); - [self readValue]; // TODO READ_VALUE(o, proxy); // property not found READ_VALUE(o, environment); READ_VALUE(o, idempotentRestPublishing); [self readValue]; // TODO READ_VALUE(o, httpOpenTimeout); // NSTimeInterval @@ -113,9 +118,28 @@ -(ARTClientOptions *)readClientOptions { READ_VALUE(o, defaultTokenParams); [self readValue]; // TODO READ_VALUE(o, channelRetryTimeout); // NSTimeInterval [self readValue]; // TODO READ_VALUE(o, transportParams); // property not found - [self readValue]; // TODO READ_VALUE(o, asyncHttpThreadpoolSize); // property not found - READ_VALUE(o, pushFullWait); + // [self readValue]; // TODO READ_VALUE(o, asyncHttpThreadpoolSize); // property not found + // READ_VALUE(o, pushFullWait); + + return o; +} + + +-(ARTTokenDetails *)readTokenDeatils { + __block NSString *token = nil; + __block NSDate *expires = nil; + __block NSDate *issued = nil; + __block NSString *capability = nil; + __block NSString *clientId = nil; + + ON_VALUE(^(const id value) { token = value; }) + ON_VALUE(^(const id value) { expires = value; }) + ON_VALUE(^(const id value) { issued = value; }) + ON_VALUE(^(const id value) { capability = value; }) + ON_VALUE(^(const id value) { clientId = value; }) + ARTTokenDetails *const o = [ARTTokenDetails new]; + [o initWithToken:token expires:expires issued:issued capability:capability clientId:clientId]; return o; } From f2299709314243ee2a4fb9436d810acb3d5b6742 Mon Sep 17 00:00:00 2001 From: "Rohit R. Abbadi" Date: Fri, 24 Apr 2020 17:19:15 +0530 Subject: [PATCH 4/9] rest publish implementation for iOS --- ios/Classes/AblyFlutter.h | 5 +++++ ios/Classes/AblyFlutter.m | 19 ++++++++++++++++ ios/Classes/AblyFlutterPlugin.m | 40 +++++++++++++++++++++++++++++++++ 3 files changed, 64 insertions(+) diff --git a/ios/Classes/AblyFlutter.h b/ios/Classes/AblyFlutter.h index 2464f9c7b..6297e30e6 100644 --- a/ios/Classes/AblyFlutter.h +++ b/ios/Classes/AblyFlutter.h @@ -1,5 +1,6 @@ @import Foundation; +@class ARTRest; @class ARTClientOptions; @class AblyFlutterSurfaceRealtime; @@ -7,6 +8,10 @@ NS_ASSUME_NONNULL_BEGIN @interface AblyFlutter : NSObject +-(NSNumber *)createRestWithOptions:(ARTClientOptions *)options; + +-(nullable ARTRest *)getRest:(NSNumber *)handle; + -(NSNumber *)createRealtimeWithOptions:(ARTClientOptions *)options; -(nullable AblyFlutterSurfaceRealtime *)realtimeWithHandle:(NSNumber *)handle; diff --git a/ios/Classes/AblyFlutter.m b/ios/Classes/AblyFlutter.m index c213c33f8..c66e2d953 100644 --- a/ios/Classes/AblyFlutter.m +++ b/ios/Classes/AblyFlutter.m @@ -9,6 +9,7 @@ @implementation AblyFlutter { BOOL _disposed; NSMutableDictionary* _realtimeInstances; + NSMutableDictionary* _restInstances; long long _nextHandle; } @@ -19,6 +20,7 @@ -(instancetype)init { } _realtimeInstances = [NSMutableDictionary new]; + _restInstances = [NSMutableDictionary new]; _nextHandle = 1; return self; @@ -30,6 +32,23 @@ -(instancetype)init { format:@"Instance disposed."]; \ } +-(NSNumber *)createRestWithOptions:(ARTClientOptions *const)options { + if (!options) { + [NSException raise:NSInvalidArgumentException format:@"options cannot be nil."]; + } + + ASSERT_NOT_DISPOSED + + ARTRest *const instance = [[ARTRest alloc] initWithOptions:options]; + NSNumber *const handle = @(_nextHandle++); + [_restInstances setObject:instance forKey:handle]; + return handle; +} + +-(ARTRest *)getRest:(NSNumber *const)handle { + return [_restInstances objectForKey:handle]; +} + -(NSNumber *)createRealtimeWithOptions:(ARTClientOptions *const)options { if (!options) { [NSException raise:NSInvalidArgumentException format:@"options cannot be nil."]; diff --git a/ios/Classes/AblyFlutterPlugin.m b/ios/Classes/AblyFlutterPlugin.m index f9206f59b..64edd5bcd 100644 --- a/ios/Classes/AblyFlutterPlugin.m +++ b/ios/Classes/AblyFlutterPlugin.m @@ -39,6 +39,44 @@ -(nullable AblyFlutter *)ablyWithHandle:(NSNumber *)handle; [plugin registerWithCompletionHandler:result]; }; +static FlutterHandler _createRestWithOptions = ^void(AblyFlutterPlugin *const plugin, FlutterMethodCall *const call, const FlutterResult result) { + AblyFlutterMessage *const message = call.arguments; + LOG(@"message for handle %@", message.handle); + AblyFlutter *const ably = [plugin ablyWithHandle:message.handle]; + // TODO if ably is nil here then an error response, perhaps? or allow Dart side to understand null response? + result([ably createRestWithOptions:message.message]); +}; + +static FlutterHandler _publishRestMessage = ^void(AblyFlutterPlugin *const plugin, FlutterMethodCall *const call, const FlutterResult result) { + AblyFlutterMessage *const message = call.arguments; + LOG(@"message for handle %@", message.handle); + AblyFlutter *const ably = [plugin ablyWithHandle:message.handle]; + AblyFlutterMessage *const messageData = message.message; + NSMutableDictionary* _dataMap = messageData.message; + NSString *channelName = (NSString*)[_dataMap objectForKey:@"channel"]; + NSString *eventName = (NSString*)[_dataMap objectForKey:@"name"]; + NSObject *eventData = (NSString*)[_dataMap objectForKey:@"message"]; + ARTRest *client = [ably getRest:messageData.handle]; + ARTRestChannel *channel = [client.channels get:channelName]; + + //Handling nil cases, to be generalized based on other encounters + NSString *nilStr = nil; + if([eventName isKindOfClass:[NSNull class]]){ eventName = nilStr; } + if([eventData isKindOfClass:[NSNull class]]){ eventData = nilStr; } + [channel publish:eventName data:eventData callback:^(ARTErrorInfo *_Nullable error){ + if(error){ + result([ + FlutterError + errorWithCode:[NSString stringWithFormat: @"%ld", (long)error.code] + message:[NSString stringWithFormat:@"Unable to publish message to Ably server; err = %@", [error message]] + details:nil + ]); + }else{ + result(nil); + } + }]; +}; + static FlutterHandler _createRealtimeWithOptions = ^void(AblyFlutterPlugin *const plugin, FlutterMethodCall *const call, const FlutterResult result) { AblyFlutterMessage *const message = call.arguments; LOG(@"message for handle %@", message.handle); @@ -92,6 +130,8 @@ -(instancetype)initWithChannel:(FlutterMethodChannel *const)channel { @"getPlatformVersion": _getPlatformVersion, @"getVersion": _getVersion, @"register": _register, + @"createRestWithOptions": _createRestWithOptions, + @"publish": _publishRestMessage, @"createRealtimeWithOptions": _createRealtimeWithOptions, @"connectRealtime": _connectRealtime, @"dispose": _dispose, From 9b6892e60fb4245a1d603340c95e3993029deb90 Mon Sep 17 00:00:00 2001 From: "Rohit R. Abbadi" Date: Tue, 28 Apr 2020 18:10:48 +0530 Subject: [PATCH 5/9] adding all combinations to send messages after creating realtime instance --- example/lib/main.dart | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/example/lib/main.dart b/example/lib/main.dart index 705498e22..acbdf6b1a 100644 --- a/example/lib/main.dart +++ b/example/lib/main.dart @@ -92,7 +92,6 @@ class _MyAppState extends State { void createAblyRest() async { setState(() { _restCreationState = OpState.InProgress; }); - final clientOptions = ably.ClientOptions.fromKey("dBjBRg.FqW4GA:68x_ibgJnyCebDUE"); final clientOptions = ably.ClientOptions.fromKey(_appKey.toString()); clientOptions.environment = 'sandbox'; clientOptions.logLevel = ably.LogLevel.VERBOSE; @@ -116,8 +115,10 @@ class _MyAppState extends State { String name = "Hello"; dynamic data = "Flutter"; - print('publishing message... name "$name", message "$data"'); + print('publishing messages... name "$name", message "$data"'); await rest.channels.get('test').publish(name, data); + await rest.channels.get('test').publish(name); + await rest.channels.get('test').publish(); print('Message published'); } From c5314a0498cf14e1bc7e19c8691ad6e1a07348f5 Mon Sep 17 00:00:00 2001 From: "Rohit R. Abbadi" Date: Fri, 24 Apr 2020 17:33:06 +0530 Subject: [PATCH 6/9] other iOS related config files updated by XCode --- example/ios/Runner.xcodeproj/project.pbxproj | 5 ++++- .../xcshareddata/xcschemes/Runner.xcscheme | 10 +++------- 2 files changed, 7 insertions(+), 8 deletions(-) diff --git a/example/ios/Runner.xcodeproj/project.pbxproj b/example/ios/Runner.xcodeproj/project.pbxproj index dab0b6b91..494525f02 100644 --- a/example/ios/Runner.xcodeproj/project.pbxproj +++ b/example/ios/Runner.xcodeproj/project.pbxproj @@ -80,7 +80,6 @@ 10B8B89ABB4264117E7AB56C /* Pods-Runner.release.xcconfig */, EA3336021AE374E30F8FCF54 /* Pods-Runner.profile.xcconfig */, ); - name = Pods; path = Pods; sourceTree = ""; }; @@ -185,6 +184,7 @@ TargetAttributes = { 97C146ED1CF9000F007C117D = { CreatedOnToolsVersion = 7.3.1; + DevelopmentTeam = S38X8U35U5; }; }; }; @@ -393,6 +393,7 @@ buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; + DEVELOPMENT_TEAM = S38X8U35U5; ENABLE_BITCODE = NO; FRAMEWORK_SEARCH_PATHS = ( "$(inherited)", @@ -523,6 +524,7 @@ buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; + DEVELOPMENT_TEAM = S38X8U35U5; ENABLE_BITCODE = NO; FRAMEWORK_SEARCH_PATHS = ( "$(inherited)", @@ -546,6 +548,7 @@ buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; + DEVELOPMENT_TEAM = S38X8U35U5; ENABLE_BITCODE = NO; FRAMEWORK_SEARCH_PATHS = ( "$(inherited)", diff --git a/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index a28140cfd..16396c3bf 100644 --- a/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -1,6 +1,6 @@ - - - - + + - - Date: Tue, 5 May 2020 09:44:53 +0530 Subject: [PATCH 7/9] constants to use lowerCamelCase ref: https://dart.dev/guides/language/effective-dart/style#prefer-using-lowercamelcase-for-constant-names - Resolution for comment https://github.com/ably/ably-flutter/pull/4#discussion_r419157567 --- example/lib/main.dart | 4 ++-- lib/src/spec/constants.dart | 12 ++++++------ test/ably_api_unit_test.dart | 2 +- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/example/lib/main.dart b/example/lib/main.dart index acbdf6b1a..dbc321513 100644 --- a/example/lib/main.dart +++ b/example/lib/main.dart @@ -94,7 +94,7 @@ class _MyAppState extends State { final clientOptions = ably.ClientOptions.fromKey(_appKey.toString()); clientOptions.environment = 'sandbox'; - clientOptions.logLevel = ably.LogLevel.VERBOSE; + clientOptions.logLevel = ably.LogLevel.verbose; clientOptions.logHandler = ({String msg, ably.AblyException exception}){ print("Custom logger :: $msg $exception"); }; @@ -127,7 +127,7 @@ class _MyAppState extends State { final clientOptions = ably.ClientOptions.fromKey(_appKey.toString()); clientOptions.environment = 'sandbox'; - clientOptions.logLevel = ably.LogLevel.VERBOSE; + clientOptions.logLevel = ably.LogLevel.verbose; clientOptions.logHandler = ({String msg, ably.AblyException exception}){ print("Custom logger :: $msg $exception"); }; diff --git a/lib/src/spec/constants.dart b/lib/src/spec/constants.dart index 1c4a17541..4b7782b80 100644 --- a/lib/src/spec/constants.dart +++ b/lib/src/spec/constants.dart @@ -1,8 +1,8 @@ class LogLevel{ - static final int NONE = 99; - static final int VERBOSE = 2; - static final int DEBUG = 3; - static final int INFO = 4; - static final int WARN = 5; - static final int ERROR = 6; + static final int none = 99; + static final int verbose = 2; + static final int debug = 3; + static final int info = 4; + static final int warn = 5; + static final int error = 6; } diff --git a/test/ably_api_unit_test.dart b/test/ably_api_unit_test.dart index 24025e119..527aa13d4 100644 --- a/test/ably_api_unit_test.dart +++ b/test/ably_api_unit_test.dart @@ -8,7 +8,7 @@ void main() { test('Default ClientOptions', () { final clientOptions = ClientOptions(); expect(clientOptions.clientId, isNull); - expect(clientOptions.logLevel, LogLevel.INFO); + expect(clientOptions.logLevel, LogLevel.info); expect(clientOptions.logHandler, isNull); expect(clientOptions.tls, isNull); expect(clientOptions.restHost, isNull); From 5433f1b437883e87e6d616ef4d5461b09a4bef3b Mon Sep 17 00:00:00 2001 From: Quintin Willison Date: Tue, 28 Apr 2020 14:55:58 +0100 Subject: [PATCH 8/9] Improve terminology. --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index ba21fc89b..60b74922b 100644 --- a/README.md +++ b/README.md @@ -11,7 +11,7 @@ client library SDKs for [Ably](https://ably.io/), the realtime data delivery pla Ably provides the best infrastructure and APIs to power realtime experiences at scale, delivering billions of realtime messages everyday to millions of end users. We handle the complexity of realtime messaging so you can focus on your code. -## :construction: Work In Progress! :construction: +## :construction: Experimental! :construction: We're busy working on this repository at the moment and we're doing that work in the public domain so that you can watch or [contribute](#contributing). From 6ce0328481388fb75de3f95b21b6306b32f8c723 Mon Sep 17 00:00:00 2001 From: "Rohit R. Abbadi" Date: Tue, 5 May 2020 21:50:43 +0530 Subject: [PATCH 9/9] fix for passing NSNull vs nil to Obj-C rest channel publish method - Dart side will not pass the key if it does't have a value - Obj-C side will query incoming _dataMap for key which will return `nil` as key will not be available --- ios/Classes/AblyFlutterPlugin.m | 8 ++------ lib/src/impl/rest/channels.dart | 9 ++++----- 2 files changed, 6 insertions(+), 11 deletions(-) diff --git a/ios/Classes/AblyFlutterPlugin.m b/ios/Classes/AblyFlutterPlugin.m index 64edd5bcd..2a91edfc3 100644 --- a/ios/Classes/AblyFlutterPlugin.m +++ b/ios/Classes/AblyFlutterPlugin.m @@ -54,15 +54,11 @@ -(nullable AblyFlutter *)ablyWithHandle:(NSNumber *)handle; AblyFlutterMessage *const messageData = message.message; NSMutableDictionary* _dataMap = messageData.message; NSString *channelName = (NSString*)[_dataMap objectForKey:@"channel"]; - NSString *eventName = (NSString*)[_dataMap objectForKey:@"name"]; - NSObject *eventData = (NSString*)[_dataMap objectForKey:@"message"]; + NSString *const eventName = (NSString*)[_dataMap objectForKey:@"name"]; + NSObject *const eventData = (NSString*)[_dataMap objectForKey:@"message"]; ARTRest *client = [ably getRest:messageData.handle]; ARTRestChannel *channel = [client.channels get:channelName]; - //Handling nil cases, to be generalized based on other encounters - NSString *nilStr = nil; - if([eventName isKindOfClass:[NSNull class]]){ eventName = nilStr; } - if([eventData isKindOfClass:[NSNull class]]){ eventData = nilStr; } [channel publish:eventName data:eventData callback:^(ARTErrorInfo *_Nullable error){ if(error){ result([ diff --git a/lib/src/impl/rest/channels.dart b/lib/src/impl/rest/channels.dart index b6f0478e8..6fd71e4dd 100644 --- a/lib/src/impl/rest/channels.dart +++ b/lib/src/impl/rest/channels.dart @@ -31,11 +31,10 @@ class RestPlatformChannel extends PlatformObject implements spec.Channel{ @override Future publish([String name, dynamic data]) async { try { - await this.invoke(PlatformMethod.publish, { - "channel": this.name, - "name": name, - "message": data - }); + Map _map = { "channel": this.name, }; + if(name!=null) _map["name"] = name; + if(data!=null) _map["message"] = data; + await this.invoke(PlatformMethod.publish, _map); } on PlatformException catch (pe) { throw spec.AblyException(pe.code, pe.message); }