From c9281e0c89b6ed3f5188c64fa863da1cf41076e0 Mon Sep 17 00:00:00 2001 From: Sacha Arbonel Date: Thu, 4 Aug 2022 16:07:13 -0400 Subject: [PATCH] third party video integration --- melos.yaml | 4 +-- .../stream_chat/lib/src/client/client.dart | 13 +++++++ .../lib/src/core/api/call_api.dart | 28 +++++++++++++++ .../lib/src/core/api/stream_chat_api.dart | 6 ++++ .../lib/src/core/models/agora_payload.dart | 13 +++++++ .../lib/src/core/models/agora_payload.g.dart | 16 +++++++++ .../lib/src/core/models/call_payload.dart | 22 ++++++++++++ .../lib/src/core/models/call_payload.g.dart | 35 +++++++++++++++++++ .../src/core/models/call_token_payload.dart | 20 +++++++++++ .../src/core/models/call_token_payload.g.dart | 30 ++++++++++++++++ .../src/core/models/create_call_payload.dart | 18 ++++++++++ .../core/models/create_call_payload.g.dart | 17 +++++++++ .../lib/src/core/models/hms_payload.dart | 17 +++++++++ .../lib/src/core/models/hms_payload.g.dart | 18 ++++++++++ 14 files changed, 255 insertions(+), 2 deletions(-) create mode 100644 packages/stream_chat/lib/src/core/api/call_api.dart create mode 100644 packages/stream_chat/lib/src/core/models/agora_payload.dart create mode 100644 packages/stream_chat/lib/src/core/models/agora_payload.g.dart create mode 100644 packages/stream_chat/lib/src/core/models/call_payload.dart create mode 100644 packages/stream_chat/lib/src/core/models/call_payload.g.dart create mode 100644 packages/stream_chat/lib/src/core/models/call_token_payload.dart create mode 100644 packages/stream_chat/lib/src/core/models/call_token_payload.g.dart create mode 100644 packages/stream_chat/lib/src/core/models/create_call_payload.dart create mode 100644 packages/stream_chat/lib/src/core/models/create_call_payload.g.dart create mode 100644 packages/stream_chat/lib/src/core/models/hms_payload.dart create mode 100644 packages/stream_chat/lib/src/core/models/hms_payload.g.dart diff --git a/melos.yaml b/melos.yaml index 10e7ca7b..3291c18e 100644 --- a/melos.yaml +++ b/melos.yaml @@ -54,11 +54,11 @@ scripts: description: Build all generated files for Dart & Flutter packages in this project. generate:dart: - run: melos exec -c 1 --depends-on="build_runner" --no-flutter -- "dart run build_runner build --delete-conflicting-outputs" + run: melos exec -c 1 --depends-on="build_runner" --no-flutter -- "dart pub run build_runner build --delete-conflicting-outputs --enable-experiment=super-parameters,enhanced-enums" description: Build all generated files for Dart packages in this project. generate:flutter: - run: melos exec -c 1 --depends-on="build_runner" --flutter -- "flutter pub run build_runner build --delete-conflicting-outputs" + run: melos exec -c 1 --depends-on="build_runner" --flutter -- "flutter pub run build_runner build --delete-conflicting-outputs --enable-experiment=super-parameters,enhanced-enums" description: Build all generated files for Flutter packages in this project. test:all: diff --git a/packages/stream_chat/lib/src/client/client.dart b/packages/stream_chat/lib/src/client/client.dart index c2950377..4b0482a3 100644 --- a/packages/stream_chat/lib/src/client/client.dart +++ b/packages/stream_chat/lib/src/client/client.dart @@ -17,8 +17,10 @@ import 'package:stream_chat/src/core/http/stream_http_client.dart'; import 'package:stream_chat/src/core/http/token.dart'; import 'package:stream_chat/src/core/http/token_manager.dart'; import 'package:stream_chat/src/core/models/attachment_file.dart'; +import 'package:stream_chat/src/core/models/call_token_payload.dart'; import 'package:stream_chat/src/core/models/channel_model.dart'; import 'package:stream_chat/src/core/models/channel_state.dart'; +import 'package:stream_chat/src/core/models/create_call_payload.dart'; import 'package:stream_chat/src/core/models/event.dart'; import 'package:stream_chat/src/core/models/filter.dart'; import 'package:stream_chat/src/core/models/member.dart'; @@ -585,6 +587,17 @@ class StreamChatClient { } } + Future getCallToken(String callId) async => + _chatApi.call.getCallToken(callId); + + Future createCall( + String callId, + String callType, + Map? options, + ) async { + return _chatApi.call.createCall(callId, callType, options); + } + /// Requests channels with a given query from the API. Future> queryChannelsOnline({ Filter? filter, diff --git a/packages/stream_chat/lib/src/core/api/call_api.dart b/packages/stream_chat/lib/src/core/api/call_api.dart new file mode 100644 index 00000000..e2f767f5 --- /dev/null +++ b/packages/stream_chat/lib/src/core/api/call_api.dart @@ -0,0 +1,28 @@ +import 'package:stream_chat/src/core/http/stream_http_client.dart'; +import 'package:stream_chat/src/core/models/call_token_payload.dart'; +import 'package:stream_chat/src/core/models/create_call_payload.dart'; + +class CallApi { + /// Initialize a new call api + CallApi(this._client); + + final StreamHttpClient _client; + + Future getCallToken(String callId) async { + final response = await _client.post( + '/calls/$callId', + ); + return CallTokenPayload.fromJson(response.data); + } + + Future createCall( + String callId, + String callType, + Map? options, + ) async { + final response = await _client.post( + '/channels/$callType/$callId/call', + ); + return CreateCallPayload.fromJson(response.data); + } +} diff --git a/packages/stream_chat/lib/src/core/api/stream_chat_api.dart b/packages/stream_chat/lib/src/core/api/stream_chat_api.dart index cf6c0bad..c19b81a9 100644 --- a/packages/stream_chat/lib/src/core/api/stream_chat_api.dart +++ b/packages/stream_chat/lib/src/core/api/stream_chat_api.dart @@ -1,5 +1,6 @@ import 'package:logging/logging.dart'; import 'package:stream_chat/src/core/api/attachment_file_uploader.dart'; +import 'package:stream_chat/src/core/api/call_api.dart'; import 'package:stream_chat/src/core/api/channel_api.dart'; import 'package:stream_chat/src/core/api/device_api.dart'; import 'package:stream_chat/src/core/api/general_api.dart'; @@ -53,6 +54,11 @@ class StreamChatApi { /// Api dedicated to message operations MessageApi get message => _message ??= MessageApi(_client); + CallApi? _call; + + /// Api dedicated to guest operations + CallApi get call => _call ??= CallApi(_client); + ChannelApi? _channel; /// Api dedicated to channel operations diff --git a/packages/stream_chat/lib/src/core/models/agora_payload.dart b/packages/stream_chat/lib/src/core/models/agora_payload.dart new file mode 100644 index 00000000..35bc93b7 --- /dev/null +++ b/packages/stream_chat/lib/src/core/models/agora_payload.dart @@ -0,0 +1,13 @@ +import 'package:equatable/equatable.dart'; +import 'package:json_annotation/json_annotation.dart'; + +part 'agora_payload.g.dart'; + +@JsonSerializable(includeIfNull: false) +class AgoraPayload { + final String channel; + const AgoraPayload({required this.channel}); + + factory AgoraPayload.fromJson(Map json) => + _$AgoraPayloadFromJson(json); +} diff --git a/packages/stream_chat/lib/src/core/models/agora_payload.g.dart b/packages/stream_chat/lib/src/core/models/agora_payload.g.dart new file mode 100644 index 00000000..ff4df843 --- /dev/null +++ b/packages/stream_chat/lib/src/core/models/agora_payload.g.dart @@ -0,0 +1,16 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'agora_payload.dart'; + +// ************************************************************************** +// JsonSerializableGenerator +// ************************************************************************** + +AgoraPayload _$AgoraPayloadFromJson(Map json) => AgoraPayload( + channel: json['channel'] as String, + ); + +Map _$AgoraPayloadToJson(AgoraPayload instance) => + { + 'channel': instance.channel, + }; diff --git a/packages/stream_chat/lib/src/core/models/call_payload.dart b/packages/stream_chat/lib/src/core/models/call_payload.dart new file mode 100644 index 00000000..7754e5be --- /dev/null +++ b/packages/stream_chat/lib/src/core/models/call_payload.dart @@ -0,0 +1,22 @@ +import 'package:stream_chat/src/core/models/agora_payload.dart'; +import 'package:stream_chat/src/core/models/hms_payload.dart'; +import 'package:equatable/equatable.dart'; +import 'package:json_annotation/json_annotation.dart'; + +part 'call_payload.g.dart'; + +@JsonSerializable(includeIfNull: false) +class CallPayload extends Equatable { + final String id; + final String provider; + final AgoraPayload? agora; + final HMSPayload? hms; + + const CallPayload({required this.id, required this.provider, this.agora, this.hms}); + + factory CallPayload.fromJson(Map json) => + _$CallPayloadFromJson(json); + + @override + List get props => [id, provider, agora, hms]; +} diff --git a/packages/stream_chat/lib/src/core/models/call_payload.g.dart b/packages/stream_chat/lib/src/core/models/call_payload.g.dart new file mode 100644 index 00000000..f23cfb45 --- /dev/null +++ b/packages/stream_chat/lib/src/core/models/call_payload.g.dart @@ -0,0 +1,35 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'call_payload.dart'; + +// ************************************************************************** +// JsonSerializableGenerator +// ************************************************************************** + +CallPayload _$CallPayloadFromJson(Map json) => CallPayload( + id: json['id'] as String, + provider: json['provider'] as String, + agora: json['agora'] == null + ? null + : AgoraPayload.fromJson(json['agora'] as Map), + hms: json['hms'] == null + ? null + : HMSPayload.fromJson(json['hms'] as Map), + ); + +Map _$CallPayloadToJson(CallPayload instance) { + final val = { + 'id': instance.id, + 'provider': instance.provider, + }; + + void writeNotNull(String key, dynamic value) { + if (value != null) { + val[key] = value; + } + } + + writeNotNull('agora', instance.agora?.toJson()); + writeNotNull('hms', instance.hms?.toJson()); + return val; +} diff --git a/packages/stream_chat/lib/src/core/models/call_token_payload.dart b/packages/stream_chat/lib/src/core/models/call_token_payload.dart new file mode 100644 index 00000000..520572d1 --- /dev/null +++ b/packages/stream_chat/lib/src/core/models/call_token_payload.dart @@ -0,0 +1,20 @@ +import 'package:equatable/equatable.dart'; +import 'package:json_annotation/json_annotation.dart'; + + + +part 'call_token_payload.g.dart'; + +@JsonSerializable(includeIfNull: false) +class CallTokenPayload extends Equatable { + final String token; + final int? agoraUid; + final String? agoraAppId; + const CallTokenPayload({required this.token, this.agoraUid, this.agoraAppId}); + + factory CallTokenPayload.fromJson(Map json) => + _$CallTokenPayloadFromJson(json); + + @override + List get props => [token, agoraAppId, agoraUid]; +} diff --git a/packages/stream_chat/lib/src/core/models/call_token_payload.g.dart b/packages/stream_chat/lib/src/core/models/call_token_payload.g.dart new file mode 100644 index 00000000..df822920 --- /dev/null +++ b/packages/stream_chat/lib/src/core/models/call_token_payload.g.dart @@ -0,0 +1,30 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'call_token_payload.dart'; + +// ************************************************************************** +// JsonSerializableGenerator +// ************************************************************************** + +CallTokenPayload _$CallTokenPayloadFromJson(Map json) => + CallTokenPayload( + token: json['token'] as String, + agoraUid: json['agora_uid'] as int?, + agoraAppId: json['agora_app_id'] as String?, + ); + +Map _$CallTokenPayloadToJson(CallTokenPayload instance) { + final val = { + 'token': instance.token, + }; + + void writeNotNull(String key, dynamic value) { + if (value != null) { + val[key] = value; + } + } + + writeNotNull('agora_uid', instance.agoraUid); + writeNotNull('agora_app_id', instance.agoraAppId); + return val; +} diff --git a/packages/stream_chat/lib/src/core/models/create_call_payload.dart b/packages/stream_chat/lib/src/core/models/create_call_payload.dart new file mode 100644 index 00000000..47711e2d --- /dev/null +++ b/packages/stream_chat/lib/src/core/models/create_call_payload.dart @@ -0,0 +1,18 @@ +import 'package:equatable/equatable.dart'; +import 'package:stream_chat/src/core/models/call_payload.dart'; +import 'package:equatable/equatable.dart'; +import 'package:json_annotation/json_annotation.dart'; + + +part 'create_call_payload.g.dart'; +@JsonSerializable(includeIfNull: false) +class CreateCallPayload extends Equatable { + final CallPayload call; + const CreateCallPayload({required this.call}); + + factory CreateCallPayload.fromJson(Map json) => + _$CreateCallPayloadFromJson(json); + + @override + List get props => [call]; +} diff --git a/packages/stream_chat/lib/src/core/models/create_call_payload.g.dart b/packages/stream_chat/lib/src/core/models/create_call_payload.g.dart new file mode 100644 index 00000000..3c849797 --- /dev/null +++ b/packages/stream_chat/lib/src/core/models/create_call_payload.g.dart @@ -0,0 +1,17 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'create_call_payload.dart'; + +// ************************************************************************** +// JsonSerializableGenerator +// ************************************************************************** + +CreateCallPayload _$CreateCallPayloadFromJson(Map json) => + CreateCallPayload( + call: CallPayload.fromJson(json['call'] as Map), + ); + +Map _$CreateCallPayloadToJson(CreateCallPayload instance) => + { + 'call': instance.call.toJson(), + }; diff --git a/packages/stream_chat/lib/src/core/models/hms_payload.dart b/packages/stream_chat/lib/src/core/models/hms_payload.dart new file mode 100644 index 00000000..5d5e3e96 --- /dev/null +++ b/packages/stream_chat/lib/src/core/models/hms_payload.dart @@ -0,0 +1,17 @@ +import 'package:equatable/equatable.dart'; +import 'package:json_annotation/json_annotation.dart'; + +part 'hms_payload.g.dart'; + +@JsonSerializable(includeIfNull: false) +class HMSPayload extends Equatable { + final String roomId; + final String roomName; + const HMSPayload({required this.roomId, required this.roomName}); + + factory HMSPayload.fromJson(Map json) => + _$HMSPayloadFromJson(json); + + @override + List get props => [roomId, roomName]; +} diff --git a/packages/stream_chat/lib/src/core/models/hms_payload.g.dart b/packages/stream_chat/lib/src/core/models/hms_payload.g.dart new file mode 100644 index 00000000..3c55f56f --- /dev/null +++ b/packages/stream_chat/lib/src/core/models/hms_payload.g.dart @@ -0,0 +1,18 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'hms_payload.dart'; + +// ************************************************************************** +// JsonSerializableGenerator +// ************************************************************************** + +HMSPayload _$HMSPayloadFromJson(Map json) => HMSPayload( + roomId: json['room_id'] as String, + roomName: json['room_name'] as String, + ); + +Map _$HMSPayloadToJson(HMSPayload instance) => + { + 'room_id': instance.roomId, + 'room_name': instance.roomName, + };