Skip to content

Commit 76ca498

Browse files
Add logging to PublicObjectsStore
I'm trying to debug an issue and this will be helpful. Code largely generated by Cursor at my instruction.
1 parent 37e14d7 commit 76ca498

6 files changed

Lines changed: 60 additions & 12 deletions

File tree

Sources/AblyLiveObjects/Public/ARTRealtimeChannel+Objects.swift

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,10 +18,13 @@ public extension ARTRealtimeChannel {
1818
pluginAPI: Plugin.defaultPluginAPI,
1919
)
2020

21+
let logger = pluginAPI.logger(for: underlyingObjects.channel)
22+
2123
return PublicObjectsStore.shared.getOrCreateRealtimeObjects(
2224
proxying: internalObjects,
2325
creationArgs: .init(
2426
coreSDK: coreSDK,
27+
logger: logger,
2528
),
2629
)
2730
}

Sources/AblyLiveObjects/Public/Public Proxy Objects/InternalLiveMapValue+ToPublic.swift

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,19 @@
1+
internal import AblyPlugin
2+
13
internal extension InternalLiveMapValue {
24
// MARK: - Mapping to public types
35

46
struct PublicValueCreationArgs {
57
internal var coreSDK: CoreSDK
68
internal var mapDelegate: LiveMapObjectPoolDelegate
9+
internal var logger: AblyPlugin.Logger
710

811
internal var toCounterCreationArgs: PublicObjectsStore.CounterCreationArgs {
9-
.init(coreSDK: coreSDK)
12+
.init(coreSDK: coreSDK, logger: logger)
1013
}
1114

1215
internal var toMapCreationArgs: PublicObjectsStore.MapCreationArgs {
13-
.init(coreSDK: coreSDK, delegate: mapDelegate)
16+
.init(coreSDK: coreSDK, delegate: mapDelegate, logger: logger)
1417
}
1518
}
1619

Sources/AblyLiveObjects/Public/Public Proxy Objects/PublicDefaultLiveCounter.swift

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import Ably
2+
internal import AblyPlugin
23

34
/// Our default implementation of ``LiveCounter``.
45
///
@@ -9,10 +10,12 @@ internal final class PublicDefaultLiveCounter: LiveCounter {
910
// MARK: - Dependencies that hold a strong reference to `proxied`
1011

1112
private let coreSDK: CoreSDK
13+
private let logger: AblyPlugin.Logger
1214

13-
internal init(proxied: InternalDefaultLiveCounter, coreSDK: CoreSDK) {
15+
internal init(proxied: InternalDefaultLiveCounter, coreSDK: CoreSDK, logger: AblyPlugin.Logger) {
1416
self.proxied = proxied
1517
self.coreSDK = coreSDK
18+
self.logger = logger
1619
}
1720

1821
// MARK: - `LiveCounter` protocol

Sources/AblyLiveObjects/Public/Public Proxy Objects/PublicDefaultLiveMap.swift

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import Ably
2+
internal import AblyPlugin
23

34
/// Our default implementation of ``LiveMap``.
45
///
@@ -10,11 +11,13 @@ internal final class PublicDefaultLiveMap: LiveMap {
1011

1112
private let coreSDK: CoreSDK
1213
private let delegate: LiveMapObjectPoolDelegate
14+
private let logger: AblyPlugin.Logger
1315

14-
internal init(proxied: InternalDefaultLiveMap, coreSDK: CoreSDK, delegate: LiveMapObjectPoolDelegate) {
16+
internal init(proxied: InternalDefaultLiveMap, coreSDK: CoreSDK, delegate: LiveMapObjectPoolDelegate, logger: AblyPlugin.Logger) {
1517
self.proxied = proxied
1618
self.coreSDK = coreSDK
1719
self.delegate = delegate
20+
self.logger = logger
1821
}
1922

2023
// MARK: - `LiveMap` protocol
@@ -24,6 +27,7 @@ internal final class PublicDefaultLiveMap: LiveMap {
2427
creationArgs: .init(
2528
coreSDK: coreSDK,
2629
mapDelegate: delegate,
30+
logger: logger,
2731
),
2832
)
2933
}
@@ -43,6 +47,7 @@ internal final class PublicDefaultLiveMap: LiveMap {
4347
creationArgs: .init(
4448
coreSDK: coreSDK,
4549
mapDelegate: delegate,
50+
logger: logger,
4651
),
4752
)
4853
)
@@ -63,6 +68,7 @@ internal final class PublicDefaultLiveMap: LiveMap {
6368
creationArgs: .init(
6469
coreSDK: coreSDK,
6570
mapDelegate: delegate,
71+
logger: logger,
6672
),
6773
)
6874
}

Sources/AblyLiveObjects/Public/Public Proxy Objects/PublicDefaultRealtimeObjects.swift

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import Ably
2+
internal import AblyPlugin
23

34
/// The class that provides the public API for interacting with LiveObjects, via the ``ARTRealtimeChannel/objects`` property.
45
///
@@ -12,10 +13,12 @@ internal final class PublicDefaultRealtimeObjects: RealtimeObjects {
1213
// MARK: - Dependencies that hold a strong reference to `proxied`
1314

1415
private let coreSDK: CoreSDK
16+
private let logger: AblyPlugin.Logger
1517

16-
internal init(proxied: InternalDefaultRealtimeObjects, coreSDK: CoreSDK) {
18+
internal init(proxied: InternalDefaultRealtimeObjects, coreSDK: CoreSDK, logger: AblyPlugin.Logger) {
1719
self.proxied = proxied
1820
self.coreSDK = coreSDK
21+
self.logger = logger
1922
}
2023

2124
// MARK: - `RealtimeObjects` protocol
@@ -27,6 +30,7 @@ internal final class PublicDefaultRealtimeObjects: RealtimeObjects {
2730
creationArgs: .init(
2831
coreSDK: coreSDK,
2932
delegate: proxied,
33+
logger: logger,
3034
),
3135
)
3236
}

Sources/AblyLiveObjects/Public/Public Proxy Objects/PublicObjectsStore.swift

Lines changed: 36 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
internal import AblyPlugin
12
import Foundation
23

34
/// Stores the public objects that wrap the SDK's internal components.
@@ -20,6 +21,7 @@ internal final class PublicObjectsStore: Sendable {
2021

2122
internal struct RealtimeObjectsCreationArgs {
2223
internal var coreSDK: CoreSDK
24+
internal var logger: AblyPlugin.Logger
2325
}
2426

2527
/// Fetches the cached `PublicDefaultRealtimeObjects` that wraps a given `InternalDefaultRealtimeObjects`, creating a new public object if there isn't already one.
@@ -31,6 +33,7 @@ internal final class PublicObjectsStore: Sendable {
3133

3234
internal struct CounterCreationArgs {
3335
internal var coreSDK: CoreSDK
36+
internal var logger: AblyPlugin.Logger
3437
}
3538

3639
/// Fetches the cached `PublicDefaultLiveCounter` that wraps a given `InternalDefaultLiveCounter`, creating a new public object if there isn't already one.
@@ -43,6 +46,7 @@ internal final class PublicObjectsStore: Sendable {
4346
internal struct MapCreationArgs {
4447
internal var coreSDK: CoreSDK
4548
internal var delegate: LiveMapObjectPoolDelegate
49+
internal var logger: AblyPlugin.Logger
4650
}
4751

4852
/// Fetches the cached `PublicDefaultLiveMap` that wraps a given `InternalDefaultLiveMap`, creating a new public object if there isn't already one.
@@ -64,27 +68,37 @@ internal final class PublicObjectsStore: Sendable {
6468
/// Fetches the proxy that wraps `proxied`, creating a new proxy if there isn't already one. Stores a weak reference to the proxy.
6569
mutating func getOrCreate(
6670
proxying proxied: some AnyObject,
71+
logger: AblyPlugin.Logger,
72+
logObjectType: String,
6773
createProxy: () -> Proxy,
6874
) -> Proxy {
6975
// Remove any entries that are no longer useful
70-
removeDeallocatedEntries()
76+
removeDeallocatedEntries(logger: logger, logObjectType: logObjectType)
7177

7278
// Do the get-or-create
7379
let proxiedObjectIdentifier = ObjectIdentifier(proxied)
7480

7581
if let existing = proxiesByProxiedObjectIdentifier[proxiedObjectIdentifier]?.referenced {
82+
logger.log("Reusing existing \(logObjectType) proxy (proxy: \(ObjectIdentifier(existing)), proxied: \(proxiedObjectIdentifier))", level: .debug)
7683
return existing
7784
}
7885

7986
let created = createProxy()
8087
proxiesByProxiedObjectIdentifier[proxiedObjectIdentifier] = .init(referenced: created)
88+
logger.log("Creating new \(logObjectType) proxy (proxy: \(ObjectIdentifier(created)), proxied: \(proxiedObjectIdentifier))", level: .debug)
8189

8290
return created
8391
}
8492

85-
private mutating func removeDeallocatedEntries() {
86-
proxiesByProxiedObjectIdentifier = proxiesByProxiedObjectIdentifier.filter { entry in
87-
entry.value.referenced != nil
93+
private mutating func removeDeallocatedEntries(logger: AblyPlugin.Logger, logObjectType: String) {
94+
var keysToRemove: Set<ObjectIdentifier> = []
95+
for (proxiedObjectIdentifier, weakProxyRef) in proxiesByProxiedObjectIdentifier where weakProxyRef.referenced == nil {
96+
logger.log("Clearing unused \(logObjectType) proxy from cache (proxied: \(proxiedObjectIdentifier))", level: .debug)
97+
keysToRemove.insert(proxiedObjectIdentifier)
98+
}
99+
100+
for key in keysToRemove {
101+
proxiesByProxiedObjectIdentifier.removeValue(forKey: key)
88102
}
89103
}
90104
}
@@ -93,10 +107,15 @@ internal final class PublicObjectsStore: Sendable {
93107
proxying proxied: InternalDefaultRealtimeObjects,
94108
creationArgs: RealtimeObjectsCreationArgs,
95109
) -> PublicDefaultRealtimeObjects {
96-
realtimeObjectsProxies.getOrCreate(proxying: proxied) {
110+
realtimeObjectsProxies.getOrCreate(
111+
proxying: proxied,
112+
logger: creationArgs.logger,
113+
logObjectType: "RealtimeObjects",
114+
) {
97115
.init(
98116
proxied: proxied,
99117
coreSDK: creationArgs.coreSDK,
118+
logger: creationArgs.logger,
100119
)
101120
}
102121
}
@@ -105,10 +124,15 @@ internal final class PublicObjectsStore: Sendable {
105124
proxying proxied: InternalDefaultLiveCounter,
106125
creationArgs: CounterCreationArgs,
107126
) -> PublicDefaultLiveCounter {
108-
counterProxies.getOrCreate(proxying: proxied) {
127+
counterProxies.getOrCreate(
128+
proxying: proxied,
129+
logger: creationArgs.logger,
130+
logObjectType: "LiveCounter",
131+
) {
109132
.init(
110133
proxied: proxied,
111134
coreSDK: creationArgs.coreSDK,
135+
logger: creationArgs.logger,
112136
)
113137
}
114138
}
@@ -117,11 +141,16 @@ internal final class PublicObjectsStore: Sendable {
117141
proxying proxied: InternalDefaultLiveMap,
118142
creationArgs: MapCreationArgs,
119143
) -> PublicDefaultLiveMap {
120-
mapProxies.getOrCreate(proxying: proxied) {
144+
mapProxies.getOrCreate(
145+
proxying: proxied,
146+
logger: creationArgs.logger,
147+
logObjectType: "LiveMap",
148+
) {
121149
.init(
122150
proxied: proxied,
123151
coreSDK: creationArgs.coreSDK,
124152
delegate: creationArgs.delegate,
153+
logger: creationArgs.logger,
125154
)
126155
}
127156
}

0 commit comments

Comments
 (0)