filetransfer

package
v0.0.0-...-7bb6ebb Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Nov 7, 2024 License: MIT Imports: 13 Imported by: 0

Documentation

Index

Constants

View Source
const (
	// Register a sender
	InitialTypeRegisterSender = uint8(0x01)

	// Server responds back to sender with a unique code
	InitialTypeUniqueCode = uint8(0x02)

	// Register a receiver
	InitialTypeRegisterReceiver = uint8(0x03)

	// Server sends metadata of the transfer to the receiver
	InitialTypeTransferMetaData = uint8(0x04)

	// Server responds back to sender to begin transfer
	// Receiver responds with 1 or 0
	// 1 to begin transfer. 0 to abort.
	InitialTypeBeginTransfer = uint8(0x05)

	// Transfer packet from sender to receiver.
	InitialTypeTransferPacket = uint8(0x06)

	// Volutanry disconnection
	InitialTypeCloseConn = uint8(0x08)

	InitialTypeRequestNextPkt = uint8(0x10)
	InitialTypeFinishTransfer = uint8(0x11)

	// Server responds with transfer metadata of the transfer to receiver
	InitialTypeReceiverMD = uint8(0x21)

	// Receiver requests next pkt from server which inturn requests from sender
	InitialTypeRequestNextPacket = uint8(0x22)

	// A single file has finished transferring
	InitialTypeSingleFileTransferFinish = uint8(0x23)

	// All files have finished transferring
	InitialTypeAllTransferFinish = uint8(0x24)

	// Client, sender or receiver, requests the server to abort the transfer.
	InitialTypeAbortTransfer = uint8(0x25)

	// Server messages client
	InitialTypeTextMessage = uint8(0x26)

	// Server notifies the client that the connection is going to be closed.
	InitialTypeCloseConnNotify = uint8(0x27)

	// Server responds back to sender with the transfer code
	InitialTypeTransferCode = uint8(0x28)

	// Receiver aborts the transfer
	InitialAbortTransfer = uint8(0x29)

	// Receiver invokes a transfer of file with given idx from the server.
	InitialTypeStartTransferWithId = uint8(0x30)

	// current version
	Version = byte(1)
)

Different initial byte types different 1 -> Register a Sender 2 -> Server responds with unique_code 3 -> Register a Receiver 4 -> Server responds to Sender to begin transfer 5 -> Transfer packet from Sender to Receiver 6 -> TBD Something for if either client disconnects.

Variables

View Source
var (
	// UserMap            *ClientsMap   = NewClientsMap()
	// SubscribedUsersMap *ClientsMap   = NewClientsMap()
	// ConnUpgrader = websocket.Upgrader{}
	// File transfer map of all ongoing transfers
	FTMap *utils.ClientsMap[FTMeta] = utils.NewClientsMap[FTMeta]()
	// File transfer unique code generator
	FTCodeGenerator = FTCode_Generator{
					// contains filtered or unexported fields
	}

	FTUsersMap *utils.ClientsMap[FTMeta] = utils.NewClientsMap[FTMeta]()

	ConnUpgrader = websocket.Upgrader{}
)

Functions

func ConnWriteMessage

func ConnWriteMessage(conn *websocket.Conn, message ...string) error

Writes a string message to the conn with the InitialTypeTextMessage byte.

func CreateBinaryPacket

func CreateBinaryPacket(parts ...any) ([]byte, error)

Creates a binry packet with the given components. Byte order big endian

func DisconnectBoth

func DisconnectBoth(intent string, ongoingFT *FTMeta, disconnectReason string) error

Handles the disconnection for both sender and receiver. No need for individual disconnection for now. If sender -> If recv not connected: delete map and return err If recv connected: disconnnect recv through channel, delete map and return If Receiver -> Sender always connected: disconnect sender through channel, delete map and return Channel not working for some reason. Instead just updating the TransferStopped flag in the FTMeta and checking if it was when the other conn crashes. Other conn then deletes the obj from map and returns

func DisconnectClient

func DisconnectClient(currConn *websocket.Conn, code uint8, senderMessage, recvMessage string)

Handle Client socket disconnection Graceful handling prevents error logs

func DisconnectConn

func DisconnectConn(conn *websocket.Conn, message string) error

Server sends closeConn byte Issue is, both the connections have an infinite loop going on Closing one conn doesnt stop the loop Unless I make changes to the structs themselves there will always will be errors

func FileTransferWs

func FileTransferWs(c echo.Context) error

Since the 2 sockets are working concurrently Need to signal using a channel Work on it later

func HandleReceiver

func HandleReceiver(intent string, ongoingFT *FTMeta) error

func HandleRegisterReceiver

func HandleRegisterReceiver(incomingRecvName string, incomingCode uint8, incomingBuffer *bytes.Buffer, conn *websocket.Conn) (*FTMeta, *FTErrResp, error)

func HandleSender

func HandleSender(ongoingFT *FTMeta) error

func ParseReceiverCode

func ParseReceiverCode(incomingBuffer *bytes.Buffer) (uint8, string, error)

Types

type ClientHandshake

type ClientHandshake struct {
	Version uint8
	// Send => 0, Receive => 1
	Intent     uint8
	UniqueCode uint8
	FileSize   uint64
	ClientName string
	Filename   string
}

Since handshake is a 1 time thing, it will be done through json

type FTCode_Generator

type FTCode_Generator struct {
	// contains filtered or unexported fields
}

func (*FTCode_Generator) NewCode

func (idGen *FTCode_Generator) NewCode() uint8

Just increments the default value

type FTErrResp

type FTErrResp struct {
	Simple           string
	SenderDiscnMsg   string
	ReceiverDiscnMsg string
}

Object returned with error containing messages for sender, receiver

type FTMeta

type FTMeta struct {
	Code           uint8
	SenderName     string
	ReceiverName   string
	SenderConn     *websocket.Conn
	ReceiverConn   *websocket.Conn
	Filename       string
	FileSize       uint64
	FileInfo       *[]FileInfo
	Version        uint8
	SenderClosed   bool
	ReceiverClosed bool

	TransferStopped bool
	// contains filtered or unexported fields
}

Metadata for single file transfer transaction.

func HandleRegisterSender

func HandleRegisterSender(message []byte, conn *websocket.Conn) (*FTMeta, error)

Handling disconnection at the top level Funcs just send a cust error

func (*FTMeta) DisconnectBoth

func (ft *FTMeta) DisconnectBoth(messageSender string, messageReceiver string)

type FTPacket

type FTPacket struct {
	Version  uint8
	Code     uint8
	DataSize uint16
	Data     []byte
}

Datasize uint16 -> max size would be 65kb Datasize uint32 -> max size would be 4.2gb

type FileInfo

type FileInfo struct {
	Name string
	// Relative to the target folder.
	RelativePath string
	// Abs path of the file in the system.
	AbsPath string
	Size    uint64

	// Unique id for each file. Used to invoke transfer of a certain file from the sender.
	// Only 254 files can be shared at once
	Id uint8
}

type MDReceiver

type MDReceiver struct {
	FileSize   uint64
	SenderName string
	Filename   string
}

Metadata for receiver from server

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL