blob: ad7a6c2bf2b4d409ef6e6e159cbe4bb254ff554d [file] [log] [blame]
tkchin@webrtc.org3a63a3c2015-01-06 07:21:34 +00001/*
Donald E Curtisa8736442015-08-05 15:48:13 -07002 * Copyright 2014 The WebRTC Project Authors. All rights reserved.
tkchin@webrtc.org3a63a3c2015-01-06 07:21:34 +00003 *
Donald E Curtisa8736442015-08-05 15:48:13 -07004 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree.
tkchin@webrtc.org3a63a3c2015-01-06 07:21:34 +00009 */
10
11#import "ARDAppEngineClient.h"
12
tkchin9eeb6242016-04-27 01:54:20 -070013#import "WebRTC/RTCLogging.h"
tkchinc3f46a92015-07-23 12:50:55 -070014
tkchin@webrtc.org36401ab2015-01-27 21:34:39 +000015#import "ARDJoinResponse.h"
tkchin@webrtc.org3a63a3c2015-01-06 07:21:34 +000016#import "ARDMessageResponse.h"
tkchin@webrtc.org3a63a3c2015-01-06 07:21:34 +000017#import "ARDSignalingMessage.h"
18#import "ARDUtilities.h"
19
20// TODO(tkchin): move these to a configuration object.
tkchin@webrtc.org8cc47e92015-03-18 23:38:04 +000021static NSString * const kARDRoomServerHostUrl =
jansson84f9b982016-05-19 02:43:33 -070022 @"https://appr.tc";
tkchin@webrtc.org8cc47e92015-03-18 23:38:04 +000023static NSString * const kARDRoomServerJoinFormat =
jansson84f9b982016-05-19 02:43:33 -070024 @"https://appr.tc/join/%@";
haysc913e6452015-10-02 11:44:03 -070025static NSString * const kARDRoomServerJoinFormatLoopback =
jansson84f9b982016-05-19 02:43:33 -070026 @"https://appr.tc/join/%@?debug=loopback";
tkchin@webrtc.org8cc47e92015-03-18 23:38:04 +000027static NSString * const kARDRoomServerMessageFormat =
jansson84f9b982016-05-19 02:43:33 -070028 @"https://appr.tc/message/%@/%@";
tkchin@webrtc.org8cc47e92015-03-18 23:38:04 +000029static NSString * const kARDRoomServerLeaveFormat =
jansson84f9b982016-05-19 02:43:33 -070030 @"https://appr.tc/leave/%@/%@";
tkchin@webrtc.org3a63a3c2015-01-06 07:21:34 +000031
tkchin@webrtc.org8cc47e92015-03-18 23:38:04 +000032static NSString * const kARDAppEngineClientErrorDomain = @"ARDAppEngineClient";
33static NSInteger const kARDAppEngineClientErrorBadResponse = -1;
tkchin@webrtc.org3a63a3c2015-01-06 07:21:34 +000034
35@implementation ARDAppEngineClient
36
37#pragma mark - ARDRoomServerClient
38
tkchin@webrtc.org36401ab2015-01-27 21:34:39 +000039- (void)joinRoomWithRoomId:(NSString *)roomId
haysc913e6452015-10-02 11:44:03 -070040 isLoopback:(BOOL)isLoopback
tkchin@webrtc.org36401ab2015-01-27 21:34:39 +000041 completionHandler:(void (^)(ARDJoinResponse *response,
42 NSError *error))completionHandler {
tkchin@webrtc.org3a63a3c2015-01-06 07:21:34 +000043 NSParameterAssert(roomId.length);
44
haysc913e6452015-10-02 11:44:03 -070045 NSString *urlString = nil;
46 if (isLoopback) {
47 urlString =
48 [NSString stringWithFormat:kARDRoomServerJoinFormatLoopback, roomId];
49 } else {
50 urlString =
51 [NSString stringWithFormat:kARDRoomServerJoinFormat, roomId];
52 }
53
tkchin@webrtc.org3a63a3c2015-01-06 07:21:34 +000054 NSURL *roomURL = [NSURL URLWithString:urlString];
tkchinc3f46a92015-07-23 12:50:55 -070055 RTCLog(@"Joining room:%@ on room server.", roomId);
tkchin@webrtc.org3a63a3c2015-01-06 07:21:34 +000056 NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:roomURL];
57 request.HTTPMethod = @"POST";
58 __weak ARDAppEngineClient *weakSelf = self;
59 [NSURLConnection sendAsyncRequest:request
kthelgasonb13237b2017-03-30 04:56:05 -070060 completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) {
61 ARDAppEngineClient *strongSelf = weakSelf;
62 if (error) {
63 if (completionHandler) {
64 completionHandler(nil, error);
65 }
66 return;
67 }
68 ARDJoinResponse *joinResponse = [ARDJoinResponse responseFromJSONData:data];
69 if (!joinResponse) {
70 if (completionHandler) {
71 NSError *error = [[self class] badResponseError];
72 completionHandler(nil, error);
73 }
74 return;
75 }
76 if (completionHandler) {
77 completionHandler(joinResponse, nil);
78 }
79 }];
tkchin@webrtc.org3a63a3c2015-01-06 07:21:34 +000080}
81
82- (void)sendMessage:(ARDSignalingMessage *)message
83 forRoomId:(NSString *)roomId
84 clientId:(NSString *)clientId
85 completionHandler:(void (^)(ARDMessageResponse *response,
86 NSError *error))completionHandler {
87 NSParameterAssert(message);
88 NSParameterAssert(roomId.length);
89 NSParameterAssert(clientId.length);
90
91 NSData *data = [message JSONData];
92 NSString *urlString =
93 [NSString stringWithFormat:
94 kARDRoomServerMessageFormat, roomId, clientId];
95 NSURL *url = [NSURL URLWithString:urlString];
tkchinc3f46a92015-07-23 12:50:55 -070096 RTCLog(@"C->RS POST: %@", message);
tkchin@webrtc.org3a63a3c2015-01-06 07:21:34 +000097 NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
98 request.HTTPMethod = @"POST";
99 request.HTTPBody = data;
100 __weak ARDAppEngineClient *weakSelf = self;
101 [NSURLConnection sendAsyncRequest:request
102 completionHandler:^(NSURLResponse *response,
103 NSData *data,
104 NSError *error) {
105 ARDAppEngineClient *strongSelf = weakSelf;
106 if (error) {
107 if (completionHandler) {
108 completionHandler(nil, error);
109 }
110 return;
111 }
112 ARDMessageResponse *messageResponse =
113 [ARDMessageResponse responseFromJSONData:data];
114 if (!messageResponse) {
115 if (completionHandler) {
116 NSError *error = [[self class] badResponseError];
117 completionHandler(nil, error);
118 }
119 return;
120 }
121 if (completionHandler) {
122 completionHandler(messageResponse, nil);
123 }
124 }];
125}
126
tkchin@webrtc.org36401ab2015-01-27 21:34:39 +0000127- (void)leaveRoomWithRoomId:(NSString *)roomId
tkchin@webrtc.org3a63a3c2015-01-06 07:21:34 +0000128 clientId:(NSString *)clientId
129 completionHandler:(void (^)(NSError *error))completionHandler {
130 NSParameterAssert(roomId.length);
131 NSParameterAssert(clientId.length);
132
133 NSString *urlString =
tkchin@webrtc.org36401ab2015-01-27 21:34:39 +0000134 [NSString stringWithFormat:kARDRoomServerLeaveFormat, roomId, clientId];
tkchin@webrtc.org3a63a3c2015-01-06 07:21:34 +0000135 NSURL *url = [NSURL URLWithString:urlString];
Chuck Hayscaae5d42015-03-25 12:59:52 -0700136 NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
137 request.HTTPMethod = @"POST";
kthelgasonb13237b2017-03-30 04:56:05 -0700138
139 RTCLog(@"C->RS: BYE");
140 __block NSError *error = nil;
141
tkchin@webrtc.org36401ab2015-01-27 21:34:39 +0000142 // We want a synchronous request so that we know that we've left the room on
143 // room server before we do any further work.
kthelgasonb13237b2017-03-30 04:56:05 -0700144 dispatch_semaphore_t sem = dispatch_semaphore_create(0);
145 [NSURLConnection sendAsyncRequest:request
146 completionHandler:^(NSURLResponse *response, NSData *data, NSError *e) {
147 if (e) {
148 error = e;
149 }
150 dispatch_semaphore_signal(sem);
151 }];
152
153 dispatch_semaphore_wait(sem, DISPATCH_TIME_FOREVER);
tkchin@webrtc.org3a63a3c2015-01-06 07:21:34 +0000154 if (error) {
kthelgasonb13237b2017-03-30 04:56:05 -0700155 RTCLogError(@"Error leaving room %@ on room server: %@", roomId, error.localizedDescription);
tkchin@webrtc.org3a63a3c2015-01-06 07:21:34 +0000156 if (completionHandler) {
157 completionHandler(error);
158 }
159 return;
160 }
tkchinc3f46a92015-07-23 12:50:55 -0700161 RTCLog(@"Left room:%@ on room server.", roomId);
tkchin@webrtc.org3a63a3c2015-01-06 07:21:34 +0000162 if (completionHandler) {
163 completionHandler(nil);
164 }
165}
166
167#pragma mark - Private
168
169+ (NSError *)badResponseError {
170 NSError *error =
171 [[NSError alloc] initWithDomain:kARDAppEngineClientErrorDomain
172 code:kARDAppEngineClientErrorBadResponse
173 userInfo:@{
174 NSLocalizedDescriptionKey: @"Error parsing response.",
175 }];
176 return error;
177}
178
179@end