callExperimentalAPI method

Future<V2TimValueCallback<Object>> callExperimentalAPI({
  1. required String api,
  2. Object? param,
})

Implementation

Future<V2TimValueCallback<Object>> callExperimentalAPI({
  required String api,
  Object? param,
}) async {
  Map<String, dynamic> cJsonParam = {};
  if (param is Map<String, dynamic>) {
    cJsonParam = Map<String, dynamic>.from(param);
  }
  cJsonParam['request_internal_operation'] = api;

  // C 层直接通过返回值传递数据,不走回调
  if (api == 'internal_operation_get_login_account_type') {
    Pointer<Char> pCJsonParam = Tools.string2PointerChar(json.encode(cJsonParam));
    Pointer<Void> pUserData = Tools.string2PointerVoid('');
    int accountType = NativeLibraryManager.bindings.DartCallExperimentalAPI(pCJsonParam, pUserData);
    Tools.freePointers([pCJsonParam, pUserData]);
    return V2TimValueCallback<Object>(code: 0, desc: '', data: accountType);
  }

  // C 层同步操作,不会触发回调,直接返回结果
  if (_syncExperimentalAPIs.contains(api)) {
    Pointer<Char> pCJsonParam = Tools.string2PointerChar(json.encode(cJsonParam));
    Pointer<Void> pUserData = Tools.string2PointerVoid('');
    int result = NativeLibraryManager.bindings.DartCallExperimentalAPI(pCJsonParam, pUserData);
    Tools.freePointers([pCJsonParam, pUserData]);
    if (result != TIMResult.TIM_SUCC.value) {
      return V2TimValueCallback<Object>(code: TIMErrCode.ERR_INVALID_PARAMETERS.value, desc: "invalid parameter");
    }
    return V2TimValueCallback<Object>(code: 0, desc: '');
  }

  // C 层异步操作,通过回调返回结果
  String userData = Tools.generateUserData('callExperimentalAPI');
  Completer<V2TimValueCallback<Object>> completer = Completer();
  NativeLibraryManager.addTimValueCallback2Map<Object>(userData, completer);

  Pointer<Char> pCJsonParam = Tools.string2PointerChar(json.encode(cJsonParam));
  Pointer<Void> pUserData = Tools.string2PointerVoid(userData);

  int result = NativeLibraryManager.bindings.DartCallExperimentalAPI(pCJsonParam, pUserData);
  if (result != TIMResult.TIM_SUCC.value) {
    NativeLibraryManager.removeTimCallbackFromMap(userData);
    Tools.freePointers([pCJsonParam, pUserData]);
    return V2TimValueCallback<Object>(code: TIMErrCode.ERR_INVALID_PARAMETERS.value, desc: "invalid parameter");
  }

  return completer.future.timeout(
    const Duration(seconds: 5),
    onTimeout: () {
      NativeLibraryManager.removeTimCallbackFromMap(userData);
      Tools.freePointers([pCJsonParam, pUserData]);
      return V2TimValueCallback<Object>(code: TIMErrCode.ERR_INVALID_PARAMETERS.value, desc: "callExperimentalAPI timeout, api: $api");
    },
  ).then((value) {
    NativeLibraryManager.removeTimCallbackFromMap(userData);
    Tools.freePointers([pCJsonParam, pUserData]);
    return value;
  });
}