mirror of
https://github.com/EthanShoeDev/fressh.git
synced 2026-01-11 14:22:51 +00:00
probably broken in some ways
This commit is contained in:
@@ -1,8 +1,11 @@
|
||||
import SSHClient, { PtyType } from '@dylankenneally/react-native-ssh-sftp'
|
||||
import { useRouter } from 'expo-router'
|
||||
import { StyleSheet, Text, View } from 'react-native'
|
||||
import { useFresshAppForm } from '../lib/app-form'
|
||||
import { sshConnectionManager } from '../lib/ssh-connection-manager'
|
||||
|
||||
export default function Index() {
|
||||
const router = useRouter()
|
||||
const connectionForm = useFresshAppForm({
|
||||
defaultValues: {
|
||||
// host: '',
|
||||
@@ -30,10 +33,14 @@ export default function Index() {
|
||||
)
|
||||
console.log('Connected to SSH server')
|
||||
|
||||
sshClientConnection.on('Shell', (data) => {
|
||||
console.log(data)
|
||||
})
|
||||
// sshClientConnection.on('Shell', (data) => {
|
||||
// console.log(data)
|
||||
// })
|
||||
await sshClientConnection.startShell(PtyType.XTERM)
|
||||
const sshConn = sshConnectionManager.addSession({
|
||||
client: sshClientConnection,
|
||||
})
|
||||
router.push(`/shell`)
|
||||
},
|
||||
},
|
||||
})
|
||||
@@ -53,12 +60,22 @@ export default function Index() {
|
||||
field={field}
|
||||
autoCapitalize="none"
|
||||
autoCorrect={false}
|
||||
value={field.state.value}
|
||||
onChangeText={field.handleChange}
|
||||
onBlur={field.handleBlur}
|
||||
/>
|
||||
)}
|
||||
</connectionForm.AppField>
|
||||
<connectionForm.AppField name="port">
|
||||
{(field) => (
|
||||
<field.NumberField label="Port" placeholder="22" field={field} />
|
||||
<field.NumberField
|
||||
label="Port"
|
||||
placeholder="22"
|
||||
field={field}
|
||||
value={field.state.value.toString()}
|
||||
onChangeText={(text) => field.handleChange(Number(text))}
|
||||
onBlur={field.handleBlur}
|
||||
/>
|
||||
)}
|
||||
</connectionForm.AppField>
|
||||
<connectionForm.AppField name="username">
|
||||
@@ -69,6 +86,9 @@ export default function Index() {
|
||||
field={field}
|
||||
autoCapitalize="none"
|
||||
autoCorrect={false}
|
||||
value={field.state.value}
|
||||
onChangeText={field.handleChange}
|
||||
onBlur={field.handleBlur}
|
||||
/>
|
||||
)}
|
||||
</connectionForm.AppField>
|
||||
@@ -79,6 +99,9 @@ export default function Index() {
|
||||
placeholder="••••••••"
|
||||
field={field}
|
||||
secureTextEntry
|
||||
value={field.state.value}
|
||||
onChangeText={field.handleChange}
|
||||
onBlur={field.handleBlur}
|
||||
/>
|
||||
)}
|
||||
</connectionForm.AppField>
|
||||
|
||||
@@ -1,12 +1,30 @@
|
||||
/**
|
||||
* This is the page that is shown after an ssh connection
|
||||
*/
|
||||
import { useEffect, useState } from 'react'
|
||||
import { Text, View } from 'react-native'
|
||||
import { sshConnectionManager } from '../lib/ssh-connection-manager'
|
||||
|
||||
export default function Shell() {
|
||||
// https://docs.expo.dev/router/reference/url-parameters/
|
||||
// const { session: sessionId } = useLocalSearchParams<{ session: string }>()
|
||||
const sessionId = '123'
|
||||
const sshConn = sshConnectionManager.getSession({ sessionId }) // this throws if the session is not found
|
||||
|
||||
const [shellData, setShellData] = useState('')
|
||||
|
||||
useEffect(() => {
|
||||
sshConn.client.on('Shell', (data) => {
|
||||
setShellData((prev) => prev + data)
|
||||
})
|
||||
// return () => {
|
||||
// sshConn.client.off('Shell')
|
||||
// }
|
||||
}, [setShellData, sshConn.client])
|
||||
|
||||
return (
|
||||
<View>
|
||||
<Text>Shell</Text>
|
||||
<View style={{ flex: 1, margin: 16 }}>
|
||||
<Text>{shellData}</Text>
|
||||
</View>
|
||||
)
|
||||
}
|
||||
|
||||
40
src/lib/ssh-connection-manager.ts
Normal file
40
src/lib/ssh-connection-manager.ts
Normal file
@@ -0,0 +1,40 @@
|
||||
import SSHClient from '@dylankenneally/react-native-ssh-sftp'
|
||||
|
||||
export type SSHConn = {
|
||||
client: SSHClient
|
||||
sessionId: string
|
||||
createdAt: Date
|
||||
}
|
||||
|
||||
const sshConnections = new Map<string, SSHConn>()
|
||||
|
||||
function addSession(params: { client: SSHClient }) {
|
||||
// const sessionId = crypto.randomUUID()
|
||||
const sessionId = '123'
|
||||
const createdAt = new Date()
|
||||
const sshConn: SSHConn = {
|
||||
client: params.client,
|
||||
sessionId,
|
||||
createdAt,
|
||||
}
|
||||
sshConnections.set(sessionId, sshConn)
|
||||
return sshConn
|
||||
}
|
||||
|
||||
function getSession(params: { sessionId: string }) {
|
||||
const sshConn = sshConnections.get(params.sessionId)
|
||||
if (!sshConn) throw new Error('Session not found')
|
||||
return sshConn
|
||||
}
|
||||
|
||||
function removeAndDisconnectSession(params: { sessionId: string }) {
|
||||
const sshConn = getSession(params)
|
||||
sshConn.client.disconnect()
|
||||
sshConnections.delete(params.sessionId)
|
||||
}
|
||||
|
||||
export const sshConnectionManager = {
|
||||
addSession,
|
||||
getSession,
|
||||
removeAndDisconnectSession,
|
||||
}
|
||||
Reference in New Issue
Block a user