feat(llc,core,ui): send used package in the headers
This commit is contained in:
@@ -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),
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user