blob: 7d8a185f6d7a3ffdd017bb27ecefdaef40497268 [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
hjon79858f82016-03-13 22:08:26 -070013#import "webrtc/base/objc/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 =
tkchin@webrtc.org3a63a3c2015-01-06 07:21:34 +000022 @"https://apprtc.appspot.com";
tkchin@webrtc.org8cc47e92015-03-18 23:38:04 +000023static NSString * const kARDRoomServerJoinFormat =
tkchin@webrtc.org36401ab2015-01-27 21:34:39 +000024 @"https://apprtc.appspot.com/join/%@";
haysc913e6452015-10-02 11:44:03 -070025static NSString * const kARDRoomServerJoinFormatLoopback =
26 @"https://apprtc.appspot.com/join/%@?debug=loopback";
tkchin@webrtc.org8cc47e92015-03-18 23:38:04 +000027static NSString * const kARDRoomServerMessageFormat =
tkchin@webrtc.org3a63a3c2015-01-06 07:21:34 +000028 @"https://apprtc.appspot.com/message/%@/%@";
tkchin@webrtc.org8cc47e92015-03-18 23:38:04 +000029static NSString * const kARDRoomServerLeaveFormat =
tkchin@webrtc.org36401ab2015-01-27 21:34:39 +000030 @"https://apprtc.appspot.com/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
60 completionHandler:^(NSURLResponse *response,
61 NSData *data,
62 NSError *error) {
63 ARDAppEngineClient *strongSelf = weakSelf;
64 if (error) {
65 if (completionHandler) {
66 completionHandler(nil, error);
67 }
68 return;
69 }
tkchin@webrtc.org36401ab2015-01-27 21:34:39 +000070 ARDJoinResponse *joinResponse =
71 [ARDJoinResponse responseFromJSONData:data];
72 if (!joinResponse) {
tkchin@webrtc.org3a63a3c2015-01-06 07:21:34 +000073 if (completionHandler) {
74 NSError *error = [[self class] badResponseError];
75 completionHandler(nil, error);
76 }
77 return;
78 }
79 if (completionHandler) {
tkchin@webrtc.org36401ab2015-01-27 21:34:39 +000080 completionHandler(joinResponse, nil);
tkchin@webrtc.org3a63a3c2015-01-06 07:21:34 +000081 }
82 }];
83}
84
85- (void)sendMessage:(ARDSignalingMessage *)message
86 forRoomId:(NSString *)roomId
87 clientId:(NSString *)clientId
88 completionHandler:(void (^)(ARDMessageResponse *response,
89 NSError *error))completionHandler {
90 NSParameterAssert(message);
91 NSParameterAssert(roomId.length);
92 NSParameterAssert(clientId.length);
93
94 NSData *data = [message JSONData];
95 NSString *urlString =
96 [NSString stringWithFormat:
97 kARDRoomServerMessageFormat, roomId, clientId];
98 NSURL *url = [NSURL URLWithString:urlString];
tkchinc3f46a92015-07-23 12:50:55 -070099 RTCLog(@"C->RS POST: %@", message);
tkchin@webrtc.org3a63a3c2015-01-06 07:21:34 +0000100 NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
101 request.HTTPMethod = @"POST";
102 request.HTTPBody = data;
103 __weak ARDAppEngineClient *weakSelf = self;
104 [NSURLConnection sendAsyncRequest:request
105 completionHandler:^(NSURLResponse *response,
106 NSData *data,
107 NSError *error) {
108 ARDAppEngineClient *strongSelf = weakSelf;
109 if (error) {
110 if (completionHandler) {
111 completionHandler(nil, error);
112 }
113 return;
114 }
115 ARDMessageResponse *messageResponse =
116 [ARDMessageResponse responseFromJSONData:data];
117 if (!messageResponse) {
118 if (completionHandler) {
119 NSError *error = [[self class] badResponseError];
120 completionHandler(nil, error);
121 }
122 return;
123 }
124 if (completionHandler) {
125 completionHandler(messageResponse, nil);
126 }
127 }];
128}
129
tkchin@webrtc.org36401ab2015-01-27 21:34:39 +0000130- (void)leaveRoomWithRoomId:(NSString *)roomId
tkchin@webrtc.org3a63a3c2015-01-06 07:21:34 +0000131 clientId:(NSString *)clientId
132 completionHandler:(void (^)(NSError *error))completionHandler {
133 NSParameterAssert(roomId.length);
134 NSParameterAssert(clientId.length);
135
136 NSString *urlString =
tkchin@webrtc.org36401ab2015-01-27 21:34:39 +0000137 [NSString stringWithFormat:kARDRoomServerLeaveFormat, roomId, clientId];
tkchin@webrtc.org3a63a3c2015-01-06 07:21:34 +0000138 NSURL *url = [NSURL URLWithString:urlString];
Chuck Hayscaae5d42015-03-25 12:59:52 -0700139 NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
140 request.HTTPMethod = @"POST";
tkchin@webrtc.org3a63a3c2015-01-06 07:21:34 +0000141 NSURLResponse *response = nil;
142 NSError *error = nil;
tkchin@webrtc.org36401ab2015-01-27 21:34:39 +0000143 // We want a synchronous request so that we know that we've left the room on
144 // room server before we do any further work.
tkchinc3f46a92015-07-23 12:50:55 -0700145 RTCLog(@"C->RS: BYE");
tkchin@webrtc.org3a63a3c2015-01-06 07:21:34 +0000146 [NSURLConnection sendSynchronousRequest:request
147 returningResponse:&response
148 error:&error];
149 if (error) {
tkchinc3f46a92015-07-23 12:50:55 -0700150 RTCLogError(@"Error leaving room %@ on room server: %@",
tkchin@webrtc.org36401ab2015-01-27 21:34:39 +0000151 roomId, error.localizedDescription);
tkchin@webrtc.org3a63a3c2015-01-06 07:21:34 +0000152 if (completionHandler) {
153 completionHandler(error);
154 }
155 return;
156 }
tkchinc3f46a92015-07-23 12:50:55 -0700157 RTCLog(@"Left room:%@ on room server.", roomId);
tkchin@webrtc.org3a63a3c2015-01-06 07:21:34 +0000158 if (completionHandler) {
159 completionHandler(nil);
160 }
161}
162
163#pragma mark - Private
164
165+ (NSError *)badResponseError {
166 NSError *error =
167 [[NSError alloc] initWithDomain:kARDAppEngineClientErrorDomain
168 code:kARDAppEngineClientErrorBadResponse
169 userInfo:@{
170 NSLocalizedDescriptionKey: @"Error parsing response.",
171 }];
172 return error;
173}
174
175@end