272 lines
6.3 KiB
TypeScript
272 lines
6.3 KiB
TypeScript
|
/* This Source Code Form is subject to the terms of the Mozilla Public
|
||
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||
|
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
||
|
|
||
|
import random from "../random/random.ts";
|
||
|
import numbers from "./numbers.ts";
|
||
|
import text from "./text.ts";
|
||
|
|
||
|
class block {
|
||
|
static block (list, optional?) {
|
||
|
if (optional === true) {
|
||
|
if (random.chance(6)) {
|
||
|
return ''
|
||
|
}
|
||
|
}
|
||
|
|
||
|
function deeper (item) {
|
||
|
if (item === null || item === undefined) {
|
||
|
return ''
|
||
|
}
|
||
|
if (typeof (item) === 'function') {
|
||
|
return item()
|
||
|
}
|
||
|
if (typeof (item) === 'string') {
|
||
|
return item
|
||
|
}
|
||
|
if (Array.isArray(item)) {
|
||
|
let s = ''
|
||
|
for (let i = 0; i < item.length; i++) {
|
||
|
s += deeper(item[i])
|
||
|
}
|
||
|
return s
|
||
|
}
|
||
|
return item
|
||
|
}
|
||
|
|
||
|
let asString = ''
|
||
|
for (let i = 0; i < list.length; i++) {
|
||
|
asString += deeper(list[i])
|
||
|
}
|
||
|
|
||
|
return asString
|
||
|
}
|
||
|
}
|
||
|
|
||
|
export default class network {
|
||
|
static sdp() {
|
||
|
// session description protocol template
|
||
|
return [
|
||
|
"v=0",
|
||
|
"o=Mozilla-SIPUA 23597 0 IN IP4 0.0.0.0",
|
||
|
"s=SIP Call",
|
||
|
"t=0 0",
|
||
|
"a=ice-ufrag:f5fda439",
|
||
|
"a=ice-pwd:d0df8e2904bdbd29587966e797655970",
|
||
|
"a=fingerprint:sha-256 DF:69:78:20:8D:2E:08:CE:49:82:A3:11:79:1D:BF:B5:49:49:2D:32:82:2F:0D:88:84:A7:C6:63:23:63:A9:0F",
|
||
|
"m=audio 52757 RTP/SAVPF 109 0 8 101",
|
||
|
"c=IN IP4 192.168.129.33",
|
||
|
"a=rtpmap:109 opus/48000/2",
|
||
|
"a=ptime:20",
|
||
|
"a=rtpmap:0 PCMU/8000",
|
||
|
"a=rtpmap:8 PCMA/8000",
|
||
|
"a=rtpmap:101 telephone-event/8000",
|
||
|
"a=fmtp:101 0-15",
|
||
|
"a=sendrecv",
|
||
|
"a=candidate:0 1 UDP 2113601791 192.168.129.33 52757 typ host",
|
||
|
"a=candidate:0 2 UDP 2113601790 192.168.129.33 59738 typ host",
|
||
|
"m=video 63901 RTP/SAVPF 120",
|
||
|
"c=IN IP4 192.168.129.33",
|
||
|
"a=rtpmap:120 VP8/90000",
|
||
|
"a=sendrecv",
|
||
|
"a=candidate:0 1 UDP 2113601791 192.168.129.33 63901 typ host",
|
||
|
"a=candidate:0 2 UDP 2113601790 192.168.129.33 54165 typ host",
|
||
|
"m=application 65080 SCTP/DTLS 5000",
|
||
|
"c=IN IP4 192.168.129.33",
|
||
|
"a=fmtp:5000 protocol=webrtc-datachannel;streams=16",
|
||
|
"a=sendrecv",
|
||
|
"a=candidate:0 1 UDP 2113601791 192.168.129.33 65080 typ host",
|
||
|
"a=candidate:0 2 UDP 2113601790 192.168.129.33 62658 typ host"
|
||
|
].join("\n");
|
||
|
}
|
||
|
|
||
|
static IceCandidate() {
|
||
|
// https://tools.ietf.org/html/rfc5245#section-15
|
||
|
// candidate=
|
||
|
return block.block([
|
||
|
random.pick([0, 1, numbers.any]),
|
||
|
" ",
|
||
|
random.pick([0, 1, numbers.any]),
|
||
|
" ",
|
||
|
random.pick(["UDP", "TCP", "SCTP"]),
|
||
|
random.pick(["", `/${random.pick(["DTLS", "DTLS-SRTP"])}`]),
|
||
|
" ",
|
||
|
random.pick([numbers.any]),
|
||
|
" ",
|
||
|
random.pick([network.goodHostnames]),
|
||
|
" ",
|
||
|
random.pick([56187, numbers.any]),
|
||
|
" ",
|
||
|
"type",
|
||
|
" ",
|
||
|
random.pick([
|
||
|
"host",
|
||
|
block.block([
|
||
|
random.pick(["srflx", "prflx", "relay"]),
|
||
|
" ",
|
||
|
random.pick(["raddr"]),
|
||
|
" ",
|
||
|
random.pick([network.goodHostnames]),
|
||
|
" ",
|
||
|
random.pick(["rport"]),
|
||
|
random.use([block.block([" ", numbers.any])])
|
||
|
])
|
||
|
])
|
||
|
]);
|
||
|
}
|
||
|
|
||
|
static SdpMid() {
|
||
|
// m=
|
||
|
return block.block([
|
||
|
random.pick(["application", "video", "audio"]),
|
||
|
" ",
|
||
|
numbers.any,
|
||
|
" ",
|
||
|
random.pick(["RTP/AVP", "RTP/SAVPF", "RTP/SAVP", "SCTP/DTLS"]),
|
||
|
" ",
|
||
|
numbers.any
|
||
|
]);
|
||
|
}
|
||
|
|
||
|
static Turn() {
|
||
|
// https://tools.ietf.org/html/rfc7065#section-3.1
|
||
|
return block.block([
|
||
|
// scheme
|
||
|
random.pick(network.PeerConnectionProtocols),
|
||
|
":",
|
||
|
// turn-host
|
||
|
random.pick(["1.2.3.4", network.hostname]),
|
||
|
// turn-port
|
||
|
random.use([block.block([":", numbers.any])]),
|
||
|
random.use([block.block(["/", text.any])]),
|
||
|
"?",
|
||
|
random.pick(["transport"]),
|
||
|
"=",
|
||
|
random.pick(["udp", "tcp", text.any])
|
||
|
]);
|
||
|
}
|
||
|
|
||
|
static PeerConnectionProtocols() {
|
||
|
return ["turn", "turns", "stun", "stuns"];
|
||
|
}
|
||
|
|
||
|
static randomIPv4() {
|
||
|
function octet() {
|
||
|
return random.pick([random.number(255), numbers.any]);
|
||
|
}
|
||
|
|
||
|
return `${octet()}.${octet()}.${octet()}.${octet()}.`;
|
||
|
}
|
||
|
|
||
|
static randomIPv6() {
|
||
|
let parts = [];
|
||
|
|
||
|
for (let i = 0; i < 8; i++) {
|
||
|
parts.push(random.hex(4));
|
||
|
}
|
||
|
|
||
|
return parts.join(":");
|
||
|
}
|
||
|
|
||
|
static iceServer() {
|
||
|
return random.pick(["stun:23.21.150.121"]);
|
||
|
}
|
||
|
|
||
|
static dtmf() {
|
||
|
let count = numbers.tiny();
|
||
|
const values = [];
|
||
|
while (count--) {
|
||
|
values.push(
|
||
|
random.item([
|
||
|
"*",
|
||
|
"#",
|
||
|
"A",
|
||
|
"B",
|
||
|
"C",
|
||
|
"D",
|
||
|
"0",
|
||
|
"1",
|
||
|
"2",
|
||
|
"3",
|
||
|
"4",
|
||
|
"5",
|
||
|
"6",
|
||
|
"7",
|
||
|
"8",
|
||
|
"9"
|
||
|
])
|
||
|
);
|
||
|
}
|
||
|
|
||
|
return values.join("");
|
||
|
}
|
||
|
|
||
|
static goodHostnames() {
|
||
|
return ["0.0.0.0", "127.0.0.1:8080"];
|
||
|
}
|
||
|
|
||
|
static badHostnames() {
|
||
|
return [
|
||
|
"google.org:8080",
|
||
|
"::1",
|
||
|
"[::192.9.5.5]:42",
|
||
|
"2001:db8:85a3::8a2e:370:3478",
|
||
|
"2001:db8:85a3:0:0:8a2e:370:3478",
|
||
|
"::ffff:192.0.2.1",
|
||
|
"0000:0000:0000:0000:0000:0000:0000:0001",
|
||
|
"::192.0.2.128",
|
||
|
"::ffff:192.0.2.128",
|
||
|
"2001:db8::1:2",
|
||
|
"2001:db8::1:1:1:1:1"
|
||
|
];
|
||
|
}
|
||
|
|
||
|
static hostname() {
|
||
|
return random.pick([
|
||
|
network.randomIPv4,
|
||
|
network.randomIPv6,
|
||
|
network.goodHostnames,
|
||
|
network.badHostnames
|
||
|
]);
|
||
|
}
|
||
|
|
||
|
static port() {
|
||
|
return random.pick([80, 443, 21, 23, 9310]);
|
||
|
}
|
||
|
|
||
|
static hash() {
|
||
|
return random.pick(["", "#", "#main-content", () => `#${text.any()}`]);
|
||
|
}
|
||
|
|
||
|
static path() {
|
||
|
return random.pick(["", "/", "/index.html", () => `/${text.any()}`]);
|
||
|
}
|
||
|
|
||
|
static protocol() {
|
||
|
return `${random.pick([
|
||
|
"http",
|
||
|
"https",
|
||
|
"ftp",
|
||
|
"telnet",
|
||
|
"chrome",
|
||
|
"resource"
|
||
|
])}:`;
|
||
|
}
|
||
|
|
||
|
static search() {
|
||
|
return random.pick(["", "?", "?foo=bar", () => `?${text.any()}`]);
|
||
|
}
|
||
|
|
||
|
static randomBitmask(list) {
|
||
|
if (list.length <= 1) {
|
||
|
return list.join("");
|
||
|
}
|
||
|
let max = random.range(2, list.length);
|
||
|
let mask = random.pick(list);
|
||
|
for (let i = 1; i < max; i++) {
|
||
|
mask += `|${random.pick(list)}`;
|
||
|
}
|
||
|
return mask;
|
||
|
}
|
||
|
}
|