no more websocket ack messages, just use lower-level backpressure
This commit is contained in:
parent
1b38a2ee30
commit
2e29825a3d
2
Cargo.lock
generated
2
Cargo.lock
generated
|
@ -1778,7 +1778,7 @@ dependencies = [
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "transbeam"
|
name = "transbeam"
|
||||||
version = "0.3.0"
|
version = "0.4.0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"actix",
|
"actix",
|
||||||
"actix-files",
|
"actix-files",
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
[package]
|
[package]
|
||||||
name = "transbeam"
|
name = "transbeam"
|
||||||
version = "0.3.0"
|
version = "0.4.0"
|
||||||
authors = ["xenofem <xenofem@xeno.science>"]
|
authors = ["xenofem <xenofem@xeno.science>"]
|
||||||
edition = "2021"
|
edition = "2021"
|
||||||
license = "MIT"
|
license = "MIT"
|
||||||
|
|
|
@ -51,10 +51,6 @@ async def send(paths, host, password, lifetime, collection_name=None):
|
||||||
loader = file_loader([(paths[i], fileMetadata[i]["size"]) for i in range(len(paths))])
|
loader = file_loader([(paths[i], fileMetadata[i]["size"]) for i in range(len(paths))])
|
||||||
for data in loader:
|
for data in loader:
|
||||||
await ws.send(data)
|
await ws.send(data)
|
||||||
resp = await ws.recv()
|
|
||||||
if resp != "ack":
|
|
||||||
tqdm.write("unexpected response: {}".format(resp))
|
|
||||||
exit(1)
|
|
||||||
|
|
||||||
parser = argparse.ArgumentParser(description="Upload files to transbeam")
|
parser = argparse.ArgumentParser(description="Upload files to transbeam")
|
||||||
parser.add_argument("-l", "--lifetime", type=int, default=7, help="Lifetime in days for files (default 7)")
|
parser.add_argument("-l", "--lifetime", type=int, default=7, help="Lifetime in days for files (default 7)")
|
||||||
|
|
|
@ -211,10 +211,6 @@ impl StreamHandler<Result<ws::Message, ws::ProtocolError>> for Uploader {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn ack(ctx: &mut Context) {
|
|
||||||
ctx.text("ack");
|
|
||||||
}
|
|
||||||
|
|
||||||
impl Uploader {
|
impl Uploader {
|
||||||
fn notify_error_and_cleanup(&mut self, e: Error, ctx: &mut Context) {
|
fn notify_error_and_cleanup(&mut self, e: Error, ctx: &mut Context) {
|
||||||
error!("{}", e);
|
error!("{}", e);
|
||||||
|
@ -350,13 +346,10 @@ impl Uploader {
|
||||||
}),
|
}),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
ws::Message::Binary(data) | ws::Message::Continuation(Item::Last(data)) => {
|
ws::Message::Binary(data)
|
||||||
let result = self.handle_data(data)?;
|
| ws::Message::Continuation(Item::FirstBinary(data))
|
||||||
ack(ctx);
|
| ws::Message::Continuation(Item::Continue(data))
|
||||||
return Ok(result);
|
| ws::Message::Continuation(Item::Last(data)) => {
|
||||||
}
|
|
||||||
ws::Message::Continuation(Item::FirstBinary(data))
|
|
||||||
| ws::Message::Continuation(Item::Continue(data)) => {
|
|
||||||
return self.handle_data(data);
|
return self.handle_data(data);
|
||||||
}
|
}
|
||||||
ws::Message::Close(reason) => {
|
ws::Message::Close(reason) => {
|
||||||
|
|
|
@ -2,6 +2,8 @@ const FILE_CHUNK_SIZE = 16384;
|
||||||
const MAX_FILES = 256;
|
const MAX_FILES = 256;
|
||||||
const SAMPLE_WINDOW = 100;
|
const SAMPLE_WINDOW = 100;
|
||||||
const STALL_THRESHOLD = 1000;
|
const STALL_THRESHOLD = 1000;
|
||||||
|
const MAX_WS_BUFFER = 1048576;
|
||||||
|
const WS_BUFFER_DELAY = 10;
|
||||||
|
|
||||||
let files = [];
|
let files = [];
|
||||||
|
|
||||||
|
@ -204,7 +206,11 @@ function sendManifest() {
|
||||||
}
|
}
|
||||||
|
|
||||||
function handleMessage(msg) {
|
function handleMessage(msg) {
|
||||||
if (bytesSent === 0) {
|
if (bytesSent > 0) {
|
||||||
|
console.warn('Received unexpected message from server during upload', msg.data);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
let reply;
|
let reply;
|
||||||
try {
|
try {
|
||||||
reply = JSON.parse(msg.data);
|
reply = JSON.parse(msg.data);
|
||||||
|
@ -237,15 +243,6 @@ function handleMessage(msg) {
|
||||||
} else if (reply.type === 'error') {
|
} else if (reply.type === 'error') {
|
||||||
displayError(reply.details);
|
displayError(reply.details);
|
||||||
}
|
}
|
||||||
} else {
|
|
||||||
if (msg.data === 'ack') {
|
|
||||||
sendData();
|
|
||||||
} else {
|
|
||||||
console.error('Received unexpected message from server instead of ack', msg.data);
|
|
||||||
displayError();
|
|
||||||
socket.close();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function updateMaxLifetime(lifetime) {
|
function updateMaxLifetime(lifetime) {
|
||||||
|
@ -262,10 +259,21 @@ function updateMaxLifetime(lifetime) {
|
||||||
}
|
}
|
||||||
|
|
||||||
function sendData() {
|
function sendData() {
|
||||||
|
if (socket.readyState !== 1) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
while (true) {
|
||||||
if (fileIndex >= files.length) {
|
if (fileIndex >= files.length) {
|
||||||
finishSending();
|
finishSending();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (socket.bufferedAmount >= MAX_WS_BUFFER) {
|
||||||
|
setTimeout(sendData, WS_BUFFER_DELAY);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
const currentFile = files[fileIndex];
|
const currentFile = files[fileIndex];
|
||||||
if (byteIndex < currentFile.size) {
|
if (byteIndex < currentFile.size) {
|
||||||
const endpoint = Math.min(byteIndex+FILE_CHUNK_SIZE, currentFile.size);
|
const endpoint = Math.min(byteIndex+FILE_CHUNK_SIZE, currentFile.size);
|
||||||
|
@ -287,7 +295,7 @@ function sendData() {
|
||||||
} else {
|
} else {
|
||||||
fileIndex += 1;
|
fileIndex += 1;
|
||||||
byteIndex = 0;
|
byteIndex = 0;
|
||||||
sendData();
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue