filestoraged/src/requests/transfer.cr

94 lines
2.7 KiB
Crystal

class FileStorage::Request
IPC::JSON.message PutChunk, 40 do
property mid : String # autogenerated
property filedigest : String # SHA256 digest of the entire file
# Chunk:
# - n : Int32 => chunk number
# - on : Int32 => number of chunks
# - digest : String => digest of the chunk
property chunk : Chunk # For now, just the counter in a string
property data : String # base64 slice
def initialize(file_info : FileInfo, count, bindata)
# count: chunk number
@filedigest = file_info.digest
@data = Base64.encode bindata
@chunk = FileStorage::Chunk.new count, file_info.nb_chunks - 1, @data
@mid = UUID.random.to_s
end
def handle(filestoraged : FileStorage::Service, event : IPC::Event)
user = filestoraged.get_logged_user event
raise NotLoggedException.new if user.nil?
if filestoraged.faulty
filestoraged.faulty_nb += 1
if filestoraged.faulty_nb == 4
filestoraged.faulty_nb = 0
raise "FAULTY"
end
end
# FIXME: Maybe this should be moved to FileStorage::Service
fd = event.fd
user_data = filestoraged.get_user_data user.uid
Baguette::Log.debug "PutChunk request: #{@mid}, file #{@filedigest}, chunk: n=#{@chunk.n}, on=#{@chunk.on}, digest=#{@chunk.digest}"
filestoraged.storage.write_chunk self, user_data
end
end
FileStorage.requests << PutChunk
IPC::JSON.message GetChunk, 41 do
property mid : String # autogenerated
property filedigest : String # SHA256 digest of the entire file
property n : Int32 # chunk number
def initialize(@filedigest, @n)
@mid = UUID.random.to_s
end
def handle(filestoraged : FileStorage::Service, event : IPC::Event)
user = filestoraged.get_logged_user event
raise NotLoggedException.new if user.nil?
# FIXME: Maybe this should be moved to FileStorage::Service
fd = event.fd
user_data = filestoraged.get_user_data user.uid
Baguette::Log.debug "PutChunk request: #{@mid}, file #{@filedigest}, chunk: n=#{@n}"
filestoraged.storage.read_chunk self, user_data
end
end
FileStorage.requests << GetChunk
end
class FileStorage::Response
IPC::JSON.message PutChunk, 40 do
property mid : String
property file_digest : String
property n : Int32 # chunk number
def initialize(@mid, @file_digest, @n)
end
end
IPC::JSON.message GetChunk, 41 do
property mid : String
property file_digest : String
# Chunk:
# - n : Int32 => chunk number
# - on : Int32 => number of chunks
# - digest : String => digest of the chunk
property chunk : Chunk # Currently: info about the chunk
property data : String # base64 slice
def initialize(@mid, @file_digest, @chunk, @data)
end
end
end