-
Notifications
You must be signed in to change notification settings - Fork 81
/
Copy pathindex.jsx
117 lines (100 loc) · 2.86 KB
/
index.jsx
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
import React from 'react';
import PropTypes from 'prop-types';
class Websocket extends React.Component {
constructor(props) {
super(props);
this.state = {
ws: window.WebSocket
? new window.WebSocket(this.props.url, this.props.protocol)
: new window.MozWebSocket(this.props.url, this.props.protocol),
attempts: 1
};
this.open = this.open.bind(this);
this.close = this.close.bind(this);
this.sendMessage = this.sendMessage.bind(this);
this.setupWebsocket = this.setupWebsocket.bind(this);
}
logging(logline) {
if (this.props.debug === true) {
console.log(logline);
}
}
generateInterval(k) {
if (this.props.reconnectIntervalInMilliSeconds > 0) {
return this.props.reconnectIntervalInMilliSeconds;
}
return Math.min(30, Math.pow(2, k) - 1) * 1000;
}
setupWebsocket() {
let websocket = this.state.ws;
websocket.onopen = () => {
this.logging('Websocket connected');
if (typeof this.props.onOpen === 'function') this.props.onOpen();
};
websocket.onerror = e => {
if (typeof this.props.onError === 'function') this.props.onError(e);
};
websocket.onmessage = evt => {
this.props.onMessage(evt.data);
};
this.shouldReconnect = this.props.reconnect;
websocket.onclose = evt => {
this.logging(
`Websocket disconnected,the reason: ${evt.reason},the code: ${evt.code}`
);
if (typeof this.props.onClose === 'function')
this.props.onClose(evt.code, evt.reason);
if (this.shouldReconnect) {
let time = this.generateInterval(this.state.attempts);
this.timeoutID = setTimeout(() => {
this.setState({ attempts: this.state.attempts + 1 });
this.setState({
ws: window.WebSocket
? new window.WebSocket(this.props.url, this.props.protocol)
: new window.MozWebSocket(this.props.url, this.props.protocol)
});
this.setupWebsocket();
}, time);
}
};
}
componentDidMount() {
this.setupWebsocket();
}
componentWillUnmount() {
this.shouldReconnect = false;
clearTimeout(this.timeoutID);
let websocket = this.state.ws;
websocket.close();
}
sendMessage(message) {
let websocket = this.state.ws;
websocket.send(message);
}
open() {
this.setupWebsocket();
}
close() {
let websocket = this.state.ws;
websocket.close();
}
render() {
return <div></div>;
}
}
Websocket.defaultProps = {
debug: false,
reconnect: true
};
Websocket.propTypes = {
url: PropTypes.string.isRequired,
onMessage: PropTypes.func.isRequired,
onOpen: PropTypes.func,
onClose: PropTypes.func,
onError: PropTypes.func,
debug: PropTypes.bool,
reconnect: PropTypes.bool,
protocol: PropTypes.string,
reconnectIntervalInMilliSeconds: PropTypes.number
};
export default Websocket;