blob: 4318e6bfc1ac6cc5e6121dc948dda2f82ca10c20 [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
tkchinc3f46a92015-07-23 12:50:55 -070013#import "RTCLogging.h"
14
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/%@";
tkchin@webrtc.org8cc47e92015-03-18 23:38:04 +000025static NSString * const kARDRoomServerMessageFormat =
tkchin@webrtc.org3a63a3c2015-01-06 07:21:34 +000026 @"https://apprtc.appspot.com/message/%@/%@";
tkchin@webrtc.org8cc47e92015-03-18 23:38:04 +000027static NSString * const kARDRoomServerLeaveFormat =
tkchin@webrtc.org36401ab2015-01-27 21:34:39 +000028 @"https://apprtc.appspot.com/leave/%@/%@";
tkchin@webrtc.org3a63a3c2015-01-06 07:21:34 +000029
tkchin@webrtc.org8cc47e92015-03-18 23:38:04 +000030static NSString * const kARDAppEngineClientErrorDomain = @"ARDAppEngineClient";
31static NSInteger const kARDAppEngineClientErrorBadResponse = -1;
tkchin@webrtc.org3a63a3c2015-01-06 07:21:34 +000032
33@implementation ARDAppEngineClient
34
35#pragma mark - ARDRoomServerClient
36
tkchin@webrtc.org36401ab2015-01-27 21:34:39 +000037- (void)joinRoomWithRoomId:(NSString *)roomId
38 completionHandler:(void (^)(ARDJoinResponse *response,
39 NSError *error))completionHandler {
tkchin@webrtc.org3a63a3c2015-01-06 07:21:34 +000040 NSParameterAssert(roomId.length);
41
42 NSString *urlString =
tkchin@webrtc.org36401ab2015-01-27 21:34:39 +000043 [NSString stringWithFormat:kARDRoomServerJoinFormat, roomId];
tkchin@webrtc.org3a63a3c2015-01-06 07:21:34 +000044 NSURL *roomURL = [NSURL URLWithString:urlString];
tkchinc3f46a92015-07-23 12:50:55 -070045 RTCLog(@"Joining room:%@ on room server.", roomId);
tkchin@webrtc.org3a63a3c2015-01-06 07:21:34 +000046 NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:roomURL];
47 request.HTTPMethod = @"POST";
48 __weak ARDAppEngineClient *weakSelf = self;
49 [NSURLConnection sendAsyncRequest:request
50 completionHandler:^(NSURLResponse *response,
51 NSData *data,
52 NSError *error) {
53 ARDAppEngineClient *strongSelf = weakSelf;
54 if (error) {
55 if (completionHandler) {
56 completionHandler(nil, error);
57 }
58 return;
59 }
tkchin@webrtc.org36401ab2015-01-27 21:34:39 +000060 ARDJoinResponse *joinResponse =
61 [ARDJoinResponse responseFromJSONData:data];
62 if (!joinResponse) {
tkchin@webrtc.org3a63a3c2015-01-06 07:21:34 +000063 if (completionHandler) {
64 NSError *error = [[self class] badResponseError];
65 completionHandler(nil, error);
66 }
67 return;
68 }
69 if (completionHandler) {
tkchin@webrtc.org36401ab2015-01-27 21:34:39 +000070 completionHandler(joinResponse, nil);
tkchin@webrtc.org3a63a3c2015-01-06 07:21:34 +000071 }
72 }];
73}
74
75- (void)sendMessage:(ARDSignalingMessage *)message
76 forRoomId:(NSString *)roomId
77 clientId:(NSString *)clientId
78 completionHandler:(void (^)(ARDMessageResponse *response,
79 NSError *error))completionHandler {
80 NSParameterAssert(message);
81 NSParameterAssert(roomId.length);
82 NSParameterAssert(clientId.length);
83
84 NSData *data = [message JSONData];
85 NSString *urlString =
86 [NSString stringWithFormat:
87 kARDRoomServerMessageFormat, roomId, clientId];
88 NSURL *url = [NSURL URLWithString:urlString];
tkchinc3f46a92015-07-23 12:50:55 -070089 RTCLog(@"C->RS POST: %@", message);
tkchin@webrtc.org3a63a3c2015-01-06 07:21:34 +000090 NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
91 request.HTTPMethod = @"POST";
92 request.HTTPBody = data;
93 __weak ARDAppEngineClient *weakSelf = self;
94 [NSURLConnection sendAsyncRequest:request
95 completionHandler:^(NSURLResponse *response,
96 NSData *data,
97 NSError *error) {
98 ARDAppEngineClient *strongSelf = weakSelf;
99 if (error) {
100 if (completionHandler) {
101 completionHandler(nil, error);
102 }
103 return;
104 }
105 ARDMessageResponse *messageResponse =
106 [ARDMessageResponse responseFromJSONData:data];
107 if (!messageResponse) {
108 if (completionHandler) {
109 NSError *error = [[self class] badResponseError];
110 completionHandler(nil, error);
111 }
112 return;
113 }
114 if (completionHandler) {
115 completionHandler(messageResponse, nil);
116 }
117 }];
118}
119
tkchin@webrtc.org36401ab2015-01-27 21:34:39 +0000120- (void)leaveRoomWithRoomId:(NSString *)roomId
tkchin@webrtc.org3a63a3c2015-01-06 07:21:34 +0000121 clientId:(NSString *)clientId
122 completionHandler:(void (^)(NSError *error))completionHandler {
123 NSParameterAssert(roomId.length);
124 NSParameterAssert(clientId.length);
125
126 NSString *urlString =
tkchin@webrtc.org36401ab2015-01-27 21:34:39 +0000127 [NSString stringWithFormat:kARDRoomServerLeaveFormat, roomId, clientId];
tkchin@webrtc.org3a63a3c2015-01-06 07:21:34 +0000128 NSURL *url = [NSURL URLWithString:urlString];
Chuck Hayscaae5d42015-03-25 12:59:52 -0700129 NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
130 request.HTTPMethod = @"POST";
tkchin@webrtc.org3a63a3c2015-01-06 07:21:34 +0000131 NSURLResponse *response = nil;
132 NSError *error = nil;
tkchin@webrtc.org36401ab2015-01-27 21:34:39 +0000133 // We want a synchronous request so that we know that we've left the room on
134 // room server before we do any further work.
tkchinc3f46a92015-07-23 12:50:55 -0700135 RTCLog(@"C->RS: BYE");
tkchin@webrtc.org3a63a3c2015-01-06 07:21:34 +0000136 [NSURLConnection sendSynchronousRequest:request
137 returningResponse:&response
138 error:&error];
139 if (error) {
tkchinc3f46a92015-07-23 12:50:55 -0700140 RTCLogError(@"Error leaving room %@ on room server: %@",
tkchin@webrtc.org36401ab2015-01-27 21:34:39 +0000141 roomId, error.localizedDescription);
tkchin@webrtc.org3a63a3c2015-01-06 07:21:34 +0000142 if (completionHandler) {
143 completionHandler(error);
144 }
145 return;
146 }
tkchinc3f46a92015-07-23 12:50:55 -0700147 RTCLog(@"Left room:%@ on room server.", roomId);
tkchin@webrtc.org3a63a3c2015-01-06 07:21:34 +0000148 if (completionHandler) {
149 completionHandler(nil);
150 }
151}
152
153#pragma mark - Private
154
155+ (NSError *)badResponseError {
156 NSError *error =
157 [[NSError alloc] initWithDomain:kARDAppEngineClientErrorDomain
158 code:kARDAppEngineClientErrorBadResponse
159 userInfo:@{
160 NSLocalizedDescriptionKey: @"Error parsing response.",
161 }];
162 return error;
163}
164
165@end