Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions SocketIO/Source/SIOSocket.h
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,7 @@ typedef NSArray SIOParameterArray;
// Emitters
- (void)emit:(NSString *)event;
- (void)emit:(NSString *)event args:(SIOParameterArray *)args;
- (void)emit:(NSString *)event args:(SIOParameterArray *)args ack:(void (^)(SIOParameterArray *))ackCallback;

- (void)close;

Expand Down
24 changes: 24 additions & 0 deletions SocketIO/Source/SIOSocket.m
Original file line number Diff line number Diff line change
Expand Up @@ -198,6 +198,10 @@ - (void)emit:(NSString *)event {
}

- (void)emit:(NSString *)event args:(SIOParameterArray *)args {
[self emit: event args: args ack: nil];
}

- (void)emit:(NSString *)event args:(SIOParameterArray *)args ack:(void (^)(SIOParameterArray *))ackCallback {
NSMutableArray *arguments = [NSMutableArray arrayWithObject: [NSString stringWithFormat: @"'%@'", event]];
for (id arg in args) {
if ([arg isKindOfClass: [NSNull class]]) {
Expand All @@ -221,6 +225,26 @@ - (void)emit:(NSString *)event args:(SIOParameterArray *)args {
}
}
}

if (ackCallback) {
u_int32_t random = arc4random();
NSString *ackName = [NSString stringWithFormat:@"ack_callback_%u", random];
self.javascriptContext[ackName] = ^() {
NSMutableArray *arguments = [NSMutableArray array];
for (JSValue *object in [JSContext currentArguments]) {
if ([object toObject]) {
[arguments addObject:[object toObject]];
}
}
dispatch_async(dispatch_get_main_queue(), ^{
ackCallback(arguments);
});
dispatch_after(DISPATCH_TIME_NOW, dispatch_get_main_queue(), ^{
self.javascriptContext[ackName] = nil;
});
};
[arguments addObject:ackName];
}

NSString* script = [NSString stringWithFormat: @"objc_socket.emit(%@);", [arguments componentsJoinedByString: @", "]];
[self performSelector:@selector(evaluateScript:) onThread:_thread withObject:[script copy] waitUntilDone:NO];
Expand Down
4 changes: 2 additions & 2 deletions SocketIO/Source/socket.io.js.h

Large diffs are not rendered by default.