@uppy/companion
Version:
OAuth helper and remote fetcher for Uppy's (https://uppy.io) extensible file upload widget with support for drag&drop, resumable uploads, previews, restrictions, file processing/encoding, remote providers like Dropbox and Google Drive, S3 and more :dog:
34 lines (33 loc) • 1.73 kB
JavaScript
import logger from '../logger.js';
import Uploader from '../Uploader.js';
export async function startDownUpload({ req, res, getSize, download }) {
logger.debug('Starting download stream.', null, req.id);
const { stream, size: maybeSize } = await download();
let size;
// if we already know the size from the GET response content-length header, we can use that
if (typeof maybeSize === 'number' &&
!Number.isNaN(maybeSize) &&
maybeSize > 0) {
size = maybeSize;
}
// if not, we may need to explicitly get the size
// note that getSize might also return undefined/null, which is usually fine, it just means that
// the size is unknown and we cannot send the size to the Uploader
if (size == null && getSize != null) {
size = await getSize();
}
const { clientSocketConnectTimeout } = req.companion.options;
logger.debug('Instantiating uploader.', null, req.id);
const uploader = new Uploader(Uploader.reqToOptions(req, size));
(async () => {
// wait till the client has connected to the socket, before starting
// the download, so that the client can receive all download/upload progress.
logger.debug('Waiting for socket connection before beginning remote download/upload.', null, req.id);
await uploader.awaitReady(clientSocketConnectTimeout);
logger.debug('Socket connection received. Starting remote download/upload.', null, req.id);
await uploader.tryUploadStream(stream, req);
})().catch((err) => logger.error(err));
// Respond the request
// NOTE: the Uploader will continue running after the http request is responded
res.status(200).json({ token: uploader.token });
}