Use stat+stream instead of reading entire file on upload

This commit is contained in:
jakergrossman 2021-11-18 15:18:11 -06:00
parent 8d244e5166
commit 90af5cba4a

View File

@ -1,7 +1,6 @@
import * as vscode from 'vscode'; import * as vscode from 'vscode';
import * as SerialPort from 'serialport'; import * as SerialPort from 'serialport';
import * as fs from 'fs'; import * as fs from 'fs';
import { performance } from 'perf_hooks';
import { logger } from './extension'; import { logger } from './extension';
@ -36,12 +35,10 @@ type RPCResponse = {
* *
* @prop {boolean=} `magic` automatically try and find a suitable port to connect. Defaults to `true` * @prop {boolean=} `magic` automatically try and find a suitable port to connect. Defaults to `true`
* @prop {string=} `port` port to use if `magic` is disabled. Defaults to `'/dev/ttyACM0'`. * @prop {string=} `port` port to use if `magic` is disabled. Defaults to `'/dev/ttyACM0'`.
* @prop {number|null=} `timeout` how long to wait for responses from the Hub.
*/ */
type HubOptions = { type HubOptions = {
magic?: boolean; magic?: boolean;
port?: string; port?: string;
timeout?: number | null;
}; };
/** /**
@ -180,20 +177,23 @@ export default class HubManager {
} }
public async uploadFile(file: string, slotid: number, name?: string, autoStart: boolean = false) { public async uploadFile(file: string, slotid: number, name?: string, autoStart: boolean = false) {
const data = fs.readFileSync(file, 'utf8'); const fileStats = fs.statSync(file);
const size = data.length;
name = name || file; name = name || file;
const now = performance.now();
const ack: {[key: string]: any} = await this.startWriteProgram(name, size, slotid, now, now); const ack: {[key: string]: any} = await this.startWriteProgram(
name,
fileStats.size,
slotid,
fileStats.birthtime.getTime(),
fileStats.mtime.getTime()
);
const blockSize = ack.blocksize; const blockSize = ack.blocksize;
const transferid = ack.transferid; const transferid = ack.transferid;
const numBlocks = Math.ceil(size / blockSize); let dataStream = fs.createReadStream(file, { highWaterMark: blockSize });
for await (const data of dataStream) {
for (let i = 0; i < numBlocks; i++) { await this.writePackage(data, transferid);
const dataChunk = data.substring(i*blockSize, i*blockSize + blockSize);
await this.writePackage(dataChunk, transferid);
} }
if (autoStart) { if (autoStart) {