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/own_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/db/chat_persistence_client.dart';
import 'package:stream_chat/src/event_type.dart';
@@ -44,10 +43,6 @@ final _levelEmojiMapper = {
Level.SEVERE: '🚨',
};
final _userAgent = 'stream-chat-dart-client-'
'${CurrentPlatform.name}-'
'${PACKAGE_VERSION.split('+')[0]}';
/// The official Dart client for Stream Chat,
/// a service for building chat applications.
/// This library can be used on any Dart project and on both mobile and web apps
@@ -86,7 +81,7 @@ class StreamChatClient {
location: location,
connectTimeout: connectTimeout,
receiveTimeout: receiveTimeout,
headers: {'X-Stream-Client': _userAgent},
headers: {'X-Stream-Client': defaultUserAgent},
);
_chatApi = chatApi ??
@@ -106,7 +101,7 @@ class StreamChatClient {
tokenManager: _tokenManager,
handler: handleEvent,
logger: detachedLogger('🔌'),
queryParameters: {'X-Stream-Client': _userAgent},
queryParameters: {'X-Stream-Client': defaultUserAgent},
);
_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/connection_id_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/token_manager.dart';
import 'package:stream_chat/src/location.dart';
@@ -41,6 +42,7 @@ class StreamHttpClient {
..._options.headers,
}
..interceptors.addAll([
UserAgentInterceptor(),
if (tokenManager != null) AuthInterceptor(this, tokenManager),
if (connectionIdManager != null)
ConnectionIdInterceptor(connectionIdManager),
+34
View File
@@ -1,6 +1,40 @@
import 'package:stream_chat/src/client/client.dart';
import 'package:stream_chat/src/core/platform_detector/platform_detector.dart';
/// Current package version
/// Used in [StreamChatClient] to build the `x-stream-client` header
// ignore: constant_identifier_names
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_portal/flutter_portal.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/stream_chat_flutter.dart';
import 'package:stream_chat_flutter_core/stream_chat_flutter_core.dart';
@@ -110,7 +111,12 @@ class StreamChatState extends State<StreamChat> {
onBackgroundEventReceived: widget.onBackgroundEventReceived,
backgroundKeepAlive: widget.backgroundKeepAlive,
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 {
/// Create a new instance of [StreamChatClient] passing the apikey obtained
/// 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
/// a backend to generate a user token using our server SDK.
@@ -120,7 +120,7 @@ class HomeScreen extends StatelessWidget {
itemBuilder: (BuildContext context, int index) {
final _item = channels[index];
return ListTile(
title: Text(_item.name!),
title: Text(_item.name ?? ''),
subtitle: StreamBuilder<Message?>(
stream: _item.state!.lastMessageStream,
initialData: _item.state!.lastMessage,
@@ -4,6 +4,7 @@ import 'package:connectivity_plus/connectivity_plus.dart';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:stream_chat/stream_chat.dart';
import 'package:stream_chat/version.dart';
import 'package:stream_chat_flutter_core/src/typedef.dart';
/// 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].
class StreamChatCoreState extends State<StreamChatCore>
with WidgetsBindingObserver {
/// Constructor used for creating a new instance of [StreamChatCoreState].
StreamChatCoreState() {
usedPackage = Package.core;
}
/// Initialized client used throughout the application.
StreamChatClient get client => widget.client;