Files
OpenTerminal/src/main/ssh2.d.ts
T
Bill a9acdbe500 Initial commit: OpenTerminal v0.1.0
Open-source terminal app (local + SSH): split panes, themes, SFTP,
server monitoring, broadcast input, ZMODEM, system tray, single instance.
Electron + React + TypeScript. MIT License.
2026-09-07 16:15:50 +08:00

137 lines
5.1 KiB
TypeScript

/**
* Minimal ambient typings for the `ssh2` package (v1.17.0).
*
* ssh2 ships no type declarations and `@types/ssh2` is not installed; npm
* install is out of scope here, so this file declares exactly the surface this
* project consumes (verified against node_modules/ssh2/lib/client.js,
* Channel.js, kex.js, agent.js, server.js). Lives under src/main/, which is
* owned by this milestone.
*/
declare module 'ssh2' {
import { Duplex } from 'stream'
import { Socket } from 'net'
/** Duplex wrapper around an SSH channel (shell/exec). */
export interface ClientChannel extends Duplex {
setWindow(rows: number, cols: number, height: number, width: number): void
signal(signalName: string): void
exit(statusOrSignal: number | string, coreDumped?: boolean, msg?: string): void
close(): void
stderr: import('stream').Readable
}
export interface PseudoTtyOptions {
rows?: number
cols?: number
width?: number
height?: number
term?: string
}
export interface ShellOptions {
rows?: number
cols?: number
width?: number
height?: number
term?: string
/** environment (name => value) requested over the session */
env?: Record<string, string>
x11?: boolean | number | Record<string, unknown>
/** forward a local ssh-agent to the remote session */
agentForward?: boolean
}
export interface ConnectConfig {
host?: string
port?: number
username: string
password?: string
privateKey?: Buffer | string
passphrase?: string
/** ssh-agent socket path or a BaseAgent instance */
agent?: string
/** forward the local agent to the remote (requires `agent`) */
agentForward?: boolean
/** keepalive interval in milliseconds (0 disables) */
keepaliveInterval?: number
keepaliveCountMax?: number
/** ms to wait for handshake before erroring (0 disables) */
readyTimeout?: number
/** socket connect timeout in ms (0 disables) */
timeout?: number
hostHash?: string
/**
* Optional host key verification. When it returns a boolean, ssh2 uses it
* synchronously; a promise-using implementer must instead call the `verify`
* callback (returning `undefined`), which defers the handshake.
*/
hostVerifier?: (key: Buffer, verify: (permitted: boolean) => void) => boolean | void
debug?: (...args: unknown[]) => void
algorithms?: Record<string, unknown>
ident?: string | Buffer
sock?: Socket
strictVendor?: boolean
localAddress?: string
localHostname?: string
localUsername?: string
/** try keyboard-interactive auth */
tryKeyboard?: boolean
authHandler?: unknown
forceIPv4?: boolean
forceIPv6?: boolean
}
export class Client {
connect(cfg: ConnectConfig): this
end(): this
destroy(): this
shell(cb: (err: Error | undefined, stream: ClientChannel) => void): this
shell(
opts: PseudoTtyOptions | ShellOptions | false,
cb: (err: Error | undefined, stream: ClientChannel) => void
): this
exec(cmd: string, cb: (err: Error | undefined, stream: ClientChannel) => void): this
/** request an SFTP channel (M4) */
sftp(cb: (err: Error | undefined, sftp: SFTPWrapper) => void): this
on(event: 'ready' | 'close' | 'continue', listener: () => void): this
on(event: 'error', listener: (err: Error) => void): this
on(event: string, listener: (...args: never[]) => void): this
}
/** POSIX attributes ssh2 attachments to readdir entries / returns from stat. */
export interface SftpAttrs {
mode: number
uid: number
gid: number
size: number
mtime: number
}
export interface SftpStats extends SftpAttrs {
isDirectory(): boolean
}
/** Minimal SFTP surface used by src/main/sftp.ts (verified against SFTPWrapper). */
export interface SFTPWrapper {
end?(): void
readdir(
location: string,
cb: (err: Error | null, names: Array<string | { filename: string; longname: string; attrs?: SftpAttrs }>) => void
): void
mkdir(location: string, cb: (err: Error | null) => void): void
rmdir(location: string, cb: (err: Error | null) => void): void
unlink(location: string, cb: (err: Error | null) => void): void
rename(src: string, dest: string, cb: (err: Error | null) => void): void
setstat(location: string, attrs: { permissions?: number; uid?: number; gid?: number }, cb: (err: Error | null) => void): void
stat(location: string, cb: (err: Error | null, stats: SftpStats) => void): void
lstat(location: string, cb: (err: Error | null, stats: SftpStats) => void): void
open(location: string, flags: string, cb: (err: Error | null, handle: Buffer) => void): void
close(handle: Buffer, cb: (err: Error | null) => void): void
fstat(handle: Buffer, cb: (err: Error | null, stats: SftpStats) => void): void
write(handle: Buffer, buf: Buffer, offset: number, length: number, position: number, cb: (err: Error | null) => void): void
read(handle: Buffer, buf: Buffer, offset: number, length: number, position: number, cb: (err: Error | null, res: { bytesRead: number; buffer: Buffer }) => void): void
}
export function createAgent(path: string): unknown
}