werift 0.22.9 → 0.24.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/README.md +46 -0
- package/lib/common/src/transport.d.ts +22 -9
- package/lib/common/src/transport.js +152 -25
- package/lib/common/src/transport.js.map +1 -1
- package/lib/dtls/src/flight/server/flight6.js +12 -2
- package/lib/dtls/src/flight/server/flight6.js.map +1 -1
- package/lib/dtls/src/server.js +6 -1
- package/lib/dtls/src/server.js.map +1 -1
- package/lib/dtls/src/socket.d.ts +1 -0
- package/lib/dtls/src/socket.js +3 -0
- package/lib/dtls/src/socket.js.map +1 -1
- package/lib/ice/src/candidate.d.ts +16 -1
- package/lib/ice/src/candidate.js +99 -15
- package/lib/ice/src/candidate.js.map +1 -1
- package/lib/ice/src/ice.d.ts +2 -0
- package/lib/ice/src/ice.js +171 -41
- package/lib/ice/src/ice.js.map +1 -1
- package/lib/ice/src/iceBase.d.ts +23 -2
- package/lib/ice/src/iceBase.js +63 -1
- package/lib/ice/src/iceBase.js.map +1 -1
- package/lib/ice/src/index.d.ts +2 -0
- package/lib/ice/src/index.js +2 -0
- package/lib/ice/src/index.js.map +1 -1
- package/lib/ice/src/stun/const.d.ts +1 -26
- package/lib/ice/src/stun/const.js +15 -54
- package/lib/ice/src/stun/const.js.map +1 -1
- package/lib/ice/src/stun/message.d.ts +1 -25
- package/lib/ice/src/stun/message.js +15 -149
- package/lib/ice/src/stun/message.js.map +1 -1
- package/lib/ice/src/stun/protocol.d.ts +1 -1
- package/lib/ice/src/stun/protocol.js +2 -2
- package/lib/ice/src/stun/protocol.js.map +1 -1
- package/lib/ice/src/stun/tcpFrame.d.ts +5 -0
- package/lib/ice/src/stun/tcpFrame.js +26 -0
- package/lib/ice/src/stun/tcpFrame.js.map +1 -0
- package/lib/ice/src/stun/tcpProtocol.d.ts +51 -0
- package/lib/ice/src/stun/tcpProtocol.js +326 -0
- package/lib/ice/src/stun/tcpProtocol.js.map +1 -0
- package/lib/ice/src/stun/transaction.d.ts +2 -1
- package/lib/ice/src/stun/transaction.js +9 -3
- package/lib/ice/src/stun/transaction.js.map +1 -1
- package/lib/ice/src/turn/frame.d.ts +1 -0
- package/lib/ice/src/turn/frame.js +18 -0
- package/lib/ice/src/turn/frame.js.map +1 -0
- package/lib/ice/src/turn/protocol.d.ts +9 -7
- package/lib/ice/src/turn/protocol.js +32 -44
- package/lib/ice/src/turn/protocol.js.map +1 -1
- package/lib/ice/src/types/model.d.ts +1 -1
- package/lib/ice/src/types/model.js.map +1 -1
- package/lib/{ice → ice-server}/src/stun/attributes.d.ts +12 -5
- package/lib/{ice → ice-server}/src/stun/attributes.js +60 -19
- package/lib/ice-server/src/stun/attributes.js.map +1 -0
- package/lib/ice-server/src/stun/const.d.ts +28 -0
- package/lib/ice-server/src/stun/const.js +88 -0
- package/lib/ice-server/src/stun/const.js.map +1 -0
- package/lib/ice-server/src/stun/message.d.ts +37 -0
- package/lib/ice-server/src/stun/message.js +190 -0
- package/lib/ice-server/src/stun/message.js.map +1 -0
- package/lib/ice-server/src/turn/auth.d.ts +1 -0
- package/lib/ice-server/src/turn/auth.js +10 -0
- package/lib/ice-server/src/turn/auth.js.map +1 -0
- package/lib/ice-server/src/turn/frame.d.ts +13 -0
- package/lib/ice-server/src/turn/frame.js +69 -0
- package/lib/ice-server/src/turn/frame.js.map +1 -0
- package/lib/index.mjs +3075 -883
- package/lib/nonstandard/index.mjs +1964 -447
- package/lib/rtp/src/extra/container/mp4/container.d.ts +9 -6
- package/lib/rtp/src/extra/container/mp4/container.js +258 -173
- package/lib/rtp/src/extra/container/mp4/container.js.map +1 -1
- package/lib/rtp/src/extra/container/mp4/h264.d.ts +1 -0
- package/lib/rtp/src/extra/container/mp4/h264.js +13 -0
- package/lib/rtp/src/extra/container/mp4/h264.js.map +1 -1
- package/lib/rtp/src/extra/processor/mp4.d.ts +11 -7
- package/lib/rtp/src/extra/processor/mp4.js +115 -60
- package/lib/rtp/src/extra/processor/mp4.js.map +1 -1
- package/lib/rtp/src/extra/processor/mp4Callback.d.ts +2 -3
- package/lib/rtp/src/extra/processor/mp4Callback.js +5 -3
- package/lib/rtp/src/extra/processor/mp4Callback.js.map +1 -1
- package/lib/rtp/src/index.d.ts +1 -0
- package/lib/rtp/src/index.js +1 -0
- package/lib/rtp/src/index.js.map +1 -1
- package/lib/rtp/src/srtp/cipher/ctr.d.ts +3 -3
- package/lib/rtp/src/srtp/cipher/ctr.js +25 -14
- package/lib/rtp/src/srtp/cipher/ctr.js.map +1 -1
- package/lib/rtp/src/srtp/cipher/gcm.d.ts +3 -3
- package/lib/rtp/src/srtp/cipher/gcm.js +57 -20
- package/lib/rtp/src/srtp/cipher/gcm.js.map +1 -1
- package/lib/rtp/src/srtp/cipher/index.d.ts +1 -1
- package/lib/rtp/src/srtp/cipher/index.js +1 -1
- package/lib/rtp/src/srtp/cipher/index.js.map +1 -1
- package/lib/rtp/src/srtp/context/srtp.d.ts +2 -1
- package/lib/rtp/src/srtp/context/srtp.js +22 -5
- package/lib/rtp/src/srtp/context/srtp.js.map +1 -1
- package/lib/rtp/src/srtp/error.d.ts +3 -0
- package/lib/rtp/src/srtp/error.js +11 -0
- package/lib/rtp/src/srtp/error.js.map +1 -0
- package/lib/rtp/src/srtp/packet.d.ts +5 -0
- package/lib/rtp/src/srtp/packet.js +48 -0
- package/lib/rtp/src/srtp/packet.js.map +1 -0
- package/lib/webrtc/src/dataChannel.d.ts +4 -2
- package/lib/webrtc/src/dataChannel.js +14 -4
- package/lib/webrtc/src/dataChannel.js.map +1 -1
- package/lib/webrtc/src/errors.d.ts +3 -0
- package/lib/webrtc/src/errors.js +11 -0
- package/lib/webrtc/src/errors.js.map +1 -0
- package/lib/webrtc/src/helper.d.ts +5 -1
- package/lib/webrtc/src/helper.js +33 -1
- package/lib/webrtc/src/helper.js.map +1 -1
- package/lib/webrtc/src/media/receiver/statistics.d.ts +4 -1
- package/lib/webrtc/src/media/receiver/statistics.js +22 -0
- package/lib/webrtc/src/media/receiver/statistics.js.map +1 -1
- package/lib/webrtc/src/media/rtpReceiver.d.ts +15 -2
- package/lib/webrtc/src/media/rtpReceiver.js +135 -20
- package/lib/webrtc/src/media/rtpReceiver.js.map +1 -1
- package/lib/webrtc/src/media/rtpSender.d.ts +32 -7
- package/lib/webrtc/src/media/rtpSender.js +177 -28
- package/lib/webrtc/src/media/rtpSender.js.map +1 -1
- package/lib/webrtc/src/media/rtpTransceiver.d.ts +13 -4
- package/lib/webrtc/src/media/rtpTransceiver.js +26 -5
- package/lib/webrtc/src/media/rtpTransceiver.js.map +1 -1
- package/lib/webrtc/src/media/stats.d.ts +15 -1
- package/lib/webrtc/src/media/stats.js +55 -1
- package/lib/webrtc/src/media/stats.js.map +1 -1
- package/lib/webrtc/src/media/track.d.ts +2 -1
- package/lib/webrtc/src/media/track.js +7 -1
- package/lib/webrtc/src/media/track.js.map +1 -1
- package/lib/webrtc/src/nonstandard/dummyMedia.d.ts +19 -0
- package/lib/webrtc/src/nonstandard/dummyMedia.js +157 -0
- package/lib/webrtc/src/nonstandard/dummyMedia.js.map +1 -0
- package/lib/webrtc/src/nonstandard/navigator.d.ts +18 -8
- package/lib/webrtc/src/nonstandard/navigator.js +96 -32
- package/lib/webrtc/src/nonstandard/navigator.js.map +1 -1
- package/lib/webrtc/src/nonstandard/userMedia/packetizer.d.ts +16 -0
- package/lib/webrtc/src/nonstandard/userMedia/packetizer.js +360 -0
- package/lib/webrtc/src/nonstandard/userMedia/packetizer.js.map +1 -0
- package/lib/webrtc/src/nonstandard/userMedia.d.ts +71 -31
- package/lib/webrtc/src/nonstandard/userMedia.js +454 -108
- package/lib/webrtc/src/nonstandard/userMedia.js.map +1 -1
- package/lib/webrtc/src/peerConnection.d.ts +185 -49
- package/lib/webrtc/src/peerConnection.js +477 -107
- package/lib/webrtc/src/peerConnection.js.map +1 -1
- package/lib/webrtc/src/sctpManager.d.ts +2 -2
- package/lib/webrtc/src/sctpManager.js +30 -9
- package/lib/webrtc/src/sctpManager.js.map +1 -1
- package/lib/webrtc/src/sdp.d.ts +10 -7
- package/lib/webrtc/src/sdp.js +39 -9
- package/lib/webrtc/src/sdp.js.map +1 -1
- package/lib/webrtc/src/sdpManager.d.ts +5 -4
- package/lib/webrtc/src/sdpManager.js +53 -31
- package/lib/webrtc/src/sdpManager.js.map +1 -1
- package/lib/webrtc/src/secureTransportManager.d.ts +13 -4
- package/lib/webrtc/src/secureTransportManager.js +101 -23
- package/lib/webrtc/src/secureTransportManager.js.map +1 -1
- package/lib/webrtc/src/transceiverManager.d.ts +5 -4
- package/lib/webrtc/src/transceiverManager.js +64 -64
- package/lib/webrtc/src/transceiverManager.js.map +1 -1
- package/lib/webrtc/src/transport/dtls.d.ts +16 -4
- package/lib/webrtc/src/transport/dtls.js +208 -35
- package/lib/webrtc/src/transport/dtls.js.map +1 -1
- package/lib/webrtc/src/transport/ice.d.ts +21 -3
- package/lib/webrtc/src/transport/ice.js +159 -30
- package/lib/webrtc/src/transport/ice.js.map +1 -1
- package/lib/webrtc/src/transport/sctp.d.ts +10 -3
- package/lib/webrtc/src/transport/sctp.js +44 -13
- package/lib/webrtc/src/transport/sctp.js.map +1 -1
- package/lib/webrtc/src/utils.d.ts +14 -4
- package/lib/webrtc/src/utils.js +138 -16
- package/lib/webrtc/src/utils.js.map +1 -1
- package/package.json +7 -4
- package/lib/ice/src/stun/attributes.js.map +0 -1
- package/lib/rtp/src/extra/container/mp4/mp4box.d.ts +0 -5
- package/lib/rtp/src/extra/container/mp4/mp4box.js +0 -32
- package/lib/rtp/src/extra/container/mp4/mp4box.js.map +0 -1
|
@@ -0,0 +1,326 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.TcpPassiveProtocol = exports.TcpActiveProtocol = void 0;
|
|
4
|
+
const node_net_1 = require("node:net");
|
|
5
|
+
const common_1 = require("../imports/common");
|
|
6
|
+
const const_1 = require("./const");
|
|
7
|
+
const message_1 = require("./message");
|
|
8
|
+
const tcpFrame_1 = require("./tcpFrame");
|
|
9
|
+
const transaction_1 = require("./transaction");
|
|
10
|
+
const log = (0, common_1.debug)("werift-ice:packages/ice/src/stun/tcpProtocol.ts");
|
|
11
|
+
function socketKey(addr) {
|
|
12
|
+
return `${addr[0]}:${addr[1]}`;
|
|
13
|
+
}
|
|
14
|
+
function addressFromSocket(socket) {
|
|
15
|
+
if (!socket.remoteAddress || !socket.remotePort) {
|
|
16
|
+
return;
|
|
17
|
+
}
|
|
18
|
+
return [socket.remoteAddress, socket.remotePort];
|
|
19
|
+
}
|
|
20
|
+
async function waitForListening(server, host, port) {
|
|
21
|
+
return await new Promise((resolve, reject) => {
|
|
22
|
+
const onError = (error) => {
|
|
23
|
+
server.off("listening", onListening);
|
|
24
|
+
reject(error);
|
|
25
|
+
};
|
|
26
|
+
const onListening = () => {
|
|
27
|
+
server.off("error", onError);
|
|
28
|
+
resolve();
|
|
29
|
+
};
|
|
30
|
+
server.once("error", onError);
|
|
31
|
+
server.once("listening", onListening);
|
|
32
|
+
server.listen({
|
|
33
|
+
host,
|
|
34
|
+
port: port ?? 0,
|
|
35
|
+
exclusive: true,
|
|
36
|
+
});
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
class BaseTcpProtocol {
|
|
40
|
+
constructor() {
|
|
41
|
+
Object.defineProperty(this, "type", {
|
|
42
|
+
enumerable: true,
|
|
43
|
+
configurable: true,
|
|
44
|
+
writable: true,
|
|
45
|
+
value: BaseTcpProtocol.type
|
|
46
|
+
});
|
|
47
|
+
Object.defineProperty(this, "transactions", {
|
|
48
|
+
enumerable: true,
|
|
49
|
+
configurable: true,
|
|
50
|
+
writable: true,
|
|
51
|
+
value: {}
|
|
52
|
+
});
|
|
53
|
+
Object.defineProperty(this, "localCandidate", {
|
|
54
|
+
enumerable: true,
|
|
55
|
+
configurable: true,
|
|
56
|
+
writable: true,
|
|
57
|
+
value: void 0
|
|
58
|
+
});
|
|
59
|
+
Object.defineProperty(this, "sentMessage", {
|
|
60
|
+
enumerable: true,
|
|
61
|
+
configurable: true,
|
|
62
|
+
writable: true,
|
|
63
|
+
value: void 0
|
|
64
|
+
});
|
|
65
|
+
Object.defineProperty(this, "localIp", {
|
|
66
|
+
enumerable: true,
|
|
67
|
+
configurable: true,
|
|
68
|
+
writable: true,
|
|
69
|
+
value: void 0
|
|
70
|
+
});
|
|
71
|
+
Object.defineProperty(this, "onRequestReceived", {
|
|
72
|
+
enumerable: true,
|
|
73
|
+
configurable: true,
|
|
74
|
+
writable: true,
|
|
75
|
+
value: new common_1.Event()
|
|
76
|
+
});
|
|
77
|
+
Object.defineProperty(this, "onDataReceived", {
|
|
78
|
+
enumerable: true,
|
|
79
|
+
configurable: true,
|
|
80
|
+
writable: true,
|
|
81
|
+
value: new common_1.Event()
|
|
82
|
+
});
|
|
83
|
+
Object.defineProperty(this, "sockets", {
|
|
84
|
+
enumerable: true,
|
|
85
|
+
configurable: true,
|
|
86
|
+
writable: true,
|
|
87
|
+
value: new Map()
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
rememberSocket(entry) {
|
|
91
|
+
const remoteAddr = entry.remoteAddr;
|
|
92
|
+
if (!remoteAddr) {
|
|
93
|
+
return;
|
|
94
|
+
}
|
|
95
|
+
this.sockets.set(socketKey(remoteAddr), entry);
|
|
96
|
+
}
|
|
97
|
+
forgetSocket(remoteAddr) {
|
|
98
|
+
if (!remoteAddr) {
|
|
99
|
+
return;
|
|
100
|
+
}
|
|
101
|
+
this.sockets.delete(socketKey(remoteAddr));
|
|
102
|
+
}
|
|
103
|
+
registerSocket(socket, remoteAddr) {
|
|
104
|
+
const entry = {
|
|
105
|
+
socket,
|
|
106
|
+
buffer: Buffer.alloc(0),
|
|
107
|
+
remoteAddr,
|
|
108
|
+
};
|
|
109
|
+
if (remoteAddr) {
|
|
110
|
+
this.rememberSocket(entry);
|
|
111
|
+
}
|
|
112
|
+
socket.on("data", (data) => {
|
|
113
|
+
entry.buffer = Buffer.concat([entry.buffer, data]);
|
|
114
|
+
const { frames, rest } = (0, tcpFrame_1.splitTcpFrames)(entry.buffer);
|
|
115
|
+
entry.buffer = rest;
|
|
116
|
+
const socketAddr = entry.remoteAddr ?? addressFromSocket(socket);
|
|
117
|
+
if (!entry.remoteAddr && socketAddr) {
|
|
118
|
+
entry.remoteAddr = socketAddr;
|
|
119
|
+
this.rememberSocket(entry);
|
|
120
|
+
}
|
|
121
|
+
if (!socketAddr) {
|
|
122
|
+
return;
|
|
123
|
+
}
|
|
124
|
+
for (const frame of frames) {
|
|
125
|
+
if (frame.length === 0) {
|
|
126
|
+
continue;
|
|
127
|
+
}
|
|
128
|
+
this.handleFrame(frame, socketAddr);
|
|
129
|
+
}
|
|
130
|
+
});
|
|
131
|
+
socket.on("close", () => {
|
|
132
|
+
this.forgetSocket(entry.remoteAddr);
|
|
133
|
+
});
|
|
134
|
+
socket.on("error", (error) => {
|
|
135
|
+
log("tcp socket error", error);
|
|
136
|
+
});
|
|
137
|
+
return entry;
|
|
138
|
+
}
|
|
139
|
+
handleFrame(data, addr) {
|
|
140
|
+
try {
|
|
141
|
+
const message = (0, message_1.parseMessage)(data);
|
|
142
|
+
if (!message) {
|
|
143
|
+
this.onDataReceived.execute(data);
|
|
144
|
+
return;
|
|
145
|
+
}
|
|
146
|
+
if ((message.messageClass === const_1.classes.RESPONSE ||
|
|
147
|
+
message.messageClass === const_1.classes.ERROR) &&
|
|
148
|
+
this.transactions[message.transactionIdHex]) {
|
|
149
|
+
this.transactions[message.transactionIdHex].responseReceived(message, addr);
|
|
150
|
+
}
|
|
151
|
+
else if (message.messageClass === const_1.classes.REQUEST) {
|
|
152
|
+
this.onRequestReceived.execute(message, addr, data);
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
catch (error) {
|
|
156
|
+
log("tcp frame parse error", error);
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
async sendFrame(data, addr) {
|
|
160
|
+
const entry = await this.getSocket(addr);
|
|
161
|
+
await new Promise((resolve, reject) => {
|
|
162
|
+
entry.socket.write((0, tcpFrame_1.encodeTcpFrame)(data), (error) => {
|
|
163
|
+
if (error) {
|
|
164
|
+
reject(error);
|
|
165
|
+
return;
|
|
166
|
+
}
|
|
167
|
+
resolve();
|
|
168
|
+
});
|
|
169
|
+
});
|
|
170
|
+
}
|
|
171
|
+
async sendStun(message, addr) {
|
|
172
|
+
await this.sendFrame(message.bytes, addr);
|
|
173
|
+
}
|
|
174
|
+
async sendData(data, addr) {
|
|
175
|
+
await this.sendFrame(data, addr);
|
|
176
|
+
}
|
|
177
|
+
async request(request, addr, integrityKey, retransmissions, onRequestSent) {
|
|
178
|
+
if (this.transactions[request.transactionIdHex]) {
|
|
179
|
+
throw new Error("already requested");
|
|
180
|
+
}
|
|
181
|
+
if (integrityKey) {
|
|
182
|
+
request.addMessageIntegrity(integrityKey);
|
|
183
|
+
request.addFingerprint();
|
|
184
|
+
}
|
|
185
|
+
const transaction = new transaction_1.Transaction(request, addr, this, retransmissions, onRequestSent);
|
|
186
|
+
this.transactions[request.transactionIdHex] = transaction;
|
|
187
|
+
try {
|
|
188
|
+
return await transaction.run();
|
|
189
|
+
}
|
|
190
|
+
finally {
|
|
191
|
+
delete this.transactions[request.transactionIdHex];
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
async pruneForSelection(remoteAddr) {
|
|
195
|
+
for (const [key, entry] of this.sockets.entries()) {
|
|
196
|
+
if (remoteAddr && key === socketKey(remoteAddr)) {
|
|
197
|
+
continue;
|
|
198
|
+
}
|
|
199
|
+
entry.socket.destroy();
|
|
200
|
+
this.sockets.delete(key);
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
get activeSocketCount() {
|
|
204
|
+
return this.sockets.size;
|
|
205
|
+
}
|
|
206
|
+
get address() {
|
|
207
|
+
return {};
|
|
208
|
+
}
|
|
209
|
+
async close() {
|
|
210
|
+
Object.values(this.transactions).forEach((transaction) => {
|
|
211
|
+
transaction.cancel();
|
|
212
|
+
});
|
|
213
|
+
await this.pruneForSelection();
|
|
214
|
+
this.onRequestReceived.complete();
|
|
215
|
+
this.onDataReceived.complete();
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
Object.defineProperty(BaseTcpProtocol, "type", {
|
|
219
|
+
enumerable: true,
|
|
220
|
+
configurable: true,
|
|
221
|
+
writable: true,
|
|
222
|
+
value: "tcp"
|
|
223
|
+
});
|
|
224
|
+
class TcpActiveProtocol extends BaseTcpProtocol {
|
|
225
|
+
constructor() {
|
|
226
|
+
super(...arguments);
|
|
227
|
+
Object.defineProperty(this, "pendingSockets", {
|
|
228
|
+
enumerable: true,
|
|
229
|
+
configurable: true,
|
|
230
|
+
writable: true,
|
|
231
|
+
value: new Map()
|
|
232
|
+
});
|
|
233
|
+
}
|
|
234
|
+
async connectionMade(localIp) {
|
|
235
|
+
this.localIp = localIp;
|
|
236
|
+
}
|
|
237
|
+
async getSocket(addr) {
|
|
238
|
+
const key = socketKey(addr);
|
|
239
|
+
const existing = this.sockets.get(key);
|
|
240
|
+
if (existing) {
|
|
241
|
+
return existing;
|
|
242
|
+
}
|
|
243
|
+
const pending = this.pendingSockets.get(key);
|
|
244
|
+
if (pending) {
|
|
245
|
+
return await pending;
|
|
246
|
+
}
|
|
247
|
+
const connecting = new Promise((resolve, reject) => {
|
|
248
|
+
const socket = (0, node_net_1.connect)({
|
|
249
|
+
host: addr[0],
|
|
250
|
+
port: addr[1],
|
|
251
|
+
localAddress: this.localIp,
|
|
252
|
+
});
|
|
253
|
+
const entry = this.registerSocket(socket, addr);
|
|
254
|
+
const onError = (error) => {
|
|
255
|
+
socket.off("connect", onConnect);
|
|
256
|
+
reject(error);
|
|
257
|
+
};
|
|
258
|
+
const onConnect = () => {
|
|
259
|
+
socket.off("error", onError);
|
|
260
|
+
resolve(entry);
|
|
261
|
+
};
|
|
262
|
+
socket.once("error", onError);
|
|
263
|
+
socket.once("connect", onConnect);
|
|
264
|
+
});
|
|
265
|
+
this.pendingSockets.set(key, connecting);
|
|
266
|
+
try {
|
|
267
|
+
return await connecting;
|
|
268
|
+
}
|
|
269
|
+
finally {
|
|
270
|
+
this.pendingSockets.delete(key);
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
exports.TcpActiveProtocol = TcpActiveProtocol;
|
|
275
|
+
class TcpPassiveProtocol extends BaseTcpProtocol {
|
|
276
|
+
constructor() {
|
|
277
|
+
super(...arguments);
|
|
278
|
+
Object.defineProperty(this, "server", {
|
|
279
|
+
enumerable: true,
|
|
280
|
+
configurable: true,
|
|
281
|
+
writable: true,
|
|
282
|
+
value: (0, node_net_1.createServer)((socket) => {
|
|
283
|
+
this.registerSocket(socket, addressFromSocket(socket));
|
|
284
|
+
})
|
|
285
|
+
});
|
|
286
|
+
}
|
|
287
|
+
async connectionMade(localIp, portRange) {
|
|
288
|
+
this.localIp = localIp;
|
|
289
|
+
if (portRange) {
|
|
290
|
+
let lastError;
|
|
291
|
+
for (let port = portRange[0]; port <= portRange[1]; port++) {
|
|
292
|
+
try {
|
|
293
|
+
await waitForListening(this.server, localIp, port);
|
|
294
|
+
return;
|
|
295
|
+
}
|
|
296
|
+
catch (error) {
|
|
297
|
+
lastError = error;
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
throw lastError ?? new Error("tcp port not found");
|
|
301
|
+
}
|
|
302
|
+
await waitForListening(this.server, localIp);
|
|
303
|
+
}
|
|
304
|
+
async getSocket(addr) {
|
|
305
|
+
const entry = this.sockets.get(socketKey(addr));
|
|
306
|
+
if (!entry) {
|
|
307
|
+
throw new Error("tcp passive connection not established");
|
|
308
|
+
}
|
|
309
|
+
return entry;
|
|
310
|
+
}
|
|
311
|
+
get listeningPort() {
|
|
312
|
+
const address = this.server.address();
|
|
313
|
+
if (!address || typeof address === "string") {
|
|
314
|
+
throw new Error("tcp passive protocol is not listening");
|
|
315
|
+
}
|
|
316
|
+
return address.port;
|
|
317
|
+
}
|
|
318
|
+
async close() {
|
|
319
|
+
await super.close();
|
|
320
|
+
await new Promise((resolve) => {
|
|
321
|
+
this.server.close(() => resolve());
|
|
322
|
+
});
|
|
323
|
+
}
|
|
324
|
+
}
|
|
325
|
+
exports.TcpPassiveProtocol = TcpPassiveProtocol;
|
|
326
|
+
//# sourceMappingURL=tcpProtocol.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tcpProtocol.js","sourceRoot":"","sources":["../../../../../ice/src/stun/tcpProtocol.ts"],"names":[],"mappings":"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","sourcesContent":["import { type AddressInfo, type Socket, connect, createServer } from \"node:net\";\n\nimport type { Candidate } from \"../candidate\";\nimport { type Address, Event, debug } from \"../imports/common\";\nimport type { Protocol } from \"../types/model\";\nimport { classes } from \"./const\";\nimport { type Message, parseMessage } from \"./message\";\nimport { encodeTcpFrame, splitTcpFrames } from \"./tcpFrame\";\nimport { Transaction } from \"./transaction\";\n\nconst log = debug(\"werift-ice:packages/ice/src/stun/tcpProtocol.ts\");\n\ntype SocketEntry = {\n socket: Socket;\n buffer: Buffer;\n remoteAddr?: Address;\n};\n\nfunction socketKey(addr: Address) {\n return `${addr[0]}:${addr[1]}`;\n}\n\nfunction addressFromSocket(socket: Socket) {\n if (!socket.remoteAddress || !socket.remotePort) {\n return;\n }\n return [socket.remoteAddress, socket.remotePort] as Address;\n}\n\nasync function waitForListening(\n server: ReturnType<typeof createServer>,\n host: string,\n port?: number,\n) {\n return await new Promise<void>((resolve, reject) => {\n const onError = (error: Error) => {\n server.off(\"listening\", onListening);\n reject(error);\n };\n const onListening = () => {\n server.off(\"error\", onError);\n resolve();\n };\n\n server.once(\"error\", onError);\n server.once(\"listening\", onListening);\n server.listen({\n host,\n port: port ?? 0,\n exclusive: true,\n });\n });\n}\n\nabstract class BaseTcpProtocol implements Protocol {\n static readonly type = \"tcp\";\n readonly type = BaseTcpProtocol.type;\n transactions: { [key: string]: Transaction } = {};\n localCandidate?: Candidate;\n sentMessage?: Message;\n localIp?: string;\n\n readonly onRequestReceived = new Event<[Message, Address, Buffer]>();\n readonly onDataReceived = new Event<[Buffer]>();\n\n protected readonly sockets = new Map<string, SocketEntry>();\n\n abstract connectionMade(...args: any[]): Promise<void>;\n protected abstract getSocket(addr: Address): Promise<SocketEntry>;\n\n protected rememberSocket(entry: SocketEntry) {\n const remoteAddr = entry.remoteAddr;\n if (!remoteAddr) {\n return;\n }\n\n this.sockets.set(socketKey(remoteAddr), entry);\n }\n\n protected forgetSocket(remoteAddr?: Address) {\n if (!remoteAddr) {\n return;\n }\n this.sockets.delete(socketKey(remoteAddr));\n }\n\n protected registerSocket(socket: Socket, remoteAddr?: Address) {\n const entry: SocketEntry = {\n socket,\n buffer: Buffer.alloc(0),\n remoteAddr,\n };\n\n if (remoteAddr) {\n this.rememberSocket(entry);\n }\n\n socket.on(\"data\", (data) => {\n entry.buffer = Buffer.concat([entry.buffer, data]);\n const { frames, rest } = splitTcpFrames(entry.buffer);\n entry.buffer = rest;\n\n const socketAddr = entry.remoteAddr ?? addressFromSocket(socket);\n if (!entry.remoteAddr && socketAddr) {\n entry.remoteAddr = socketAddr;\n this.rememberSocket(entry);\n }\n if (!socketAddr) {\n return;\n }\n\n for (const frame of frames) {\n if (frame.length === 0) {\n continue;\n }\n this.handleFrame(frame, socketAddr);\n }\n });\n socket.on(\"close\", () => {\n this.forgetSocket(entry.remoteAddr);\n });\n socket.on(\"error\", (error) => {\n log(\"tcp socket error\", error);\n });\n\n return entry;\n }\n\n private handleFrame(data: Buffer, addr: Address) {\n try {\n const message = parseMessage(data);\n if (!message) {\n this.onDataReceived.execute(data);\n return;\n }\n\n if (\n (message.messageClass === classes.RESPONSE ||\n message.messageClass === classes.ERROR) &&\n this.transactions[message.transactionIdHex]\n ) {\n this.transactions[message.transactionIdHex].responseReceived(\n message,\n addr,\n );\n } else if (message.messageClass === classes.REQUEST) {\n this.onRequestReceived.execute(message, addr, data);\n }\n } catch (error) {\n log(\"tcp frame parse error\", error);\n }\n }\n\n private async sendFrame(data: Buffer, addr: Address) {\n const entry = await this.getSocket(addr);\n await new Promise<void>((resolve, reject) => {\n entry.socket.write(encodeTcpFrame(data), (error) => {\n if (error) {\n reject(error);\n return;\n }\n resolve();\n });\n });\n }\n\n async sendStun(message: Message, addr: Address) {\n await this.sendFrame(message.bytes, addr);\n }\n\n async sendData(data: Buffer, addr: Address) {\n await this.sendFrame(data, addr);\n }\n\n async request(\n request: Message,\n addr: Address,\n integrityKey?: Buffer,\n retransmissions?: number,\n onRequestSent?: (attempt: number) => void,\n ) {\n if (this.transactions[request.transactionIdHex]) {\n throw new Error(\"already requested\");\n }\n\n if (integrityKey) {\n request.addMessageIntegrity(integrityKey);\n request.addFingerprint();\n }\n\n const transaction = new Transaction(\n request,\n addr,\n this,\n retransmissions,\n onRequestSent,\n );\n this.transactions[request.transactionIdHex] = transaction;\n\n try {\n return await transaction.run();\n } finally {\n delete this.transactions[request.transactionIdHex];\n }\n }\n\n async pruneForSelection(remoteAddr?: Address) {\n for (const [key, entry] of this.sockets.entries()) {\n if (remoteAddr && key === socketKey(remoteAddr)) {\n continue;\n }\n entry.socket.destroy();\n this.sockets.delete(key);\n }\n }\n\n get activeSocketCount() {\n return this.sockets.size;\n }\n\n get address() {\n return {} as AddressInfo;\n }\n\n async close() {\n Object.values(this.transactions).forEach((transaction) => {\n transaction.cancel();\n });\n\n await this.pruneForSelection();\n this.onRequestReceived.complete();\n this.onDataReceived.complete();\n }\n}\n\nexport class TcpActiveProtocol extends BaseTcpProtocol {\n private readonly pendingSockets = new Map<string, Promise<SocketEntry>>();\n\n async connectionMade(localIp: string) {\n this.localIp = localIp;\n }\n\n protected async getSocket(addr: Address) {\n const key = socketKey(addr);\n const existing = this.sockets.get(key);\n if (existing) {\n return existing;\n }\n\n const pending = this.pendingSockets.get(key);\n if (pending) {\n return await pending;\n }\n\n const connecting = new Promise<SocketEntry>((resolve, reject) => {\n const socket = connect({\n host: addr[0],\n port: addr[1],\n localAddress: this.localIp,\n });\n const entry = this.registerSocket(socket, addr);\n\n const onError = (error: Error) => {\n socket.off(\"connect\", onConnect);\n reject(error);\n };\n const onConnect = () => {\n socket.off(\"error\", onError);\n resolve(entry);\n };\n\n socket.once(\"error\", onError);\n socket.once(\"connect\", onConnect);\n });\n\n this.pendingSockets.set(key, connecting);\n\n try {\n return await connecting;\n } finally {\n this.pendingSockets.delete(key);\n }\n }\n}\n\nexport class TcpPassiveProtocol extends BaseTcpProtocol {\n private server = createServer((socket) => {\n this.registerSocket(socket, addressFromSocket(socket));\n });\n\n async connectionMade(localIp: string, portRange?: [number, number]) {\n this.localIp = localIp;\n\n if (portRange) {\n let lastError: Error | undefined;\n for (let port = portRange[0]; port <= portRange[1]; port++) {\n try {\n await waitForListening(this.server, localIp, port);\n return;\n } catch (error) {\n lastError = error as Error;\n }\n }\n throw lastError ?? new Error(\"tcp port not found\");\n }\n\n await waitForListening(this.server, localIp);\n }\n\n protected async getSocket(addr: Address) {\n const entry = this.sockets.get(socketKey(addr));\n if (!entry) {\n throw new Error(\"tcp passive connection not established\");\n }\n return entry;\n }\n\n get listeningPort() {\n const address = this.server.address();\n if (!address || typeof address === \"string\") {\n throw new Error(\"tcp passive protocol is not listening\");\n }\n return address.port;\n }\n\n override async close() {\n await super.close();\n await new Promise<void>((resolve) => {\n this.server.close(() => resolve());\n });\n }\n}\n"]}
|
|
@@ -6,12 +6,13 @@ export declare class Transaction {
|
|
|
6
6
|
private addr;
|
|
7
7
|
private protocol;
|
|
8
8
|
private retransmissions?;
|
|
9
|
+
private onRequestSent?;
|
|
9
10
|
private timeoutDelay;
|
|
10
11
|
ended: boolean;
|
|
11
12
|
private tries;
|
|
12
13
|
private readonly triesMax;
|
|
13
14
|
private readonly onResponse;
|
|
14
|
-
constructor(request: Message, addr: Address, protocol: Protocol, retransmissions?: number | undefined);
|
|
15
|
+
constructor(request: Message, addr: Address, protocol: Protocol, retransmissions?: number | undefined, onRequestSent?: ((attempt: number) => void) | undefined);
|
|
15
16
|
responseReceived: (message: Message, addr: Address) => void;
|
|
16
17
|
run: () => Promise<[Message, readonly [string, number]]>;
|
|
17
18
|
private retry;
|
|
@@ -6,7 +6,7 @@ const exceptions_1 = require("../exceptions");
|
|
|
6
6
|
const const_1 = require("./const");
|
|
7
7
|
const log = (0, common_1.debug)("werift-ice:packages/ice/src/stun/transaction.ts");
|
|
8
8
|
class Transaction {
|
|
9
|
-
constructor(request, addr, protocol, retransmissions) {
|
|
9
|
+
constructor(request, addr, protocol, retransmissions, onRequestSent) {
|
|
10
10
|
Object.defineProperty(this, "request", {
|
|
11
11
|
enumerable: true,
|
|
12
12
|
configurable: true,
|
|
@@ -31,6 +31,12 @@ class Transaction {
|
|
|
31
31
|
writable: true,
|
|
32
32
|
value: retransmissions
|
|
33
33
|
});
|
|
34
|
+
Object.defineProperty(this, "onRequestSent", {
|
|
35
|
+
enumerable: true,
|
|
36
|
+
configurable: true,
|
|
37
|
+
writable: true,
|
|
38
|
+
value: onRequestSent
|
|
39
|
+
});
|
|
34
40
|
Object.defineProperty(this, "timeoutDelay", {
|
|
35
41
|
enumerable: true,
|
|
36
42
|
configurable: true,
|
|
@@ -103,6 +109,7 @@ class Transaction {
|
|
|
103
109
|
writable: true,
|
|
104
110
|
value: async () => {
|
|
105
111
|
while (this.tries < this.triesMax && !this.ended) {
|
|
112
|
+
this.onRequestSent?.(this.tries);
|
|
106
113
|
this.protocol.sendStun(this.request, this.addr).catch((e) => {
|
|
107
114
|
log("send stun failed", e);
|
|
108
115
|
});
|
|
@@ -119,8 +126,7 @@ class Transaction {
|
|
|
119
126
|
}
|
|
120
127
|
}
|
|
121
128
|
});
|
|
122
|
-
this.triesMax =
|
|
123
|
-
1 + (this.retransmissions ? this.retransmissions : const_1.RETRY_MAX);
|
|
129
|
+
this.triesMax = 1 + (this.retransmissions ?? const_1.RETRY_MAX);
|
|
124
130
|
}
|
|
125
131
|
cancel() {
|
|
126
132
|
this.ended = true;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transaction.js","sourceRoot":"","sources":["../../../../../ice/src/stun/transaction.ts"],"names":[],"mappings":";;;AAAA,8CAA+D;AAE/D,8CAAsE;AAEtE,mCAAwD;AAGxD,MAAM,GAAG,GAAG,IAAA,cAAK,EAAC,iDAAiD,CAAC,CAAC;AAErE,MAAa,WAAW;IAOtB,YACU,OAAgB,EAChB,IAAa,EACb,QAAkB,EAClB,eAAwB;
|
|
1
|
+
{"version":3,"file":"transaction.js","sourceRoot":"","sources":["../../../../../ice/src/stun/transaction.ts"],"names":[],"mappings":"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","sourcesContent":["import { type Address, Event, debug } from \"../imports/common\";\n\nimport { TransactionFailed, TransactionTimeout } from \"../exceptions\";\nimport type { Protocol } from \"../types/model\";\nimport { RETRY_MAX, RETRY_RTO, classes } from \"./const\";\nimport type { Message } from \"./message\";\n\nconst log = debug(\"werift-ice:packages/ice/src/stun/transaction.ts\");\n\nexport class Transaction {\n private timeoutDelay = RETRY_RTO;\n ended = false;\n private tries = 0;\n private readonly triesMax: number;\n private readonly onResponse = new Event<[Message, Address]>();\n\n constructor(\n private request: Message,\n private addr: Address,\n private protocol: Protocol,\n private retransmissions?: number,\n private onRequestSent?: (attempt: number) => void,\n ) {\n this.triesMax = 1 + (this.retransmissions ?? RETRY_MAX);\n }\n\n responseReceived = (message: Message, addr: Address) => {\n if (this.onResponse.length > 0) {\n if (message.messageClass === classes.RESPONSE) {\n this.onResponse.execute(message, addr);\n this.onResponse.complete();\n } else {\n this.onResponse.error(new TransactionFailed(message, addr));\n }\n }\n };\n\n run = async () => {\n try {\n this.retry().catch((e) => {\n log(\"retry failed\", e);\n });\n const res = await this.onResponse.asPromise();\n return res;\n } catch (error) {\n throw error;\n } finally {\n this.cancel();\n }\n };\n\n private retry = async () => {\n while (this.tries < this.triesMax && !this.ended) {\n this.onRequestSent?.(this.tries);\n this.protocol.sendStun(this.request, this.addr).catch((e) => {\n log(\"send stun failed\", e);\n });\n await new Promise((r) => setTimeout(r, this.timeoutDelay));\n if (this.ended) {\n break;\n }\n this.timeoutDelay *= 2;\n this.tries++;\n }\n if (this.tries >= this.triesMax) {\n log(`retry failed times:${this.tries} maxLimit:${this.triesMax}`);\n this.onResponse.error(new TransactionTimeout());\n }\n };\n\n cancel() {\n this.ended = true;\n }\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from "../../../ice-server/src/turn/frame";
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
__exportStar(require("../../../ice-server/src/turn/frame"), exports);
|
|
18
|
+
//# sourceMappingURL=frame.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"frame.js","sourceRoot":"","sources":["../../../../../ice/src/turn/frame.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,qEAAmD","sourcesContent":["export * from \"../../../ice-server/src/turn/frame\";\n"]}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { Candidate } from "../candidate";
|
|
2
|
-
import { type Address, Event, type InterfaceAddresses, type Transport } from "../imports/common";
|
|
2
|
+
import { type Address, Event, type InterfaceAddresses, type TlsConnectionOptions, type Transport } from "../imports/common";
|
|
3
3
|
import { Message } from "../stun/message";
|
|
4
4
|
import { Transaction } from "../stun/transaction";
|
|
5
5
|
import type { Protocol } from "../types/model";
|
|
@@ -13,7 +13,7 @@ export declare class StunOverTurnProtocol implements Protocol {
|
|
|
13
13
|
onDataReceived: Event<[Buffer]>;
|
|
14
14
|
constructor(turn: TurnProtocol);
|
|
15
15
|
private handleStunMessage;
|
|
16
|
-
request(request: Message, addr: Address, integrityKey?: Buffer): Promise<[Message, readonly [string, number]]>;
|
|
16
|
+
request(request: Message, addr: Address, integrityKey?: Buffer, _retransmissions?: number, onRequestSent?: (attempt: number) => void): Promise<[Message, readonly [string, number]]>;
|
|
17
17
|
connectionMade(): Promise<void>;
|
|
18
18
|
sendData(data: Buffer, addr: Address): Promise<void>;
|
|
19
19
|
sendStun(message: Message, addr: Address): Promise<void>;
|
|
@@ -65,7 +65,7 @@ export declare class TurnProtocol implements Protocol {
|
|
|
65
65
|
private send;
|
|
66
66
|
private createPermission;
|
|
67
67
|
private refresh;
|
|
68
|
-
request(request: Message, addr: Address): Promise<[Message, Address]>;
|
|
68
|
+
request(request: Message, addr: Address, _integrityKey?: Buffer, _retransmissions?: number, onRequestSent?: (attempt: number) => void): Promise<[Message, Address]>;
|
|
69
69
|
requestWithRetry(request: Message, addr: Address): Promise<[Message, Address]>;
|
|
70
70
|
sendData(data: Buffer, addr: Address): Promise<void>;
|
|
71
71
|
getPermission(addr: Address): Promise<void>;
|
|
@@ -85,19 +85,21 @@ export interface TurnClientConfig {
|
|
|
85
85
|
export interface TurnClientOptions {
|
|
86
86
|
lifetime?: number;
|
|
87
87
|
ssl?: boolean;
|
|
88
|
-
transport?: "udp" | "tcp";
|
|
88
|
+
transport?: "udp" | "tcp" | "tls";
|
|
89
|
+
tlsOptions?: TlsConnectionOptions;
|
|
89
90
|
portRange?: [number, number];
|
|
90
91
|
interfaceAddresses?: InterfaceAddresses;
|
|
91
92
|
}
|
|
92
|
-
export declare function createTurnClient({ address, username, password }: TurnClientConfig, { lifetime, portRange, interfaceAddresses, transport: transportType, }?: TurnClientOptions): Promise<TurnProtocol>;
|
|
93
|
+
export declare function createTurnClient({ address, username, password }: TurnClientConfig, { lifetime, portRange, interfaceAddresses, ssl, tlsOptions, transport: transportType, }?: TurnClientOptions): Promise<TurnProtocol>;
|
|
93
94
|
export declare function createStunOverTurnClient({ address, username, password, }: {
|
|
94
95
|
address: Address;
|
|
95
96
|
username: string;
|
|
96
97
|
password: string;
|
|
97
|
-
}, { lifetime, portRange, interfaceAddresses, transport: transportType, }?: {
|
|
98
|
+
}, { lifetime, portRange, interfaceAddresses, ssl, tlsOptions, transport: transportType, }?: {
|
|
98
99
|
lifetime?: number;
|
|
99
100
|
ssl?: boolean;
|
|
100
|
-
transport?: "udp" | "tcp";
|
|
101
|
+
transport?: "udp" | "tcp" | "tls";
|
|
102
|
+
tlsOptions?: TlsConnectionOptions;
|
|
101
103
|
portRange?: [number, number];
|
|
102
104
|
interfaceAddresses?: InterfaceAddresses;
|
|
103
105
|
}): Promise<StunOverTurnProtocol>;
|