13 static id _sharedInstance = nil;
14 if (!_sharedInstance) {
17 return _sharedInstance;
20 - (NSData*)encode:(
id)message {
21 NSAssert(!message || [message isKindOfClass:[NSData
class]],
@"");
25 - (NSData*)decode:(NSData*)message {
32 static id _sharedInstance = nil;
33 if (!_sharedInstance) {
36 return _sharedInstance;
39 - (NSData*)encode:(
id)message {
43 NSAssert([message isKindOfClass:[NSString
class]],
@"");
44 NSString* stringMessage = message;
45 const char* utf8 = stringMessage.UTF8String;
46 return [NSData dataWithBytes:utf8 length:strlen(utf8)];
49 - (NSString*)decode:(NSData*)message {
53 return [[NSString alloc] initWithData:message encoding:NSUTF8StringEncoding];
59 static id _sharedInstance = nil;
60 if (!_sharedInstance) {
63 return _sharedInstance;
66 - (NSData*)encode:(
id)message {
72 if ([message isKindOfClass:[NSArray
class]] || [message isKindOfClass:[NSDictionary
class]]) {
73 encoding = [NSJSONSerialization dataWithJSONObject:message options:0 error:&error];
77 encoding = [NSJSONSerialization dataWithJSONObject:@[ message ] options:0 error:&error];
79 encoding = [encoding subdataWithRange:NSMakeRange(1, encoding.length - 2)];
82 NSAssert(encoding,
@"Invalid JSON message, encoding failed: %@", error);
86 - (
id)decode:(NSData*)message {
87 if ([message length] == 0) {
90 BOOL isSimpleValue = NO;
92 if (0 < message.length) {
94 [message getBytes:&first length:1];
95 isSimpleValue = first !=
'{' && first !=
'[';
102 NSMutableData* expandedMessage = [NSMutableData dataWithLength:message.length + 2];
103 [expandedMessage replaceBytesInRange:NSMakeRange(0, 1) withBytes:&begin];
104 [expandedMessage replaceBytesInRange:NSMakeRange(1, message.length) withBytes:message.bytes];
105 [expandedMessage replaceBytesInRange:NSMakeRange(message.length + 1, 1) withBytes:&end];
106 message = expandedMessage;
108 decoded = [NSJSONSerialization JSONObjectWithData:message options:0 error:nil];
110 NSAssert(decoded,
@"Invalid JSON message, decoding failed");
111 return isSimpleValue ? ((NSArray*)decoded)[0] : decoded;
116 + (instancetype)sharedInstance {
117 static id _sharedInstance = nil;
118 if (!_sharedInstance) {
121 return _sharedInstance;
126 @"method" : call.method,
127 @"args" : [
self wrapNil:call.arguments],
131 - (NSData*)encodeSuccessEnvelope:(
id)result {
138 [
self wrapNil:error.message],
139 [
self wrapNil:error.details],
145 id method = dictionary[@"method"];
146 id arguments = [
self unwrapNil:dictionary[@"args"]];
147 NSAssert([method isKindOfClass:[NSString
class]],
@"Invalid JSON method call");
151 - (
id)decodeEnvelope:(NSData*)envelope {
153 if (array.count == 1) {
154 return [
self unwrapNil:array[0]];
156 NSAssert(array.count == 3,
@"Invalid JSON envelope");
158 id message = [
self unwrapNil:array[1]];
159 id details = [
self unwrapNil:array[2]];
160 NSAssert([code isKindOfClass:[NSString
class]],
@"Invalid JSON envelope");
161 NSAssert(message == nil || [message isKindOfClass:[NSString
class]],
@"Invalid JSON envelope");
165 - (
id)wrapNil:(
id)value {
166 return value == nil ? [NSNull null] : value;
168 - (
id)unwrapNil:(
id)value {
169 return value == [NSNull null] ? nil : value;