register static method

Future<void> register({
  1. required SDKEnvironment environment,
  2. String? baseURL,
  3. String? accessToken,
})

Register device callbacks with C++ (full async init, Phase 2) Must be called during SDK init after platform adapter

Implementation

static Future<void> register({
  required SDKEnvironment environment,
  String? baseURL,
  String? accessToken,
}) async {
  _environment = environment;
  _baseURL = baseURL;
  _accessToken = accessToken;

  // Register callbacks if not already done in Phase 1
  if (!_callbacksRegistered) {
    registerCallbacks();
  }

  if (_isRegistered) {
    _logger.debug('Device already fully registered');
    return;
  }

  // Initialize SharedPreferences
  _prefs = await SharedPreferences.getInstance();

  // Pre-cache device ID
  await _getOrCreateDeviceId();

  try {
    final lib = PlatformLoader.loadCommons();

    // Allocate callbacks struct
    _callbacksPtr = calloc<RacDeviceCallbacksStruct>();
    final callbacks = _callbacksPtr!;

    // Set callback function pointers
    callbacks.ref.getDeviceInfo =
        Pointer.fromFunction<RacDeviceGetInfoCallbackNative>(
            _getDeviceInfoCallback);
    callbacks.ref.getDeviceId =
        Pointer.fromFunction<RacDeviceGetIdCallbackNative>(
            _getDeviceIdCallback, _exceptionalReturnNull);
    callbacks.ref.isRegistered =
        Pointer.fromFunction<RacDeviceIsRegisteredCallbackNative>(
            _isRegisteredCallback, _exceptionalReturnInt32);
    callbacks.ref.setRegistered =
        Pointer.fromFunction<RacDeviceSetRegisteredCallbackNative>(
            _setRegisteredCallback);
    callbacks.ref.httpPost =
        Pointer.fromFunction<RacDeviceHttpPostCallbackNative>(
            _httpPostCallback, _exceptionalReturnInt32);
    callbacks.ref.userData = nullptr;

    // Register with C++
    final setCallbacks = lib.lookupFunction<
            Int32 Function(Pointer<RacDeviceCallbacksStruct>),
            int Function(Pointer<RacDeviceCallbacksStruct>)>(
        'rac_device_manager_set_callbacks');

    final result = setCallbacks(callbacks);
    if (result != RacResultCode.success) {
      _logger.warning('Failed to register device callbacks',
          metadata: {'code': result});
      calloc.free(callbacks);
      _callbacksPtr = null;
      return;
    }

    _isRegistered = true;
    _logger.debug('Device callbacks registered successfully');
  } catch (e, stack) {
    _logger.debug('Device registration not available: $e', metadata: {
      'stack': stack.toString(),
    });
    _isRegistered = true; // Mark as registered to avoid retry loops
  }
}