|  |  |  |  | /* eslint-env node */ | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | const FormData = require('form-data'); | 
					
						
							|  |  |  |  | const got = require('got'); | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | const BASE_URL = 'https://debuglogs.org'; | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | // 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) => { | 
					
						
							|  |  |  |  |       if (error) { | 
					
						
							|  |  |  |  |         return reject(error); | 
					
						
							|  |  |  |  |       } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |       return resolve(); | 
					
						
							|  |  |  |  |     }); | 
					
						
							|  |  |  |  |   }); | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | //      upload :: String -> Promise URL
 | 
					
						
							|  |  |  |  | exports.upload = async (content) => { | 
					
						
							|  |  |  |  |   const signedForm = await got.get(BASE_URL, { json: true }); | 
					
						
							|  |  |  |  |   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: 'signal-desktop-debug-log.txt', | 
					
						
							|  |  |  |  |   }); | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |   // WORKAROUND: See comment on `submitFormData`:
 | 
					
						
							|  |  |  |  |   // await got.post(url, { body: form });
 | 
					
						
							|  |  |  |  |   await submitFormData(form, url); | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |   return `${BASE_URL}/${fields.key}`; | 
					
						
							|  |  |  |  | }; |