diff --git a/.vscode/launch.json b/.vscode/launch.json
index bba5b23..69abab7 100644
--- a/.vscode/launch.json
+++ b/.vscode/launch.json
@@ -5,13 +5,14 @@
"version": "0.2.0",
"configurations": [
{
- "name": "Launch Package",
+ "name": "Launch Binary",
"type": "go",
"request": "launch",
- "mode": "auto",
- "program": "${workspaceFolder}/main",
+ "mode": "exec",
+ "program": "${workspaceFolder}/bin/srs-sip",
+ "cwd": "${workspaceFolder}/bin",
"env": {},
- "args": ["-sip-port", "5080", "-media-addr", "127.0.0.1:1985"]
+ "args": []
}
]
}
\ No newline at end of file
diff --git a/Dockerfile b/Dockerfile
new file mode 100644
index 0000000..e415477
--- /dev/null
+++ b/Dockerfile
@@ -0,0 +1,74 @@
+# 引入SRS
+FROM ossrs/srs:v6.0.155 AS srs
+
+# 前端构建阶段
+FROM node:20-slim AS frontend-builder
+WORKDIR /app/frontend
+COPY html/NextGB/package*.json ./
+RUN npm install
+COPY html/NextGB/ .
+RUN npm run build
+
+# 后端构建阶段
+FROM golang:1.23 AS backend-builder
+WORKDIR /app
+COPY go.mod go.sum ./
+RUN go mod download
+COPY . .
+RUN CGO_ENABLED=0 GOOS=linux go build -o /app/srs-sip main/main.go
+
+# 最终运行阶段
+FROM ubuntu:22.04
+WORKDIR /usr/local
+
+# 设置时区
+ENV TZ=Asia/Shanghai
+RUN apt-get update && \
+ apt-get install -y ca-certificates tzdata supervisor && \
+ ln -fs /usr/share/zoneinfo/$TZ /etc/localtime && \
+ dpkg-reconfigure -f noninteractive tzdata && \
+ apt-get clean && \
+ rm -rf /var/lib/apt/lists/*
+
+# 复制SRS
+COPY --from=srs /usr/local/srs /usr/local/srs
+COPY conf/srs.conf /usr/local/srs/conf/
+
+# 复制前端构建产物到html目录
+COPY --from=frontend-builder /app/frontend/dist /usr/local/srs-sip/html
+
+# 复制后端构建产物
+COPY --from=backend-builder /app/srs-sip /usr/local/srs-sip/
+COPY conf/config.yaml /usr/local/srs-sip/
+
+# 创建supervisor配置
+RUN mkdir -p /etc/supervisor/conf.d
+RUN echo "[supervisord]\n\
+nodaemon=true\n\
+user=root\n\
+logfile=/dev/stdout\n\
+logfile_maxbytes=0\n\
+\n\
+[program:srs]\n\
+command=/usr/local/srs/objs/srs -c /usr/local/srs/conf/srs.conf\n\
+directory=/usr/local/srs\n\
+autostart=true\n\
+autorestart=true\n\
+stdout_logfile=/dev/stdout\n\
+stdout_logfile_maxbytes=0\n\
+stderr_logfile=/dev/stderr\n\
+stderr_logfile_maxbytes=0\n\
+\n\
+[program:srs-sip]\n\
+command=/usr/local/srs-sip/srs-sip\n\
+directory=/usr/local/srs-sip\n\
+autostart=true\n\
+autorestart=true\n\
+stdout_logfile=/dev/stdout\n\
+stdout_logfile_maxbytes=0\n\
+stderr_logfile=/dev/stderr\n\
+stderr_logfile_maxbytes=0" > /etc/supervisor/conf.d/supervisord.conf
+
+EXPOSE 1935 5060 8025 9000 5060/udp 8000/udp
+
+CMD ["/usr/bin/supervisord", "-c", "/etc/supervisor/conf.d/supervisord.conf"]
\ No newline at end of file
diff --git a/Makefile b/Makefile
index 4da9869..5a95ff2 100644
--- a/Makefile
+++ b/Makefile
@@ -2,6 +2,7 @@ GOCMD=go
GOBUILD=$(GOCMD) build
BINARY_NAME=bin/srs-sip
MAIN_PATH=main/main.go
+VUE_DIR=html/NextGB
default: build
@@ -10,6 +11,8 @@ build:
clean:
rm -f $(BINARY_NAME)
+ rm -rf $(VUE_DIR)/dist
+ rm -rf $(VUE_DIR)/node_modules
run:
$(GOBUILD) -o $(BINARY_NAME) $(MAIN_PATH)
@@ -19,4 +22,15 @@ install:
$(GOBUILD) -o $(BINARY_NAME) $(MAIN_PATH)
mv $(BINARY_NAME) /usr/local/bin
-.PHONY: clean
+vue-install:
+ cd $(VUE_DIR) && npm install
+
+vue-build:
+ cd $(VUE_DIR) && npm run build
+
+vue-dev:
+ cd $(VUE_DIR) && npm run dev
+
+all: build vue-build
+
+.PHONY: clean vue-install vue-build vue-dev all
diff --git a/README.md b/README.md
index 373cfe2..dfe36d5 100644
--- a/README.md
+++ b/README.md
@@ -3,34 +3,31 @@
## Usage
Pre-requisites:
-- Go 1.20+ is installed
-- GOPATH/bin is in your PATH
+- Go 1.23+
+- Node 20+
Then run
```
git clone https://github.com/ossrs/srs-sip
cd srs-sip
-./bootstrap.sh
-mage
+./build.sh
```
-If you are on a Unix-like system, you can also run the following command.
+If on Windows
```
-make
+./build.bat
```
Run the program:
```
-./bin/srs-sip -sip-port 5060 -media-addr 127.0.0.1:1985 -api-port 2020 -http-server-port 8888
+./bin/srs-sip
```
-- `sip-port` : the SIP port, this program listen on, for device register with gb28181
-- `media-addr` : the API address for SRS, typically on port 1985, used to send HTTP requests to "/gb/v1/publish"
-- `api-port`: The API server port, used to send HTTP requests, for example "/srs-sip/v1/channels"
-- `http-server-port`: The demo web server.
-
-Access http://localhost:8888 in web browser.
+Use docker
+```
+docker run -id -p 1985:1985 -p 2025:2025 -p 5060:5060 -p 8025:8025 -p 9000:9000 -p 5060:5060/udp -p 8000:8000/udp --name srs-sip --env CANDIDATE=your_ip xiaoniu008/srs-sip:alpha
+```
## Sequence
diff --git a/bootstrap.sh b/bootstrap.sh
deleted file mode 100755
index 3c0d240..0000000
--- a/bootstrap.sh
+++ /dev/null
@@ -1,49 +0,0 @@
-add_gopath_to_path() {
- GOPATH=$(go env GOPATH)
- # Check if GOPATH is set
- if [ -z "$GOPATH" ]; then
- echo "GOPATH is not set."
- return 1
- fi
-
- # Check if $GOPATH/bin is already in ~/.bashrc
- if grep -q "$GOPATH/bin" ~/.bashrc; then
- echo "$GOPATH/bin is already in PATH."
- return 0
- fi
-
- # Add $GOPATH/bin to PATH
- echo "export PATH=\$PATH:$GOPATH/bin" >> ~/.bashrc
- source ~/.bashrc
-
- echo "$GOPATH/bin has been added to PATH."
-}
-
-
-if ! command -v mage &> /dev/null
-then
- pushd /tmp
-
- OS_IS_LINUX=$(uname -s |grep -q Linux && echo YES)
- if [ "$OS_IS_LINUX" == "YES" ]; then
- add_gopath_to_path
- if [ $? -eq 1 ]; then
- echo "error: Failed to add $GOPATH/bin to PATH."
- exit 1
- fi
- fi
-
- git clone https://github.com/magefile/mage
- cd mage
- go run bootstrap.go
- rm -rf /tmp/mage
- popd
-fi
-
-if ! command -v mage &> /dev/null
-then
- echo "error: Ensure `go env GOPATH`/bin is in your \$PATH"
- exit 1
-fi
-
-go mod download
\ No newline at end of file
diff --git a/build.bat b/build.bat
new file mode 100644
index 0000000..d428693
--- /dev/null
+++ b/build.bat
@@ -0,0 +1,137 @@
+@echo off
+setlocal
+
+set BINARY_NAME=bin\srs-sip.exe
+set MAIN_PATH=main\main.go
+set VUE_DIR=html\NextGB
+set CONFIG_FILE=conf\config.yaml
+
+if "%1"=="" goto all
+if "%1"=="build" goto build
+if "%1"=="clean" goto clean
+if "%1"=="run" goto run
+if "%1"=="vue-install" goto vue-install
+if "%1"=="vue-build" goto vue-build
+if "%1"=="vue-dev" goto vue-dev
+if "%1"=="all" goto all
+
+:build
+echo Building Go binary...
+if not exist "bin" mkdir bin
+go build -o %BINARY_NAME% %MAIN_PATH%
+
+echo Copying config file...
+if exist "%CONFIG_FILE%" (
+ mkdir "bin\%~dp0%CONFIG_FILE%" 2>nul
+ xcopy /s /i /y "%CONFIG_FILE%" "bin\%~dp0%CONFIG_FILE%\"
+ echo Config file copied to bin\%~dp0%CONFIG_FILE%
+) else (
+ echo Warning: %CONFIG_FILE% not found
+)
+goto :eof
+
+:clean
+echo Cleaning...
+if exist %BINARY_NAME% del /F /Q %BINARY_NAME%
+if exist %VUE_DIR%\dist rd /S /Q %VUE_DIR%\dist
+if exist %VUE_DIR%\node_modules rd /S /Q %VUE_DIR%\node_modules
+if exist bin\html rd /S /Q bin\html
+if exist bin\%CONFIG_FILE% del /F /Q bin\%CONFIG_FILE%
+goto :eof
+
+:run
+echo Running application...
+go build -o %BINARY_NAME% %MAIN_PATH%
+%BINARY_NAME%
+goto :eof
+
+:vue-install
+echo Installing Vue dependencies...
+cd %VUE_DIR%
+call npm install
+cd ..\..
+goto :eof
+
+:vue-build
+echo Building Vue project...
+if not exist "%VUE_DIR%" (
+ echo Error: Vue directory not found at %VUE_DIR%
+ goto :eof
+)
+
+rem Check Node.js version
+where node >nul 2>nul
+if errorlevel 1 (
+ echo Error: Node.js is not installed
+ goto :eof
+)
+
+for /f "tokens=1,2,3 delims=." %%a in ('node -v') do (
+ set NODE_MAJOR=%%a
+)
+set NODE_MAJOR=%NODE_MAJOR:~1%
+if %NODE_MAJOR% LSS 17 (
+ echo Error: Node.js version 17 or higher is required ^(current version: %NODE_MAJOR%^)
+ echo Please upgrade Node.js using the official installer or nvm-windows
+ goto :eof
+)
+
+pushd %VUE_DIR%
+echo Current directory: %CD%
+if not exist "package.json" (
+ echo Error: package.json not found in %VUE_DIR%
+ popd
+ goto :eof
+)
+
+rem Check if node_modules exists and install dependencies if needed
+if not exist "node_modules" (
+ echo Node modules not found, installing dependencies...
+ call npm install
+ if errorlevel 1 (
+ echo Error: Failed to install dependencies
+ popd
+ goto :eof
+ )
+)
+
+echo Running npm run build...
+call npm run build
+if errorlevel 1 (
+ echo Error: Vue build failed
+ popd
+ goto :eof
+)
+popd
+echo Vue build completed successfully
+
+echo Copying dist files to bin directory...
+if exist bin\html rd /S /Q bin\html
+if not exist bin mkdir bin
+if not exist "%VUE_DIR%\dist" (
+ echo Error: Vue dist directory not found at %VUE_DIR%\dist
+ goto :eof
+)
+robocopy "%VUE_DIR%\dist" "bin\html" /E /NFL /NDL /NJH /NJS /nc /ns /np
+if errorlevel 8 (
+ echo Error copying files
+) else (
+ echo Vue dist files successfully copied to bin\html
+)
+goto :eof
+
+:vue-dev
+echo Starting Vue development server...
+cd %VUE_DIR%
+call npm run dev
+cd ..\..
+goto :eof
+
+:all
+echo Building entire project...
+call :build
+call :vue-build
+echo.
+echo Press any key to exit...
+pause>nul
+goto :eof
\ No newline at end of file
diff --git a/build.sh b/build.sh
new file mode 100755
index 0000000..088b5f4
--- /dev/null
+++ b/build.sh
@@ -0,0 +1,167 @@
+#!/bin/bash
+
+BINARY_NAME="bin/srs-sip"
+MAIN_PATH="main/main.go"
+VUE_DIR="html/NextGB"
+CONFIG_FILE="conf/config.yaml"
+
+# 检测操作系统类型
+case "$(uname -s)" in
+ Darwin*)
+ echo "Mac OS X detected"
+ ;;
+ Linux*)
+ echo "Linux detected"
+ ;;
+ *)
+ echo "Unknown operating system"
+ exit 1
+ ;;
+esac
+
+build() {
+ echo "Building Go binary..."
+ mkdir -p bin
+ go build -o ${BINARY_NAME} ${MAIN_PATH}
+
+ echo "Copying config file..."
+ if [ -f "${CONFIG_FILE}" ]; then
+ mkdir -p "bin/$(dirname ${CONFIG_FILE})"
+ cp -a "${CONFIG_FILE}" "bin/$(dirname ${CONFIG_FILE})/"
+ echo "Config file copied to bin/$(dirname ${CONFIG_FILE})/"
+ else
+ echo "Warning: ${CONFIG_FILE} not found"
+ fi
+}
+
+clean() {
+ echo "Cleaning..."
+ rm -rf ${BINARY_NAME}
+ rm -rf ${VUE_DIR}/dist
+ rm -rf ${VUE_DIR}/node_modules
+ rm -rf bin/html
+ rm -rf bin/${CONFIG_FILE}
+}
+
+run() {
+ echo "Running application..."
+ go build -o ${BINARY_NAME} ${MAIN_PATH}
+ ./${BINARY_NAME}
+}
+
+vue_install() {
+ echo "Installing Vue dependencies..."
+ cd ${VUE_DIR}
+ npm install
+ cd ../..
+}
+
+vue_build() {
+ echo "Building Vue project..."
+ if [ ! -d "${VUE_DIR}" ]; then
+ echo "Error: Vue directory not found at ${VUE_DIR}"
+ return 1
+ fi
+
+ # Check Node.js version
+ if ! command -v node &> /dev/null; then
+ echo "Error: Node.js is not installed"
+ return 1
+ fi
+
+ NODE_VERSION=$(node -v | cut -d "v" -f 2)
+ NODE_MAJOR_VERSION=$(echo $NODE_VERSION | cut -d "." -f 1)
+ if [ "$NODE_MAJOR_VERSION" -lt 17 ]; then
+ echo "Error: Node.js version 17 or higher is required (current version: $NODE_VERSION)"
+ echo "Please upgrade Node.js using your package manager or nvm"
+ return 1
+ fi
+
+ pushd ${VUE_DIR} > /dev/null
+ echo "Current directory: $(pwd)"
+
+ if [ ! -f "package.json" ]; then
+ echo "Error: package.json not found in ${VUE_DIR}"
+ popd > /dev/null
+ return 1
+ fi
+
+ # Check if node_modules exists and install dependencies if needed
+ if [ ! -d "node_modules" ] || [ ! -f "node_modules/.package-lock.json" ]; then
+ echo "Node modules not found or incomplete, installing dependencies..."
+ npm install
+ if [ $? -ne 0 ]; then
+ echo "Error: Failed to install dependencies"
+ popd > /dev/null
+ return 1
+ fi
+ fi
+
+ echo "Running npm run build..."
+ npm run build
+ if [ $? -ne 0 ]; then
+ echo "Error: Vue build failed"
+ popd > /dev/null
+ return 1
+ fi
+ popd > /dev/null
+ echo "Vue build completed successfully"
+
+ echo "Copying dist files to bin directory..."
+ rm -rf bin/html
+ mkdir -p bin
+ if [ ! -d "${VUE_DIR}/dist" ]; then
+ echo "Error: Vue dist directory not found at ${VUE_DIR}/dist"
+ return 1
+ fi
+ cp -r "${VUE_DIR}/dist" "bin/html"
+ if [ $? -eq 0 ]; then
+ echo "Vue dist files successfully copied to bin/html"
+ else
+ echo "Error copying files"
+ return 1
+ fi
+}
+
+vue_dev() {
+ echo "Starting Vue development server..."
+ cd ${VUE_DIR}
+ npm run dev
+ cd ../..
+}
+
+build_all() {
+ clean
+ build
+ vue_build
+}
+
+# 根据命令行参数执行相应的功能
+case "$1" in
+ "build")
+ build
+ ;;
+ "clean")
+ clean
+ ;;
+ "run")
+ run
+ ;;
+ "vue-install")
+ vue_install
+ ;;
+ "vue-build")
+ vue_build
+ ;;
+ "vue-dev")
+ vue_dev
+ ;;
+ "all"|"")
+ build_all
+ ;;
+ *)
+ echo "Unknown command: $1"
+ echo "Usage: $0 {build|clean|run|vue-install|vue-build|vue-dev|all}"
+ exit 1
+ ;;
+esac
\ No newline at end of file
diff --git a/conf/config.yaml b/conf/config.yaml
new file mode 100644
index 0000000..ca75497
--- /dev/null
+++ b/conf/config.yaml
@@ -0,0 +1,18 @@
+# 通用配置
+common:
+ log-level: "info"
+
+# GB28181配置
+gb28181:
+ serial: "34020000002000000001"
+ realm: "3402000000"
+ host: "0.0.0.0"
+ port: 5060
+ auth:
+ enable: false
+ password: "123456"
+
+# HTTP服务配置
+http:
+ listen: 8025
+ dir: ./html
diff --git a/conf/srs.conf b/conf/srs.conf
new file mode 100644
index 0000000..d848643
--- /dev/null
+++ b/conf/srs.conf
@@ -0,0 +1,60 @@
+listen 1935;
+max_connections 1000;
+# For docker, please use docker logs to manage the logs of SRS.
+# See https://docs.docker.com/config/containers/logging/
+srs_log_tank console;
+daemon off;
+disable_daemon_for_docker off;
+http_api {
+ enabled on;
+ listen 1985;
+ raw_api {
+ enabled on;
+ allow_reload on;
+ }
+}
+http_server {
+ enabled on;
+ listen 8080;
+ dir ./objs/nginx/html;
+}
+
+stream_caster {
+ enabled on;
+ caster gb28181;
+ output rtmp://127.0.0.1/live/[stream];
+ listen 9000;
+ sip {
+ enabled off;
+ }
+}
+
+rtc_server {
+ enabled on;
+ listen 8000; # UDP port
+ # @see https://github.com/ossrs/srs/wiki/v4_CN_WebRTC#config-candidate
+ candidate $CANDIDATE;
+ # Disable for Oryx.
+ use_auto_detect_network_ip off;
+ api_as_candidates off;
+}
+
+vhost __defaultVhost__ {
+ http_remux {
+ enabled on;
+ mount [vhost]/[app]/[stream].flv;
+ }
+ rtc {
+ enabled on;
+ nack on;
+ twcc on;
+ stun_timeout 30;
+ dtls_role passive;
+ # @see https://github.com/ossrs/srs/wiki/v4_CN_WebRTC#rtmp-to-rtc
+ rtmp_to_rtc on;
+ keep_bframe off;
+ # @see https://github.com/ossrs/srs/wiki/v4_CN_WebRTC#rtc-to-rtmp
+ rtc_to_rtmp on;
+ pli_for_rtmp 6.0;
+ }
+}
\ No newline at end of file
diff --git a/go.mod b/go.mod
index 0ecff5b..7f627b9 100644
--- a/go.mod
+++ b/go.mod
@@ -1,41 +1,52 @@
module github.com/ossrs/srs-sip
-go 1.20
+go 1.23
require (
+ github.com/emiago/sipgo v0.22.1
github.com/gorilla/handlers v1.5.2
github.com/gorilla/mux v1.8.1
- github.com/magefile/mage v1.15.0
- github.com/ossrs/go-oryx-lib v0.0.9
- github.com/ossrs/srs-bench v0.0.0-20230906232735-aa029b492d0f
- github.com/rs/zerolog v1.32.0
- golang.org/x/net v0.10.0
+ github.com/ossrs/go-oryx-lib v0.0.10
+ github.com/ossrs/srs-bench v0.0.0-20240708032622-848f9300df56
+ github.com/rs/zerolog v1.33.0
+ golang.org/x/net v0.33.0
+ gopkg.in/yaml.v3 v3.0.1
+ modernc.org/sqlite v1.29.2
)
require (
- github.com/emiago/sipgo v0.22.1 // indirect
+ github.com/dustin/go-humanize v1.0.1 // indirect
github.com/felixge/httpsnoop v1.0.3 // indirect
github.com/ghettovoice/gosip v0.0.0-20220929080231-de8ba881be83 // indirect
github.com/gobwas/httphead v0.1.0 // indirect
github.com/gobwas/pool v0.2.1 // indirect
github.com/gobwas/ws v1.3.2 // indirect
github.com/google/uuid v1.6.0 // indirect
+ github.com/hashicorp/golang-lru/v2 v2.0.7 // indirect
github.com/icholy/digest v0.1.22 // indirect
- github.com/kr/text v0.2.0 // indirect
+ github.com/konsorten/go-windows-terminal-sequences v1.0.2 // indirect
github.com/mattn/go-colorable v0.1.13 // indirect
github.com/mattn/go-isatty v0.0.20 // indirect
github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b // indirect
+ github.com/ncruces/go-strftime v0.1.9 // indirect
github.com/pion/randutil v0.1.0 // indirect
github.com/pion/rtp v1.7.13 // indirect
github.com/pion/webrtc/v3 v3.2.9 // indirect
+ github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec // indirect
github.com/satori/go.uuid v1.2.1-0.20181028125025-b2ce2384e17b // indirect
- github.com/sirupsen/logrus v1.9.3 // indirect
+ github.com/sirupsen/logrus v1.4.2 // indirect
github.com/tevino/abool v0.0.0-20170917061928-9b9efcf221b5 // indirect
github.com/x-cray/logrus-prefixed-formatter v0.5.2 // indirect
github.com/yapingcat/gomedia/codec v0.0.0-20220617074658-94762898dc25 // indirect
github.com/yapingcat/gomedia/mpeg2 v0.0.0-20220617074658-94762898dc25 // indirect
- golang.org/x/crypto v0.9.0 // indirect
- golang.org/x/sys v0.19.0 // indirect
- golang.org/x/term v0.8.0 // indirect
- golang.org/x/text v0.9.0 // indirect
+ golang.org/x/crypto v0.31.0 // indirect
+ golang.org/x/sys v0.28.0 // indirect
+ golang.org/x/term v0.27.0 // indirect
+ golang.org/x/text v0.21.0 // indirect
+ modernc.org/gc/v3 v3.0.0-20240107210532-573471604cb6 // indirect
+ modernc.org/libc v1.41.0 // indirect
+ modernc.org/mathutil v1.6.0 // indirect
+ modernc.org/memory v1.7.2 // indirect
+ modernc.org/strutil v1.2.0 // indirect
+ modernc.org/token v1.1.0 // indirect
)
diff --git a/go.sum b/go.sum
index 2c293f0..86d45f4 100644
--- a/go.sum
+++ b/go.sum
@@ -1,11 +1,10 @@
github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc=
-github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/discoviking/fsm v0.0.0-20150126104936-f4a273feecca/go.mod h1:W+3LQaEkN8qAwwcw0KC546sUEnX86GIT8CcMLZC4mG0=
-github.com/emiago/sipgo v0.22.0 h1:GaQ51m26M9QnVBVY2aDJ/mXqq/BDfZ1A+nW7XgU/4Ts=
-github.com/emiago/sipgo v0.22.0/go.mod h1:a77FgPEEjJvfYWYfP3p53u+dNhWEMb/VGVS6guvBzx0=
+github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY=
+github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto=
github.com/emiago/sipgo v0.22.1 h1:imidktnLwl+fUKPAUUhxQJ4E3sDDaMBvoEvUOMJaSOI=
github.com/emiago/sipgo v0.22.1/go.mod h1:a77FgPEEjJvfYWYfP3p53u+dNhWEMb/VGVS6guvBzx0=
github.com/felixge/httpsnoop v1.0.3 h1:s/nj+GCswXYzN5v2DpNMuMQYe+0DDwt5WVCU6CWBdXk=
@@ -38,6 +37,7 @@ github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMyw
github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=
+github.com/google/pprof v0.0.0-20221118152302-e6195bd50e26 h1:Xim43kblpZXfIBQsbuBVKCudVG457BR2GZFIz3uw3hQ=
github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=
github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
@@ -45,17 +45,19 @@ github.com/gorilla/handlers v1.5.2 h1:cLTUSsNkgcwhgRqvCNmdbRWG0A3N4F+M2nWKdScwyE
github.com/gorilla/handlers v1.5.2/go.mod h1:dX+xVpaxdSw+q0Qek8SSsl3dfMk3jNddUkMzo0GtH0w=
github.com/gorilla/mux v1.8.1 h1:TuBL49tXwgrFYWhqrNgrUNEY92u81SPhu7sTdzQEiWY=
github.com/gorilla/mux v1.8.1/go.mod h1:AKf9I4AEqPTmMytcMc0KkNouC66V3BtZ4qD5fmWSiMQ=
+github.com/hashicorp/golang-lru/v2 v2.0.7 h1:a+bsQ5rvGLjzHuww6tVxozPZFVghXaHOwFs4luLUK2k=
+github.com/hashicorp/golang-lru/v2 v2.0.7/go.mod h1:QeFd9opnmA6QUJc5vARoKUSoFhyfM2/ZepoAG6RGpeM=
github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU=
github.com/icholy/digest v0.1.22 h1:dRIwCjtAcXch57ei+F0HSb5hmprL873+q7PoVojdMzM=
github.com/icholy/digest v0.1.22/go.mod h1:uLAeDdWKIWNFMH0wqbwchbTQOmJWhzSnL7zmqSPqEEc=
github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
+github.com/konsorten/go-windows-terminal-sequences v1.0.2 h1:DB17ag19krx9CFsz4o3enTrPXyIXCl+2iCXH/aMAp9s=
github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
+github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE=
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
-github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
-github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
github.com/magefile/mage v1.15.0 h1:BvGheCMAsG3bWUDbZ8AyXXpCNwU9u5CB6sM+HNb9HYg=
github.com/magefile/mage v1.15.0/go.mod h1:z5UZb/iS3GoOSn0JgWuiw7dxlurVYTu+/jHXqQg881A=
github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE=
@@ -66,8 +68,11 @@ github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/
github.com/mattn/go-isatty v0.0.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=
github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY=
github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=
+github.com/mattn/go-sqlite3 v1.14.16 h1:yOQRA0RpS5PFz/oikGwBEqvAWhWg5ufRz4ETLjwpU1Y=
github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b h1:j7+1HpAFS1zy5+Q4qx1fWh90gTKwiN4QCGoY9TWyyO4=
github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b/go.mod h1:01TrycV0kFyexm33Z7vhZRXopbI8J3TDReVlkTgMUxE=
+github.com/ncruces/go-strftime v0.1.9 h1:bY0MQC28UADQmHmaF5dgpLmImcShSi2kHU9XLdhx/f4=
+github.com/ncruces/go-strftime v0.1.9/go.mod h1:Fwc5htZGVVkseilnfgOVb9mKy6w1naJmn9CehxcKcls=
github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A=
github.com/nxadm/tail v1.4.5/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A=
github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE=
@@ -83,10 +88,10 @@ github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1y
github.com/onsi/gomega v1.10.4/go.mod h1:g/HbgYopi++010VEqkFgJHKC09uJiW9UkXvMUuKHUCQ=
github.com/onsi/gomega v1.17.0 h1:9Luw4uT5HTjHTN8+aNcSThgH1vdXnmdJ8xIfZ4wyTRE=
github.com/onsi/gomega v1.17.0/go.mod h1:HnhC7FXeEQY45zxNK3PPoIUhzk/80Xly9PcubAlGdZY=
-github.com/ossrs/go-oryx-lib v0.0.9 h1:piZkzit/1hqAcXP31/mvDEDpHVjCmBMmvzF3hN8hUuQ=
-github.com/ossrs/go-oryx-lib v0.0.9/go.mod h1:i2tH4TZBzAw5h+HwGrNOKvP/nmZgSQz0OEnLLdzcT/8=
-github.com/ossrs/srs-bench v0.0.0-20230906232735-aa029b492d0f h1:qvibrAolgLiEgbwtWbUy4Ts48sfURc7+7UaGxi2euyo=
-github.com/ossrs/srs-bench v0.0.0-20230906232735-aa029b492d0f/go.mod h1:aba1nViJ8Cd37kvuyhUrZ3kY1ASxFldaA8o1pLlZO6Y=
+github.com/ossrs/go-oryx-lib v0.0.10 h1:tyhe21d7UdMstxi0QGJACs2prIxWOw3eSEC8+cZHbQk=
+github.com/ossrs/go-oryx-lib v0.0.10/go.mod h1:nDTZDIADYNsuwnFflruKfB5ibQvQxPO2TQIFHJZsnvQ=
+github.com/ossrs/srs-bench v0.0.0-20240708032622-848f9300df56 h1:ppDTLPa/5g4u+XqKQmf7urr+Kndk8KOxcsRaSqW0fJE=
+github.com/ossrs/srs-bench v0.0.0-20240708032622-848f9300df56/go.mod h1:It9LsTwcB6q9HCPA5pO9ri70wZfZm4GFHpdxwydnktI=
github.com/pion/datachannel v1.5.5/go.mod h1:iMz+lECmfdCMqFRhXhcA/219B0SQlbpoR2V118yimL0=
github.com/pion/dtls/v2 v2.2.7/go.mod h1:8WiMkebSHFD0T+dIU+UeBaoV7kDhOW5oDCzZ7WZ/F9s=
github.com/pion/ice/v2 v2.3.6/go.mod h1:9/TzKDRwBVAPsC+YOrKH/e3xDrubeTRACU9/sHQarsU=
@@ -116,16 +121,17 @@ github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINE
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
+github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec h1:W09IVJc94icq4NjY3clb7Lk8O1qJ8BdBEF8z0ibU0rE=
+github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo=
github.com/rogpeppe/go-internal v1.11.0 h1:cWPaGQEPrBb5/AsnsZesgZZ9yb1OQ+GOISoDNXVBh4M=
github.com/rs/xid v1.5.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg=
-github.com/rs/zerolog v1.32.0 h1:keLypqrlIjaFsbmJOBdB/qvyF8KEtCWHwobLp5l/mQ0=
-github.com/rs/zerolog v1.32.0/go.mod h1:/7mN4D5sKwJLZQ2b/znpjC3/GQWY/xaDXUM0kKWRHss=
+github.com/rs/zerolog v1.33.0 h1:1cU2KZkvPxNyfgEmhHAz/1A9Bz+llsdYzklWFzgp0r8=
+github.com/rs/zerolog v1.33.0/go.mod h1:/7mN4D5sKwJLZQ2b/znpjC3/GQWY/xaDXUM0kKWRHss=
github.com/satori/go.uuid v1.2.1-0.20181028125025-b2ce2384e17b h1:gQZ0qzfKHQIybLANtM3mBXNUtOfsCFXeTsnBqCsx1KM=
github.com/satori/go.uuid v1.2.1-0.20181028125025-b2ce2384e17b/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0=
github.com/sclevine/agouti v3.0.0+incompatible/go.mod h1:b4WX9W9L1sfQKXeJf1mUTLZKJ48R1S7H23Ji7oFO5Bw=
+github.com/sirupsen/logrus v1.4.2 h1:SPIRibHv4MatM3XXNO2BJeFLZwZ2LvZgfQ5+UNI2im4=
github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE=
-github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ=
-github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ=
github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
@@ -133,7 +139,6 @@ github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSS
github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=
github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=
-github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
@@ -157,11 +162,13 @@ golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8U
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
golang.org/x/crypto v0.8.0/go.mod h1:mRqEX+O9/h5TFCrQhkgjo2yKi0yYA+9ecGkdQoHrywE=
-golang.org/x/crypto v0.9.0 h1:LF6fAI+IutBocDJ2OT0Q1g8plpYljMZ4+lty+dsqw3g=
golang.org/x/crypto v0.9.0/go.mod h1:yrmDGqONDYtNj3tH8X9dzUun2m2lzPa9ngI6/RUPGR0=
+golang.org/x/crypto v0.31.0 h1:ihbySMvVjLAeSH1IbfcRTkD/iNscyz8rGzjF/E5hV6U=
+golang.org/x/crypto v0.31.0/go.mod h1:kDsLvtWBEx7MV9tJOj9bnXsPbxwJQ6csT/x4KIN4Ssk=
golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=
golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
+golang.org/x/mod v0.17.0 h1:zY54UmvipHiNd+pm+m0x9KhZ9hl1/7QNMyxXbc6ICqA=
golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
@@ -177,13 +184,15 @@ golang.org/x/net v0.5.0/go.mod h1:DivGGAXEgPSlEBzxGzZI+ZLohi+xUj054jfeKui00ws=
golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=
golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc=
golang.org/x/net v0.9.0/go.mod h1:d48xBJpPfHeWQsugry2m+kC02ZBRGRgulfHnEXEuWns=
-golang.org/x/net v0.10.0 h1:X2//UzNDwYmtCLn7To6G58Wr6f5ahEAQgKNzv9Y951M=
golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg=
+golang.org/x/net v0.33.0 h1:74SYHlV8BIgHIFC/LrYkOGIwL19eTYXQ5wc6TBuO36I=
+golang.org/x/net v0.33.0/go.mod h1:HXLR5J+9DxmrqMwG9qjGCxZ+zKXxBru04zlTvWlWuN4=
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.10.0 h1:3NQrjDixjgGwUOCaF8w2+VYHv0Ve/vGYSbdkTa98gmQ=
golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
@@ -202,7 +211,6 @@ golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7w
golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
@@ -213,8 +221,8 @@ golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.19.0 h1:q5f1RH2jigJ1MoAWp2KTp3gm5zAGFUTarQZ5U386+4o=
-golang.org/x/sys v0.19.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
+golang.org/x/sys v0.28.0 h1:Fksou7UEQUWlKvIdsqzJmUmCX3cZuD2+P3XyyzwMhlA=
+golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
golang.org/x/term v0.1.0/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
@@ -222,8 +230,9 @@ golang.org/x/term v0.4.0/go.mod h1:9P2UbLfCdcvo3p/nzKvsmas4TnlujnuoV9hGgYzW1lQ=
golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k=
golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U=
golang.org/x/term v0.7.0/go.mod h1:P32HKFT3hSsZrRxla30E9HqToFYAQPCMs/zFMBUFqPY=
-golang.org/x/term v0.8.0 h1:n5xxQn2i3PC0yLAbjTpNT85q/Kgzcr2gIoX9OrJUols=
golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo=
+golang.org/x/term v0.27.0 h1:WP60Sv1nlK1T6SupCHbXzSaN0b9wUmsPoRS9b61A23Q=
+golang.org/x/term v0.27.0/go.mod h1:iMsnZpn0cago0GOrHO2+Y7u7JPn5AylBrcoWkElMTSM=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
@@ -233,14 +242,16 @@ golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
golang.org/x/text v0.6.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=
-golang.org/x/text v0.9.0 h1:2sjJmO8cDvYveuX97RDLsxlyUxLl+GHoLxBiRdHllBE=
golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=
+golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo=
+golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ=
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
golang.org/x/tools v0.0.0-20190624222133-a101b041ded4/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=
golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU=
+golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d h1:vU5i/LfpvrRCpgM/VPfJLg5KjxD3E+hfT1SH+d9zLwg=
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
@@ -269,3 +280,17 @@ gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
gotest.tools/v3 v3.0.2/go.mod h1:3SzNCllyD9/Y+b5r9JIKQ474KzkZyqLqEfYqMsX94Bk=
gotest.tools/v3 v3.5.0 h1:Ljk6PdHdOhAb5aDMWXjDLMMhph+BpztA4v1QdqEW2eY=
+modernc.org/gc/v3 v3.0.0-20240107210532-573471604cb6 h1:5D53IMaUuA5InSeMu9eJtlQXS2NxAhyWQvkKEgXZhHI=
+modernc.org/gc/v3 v3.0.0-20240107210532-573471604cb6/go.mod h1:Qz0X07sNOR1jWYCrJMEnbW/X55x206Q7Vt4mz6/wHp4=
+modernc.org/libc v1.41.0 h1:g9YAc6BkKlgORsUWj+JwqoB1wU3o4DE3bM3yvA3k+Gk=
+modernc.org/libc v1.41.0/go.mod h1:w0eszPsiXoOnoMJgrXjglgLuDy/bt5RR4y3QzUUeodY=
+modernc.org/mathutil v1.6.0 h1:fRe9+AmYlaej+64JsEEhoWuAYBkOtQiMEU7n/XgfYi4=
+modernc.org/mathutil v1.6.0/go.mod h1:Ui5Q9q1TR2gFm0AQRqQUaBWFLAhQpCwNcuhBOSedWPo=
+modernc.org/memory v1.7.2 h1:Klh90S215mmH8c9gO98QxQFsY+W451E8AnzjoE2ee1E=
+modernc.org/memory v1.7.2/go.mod h1:NO4NVCQy0N7ln+T9ngWqOQfi7ley4vpwvARR+Hjw95E=
+modernc.org/sqlite v1.29.2 h1:xgBSyA3gemwgP31PWFfFjtBorQNYpeypGdoSDjXhrgI=
+modernc.org/sqlite v1.29.2/go.mod h1:hG41jCYxOAOoO6BRK66AdRlmOcDzXf7qnwlwjUIOqa0=
+modernc.org/strutil v1.2.0 h1:agBi9dp1I+eOnxXeiZawM8F4LawKv4NzGWSaLfyeNZA=
+modernc.org/strutil v1.2.0/go.mod h1:/mdcBmfOibveCTBxUl5B5l6W+TTH1FXPLHZE6bTosX0=
+modernc.org/token v1.1.0 h1:Xl7Ap9dKaEs5kLoOQeQmPWevfnk/DM5qcLcYlA8ys6Y=
+modernc.org/token v1.1.0/go.mod h1:UGzOrNV1mAFSEB63lOFHIpNRUVMvYTc6yu1SMY/XTDM=
diff --git a/html/NextGB/.editorconfig b/html/NextGB/.editorconfig
new file mode 100644
index 0000000..ecea360
--- /dev/null
+++ b/html/NextGB/.editorconfig
@@ -0,0 +1,6 @@
+[*.{js,jsx,mjs,cjs,ts,tsx,mts,cts,vue}]
+charset = utf-8
+indent_size = 2
+indent_style = space
+insert_final_newline = true
+trim_trailing_whitespace = true
diff --git a/html/NextGB/.env b/html/NextGB/.env
new file mode 100644
index 0000000..1626ca8
--- /dev/null
+++ b/html/NextGB/.env
@@ -0,0 +1,2 @@
+VITE_APP_TITLE=NextGB
+VITE_APP_API_BASE_URL=
\ No newline at end of file
diff --git a/html/NextGB/.gitignore b/html/NextGB/.gitignore
new file mode 100644
index 0000000..8ee54e8
--- /dev/null
+++ b/html/NextGB/.gitignore
@@ -0,0 +1,30 @@
+# Logs
+logs
+*.log
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+pnpm-debug.log*
+lerna-debug.log*
+
+node_modules
+.DS_Store
+dist
+dist-ssr
+coverage
+*.local
+
+/cypress/videos/
+/cypress/screenshots/
+
+# Editor directories and files
+.vscode/*
+!.vscode/extensions.json
+.idea
+*.suo
+*.ntvs*
+*.njsproj
+*.sln
+*.sw?
+
+*.tsbuildinfo
diff --git a/html/NextGB/.prettierrc.json b/html/NextGB/.prettierrc.json
new file mode 100644
index 0000000..17a23d0
--- /dev/null
+++ b/html/NextGB/.prettierrc.json
@@ -0,0 +1,7 @@
+
+{
+ "$schema": "https://json.schemastore.org/prettierrc",
+ "semi": false,
+ "singleQuote": true,
+ "printWidth": 100
+}
diff --git a/html/NextGB/.vite/deps/_metadata.json b/html/NextGB/.vite/deps/_metadata.json
new file mode 100644
index 0000000..567e3df
--- /dev/null
+++ b/html/NextGB/.vite/deps/_metadata.json
@@ -0,0 +1,8 @@
+{
+ "hash": "706f8cd6",
+ "configHash": "1f32e48a",
+ "lockfileHash": "f28932da",
+ "browserHash": "b779d841",
+ "optimized": {},
+ "chunks": {}
+}
\ No newline at end of file
diff --git a/html/NextGB/.vite/deps/package.json b/html/NextGB/.vite/deps/package.json
new file mode 100644
index 0000000..3dbc1ca
--- /dev/null
+++ b/html/NextGB/.vite/deps/package.json
@@ -0,0 +1,3 @@
+{
+ "type": "module"
+}
diff --git a/html/NextGB/.vscode/extensions.json b/html/NextGB/.vscode/extensions.json
new file mode 100644
index 0000000..a06a8c6
--- /dev/null
+++ b/html/NextGB/.vscode/extensions.json
@@ -0,0 +1,9 @@
+{
+ "recommendations": [
+ "Vue.volar",
+ "vitest.explorer",
+ "dbaeumer.vscode-eslint",
+ "EditorConfig.EditorConfig",
+ "esbenp.prettier-vscode"
+ ]
+}
diff --git a/html/NextGB/README.md b/html/NextGB/README.md
new file mode 100644
index 0000000..610ec4e
--- /dev/null
+++ b/html/NextGB/README.md
@@ -0,0 +1,45 @@
+# NextGB
+
+This template should help get you started developing with Vue 3 in Vite.
+
+## Recommended IDE Setup
+
+[VSCode](https://code.visualstudio.com/) + [Volar](https://marketplace.visualstudio.com/items?itemName=Vue.volar) (and disable Vetur).
+
+## Type Support for `.vue` Imports in TS
+
+TypeScript cannot handle type information for `.vue` imports by default, so we replace the `tsc` CLI with `vue-tsc` for type checking. In editors, we need [Volar](https://marketplace.visualstudio.com/items?itemName=Vue.volar) to make the TypeScript language service aware of `.vue` types.
+
+## Customize configuration
+
+See [Vite Configuration Reference](https://vite.dev/config/).
+
+## Project Setup
+
+```sh
+npm install
+```
+
+### Compile and Hot-Reload for Development
+
+```sh
+npm run dev
+```
+
+### Type-Check, Compile and Minify for Production
+
+```sh
+npm run build
+```
+
+### Run Unit Tests with [Vitest](https://vitest.dev/)
+
+```sh
+npm run test:unit
+```
+
+### Lint with [ESLint](https://eslint.org/)
+
+```sh
+npm run lint
+```
diff --git a/html/NextGB/env.d.ts b/html/NextGB/env.d.ts
new file mode 100644
index 0000000..11f02fe
--- /dev/null
+++ b/html/NextGB/env.d.ts
@@ -0,0 +1 @@
+///
版本: {{ version }}
+0&&(q.setInitialMediaSettingsForType(t,W),K.addMediaInfosToBuffer(W,t,c));if(0===(u=u.filter((function(e){return!e.isEmbedded}))).length)return;if(t===a.a.IMAGE)return void(v=Z(R).create({streamInfo:W,adapter:P,baseURLController:e.baseURLController,timelineConverter:e.timelineConverter,debug:S,eventBus:w,events:l.a,dashConstants:o.a,dashMetrics:e.dashMetrics,segmentBaseController:e.segmentBaseController})).initialize();w.trigger(l.a.STREAM_INITIALIZING,{streamInfo:W,mediaInfo:f}),q.setInitialMediaSettingsForType(t,W);var m=function(t,n){var i=t&&t.length>0?t[0]:null,o=E.getModel(i?i.type:null),s=i?i.type:null,u=i?i.mimeType:null,l=i?i.isFragmented:null,c=j(R).create({streamInfo:W,type:s,mimeType:u,timelineConverter:F,adapter:P,manifestModel:C,mediaPlayerModel:D,fragmentModel:o,dashMetrics:e.dashMetrics,baseURLController:e.baseURLController,segmentBaseController:e.segmentBaseController,abrController:B,playbackController:G,mediaController:q,textController:K,errHandler:U,settings:X,boxParser:b,segmentBlacklistController:_});c.initialize(n,d,l),r.push(c);for(var f=0;fs&&(n=s-u),a=n;a>=0;a--){for(var f=!0,d=0;di&&(r=i):r=i;var a=t.length;if(a%2!=0)throw new TypeError("Invalid hex string");r>a/2&&(r=a/2);for(var o=0;oi)&&(n=i),e.length>0&&(n<0||t<0)||t>this.length)throw new RangeError("Attempt to write outside buffer bounds");r||(r="utf8");for(var a=!1;;)switch(r){case"hex":return v(this,e,t,n);case"utf8":case"utf-8":return _(this,e,t,n);case"ascii":return T(this,e,t,n);case"latin1":case"binary":return b(this,e,t,n);case"base64":return S(this,e,t,n);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return A(this,e,t,n);default:if(a)throw new TypeError("Unknown encoding: "+r);r=(""+r).toLowerCase(),a=!0}},u.prototype.toJSON=function(){return{type:"Buffer",data:Array.prototype.slice.call(this._arr||this,0)}};function w(e,t,n){var r="";n=Math.min(e.length,n);for(var i=t;i