forked from francoisTemasys/socket.IO-objc
-
Notifications
You must be signed in to change notification settings - Fork 24
/
SocketIOTransportWebsocket.m
142 lines (117 loc) · 3.46 KB
/
SocketIOTransportWebsocket.m
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
//
// SocketIOTransportWebsocket.m
// v0.5.1
//
// based on
// socketio-cocoa https://github.com/fpotter/socketio-cocoa
// by Fred Potter <[email protected]>
//
// using
// https://github.com/square/SocketRocket
//
// reusing some parts of
// /socket.io/socket.io.js
//
// Created by Philipp Kyeck http://beta-interactive.de
//
// With help from
// https://github.com/pkyeck/socket.IO-objc/blob/master/CONTRIBUTORS.md
//
#import "SocketIOTransportWebsocket.h"
#import "SocketIO.h"
#define DEBUG_LOGS 0
#if DEBUG_LOGS
#define DEBUGLOG(...) NSLog(__VA_ARGS__)
#else
#define DEBUGLOG(...)
#endif
static NSString* kInsecureSocketURL = @"ws://%@/socket.io/1/websocket/%@";
static NSString* kSecureSocketURL = @"wss://%@/socket.io/1/websocket/%@";
static NSString* kInsecureSocketPortURL = @"ws://%@:%d/socket.io/1/websocket/%@";
static NSString* kSecureSocketPortURL = @"wss://%@:%d/socket.io/1/websocket/%@";
@implementation SocketIOTransportWebsocket
@synthesize delegate;
- (id) initWithDelegate:(id<SocketIOTransportDelegate>)delegate_
{
self = [super init];
if (self) {
self.delegate = delegate_;
}
return self;
}
- (BOOL) isReady
{
return _webSocket.readyState == SR_OPEN;
}
- (void) open
{
[self openUsing:V09x];
}
- (void) openUsing:(SocketIOVersion)version
{
NSString *urlStr;
NSString *format;
NSString *addOnVersion = delegate.sid;;
if(version == V10x)
addOnVersion = [NSString stringWithFormat:@"?EIO=2&transport=websocket&sid=%@", delegate.sid];
if (delegate.port) {
format = delegate.useSecure ? kSecureSocketPortURL : kInsecureSocketPortURL;
urlStr = [NSString stringWithFormat:format, delegate.host, delegate.port, addOnVersion, delegate.sid, addOnVersion];
}
else {
format = delegate.useSecure ? kSecureSocketURL : kInsecureSocketURL;
urlStr = [NSString stringWithFormat:format, delegate.host,addOnVersion, delegate.sid, addOnVersion];
}
NSURL *url = [NSURL URLWithString:urlStr];
_webSocket = nil;
_webSocket = [[SRWebSocket alloc] initWithURL:url];
_webSocket.delegate = self;
DEBUGLOG(@"Opening %@", url);
[_webSocket open];
}
- (void) dealloc
{
[_webSocket setDelegate:nil];
}
- (void) close
{
[_webSocket close];
}
- (void) send:(NSString*)request
{
[_webSocket send:request];
}
# pragma mark -
# pragma mark WebSocket Delegate Methods
- (void) webSocket:(SRWebSocket *)webSocket didReceiveMessage:(id)message
{
if([delegate respondsToSelector:@selector(onData:)]) {
[delegate onData:message];
}
}
- (void) webSocketDidOpen:(SRWebSocket *)webSocket
{
DEBUGLOG(@"Socket opened.");
[_webSocket send:@"5"];
}
- (void) webSocket:(SRWebSocket *)webSocket didFailWithError:(NSError *)error
{
DEBUGLOG(@"Socket failed with error ... %@", [error localizedDescription]);
// Assuming this resulted in a disconnect
if([delegate respondsToSelector:@selector(onDisconnect:)]) {
[delegate onDisconnect:error];
}
}
- (void) webSocket:(SRWebSocket *)webSocket
didCloseWithCode:(NSInteger)code
reason:(NSString *)reason
wasClean:(BOOL)wasClean
{
DEBUGLOG(@"Socket closed. %@", reason);
if([delegate respondsToSelector:@selector(onDisconnect:)]) {
[delegate onDisconnect:[NSError errorWithDomain:SocketIOError
code:SocketIOWebSocketClosed
userInfo:nil]];
}
}
@end