mirror of
https://github.com/m5stack/StackChan.git
synced 2026-04-28 03:22:39 +00:00
6314188835
- align Android/iOS native bridge implementations and audio handling paths - improve Bluetooth provisioning/verification flow and related error handling - refactor WebSocket, music, and device utility logic for more stable behavior - clean up noisy debug logs and normalize comments across Flutter and native code - update AR view, dance/agent/device pages, and platform integration details
142 lines
3.7 KiB
Dart
142 lines
3.7 KiB
Dart
/*
|
||
SPDX-FileCopyrightText: 2026 M5Stack Technology CO LTD
|
||
SPDX-License-Identifier: MIT
|
||
*/
|
||
|
||
import 'package:dio/dio.dart';
|
||
import 'package:flutter/cupertino.dart';
|
||
import 'package:stack_chan/app_state.dart';
|
||
import 'package:stack_chan/network/urls.dart';
|
||
import 'package:stack_chan/network/web_socket_util.dart';
|
||
|
||
import '../util/rsa_util.dart';
|
||
import '../util/value_constant.dart';
|
||
|
||
void logPrint(Object? object) {
|
||
if (object == null) return;
|
||
String log = object.toString();
|
||
const int chunkSize = 800; //800(limit)
|
||
//ifcontent,directPrint
|
||
if (log.length <= chunkSize) {
|
||
return;
|
||
}
|
||
|
||
//contentPrint
|
||
for (int i = 0; i < log.length; i += chunkSize) {
|
||
int end = i + chunkSize;
|
||
if (end > log.length) end = log.length;
|
||
//usedebugPrint(print,supportcontent)
|
||
}
|
||
}
|
||
|
||
class Http {
|
||
static final Http instance = Http._init();
|
||
|
||
late final Dio _dio;
|
||
|
||
late final BaseOptions _baseOptions;
|
||
|
||
final List<Interceptor> _interceptors = [
|
||
LogInterceptor(responseBody: true, logPrint: logPrint),
|
||
InterceptorsWrapper(
|
||
onRequest:
|
||
(RequestOptions options, RequestInterceptorHandler handler) async {
|
||
/// v1 mac
|
||
final encryptedToken = RsaUtil.encrypt(
|
||
WebSocketUtil.shared.getAuthorization(AppState.shared.deviceMac),
|
||
);
|
||
options.headers[ValueConstant.authorization] = encryptedToken;
|
||
|
||
/// v2 token
|
||
final token = await AppState.asyncPrefs.getString(
|
||
ValueConstant.token,
|
||
);
|
||
if (token != null) {
|
||
options.headers[ValueConstant.token] = token;
|
||
}
|
||
|
||
/// App Version
|
||
String? version = AppState.shared.packageInfo?.version;
|
||
if (version != null) {
|
||
options.headers[ValueConstant.appVersion] = version;
|
||
}
|
||
|
||
return handler.next(options);
|
||
},
|
||
onResponse: (Response response, ResponseInterceptorHandler handler) {
|
||
return handler.next(response);
|
||
},
|
||
),
|
||
];
|
||
|
||
Http._init() {
|
||
_baseOptions = BaseOptions(
|
||
baseUrl: Urls.getBaseUrl(),
|
||
connectTimeout: const Duration(seconds: 20),
|
||
receiveTimeout: const Duration(seconds: 20),
|
||
);
|
||
_dio = Dio(_baseOptions);
|
||
_dio.interceptors.addAll(_interceptors);
|
||
}
|
||
|
||
Future<Response> get(
|
||
String pathUrl, {
|
||
dynamic data,
|
||
Options? options,
|
||
String? baseUrlString,
|
||
}) async {
|
||
if (baseUrlString != null) {
|
||
_dio.options.baseUrl = baseUrlString;
|
||
}
|
||
return await _dio.get(pathUrl, queryParameters: data, options: options);
|
||
}
|
||
|
||
Future<Response> post(
|
||
String pathUrl, {
|
||
dynamic data,
|
||
Options? options,
|
||
String? baseUrlString,
|
||
}) async {
|
||
if (baseUrlString != null) {
|
||
_dio.options.baseUrl = baseUrlString;
|
||
}
|
||
return await _dio.post(pathUrl, data: data, options: options);
|
||
}
|
||
|
||
Future<Response> put(
|
||
String pathUrl, {
|
||
dynamic data,
|
||
Options? options,
|
||
String? baseUrlString,
|
||
}) async {
|
||
if (baseUrlString != null) {
|
||
_dio.options.baseUrl = baseUrlString;
|
||
}
|
||
return await _dio.put(pathUrl, data: data, options: options);
|
||
}
|
||
|
||
Future<Response> delete(
|
||
String pathUrl, {
|
||
dynamic data,
|
||
Options? options,
|
||
String? baseUrlString,
|
||
}) async {
|
||
if (baseUrlString != null) {
|
||
_dio.options.baseUrl = baseUrlString;
|
||
}
|
||
return await _dio.delete(pathUrl, data: data, options: options);
|
||
}
|
||
|
||
Future<Response> postFormData(
|
||
String pathUrl,
|
||
FormData data, {
|
||
Options? options,
|
||
String? baseUrlString,
|
||
}) async {
|
||
if (baseUrlString != null) {
|
||
_dio.options.baseUrl = baseUrlString;
|
||
}
|
||
return await _dio.post(pathUrl, data: data, options: options);
|
||
}
|
||
}
|