Files
Cable/Pods/PostHog/PostHog/Replay/Plugins/Network/PostHogSessionReplayNetworkPlugin.swift
Stefan Lange-Hegermann ced06f9eb6 ads tracking
2025-11-05 11:13:54 +01:00

90 lines
2.9 KiB
Swift

//
// PostHogSessionReplayNetworkPlugin.swift
// PostHog
//
// Created by Ioannis Josephides on 28/05/2025.
//
#if os(iOS)
import Foundation
/// Session replay plugin that captures network requests using URLSession swizzling.
class PostHogSessionReplayNetworkPlugin: PostHogSessionReplayPlugin {
private var sessionSwizzler: URLSessionSwizzler?
private var postHog: PostHogSDK?
private var isActive = false
func start(postHog: PostHogSDK) {
self.postHog = postHog
do {
sessionSwizzler = try URLSessionSwizzler(
shouldCapture: shouldCaptureNetworkSample,
onCapture: handleNetworkSample,
getSessionId: { [weak self] date in
self?.postHog?.sessionManager.getSessionId(at: date)
}
)
sessionSwizzler?.swizzle()
hedgeLog("[Session Replay] Network telemetry plugin started")
isActive = true
} catch {
hedgeLog("[Session Replay] Failed to initialize network telemetry: \(error)")
}
}
func stop() {
sessionSwizzler?.unswizzle()
sessionSwizzler = nil
postHog = nil
isActive = false
hedgeLog("[Session Replay] Network telemetry plugin stopped")
}
func resume() {
guard !isActive else { return }
isActive = true
hedgeLog("[Session Replay] Network telemetry plugin resumed")
}
func pause() {
guard isActive else { return }
isActive = false
hedgeLog("[Session Replay] Network telemetry plugin paused")
}
private func shouldCaptureNetworkSample() -> Bool {
guard let postHog else { return false }
return isActive && postHog.config.sessionReplayConfig.captureNetworkTelemetry && postHog.isSessionReplayActive()
}
private func handleNetworkSample(sample: NetworkSample) {
guard let postHog else { return }
let timestamp = sample.timeOrigin
var snapshotsData: [Any] = []
let requestsData = [sample.toDict()]
let payloadData: [String: Any] = ["requests": requestsData]
let pluginData: [String: Any] = ["plugin": "rrweb/network@1", "payload": payloadData]
let data: [String: Any] = [
"type": 6,
"data": pluginData,
"timestamp": timestamp.toMillis(),
]
snapshotsData.append(data)
postHog.capture(
"$snapshot",
properties: [
"$snapshot_source": "mobile",
"$snapshot_data": snapshotsData,
"$session_id": sample.sessionId,
],
timestamp: sample.timeOrigin
)
}
}
#endif