Skip to content

Commit

Permalink
Merge pull request #1866 from ably/fix/1849-rename-localMembers
Browse files Browse the repository at this point in the history
[SDK-4015] Renamed presence map's `localMembers` to `internalMembers`
  • Loading branch information
maratal authored Mar 9, 2024
2 parents 91fb495 + 39d574c commit b301249
Show file tree
Hide file tree
Showing 3 changed files with 40 additions and 40 deletions.
20 changes: 10 additions & 10 deletions Source/ARTRealtimePresence.m
Original file line number Diff line number Diff line change
Expand Up @@ -182,7 +182,7 @@ @implementation ARTRealtimePresenceInternal {
ARTEventEmitter<ARTEvent * /*ARTSyncState*/, id> *_syncEventEmitter;

NSMutableDictionary<NSString *, ARTPresenceMessage *> *_members;
NSMutableDictionary<NSString *, ARTPresenceMessage *> *_localMembers; // RTP17h
NSMutableDictionary<NSString *, ARTPresenceMessage *> *_internalMembers; // RTP17h
}

- (instancetype)initWithChannel:(ARTRealtimeChannelInternal *)channel logger:(ARTInternalLog *)logger {
Expand All @@ -197,7 +197,7 @@ - (instancetype)initWithChannel:(ARTRealtimeChannelInternal *)channel logger:(AR
_eventEmitter = [[ARTInternalEventEmitter alloc] initWithQueue:_queue];
_dataEncoder = _channel.dataEncoder;
_members = [NSMutableDictionary new];
_localMembers = [NSMutableDictionary new];
_internalMembers = [NSMutableDictionary new];
_syncSessionId = 0;
_syncState = ARTPresenceSyncInitialized;
_syncEventEmitter = [[ARTInternalEventEmitter alloc] initWithQueue:_queue];
Expand Down Expand Up @@ -672,7 +672,7 @@ - (void)onAttached:(ARTProtocolMessage *)message {
ARTLogDebug(self.logger, @"R:%p C:%p (%@) PresenceMap has been reset", _realtime, self, _channel.name);
}
[self sendPendingPresence];
[self reenterLocalMembers]; // RTP17i
[self reenterInternalMembers]; // RTP17i
}

- (void)onMessage:(ARTProtocolMessage *)message {
Expand Down Expand Up @@ -736,9 +736,9 @@ - (void)didRemovedMemberNoLongerPresent:(ARTPresenceMessage *)pm {
ARTLogDebug(self.logger, @"RT:%p C:%p (%@) member \"%@\" no longer present", _realtime, _channel, _channel.name, pm.memberKey);
}

- (void)reenterLocalMembers {
- (void)reenterInternalMembers {
ARTLogDebug(self.logger, @"%p reentering local members", self);
for (ARTPresenceMessage *member in [self.localMembers allValues]) {
for (ARTPresenceMessage *member in [self.internalMembers allValues]) {
[self enterWithPresenceMessageId:member.id clientId:member.clientId data:member.data callback:^(ARTErrorInfo *error) {
if (error != nil) {
NSString *message = [NSString stringWithFormat:@"Re-entering member \"%@\" is failed with code %ld (%@)", member.memberKey, (long)error.code, error.message];
Expand All @@ -764,8 +764,8 @@ - (void)reenterLocalMembers {
return _members;
}

- (NSDictionary<NSString *, ARTPresenceMessage *> *)localMembers {
return _localMembers;
- (NSDictionary<NSString *, ARTPresenceMessage *> *)internalMembers {
return _internalMembers;
}

- (BOOL)add:(ARTPresenceMessage *)message {
Expand Down Expand Up @@ -802,7 +802,7 @@ - (void)internalAdd:(ARTPresenceMessage *)message withSessionId:(NSUInteger)sess
[_members setObject:message forKey:message.memberKey];
// Local member
if ([message.connectionId isEqualToString:self.connectionId]) {
_localMembers[message.clientId] = message;
_internalMembers[message.clientId] = message;
ARTLogDebug(_logger, @"local member %@ with action %@ has been added", message.memberKey, ARTPresenceActionToStr(message.action).uppercaseString);
}
}
Expand All @@ -813,7 +813,7 @@ - (void)internalRemove:(ARTPresenceMessage *)message {

- (void)internalRemove:(ARTPresenceMessage *)message force:(BOOL)force {
if ([message.connectionId isEqualToString:self.connectionId] && !message.isSynthesized) {
[_localMembers removeObjectForKey:message.clientId];
[_internalMembers removeObjectForKey:message.clientId];
}

const BOOL syncInProgress = self.syncInProgress;
Expand Down Expand Up @@ -852,7 +852,7 @@ - (void)leaveMembersNotPresentInSync {

- (void)reset {
_members = [NSMutableDictionary new];
_localMembers = [NSMutableDictionary new];
_internalMembers = [NSMutableDictionary new];
}

- (void)startSync {
Expand Down
2 changes: 1 addition & 1 deletion Source/PrivateHeaders/Ably/ARTRealtimePresence+Private.h
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ NS_ASSUME_NONNULL_BEGIN

/// List of internal members.
/// The key is the clientId and the value is the latest relevant ARTPresenceMessage for that clientId.
@property (readonly, atomic) NSMutableDictionary<NSString *, ARTPresenceMessage *> *localMembers;
@property (readonly, atomic) NSMutableDictionary<NSString *, ARTPresenceMessage *> *internalMembers;

@property (readonly, nonatomic) NSUInteger syncSessionId;
@property (readonly, nonatomic) BOOL syncComplete;
Expand Down
58 changes: 29 additions & 29 deletions Test/Tests/RealtimeClientPresenceTests.swift
Original file line number Diff line number Diff line change
Expand Up @@ -332,25 +332,25 @@ class RealtimeClientPresenceTests: XCTestCase {

XCTAssertEqual(channel.internal.presence.members.count, 2)
// Inject a local member
let localMember = ARTPresenceMessage(clientId: NSUUID().uuidString, action: .enter, connectionId: "another", id: "another:0:0")
channel.internal.presence.add(localMember)
let internalMember = ARTPresenceMessage(clientId: NSUUID().uuidString, action: .enter, connectionId: "another", id: "another:0:0")
channel.internal.presence.add(internalMember)
XCTAssertEqual(channel.internal.presence.members.count, 3)
XCTAssertEqual(channel.internal.presence.members.filter { memberKey, _ in memberKey.contains(localMember.clientId!) }.count, 1)
XCTAssertEqual(channel.internal.presence.members.filter { memberKey, _ in memberKey.contains(internalMember.clientId!) }.count, 1)

waitUntil(timeout: testTimeout) { done in
channel.presence.get { members, error in
XCTAssertNil(error)
guard let members = members, members.count == 3 else {
fail("Should at least have 3 members"); done(); return
}
XCTAssertEqual(members.filter { $0.clientId == localMember.clientId }.count, 1)
XCTAssertEqual(members.filter { $0.clientId == internalMember.clientId }.count, 1)
done()
}
}

waitUntil(timeout: testTimeout) { done in
channel.presence.subscribe(.leave) { leave in
XCTAssertEqual(leave.clientId, localMember.clientId)
XCTAssertEqual(leave.clientId, internalMember.clientId)
done()
}
client.requestPresenceSyncForChannel(channel)
Expand All @@ -362,7 +362,7 @@ class RealtimeClientPresenceTests: XCTestCase {
guard let members = members, members.count == 2 else {
fail("Should at least have 2 members"); done(); return
}
expect(members.filter { $0.clientId == localMember.clientId }).to(beEmpty())
expect(members.filter { $0.clientId == internalMember.clientId }).to(beEmpty())
done()
}
}
Expand Down Expand Up @@ -571,7 +571,7 @@ class RealtimeClientPresenceTests: XCTestCase {
}

XCTAssertEqual(channel.internal.presence.members.count, 1)
XCTAssertEqual(channel.internal.presence.localMembers.count, 1)
XCTAssertEqual(channel.internal.presence.internalMembers.count, 1)

channel.subscribe { _ in
fail("Shouldn't receive any presence event")
Expand All @@ -581,7 +581,7 @@ class RealtimeClientPresenceTests: XCTestCase {
waitUntil(timeout: testTimeout) { done in
channel.once(.failed) { _ in
expect(channel.internal.presence.members).to(beEmpty())
expect(channel.internal.presence.localMembers).to(beEmpty())
expect(channel.internal.presence.internalMembers).to(beEmpty())
done()
}
AblyTests.queue.async {
Expand Down Expand Up @@ -632,7 +632,7 @@ class RealtimeClientPresenceTests: XCTestCase {
}

XCTAssertEqual(channel.internal.presence.members.count, 1)
XCTAssertEqual(channel.internal.presence.localMembers.count, 1)
XCTAssertEqual(channel.internal.presence.internalMembers.count, 1)

channel.subscribe { _ in
fail("Shouldn't receive any presence event")
Expand All @@ -642,7 +642,7 @@ class RealtimeClientPresenceTests: XCTestCase {
waitUntil(timeout: testTimeout) { done in
channel.once(.detached) { _ in
expect(channel.internal.presence.members).to(beEmpty())
expect(channel.internal.presence.localMembers).to(beEmpty())
expect(channel.internal.presence.internalMembers).to(beEmpty())
done()
}
channel.detach()
Expand Down Expand Up @@ -822,7 +822,7 @@ class RealtimeClientPresenceTests: XCTestCase {
mainChannel.once(.suspended) { _ in
mainChannel.internalSync { _internal in
XCTAssertEqual(_internal.presence.members.count, 4) // "main", "user1", "user2", "leaves"
XCTAssertEqual(_internal.presence.localMembers.count, 1) // "main"
XCTAssertEqual(_internal.presence.internalMembers.count, 1) // "main"
}
leavesChannel.presence.leave(nil) { error in
XCTAssertNil(error)
Expand Down Expand Up @@ -865,7 +865,7 @@ class RealtimeClientPresenceTests: XCTestCase {

mainChannel.internalSync { _internal in
XCTAssertEqual(_internal.presence.members.count, 3) // "main", "user1", "user2"
XCTAssertEqual(_internal.presence.localMembers.count, 1) // "main"
XCTAssertEqual(_internal.presence.internalMembers.count, 1) // "main"
}
}

Expand Down Expand Up @@ -2622,7 +2622,7 @@ class RealtimeClientPresenceTests: XCTestCase {
XCTAssertEqual(presence.action, ARTPresenceAction.enter)
XCTAssertEqual(presence.connectionId, currentConnectionId)
XCTAssertEqual(channelA.internal.presence.members.count, 1)
XCTAssertEqual(channelA.internal.presence.localMembers.count, 1)
XCTAssertEqual(channelA.internal.presence.internalMembers.count, 1)
channelA.presence.unsubscribe()
partialDone()
}
Expand All @@ -2633,7 +2633,7 @@ class RealtimeClientPresenceTests: XCTestCase {
expect(presence.action).to(equal(ARTPresenceAction.enter) || equal(ARTPresenceAction.present))
XCTAssertNotEqual(presence.connectionId, currentConnectionId)
XCTAssertEqual(channelB.internal.presence.members.count, 1)
XCTAssertEqual(channelB.internal.presence.localMembers.count, 0)
XCTAssertEqual(channelB.internal.presence.internalMembers.count, 0)
channelB.presence.unsubscribe()
partialDone()
}
Expand All @@ -2649,7 +2649,7 @@ class RealtimeClientPresenceTests: XCTestCase {
XCTAssertEqual(presence.action, ARTPresenceAction.enter)
XCTAssertNotEqual(presence.connectionId, currentConnectionId)
XCTAssertEqual(channelA.internal.presence.members.count, 2)
XCTAssertEqual(channelA.internal.presence.localMembers.count, 1)
XCTAssertEqual(channelA.internal.presence.internalMembers.count, 1)
channelA.presence.unsubscribe()
partialDone()
}
Expand All @@ -2660,7 +2660,7 @@ class RealtimeClientPresenceTests: XCTestCase {
XCTAssertEqual(presence.action, ARTPresenceAction.enter)
XCTAssertEqual(presence.connectionId, currentConnectionId)
XCTAssertEqual(channelB.internal.presence.members.count, 2)
XCTAssertEqual(channelB.internal.presence.localMembers.count, 1)
XCTAssertEqual(channelB.internal.presence.internalMembers.count, 1)
channelB.presence.unsubscribe()
partialDone()
}
Expand All @@ -2678,7 +2678,7 @@ class RealtimeClientPresenceTests: XCTestCase {
XCTAssertEqual(presence.data as? String, "hello")
XCTAssertNotEqual(presence.connectionId, currentConnectionId)
XCTAssertEqual(channelA.internal.presence.members.count, 2)
XCTAssertEqual(channelA.internal.presence.localMembers.count, 1)
XCTAssertEqual(channelA.internal.presence.internalMembers.count, 1)
channelA.presence.unsubscribe()
partialDone()
}
Expand All @@ -2690,7 +2690,7 @@ class RealtimeClientPresenceTests: XCTestCase {
XCTAssertEqual(presence.data as? String, "hello")
XCTAssertEqual(presence.connectionId, currentConnectionId)
XCTAssertEqual(channelB.internal.presence.members.count, 2)
XCTAssertEqual(channelB.internal.presence.localMembers.count, 1)
XCTAssertEqual(channelB.internal.presence.internalMembers.count, 1)
channelB.presence.unsubscribe()
partialDone()
}
Expand All @@ -2708,7 +2708,7 @@ class RealtimeClientPresenceTests: XCTestCase {
XCTAssertEqual(presence.data as? String, "bye")
XCTAssertNotEqual(presence.connectionId, currentConnectionId)
XCTAssertEqual(channelA.internal.presence.members.count, 1)
XCTAssertEqual(channelA.internal.presence.localMembers.count, 1)
XCTAssertEqual(channelA.internal.presence.internalMembers.count, 1)
channelA.presence.unsubscribe()
partialDone()
}
Expand All @@ -2720,7 +2720,7 @@ class RealtimeClientPresenceTests: XCTestCase {
XCTAssertEqual(presence.data as? String, "bye")
XCTAssertEqual(presence.connectionId, currentConnectionId)
XCTAssertEqual(channelB.internal.presence.members.count, 1)
XCTAssertEqual(channelB.internal.presence.localMembers.count, 0)
XCTAssertEqual(channelB.internal.presence.internalMembers.count, 0)
channelB.presence.unsubscribe()
partialDone()
}
Expand Down Expand Up @@ -2760,7 +2760,7 @@ class RealtimeClientPresenceTests: XCTestCase {
XCTFail("Expected members to be non-nil")
}
XCTAssertEqual(channel.internal.presence.members.count, 1)
XCTAssertEqual(channel.internal.presence.localMembers.count, 1)
XCTAssertEqual(channel.internal.presence.internalMembers.count, 1)
done()
}
}
Expand Down Expand Up @@ -2793,7 +2793,7 @@ class RealtimeClientPresenceTests: XCTestCase {
}

channel.internalSync { _internal in
XCTAssertEqual(_internal.presence.localMembers.count, 1)
XCTAssertEqual(_internal.presence.internalMembers.count, 1)
}

let additionalMember = ARTPresenceMessage(
Expand All @@ -2805,15 +2805,15 @@ class RealtimeClientPresenceTests: XCTestCase {

// Inject an additional member into the myMember set, then force a suspended state
client.simulateSuspended(beforeSuspension: { done in
channel.internal.presence.localMembers[additionalMember.clientId!] = additionalMember
channel.internal.presence.internalMembers[additionalMember.clientId!] = additionalMember
done()
})
expect(client.connection.state).toEventually(equal(.suspended), timeout: testTimeout)

XCTAssertEqual(channel.internal.presence.localMembers.count, 2)
XCTAssertEqual(channel.internal.presence.internalMembers.count, 2)

channel.internalSync { _internal in
XCTAssertEqual(_internal.presence.localMembers.count, 2)
XCTAssertEqual(_internal.presence.internalMembers.count, 2)
}

waitUntil(timeout: testTimeout) { done in
Expand All @@ -2828,7 +2828,7 @@ class RealtimeClientPresenceTests: XCTestCase {
channel.internal.presence.onceSyncEnds { _ in
// Should remove the "two" member that was added manually because the connectionId
// doesn't match and it's not synthesized, it will be re-entered.
XCTAssertEqual(channel.internal.presence.localMembers.count, 1)
XCTAssertEqual(channel.internal.presence.internalMembers.count, 1)

partialDone()
}
Expand Down Expand Up @@ -2902,7 +2902,7 @@ class RealtimeClientPresenceTests: XCTestCase {
}
channel.presence.unsubscribe()

expect(channel.internal.presence.localMembers).to(haveCount(2))
expect(channel.internal.presence.internalMembers).to(haveCount(2))

// All pending messages should complete (receive ACK or NACK) before disconnect for valid count of transport.protocolMessagesSent
client.waitForPendingMessages()
Expand All @@ -2913,7 +2913,7 @@ class RealtimeClientPresenceTests: XCTestCase {
// RTP17i

expect(channel.state).toEventually(equal(ARTRealtimeChannelState.attached), timeout: testTimeout)
expect(channel.internal.presence.localMembers).to(haveCount(2))
expect(channel.internal.presence.internalMembers).to(haveCount(2))

let newTransport = client.internal.transport as! TestProxyTransport
expect(newTransport).toNot(beIdenticalTo(transport))
Expand Down Expand Up @@ -2972,7 +2972,7 @@ class RealtimeClientPresenceTests: XCTestCase {
waitUntil(timeout: .seconds(20)) { done in
channel.internal.presence.onceSyncEnds { _ in
// Synthesized leave
expect(channel.internal.presence.localMembers).to(beEmpty())
expect(channel.internal.presence.internalMembers).to(beEmpty())
done()
}
client.internal.onDisconnected()
Expand Down

0 comments on commit b301249

Please sign in to comment.