Skip to content

Commit 23f7807

Browse files
author
Guilherme Souza
committed
Use DispatchQueue instead of actor
1 parent 9822407 commit 23f7807

File tree

3 files changed

+67
-45
lines changed

3 files changed

+67
-45
lines changed

Package.swift

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@ import PackageDescription
55

66
let package = Package(
77
name: "swift-log-supabase",
8-
platforms: [.iOS(.v15), .macOS(.v12)],
98
products: [
109
.library(
1110
name: "SupabaseLogger",

Sources/SupabaseLogger/LogsCache.swift

Lines changed: 20 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,33 +1,40 @@
11
import Foundation
22

3-
actor LogsCache {
3+
final class LogsCache {
44

55
private let maximumNumberOfLogsToPopAtOnce = 100
66

7+
private let queue = DispatchQueue(
8+
label: "co.binaryscraping.supabase-log-cache", attributes: .concurrent)
79
private var cachedLogs: [[String: Any]] = []
810

911
func push(_ log: [String: Any]) {
10-
cachedLogs.append(log)
12+
queue.sync { self.cachedLogs.append(log) }
1113
}
1214

1315
func push(_ logs: [[String: Any]]) {
14-
cachedLogs.append(contentsOf: logs)
16+
queue.sync { self.cachedLogs.append(contentsOf: logs) }
1517
}
1618

1719
func pop() -> [[String: Any]] {
18-
let sliceSize = min(maximumNumberOfLogsToPopAtOnce, cachedLogs.count)
19-
let poppedLogs = Array(cachedLogs[..<sliceSize])
20-
cachedLogs.removeFirst(sliceSize)
20+
var poppedLogs: [[String: Any]] = []
21+
queue.sync(flags: .barrier) {
22+
let sliceSize = min(maximumNumberOfLogsToPopAtOnce, cachedLogs.count)
23+
poppedLogs = Array(cachedLogs[..<sliceSize])
24+
cachedLogs.removeFirst(sliceSize)
25+
}
2126
return poppedLogs
2227
}
2328

2429
func backupCache() {
25-
do {
26-
let data = try JSONSerialization.data(withJSONObject: cachedLogs)
27-
try data.write(to: LogsCache.fileURL())
28-
self.cachedLogs = []
29-
} catch {
30-
print("Error saving Logs cache.")
30+
queue.sync(flags: .barrier) {
31+
do {
32+
let data = try JSONSerialization.data(withJSONObject: cachedLogs)
33+
try data.write(to: LogsCache.fileURL())
34+
self.cachedLogs = []
35+
} catch {
36+
print("Error saving Logs cache.")
37+
}
3138
}
3239
}
3340

@@ -38,9 +45,7 @@ actor LogsCache {
3845
.appendingPathComponent("supabase-log-cache")
3946
}
4047

41-
static let shared = LogsCache()
42-
43-
private init() {
48+
init() {
4449
do {
4550
let data = try Data(contentsOf: LogsCache.fileURL())
4651
try FileManager.default.removeItem(at: LogsCache.fileURL())

Sources/SupabaseLogger/SupabaseLogHandler.swift

Lines changed: 47 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import Logging
77
import AppKit
88
#endif
99

10-
public struct SupabaseLogConfig {
10+
public struct SupabaseLogConfig: Hashable {
1111
let supabaseURL: String
1212
let supabaseAnonKey: String
1313

@@ -38,7 +38,7 @@ public struct SupabaseLogHandler: LogHandler {
3838
private let logManager: SupabaseLogManager
3939

4040
public init(config: SupabaseLogConfig) {
41-
logManager = SupabaseLogManager(config: config)
41+
logManager = SupabaseLogManager.shared(config)
4242
}
4343

4444
public func log(
@@ -68,9 +68,25 @@ final class SupabaseLogManager {
6868
let cache: LogsCache
6969
let config: SupabaseLogConfig
7070

71-
init(config: SupabaseLogConfig) {
71+
private static let queue = DispatchQueue(
72+
label: "co.binaryscraping.supabase-log-manager.instances")
73+
private static var instances: [SupabaseLogConfig: SupabaseLogManager] = [:]
74+
75+
static func shared(_ config: SupabaseLogConfig) -> SupabaseLogManager {
76+
queue.sync {
77+
if let manager = instances[config] {
78+
return manager
79+
}
80+
81+
let manager = SupabaseLogManager(config: config)
82+
instances[config] = manager
83+
return manager
84+
}
85+
}
86+
87+
private init(config: SupabaseLogConfig) {
7288
self.config = config
73-
self.cache = LogsCache.shared
89+
self.cache = LogsCache()
7490

7591
#if os(macOS)
7692
NotificationCenter.default.addObserver(
@@ -90,54 +106,56 @@ final class SupabaseLogManager {
90106
}
91107

92108
func log(_ payload: [String: Any]) {
93-
Task { await cache.push(payload) }
109+
cache.push(payload)
94110
}
95111

96112
private func checkForLogsAndSend() {
97-
Task {
98-
let logs = await cache.pop()
99-
if logs.isEmpty { return }
100-
101-
let data = try! JSONSerialization.data(withJSONObject: logs)
102-
guard
103-
let url = URL(string: self.config.supabaseURL)?.appendingPathComponent(self.config.table)
104-
else {
105-
return
106-
}
113+
let logs = cache.pop()
114+
if logs.isEmpty { return }
115+
116+
let data = try! JSONSerialization.data(withJSONObject: logs)
117+
guard
118+
let url = URL(string: self.config.supabaseURL)?.appendingPathComponent(self.config.table)
119+
else {
120+
return
121+
}
107122

108-
var request = URLRequest(url: url)
109-
request.httpMethod = "POST"
110-
request.httpBody = data
123+
var request = URLRequest(url: url)
124+
request.httpMethod = "POST"
125+
request.httpBody = data
111126

127+
URLSession.shared.dataTask(with: request) { _, response, error in
112128
do {
113-
let (_, response) = try await URLSession.shared.data(for: request)
114-
if let httpResponse = response as? HTTPURLResponse {
115-
if 200..<300 ~= httpResponse.statusCode {
116-
return
117-
}
129+
if let error = error {
130+
throw error
131+
}
118132

119-
await cache.push(logs)
133+
guard
134+
let httpResponse = response as? HTTPURLResponse,
135+
200..<300 ~= httpResponse.statusCode
136+
else {
137+
throw URLError(.badServerResponse)
120138
}
121139
} catch {
122-
await cache.push(logs)
140+
print(error)
141+
self.cache.push(logs)
123142
}
124143
}
144+
.resume()
125145
}
126146
}
127147

128148
extension SupabaseLogManager {
129149
@objc func appWillTerminate() {
130-
Task { await cache.backupCache() }
150+
cache.backupCache()
131151
}
132152

133153
#if os(iOS)
134154
@objc func didEnterForeground() {
135155
}
136156

137157
@objc func didEnterBackground() {
138-
Task {
139-
await cache.backupCache()
140-
}
158+
cache.backupCache()
141159
}
142160
#endif
143161
}

0 commit comments

Comments
 (0)