in src/cloudConsole/cloudConsole.ts [78:157]
function getUploadFile(tokens: Promise<AccessTokens>, uris: Promise<ConsoleUris>): (this: CloudShell, filename: string, stream: ReadStream, options?: UploadOptions) => Promise<void> {
return async function (this: CloudShell, filename: string, stream: ReadStream, options: UploadOptions = {}) {
if (options.progress) {
options.progress.report({ message: localize('azure-account.connectingForUpload', "Connecting to upload '{0}'...", filename) });
}
const accessTokens: AccessTokens = await tokens;
const { terminalUri } = await uris;
if (options.token && options.token.isCancellationRequested) {
throw 'canceled';
}
return new Promise<void>((resolve, reject) => {
const form = new FormData();
form.append('uploading-file', stream, {
filename,
knownLength: options.contentLength
});
const uri: UrlWithStringQuery = parse(`${terminalUri}/upload`);
const req: ClientRequest = form.submit(
{
// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-explicit-any
protocol: <any>uri.protocol,
hostname: uri.hostname,
port: uri.port,
path: uri.path,
headers: {
'Authorization': `Bearer ${accessTokens.resource}`
},
},
(err, res) => {
if (err) {
reject(err);
} if (res && res.statusCode && (res.statusCode < 200 || res.statusCode > 299)) {
reject(`${res.statusMessage} (${res.statusCode})`)
} else {
resolve();
}
if (res) {
res.resume(); // Consume response.
}
}
);
if (options.token) {
options.token.onCancellationRequested(() => {
reject('canceled');
req.abort();
});
}
if (options.progress) {
req.on('socket', (socket: Socket) => {
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
options.progress!.report({
message: localize('azure-account.uploading', "Uploading '{0}'...", filename),
increment: 0
});
let previous: number = 0;
socket.on('drain', () => {
const total: number = req.getHeader('Content-Length') as number;
if (total) {
const worked: number = Math.min(Math.round(100 * socket.bytesWritten / total), 100);
const increment: number = worked - previous;
if (increment) {
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
options.progress!.report({
message: localize('azure-account.uploading', "Uploading '{0}'...", filename),
increment
});
}
previous = worked;
}
});
});
}
});
}
}