I am uploading a file to Google Cloud. On complete, I want to return the file URL and some metadata. I am trying to do it like this:
blobStream.on('finish', () => {
                var fileSize;
                var fileCreated;
                fileUpload.getMetadata()
                    .then(metadata => { 
                        const mObj = metadata[0];
                        fileSize = mObj.size;
                        fileCreated = mObj.timeCreated;
                });
                fileUpload.getSignedUrl({
                    action: 'read',
                    expires: '03-09-2491'
                }).then(signedUrl => {
                    let response = {};
                        response.name = newFileName;
                        response.size = fileSize;
                        response.created = fileCreated;
                        response.url = signedUrl[0];
                    resolve(response);
                }).catch(error => {
                    reject(error);  
                });
            });
The problem is, the getSignedUrl method always fires first and "fileSize" + "fileCreated" are never populated.
I believe I need to chain the events so getMetadata happens first but am relatively new to Node (and Promises) and could use some suggestions.
EDITED PER BERGI'S REPLY: (The Below Method Works)
uploadFileToStorage(file) {
    let utils = new Utils();
    let newFileName = `${utils._guid()}-${Date.now()}`;
    let bucket = admin.storage().bucket();
    let filePath = url.format('audioFiles/' + newFileName);
    let fileUpload = bucket.file(filePath);
    let prom = new Promise(function(resolve, reject) {
        if (!file) {
            reject('No file provided');
            return;
        }
        const blobStream = fileUpload.createWriteStream({
            metadata: {
                contentType: file.mimetype
            }
        });
        blobStream.on('error', (error) => {
            reject('Something is wrong! Unable to upload at the moment.');
            return;
         });
        blobStream.on('finish', resolve);
        blobStream.end(file.buffer);
      }).then(() => { 
        return Promise.all([
            fileUpload.getMetadata(),
            fileUpload.getSignedUrl({
                action: 'read',
                expires: '03-09-2491'
            }),
        ]);
    }).then(([metadata, signedUrl]) => {
        const fileSize = metadata[0].size;
        const fileCreated = metadata[0].timeCreated;
        const response = {
            name: newFileName,
            size: fileSize,
            created: fileCreated,
            url: signedUrl[0],
        };
        return response;
    });
    return prom;
}
 
    