export async function uploadFileCommand()

in src/s3/commands/uploadFile.ts [54:171]


export async function uploadFileCommand(
    s3Client: S3Client,
    nodeOrDocument: S3BucketNode | S3FolderNode | vscode.Uri | undefined,
    fileSizeBytes: FileSizeBytes = statFile,
    getBucket = promptUserForBucket,
    getFile = getFilesToUpload,
    window = Window.vscode(),
    outputChannel = globals.outputChannel,
    commands = Commands.vscode()
): Promise<void> {
    let node: S3BucketNode | S3FolderNode | undefined
    let document: vscode.Uri | undefined
    const uploadRequests: UploadRequest[] = []

    if (nodeOrDocument) {
        if (nodeOrDocument instanceof S3BucketNode || nodeOrDocument instanceof S3FolderNode) {
            node = nodeOrDocument as S3BucketNode | S3FolderNode
            document = undefined
        } else {
            node = undefined
            document = nodeOrDocument as vscode.Uri
        }
    } else {
        node = undefined
        document = undefined
    }

    const fileToUploadRequest = (bucketName: string, key: string, file: vscode.Uri) => ({
        bucketName,
        key: key,
        fileLocation: file,
        fileSizeBytes: fileSizeBytes(file),
        s3Client,
        window,
    })

    if (node) {
        const filesToUpload = await getFile(undefined, window)

        if (!filesToUpload) {
            showOutputMessage(
                localize('AWS.message.error.uploadFileCommand.noFileSelected', 'No file selected, cancelling upload'),
                outputChannel
            )
            getLogger().info('UploadFile cancelled')
            telemetry.recordS3UploadObject({ result: 'Cancelled' })
            return
        }

        uploadRequests.push(
            ...filesToUpload.map(file => {
                const key = node!.path + path.basename(file.fsPath)
                return fileToUploadRequest(node!.bucket.name, key, file)
            })
        )
    } else {
        while (true) {
            const filesToUpload = await getFile(document, window)

            if (!filesToUpload || filesToUpload.length === 0) {
                //if file is undefined, means the back button was pressed(there is no step before) or no file was selected
                //thus break the loop of the 'wizard'
                showOutputMessage(
                    localize(
                        'AWS.message.error.uploadFileCommand.noFileSelected',
                        'No file selected, cancelling upload'
                    ),
                    outputChannel
                )
                getLogger().info('UploadFile cancelled')
                telemetry.recordS3UploadObject({ result: 'Cancelled' })
                return
            }

            const bucketResponse = await getBucket(s3Client).catch(e => {})

            if (!bucketResponse) {
                telemetry.recordS3UploadObject({ result: 'Failed' })
                return
            }

            if (typeof bucketResponse === 'string') {
                if (bucketResponse === 'back') {
                    continue
                }

                showOutputMessage(
                    localize(
                        'AWS.message.error.uploadFileCommand.noBucketSelected',
                        'No bucket selected, cancelling upload'
                    ),
                    outputChannel
                )
                getLogger().info('No bucket selected, cancelling upload')
                telemetry.recordS3UploadObject({ result: 'Cancelled' })
                return
            }

            const bucketName = bucketResponse.Name
            if (!bucketName) {
                throw Error(`bucketResponse is not a S3.Bucket`)
            }

            uploadRequests.push(
                ...filesToUpload.map(file => {
                    const key = path.basename(file.fsPath)
                    return fileToUploadRequest(bucketName, key, file)
                })
            )

            break
        }
    }

    await runBatchUploads(uploadRequests, window, outputChannel)

    commands.execute('aws.refreshAwsExplorer', true)
}