Skip to content

Commit

Permalink
fix(whiteboard): refactor .
Browse files Browse the repository at this point in the history
  • Loading branch information
lambiengcode committed Oct 20, 2024
2 parents 4bb3488 + a42f635 commit 1705c6d
Show file tree
Hide file tree
Showing 28 changed files with 416 additions and 116 deletions.
4 changes: 4 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,7 @@
## 1.5.1

* [Fix]: Isolate on web

## 1.5.0

* [Feat]: encrypted chats
Expand Down
3 changes: 3 additions & 0 deletions lib/constants/api_enpoints.dart
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,9 @@ class ApiEndpoints {
static const String meetingConversations = 'meetings/conversations';
static const String meetingMembers = 'meetings/members';
static const String acceptInvite = 'meetings/members/accept';
static const String records = 'meetings/records';
static const String startRecord = 'meetings/record/start';
static const String stopRecord = 'meetings/record/stop';

// Chats
static const String chats = 'chats';
Expand Down
15 changes: 11 additions & 4 deletions lib/constants/socket_events.dart
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
class SocketEvent {
// Meeting
static const String publishCSS = 'PUBLISH_CSS';
static const String publishSSC = 'PUBLISH_SSC';
static const String subscribeCSS = 'SUBSCRIBE_CSS';
Expand All @@ -21,18 +22,19 @@ class SocketEvent {
static const String setAudioEnabledSSC = "SET_AUDIO_ENABLED_SSC";
static const String setScreenSharingSSC = "SET_SCREEN_SHARING_SSC";
static const String setScreenSharingCSS = "SET_SCREEN_SHARING_CSS";
static const String handRaisingSSC = 'HAND_RAISING_SSC';
static const String handRaisingCSS = 'HAND_RAISING_CSS';
static const String subtitleSSC = 'SUBTITLE_SSC';
static const String setSubscribeSubtitleCSS = 'SET_SUBSCRIBE_SUBTITLE_CSS';
static const String startRecordSSC = 'START_RECORD_SSC';
static const String stopRecordSSC = 'STOP_RECORD_SSC';

static const String publisherRenegotiationCSS = 'PUBLISHER_RENEGOTIATION_CSS';
static const String publisherRenegotiationSSC = 'PUBLISHER_RENEGOTIATION_SSC';
static const String subscriberRenegotiationSSC =
'SUBSCRIBER_RENEGOTIATION_SSC';

static const String sendPodNameSSC = 'SEND_POD_NAME_SSC';
static const String reconnect = 'reconnect_CSS';
static const String destroy = 'destroy';

// Chats
static const String sendMessageSSC = 'SEND_MESSAGE_SSC';
static const String updateMessageSSC = 'UPDATE_MESSAGE_SSC';
static const String deleteMessageSSC = 'DELETE_MESSAGE_SSC';
Expand All @@ -43,4 +45,9 @@ class SocketEvent {
static const String updateWhiteBoardSSC = 'UPDATE_WHITE_BOARD_SSC';
static const String cleanWhiteBoardCSS = 'CLEAN_WHITE_BOARD_CSS';
static const String cleanWhiteBoardSSC = 'CLEAN_WHITE_BOARD_SSC';

// System
static const String sendPodNameSSC = 'SEND_POD_NAME_SSC';
static const String reconnect = 'reconnect_CSS';
static const String destroy = 'destroy';
}
32 changes: 23 additions & 9 deletions lib/core/api/base/base_remote_data.dart
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
import 'dart:async';
import 'dart:convert' as convert;
import 'dart:convert';
import 'dart:io';

import 'package:dio/dio.dart';
import 'package:injectable/injectable.dart';
Expand Down Expand Up @@ -82,21 +84,14 @@ class BaseRemoteData {
Future<Response<dynamic>> postRoute(
String gateway, {
Map<String, dynamic>? body,
String? query,
Map<String, dynamic>? queryParameters,
}) async {
try {
final Map<String, String> paramsObject = {};
if (query != null) {
query.split('&').forEach((element) {
paramsObject[element.split('=')[0].toString()] =
element.split('=')[1].toString();
});
}
final Response response = await dio.post(
gateway,
data: body == null ? {} : convert.jsonEncode(body),
options: getOptions(),
queryParameters: query == null ? null : paramsObject,
queryParameters: queryParameters,
);

return response;
Expand Down Expand Up @@ -263,6 +258,7 @@ class BaseRemoteData {
connectTimeout: 10.seconds,
receiveTimeout: 10.seconds,
sendTimeout: 10.seconds,
responseDecoder: _responseDecoder,
),
);

Expand All @@ -272,4 +268,22 @@ class BaseRemoteData {
.then((client) => dio = client),
]);
}

FutureOr<String?> _responseDecoder(
List<int> responseBytes,
RequestOptions options,
ResponseBody responseBody,
) {
final encoding = (responseBody.headers["content-encoding"] ?? ['']).first;
switch (encoding) {
case "":
return utf8.decode(responseBytes);
case "gzip":
return utf8.decode(gzip.decode(responseBytes));
default:
throw Exception(
"unsupported encoding /$encoding/ used in response body",
);
}
}
}
5 changes: 4 additions & 1 deletion lib/core/api/chat/datasources/chat_remote_datasource.dart
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,10 @@ class ChatRemoteDataSourceImpl extends ChatRemoteDataSource {
final String key = map['key'];
final List<Meeting> conversationsDecrypt = [];
for (final Meeting conversation in conversations) {
if (conversation.latestMessage == null) continue;
if (conversation.latestMessage == null) {
conversationsDecrypt.add(conversation);
continue;
}

final String decrypt = await EncryptAES().decryptAES256(
cipherText: conversation.latestMessage?.data ?? "",
Expand Down
40 changes: 40 additions & 0 deletions lib/core/api/meetings/datasources/meeting_remote_datesource.dart
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import 'package:waterbus_sdk/constants/api_enpoints.dart';
import 'package:waterbus_sdk/constants/http_status_code.dart';
import 'package:waterbus_sdk/core/api/base/base_remote_data.dart';
import 'package:waterbus_sdk/types/models/meeting_model.dart';
import 'package:waterbus_sdk/types/models/record_model.dart';

abstract class MeetingRemoteDataSource {
Future<Meeting?> createMeeting({
Expand All @@ -23,6 +24,9 @@ abstract class MeetingRemoteDataSource {
required Meeting meeting,
});
Future<Meeting?> getInfoMeeting(int code);
Future<List<RecordModel>> getRecords({required int skip, required int limit});
Future<int?> startRecord(int roomId);
Future<bool> stopRecord(int roomId);
}

@LazySingleton(as: MeetingRemoteDataSource)
Expand Down Expand Up @@ -115,4 +119,40 @@ class MeetingRemoteDataSourceImpl extends MeetingRemoteDataSource {

return response.statusCode == StatusCode.ok;
}

@override
Future<List<RecordModel>> getRecords({required int skip, required int limit}) async {
final Response response = await _remoteData.getRoute(ApiEndpoints.records);

if (response.statusCode == StatusCode.ok) {
final List rawData = response.data;
return rawData.map((data) => RecordModel.fromMap(data)).toList();
}

return [];
}

@override
Future<int?> startRecord(int roomId) async {
final Response response = await _remoteData.postRoute(
ApiEndpoints.startRecord,
queryParameters: {"code": roomId},
);

if (response.statusCode == StatusCode.created) {
return response.data['id'];
}

return null;
}

@override
Future<bool> stopRecord(int roomId) async {
final Response response = await _remoteData.postRoute(
ApiEndpoints.stopRecord,
queryParameters: {"code": roomId},
);

return response.statusCode == StatusCode.created;
}
}
19 changes: 19 additions & 0 deletions lib/core/api/meetings/repositories/meeting_repository.dart
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ import 'package:injectable/injectable.dart';
import 'package:waterbus_sdk/core/api/meetings/datasources/meeting_remote_datesource.dart';
import 'package:waterbus_sdk/types/index.dart';
import 'package:waterbus_sdk/types/models/create_meeting_params.dart';
import 'package:waterbus_sdk/types/models/record_model.dart';

abstract class MeetingRepository {
Future<Meeting?> createMeeting(CreateMeetingParams params);
Expand All @@ -14,6 +15,9 @@ abstract class MeetingRepository {
CreateMeetingParams params,
);
Future<Meeting?> getInfoMeeting(int code);
Future<List<RecordModel>> getRecords({required int skip, required int limit});
Future<int?> startRecord(int roomId);
Future<bool> stopRecord(int roomId);
}

@LazySingleton(as: MeetingRepository)
Expand Down Expand Up @@ -117,4 +121,19 @@ class MeetingRepositoryImpl extends MeetingRepository {

return meeting.copyWith(participants: participants);
}

@override
Future<List<RecordModel>> getRecords({required int skip, required int limit}) async {
return await _remoteDataSource.getRecords(skip: skip, limit: limit);
}

@override
Future<int?> startRecord(int roomId) async {
return await _remoteDataSource.startRecord(roomId);
}

@override
Future<bool> stopRecord(int roomId) async {
return await _remoteDataSource.stopRecord(roomId);
}
}
32 changes: 31 additions & 1 deletion lib/core/webrtc/webrtc.dart
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,7 @@ class WaterbusWebRTCManagerIpml extends WaterbusWebRTCManager {
MediaStream? _displayStream;
ParticipantSFU? _mParticipant;
bool _flagPublisherCanAddCandidate = false;
bool _isRecording = false;
CallSetting _callSetting = CallSetting();
final Map<String, ParticipantSFU> _subscribers = {};
final Map<String, List<RTCIceCandidate>> _queueRemoteSubCandidates = {};
Expand Down Expand Up @@ -199,7 +200,9 @@ class WaterbusWebRTCManagerIpml extends WaterbusWebRTCManager {
}

@override
Future<void> setPublisherRemoteSdp(String sdp) async {
Future<void> setPublisherRemoteSdp(String sdp, [bool? isRecording]) async {
if (isRecording != null) _isRecording = isRecording;

final RTCSessionDescription description = RTCSessionDescription(
sdp,
DescriptionType.answer.type,
Expand All @@ -223,6 +226,7 @@ class WaterbusWebRTCManagerIpml extends WaterbusWebRTCManager {
required bool audioEnabled,
required bool isScreenSharing,
required bool isE2eeEnabled,
required bool isHandRaising,
required CameraType type,
required WebRTCCodec codec,
}) async {
Expand All @@ -240,6 +244,7 @@ class WaterbusWebRTCManagerIpml extends WaterbusWebRTCManager {
audioEnabled,
isScreenSharing,
isE2eeEnabled,
isHandRaising,
type,
codec,
);
Expand Down Expand Up @@ -456,6 +461,14 @@ class WaterbusWebRTCManagerIpml extends WaterbusWebRTCManager {
_notify(CallbackEvents.shouldBeUpdateState);
}

@override
void toggleRaiseHand() {
if (_mParticipant == null) return;

_mParticipant!.isHandRaising = !_mParticipant!.isHandRaising;
_socketEmiter.setHandRaising(_mParticipant!.isHandRaising);
}

@override
Future<void> setE2eeEnabled({
required String targetId,
Expand Down Expand Up @@ -510,6 +523,18 @@ class WaterbusWebRTCManagerIpml extends WaterbusWebRTCManager {
_notify(CallbackEvents.shouldBeUpdateState);
}

@override
void setHandRaising({required String targetId, required bool isRaising}) {
_subscribers[targetId]?.isHandRaising = isRaising;
_notify(CallbackEvents.shouldBeUpdateState);
}

@override
void setIsRecording({required bool isRecording}) {
_isRecording = isRecording;
_notify(CallbackEvents.shouldBeUpdateState);
}

@override
Future<void> dispose() async {
try {
Expand Down Expand Up @@ -784,6 +809,7 @@ class WaterbusWebRTCManagerIpml extends WaterbusWebRTCManager {
bool videoEnabled,
bool audioEnabled,
bool isScreenSharing,
bool isHandRaising,
bool isE2eeEnabled,
CameraType type,
WebRTCCodec codec,
Expand All @@ -800,6 +826,7 @@ class WaterbusWebRTCManagerIpml extends WaterbusWebRTCManager {
isVideoEnabled: videoEnabled,
isSharingScreen: isScreenSharing,
isE2eeEnabled: isE2eeEnabled,
isHandRaising: isHandRaising,
cameraType: type,
videoCodec: codec,
stats: _stats,
Expand Down Expand Up @@ -940,4 +967,7 @@ class WaterbusWebRTCManagerIpml extends WaterbusWebRTCManager {

@override
String? get roomId => _roomId;

@override
bool get isRecording => _isRecording;
}
7 changes: 6 additions & 1 deletion lib/core/webrtc/webrtc_interface.dart
Original file line number Diff line number Diff line change
Expand Up @@ -6,14 +6,15 @@ abstract class WaterbusWebRTCManager {
Future<void> joinRoom({required String roomId, required int participantId});
Future<void> reconnect();
Future<void> subscribe(List<String> targetIds);
Future<void> setPublisherRemoteSdp(String sdp);
Future<void> setPublisherRemoteSdp(String sdp, [bool? isRecording]);
Future<void> setSubscriberRemoteSdp({
required String targetId,
required String sdp,
required bool videoEnabled,
required bool audioEnabled,
required bool isScreenSharing,
required bool isE2eeEnabled,
required bool isHandRaising,
required CameraType type,
required WebRTCCodec codec,
});
Expand All @@ -39,11 +40,14 @@ abstract class WaterbusWebRTCManager {
Future<void> toggleSpeakerPhone({bool? forceValue});
Future<void> toggleVideo();
Future<void> switchCamera();
void toggleRaiseHand();
void setE2eeEnabled({required String targetId, required bool isEnabled});
void setVideoEnabled({required String targetId, required bool isEnabled});
void setCameraType({required String targetId, required CameraType type});
void setAudioEnabled({required String targetId, required bool isEnabled});
void setScreenSharing({required String targetId, required bool isSharing});
void setHandRaising({required String targetId, required bool isRaising});
void setIsRecording({required bool isRecording});
Future<void> enableVirtualBackground({
required Uint8List backgroundImage,
double thresholdConfidence = 0.7,
Expand All @@ -54,4 +58,5 @@ abstract class WaterbusWebRTCManager {
CallState callState();
Stream<CallbackPayload> get notifyChanged;
String? get roomId;
bool get isRecording;
}
4 changes: 3 additions & 1 deletion lib/core/websocket/interfaces/socket_emiter_interface.dart
Original file line number Diff line number Diff line change
Expand Up @@ -28,9 +28,11 @@ abstract class SocketEmiter {
void setVideoEnabled(bool isEnabled);
void setAudioEnabled(bool isEnabled);
void setScreenSharing(bool isSharing);
void setSubtitle(bool isEnabled);
void setHandRaising(bool isRaising);

void sendNewSdp(String sdp);
void leaveRoom(String roomId);
void setSubtitle(bool isEnabled);
void reconnect();

// White board
Expand Down
5 changes: 5 additions & 0 deletions lib/core/websocket/socket_emiter.dart
Original file line number Diff line number Diff line change
Expand Up @@ -111,6 +111,11 @@ class SocketEmiterImpl extends SocketEmiter {
_socket?.emit(SocketEvent.setSubscribeSubtitleCSS, {'enabled': isEnabled});
}

@override
void setHandRaising(bool isRaising) {
_socket?.emit(SocketEvent.handRaisingCSS, {'isRaising': isRaising});
}

@override
void reconnect() {
_socket?.emit(SocketEvent.reconnect);
Expand Down
Loading

0 comments on commit 1705c6d

Please sign in to comment.