11import 'dart:async' ;
22
3+ import 'package:meta/meta.dart' ;
34import 'package:rxdart/rxdart.dart' ;
45import 'package:stream_core/stream_core.dart' ;
5- import 'package:uuid/uuid.dart' ;
66
77import '../stream_feeds.dart' ;
8- import 'generated/api/api.g. dart' as api;
8+ import 'generated/api/api.dart' as api;
99import 'repositories.dart' ;
1010import 'utils/endpoint_config.dart' ;
1111import 'ws/feeds_ws_event.dart' ;
@@ -14,20 +14,38 @@ class FeedsClient {
1414 FeedsClient ({
1515 required this .apiKey,
1616 required this .user,
17- required this .userToken,
17+ String ? userToken,
18+ TokenProvider ? userTokenProvider,
1819 this .config = const FeedsConfig (),
19- this .userTokenProvider,
20- this .networkMonitor,
21- }) {
20+ FeedsClientEnvironment environment = const FeedsClientEnvironment (),
21+ }) : assert (
22+ userToken != null || userTokenProvider != null ,
23+ 'Provide either a user token or a user token provider, or both' ,
24+ ) {
25+ tokenManager = userTokenProvider != null
26+ ? TokenManager .provider (
27+ user: user,
28+ provider: userTokenProvider,
29+ token: userToken,
30+ )
31+ : TokenManager .static (user: user, token: userToken ?? '' );
32+
33+ // TODO: fill with correct values
34+ final systemEnvironmentManager = SystemEnvironmentManager (
35+ environment: const SystemEnvironment (
36+ sdkName: 'stream-feeds-dart' ,
37+ sdkIdentifier: 'dart' ,
38+ sdkVersion: '0.1.0' ,
39+ ),
40+ );
41+
2242 apiClient = api.DefaultApi (
23- api.ApiClient (
24- basePath: endpointConfig.baseFeedsUrl,
25- authentication: _Authentication (
26- apiKey: apiKey,
27- user: user,
28- getToken: () async => userToken,
29- getConnectionId: () => webSocketClient.connectionId,
30- ),
43+ CoreHttpClient (
44+ apiKey,
45+ systemEnvironmentManager: systemEnvironmentManager,
46+ options: HttpClientOptions (baseUrl: endpointConfig.baseFeedsUrl),
47+ connectionIdProvider: () => webSocketClient.connectionId,
48+ tokenManager: tokenManager,
3149 ),
3250 );
3351 final websocketUri = Uri .parse (endpointConfig.wsEndpoint).replace (
@@ -38,7 +56,7 @@ class FeedsClient {
3856 },
3957 );
4058
41- webSocketClient = WebSocketClient (
59+ webSocketClient = environment. createWebSocketClient (
4260 url: websocketUri.toString (),
4361 eventDecoder: FeedsWsEvent .fromEventObject,
4462 onConnectionEstablished: _authenticate,
@@ -49,15 +67,15 @@ class FeedsClient {
4967
5068 final String apiKey;
5169 final User user;
52- final String userToken ;
70+ late final TokenManager tokenManager ;
5371 final FeedsConfig config;
54- final UserTokenProvider ? userTokenProvider;
55- final NetworkMonitor ? networkMonitor;
5672
5773 late final api.DefaultApi apiClient;
74+
75+ @internal
5876 late final FeedsRepository feedsRepository;
5977
60- static final endpointConfig = EndpointConfig .production;
78+ static const endpointConfig = EndpointConfig .production;
6179 late final WebSocketClient webSocketClient;
6280 ConnectionRecoveryHandler ? connectionRecoveryHandler;
6381 Stream <FeedsWsEvent > get feedsEvents =>
@@ -77,7 +95,7 @@ class FeedsClient {
7795
7896 connectionRecoveryHandler = DefaultConnectionRecoveryHandler (
7997 client: webSocketClient,
80- networkMonitor: networkMonitor,
98+ networkMonitor: config. networkMonitor,
8199 );
82100
83101 _connectionCompleter = Completer <void >();
@@ -114,10 +132,10 @@ class FeedsClient {
114132 }
115133 }
116134
117- void _authenticate () {
135+ Future < void > _authenticate () async {
118136 final connectUserRequest = WsAuthMessageRequest (
119137 products: ['feeds' ],
120- token: userToken ,
138+ token: await tokenManager. loadToken () ,
121139 userDetails: ConnectUserDetailsRequest (
122140 id: user.id,
123141 name: user.originalName,
@@ -142,49 +160,28 @@ class FeedsClient {
142160}
143161
144162class FeedsConfig {
145- const FeedsConfig ();
146- // TODO: Add config for feeds
147- }
148-
149- typedef ConnectionIdProvider = String ? Function ();
150- typedef UserTokenProvider = Future <String > Function ();
151-
152- // TODO: Migrate the API to dio for authentication and refresh of user tokens
153- class _Authentication extends api.Authentication {
154- _Authentication ({
155- required this .apiKey,
156- required this .user,
157- required this .getToken,
158- required this .getConnectionId,
163+ const FeedsConfig ({
164+ this .networkMonitor,
159165 });
160166
161- final String apiKey;
162- final User user;
163- final UserTokenProvider getToken;
164- final ConnectionIdProvider getConnectionId;
165-
166- @override
167- Future <void > applyToParams (
168- List <api.QueryParam > queryParams,
169- Map <String , String > headerParams,
170- ) async {
171- queryParams.add (api.QueryParam ('api_key' , apiKey));
172- final connectionId = getConnectionId ();
173- final userToken = await getToken ();
174- switch (user.type) {
175- case UserAuthType .regular || UserAuthType .guest:
176- if (connectionId != null ) {
177- queryParams.add (api.QueryParam ('connection_id' , connectionId));
178- }
179- headerParams['stream-auth-type' ] = 'jwt' ;
180- headerParams['Authorization' ] = userToken;
181- case UserAuthType .anonymous:
182- headerParams['stream-auth-type' ] = 'anonymous' ;
183- if (userToken.isNotEmpty) {
184- headerParams['Authorization' ] = userToken;
185- }
186- }
187- headerParams['X-Stream-Client' ] = 'stream-feeds-dart' ;
188- headerParams['x-client-request-id' ] = const Uuid ().v4 ();
189- }
167+ final NetworkMonitor ? networkMonitor;
168+ }
169+
170+ class FeedsClientEnvironment {
171+ const FeedsClientEnvironment ();
172+
173+ WebSocketClient createWebSocketClient ({
174+ required String url,
175+ required EventDecoder eventDecoder,
176+ PingReguestBuilder ? pingReguestBuilder,
177+ VoidCallback ? onConnectionEstablished,
178+ VoidCallback ? onConnected,
179+ }) =>
180+ WebSocketClient (
181+ url: url,
182+ eventDecoder: FeedsWsEvent .fromEventObject,
183+ pingReguestBuilder: pingReguestBuilder,
184+ onConnectionEstablished: onConnectionEstablished,
185+ onConnected: onConnected,
186+ );
190187}
0 commit comments