🦄 refactor: 优化ws实现代码(从ahokks引入改为使用原生代码);
This commit is contained in:
parent
f2cc70c785
commit
fc681c510c
@ -1,8 +1,7 @@
|
|||||||
import React,{useRef} from 'react'
|
import React,{useRef,useState} from 'react'
|
||||||
import TerminalForm from './components/TerminalForm'
|
import TerminalForm from './components/TerminalForm'
|
||||||
import WebTerminal from './components/WebTerminal'
|
import WebTerminal from './components/WebTerminal'
|
||||||
import './index.less';
|
import './index.less';
|
||||||
import style from 'packages/meta/src/badge/style';
|
|
||||||
|
|
||||||
interface CenterLinkProps{
|
interface CenterLinkProps{
|
||||||
websocketUrl:string; // websocket服务地址
|
websocketUrl:string; // websocket服务地址
|
||||||
@ -22,8 +21,8 @@ const materialName='center-link';
|
|||||||
|
|
||||||
const CenterLink:React.FC<CenterLinkProps>=(props:CenterLinkProps)=>{
|
const CenterLink:React.FC<CenterLinkProps>=(props:CenterLinkProps)=>{
|
||||||
const {
|
const {
|
||||||
websocketUrl,
|
|
||||||
ip,
|
ip,
|
||||||
|
websocketUrl,
|
||||||
token,
|
token,
|
||||||
terminalStyle,
|
terminalStyle,
|
||||||
onConnect,
|
onConnect,
|
||||||
@ -35,22 +34,24 @@ const CenterLink:React.FC<CenterLinkProps>=(props:CenterLinkProps)=>{
|
|||||||
style
|
style
|
||||||
}=props;
|
}=props;
|
||||||
const webRef=useRef(null);
|
const webRef=useRef(null);
|
||||||
|
const [ipUrl,setIpUrl]=useState<string>(ip);
|
||||||
|
|
||||||
// 处理开始连接服务器ip的事件
|
// 处理开始连接服务器ip的事件
|
||||||
const handleConnectClick=(values:any)=>{
|
const handleConnectClick=(values:any)=>{
|
||||||
const {ip}=values;
|
const {ip}=values;
|
||||||
if(ip&&token&&websocketUrl&&webRef.current){
|
setIpUrl((
|
||||||
webRef.current.connect();
|
pre
|
||||||
}
|
)=>(ip))
|
||||||
onConnect&&onConnect(values);
|
onConnect&&onConnect(values);
|
||||||
}
|
}
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className={materialName} style={style}>
|
<div className={materialName} style={style}>
|
||||||
<TerminalForm onConnect={handleConnectClick} onExportLogs={onExportLogs} />
|
<TerminalForm ip={ipUrl} onConnect={handleConnectClick} onExportLogs={onExportLogs} />
|
||||||
<WebTerminal
|
<WebTerminal
|
||||||
ref={webRef}
|
ref={webRef}
|
||||||
|
ip={ipUrl}
|
||||||
websocketUrl={websocketUrl}
|
websocketUrl={websocketUrl}
|
||||||
ip={ip}
|
|
||||||
token={token}
|
token={token}
|
||||||
terminalStyle={terminalStyle}
|
terminalStyle={terminalStyle}
|
||||||
onOpen={onOpen}
|
onOpen={onOpen}
|
||||||
|
@ -1,20 +1,27 @@
|
|||||||
import React from 'react';
|
import React, { useEffect } from 'react';
|
||||||
import { Button, Form, Input,FormProps } from '@zhst/meta';
|
import { Button, Form, Input,FormProps } from '@zhst/meta';
|
||||||
import '../index.less';
|
import '../index.less';
|
||||||
|
|
||||||
const materialName='terminal-form';
|
const materialName='terminal-form';
|
||||||
|
|
||||||
export interface TerminalFormProps{
|
export interface TerminalFormProps{
|
||||||
|
ip:string; // ip地址
|
||||||
onConnect:FormProps['onFinish']; // 开始连接事件
|
onConnect:FormProps['onFinish']; // 开始连接事件
|
||||||
onExportLogs:()=>void; // 导出日志事件
|
onExportLogs:()=>void; // 导出日志事件
|
||||||
}
|
}
|
||||||
|
|
||||||
const TerminalForm:React.FC<TerminalFormProps>=(props:TerminalFormProps)=> {
|
const TerminalForm:React.FC<TerminalFormProps>=(props:TerminalFormProps)=> {
|
||||||
const {
|
const {
|
||||||
|
ip,
|
||||||
onConnect,
|
onConnect,
|
||||||
onExportLogs,
|
onExportLogs,
|
||||||
}=props;
|
}=props;
|
||||||
const [form] = Form.useForm();
|
const [form] = Form.useForm();
|
||||||
|
useEffect(()=>{
|
||||||
|
form.setFieldsValue({
|
||||||
|
ip,
|
||||||
|
});
|
||||||
|
},[])
|
||||||
return (
|
return (
|
||||||
<div className={materialName}>
|
<div className={materialName}>
|
||||||
<h1>连接中心服务器</h1>
|
<h1>连接中心服务器</h1>
|
||||||
|
@ -1,7 +1,6 @@
|
|||||||
|
|
||||||
import React,{useRef,useEffect, useImperativeHandle,
|
import React,{useRef,useEffect, useImperativeHandle,
|
||||||
forwardRef,} from 'react';
|
forwardRef,} from 'react';
|
||||||
import { useWebSocket } from '@zhst/hooks';
|
|
||||||
import { Terminal } from 'xterm';
|
import { Terminal } from 'xterm';
|
||||||
import { FitAddon } from 'xterm-addon-fit';
|
import { FitAddon } from 'xterm-addon-fit';
|
||||||
import 'xterm/css/xterm.css';
|
import 'xterm/css/xterm.css';
|
||||||
@ -56,21 +55,10 @@ const WebTerminal:React.FC<WebTerminalProps&WebsocketOptions>=forwardRef((props:
|
|||||||
onMessage,
|
onMessage,
|
||||||
onError,
|
onError,
|
||||||
}=props;
|
}=props;
|
||||||
const { readyState, sendMessage, latestMessage, disconnect, connect }:WebsocketResult = useWebSocket(
|
|
||||||
`${websocketUrl}?ip=${ip}&Authorization=${token}`,{manual:true,reconnectLimit:0,onOpen,
|
|
||||||
onClose,
|
|
||||||
onMessage,
|
|
||||||
onError}
|
|
||||||
);
|
|
||||||
const termRef = useRef(null);
|
const termRef = useRef(null);
|
||||||
const termClassRef=useRef(null)
|
const termClassRef=useRef(null)
|
||||||
// const currLine=useRef(null);
|
// const currLine=useRef(null);
|
||||||
|
const wsRef=useRef(null);
|
||||||
useEffect(()=>{
|
|
||||||
if(termClassRef?.current){
|
|
||||||
termClassRef.current.write(latestMessage?.data+'\r\n\x1b[33m$\x1b[0m ');
|
|
||||||
}
|
|
||||||
},[latestMessage]);
|
|
||||||
|
|
||||||
// terminal初始化
|
// terminal初始化
|
||||||
useEffect(()=>{
|
useEffect(()=>{
|
||||||
@ -113,14 +101,43 @@ const WebTerminal:React.FC<WebTerminalProps&WebsocketOptions>=forwardRef((props:
|
|||||||
|
|
||||||
},[]);
|
},[]);
|
||||||
|
|
||||||
|
useEffect(()=>{
|
||||||
|
if(ip&&websocketUrl&&token){
|
||||||
|
const ws=new WebSocket(`${websocketUrl}?ip=${ip}&Authorization=${token}`);
|
||||||
|
wsRef.current=ws;
|
||||||
|
if(wsRef?.current){
|
||||||
|
wsRef.current.onopen=(event: WebSocketEventMap['open'], instance: WebSocket)=>{
|
||||||
|
if(onOpen){
|
||||||
|
onOpen(event,instance);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
wsRef.current.onclose=(event: WebSocketEventMap['close'], instance: WebSocket)=>{
|
||||||
|
if(onClose){
|
||||||
|
onClose(event,instance);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
wsRef.current.onmessage=(message: WebSocketEventMap['message'], instance: WebSocket)=>{
|
||||||
|
if(termClassRef.current){
|
||||||
|
termClassRef.current.write(message?.data+'\r\n\x1b[33m$\x1b[0m ');
|
||||||
|
}
|
||||||
|
if(onMessage){
|
||||||
|
onMessage(message,instance);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
wsRef.current.onerror=(event: WebSocketEventMap['error'], instance: WebSocket)=>{
|
||||||
|
if(onError){
|
||||||
|
onError(event,instance);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
},[ip,websocketUrl,token])
|
||||||
|
|
||||||
// 自定义暴露给父组件的实例
|
// 自定义暴露给父组件的实例
|
||||||
useImperativeHandle(ref,()=>({
|
useImperativeHandle(ref,()=>(
|
||||||
readyState,
|
wsRef.current
|
||||||
sendMessage,
|
));
|
||||||
latestMessage,
|
|
||||||
disconnect,
|
|
||||||
connect
|
|
||||||
}));
|
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className={materialName}>
|
<div className={materialName}>
|
||||||
|
@ -6,7 +6,7 @@ const demo = () => {
|
|||||||
<CenterLink
|
<CenterLink
|
||||||
style={{width:'100%',height:'600px'}}
|
style={{width:'100%',height:'600px'}}
|
||||||
websocketUrl={'ws://10.0.0.7:50051/active'}
|
websocketUrl={'ws://10.0.0.7:50051/active'}
|
||||||
token={'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3MTM1OTI2NDYsImp0aSI6ImFkbWluIn0._mVU216h0q8va8bZ8PCKfGOKslYJWdRLFvLzUdvGDN4'}
|
token={'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3MTM4NDAxOTAsImp0aSI6ImFkbWluIn0.KAcgU8r-AIQ2GEu5g2o-YANstqisy5WT6rz5fbMjdcs'}
|
||||||
ip={'127.0.0.1'}
|
ip={'127.0.0.1'}
|
||||||
terminalStyle={{width:'100%',height:'calc(100% - 180px)'}}
|
terminalStyle={{width:'100%',height:'calc(100% - 180px)'}}
|
||||||
onConnect={(values)=>{
|
onConnect={(values)=>{
|
||||||
|
Loading…
Reference in New Issue
Block a user