@@ -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
128148extension 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