Created
January 17, 2026 18:25
-
-
Save mihaelamj/ca6b3955f47217d976111b9164d8d927 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| final class AnalyticsService: Sendable { | |
| static let shared = AnalyticsService() | |
| private let continuation: AsyncStream<AnalyticsEvent>.Continuation | |
| private init() { | |
| let (stream, continuation) = AsyncStream.makeStream(of: AnalyticsEvent.self) | |
| self.continuation = continuation | |
| // Background consumer | |
| Task.detached(priority: .utility) { | |
| var buffer: [AnalyticsEvent] = [] | |
| for await event in stream { | |
| buffer.append(event) | |
| if buffer.count >= 50 { | |
| await Self.send(buffer) | |
| buffer.removeAll() | |
| } | |
| } | |
| // Flush remaining on termination | |
| if !buffer.isEmpty { | |
| await Self.send(buffer) | |
| } | |
| } | |
| } | |
| // Fire and forget — never blocks | |
| func track(_ event: AnalyticsEvent) { | |
| continuation.yield(event) | |
| } | |
| func shutdown() { | |
| continuation.finish() | |
| } | |
| private static func send(_ events: [AnalyticsEvent]) async { | |
| // Network call... | |
| } | |
| } | |
| struct AnalyticsEvent: Sendable { | |
| let name: String | |
| let timestamp: Date | |
| let properties: [String: String] | |
| static func screenView(_ name: String) -> AnalyticsEvent { | |
| AnalyticsEvent(name: "screen_view", timestamp: .now, properties: ["screen": name]) | |
| } | |
| } | |
| // usage | |
| AnalyticsService.shared.track(.screenView("Home")) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment