2020-06-08 04:49:55 +02:00
|
|
|
require "ipc"
|
2020-06-06 20:43:14 +02:00
|
|
|
|
2020-06-08 04:49:55 +02:00
|
|
|
class FileStorage::Client < IPC::Client
|
|
|
|
property auth_token : String
|
2020-06-06 20:43:14 +02:00
|
|
|
|
2020-06-08 04:49:55 +02:00
|
|
|
def initialize(@auth_token, service_name = "filestorage")
|
|
|
|
super service_name
|
|
|
|
end
|
2020-06-06 20:43:14 +02:00
|
|
|
|
2020-06-08 04:49:55 +02:00
|
|
|
def login
|
|
|
|
request = FileStorage::Request::Login.new auth_token
|
|
|
|
send request
|
2020-06-06 20:43:14 +02:00
|
|
|
|
2020-06-08 04:49:55 +02:00
|
|
|
response = parse_message [
|
|
|
|
FileStorage::Response::Login,
|
|
|
|
FileStorage::Errors::GenericError
|
|
|
|
], read
|
|
|
|
|
|
|
|
if response.responds_to? :mid
|
|
|
|
if request.mid != response.mid
|
|
|
|
raise "mid from response != request"
|
|
|
|
end
|
|
|
|
else
|
|
|
|
raise "response doen't even have mid"
|
2020-06-06 20:43:14 +02:00
|
|
|
end
|
|
|
|
|
|
|
|
response
|
|
|
|
end
|
|
|
|
|
2020-06-08 04:49:55 +02:00
|
|
|
def get_file_info(file_path : String)
|
|
|
|
file_info : FileStorage::FileInfo
|
|
|
|
file = File.open(file_path)
|
|
|
|
file_info = FileStorage::FileInfo.new file
|
|
|
|
file.close
|
|
|
|
file_info.not_nil!
|
|
|
|
end
|
2020-06-06 20:43:14 +02:00
|
|
|
|
2020-06-08 04:49:55 +02:00
|
|
|
def transfer(file_path : String)
|
|
|
|
file_info = get_file_info file_path
|
|
|
|
|
|
|
|
File.open(file_path) do |file|
|
|
|
|
buffer_size = FileStorage.message_buffer_size
|
|
|
|
|
|
|
|
buffer = Bytes.new buffer_size
|
|
|
|
counter = 0
|
|
|
|
size = 0
|
|
|
|
|
|
|
|
while (size = file.read(buffer)) > 0
|
|
|
|
puts "loop !!!"
|
|
|
|
# transfer message = file_info, chunk count, data (will be base64'd)
|
|
|
|
transfer_message = FileStorage::Request::PutChunk.new file_info,
|
|
|
|
counter,
|
|
|
|
buffer[0 ... size]
|
|
|
|
|
|
|
|
send transfer_message
|
|
|
|
counter += 1
|
|
|
|
|
|
|
|
buffer = Bytes.new buffer_size
|
|
|
|
|
|
|
|
# Check for the response
|
|
|
|
response = parse_message [
|
|
|
|
FileStorage::Response::PutChunk,
|
|
|
|
FileStorage::Errors::GenericError
|
|
|
|
], read
|
|
|
|
|
|
|
|
if response.responds_to? :mid
|
|
|
|
if response.mid != transfer_message.mid
|
|
|
|
raise "request and response mid !=: #{response.mid} != #{transfer_message.mid}"
|
|
|
|
else
|
|
|
|
pp! response
|
|
|
|
end
|
|
|
|
else
|
|
|
|
raise "response doesn't have mid"
|
|
|
|
end
|
|
|
|
end
|
2020-06-06 20:43:14 +02:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
def download(filedigest = nil, name = nil, tags = nil)
|
|
|
|
request = FileStorage::Request::Download.new filedigest, name, tags
|
|
|
|
send request
|
|
|
|
|
2020-06-08 04:49:55 +02:00
|
|
|
response = parse_message [
|
|
|
|
FileStorage::Response::Download,
|
|
|
|
FileStorage::Errors::GenericError
|
|
|
|
], read
|
2020-06-06 20:43:14 +02:00
|
|
|
|
|
|
|
response
|
|
|
|
end
|
|
|
|
|
2020-06-08 04:49:55 +02:00
|
|
|
def upload(file : String)
|
|
|
|
file_info : FileStorage::FileInfo
|
|
|
|
File.open(file) do |f|
|
|
|
|
file_info = FileStorage::FileInfo.new f
|
|
|
|
request = FileStorage::Request::Upload.new file_info
|
|
|
|
send request
|
2020-06-06 20:43:14 +02:00
|
|
|
end
|
|
|
|
|
2020-06-08 04:49:55 +02:00
|
|
|
response = parse_message [
|
|
|
|
FileStorage::Response::Upload,
|
|
|
|
FileStorage::Errors::GenericError
|
|
|
|
], read
|
|
|
|
|
2020-06-06 20:43:14 +02:00
|
|
|
response
|
|
|
|
end
|
|
|
|
end
|