[+] 证书终端请求ID
This commit is contained in:
@@ -83,7 +83,7 @@
|
||||
<!-- 菜单 -->
|
||||
<div class="menus">
|
||||
<el-button type="primary" :disabled="taoyao !== null" @click="signalVisible = true">连接信令</el-button>
|
||||
<el-button type="primary" @click="roomActive = 'enter'; roomVisible = true;">选择房间</el-button>
|
||||
<el-button type="primary" @click="roomActive = 'enter';roomVisible = true;">选择房间</el-button>
|
||||
<el-button type="primary" @click="roomActive = 'create';roomVisible = true;">创建房间</el-button>
|
||||
<el-button>邀请终端</el-button>
|
||||
<el-button>退出房间</el-button>
|
||||
@@ -212,7 +212,7 @@ export default {
|
||||
.menus{width:100%;top:1rem;left:0;text-align:center;position:fixed;z-index:1;}
|
||||
.clients{width:100%;height:100%;top:0;left:0;position:fixed;}
|
||||
.client{float:left;width:50vw;height:50vh;box-shadow:0 0 1px 0px rgba(0,0,0,0.4);}
|
||||
.client .buttons{width:100%;bottom:1rem;left:0;text-align:center;position:absolute;padding:0.8rem 0;background: rgba(0,0,0,0.4);text-align:center;}
|
||||
.client .buttons{width:100%;bottom:1rem;left:0;text-align:center;position:absolute;padding:0.8rem 0;background:rgba(0,0,0,0.4);}
|
||||
.client audio{display:none;}
|
||||
.client video{width:100%;height:100%;}
|
||||
</style>
|
||||
23
taoyao-client-web/src/certs/server.crt
Normal file
23
taoyao-client-web/src/certs/server.crt
Normal file
@@ -0,0 +1,23 @@
|
||||
-----BEGIN CERTIFICATE-----
|
||||
MIID2TCCAsGgAwIBAgIJAMdfMbITNAhiMA0GCSqGSIb3DQEBCwUAMF4xCzAJBgNV
|
||||
BAYTAmNuMQswCQYDVQQIDAJnZDELMAkGA1UEBwwCZ3oxDzANBgNVBAoMBmFjZ2lz
|
||||
dDEPMA0GA1UECwwGYWNnaXN0MRMwEQYDVQQDDAphY2dpc3QuY29tMB4XDTIzMDIy
|
||||
NzEzMzg0OFoXDTMzMDIyNDEzMzg0OFowZTELMAkGA1UEBhMCY24xCzAJBgNVBAgM
|
||||
AmdkMQswCQYDVQQHDAJnejEPMA0GA1UECgwGYWNnaXN0MQ8wDQYDVQQLDAZ0YW95
|
||||
YW8xGjAYBgNVBAMMEXRhb3lhby5hY2dpc3QuY29tMIIBIjANBgkqhkiG9w0BAQEF
|
||||
AAOCAQ8AMIIBCgKCAQEAmeQvh6OwHR87DKvm04z1xjbHgh6fxi6y+5jMJ7K7LvPT
|
||||
l+7haNB/eeSgEnHL38Naaw2cQvNkSAVPK210q574tQZW6Am2icRb9EJnMx2tKdaG
|
||||
8QtTGxddScebyO++7qzf8CwECPRpsZRRp1a5ompCouDXY4VWJatXBMnZX05ZqUJH
|
||||
0u6nioDwvd+YBOui4nGCxoF8tcVsidvHWx0JTfC7simyMp/5VvVYt7V4ENuU+3NT
|
||||
wDF7sEW1z8Sx1ErE4NLQIyy+PpGmV+h2HgNb0Bnre+jq7v/1Ue2Irsd6xe9iHf3P
|
||||
ji/mnkrRdAxd36KszFvmQjLAClJM1tRjc7gGyO8yCQIDAQABo4GSMIGPMAsGA1Ud
|
||||
DwQEAwIF4DAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIwYQYDVR0RBFow
|
||||
WIcEfwAAAYcEwKgBZIcEwKgBbocEwKgIZIcEwKgIboIJbG9jYWxob3N0ggphY2dp
|
||||
c3QuY29tgg53d3cuYWNnaXN0LmNvbYIRdGFveWFvLmFjZ2lzdC5jb20wDQYJKoZI
|
||||
hvcNAQELBQADggEBAKDYyUUMFDchfTYwEhUWHHtUpJTzVz2opAoKjUU2yH4pT4dT
|
||||
Fb1s4NAuopoU9ycX4MJaApmxMioWwQzkoBLbnr+4RPfOYR9nlU0s+dx5JcpOgJtR
|
||||
6X08ZDmW2DqhfIqR89uvIOgOU0oc6nUxQ0+doihDYyuyvXkvkZLjl8hrv6phuL8e
|
||||
qhtx9++4umD3RYbRsASRmB8/iYTgi7WAvFyNM9kkS5pwkJOaHN+vtKx5xpytEROT
|
||||
pbdUgGdXcYzYwzqDJ7Wbe0pIKeZ97rx6mF+0/92sWhd2U54jn5M1gp1sCQqG/syd
|
||||
tER+0jG77mvqkls5VCNmUE1+pOa53MvB5TuTTsA=
|
||||
-----END CERTIFICATE-----
|
||||
27
taoyao-client-web/src/certs/server.key
Normal file
27
taoyao-client-web/src/certs/server.key
Normal file
@@ -0,0 +1,27 @@
|
||||
-----BEGIN RSA PRIVATE KEY-----
|
||||
MIIEpQIBAAKCAQEAmeQvh6OwHR87DKvm04z1xjbHgh6fxi6y+5jMJ7K7LvPTl+7h
|
||||
aNB/eeSgEnHL38Naaw2cQvNkSAVPK210q574tQZW6Am2icRb9EJnMx2tKdaG8QtT
|
||||
GxddScebyO++7qzf8CwECPRpsZRRp1a5ompCouDXY4VWJatXBMnZX05ZqUJH0u6n
|
||||
ioDwvd+YBOui4nGCxoF8tcVsidvHWx0JTfC7simyMp/5VvVYt7V4ENuU+3NTwDF7
|
||||
sEW1z8Sx1ErE4NLQIyy+PpGmV+h2HgNb0Bnre+jq7v/1Ue2Irsd6xe9iHf3Pji/m
|
||||
nkrRdAxd36KszFvmQjLAClJM1tRjc7gGyO8yCQIDAQABAoIBAFSpGhTO0lZTFhM0
|
||||
hrofNB6liEBnRJKsoj6Tosy8IQoFjYRqIIufGGIgiodbH0OsnxOB21Nhvut4MEO9
|
||||
5Y9812oPYMQqg8dqxQOtfES8sMTxhi8ZgdDHm8S5EVULv8hiRphEPrwGahcNd5ZN
|
||||
ubZGKv6cHyJa+jei+S5jNTifS+g2+hEvKyxRdoWFaRJTPeBPr4ayJevDY8zlllh6
|
||||
APqLYuJxMrgp0J/XSlwtFZ7O83opj0dt5sZiHV1drNytZU9PMSy6krkXPVV1Ahgo
|
||||
QpIFKmrWjjk5ehyyGyexFmVKWCZenrLN14oOvxgKezV7PQwAhWWlpxMLEwP+e4Nu
|
||||
o1aqgAECgYEAyMWFZnB5s0R//QhQm8uZEMbauAJtIWvfjWSR1Gtb9g+ykoYOv5TB
|
||||
2nG/yCrbtrDvMPYP9ZTG/dB0+PmtJQPNy+ZyIdOeeVACKAzvBQnfUKV8soSsh79+
|
||||
RI/GJXfNJ+GcJv1F5t3pEOY/xmp6aZIdTCBkjzseyJAaRLLQzZXMKAECgYEAxDlT
|
||||
aSbjyeZomsaN/WSny0qT61spfYOgJyy/B5SLY6ZFRS7p60IjSeAr5LoD4pmqK4B9
|
||||
pM7KHPvWyRGkeCqx8A7rJ1VkpwapZn+Lv9SsUpyW9SWqo/0cQ0U/Hu1dBfULdypH
|
||||
uQDS1xIrQqLEeA9yLyB90pEvTHHjHybZvcUxygkCgYEAjCqqGXyI2okGOedmL36S
|
||||
3E2YQUMgYWboadQ+o2hYiY8oAnepMENwm0sys1KIliEsvKftOGyoCGdSYsgdA2yG
|
||||
bsXyBH+zccpT1xZAgOoFiE4goplRwmwEgWVG1r2u8xrlY6sK9EUVBAFboPCRicbC
|
||||
wXUT/5MsyKUiUbftYrokEAECgYEAgF/wzg5/YIu5S+ky4+CCVmHIPGY70r3WfUqs
|
||||
/8yTFPKmxwhWSW/PnnlmvhFkkU9vIV7C1JvlZujsMEe2jleAakmYVvdrDksxcLlp
|
||||
OGtvAe0oZeHqrbbeUrRvA1DPVyJmCeRDYCnFxqdAXiwW1WVlkqdzKduKUj0AFlVY
|
||||
husIE+ECgYEAt3DPoPHcAb5PSyoWm2r1FS7j7a0tMGHSDIkUwSRRaB77g7IP1I1N
|
||||
jzJmd5VZm69vwXbaxPtJ0YM5SrIq8HbBfNjJmPRinEZjkeq2vrUw8lzoTTZh35Wg
|
||||
wgni/eFijGhBkSXcvDuZ2QNi3jtQtaiMwBohGNCjCtfGss/41RNpmGU=
|
||||
-----END RSA PRIVATE KEY-----
|
||||
@@ -1,44 +1,3 @@
|
||||
/**
|
||||
* 信令
|
||||
*/
|
||||
const protocol = {
|
||||
// 当前索引
|
||||
index: 0,
|
||||
// 最大索引
|
||||
maxIndex: 1000,
|
||||
/**
|
||||
* @returns 索引
|
||||
*/
|
||||
buildId() {
|
||||
if (++this.index >= this.maxIndex) {
|
||||
this.index = 0;
|
||||
}
|
||||
return Date.now() * 1000 + this.index;
|
||||
},
|
||||
/**
|
||||
* @param {*} signal 信令标识
|
||||
* @param {*} body 消息主体
|
||||
* @param {*} id 消息标识
|
||||
* @param {*} v 消息版本
|
||||
*
|
||||
* @returns 信令消息
|
||||
*/
|
||||
buildMessage(signal, body = {}, id, v) {
|
||||
if (!signal) {
|
||||
throw new Error("信令标识缺失");
|
||||
}
|
||||
const message = {
|
||||
header: {
|
||||
v: v || "1.0.0",
|
||||
id: id || this.buildId(),
|
||||
signal: signal,
|
||||
},
|
||||
body: body,
|
||||
};
|
||||
return message;
|
||||
},
|
||||
};
|
||||
|
||||
/**
|
||||
* 音频默认配置
|
||||
*/
|
||||
@@ -97,8 +56,23 @@ const defaultRTCPeerConnectionConfig = {
|
||||
iceCandidatePoolSize: 8,
|
||||
};
|
||||
|
||||
/**
|
||||
* VP9
|
||||
*/
|
||||
const ksvcEncodings = [{ scalabilityMode: "S3T3_KEY" }];
|
||||
|
||||
/**
|
||||
* simulcast
|
||||
*/
|
||||
const simulcastEncodings = [
|
||||
{ scaleResolutionDownBy: 4, maxBitrate: 500000, scalabilityMode: "S1T2" },
|
||||
{ scaleResolutionDownBy: 2, maxBitrate: 1000000, scalabilityMode: "S1T2" },
|
||||
{ scaleResolutionDownBy: 1, maxBitrate: 5000000, scalabilityMode: "S1T2" },
|
||||
];
|
||||
|
||||
export {
|
||||
protocol,
|
||||
ksvcEncodings,
|
||||
simulcastEncodings,
|
||||
defaultAudioConfig,
|
||||
defaultVideoConfig,
|
||||
defaultRTCPeerConnectionConfig,
|
||||
|
||||
@@ -3,21 +3,61 @@
|
||||
*/
|
||||
import * as mediasoupClient from "mediasoup-client";
|
||||
import {
|
||||
protocol,
|
||||
ksvcEncodings,
|
||||
simulcastEncodings,
|
||||
defaultAudioConfig,
|
||||
defaultVideoConfig,
|
||||
defaultRTCPeerConnectionConfig,
|
||||
} from "./Config.js";
|
||||
|
||||
// Used for simulcast webcam video.
|
||||
const WEBCAM_SIMULCAST_ENCODINGS = [
|
||||
{ scaleResolutionDownBy: 4, maxBitrate: 500000, scalabilityMode: "S1T2" },
|
||||
{ scaleResolutionDownBy: 2, maxBitrate: 1000000, scalabilityMode: "S1T2" },
|
||||
{ scaleResolutionDownBy: 1, maxBitrate: 5000000, scalabilityMode: "S1T2" },
|
||||
];
|
||||
|
||||
// Used for VP9 webcam video.
|
||||
const WEBCAM_KSVC_ENCODINGS = [{ scalabilityMode: "S3T3_KEY" }];
|
||||
/**
|
||||
* 信令
|
||||
*/
|
||||
const protocol = {
|
||||
// 当前索引
|
||||
index: 0,
|
||||
// 最大索引
|
||||
maxIndex: 999,
|
||||
// 终端索引
|
||||
clientIndex: 99999,
|
||||
/**
|
||||
* @returns 索引
|
||||
*/
|
||||
buildId() {
|
||||
if (++this.index > this.maxIndex) {
|
||||
this.index = 0;
|
||||
}
|
||||
const date = new Date();
|
||||
return 100000000000000 * date.getDate() +
|
||||
1000000000000 * date.getHours() +
|
||||
10000000000 * date.getMinutes() +
|
||||
100000000 * date.getSeconds() +
|
||||
1000 * this.clientIndex +
|
||||
this.index;
|
||||
},
|
||||
/**
|
||||
* @param {*} signal 信令标识
|
||||
* @param {*} body 消息主体
|
||||
* @param {*} id 消息标识
|
||||
* @param {*} v 消息版本
|
||||
*
|
||||
* @returns 信令消息
|
||||
*/
|
||||
buildMessage(signal, body = {}, id, v) {
|
||||
if (!signal) {
|
||||
throw new Error("信令标识缺失");
|
||||
}
|
||||
const message = {
|
||||
header: {
|
||||
v: v || "1.0.0",
|
||||
id: id || this.buildId(),
|
||||
signal: signal,
|
||||
},
|
||||
body: body,
|
||||
};
|
||||
return message;
|
||||
},
|
||||
};
|
||||
|
||||
/**
|
||||
* 信令通道
|
||||
@@ -29,8 +69,6 @@ const signalChannel = {
|
||||
channel: null,
|
||||
// 地址
|
||||
address: null,
|
||||
// 请求回调
|
||||
callbackMapping: new Map(),
|
||||
// 心跳时间
|
||||
heartbeatTime: 30 * 1000,
|
||||
// 心跳定时器
|
||||
@@ -76,12 +114,11 @@ const signalChannel = {
|
||||
* 连接
|
||||
*
|
||||
* @param {*} address 地址
|
||||
* @param {*} callback 回调
|
||||
* @param {*} reconnection 是否重连
|
||||
*
|
||||
* @returns Promise
|
||||
*/
|
||||
async connect(address, callback, reconnection = true) {
|
||||
async connect(address, reconnection = true) {
|
||||
const self = this;
|
||||
if (self.channel && self.channel.readyState === WebSocket.OPEN) {
|
||||
return new Promise((resolve, reject) => {
|
||||
@@ -89,7 +126,6 @@ const signalChannel = {
|
||||
});
|
||||
}
|
||||
self.address = address;
|
||||
self.callback = callback;
|
||||
self.reconnection = reconnection;
|
||||
return new Promise((resolve, reject) => {
|
||||
console.debug("连接信令通道:", self.address);
|
||||
@@ -132,36 +168,12 @@ const signalChannel = {
|
||||
}
|
||||
// 不要失败回调
|
||||
};
|
||||
/**
|
||||
* 回调策略:
|
||||
* 1. 如果注册请求回调,同时执行结果返回true不再执行后面所有回调。
|
||||
* 2. 执行前置回调
|
||||
* 3. 如果注册全局回调,同时执行结果返回true不再执行后面所有回调。
|
||||
* 3. 执行后置回调
|
||||
*/
|
||||
self.channel.onmessage = async function (e) {
|
||||
console.debug("信令通道消息:", e.data);
|
||||
let done = false;
|
||||
const message = JSON.parse(e.data);
|
||||
// 请求回调
|
||||
if (self.callbackMapping.has(message.header.id)) {
|
||||
try {
|
||||
done = self.callbackMapping.get(message.header.id)(message);
|
||||
} finally {
|
||||
self.callbackMapping.delete(message.header.id);
|
||||
}
|
||||
}
|
||||
// 前置回调
|
||||
if (!done) {
|
||||
await self.taoyao.preCallback(message);
|
||||
}
|
||||
// 全局回调
|
||||
if (!done && self.callback) {
|
||||
done = await self.taoyao.callback(message);
|
||||
}
|
||||
// 后置回调
|
||||
if (!done) {
|
||||
await self.taoyao.postCallback(message);
|
||||
try {
|
||||
self.taoyao.on(JSON.parse(e.data));
|
||||
} catch (error) {
|
||||
console.error("处理信令消息异常:", message, error);
|
||||
}
|
||||
};
|
||||
});
|
||||
@@ -184,7 +196,7 @@ const signalChannel = {
|
||||
// 定时重连
|
||||
self.reconnectTimer = setTimeout(function () {
|
||||
console.info("信令通道重连:", self.address);
|
||||
self.connect(self.address, self.callback, self.reconnection);
|
||||
self.connect(self.address, self.reconnection);
|
||||
self.lockReconnect = false;
|
||||
}, self.connectionTimeout);
|
||||
self.connectionTimeout = Math.min(
|
||||
@@ -196,54 +208,15 @@ const signalChannel = {
|
||||
* 异步请求
|
||||
*
|
||||
* @param {*} message 消息
|
||||
* @param {*} callback 回调
|
||||
*/
|
||||
push(message, callback) {
|
||||
const self = this;
|
||||
// 注册回调
|
||||
if (callback) {
|
||||
self.callbackMapping.set(message.header.id, callback);
|
||||
}
|
||||
push(message, callback) {
|
||||
// 发送消息
|
||||
try {
|
||||
self.channel.send(JSON.stringify(message));
|
||||
signalChannel.channel.send(JSON.stringify(message));
|
||||
} catch (error) {
|
||||
console.error("推送消息异常:", message, error);
|
||||
console.error("异步请求异常:", message, error);
|
||||
}
|
||||
},
|
||||
/**
|
||||
* 同步请求
|
||||
*
|
||||
* @param {*} message 消息
|
||||
*
|
||||
* @returns Promise
|
||||
*/
|
||||
async request(message) {
|
||||
const self = this;
|
||||
return new Promise((resolve, reject) => {
|
||||
let done = false;
|
||||
// 注册回调
|
||||
self.callbackMapping.set(message.header.id, (response) => {
|
||||
resolve(response);
|
||||
done = true;
|
||||
// 返回true不要继续执行回调
|
||||
return true;
|
||||
});
|
||||
// 发送消息
|
||||
try {
|
||||
self.channel.send(JSON.stringify(message));
|
||||
} catch (error) {
|
||||
console.error("请求消息异常:", message, error);
|
||||
}
|
||||
// 设置超时
|
||||
setTimeout(() => {
|
||||
if (!done) {
|
||||
self.callbackMapping.delete(message.header.id);
|
||||
reject("请求超时", message);
|
||||
}
|
||||
}, 5000);
|
||||
});
|
||||
},
|
||||
/**
|
||||
* 关闭通道
|
||||
*/
|
||||
@@ -276,16 +249,14 @@ class Taoyao {
|
||||
callback;
|
||||
// 媒体回调
|
||||
callbackMedia;
|
||||
// 请求回调
|
||||
callbackMapping = new Map();
|
||||
// 音频媒体配置
|
||||
audio;
|
||||
// 视频媒体配置
|
||||
video;
|
||||
// WebRTC配置
|
||||
webrtc;
|
||||
// 发送信令
|
||||
push;
|
||||
// 请求信令
|
||||
request;
|
||||
// 信令通道
|
||||
signalChannel;
|
||||
// 发送媒体通道
|
||||
@@ -306,7 +277,7 @@ class Taoyao {
|
||||
forceVP9;
|
||||
// 强制使用H264
|
||||
forceH264;
|
||||
//
|
||||
// 同时上送多种质量媒体
|
||||
useSimulcast;
|
||||
// 是否生产数据
|
||||
dataProduce;
|
||||
@@ -367,17 +338,89 @@ class Taoyao {
|
||||
self.callbackMedia = callbackMedia;
|
||||
self.signalChannel = signalChannel;
|
||||
signalChannel.taoyao = self;
|
||||
// 不能直接this.push = this.signalChannel.push这样导致this对象错误
|
||||
self.push = function (data, pushCallback) {
|
||||
self.signalChannel.push(data, pushCallback);
|
||||
};
|
||||
self.request = async function (data) {
|
||||
return await self.signalChannel.request(data);
|
||||
};
|
||||
return self.signalChannel.connect(
|
||||
`wss://${self.host}:${self.port}/websocket.signal`,
|
||||
callback
|
||||
);
|
||||
return self.signalChannel.connect(`wss://${self.host}:${self.port}/websocket.signal`);
|
||||
}
|
||||
/**
|
||||
* 异步请求
|
||||
*
|
||||
* @param {*} message 消息
|
||||
* @param {*} callback 回调
|
||||
*/
|
||||
push(message, callback) {
|
||||
const me = this;
|
||||
// 请求回调
|
||||
if (callback) {
|
||||
me.callbackMapping.set(message.header.id, callback);
|
||||
}
|
||||
// 发送消息
|
||||
try {
|
||||
signalChannel.channel.send(JSON.stringify(message));
|
||||
} catch (error) {
|
||||
console.error("异步请求异常:", message, error);
|
||||
}
|
||||
}
|
||||
/**
|
||||
* 同步请求
|
||||
*
|
||||
* @param {*} message 消息
|
||||
*
|
||||
* @returns Promise
|
||||
*/
|
||||
async request(message) {
|
||||
const me = this;
|
||||
return new Promise((resolve, reject) => {
|
||||
let done = false;
|
||||
// 请求回调
|
||||
me.callbackMapping.set(message.header.id, (response) => {
|
||||
resolve(response);
|
||||
done = true;
|
||||
return true;
|
||||
});
|
||||
// 发送消息
|
||||
try {
|
||||
signalChannel.channel.send(JSON.stringify(message));
|
||||
} catch (error) {
|
||||
reject("同步请求异常", error);
|
||||
}
|
||||
// 设置超时
|
||||
setTimeout(() => {
|
||||
if (!done) {
|
||||
me.callbackMapping.delete(message.header.id);
|
||||
reject("请求超时", message);
|
||||
}
|
||||
}, 5000);
|
||||
});
|
||||
}
|
||||
/**
|
||||
* 回调策略:
|
||||
* 1. 如果注册请求回调,同时执行结果返回true不再执行后面所有回调。
|
||||
* 2. 执行前置回调
|
||||
* 3. 如果注册全局回调,同时执行结果返回true不再执行后面所有回调。
|
||||
* 4. 执行后置回调
|
||||
*/
|
||||
async on(message) {
|
||||
const me = this;
|
||||
let done = false;
|
||||
// 请求回调
|
||||
if (me.callbackMapping.has(message.header.id)) {
|
||||
try {
|
||||
done = me.callbackMapping.get(message.header.id)(message);
|
||||
} finally {
|
||||
me.callbackMapping.delete(message.header.id);
|
||||
}
|
||||
}
|
||||
// 前置回调
|
||||
if (!done) {
|
||||
await me.preCallback(message);
|
||||
}
|
||||
// 全局回调
|
||||
if (!done && me.callback) {
|
||||
done = await me.callback(message);
|
||||
}
|
||||
// 后置回调
|
||||
if (!done) {
|
||||
await me.postCallback(message);
|
||||
}
|
||||
}
|
||||
/**
|
||||
* 前置回调
|
||||
@@ -391,7 +434,7 @@ class Taoyao {
|
||||
self.defaultClientConfig(message);
|
||||
break;
|
||||
case "client::register":
|
||||
console.info("终端注册成功");
|
||||
protocol.clientIndex = message.body.index;
|
||||
break;
|
||||
case "media::consume":
|
||||
await self.consumeMedia(message);
|
||||
@@ -918,9 +961,9 @@ class Taoyao {
|
||||
(this.forceVP9 && codec) ||
|
||||
firstVideoCodec.mimeType.toLowerCase() === "video/vp9"
|
||||
) {
|
||||
encodings = WEBCAM_KSVC_ENCODINGS;
|
||||
encodings = ksvcEncodings;
|
||||
} else {
|
||||
encodings = WEBCAM_SIMULCAST_ENCODINGS;
|
||||
encodings = simulcastEncodings;
|
||||
}
|
||||
}
|
||||
this.videoProducer = await this.sendTransport.produce({
|
||||
|
||||
@@ -1,12 +1,17 @@
|
||||
import { defineConfig } from "vite";
|
||||
import vue from "@vitejs/plugin-vue";
|
||||
import { fileURLToPath, URL } from "node:url";
|
||||
import fs from "node:fs";
|
||||
|
||||
export default defineConfig({
|
||||
plugins: [vue()],
|
||||
server: {
|
||||
port: 8443,
|
||||
host: "0.0.0.0",
|
||||
https: {
|
||||
cert: fs.readFileSync("src/certs/server.crt"),
|
||||
key: fs.readFileSync("src/certs/server.key"),
|
||||
},
|
||||
},
|
||||
resolve: {
|
||||
alias: {
|
||||
|
||||
Reference in New Issue
Block a user