initialize static method
void
initialize(
- SDKEnvironment environment, {
- String apiKey = '',
- String baseURL = '',
- String deviceId = '',
Initialize the core bridge layer.
This is Phase 1 of 2-phase initialization (matches Swift CppBridge.initialize exactly):
- Load native library
- Register platform adapter FIRST (file ops, logging, keychain)
- Configure C++ logging level (rac_configure_logging)
- Drive Phase 1 of SDK init through
rac_sdk_init_phase1_proto(validates inputs + runsrac_state_initializeinside commons) - Register events callback (analytics routing)
- Initialize telemetry manager
- 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');
}