hsync 0.29.0 → 0.30.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/hsync.js +2 -2
- package/dist/hsync.min.js +1 -1
- package/lib/peers.js +24 -7
- package/lib/rtc-node.js +2 -2
- package/lib/rtc-web.js +38 -17
- package/package.json +1 -1
package/lib/peers.js
CHANGED
|
@@ -74,14 +74,20 @@ function initPeers(hsyncClient) {
|
|
|
74
74
|
peer.localMethods = Object.assign({}, hsyncClient.peerMethods);
|
|
75
75
|
peer.sockets = {};
|
|
76
76
|
|
|
77
|
-
peer.localMethods.rtcSignal = (peerInfo, signal) => {
|
|
77
|
+
peer.localMethods.rtcSignal = async (peerInfo, signal) => {
|
|
78
78
|
debug('rtcSignal', signal.type);
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
79
|
+
try{
|
|
80
|
+
if (signal.type === 'offer') { // && !peer.rtcCon && !signal.alreadySent) {
|
|
81
|
+
peer.rtcStatus = 'connecting';
|
|
82
|
+
await rtc.answerPeer(peer, signal);
|
|
83
|
+
} else if (signal.type === 'answer') {
|
|
84
|
+
await peer.handleRtcAnswer(signal);
|
|
85
|
+
}
|
|
86
|
+
} catch (e) {
|
|
87
|
+
debug('error handling rtcSignal', e, signal);
|
|
88
|
+
return e.message;
|
|
84
89
|
}
|
|
90
|
+
|
|
85
91
|
return `rtcSignal ${signal.type} handled ok`;
|
|
86
92
|
}
|
|
87
93
|
|
|
@@ -205,7 +211,18 @@ function initPeers(hsyncClient) {
|
|
|
205
211
|
|
|
206
212
|
debug('↑ peer rpc', peer.dcOpen ? 'RTC' : 'REST', `${hostName}/_hs/rpc`, msg.method);
|
|
207
213
|
|
|
208
|
-
|
|
214
|
+
let msgObj = msg;
|
|
215
|
+
if (typeof msg !== 'object') {
|
|
216
|
+
try {
|
|
217
|
+
msgObj = JSON.parse(msg);
|
|
218
|
+
} catch (e) {
|
|
219
|
+
msgObj = {error: 'invalid JSON'};
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
// sometimes it takes a while for RTC do detect a disconnect
|
|
224
|
+
// do not rtcSignal messages over the RTC connection
|
|
225
|
+
if (peer.dcOpen && (msgObj.method !== 'rtcSignal')) {
|
|
209
226
|
let payload = msg;
|
|
210
227
|
if (typeof msg === 'object') {
|
|
211
228
|
payload = JSON.stringify(payload);
|
package/lib/rtc-node.js
CHANGED
|
@@ -33,9 +33,9 @@ function offerPeer(peer) {
|
|
|
33
33
|
let offerSent = false;
|
|
34
34
|
const start = Date.now();
|
|
35
35
|
|
|
36
|
-
peer.handleRtcAnswer = (answer) => {
|
|
36
|
+
peer.handleRtcAnswer = async (answer) => {
|
|
37
37
|
debug('node handle RtcAnswer', answer.sdp.length);
|
|
38
|
-
peer.rtcCon.setRemoteDescription(answer.sdp, answer.type);
|
|
38
|
+
await peer.rtcCon.setRemoteDescription(answer.sdp, answer.type);
|
|
39
39
|
return 'node handle RtcAnswer ok';
|
|
40
40
|
}
|
|
41
41
|
|
package/lib/rtc-web.js
CHANGED
|
@@ -86,27 +86,33 @@ async function offerPeer(peer) {
|
|
|
86
86
|
peer.dcOpen = true;
|
|
87
87
|
peer.dc = dc;
|
|
88
88
|
peer.rtcSend = (packet) => {
|
|
89
|
+
debug('sending packet', packet.toString(), dc.readyState);
|
|
89
90
|
dc.send(packet);
|
|
90
91
|
};
|
|
91
92
|
peer.rtcEvents.emit('dcOpen', dc);
|
|
92
93
|
// dc.send('yo waddup from the browser');
|
|
93
94
|
};
|
|
95
|
+
|
|
96
|
+
try {
|
|
97
|
+
const offer = await con.createOffer({offerToReceiveAudio:true, offerToReceiveVideo:true});
|
|
98
|
+
await con.setLocalDescription(offer);
|
|
99
|
+
|
|
100
|
+
setTimeout(() => {
|
|
101
|
+
if (!gatheringComplete) {
|
|
102
|
+
debug('didnt finish gathering');
|
|
103
|
+
sendOffer();
|
|
104
|
+
offerSent = true;
|
|
105
|
+
}
|
|
106
|
+
}, GATHERING_TIMEOUT);
|
|
94
107
|
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
}
|
|
104
|
-
}, GATHERING_TIMEOUT);
|
|
105
|
-
|
|
106
|
-
peer.handleRtcAnswer = (answer) => {
|
|
107
|
-
debug('web handle RtcAnswer', answer.sdp.length);
|
|
108
|
-
con.setRemoteDescription(answer);
|
|
109
|
-
return 'web handle RtcAnswer ok';
|
|
108
|
+
peer.handleRtcAnswer = async (answer) => {
|
|
109
|
+
debug('web handle RtcAnswer', answer.sdp.length);
|
|
110
|
+
await con.setRemoteDescription(answer);
|
|
111
|
+
return 'web handle RtcAnswer ok';
|
|
112
|
+
};
|
|
113
|
+
} catch (e) {
|
|
114
|
+
debugError('error creating data channel', e);
|
|
115
|
+
reject(e);
|
|
110
116
|
}
|
|
111
117
|
});
|
|
112
118
|
}
|
|
@@ -122,9 +128,13 @@ async function answerPeer(peer, offer) {
|
|
|
122
128
|
let gatheringComplete = false;
|
|
123
129
|
const start = Date.now();
|
|
124
130
|
|
|
125
|
-
function sendAnswer() {
|
|
131
|
+
async function sendAnswer() {
|
|
126
132
|
const desc = con.localDescription;
|
|
127
|
-
|
|
133
|
+
try {
|
|
134
|
+
await peer.methods.rtcSignal({type: desc.type, sdp: desc.sdp});
|
|
135
|
+
} catch (e) {
|
|
136
|
+
debugError('error sending answer', e);
|
|
137
|
+
}
|
|
128
138
|
}
|
|
129
139
|
|
|
130
140
|
con.onicegatheringstatechange = (state) => {
|
|
@@ -166,6 +176,7 @@ async function answerPeer(peer, offer) {
|
|
|
166
176
|
peer.dcOpen = true;
|
|
167
177
|
peer.dc = event.channel;
|
|
168
178
|
peer.rtcSend = (packet) => {
|
|
179
|
+
debug('sending packet', packet.toString(), peer.dc.readyState);
|
|
169
180
|
peer.dc.send(packet);
|
|
170
181
|
};
|
|
171
182
|
peer.rtcEvents.emit('dcOpen', peer.dc);
|
|
@@ -174,6 +185,16 @@ async function answerPeer(peer, offer) {
|
|
|
174
185
|
};
|
|
175
186
|
};
|
|
176
187
|
|
|
188
|
+
con.ontrack = (event) => {
|
|
189
|
+
debug('rtc track', event);
|
|
190
|
+
peer.rtcEvents.emit('track', event);
|
|
191
|
+
};
|
|
192
|
+
|
|
193
|
+
con.onaddstream = (event) => {
|
|
194
|
+
debug('rtc stream', event);
|
|
195
|
+
peer.rtcEvents.emit('addstream', event);
|
|
196
|
+
};
|
|
197
|
+
|
|
177
198
|
setTimeout(() => {
|
|
178
199
|
if (!gatheringComplete) {
|
|
179
200
|
debug('didnt finish gathering');
|