Guest User

Untitled

a guest
Mar 23rd, 2018
84
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.09 KB | None | 0 0
  1. const s3 = new AWS.S3();
  2. const BUCKET = 'multipart-upload-test';
  3. const FILENAME = `test-${Math.random()}.webm`;
  4.  
  5. const logSize = size => {
  6. console.log(`current size: ${totalSize / (1024*1024)}mb`);
  7. };
  8.  
  9. const createUpload = () => new Promise((resolve, reject) => {
  10. const options = { Bucket: BUCKET, Key: FILENAME };
  11. const cb = (mpErr, multipart) => {
  12. if (mpErr) { return reject(mpErr) }
  13. resolve(multipart);
  14. };
  15.  
  16. s3.createMultipartUpload(options, cb);
  17. });
  18.  
  19. const uploadPart = (blob, partNumber, multipart) => new Promise(resolve => {
  20. s3.uploadPart({
  21. Body: blob,
  22. Bucket: BUCKET,
  23. Key: FILENAME,
  24. PartNumber: String(partNumber),
  25. UploadId: multipart.UploadId
  26. }, (err, data) => {
  27. resolve(data);
  28. });
  29. });
  30.  
  31. const completeUpload = (multipart, multipartMap) => new Promise(resolve => {
  32. s3.completeMultipartUpload({
  33. Bucket: BUCKET,
  34. Key: FILENAME,
  35. MultipartUpload: multipartMap,
  36. UploadId: multipart.UploadId
  37. }, resolve);
  38. });
  39.  
  40. const createRecorder = stream => {
  41. const recorder = new MediaRecorder(stream);
  42.  
  43. const readableStream = new ReadableStream({
  44. start(controller) {
  45. recorder.ondataavailable = ({data}) => controller.enqueue(data);
  46. recorder.onstop = () => controller.close();
  47. },
  48.  
  49. cancel() {
  50. recorder.stop();
  51. }
  52. });
  53.  
  54. return {recorder, readableStream}
  55. };
  56.  
  57. const processStream = async (readableStream, multipart) => {
  58. let partNumber = 1;
  59. let totalSize = 0;
  60. let multipartMap = { Parts: [] };
  61.  
  62. for await (const data of streamAsyncIterator(readableStream)) {
  63. const {ETag} = await uploadPart(data, partNumber, multipart);
  64. multipartMap.Parts[partNumber-1] = {ETag, PartNumber: partNumber};
  65. totalSize += data.size;
  66. partNumber += 1;
  67. logSize(totalSize);
  68. }
  69.  
  70. const result = await completeUpload(multipart, multipartMap);
  71. console.log('done', result)
  72. };
  73.  
  74. const run = async () => {
  75. const {recorder, readableStream} = await getWebcamStream().then(createRecorder);
  76. const multipart = await createUpload();
  77.  
  78. processStream(readableStream, multipart);
  79. recorder.start(1000);
  80. setTimeout(() => recorder.stop(), 30000);
  81. };
  82.  
  83. run();
Add Comment
Please, Sign In to add comment