network.dart 2.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. import 'dart:io';
  2. import 'package:dio/dio.dart';
  3. import 'package:ente_auth/core/configuration.dart';
  4. import 'package:ente_auth/core/constants.dart';
  5. import 'package:fk_user_agent/fk_user_agent.dart';
  6. import 'package:flutter/foundation.dart';
  7. import 'package:package_info_plus/package_info_plus.dart';
  8. import 'package:shared_preferences/shared_preferences.dart';
  9. import 'package:uuid/uuid.dart';
  10. int kConnectTimeout = 15000;
  11. class Network {
  12. // apiEndpoint points to the Ente server's API endpoint
  13. static const apiEndpoint = String.fromEnvironment(
  14. "endpoint",
  15. defaultValue: kDefaultProductionEndpoint,
  16. );
  17. late Dio _dio;
  18. late Dio _enteDio;
  19. Future<void> init() async {
  20. await FkUserAgent.init();
  21. final packageInfo = await PackageInfo.fromPlatform();
  22. final preferences = await SharedPreferences.getInstance();
  23. _dio = Dio(
  24. BaseOptions(
  25. connectTimeout: kConnectTimeout,
  26. headers: {
  27. HttpHeaders.userAgentHeader: FkUserAgent.userAgent,
  28. 'X-Client-Version': packageInfo.version,
  29. 'X-Client-Package': packageInfo.packageName,
  30. },
  31. ),
  32. );
  33. _dio.interceptors.add(RequestIdInterceptor());
  34. _enteDio = Dio(
  35. BaseOptions(
  36. baseUrl: apiEndpoint,
  37. connectTimeout: kConnectTimeout,
  38. headers: {
  39. HttpHeaders.userAgentHeader: FkUserAgent.userAgent,
  40. 'X-Client-Version': packageInfo.version,
  41. 'X-Client-Package': packageInfo.packageName,
  42. },
  43. ),
  44. );
  45. _enteDio.interceptors.add(EnteRequestInterceptor(preferences, apiEndpoint));
  46. }
  47. Network._privateConstructor();
  48. static Network instance = Network._privateConstructor();
  49. Dio getDio() => _dio;
  50. Dio get enteDio => _enteDio;
  51. }
  52. class RequestIdInterceptor extends Interceptor {
  53. @override
  54. void onRequest(RequestOptions options, RequestInterceptorHandler handler) {
  55. // ignore: prefer_const_constructors
  56. options.headers.putIfAbsent("x-request-id", () => Uuid().v4().toString());
  57. return super.onRequest(options, handler);
  58. }
  59. }
  60. class EnteRequestInterceptor extends Interceptor {
  61. final SharedPreferences _preferences;
  62. final String enteEndpoint;
  63. EnteRequestInterceptor(this._preferences, this.enteEndpoint);
  64. @override
  65. void onRequest(RequestOptions options, RequestInterceptorHandler handler) {
  66. if (kDebugMode) {
  67. assert(
  68. options.baseUrl == enteEndpoint,
  69. "interceptor should only be used for API endpoint",
  70. );
  71. }
  72. // ignore: prefer_const_constructors
  73. options.headers.putIfAbsent("x-request-id", () => Uuid().v4().toString());
  74. final String? tokenValue = _preferences.getString(Configuration.tokenKey);
  75. if (tokenValue != null) {
  76. options.headers.putIfAbsent("X-Auth-Token", () => tokenValue);
  77. }
  78. return super.onRequest(options, handler);
  79. }
  80. }