blob: a392c658ab16d2a2450528ef119f769cb74ded5a [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
Anders Carlsson7bca8ca2018-08-30 09:30:29 +020013#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";
tkchin@webrtc.org3a63a3c2015-01-06 07:21:34 +000058 [NSURLConnection sendAsyncRequest:request
kthelgasonb13237b2017-03-30 04:56:05 -070059 completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) {
kthelgasonb13237b2017-03-30 04:56:05 -070060 if (error) {
61 if (completionHandler) {
62 completionHandler(nil, error);
63 }
64 return;
65 }
66 ARDJoinResponse *joinResponse = [ARDJoinResponse responseFromJSONData:data];
67 if (!joinResponse) {
68 if (completionHandler) {
69 NSError *error = [[self class] badResponseError];
70 completionHandler(nil, error);
71 }
72 return;
73 }
74 if (completionHandler) {
75 completionHandler(joinResponse, nil);
76 }
77 }];
tkchin@webrtc.org3a63a3c2015-01-06 07:21:34 +000078}
79
80- (void)sendMessage:(ARDSignalingMessage *)message
81 forRoomId:(NSString *)roomId
82 clientId:(NSString *)clientId
83 completionHandler:(void (^)(ARDMessageResponse *response,
84 NSError *error))completionHandler {
85 NSParameterAssert(message);
86 NSParameterAssert(roomId.length);
87 NSParameterAssert(clientId.length);
88
89 NSData *data = [message JSONData];
90 NSString *urlString =
91 [NSString stringWithFormat:
92 kARDRoomServerMessageFormat, roomId, clientId];
93 NSURL *url = [NSURL URLWithString:urlString];
tkchinc3f46a92015-07-23 12:50:55 -070094 RTCLog(@"C->RS POST: %@", message);
tkchin@webrtc.org3a63a3c2015-01-06 07:21:34 +000095 NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
96 request.HTTPMethod = @"POST";
97 request.HTTPBody = data;
tkchin@webrtc.org3a63a3c2015-01-06 07:21:34 +000098 [NSURLConnection sendAsyncRequest:request
99 completionHandler:^(NSURLResponse *response,
100 NSData *data,
101 NSError *error) {
tkchin@webrtc.org3a63a3c2015-01-06 07:21:34 +0000102 if (error) {
103 if (completionHandler) {
104 completionHandler(nil, error);
105 }
106 return;
107 }
108 ARDMessageResponse *messageResponse =
109 [ARDMessageResponse responseFromJSONData:data];
110 if (!messageResponse) {
111 if (completionHandler) {
112 NSError *error = [[self class] badResponseError];
113 completionHandler(nil, error);
114 }
115 return;
116 }
117 if (completionHandler) {
118 completionHandler(messageResponse, nil);
119 }
120 }];
121}
122
tkchin@webrtc.org36401ab2015-01-27 21:34:39 +0000123- (void)leaveRoomWithRoomId:(NSString *)roomId
tkchin@webrtc.org3a63a3c2015-01-06 07:21:34 +0000124 clientId:(NSString *)clientId
125 completionHandler:(void (^)(NSError *error))completionHandler {
126 NSParameterAssert(roomId.length);
127 NSParameterAssert(clientId.length);
128
129 NSString *urlString =
tkchin@webrtc.org36401ab2015-01-27 21:34:39 +0000130 [NSString stringWithFormat:kARDRoomServerLeaveFormat, roomId, clientId];
tkchin@webrtc.org3a63a3c2015-01-06 07:21:34 +0000131 NSURL *url = [NSURL URLWithString:urlString];
Chuck Hayscaae5d42015-03-25 12:59:52 -0700132 NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
133 request.HTTPMethod = @"POST";
kthelgasonb13237b2017-03-30 04:56:05 -0700134
135 RTCLog(@"C->RS: BYE");
136 __block NSError *error = nil;
137
tkchin@webrtc.org36401ab2015-01-27 21:34:39 +0000138 // We want a synchronous request so that we know that we've left the room on
139 // room server before we do any further work.
kthelgasonb13237b2017-03-30 04:56:05 -0700140 dispatch_semaphore_t sem = dispatch_semaphore_create(0);
141 [NSURLConnection sendAsyncRequest:request
142 completionHandler:^(NSURLResponse *response, NSData *data, NSError *e) {
143 if (e) {
144 error = e;
145 }
146 dispatch_semaphore_signal(sem);
147 }];
148
149 dispatch_semaphore_wait(sem, DISPATCH_TIME_FOREVER);
tkchin@webrtc.org3a63a3c2015-01-06 07:21:34 +0000150 if (error) {
kthelgasonb13237b2017-03-30 04:56:05 -0700151 RTCLogError(@"Error leaving room %@ on room server: %@", 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