xref: /aosp_15_r20/external/webrtc/examples/objc/AppRTCMobile/ARDAppEngineClient.m (revision d9f758449e529ab9291ac668be2861e7a55c2422)
1*d9f75844SAndroid Build Coastguard Worker/*
2*d9f75844SAndroid Build Coastguard Worker *  Copyright 2014 The WebRTC Project Authors. All rights reserved.
3*d9f75844SAndroid Build Coastguard Worker *
4*d9f75844SAndroid Build Coastguard Worker *  Use of this source code is governed by a BSD-style license
5*d9f75844SAndroid Build Coastguard Worker *  that can be found in the LICENSE file in the root of the source
6*d9f75844SAndroid Build Coastguard Worker *  tree. An additional intellectual property rights grant can be found
7*d9f75844SAndroid Build Coastguard Worker *  in the file PATENTS.  All contributing project authors may
8*d9f75844SAndroid Build Coastguard Worker *  be found in the AUTHORS file in the root of the source tree.
9*d9f75844SAndroid Build Coastguard Worker */
10*d9f75844SAndroid Build Coastguard Worker
11*d9f75844SAndroid Build Coastguard Worker#import "ARDAppEngineClient.h"
12*d9f75844SAndroid Build Coastguard Worker
13*d9f75844SAndroid Build Coastguard Worker#import "sdk/objc/base/RTCLogging.h"
14*d9f75844SAndroid Build Coastguard Worker
15*d9f75844SAndroid Build Coastguard Worker#import "ARDJoinResponse.h"
16*d9f75844SAndroid Build Coastguard Worker#import "ARDMessageResponse.h"
17*d9f75844SAndroid Build Coastguard Worker#import "ARDSignalingMessage.h"
18*d9f75844SAndroid Build Coastguard Worker#import "ARDUtilities.h"
19*d9f75844SAndroid Build Coastguard Worker
20*d9f75844SAndroid Build Coastguard Worker// TODO(tkchin): move these to a configuration object.
21*d9f75844SAndroid Build Coastguard Workerstatic NSString * const kARDRoomServerHostUrl =
22*d9f75844SAndroid Build Coastguard Worker    @"https://appr.tc";
23*d9f75844SAndroid Build Coastguard Workerstatic NSString * const kARDRoomServerJoinFormat =
24*d9f75844SAndroid Build Coastguard Worker    @"https://appr.tc/join/%@";
25*d9f75844SAndroid Build Coastguard Workerstatic NSString * const kARDRoomServerJoinFormatLoopback =
26*d9f75844SAndroid Build Coastguard Worker    @"https://appr.tc/join/%@?debug=loopback";
27*d9f75844SAndroid Build Coastguard Workerstatic NSString * const kARDRoomServerMessageFormat =
28*d9f75844SAndroid Build Coastguard Worker    @"https://appr.tc/message/%@/%@";
29*d9f75844SAndroid Build Coastguard Workerstatic NSString * const kARDRoomServerLeaveFormat =
30*d9f75844SAndroid Build Coastguard Worker    @"https://appr.tc/leave/%@/%@";
31*d9f75844SAndroid Build Coastguard Worker
32*d9f75844SAndroid Build Coastguard Workerstatic NSString * const kARDAppEngineClientErrorDomain = @"ARDAppEngineClient";
33*d9f75844SAndroid Build Coastguard Workerstatic NSInteger const kARDAppEngineClientErrorBadResponse = -1;
34*d9f75844SAndroid Build Coastguard Worker
35*d9f75844SAndroid Build Coastguard Worker@implementation ARDAppEngineClient
36*d9f75844SAndroid Build Coastguard Worker
37*d9f75844SAndroid Build Coastguard Worker#pragma mark - ARDRoomServerClient
38*d9f75844SAndroid Build Coastguard Worker
39*d9f75844SAndroid Build Coastguard Worker- (void)joinRoomWithRoomId:(NSString *)roomId
40*d9f75844SAndroid Build Coastguard Worker                isLoopback:(BOOL)isLoopback
41*d9f75844SAndroid Build Coastguard Worker         completionHandler:(void (^)(ARDJoinResponse *response,
42*d9f75844SAndroid Build Coastguard Worker                                     NSError *error))completionHandler {
43*d9f75844SAndroid Build Coastguard Worker  NSParameterAssert(roomId.length);
44*d9f75844SAndroid Build Coastguard Worker
45*d9f75844SAndroid Build Coastguard Worker  NSString *urlString = nil;
46*d9f75844SAndroid Build Coastguard Worker  if (isLoopback) {
47*d9f75844SAndroid Build Coastguard Worker    urlString =
48*d9f75844SAndroid Build Coastguard Worker        [NSString stringWithFormat:kARDRoomServerJoinFormatLoopback, roomId];
49*d9f75844SAndroid Build Coastguard Worker  } else {
50*d9f75844SAndroid Build Coastguard Worker    urlString =
51*d9f75844SAndroid Build Coastguard Worker        [NSString stringWithFormat:kARDRoomServerJoinFormat, roomId];
52*d9f75844SAndroid Build Coastguard Worker  }
53*d9f75844SAndroid Build Coastguard Worker
54*d9f75844SAndroid Build Coastguard Worker  NSURL *roomURL = [NSURL URLWithString:urlString];
55*d9f75844SAndroid Build Coastguard Worker  RTCLog(@"Joining room:%@ on room server.", roomId);
56*d9f75844SAndroid Build Coastguard Worker  NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:roomURL];
57*d9f75844SAndroid Build Coastguard Worker  request.HTTPMethod = @"POST";
58*d9f75844SAndroid Build Coastguard Worker  [NSURLConnection sendAsyncRequest:request
59*d9f75844SAndroid Build Coastguard Worker                  completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) {
60*d9f75844SAndroid Build Coastguard Worker                    if (error) {
61*d9f75844SAndroid Build Coastguard Worker                      if (completionHandler) {
62*d9f75844SAndroid Build Coastguard Worker                        completionHandler(nil, error);
63*d9f75844SAndroid Build Coastguard Worker                      }
64*d9f75844SAndroid Build Coastguard Worker                      return;
65*d9f75844SAndroid Build Coastguard Worker                    }
66*d9f75844SAndroid Build Coastguard Worker                    ARDJoinResponse *joinResponse = [ARDJoinResponse responseFromJSONData:data];
67*d9f75844SAndroid Build Coastguard Worker                    if (!joinResponse) {
68*d9f75844SAndroid Build Coastguard Worker                      if (completionHandler) {
69*d9f75844SAndroid Build Coastguard Worker                        NSError *error = [[self class] badResponseError];
70*d9f75844SAndroid Build Coastguard Worker                        completionHandler(nil, error);
71*d9f75844SAndroid Build Coastguard Worker                      }
72*d9f75844SAndroid Build Coastguard Worker                      return;
73*d9f75844SAndroid Build Coastguard Worker                    }
74*d9f75844SAndroid Build Coastguard Worker                    if (completionHandler) {
75*d9f75844SAndroid Build Coastguard Worker                      completionHandler(joinResponse, nil);
76*d9f75844SAndroid Build Coastguard Worker                    }
77*d9f75844SAndroid Build Coastguard Worker                  }];
78*d9f75844SAndroid Build Coastguard Worker}
79*d9f75844SAndroid Build Coastguard Worker
80*d9f75844SAndroid Build Coastguard Worker- (void)sendMessage:(ARDSignalingMessage *)message
81*d9f75844SAndroid Build Coastguard Worker            forRoomId:(NSString *)roomId
82*d9f75844SAndroid Build Coastguard Worker             clientId:(NSString *)clientId
83*d9f75844SAndroid Build Coastguard Worker    completionHandler:(void (^)(ARDMessageResponse *response,
84*d9f75844SAndroid Build Coastguard Worker                                NSError *error))completionHandler {
85*d9f75844SAndroid Build Coastguard Worker  NSParameterAssert(message);
86*d9f75844SAndroid Build Coastguard Worker  NSParameterAssert(roomId.length);
87*d9f75844SAndroid Build Coastguard Worker  NSParameterAssert(clientId.length);
88*d9f75844SAndroid Build Coastguard Worker
89*d9f75844SAndroid Build Coastguard Worker  NSData *data = [message JSONData];
90*d9f75844SAndroid Build Coastguard Worker  NSString *urlString =
91*d9f75844SAndroid Build Coastguard Worker      [NSString stringWithFormat:
92*d9f75844SAndroid Build Coastguard Worker          kARDRoomServerMessageFormat, roomId, clientId];
93*d9f75844SAndroid Build Coastguard Worker  NSURL *url = [NSURL URLWithString:urlString];
94*d9f75844SAndroid Build Coastguard Worker  RTCLog(@"C->RS POST: %@", message);
95*d9f75844SAndroid Build Coastguard Worker  NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
96*d9f75844SAndroid Build Coastguard Worker  request.HTTPMethod = @"POST";
97*d9f75844SAndroid Build Coastguard Worker  request.HTTPBody = data;
98*d9f75844SAndroid Build Coastguard Worker  [NSURLConnection sendAsyncRequest:request
99*d9f75844SAndroid Build Coastguard Worker                  completionHandler:^(NSURLResponse *response,
100*d9f75844SAndroid Build Coastguard Worker                                      NSData *data,
101*d9f75844SAndroid Build Coastguard Worker                                      NSError *error) {
102*d9f75844SAndroid Build Coastguard Worker    if (error) {
103*d9f75844SAndroid Build Coastguard Worker      if (completionHandler) {
104*d9f75844SAndroid Build Coastguard Worker        completionHandler(nil, error);
105*d9f75844SAndroid Build Coastguard Worker      }
106*d9f75844SAndroid Build Coastguard Worker      return;
107*d9f75844SAndroid Build Coastguard Worker    }
108*d9f75844SAndroid Build Coastguard Worker    ARDMessageResponse *messageResponse =
109*d9f75844SAndroid Build Coastguard Worker        [ARDMessageResponse responseFromJSONData:data];
110*d9f75844SAndroid Build Coastguard Worker    if (!messageResponse) {
111*d9f75844SAndroid Build Coastguard Worker      if (completionHandler) {
112*d9f75844SAndroid Build Coastguard Worker        NSError *error = [[self class] badResponseError];
113*d9f75844SAndroid Build Coastguard Worker        completionHandler(nil, error);
114*d9f75844SAndroid Build Coastguard Worker      }
115*d9f75844SAndroid Build Coastguard Worker      return;
116*d9f75844SAndroid Build Coastguard Worker    }
117*d9f75844SAndroid Build Coastguard Worker    if (completionHandler) {
118*d9f75844SAndroid Build Coastguard Worker      completionHandler(messageResponse, nil);
119*d9f75844SAndroid Build Coastguard Worker    }
120*d9f75844SAndroid Build Coastguard Worker  }];
121*d9f75844SAndroid Build Coastguard Worker}
122*d9f75844SAndroid Build Coastguard Worker
123*d9f75844SAndroid Build Coastguard Worker- (void)leaveRoomWithRoomId:(NSString *)roomId
124*d9f75844SAndroid Build Coastguard Worker                   clientId:(NSString *)clientId
125*d9f75844SAndroid Build Coastguard Worker          completionHandler:(void (^)(NSError *error))completionHandler {
126*d9f75844SAndroid Build Coastguard Worker  NSParameterAssert(roomId.length);
127*d9f75844SAndroid Build Coastguard Worker  NSParameterAssert(clientId.length);
128*d9f75844SAndroid Build Coastguard Worker
129*d9f75844SAndroid Build Coastguard Worker  NSString *urlString =
130*d9f75844SAndroid Build Coastguard Worker      [NSString stringWithFormat:kARDRoomServerLeaveFormat, roomId, clientId];
131*d9f75844SAndroid Build Coastguard Worker  NSURL *url = [NSURL URLWithString:urlString];
132*d9f75844SAndroid Build Coastguard Worker  NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
133*d9f75844SAndroid Build Coastguard Worker  request.HTTPMethod = @"POST";
134*d9f75844SAndroid Build Coastguard Worker
135*d9f75844SAndroid Build Coastguard Worker  RTCLog(@"C->RS: BYE");
136*d9f75844SAndroid Build Coastguard Worker  __block NSError *error = nil;
137*d9f75844SAndroid Build Coastguard Worker
138*d9f75844SAndroid Build Coastguard Worker  // We want a synchronous request so that we know that we've left the room on
139*d9f75844SAndroid Build Coastguard Worker  // room server before we do any further work.
140*d9f75844SAndroid Build Coastguard Worker  dispatch_semaphore_t sem = dispatch_semaphore_create(0);
141*d9f75844SAndroid Build Coastguard Worker  [NSURLConnection sendAsyncRequest:request
142*d9f75844SAndroid Build Coastguard Worker                  completionHandler:^(NSURLResponse *response, NSData *data, NSError *e) {
143*d9f75844SAndroid Build Coastguard Worker                    if (e) {
144*d9f75844SAndroid Build Coastguard Worker                      error = e;
145*d9f75844SAndroid Build Coastguard Worker                    }
146*d9f75844SAndroid Build Coastguard Worker                    dispatch_semaphore_signal(sem);
147*d9f75844SAndroid Build Coastguard Worker                  }];
148*d9f75844SAndroid Build Coastguard Worker
149*d9f75844SAndroid Build Coastguard Worker  dispatch_semaphore_wait(sem, DISPATCH_TIME_FOREVER);
150*d9f75844SAndroid Build Coastguard Worker  if (error) {
151*d9f75844SAndroid Build Coastguard Worker    RTCLogError(@"Error leaving room %@ on room server: %@", roomId, error.localizedDescription);
152*d9f75844SAndroid Build Coastguard Worker    if (completionHandler) {
153*d9f75844SAndroid Build Coastguard Worker      completionHandler(error);
154*d9f75844SAndroid Build Coastguard Worker    }
155*d9f75844SAndroid Build Coastguard Worker    return;
156*d9f75844SAndroid Build Coastguard Worker  }
157*d9f75844SAndroid Build Coastguard Worker  RTCLog(@"Left room:%@ on room server.", roomId);
158*d9f75844SAndroid Build Coastguard Worker  if (completionHandler) {
159*d9f75844SAndroid Build Coastguard Worker    completionHandler(nil);
160*d9f75844SAndroid Build Coastguard Worker  }
161*d9f75844SAndroid Build Coastguard Worker}
162*d9f75844SAndroid Build Coastguard Worker
163*d9f75844SAndroid Build Coastguard Worker#pragma mark - Private
164*d9f75844SAndroid Build Coastguard Worker
165*d9f75844SAndroid Build Coastguard Worker+ (NSError *)badResponseError {
166*d9f75844SAndroid Build Coastguard Worker  NSError *error =
167*d9f75844SAndroid Build Coastguard Worker      [[NSError alloc] initWithDomain:kARDAppEngineClientErrorDomain
168*d9f75844SAndroid Build Coastguard Worker                                 code:kARDAppEngineClientErrorBadResponse
169*d9f75844SAndroid Build Coastguard Worker                             userInfo:@{
170*d9f75844SAndroid Build Coastguard Worker    NSLocalizedDescriptionKey: @"Error parsing response.",
171*d9f75844SAndroid Build Coastguard Worker  }];
172*d9f75844SAndroid Build Coastguard Worker  return error;
173*d9f75844SAndroid Build Coastguard Worker}
174*d9f75844SAndroid Build Coastguard Worker
175*d9f75844SAndroid Build Coastguard Worker@end
176