Inlife/nexrender

View on GitHub
packages/nexrender-provider-gs/src/index.js

Summary

Maintainability
A
1 hr
Test Coverage
const fs  = require('fs')
const {Storage} = require('@google-cloud/storage')

const storage = new Storage()

/* define public methods */
// eslint-disable-next-line
const download = (job, settings, src, dest, params, type) => {
    const parsed_src = src.replace('gs://', '').split('/')
    const bucket_name = parsed_src[0]
    const item = parsed_src.slice(1).join('/')
    const file = fs.createWriteStream(dest)

    if (!bucket_name) {
        return Promise.reject(new Error('GCS bucket not provided.'))
    }
    if (!item) {
        return Promise.reject(new Error('GCS item not provided.'))
    }

    return new Promise((resolve, reject) => {
        file.on('close', resolve)

        storage
            .bucket(bucket_name)
            .file(item)
            .createReadStream()
            .on('error', reject)
            .pipe(file)
    })
}

const upload = (job, settings, src, params) => {
    if (!params.bucket) {
        return Promise.reject(new Error('GCS bucket not provided.'))
    }
    if (!params.item) {
        return Promise.reject(new Error('GCS item not provided.'))
    }

    const onUploadStart = () => {
        settings.logger.log(`[${job.uid}] action-upload: upload started`)
    }

    const onUploadEnd = () => {
        settings.logger.log(`[${job.uid}] action-upload: upload complete`)
    }

    return new Promise((resolve, reject) => {
        const bucket = storage.bucket(params.bucket)
        const file = bucket.file(params.item)
        let options = {
            metadata: {}
        }
        if (params.contentType) {
            options.metadata = {
                ...options.metadata,
                contentType: params.contentType
            }
        }
        if (params.cacheControl) {
            options.metadata = {
                ...options.metadata,
                cacheControl: params.cacheControl
            }
        }
        if (params.resumable) {
            options = {
                ...options,
                resumable: params.resumable
            }
        }
        const in_stream = fs.createReadStream(src)
            .on('error', reject)
        const out_stream = file.createWriteStream(options)
            .on('error', reject)
            .on('finish', ()=> {
                onUploadEnd()
                resolve()
            })
            .on('pipe', onUploadStart)
        in_stream.pipe(out_stream)
    })
}

module.exports = {
    download,
    upload,
}