- FolderPicker: uses webkitRelativePath so paths like docs/report.pdf are preserved; adds "include subfolders" checkbox (default on) - FileBrowser: virtual directory tree with breadcrumb navigation, sort by name/size, search filter, folders shown before files - Protocol: browse sends path alongside name; get uses path as key - FileEntry type gains optional path field Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
117 lines
2.5 KiB
TypeScript
117 lines
2.5 KiB
TypeScript
// Types mirroring internal/proto — keep in sync with proto.go
|
|
|
|
export type PeerID = string // 64-char lowercase hex
|
|
|
|
export interface PeerInfo {
|
|
id: PeerID
|
|
alias: string
|
|
public_key: string
|
|
created_at: string
|
|
}
|
|
|
|
export interface NetworkInfo {
|
|
network_id: string
|
|
network_name: string
|
|
local_peer?: PeerInfo
|
|
share_dir?: string
|
|
download_dir?: string
|
|
}
|
|
|
|
export interface ChatMessage {
|
|
mid?: string
|
|
from: PeerID
|
|
to?: PeerID
|
|
room: string
|
|
text: string
|
|
ts: number // Unix ms
|
|
}
|
|
|
|
export interface FileEntry {
|
|
name: string
|
|
size_bytes: number
|
|
path?: string // relative path including filename, e.g. "docs/report.pdf"
|
|
}
|
|
|
|
export interface FileOffer {
|
|
xid: string
|
|
name: string
|
|
size: number
|
|
sha256: string
|
|
}
|
|
|
|
// ── IPC message types ─────────────────────────────────────────────────────────
|
|
|
|
export type CandidateType = 'host' | 'srflx' | 'relay' | 'unknown'
|
|
export type PeerConnState = 'new' | 'connecting' | 'connected' | 'disconnected' | 'failed' | 'closed'
|
|
|
|
export type IpcMsgType =
|
|
// commands
|
|
| 'send_message'
|
|
| 'join_network'
|
|
| 'leave_network'
|
|
| 'get_state'
|
|
| 'send_file'
|
|
| 'set_share_dir'
|
|
| 'generate_invite'
|
|
| 'get_file_list'
|
|
| 'export_identity'
|
|
| 'import_identity'
|
|
// events
|
|
| 'state_snapshot'
|
|
| 'message_received'
|
|
| 'peer_connected'
|
|
| 'peer_disconnected'
|
|
| 'session_ready'
|
|
| 'network_joined'
|
|
| 'network_left'
|
|
| 'file_list'
|
|
| 'file_progress'
|
|
| 'file_complete'
|
|
| 'incoming_file'
|
|
| 'invite_generated'
|
|
| 'identity_exported'
|
|
| 'identity_imported'
|
|
| 'peer_status'
|
|
| 'error'
|
|
|
|
export interface IpcMessage {
|
|
type: IpcMsgType
|
|
// routing
|
|
network_id?: string
|
|
// send_message
|
|
room?: string
|
|
to?: PeerID
|
|
body?: string
|
|
// join_network
|
|
network_name?: string
|
|
network_hash?: string // 64-char hex (yaw2 `net` field) — alternative to network_name
|
|
share_dir?: string
|
|
// send_file / set_share_dir
|
|
path?: string
|
|
peer_id?: PeerID
|
|
// identity
|
|
passphrase?: string
|
|
backup?: string
|
|
// events
|
|
peer?: PeerInfo
|
|
nick?: string
|
|
message?: ChatMessage
|
|
offer?: FileOffer
|
|
transfer_id?: string
|
|
bytes_received?: number
|
|
total_bytes?: number
|
|
master_alias?: string
|
|
master_id?: string
|
|
local_peer?: PeerInfo
|
|
connected_peers?: PeerInfo[]
|
|
rooms?: string[]
|
|
networks?: NetworkInfo[]
|
|
error_message?: string
|
|
invite?: string
|
|
files?: FileEntry[]
|
|
// peer_status
|
|
conn_state?: PeerConnState
|
|
candidate_type?: CandidateType
|
|
remote_address?: string
|
|
}
|