-
Notifications
You must be signed in to change notification settings - Fork 3
/
webinossocket.js
118 lines (105 loc) · 2.94 KB
/
webinossocket.js
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
/*******************************************************************************
* Code contributed to the webinos project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
* Copyright 2011-2012 Paddy Byers
*
******************************************************************************/
(function(exports) {
var INITIALISED = -1;
var CONNECTING = 0;
var OPEN = 1;
var CLOSING = 2;
var CLOSED = 3;
var sockets = [];
var tryConnect = function(ws) {
if(exports.__webinos) {
try {
console.log('WebinosSocket connecting .....');
exports.__webinos.openSocket(ws.id);
ws.readyState = CONNECTING;
return true;
} catch(e) {
console.log('... failed; exception = ' + e);
}
}
return false;
};
var WebinosSocket = function() {
var id = this.id = sockets.length;
sockets.push(this);
this.readyState = INITIALISED;
tryConnect(this)
this.queuedMessages = [];
};
WebinosSocket.INITIALISED = INITIALISED;
WebinosSocket.CONNECTING = CONNECTING;
WebinosSocket.OPEN = OPEN;
WebinosSocket.CLOSING = CLOSING;
WebinosSocket.CLOSED = CLOSED;
WebinosSocket.handleConnect = function(id) {
var ws = sockets[id];
if(ws) {
if(ws.readyState == CONNECTING) {
console.log('... connected');
ws.readyState = OPEN;
for(var i in ws.queuedMessages)
exports.__webinos.send(ws.id, ws.queuedMessages[i]);
delete ws.queuedMessages;
if(ws.onopen)
ws.onopen();
}
}
};
WebinosSocket.handleDisconnect = function(id) {
var ws = sockets[id];
if(ws) {
if(ws.readyState != CLOSED) {
ws.readyState = CLOSED;
if(ws.onclose)
ws.onclose();
}
}
};
WebinosSocket.handleMessage = function(id, data) {
var ws = sockets[id];
if(ws) {
if(ws.readyState == OPEN && ws.onmessage)
ws.onmessage({data:data});
}
};
WebinosSocket.prototype.send = function(data) {
switch(this.readyState) {
case -1: /* INITIALISED */
tryConnect(this);
case 0: /* CONNECTING */
this.queuedMessages.push(data);
break;
case 1: /* OPEN */
exports.__webinos.send(this.id, data);
break;
case 2: /* CLOSING */
case 3: /* CLOSED */
default:
throw new Error('IllegalStateError');
}
};
WebinosSocket.prototype.close = function(data) {
if(this.readyState == OPEN || this.readyState == CONNECTING)
exports.__webinos.closeSocket(this.id);
if(this.readyState != CLOSED)
this.readyState = CLOSING;
};
exports.WebinosSocket = WebinosSocket;
})(window);