feat(llc,core,ui): send used package in the headers

This commit is contained in:
Salvatore Giordano
2021-11-02 18:09:49 +01:00
parent 17b8612056
commit 685de93e31
7 changed files with 73 additions and 10 deletions
@@ -25,7 +25,6 @@ import 'package:stream_chat/src/core/models/member.dart';
import 'package:stream_chat/src/core/models/message.dart'; import 'package:stream_chat/src/core/models/message.dart';
import 'package:stream_chat/src/core/models/own_user.dart'; import 'package:stream_chat/src/core/models/own_user.dart';
import 'package:stream_chat/src/core/models/user.dart'; import 'package:stream_chat/src/core/models/user.dart';
import 'package:stream_chat/src/core/platform_detector/platform_detector.dart';
import 'package:stream_chat/src/core/util/utils.dart'; import 'package:stream_chat/src/core/util/utils.dart';
import 'package:stream_chat/src/db/chat_persistence_client.dart'; import 'package:stream_chat/src/db/chat_persistence_client.dart';
import 'package:stream_chat/src/event_type.dart'; import 'package:stream_chat/src/event_type.dart';
@@ -44,10 +43,6 @@ final _levelEmojiMapper = {
Level.SEVERE: '🚨', Level.SEVERE: '🚨',
}; };
final _userAgent = 'stream-chat-dart-client-'
'${CurrentPlatform.name}-'
'${PACKAGE_VERSION.split('+')[0]}';
/// The official Dart client for Stream Chat, /// The official Dart client for Stream Chat,
/// a service for building chat applications. /// a service for building chat applications.
/// This library can be used on any Dart project and on both mobile and web apps /// This library can be used on any Dart project and on both mobile and web apps
@@ -86,7 +81,7 @@ class StreamChatClient {
location: location, location: location,
connectTimeout: connectTimeout, connectTimeout: connectTimeout,
receiveTimeout: receiveTimeout, receiveTimeout: receiveTimeout,
headers: {'X-Stream-Client': _userAgent}, headers: {'X-Stream-Client': defaultUserAgent},
); );
_chatApi = chatApi ?? _chatApi = chatApi ??
@@ -106,7 +101,7 @@ class StreamChatClient {
tokenManager: _tokenManager, tokenManager: _tokenManager,
handler: handleEvent, handler: handleEvent,
logger: detachedLogger('🔌'), logger: detachedLogger('🔌'),
queryParameters: {'X-Stream-Client': _userAgent}, queryParameters: {'X-Stream-Client': defaultUserAgent},
); );
_retryPolicy = retryPolicy ?? _retryPolicy = retryPolicy ??
@@ -0,0 +1,20 @@
import 'package:dio/dio.dart';
import 'package:stream_chat/src/core/platform_detector/platform_detector.dart';
import 'package:stream_chat/version.dart';
/// User agent interceptor that sets the user agent header
class UserAgentInterceptor extends Interceptor {
final _defaultUserAgent = 'stream-chat-dart-client-'
'${CurrentPlatform.name}-'
'${PACKAGE_VERSION.split('+')[0]}';
@override
Future<void> onRequest(
RequestOptions options,
RequestInterceptorHandler handler,
) async {
options.headers['X-Stream-Client'] =
'$_defaultUserAgent-${usedPackage.name}';
return handler.next(options);
}
}
@@ -8,6 +8,7 @@ import 'package:stream_chat/src/core/http/connection_id_manager.dart';
import 'package:stream_chat/src/core/http/interceptor/auth_interceptor.dart'; import 'package:stream_chat/src/core/http/interceptor/auth_interceptor.dart';
import 'package:stream_chat/src/core/http/interceptor/connection_id_interceptor.dart'; import 'package:stream_chat/src/core/http/interceptor/connection_id_interceptor.dart';
import 'package:stream_chat/src/core/http/interceptor/logging_interceptor.dart'; import 'package:stream_chat/src/core/http/interceptor/logging_interceptor.dart';
import 'package:stream_chat/src/core/http/interceptor/user_agent_interceptor.dart';
import 'package:stream_chat/src/core/http/stream_chat_dio_error.dart'; import 'package:stream_chat/src/core/http/stream_chat_dio_error.dart';
import 'package:stream_chat/src/core/http/token_manager.dart'; import 'package:stream_chat/src/core/http/token_manager.dart';
import 'package:stream_chat/src/location.dart'; import 'package:stream_chat/src/location.dart';
@@ -41,6 +42,7 @@ class StreamHttpClient {
..._options.headers, ..._options.headers,
} }
..interceptors.addAll([ ..interceptors.addAll([
UserAgentInterceptor(),
if (tokenManager != null) AuthInterceptor(this, tokenManager), if (tokenManager != null) AuthInterceptor(this, tokenManager),
if (connectionIdManager != null) if (connectionIdManager != null)
ConnectionIdInterceptor(connectionIdManager), ConnectionIdInterceptor(connectionIdManager),
+34
View File
@@ -1,6 +1,40 @@
import 'package:stream_chat/src/client/client.dart'; import 'package:stream_chat/src/client/client.dart';
import 'package:stream_chat/src/core/platform_detector/platform_detector.dart';
/// Current package version /// Current package version
/// Used in [StreamChatClient] to build the `x-stream-client` header /// Used in [StreamChatClient] to build the `x-stream-client` header
// ignore: constant_identifier_names // ignore: constant_identifier_names
const PACKAGE_VERSION = '3.2.0'; const PACKAGE_VERSION = '3.2.0';
/// Default user agent used for the 'x-stream-client' header
final defaultUserAgent = 'stream-chat-dart-client-'
'${CurrentPlatform.name}-'
'${PACKAGE_VERSION.split('+')[0]}';
/// Current used package
/// This is used to set the `x-stream-client` header using info about
/// the package in use
/// For example: llc/core/ui
Package usedPackage = Package.llc;
/// Possible packages
enum Package {
/// The Low Level Client
llc,
/// The Core package
core,
/// The UI package
ui,
}
///
extension XPackage on Package {
///
String get name => {
Package.llc: 'llc',
Package.core: 'core',
Package.ui: 'ui',
}[this]!;
}
@@ -4,6 +4,7 @@ import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_portal/flutter_portal.dart'; import 'package:flutter_portal/flutter_portal.dart';
import 'package:jiffy/jiffy.dart'; import 'package:jiffy/jiffy.dart';
import 'package:stream_chat/version.dart';
import 'package:stream_chat_flutter/src/stream_chat_theme.dart'; import 'package:stream_chat_flutter/src/stream_chat_theme.dart';
import 'package:stream_chat_flutter/stream_chat_flutter.dart'; import 'package:stream_chat_flutter/stream_chat_flutter.dart';
import 'package:stream_chat_flutter_core/stream_chat_flutter_core.dart'; import 'package:stream_chat_flutter_core/stream_chat_flutter_core.dart';
@@ -110,7 +111,12 @@ class StreamChatState extends State<StreamChat> {
onBackgroundEventReceived: widget.onBackgroundEventReceived, onBackgroundEventReceived: widget.onBackgroundEventReceived,
backgroundKeepAlive: widget.backgroundKeepAlive, backgroundKeepAlive: widget.backgroundKeepAlive,
connectivityStream: widget.connectivityStream, connectivityStream: widget.connectivityStream,
child: widget.child ?? const Offstage(), child: Builder(
builder: (context) {
usedPackage = Package.ui;
return widget.child ?? const Offstage();
},
),
), ),
); );
}, },
@@ -4,7 +4,7 @@ import 'package:stream_chat_flutter_core/stream_chat_flutter_core.dart';
Future<void> main() async { Future<void> main() async {
/// Create a new instance of [StreamChatClient] passing the apikey obtained /// Create a new instance of [StreamChatClient] passing the apikey obtained
/// from your project dashboard. /// from your project dashboard.
final client = StreamChatClient('b67pax5b2wdq'); final client = StreamChatClient('b67pax5b2wdq', logLevel: Level.INFO);
/// Set the current user. In a production scenario, this should be done using /// Set the current user. In a production scenario, this should be done using
/// a backend to generate a user token using our server SDK. /// a backend to generate a user token using our server SDK.
@@ -120,7 +120,7 @@ class HomeScreen extends StatelessWidget {
itemBuilder: (BuildContext context, int index) { itemBuilder: (BuildContext context, int index) {
final _item = channels[index]; final _item = channels[index];
return ListTile( return ListTile(
title: Text(_item.name!), title: Text(_item.name ?? ''),
subtitle: StreamBuilder<Message?>( subtitle: StreamBuilder<Message?>(
stream: _item.state!.lastMessageStream, stream: _item.state!.lastMessageStream,
initialData: _item.state!.lastMessage, initialData: _item.state!.lastMessage,
@@ -4,6 +4,7 @@ import 'package:connectivity_plus/connectivity_plus.dart';
import 'package:flutter/foundation.dart'; import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:stream_chat/stream_chat.dart'; import 'package:stream_chat/stream_chat.dart';
import 'package:stream_chat/version.dart';
import 'package:stream_chat_flutter_core/src/typedef.dart'; import 'package:stream_chat_flutter_core/src/typedef.dart';
/// Widget used to provide information about the chat to the widget tree. /// Widget used to provide information about the chat to the widget tree.
@@ -89,6 +90,11 @@ class StreamChatCore extends StatefulWidget {
/// State class associated with [StreamChatCore]. /// State class associated with [StreamChatCore].
class StreamChatCoreState extends State<StreamChatCore> class StreamChatCoreState extends State<StreamChatCore>
with WidgetsBindingObserver { with WidgetsBindingObserver {
/// Constructor used for creating a new instance of [StreamChatCoreState].
StreamChatCoreState() {
usedPackage = Package.core;
}
/// Initialized client used throughout the application. /// Initialized client used throughout the application.
StreamChatClient get client => widget.client; StreamChatClient get client => widget.client;