feat(ios): files sending

This commit is contained in:
ksenia312
2024-02-04 16:23:48 +01:00
parent 32a9f2a923
commit 66a79eb4ba
29 changed files with 682 additions and 236 deletions
+1 -1
View File
@@ -327,4 +327,4 @@ class NearbyMessageFilesResponse extends NearbyMessageFilesContent {
String toString() {
return 'NearbyMessageFileResponse{response: $response, id: $id, files: $files}';
}
}
}
@@ -150,6 +150,9 @@ class NearbyAndroidMapper implements NearbyDeviceMapper {
@override
NearbyDevice? mapToDevice(dynamic value) {
return NearbyAndroidDevice.fromJson(JSONDecoder.decodeMap(value));
final decoded = JSONDecoder.decodeMap(value);
if (decoded == null) return null;
return NearbyAndroidDevice.fromJson(decoded);
}
}
@@ -204,8 +204,8 @@ class NearbySocketService {
if (_connectedDeviceId != null) {
_messagesSubscription = _socket
?.map(MessagesStreamMapper.toMessage)
.where((e) => e != null)
?.where((e) => e != null)
.map(MessagesStreamMapper.toMessage)
.cast<ReceivedNearbyMessage>()
.map((e) => MessagesStreamMapper.replaceId(e, _connectedDeviceId!))
.listen(
@@ -85,8 +85,9 @@ class NearbyIOSMapper implements NearbyDeviceMapper {
@override
NearbyDevice? mapToDevice(dynamic value) {
return NearbyIOSDevice.fromJson(
JSONDecoder.decodeMap(value),
);
final decoded = JSONDecoder.decodeMap(value);
if (decoded == null) return null;
return NearbyIOSDevice.fromJson(decoded);
}
}
+25 -18
View File
@@ -17,6 +17,7 @@ class NearbyIOSService extends NearbyService {
final _state = ValueNotifier(CommunicationChannelState.notConnected);
StreamSubscription? _messagesSubscription;
StreamSubscription? _resourcesSubscription;
@override
ValueListenable<CommunicationChannelState> get communicationChannelState =>
@@ -166,25 +167,12 @@ class NearbyIOSService extends NearbyService {
final eventListener = data.messagesListener;
final filesListener = data.filesListener;
_messagesSubscription = NearbyServiceIOSPlatform.instance.messagesStream
// .map(MessagesStreamMapper.toMessage)
// .where((event) => event?.sender.id == data.connectedDeviceId)
// .where((event) => event != null)
// .cast<ReceivedNearbyMessage>()
.where((event) => event != null)
.map(MessagesStreamMapper.toMessage)
.where((event) => event?.sender.id == data.connectedDeviceId)
.cast<ReceivedNearbyMessage>()
.listen(
(event) {
try {
final message = MessagesStreamMapper.toMessage(event);
if (message != null && message.sender.id == data.connectedDeviceId) {
eventListener.onData(message);
}
} catch (e) {
try {
filesListener?.onData(event);
} catch (e) {
Logger.error(e);
}
}
},
eventListener.onData,
onDone: () {
_state.value = CommunicationChannelState.notConnected;
eventListener.onDone?.call();
@@ -196,6 +184,20 @@ class NearbyIOSService extends NearbyService {
},
cancelOnError: eventListener.cancelOnError,
);
_resourcesSubscription = NearbyServiceIOSPlatform.instance.resourcesStream
.map(ResourcesStreamMapper.toFiles)
.where((event) => event != null)
.cast<List<NearbyFile>>()
.listen(
(e) => filesListener?.onData.call(e),
onDone: filesListener?.onDone,
onError: (e, s) {
Logger.error(e);
_state.value = CommunicationChannelState.notConnected;
filesListener?.onError?.call(e, s);
},
cancelOnError: filesListener?.cancelOnError,
);
if (_messagesSubscription != null) {
Logger.info('Messages subscription was created successfully');
eventListener.onCreated?.call();
@@ -203,6 +205,9 @@ class NearbyIOSService extends NearbyService {
} else {
_state.value = CommunicationChannelState.notConnected;
}
if (_resourcesSubscription != null) {
Logger.info('Resources subscription was created successfully');
}
return true;
}
@@ -214,7 +219,9 @@ class NearbyIOSService extends NearbyService {
@override
FutureOr<bool> endCommunicationChannel() async {
await _messagesSubscription?.cancel();
await _resourcesSubscription?.cancel();
_messagesSubscription = null;
_resourcesSubscription = null;
_state.value = CommunicationChannelState.notConnected;
Logger.debug('Communication channel was cancelled');
return true;
@@ -27,6 +27,10 @@ abstract class NearbyServiceIOSPlatform extends PlatformInterface {
throw UnimplementedError('messagesStream() has not been implemented.');
}
Stream get resourcesStream {
throw UnimplementedError('resourcesStream() has not been implemented.');
}
Future<bool> initialize([String? deviceName]) {
throw UnimplementedError('initialize() has not been implemented.');
}
@@ -7,10 +7,14 @@ import 'package:nearby_service/nearby_service.dart';
/// An implementation of [NearbyServiceIOSPlatform] that uses method channels.
class MethodChannelIOSNearbyService extends NearbyServiceIOSPlatform {
final messageReceiver = StreamController.broadcast();
final resourcesReceiver = StreamController.broadcast();
@override
Stream get messagesStream => messageReceiver.stream;
@override
Stream get resourcesStream => resourcesReceiver.stream;
/// The method channel used to interact with the native platform.
@visibleForTesting
final methodChannel = const MethodChannel('nearby_service');
@@ -22,6 +26,9 @@ class MethodChannelIOSNearbyService extends NearbyServiceIOSPlatform {
case 'invoke_nearby_service_message_received':
messageReceiver.add(handler.arguments);
break;
case 'invoke_nearby_service_resources_received':
resourcesReceiver.add(handler.arguments);
break;
}
});
return (await methodChannel.invokeMethod<bool>(
+23 -4
View File
@@ -1,8 +1,8 @@
import 'dart:io';
import 'package:nearby_service/nearby_service.dart';
import 'package:nearby_service/src/utils/json_decoder.dart';
import 'logger.dart';
abstract class MessagesStreamMapper {
static ReceivedNearbyMessage replaceId(
ReceivedNearbyMessage message,
@@ -22,10 +22,29 @@ abstract class MessagesStreamMapper {
final decoded = JSONDecoder.decodeMap(event);
return ReceivedNearbyMessage.fromJson(decoded);
} catch (e) {
Logger.debug(
throw NearbyServiceException(
'Can\'t convert $event to ReceivedNearbyMessage',
);
}
}
}
abstract class ResourcesStreamMapper {
static List<NearbyFile>? toFiles(dynamic event) {
try {
final decoded = JSONDecoder.decodeList(event);
final infoList = [
...?decoded?.map(
(e) => NearbyFileInfo.fromJson(e as Map<String, dynamic>),
)
];
return [
...infoList.map((e) => NearbyFile(info: e, file: File(e.path))),
];
} catch (e) {
throw NearbyServiceException(
'Can\'t convert $event to ReceivedNearbyMessage',
);
}
return null;
}
}