initialize static method

Future<InstallResponse> initialize({
  1. required LinkFortyConfig config,
  2. int attributionWindowHours = 168,
  3. String? deviceId,
  4. @visibleForTesting NetworkManagerProtocol? networkManager,
  5. @visibleForTesting StorageManagerProtocol? storageManager,
  6. @visibleForTesting FingerprintCollectorProtocol? fingerprintCollector,
})

Initializes the LinkForty SDK with the provided config.

This must be called before using any other SDK features.

Parameters:

  • config: The SDK configuration object.
  • attributionWindowHours: The duration in hours to look back for clicks. Defaults to 168 hours (7 days).
  • deviceId: An optional unique device identifier for high-confidence matching.
  • networkManager: For testing - allows injecting a mock network layer.
  • storageManager: For testing - allows injecting a mock storage layer.
  • fingerprintCollector: For testing - allows injecting a mock collector.

Returns an InstallResponse containing attribution results.

Throws AlreadyInitializedError if called more than once without reset. Throws LinkFortyError if initialization or initial attribution fails.

Implementation

static Future<InstallResponse> initialize({
  required LinkFortyConfig config,
  int attributionWindowHours = 168,
  String? deviceId,
  @visibleForTesting NetworkManagerProtocol? networkManager,
  @visibleForTesting StorageManagerProtocol? storageManager,
  @visibleForTesting FingerprintCollectorProtocol? fingerprintCollector,
}) async {
  if (_instance != null) {
    throw const AlreadyInitializedError();
  }

  config.validate();

  final sdk = LinkForty._();
  sdk._config = config;

  LinkFortyLogger.isDebugEnabled = config.debug;

  final effectiveStorageManager =
      storageManager ?? await StorageManager.create();
  final effectiveNetworkManager =
      networkManager ?? NetworkManager(config: config);
  final effectiveFingerprintCollector =
      fingerprintCollector ?? FingerprintCollector();

  sdk._networkManager = effectiveNetworkManager;

  final attributionContext = AttributionContext(
    storage: effectiveStorageManager,
    debug: config.debug,
  );
  sdk._attributionContext = attributionContext;

  sdk._attributionManager = AttributionManager(
    networkManager: effectiveNetworkManager,
    storageManager: effectiveStorageManager,
    fingerprintCollector: effectiveFingerprintCollector,
  );

  sdk._eventTracker = EventTracker(
    networkManager: effectiveNetworkManager,
    storageManager: effectiveStorageManager,
    attributionContext: attributionContext,
  );

  final deepLinkHandler = DeepLinkHandler();
  deepLinkHandler.configure(
    networkManager: effectiveNetworkManager,
    fingerprintCollector: effectiveFingerprintCollector,
    baseURL: config.baseURL,
    attributionContext: attributionContext,
  );
  sdk._deepLinkHandler = deepLinkHandler;

  sdk._isInitialized = true;
  _instance = sdk;
  sdk._initializationCompleter.complete();

  final response = await sdk._attributionManager!.reportInstall(
    attributionWindowHours: attributionWindowHours,
    deviceId: deviceId,
    appToken: config.appToken,
  );

  if (response.attributed && response.deepLinkData != null) {
    await sdk._deepLinkHandler?.deliverDeferredDeepLink(
      response.deepLinkData,
    );
  }

  LinkFortyLogger.log(
    'SDK initialized successfully (attributed: ${response.attributed})',
  );

  return response;
}