feat: add support for external interceptors.
Signed-off-by: xsahil03x <[email protected]>
This commit is contained in:
@@ -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,20 +46,25 @@ class StreamHttpClient {
|
|||||||
if (tokenManager != null) AuthInterceptor(this, tokenManager),
|
if (tokenManager != null) AuthInterceptor(this, tokenManager),
|
||||||
if (connectionIdManager != null)
|
if (connectionIdManager != null)
|
||||||
ConnectionIdInterceptor(connectionIdManager),
|
ConnectionIdInterceptor(connectionIdManager),
|
||||||
if (logger != null && logger.level != Level.OFF)
|
...interceptors ??
|
||||||
LoggingInterceptor(
|
[
|
||||||
requestHeader: true,
|
// Add a default logging interceptor if no interceptors are
|
||||||
logPrint: (step, message) {
|
// provided.
|
||||||
switch (step) {
|
if (logger != null && logger.level != Level.OFF)
|
||||||
case InterceptStep.request:
|
LoggingInterceptor(
|
||||||
return logger.info(message);
|
requestHeader: true,
|
||||||
case InterceptStep.response:
|
logPrint: (step, message) {
|
||||||
return logger.info(message);
|
switch (step) {
|
||||||
case InterceptStep.error:
|
case InterceptStep.request:
|
||||||
return logger.severe(message);
|
return logger.info(message);
|
||||||
}
|
case InterceptStep.response:
|
||||||
},
|
return logger.info(message);
|
||||||
),
|
case InterceptStep.error:
|
||||||
|
return logger.severe(message);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
),
|
||||||
|
],
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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,41 +86,73 @@ void main() {
|
|||||||
},
|
},
|
||||||
);
|
);
|
||||||
|
|
||||||
test('loggingInterceptor should be added if logger is provided', () {
|
group('loggingInterceptor', () {
|
||||||
const apiKey = 'api-key';
|
test('should be added if logger is provided', () {
|
||||||
final client = StreamHttpClient(
|
const apiKey = 'api-key';
|
||||||
apiKey,
|
final client = StreamHttpClient(
|
||||||
logger: Logger('test-logger'),
|
apiKey,
|
||||||
);
|
logger: Logger('test-logger'),
|
||||||
|
);
|
||||||
|
|
||||||
expect(
|
expect(
|
||||||
client.httpClient.interceptors.whereType<LoggingInterceptor>().length,
|
client.httpClient.interceptors.whereType<LoggingInterceptor>().length,
|
||||||
1,
|
1,
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
|
||||||
test('loggingInterceptor should log requests', () async {
|
test('should not be added if logger.level is OFF', () {
|
||||||
const apiKey = 'api-key';
|
const apiKey = 'api-key';
|
||||||
final logger = MockLogger();
|
final client = StreamHttpClient(
|
||||||
final client = StreamHttpClient(apiKey, logger: logger);
|
apiKey,
|
||||||
|
logger: Logger.detached('test-logger')..level = Level.OFF,
|
||||||
|
);
|
||||||
|
|
||||||
try {
|
expect(
|
||||||
await client.get('path');
|
client.httpClient.interceptors.whereType<LoggingInterceptor>().length,
|
||||||
} catch (_) {}
|
0,
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
verify(() => logger.info(any())).called(greaterThan(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(),
|
||||||
|
],
|
||||||
|
);
|
||||||
|
|
||||||
test('loggingInterceptor should log error', () async {
|
expect(
|
||||||
const apiKey = 'api-key';
|
client.httpClient.interceptors.whereType<LoggingInterceptor>().length,
|
||||||
final logger = MockLogger();
|
0,
|
||||||
final client = StreamHttpClient(apiKey, logger: logger);
|
);
|
||||||
|
});
|
||||||
|
|
||||||
try {
|
test('should log requests', () async {
|
||||||
await client.get('path');
|
const apiKey = 'api-key';
|
||||||
} catch (_) {}
|
final logger = MockLogger();
|
||||||
|
final client = StreamHttpClient(apiKey, logger: logger);
|
||||||
|
|
||||||
verify(() => logger.severe(any())).called(greaterThan(0));
|
try {
|
||||||
|
await client.get('path');
|
||||||
|
} catch (_) {}
|
||||||
|
|
||||||
|
verify(() => logger.info(any())).called(greaterThan(0));
|
||||||
|
});
|
||||||
|
|
||||||
|
test('should log error', () async {
|
||||||
|
const apiKey = 'api-key';
|
||||||
|
final logger = MockLogger();
|
||||||
|
final client = StreamHttpClient(apiKey, logger: logger);
|
||||||
|
|
||||||
|
try {
|
||||||
|
await client.get('path');
|
||||||
|
} catch (_) {}
|
||||||
|
|
||||||
|
verify(() => logger.severe(any())).called(greaterThan(0));
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
test('`.close` should close the dio client', () async {
|
test('`.close` should close the dio client', () async {
|
||||||
|
|||||||
Reference in New Issue
Block a user