Skip to content

Commit

Permalink
Refactoring to ably-go impl.
Browse files Browse the repository at this point in the history
  • Loading branch information
maratal committed Mar 19, 2024
1 parent 11a239b commit 674eea5
Show file tree
Hide file tree
Showing 5 changed files with 64 additions and 48 deletions.
4 changes: 0 additions & 4 deletions Source/ARTPresenceMessage.m
Original file line number Diff line number Diff line change
Expand Up @@ -74,10 +74,6 @@ - (NSInteger)indexFromId {
}

- (BOOL)isNewerThan:(ARTPresenceMessage *)existing {
if (existing == nil) {
return YES;
}

if ([self isSynthesized] || [existing isSynthesized]) {
return !self.timestamp || [existing.timestamp timeIntervalSince1970] <= [self.timestamp timeIntervalSince1970];
}
Expand Down
94 changes: 56 additions & 38 deletions Source/ARTRealtimePresence.m
Original file line number Diff line number Diff line change
Expand Up @@ -777,27 +777,42 @@ - (void)reenterInternalMembers {
}

- (void)processMember:(ARTPresenceMessage *)message {
BOOL memberUpdated = false;
ARTPresenceMessage *existing = [_members objectForKey:message.memberKey];
if ([message isNewerThan:existing]) {
ARTPresenceMessage *messageCopy = [message copy];
ARTPresenceMessage *messageCopy = [message copy];
// Internal member
if ([message.connectionId isEqualToString:self.connectionId]) {
switch (message.action) {
case ARTPresenceEnter:
case ARTPresenceUpdate:
case ARTPresencePresent:
[self addMember:messageCopy];
memberUpdated = true;
messageCopy.action = ARTPresencePresent;
[self addInternalMember:messageCopy withSessionId:1];
break;
case ARTPresenceLeave:
if (existing) {
[self removeMember:messageCopy];
memberUpdated = true;
if (!message.isSynthesized) {
[self removeInternalMember:messageCopy];
}
break;
default:
break;
}
}

BOOL memberUpdated = false;
switch (message.action) {
case ARTPresenceEnter:
case ARTPresenceUpdate:
case ARTPresencePresent:
messageCopy.action = ARTPresencePresent;
memberUpdated = [self addMember:messageCopy withSessionId:1];
break;
case ARTPresenceLeave:
messageCopy.action = ARTPresenceAbsent; // RTP2f
memberUpdated = [self removeMember:messageCopy];
break;
default:
break;
}

if (memberUpdated) {
[self broadcast:message];
}
Expand All @@ -806,49 +821,52 @@ - (void)processMember:(ARTPresenceMessage *)message {
}
}

- (void)addMember:(ARTPresenceMessage *)message {
[self addMember:message withSessionId:1];
}

- (void)addMember:(ARTPresenceMessage *)message withSessionId:(NSUInteger)sessionId {
message.action = ARTPresencePresent;
- (BOOL)addMember:(ARTPresenceMessage *)message withSessionId:(NSUInteger)sessionId {
ARTPresenceMessage *existing = [_members objectForKey:message.memberKey];
if (existing && [existing isNewerThan:message]) {
return false;
}
message.syncSessionId = sessionId;
_members[message.memberKey] = message;
// Internal member
if ([message.connectionId isEqualToString:self.connectionId]) {
_internalMembers[message.clientId] = message;
ARTLogDebug(_logger, @"local member %@ with action %@ has been added", message.memberKey, ARTPresenceActionToStr(message.action).uppercaseString);
}
return true;
}

- (void)removeMember:(ARTPresenceMessage *)message {
[self removeMember:message force:false];
- (BOOL)addInternalMember:(ARTPresenceMessage *)message withSessionId:(NSUInteger)sessionId {
ARTPresenceMessage *existing = [_internalMembers objectForKey:message.clientId];
if (existing && [existing isNewerThan:message]) {
return false;
}
message.syncSessionId = sessionId;
_internalMembers[message.clientId] = message;
ARTLogDebug(_logger, @"local member %@ with action %@ has been added", message.memberKey, ARTPresenceActionToStr(message.action).uppercaseString);
return true;
}

- (void)removeMember:(ARTPresenceMessage *)message force:(BOOL)force {
if ([message.connectionId isEqualToString:self.connectionId] && !message.isSynthesized) {
[_internalMembers removeObjectForKey:message.clientId];
- (BOOL)removeMember:(ARTPresenceMessage *)message {
ARTPresenceMessage *existing = [_members objectForKey:message.clientId];
if (existing && [existing isNewerThan:message]) {
return false;
}
[_members removeObjectForKey:message.memberKey];
return true;
}

const BOOL syncInProgress = self.syncInProgress;
if (!force && syncInProgress) {
ARTLogDebug(_logger, @"%p \"%@\" should be removed after sync ends (syncInProgress=%d)", self, message.clientId, syncInProgress);
// Should be removed after Sync ends
[self addMember:message withSessionId:0];
message.action = ARTPresenceAbsent;
}
else {
[_members removeObjectForKey:message.memberKey];
- (BOOL)removeInternalMember:(ARTPresenceMessage *)message {
ARTPresenceMessage *existing = [_internalMembers objectForKey:message.clientId];
if (existing && [existing isNewerThan:message]) {
return false;
}
[_internalMembers removeObjectForKey:message.clientId];
return true;
}

- (void)cleanUpAbsentMembers {
ARTLogDebug(_logger, @"%p cleaning up absent members...", self);
NSSet<NSString *> *filteredMembers = [_members keysOfEntriesPassingTest:^BOOL(NSString *key, ARTPresenceMessage *message, BOOL *stop) {
NSSet<NSString *> *absentMembers = [_members keysOfEntriesPassingTest:^BOOL(NSString *key, ARTPresenceMessage *message, BOOL *stop) {
return message.action == ARTPresenceAbsent;
}];
for (NSString *key in filteredMembers) {
[self removeMember:[_members objectForKey:key] force:true];
for (NSString *key in absentMembers) {
[self removeMember:[_members objectForKey:key]];
}
}

Expand All @@ -864,7 +882,7 @@ - (void)leaveMembersNotPresentInSync {
if (member.syncSessionId == 0) {
// Handle members that have not been added or updated in the PresenceMap during the sync process
ARTPresenceMessage *leave = [member copy];
[self removeMember:member force:true];
[self removeMember:member];
[self didRemovedMemberNoLongerPresent:leave];
}
}
Expand Down
8 changes: 5 additions & 3 deletions Source/PrivateHeaders/Ably/ARTRealtimePresence+Private.h
Original file line number Diff line number Diff line change
Expand Up @@ -59,9 +59,11 @@ NS_ASSUME_NONNULL_BEGIN
- (void)onceSyncEnds:(void (^)(NSArray<ARTPresenceMessage *> *))callback;
- (void)onceSyncFails:(ARTCallback)callback;

- (void)addMember:(ARTPresenceMessage *)message;
- (void)addMember:(ARTPresenceMessage *)message withSessionId:(NSUInteger)sessionId;
- (void)removeMember:(ARTPresenceMessage *)message;
- (BOOL)addMember:(ARTPresenceMessage *)message withSessionId:(NSUInteger)sessionId;
- (BOOL)addInternalMember:(ARTPresenceMessage *)message withSessionId:(NSUInteger)sessionId;

- (BOOL)removeMember:(ARTPresenceMessage *)message;
- (BOOL)removeInternalMember:(ARTPresenceMessage *)message;

- (void)cleanUpAbsentMembers;

Expand Down
2 changes: 1 addition & 1 deletion Source/include/Ably/ARTPresenceMessage.h
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,7 @@ NS_ASSUME_NONNULL_BEGIN
- (BOOL)isEqualToPresenceMessage:(nonnull ARTPresenceMessage *)presence;

/// :nodoc:
- (BOOL)isNewerThan:(nullable ARTPresenceMessage *)latest __attribute__((warn_unused_result));
- (BOOL)isNewerThan:(ARTPresenceMessage *)latest __attribute__((warn_unused_result));

@end

Expand Down
4 changes: 2 additions & 2 deletions Test/Tests/RealtimeClientPresenceTests.swift
Original file line number Diff line number Diff line change
Expand Up @@ -1955,7 +1955,7 @@ class RealtimeClientPresenceTests: XCTestCase {
}

hook = channel.internal.presence.testSuite_getArgument(
from: #selector(ARTRealtimePresenceInternal.addMember(_:withSessionId:)),
from: #selector(ARTRealtimePresenceInternal.processMember(_:)),
at: 0
) { arg in
let m = arg as? ARTPresenceMessage
Expand Down Expand Up @@ -3578,7 +3578,7 @@ class RealtimeClientPresenceTests: XCTestCase {
for i in 0 ..< 3 {
let msg = ARTPresenceMessage(clientId: "client\(i)", action: .present, connectionId: "foo", id: "foo:0:0")
msgs[msg.clientId!] = msg
channel.internal.presence.addMember(msg)
channel.internal.presence.processMember(msg)
}

channel.presence.get(getParams) { result, err in
Expand Down

0 comments on commit 674eea5

Please sign in to comment.