initialize static method

void initialize(
  1. SDKEnvironment environment, {
  2. String apiKey = '',
  3. String baseURL = '',
  4. String deviceId = '',
})

Initialize the core bridge layer.

This is Phase 1 of 2-phase initialization (matches Swift CppBridge.initialize exactly):

  1. Load native library
  2. Register platform adapter FIRST (file ops, logging, keychain)
  3. Configure C++ logging level (rac_configure_logging)
  4. Drive Phase 1 of SDK init through rac_sdk_init_phase1_proto (validates inputs + runs rac_state_initialize inside commons)
  5. Register events callback (analytics routing)
  6. Initialize telemetry manager
  7. Register device callbacks

Call this FIRST during SDK init. Must complete before Phase 2.

environment The SDK environment (development/staging/production) apiKey Resolved API key for production/staging, or empty in development. baseURL Resolved backend URL for production/staging/development. deviceId Platform-persisted device identifier resolved by the public init path before Phase 1.

Implementation

static void initialize(
  SDKEnvironment environment, {
  String apiKey = '',
  String baseURL = '',
  String deviceId = '',
}) {
  if (_isShuttingDown) {
    throw StateError('SDK shutdown is in progress');
  }
  if (_isInitialized) {
    _logger.debug('Already initialized, skipping');
    return;
  }

  _environment = environment;

  // Set environment first so Dart-side logging boots with the correct
  // per-environment config (min level + console gating). Mirrors Swift
  // RunAnywhere.performCoreInitSerial which calls
  // Logging.shared.applyEnvironmentConfiguration(params.environment)
  // before any bridge work.
  SDKLoggerConfig.shared.applyEnvironmentConfiguration(environment);

  _logger.debug(
    'Starting Phase 1 initialization',
    metadata: {'environment': environment.name},
  );

  // Step 1: Load native library
  _lib = PlatformLoader.loadCommons();
  _logger.debug('Native library loaded');
  PlatformLoader.tryLoadFlutterNativePortHelpers();

  // Step 2: Register platform adapter FIRST (file ops, logging, keychain)
  // C++ needs these callbacks before any other operations
  // Matches Swift: PlatformAdapter.register()
  DartBridgePlatform.register();
  _logger.debug('Platform adapter registered');

  // Step 3: Configure C++ logging level
  // Matches Swift: rac_configure_logging(environment.cEnvironment)
  _configureLogging(environment);
  _logger.debug('C++ logging configured');

  // Step 4: Initialize SDK with configuration (Phase 1 proto-based path)
  // Matches Swift: CppBridge.SdkInit.phase1(...) in
  // sdk/runanywhere-swift/Sources/RunAnywhere/Foundation/Bridge/Extensions/CppBridge+SdkInit.swift
  // Routes through rac_sdk_init_phase1_proto in commons.
  try {
    DartBridgeSdkInit.phase1(
      SdkInitPhase1Request(
        environment: _toSdkInitEnvironment(environment),
        apiKey: apiKey,
        baseUrl: baseURL,
        deviceId: deviceId,
        platform: SDKConstants.platform,
        sdkVersion: SDKConstants.version,
      ),
    );
    _logger.debug('SDK Phase 1 (proto) initialized');
  } catch (_) {
    _logger.error('SDK Phase 1 proto init failed');
    rethrow;
  }

  // Step 5: Register events callback (analytics routing)
  // Matches Swift: Events.register()
  DartBridgeEvents.register();
  _logger.debug('Events callback registered');

  // Step 6: Initialize telemetry manager (sync part)
  // Matches Swift: Telemetry.initialize(environment: environment)
  // Note: Full telemetry init with HTTP is in Phase 2
  DartBridgeTelemetry.initializeSync(environment: environment);
  _logger.debug('Telemetry initialized (sync)');

  // Step 7: Register device callbacks
  // Matches Swift: Device.register()
  DartBridgeDevice.registerCallbacks();
  _logger.debug('Device callbacks registered');

  // Step 8: Register file manager I/O callbacks
  DartBridgeFileManager.register();
  _logger.debug('File manager callbacks registered');

  // Step 9: Wire global model registry before any registerModel() calls.
  // Swift's CppBridge.ModelRegistry.shared resolves rac_get_model_registry()
  // lazily; Flutter apps register catalog models immediately after
  // initialize() returns (Phase 1 only).
  DartBridgeModelRegistry.instance.ensureInitialized();
  _logger.debug('Model registry handle wired (Phase 1)');

  _isInitialized = true;
  _logger.info('Phase 1 initialization complete');
}