diff --git a/Pods b/Pods index 086242800e..ba63216170 160000 --- a/Pods +++ b/Pods @@ -1 +1 @@ -Subproject commit 086242800e27b3ee431ad23e9f29f3358e813059 +Subproject commit ba63216170bbe6d85d9c46c4ee37cdf672f6a7a7 diff --git a/SignalServiceKit/protobuf/Makefile b/SignalServiceKit/protobuf/Makefile index af6fd13ce9..bf443e24bd 100644 --- a/SignalServiceKit/protobuf/Makefile +++ b/SignalServiceKit/protobuf/Makefile @@ -6,7 +6,7 @@ PROTOC=protoc \ --proto_path="${HOME}/src/signal/protobuf-objc/src/compiler/google/protobuf/" \ --proto_path='./' -all: signal_service_proto provisioning_protos fingerprint_protos +all: signal_service_proto provisioning_protos fingerprint_protos websocket_protos signal_service_proto: OWSSignalServiceProtos.proto $(PROTOC) --objc_out=../src/Messages/ \ @@ -20,3 +20,6 @@ fingerprint_protos: OWSFingerprintProtos.proto $(PROTOC) --objc_out=../src/Security/ \ OWSFingerprintProtos.proto +websocket_protos: WebSocketResources.proto + $(PROTOC) --objc_out=../src/Network/WebSockets/ \ + WebSocketResources.proto diff --git a/SignalServiceKit/protobuf/WebSocketResources.proto b/SignalServiceKit/protobuf/WebSocketResources.proto new file mode 100644 index 0000000000..c56e65c5cb --- /dev/null +++ b/SignalServiceKit/protobuf/WebSocketResources.proto @@ -0,0 +1,45 @@ +/** + * Copyright (C) 2014-2016 Open Whisper Systems + * + * Licensed according to the LICENSE file in this repository. + */ + +package signalservice; + +option java_package = "org.whispersystems.signalservice.internal.websocket"; +option java_outer_classname = "WebSocketProtos"; + +// Signal-iOS +import "objectivec-descriptor.proto"; +option (google.protobuf.objectivec_file_options).class_prefix = "WebSocketResources"; + +message WebSocketRequestMessage +{ + optional string verb = 1; + optional string path = 2; + optional bytes body = 3; + repeated string headers = 5; + optional uint64 id = 4; +} + +message WebSocketResponseMessage +{ + optional uint64 id = 1; + optional uint32 status = 2; + optional string message = 3; + repeated string headers = 5; + optional bytes body = 4; +} + +message WebSocketMessage +{ + enum Type { + UNKNOWN = 0; + REQUEST = 1; + RESPONSE = 2; + } + + optional Type type = 1; + optional WebSocketRequestMessage request = 2; + optional WebSocketResponseMessage response = 3; +} \ No newline at end of file diff --git a/SignalServiceKit/src/Messages/OWSMessageSender.m b/SignalServiceKit/src/Messages/OWSMessageSender.m index 9b5a2d2a9d..f001f4d8e7 100644 --- a/SignalServiceKit/src/Messages/OWSMessageSender.m +++ b/SignalServiceKit/src/Messages/OWSMessageSender.m @@ -39,6 +39,7 @@ #import "TSOutgoingMessage.h" #import "TSPreKeyManager.h" #import "TSQuotedMessage.h" +#import "TSSocketManager.h" #import "TSThread.h" #import "Threading.h" #import @@ -975,117 +976,192 @@ NSString *const OWSMessageSenderRateLimitedException = @"RateLimitedException"; messages:deviceMessages relay:recipient.relay timeStamp:message.timestamp]; - [self.networkManager makeRequest:request - success:^(NSURLSessionDataTask *task, id responseObject) { - if (isLocalNumber && deviceMessages.count == 0) { - DDLogInfo(@"%@ Sent a message with no device messages; clearing 'mayHaveLinkedDevices'.", self.logTag); - // In order to avoid skipping necessary sync messages, the default value - // for mayHaveLinkedDevices is YES. Once we've successfully sent a - // sync message with no device messages (e.g. the service has confirmed - // that we have no linked devices), we can set mayHaveLinkedDevices to NO - // to avoid unnecessary message sends for sync messages until we learn - // of a linked device (e.g. through the device linking UI or by receiving - // a sync message, etc.). - [OWSDeviceManager.sharedManager clearMayHaveLinkedDevicesIfNotSet]; + if (TSSocketManager.sharedManager.canMakeRequests) { + [TSSocketManager.sharedManager makeRequest:request + success:^(id _Nullable responseObject) { + [self messageSendDidSucceed:message + recipient:recipient + isLocalNumber:isLocalNumber + deviceMessages:deviceMessages + success:successHandler]; } - - dispatch_async([OWSDispatch sendingQueue], ^{ - [self.dbConnection readWriteWithBlock:^(YapDatabaseReadWriteTransaction *transaction) { - [recipient saveWithTransaction:transaction]; - [message updateWithSentRecipient:recipient.uniqueId transaction:transaction]; - }]; - - [self handleMessageSentLocally:message]; - successHandler(); - }); - } - failure:^(NSURLSessionDataTask *task, NSError *error) { - DDLogInfo(@"%@ sending to recipient: %@, failed with error.", self.logTag, recipient.uniqueId); - [DDLog flushLog]; - - NSHTTPURLResponse *response = (NSHTTPURLResponse *)task.response; - long statuscode = response.statusCode; - NSData *responseData = error.userInfo[AFNetworkingOperationFailingURLResponseDataErrorKey]; - - void (^retrySend)(void) = ^void() { - if (remainingAttempts <= 0) { - // Since we've already repeatedly failed to send to the messaging API, - // it's unlikely that repeating the whole process will succeed. - [error setIsRetryable:NO]; - return failureHandler(error); - } - - dispatch_async([OWSDispatch sendingQueue], ^{ - DDLogDebug(@"%@ Retrying: %@", self.logTag, message.debugDescription); - [self sendMessageToService:message - recipient:recipient - thread:thread - attempts:remainingAttempts - success:successHandler - failure:failureHandler]; - }); - }; - - switch (statuscode) { - case 401: { - DDLogWarn(@"%@ Unable to send due to invalid credentials. Did the user's client get de-authed by " - @"registering elsewhere?", - self.logTag); - NSError *error = OWSErrorWithCodeDescription(OWSErrorCodeSignalServiceFailure, NSLocalizedString(@"ERROR_DESCRIPTION_SENDING_UNAUTHORIZED", @"Error message when attempting to send message")); - // No need to retry if we've been de-authed. - [error setIsRetryable:NO]; - return failureHandler(error); - } - case 404: { - DDLogWarn(@"%@ Unregistered recipient: %@", self.logTag, recipient.uniqueId); - - [self unregisteredRecipient:recipient message:message thread:thread]; - NSError *error = OWSErrorMakeNoSuchSignalRecipientError(); - // No need to retry if the recipient is not registered. - [error setIsRetryable:NO]; - // If one member of a group deletes their account, - // the group should ignore errors when trying to send - // messages to this ex-member. - [error setShouldBeIgnoredForGroups:YES]; - return failureHandler(error); - } - case 409: { - // Mismatched devices - DDLogWarn(@"%@ Mismatch Devices for recipient: %@", self.logTag, recipient.uniqueId); - - NSError *error; - NSDictionary *serializedResponse = - [NSJSONSerialization JSONObjectWithData:responseData options:0 error:&error]; - if (error) { - OWSProdError([OWSAnalyticsEvents messageSenderErrorCouldNotParseMismatchedDevicesJson]); - [error setIsRetryable:YES]; - return failureHandler(error); - } - - [self handleMismatchedDevices:serializedResponse recipient:recipient completion:retrySend]; - break; - } - case 410: { - // Stale devices - DDLogWarn(@"%@ Stale devices for recipient: %@", self.logTag, recipient.uniqueId); - - if (!responseData) { - DDLogWarn(@"Stale devices but server didn't specify devices in response."); - NSError *error = OWSErrorMakeUnableToProcessServerResponseError(); - [error setIsRetryable:YES]; - return failureHandler(error); - } - - [self handleStaleDevicesWithResponse:responseData - recipientId:recipient.uniqueId - completion:retrySend]; - break; - } - default: - retrySend(); - break; + failure:^(NSInteger statusCode, NSError *error) { + [self messageSendDidFail:message + recipient:recipient + thread:thread + isLocalNumber:isLocalNumber + deviceMessages:deviceMessages + remainingAttempts:remainingAttempts + statusCode:statusCode + error:error + success:successHandler + failure:failureHandler]; + }]; + } else { + [self.networkManager makeRequest:request + success:^(NSURLSessionDataTask *task, id responseObject) { + [self messageSendDidSucceed:message + recipient:recipient + isLocalNumber:isLocalNumber + deviceMessages:deviceMessages + success:successHandler]; } + failure:^(NSURLSessionDataTask *task, NSError *error) { + NSHTTPURLResponse *response = (NSHTTPURLResponse *)task.response; + NSInteger statusCode = response.statusCode; + + [self messageSendDidFail:message + recipient:recipient + thread:thread + isLocalNumber:isLocalNumber + deviceMessages:deviceMessages + remainingAttempts:remainingAttempts + statusCode:statusCode + error:error + success:successHandler + failure:failureHandler]; + }]; + } +} + +- (void)messageSendDidSucceed:(TSOutgoingMessage *)message + recipient:(SignalRecipient *)recipient + isLocalNumber:(BOOL)isLocalNumber + deviceMessages:(NSArray *)deviceMessages + success:(void (^)(void))successHandler +{ + OWSAssert(message); + OWSAssert(recipient); + OWSAssert(deviceMessages); + OWSAssert(successHandler); + + DDLogInfo(@"%@ Message send succeeded.", self.logTag); + + if (isLocalNumber && deviceMessages.count == 0) { + DDLogInfo(@"%@ Sent a message with no device messages; clearing 'mayHaveLinkedDevices'.", self.logTag); + // In order to avoid skipping necessary sync messages, the default value + // for mayHaveLinkedDevices is YES. Once we've successfully sent a + // sync message with no device messages (e.g. the service has confirmed + // that we have no linked devices), we can set mayHaveLinkedDevices to NO + // to avoid unnecessary message sends for sync messages until we learn + // of a linked device (e.g. through the device linking UI or by receiving + // a sync message, etc.). + [OWSDeviceManager.sharedManager clearMayHaveLinkedDevicesIfNotSet]; + } + + dispatch_async([OWSDispatch sendingQueue], ^{ + [self.dbConnection readWriteWithBlock:^(YapDatabaseReadWriteTransaction *transaction) { + [recipient saveWithTransaction:transaction]; + [message updateWithSentRecipient:recipient.uniqueId transaction:transaction]; }]; + + [self handleMessageSentLocally:message]; + successHandler(); + }); +} + +- (void)messageSendDidFail:(TSOutgoingMessage *)message + recipient:(SignalRecipient *)recipient + thread:(TSThread *)thread + isLocalNumber:(BOOL)isLocalNumber + deviceMessages:(NSArray *)deviceMessages + remainingAttempts:(int)remainingAttempts + statusCode:(NSInteger)statusCode + error:(NSError *)error + success:(void (^)(void))successHandler + failure:(RetryableFailureHandler)failureHandler +{ + OWSAssert(message); + OWSAssert(recipient); + OWSAssert(thread); + OWSAssert(deviceMessages); + OWSAssert(error); + OWSAssert(successHandler); + OWSAssert(failureHandler); + + DDLogInfo(@"%@ sending to recipient: %@, failed with error.", self.logTag, recipient.uniqueId); + [DDLog flushLog]; + + NSData *responseData = error.userInfo[AFNetworkingOperationFailingURLResponseDataErrorKey]; + + void (^retrySend)(void) = ^void() { + if (remainingAttempts <= 0) { + // Since we've already repeatedly failed to send to the messaging API, + // it's unlikely that repeating the whole process will succeed. + [error setIsRetryable:NO]; + return failureHandler(error); + } + + dispatch_async([OWSDispatch sendingQueue], ^{ + DDLogDebug(@"%@ Retrying: %@", self.logTag, message.debugDescription); + [self sendMessageToService:message + recipient:recipient + thread:thread + attempts:remainingAttempts + success:successHandler + failure:failureHandler]; + }); + }; + + switch (statusCode) { + case 401: { + DDLogWarn(@"%@ Unable to send due to invalid credentials. Did the user's client get de-authed by " + @"registering elsewhere?", + self.logTag); + NSError *error = OWSErrorWithCodeDescription(OWSErrorCodeSignalServiceFailure, + NSLocalizedString( + @"ERROR_DESCRIPTION_SENDING_UNAUTHORIZED", @"Error message when attempting to send message")); + // No need to retry if we've been de-authed. + [error setIsRetryable:NO]; + return failureHandler(error); + } + case 404: { + DDLogWarn(@"%@ Unregistered recipient: %@", self.logTag, recipient.uniqueId); + + [self unregisteredRecipient:recipient message:message thread:thread]; + NSError *error = OWSErrorMakeNoSuchSignalRecipientError(); + // No need to retry if the recipient is not registered. + [error setIsRetryable:NO]; + // If one member of a group deletes their account, + // the group should ignore errors when trying to send + // messages to this ex-member. + [error setShouldBeIgnoredForGroups:YES]; + return failureHandler(error); + } + case 409: { + // Mismatched devices + DDLogWarn(@"%@ Mismatch Devices for recipient: %@", self.logTag, recipient.uniqueId); + + NSError *error; + NSDictionary *serializedResponse = + [NSJSONSerialization JSONObjectWithData:responseData options:0 error:&error]; + if (error) { + OWSProdError([OWSAnalyticsEvents messageSenderErrorCouldNotParseMismatchedDevicesJson]); + [error setIsRetryable:YES]; + return failureHandler(error); + } + + [self handleMismatchedDevices:serializedResponse recipient:recipient completion:retrySend]; + break; + } + case 410: { + // Stale devices + DDLogWarn(@"%@ Stale devices for recipient: %@", self.logTag, recipient.uniqueId); + + if (!responseData) { + DDLogWarn(@"Stale devices but server didn't specify devices in response."); + NSError *error = OWSErrorMakeUnableToProcessServerResponseError(); + [error setIsRetryable:YES]; + return failureHandler(error); + } + + [self handleStaleDevicesWithResponse:responseData recipientId:recipient.uniqueId completion:retrySend]; + break; + } + default: + retrySend(); + break; + } } - (void)handleMismatchedDevices:(NSDictionary *)dictionary diff --git a/SignalServiceKit/src/Network/WebSockets/SubProtocol.pb.h b/SignalServiceKit/src/Network/WebSockets/SubProtocol.pb.h deleted file mode 100644 index 427596c17a..0000000000 --- a/SignalServiceKit/src/Network/WebSockets/SubProtocol.pb.h +++ /dev/null @@ -1,273 +0,0 @@ -// Generated by the protocol buffer compiler. DO NOT EDIT! - -#import - -// @@protoc_insertion_point(imports) - -@class WebSocketMessage; -@class WebSocketMessageBuilder; -@class WebSocketRequestMessage; -@class WebSocketRequestMessageBuilder; -@class WebSocketResponseMessage; -@class WebSocketResponseMessageBuilder; -#ifndef __has_feature -#define __has_feature(x) 0 // Compatibility with non-clang compilers. -#endif // __has_feature - -#ifndef NS_RETURNS_NOT_RETAINED -#if __has_feature(attribute_ns_returns_not_retained) -#define NS_RETURNS_NOT_RETAINED __attribute__((ns_returns_not_retained)) -#else -#define NS_RETURNS_NOT_RETAINED -#endif -#endif - -typedef enum { - WebSocketMessageTypeUnknown = 0, - WebSocketMessageTypeRequest = 1, - WebSocketMessageTypeResponse = 2, -} WebSocketMessageType; - -BOOL WebSocketMessageTypeIsValidValue(WebSocketMessageType value); - - -@interface SubProtocolRoot : NSObject { -} -+ (PBExtensionRegistry *)extensionRegistry; -+ (void)registerAllExtensions:(PBMutableExtensionRegistry *)registry; -@end - -@interface WebSocketRequestMessage : PBGeneratedMessage { - @private - BOOL hasId_ : 1; - BOOL hasVerb_ : 1; - BOOL hasPath_ : 1; - BOOL hasBody_ : 1; - UInt64 id; - NSString *verb; - NSString *path; - NSData *body; -} -- (BOOL)hasVerb; -- (BOOL)hasPath; -- (BOOL)hasBody; -- (BOOL)hasId; -@property (readonly, strong) NSString *verb; -@property (readonly, strong) NSString *path; -@property (readonly, strong) NSData *body; -@property (readonly) UInt64 id; - -+ (WebSocketRequestMessage *)defaultInstance; -- (WebSocketRequestMessage *)defaultInstance; - -- (BOOL)isInitialized; -- (void)writeToCodedOutputStream:(PBCodedOutputStream *)output; -- (WebSocketRequestMessageBuilder *)builder; -+ (WebSocketRequestMessageBuilder *)builder; -+ (WebSocketRequestMessageBuilder *)builderWithPrototype:(WebSocketRequestMessage *)prototype; -- (WebSocketRequestMessageBuilder *)toBuilder; - -+ (WebSocketRequestMessage *)parseFromData:(NSData *)data; -+ (WebSocketRequestMessage *)parseFromData:(NSData *)data extensionRegistry:(PBExtensionRegistry *)extensionRegistry; -+ (WebSocketRequestMessage *)parseFromInputStream:(NSInputStream *)input; -+ (WebSocketRequestMessage *)parseFromInputStream:(NSInputStream *)input - extensionRegistry:(PBExtensionRegistry *)extensionRegistry; -+ (WebSocketRequestMessage *)parseFromCodedInputStream:(PBCodedInputStream *)input; -+ (WebSocketRequestMessage *)parseFromCodedInputStream:(PBCodedInputStream *)input - extensionRegistry:(PBExtensionRegistry *)extensionRegistry; -@end - -@interface WebSocketRequestMessageBuilder : PBGeneratedMessageBuilder { - @private - WebSocketRequestMessage *result; -} - -- (WebSocketRequestMessage *)defaultInstance; - -- (WebSocketRequestMessageBuilder *)clear; -- (WebSocketRequestMessageBuilder *)clone; - -- (WebSocketRequestMessage *)build; -- (WebSocketRequestMessage *)buildPartial; - -- (WebSocketRequestMessageBuilder *)mergeFrom:(WebSocketRequestMessage *)other; -- (WebSocketRequestMessageBuilder *)mergeFromCodedInputStream:(PBCodedInputStream *)input; -- (WebSocketRequestMessageBuilder *)mergeFromCodedInputStream:(PBCodedInputStream *)input - extensionRegistry:(PBExtensionRegistry *)extensionRegistry; - -- (BOOL)hasVerb; -- (NSString *)verb; -- (WebSocketRequestMessageBuilder *)setVerb:(NSString *)value; -- (WebSocketRequestMessageBuilder *)clearVerb; - -- (BOOL)hasPath; -- (NSString *)path; -- (WebSocketRequestMessageBuilder *)setPath:(NSString *)value; -- (WebSocketRequestMessageBuilder *)clearPath; - -- (BOOL)hasBody; -- (NSData *)body; -- (WebSocketRequestMessageBuilder *)setBody:(NSData *)value; -- (WebSocketRequestMessageBuilder *)clearBody; - -- (BOOL)hasId; -- (UInt64)id; -- (WebSocketRequestMessageBuilder *)setId:(UInt64)value; -- (WebSocketRequestMessageBuilder *)clearId; -@end - -@interface WebSocketResponseMessage : PBGeneratedMessage { - @private - BOOL hasId_ : 1; - BOOL hasMessage_ : 1; - BOOL hasBody_ : 1; - BOOL hasStatus_ : 1; - UInt64 id; - NSString *message; - NSData *body; - UInt32 status; -} -- (BOOL)hasId; -- (BOOL)hasStatus; -- (BOOL)hasMessage; -- (BOOL)hasBody; -@property (readonly) UInt64 id; -@property (readonly) UInt32 status; -@property (readonly, strong) NSString *message; -@property (readonly, strong) NSData *body; - -+ (WebSocketResponseMessage *)defaultInstance; -- (WebSocketResponseMessage *)defaultInstance; - -- (BOOL)isInitialized; -- (void)writeToCodedOutputStream:(PBCodedOutputStream *)output; -- (WebSocketResponseMessageBuilder *)builder; -+ (WebSocketResponseMessageBuilder *)builder; -+ (WebSocketResponseMessageBuilder *)builderWithPrototype:(WebSocketResponseMessage *)prototype; -- (WebSocketResponseMessageBuilder *)toBuilder; - -+ (WebSocketResponseMessage *)parseFromData:(NSData *)data; -+ (WebSocketResponseMessage *)parseFromData:(NSData *)data extensionRegistry:(PBExtensionRegistry *)extensionRegistry; -+ (WebSocketResponseMessage *)parseFromInputStream:(NSInputStream *)input; -+ (WebSocketResponseMessage *)parseFromInputStream:(NSInputStream *)input - extensionRegistry:(PBExtensionRegistry *)extensionRegistry; -+ (WebSocketResponseMessage *)parseFromCodedInputStream:(PBCodedInputStream *)input; -+ (WebSocketResponseMessage *)parseFromCodedInputStream:(PBCodedInputStream *)input - extensionRegistry:(PBExtensionRegistry *)extensionRegistry; -@end - -@interface WebSocketResponseMessageBuilder : PBGeneratedMessageBuilder { - @private - WebSocketResponseMessage *result; -} - -- (WebSocketResponseMessage *)defaultInstance; - -- (WebSocketResponseMessageBuilder *)clear; -- (WebSocketResponseMessageBuilder *)clone; - -- (WebSocketResponseMessage *)build; -- (WebSocketResponseMessage *)buildPartial; - -- (WebSocketResponseMessageBuilder *)mergeFrom:(WebSocketResponseMessage *)other; -- (WebSocketResponseMessageBuilder *)mergeFromCodedInputStream:(PBCodedInputStream *)input; -- (WebSocketResponseMessageBuilder *)mergeFromCodedInputStream:(PBCodedInputStream *)input - extensionRegistry:(PBExtensionRegistry *)extensionRegistry; - -- (BOOL)hasId; -- (UInt64)id; -- (WebSocketResponseMessageBuilder *)setId:(UInt64)value; -- (WebSocketResponseMessageBuilder *)clearId; - -- (BOOL)hasStatus; -- (UInt32)status; -- (WebSocketResponseMessageBuilder *)setStatus:(UInt32)value; -- (WebSocketResponseMessageBuilder *)clearStatus; - -- (BOOL)hasMessage; -- (NSString *)message; -- (WebSocketResponseMessageBuilder *)setMessage:(NSString *)value; -- (WebSocketResponseMessageBuilder *)clearMessage; - -- (BOOL)hasBody; -- (NSData *)body; -- (WebSocketResponseMessageBuilder *)setBody:(NSData *)value; -- (WebSocketResponseMessageBuilder *)clearBody; -@end - -@interface WebSocketMessage : PBGeneratedMessage { - @private - BOOL hasRequest_ : 1; - BOOL hasResponse_ : 1; - BOOL hasType_ : 1; - WebSocketRequestMessage *request; - WebSocketResponseMessage *response; - WebSocketMessageType type; -} -- (BOOL)hasType; -- (BOOL)hasRequest; -- (BOOL)hasResponse; -@property (readonly) WebSocketMessageType type; -@property (readonly, strong) WebSocketRequestMessage *request; -@property (readonly, strong) WebSocketResponseMessage *response; - -+ (WebSocketMessage *)defaultInstance; -- (WebSocketMessage *)defaultInstance; - -- (BOOL)isInitialized; -- (void)writeToCodedOutputStream:(PBCodedOutputStream *)output; -- (WebSocketMessageBuilder *)builder; -+ (WebSocketMessageBuilder *)builder; -+ (WebSocketMessageBuilder *)builderWithPrototype:(WebSocketMessage *)prototype; -- (WebSocketMessageBuilder *)toBuilder; - -+ (WebSocketMessage *)parseFromData:(NSData *)data; -+ (WebSocketMessage *)parseFromData:(NSData *)data extensionRegistry:(PBExtensionRegistry *)extensionRegistry; -+ (WebSocketMessage *)parseFromInputStream:(NSInputStream *)input; -+ (WebSocketMessage *)parseFromInputStream:(NSInputStream *)input - extensionRegistry:(PBExtensionRegistry *)extensionRegistry; -+ (WebSocketMessage *)parseFromCodedInputStream:(PBCodedInputStream *)input; -+ (WebSocketMessage *)parseFromCodedInputStream:(PBCodedInputStream *)input - extensionRegistry:(PBExtensionRegistry *)extensionRegistry; -@end - -@interface WebSocketMessageBuilder : PBGeneratedMessageBuilder { - @private - WebSocketMessage *result; -} - -- (WebSocketMessage *)defaultInstance; - -- (WebSocketMessageBuilder *)clear; -- (WebSocketMessageBuilder *)clone; - -- (WebSocketMessage *)build; -- (WebSocketMessage *)buildPartial; - -- (WebSocketMessageBuilder *)mergeFrom:(WebSocketMessage *)other; -- (WebSocketMessageBuilder *)mergeFromCodedInputStream:(PBCodedInputStream *)input; -- (WebSocketMessageBuilder *)mergeFromCodedInputStream:(PBCodedInputStream *)input - extensionRegistry:(PBExtensionRegistry *)extensionRegistry; - -- (BOOL)hasType; -- (WebSocketMessageType)type; -- (WebSocketMessageBuilder *)setType:(WebSocketMessageType)value; -- (WebSocketMessageBuilder *)clearType; - -- (BOOL)hasRequest; -- (WebSocketRequestMessage *)request; -- (WebSocketMessageBuilder *)setRequest:(WebSocketRequestMessage *)value; -- (WebSocketMessageBuilder *)setRequestBuilder:(WebSocketRequestMessageBuilder *)builderForValue; -- (WebSocketMessageBuilder *)mergeRequest:(WebSocketRequestMessage *)value; -- (WebSocketMessageBuilder *)clearRequest; - -- (BOOL)hasResponse; -- (WebSocketResponseMessage *)response; -- (WebSocketMessageBuilder *)setResponse:(WebSocketResponseMessage *)value; -- (WebSocketMessageBuilder *)setResponseBuilder:(WebSocketResponseMessageBuilder *)builderForValue; -- (WebSocketMessageBuilder *)mergeResponse:(WebSocketResponseMessage *)value; -- (WebSocketMessageBuilder *)clearResponse; -@end - - -// @@protoc_insertion_point(global_scope) diff --git a/SignalServiceKit/src/Network/WebSockets/SubProtocol.pb.m b/SignalServiceKit/src/Network/WebSockets/SubProtocol.pb.m deleted file mode 100644 index 180889db60..0000000000 --- a/SignalServiceKit/src/Network/WebSockets/SubProtocol.pb.m +++ /dev/null @@ -1,1065 +0,0 @@ -// Generated by the protocol buffer compiler. DO NOT EDIT! - -#import "SubProtocol.pb.h" -// @@protoc_insertion_point(imports) - -@implementation SubProtocolRoot -static PBExtensionRegistry *extensionRegistry = nil; -+ (PBExtensionRegistry *)extensionRegistry { - return extensionRegistry; -} - -+ (void)initialize { - if (self == [SubProtocolRoot class]) { - PBMutableExtensionRegistry *registry = [PBMutableExtensionRegistry registry]; - [self registerAllExtensions:registry]; - extensionRegistry = registry; - } -} -+ (void)registerAllExtensions:(PBMutableExtensionRegistry *)registry { -} -@end - -@interface WebSocketRequestMessage () -@property (strong) NSString *verb; -@property (strong) NSString *path; -@property (strong) NSData *body; -@property UInt64 id; -@end - -@implementation WebSocketRequestMessage - -- (BOOL)hasVerb { - return !!hasVerb_; -} -- (void)setHasVerb:(BOOL)value_ { - hasVerb_ = !!value_; -} -@synthesize verb; -- (BOOL)hasPath { - return !!hasPath_; -} -- (void)setHasPath:(BOOL)value_ { - hasPath_ = !!value_; -} -@synthesize path; -- (BOOL)hasBody { - return !!hasBody_; -} -- (void)setHasBody:(BOOL)value_ { - hasBody_ = !!value_; -} -@synthesize body; -- (BOOL)hasId { - return !!hasId_; -} -- (void)setHasId:(BOOL)value_ { - hasId_ = !!value_; -} -@synthesize id; -- (id)init { - if ((self = [super init])) { - self.verb = @""; - self.path = @""; - self.body = [NSData data]; - self.id = 0L; - } - return self; -} -static WebSocketRequestMessage *defaultWebSocketRequestMessageInstance = nil; -+ (void)initialize { - if (self == [WebSocketRequestMessage class]) { - defaultWebSocketRequestMessageInstance = [[WebSocketRequestMessage alloc] init]; - } -} -+ (WebSocketRequestMessage *)defaultInstance { - return defaultWebSocketRequestMessageInstance; -} -- (WebSocketRequestMessage *)defaultInstance { - return defaultWebSocketRequestMessageInstance; -} -- (BOOL)isInitialized { - return YES; -} -- (void)writeToCodedOutputStream:(PBCodedOutputStream *)output { - if (self.hasVerb) { - [output writeString:1 value:self.verb]; - } - if (self.hasPath) { - [output writeString:2 value:self.path]; - } - if (self.hasBody) { - [output writeData:3 value:self.body]; - } - if (self.hasId) { - [output writeUInt64:4 value:self.id]; - } - [self.unknownFields writeToCodedOutputStream:output]; -} -- (SInt32)serializedSize { - __block SInt32 size_ = memoizedSerializedSize; - if (size_ != -1) { - return size_; - } - - size_ = 0; - if (self.hasVerb) { - size_ += computeStringSize(1, self.verb); - } - if (self.hasPath) { - size_ += computeStringSize(2, self.path); - } - if (self.hasBody) { - size_ += computeDataSize(3, self.body); - } - if (self.hasId) { - size_ += computeUInt64Size(4, self.id); - } - size_ += self.unknownFields.serializedSize; - memoizedSerializedSize = size_; - return size_; -} -+ (WebSocketRequestMessage *)parseFromData:(NSData *)data { - return (WebSocketRequestMessage *)[[[WebSocketRequestMessage builder] mergeFromData:data] build]; -} -+ (WebSocketRequestMessage *)parseFromData:(NSData *)data extensionRegistry:(PBExtensionRegistry *)extensionRegistry { - return (WebSocketRequestMessage *)[ - [[WebSocketRequestMessage builder] mergeFromData:data extensionRegistry:extensionRegistry] build]; -} -+ (WebSocketRequestMessage *)parseFromInputStream:(NSInputStream *)input { - return (WebSocketRequestMessage *)[[[WebSocketRequestMessage builder] mergeFromInputStream:input] build]; -} -+ (WebSocketRequestMessage *)parseFromInputStream:(NSInputStream *)input - extensionRegistry:(PBExtensionRegistry *)extensionRegistry { - return (WebSocketRequestMessage *)[ - [[WebSocketRequestMessage builder] mergeFromInputStream:input extensionRegistry:extensionRegistry] build]; -} -+ (WebSocketRequestMessage *)parseFromCodedInputStream:(PBCodedInputStream *)input { - return (WebSocketRequestMessage *)[[[WebSocketRequestMessage builder] mergeFromCodedInputStream:input] build]; -} -+ (WebSocketRequestMessage *)parseFromCodedInputStream:(PBCodedInputStream *)input - extensionRegistry:(PBExtensionRegistry *)extensionRegistry { - return (WebSocketRequestMessage *)[ - [[WebSocketRequestMessage builder] mergeFromCodedInputStream:input extensionRegistry:extensionRegistry] build]; -} -+ (WebSocketRequestMessageBuilder *)builder { - return [[WebSocketRequestMessageBuilder alloc] init]; -} -+ (WebSocketRequestMessageBuilder *)builderWithPrototype:(WebSocketRequestMessage *)prototype { - return [[WebSocketRequestMessage builder] mergeFrom:prototype]; -} -- (WebSocketRequestMessageBuilder *)builder { - return [WebSocketRequestMessage builder]; -} -- (WebSocketRequestMessageBuilder *)toBuilder { - return [WebSocketRequestMessage builderWithPrototype:self]; -} -- (void)writeDescriptionTo:(NSMutableString *)output withIndent:(NSString *)indent { - if (self.hasVerb) { - [output appendFormat:@"%@%@: %@\n", indent, @"verb", self.verb]; - } - if (self.hasPath) { - [output appendFormat:@"%@%@: %@\n", indent, @"path", self.path]; - } - if (self.hasBody) { - [output appendFormat:@"%@%@: %@\n", indent, @"body", self.body]; - } - if (self.hasId) { - [output appendFormat:@"%@%@: %@\n", indent, @"id", [NSNumber numberWithLongLong:self.id]]; - } - [self.unknownFields writeDescriptionTo:output withIndent:indent]; -} -- (BOOL)isEqual:(id)other { - if (other == self) { - return YES; - } - if (![other isKindOfClass:[WebSocketRequestMessage class]]) { - return NO; - } - WebSocketRequestMessage *otherMessage = other; - return self.hasVerb == otherMessage.hasVerb && (!self.hasVerb || [self.verb isEqual:otherMessage.verb]) && - self.hasPath == otherMessage.hasPath && (!self.hasPath || [self.path isEqual:otherMessage.path]) && - self.hasBody == otherMessage.hasBody && (!self.hasBody || [self.body isEqual:otherMessage.body]) && - self.hasId == otherMessage.hasId && (!self.hasId || self.id == otherMessage.id) && - (self.unknownFields == otherMessage.unknownFields || - (self.unknownFields != nil && [self.unknownFields isEqual:otherMessage.unknownFields])); -} -- (NSUInteger)hash { - __block NSUInteger hashCode = 7; - if (self.hasVerb) { - hashCode = hashCode * 31 + [self.verb hash]; - } - if (self.hasPath) { - hashCode = hashCode * 31 + [self.path hash]; - } - if (self.hasBody) { - hashCode = hashCode * 31 + [self.body hash]; - } - if (self.hasId) { - hashCode = hashCode * 31 + [[NSNumber numberWithLongLong:self.id] hash]; - } - hashCode = hashCode * 31 + [self.unknownFields hash]; - return hashCode; -} -@end - -@interface WebSocketRequestMessageBuilder () -@property (strong) WebSocketRequestMessage *result; -@end - -@implementation WebSocketRequestMessageBuilder -@synthesize result; -- (id)init { - if ((self = [super init])) { - self.result = [[WebSocketRequestMessage alloc] init]; - } - return self; -} -- (PBGeneratedMessage *)internalGetResult { - return result; -} -- (WebSocketRequestMessageBuilder *)clear { - self.result = [[WebSocketRequestMessage alloc] init]; - return self; -} -- (WebSocketRequestMessageBuilder *)clone { - return [WebSocketRequestMessage builderWithPrototype:result]; -} -- (WebSocketRequestMessage *)defaultInstance { - return [WebSocketRequestMessage defaultInstance]; -} -- (WebSocketRequestMessage *)build { - [self checkInitialized]; - return [self buildPartial]; -} -- (WebSocketRequestMessage *)buildPartial { - WebSocketRequestMessage *returnMe = result; - self.result = nil; - return returnMe; -} -- (WebSocketRequestMessageBuilder *)mergeFrom:(WebSocketRequestMessage *)other { - if (other == [WebSocketRequestMessage defaultInstance]) { - return self; - } - if (other.hasVerb) { - [self setVerb:other.verb]; - } - if (other.hasPath) { - [self setPath:other.path]; - } - if (other.hasBody) { - [self setBody:other.body]; - } - if (other.hasId) { - [self setId:other.id]; - } - [self mergeUnknownFields:other.unknownFields]; - return self; -} -- (WebSocketRequestMessageBuilder *)mergeFromCodedInputStream:(PBCodedInputStream *)input { - return [self mergeFromCodedInputStream:input extensionRegistry:[PBExtensionRegistry emptyRegistry]]; -} -- (WebSocketRequestMessageBuilder *)mergeFromCodedInputStream:(PBCodedInputStream *)input - extensionRegistry:(PBExtensionRegistry *)extensionRegistry { - PBUnknownFieldSetBuilder *unknownFields = [PBUnknownFieldSet builderWithUnknownFields:self.unknownFields]; - while (YES) { - SInt32 tag = [input readTag]; - switch (tag) { - case 0: - [self setUnknownFields:[unknownFields build]]; - return self; - default: { - if (![self parseUnknownField:input - unknownFields:unknownFields - extensionRegistry:extensionRegistry - tag:tag]) { - [self setUnknownFields:[unknownFields build]]; - return self; - } - break; - } - case 10: { - [self setVerb:[input readString]]; - break; - } - case 18: { - [self setPath:[input readString]]; - break; - } - case 26: { - [self setBody:[input readData]]; - break; - } - case 32: { - [self setId:[input readUInt64]]; - break; - } - } - } -} -- (BOOL)hasVerb { - return result.hasVerb; -} -- (NSString *)verb { - return result.verb; -} -- (WebSocketRequestMessageBuilder *)setVerb:(NSString *)value { - result.hasVerb = YES; - result.verb = value; - return self; -} -- (WebSocketRequestMessageBuilder *)clearVerb { - result.hasVerb = NO; - result.verb = @""; - return self; -} -- (BOOL)hasPath { - return result.hasPath; -} -- (NSString *)path { - return result.path; -} -- (WebSocketRequestMessageBuilder *)setPath:(NSString *)value { - result.hasPath = YES; - result.path = value; - return self; -} -- (WebSocketRequestMessageBuilder *)clearPath { - result.hasPath = NO; - result.path = @""; - return self; -} -- (BOOL)hasBody { - return result.hasBody; -} -- (NSData *)body { - return result.body; -} -- (WebSocketRequestMessageBuilder *)setBody:(NSData *)value { - result.hasBody = YES; - result.body = value; - return self; -} -- (WebSocketRequestMessageBuilder *)clearBody { - result.hasBody = NO; - result.body = [NSData data]; - return self; -} -- (BOOL)hasId { - return result.hasId; -} -- (UInt64)id { - return result.id; -} -- (WebSocketRequestMessageBuilder *)setId:(UInt64)value { - result.hasId = YES; - result.id = value; - return self; -} -- (WebSocketRequestMessageBuilder *)clearId { - result.hasId = NO; - result.id = 0L; - return self; -} -@end - -@interface WebSocketResponseMessage () -@property UInt64 id; -@property UInt32 status; -@property (strong) NSString *message; -@property (strong) NSData *body; -@end - -@implementation WebSocketResponseMessage - -- (BOOL)hasId { - return !!hasId_; -} -- (void)setHasId:(BOOL)value_ { - hasId_ = !!value_; -} -@synthesize id; -- (BOOL)hasStatus { - return !!hasStatus_; -} -- (void)setHasStatus:(BOOL)value_ { - hasStatus_ = !!value_; -} -@synthesize status; -- (BOOL)hasMessage { - return !!hasMessage_; -} -- (void)setHasMessage:(BOOL)value_ { - hasMessage_ = !!value_; -} -@synthesize message; -- (BOOL)hasBody { - return !!hasBody_; -} -- (void)setHasBody:(BOOL)value_ { - hasBody_ = !!value_; -} -@synthesize body; -- (id)init { - if ((self = [super init])) { - self.id = 0L; - self.status = 0; - self.message = @""; - self.body = [NSData data]; - } - return self; -} -static WebSocketResponseMessage *defaultWebSocketResponseMessageInstance = nil; -+ (void)initialize { - if (self == [WebSocketResponseMessage class]) { - defaultWebSocketResponseMessageInstance = [[WebSocketResponseMessage alloc] init]; - } -} -+ (WebSocketResponseMessage *)defaultInstance { - return defaultWebSocketResponseMessageInstance; -} -- (WebSocketResponseMessage *)defaultInstance { - return defaultWebSocketResponseMessageInstance; -} -- (BOOL)isInitialized { - return YES; -} -- (void)writeToCodedOutputStream:(PBCodedOutputStream *)output { - if (self.hasId) { - [output writeUInt64:1 value:self.id]; - } - if (self.hasStatus) { - [output writeUInt32:2 value:self.status]; - } - if (self.hasMessage) { - [output writeString:3 value:self.message]; - } - if (self.hasBody) { - [output writeData:4 value:self.body]; - } - [self.unknownFields writeToCodedOutputStream:output]; -} -- (SInt32)serializedSize { - __block SInt32 size_ = memoizedSerializedSize; - if (size_ != -1) { - return size_; - } - - size_ = 0; - if (self.hasId) { - size_ += computeUInt64Size(1, self.id); - } - if (self.hasStatus) { - size_ += computeUInt32Size(2, self.status); - } - if (self.hasMessage) { - size_ += computeStringSize(3, self.message); - } - if (self.hasBody) { - size_ += computeDataSize(4, self.body); - } - size_ += self.unknownFields.serializedSize; - memoizedSerializedSize = size_; - return size_; -} -+ (WebSocketResponseMessage *)parseFromData:(NSData *)data { - return (WebSocketResponseMessage *)[[[WebSocketResponseMessage builder] mergeFromData:data] build]; -} -+ (WebSocketResponseMessage *)parseFromData:(NSData *)data extensionRegistry:(PBExtensionRegistry *)extensionRegistry { - return (WebSocketResponseMessage *)[ - [[WebSocketResponseMessage builder] mergeFromData:data extensionRegistry:extensionRegistry] build]; -} -+ (WebSocketResponseMessage *)parseFromInputStream:(NSInputStream *)input { - return (WebSocketResponseMessage *)[[[WebSocketResponseMessage builder] mergeFromInputStream:input] build]; -} -+ (WebSocketResponseMessage *)parseFromInputStream:(NSInputStream *)input - extensionRegistry:(PBExtensionRegistry *)extensionRegistry { - return (WebSocketResponseMessage *)[ - [[WebSocketResponseMessage builder] mergeFromInputStream:input extensionRegistry:extensionRegistry] build]; -} -+ (WebSocketResponseMessage *)parseFromCodedInputStream:(PBCodedInputStream *)input { - return (WebSocketResponseMessage *)[[[WebSocketResponseMessage builder] mergeFromCodedInputStream:input] build]; -} -+ (WebSocketResponseMessage *)parseFromCodedInputStream:(PBCodedInputStream *)input - extensionRegistry:(PBExtensionRegistry *)extensionRegistry { - return (WebSocketResponseMessage *)[ - [[WebSocketResponseMessage builder] mergeFromCodedInputStream:input extensionRegistry:extensionRegistry] build]; -} -+ (WebSocketResponseMessageBuilder *)builder { - return [[WebSocketResponseMessageBuilder alloc] init]; -} -+ (WebSocketResponseMessageBuilder *)builderWithPrototype:(WebSocketResponseMessage *)prototype { - return [[WebSocketResponseMessage builder] mergeFrom:prototype]; -} -- (WebSocketResponseMessageBuilder *)builder { - return [WebSocketResponseMessage builder]; -} -- (WebSocketResponseMessageBuilder *)toBuilder { - return [WebSocketResponseMessage builderWithPrototype:self]; -} -- (void)writeDescriptionTo:(NSMutableString *)output withIndent:(NSString *)indent { - if (self.hasId) { - [output appendFormat:@"%@%@: %@\n", indent, @"id", [NSNumber numberWithLongLong:self.id]]; - } - if (self.hasStatus) { - [output appendFormat:@"%@%@: %@\n", indent, @"status", [NSNumber numberWithInteger:self.status]]; - } - if (self.hasMessage) { - [output appendFormat:@"%@%@: %@\n", indent, @"message", self.message]; - } - if (self.hasBody) { - [output appendFormat:@"%@%@: %@\n", indent, @"body", self.body]; - } - [self.unknownFields writeDescriptionTo:output withIndent:indent]; -} -- (BOOL)isEqual:(id)other { - if (other == self) { - return YES; - } - if (![other isKindOfClass:[WebSocketResponseMessage class]]) { - return NO; - } - WebSocketResponseMessage *otherMessage = other; - return self.hasId == otherMessage.hasId && (!self.hasId || self.id == otherMessage.id) && - self.hasStatus == otherMessage.hasStatus && (!self.hasStatus || self.status == otherMessage.status) && - self.hasMessage == otherMessage.hasMessage && - (!self.hasMessage || [self.message isEqual:otherMessage.message]) && self.hasBody == otherMessage.hasBody && - (!self.hasBody || [self.body isEqual:otherMessage.body]) && - (self.unknownFields == otherMessage.unknownFields || - (self.unknownFields != nil && [self.unknownFields isEqual:otherMessage.unknownFields])); -} -- (NSUInteger)hash { - __block NSUInteger hashCode = 7; - if (self.hasId) { - hashCode = hashCode * 31 + [[NSNumber numberWithLongLong:self.id] hash]; - } - if (self.hasStatus) { - hashCode = hashCode * 31 + [[NSNumber numberWithInteger:self.status] hash]; - } - if (self.hasMessage) { - hashCode = hashCode * 31 + [self.message hash]; - } - if (self.hasBody) { - hashCode = hashCode * 31 + [self.body hash]; - } - hashCode = hashCode * 31 + [self.unknownFields hash]; - return hashCode; -} -@end - -@interface WebSocketResponseMessageBuilder () -@property (strong) WebSocketResponseMessage *result; -@end - -@implementation WebSocketResponseMessageBuilder -@synthesize result; -- (id)init { - if ((self = [super init])) { - self.result = [[WebSocketResponseMessage alloc] init]; - } - return self; -} -- (PBGeneratedMessage *)internalGetResult { - return result; -} -- (WebSocketResponseMessageBuilder *)clear { - self.result = [[WebSocketResponseMessage alloc] init]; - return self; -} -- (WebSocketResponseMessageBuilder *)clone { - return [WebSocketResponseMessage builderWithPrototype:result]; -} -- (WebSocketResponseMessage *)defaultInstance { - return [WebSocketResponseMessage defaultInstance]; -} -- (WebSocketResponseMessage *)build { - [self checkInitialized]; - return [self buildPartial]; -} -- (WebSocketResponseMessage *)buildPartial { - WebSocketResponseMessage *returnMe = result; - self.result = nil; - return returnMe; -} -- (WebSocketResponseMessageBuilder *)mergeFrom:(WebSocketResponseMessage *)other { - if (other == [WebSocketResponseMessage defaultInstance]) { - return self; - } - if (other.hasId) { - [self setId:other.id]; - } - if (other.hasStatus) { - [self setStatus:other.status]; - } - if (other.hasMessage) { - [self setMessage:other.message]; - } - if (other.hasBody) { - [self setBody:other.body]; - } - [self mergeUnknownFields:other.unknownFields]; - return self; -} -- (WebSocketResponseMessageBuilder *)mergeFromCodedInputStream:(PBCodedInputStream *)input { - return [self mergeFromCodedInputStream:input extensionRegistry:[PBExtensionRegistry emptyRegistry]]; -} -- (WebSocketResponseMessageBuilder *)mergeFromCodedInputStream:(PBCodedInputStream *)input - extensionRegistry:(PBExtensionRegistry *)extensionRegistry { - PBUnknownFieldSetBuilder *unknownFields = [PBUnknownFieldSet builderWithUnknownFields:self.unknownFields]; - while (YES) { - SInt32 tag = [input readTag]; - switch (tag) { - case 0: - [self setUnknownFields:[unknownFields build]]; - return self; - default: { - if (![self parseUnknownField:input - unknownFields:unknownFields - extensionRegistry:extensionRegistry - tag:tag]) { - [self setUnknownFields:[unknownFields build]]; - return self; - } - break; - } - case 8: { - [self setId:[input readUInt64]]; - break; - } - case 16: { - [self setStatus:[input readUInt32]]; - break; - } - case 26: { - [self setMessage:[input readString]]; - break; - } - case 34: { - [self setBody:[input readData]]; - break; - } - } - } -} -- (BOOL)hasId { - return result.hasId; -} -- (UInt64)id { - return result.id; -} -- (WebSocketResponseMessageBuilder *)setId:(UInt64)value { - result.hasId = YES; - result.id = value; - return self; -} -- (WebSocketResponseMessageBuilder *)clearId { - result.hasId = NO; - result.id = 0L; - return self; -} -- (BOOL)hasStatus { - return result.hasStatus; -} -- (UInt32)status { - return result.status; -} -- (WebSocketResponseMessageBuilder *)setStatus:(UInt32)value { - result.hasStatus = YES; - result.status = value; - return self; -} -- (WebSocketResponseMessageBuilder *)clearStatus { - result.hasStatus = NO; - result.status = 0; - return self; -} -- (BOOL)hasMessage { - return result.hasMessage; -} -- (NSString *)message { - return result.message; -} -- (WebSocketResponseMessageBuilder *)setMessage:(NSString *)value { - result.hasMessage = YES; - result.message = value; - return self; -} -- (WebSocketResponseMessageBuilder *)clearMessage { - result.hasMessage = NO; - result.message = @""; - return self; -} -- (BOOL)hasBody { - return result.hasBody; -} -- (NSData *)body { - return result.body; -} -- (WebSocketResponseMessageBuilder *)setBody:(NSData *)value { - result.hasBody = YES; - result.body = value; - return self; -} -- (WebSocketResponseMessageBuilder *)clearBody { - result.hasBody = NO; - result.body = [NSData data]; - return self; -} -@end - -@interface WebSocketMessage () -@property WebSocketMessageType type; -@property (strong) WebSocketRequestMessage *request; -@property (strong) WebSocketResponseMessage *response; -@end - -@implementation WebSocketMessage - -- (BOOL)hasType { - return !!hasType_; -} -- (void)setHasType:(BOOL)value_ { - hasType_ = !!value_; -} -@synthesize type; -- (BOOL)hasRequest { - return !!hasRequest_; -} -- (void)setHasRequest:(BOOL)value_ { - hasRequest_ = !!value_; -} -@synthesize request; -- (BOOL)hasResponse { - return !!hasResponse_; -} -- (void)setHasResponse:(BOOL)value_ { - hasResponse_ = !!value_; -} -@synthesize response; -- (id)init { - if ((self = [super init])) { - self.type = WebSocketMessageTypeUnknown; - self.request = [WebSocketRequestMessage defaultInstance]; - self.response = [WebSocketResponseMessage defaultInstance]; - } - return self; -} -static WebSocketMessage *defaultWebSocketMessageInstance = nil; -+ (void)initialize { - if (self == [WebSocketMessage class]) { - defaultWebSocketMessageInstance = [[WebSocketMessage alloc] init]; - } -} -+ (WebSocketMessage *)defaultInstance { - return defaultWebSocketMessageInstance; -} -- (WebSocketMessage *)defaultInstance { - return defaultWebSocketMessageInstance; -} -- (BOOL)isInitialized { - return YES; -} -- (void)writeToCodedOutputStream:(PBCodedOutputStream *)output { - if (self.hasType) { - [output writeEnum:1 value:self.type]; - } - if (self.hasRequest) { - [output writeMessage:2 value:self.request]; - } - if (self.hasResponse) { - [output writeMessage:3 value:self.response]; - } - [self.unknownFields writeToCodedOutputStream:output]; -} -- (SInt32)serializedSize { - __block SInt32 size_ = memoizedSerializedSize; - if (size_ != -1) { - return size_; - } - - size_ = 0; - if (self.hasType) { - size_ += computeEnumSize(1, self.type); - } - if (self.hasRequest) { - size_ += computeMessageSize(2, self.request); - } - if (self.hasResponse) { - size_ += computeMessageSize(3, self.response); - } - size_ += self.unknownFields.serializedSize; - memoizedSerializedSize = size_; - return size_; -} -+ (WebSocketMessage *)parseFromData:(NSData *)data { - return (WebSocketMessage *)[[[WebSocketMessage builder] mergeFromData:data] build]; -} -+ (WebSocketMessage *)parseFromData:(NSData *)data extensionRegistry:(PBExtensionRegistry *)extensionRegistry { - return (WebSocketMessage *)[[[WebSocketMessage builder] mergeFromData:data extensionRegistry:extensionRegistry] - build]; -} -+ (WebSocketMessage *)parseFromInputStream:(NSInputStream *)input { - return (WebSocketMessage *)[[[WebSocketMessage builder] mergeFromInputStream:input] build]; -} -+ (WebSocketMessage *)parseFromInputStream:(NSInputStream *)input - extensionRegistry:(PBExtensionRegistry *)extensionRegistry { - return (WebSocketMessage *)[ - [[WebSocketMessage builder] mergeFromInputStream:input extensionRegistry:extensionRegistry] build]; -} -+ (WebSocketMessage *)parseFromCodedInputStream:(PBCodedInputStream *)input { - return (WebSocketMessage *)[[[WebSocketMessage builder] mergeFromCodedInputStream:input] build]; -} -+ (WebSocketMessage *)parseFromCodedInputStream:(PBCodedInputStream *)input - extensionRegistry:(PBExtensionRegistry *)extensionRegistry { - return (WebSocketMessage *)[ - [[WebSocketMessage builder] mergeFromCodedInputStream:input extensionRegistry:extensionRegistry] build]; -} -+ (WebSocketMessageBuilder *)builder { - return [[WebSocketMessageBuilder alloc] init]; -} -+ (WebSocketMessageBuilder *)builderWithPrototype:(WebSocketMessage *)prototype { - return [[WebSocketMessage builder] mergeFrom:prototype]; -} -- (WebSocketMessageBuilder *)builder { - return [WebSocketMessage builder]; -} -- (WebSocketMessageBuilder *)toBuilder { - return [WebSocketMessage builderWithPrototype:self]; -} -- (void)writeDescriptionTo:(NSMutableString *)output withIndent:(NSString *)indent { - if (self.hasType) { - [output appendFormat:@"%@%@: %d\n", indent, @"type", self.type]; - } - if (self.hasRequest) { - [output appendFormat:@"%@%@ {\n", indent, @"request"]; - [self.request writeDescriptionTo:output withIndent:[NSString stringWithFormat:@"%@ ", indent]]; - [output appendFormat:@"%@}\n", indent]; - } - if (self.hasResponse) { - [output appendFormat:@"%@%@ {\n", indent, @"response"]; - [self.response writeDescriptionTo:output withIndent:[NSString stringWithFormat:@"%@ ", indent]]; - [output appendFormat:@"%@}\n", indent]; - } - [self.unknownFields writeDescriptionTo:output withIndent:indent]; -} -- (BOOL)isEqual:(id)other { - if (other == self) { - return YES; - } - if (![other isKindOfClass:[WebSocketMessage class]]) { - return NO; - } - WebSocketMessage *otherMessage = other; - return self.hasType == otherMessage.hasType && (!self.hasType || self.type == otherMessage.type) && - self.hasRequest == otherMessage.hasRequest && - (!self.hasRequest || [self.request isEqual:otherMessage.request]) && - self.hasResponse == otherMessage.hasResponse && - (!self.hasResponse || [self.response isEqual:otherMessage.response]) && - (self.unknownFields == otherMessage.unknownFields || - (self.unknownFields != nil && [self.unknownFields isEqual:otherMessage.unknownFields])); -} -- (NSUInteger)hash { - __block NSUInteger hashCode = 7; - if (self.hasType) { - hashCode = hashCode * 31 + self.type; - } - if (self.hasRequest) { - hashCode = hashCode * 31 + [self.request hash]; - } - if (self.hasResponse) { - hashCode = hashCode * 31 + [self.response hash]; - } - hashCode = hashCode * 31 + [self.unknownFields hash]; - return hashCode; -} -@end - -BOOL WebSocketMessageTypeIsValidValue(WebSocketMessageType value) { - switch (value) { - case WebSocketMessageTypeUnknown: - case WebSocketMessageTypeRequest: - case WebSocketMessageTypeResponse: - return YES; - default: - return NO; - } -} -@interface WebSocketMessageBuilder () -@property (strong) WebSocketMessage *result; -@end - -@implementation WebSocketMessageBuilder -@synthesize result; -- (id)init { - if ((self = [super init])) { - self.result = [[WebSocketMessage alloc] init]; - } - return self; -} -- (PBGeneratedMessage *)internalGetResult { - return result; -} -- (WebSocketMessageBuilder *)clear { - self.result = [[WebSocketMessage alloc] init]; - return self; -} -- (WebSocketMessageBuilder *)clone { - return [WebSocketMessage builderWithPrototype:result]; -} -- (WebSocketMessage *)defaultInstance { - return [WebSocketMessage defaultInstance]; -} -- (WebSocketMessage *)build { - [self checkInitialized]; - return [self buildPartial]; -} -- (WebSocketMessage *)buildPartial { - WebSocketMessage *returnMe = result; - self.result = nil; - return returnMe; -} -- (WebSocketMessageBuilder *)mergeFrom:(WebSocketMessage *)other { - if (other == [WebSocketMessage defaultInstance]) { - return self; - } - if (other.hasType) { - [self setType:other.type]; - } - if (other.hasRequest) { - [self mergeRequest:other.request]; - } - if (other.hasResponse) { - [self mergeResponse:other.response]; - } - [self mergeUnknownFields:other.unknownFields]; - return self; -} -- (WebSocketMessageBuilder *)mergeFromCodedInputStream:(PBCodedInputStream *)input { - return [self mergeFromCodedInputStream:input extensionRegistry:[PBExtensionRegistry emptyRegistry]]; -} -- (WebSocketMessageBuilder *)mergeFromCodedInputStream:(PBCodedInputStream *)input - extensionRegistry:(PBExtensionRegistry *)extensionRegistry { - PBUnknownFieldSetBuilder *unknownFields = [PBUnknownFieldSet builderWithUnknownFields:self.unknownFields]; - while (YES) { - SInt32 tag = [input readTag]; - switch (tag) { - case 0: - [self setUnknownFields:[unknownFields build]]; - return self; - default: { - if (![self parseUnknownField:input - unknownFields:unknownFields - extensionRegistry:extensionRegistry - tag:tag]) { - [self setUnknownFields:[unknownFields build]]; - return self; - } - break; - } - case 8: { - WebSocketMessageType value = (WebSocketMessageType)[input readEnum]; - if (WebSocketMessageTypeIsValidValue(value)) { - [self setType:value]; - } else { - [unknownFields mergeVarintField:1 value:value]; - } - break; - } - case 18: { - WebSocketRequestMessageBuilder *subBuilder = [WebSocketRequestMessage builder]; - if (self.hasRequest) { - [subBuilder mergeFrom:self.request]; - } - [input readMessage:subBuilder extensionRegistry:extensionRegistry]; - [self setRequest:[subBuilder buildPartial]]; - break; - } - case 26: { - WebSocketResponseMessageBuilder *subBuilder = [WebSocketResponseMessage builder]; - if (self.hasResponse) { - [subBuilder mergeFrom:self.response]; - } - [input readMessage:subBuilder extensionRegistry:extensionRegistry]; - [self setResponse:[subBuilder buildPartial]]; - break; - } - } - } -} -- (BOOL)hasType { - return result.hasType; -} -- (WebSocketMessageType)type { - return result.type; -} -- (WebSocketMessageBuilder *)setType:(WebSocketMessageType)value { - result.hasType = YES; - result.type = value; - return self; -} -- (WebSocketMessageBuilder *)clearType { - result.hasType = NO; - result.type = WebSocketMessageTypeUnknown; - return self; -} -- (BOOL)hasRequest { - return result.hasRequest; -} -- (WebSocketRequestMessage *)request { - return result.request; -} -- (WebSocketMessageBuilder *)setRequest:(WebSocketRequestMessage *)value { - result.hasRequest = YES; - result.request = value; - return self; -} -- (WebSocketMessageBuilder *)setRequestBuilder:(WebSocketRequestMessageBuilder *)builderForValue { - return [self setRequest:[builderForValue build]]; -} -- (WebSocketMessageBuilder *)mergeRequest:(WebSocketRequestMessage *)value { - if (result.hasRequest && result.request != [WebSocketRequestMessage defaultInstance]) { - result.request = [[[WebSocketRequestMessage builderWithPrototype:result.request] mergeFrom:value] buildPartial]; - } else { - result.request = value; - } - result.hasRequest = YES; - return self; -} -- (WebSocketMessageBuilder *)clearRequest { - result.hasRequest = NO; - result.request = [WebSocketRequestMessage defaultInstance]; - return self; -} -- (BOOL)hasResponse { - return result.hasResponse; -} -- (WebSocketResponseMessage *)response { - return result.response; -} -- (WebSocketMessageBuilder *)setResponse:(WebSocketResponseMessage *)value { - result.hasResponse = YES; - result.response = value; - return self; -} -- (WebSocketMessageBuilder *)setResponseBuilder:(WebSocketResponseMessageBuilder *)builderForValue { - return [self setResponse:[builderForValue build]]; -} -- (WebSocketMessageBuilder *)mergeResponse:(WebSocketResponseMessage *)value { - if (result.hasResponse && result.response != [WebSocketResponseMessage defaultInstance]) { - result.response = - [[[WebSocketResponseMessage builderWithPrototype:result.response] mergeFrom:value] buildPartial]; - } else { - result.response = value; - } - result.hasResponse = YES; - return self; -} -- (WebSocketMessageBuilder *)clearResponse { - result.hasResponse = NO; - result.response = [WebSocketResponseMessage defaultInstance]; - return self; -} -@end - - -// @@protoc_insertion_point(global_scope) diff --git a/SignalServiceKit/src/Network/WebSockets/TSSocketManager.h b/SignalServiceKit/src/Network/WebSockets/TSSocketManager.h index 9c2a1aaeae..00d26231d9 100644 --- a/SignalServiceKit/src/Network/WebSockets/TSSocketManager.h +++ b/SignalServiceKit/src/Network/WebSockets/TSSocketManager.h @@ -1,9 +1,11 @@ // -// Copyright (c) 2017 Open Whisper Systems. All rights reserved. +// Copyright (c) 2018 Open Whisper Systems. All rights reserved. // #import +NS_ASSUME_NONNULL_BEGIN + static void *SocketManagerStateObservationContext = &SocketManagerStateObservationContext; extern NSString *const kNSNotification_SocketManagerStateDidChange; @@ -14,9 +16,16 @@ typedef NS_ENUM(NSUInteger, SocketManagerState) { SocketManagerStateOpen, }; +typedef void (^TSSocketMessageSuccess)(id _Nullable responseObject); +// statusCode is zero by default, if request never made or failed. +typedef void (^TSSocketMessageFailure)(NSInteger statusCode, NSError *error); + +@class TSRequest; + @interface TSSocketManager : NSObject @property (nonatomic, readonly) SocketManagerState state; +@property (atomic, readonly) BOOL canMakeRequests; + (instancetype)sharedManager; @@ -33,4 +42,12 @@ typedef NS_ENUM(NSUInteger, SocketManagerState) { // This method can be called from any thread. + (void)requestSocketOpen; +#pragma mark - Message Sending + +- (void)makeRequest:(TSRequest *)request + success:(TSSocketMessageSuccess)success + failure:(TSSocketMessageFailure)failure; + @end + +NS_ASSUME_NONNULL_END diff --git a/SignalServiceKit/src/Network/WebSockets/TSSocketManager.m b/SignalServiceKit/src/Network/WebSockets/TSSocketManager.m index b183a6df2e..ad02a440c7 100644 --- a/SignalServiceKit/src/Network/WebSockets/TSSocketManager.m +++ b/SignalServiceKit/src/Network/WebSockets/TSSocketManager.m @@ -10,18 +10,22 @@ #import "NSTimer+OWS.h" #import "NotificationsProtocol.h" #import "OWSBackgroundTask.h" +#import "OWSError.h" #import "OWSMessageManager.h" #import "OWSMessageReceiver.h" #import "OWSPrimaryStorage.h" #import "OWSSignalService.h" #import "OWSSignalServiceProtos.pb.h" #import "OWSWebsocketSecurityPolicy.h" -#import "SubProtocol.pb.h" #import "TSAccountManager.h" #import "TSConstants.h" #import "TSErrorMessage.h" +#import "TSRequest.h" #import "TextSecureKitEnv.h" #import "Threading.h" +#import "WebSocketResources.pb.h" + +NS_ASSUME_NONNULL_BEGIN static const CGFloat kSocketHeartbeatPeriodSeconds = 30.f; static const CGFloat kSocketReconnectDelaySeconds = 5.f; @@ -33,9 +37,102 @@ static const CGFloat kSocketReconnectDelaySeconds = 5.f; static const CGFloat kBackgroundOpenSocketDurationSeconds = 25.f; // b) It has received a message over the socket in the last 15 seconds. static const CGFloat kBackgroundKeepSocketAliveDurationSeconds = 15.f; +// c) It is in the process of making a request. +static const CGFloat kMakeRequestKeepSocketAliveDurationSeconds = 30.f; NSString *const kNSNotification_SocketManagerStateDidChange = @"kNSNotification_SocketManagerStateDidChange"; +@interface TSSocketMessage : NSObject + +@property (nonatomic, readonly) UInt64 requestId; +@property (nonatomic, nullable) TSSocketMessageSuccess success; +@property (nonatomic, nullable) TSSocketMessageFailure failure; +@property (nonatomic) BOOL hasCompleted; +@property (nonatomic, readonly) OWSBackgroundTask *backgroundTask; + +- (instancetype)init NS_UNAVAILABLE; + +@end + +#pragma mark - + +@implementation TSSocketMessage + +- (instancetype)initWithRequestId:(UInt64)requestId + success:(TSSocketMessageSuccess)success + failure:(TSSocketMessageFailure)failure +{ + if (self = [super init]) { + OWSAssert(success); + OWSAssert(failure); + + _requestId = requestId; + _success = success; + _failure = failure; + _backgroundTask = [OWSBackgroundTask backgroundTaskWithLabelStr:__PRETTY_FUNCTION__]; + } + + return self; +} + +- (void)didSucceedWithResponseObject:(id _Nullable)responseObject +{ + @synchronized(self) + { + if (self.hasCompleted) { + return; + } + self.hasCompleted = YES; + } + + OWSAssert(self.success); + OWSAssert(self.failure); + + TSSocketMessageSuccess success = self.success; + dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ + success(responseObject); + }); + + self.success = nil; + self.failure = nil; +} + +- (void)didFailBeforeSending +{ + NSError *error = OWSErrorWithCodeDescription(OWSErrorCodeMessageRequestFailed, + NSLocalizedString(@"ERROR_DESCRIPTION_REQUEST_FAILED", @"Error indicating that a socket request failed.")); + + [self didFailWithStatusCode:0 error:error]; +} + +- (void)didFailWithStatusCode:(NSInteger)statusCode error:(NSError *)error +{ + OWSAssert(error); + + @synchronized(self) + { + if (self.hasCompleted) { + return; + } + self.hasCompleted = YES; + } + + OWSAssert(self.success); + OWSAssert(self.failure); + + TSSocketMessageFailure failure = self.failure; + dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ + failure(statusCode, error); + }); + + self.success = nil; + self.failure = nil; +} + +@end + +#pragma mark - + // TSSocketManager's properties should only be accessed from the main thread. @interface TSSocketManager () @@ -46,9 +143,9 @@ NSString *const kNSNotification_SocketManagerStateDidChange = @"kNSNotification_ // // The first tier is the actual websocket and the timers used // to keep it alive and connected. -@property (nonatomic) SRWebSocket *websocket; -@property (nonatomic) NSTimer *heartbeatTimer; -@property (nonatomic) NSTimer *reconnectTimer; +@property (nonatomic, nullable) SRWebSocket *websocket; +@property (nonatomic, nullable) NSTimer *heartbeatTimer; +@property (nonatomic, nullable) NSTimer *reconnectTimer; #pragma mark - @@ -60,6 +157,8 @@ NSString *const kNSNotification_SocketManagerStateDidChange = @"kNSNotification_ // Due to concurrency, this property can fall out of sync with the // websocket's actual state, so we're defensive and distrustful of // this property. +// +// We only ever access this state on the main thread. @property (nonatomic) SocketManagerState state; #pragma mark - @@ -72,13 +171,13 @@ NSString *const kNSNotification_SocketManagerStateDidChange = @"kNSNotification_ // trying to keep the socket open), all three should be clear. // // This represents how long we're trying to keep the socket open. -@property (nonatomic) NSDate *backgroundKeepAliveUntilDate; +@property (nonatomic, nullable) NSDate *backgroundKeepAliveUntilDate; // This timer is used to check periodically whether we should // close the socket. -@property (nonatomic) NSTimer *backgroundKeepAliveTimer; +@property (nonatomic, nullable) NSTimer *backgroundKeepAliveTimer; // This is used to manage the iOS "background task" used to // keep the app alive in the background. -@property (nonatomic) OWSBackgroundTask *backgroundTask; +@property (nonatomic, nullable) OWSBackgroundTask *backgroundTask; // We cache this value instead of consulting [UIApplication sharedApplication].applicationState, // because UIKit only provides a "will resign active" notification, not a "did resign active" @@ -87,6 +186,11 @@ NSString *const kNSNotification_SocketManagerStateDidChange = @"kNSNotification_ @property (nonatomic) BOOL hasObservedNotifications; +// This property should only be accessed while synchronized on the socket manager. +@property (nonatomic, readonly) NSMutableDictionary *socketMessageMap; + +@property (atomic) BOOL canMakeRequests; + @end #pragma mark - @@ -106,6 +210,7 @@ NSString *const kNSNotification_SocketManagerStateDidChange = @"kNSNotification_ _signalService = [OWSSignalService sharedInstance]; _messageReceiver = [OWSMessageReceiver sharedInstance]; _state = SocketManagerStateClosed; + _socketMessageMap = [NSMutableDictionary new]; OWSSingletonAssert(); @@ -290,13 +395,17 @@ NSString *const kNSNotification_SocketManagerStateDidChange = @"kNSNotification_ // the socket failed immediately for some reason), so we update the state // _before_ calling it, not after. _state = state; + _canMakeRequests = state == SocketManagerStateOpen; [socket open]; + [self failAllPendingSocketMessagesIfNecessary]; return; } } _state = state; + _canMakeRequests = state == SocketManagerStateOpen; + [self failAllPendingSocketMessagesIfNecessary]; [self notifyStatusChange]; } @@ -330,6 +439,201 @@ NSString *const kNSNotification_SocketManagerStateDidChange = @"kNSNotification_ self.state = SocketManagerStateClosed; } +#pragma mark - Message Sending + +- (void)makeRequest:(TSRequest *)request success:(TSSocketMessageSuccess)success failure:(TSSocketMessageFailure)failure +{ + OWSAssert(request); + OWSAssert(request.HTTPMethod.length > 0); + OWSAssert(success); + OWSAssert(failure); + + TSSocketMessage *socketMessage = + [[TSSocketMessage alloc] initWithRequestId:[Cryptography randomUInt64] success:success failure:failure]; + + @synchronized(self) + { + self.socketMessageMap[@(socketMessage.requestId)] = socketMessage; + } + + NSURL *requestUrl = request.URL; + NSString *requestPath = [@"/" stringByAppendingString:requestUrl.path]; + + NSData *_Nullable jsonData = nil; + if (request.parameters) { + NSError *error; + jsonData = [NSJSONSerialization + dataWithJSONObject:request.parameters + options:(NSJSONWritingOptions)0 + error:&error]; + if (!jsonData || error) { + OWSProdLogAndFail(@"%@ could not serialize request JSON: %@", self.logTag, error); + [socketMessage didFailBeforeSending]; + return; + } + } + + WebSocketResourcesWebSocketRequestMessageBuilder *requestBuilder = + [WebSocketResourcesWebSocketRequestMessageBuilder new]; + requestBuilder.id = socketMessage.requestId; + [requestBuilder setVerb:request.HTTPMethod]; + [requestBuilder setPath:requestPath]; + if (jsonData) { + // TODO: Do we need body & headers for requests with no parameters? + [requestBuilder setBody:jsonData]; + [requestBuilder setHeadersArray:@[ + @"content-type:application/json", + ]]; + } + + WebSocketResourcesWebSocketMessageBuilder *messageBuilder = [WebSocketResourcesWebSocketMessageBuilder new]; + [messageBuilder setType:WebSocketResourcesWebSocketMessageTypeRequest]; + [messageBuilder setRequestBuilder:requestBuilder]; + + NSData *messageData = [messageBuilder build].data; + if (!messageData) { + OWSProdLogAndFail(@"%@ could not serialize message.", self.logTag); + [socketMessage didFailBeforeSending]; + return; + } + + if (!self.canMakeRequests) { + DDLogError(@"%@ makeRequest: socket not open.", self.logTag); + [socketMessage didFailBeforeSending]; + return; + } + + NSError *error; + BOOL wasScheduled = [self.websocket sendDataNoCopy:messageData error:&error]; + if (!wasScheduled || error) { + OWSProdLogAndFail(@"%@ could not serialize request JSON: %@", self.logTag, error); + [socketMessage didFailBeforeSending]; + return; + } + DDLogVerbose(@"%@ message scheduled: %lld, %@, %@, %zd.", + self.logTag, + socketMessage.requestId, + request.HTTPMethod, + requestPath, + jsonData.length); + + const int64_t kSocketTimeoutSeconds = 10; + __weak TSSocketMessage *weakSocketMessage = socketMessage; + dispatch_after(dispatch_time(DISPATCH_TIME_NOW, kSocketTimeoutSeconds * NSEC_PER_SEC), + dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), + ^{ + [weakSocketMessage didFailBeforeSending]; + }); +} + +- (void)processWebSocketResponseMessage:(WebSocketResourcesWebSocketResponseMessage *)message +{ + OWSAssertIsOnMainThread(); + OWSAssert(message); + + dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ + [self processWebSocketResponseMessageAsync:message]; + }); +} + +- (void)processWebSocketResponseMessageAsync:(WebSocketResourcesWebSocketResponseMessage *)message +{ + OWSAssert(message); + + DDLogInfo(@"%@ received WebSocket response.", self.logTag); + + if (![message hasId]) { + DDLogError(@"%@ received incomplete WebSocket response.", self.logTag); + return; + } + + DispatchMainThreadSafe(^{ + [self requestSocketAliveForAtLeastSeconds:kMakeRequestKeepSocketAliveDurationSeconds]; + }); + + UInt64 requestId = message.id; + UInt32 responseStatus = 0; + if (message.hasStatus) { + responseStatus = message.status; + } + NSString *_Nullable responseMessage; + if (message.hasMessage) { + responseMessage = message.message; + } + NSData *_Nullable responseBody; + if (message.hasBody) { + responseBody = message.body; + } + NSArray *_Nullable responseHeaders = message.headers; + + BOOL hasValidResponse = YES; + id responseObject = responseBody; + if (responseBody) { + NSError *error; + id _Nullable responseJson = + [NSJSONSerialization JSONObjectWithData:responseBody options:(NSJSONReadingOptions)0 error:&error]; + if (!responseJson || error) { + OWSProdLogAndFail(@"%@ could not parse WebSocket response JSON: %@.", self.logTag, error); + hasValidResponse = NO; + } else { + responseObject = responseJson; + } + } + + TSSocketMessage *_Nullable socketMessage; + @synchronized(self) + { + socketMessage = self.socketMessageMap[@(requestId)]; + [self.socketMessageMap removeObjectForKey:@(requestId)]; + } + + if (!socketMessage) { + DDLogError(@"%@ received response to unknown request.", self.logTag); + } else { + BOOL hasSuccessStatus = 200 <= responseStatus && responseStatus <= 299; + BOOL didSucceed = hasSuccessStatus && hasValidResponse; + if (didSucceed) { + [socketMessage didSucceedWithResponseObject:responseObject]; + } else { + NSError *error = OWSErrorWithCodeDescription(OWSErrorCodeMessageResponseFailed, + NSLocalizedString( + @"ERROR_DESCRIPTION_RESPONSE_FAILED", @"Error indicating that a socket response failed.")); + [socketMessage didFailWithStatusCode:(NSInteger)responseStatus error:error]; + } + } + + DDLogVerbose(@"%@ received WebSocket response: %llu, %zd, %@, %zd, %@, %d, %@.", + self.logTag, + (unsigned long long)requestId, + (NSInteger)responseStatus, + responseMessage, + responseBody.length, + responseHeaders, + socketMessage != nil, + responseObject); +} + +- (void)failAllPendingSocketMessagesIfNecessary +{ + if (!self.canMakeRequests) { + [self failAllPendingSocketMessages]; + } +} + +- (void)failAllPendingSocketMessages +{ + NSArray *socketMessages; + @synchronized(self) + { + socketMessages = self.socketMessageMap.allValues; + [self.socketMessageMap removeAllObjects]; + } + + for (TSSocketMessage *socketMessage in socketMessages) { + [socketMessage didFailBeforeSending]; + } +} + #pragma mark - Delegate methods - (void)webSocketDidOpen:(SRWebSocket *)webSocket { @@ -359,23 +663,32 @@ NSString *const kNSNotification_SocketManagerStateDidChange = @"kNSNotification_ - (void)webSocket:(SRWebSocket *)webSocket didReceiveMessage:(NSData *)data { OWSAssertIsOnMainThread(); OWSAssert(webSocket); + if (webSocket != self.websocket) { // Ignore events from obsolete web sockets. return; } - WebSocketMessage *wsMessage = [WebSocketMessage parseFromData:data]; + WebSocketResourcesWebSocketMessage *wsMessage; + @try { + wsMessage = [WebSocketResourcesWebSocketMessage parseFromData:data]; + } @catch (NSException *exception) { + OWSProdLogAndFail(@"%@ Received an invalid message: %@", self.logTag, exception.debugDescription); + // TODO: Add analytics. + return; + } - if (wsMessage.type == WebSocketMessageTypeRequest) { + if (wsMessage.type == WebSocketResourcesWebSocketMessageTypeRequest) { [self processWebSocketRequestMessage:wsMessage.request]; - } else if (wsMessage.type == WebSocketMessageTypeResponse) { + } else if (wsMessage.type == WebSocketResourcesWebSocketMessageTypeResponse) { [self processWebSocketResponseMessage:wsMessage.response]; } else { - DDLogWarn(@"Got a WebSocketMessage of unknown type"); + DDLogWarn(@"%@ webSocket:didReceiveMessage: unknown.", self.logTag); } } -- (void)processWebSocketRequestMessage:(WebSocketRequestMessage *)message { +- (void)processWebSocketRequestMessage:(WebSocketResourcesWebSocketRequestMessage *)message +{ OWSAssertIsOnMainThread(); DDLogInfo(@"%@ Got message with verb: %@ and path: %@", self.logTag, message.verb, message.path); @@ -432,23 +745,18 @@ NSString *const kNSNotification_SocketManagerStateDidChange = @"kNSNotification_ } } -- (void)processWebSocketResponseMessage:(WebSocketResponseMessage *)message { +- (void)sendWebSocketMessageAcknowledgement:(WebSocketResourcesWebSocketRequestMessage *)request +{ OWSAssertIsOnMainThread(); - DDLogWarn(@"Client should not receive WebSocket Respond messages"); -} - -- (void)sendWebSocketMessageAcknowledgement:(WebSocketRequestMessage *)request { - OWSAssertIsOnMainThread(); - - WebSocketResponseMessageBuilder *response = [WebSocketResponseMessage builder]; + WebSocketResourcesWebSocketResponseMessageBuilder *response = [WebSocketResourcesWebSocketResponseMessage builder]; [response setStatus:200]; [response setMessage:@"OK"]; [response setId:request.id]; - WebSocketMessageBuilder *message = [WebSocketMessage builder]; + WebSocketResourcesWebSocketMessageBuilder *message = [WebSocketResourcesWebSocketMessage builder]; [message setResponse:response.build]; - [message setType:WebSocketMessageTypeResponse]; + [message setType:WebSocketResourcesWebSocketMessageTypeResponse]; NSError *error; [self.websocket sendDataNoCopy:message.build.data error:&error]; @@ -475,9 +783,10 @@ NSString *const kNSNotification_SocketManagerStateDidChange = @"kNSNotification_ } - (void)webSocket:(SRWebSocket *)webSocket - didCloseWithCode:(NSInteger)code - reason:(NSString *)reason - wasClean:(BOOL)wasClean { + didCloseWithCode:(NSInteger)code + reason:(nullable NSString *)reason + wasClean:(BOOL)wasClean +{ OWSAssertIsOnMainThread(); OWSAssert(webSocket); if (webSocket != self.websocket) { @@ -730,3 +1039,5 @@ NSString *const kNSNotification_SocketManagerStateDidChange = @"kNSNotification_ } @end + +NS_ASSUME_NONNULL_END diff --git a/SignalServiceKit/src/Network/WebSockets/WebSocketResources.pb.h b/SignalServiceKit/src/Network/WebSockets/WebSocketResources.pb.h new file mode 100644 index 0000000000..7cfcb03e53 --- /dev/null +++ b/SignalServiceKit/src/Network/WebSockets/WebSocketResources.pb.h @@ -0,0 +1,330 @@ +// Generated by the protocol buffer compiler. DO NOT EDIT! + +#import + +// @@protoc_insertion_point(imports) + +@class ObjectiveCFileOptions; +@class ObjectiveCFileOptionsBuilder; +@class PBDescriptorProto; +@class PBDescriptorProtoBuilder; +@class PBDescriptorProtoExtensionRange; +@class PBDescriptorProtoExtensionRangeBuilder; +@class PBEnumDescriptorProto; +@class PBEnumDescriptorProtoBuilder; +@class PBEnumOptions; +@class PBEnumOptionsBuilder; +@class PBEnumValueDescriptorProto; +@class PBEnumValueDescriptorProtoBuilder; +@class PBEnumValueOptions; +@class PBEnumValueOptionsBuilder; +@class PBFieldDescriptorProto; +@class PBFieldDescriptorProtoBuilder; +@class PBFieldOptions; +@class PBFieldOptionsBuilder; +@class PBFileDescriptorProto; +@class PBFileDescriptorProtoBuilder; +@class PBFileDescriptorSet; +@class PBFileDescriptorSetBuilder; +@class PBFileOptions; +@class PBFileOptionsBuilder; +@class PBMessageOptions; +@class PBMessageOptionsBuilder; +@class PBMethodDescriptorProto; +@class PBMethodDescriptorProtoBuilder; +@class PBMethodOptions; +@class PBMethodOptionsBuilder; +@class PBOneofDescriptorProto; +@class PBOneofDescriptorProtoBuilder; +@class PBServiceDescriptorProto; +@class PBServiceDescriptorProtoBuilder; +@class PBServiceOptions; +@class PBServiceOptionsBuilder; +@class PBSourceCodeInfo; +@class PBSourceCodeInfoBuilder; +@class PBSourceCodeInfoLocation; +@class PBSourceCodeInfoLocationBuilder; +@class PBUninterpretedOption; +@class PBUninterpretedOptionBuilder; +@class PBUninterpretedOptionNamePart; +@class PBUninterpretedOptionNamePartBuilder; +@class WebSocketResourcesWebSocketMessage; +@class WebSocketResourcesWebSocketMessageBuilder; +@class WebSocketResourcesWebSocketRequestMessage; +@class WebSocketResourcesWebSocketRequestMessageBuilder; +@class WebSocketResourcesWebSocketResponseMessage; +@class WebSocketResourcesWebSocketResponseMessageBuilder; + + +typedef NS_ENUM(SInt32, WebSocketResourcesWebSocketMessageType) { + WebSocketResourcesWebSocketMessageTypeUnknown = 0, + WebSocketResourcesWebSocketMessageTypeRequest = 1, + WebSocketResourcesWebSocketMessageTypeResponse = 2, +}; + +BOOL WebSocketResourcesWebSocketMessageTypeIsValidValue(WebSocketResourcesWebSocketMessageType value); +NSString *NSStringFromWebSocketResourcesWebSocketMessageType(WebSocketResourcesWebSocketMessageType value); + + +@interface WebSocketResourcesWebSocketResourcesRoot : NSObject { +} ++ (PBExtensionRegistry*) extensionRegistry; ++ (void) registerAllExtensions:(PBMutableExtensionRegistry*) registry; +@end + +#define WebSocketRequestMessage_verb @"verb" +#define WebSocketRequestMessage_path @"path" +#define WebSocketRequestMessage_body @"body" +#define WebSocketRequestMessage_headers @"headers" +#define WebSocketRequestMessage_id @"id" +@interface WebSocketResourcesWebSocketRequestMessage : PBGeneratedMessage { +@private + BOOL hasId_:1; + BOOL hasVerb_:1; + BOOL hasPath_:1; + BOOL hasBody_:1; + UInt64 id; + NSString* verb; + NSString* path; + NSData* body; + NSMutableArray * headersArray; +} +- (BOOL) hasVerb; +- (BOOL) hasPath; +- (BOOL) hasBody; +- (BOOL) hasId; +@property (readonly, strong) NSString* verb; +@property (readonly, strong) NSString* path; +@property (readonly, strong) NSData* body; +@property (readonly, strong) NSArray * headers; +@property (readonly) UInt64 id; +- (NSString*)headersAtIndex:(NSUInteger)index; + ++ (instancetype) defaultInstance; +- (instancetype) defaultInstance; + +- (BOOL) isInitialized; +- (void) writeToCodedOutputStream:(PBCodedOutputStream*) output; +- (WebSocketResourcesWebSocketRequestMessageBuilder*) builder; ++ (WebSocketResourcesWebSocketRequestMessageBuilder*) builder; ++ (WebSocketResourcesWebSocketRequestMessageBuilder*) builderWithPrototype:(WebSocketResourcesWebSocketRequestMessage*) prototype; +- (WebSocketResourcesWebSocketRequestMessageBuilder*) toBuilder; + ++ (WebSocketResourcesWebSocketRequestMessage*) parseFromData:(NSData*) data; ++ (WebSocketResourcesWebSocketRequestMessage*) parseFromData:(NSData*) data extensionRegistry:(PBExtensionRegistry*) extensionRegistry; ++ (WebSocketResourcesWebSocketRequestMessage*) parseFromInputStream:(NSInputStream*) input; ++ (WebSocketResourcesWebSocketRequestMessage*) parseFromInputStream:(NSInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry; ++ (WebSocketResourcesWebSocketRequestMessage*) parseFromCodedInputStream:(PBCodedInputStream*) input; ++ (WebSocketResourcesWebSocketRequestMessage*) parseFromCodedInputStream:(PBCodedInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry; +@end + +@interface WebSocketResourcesWebSocketRequestMessageBuilder : PBGeneratedMessageBuilder { +@private + WebSocketResourcesWebSocketRequestMessage* resultWebSocketRequestMessage; +} + +- (WebSocketResourcesWebSocketRequestMessage*) defaultInstance; + +- (WebSocketResourcesWebSocketRequestMessageBuilder*) clear; +- (WebSocketResourcesWebSocketRequestMessageBuilder*) clone; + +- (WebSocketResourcesWebSocketRequestMessage*) build; +- (WebSocketResourcesWebSocketRequestMessage*) buildPartial; + +- (WebSocketResourcesWebSocketRequestMessageBuilder*) mergeFrom:(WebSocketResourcesWebSocketRequestMessage*) other; +- (WebSocketResourcesWebSocketRequestMessageBuilder*) mergeFromCodedInputStream:(PBCodedInputStream*) input; +- (WebSocketResourcesWebSocketRequestMessageBuilder*) mergeFromCodedInputStream:(PBCodedInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry; + +- (BOOL) hasVerb; +- (NSString*) verb; +- (WebSocketResourcesWebSocketRequestMessageBuilder*) setVerb:(NSString*) value; +- (WebSocketResourcesWebSocketRequestMessageBuilder*) clearVerb; + +- (BOOL) hasPath; +- (NSString*) path; +- (WebSocketResourcesWebSocketRequestMessageBuilder*) setPath:(NSString*) value; +- (WebSocketResourcesWebSocketRequestMessageBuilder*) clearPath; + +- (BOOL) hasBody; +- (NSData*) body; +- (WebSocketResourcesWebSocketRequestMessageBuilder*) setBody:(NSData*) value; +- (WebSocketResourcesWebSocketRequestMessageBuilder*) clearBody; + +- (NSMutableArray *)headers; +- (NSString*)headersAtIndex:(NSUInteger)index; +- (WebSocketResourcesWebSocketRequestMessageBuilder *)addHeaders:(NSString*)value; +- (WebSocketResourcesWebSocketRequestMessageBuilder *)setHeadersArray:(NSArray *)array; +- (WebSocketResourcesWebSocketRequestMessageBuilder *)clearHeaders; + +- (BOOL) hasId; +- (UInt64) id; +- (WebSocketResourcesWebSocketRequestMessageBuilder*) setId:(UInt64) value; +- (WebSocketResourcesWebSocketRequestMessageBuilder*) clearId; +@end + +#define WebSocketResponseMessage_id @"id" +#define WebSocketResponseMessage_status @"status" +#define WebSocketResponseMessage_message @"message" +#define WebSocketResponseMessage_headers @"headers" +#define WebSocketResponseMessage_body @"body" +@interface WebSocketResourcesWebSocketResponseMessage : PBGeneratedMessage { +@private + BOOL hasId_:1; + BOOL hasMessage_:1; + BOOL hasBody_:1; + BOOL hasStatus_:1; + UInt64 id; + NSString* message; + NSData* body; + UInt32 status; + NSMutableArray * headersArray; +} +- (BOOL) hasId; +- (BOOL) hasStatus; +- (BOOL) hasMessage; +- (BOOL) hasBody; +@property (readonly) UInt64 id; +@property (readonly) UInt32 status; +@property (readonly, strong) NSString* message; +@property (readonly, strong) NSArray * headers; +@property (readonly, strong) NSData* body; +- (NSString*)headersAtIndex:(NSUInteger)index; + ++ (instancetype) defaultInstance; +- (instancetype) defaultInstance; + +- (BOOL) isInitialized; +- (void) writeToCodedOutputStream:(PBCodedOutputStream*) output; +- (WebSocketResourcesWebSocketResponseMessageBuilder*) builder; ++ (WebSocketResourcesWebSocketResponseMessageBuilder*) builder; ++ (WebSocketResourcesWebSocketResponseMessageBuilder*) builderWithPrototype:(WebSocketResourcesWebSocketResponseMessage*) prototype; +- (WebSocketResourcesWebSocketResponseMessageBuilder*) toBuilder; + ++ (WebSocketResourcesWebSocketResponseMessage*) parseFromData:(NSData*) data; ++ (WebSocketResourcesWebSocketResponseMessage*) parseFromData:(NSData*) data extensionRegistry:(PBExtensionRegistry*) extensionRegistry; ++ (WebSocketResourcesWebSocketResponseMessage*) parseFromInputStream:(NSInputStream*) input; ++ (WebSocketResourcesWebSocketResponseMessage*) parseFromInputStream:(NSInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry; ++ (WebSocketResourcesWebSocketResponseMessage*) parseFromCodedInputStream:(PBCodedInputStream*) input; ++ (WebSocketResourcesWebSocketResponseMessage*) parseFromCodedInputStream:(PBCodedInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry; +@end + +@interface WebSocketResourcesWebSocketResponseMessageBuilder : PBGeneratedMessageBuilder { +@private + WebSocketResourcesWebSocketResponseMessage* resultWebSocketResponseMessage; +} + +- (WebSocketResourcesWebSocketResponseMessage*) defaultInstance; + +- (WebSocketResourcesWebSocketResponseMessageBuilder*) clear; +- (WebSocketResourcesWebSocketResponseMessageBuilder*) clone; + +- (WebSocketResourcesWebSocketResponseMessage*) build; +- (WebSocketResourcesWebSocketResponseMessage*) buildPartial; + +- (WebSocketResourcesWebSocketResponseMessageBuilder*) mergeFrom:(WebSocketResourcesWebSocketResponseMessage*) other; +- (WebSocketResourcesWebSocketResponseMessageBuilder*) mergeFromCodedInputStream:(PBCodedInputStream*) input; +- (WebSocketResourcesWebSocketResponseMessageBuilder*) mergeFromCodedInputStream:(PBCodedInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry; + +- (BOOL) hasId; +- (UInt64) id; +- (WebSocketResourcesWebSocketResponseMessageBuilder*) setId:(UInt64) value; +- (WebSocketResourcesWebSocketResponseMessageBuilder*) clearId; + +- (BOOL) hasStatus; +- (UInt32) status; +- (WebSocketResourcesWebSocketResponseMessageBuilder*) setStatus:(UInt32) value; +- (WebSocketResourcesWebSocketResponseMessageBuilder*) clearStatus; + +- (BOOL) hasMessage; +- (NSString*) message; +- (WebSocketResourcesWebSocketResponseMessageBuilder*) setMessage:(NSString*) value; +- (WebSocketResourcesWebSocketResponseMessageBuilder*) clearMessage; + +- (NSMutableArray *)headers; +- (NSString*)headersAtIndex:(NSUInteger)index; +- (WebSocketResourcesWebSocketResponseMessageBuilder *)addHeaders:(NSString*)value; +- (WebSocketResourcesWebSocketResponseMessageBuilder *)setHeadersArray:(NSArray *)array; +- (WebSocketResourcesWebSocketResponseMessageBuilder *)clearHeaders; + +- (BOOL) hasBody; +- (NSData*) body; +- (WebSocketResourcesWebSocketResponseMessageBuilder*) setBody:(NSData*) value; +- (WebSocketResourcesWebSocketResponseMessageBuilder*) clearBody; +@end + +#define WebSocketMessage_type @"type" +#define WebSocketMessage_request @"request" +#define WebSocketMessage_response @"response" +@interface WebSocketResourcesWebSocketMessage : PBGeneratedMessage { +@private + BOOL hasRequest_:1; + BOOL hasResponse_:1; + BOOL hasType_:1; + WebSocketResourcesWebSocketRequestMessage* request; + WebSocketResourcesWebSocketResponseMessage* response; + WebSocketResourcesWebSocketMessageType type; +} +- (BOOL) hasType; +- (BOOL) hasRequest; +- (BOOL) hasResponse; +@property (readonly) WebSocketResourcesWebSocketMessageType type; +@property (readonly, strong) WebSocketResourcesWebSocketRequestMessage* request; +@property (readonly, strong) WebSocketResourcesWebSocketResponseMessage* response; + ++ (instancetype) defaultInstance; +- (instancetype) defaultInstance; + +- (BOOL) isInitialized; +- (void) writeToCodedOutputStream:(PBCodedOutputStream*) output; +- (WebSocketResourcesWebSocketMessageBuilder*) builder; ++ (WebSocketResourcesWebSocketMessageBuilder*) builder; ++ (WebSocketResourcesWebSocketMessageBuilder*) builderWithPrototype:(WebSocketResourcesWebSocketMessage*) prototype; +- (WebSocketResourcesWebSocketMessageBuilder*) toBuilder; + ++ (WebSocketResourcesWebSocketMessage*) parseFromData:(NSData*) data; ++ (WebSocketResourcesWebSocketMessage*) parseFromData:(NSData*) data extensionRegistry:(PBExtensionRegistry*) extensionRegistry; ++ (WebSocketResourcesWebSocketMessage*) parseFromInputStream:(NSInputStream*) input; ++ (WebSocketResourcesWebSocketMessage*) parseFromInputStream:(NSInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry; ++ (WebSocketResourcesWebSocketMessage*) parseFromCodedInputStream:(PBCodedInputStream*) input; ++ (WebSocketResourcesWebSocketMessage*) parseFromCodedInputStream:(PBCodedInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry; +@end + +@interface WebSocketResourcesWebSocketMessageBuilder : PBGeneratedMessageBuilder { +@private + WebSocketResourcesWebSocketMessage* resultWebSocketMessage; +} + +- (WebSocketResourcesWebSocketMessage*) defaultInstance; + +- (WebSocketResourcesWebSocketMessageBuilder*) clear; +- (WebSocketResourcesWebSocketMessageBuilder*) clone; + +- (WebSocketResourcesWebSocketMessage*) build; +- (WebSocketResourcesWebSocketMessage*) buildPartial; + +- (WebSocketResourcesWebSocketMessageBuilder*) mergeFrom:(WebSocketResourcesWebSocketMessage*) other; +- (WebSocketResourcesWebSocketMessageBuilder*) mergeFromCodedInputStream:(PBCodedInputStream*) input; +- (WebSocketResourcesWebSocketMessageBuilder*) mergeFromCodedInputStream:(PBCodedInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry; + +- (BOOL) hasType; +- (WebSocketResourcesWebSocketMessageType) type; +- (WebSocketResourcesWebSocketMessageBuilder*) setType:(WebSocketResourcesWebSocketMessageType) value; +- (WebSocketResourcesWebSocketMessageBuilder*) clearType; + +- (BOOL) hasRequest; +- (WebSocketResourcesWebSocketRequestMessage*) request; +- (WebSocketResourcesWebSocketMessageBuilder*) setRequest:(WebSocketResourcesWebSocketRequestMessage*) value; +- (WebSocketResourcesWebSocketMessageBuilder*) setRequestBuilder:(WebSocketResourcesWebSocketRequestMessageBuilder*) builderForValue; +- (WebSocketResourcesWebSocketMessageBuilder*) mergeRequest:(WebSocketResourcesWebSocketRequestMessage*) value; +- (WebSocketResourcesWebSocketMessageBuilder*) clearRequest; + +- (BOOL) hasResponse; +- (WebSocketResourcesWebSocketResponseMessage*) response; +- (WebSocketResourcesWebSocketMessageBuilder*) setResponse:(WebSocketResourcesWebSocketResponseMessage*) value; +- (WebSocketResourcesWebSocketMessageBuilder*) setResponseBuilder:(WebSocketResourcesWebSocketResponseMessageBuilder*) builderForValue; +- (WebSocketResourcesWebSocketMessageBuilder*) mergeResponse:(WebSocketResourcesWebSocketResponseMessage*) value; +- (WebSocketResourcesWebSocketMessageBuilder*) clearResponse; +@end + + +// @@protoc_insertion_point(global_scope) diff --git a/SignalServiceKit/src/Network/WebSockets/WebSocketResources.pb.m b/SignalServiceKit/src/Network/WebSockets/WebSocketResources.pb.m new file mode 100644 index 0000000000..3e5f0f30d2 --- /dev/null +++ b/SignalServiceKit/src/Network/WebSockets/WebSocketResources.pb.m @@ -0,0 +1,1233 @@ +// Generated by the protocol buffer compiler. DO NOT EDIT! + +#import "WebSocketResources.pb.h" +// @@protoc_insertion_point(imports) + +@implementation WebSocketResourcesWebSocketResourcesRoot +static PBExtensionRegistry* extensionRegistry = nil; ++ (PBExtensionRegistry*) extensionRegistry { + return extensionRegistry; +} + ++ (void) initialize { + if (self == [WebSocketResourcesWebSocketResourcesRoot class]) { + PBMutableExtensionRegistry* registry = [PBMutableExtensionRegistry registry]; + [self registerAllExtensions:registry]; + [ObjectivecDescriptorRoot registerAllExtensions:registry]; + extensionRegistry = registry; + } +} ++ (void) registerAllExtensions:(PBMutableExtensionRegistry*) registry { +} +@end + +@interface WebSocketResourcesWebSocketRequestMessage () +@property (strong) NSString* verb; +@property (strong) NSString* path; +@property (strong) NSData* body; +@property (strong) NSMutableArray * headersArray; +@property UInt64 id; +@end + +@implementation WebSocketResourcesWebSocketRequestMessage + +- (BOOL) hasVerb { + return !!hasVerb_; +} +- (void) setHasVerb:(BOOL) _value_ { + hasVerb_ = !!_value_; +} +@synthesize verb; +- (BOOL) hasPath { + return !!hasPath_; +} +- (void) setHasPath:(BOOL) _value_ { + hasPath_ = !!_value_; +} +@synthesize path; +- (BOOL) hasBody { + return !!hasBody_; +} +- (void) setHasBody:(BOOL) _value_ { + hasBody_ = !!_value_; +} +@synthesize body; +@synthesize headersArray; +@dynamic headers; +- (BOOL) hasId { + return !!hasId_; +} +- (void) setHasId:(BOOL) _value_ { + hasId_ = !!_value_; +} +@synthesize id; +- (instancetype) init { + if ((self = [super init])) { + self.verb = @""; + self.path = @""; + self.body = [NSData data]; + self.id = 0L; + } + return self; +} +static WebSocketResourcesWebSocketRequestMessage* defaultWebSocketResourcesWebSocketRequestMessageInstance = nil; ++ (void) initialize { + if (self == [WebSocketResourcesWebSocketRequestMessage class]) { + defaultWebSocketResourcesWebSocketRequestMessageInstance = [[WebSocketResourcesWebSocketRequestMessage alloc] init]; + } +} ++ (instancetype) defaultInstance { + return defaultWebSocketResourcesWebSocketRequestMessageInstance; +} +- (instancetype) defaultInstance { + return defaultWebSocketResourcesWebSocketRequestMessageInstance; +} +- (NSArray *)headers { + return headersArray; +} +- (NSString*)headersAtIndex:(NSUInteger)index { + return [headersArray objectAtIndex:index]; +} +- (BOOL) isInitialized { + return YES; +} +- (void) writeToCodedOutputStream:(PBCodedOutputStream*) output { + if (self.hasVerb) { + [output writeString:1 value:self.verb]; + } + if (self.hasPath) { + [output writeString:2 value:self.path]; + } + if (self.hasBody) { + [output writeData:3 value:self.body]; + } + if (self.hasId) { + [output writeUInt64:4 value:self.id]; + } + [self.headersArray enumerateObjectsUsingBlock:^(NSString *element, NSUInteger idx, BOOL *stop) { + [output writeString:5 value:element]; + }]; + [self.unknownFields writeToCodedOutputStream:output]; +} +- (SInt32) serializedSize { + __block SInt32 size_ = memoizedSerializedSize; + if (size_ != -1) { + return size_; + } + + size_ = 0; + if (self.hasVerb) { + size_ += computeStringSize(1, self.verb); + } + if (self.hasPath) { + size_ += computeStringSize(2, self.path); + } + if (self.hasBody) { + size_ += computeDataSize(3, self.body); + } + if (self.hasId) { + size_ += computeUInt64Size(4, self.id); + } + { + __block SInt32 dataSize = 0; + const NSUInteger count = self.headersArray.count; + [self.headersArray enumerateObjectsUsingBlock:^(NSString *element, NSUInteger idx, BOOL *stop) { + dataSize += computeStringSizeNoTag(element); + }]; + size_ += dataSize; + size_ += (SInt32)(1 * count); + } + size_ += self.unknownFields.serializedSize; + memoizedSerializedSize = size_; + return size_; +} ++ (WebSocketResourcesWebSocketRequestMessage*) parseFromData:(NSData*) data { + return (WebSocketResourcesWebSocketRequestMessage*)[[[WebSocketResourcesWebSocketRequestMessage builder] mergeFromData:data] build]; +} ++ (WebSocketResourcesWebSocketRequestMessage*) parseFromData:(NSData*) data extensionRegistry:(PBExtensionRegistry*) extensionRegistry { + return (WebSocketResourcesWebSocketRequestMessage*)[[[WebSocketResourcesWebSocketRequestMessage builder] mergeFromData:data extensionRegistry:extensionRegistry] build]; +} ++ (WebSocketResourcesWebSocketRequestMessage*) parseFromInputStream:(NSInputStream*) input { + return (WebSocketResourcesWebSocketRequestMessage*)[[[WebSocketResourcesWebSocketRequestMessage builder] mergeFromInputStream:input] build]; +} ++ (WebSocketResourcesWebSocketRequestMessage*) parseFromInputStream:(NSInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry { + return (WebSocketResourcesWebSocketRequestMessage*)[[[WebSocketResourcesWebSocketRequestMessage builder] mergeFromInputStream:input extensionRegistry:extensionRegistry] build]; +} ++ (WebSocketResourcesWebSocketRequestMessage*) parseFromCodedInputStream:(PBCodedInputStream*) input { + return (WebSocketResourcesWebSocketRequestMessage*)[[[WebSocketResourcesWebSocketRequestMessage builder] mergeFromCodedInputStream:input] build]; +} ++ (WebSocketResourcesWebSocketRequestMessage*) parseFromCodedInputStream:(PBCodedInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry { + return (WebSocketResourcesWebSocketRequestMessage*)[[[WebSocketResourcesWebSocketRequestMessage builder] mergeFromCodedInputStream:input extensionRegistry:extensionRegistry] build]; +} ++ (WebSocketResourcesWebSocketRequestMessageBuilder*) builder { + return [[WebSocketResourcesWebSocketRequestMessageBuilder alloc] init]; +} ++ (WebSocketResourcesWebSocketRequestMessageBuilder*) builderWithPrototype:(WebSocketResourcesWebSocketRequestMessage*) prototype { + return [[WebSocketResourcesWebSocketRequestMessage builder] mergeFrom:prototype]; +} +- (WebSocketResourcesWebSocketRequestMessageBuilder*) builder { + return [WebSocketResourcesWebSocketRequestMessage builder]; +} +- (WebSocketResourcesWebSocketRequestMessageBuilder*) toBuilder { + return [WebSocketResourcesWebSocketRequestMessage builderWithPrototype:self]; +} +- (void) writeDescriptionTo:(NSMutableString*) output withIndent:(NSString*) indent { + if (self.hasVerb) { + [output appendFormat:@"%@%@: %@\n", indent, @"verb", self.verb]; + } + if (self.hasPath) { + [output appendFormat:@"%@%@: %@\n", indent, @"path", self.path]; + } + if (self.hasBody) { + [output appendFormat:@"%@%@: %@\n", indent, @"body", self.body]; + } + if (self.hasId) { + [output appendFormat:@"%@%@: %@\n", indent, @"id", [NSNumber numberWithLongLong:self.id]]; + } + [self.headersArray enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) { + [output appendFormat:@"%@%@: %@\n", indent, @"headers", obj]; + }]; + [self.unknownFields writeDescriptionTo:output withIndent:indent]; +} +- (void) storeInDictionary:(NSMutableDictionary *)dictionary { + if (self.hasVerb) { + [dictionary setObject: self.verb forKey: @"verb"]; + } + if (self.hasPath) { + [dictionary setObject: self.path forKey: @"path"]; + } + if (self.hasBody) { + [dictionary setObject: self.body forKey: @"body"]; + } + if (self.hasId) { + [dictionary setObject: [NSNumber numberWithLongLong:self.id] forKey: @"id"]; + } + [dictionary setObject:self.headers forKey: @"headers"]; + [self.unknownFields storeInDictionary:dictionary]; +} +- (BOOL) isEqual:(id)other { + if (other == self) { + return YES; + } + if (![other isKindOfClass:[WebSocketResourcesWebSocketRequestMessage class]]) { + return NO; + } + WebSocketResourcesWebSocketRequestMessage *otherMessage = other; + return + self.hasVerb == otherMessage.hasVerb && + (!self.hasVerb || [self.verb isEqual:otherMessage.verb]) && + self.hasPath == otherMessage.hasPath && + (!self.hasPath || [self.path isEqual:otherMessage.path]) && + self.hasBody == otherMessage.hasBody && + (!self.hasBody || [self.body isEqual:otherMessage.body]) && + self.hasId == otherMessage.hasId && + (!self.hasId || self.id == otherMessage.id) && + [self.headersArray isEqualToArray:otherMessage.headersArray] && + (self.unknownFields == otherMessage.unknownFields || (self.unknownFields != nil && [self.unknownFields isEqual:otherMessage.unknownFields])); +} +- (NSUInteger) hash { + __block NSUInteger hashCode = 7; + if (self.hasVerb) { + hashCode = hashCode * 31 + [self.verb hash]; + } + if (self.hasPath) { + hashCode = hashCode * 31 + [self.path hash]; + } + if (self.hasBody) { + hashCode = hashCode * 31 + [self.body hash]; + } + if (self.hasId) { + hashCode = hashCode * 31 + [[NSNumber numberWithLongLong:self.id] hash]; + } + [self.headersArray enumerateObjectsUsingBlock:^(NSString *element, NSUInteger idx, BOOL *stop) { + hashCode = hashCode * 31 + [element hash]; + }]; + hashCode = hashCode * 31 + [self.unknownFields hash]; + return hashCode; +} +@end + +@interface WebSocketResourcesWebSocketRequestMessageBuilder() +@property (strong) WebSocketResourcesWebSocketRequestMessage* resultWebSocketRequestMessage; +@end + +@implementation WebSocketResourcesWebSocketRequestMessageBuilder +@synthesize resultWebSocketRequestMessage; +- (instancetype) init { + if ((self = [super init])) { + self.resultWebSocketRequestMessage = [[WebSocketResourcesWebSocketRequestMessage alloc] init]; + } + return self; +} +- (PBGeneratedMessage*) internalGetResult { + return resultWebSocketRequestMessage; +} +- (WebSocketResourcesWebSocketRequestMessageBuilder*) clear { + self.resultWebSocketRequestMessage = [[WebSocketResourcesWebSocketRequestMessage alloc] init]; + return self; +} +- (WebSocketResourcesWebSocketRequestMessageBuilder*) clone { + return [WebSocketResourcesWebSocketRequestMessage builderWithPrototype:resultWebSocketRequestMessage]; +} +- (WebSocketResourcesWebSocketRequestMessage*) defaultInstance { + return [WebSocketResourcesWebSocketRequestMessage defaultInstance]; +} +- (WebSocketResourcesWebSocketRequestMessage*) build { + [self checkInitialized]; + return [self buildPartial]; +} +- (WebSocketResourcesWebSocketRequestMessage*) buildPartial { + WebSocketResourcesWebSocketRequestMessage* returnMe = resultWebSocketRequestMessage; + self.resultWebSocketRequestMessage = nil; + return returnMe; +} +- (WebSocketResourcesWebSocketRequestMessageBuilder*) mergeFrom:(WebSocketResourcesWebSocketRequestMessage*) other { + if (other == [WebSocketResourcesWebSocketRequestMessage defaultInstance]) { + return self; + } + if (other.hasVerb) { + [self setVerb:other.verb]; + } + if (other.hasPath) { + [self setPath:other.path]; + } + if (other.hasBody) { + [self setBody:other.body]; + } + if (other.headersArray.count > 0) { + if (resultWebSocketRequestMessage.headersArray == nil) { + resultWebSocketRequestMessage.headersArray = [[NSMutableArray alloc] initWithArray:other.headersArray]; + } else { + [resultWebSocketRequestMessage.headersArray addObjectsFromArray:other.headersArray]; + } + } + if (other.hasId) { + [self setId:other.id]; + } + [self mergeUnknownFields:other.unknownFields]; + return self; +} +- (WebSocketResourcesWebSocketRequestMessageBuilder*) mergeFromCodedInputStream:(PBCodedInputStream*) input { + return [self mergeFromCodedInputStream:input extensionRegistry:[PBExtensionRegistry emptyRegistry]]; +} +- (WebSocketResourcesWebSocketRequestMessageBuilder*) mergeFromCodedInputStream:(PBCodedInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry { + PBUnknownFieldSetBuilder* unknownFields = [PBUnknownFieldSet builderWithUnknownFields:self.unknownFields]; + while (YES) { + SInt32 tag = [input readTag]; + switch (tag) { + case 0: + [self setUnknownFields:[unknownFields build]]; + return self; + default: { + if (![self parseUnknownField:input unknownFields:unknownFields extensionRegistry:extensionRegistry tag:tag]) { + [self setUnknownFields:[unknownFields build]]; + return self; + } + break; + } + case 10: { + [self setVerb:[input readString]]; + break; + } + case 18: { + [self setPath:[input readString]]; + break; + } + case 26: { + [self setBody:[input readData]]; + break; + } + case 32: { + [self setId:[input readUInt64]]; + break; + } + case 42: { + [self addHeaders:[input readString]]; + break; + } + } + } +} +- (BOOL) hasVerb { + return resultWebSocketRequestMessage.hasVerb; +} +- (NSString*) verb { + return resultWebSocketRequestMessage.verb; +} +- (WebSocketResourcesWebSocketRequestMessageBuilder*) setVerb:(NSString*) value { + resultWebSocketRequestMessage.hasVerb = YES; + resultWebSocketRequestMessage.verb = value; + return self; +} +- (WebSocketResourcesWebSocketRequestMessageBuilder*) clearVerb { + resultWebSocketRequestMessage.hasVerb = NO; + resultWebSocketRequestMessage.verb = @""; + return self; +} +- (BOOL) hasPath { + return resultWebSocketRequestMessage.hasPath; +} +- (NSString*) path { + return resultWebSocketRequestMessage.path; +} +- (WebSocketResourcesWebSocketRequestMessageBuilder*) setPath:(NSString*) value { + resultWebSocketRequestMessage.hasPath = YES; + resultWebSocketRequestMessage.path = value; + return self; +} +- (WebSocketResourcesWebSocketRequestMessageBuilder*) clearPath { + resultWebSocketRequestMessage.hasPath = NO; + resultWebSocketRequestMessage.path = @""; + return self; +} +- (BOOL) hasBody { + return resultWebSocketRequestMessage.hasBody; +} +- (NSData*) body { + return resultWebSocketRequestMessage.body; +} +- (WebSocketResourcesWebSocketRequestMessageBuilder*) setBody:(NSData*) value { + resultWebSocketRequestMessage.hasBody = YES; + resultWebSocketRequestMessage.body = value; + return self; +} +- (WebSocketResourcesWebSocketRequestMessageBuilder*) clearBody { + resultWebSocketRequestMessage.hasBody = NO; + resultWebSocketRequestMessage.body = [NSData data]; + return self; +} +- (NSMutableArray *)headers { + return resultWebSocketRequestMessage.headersArray; +} +- (NSString*)headersAtIndex:(NSUInteger)index { + return [resultWebSocketRequestMessage headersAtIndex:index]; +} +- (WebSocketResourcesWebSocketRequestMessageBuilder *)addHeaders:(NSString*)value { + if (resultWebSocketRequestMessage.headersArray == nil) { + resultWebSocketRequestMessage.headersArray = [[NSMutableArray alloc]init]; + } + [resultWebSocketRequestMessage.headersArray addObject:value]; + return self; +} +- (WebSocketResourcesWebSocketRequestMessageBuilder *)setHeadersArray:(NSArray *)array { + resultWebSocketRequestMessage.headersArray = [[NSMutableArray alloc] initWithArray:array]; + return self; +} +- (WebSocketResourcesWebSocketRequestMessageBuilder *)clearHeaders { + resultWebSocketRequestMessage.headersArray = nil; + return self; +} +- (BOOL) hasId { + return resultWebSocketRequestMessage.hasId; +} +- (UInt64) id { + return resultWebSocketRequestMessage.id; +} +- (WebSocketResourcesWebSocketRequestMessageBuilder*) setId:(UInt64) value { + resultWebSocketRequestMessage.hasId = YES; + resultWebSocketRequestMessage.id = value; + return self; +} +- (WebSocketResourcesWebSocketRequestMessageBuilder*) clearId { + resultWebSocketRequestMessage.hasId = NO; + resultWebSocketRequestMessage.id = 0L; + return self; +} +@end + +@interface WebSocketResourcesWebSocketResponseMessage () +@property UInt64 id; +@property UInt32 status; +@property (strong) NSString* message; +@property (strong) NSMutableArray * headersArray; +@property (strong) NSData* body; +@end + +@implementation WebSocketResourcesWebSocketResponseMessage + +- (BOOL) hasId { + return !!hasId_; +} +- (void) setHasId:(BOOL) _value_ { + hasId_ = !!_value_; +} +@synthesize id; +- (BOOL) hasStatus { + return !!hasStatus_; +} +- (void) setHasStatus:(BOOL) _value_ { + hasStatus_ = !!_value_; +} +@synthesize status; +- (BOOL) hasMessage { + return !!hasMessage_; +} +- (void) setHasMessage:(BOOL) _value_ { + hasMessage_ = !!_value_; +} +@synthesize message; +@synthesize headersArray; +@dynamic headers; +- (BOOL) hasBody { + return !!hasBody_; +} +- (void) setHasBody:(BOOL) _value_ { + hasBody_ = !!_value_; +} +@synthesize body; +- (instancetype) init { + if ((self = [super init])) { + self.id = 0L; + self.status = 0; + self.message = @""; + self.body = [NSData data]; + } + return self; +} +static WebSocketResourcesWebSocketResponseMessage* defaultWebSocketResourcesWebSocketResponseMessageInstance = nil; ++ (void) initialize { + if (self == [WebSocketResourcesWebSocketResponseMessage class]) { + defaultWebSocketResourcesWebSocketResponseMessageInstance = [[WebSocketResourcesWebSocketResponseMessage alloc] init]; + } +} ++ (instancetype) defaultInstance { + return defaultWebSocketResourcesWebSocketResponseMessageInstance; +} +- (instancetype) defaultInstance { + return defaultWebSocketResourcesWebSocketResponseMessageInstance; +} +- (NSArray *)headers { + return headersArray; +} +- (NSString*)headersAtIndex:(NSUInteger)index { + return [headersArray objectAtIndex:index]; +} +- (BOOL) isInitialized { + return YES; +} +- (void) writeToCodedOutputStream:(PBCodedOutputStream*) output { + if (self.hasId) { + [output writeUInt64:1 value:self.id]; + } + if (self.hasStatus) { + [output writeUInt32:2 value:self.status]; + } + if (self.hasMessage) { + [output writeString:3 value:self.message]; + } + if (self.hasBody) { + [output writeData:4 value:self.body]; + } + [self.headersArray enumerateObjectsUsingBlock:^(NSString *element, NSUInteger idx, BOOL *stop) { + [output writeString:5 value:element]; + }]; + [self.unknownFields writeToCodedOutputStream:output]; +} +- (SInt32) serializedSize { + __block SInt32 size_ = memoizedSerializedSize; + if (size_ != -1) { + return size_; + } + + size_ = 0; + if (self.hasId) { + size_ += computeUInt64Size(1, self.id); + } + if (self.hasStatus) { + size_ += computeUInt32Size(2, self.status); + } + if (self.hasMessage) { + size_ += computeStringSize(3, self.message); + } + if (self.hasBody) { + size_ += computeDataSize(4, self.body); + } + { + __block SInt32 dataSize = 0; + const NSUInteger count = self.headersArray.count; + [self.headersArray enumerateObjectsUsingBlock:^(NSString *element, NSUInteger idx, BOOL *stop) { + dataSize += computeStringSizeNoTag(element); + }]; + size_ += dataSize; + size_ += (SInt32)(1 * count); + } + size_ += self.unknownFields.serializedSize; + memoizedSerializedSize = size_; + return size_; +} ++ (WebSocketResourcesWebSocketResponseMessage*) parseFromData:(NSData*) data { + return (WebSocketResourcesWebSocketResponseMessage*)[[[WebSocketResourcesWebSocketResponseMessage builder] mergeFromData:data] build]; +} ++ (WebSocketResourcesWebSocketResponseMessage*) parseFromData:(NSData*) data extensionRegistry:(PBExtensionRegistry*) extensionRegistry { + return (WebSocketResourcesWebSocketResponseMessage*)[[[WebSocketResourcesWebSocketResponseMessage builder] mergeFromData:data extensionRegistry:extensionRegistry] build]; +} ++ (WebSocketResourcesWebSocketResponseMessage*) parseFromInputStream:(NSInputStream*) input { + return (WebSocketResourcesWebSocketResponseMessage*)[[[WebSocketResourcesWebSocketResponseMessage builder] mergeFromInputStream:input] build]; +} ++ (WebSocketResourcesWebSocketResponseMessage*) parseFromInputStream:(NSInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry { + return (WebSocketResourcesWebSocketResponseMessage*)[[[WebSocketResourcesWebSocketResponseMessage builder] mergeFromInputStream:input extensionRegistry:extensionRegistry] build]; +} ++ (WebSocketResourcesWebSocketResponseMessage*) parseFromCodedInputStream:(PBCodedInputStream*) input { + return (WebSocketResourcesWebSocketResponseMessage*)[[[WebSocketResourcesWebSocketResponseMessage builder] mergeFromCodedInputStream:input] build]; +} ++ (WebSocketResourcesWebSocketResponseMessage*) parseFromCodedInputStream:(PBCodedInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry { + return (WebSocketResourcesWebSocketResponseMessage*)[[[WebSocketResourcesWebSocketResponseMessage builder] mergeFromCodedInputStream:input extensionRegistry:extensionRegistry] build]; +} ++ (WebSocketResourcesWebSocketResponseMessageBuilder*) builder { + return [[WebSocketResourcesWebSocketResponseMessageBuilder alloc] init]; +} ++ (WebSocketResourcesWebSocketResponseMessageBuilder*) builderWithPrototype:(WebSocketResourcesWebSocketResponseMessage*) prototype { + return [[WebSocketResourcesWebSocketResponseMessage builder] mergeFrom:prototype]; +} +- (WebSocketResourcesWebSocketResponseMessageBuilder*) builder { + return [WebSocketResourcesWebSocketResponseMessage builder]; +} +- (WebSocketResourcesWebSocketResponseMessageBuilder*) toBuilder { + return [WebSocketResourcesWebSocketResponseMessage builderWithPrototype:self]; +} +- (void) writeDescriptionTo:(NSMutableString*) output withIndent:(NSString*) indent { + if (self.hasId) { + [output appendFormat:@"%@%@: %@\n", indent, @"id", [NSNumber numberWithLongLong:self.id]]; + } + if (self.hasStatus) { + [output appendFormat:@"%@%@: %@\n", indent, @"status", [NSNumber numberWithInteger:self.status]]; + } + if (self.hasMessage) { + [output appendFormat:@"%@%@: %@\n", indent, @"message", self.message]; + } + if (self.hasBody) { + [output appendFormat:@"%@%@: %@\n", indent, @"body", self.body]; + } + [self.headersArray enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) { + [output appendFormat:@"%@%@: %@\n", indent, @"headers", obj]; + }]; + [self.unknownFields writeDescriptionTo:output withIndent:indent]; +} +- (void) storeInDictionary:(NSMutableDictionary *)dictionary { + if (self.hasId) { + [dictionary setObject: [NSNumber numberWithLongLong:self.id] forKey: @"id"]; + } + if (self.hasStatus) { + [dictionary setObject: [NSNumber numberWithInteger:self.status] forKey: @"status"]; + } + if (self.hasMessage) { + [dictionary setObject: self.message forKey: @"message"]; + } + if (self.hasBody) { + [dictionary setObject: self.body forKey: @"body"]; + } + [dictionary setObject:self.headers forKey: @"headers"]; + [self.unknownFields storeInDictionary:dictionary]; +} +- (BOOL) isEqual:(id)other { + if (other == self) { + return YES; + } + if (![other isKindOfClass:[WebSocketResourcesWebSocketResponseMessage class]]) { + return NO; + } + WebSocketResourcesWebSocketResponseMessage *otherMessage = other; + return + self.hasId == otherMessage.hasId && + (!self.hasId || self.id == otherMessage.id) && + self.hasStatus == otherMessage.hasStatus && + (!self.hasStatus || self.status == otherMessage.status) && + self.hasMessage == otherMessage.hasMessage && + (!self.hasMessage || [self.message isEqual:otherMessage.message]) && + self.hasBody == otherMessage.hasBody && + (!self.hasBody || [self.body isEqual:otherMessage.body]) && + [self.headersArray isEqualToArray:otherMessage.headersArray] && + (self.unknownFields == otherMessage.unknownFields || (self.unknownFields != nil && [self.unknownFields isEqual:otherMessage.unknownFields])); +} +- (NSUInteger) hash { + __block NSUInteger hashCode = 7; + if (self.hasId) { + hashCode = hashCode * 31 + [[NSNumber numberWithLongLong:self.id] hash]; + } + if (self.hasStatus) { + hashCode = hashCode * 31 + [[NSNumber numberWithInteger:self.status] hash]; + } + if (self.hasMessage) { + hashCode = hashCode * 31 + [self.message hash]; + } + if (self.hasBody) { + hashCode = hashCode * 31 + [self.body hash]; + } + [self.headersArray enumerateObjectsUsingBlock:^(NSString *element, NSUInteger idx, BOOL *stop) { + hashCode = hashCode * 31 + [element hash]; + }]; + hashCode = hashCode * 31 + [self.unknownFields hash]; + return hashCode; +} +@end + +@interface WebSocketResourcesWebSocketResponseMessageBuilder() +@property (strong) WebSocketResourcesWebSocketResponseMessage* resultWebSocketResponseMessage; +@end + +@implementation WebSocketResourcesWebSocketResponseMessageBuilder +@synthesize resultWebSocketResponseMessage; +- (instancetype) init { + if ((self = [super init])) { + self.resultWebSocketResponseMessage = [[WebSocketResourcesWebSocketResponseMessage alloc] init]; + } + return self; +} +- (PBGeneratedMessage*) internalGetResult { + return resultWebSocketResponseMessage; +} +- (WebSocketResourcesWebSocketResponseMessageBuilder*) clear { + self.resultWebSocketResponseMessage = [[WebSocketResourcesWebSocketResponseMessage alloc] init]; + return self; +} +- (WebSocketResourcesWebSocketResponseMessageBuilder*) clone { + return [WebSocketResourcesWebSocketResponseMessage builderWithPrototype:resultWebSocketResponseMessage]; +} +- (WebSocketResourcesWebSocketResponseMessage*) defaultInstance { + return [WebSocketResourcesWebSocketResponseMessage defaultInstance]; +} +- (WebSocketResourcesWebSocketResponseMessage*) build { + [self checkInitialized]; + return [self buildPartial]; +} +- (WebSocketResourcesWebSocketResponseMessage*) buildPartial { + WebSocketResourcesWebSocketResponseMessage* returnMe = resultWebSocketResponseMessage; + self.resultWebSocketResponseMessage = nil; + return returnMe; +} +- (WebSocketResourcesWebSocketResponseMessageBuilder*) mergeFrom:(WebSocketResourcesWebSocketResponseMessage*) other { + if (other == [WebSocketResourcesWebSocketResponseMessage defaultInstance]) { + return self; + } + if (other.hasId) { + [self setId:other.id]; + } + if (other.hasStatus) { + [self setStatus:other.status]; + } + if (other.hasMessage) { + [self setMessage:other.message]; + } + if (other.headersArray.count > 0) { + if (resultWebSocketResponseMessage.headersArray == nil) { + resultWebSocketResponseMessage.headersArray = [[NSMutableArray alloc] initWithArray:other.headersArray]; + } else { + [resultWebSocketResponseMessage.headersArray addObjectsFromArray:other.headersArray]; + } + } + if (other.hasBody) { + [self setBody:other.body]; + } + [self mergeUnknownFields:other.unknownFields]; + return self; +} +- (WebSocketResourcesWebSocketResponseMessageBuilder*) mergeFromCodedInputStream:(PBCodedInputStream*) input { + return [self mergeFromCodedInputStream:input extensionRegistry:[PBExtensionRegistry emptyRegistry]]; +} +- (WebSocketResourcesWebSocketResponseMessageBuilder*) mergeFromCodedInputStream:(PBCodedInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry { + PBUnknownFieldSetBuilder* unknownFields = [PBUnknownFieldSet builderWithUnknownFields:self.unknownFields]; + while (YES) { + SInt32 tag = [input readTag]; + switch (tag) { + case 0: + [self setUnknownFields:[unknownFields build]]; + return self; + default: { + if (![self parseUnknownField:input unknownFields:unknownFields extensionRegistry:extensionRegistry tag:tag]) { + [self setUnknownFields:[unknownFields build]]; + return self; + } + break; + } + case 8: { + [self setId:[input readUInt64]]; + break; + } + case 16: { + [self setStatus:[input readUInt32]]; + break; + } + case 26: { + [self setMessage:[input readString]]; + break; + } + case 34: { + [self setBody:[input readData]]; + break; + } + case 42: { + [self addHeaders:[input readString]]; + break; + } + } + } +} +- (BOOL) hasId { + return resultWebSocketResponseMessage.hasId; +} +- (UInt64) id { + return resultWebSocketResponseMessage.id; +} +- (WebSocketResourcesWebSocketResponseMessageBuilder*) setId:(UInt64) value { + resultWebSocketResponseMessage.hasId = YES; + resultWebSocketResponseMessage.id = value; + return self; +} +- (WebSocketResourcesWebSocketResponseMessageBuilder*) clearId { + resultWebSocketResponseMessage.hasId = NO; + resultWebSocketResponseMessage.id = 0L; + return self; +} +- (BOOL) hasStatus { + return resultWebSocketResponseMessage.hasStatus; +} +- (UInt32) status { + return resultWebSocketResponseMessage.status; +} +- (WebSocketResourcesWebSocketResponseMessageBuilder*) setStatus:(UInt32) value { + resultWebSocketResponseMessage.hasStatus = YES; + resultWebSocketResponseMessage.status = value; + return self; +} +- (WebSocketResourcesWebSocketResponseMessageBuilder*) clearStatus { + resultWebSocketResponseMessage.hasStatus = NO; + resultWebSocketResponseMessage.status = 0; + return self; +} +- (BOOL) hasMessage { + return resultWebSocketResponseMessage.hasMessage; +} +- (NSString*) message { + return resultWebSocketResponseMessage.message; +} +- (WebSocketResourcesWebSocketResponseMessageBuilder*) setMessage:(NSString*) value { + resultWebSocketResponseMessage.hasMessage = YES; + resultWebSocketResponseMessage.message = value; + return self; +} +- (WebSocketResourcesWebSocketResponseMessageBuilder*) clearMessage { + resultWebSocketResponseMessage.hasMessage = NO; + resultWebSocketResponseMessage.message = @""; + return self; +} +- (NSMutableArray *)headers { + return resultWebSocketResponseMessage.headersArray; +} +- (NSString*)headersAtIndex:(NSUInteger)index { + return [resultWebSocketResponseMessage headersAtIndex:index]; +} +- (WebSocketResourcesWebSocketResponseMessageBuilder *)addHeaders:(NSString*)value { + if (resultWebSocketResponseMessage.headersArray == nil) { + resultWebSocketResponseMessage.headersArray = [[NSMutableArray alloc]init]; + } + [resultWebSocketResponseMessage.headersArray addObject:value]; + return self; +} +- (WebSocketResourcesWebSocketResponseMessageBuilder *)setHeadersArray:(NSArray *)array { + resultWebSocketResponseMessage.headersArray = [[NSMutableArray alloc] initWithArray:array]; + return self; +} +- (WebSocketResourcesWebSocketResponseMessageBuilder *)clearHeaders { + resultWebSocketResponseMessage.headersArray = nil; + return self; +} +- (BOOL) hasBody { + return resultWebSocketResponseMessage.hasBody; +} +- (NSData*) body { + return resultWebSocketResponseMessage.body; +} +- (WebSocketResourcesWebSocketResponseMessageBuilder*) setBody:(NSData*) value { + resultWebSocketResponseMessage.hasBody = YES; + resultWebSocketResponseMessage.body = value; + return self; +} +- (WebSocketResourcesWebSocketResponseMessageBuilder*) clearBody { + resultWebSocketResponseMessage.hasBody = NO; + resultWebSocketResponseMessage.body = [NSData data]; + return self; +} +@end + +@interface WebSocketResourcesWebSocketMessage () +@property WebSocketResourcesWebSocketMessageType type; +@property (strong) WebSocketResourcesWebSocketRequestMessage* request; +@property (strong) WebSocketResourcesWebSocketResponseMessage* response; +@end + +@implementation WebSocketResourcesWebSocketMessage + +- (BOOL) hasType { + return !!hasType_; +} +- (void) setHasType:(BOOL) _value_ { + hasType_ = !!_value_; +} +@synthesize type; +- (BOOL) hasRequest { + return !!hasRequest_; +} +- (void) setHasRequest:(BOOL) _value_ { + hasRequest_ = !!_value_; +} +@synthesize request; +- (BOOL) hasResponse { + return !!hasResponse_; +} +- (void) setHasResponse:(BOOL) _value_ { + hasResponse_ = !!_value_; +} +@synthesize response; +- (instancetype) init { + if ((self = [super init])) { + self.type = WebSocketResourcesWebSocketMessageTypeUnknown; + self.request = [WebSocketResourcesWebSocketRequestMessage defaultInstance]; + self.response = [WebSocketResourcesWebSocketResponseMessage defaultInstance]; + } + return self; +} +static WebSocketResourcesWebSocketMessage* defaultWebSocketResourcesWebSocketMessageInstance = nil; ++ (void) initialize { + if (self == [WebSocketResourcesWebSocketMessage class]) { + defaultWebSocketResourcesWebSocketMessageInstance = [[WebSocketResourcesWebSocketMessage alloc] init]; + } +} ++ (instancetype) defaultInstance { + return defaultWebSocketResourcesWebSocketMessageInstance; +} +- (instancetype) defaultInstance { + return defaultWebSocketResourcesWebSocketMessageInstance; +} +- (BOOL) isInitialized { + return YES; +} +- (void) writeToCodedOutputStream:(PBCodedOutputStream*) output { + if (self.hasType) { + [output writeEnum:1 value:self.type]; + } + if (self.hasRequest) { + [output writeMessage:2 value:self.request]; + } + if (self.hasResponse) { + [output writeMessage:3 value:self.response]; + } + [self.unknownFields writeToCodedOutputStream:output]; +} +- (SInt32) serializedSize { + __block SInt32 size_ = memoizedSerializedSize; + if (size_ != -1) { + return size_; + } + + size_ = 0; + if (self.hasType) { + size_ += computeEnumSize(1, self.type); + } + if (self.hasRequest) { + size_ += computeMessageSize(2, self.request); + } + if (self.hasResponse) { + size_ += computeMessageSize(3, self.response); + } + size_ += self.unknownFields.serializedSize; + memoizedSerializedSize = size_; + return size_; +} ++ (WebSocketResourcesWebSocketMessage*) parseFromData:(NSData*) data { + return (WebSocketResourcesWebSocketMessage*)[[[WebSocketResourcesWebSocketMessage builder] mergeFromData:data] build]; +} ++ (WebSocketResourcesWebSocketMessage*) parseFromData:(NSData*) data extensionRegistry:(PBExtensionRegistry*) extensionRegistry { + return (WebSocketResourcesWebSocketMessage*)[[[WebSocketResourcesWebSocketMessage builder] mergeFromData:data extensionRegistry:extensionRegistry] build]; +} ++ (WebSocketResourcesWebSocketMessage*) parseFromInputStream:(NSInputStream*) input { + return (WebSocketResourcesWebSocketMessage*)[[[WebSocketResourcesWebSocketMessage builder] mergeFromInputStream:input] build]; +} ++ (WebSocketResourcesWebSocketMessage*) parseFromInputStream:(NSInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry { + return (WebSocketResourcesWebSocketMessage*)[[[WebSocketResourcesWebSocketMessage builder] mergeFromInputStream:input extensionRegistry:extensionRegistry] build]; +} ++ (WebSocketResourcesWebSocketMessage*) parseFromCodedInputStream:(PBCodedInputStream*) input { + return (WebSocketResourcesWebSocketMessage*)[[[WebSocketResourcesWebSocketMessage builder] mergeFromCodedInputStream:input] build]; +} ++ (WebSocketResourcesWebSocketMessage*) parseFromCodedInputStream:(PBCodedInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry { + return (WebSocketResourcesWebSocketMessage*)[[[WebSocketResourcesWebSocketMessage builder] mergeFromCodedInputStream:input extensionRegistry:extensionRegistry] build]; +} ++ (WebSocketResourcesWebSocketMessageBuilder*) builder { + return [[WebSocketResourcesWebSocketMessageBuilder alloc] init]; +} ++ (WebSocketResourcesWebSocketMessageBuilder*) builderWithPrototype:(WebSocketResourcesWebSocketMessage*) prototype { + return [[WebSocketResourcesWebSocketMessage builder] mergeFrom:prototype]; +} +- (WebSocketResourcesWebSocketMessageBuilder*) builder { + return [WebSocketResourcesWebSocketMessage builder]; +} +- (WebSocketResourcesWebSocketMessageBuilder*) toBuilder { + return [WebSocketResourcesWebSocketMessage builderWithPrototype:self]; +} +- (void) writeDescriptionTo:(NSMutableString*) output withIndent:(NSString*) indent { + if (self.hasType) { + [output appendFormat:@"%@%@: %@\n", indent, @"type", NSStringFromWebSocketResourcesWebSocketMessageType(self.type)]; + } + if (self.hasRequest) { + [output appendFormat:@"%@%@ {\n", indent, @"request"]; + [self.request writeDescriptionTo:output + withIndent:[NSString stringWithFormat:@"%@ ", indent]]; + [output appendFormat:@"%@}\n", indent]; + } + if (self.hasResponse) { + [output appendFormat:@"%@%@ {\n", indent, @"response"]; + [self.response writeDescriptionTo:output + withIndent:[NSString stringWithFormat:@"%@ ", indent]]; + [output appendFormat:@"%@}\n", indent]; + } + [self.unknownFields writeDescriptionTo:output withIndent:indent]; +} +- (void) storeInDictionary:(NSMutableDictionary *)dictionary { + if (self.hasType) { + [dictionary setObject: @(self.type) forKey: @"type"]; + } + if (self.hasRequest) { + NSMutableDictionary *messageDictionary = [NSMutableDictionary dictionary]; + [self.request storeInDictionary:messageDictionary]; + [dictionary setObject:[NSDictionary dictionaryWithDictionary:messageDictionary] forKey:@"request"]; + } + if (self.hasResponse) { + NSMutableDictionary *messageDictionary = [NSMutableDictionary dictionary]; + [self.response storeInDictionary:messageDictionary]; + [dictionary setObject:[NSDictionary dictionaryWithDictionary:messageDictionary] forKey:@"response"]; + } + [self.unknownFields storeInDictionary:dictionary]; +} +- (BOOL) isEqual:(id)other { + if (other == self) { + return YES; + } + if (![other isKindOfClass:[WebSocketResourcesWebSocketMessage class]]) { + return NO; + } + WebSocketResourcesWebSocketMessage *otherMessage = other; + return + self.hasType == otherMessage.hasType && + (!self.hasType || self.type == otherMessage.type) && + self.hasRequest == otherMessage.hasRequest && + (!self.hasRequest || [self.request isEqual:otherMessage.request]) && + self.hasResponse == otherMessage.hasResponse && + (!self.hasResponse || [self.response isEqual:otherMessage.response]) && + (self.unknownFields == otherMessage.unknownFields || (self.unknownFields != nil && [self.unknownFields isEqual:otherMessage.unknownFields])); +} +- (NSUInteger) hash { + __block NSUInteger hashCode = 7; + if (self.hasType) { + hashCode = hashCode * 31 + self.type; + } + if (self.hasRequest) { + hashCode = hashCode * 31 + [self.request hash]; + } + if (self.hasResponse) { + hashCode = hashCode * 31 + [self.response hash]; + } + hashCode = hashCode * 31 + [self.unknownFields hash]; + return hashCode; +} +@end + +BOOL WebSocketResourcesWebSocketMessageTypeIsValidValue(WebSocketResourcesWebSocketMessageType value) { + switch (value) { + case WebSocketResourcesWebSocketMessageTypeUnknown: + case WebSocketResourcesWebSocketMessageTypeRequest: + case WebSocketResourcesWebSocketMessageTypeResponse: + return YES; + default: + return NO; + } +} +NSString *NSStringFromWebSocketResourcesWebSocketMessageType(WebSocketResourcesWebSocketMessageType value) { + switch (value) { + case WebSocketResourcesWebSocketMessageTypeUnknown: + return @"WebSocketResourcesWebSocketMessageTypeUnknown"; + case WebSocketResourcesWebSocketMessageTypeRequest: + return @"WebSocketResourcesWebSocketMessageTypeRequest"; + case WebSocketResourcesWebSocketMessageTypeResponse: + return @"WebSocketResourcesWebSocketMessageTypeResponse"; + default: + return nil; + } +} + +@interface WebSocketResourcesWebSocketMessageBuilder() +@property (strong) WebSocketResourcesWebSocketMessage* resultWebSocketMessage; +@end + +@implementation WebSocketResourcesWebSocketMessageBuilder +@synthesize resultWebSocketMessage; +- (instancetype) init { + if ((self = [super init])) { + self.resultWebSocketMessage = [[WebSocketResourcesWebSocketMessage alloc] init]; + } + return self; +} +- (PBGeneratedMessage*) internalGetResult { + return resultWebSocketMessage; +} +- (WebSocketResourcesWebSocketMessageBuilder*) clear { + self.resultWebSocketMessage = [[WebSocketResourcesWebSocketMessage alloc] init]; + return self; +} +- (WebSocketResourcesWebSocketMessageBuilder*) clone { + return [WebSocketResourcesWebSocketMessage builderWithPrototype:resultWebSocketMessage]; +} +- (WebSocketResourcesWebSocketMessage*) defaultInstance { + return [WebSocketResourcesWebSocketMessage defaultInstance]; +} +- (WebSocketResourcesWebSocketMessage*) build { + [self checkInitialized]; + return [self buildPartial]; +} +- (WebSocketResourcesWebSocketMessage*) buildPartial { + WebSocketResourcesWebSocketMessage* returnMe = resultWebSocketMessage; + self.resultWebSocketMessage = nil; + return returnMe; +} +- (WebSocketResourcesWebSocketMessageBuilder*) mergeFrom:(WebSocketResourcesWebSocketMessage*) other { + if (other == [WebSocketResourcesWebSocketMessage defaultInstance]) { + return self; + } + if (other.hasType) { + [self setType:other.type]; + } + if (other.hasRequest) { + [self mergeRequest:other.request]; + } + if (other.hasResponse) { + [self mergeResponse:other.response]; + } + [self mergeUnknownFields:other.unknownFields]; + return self; +} +- (WebSocketResourcesWebSocketMessageBuilder*) mergeFromCodedInputStream:(PBCodedInputStream*) input { + return [self mergeFromCodedInputStream:input extensionRegistry:[PBExtensionRegistry emptyRegistry]]; +} +- (WebSocketResourcesWebSocketMessageBuilder*) mergeFromCodedInputStream:(PBCodedInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry { + PBUnknownFieldSetBuilder* unknownFields = [PBUnknownFieldSet builderWithUnknownFields:self.unknownFields]; + while (YES) { + SInt32 tag = [input readTag]; + switch (tag) { + case 0: + [self setUnknownFields:[unknownFields build]]; + return self; + default: { + if (![self parseUnknownField:input unknownFields:unknownFields extensionRegistry:extensionRegistry tag:tag]) { + [self setUnknownFields:[unknownFields build]]; + return self; + } + break; + } + case 8: { + WebSocketResourcesWebSocketMessageType value = (WebSocketResourcesWebSocketMessageType)[input readEnum]; + if (WebSocketResourcesWebSocketMessageTypeIsValidValue(value)) { + [self setType:value]; + } else { + [unknownFields mergeVarintField:1 value:value]; + } + break; + } + case 18: { + WebSocketResourcesWebSocketRequestMessageBuilder* subBuilder = [WebSocketResourcesWebSocketRequestMessage builder]; + if (self.hasRequest) { + [subBuilder mergeFrom:self.request]; + } + [input readMessage:subBuilder extensionRegistry:extensionRegistry]; + [self setRequest:[subBuilder buildPartial]]; + break; + } + case 26: { + WebSocketResourcesWebSocketResponseMessageBuilder* subBuilder = [WebSocketResourcesWebSocketResponseMessage builder]; + if (self.hasResponse) { + [subBuilder mergeFrom:self.response]; + } + [input readMessage:subBuilder extensionRegistry:extensionRegistry]; + [self setResponse:[subBuilder buildPartial]]; + break; + } + } + } +} +- (BOOL) hasType { + return resultWebSocketMessage.hasType; +} +- (WebSocketResourcesWebSocketMessageType) type { + return resultWebSocketMessage.type; +} +- (WebSocketResourcesWebSocketMessageBuilder*) setType:(WebSocketResourcesWebSocketMessageType) value { + resultWebSocketMessage.hasType = YES; + resultWebSocketMessage.type = value; + return self; +} +- (WebSocketResourcesWebSocketMessageBuilder*) clearType { + resultWebSocketMessage.hasType = NO; + resultWebSocketMessage.type = WebSocketResourcesWebSocketMessageTypeUnknown; + return self; +} +- (BOOL) hasRequest { + return resultWebSocketMessage.hasRequest; +} +- (WebSocketResourcesWebSocketRequestMessage*) request { + return resultWebSocketMessage.request; +} +- (WebSocketResourcesWebSocketMessageBuilder*) setRequest:(WebSocketResourcesWebSocketRequestMessage*) value { + resultWebSocketMessage.hasRequest = YES; + resultWebSocketMessage.request = value; + return self; +} +- (WebSocketResourcesWebSocketMessageBuilder*) setRequestBuilder:(WebSocketResourcesWebSocketRequestMessageBuilder*) builderForValue { + return [self setRequest:[builderForValue build]]; +} +- (WebSocketResourcesWebSocketMessageBuilder*) mergeRequest:(WebSocketResourcesWebSocketRequestMessage*) value { + if (resultWebSocketMessage.hasRequest && + resultWebSocketMessage.request != [WebSocketResourcesWebSocketRequestMessage defaultInstance]) { + resultWebSocketMessage.request = + [[[WebSocketResourcesWebSocketRequestMessage builderWithPrototype:resultWebSocketMessage.request] mergeFrom:value] buildPartial]; + } else { + resultWebSocketMessage.request = value; + } + resultWebSocketMessage.hasRequest = YES; + return self; +} +- (WebSocketResourcesWebSocketMessageBuilder*) clearRequest { + resultWebSocketMessage.hasRequest = NO; + resultWebSocketMessage.request = [WebSocketResourcesWebSocketRequestMessage defaultInstance]; + return self; +} +- (BOOL) hasResponse { + return resultWebSocketMessage.hasResponse; +} +- (WebSocketResourcesWebSocketResponseMessage*) response { + return resultWebSocketMessage.response; +} +- (WebSocketResourcesWebSocketMessageBuilder*) setResponse:(WebSocketResourcesWebSocketResponseMessage*) value { + resultWebSocketMessage.hasResponse = YES; + resultWebSocketMessage.response = value; + return self; +} +- (WebSocketResourcesWebSocketMessageBuilder*) setResponseBuilder:(WebSocketResourcesWebSocketResponseMessageBuilder*) builderForValue { + return [self setResponse:[builderForValue build]]; +} +- (WebSocketResourcesWebSocketMessageBuilder*) mergeResponse:(WebSocketResourcesWebSocketResponseMessage*) value { + if (resultWebSocketMessage.hasResponse && + resultWebSocketMessage.response != [WebSocketResourcesWebSocketResponseMessage defaultInstance]) { + resultWebSocketMessage.response = + [[[WebSocketResourcesWebSocketResponseMessage builderWithPrototype:resultWebSocketMessage.response] mergeFrom:value] buildPartial]; + } else { + resultWebSocketMessage.response = value; + } + resultWebSocketMessage.hasResponse = YES; + return self; +} +- (WebSocketResourcesWebSocketMessageBuilder*) clearResponse { + resultWebSocketMessage.hasResponse = NO; + resultWebSocketMessage.response = [WebSocketResourcesWebSocketResponseMessage defaultInstance]; + return self; +} +@end + + +// @@protoc_insertion_point(global_scope) diff --git a/SignalServiceKit/src/Util/Cryptography.h b/SignalServiceKit/src/Util/Cryptography.h index e6d00487dd..b4a5deceda 100755 --- a/SignalServiceKit/src/Util/Cryptography.h +++ b/SignalServiceKit/src/Util/Cryptography.h @@ -1,5 +1,5 @@ // -// Copyright (c) 2017 Open Whisper Systems. All rights reserved. +// Copyright (c) 2018 Open Whisper Systems. All rights reserved. // NS_ASSUME_NONNULL_BEGIN @@ -36,6 +36,9 @@ typedef NS_ENUM(NSInteger, TSMACType) { + (NSData *)generateRandomBytes:(NSUInteger)numberBytes; ++ (uint32_t)randomUInt32; ++ (uint64_t)randomUInt64; + #pragma mark SHA and HMAC methods // Full length SHA256 digest for `data` diff --git a/SignalServiceKit/src/Util/Cryptography.m b/SignalServiceKit/src/Util/Cryptography.m index 9dd8909c01..272536cd4d 100755 --- a/SignalServiceKit/src/Util/Cryptography.m +++ b/SignalServiceKit/src/Util/Cryptography.m @@ -102,7 +102,25 @@ const NSUInteger kAES256_KeyByteLength = 32; + (NSData *)generateRandomBytes:(NSUInteger)numberBytes { - return [Randomness generateRandomBytes:numberBytes]; + return [Randomness generateRandomBytes:(int)numberBytes]; +} + ++ (uint32_t)randomUInt32 +{ + size_t size = sizeof(uint32_t); + NSData *data = [self generateRandomBytes:size]; + uint32_t result = 0; + [data getBytes:&result range:NSMakeRange(0, size)]; + return result; +} + ++ (uint64_t)randomUInt64 +{ + size_t size = sizeof(uint64_t); + NSData *data = [self generateRandomBytes:size]; + uint64_t result = 0; + [data getBytes:&result range:NSMakeRange(0, size)]; + return result; } #pragma mark SHA1 diff --git a/SignalServiceKit/src/Util/OWSError.h b/SignalServiceKit/src/Util/OWSError.h index ed6c219e93..01a521f6da 100644 --- a/SignalServiceKit/src/Util/OWSError.h +++ b/SignalServiceKit/src/Util/OWSError.h @@ -43,6 +43,8 @@ typedef NS_ENUM(NSInteger, OWSErrorCode) { // A non-recoverable while importing or exporting a backup. OWSErrorCodeBackupFailure = 777419, OWSErrorCodeLocalAuthenticationError = 777420, + OWSErrorCodeMessageRequestFailed = 777421, + OWSErrorCodeMessageResponseFailed = 777422, }; extern NSString *const OWSErrorRecipientIdentifierKey;