werift 0.22.6 → 0.22.7
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/lib/common/src/transport.d.ts +2 -2
- package/lib/common/src/transport.js +37 -7
- package/lib/common/src/transport.js.map +1 -1
- package/lib/ice/src/dns/lookup.d.ts +1 -1
- package/lib/ice/src/dns/lookup.js +35 -2
- package/lib/ice/src/dns/lookup.js.map +1 -1
- package/lib/ice/src/ice.js +3 -3
- package/lib/ice/src/ice.js.map +1 -1
- package/lib/ice/src/utils.d.ts +1 -1
- package/lib/ice/src/utils.js +35 -2
- package/lib/ice/src/utils.js.map +1 -1
- package/lib/index.mjs +16 -16
- package/lib/nonstandard/index.mjs +3 -3
- package/lib/webrtc/src/helper.d.ts +1 -1
- package/lib/webrtc/src/helper.js +2 -5
- package/lib/webrtc/src/helper.js.map +1 -1
- package/lib/webrtc/src/media/rtpReceiver.d.ts +1 -1
- package/package.json +1 -1
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { type RemoteInfo, type Socket, type SocketType } from "dgram";
|
|
2
|
-
import net from "net";
|
|
3
|
-
import { type AddressInfo } from "net";
|
|
2
|
+
import * as net from "node:net";
|
|
3
|
+
import { type AddressInfo } from "node:net";
|
|
4
4
|
import { type Address, type InterfaceAddresses } from "./network";
|
|
5
5
|
export declare class UdpTransport implements Transport {
|
|
6
6
|
private socketType;
|
|
@@ -1,12 +1,42 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
var
|
|
3
|
-
|
|
4
|
-
|
|
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 __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
5
35
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
36
|
exports.TcpTransport = exports.UdpTransport = void 0;
|
|
7
37
|
const dgram_1 = require("dgram");
|
|
8
|
-
const
|
|
9
|
-
const
|
|
38
|
+
const net = __importStar(require("node:net"));
|
|
39
|
+
const node_net_1 = require("node:net");
|
|
10
40
|
const log_1 = require("./log");
|
|
11
41
|
const network_1 = require("./network");
|
|
12
42
|
const log = (0, log_1.debug)("werift-ice:packages/ice/src/transport.ts");
|
|
@@ -59,7 +89,7 @@ class UdpTransport {
|
|
|
59
89
|
configurable: true,
|
|
60
90
|
writable: true,
|
|
61
91
|
value: async (data, addr) => {
|
|
62
|
-
if (addr && !
|
|
92
|
+
if (addr && !net.isIP(addr[0])) {
|
|
63
93
|
// if address is not resolved, need to use send callback to handle dns failure.
|
|
64
94
|
return new Promise((r, f) => {
|
|
65
95
|
this.socket.send(data, addr[1], addr[0], (error) => {
|
|
@@ -211,7 +241,7 @@ class TcpTransport {
|
|
|
211
241
|
}
|
|
212
242
|
this.connecting = new Promise((r, f) => {
|
|
213
243
|
try {
|
|
214
|
-
this.client = (0,
|
|
244
|
+
this.client = (0, node_net_1.connect)({ port: this.addr[1], host: this.addr[0] }, r);
|
|
215
245
|
}
|
|
216
246
|
catch (error) {
|
|
217
247
|
f(error);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transport.js","sourceRoot":"","sources":["../../../../common/src/transport.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n type RemoteInfo,\n type Socket,\n type SocketType,\n createSocket,\n} from \"dgram\";\n\nimport net from \"net\";\n\nimport { type AddressInfo, type Socket as TcpSocket, connect } from \"net\";\nimport { debug } from \"./log\";\nimport {\n type Address,\n type InterfaceAddresses,\n findPort,\n interfaceAddress,\n normalizeFamilyNodeV18,\n} from \"./network\";\n\nconst log = debug(\"werift-ice:packages/ice/src/transport.ts\");\n\nexport class UdpTransport implements Transport {\n readonly type = \"udp\";\n readonly socket: Socket;\n rinfo?: Partial<Pick<RemoteInfo, \"address\" | \"port\">>;\n onData: (data: Buffer, addr: Address) => void = () => {};\n closed: boolean = false;\n\n private constructor(\n private socketType: SocketType,\n private options: {\n portRange?: [number, number];\n interfaceAddresses?: InterfaceAddresses;\n port?: number;\n } = {},\n ) {\n this.socket = createSocket(socketType);\n this.socket.on(\"message\", (data, info) => {\n if (normalizeFamilyNodeV18(info.family) === 6) {\n [info.address] = info.address.split(\"%\"); // example fe80::1d3a:8751:4ffd:eb80%wlp82s0\n }\n this.rinfo = info;\n try {\n this.onData(data, [info.address, info.port]);\n } catch (error) {\n log(\"onData error\", error);\n }\n });\n }\n\n static async init(\n type: SocketType,\n options: {\n portRange?: [number, number];\n port?: number;\n interfaceAddresses?: InterfaceAddresses;\n } = {},\n ) {\n const transport = new UdpTransport(type, options);\n await transport.init();\n return transport;\n }\n\n private async init() {\n const address = interfaceAddress(\n this.socketType,\n this.options.interfaceAddresses,\n );\n if (this.options.port) {\n this.socket.bind({ port: this.options.port, address });\n } else if (this.options.portRange) {\n const port = await findPort(\n this.options.portRange[0],\n this.options.portRange[1],\n this.socketType,\n this.options.interfaceAddresses,\n );\n this.socket.bind({ port, address });\n } else {\n this.socket.bind({ address });\n }\n await new Promise((r) => this.socket.once(\"listening\", r));\n }\n\n send = async (data: Buffer, addr?: Address) => {\n if (addr && !net.isIP(addr[0])) {\n // if address is not resolved, need to use send callback to handle dns failure.\n return new Promise<void>((r, f) => {\n this.socket.send(data, addr![1], addr![0], (error) => {\n if (error) {\n log(\"send error\", addr, data);\n f(error);\n } else {\n r();\n }\n });\n });\n } else {\n addr = addr ?? [this.rinfo?.address!, this.rinfo?.port!];\n // a preestablished remote address does not need a callback to verify dns.\n // this is faster because event loop is not used per packet.\n this.socket.send(data, addr[1], addr[0]);\n }\n };\n\n get address() {\n return this.socket.address();\n }\n\n get host() {\n return this.socket.address().address;\n }\n\n get port() {\n return this.socket.address().port;\n }\n\n close = () =>\n new Promise<void>((r) => {\n this.closed = true;\n this.socket.once(\"close\", r);\n try {\n this.socket.close();\n } catch (error) {\n r();\n }\n });\n}\n\nexport class TcpTransport implements Transport {\n readonly type = \"tcp\";\n private connecting!: Promise<void>;\n private client!: TcpSocket;\n onData: (data: Buffer, addr: Address) => void = () => {};\n closed = false;\n\n private constructor(private addr: Address) {\n this.connect();\n }\n\n private connect() {\n if (this.closed) {\n return;\n }\n\n if (this.client) {\n this.client.destroy();\n }\n this.connecting = new Promise((r, f) => {\n try {\n this.client = connect({ port: this.addr[1], host: this.addr[0] }, r);\n } catch (error) {\n f(error);\n }\n });\n\n this.client.on(\"data\", (data) => {\n const addr = [\n this.client.remoteAddress!,\n this.client.remotePort!,\n ] as Address;\n this.onData(data, addr);\n });\n this.client.on(\"end\", () => {\n this.connect();\n });\n this.client.on(\"error\", (error) => {\n console.log(\"error\", error);\n });\n }\n\n private async init() {\n await this.connecting;\n }\n\n static async init(addr: Address) {\n const transport = new TcpTransport(addr);\n await transport.init();\n return transport;\n }\n\n get address() {\n return {} as AddressInfo;\n }\n\n send = async (data: Buffer, addr?: Address) => {\n await this.connecting;\n this.client.write(data, (err) => {\n if (err) {\n console.log(\"err\", err);\n }\n });\n };\n\n close = async () => {\n this.closed = true;\n this.client.destroy();\n };\n}\n\nexport interface Transport {\n type: string;\n address: AddressInfo;\n closed: boolean;\n onData: (data: Buffer, addr: Address) => void;\n send: (data: Buffer, addr?: Address) => Promise<void>;\n close: () => Promise<void>;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"transport.js","sourceRoot":"","sources":["../../../../common/src/transport.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n type RemoteInfo,\n type Socket,\n type SocketType,\n createSocket,\n} from \"dgram\";\n\nimport * as net from \"node:net\";\n\nimport { type AddressInfo, type Socket as TcpSocket, connect } from \"node:net\";\nimport { debug } from \"./log\";\nimport {\n type Address,\n type InterfaceAddresses,\n findPort,\n interfaceAddress,\n normalizeFamilyNodeV18,\n} from \"./network\";\n\nconst log = debug(\"werift-ice:packages/ice/src/transport.ts\");\n\nexport class UdpTransport implements Transport {\n readonly type = \"udp\";\n readonly socket: Socket;\n rinfo?: Partial<Pick<RemoteInfo, \"address\" | \"port\">>;\n onData: (data: Buffer, addr: Address) => void = () => {};\n closed: boolean = false;\n\n private constructor(\n private socketType: SocketType,\n private options: {\n portRange?: [number, number];\n interfaceAddresses?: InterfaceAddresses;\n port?: number;\n } = {},\n ) {\n this.socket = createSocket(socketType);\n this.socket.on(\"message\", (data, info) => {\n if (normalizeFamilyNodeV18(info.family) === 6) {\n [info.address] = info.address.split(\"%\"); // example fe80::1d3a:8751:4ffd:eb80%wlp82s0\n }\n this.rinfo = info;\n try {\n this.onData(data, [info.address, info.port]);\n } catch (error) {\n log(\"onData error\", error);\n }\n });\n }\n\n static async init(\n type: SocketType,\n options: {\n portRange?: [number, number];\n port?: number;\n interfaceAddresses?: InterfaceAddresses;\n } = {},\n ) {\n const transport = new UdpTransport(type, options);\n await transport.init();\n return transport;\n }\n\n private async init() {\n const address = interfaceAddress(\n this.socketType,\n this.options.interfaceAddresses,\n );\n if (this.options.port) {\n this.socket.bind({ port: this.options.port, address });\n } else if (this.options.portRange) {\n const port = await findPort(\n this.options.portRange[0],\n this.options.portRange[1],\n this.socketType,\n this.options.interfaceAddresses,\n );\n this.socket.bind({ port, address });\n } else {\n this.socket.bind({ address });\n }\n await new Promise((r) => this.socket.once(\"listening\", r));\n }\n\n send = async (data: Buffer, addr?: Address) => {\n if (addr && !net.isIP(addr[0])) {\n // if address is not resolved, need to use send callback to handle dns failure.\n return new Promise<void>((r, f) => {\n this.socket.send(data, addr![1], addr![0], (error) => {\n if (error) {\n log(\"send error\", addr, data);\n f(error);\n } else {\n r();\n }\n });\n });\n } else {\n addr = addr ?? [this.rinfo?.address!, this.rinfo?.port!];\n // a preestablished remote address does not need a callback to verify dns.\n // this is faster because event loop is not used per packet.\n this.socket.send(data, addr[1], addr[0]);\n }\n };\n\n get address() {\n return this.socket.address();\n }\n\n get host() {\n return this.socket.address().address;\n }\n\n get port() {\n return this.socket.address().port;\n }\n\n close = () =>\n new Promise<void>((r) => {\n this.closed = true;\n this.socket.once(\"close\", r);\n try {\n this.socket.close();\n } catch (error) {\n r();\n }\n });\n}\n\nexport class TcpTransport implements Transport {\n readonly type = \"tcp\";\n private connecting!: Promise<void>;\n private client!: TcpSocket;\n onData: (data: Buffer, addr: Address) => void = () => {};\n closed = false;\n\n private constructor(private addr: Address) {\n this.connect();\n }\n\n private connect() {\n if (this.closed) {\n return;\n }\n\n if (this.client) {\n this.client.destroy();\n }\n this.connecting = new Promise((r, f) => {\n try {\n this.client = connect({ port: this.addr[1], host: this.addr[0] }, r);\n } catch (error) {\n f(error);\n }\n });\n\n this.client.on(\"data\", (data) => {\n const addr = [\n this.client.remoteAddress!,\n this.client.remotePort!,\n ] as Address;\n this.onData(data, addr);\n });\n this.client.on(\"end\", () => {\n this.connect();\n });\n this.client.on(\"error\", (error) => {\n console.log(\"error\", error);\n });\n }\n\n private async init() {\n await this.connecting;\n }\n\n static async init(addr: Address) {\n const transport = new TcpTransport(addr);\n await transport.init();\n return transport;\n }\n\n get address() {\n return {} as AddressInfo;\n }\n\n send = async (data: Buffer, addr?: Address) => {\n await this.connecting;\n this.client.write(data, (err) => {\n if (err) {\n console.log(\"err\", err);\n }\n });\n };\n\n close = async () => {\n this.closed = true;\n this.client.destroy();\n };\n}\n\nexport interface Transport {\n type: string;\n address: AddressInfo;\n closed: boolean;\n onData: (data: Buffer, addr: Address) => void;\n send: (data: Buffer, addr?: Address) => Promise<void>;\n close: () => Promise<void>;\n}\n"]}
|
|
@@ -1,11 +1,44 @@
|
|
|
1
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 __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
2
35
|
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
36
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
37
|
};
|
|
5
38
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
39
|
exports.DnsLookup = exports.MdnsLookup = void 0;
|
|
40
|
+
const worker_thread = __importStar(require("node:worker_threads"));
|
|
7
41
|
const multicast_dns_1 = __importDefault(require("multicast-dns"));
|
|
8
|
-
const worker_threads_1 = __importDefault(require("worker_threads"));
|
|
9
42
|
class MdnsLookup {
|
|
10
43
|
constructor() {
|
|
11
44
|
Object.defineProperty(this, "cache", {
|
|
@@ -85,7 +118,7 @@ class DnsLookup {
|
|
|
85
118
|
});
|
|
86
119
|
};
|
|
87
120
|
const lookupEval = `(${lookupWorkerFunction})()`;
|
|
88
|
-
this.thread = new
|
|
121
|
+
this.thread = new worker_thread.Worker(lookupEval, {
|
|
89
122
|
eval: true,
|
|
90
123
|
});
|
|
91
124
|
this.thread.setMaxListeners(100);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lookup.js","sourceRoot":"","sources":["../../../../../ice/src/dns/lookup.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"lookup.js","sourceRoot":"","sources":["../../../../../ice/src/dns/lookup.ts"],"names":[],"mappings":"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","sourcesContent":["import * as worker_thread from \"node:worker_threads\";\nimport mdns from \"multicast-dns\";\n\ninterface DnsLookupRequest {\n host: string;\n}\n\ninterface DnsLookupResult extends DnsLookupRequest {\n err?: string;\n address?: string;\n family?: number;\n}\n\nexport class MdnsLookup {\n cache = new Map<string, Promise<string>>();\n mdnsInstance = mdns();\n\n constructor() {\n this.mdnsInstance.setMaxListeners(50);\n }\n\n lookup(host: string): Promise<string> {\n return new Promise((r, f) => {\n const cleanup = () => {\n this.mdnsInstance.removeListener(\"response\", l);\n clearTimeout(timeout);\n };\n\n const timeout = setTimeout(() => {\n cleanup();\n f(new Error(\"No mDNS response\"));\n }, 10000);\n\n const l = (response: mdns.ResponsePacket) => {\n const a = response.answers?.[0];\n if (a?.type !== \"A\") {\n return;\n }\n if (a.name !== host) {\n return;\n }\n\n cleanup();\n r(a.data);\n };\n this.mdnsInstance.on(\"response\", l);\n\n this.mdnsInstance.query(host, \"A\");\n });\n }\n\n close() {\n this.mdnsInstance.destroy();\n }\n}\n\nexport class DnsLookup {\n thread: worker_thread.Worker;\n cache = new Map<string, Promise<string>>();\n\n constructor() {\n const lookupWorkerFunction = () => {\n const worker_thread = global.require(\"worker_threads\");\n const { lookup } = global.require(\"dns\");\n\n const dnsLookup = (host: string) =>\n lookup(host, (err: Error, address: string, family: number) => {\n const res: DnsLookupResult = {\n err: err?.message,\n address,\n family,\n host,\n };\n worker_thread.parentPort?.postMessage(res);\n process.exit();\n });\n\n worker_thread.parentPort?.on(\"message\", (message: DnsLookupRequest) => {\n const { host } = message;\n dnsLookup(host);\n });\n };\n\n const lookupEval = `(${lookupWorkerFunction})()`;\n\n this.thread = new worker_thread.Worker(lookupEval, {\n eval: true,\n });\n\n this.thread.setMaxListeners(100);\n }\n\n async lookup(host: string): Promise<string> {\n let cached = this.cache.get(host);\n if (cached) {\n return cached;\n }\n cached = new Promise((r, f) => {\n const exitListener = (exitCode: number) =>\n f(new Error(`dns.lookup thread exited unexpectedly: ${exitCode}`));\n\n const threadMessageListener = (result: DnsLookupResult) => {\n if (result.host !== host) {\n return;\n }\n\n this.thread.removeListener(\"message\", threadMessageListener);\n this.thread.removeListener(\"exit\", exitListener);\n\n if (!result.address)\n return f(new Error(result.err || \"dns.lookup thread unknown error\"));\n r(result.address);\n };\n\n this.thread.on(\"message\", threadMessageListener);\n this.thread.on(\"exit\", exitListener);\n\n this.thread.postMessage({\n host,\n } as DnsLookupRequest);\n });\n\n this.cache.set(host, cached);\n return cached;\n }\n\n close() {\n return this.thread.terminate();\n }\n}\n"]}
|
package/lib/ice/src/ice.js
CHANGED
|
@@ -40,8 +40,8 @@ exports.Connection = void 0;
|
|
|
40
40
|
const crypto_1 = require("crypto");
|
|
41
41
|
const net_1 = require("net");
|
|
42
42
|
const Int64 = __importStar(require("int64-buffer"));
|
|
43
|
+
const timers = __importStar(require("node:timers/promises"));
|
|
43
44
|
const fast_deep_equal_1 = __importDefault(require("fast-deep-equal"));
|
|
44
|
-
const promises_1 = __importDefault(require("timers/promises"));
|
|
45
45
|
const common_1 = require("./imports/common");
|
|
46
46
|
const candidate_1 = require("./candidate");
|
|
47
47
|
const lookup_1 = require("./dns/lookup");
|
|
@@ -268,7 +268,7 @@ class Connection {
|
|
|
268
268
|
try {
|
|
269
269
|
while (this.state !== "closed" && !canceled) {
|
|
270
270
|
// # randomize between 0.8 and 1.2 times CONSENT_INTERVAL
|
|
271
|
-
await
|
|
271
|
+
await timers.setTimeout(iceBase_1.CONSENT_INTERVAL * (0.8 + 0.4 * Math.random()) * 1000, undefined, { signal: cancelEvent.signal });
|
|
272
272
|
const nominated = this.nominated;
|
|
273
273
|
if (!nominated || canceled) {
|
|
274
274
|
break;
|
|
@@ -754,7 +754,7 @@ class Connection {
|
|
|
754
754
|
break;
|
|
755
755
|
if (!this.schedulingChecks())
|
|
756
756
|
break;
|
|
757
|
-
await
|
|
757
|
+
await timers.setTimeout(20);
|
|
758
758
|
}
|
|
759
759
|
// # wait for completion
|
|
760
760
|
let res = iceBase_1.ICE_FAILED;
|
package/lib/ice/src/ice.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ice.js","sourceRoot":"","sources":["../../../../ice/src/ice.ts"],"names":[],"mappings":"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","sourcesContent":["import { randomBytes } from \"crypto\";\nimport { isIPv4 } from \"net\";\n\nimport * as Int64 from \"int64-buffer\";\n\nimport isEqual from \"fast-deep-equal\";\nimport timers from \"timers/promises\";\nimport { type Address, Event, debug } from \"./imports/common\";\n\nimport { Candidate, candidateFoundation, candidatePriority } from \"./candidate\";\nimport { MdnsLookup } from \"./dns/lookup\";\nimport type { TransactionError } from \"./exceptions\";\nimport { type Cancelable, PQueue, cancelable, randomString } from \"./helper\";\nimport {\n CONSENT_FAILURES,\n CONSENT_INTERVAL,\n CandidatePair,\n CandidatePairState,\n ICE_COMPLETED,\n ICE_FAILED,\n type IceConnection,\n type IceOptions,\n type IceState,\n defaultOptions,\n serverReflexiveCandidate,\n sortCandidatePairs,\n validateAddress,\n validateRemoteCandidate,\n} from \"./iceBase\";\nimport { classes, methods } from \"./stun/const\";\nimport { Message } from \"./stun/message\";\nimport { StunProtocol } from \"./stun/protocol\";\nimport { createStunOverTurnClient } from \"./turn/protocol\";\nimport type { Protocol } from \"./types/model\";\nimport { getHostAddresses } from \"./utils\";\n\nconst log = debug(\"werift-ice : packages/ice/src/ice.ts : log\");\n\nexport class Connection implements IceConnection {\n localUsername = randomString(4);\n localPassword = randomString(22);\n remoteIsLite = false;\n remotePassword: string = \"\";\n remoteUsername: string = \"\";\n checkList: CandidatePair[] = [];\n localCandidates: Candidate[] = [];\n stunServer?: Address;\n turnServer?: Address;\n options: IceOptions;\n remoteCandidatesEnd = false;\n localCandidatesEnd = false;\n generation = -1;\n userHistory: { [username: string]: string } = {};\n private readonly tieBreaker: bigint = BigInt(\n new Int64.Uint64BE(randomBytes(64)).toString(),\n );\n state: IceState = \"new\";\n lookup?: MdnsLookup;\n\n private _remoteCandidates: Candidate[] = [];\n // P2P接続完了したソケット\n nominated?: CandidatePair;\n private nominating = false;\n private checkListDone = false;\n private checkListState = new PQueue<number>();\n private earlyChecks: [Message, Address, Protocol][] = [];\n private earlyChecksDone = false;\n private localCandidatesStart = false;\n private protocols: Protocol[] = [];\n private queryConsentHandle?: Cancelable<void>;\n\n readonly onData = new Event<[Buffer]>();\n readonly stateChanged = new Event<[IceState]>();\n readonly onIceCandidate: Event<[Candidate]> = new Event();\n\n constructor(\n private _iceControlling: boolean,\n options?: Partial<IceOptions>,\n ) {\n this.options = {\n ...defaultOptions,\n ...options,\n };\n const { stunServer, turnServer } = this.options;\n this.stunServer = validateAddress(stunServer) ?? [\n \"stun.l.google.com\",\n 19302,\n ];\n this.turnServer = validateAddress(turnServer);\n this.restart();\n log(\"new Connection\", this.options);\n }\n\n get iceControlling() {\n return this._iceControlling;\n }\n\n set iceControlling(value: boolean) {\n if (this.generation > 0 || this.nominated) {\n return;\n }\n this._iceControlling = value;\n for (const pair of this.checkList) {\n pair.iceControlling = value;\n }\n }\n\n async restart() {\n this.generation++;\n\n this.localUsername = randomString(4);\n this.localPassword = randomString(22);\n if (this.options.localPasswordPrefix) {\n this.localPassword =\n this.options.localPasswordPrefix +\n this.localPassword.slice(this.options.localPasswordPrefix.length);\n }\n this.userHistory[this.localUsername] = this.localPassword;\n\n this.remoteUsername = \"\";\n this.remotePassword = \"\";\n this.localCandidates = [];\n this._remoteCandidates = [];\n this.remoteCandidatesEnd = false;\n this.localCandidatesEnd = false;\n this.state = \"new\";\n this.lookup?.close?.();\n this.lookup = undefined;\n this.nominated = undefined;\n this.nominating = false;\n this.checkList = [];\n this.checkListDone = false;\n this.checkListState = new PQueue<number>();\n this.earlyChecks = [];\n this.earlyChecksDone = false;\n this.localCandidatesStart = false;\n\n // protocolsはincomingのearlyCheckに使うかもしれないので残す\n for (const protocol of this.protocols) {\n if (protocol.localCandidate) {\n protocol.localCandidate.generation = this.generation;\n protocol.localCandidate.ufrag = this.localUsername;\n }\n }\n\n this.queryConsentHandle?.resolve?.();\n this.queryConsentHandle = undefined;\n }\n\n resetNominatedPair() {\n log(\"resetNominatedPair\");\n this.nominated = undefined;\n this.nominating = false;\n }\n\n setRemoteParams({\n iceLite,\n usernameFragment,\n password,\n }: {\n iceLite: boolean;\n usernameFragment: string;\n password: string;\n }) {\n log(\"setRemoteParams\", { iceLite, usernameFragment, password });\n this.remoteIsLite = iceLite;\n this.remoteUsername = usernameFragment;\n this.remotePassword = password;\n }\n\n // 4.1.1 Gathering Candidates\n async gatherCandidates() {\n if (!this.localCandidatesStart) {\n this.localCandidatesStart = true;\n\n let address = getHostAddresses(\n this.options.useIpv4,\n this.options.useIpv6,\n {\n useLinkLocalAddress: this.options.useLinkLocalAddress,\n },\n );\n const { interfaceAddresses } = this.options;\n if (interfaceAddresses) {\n const filteredAddresses = address.filter((check) =>\n Object.values(interfaceAddresses).includes(check),\n );\n if (filteredAddresses.length) {\n address = filteredAddresses;\n }\n }\n if (this.options.additionalHostAddresses) {\n address = Array.from(\n new Set([...this.options.additionalHostAddresses, ...address]),\n );\n }\n\n const candidatePromises = this.getCandidatePromises(address, 5);\n await Promise.allSettled(candidatePromises);\n\n this.localCandidatesEnd = true;\n }\n this.setState(\"completed\");\n }\n\n private appendLocalCandidate(candidate: Candidate) {\n this.localCandidates.push(candidate);\n this.onIceCandidate.execute(candidate);\n }\n\n private ensureProtocol(protocol: Protocol) {\n protocol.onRequestReceived.subscribe((msg, addr, data) => {\n if (msg.messageMethod !== methods.BINDING) {\n this.respondError(msg, addr, protocol, [400, \"Bad Request\"]);\n return;\n }\n\n const txUsername = msg.getAttributeValue(\"USERNAME\");\n // 相手にとってのremoteは自分にとってのlocal\n const { remoteUsername: localUsername } = decodeTxUsername(txUsername);\n const localPassword =\n this.userHistory[localUsername] ?? this.localPassword;\n\n const { iceControlling } = this;\n\n // 7.2.1.1. Detecting and Repairing Role Conflicts\n if (iceControlling && msg.attributesKeys.includes(\"ICE-CONTROLLING\")) {\n if (this.tieBreaker >= msg.getAttributeValue(\"ICE-CONTROLLING\")) {\n this.respondError(msg, addr, protocol, [487, \"Role Conflict\"]);\n return;\n } else {\n this.switchRole(false);\n }\n } else if (\n !iceControlling &&\n msg.attributesKeys.includes(\"ICE-CONTROLLED\")\n ) {\n if (this.tieBreaker < msg.getAttributeValue(\"ICE-CONTROLLED\")) {\n this.respondError(msg, addr, protocol, [487, \"Role Conflict\"]);\n } else {\n this.switchRole(true);\n return;\n }\n }\n\n if (\n this.options.filterStunResponse &&\n !this.options.filterStunResponse(msg, addr, protocol)\n ) {\n return;\n }\n\n // # send binding response\n const response = new Message(\n methods.BINDING,\n classes.RESPONSE,\n msg.transactionId,\n );\n\n response\n .setAttribute(\"XOR-MAPPED-ADDRESS\", addr)\n .addMessageIntegrity(Buffer.from(localPassword, \"utf8\"))\n .addFingerprint();\n protocol.sendStun(response, addr).catch((e) => {\n log(\"sendStun error\", e);\n });\n\n if (this.checkList.length === 0 && !this.earlyChecksDone) {\n this.earlyChecks.push([msg, addr, protocol]);\n } else {\n this.checkIncoming(msg, addr, protocol);\n }\n });\n protocol.onDataReceived.subscribe((data) => {\n try {\n // Update statistics for the nominated pair\n const activePair = this.nominated;\n if (activePair && activePair.protocol === protocol) {\n activePair.packetsReceived++;\n activePair.bytesReceived += data.length;\n }\n\n this.onData.execute(data);\n } catch (error) {\n log(\"dataReceived\", error);\n }\n });\n }\n\n private getCandidatePromises(addresses: string[], timeout = 5) {\n let candidatePromises: Promise<Candidate | void>[] = [];\n\n addresses = addresses.filter((address) => {\n // ice restartで同じアドレスが追加されるのを防ぐ\n if (this.protocols.find((protocol) => protocol.localIp === address)) {\n return false;\n }\n return true;\n });\n\n const localStunPromises = addresses.map(async (address) => {\n // # create transport\n const protocol = new StunProtocol();\n this.ensureProtocol(protocol);\n try {\n await protocol.connectionMade(\n isIPv4(address),\n this.options.portRange,\n this.options.interfaceAddresses,\n );\n\n protocol.localIp = address;\n this.protocols.push(protocol);\n\n log(\"protocol\", protocol.localIp);\n\n // # add host candidate\n const candidateAddress: Address = [address, protocol.getExtraInfo()[1]];\n\n protocol.localCandidate = new Candidate(\n candidateFoundation(\"host\", \"udp\", candidateAddress[0]),\n 1,\n \"udp\",\n candidatePriority(\"host\"),\n candidateAddress[0],\n candidateAddress[1],\n \"host\",\n undefined,\n undefined,\n undefined,\n this.generation,\n this.localUsername,\n );\n\n this.pairLocalProtocol(protocol);\n this.appendLocalCandidate(protocol.localCandidate);\n\n return protocol;\n } catch (error) {\n log(\"error protocol STUN\", error);\n }\n });\n\n candidatePromises.push(\n ...localStunPromises.map((localPromise) =>\n localPromise.then((l) => l?.localCandidate),\n ),\n );\n\n const { stunServer, turnServer } = this;\n\n if (stunServer) {\n const stunCandidatePromises = localStunPromises.map(\n async (protocolPromise) => {\n const protocol = await protocolPromise;\n if (!protocol) return;\n\n const stunCandidatePromise = new Promise<Candidate | void>(\n async (r, f) => {\n const timer = setTimeout(f, timeout * 1000);\n if (\n protocol.localCandidate?.host &&\n isIPv4(protocol.localCandidate?.host)\n ) {\n const candidate = await serverReflexiveCandidate(\n protocol,\n stunServer,\n ).catch((error) => {\n log(\"error\", error);\n });\n if (candidate) {\n this.appendLocalCandidate(candidate);\n }\n\n clearTimeout(timer);\n r(candidate);\n } else {\n clearTimeout(timer);\n r();\n }\n },\n ).catch((error) => {\n log(\"query STUN server\", error);\n });\n\n return stunCandidatePromise;\n },\n );\n\n candidatePromises.push(...stunCandidatePromises);\n }\n\n const { turnUsername, turnPassword } = this.options;\n if (turnServer && turnUsername && turnPassword) {\n const turnCandidatePromise = (async () => {\n const protocol = await createStunOverTurnClient(\n {\n address: turnServer,\n username: turnUsername,\n password: turnPassword,\n },\n {\n portRange: this.options.portRange,\n interfaceAddresses: this.options.interfaceAddresses,\n transport: this.options.turnTransport === \"tcp\" ? \"tcp\" : \"udp\",\n },\n ).catch(async (e) => {\n if (this.options.turnTransport !== \"tcp\") {\n return await createStunOverTurnClient(\n {\n address: turnServer,\n username: turnUsername,\n password: turnPassword,\n },\n {\n portRange: this.options.portRange,\n interfaceAddresses: this.options.interfaceAddresses,\n transport: \"tcp\",\n },\n );\n } else {\n throw e;\n }\n });\n this.ensureProtocol(protocol);\n this.protocols.push(protocol);\n\n const candidateAddress = protocol.turn.relayedAddress;\n const relatedAddress = protocol.turn.mappedAddress;\n\n log(\"turn candidateAddress\", candidateAddress);\n\n protocol.localCandidate = new Candidate(\n candidateFoundation(\"relay\", \"udp\", candidateAddress[0]),\n 1,\n \"udp\",\n candidatePriority(\"relay\"),\n candidateAddress[0],\n candidateAddress[1],\n \"relay\",\n relatedAddress[0],\n relatedAddress[1],\n undefined,\n this.generation,\n this.localUsername,\n );\n this.appendLocalCandidate(protocol.localCandidate);\n\n return protocol.localCandidate;\n })().catch((error) => {\n log(\"query TURN server\", error);\n });\n\n if (this.options.forceTurn) {\n candidatePromises = [];\n }\n\n candidatePromises.push(turnCandidatePromise);\n }\n\n return candidatePromises;\n }\n\n async connect() {\n // \"\"\"\n // Perform ICE handshake.\n //\n // This coroutine returns if a candidate pair was successfully nominated\n // and raises an exception otherwise.\n // \"\"\"\n log(\"start connect ice\");\n if (!this.localCandidatesEnd) {\n if (!this.localCandidatesStart) {\n throw new Error(\"Local candidates gathering was not performed\");\n }\n }\n if (!this.remoteUsername || !this.remotePassword) {\n throw new Error(\"Remote username or password is missing\");\n }\n\n // # 5.7.1. Forming Candidate Pairs\n for (const c of this.remoteCandidates) {\n this.pairRemoteCandidate(c);\n }\n this.sortCheckList();\n\n this.unfreezeInitial();\n\n log(\"earlyChecks\", this.localPassword, this.earlyChecks.length);\n // # handle early checks\n for (const earlyCheck of this.earlyChecks) {\n this.checkIncoming(...earlyCheck);\n }\n this.earlyChecks = [];\n this.earlyChecksDone = true;\n\n // # perform checks\n // 5.8. Scheduling Checks\n for (;;) {\n if (this.state === \"closed\") break;\n if (!this.schedulingChecks()) break;\n await timers.setTimeout(20);\n }\n\n // # wait for completion\n let res: number = ICE_FAILED;\n while (this.checkList.length > 0 && res === ICE_FAILED) {\n res = await this.checkListState.get();\n log(\"checkListState\", res);\n }\n\n // # cancel remaining checks\n for (const check of this.checkList) {\n check.handle?.resolve?.();\n }\n\n if (res !== ICE_COMPLETED) {\n throw new Error(\"ICE negotiation failed\");\n }\n\n // # start consent freshness tests\n this.queryConsent();\n\n this.setState(\"connected\");\n }\n\n private unfreezeInitial() {\n // # unfreeze first pair for the first component\n const [firstPair] = this.checkList;\n if (!firstPair) return;\n if (firstPair.state === CandidatePairState.FROZEN) {\n firstPair.updateState(CandidatePairState.WAITING);\n }\n\n // # unfreeze pairs with same component but different foundations\n const seenFoundations = new Set(firstPair.localCandidate.foundation);\n for (const pair of this.checkList) {\n if (\n pair.component === firstPair.component &&\n !seenFoundations.has(pair.localCandidate.foundation) &&\n pair.state === CandidatePairState.FROZEN\n ) {\n pair.updateState(CandidatePairState.WAITING);\n seenFoundations.add(pair.localCandidate.foundation);\n }\n }\n }\n\n // 5.8 Scheduling Checks\n private schedulingChecks() {\n // Ordinary Check\n {\n // # find the highest-priority pair that is in the waiting state\n const pair = this.checkList\n .filter((pair) => {\n if (\n this.options.forceTurn &&\n pair.protocol.type === StunProtocol.type\n )\n return false;\n return true;\n })\n .find((pair) => pair.state === CandidatePairState.WAITING);\n if (pair) {\n pair.handle = this.checkStart(pair);\n return true;\n }\n }\n\n {\n // # find the highest-priority pair that is in the frozen state\n const pair = this.checkList.find(\n (pair) => pair.state === CandidatePairState.FROZEN,\n );\n if (pair) {\n pair.handle = this.checkStart(pair);\n return true;\n }\n }\n\n // # if we expect more candidates, keep going\n if (!this.remoteCandidatesEnd) {\n return !this.checkListDone;\n }\n\n return false;\n }\n\n // 4.1.1.4 ? 生存確認 life check\n private queryConsent = () => {\n if (this.queryConsentHandle) {\n this.queryConsentHandle.resolve();\n }\n\n this.queryConsentHandle = cancelable(async (_, __, onCancel) => {\n let failures = 0;\n let canceled = false;\n\n const cancelEvent = new AbortController();\n onCancel.once(() => {\n canceled = true;\n failures += CONSENT_FAILURES;\n cancelEvent.abort();\n this.queryConsentHandle = undefined;\n });\n\n const { localUsername, remoteUsername, iceControlling } = this;\n\n // \"\"\"\n // Periodically check consent (RFC 7675).\n // \"\"\"\n\n try {\n while (this.state !== \"closed\" && !canceled) {\n // # randomize between 0.8 and 1.2 times CONSENT_INTERVAL\n await timers.setTimeout(\n CONSENT_INTERVAL * (0.8 + 0.4 * Math.random()) * 1000,\n undefined,\n { signal: cancelEvent.signal },\n );\n\n const nominated = this.nominated;\n if (!nominated || canceled) {\n break;\n }\n\n const request = this.buildRequest({\n nominate: false,\n localUsername,\n remoteUsername,\n iceControlling,\n });\n try {\n await nominated.protocol.request(\n request,\n nominated.remoteAddr,\n Buffer.from(this.remotePassword, \"utf8\"),\n 0,\n );\n failures = 0;\n if (this.state === \"disconnected\") {\n this.setState(\"connected\");\n }\n } catch (error) {\n if (nominated.id === this.nominated?.id) {\n log(\"no stun response\");\n failures++;\n this.setState(\"disconnected\");\n break;\n }\n }\n if (failures >= CONSENT_FAILURES) {\n log(\"Consent to send expired\");\n this.queryConsentHandle = undefined;\n this.setState(\"closed\");\n break;\n }\n }\n } catch (error) {}\n });\n };\n\n async close() {\n // \"\"\"\n // Close the connection.\n // \"\"\"\n\n this.setState(\"closed\");\n\n // # stop consent freshness tests\n this.queryConsentHandle?.resolve?.();\n\n // # stop check list\n if (this.checkList && !this.checkListDone) {\n this.checkListState.put(\n new Promise((r) => {\n r(ICE_FAILED);\n }),\n );\n }\n\n this.nominated = undefined;\n for (const protocol of this.protocols) {\n if (protocol.close) {\n await protocol.close();\n }\n }\n\n this.protocols = [];\n this.localCandidates = [];\n\n this.lookup?.close?.();\n this.lookup = undefined;\n }\n\n private setState(state: IceState) {\n this.state = state;\n this.stateChanged.execute(state);\n }\n\n async addRemoteCandidate(remoteCandidate: Candidate | undefined) {\n // \"\"\"\n // Add a remote candidate or signal end-of-candidates.\n\n // To signal end-of-candidates, pass `None`.\n\n // :param remote_candidate: A :class:`Candidate` instance or `None`.\n // \"\"\"\n\n if (!remoteCandidate) {\n this.remoteCandidatesEnd = true;\n return;\n }\n\n if (remoteCandidate.host.includes(\".local\")) {\n try {\n if (!this.lookup) {\n this.lookup = new MdnsLookup();\n }\n const host = await this.lookup.lookup(remoteCandidate.host);\n remoteCandidate.host = host;\n } catch (error) {\n return;\n }\n }\n\n try {\n validateRemoteCandidate(remoteCandidate);\n } catch (error) {\n return;\n }\n\n log(\"addRemoteCandidate\", remoteCandidate);\n this._remoteCandidates.push(remoteCandidate);\n\n this.pairRemoteCandidate(remoteCandidate);\n this.sortCheckList();\n }\n\n send = async (data: Buffer) => {\n const activePair = this.nominated;\n if (activePair) {\n await activePair.protocol.sendData(data, activePair.remoteAddr);\n\n // Update statistics\n activePair.packetsSent++;\n activePair.bytesSent += data.length;\n } else {\n // log(\"Cannot send data, ice not connected\");\n return;\n }\n };\n\n getDefaultCandidate() {\n const candidates = this.localCandidates.sort(\n (a, b) => a.priority - b.priority,\n );\n const [candidate] = candidates;\n return candidate;\n }\n\n // for test only\n set remoteCandidates(value: Candidate[]) {\n if (this.remoteCandidatesEnd)\n throw new Error(\"Cannot set remote candidates after end-of-candidates.\");\n this._remoteCandidates = [];\n for (const remoteCandidate of value) {\n try {\n validateRemoteCandidate(remoteCandidate);\n } catch (error) {\n continue;\n }\n this._remoteCandidates.push(remoteCandidate);\n }\n\n this.remoteCandidatesEnd = true;\n }\n get remoteCandidates() {\n return this._remoteCandidates;\n }\n\n get candidatePairs() {\n return this.checkList;\n }\n\n private sortCheckList() {\n sortCandidatePairs(this.checkList, this.iceControlling);\n }\n\n private findPair(protocol: Protocol, remoteCandidate: Candidate) {\n const pair = this.checkList.find(\n (pair) =>\n isEqual(pair.protocol, protocol) &&\n isEqual(pair.remoteCandidate, remoteCandidate),\n );\n return pair;\n }\n\n private switchRole(iceControlling: boolean) {\n log(\"switch role\", iceControlling);\n this.iceControlling = iceControlling;\n this.sortCheckList();\n }\n\n private checkComplete(pair: CandidatePair) {\n pair.handle = undefined;\n if (pair.state === CandidatePairState.SUCCEEDED) {\n // Updating the Nominated Flag\n\n // https://www.rfc-editor.org/rfc/rfc8445#section-7.3.1.5,\n // Once the nominated flag is set for a component of a data stream, it\n // concludes the ICE processing for that component. See Section 8.\n // So disallow overwriting of the pair nominated for that component\n if (\n pair.nominated &&\n // remoteのgenerationをチェックする.localのgenerationは更新が間に合わないかもしれないのでチェックしない\n (pair.remoteCandidate.generation != undefined\n ? pair.remoteCandidate.generation === this.generation\n : true) &&\n this.nominated == undefined\n ) {\n log(\"nominated\", pair.toJSON());\n this.nominated = pair;\n this.nominating = false;\n\n // 8.1.2. Updating States\n\n // The agent MUST remove all Waiting and Frozen pairs in the check\n // list and triggered check queue for the same component as the\n // nominated pairs for that media stream.\n for (const p of this.checkList) {\n if (\n p.component === pair.component &&\n [CandidatePairState.WAITING, CandidatePairState.FROZEN].includes(\n p.state,\n )\n ) {\n p.updateState(CandidatePairState.FAILED);\n }\n }\n }\n\n // Once there is at least one nominated pair in the valid list for\n // every component of at least one media stream and the state of the\n // check list is Running:\n if (this.nominated) {\n if (!this.checkListDone) {\n log(\"ICE completed\");\n this.checkListState.put(new Promise((r) => r(ICE_COMPLETED)));\n this.checkListDone = true;\n }\n return;\n }\n\n log(\"not completed\", pair.toJSON());\n\n // 7.1.3.2.3. Updating Pair States\n for (const p of this.checkList) {\n if (\n p.localCandidate.foundation === pair.localCandidate.foundation &&\n p.state === CandidatePairState.FROZEN\n ) {\n p.updateState(CandidatePairState.WAITING);\n }\n }\n }\n\n {\n const list = [CandidatePairState.SUCCEEDED, CandidatePairState.FAILED];\n if (this.checkList.find(({ state }) => !list.includes(state))) {\n return;\n }\n }\n\n if (!this.iceControlling) {\n const target = CandidatePairState.SUCCEEDED;\n if (this.checkList.find(({ state }) => state === target)) {\n return;\n }\n }\n\n if (!this.checkListDone) {\n log(\"ICE failed\");\n this.checkListState.put(\n new Promise((r) => {\n r(ICE_FAILED);\n }),\n );\n }\n }\n\n // 3. Terminology : Check\n checkStart = (pair: CandidatePair) =>\n cancelable<void>(async (r) => {\n // \"\"\"\n // Starts a check.\n // \"\"\"\n\n log(\"check start\", pair.toJSON());\n\n pair.updateState(CandidatePairState.IN_PROGRESS);\n const result: { response?: Message; addr?: Address } = {};\n const { remotePassword, remoteUsername, generation } = this;\n const localUsername = pair.localCandidate.ufrag ?? this.localUsername;\n\n const nominate = this.iceControlling && !this.remoteIsLite;\n const request = this.buildRequest({\n nominate,\n localUsername,\n remoteUsername,\n iceControlling: this.iceControlling,\n });\n\n // Record start time for RTT calculation\n const startTime = performance.now();\n\n try {\n const [response, addr] = await pair.protocol.request(\n request,\n pair.remoteAddr,\n Buffer.from(remotePassword, \"utf8\"),\n 4,\n );\n\n // Calculate RTT\n const endTime = performance.now();\n const rtt = (endTime - startTime) / 1000; // Convert to seconds\n\n // Update RTT statistics\n pair.rtt = rtt;\n pair.totalRoundTripTime += rtt;\n pair.roundTripTimeMeasurements++;\n\n log(\"response received\", request.toJSON(), response.toJSON(), addr, {\n localUsername,\n remoteUsername,\n remotePassword,\n generation,\n rtt,\n });\n result.response = response;\n result.addr = addr;\n } catch (error: any) {\n const exc: TransactionError = error;\n // 7.1.3.1. Failure Cases\n log(\n \"failure case\",\n request.toJSON(),\n exc.response ? JSON.stringify(exc.response.toJSON(), null, 2) : error,\n {\n localUsername,\n remoteUsername,\n remotePassword,\n generation,\n },\n pair.remoteAddr,\n );\n if (exc.response?.getAttributeValue(\"ERROR-CODE\")[0] === 487) {\n if (request.attributesKeys.includes(\"ICE-CONTROLLED\")) {\n this.switchRole(true);\n } else if (request.attributesKeys.includes(\"ICE-CONTROLLING\")) {\n this.switchRole(false);\n }\n await this.checkStart(pair).awaitable;\n r();\n return;\n }\n if (exc.response?.getAttributeValue(\"ERROR-CODE\")[0] === 401) {\n log(\"retry 401\", pair.toJSON());\n await this.checkStart(pair).awaitable;\n r();\n return;\n } else {\n // timeout\n log(\"checkStart CandidatePairState.FAILED\", pair.toJSON());\n pair.updateState(CandidatePairState.FAILED);\n this.checkComplete(pair);\n r();\n return;\n }\n }\n\n // # check remote address matches\n if (!isEqual(result.addr, pair.remoteAddr)) {\n pair.updateState(CandidatePairState.FAILED);\n this.checkComplete(pair);\n r();\n return;\n }\n\n // # success\n if (nominate || pair.remoteNominated) {\n // # nominated by agressive nomination or the remote party\n pair.nominated = true;\n } else if (this.iceControlling && !this.nominating) {\n // # perform regular nomination\n this.nominating = true;\n const request = this.buildRequest({\n nominate: true,\n localUsername,\n remoteUsername,\n iceControlling: this.iceControlling,\n });\n try {\n await pair.protocol.request(\n request,\n pair.remoteAddr,\n Buffer.from(this.remotePassword, \"utf8\"),\n );\n } catch (error) {\n pair.updateState(CandidatePairState.FAILED);\n this.checkComplete(pair);\n return;\n }\n pair.nominated = true;\n }\n\n pair.updateState(CandidatePairState.SUCCEEDED);\n this.checkComplete(pair);\n r();\n });\n\n private addPair(pair: CandidatePair) {\n this.checkList.push(pair);\n this.sortCheckList();\n }\n\n // 7.2. STUN Server Procedures\n // 7.2.1.3、7.2.1.4、および7.2.1.5\n checkIncoming(message: Message, addr: Address, protocol: Protocol) {\n // \"\"\"\n // Handle a successful incoming check.\n // \"\"\"\n\n const txUsername = message.getAttributeValue(\"USERNAME\");\n const { remoteUsername: localUsername } = decodeTxUsername(txUsername);\n\n // find remote candidate\n let remoteCandidate: Candidate | undefined;\n const [host, port] = addr;\n for (const c of this.remoteCandidates) {\n if (c.host === host && c.port === port) {\n remoteCandidate = c;\n break;\n }\n }\n if (!remoteCandidate) {\n // 7.2.1.3. Learning Peer Reflexive Candidates\n remoteCandidate = new Candidate(\n randomString(10),\n 1,\n \"udp\",\n message.getAttributeValue(\"PRIORITY\"),\n host,\n port,\n \"prflx\",\n undefined,\n undefined,\n undefined,\n undefined,\n undefined,\n );\n this._remoteCandidates.push(remoteCandidate);\n }\n\n // find pair\n let pair = this.findPair(protocol, remoteCandidate);\n if (!pair) {\n pair = new CandidatePair(protocol, remoteCandidate, this.iceControlling);\n pair.updateState(CandidatePairState.WAITING);\n this.addPair(pair);\n }\n pair.localCandidate.ufrag = localUsername;\n\n log(\"Triggered Checks\", message.toJSON(), pair.toJSON(), {\n localUsername: this.localUsername,\n remoteUsername: this.remoteUsername,\n localPassword: this.localPassword,\n remotePassword: this.remotePassword,\n generation: this.generation,\n });\n\n // 7.2.1.4. Triggered Checks\n if (\n [CandidatePairState.WAITING, CandidatePairState.FAILED].includes(\n pair.state,\n )\n ) {\n pair.handle = this.checkStart(pair);\n }\n\n // 7.2.1.5. Updating the Nominated Flag\n if (\n message.attributesKeys.includes(\"USE-CANDIDATE\") &&\n !this.iceControlling\n ) {\n pair.remoteNominated = true;\n if (pair.state === CandidatePairState.SUCCEEDED) {\n pair.nominated = true;\n this.checkComplete(pair);\n }\n }\n }\n\n private tryPair(protocol: Protocol, remoteCandidate: Candidate) {\n if (\n protocol.localCandidate?.canPairWith(remoteCandidate) &&\n !this.findPair(protocol, remoteCandidate)\n ) {\n const pair = new CandidatePair(\n protocol,\n remoteCandidate,\n this.iceControlling,\n );\n if (\n this.options.filterCandidatePair &&\n !this.options.filterCandidatePair(pair)\n ) {\n return;\n }\n pair.updateState(CandidatePairState.WAITING);\n this.addPair(pair);\n }\n }\n\n private pairLocalProtocol(protocol: Protocol) {\n for (const remoteCandidate of this.remoteCandidates) {\n this.tryPair(protocol, remoteCandidate);\n }\n }\n\n private pairRemoteCandidate = (remoteCandidate: Candidate) => {\n for (const protocol of this.protocols) {\n this.tryPair(protocol, remoteCandidate);\n }\n };\n\n private buildRequest({\n nominate,\n remoteUsername,\n localUsername,\n iceControlling,\n }: {\n nominate: boolean;\n remoteUsername: string;\n localUsername: string;\n iceControlling: boolean;\n }) {\n const txUsername = encodeTxUsername({ remoteUsername, localUsername });\n const request = new Message(methods.BINDING, classes.REQUEST);\n request\n .setAttribute(\"USERNAME\", txUsername)\n .setAttribute(\"PRIORITY\", candidatePriority(\"prflx\"));\n if (iceControlling) {\n request.setAttribute(\"ICE-CONTROLLING\", this.tieBreaker);\n if (nominate) {\n request.setAttribute(\"USE-CANDIDATE\", null);\n }\n } else {\n request.setAttribute(\"ICE-CONTROLLED\", this.tieBreaker);\n }\n return request;\n }\n\n private respondError(\n request: Message,\n addr: Address,\n protocol: Protocol,\n errorCode: [number, string],\n ) {\n const response = new Message(\n request.messageMethod,\n classes.ERROR,\n request.transactionId,\n );\n response\n .setAttribute(\"ERROR-CODE\", errorCode)\n .addMessageIntegrity(Buffer.from(this.localPassword, \"utf8\"))\n .addFingerprint();\n protocol.sendStun(response, addr).catch((e) => {\n log(\"sendStun error\", e);\n });\n }\n}\n\nconst encodeTxUsername = ({\n remoteUsername,\n localUsername,\n}: {\n remoteUsername: string;\n localUsername: string;\n}) => {\n return `${remoteUsername}:${localUsername}`;\n};\n\nconst decodeTxUsername = (txUsername: string) => {\n const [remoteUsername, localUsername] = txUsername.split(\":\");\n return { remoteUsername, localUsername };\n};\n"]}
|
|
1
|
+
{"version":3,"file":"ice.js","sourceRoot":"","sources":["../../../../ice/src/ice.ts"],"names":[],"mappings":"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","sourcesContent":["import { randomBytes } from \"crypto\";\nimport { isIPv4 } from \"net\";\n\nimport * as Int64 from \"int64-buffer\";\n\nimport * as timers from \"node:timers/promises\";\nimport isEqual from \"fast-deep-equal\";\nimport { type Address, Event, debug } from \"./imports/common\";\n\nimport { Candidate, candidateFoundation, candidatePriority } from \"./candidate\";\nimport { MdnsLookup } from \"./dns/lookup\";\nimport type { TransactionError } from \"./exceptions\";\nimport { type Cancelable, PQueue, cancelable, randomString } from \"./helper\";\nimport {\n CONSENT_FAILURES,\n CONSENT_INTERVAL,\n CandidatePair,\n CandidatePairState,\n ICE_COMPLETED,\n ICE_FAILED,\n type IceConnection,\n type IceOptions,\n type IceState,\n defaultOptions,\n serverReflexiveCandidate,\n sortCandidatePairs,\n validateAddress,\n validateRemoteCandidate,\n} from \"./iceBase\";\nimport { classes, methods } from \"./stun/const\";\nimport { Message } from \"./stun/message\";\nimport { StunProtocol } from \"./stun/protocol\";\nimport { createStunOverTurnClient } from \"./turn/protocol\";\nimport type { Protocol } from \"./types/model\";\nimport { getHostAddresses } from \"./utils\";\n\nconst log = debug(\"werift-ice : packages/ice/src/ice.ts : log\");\n\nexport class Connection implements IceConnection {\n localUsername = randomString(4);\n localPassword = randomString(22);\n remoteIsLite = false;\n remotePassword: string = \"\";\n remoteUsername: string = \"\";\n checkList: CandidatePair[] = [];\n localCandidates: Candidate[] = [];\n stunServer?: Address;\n turnServer?: Address;\n options: IceOptions;\n remoteCandidatesEnd = false;\n localCandidatesEnd = false;\n generation = -1;\n userHistory: { [username: string]: string } = {};\n private readonly tieBreaker: bigint = BigInt(\n new Int64.Uint64BE(randomBytes(64)).toString(),\n );\n state: IceState = \"new\";\n lookup?: MdnsLookup;\n\n private _remoteCandidates: Candidate[] = [];\n // P2P接続完了したソケット\n nominated?: CandidatePair;\n private nominating = false;\n private checkListDone = false;\n private checkListState = new PQueue<number>();\n private earlyChecks: [Message, Address, Protocol][] = [];\n private earlyChecksDone = false;\n private localCandidatesStart = false;\n private protocols: Protocol[] = [];\n private queryConsentHandle?: Cancelable<void>;\n\n readonly onData = new Event<[Buffer]>();\n readonly stateChanged = new Event<[IceState]>();\n readonly onIceCandidate: Event<[Candidate]> = new Event();\n\n constructor(\n private _iceControlling: boolean,\n options?: Partial<IceOptions>,\n ) {\n this.options = {\n ...defaultOptions,\n ...options,\n };\n const { stunServer, turnServer } = this.options;\n this.stunServer = validateAddress(stunServer) ?? [\n \"stun.l.google.com\",\n 19302,\n ];\n this.turnServer = validateAddress(turnServer);\n this.restart();\n log(\"new Connection\", this.options);\n }\n\n get iceControlling() {\n return this._iceControlling;\n }\n\n set iceControlling(value: boolean) {\n if (this.generation > 0 || this.nominated) {\n return;\n }\n this._iceControlling = value;\n for (const pair of this.checkList) {\n pair.iceControlling = value;\n }\n }\n\n async restart() {\n this.generation++;\n\n this.localUsername = randomString(4);\n this.localPassword = randomString(22);\n if (this.options.localPasswordPrefix) {\n this.localPassword =\n this.options.localPasswordPrefix +\n this.localPassword.slice(this.options.localPasswordPrefix.length);\n }\n this.userHistory[this.localUsername] = this.localPassword;\n\n this.remoteUsername = \"\";\n this.remotePassword = \"\";\n this.localCandidates = [];\n this._remoteCandidates = [];\n this.remoteCandidatesEnd = false;\n this.localCandidatesEnd = false;\n this.state = \"new\";\n this.lookup?.close?.();\n this.lookup = undefined;\n this.nominated = undefined;\n this.nominating = false;\n this.checkList = [];\n this.checkListDone = false;\n this.checkListState = new PQueue<number>();\n this.earlyChecks = [];\n this.earlyChecksDone = false;\n this.localCandidatesStart = false;\n\n // protocolsはincomingのearlyCheckに使うかもしれないので残す\n for (const protocol of this.protocols) {\n if (protocol.localCandidate) {\n protocol.localCandidate.generation = this.generation;\n protocol.localCandidate.ufrag = this.localUsername;\n }\n }\n\n this.queryConsentHandle?.resolve?.();\n this.queryConsentHandle = undefined;\n }\n\n resetNominatedPair() {\n log(\"resetNominatedPair\");\n this.nominated = undefined;\n this.nominating = false;\n }\n\n setRemoteParams({\n iceLite,\n usernameFragment,\n password,\n }: {\n iceLite: boolean;\n usernameFragment: string;\n password: string;\n }) {\n log(\"setRemoteParams\", { iceLite, usernameFragment, password });\n this.remoteIsLite = iceLite;\n this.remoteUsername = usernameFragment;\n this.remotePassword = password;\n }\n\n // 4.1.1 Gathering Candidates\n async gatherCandidates() {\n if (!this.localCandidatesStart) {\n this.localCandidatesStart = true;\n\n let address = getHostAddresses(\n this.options.useIpv4,\n this.options.useIpv6,\n {\n useLinkLocalAddress: this.options.useLinkLocalAddress,\n },\n );\n const { interfaceAddresses } = this.options;\n if (interfaceAddresses) {\n const filteredAddresses = address.filter((check) =>\n Object.values(interfaceAddresses).includes(check),\n );\n if (filteredAddresses.length) {\n address = filteredAddresses;\n }\n }\n if (this.options.additionalHostAddresses) {\n address = Array.from(\n new Set([...this.options.additionalHostAddresses, ...address]),\n );\n }\n\n const candidatePromises = this.getCandidatePromises(address, 5);\n await Promise.allSettled(candidatePromises);\n\n this.localCandidatesEnd = true;\n }\n this.setState(\"completed\");\n }\n\n private appendLocalCandidate(candidate: Candidate) {\n this.localCandidates.push(candidate);\n this.onIceCandidate.execute(candidate);\n }\n\n private ensureProtocol(protocol: Protocol) {\n protocol.onRequestReceived.subscribe((msg, addr, data) => {\n if (msg.messageMethod !== methods.BINDING) {\n this.respondError(msg, addr, protocol, [400, \"Bad Request\"]);\n return;\n }\n\n const txUsername = msg.getAttributeValue(\"USERNAME\");\n // 相手にとってのremoteは自分にとってのlocal\n const { remoteUsername: localUsername } = decodeTxUsername(txUsername);\n const localPassword =\n this.userHistory[localUsername] ?? this.localPassword;\n\n const { iceControlling } = this;\n\n // 7.2.1.1. Detecting and Repairing Role Conflicts\n if (iceControlling && msg.attributesKeys.includes(\"ICE-CONTROLLING\")) {\n if (this.tieBreaker >= msg.getAttributeValue(\"ICE-CONTROLLING\")) {\n this.respondError(msg, addr, protocol, [487, \"Role Conflict\"]);\n return;\n } else {\n this.switchRole(false);\n }\n } else if (\n !iceControlling &&\n msg.attributesKeys.includes(\"ICE-CONTROLLED\")\n ) {\n if (this.tieBreaker < msg.getAttributeValue(\"ICE-CONTROLLED\")) {\n this.respondError(msg, addr, protocol, [487, \"Role Conflict\"]);\n } else {\n this.switchRole(true);\n return;\n }\n }\n\n if (\n this.options.filterStunResponse &&\n !this.options.filterStunResponse(msg, addr, protocol)\n ) {\n return;\n }\n\n // # send binding response\n const response = new Message(\n methods.BINDING,\n classes.RESPONSE,\n msg.transactionId,\n );\n\n response\n .setAttribute(\"XOR-MAPPED-ADDRESS\", addr)\n .addMessageIntegrity(Buffer.from(localPassword, \"utf8\"))\n .addFingerprint();\n protocol.sendStun(response, addr).catch((e) => {\n log(\"sendStun error\", e);\n });\n\n if (this.checkList.length === 0 && !this.earlyChecksDone) {\n this.earlyChecks.push([msg, addr, protocol]);\n } else {\n this.checkIncoming(msg, addr, protocol);\n }\n });\n protocol.onDataReceived.subscribe((data) => {\n try {\n // Update statistics for the nominated pair\n const activePair = this.nominated;\n if (activePair && activePair.protocol === protocol) {\n activePair.packetsReceived++;\n activePair.bytesReceived += data.length;\n }\n\n this.onData.execute(data);\n } catch (error) {\n log(\"dataReceived\", error);\n }\n });\n }\n\n private getCandidatePromises(addresses: string[], timeout = 5) {\n let candidatePromises: Promise<Candidate | void>[] = [];\n\n addresses = addresses.filter((address) => {\n // ice restartで同じアドレスが追加されるのを防ぐ\n if (this.protocols.find((protocol) => protocol.localIp === address)) {\n return false;\n }\n return true;\n });\n\n const localStunPromises = addresses.map(async (address) => {\n // # create transport\n const protocol = new StunProtocol();\n this.ensureProtocol(protocol);\n try {\n await protocol.connectionMade(\n isIPv4(address),\n this.options.portRange,\n this.options.interfaceAddresses,\n );\n\n protocol.localIp = address;\n this.protocols.push(protocol);\n\n log(\"protocol\", protocol.localIp);\n\n // # add host candidate\n const candidateAddress: Address = [address, protocol.getExtraInfo()[1]];\n\n protocol.localCandidate = new Candidate(\n candidateFoundation(\"host\", \"udp\", candidateAddress[0]),\n 1,\n \"udp\",\n candidatePriority(\"host\"),\n candidateAddress[0],\n candidateAddress[1],\n \"host\",\n undefined,\n undefined,\n undefined,\n this.generation,\n this.localUsername,\n );\n\n this.pairLocalProtocol(protocol);\n this.appendLocalCandidate(protocol.localCandidate);\n\n return protocol;\n } catch (error) {\n log(\"error protocol STUN\", error);\n }\n });\n\n candidatePromises.push(\n ...localStunPromises.map((localPromise) =>\n localPromise.then((l) => l?.localCandidate),\n ),\n );\n\n const { stunServer, turnServer } = this;\n\n if (stunServer) {\n const stunCandidatePromises = localStunPromises.map(\n async (protocolPromise) => {\n const protocol = await protocolPromise;\n if (!protocol) return;\n\n const stunCandidatePromise = new Promise<Candidate | void>(\n async (r, f) => {\n const timer = setTimeout(f, timeout * 1000);\n if (\n protocol.localCandidate?.host &&\n isIPv4(protocol.localCandidate?.host)\n ) {\n const candidate = await serverReflexiveCandidate(\n protocol,\n stunServer,\n ).catch((error) => {\n log(\"error\", error);\n });\n if (candidate) {\n this.appendLocalCandidate(candidate);\n }\n\n clearTimeout(timer);\n r(candidate);\n } else {\n clearTimeout(timer);\n r();\n }\n },\n ).catch((error) => {\n log(\"query STUN server\", error);\n });\n\n return stunCandidatePromise;\n },\n );\n\n candidatePromises.push(...stunCandidatePromises);\n }\n\n const { turnUsername, turnPassword } = this.options;\n if (turnServer && turnUsername && turnPassword) {\n const turnCandidatePromise = (async () => {\n const protocol = await createStunOverTurnClient(\n {\n address: turnServer,\n username: turnUsername,\n password: turnPassword,\n },\n {\n portRange: this.options.portRange,\n interfaceAddresses: this.options.interfaceAddresses,\n transport: this.options.turnTransport === \"tcp\" ? \"tcp\" : \"udp\",\n },\n ).catch(async (e) => {\n if (this.options.turnTransport !== \"tcp\") {\n return await createStunOverTurnClient(\n {\n address: turnServer,\n username: turnUsername,\n password: turnPassword,\n },\n {\n portRange: this.options.portRange,\n interfaceAddresses: this.options.interfaceAddresses,\n transport: \"tcp\",\n },\n );\n } else {\n throw e;\n }\n });\n this.ensureProtocol(protocol);\n this.protocols.push(protocol);\n\n const candidateAddress = protocol.turn.relayedAddress;\n const relatedAddress = protocol.turn.mappedAddress;\n\n log(\"turn candidateAddress\", candidateAddress);\n\n protocol.localCandidate = new Candidate(\n candidateFoundation(\"relay\", \"udp\", candidateAddress[0]),\n 1,\n \"udp\",\n candidatePriority(\"relay\"),\n candidateAddress[0],\n candidateAddress[1],\n \"relay\",\n relatedAddress[0],\n relatedAddress[1],\n undefined,\n this.generation,\n this.localUsername,\n );\n this.appendLocalCandidate(protocol.localCandidate);\n\n return protocol.localCandidate;\n })().catch((error) => {\n log(\"query TURN server\", error);\n });\n\n if (this.options.forceTurn) {\n candidatePromises = [];\n }\n\n candidatePromises.push(turnCandidatePromise);\n }\n\n return candidatePromises;\n }\n\n async connect() {\n // \"\"\"\n // Perform ICE handshake.\n //\n // This coroutine returns if a candidate pair was successfully nominated\n // and raises an exception otherwise.\n // \"\"\"\n log(\"start connect ice\");\n if (!this.localCandidatesEnd) {\n if (!this.localCandidatesStart) {\n throw new Error(\"Local candidates gathering was not performed\");\n }\n }\n if (!this.remoteUsername || !this.remotePassword) {\n throw new Error(\"Remote username or password is missing\");\n }\n\n // # 5.7.1. Forming Candidate Pairs\n for (const c of this.remoteCandidates) {\n this.pairRemoteCandidate(c);\n }\n this.sortCheckList();\n\n this.unfreezeInitial();\n\n log(\"earlyChecks\", this.localPassword, this.earlyChecks.length);\n // # handle early checks\n for (const earlyCheck of this.earlyChecks) {\n this.checkIncoming(...earlyCheck);\n }\n this.earlyChecks = [];\n this.earlyChecksDone = true;\n\n // # perform checks\n // 5.8. Scheduling Checks\n for (;;) {\n if (this.state === \"closed\") break;\n if (!this.schedulingChecks()) break;\n await timers.setTimeout(20);\n }\n\n // # wait for completion\n let res: number = ICE_FAILED;\n while (this.checkList.length > 0 && res === ICE_FAILED) {\n res = await this.checkListState.get();\n log(\"checkListState\", res);\n }\n\n // # cancel remaining checks\n for (const check of this.checkList) {\n check.handle?.resolve?.();\n }\n\n if (res !== ICE_COMPLETED) {\n throw new Error(\"ICE negotiation failed\");\n }\n\n // # start consent freshness tests\n this.queryConsent();\n\n this.setState(\"connected\");\n }\n\n private unfreezeInitial() {\n // # unfreeze first pair for the first component\n const [firstPair] = this.checkList;\n if (!firstPair) return;\n if (firstPair.state === CandidatePairState.FROZEN) {\n firstPair.updateState(CandidatePairState.WAITING);\n }\n\n // # unfreeze pairs with same component but different foundations\n const seenFoundations = new Set(firstPair.localCandidate.foundation);\n for (const pair of this.checkList) {\n if (\n pair.component === firstPair.component &&\n !seenFoundations.has(pair.localCandidate.foundation) &&\n pair.state === CandidatePairState.FROZEN\n ) {\n pair.updateState(CandidatePairState.WAITING);\n seenFoundations.add(pair.localCandidate.foundation);\n }\n }\n }\n\n // 5.8 Scheduling Checks\n private schedulingChecks() {\n // Ordinary Check\n {\n // # find the highest-priority pair that is in the waiting state\n const pair = this.checkList\n .filter((pair) => {\n if (\n this.options.forceTurn &&\n pair.protocol.type === StunProtocol.type\n )\n return false;\n return true;\n })\n .find((pair) => pair.state === CandidatePairState.WAITING);\n if (pair) {\n pair.handle = this.checkStart(pair);\n return true;\n }\n }\n\n {\n // # find the highest-priority pair that is in the frozen state\n const pair = this.checkList.find(\n (pair) => pair.state === CandidatePairState.FROZEN,\n );\n if (pair) {\n pair.handle = this.checkStart(pair);\n return true;\n }\n }\n\n // # if we expect more candidates, keep going\n if (!this.remoteCandidatesEnd) {\n return !this.checkListDone;\n }\n\n return false;\n }\n\n // 4.1.1.4 ? 生存確認 life check\n private queryConsent = () => {\n if (this.queryConsentHandle) {\n this.queryConsentHandle.resolve();\n }\n\n this.queryConsentHandle = cancelable(async (_, __, onCancel) => {\n let failures = 0;\n let canceled = false;\n\n const cancelEvent = new AbortController();\n onCancel.once(() => {\n canceled = true;\n failures += CONSENT_FAILURES;\n cancelEvent.abort();\n this.queryConsentHandle = undefined;\n });\n\n const { localUsername, remoteUsername, iceControlling } = this;\n\n // \"\"\"\n // Periodically check consent (RFC 7675).\n // \"\"\"\n\n try {\n while (this.state !== \"closed\" && !canceled) {\n // # randomize between 0.8 and 1.2 times CONSENT_INTERVAL\n await timers.setTimeout(\n CONSENT_INTERVAL * (0.8 + 0.4 * Math.random()) * 1000,\n undefined,\n { signal: cancelEvent.signal },\n );\n\n const nominated = this.nominated;\n if (!nominated || canceled) {\n break;\n }\n\n const request = this.buildRequest({\n nominate: false,\n localUsername,\n remoteUsername,\n iceControlling,\n });\n try {\n await nominated.protocol.request(\n request,\n nominated.remoteAddr,\n Buffer.from(this.remotePassword, \"utf8\"),\n 0,\n );\n failures = 0;\n if (this.state === \"disconnected\") {\n this.setState(\"connected\");\n }\n } catch (error) {\n if (nominated.id === this.nominated?.id) {\n log(\"no stun response\");\n failures++;\n this.setState(\"disconnected\");\n break;\n }\n }\n if (failures >= CONSENT_FAILURES) {\n log(\"Consent to send expired\");\n this.queryConsentHandle = undefined;\n this.setState(\"closed\");\n break;\n }\n }\n } catch (error) {}\n });\n };\n\n async close() {\n // \"\"\"\n // Close the connection.\n // \"\"\"\n\n this.setState(\"closed\");\n\n // # stop consent freshness tests\n this.queryConsentHandle?.resolve?.();\n\n // # stop check list\n if (this.checkList && !this.checkListDone) {\n this.checkListState.put(\n new Promise((r) => {\n r(ICE_FAILED);\n }),\n );\n }\n\n this.nominated = undefined;\n for (const protocol of this.protocols) {\n if (protocol.close) {\n await protocol.close();\n }\n }\n\n this.protocols = [];\n this.localCandidates = [];\n\n this.lookup?.close?.();\n this.lookup = undefined;\n }\n\n private setState(state: IceState) {\n this.state = state;\n this.stateChanged.execute(state);\n }\n\n async addRemoteCandidate(remoteCandidate: Candidate | undefined) {\n // \"\"\"\n // Add a remote candidate or signal end-of-candidates.\n\n // To signal end-of-candidates, pass `None`.\n\n // :param remote_candidate: A :class:`Candidate` instance or `None`.\n // \"\"\"\n\n if (!remoteCandidate) {\n this.remoteCandidatesEnd = true;\n return;\n }\n\n if (remoteCandidate.host.includes(\".local\")) {\n try {\n if (!this.lookup) {\n this.lookup = new MdnsLookup();\n }\n const host = await this.lookup.lookup(remoteCandidate.host);\n remoteCandidate.host = host;\n } catch (error) {\n return;\n }\n }\n\n try {\n validateRemoteCandidate(remoteCandidate);\n } catch (error) {\n return;\n }\n\n log(\"addRemoteCandidate\", remoteCandidate);\n this._remoteCandidates.push(remoteCandidate);\n\n this.pairRemoteCandidate(remoteCandidate);\n this.sortCheckList();\n }\n\n send = async (data: Buffer) => {\n const activePair = this.nominated;\n if (activePair) {\n await activePair.protocol.sendData(data, activePair.remoteAddr);\n\n // Update statistics\n activePair.packetsSent++;\n activePair.bytesSent += data.length;\n } else {\n // log(\"Cannot send data, ice not connected\");\n return;\n }\n };\n\n getDefaultCandidate() {\n const candidates = this.localCandidates.sort(\n (a, b) => a.priority - b.priority,\n );\n const [candidate] = candidates;\n return candidate;\n }\n\n // for test only\n set remoteCandidates(value: Candidate[]) {\n if (this.remoteCandidatesEnd)\n throw new Error(\"Cannot set remote candidates after end-of-candidates.\");\n this._remoteCandidates = [];\n for (const remoteCandidate of value) {\n try {\n validateRemoteCandidate(remoteCandidate);\n } catch (error) {\n continue;\n }\n this._remoteCandidates.push(remoteCandidate);\n }\n\n this.remoteCandidatesEnd = true;\n }\n get remoteCandidates() {\n return this._remoteCandidates;\n }\n\n get candidatePairs() {\n return this.checkList;\n }\n\n private sortCheckList() {\n sortCandidatePairs(this.checkList, this.iceControlling);\n }\n\n private findPair(protocol: Protocol, remoteCandidate: Candidate) {\n const pair = this.checkList.find(\n (pair) =>\n isEqual(pair.protocol, protocol) &&\n isEqual(pair.remoteCandidate, remoteCandidate),\n );\n return pair;\n }\n\n private switchRole(iceControlling: boolean) {\n log(\"switch role\", iceControlling);\n this.iceControlling = iceControlling;\n this.sortCheckList();\n }\n\n private checkComplete(pair: CandidatePair) {\n pair.handle = undefined;\n if (pair.state === CandidatePairState.SUCCEEDED) {\n // Updating the Nominated Flag\n\n // https://www.rfc-editor.org/rfc/rfc8445#section-7.3.1.5,\n // Once the nominated flag is set for a component of a data stream, it\n // concludes the ICE processing for that component. See Section 8.\n // So disallow overwriting of the pair nominated for that component\n if (\n pair.nominated &&\n // remoteのgenerationをチェックする.localのgenerationは更新が間に合わないかもしれないのでチェックしない\n (pair.remoteCandidate.generation != undefined\n ? pair.remoteCandidate.generation === this.generation\n : true) &&\n this.nominated == undefined\n ) {\n log(\"nominated\", pair.toJSON());\n this.nominated = pair;\n this.nominating = false;\n\n // 8.1.2. Updating States\n\n // The agent MUST remove all Waiting and Frozen pairs in the check\n // list and triggered check queue for the same component as the\n // nominated pairs for that media stream.\n for (const p of this.checkList) {\n if (\n p.component === pair.component &&\n [CandidatePairState.WAITING, CandidatePairState.FROZEN].includes(\n p.state,\n )\n ) {\n p.updateState(CandidatePairState.FAILED);\n }\n }\n }\n\n // Once there is at least one nominated pair in the valid list for\n // every component of at least one media stream and the state of the\n // check list is Running:\n if (this.nominated) {\n if (!this.checkListDone) {\n log(\"ICE completed\");\n this.checkListState.put(new Promise((r) => r(ICE_COMPLETED)));\n this.checkListDone = true;\n }\n return;\n }\n\n log(\"not completed\", pair.toJSON());\n\n // 7.1.3.2.3. Updating Pair States\n for (const p of this.checkList) {\n if (\n p.localCandidate.foundation === pair.localCandidate.foundation &&\n p.state === CandidatePairState.FROZEN\n ) {\n p.updateState(CandidatePairState.WAITING);\n }\n }\n }\n\n {\n const list = [CandidatePairState.SUCCEEDED, CandidatePairState.FAILED];\n if (this.checkList.find(({ state }) => !list.includes(state))) {\n return;\n }\n }\n\n if (!this.iceControlling) {\n const target = CandidatePairState.SUCCEEDED;\n if (this.checkList.find(({ state }) => state === target)) {\n return;\n }\n }\n\n if (!this.checkListDone) {\n log(\"ICE failed\");\n this.checkListState.put(\n new Promise((r) => {\n r(ICE_FAILED);\n }),\n );\n }\n }\n\n // 3. Terminology : Check\n checkStart = (pair: CandidatePair) =>\n cancelable<void>(async (r) => {\n // \"\"\"\n // Starts a check.\n // \"\"\"\n\n log(\"check start\", pair.toJSON());\n\n pair.updateState(CandidatePairState.IN_PROGRESS);\n const result: { response?: Message; addr?: Address } = {};\n const { remotePassword, remoteUsername, generation } = this;\n const localUsername = pair.localCandidate.ufrag ?? this.localUsername;\n\n const nominate = this.iceControlling && !this.remoteIsLite;\n const request = this.buildRequest({\n nominate,\n localUsername,\n remoteUsername,\n iceControlling: this.iceControlling,\n });\n\n // Record start time for RTT calculation\n const startTime = performance.now();\n\n try {\n const [response, addr] = await pair.protocol.request(\n request,\n pair.remoteAddr,\n Buffer.from(remotePassword, \"utf8\"),\n 4,\n );\n\n // Calculate RTT\n const endTime = performance.now();\n const rtt = (endTime - startTime) / 1000; // Convert to seconds\n\n // Update RTT statistics\n pair.rtt = rtt;\n pair.totalRoundTripTime += rtt;\n pair.roundTripTimeMeasurements++;\n\n log(\"response received\", request.toJSON(), response.toJSON(), addr, {\n localUsername,\n remoteUsername,\n remotePassword,\n generation,\n rtt,\n });\n result.response = response;\n result.addr = addr;\n } catch (error: any) {\n const exc: TransactionError = error;\n // 7.1.3.1. Failure Cases\n log(\n \"failure case\",\n request.toJSON(),\n exc.response ? JSON.stringify(exc.response.toJSON(), null, 2) : error,\n {\n localUsername,\n remoteUsername,\n remotePassword,\n generation,\n },\n pair.remoteAddr,\n );\n if (exc.response?.getAttributeValue(\"ERROR-CODE\")[0] === 487) {\n if (request.attributesKeys.includes(\"ICE-CONTROLLED\")) {\n this.switchRole(true);\n } else if (request.attributesKeys.includes(\"ICE-CONTROLLING\")) {\n this.switchRole(false);\n }\n await this.checkStart(pair).awaitable;\n r();\n return;\n }\n if (exc.response?.getAttributeValue(\"ERROR-CODE\")[0] === 401) {\n log(\"retry 401\", pair.toJSON());\n await this.checkStart(pair).awaitable;\n r();\n return;\n } else {\n // timeout\n log(\"checkStart CandidatePairState.FAILED\", pair.toJSON());\n pair.updateState(CandidatePairState.FAILED);\n this.checkComplete(pair);\n r();\n return;\n }\n }\n\n // # check remote address matches\n if (!isEqual(result.addr, pair.remoteAddr)) {\n pair.updateState(CandidatePairState.FAILED);\n this.checkComplete(pair);\n r();\n return;\n }\n\n // # success\n if (nominate || pair.remoteNominated) {\n // # nominated by agressive nomination or the remote party\n pair.nominated = true;\n } else if (this.iceControlling && !this.nominating) {\n // # perform regular nomination\n this.nominating = true;\n const request = this.buildRequest({\n nominate: true,\n localUsername,\n remoteUsername,\n iceControlling: this.iceControlling,\n });\n try {\n await pair.protocol.request(\n request,\n pair.remoteAddr,\n Buffer.from(this.remotePassword, \"utf8\"),\n );\n } catch (error) {\n pair.updateState(CandidatePairState.FAILED);\n this.checkComplete(pair);\n return;\n }\n pair.nominated = true;\n }\n\n pair.updateState(CandidatePairState.SUCCEEDED);\n this.checkComplete(pair);\n r();\n });\n\n private addPair(pair: CandidatePair) {\n this.checkList.push(pair);\n this.sortCheckList();\n }\n\n // 7.2. STUN Server Procedures\n // 7.2.1.3、7.2.1.4、および7.2.1.5\n checkIncoming(message: Message, addr: Address, protocol: Protocol) {\n // \"\"\"\n // Handle a successful incoming check.\n // \"\"\"\n\n const txUsername = message.getAttributeValue(\"USERNAME\");\n const { remoteUsername: localUsername } = decodeTxUsername(txUsername);\n\n // find remote candidate\n let remoteCandidate: Candidate | undefined;\n const [host, port] = addr;\n for (const c of this.remoteCandidates) {\n if (c.host === host && c.port === port) {\n remoteCandidate = c;\n break;\n }\n }\n if (!remoteCandidate) {\n // 7.2.1.3. Learning Peer Reflexive Candidates\n remoteCandidate = new Candidate(\n randomString(10),\n 1,\n \"udp\",\n message.getAttributeValue(\"PRIORITY\"),\n host,\n port,\n \"prflx\",\n undefined,\n undefined,\n undefined,\n undefined,\n undefined,\n );\n this._remoteCandidates.push(remoteCandidate);\n }\n\n // find pair\n let pair = this.findPair(protocol, remoteCandidate);\n if (!pair) {\n pair = new CandidatePair(protocol, remoteCandidate, this.iceControlling);\n pair.updateState(CandidatePairState.WAITING);\n this.addPair(pair);\n }\n pair.localCandidate.ufrag = localUsername;\n\n log(\"Triggered Checks\", message.toJSON(), pair.toJSON(), {\n localUsername: this.localUsername,\n remoteUsername: this.remoteUsername,\n localPassword: this.localPassword,\n remotePassword: this.remotePassword,\n generation: this.generation,\n });\n\n // 7.2.1.4. Triggered Checks\n if (\n [CandidatePairState.WAITING, CandidatePairState.FAILED].includes(\n pair.state,\n )\n ) {\n pair.handle = this.checkStart(pair);\n }\n\n // 7.2.1.5. Updating the Nominated Flag\n if (\n message.attributesKeys.includes(\"USE-CANDIDATE\") &&\n !this.iceControlling\n ) {\n pair.remoteNominated = true;\n if (pair.state === CandidatePairState.SUCCEEDED) {\n pair.nominated = true;\n this.checkComplete(pair);\n }\n }\n }\n\n private tryPair(protocol: Protocol, remoteCandidate: Candidate) {\n if (\n protocol.localCandidate?.canPairWith(remoteCandidate) &&\n !this.findPair(protocol, remoteCandidate)\n ) {\n const pair = new CandidatePair(\n protocol,\n remoteCandidate,\n this.iceControlling,\n );\n if (\n this.options.filterCandidatePair &&\n !this.options.filterCandidatePair(pair)\n ) {\n return;\n }\n pair.updateState(CandidatePairState.WAITING);\n this.addPair(pair);\n }\n }\n\n private pairLocalProtocol(protocol: Protocol) {\n for (const remoteCandidate of this.remoteCandidates) {\n this.tryPair(protocol, remoteCandidate);\n }\n }\n\n private pairRemoteCandidate = (remoteCandidate: Candidate) => {\n for (const protocol of this.protocols) {\n this.tryPair(protocol, remoteCandidate);\n }\n };\n\n private buildRequest({\n nominate,\n remoteUsername,\n localUsername,\n iceControlling,\n }: {\n nominate: boolean;\n remoteUsername: string;\n localUsername: string;\n iceControlling: boolean;\n }) {\n const txUsername = encodeTxUsername({ remoteUsername, localUsername });\n const request = new Message(methods.BINDING, classes.REQUEST);\n request\n .setAttribute(\"USERNAME\", txUsername)\n .setAttribute(\"PRIORITY\", candidatePriority(\"prflx\"));\n if (iceControlling) {\n request.setAttribute(\"ICE-CONTROLLING\", this.tieBreaker);\n if (nominate) {\n request.setAttribute(\"USE-CANDIDATE\", null);\n }\n } else {\n request.setAttribute(\"ICE-CONTROLLED\", this.tieBreaker);\n }\n return request;\n }\n\n private respondError(\n request: Message,\n addr: Address,\n protocol: Protocol,\n errorCode: [number, string],\n ) {\n const response = new Message(\n request.messageMethod,\n classes.ERROR,\n request.transactionId,\n );\n response\n .setAttribute(\"ERROR-CODE\", errorCode)\n .addMessageIntegrity(Buffer.from(this.localPassword, \"utf8\"))\n .addFingerprint();\n protocol.sendStun(response, addr).catch((e) => {\n log(\"sendStun error\", e);\n });\n }\n}\n\nconst encodeTxUsername = ({\n remoteUsername,\n localUsername,\n}: {\n remoteUsername: string;\n localUsername: string;\n}) => {\n return `${remoteUsername}:${localUsername}`;\n};\n\nconst decodeTxUsername = (txUsername: string) => {\n const [remoteUsername, localUsername] = txUsername.split(\":\");\n return { remoteUsername, localUsername };\n};\n"]}
|
package/lib/ice/src/utils.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import os from "os";
|
|
1
|
+
import * as os from "node:os";
|
|
2
2
|
import { type Address, type InterfaceAddresses } from "./imports/common";
|
|
3
3
|
export declare function getGlobalIp(stunServer?: Address, interfaceAddresses?: InterfaceAddresses): Promise<string>;
|
|
4
4
|
export declare function isLinkLocalAddress(info: os.NetworkInterfaceInfo): boolean;
|
package/lib/ice/src/utils.js
CHANGED
|
@@ -1,4 +1,37 @@
|
|
|
1
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 __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
2
35
|
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
36
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
37
|
};
|
|
@@ -8,7 +41,7 @@ exports.getGlobalIp = getGlobalIp;
|
|
|
8
41
|
exports.isLinkLocalAddress = isLinkLocalAddress;
|
|
9
42
|
exports.nodeIpAddress = nodeIpAddress;
|
|
10
43
|
exports.getHostAddresses = getHostAddresses;
|
|
11
|
-
const
|
|
44
|
+
const os = __importStar(require("node:os"));
|
|
12
45
|
const ip_1 = __importDefault(require("ip"));
|
|
13
46
|
const common_1 = require("./imports/common");
|
|
14
47
|
const const_1 = require("./stun/const");
|
|
@@ -34,7 +67,7 @@ function nodeIpAddress(family, { useLinkLocalAddress, } = {}) {
|
|
|
34
67
|
// https://chromium.googlesource.com/external/webrtc/+/master/rtc_base/network.cc#236
|
|
35
68
|
const costlyNetworks = ["ipsec", "tun", "utun", "tap"];
|
|
36
69
|
const banNetworks = ["vmnet", "veth"];
|
|
37
|
-
const interfaces =
|
|
70
|
+
const interfaces = os.networkInterfaces();
|
|
38
71
|
logger(interfaces);
|
|
39
72
|
const all = Object.keys(interfaces)
|
|
40
73
|
.map((nic) => {
|
package/lib/ice/src/utils.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../../ice/src/utils.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../../ice/src/utils.ts"],"names":[],"mappings":"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","sourcesContent":["import * as os from \"node:os\";\nimport nodeIp from \"ip\";\nimport {\n type Address,\n type InterfaceAddresses,\n debug,\n normalizeFamilyNodeV18,\n} from \"./imports/common\";\nimport { classes, methods } from \"./stun/const\";\nimport { Message } from \"./stun/message\";\nimport { StunProtocol } from \"./stun/protocol\";\n\nconst logger = debug(\"werift-ice : packages/ice/src/utils.ts\");\n\nexport async function getGlobalIp(\n stunServer?: Address,\n interfaceAddresses?: InterfaceAddresses,\n) {\n const protocol = new StunProtocol();\n await protocol.connectionMade(true, undefined, interfaceAddresses);\n const request = new Message(methods.BINDING, classes.REQUEST);\n const [response] = await protocol.request(\n request,\n stunServer ?? [\"stun.l.google.com\", 19302],\n );\n await protocol.close();\n\n const address = response.getAttributeValue(\"XOR-MAPPED-ADDRESS\");\n return address[0] as string;\n}\n\nexport function isLinkLocalAddress(info: os.NetworkInterfaceInfo) {\n return (\n (normalizeFamilyNodeV18(info.family) === 4 &&\n info.address?.startsWith(\"169.254.\")) ||\n (normalizeFamilyNodeV18(info.family) === 6 &&\n info.address?.startsWith(\"fe80::\"))\n );\n}\n\nexport function nodeIpAddress(\n family: number,\n {\n useLinkLocalAddress,\n }: {\n /** such as google cloud run */\n useLinkLocalAddress?: boolean;\n } = {},\n): string[] {\n // https://chromium.googlesource.com/external/webrtc/+/master/rtc_base/network.cc#236\n const costlyNetworks = [\"ipsec\", \"tun\", \"utun\", \"tap\"];\n const banNetworks = [\"vmnet\", \"veth\"];\n\n const interfaces = os.networkInterfaces();\n\n logger(interfaces);\n\n const all = Object.keys(interfaces)\n .map((nic) => {\n for (const word of [...costlyNetworks, ...banNetworks]) {\n if (nic.startsWith(word)) {\n return {\n nic,\n addresses: [],\n };\n }\n }\n const addresses = interfaces[nic]!.filter(\n (details) =>\n normalizeFamilyNodeV18(details.family) === family &&\n !nodeIp.isLoopback(details.address) &&\n (useLinkLocalAddress ? true : !isLinkLocalAddress(details)),\n );\n return {\n nic,\n addresses: addresses.map((address) => address.address),\n };\n })\n .filter((address) => !!address);\n\n // os.networkInterfaces doesn't actually return addresses in a good order.\n // have seen instances where en0 (ethernet) is after en1 (wlan), etc.\n // eth0 > eth1\n all.sort((a, b) => a.nic.localeCompare(b.nic));\n return Object.values(all).flatMap((entry) => entry.addresses);\n}\n\nexport function getHostAddresses(\n useIpv4: boolean,\n useIpv6: boolean,\n options: {\n /** such as google cloud run */\n useLinkLocalAddress?: boolean;\n } = {},\n) {\n const address: string[] = [];\n if (useIpv4) {\n address.push(...nodeIpAddress(4, options));\n }\n if (useIpv6) {\n address.push(...nodeIpAddress(6, options));\n }\n return address;\n}\n\nexport const url2Address = (url?: string) => {\n if (!url) return;\n const [address, port] = url.split(\":\");\n return [address, Number.parseInt(port)] as Address;\n};\n"]}
|
package/lib/index.mjs
CHANGED
|
@@ -530,8 +530,8 @@ var EventDisposer = class {
|
|
|
530
530
|
import {
|
|
531
531
|
createSocket as createSocket2
|
|
532
532
|
} from "dgram";
|
|
533
|
-
import net from "net";
|
|
534
|
-
import { connect } from "net";
|
|
533
|
+
import * as net from "node:net";
|
|
534
|
+
import { connect } from "node:net";
|
|
535
535
|
var log = debug("werift-ice:packages/ice/src/transport.ts");
|
|
536
536
|
var UdpTransport = class _UdpTransport {
|
|
537
537
|
constructor(socketType, options = {}) {
|
|
@@ -7385,8 +7385,8 @@ function candidatePriority(candidateType, localPref = 65535) {
|
|
|
7385
7385
|
import { randomBytes as randomBytes6 } from "crypto";
|
|
7386
7386
|
import { isIPv4 as isIPv42 } from "net";
|
|
7387
7387
|
import * as Int642 from "int64-buffer";
|
|
7388
|
+
import * as timers from "node:timers/promises";
|
|
7388
7389
|
import isEqual from "fast-deep-equal";
|
|
7389
|
-
import timers from "timers/promises";
|
|
7390
7390
|
|
|
7391
7391
|
// ../ice/src/dns/lookup.ts
|
|
7392
7392
|
import mdns from "multicast-dns";
|
|
@@ -7559,7 +7559,7 @@ function validateAddress(addr) {
|
|
|
7559
7559
|
}
|
|
7560
7560
|
|
|
7561
7561
|
// ../ice/src/utils.ts
|
|
7562
|
-
import os from "os";
|
|
7562
|
+
import * as os from "node:os";
|
|
7563
7563
|
import nodeIp2 from "ip";
|
|
7564
7564
|
var logger = debug("werift-ice : packages/ice/src/utils.ts");
|
|
7565
7565
|
async function getGlobalIp(stunServer, interfaceAddresses) {
|
|
@@ -8500,7 +8500,7 @@ var decodeTxUsername = (txUsername) => {
|
|
|
8500
8500
|
};
|
|
8501
8501
|
|
|
8502
8502
|
// src/helper.ts
|
|
8503
|
-
import EventEmitter from "events";
|
|
8503
|
+
import { EventEmitter } from "node:events";
|
|
8504
8504
|
function enumerate2(arr) {
|
|
8505
8505
|
return arr.map((v, i) => [i, v]);
|
|
8506
8506
|
}
|
|
@@ -8824,7 +8824,7 @@ function useVideoOrientation() {
|
|
|
8824
8824
|
|
|
8825
8825
|
// src/media/rtpReceiver.ts
|
|
8826
8826
|
import { randomUUID as randomUUID7 } from "crypto";
|
|
8827
|
-
import { setTimeout as
|
|
8827
|
+
import { setTimeout as setTimeout8 } from "timers/promises";
|
|
8828
8828
|
|
|
8829
8829
|
// src/utils.ts
|
|
8830
8830
|
import { createHash as createHash4 } from "crypto";
|
|
@@ -9293,7 +9293,7 @@ var NackHandler = class {
|
|
|
9293
9293
|
};
|
|
9294
9294
|
|
|
9295
9295
|
// src/media/receiver/receiverTwcc.ts
|
|
9296
|
-
import { setTimeout as
|
|
9296
|
+
import { setTimeout as setTimeout6 } from "timers/promises";
|
|
9297
9297
|
var log26 = debug("werift:packages/webrtc/media/receiver/receiverTwcc");
|
|
9298
9298
|
var ReceiverTWCC = class {
|
|
9299
9299
|
constructor(dtlsTransport, rtcpSsrc, mediaSourceSsrc) {
|
|
@@ -9319,7 +9319,7 @@ var ReceiverTWCC = class {
|
|
|
9319
9319
|
async runTWCC() {
|
|
9320
9320
|
while (this.twccRunning) {
|
|
9321
9321
|
this.sendTWCC();
|
|
9322
|
-
await
|
|
9322
|
+
await setTimeout6(100);
|
|
9323
9323
|
}
|
|
9324
9324
|
}
|
|
9325
9325
|
sendTWCC() {
|
|
@@ -9476,7 +9476,7 @@ import * as Int643 from "int64-buffer";
|
|
|
9476
9476
|
// src/transport/dtls.ts
|
|
9477
9477
|
import { Certificate as Certificate3, PrivateKey as PrivateKey2 } from "@fidm/x509";
|
|
9478
9478
|
import { randomUUID as randomUUID4 } from "crypto";
|
|
9479
|
-
import { setTimeout as
|
|
9479
|
+
import { setTimeout as setTimeout7 } from "timers/promises";
|
|
9480
9480
|
var log27 = debug("werift:packages/webrtc/src/transport/dtls.ts");
|
|
9481
9481
|
var RTCDtlsTransport = class _RTCDtlsTransport {
|
|
9482
9482
|
constructor(config, iceTransport, localCertificate, srtpProfiles2 = []) {
|
|
@@ -9592,7 +9592,7 @@ var RTCDtlsTransport = class _RTCDtlsTransport {
|
|
|
9592
9592
|
f(error);
|
|
9593
9593
|
});
|
|
9594
9594
|
if (this.dtls instanceof DtlsClient) {
|
|
9595
|
-
await
|
|
9595
|
+
await setTimeout7(100);
|
|
9596
9596
|
this.dtls.connect().catch((error) => {
|
|
9597
9597
|
this.setState("failed");
|
|
9598
9598
|
log27("dtls connect failed", error);
|
|
@@ -12856,7 +12856,7 @@ var RTCRtpReceiver = class {
|
|
|
12856
12856
|
this.rtcpRunning = true;
|
|
12857
12857
|
try {
|
|
12858
12858
|
while (this.rtcpRunning) {
|
|
12859
|
-
await
|
|
12859
|
+
await setTimeout8(500 + Math.random() * 1e3, void 0, {
|
|
12860
12860
|
signal: this.rtcpCancel.signal
|
|
12861
12861
|
});
|
|
12862
12862
|
const reports = Object.entries(this.remoteStreams).map(
|
|
@@ -12883,12 +12883,12 @@ var RTCRtpReceiver = class {
|
|
|
12883
12883
|
const packet = new RtcpRrPacket({ ssrc: this.rtcpSsrc, reports });
|
|
12884
12884
|
try {
|
|
12885
12885
|
if (this.config.debug.receiverReportDelay) {
|
|
12886
|
-
await
|
|
12886
|
+
await setTimeout8(this.config.debug.receiverReportDelay);
|
|
12887
12887
|
}
|
|
12888
12888
|
await this.dtlsTransport.sendRtcp([packet]);
|
|
12889
12889
|
} catch (error) {
|
|
12890
12890
|
log31("sendRtcp failed", error);
|
|
12891
|
-
await
|
|
12891
|
+
await setTimeout8(500 + Math.random() * 1e3);
|
|
12892
12892
|
}
|
|
12893
12893
|
}
|
|
12894
12894
|
} catch (error) {
|
|
@@ -13185,7 +13185,7 @@ var RtpRouter = class {
|
|
|
13185
13185
|
import { randomBytes as randomBytes9 } from "crypto";
|
|
13186
13186
|
import { jspack as jspack7 } from "@shinyoshiaki/jspack";
|
|
13187
13187
|
import { randomUUID as randomUUID8 } from "crypto";
|
|
13188
|
-
import { setTimeout as
|
|
13188
|
+
import { setTimeout as setTimeout9 } from "timers/promises";
|
|
13189
13189
|
|
|
13190
13190
|
// src/media/sender/cumulativeResult.ts
|
|
13191
13191
|
var CumulativeResult = class {
|
|
@@ -13477,7 +13477,7 @@ var RTCRtpSender = class {
|
|
|
13477
13477
|
this.rtcpRunning = true;
|
|
13478
13478
|
try {
|
|
13479
13479
|
while (this.rtcpRunning) {
|
|
13480
|
-
await
|
|
13480
|
+
await setTimeout9(500 + Math.random() * 1e3, void 0, {
|
|
13481
13481
|
signal: this.rtcpCancel.signal
|
|
13482
13482
|
});
|
|
13483
13483
|
const packets = [
|
|
@@ -13511,7 +13511,7 @@ var RTCRtpSender = class {
|
|
|
13511
13511
|
await this.dtlsTransport.sendRtcp(packets);
|
|
13512
13512
|
} catch (error) {
|
|
13513
13513
|
log33("sendRtcp failed", error);
|
|
13514
|
-
await
|
|
13514
|
+
await setTimeout9(500 + Math.random() * 1e3);
|
|
13515
13515
|
}
|
|
13516
13516
|
}
|
|
13517
13517
|
} catch (error) {
|
|
@@ -530,8 +530,8 @@ var EventDisposer = class {
|
|
|
530
530
|
import {
|
|
531
531
|
createSocket as createSocket2
|
|
532
532
|
} from "dgram";
|
|
533
|
-
import net from "net";
|
|
534
|
-
import { connect } from "net";
|
|
533
|
+
import * as net from "node:net";
|
|
534
|
+
import { connect } from "node:net";
|
|
535
535
|
var log = debug("werift-ice:packages/ice/src/transport.ts");
|
|
536
536
|
var UdpTransport = class _UdpTransport {
|
|
537
537
|
constructor(socketType, options = {}) {
|
|
@@ -8584,7 +8584,7 @@ var logger = debug("werift-ice : packages/ice/src/utils.ts");
|
|
|
8584
8584
|
var log24 = debug("werift-ice : packages/ice/src/ice.ts : log");
|
|
8585
8585
|
|
|
8586
8586
|
// src/helper.ts
|
|
8587
|
-
import EventEmitter from "events";
|
|
8587
|
+
import { EventEmitter } from "node:events";
|
|
8588
8588
|
var EventTarget2 = class extends EventEmitter {
|
|
8589
8589
|
addEventListener = (type, listener) => {
|
|
8590
8590
|
this.addListener(type, listener);
|
package/lib/webrtc/src/helper.js
CHANGED
|
@@ -1,12 +1,9 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
-
};
|
|
5
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
3
|
exports.EventTarget = exports.PromiseQueue = void 0;
|
|
7
4
|
exports.enumerate = enumerate;
|
|
8
5
|
exports.divide = divide;
|
|
9
|
-
const
|
|
6
|
+
const node_events_1 = require("node:events");
|
|
10
7
|
function enumerate(arr) {
|
|
11
8
|
return arr.map((v, i) => [i, v]);
|
|
12
9
|
}
|
|
@@ -53,7 +50,7 @@ class PromiseQueue {
|
|
|
53
50
|
}
|
|
54
51
|
}
|
|
55
52
|
exports.PromiseQueue = PromiseQueue;
|
|
56
|
-
class EventTarget extends
|
|
53
|
+
class EventTarget extends node_events_1.EventEmitter {
|
|
57
54
|
constructor() {
|
|
58
55
|
super(...arguments);
|
|
59
56
|
Object.defineProperty(this, "addEventListener", {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"helper.js","sourceRoot":"","sources":["../../../src/helper.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"helper.js","sourceRoot":"","sources":["../../../src/helper.ts"],"names":[],"mappings":";;;AAEA,8BAEC;AAED,wBAGC;AATD,6CAA2C;AAE3C,SAAgB,SAAS,CAAI,GAAQ;IACnC,OAAO,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;AACnC,CAAC;AAED,SAAgB,MAAM,CAAC,IAAY,EAAE,KAAa;IAChD,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAC9B,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;AAC5C,CAAC;AAED,MAAa,YAAY;IAAzB;QACE;;;;mBAA6D,EAAE;WAAC;QAChE;;;;mBAAU,KAAK;WAAC;QAEhB;;;;mBAAO,CAAC,OAA2B,EAAE,EAAE,CACrC,IAAI,OAAO,CAAO,CAAC,CAAC,EAAE,EAAE;gBACtB,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC;gBACtC,IAAI,CAAC,IAAI,CAAC,OAAO;oBAAE,IAAI,CAAC,GAAG,EAAE,CAAC;YAChC,CAAC,CAAC;WAAC;IAcP,CAAC;IAZS,KAAK,CAAC,GAAG;QACf,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;QAChC,IAAI,IAAI,EAAE,CAAC;YACT,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;YACpB,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC;YACrB,IAAI,CAAC,IAAI,EAAE,CAAC;YAEZ,IAAI,CAAC,GAAG,EAAE,CAAC;QACb,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC;QACvB,CAAC;IACH,CAAC;CACF;AAtBD,oCAsBC;AAED,MAAa,WAAY,SAAQ,0BAAY;IAA7C;;QACE;;;;mBAAmB,CAAC,IAAY,EAAE,QAAkC,EAAE,EAAE;gBACtE,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;YACnC,CAAC;WAAC;QAEF;;;;mBAAsB,CAAC,IAAY,EAAE,QAAkC,EAAE,EAAE;gBACzE,IAAI,CAAC,cAAc,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;YACtC,CAAC;WAAC;IACJ,CAAC;CAAA;AARD,kCAQC","sourcesContent":["import { EventEmitter } from \"node:events\";\n\nexport function enumerate<T>(arr: T[]): [number, T][] {\n return arr.map((v, i) => [i, v]);\n}\n\nexport function divide(from: string, split: string): [string, string] {\n const arr = from.split(split);\n return [arr[0], arr.slice(1).join(split)];\n}\n\nexport class PromiseQueue {\n queue: { promise: () => Promise<any>; done: () => void }[] = [];\n running = false;\n\n push = (promise: () => Promise<any>) =>\n new Promise<void>((r) => {\n this.queue.push({ promise, done: r });\n if (!this.running) this.run();\n });\n\n private async run() {\n const task = this.queue.shift();\n if (task) {\n this.running = true;\n await task.promise();\n task.done();\n\n this.run();\n } else {\n this.running = false;\n }\n }\n}\n\nexport class EventTarget extends EventEmitter {\n addEventListener = (type: string, listener: (...args: any[]) => void) => {\n this.addListener(type, listener);\n };\n\n removeEventListener = (type: string, listener: (...args: any[]) => void) => {\n this.removeListener(type, listener);\n };\n}\n"]}
|
|
@@ -35,7 +35,7 @@ export declare class RTCRtpReceiver {
|
|
|
35
35
|
readonly receiveLastSRTimestamp: {
|
|
36
36
|
[ssrc: number]: number;
|
|
37
37
|
};
|
|
38
|
-
readonly onPacketLost: Event<[import("
|
|
38
|
+
readonly onPacketLost: Event<[import("werift-rtp/src/rtcp/rtpfb/nack").GenericNack]>;
|
|
39
39
|
readonly onRtcp: Event<[RtcpPacket]>;
|
|
40
40
|
dtlsTransport: RTCDtlsTransport;
|
|
41
41
|
sdesMid?: string;
|