feat(ios): files sending
This commit is contained in:
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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>(
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user