initialize static method

Future<BtxCustomerSdk> initialize({
  1. required BtxCustomerSdkInitialization initialization,
})

Creates a long-lived SDK runtime from one public initialization shape.

Implementation

static Future<BtxCustomerSdk> initialize({
  required BtxCustomerSdkInitialization initialization,
}) async {
  _validateInitialization(initialization);
  final diagnostics = BtxSdkDiagnostics(
    scope: 'sdk',
    enabled: btxDiagnosticsEnabledForApiUrl(
      initialization.usesBundledCredentials
          ? initialization.apiBaseUrl ?? btxProductionApiBaseUrl
          : initialization.configuration!.apiBaseUrl,
    ),
  );
  diagnostics.log(
    'sdk.initialize.start',
    <String, Object?>{
      'runtimeId': diagnostics.instanceId,
      'mode': initialization.usesBundledCredentials ? 'bundled' : 'explicit',
      'telemetryMode': initialization.telemetry.runtimeMode.name,
      'lifecycleBinding': initialization.telemetry.bindAppLifecycle,
      'initialIdentityPresent': initialization.usesBundledCredentials
          ? initialization.initialIdentity != null
          : initialization.configuration?.customer.externalId.isNotEmpty ==
              true,
    },
  );

  if (initialization.usesBundledCredentials) {
    WidgetsFlutterBinding.ensureInitialized();
    final binding = BtxHeadlessBinding(
      initialIdentity: initialization.initialIdentity,
      credentials: initialization.credentials,
      credentialsPath: initialization.credentialsPath,
      apiBaseUrl: initialization.apiBaseUrl,
      appContextAttributes: initialization.appContextAttributes,
      httpClient: initialization.httpClient,
      uuid: initialization.uuid,
      bindAppLifecycle: initialization.telemetry.bindAppLifecycle,
      runtimeMode: initialization.telemetry.runtimeMode,
      initialAppSession: initialization.telemetry.initialAppSession,
    );
    await binding.attach();
    diagnostics.log(
      'sdk.initialize.complete',
      <String, Object?>{
        'runtimeId': diagnostics.instanceId,
        'mode': 'bundled',
        'active': binding.isActive,
      },
    );
    return BtxCustomerSdk._bundled(
      binding: binding,
      diagnostics: diagnostics,
    );
  }

  final identity = _normalizeIdentity(
    BtxHostIdentity(
      externalId: initialization.configuration!.customer.externalId,
      name: initialization.configuration!.customer.name,
      email: initialization.configuration!.customer.email,
    ),
  );
  WidgetsFlutterBinding.ensureInitialized();
  final durableStoragePath = await resolveBtxTelemetryStoragePath();
  final bootstrap = _telemetryBootstrapFromConfiguration(
    configuration: initialization.configuration!,
    initialAppSession: initialization.telemetry.initialAppSession,
    identity: identity,
    durableStoragePath: durableStoragePath,
  );
  final runtime = await createBtxTelemetryRuntime(
    bootstrap: bootstrap,
    mode: initialization.telemetry.runtimeMode,
    httpClient: initialization.httpClient,
    uuid: initialization.uuid,
  );
  final statusNotifier = ValueNotifier<BtxCustomerSdkStatus>(
    _statusForIdentity(identity),
  );
  final featureFlagsStore = BtxFeatureFlagStore(
    identity: identity,
  );
  featureFlagsStore.apply(runtime.featureFlags, allowUnload: true);
  final sdk = BtxCustomerSdk._explicit(
    runtime: runtime,
    authScope: btxAuthScopeForBootstrap(bootstrap),
    statusNotifier: statusNotifier,
    featureFlagsStore: featureFlagsStore,
    diagnostics: diagnostics,
  );
  if (initialization.telemetry.bindAppLifecycle) {
    WidgetsFlutterBinding.ensureInitialized();
    sdk._attachLifecycleBinding();
  }
  diagnostics.log(
    'sdk.initialize.complete',
    <String, Object?>{
      'runtimeId': diagnostics.instanceId,
      'mode': 'explicit',
      'active': sdk.isActive,
    },
  );
  return sdk;
}