diff --git a/code/VideoAccess-VCMP/api/.vscode/launch.json b/code/VideoAccess-VCMP/api/.vscode/launch.json index e812e78..6c0fe3e 100644 --- a/code/VideoAccess-VCMP/api/.vscode/launch.json +++ b/code/VideoAccess-VCMP/api/.vscode/launch.json @@ -15,8 +15,8 @@ "args": [ "-p 4000", "-f http://localhost:4000", - "-g postgres://postgres:123@10.8.30.166:5432/video-access", - // "-g postgres://postgres:123@10.8.30.166:5432/video_access-dev", + // "-g postgres://postgres:123@10.8.30.166:5432/video-access", + "-g postgres://postgres:123@10.8.30.166:5432/video_access-dev", "--redisHost 10.8.30.112", "--redisPort 6379", "--axyApiUrl http://127.0.0.1:4100", diff --git a/code/VideoAccess-VCMP/api/app/lib/middlewares/authenticator.js b/code/VideoAccess-VCMP/api/app/lib/middlewares/authenticator.js index 53e8c5b..172c35e 100644 --- a/code/VideoAccess-VCMP/api/app/lib/middlewares/authenticator.js +++ b/code/VideoAccess-VCMP/api/app/lib/middlewares/authenticator.js @@ -83,6 +83,7 @@ let authorizeToken = async function (ctx, token) { ctx.fs.api.token = token; } } catch (err) { + console.log(11111111111,err); const { error } = err.response || {}; ctx.fs.logger.log('[anxinyun]', '[AUTH] failed', (error || {}).message || `cannot GET /users/${token}`); } diff --git a/code/VideoAccess-VCMP/web/client/src/components/videoPlayer/videoOperation.jsx b/code/VideoAccess-VCMP/web/client/src/components/videoPlayer/videoOperation.jsx index 6a321e6..29e84dd 100644 --- a/code/VideoAccess-VCMP/web/client/src/components/videoPlayer/videoOperation.jsx +++ b/code/VideoAccess-VCMP/web/client/src/components/videoPlayer/videoOperation.jsx @@ -26,14 +26,17 @@ const VideoOperation = ({ isPlaying, videoObj, setYingshiPrepare, yingshiPrepareRef, - slideDown, + slideDown, playBackTime, player, // setPlayer, playState, videoFront, - videoAfter + showTime_, + videoAfter, + showTimeSelect, + setShowTimeSelect + }) => { - const [showTimeSelect, setShowTimeSelect] = useState(false) const butStyle = { border: '1px solid #fff', color: '#fff', padding: '0 10px', @@ -64,6 +67,8 @@ const VideoOperation = ({ } const histroySelected = operationState && operationState.histroy.select + const vcmp_videoplayHeight = document.getElementById("vcmp_videoplay" + videoObj.id)?.clientHeight + const vcmp_videoplaWidth = document.getElementById('vcmp_videoplay' + videoObj.id)?.clientWidth return ( <> @@ -80,7 +85,7 @@ const VideoOperation = ({ { showTimeSelect ? { setShowTimeSelect(false) }} histroyTime={histroyTime} setHistroyTime={setHistroyTime} setProcessDisX={setProcessDisX} + close={() => { setShowTimeSelect(false) }} videoObj={videoObj} setIsAdjustProcess={setIsAdjustProcess} playBackTime={playBackTime} histroyTime={histroyTime} setHistroyTime={setHistroyTime} setProcessDisX={setProcessDisX} /> : '' } @@ -113,7 +118,7 @@ const VideoOperation = ({ : '' } - {histroyTime.length ? `${moment(histroyTime[0]).format(timeFormat)} / ${moment(histroyTime[1]).format(timeFormat)}` : ''} + {histroyTime.length ? `${showTime_} / ${moment(histroyTime[1]).format(timeFormat)}` : ''}
@@ -123,9 +128,9 @@ const VideoOperation = ({ : '' } -
{ + {vcmp_videoplayHeight > 359 && vcmp_videoplaWidth > 599 ?
{ setShowTimeSelect(!showTimeSelect) - }}>时间设置
+ }}>时间设置
: ""}
: @@ -136,7 +141,7 @@ const VideoOperation = ({ operation.map(p => { if (p.hide) return null; return { p.click() }} diff --git a/code/VideoAccess-VCMP/web/client/src/components/videoPlayer/videoOperationCloudControl.jsx b/code/VideoAccess-VCMP/web/client/src/components/videoPlayer/videoOperationCloudControl.jsx index f324221..cbb03a7 100644 --- a/code/VideoAccess-VCMP/web/client/src/components/videoPlayer/videoOperationCloudControl.jsx +++ b/code/VideoAccess-VCMP/web/client/src/components/videoPlayer/videoOperationCloudControl.jsx @@ -40,7 +40,7 @@ const VideoOperationCloudControl = ({ }].map((s, i) => { return ( { +const VideoOperationHistroyTime = ({ close, histroyTime, setHistroyTime, setProcessDisX,playBackTime,setIsAdjustProcess }) => { const [selectedTimeRange, setSelectedTimeRange] = useState(histroyTime) useEffect(() => { @@ -21,9 +21,9 @@ const VideoOperationHistroyTime = ({ close, histroyTime, setHistroyTime, setProc return (
{ setSelectedTimeRange(timeRange) + console.log(timeRange); }} - style={{ width: '100%' }} + style={{ width: 354 }} // disabledDate={(date, options) => { // const { rangeStart, rangeEnd } = options; // // console.log(date, options); @@ -54,7 +55,7 @@ const VideoOperationHistroyTime = ({ close, histroyTime, setHistroyTime, setProc
- + 最长时间跨度不超过72小时 @@ -76,7 +77,8 @@ const VideoOperationHistroyTime = ({ close, histroyTime, setHistroyTime, setProc return ToastInCustomContainer.error('所选时间超过 72 小时') } setHistroyTime(selectedTimeRange) - playBackTime.current = selectedTimeRange + playBackTime = selectedTimeRange + setIsAdjustProcess(true) setProcessDisX(0) close() } diff --git a/code/VideoAccess-VCMP/web/client/src/components/videoPlayer/videoOperationTalk.jsx b/code/VideoAccess-VCMP/web/client/src/components/videoPlayer/videoOperationTalk.jsx index cc8865c..5a5aeb4 100644 --- a/code/VideoAccess-VCMP/web/client/src/components/videoPlayer/videoOperationTalk.jsx +++ b/code/VideoAccess-VCMP/web/client/src/components/videoPlayer/videoOperationTalk.jsx @@ -64,7 +64,7 @@ const VideoOperationTalk = ({ position: 'absolute', top: 'calc(50% - 88px)', left: 'calc(50% - 156px)', width: 312, height: 186, backgroundColor: '#000000A5', transform: `scale(${vcmpVideo / 400 > 1.5 ? 1.5 : vcmpVideo / 400})`, }}> - +
{ + // console.log(processDisX); if (operationState && operationState.histroy.select) { if (isAdjustProcess) { // 调整进度条 更新播放开始时间 @@ -367,6 +371,7 @@ const VideoPlay = ({ dispatch, actions, player.stop().then(() => { player.play({ url: `${videoObj.replayUrl}?begin=${moment(Begain.current).format("YYYYMMDDHHmmss")}&end=${moment(playBackTime.current[1]).format("YYYYMMDDHHmmss")}` }) playState.current = false + setIsAdjustProcess(false) }) } else { // 随播放时间变化更新进度条 @@ -567,6 +572,9 @@ const VideoPlay = ({ dispatch, actions, playState={playState.current} videoFront={videoFront} videoAfter={videoFront} + showTime_={showTime_} + setShowTime={setShowTime} + setShowTimeSelect={setShowTimeSelect} /> {/* 视频内容 */} { @@ -599,7 +607,7 @@ const VideoPlay = ({ dispatch, actions, {/* 下方操作栏 */} {/* 显示操作功能条件(宽高) */} - {size?.parentWidth > 480 ? + {size?.parentWidth > 479 ? : "" }
diff --git a/code/VideoAccess-VCMP/web/client/src/components/videoPlayer/voiceHeader.jsx b/code/VideoAccess-VCMP/web/client/src/components/videoPlayer/voiceHeader.jsx index fd2c278..defe8a1 100644 --- a/code/VideoAccess-VCMP/web/client/src/components/videoPlayer/voiceHeader.jsx +++ b/code/VideoAccess-VCMP/web/client/src/components/videoPlayer/voiceHeader.jsx @@ -8,10 +8,10 @@ import './videoPlay.less'; const timeFormat = 'YYYY-MM-DD HH:mm:ss' -const VideoHeader = ({ operationState, changeSelectState, setProcessDisX, name, videoObj, showTime, histroyTime, content, roll, videoStyle, player, resolution, playState }) => { +const VideoHeader = ({ setShowTimeSelect,showTime_, setShowTime, operationState, changeSelectState, setProcessDisX, name, videoObj, showTime, histroyTime, content, roll, videoStyle, player, resolution, playState }) => { const time = useRef(moment(showTime || undefined)) const upTimeInterval = useRef(null) - const [showTime_, setShowTime] = useState(' ') + const updateTime = () => { if (!showTime) { @@ -55,6 +55,7 @@ const VideoHeader = ({ operationState, changeSelectState, setProcessDisX, name, const goBack = () => { changeSelectState('histroy') + setShowTimeSelect(false) if (playState) { player.stop().then(() => { if (resolution == 'sd') { @@ -73,7 +74,7 @@ const VideoHeader = ({ operationState, changeSelectState, setProcessDisX, name, const vcmp_videopla = document.getElementById('vcmp_videoplay' + videoObj.id)?.clientWidth return ( -
+ vcmp_videopla < 300 ? '' :
42 ? 42 : vcmp_videoplay * 0.12 < 30 ? 30 : vcmp_videoplay * 0.12}px`, @@ -86,8 +87,8 @@ const VideoHeader = ({ operationState, changeSelectState, setProcessDisX, name, color: '#fff' }}> - - 480 ? 15 : 10} style={{}}> +
{content && content?.length > 0 ? : ""}
-
+
) } diff --git a/code/VideoAccess-VCMP/web/client/src/layout/containers/layout/index.jsx b/code/VideoAccess-VCMP/web/client/src/layout/containers/layout/index.jsx index 3aa8dda..576ae3e 100644 --- a/code/VideoAccess-VCMP/web/client/src/layout/containers/layout/index.jsx +++ b/code/VideoAccess-VCMP/web/client/src/layout/containers/layout/index.jsx @@ -49,7 +49,6 @@ const LayoutContainer = props => { useEffect(() => { NProgress.done(); - console.log(user, authCrossLoading, props); if ((!user || !user.authorized) && !authCrossLoading && props.location.pathname != '/video_play_status') { history.push('/signin'); } @@ -84,7 +83,7 @@ const LayoutContainer = props => { // websocket 使用测试 useEffect(() => { - console.log(socket) + // console.log(socket) if (socket) { socket.on('CAMERA_ONLINE', function (msg) { console.info(msg); diff --git a/code/VideoAccess-VCMP/web/client/src/layout/index.jsx b/code/VideoAccess-VCMP/web/client/src/layout/index.jsx index 4f52436..fe9b02e 100644 --- a/code/VideoAccess-VCMP/web/client/src/layout/index.jsx +++ b/code/VideoAccess-VCMP/web/client/src/layout/index.jsx @@ -3,7 +3,7 @@ import React, { useEffect, useState } from 'react'; import moment from 'moment'; import configStore from './store'; import { Provider } from 'react-redux'; -import { createBrowserHistory } from 'history'; +import { createBrowserHistory, push as pushs } from 'history'; import { ConnectedRouter } from 'connected-react-router' import { Layout, NoMatch } from './containers'; import { BrowserRouter, Switch, Route } from "react-router-dom"; @@ -20,7 +20,7 @@ const { initLayout, initApiRoot, resize, initWebSocket } = layoutActions; const Root = props => { const { sections, title, copyright, actions } = props; - const [history, setHistory] = useState(null) + const [historys, setHistorys] = useState(null) const [store, setStore] = useState(null) const [outerRoutes, setOuterRoutes] = useState([]) const [combineRoutes, setCombineRoutes] = useState([]) @@ -135,7 +135,7 @@ const Root = props => { const combineRoutes = flatRoutes(innerRoutes); setInnerRoutes(combineRoutes) - setHistory(history) + setHistorys(history) setStore(store) setOuterRoutes(outerRoutes.map(route => ( { await store.dispatch(actions.auth.logout()) } } - console.log(data); setAuthCrossLoading(false) }); // setAuthCrossLoading(false) // MicroApp const microAppListen = async (data) => { - console.log(actions); - console.log('mid:' + data.data.mid); + // console.log('mid:' + data.data.mid); if (data.action == 'initMicro') { await store.dispatch(actions.auth.initAuth({ @@ -183,13 +181,19 @@ const Root = props => { ...(data.data || {}) })) if (data?.data?.mid) { - console.log(22315348); await store.dispatch(push('/callService')); } else { await store.dispatch(push('/noMatch')); - } setMicroAppWaiting(false) + } else if (data.action == 'videoImplant') { + history.push({ + pathname: '/video_play_cross', + query: { + video: true, + ...(data.data || {}) + } + }) } } if (window.__MICRO_APP_ENVIRONMENT__) { @@ -208,7 +212,7 @@ const Root = props => { } }, []) - console.log(authCrossLoading, microAppWaiting); + // console.log(authCrossLoading, microAppWaiting); return ( <> @@ -217,12 +221,12 @@ const Root = props => { - + {outerRoutes} { { resourceRoot.iotAuthWeb && !window.__MICRO_APP_ENVIRONMENT__ ? +

你的浏览器不支持 iframe。

+ : '' } diff --git a/code/VideoAccess-VCMP/web/client/src/sections/equipmentWarehouse/components/cameraModal.jsx b/code/VideoAccess-VCMP/web/client/src/sections/equipmentWarehouse/components/cameraModal.jsx index bfd8d30..e4b993a 100644 --- a/code/VideoAccess-VCMP/web/client/src/sections/equipmentWarehouse/components/cameraModal.jsx +++ b/code/VideoAccess-VCMP/web/client/src/sections/equipmentWarehouse/components/cameraModal.jsx @@ -55,7 +55,6 @@ function cameraModal (props) { cameraData.type == "nvr" || addNvr ? setcameraList(cameraList.slice(1, 4)) : ""; //axyData安心云参数 if (axyData) { - console.log(axyData) switch (axyData.openCamera) { case "nvr": setcameraList(cameraList.slice(1, 4)) @@ -146,7 +145,6 @@ function cameraModal (props) { if (cameraData.id) { values.id = cameraData.id; } - console.log(values); dispatch(equipmentWarehouse.postCameraIpc(values)).then((res) => { if (res.success) { onReset(); @@ -159,9 +157,7 @@ function cameraModal (props) { return { id: v.id, name: v.name, }; }); cascadeRef.current.cascadeCameraForm().then((values) => { - console.log(values); dispatch(equipmentWarehouse.postAddCascade({ ...values, camera: data })).then((res) => { - console.log(res); if (res.success) { onReset(); } @@ -273,7 +269,6 @@ function cameraModal (props) { .ipcCameraForm() .then((values) => { //表单校验成功 - console.log(values); var front = new moment(); //验证前时间 setloading(true); dispatch( @@ -304,7 +299,6 @@ function cameraModal (props) { }) .catch((errors) => { //表单校验失败 - console.log(); }); } else if (clickNum == 4) { cascadeRef.current diff --git a/code/VideoAccess-VCMP/web/client/src/sections/equipmentWarehouse/components/nvrModal.jsx b/code/VideoAccess-VCMP/web/client/src/sections/equipmentWarehouse/components/nvrModal.jsx index ebee457..3ca99a7 100644 --- a/code/VideoAccess-VCMP/web/client/src/sections/equipmentWarehouse/components/nvrModal.jsx +++ b/code/VideoAccess-VCMP/web/client/src/sections/equipmentWarehouse/components/nvrModal.jsx @@ -152,7 +152,7 @@ function nvrModal(props) { labelPosition="left" labelAlign="left" labelWidth="90px" - onValueChange={(values) => console.log(values)} + // onValueChange={(values) => console.log(values)} getFormApi={(formApi) => (form.current = formApi)} > diff --git a/code/VideoAccess-VCMP/web/client/src/sections/equipmentWarehouse/containers/camera.jsx b/code/VideoAccess-VCMP/web/client/src/sections/equipmentWarehouse/containers/camera.jsx index 8e8806d..d7d8f98 100644 --- a/code/VideoAccess-VCMP/web/client/src/sections/equipmentWarehouse/containers/camera.jsx +++ b/code/VideoAccess-VCMP/web/client/src/sections/equipmentWarehouse/containers/camera.jsx @@ -588,7 +588,7 @@ const CameraHeader = (props) => {
console.log(values)} + // onSubmit={(values) => console.log(values)} // onValueChange={values=>console.log(values)} getFormApi={(formApi) => (api.current = formApi)} layout="horizontal" diff --git a/code/VideoAccess-VCMP/web/client/src/sections/equipmentWarehouse/containers/nvr.jsx b/code/VideoAccess-VCMP/web/client/src/sections/equipmentWarehouse/containers/nvr.jsx index ae0cb3c..8a52852 100644 --- a/code/VideoAccess-VCMP/web/client/src/sections/equipmentWarehouse/containers/nvr.jsx +++ b/code/VideoAccess-VCMP/web/client/src/sections/equipmentWarehouse/containers/nvr.jsx @@ -399,7 +399,7 @@ const NvrHeader = (props) => {
console.log(values)} + // onSubmit={(values) => console.log(values)} // onValueChange={values=>console.log(values)} getFormApi={(formApi) => (api.current = formApi)} layout="horizontal" diff --git a/code/VideoAccess-VCMP/web/client/src/sections/monitor/containers/videoPlayCross.jsx b/code/VideoAccess-VCMP/web/client/src/sections/monitor/containers/videoPlayCross.jsx index 192acf5..c128e19 100644 --- a/code/VideoAccess-VCMP/web/client/src/sections/monitor/containers/videoPlayCross.jsx +++ b/code/VideoAccess-VCMP/web/client/src/sections/monitor/containers/videoPlayCross.jsx @@ -4,63 +4,98 @@ import qs from "qs"; import { VideoPlay } from '$components' import '../style.less' import { useRef } from 'react'; +import './videoPlayCross.less' const VideoPlayCross = (props) => { - const [videoParams, setVideoParams] = useState(null) - const [sizeWh, setSizeWh] = useState() - const viideoData = useRef(videoParams) + const { user, history } = props; + const [videoParams, setVideoParams] = useState(null) + const [sizeWh, setSizeWh] = useState() + const viideoData = useRef(videoParams) - useEffect(() => { - // console.log(props); - if (props.location.search) { - decodeURIComponent(props.location.search) - const params = qs.parse(props.location.search.slice(1)) - if (params.videoObj) { - // params.videoObj = (new Function("return " + params.videoObj))() - decodeURIComponent(params.videoObj) - params.videoObj = JSON.parse(params.videoObj) - // params.height = JSON.parse(params.height) - setVideoParams(params) - viideoData.current = params - } - } - function messageListen (e) { - // 此处需做 域名 验证 - const { data } = e - if (data && data.action) { - if (data.action == 'init_video' || data.action == 'epidemic_video') { - setVideoParams({ ...(viideoData.current || {}), ...data.params }) - } + useEffect(() => { + // iframe 嵌套 + if (props.location.search) { + decodeURIComponent(props.location.search) + const params = qs.parse(props.location.search.slice(1)) + if (params.videoObj) { + // params.videoObj = (new Function("return " + params.videoObj))() + decodeURIComponent(params.videoObj) + params.videoObj = JSON.parse(params.videoObj) + // params.height = JSON.parse(params.height) + setVideoParams(params) + viideoData.current = params + } + } + function messageListen (e) { + // 此处需做 域名 验证 + const { data } = e + if (data && data.action) { + if (data.action == 'init_video' || data.action == 'epidemic_video') { + setVideoParams({ ...(viideoData.current || {}), ...data.params }) } - } - const resize_ = () => { + } + } + const resize_ = () => { + if (props.location.search) { const params = qs.parse(props.location.search.slice(1)) setSizeWh({ parentWidth: document.body.clientWidth, parentHeight: document.body.clientHeight, width: params.width || document.body.clientWidth, height: params.height || document.body.clientHeight }) - } - resize_() - if (window.parent) { - window.addEventListener('message', messageListen); - } - window.addEventListener('resize', resize_); //只要窗口殴大小发生像素变化就会触发 - return () => { + } + } + resize_() + + if (window.parent) { + window.addEventListener('message', messageListen); + } + window.addEventListener('resize', resize_) //只要窗口殴大小发生像素变化就会触发 + return () => { + if (!history?.location?.query?.video) { window.removeEventListener('message', messageListen); - window.removeEventListener('resize', resize_); - } - }, []) - return ( - <> - { - videoParams && - } - - ) + } + window.removeEventListener('resize', resize_); + } + }, []) + + useEffect(() => { + + let data = history?.location?.query + console.log(data); + + // 微前端嵌入 + + const resize = () => { + if (history?.location?.query) { + setSizeWh({ + parentWidth: document.getElementById('VcmpApp')?.clientWidth, + parentHeight: document.getElementById('VcmpApp')?.clientHeight, + width: data?.width || document.getElementById('VcmpApp')?.clientWidth, + height: data?.height || document.getElementById('VcmpApp')?.clientHeight + }) + } + } + resize() + window.addEventListener('resize', resize) + return () => { + window.removeEventListener('resize', resize); + } + }, [history?.location?.query]) + return ( + <> + {history?.location?.query?.video ? +
+ {sizeWh && } +
+ + : videoParams && + } + + ) } function mapStateToProps (state) { - const { auth } = state; - return { - user: auth.user, - }; + const { auth } = state; + return { + user: auth.user, + }; } export default connect(mapStateToProps)(VideoPlayCross); \ No newline at end of file diff --git a/code/VideoAccess-VCMP/web/client/src/sections/monitor/containers/videoPlayCross.less b/code/VideoAccess-VCMP/web/client/src/sections/monitor/containers/videoPlayCross.less new file mode 100644 index 0000000..cecb98b --- /dev/null +++ b/code/VideoAccess-VCMP/web/client/src/sections/monitor/containers/videoPlayCross.less @@ -0,0 +1,3 @@ +semi-portal-inner { + background: white; +} diff --git a/code/VideoAccess-VCMP/web/client/src/sections/offline/containers/carrierpigeon.jsx b/code/VideoAccess-VCMP/web/client/src/sections/offline/containers/carrierpigeon.jsx index 30e7b05..313b7ce 100644 --- a/code/VideoAccess-VCMP/web/client/src/sections/offline/containers/carrierpigeon.jsx +++ b/code/VideoAccess-VCMP/web/client/src/sections/offline/containers/carrierpigeon.jsx @@ -328,7 +328,7 @@ const Carrierpigeon = (props) => {
console.log(values)} + // onSubmit={(values) => console.log(values)} // onValueChange={values=>console.log(values)} getFormApi={(formApi) => (api.current = formApi)} layout="horizontal" diff --git a/code/VideoAccess-VCMP/web/client/src/sections/offline/containers/statuscode.jsx b/code/VideoAccess-VCMP/web/client/src/sections/offline/containers/statuscode.jsx index 1c9314d..b16b850 100644 --- a/code/VideoAccess-VCMP/web/client/src/sections/offline/containers/statuscode.jsx +++ b/code/VideoAccess-VCMP/web/client/src/sections/offline/containers/statuscode.jsx @@ -291,7 +291,7 @@ const Statuscode = (props) => {
console.log(values)} + // onSubmit={(values) => console.log(values)} // onValueChange={values=>console.log(values)} getFormApi={(formApi) => (api.current = formApi)} layout="horizontal" diff --git a/code/VideoAccess-VCMP/web/client/src/sections/openness/containers/callService.jsx b/code/VideoAccess-VCMP/web/client/src/sections/openness/containers/callService.jsx index 58eecaf..06b4cd5 100644 --- a/code/VideoAccess-VCMP/web/client/src/sections/openness/containers/callService.jsx +++ b/code/VideoAccess-VCMP/web/client/src/sections/openness/containers/callService.jsx @@ -63,7 +63,6 @@ const CallService = (props) => { function mapStateToProps (state) { const { auth, global, members } = state; - console.log('ccccccccccc', state) return { loading: members.isRequesting, user: auth.user, diff --git a/code/VideoAccess-VCMP/web/package.json b/code/VideoAccess-VCMP/web/package.json index 216fc60..2543502 100644 --- a/code/VideoAccess-VCMP/web/package.json +++ b/code/VideoAccess-VCMP/web/package.json @@ -68,7 +68,7 @@ "moment": "^2.29.3", "npm": "^7.20.6", "perfect-scrollbar": "^1.5.5", - "qs": "^6.10.5", + "qs": "^6.11.0", "screenfull": "5.2.0", "socket.io-client": "^1.7.4", "socket.io-parser": "^3.4.1",