function getUploadFile()

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;
						}
					});
				});
			}
		});
	}
}