Skip to content

Commit

Permalink
Add PixelKit source parameter (#1989)
Browse files Browse the repository at this point in the history
Task/Issue URL: https://app.asana.com/0/0/1206203334750907/f
Tech Design URL:
CC:

Description:

This PR adds a source parameter to the PixelKit setUp function, to allow us to include which target is sending the pixel.
  • Loading branch information
samsymons authored Dec 21, 2023
1 parent 85de0dc commit 9823186
Show file tree
Hide file tree
Showing 5 changed files with 45 additions and 5 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -379,8 +379,17 @@ final class MacPacketTunnelProvider: PacketTunnelProvider {
dryRun = false
#endif

let source: String

#if NETP_SYSTEM_EXTENSION
source = "vpnSystemExtension"
#else
source = "vpnAppExtension"
#endif

PixelKit.setUp(dryRun: dryRun,
appVersion: AppVersion.shared.versionNumber,
source: source,
defaultHeaders: defaultHeaders,
log: .networkProtectionPixel,
defaults: .netP) { (pixelName: String, headers: [String: String], parameters: [String: String], _, _, onComplete: @escaping PixelKit.CompletionBlock) in
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,7 @@ final class DuckDuckGoDBPBackgroundAgentApplication: NSApplication {

PixelKit.setUp(dryRun: dryRun,
appVersion: AppVersion.shared.versionNumber,
source: nil,
defaultHeaders: [:],
log: .dbpBackgroundAgentPixel,
defaults: .standard) { (pixelName: String, headers: [String: String], parameters: [String: String], _, _, onComplete: @escaping (Bool, Error?) -> Void) in
Expand Down
7 changes: 6 additions & 1 deletion DuckDuckGoVPN/DuckDuckGoVPNAppDelegate.swift
Original file line number Diff line number Diff line change
Expand Up @@ -173,7 +173,12 @@ final class DuckDuckGoVPNAppDelegate: NSObject, NSApplicationDelegate {
dryRun = false
#endif

PixelKit.setUp(dryRun: dryRun, appVersion: AppVersion.shared.versionNumber, defaultHeaders: [:], log: .networkProtectionPixel, defaults: .netP) { (pixelName: String, headers: [String: String], parameters: [String: String], _, _, onComplete: @escaping PixelKit.CompletionBlock) in
PixelKit.setUp(dryRun: dryRun,
appVersion: AppVersion.shared.versionNumber,
source: "vpnAgent",
defaultHeaders: [:],
log: .networkProtectionPixel,
defaults: .netP) { (pixelName: String, headers: [String: String], parameters: [String: String], _, _, onComplete: @escaping PixelKit.CompletionBlock) in

let url = URL.pixelUrl(forPixelNamed: pixelName)
let apiHeaders = APIRequest.Headers(additionalHeaders: headers) // workaround - Pixel class should really handle APIRequest.Headers by itself
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ public extension PixelKit {
public static let duration = "duration"
public static let test = "test"
public static let appVersion = "appVersion"
public static let pixelSource = "pixelSource"
public static let osMajorVersion = "osMajorVersion"

public static let errorCode = "e"
Expand Down
32 changes: 28 additions & 4 deletions LocalPackages/PixelKit/Sources/PixelKit/PixelKit.swift
Original file line number Diff line number Diff line change
Expand Up @@ -87,21 +87,39 @@ public final class PixelKit {
private let log: OSLog
private let fireRequest: FireRequest

/// `dryRun`: if `true`, simulate requests and "send" them at an accelerated rate (once every 2 minutes instead of once a day)
/// `fireRequest`: this is not triggered when `dryRun` is `true`
public static func setUp(dryRun: Bool = false, appVersion: String, defaultHeaders: [String: String], log: OSLog, defaults: UserDefaults, fireRequest: @escaping FireRequest) {
shared = PixelKit(dryRun: dryRun, appVersion: appVersion, defaultHeaders: defaultHeaders, log: log, defaults: defaults, fireRequest: fireRequest)
/// Sets up PixelKit for the entire app.
///
/// - Parameters:
/// - `dryRun`: if `true`, simulate requests and "send" them at an accelerated rate (once every 2 minutes instead of once a day)
/// - `source`: if set, adds a `pixelSource` parameter to the pixel call; this can be used to specify which target is sending the pixel
/// - `fireRequest`: this is not triggered when `dryRun` is `true`
public static func setUp(dryRun: Bool = false,
appVersion: String,
source: String? = nil,
defaultHeaders: [String: String],
log: OSLog,
defaults: UserDefaults,
fireRequest: @escaping FireRequest) {
shared = PixelKit(dryRun: dryRun,
appVersion: appVersion,
source: source,
defaultHeaders: defaultHeaders,
log: log,
defaults: defaults,
fireRequest: fireRequest)
}

static func tearDown() {
shared = nil
}

private var dryRun: Bool
private let source: String?
private let pixelCalendar: Calendar

init(dryRun: Bool,
appVersion: String,
source: String? = nil,
defaultHeaders: [String: String],
log: OSLog,
dailyPixelCalendar: Calendar? = nil,
Expand All @@ -111,6 +129,7 @@ public final class PixelKit {

self.dryRun = dryRun
self.appVersion = appVersion
self.source = source
self.defaultHeaders = defaultHeaders
self.log = log
self.pixelCalendar = dailyPixelCalendar ?? Self.defaultDailyPixelCalendar
Expand All @@ -119,6 +138,7 @@ public final class PixelKit {
self.fireRequest = fireRequest
}

// swiftlint:disable:next cyclomatic_complexity
private func fire(pixelNamed pixelName: String,
frequency: Frequency,
withHeaders headers: [String: String]?,
Expand All @@ -134,6 +154,10 @@ public final class PixelKit {
newParams[Parameters.appVersion] = appVersion
}

if let source {
newParams[Parameters.pixelSource] = source
}

if let error {
newParams.appendErrorPixelParams(error: error)
}
Expand Down

0 comments on commit 9823186

Please sign in to comment.