Commit 05158aa59c56ad873dd9f76b03d1bd14cb4818db
Merge branch 'perf/env-var-parse' into 'main_dev'
perf: 优化环境变量解析&&新增变量控制GBT设备播放协议 See merge request yunteng/thingskit-view!259
Showing
9 changed files
with
90 additions
and
20 deletions
| @@ -12,3 +12,7 @@ VITE_GLOB_CONTENT_SECURITY_POLICY = false | @@ -12,3 +12,7 @@ VITE_GLOB_CONTENT_SECURITY_POLICY = false | ||
| 12 | 12 | ||
| 13 | # 公共路径 | 13 | # 公共路径 |
| 14 | VITE_GLOB_PUBLIC_PATH = /large-designer/ | 14 | VITE_GLOB_PUBLIC_PATH = /large-designer/ |
| 15 | + | ||
| 16 | +# Streaming media content security protocol | ||
| 17 | +VITE_GLOB_STREAM_MEDIA_CONTENT_SECURITY_PROTOCOL = false | ||
| 18 | + |
| @@ -11,3 +11,6 @@ VITE_GLOB_CONTENT_SECURITY_POLICY = false | @@ -11,3 +11,6 @@ VITE_GLOB_CONTENT_SECURITY_POLICY = false | ||
| 11 | 11 | ||
| 12 | # 公共路径 | 12 | # 公共路径 |
| 13 | VITE_GLOB_PUBLIC_PATH = /large-designer/ | 13 | VITE_GLOB_PUBLIC_PATH = /large-designer/ |
| 14 | + | ||
| 15 | +# Streaming media content security protocol | ||
| 16 | +VITE_GLOB_STREAM_MEDIA_CONTENT_SECURITY_PROTOCOL = false |
| @@ -4,6 +4,31 @@ import { Plugin } from "vite"; | @@ -4,6 +4,31 @@ import { Plugin } from "vite"; | ||
| 4 | import { GLOB_CONFIG_FILE_NAME } from "./const"; | 4 | import { GLOB_CONFIG_FILE_NAME } from "./const"; |
| 5 | import { getGlobalConfigName } from "./getGlobConfigName"; | 5 | import { getGlobalConfigName } from "./getGlobConfigName"; |
| 6 | 6 | ||
| 7 | + | ||
| 8 | +const stringToJSONParse = (string: string) => { | ||
| 9 | + try { | ||
| 10 | + return JSON.parse(string); | ||
| 11 | + } catch (error) { | ||
| 12 | + return string; | ||
| 13 | + } | ||
| 14 | +}; | ||
| 15 | + | ||
| 16 | +export function parseEnv(env: Record<string, string>) { | ||
| 17 | + const res: Record<string, string> = {}; | ||
| 18 | + | ||
| 19 | + Object.keys(env).forEach((key) => { | ||
| 20 | + try { | ||
| 21 | + const value = env[key]; | ||
| 22 | + res[key] = stringToJSONParse(value); | ||
| 23 | + } catch (err) { | ||
| 24 | + // eslint-disable-next-line no-console | ||
| 25 | + console.log(`env variable ${key} can't serialization!`); | ||
| 26 | + } | ||
| 27 | + }); | ||
| 28 | + | ||
| 29 | + return res; | ||
| 30 | +} | ||
| 31 | + | ||
| 7 | export function GenerateBuildConfig(viteEnv: Record<string, any>) { | 32 | export function GenerateBuildConfig(viteEnv: Record<string, any>) { |
| 8 | return { | 33 | return { |
| 9 | name: 'vite-plugin-generate-global-config', | 34 | name: 'vite-plugin-generate-global-config', |
| @@ -15,7 +40,7 @@ export function GenerateBuildConfig(viteEnv: Record<string, any>) { | @@ -15,7 +40,7 @@ export function GenerateBuildConfig(viteEnv: Record<string, any>) { | ||
| 15 | try { | 40 | try { |
| 16 | const windowConf = `window.${configName}`; | 41 | const windowConf = `window.${configName}`; |
| 17 | // Ensure that the variable will not be modified | 42 | // Ensure that the variable will not be modified |
| 18 | - const configStr = `${windowConf}=${JSON.stringify(config)}; | 43 | + const configStr = `${windowConf}=${JSON.stringify(parseEnv(config))}; |
| 19 | Object.freeze(${windowConf}); | 44 | Object.freeze(${windowConf}); |
| 20 | Object.defineProperty(window, "${configName}", { | 45 | Object.defineProperty(window, "${configName}", { |
| 21 | configurable: false, | 46 | configurable: false, |
| @@ -10,7 +10,8 @@ export const useGlobSetting = (): Readonly<GlobConfig> => { | @@ -10,7 +10,8 @@ export const useGlobSetting = (): Readonly<GlobConfig> => { | ||
| 10 | VITE_GLOB_UPLOAD_URL, | 10 | VITE_GLOB_UPLOAD_URL, |
| 11 | VITE_GLOB_WEB_SOCKET, | 11 | VITE_GLOB_WEB_SOCKET, |
| 12 | VITE_GLOB_CONTENT_SECURITY_POLICY, | 12 | VITE_GLOB_CONTENT_SECURITY_POLICY, |
| 13 | - VITE_GLOB_PUBLIC_PATH | 13 | + VITE_GLOB_PUBLIC_PATH, |
| 14 | + VITE_GLOB_STREAM_MEDIA_CONTENT_SECURITY_PROTOCOL | ||
| 14 | } = getAppEnvConfig(); | 15 | } = getAppEnvConfig(); |
| 15 | 16 | ||
| 16 | if (!/[a-zA-Z_]*/.test(VITE_GLOB_APP_SHORT_NAME)) { | 17 | if (!/[a-zA-Z_]*/.test(VITE_GLOB_APP_SHORT_NAME)) { |
| @@ -28,7 +29,8 @@ export const useGlobSetting = (): Readonly<GlobConfig> => { | @@ -28,7 +29,8 @@ export const useGlobSetting = (): Readonly<GlobConfig> => { | ||
| 28 | uploadUrl: VITE_GLOB_UPLOAD_URL, | 29 | uploadUrl: VITE_GLOB_UPLOAD_URL, |
| 29 | socketUrl: VITE_GLOB_WEB_SOCKET, | 30 | socketUrl: VITE_GLOB_WEB_SOCKET, |
| 30 | securityPolicy: VITE_GLOB_CONTENT_SECURITY_POLICY, | 31 | securityPolicy: VITE_GLOB_CONTENT_SECURITY_POLICY, |
| 31 | - publicPath: VITE_GLOB_PUBLIC_PATH | 32 | + publicPath: VITE_GLOB_PUBLIC_PATH, |
| 33 | + streamMediaContentSecurityProtocol: VITE_GLOB_STREAM_MEDIA_CONTENT_SECURITY_PROTOCOL | ||
| 32 | }; | 34 | }; |
| 33 | 35 | ||
| 34 | return glob as Readonly<GlobConfig>; | 36 | return glob as Readonly<GlobConfig>; |
| @@ -6,8 +6,7 @@ let initialFlag = false; | @@ -6,8 +6,7 @@ let initialFlag = false; | ||
| 6 | export function useWebSecurityPolicy() { | 6 | export function useWebSecurityPolicy() { |
| 7 | if (window && window.document && window.document.documentElement) { | 7 | if (window && window.document && window.document.documentElement) { |
| 8 | const { securityPolicy } = useGlobSetting(); | 8 | const { securityPolicy } = useGlobSetting(); |
| 9 | - const flag = isBoolean(securityPolicy) ? securityPolicy : securityPolicy === 'true' | ||
| 10 | - if (flag && !initialFlag) { | 9 | + if (securityPolicy && !initialFlag) { |
| 11 | const meta = document.createElement('meta'); | 10 | const meta = document.createElement('meta'); |
| 12 | meta.setAttribute('http-equiv', 'Content-Security-Policy'); | 11 | meta.setAttribute('http-equiv', 'Content-Security-Policy'); |
| 13 | meta.setAttribute('content', 'upgrade-insecure-requests'); | 12 | meta.setAttribute('content', 'upgrade-insecure-requests'); |
| @@ -2,11 +2,12 @@ import { PublicConfigClass } from '@/packages/public' | @@ -2,11 +2,12 @@ import { PublicConfigClass } from '@/packages/public' | ||
| 2 | import { CreateComponentType } from '@/packages/index.d' | 2 | import { CreateComponentType } from '@/packages/index.d' |
| 3 | import { SingleCameraConfig } from './index' | 3 | import { SingleCameraConfig } from './index' |
| 4 | import cloneDeep from 'lodash/cloneDeep' | 4 | import cloneDeep from 'lodash/cloneDeep' |
| 5 | -import {StreamType} from "@/components/Video/src/types"; | ||
| 6 | -import {useFingerprint} from "@/utils/external/useFingerprint"; | ||
| 7 | -import {getOpenFlvPlayUrl, getVideoControlStart} from "@/api/external/flvPlay"; | ||
| 8 | -import {getVideoUrl} from "@/api/external/common"; | ||
| 9 | -import {CameraRecord} from "@/api/external/common/model"; | 5 | +import { StreamType } from "@/components/Video/src/types"; |
| 6 | +import { useFingerprint } from "@/utils/external/useFingerprint"; | ||
| 7 | +import { getOpenFlvPlayUrl, getVideoControlStart } from "@/api/external/flvPlay"; | ||
| 8 | +import { getVideoUrl } from "@/api/external/common"; | ||
| 9 | +import { CameraRecord } from "@/api/external/common/model"; | ||
| 10 | +import { useGlobSetting } from '@/hooks/external/setting'; | ||
| 10 | 11 | ||
| 11 | export enum sourceTypeEnum { | 12 | export enum sourceTypeEnum { |
| 12 | CUSTOM = 'custom', | 13 | CUSTOM = 'custom', |
| @@ -89,7 +90,7 @@ export const isRtspProtocol = (url: string) => { | @@ -89,7 +90,7 @@ export const isRtspProtocol = (url: string) => { | ||
| 89 | }; | 90 | }; |
| 90 | 91 | ||
| 91 | export async function getPlayUrl( | 92 | export async function getPlayUrl( |
| 92 | - params: CameraRecord | 93 | + params: CameraRecord |
| 93 | ): Promise<{ url: string; type: StreamType } | undefined> { | 94 | ): Promise<{ url: string; type: StreamType } | undefined> { |
| 94 | const { accessMode } = params; | 95 | const { accessMode } = params; |
| 95 | if (accessMode === AccessMode.ManuallyEnter) { | 96 | if (accessMode === AccessMode.ManuallyEnter) { |
| @@ -106,18 +107,20 @@ export async function getPlayUrl( | @@ -106,18 +107,20 @@ export async function getPlayUrl( | ||
| 106 | } | 107 | } |
| 107 | } | 108 | } |
| 108 | } else if (accessMode === AccessMode.GBT28181) { | 109 | } else if (accessMode === AccessMode.GBT28181) { |
| 110 | + const { streamMediaContentSecurityProtocol } = useGlobSetting() | ||
| 111 | + console.log(useGlobSetting()) | ||
| 109 | const { deviceId, channelNo } = params?.params || {}; | 112 | const { deviceId, channelNo } = params?.params || {}; |
| 110 | const result = await getVideoControlStart({ channelId: channelNo!, deviceId: deviceId! }); | 113 | const result = await getVideoControlStart({ channelId: channelNo!, deviceId: deviceId! }); |
| 111 | - return { url: result.data.flv, type: 'flv' }; | 114 | + return { url: streamMediaContentSecurityProtocol ? result.data.https_flv : result.data.flv, type: 'flv' }; |
| 112 | } else { | 115 | } else { |
| 113 | const { id, playProtocol } = params; | 116 | const { id, playProtocol } = params; |
| 114 | const result = await getVideoUrl(id); | 117 | const result = await getVideoUrl(id); |
| 115 | const type: StreamType = | 118 | const type: StreamType = |
| 116 | - playProtocol === FluoriteMideaProtocolEnum.FLV | ||
| 117 | - ? 'flv' | ||
| 118 | - : playProtocol === FluoriteMideaProtocolEnum.HLS | ||
| 119 | - ? 'hls' | ||
| 120 | - : 'auto'; | 119 | + playProtocol === FluoriteMideaProtocolEnum.FLV |
| 120 | + ? 'flv' | ||
| 121 | + : playProtocol === FluoriteMideaProtocolEnum.HLS | ||
| 122 | + ? 'hls' | ||
| 123 | + : 'auto'; | ||
| 121 | return { url: result.data.url, type }; | 124 | return { url: result.data.url, type }; |
| 122 | } | 125 | } |
| 123 | } | 126 | } |
| @@ -4,6 +4,30 @@ import type { GlobEnvConfig } from '/#/external/config'; | @@ -4,6 +4,30 @@ import type { GlobEnvConfig } from '/#/external/config'; | ||
| 4 | import { getGlobalConfigName } from '../../../../build/external/vite/plugins/globConfig/getGlobConfigName'; | 4 | import { getGlobalConfigName } from '../../../../build/external/vite/plugins/globConfig/getGlobConfigName'; |
| 5 | import { ProjectRuntimeEnvEnum } from '@/enums/external/envEnum'; | 5 | import { ProjectRuntimeEnvEnum } from '@/enums/external/envEnum'; |
| 6 | 6 | ||
| 7 | +const stringToJSONParse = (string: string) => { | ||
| 8 | + try { | ||
| 9 | + return JSON.parse(string); | ||
| 10 | + } catch (error) { | ||
| 11 | + return string; | ||
| 12 | + } | ||
| 13 | +}; | ||
| 14 | + | ||
| 15 | +export function parseEnv(env: Record<string, string>) { | ||
| 16 | + const res: Record<string, string> = {}; | ||
| 17 | + | ||
| 18 | + Object.keys(env).forEach((key) => { | ||
| 19 | + try { | ||
| 20 | + const value = env[key]; | ||
| 21 | + res[key] = stringToJSONParse(value); | ||
| 22 | + } catch (err) { | ||
| 23 | + // eslint-disable-next-line no-console | ||
| 24 | + console.log(`env variable ${key} can't serialization!`); | ||
| 25 | + } | ||
| 26 | + }); | ||
| 27 | + | ||
| 28 | + return res; | ||
| 29 | +} | ||
| 30 | + | ||
| 7 | 31 | ||
| 8 | export function getCommonStoragePrefix() { | 32 | export function getCommonStoragePrefix() { |
| 9 | // const { VITE_GLOB_APP_SHORT_NAME } = getAppEnvConfig(); | 33 | // const { VITE_GLOB_APP_SHORT_NAME } = getAppEnvConfig(); |
| @@ -23,7 +47,7 @@ export function getAppEnvConfig() { | @@ -23,7 +47,7 @@ export function getAppEnvConfig() { | ||
| 23 | 47 | ||
| 24 | const ENV = (import.meta.env.DEV | 48 | const ENV = (import.meta.env.DEV |
| 25 | ? // Get the global configuration (the configuration will be extracted independently when packaging) | 49 | ? // Get the global configuration (the configuration will be extracted independently when packaging) |
| 26 | - (import.meta.env as unknown as GlobEnvConfig) | 50 | + (parseEnv(import.meta.env) as unknown as GlobEnvConfig) |
| 27 | : window[ENV_NAME as any]) as unknown as GlobEnvConfig; | 51 | : window[ENV_NAME as any]) as unknown as GlobEnvConfig; |
| 28 | 52 | ||
| 29 | const { | 53 | const { |
| @@ -35,7 +59,8 @@ export function getAppEnvConfig() { | @@ -35,7 +59,8 @@ export function getAppEnvConfig() { | ||
| 35 | VITE_GLOB_WEB_SOCKET, | 59 | VITE_GLOB_WEB_SOCKET, |
| 36 | VITE_GLOB_ALARM_NOTIFY_DURATION, | 60 | VITE_GLOB_ALARM_NOTIFY_DURATION, |
| 37 | VITE_GLOB_CONTENT_SECURITY_POLICY, | 61 | VITE_GLOB_CONTENT_SECURITY_POLICY, |
| 38 | - VITE_GLOB_PUBLIC_PATH | 62 | + VITE_GLOB_PUBLIC_PATH, |
| 63 | + VITE_GLOB_STREAM_MEDIA_CONTENT_SECURITY_PROTOCOL | ||
| 39 | } = ENV; | 64 | } = ENV; |
| 40 | 65 | ||
| 41 | if (!/^[a-zA-Z\_]*$/.test(VITE_GLOB_APP_SHORT_NAME)) { | 66 | if (!/^[a-zA-Z\_]*$/.test(VITE_GLOB_APP_SHORT_NAME)) { |
| @@ -53,7 +78,8 @@ export function getAppEnvConfig() { | @@ -53,7 +78,8 @@ export function getAppEnvConfig() { | ||
| 53 | VITE_GLOB_WEB_SOCKET, | 78 | VITE_GLOB_WEB_SOCKET, |
| 54 | VITE_GLOB_ALARM_NOTIFY_DURATION, | 79 | VITE_GLOB_ALARM_NOTIFY_DURATION, |
| 55 | VITE_GLOB_CONTENT_SECURITY_POLICY, | 80 | VITE_GLOB_CONTENT_SECURITY_POLICY, |
| 56 | - VITE_GLOB_PUBLIC_PATH | 81 | + VITE_GLOB_PUBLIC_PATH, |
| 82 | + VITE_GLOB_STREAM_MEDIA_CONTENT_SECURITY_PROTOCOL | ||
| 57 | }; | 83 | }; |
| 58 | } | 84 | } |
| 59 | 85 |
| @@ -152,6 +152,8 @@ export interface GlobConfig { | @@ -152,6 +152,8 @@ export interface GlobConfig { | ||
| 152 | securityPolicy: string; | 152 | securityPolicy: string; |
| 153 | // assets file prefix | 153 | // assets file prefix |
| 154 | publicPath: string | 154 | publicPath: string |
| 155 | + // Streaming media content security protocol | ||
| 156 | + streamMediaContentSecurityProtocol: boolean | ||
| 155 | } | 157 | } |
| 156 | export interface GlobEnvConfig { | 158 | export interface GlobEnvConfig { |
| 157 | // Site title | 159 | // Site title |
| @@ -172,4 +174,6 @@ export interface GlobEnvConfig { | @@ -172,4 +174,6 @@ export interface GlobEnvConfig { | ||
| 172 | VITE_GLOB_CONTENT_SECURITY_POLICY: string | 174 | VITE_GLOB_CONTENT_SECURITY_POLICY: string |
| 173 | // public assets file prefix | 175 | // public assets file prefix |
| 174 | VITE_GLOB_PUBLIC_PATH: string | 176 | VITE_GLOB_PUBLIC_PATH: string |
| 177 | + // Streaming media content security protocol | ||
| 178 | + VITE_GLOB_STREAM_MEDIA_CONTENT_SECURITY_PROTOCOL: boolean | ||
| 175 | } | 179 | } |
| @@ -11,6 +11,10 @@ interface ImportMetaEnv { | @@ -11,6 +11,10 @@ interface ImportMetaEnv { | ||
| 11 | VITE_GLOB_CONTENT_SECURITY_POLICY: boolean | 11 | VITE_GLOB_CONTENT_SECURITY_POLICY: boolean |
| 12 | 12 | ||
| 13 | VITE_GLOB_APP_SHORT_NAME: string | 13 | VITE_GLOB_APP_SHORT_NAME: string |
| 14 | + | ||
| 15 | + // 流媒体播放协议 | ||
| 16 | + VITE_GLOB_STREAM_MEDIA_CONTENT_SECURITY_PROTOCOL: boolean | ||
| 17 | + | ||
| 14 | } | 18 | } |
| 15 | 19 | ||
| 16 | 20 |