added prettier
This commit is contained in:
676
src/ops/index.js
676
src/ops/index.js
@@ -1,5 +1,5 @@
|
||||
import fs from 'fs';
|
||||
import {Uint64BE} from 'int64-buffer';
|
||||
import { Uint64BE } from 'int64-buffer';
|
||||
|
||||
import file from '../io/file';
|
||||
import packet from '../networking/packet';
|
||||
@@ -9,8 +9,10 @@ const _snapshot_directory = async (conn, remote_path) => {
|
||||
const request = new packet();
|
||||
request.encode_utf8(remote_path);
|
||||
|
||||
const response =
|
||||
await conn.send('::RemoteJSONCreateDirectorySnapshot', request);
|
||||
const response = await conn.send(
|
||||
'::RemoteJSONCreateDirectorySnapshot',
|
||||
request
|
||||
);
|
||||
response.decode_ui32(); // Service flags
|
||||
|
||||
const result = response.decode_i32();
|
||||
@@ -28,15 +30,17 @@ const _snapshot_directory = async (conn, remote_path) => {
|
||||
};
|
||||
|
||||
try {
|
||||
const get_page = async page => {
|
||||
const get_page = async (page) => {
|
||||
try {
|
||||
const request = new packet();
|
||||
request.encode_utf8(remote_path);
|
||||
request.encode_ui64(data.handle);
|
||||
request.encode_ui32(page);
|
||||
|
||||
const response =
|
||||
await conn.send('::RemoteJSONReadDirectorySnapshot', request);
|
||||
const response = await conn.send(
|
||||
'::RemoteJSONReadDirectorySnapshot',
|
||||
request
|
||||
);
|
||||
response.decode_ui32(); // Service flags
|
||||
|
||||
const result = response.decode_i32();
|
||||
@@ -67,22 +71,29 @@ const _snapshot_directory = async (conn, remote_path) => {
|
||||
}
|
||||
};
|
||||
|
||||
export const close_file =
|
||||
async (conn, remote_path, handle, optional_thread_id) => {
|
||||
try {
|
||||
const request = new packet();
|
||||
request.encode_utf8(remote_path);
|
||||
request.encode_ui64(handle);
|
||||
export const close_file = async (
|
||||
conn,
|
||||
remote_path,
|
||||
handle,
|
||||
optional_thread_id
|
||||
) => {
|
||||
try {
|
||||
const request = new packet();
|
||||
request.encode_utf8(remote_path);
|
||||
request.encode_ui64(handle);
|
||||
|
||||
const response =
|
||||
await conn.send('::RemoteFUSERelease', request, optional_thread_id);
|
||||
response.decode_ui32(); // Service flags
|
||||
const response = await conn.send(
|
||||
'::RemoteFUSERelease',
|
||||
request,
|
||||
optional_thread_id
|
||||
);
|
||||
response.decode_ui32(); // Service flags
|
||||
|
||||
return response.decode_i32();
|
||||
} catch (err) {
|
||||
return Promise.reject(new Error(`'close_file' failed: ${err}`));
|
||||
}
|
||||
};
|
||||
return response.decode_i32();
|
||||
} catch (err) {
|
||||
return Promise.reject(new Error(`'close_file' failed: ${err}`));
|
||||
}
|
||||
};
|
||||
|
||||
export const create_directory = async (conn, remote_path) => {
|
||||
try {
|
||||
@@ -99,28 +110,34 @@ export const create_directory = async (conn, remote_path) => {
|
||||
}
|
||||
};
|
||||
|
||||
export const create_or_open_file =
|
||||
async (conn, remote_path, optional_thread_id) => {
|
||||
try {
|
||||
const request = new packet();
|
||||
request.encode_utf8(remote_path);
|
||||
request.encode_ui16((7 << 6) | (5 << 3));
|
||||
request.encode_ui32(2 | 4); // Read-Write, Create
|
||||
export const create_or_open_file = async (
|
||||
conn,
|
||||
remote_path,
|
||||
optional_thread_id
|
||||
) => {
|
||||
try {
|
||||
const request = new packet();
|
||||
request.encode_utf8(remote_path);
|
||||
request.encode_ui16((7 << 6) | (5 << 3));
|
||||
request.encode_ui32(2 | 4); // Read-Write, Create
|
||||
|
||||
const response =
|
||||
await conn.send('::RemoteFUSECreate', request, optional_thread_id);
|
||||
response.decode_ui32(); // Service flags
|
||||
const response = await conn.send(
|
||||
'::RemoteFUSECreate',
|
||||
request,
|
||||
optional_thread_id
|
||||
);
|
||||
response.decode_ui32(); // Service flags
|
||||
|
||||
const result = response.decode_i32();
|
||||
if (result === 0) {
|
||||
return response.decode_ui64();
|
||||
}
|
||||
|
||||
return Promise.reject(new Error(`'create_or_open_file' error: ${result}`));
|
||||
} catch (err) {
|
||||
return Promise.reject(new Error(`'create_or_open_file' failed: ${err}`));
|
||||
const result = response.decode_i32();
|
||||
if (result === 0) {
|
||||
return response.decode_ui64();
|
||||
}
|
||||
};
|
||||
|
||||
return Promise.reject(new Error(`'create_or_open_file' error: ${result}`));
|
||||
} catch (err) {
|
||||
return Promise.reject(new Error(`'create_or_open_file' failed: ${err}`));
|
||||
}
|
||||
};
|
||||
|
||||
export const delete_file = async (conn, remote_path) => {
|
||||
try {
|
||||
@@ -136,97 +153,113 @@ export const delete_file = async (conn, remote_path) => {
|
||||
}
|
||||
};
|
||||
|
||||
export const download_file =
|
||||
async (conn, remote_path, local_path, progress_cb, overwrite, resume) => {
|
||||
try {
|
||||
const src = new file(conn, await open_file(conn, remote_path), remote_path);
|
||||
const cleanup = async fd => {
|
||||
try {
|
||||
await src.close();
|
||||
} catch (err) {
|
||||
console.log(err);
|
||||
}
|
||||
try {
|
||||
if (fd !== undefined) {
|
||||
fs.closeSync(fd);
|
||||
}
|
||||
} catch (err) {
|
||||
console.log(err);
|
||||
}
|
||||
};
|
||||
|
||||
export const download_file = async (
|
||||
conn,
|
||||
remote_path,
|
||||
local_path,
|
||||
progress_cb,
|
||||
overwrite,
|
||||
resume
|
||||
) => {
|
||||
try {
|
||||
const src = new file(conn, await open_file(conn, remote_path), remote_path);
|
||||
const cleanup = async (fd) => {
|
||||
try {
|
||||
const src_size = await src.get_size();
|
||||
let dst_fd;
|
||||
|
||||
try {
|
||||
let offset = 0;
|
||||
if (overwrite) {
|
||||
dst_fd = fs.openSync(local_path, 'w+');
|
||||
} else if (resume) {
|
||||
dst_fd = fs.openSync(local_path, 'r+');
|
||||
|
||||
const dst_size = fs.fstatSync(dst_fd).size;
|
||||
if (dst_size === src_size) {
|
||||
await cleanup(dst_fd);
|
||||
return true;
|
||||
}
|
||||
|
||||
if (dst_size > src_size) {
|
||||
await cleanup(dst_fd);
|
||||
return Promise.reject(new Error(
|
||||
`'download_file' failed: destination is larger than source`));
|
||||
}
|
||||
|
||||
offset = dst_size;
|
||||
} else {
|
||||
if (fs.existsSync(local_path)) {
|
||||
await cleanup(dst_fd);
|
||||
return Promise.reject(
|
||||
new Error(`'download_file' failed: file exists`));
|
||||
}
|
||||
|
||||
dst_fd = fs.openSync(local_path, 'wx+');
|
||||
}
|
||||
|
||||
let remain = src_size - offset;
|
||||
while (remain > 0) {
|
||||
const to_write = remain >= 65536 ? 65536 : remain;
|
||||
const buffer = await src.read(offset, to_write);
|
||||
const written = fs.writeSync(dst_fd, buffer, 0, to_write, offset);
|
||||
if (written > 0) {
|
||||
remain -= written;
|
||||
offset += written;
|
||||
if (progress_cb) {
|
||||
progress_cb(local_path, remote_path,
|
||||
((src_size - remain) / src_size) * 100.0, false);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (progress_cb) {
|
||||
progress_cb(local_path, remote_path, 100, true);
|
||||
}
|
||||
|
||||
await cleanup(dst_fd);
|
||||
return true;
|
||||
} catch (err) {
|
||||
await cleanup(dst_fd);
|
||||
return Promise.reject(new Error(`'download_file' failed: ${err}`));
|
||||
await src.close();
|
||||
} catch (err) {
|
||||
console.log(err);
|
||||
}
|
||||
try {
|
||||
if (fd !== undefined) {
|
||||
fs.closeSync(fd);
|
||||
}
|
||||
} catch (err) {
|
||||
await cleanup();
|
||||
console.log(err);
|
||||
}
|
||||
};
|
||||
|
||||
try {
|
||||
const src_size = await src.get_size();
|
||||
let dst_fd;
|
||||
|
||||
try {
|
||||
let offset = 0;
|
||||
if (overwrite) {
|
||||
dst_fd = fs.openSync(local_path, 'w+');
|
||||
} else if (resume) {
|
||||
dst_fd = fs.openSync(local_path, 'r+');
|
||||
|
||||
const dst_size = fs.fstatSync(dst_fd).size;
|
||||
if (dst_size === src_size) {
|
||||
await cleanup(dst_fd);
|
||||
return true;
|
||||
}
|
||||
|
||||
if (dst_size > src_size) {
|
||||
await cleanup(dst_fd);
|
||||
return Promise.reject(
|
||||
new Error(
|
||||
`'download_file' failed: destination is larger than source`
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
offset = dst_size;
|
||||
} else {
|
||||
if (fs.existsSync(local_path)) {
|
||||
await cleanup(dst_fd);
|
||||
return Promise.reject(
|
||||
new Error(`'download_file' failed: file exists`)
|
||||
);
|
||||
}
|
||||
|
||||
dst_fd = fs.openSync(local_path, 'wx+');
|
||||
}
|
||||
|
||||
let remain = src_size - offset;
|
||||
while (remain > 0) {
|
||||
const to_write = remain >= 65536 ? 65536 : remain;
|
||||
const buffer = await src.read(offset, to_write);
|
||||
const written = fs.writeSync(dst_fd, buffer, 0, to_write, offset);
|
||||
if (written > 0) {
|
||||
remain -= written;
|
||||
offset += written;
|
||||
if (progress_cb) {
|
||||
progress_cb(
|
||||
local_path,
|
||||
remote_path,
|
||||
((src_size - remain) / src_size) * 100.0,
|
||||
false
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (progress_cb) {
|
||||
progress_cb(local_path, remote_path, 100, true);
|
||||
}
|
||||
|
||||
await cleanup(dst_fd);
|
||||
return true;
|
||||
} catch (err) {
|
||||
await cleanup(dst_fd);
|
||||
return Promise.reject(new Error(`'download_file' failed: ${err}`));
|
||||
}
|
||||
} catch (err) {
|
||||
await cleanup();
|
||||
return Promise.reject(new Error(`'download_file' failed: ${err}`));
|
||||
}
|
||||
};
|
||||
} catch (err) {
|
||||
return Promise.reject(new Error(`'download_file' failed: ${err}`));
|
||||
}
|
||||
};
|
||||
|
||||
export const get_drive_information = async conn => {
|
||||
export const get_drive_information = async (conn) => {
|
||||
try {
|
||||
const response =
|
||||
await conn.send('::RemoteWinFSPGetVolumeInfo', new packet());
|
||||
const response = await conn.send(
|
||||
'::RemoteWinFSPGetVolumeInfo',
|
||||
new packet()
|
||||
);
|
||||
response.decode_ui32(); // Service flags
|
||||
|
||||
const result = response.decode_i32();
|
||||
@@ -241,40 +274,52 @@ export const get_drive_information = async conn => {
|
||||
}
|
||||
|
||||
return Promise.reject(
|
||||
new Error(`'get_drive_information' failed: ${result}`));
|
||||
new Error(`'get_drive_information' failed: ${result}`)
|
||||
);
|
||||
} catch (err) {
|
||||
return Promise.reject(new Error(`'get_drive_information' failed: ${err}`));
|
||||
}
|
||||
};
|
||||
|
||||
export const get_file_attributes =
|
||||
async (conn, handle, remote_path, optional_thread_id) => {
|
||||
try {
|
||||
const request = new packet();
|
||||
request.encode_utf8(remote_path);
|
||||
request.encode_ui64(handle);
|
||||
request.encode_ui32(0);
|
||||
request.encode_ui32(0);
|
||||
export const get_file_attributes = async (
|
||||
conn,
|
||||
handle,
|
||||
remote_path,
|
||||
optional_thread_id
|
||||
) => {
|
||||
try {
|
||||
const request = new packet();
|
||||
request.encode_utf8(remote_path);
|
||||
request.encode_ui64(handle);
|
||||
request.encode_ui32(0);
|
||||
request.encode_ui32(0);
|
||||
|
||||
const response =
|
||||
await conn.send('::RemoteFUSEFgetattr', request, optional_thread_id);
|
||||
response.decode_ui32(); // Service flags
|
||||
const response = await conn.send(
|
||||
'::RemoteFUSEFgetattr',
|
||||
request,
|
||||
optional_thread_id
|
||||
);
|
||||
response.decode_ui32(); // Service flags
|
||||
|
||||
const result = response.decode_i32();
|
||||
if (result === 0) {
|
||||
return response.decode_stat();
|
||||
}
|
||||
|
||||
return Promise.reject(new Error(`'get_file_attributes' failed: ${result}`));
|
||||
} catch (err) {
|
||||
return Promise.reject(new Error(`'get_file_attributes' failed: ${err}`));
|
||||
const result = response.decode_i32();
|
||||
if (result === 0) {
|
||||
return response.decode_stat();
|
||||
}
|
||||
};
|
||||
|
||||
return Promise.reject(new Error(`'get_file_attributes' failed: ${result}`));
|
||||
} catch (err) {
|
||||
return Promise.reject(new Error(`'get_file_attributes' failed: ${err}`));
|
||||
}
|
||||
};
|
||||
|
||||
export const list_directory = async (conn, remote_path, page_reader_cb) => {
|
||||
const dir_snapshot = await _snapshot_directory(conn, remote_path);
|
||||
try {
|
||||
await page_reader_cb(dir_snapshot.remote_path, dir_snapshot.page_count, dir_snapshot.get_page);
|
||||
await page_reader_cb(
|
||||
dir_snapshot.remote_path,
|
||||
dir_snapshot.page_count,
|
||||
dir_snapshot.get_page
|
||||
);
|
||||
await dir_snapshot.release();
|
||||
} catch (err) {
|
||||
await dir_snapshot.release();
|
||||
@@ -288,8 +333,11 @@ export const open_file = async (conn, remote_path, optional_thread_id) => {
|
||||
request.encode_utf8(remote_path);
|
||||
request.encode_ui32(2); // Read-Write
|
||||
|
||||
const response =
|
||||
await conn.send('::RemoteFUSEOpen', request, optional_thread_id);
|
||||
const response = await conn.send(
|
||||
'::RemoteFUSEOpen',
|
||||
request,
|
||||
optional_thread_id
|
||||
);
|
||||
response.decode_ui32(); // Service flags
|
||||
|
||||
const result = response.decode_i32();
|
||||
@@ -302,28 +350,37 @@ export const open_file = async (conn, remote_path, optional_thread_id) => {
|
||||
}
|
||||
};
|
||||
|
||||
export const read_file =
|
||||
async (conn, handle, remote_path, offset, length, optional_thread_id) => {
|
||||
try {
|
||||
const request = new packet();
|
||||
request.encode_utf8(remote_path);
|
||||
request.encode_ui64(length);
|
||||
request.encode_ui64(offset);
|
||||
request.encode_ui64(handle);
|
||||
export const read_file = async (
|
||||
conn,
|
||||
handle,
|
||||
remote_path,
|
||||
offset,
|
||||
length,
|
||||
optional_thread_id
|
||||
) => {
|
||||
try {
|
||||
const request = new packet();
|
||||
request.encode_utf8(remote_path);
|
||||
request.encode_ui64(length);
|
||||
request.encode_ui64(offset);
|
||||
request.encode_ui64(handle);
|
||||
|
||||
const response =
|
||||
await conn.send('::RemoteFUSERead', request, optional_thread_id);
|
||||
response.decode_ui32(); // Service flags
|
||||
const response = await conn.send(
|
||||
'::RemoteFUSERead',
|
||||
request,
|
||||
optional_thread_id
|
||||
);
|
||||
response.decode_ui32(); // Service flags
|
||||
|
||||
const result = response.decode_i32();
|
||||
if (result === length) {
|
||||
return response.decode_buffer(result);
|
||||
}
|
||||
return Promise.reject(new Error(`'read_file' error: ${result}`));
|
||||
} catch (err) {
|
||||
return Promise.reject(new Error(`'read_file' failed: ${err}`));
|
||||
const result = response.decode_i32();
|
||||
if (result === length) {
|
||||
return response.decode_buffer(result);
|
||||
}
|
||||
};
|
||||
return Promise.reject(new Error(`'read_file' error: ${result}`));
|
||||
} catch (err) {
|
||||
return Promise.reject(new Error(`'read_file' failed: ${err}`));
|
||||
}
|
||||
};
|
||||
|
||||
export const remove_directory = async (conn, remote_path) => {
|
||||
try {
|
||||
@@ -341,146 +398,183 @@ export const remove_directory = async (conn, remote_path) => {
|
||||
|
||||
export const snapshot_directory = _snapshot_directory;
|
||||
|
||||
export const truncate_file =
|
||||
async (conn, handle, remote_path, length, optional_thread_id) => {
|
||||
try {
|
||||
const request = new packet();
|
||||
request.encode_utf8(remote_path);
|
||||
request.encode_ui64(length);
|
||||
request.encode_ui64(handle);
|
||||
export const truncate_file = async (
|
||||
conn,
|
||||
handle,
|
||||
remote_path,
|
||||
length,
|
||||
optional_thread_id
|
||||
) => {
|
||||
try {
|
||||
const request = new packet();
|
||||
request.encode_utf8(remote_path);
|
||||
request.encode_ui64(length);
|
||||
request.encode_ui64(handle);
|
||||
|
||||
const response =
|
||||
await conn.send('::RemoteFUSEFtruncate', request, optional_thread_id);
|
||||
response.decode_ui32(); // Service flags
|
||||
const response = await conn.send(
|
||||
'::RemoteFUSEFtruncate',
|
||||
request,
|
||||
optional_thread_id
|
||||
);
|
||||
response.decode_ui32(); // Service flags
|
||||
|
||||
return response.decode_i32();
|
||||
} catch (err) {
|
||||
return Promise.reject(new Error(`'truncate_file' failed: ${err}`));
|
||||
}
|
||||
};
|
||||
return response.decode_i32();
|
||||
} catch (err) {
|
||||
return Promise.reject(new Error(`'truncate_file' failed: ${err}`));
|
||||
}
|
||||
};
|
||||
|
||||
export const upload_file =
|
||||
async (conn, local_path, remote_path, progress_cb, overwrite, resume) => {
|
||||
try {
|
||||
const src_fd = fs.openSync(local_path, 'r');
|
||||
const cleanup = async f => {
|
||||
try {
|
||||
fs.closeSync(src_fd);
|
||||
} catch (err) {
|
||||
console.log(err);
|
||||
}
|
||||
try {
|
||||
if (f) {
|
||||
await f.close();
|
||||
}
|
||||
} catch (err) {
|
||||
console.log(err);
|
||||
}
|
||||
};
|
||||
export const upload_file = async (
|
||||
conn,
|
||||
local_path,
|
||||
remote_path,
|
||||
progress_cb,
|
||||
overwrite,
|
||||
resume
|
||||
) => {
|
||||
try {
|
||||
const src_fd = fs.openSync(local_path, 'r');
|
||||
const cleanup = async (f) => {
|
||||
try {
|
||||
const src_st = fs.fstatSync(src_fd);
|
||||
let dst;
|
||||
const create_dest = async () => {
|
||||
dst = new file(conn, await create_or_open_file(conn, remote_path),
|
||||
remote_path);
|
||||
};
|
||||
|
||||
try {
|
||||
let offset = 0;
|
||||
if (overwrite) {
|
||||
await create_dest();
|
||||
const result = await dst.truncate(0);
|
||||
if (result !== 0) {
|
||||
await cleanup(dst);
|
||||
return Promise.reject(new Error(`'upload_file' failed: ${result}`));
|
||||
}
|
||||
} else if (resume) {
|
||||
await create_dest();
|
||||
const dst_size = new Uint64BE(await dst.get_size()).toNumber();
|
||||
if (dst_size === src_st.size) {
|
||||
await cleanup(dst);
|
||||
return true;
|
||||
}
|
||||
|
||||
if (dst_size > src_st.size) {
|
||||
await cleanup(dst);
|
||||
return Promise.reject(new Error(
|
||||
`'upload_file' failed: destination is larger than source`));
|
||||
}
|
||||
|
||||
offset = dst_size;
|
||||
} else {
|
||||
try {
|
||||
const f =
|
||||
new file(conn, await open_file(conn, remote_path), remote_path);
|
||||
await cleanup(f);
|
||||
return Promise.reject(
|
||||
new Error('\'upload_file\' failed: file exists'));
|
||||
} catch (err) {
|
||||
await create_dest();
|
||||
}
|
||||
}
|
||||
|
||||
let remain = src_st.size - offset;
|
||||
const default_buffer = Buffer.alloc(65536 * 2);
|
||||
while (remain > 0) {
|
||||
const to_write =
|
||||
remain >= default_buffer.length ? default_buffer.length : remain;
|
||||
const buffer = to_write === default_buffer.length
|
||||
? default_buffer
|
||||
: Buffer.alloc(to_write);
|
||||
fs.readSync(src_fd, buffer, 0, to_write, offset);
|
||||
const written = await dst.write(offset, buffer);
|
||||
if (written > 0) {
|
||||
remain -= written;
|
||||
offset += written;
|
||||
if (progress_cb) {
|
||||
progress_cb(local_path, remote_path,
|
||||
((src_st.size - remain) / src_st.size) * 100.0,
|
||||
false);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (progress_cb) {
|
||||
progress_cb(local_path, remote_path, 100, true);
|
||||
}
|
||||
|
||||
await cleanup(dst);
|
||||
return true;
|
||||
} catch (err) {
|
||||
await cleanup(dst);
|
||||
return Promise.reject(new Error(`'upload_file' failed: ${err}`));
|
||||
fs.closeSync(src_fd);
|
||||
} catch (err) {
|
||||
console.log(err);
|
||||
}
|
||||
try {
|
||||
if (f) {
|
||||
await f.close();
|
||||
}
|
||||
} catch (err) {
|
||||
await cleanup();
|
||||
console.log(err);
|
||||
}
|
||||
};
|
||||
try {
|
||||
const src_st = fs.fstatSync(src_fd);
|
||||
let dst;
|
||||
const create_dest = async () => {
|
||||
dst = new file(
|
||||
conn,
|
||||
await create_or_open_file(conn, remote_path),
|
||||
remote_path
|
||||
);
|
||||
};
|
||||
|
||||
try {
|
||||
let offset = 0;
|
||||
if (overwrite) {
|
||||
await create_dest();
|
||||
const result = await dst.truncate(0);
|
||||
if (result !== 0) {
|
||||
await cleanup(dst);
|
||||
return Promise.reject(new Error(`'upload_file' failed: ${result}`));
|
||||
}
|
||||
} else if (resume) {
|
||||
await create_dest();
|
||||
const dst_size = new Uint64BE(await dst.get_size()).toNumber();
|
||||
if (dst_size === src_st.size) {
|
||||
await cleanup(dst);
|
||||
return true;
|
||||
}
|
||||
|
||||
if (dst_size > src_st.size) {
|
||||
await cleanup(dst);
|
||||
return Promise.reject(
|
||||
new Error(
|
||||
`'upload_file' failed: destination is larger than source`
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
offset = dst_size;
|
||||
} else {
|
||||
try {
|
||||
const f = new file(
|
||||
conn,
|
||||
await open_file(conn, remote_path),
|
||||
remote_path
|
||||
);
|
||||
await cleanup(f);
|
||||
return Promise.reject(
|
||||
new Error("'upload_file' failed: file exists")
|
||||
);
|
||||
} catch (err) {
|
||||
await create_dest();
|
||||
}
|
||||
}
|
||||
|
||||
let remain = src_st.size - offset;
|
||||
const default_buffer = Buffer.alloc(65536 * 2);
|
||||
while (remain > 0) {
|
||||
const to_write =
|
||||
remain >= default_buffer.length ? default_buffer.length : remain;
|
||||
const buffer =
|
||||
to_write === default_buffer.length
|
||||
? default_buffer
|
||||
: Buffer.alloc(to_write);
|
||||
fs.readSync(src_fd, buffer, 0, to_write, offset);
|
||||
const written = await dst.write(offset, buffer);
|
||||
if (written > 0) {
|
||||
remain -= written;
|
||||
offset += written;
|
||||
if (progress_cb) {
|
||||
progress_cb(
|
||||
local_path,
|
||||
remote_path,
|
||||
((src_st.size - remain) / src_st.size) * 100.0,
|
||||
false
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (progress_cb) {
|
||||
progress_cb(local_path, remote_path, 100, true);
|
||||
}
|
||||
|
||||
await cleanup(dst);
|
||||
return true;
|
||||
} catch (err) {
|
||||
await cleanup(dst);
|
||||
return Promise.reject(new Error(`'upload_file' failed: ${err}`));
|
||||
}
|
||||
} catch (err) {
|
||||
await cleanup();
|
||||
return Promise.reject(new Error(`'upload_file' failed: ${err}`));
|
||||
}
|
||||
};
|
||||
} catch (err) {
|
||||
return Promise.reject(new Error(`'upload_file' failed: ${err}`));
|
||||
}
|
||||
};
|
||||
|
||||
export const write_file =
|
||||
async (conn, handle, remote_path, offset, buffer, optional_thread_id) => {
|
||||
try {
|
||||
const request = new packet();
|
||||
request.encode_utf8(remote_path);
|
||||
request.encode_ui64(buffer.length);
|
||||
request.encode_buffer(buffer);
|
||||
request.encode_ui64(offset);
|
||||
request.encode_ui64(handle);
|
||||
export const write_file = async (
|
||||
conn,
|
||||
handle,
|
||||
remote_path,
|
||||
offset,
|
||||
buffer,
|
||||
optional_thread_id
|
||||
) => {
|
||||
try {
|
||||
const request = new packet();
|
||||
request.encode_utf8(remote_path);
|
||||
request.encode_ui64(buffer.length);
|
||||
request.encode_buffer(buffer);
|
||||
request.encode_ui64(offset);
|
||||
request.encode_ui64(handle);
|
||||
|
||||
const response =
|
||||
await conn.send('::RemoteFUSEWrite', request, optional_thread_id);
|
||||
response.decode_ui32(); // Service flags
|
||||
const response = await conn.send(
|
||||
'::RemoteFUSEWrite',
|
||||
request,
|
||||
optional_thread_id
|
||||
);
|
||||
response.decode_ui32(); // Service flags
|
||||
|
||||
const result = response.decode_i32();
|
||||
if (result === buffer.length) {
|
||||
return result;
|
||||
}
|
||||
return Promise.reject(new Error(`'write_file' error: ${result}`));
|
||||
} catch (err) {
|
||||
return Promise.reject(new Error(`'write_file' failed: ${err}`));
|
||||
const result = response.decode_i32();
|
||||
if (result === buffer.length) {
|
||||
return result;
|
||||
}
|
||||
};
|
||||
return Promise.reject(new Error(`'write_file' error: ${result}`));
|
||||
} catch (err) {
|
||||
return Promise.reject(new Error(`'write_file' failed: ${err}`));
|
||||
}
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user