feat: add support for external interceptors.

Signed-off-by: xsahil03x <[email protected]>
This commit is contained in:
Sahil Kumar
2023-05-05 17:40:38 +05:30
committed by xsahil03x
parent e791fe4c1e
commit 89bf63df05
5 changed files with 88 additions and 43 deletions
@@ -73,6 +73,7 @@ class StreamChatClient {
WebSocket? ws, WebSocket? ws,
AttachmentFileUploaderProvider attachmentFileUploaderProvider = AttachmentFileUploaderProvider attachmentFileUploaderProvider =
StreamAttachmentFileUploader.new, StreamAttachmentFileUploader.new,
Iterable<Interceptor>? chatApiInterceptors,
}) { }) {
logger.info('Initiating new StreamChatClient'); logger.info('Initiating new StreamChatClient');
@@ -91,6 +92,7 @@ class StreamChatClient {
connectionIdManager: _connectionIdManager, connectionIdManager: _connectionIdManager,
attachmentFileUploaderProvider: attachmentFileUploaderProvider, attachmentFileUploaderProvider: attachmentFileUploaderProvider,
logger: detachedLogger('🕸️'), logger: detachedLogger('🕸️'),
interceptors: chatApiInterceptors,
); );
_ws = ws ?? _ws = ws ??
@@ -1,3 +1,4 @@
import 'package:dio/dio.dart';
import 'package:logging/logging.dart'; import 'package:logging/logging.dart';
import 'package:stream_chat/src/core/api/attachment_file_uploader.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/call_api.dart';
@@ -14,7 +15,7 @@ import 'package:stream_chat/src/core/http/token_manager.dart';
export 'device_api.dart' show PushProvider; export 'device_api.dart' show PushProvider;
/// ApiClient that wraps every other specific api /// Api_client that wraps every other specific api
class StreamChatApi { class StreamChatApi {
/// Initialize a new stream chat api /// Initialize a new stream chat api
StreamChatApi( StreamChatApi(
@@ -26,6 +27,7 @@ class StreamChatApi {
AttachmentFileUploaderProvider attachmentFileUploaderProvider = AttachmentFileUploaderProvider attachmentFileUploaderProvider =
StreamAttachmentFileUploader.new, StreamAttachmentFileUploader.new,
Logger? logger, Logger? logger,
Iterable<Interceptor>? interceptors,
}) : _fileUploaderProvider = attachmentFileUploaderProvider, }) : _fileUploaderProvider = attachmentFileUploaderProvider,
_client = client ?? _client = client ??
StreamHttpClient( StreamHttpClient(
@@ -34,6 +36,7 @@ class StreamChatApi {
tokenManager: tokenManager, tokenManager: tokenManager,
connectionIdManager: connectionIdManager, connectionIdManager: connectionIdManager,
logger: logger, logger: logger,
interceptors: interceptors,
); );
final StreamHttpClient _client; final StreamHttpClient _client;
@@ -25,6 +25,7 @@ class StreamHttpClient {
TokenManager? tokenManager, TokenManager? tokenManager,
ConnectionIdManager? connectionIdManager, ConnectionIdManager? connectionIdManager,
Logger? logger, Logger? logger,
Iterable<Interceptor>? interceptors,
}) : _options = options ?? const StreamHttpClientOptions(), }) : _options = options ?? const StreamHttpClientOptions(),
httpClient = dio ?? Dio() { httpClient = dio ?? Dio() {
httpClient httpClient
@@ -45,6 +46,10 @@ class StreamHttpClient {
if (tokenManager != null) AuthInterceptor(this, tokenManager), if (tokenManager != null) AuthInterceptor(this, tokenManager),
if (connectionIdManager != null) if (connectionIdManager != null)
ConnectionIdInterceptor(connectionIdManager), ConnectionIdInterceptor(connectionIdManager),
...interceptors ??
[
// Add a default logging interceptor if no interceptors are
// provided.
if (logger != null && logger.level != Level.OFF) if (logger != null && logger.level != Level.OFF)
LoggingInterceptor( LoggingInterceptor(
requestHeader: true, requestHeader: true,
@@ -59,6 +64,7 @@ class StreamHttpClient {
} }
}, },
), ),
],
]); ]);
} }
@@ -3,6 +3,7 @@ library stream_chat;
export 'package:async/async.dart'; export 'package:async/async.dart';
export 'package:dio/src/cancel_token.dart'; export 'package:dio/src/cancel_token.dart';
export 'package:dio/src/dio_error.dart'; export 'package:dio/src/dio_error.dart';
export 'package:dio/src/dio_mixin.dart' show Interceptor, InterceptorsWrapper;
export 'package:dio/src/multipart_file.dart'; export 'package:dio/src/multipart_file.dart';
export 'package:dio/src/options.dart'; export 'package:dio/src/options.dart';
export 'package:dio/src/options.dart' show ProgressCallback; export 'package:dio/src/options.dart' show ProgressCallback;
@@ -19,6 +20,7 @@ export 'src/core/api/responses.dart';
export 'src/core/api/stream_chat_api.dart' show PushProvider; export 'src/core/api/stream_chat_api.dart' show PushProvider;
export 'src/core/api/stream_chat_api.dart'; export 'src/core/api/stream_chat_api.dart';
export 'src/core/error/error.dart'; export 'src/core/error/error.dart';
export 'src/core/http/interceptor/logging_interceptor.dart';
export 'src/core/models/action.dart'; export 'src/core/models/action.dart';
export 'src/core/models/attachment.dart'; export 'src/core/models/attachment.dart';
export 'src/core/models/attachment_file.dart'; export 'src/core/models/attachment_file.dart';
@@ -86,7 +86,8 @@ void main() {
}, },
); );
test('loggingInterceptor should be added if logger is provided', () { group('loggingInterceptor', () {
test('should be added if logger is provided', () {
const apiKey = 'api-key'; const apiKey = 'api-key';
final client = StreamHttpClient( final client = StreamHttpClient(
apiKey, apiKey,
@@ -99,7 +100,37 @@ void main() {
); );
}); });
test('loggingInterceptor should log requests', () async { test('should not be added if logger.level is OFF', () {
const apiKey = 'api-key';
final client = StreamHttpClient(
apiKey,
logger: Logger.detached('test-logger')..level = Level.OFF,
);
expect(
client.httpClient.interceptors.whereType<LoggingInterceptor>().length,
0,
);
});
test('should not be added if `interceptors` are provided', () {
const apiKey = 'api-key';
final client = StreamHttpClient(
apiKey,
logger: Logger.detached('test-logger'),
interceptors: [
// Sample Interceptor.
InterceptorsWrapper(),
],
);
expect(
client.httpClient.interceptors.whereType<LoggingInterceptor>().length,
0,
);
});
test('should log requests', () async {
const apiKey = 'api-key'; const apiKey = 'api-key';
final logger = MockLogger(); final logger = MockLogger();
final client = StreamHttpClient(apiKey, logger: logger); final client = StreamHttpClient(apiKey, logger: logger);
@@ -111,7 +142,7 @@ void main() {
verify(() => logger.info(any())).called(greaterThan(0)); verify(() => logger.info(any())).called(greaterThan(0));
}); });
test('loggingInterceptor should log error', () async { test('should log error', () async {
const apiKey = 'api-key'; const apiKey = 'api-key';
final logger = MockLogger(); final logger = MockLogger();
final client = StreamHttpClient(apiKey, logger: logger); final client = StreamHttpClient(apiKey, logger: logger);
@@ -122,6 +153,7 @@ void main() {
verify(() => logger.severe(any())).called(greaterThan(0)); verify(() => logger.severe(any())).called(greaterThan(0));
}); });
});
test('`.close` should close the dio client', () async { test('`.close` should close the dio client', () async {
final client = StreamHttpClient('api-key')..close(force: true); final client = StreamHttpClient('api-key')..close(force: true);