/* eslint-env node */ /* global window */ const FormData = require('form-data'); const got = require('got'); const BASE_URL = 'https://debuglogs.org'; const VERSION = window.getVersion(); const USER_AGENT = `Loki Messenger ${VERSION}`; // Workaround: Submitting `FormData` using native `FormData::submit` procedure // as integration with `got` results in S3 error saying we haven’t set the // `Content-Length` header: // https://github.com/sindresorhus/got/pull/466 const submitFormData = (form, url) => new Promise((resolve, reject) => { form.submit(url, (error, response) => { if (error) { return reject(error); } const { statusCode } = response; if (statusCode !== 204) { return reject( new Error(`Failed to upload to S3, got status ${statusCode}`) ); } return resolve(); }); }); // upload :: String -> Promise URL exports.upload = async content => { const signedForm = await got.get(BASE_URL, { json: true, headers: { 'user-agent': USER_AGENT, }, }); if (!signedForm.body) { throw new Error('Failed to retrieve token'); } const { fields, url } = signedForm.body; const form = new FormData(); // The API expects `key` to be the first field: form.append('key', fields.key); Object.entries(fields) .filter(([key]) => key !== 'key') .forEach(([key, value]) => { form.append(key, value); }); const contentBuffer = Buffer.from(content, 'utf8'); const contentType = 'text/plain'; form.append('Content-Type', contentType); form.append('file', contentBuffer, { contentType, filename: `loki-messenger-debug-log-${VERSION}.txt`, }); // WORKAROUND: See comment on `submitFormData`: // await got.post(url, { body: form }); await submitFormData(form, url); return `${BASE_URL}/${fields.key}`; };