-
Notifications
You must be signed in to change notification settings - Fork 26
Commit
I've split presence `onAttached:` into two parts, because: with this variance: ``` [_attachedEventEmitter emit:nil with:nil]; [self.presence onAttached:message fromState:state]; ``` the test "test__105__Presence__get..." fails because it needs sync to begin (within `presence onAttached:`) before attach event emitted, otherwise the logic inside `channel.presence.get { ... }` takes another path and calls callback without an error. with opposite order: ``` [self.presence onAttached:message fromState:state]; [_attachedEventEmitter emit:nil with:nil]; ``` the test "test__020__Presence__Channel..." fails because it sends pending presence messages before the `detach` call has an oportunity to fail those messages. So those tests are kinda mutually exclusive.
- Loading branch information
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -13,6 +13,8 @@ | |
#import "ARTEventEmitter+Private.h" | ||
#import "ARTDataEncoder.h" | ||
#import "ARTBaseMessage+Private.h" | ||
#import "ARTProtocolMessage+Private.h" | ||
#import "ARTEventEmitter+Private.h" | ||
|
||
#pragma mark - ARTRealtimePresenceQuery | ||
|
||
|
@@ -662,17 +664,6 @@ - (void)broadcast:(ARTPresenceMessage *)pm { | |
[_eventEmitter emit:[ARTEvent newWithPresenceAction:pm.action] with:pm]; | ||
} | ||
|
||
- (void)reenterLocalMembersWithMemberCallback:(ARTPresenceMessageErrorCallback)callback { | ||
ARTLogDebug(self.logger, @"%p reentering local members", self); | ||
for (ARTPresenceMessage *member in [self.localMembers allValues]) { | ||
[self enterWithPresenceMessageId:member.id clientId:member.clientId data:member.data callback:^(ARTErrorInfo *error) { | ||
callback(member, error); | ||
}]; | ||
ARTLogDebug(self.logger, @"RT:%p C:%p (%@) re-entering local member \"%@\"", _realtime, _channel, _channel.name, member.memberKey); | ||
} | ||
[self cleanUpAbsentMembers]; | ||
} | ||
|
||
- (void)sync { | ||
[self sync:nil]; | ||
} | ||
|
@@ -722,6 +713,30 @@ - (void)sync:(ARTCallback)callback { | |
} ackCallback:nil]; | ||
} | ||
|
||
- (void)beforeAttached:(ARTProtocolMessage *)message { | ||
if (message.hasPresence) { | ||
[self startSync]; | ||
} | ||
else { | ||
// RTP1 - when an ATTACHED message is received without a HAS_PRESENCE flag, reset PresenceMap | ||
[self startSync]; | ||
[self endSync]; | ||
ARTLogDebug(self.logger, @"R:%p C:%p (%@) PresenceMap has been reset", _realtime, self, _channel.name); | ||
} | ||
} | ||
|
||
- (void)afterAttached:(ARTProtocolMessage *)message fromState:(ARTRealtimeChannelState)state { | ||
if (state == ARTRealtimeChannelAttached) { | ||
This comment has been minimized.
Sorry, something went wrong.
This comment has been minimized.
Sorry, something went wrong.
This comment has been minimized.
Sorry, something went wrong.
maratal
Author
Collaborator
|
||
if (!message.resumed) { // RTL12 | ||
[self reenterLocalMembers]; // RTP17i | ||
} | ||
} | ||
else { | ||
[self sendPendingPresence]; | ||
[self reenterLocalMembers]; // RTP17i | ||
} | ||
} | ||
|
||
- (void)onMessage:(ARTProtocolMessage *)message { | ||
int i = 0; | ||
for (ARTPresenceMessage *p in message.presence) { | ||
|
@@ -762,12 +777,7 @@ - (void)onSync:(ARTProtocolMessage *)message { | |
ARTLogDebug(self.logger, @"RT:%p C:%p (%@) PresenceMap sync is in progress", _realtime, _channel, _channel.name); | ||
} | ||
|
||
for (int i = 0; i < [message.presence count]; i++) { | ||
ARTPresenceMessage *presence = [message.presence objectAtIndex:i]; | ||
if ([self add:presence]) { | ||
[self broadcast:presence]; | ||
} | ||
} | ||
[self onMessage:message]; | ||
|
||
if ([_channel isLastChannelSerial:message.channelSerial]) { | ||
[self endSync]; | ||
|
@@ -788,6 +798,28 @@ - (void)didRemovedMemberNoLongerPresent:(ARTPresenceMessage *)pm { | |
ARTLogDebug(self.logger, @"RT:%p C:%p (%@) member \"%@\" no longer present", _realtime, _channel, _channel.name, pm.memberKey); | ||
} | ||
|
||
- (void)reenterLocalMembers { | ||
ARTLogDebug(self.logger, @"%p reentering local members", self); | ||
for (ARTPresenceMessage *member in [self.localMembers 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]; | ||
ARTErrorInfo *reenterError = [ARTErrorInfo createWithCode:ARTErrorUnableToAutomaticallyReEnterPresenceChannel message:message]; | ||
ARTChannelStateChange *stateChange = [[ARTChannelStateChange alloc] initWithCurrent:self->_channel.state_nosync previous:self->_channel.state_nosync event:ARTChannelEventUpdate reason:reenterError resumed:true]; // RTP17e | ||
|
||
[self->_channel emit:stateChange.event with:stateChange]; | ||
|
||
ARTLogWarn(self.logger, @"RT:%p C:%p (%@) Re-entering member \"%@\" is failed with code %ld (%@)", self->_realtime, self->_channel, self->_channel.name, member.memberKey, (long)error.code, error.message); | ||
} | ||
else { | ||
ARTLogDebug(self.logger, @"RT:%p C:%p (%@) re-entered local member \"%@\"", self->_realtime, self->_channel, self->_channel.name, member.memberKey); | ||
} | ||
}]; | ||
ARTLogDebug(self.logger, @"RT:%p C:%p (%@) re-entering local member \"%@\"", _realtime, _channel, _channel.name, member.memberKey); | ||
} | ||
[self cleanUpAbsentMembers]; | ||
} | ||
|
||
#pragma mark - Presence Map | ||
|
||
- (NSDictionary<NSString *, ARTPresenceMessage *> *)members { | ||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -12,18 +12,18 @@ NS_ASSUME_NONNULL_BEGIN | |
- (void)_unsubscribe; | ||
- (BOOL)syncComplete_nosync; | ||
|
||
- (void)sendPendingPresence; | ||
- (void)failPendingPresence:(ARTStatus *)status; | ||
|
||
- (void)broadcast:(ARTPresenceMessage *)pm; | ||
- (void)reenterLocalMembersWithMemberCallback:(ARTPresenceMessageErrorCallback)callback; | ||
|
||
- (void)sync; | ||
- (void)sync:(nullable ARTCallback)callback; | ||
|
||
- (void)onMessage:(ARTProtocolMessage *)message; | ||
- (void)onSync:(ARTProtocolMessage *)message; | ||
|
||
- (void)beforeAttached:(ARTProtocolMessage *)message; | ||
This comment has been minimized.
Sorry, something went wrong.
sacOO7
Contributor
|
||
- (void)afterAttached:(ARTProtocolMessage *)message fromState:(ARTRealtimeChannelState)state; | ||
|
||
@property (nonatomic) dispatch_queue_t queue; | ||
@property (readwrite, nonatomic) ARTPresenceAction lastPresenceAction; | ||
@property (readonly, nonatomic) NSMutableArray<ARTQueuedMessage *> *pendingPresence; | ||
|
if (state == ARTRealtimeChannelAttached)
will always be true in case ofafterAttached
. Can we implement it like we do inably-go
. I don;t think we need to maintain two different methodsbeforeAttached
andafterAttached
as such.