@bigbinary/neeto-media-recorder 2.1.6 → 2.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/constants.js CHANGED
@@ -12,7 +12,7 @@ function _typeof(obj) {
12
12
  }
13
13
 
14
14
  // https://docs.aws.amazon.com/AmazonS3/latest/API/ErrorResponses.html#ErrorCodeList
15
- var RETRIABLE_ERRORS = [500, 503];
15
+ var RETRYABLE_ERRORS = [500, 503];
16
16
  var ONE_SECOND_IN_MILLISECONDS = 1000;
17
17
  var HALF_A_SECOND_IN_MILLISECONDS = 500;
18
18
  var TWO_HUNDRED_MILLISECONDS = 200;
@@ -20,7 +20,9 @@ var ONE_MINUTE_IN_MILLISECONDS = 60 * ONE_SECOND_IN_MILLISECONDS;
20
20
  var ONE_HOUR_IN_MILLISECONDS = 60 * ONE_MINUTE_IN_MILLISECONDS;
21
21
  var ONE_SECOND = 1;
22
22
  var UPLOAD_EVENT = {
23
- onComplete: "onComplete"
23
+ onComplete: "onComplete",
24
+ onError: "onError",
25
+ onProgress: "onProgress"
24
26
  };
25
27
  var UPLOAD_STATUS = {
26
28
  uploading: "uploading",
@@ -65,9 +67,10 @@ var SCREEN_RECORDER_EVENT = {
65
67
  onDiscard: "onDiscard",
66
68
  onDataAvailable: "onDataAvailable",
67
69
  onDiscardDuringCountdown: "onDiscardDuringCountdown",
68
- onRestart: "onRestart"
70
+ onRestart: "onRestart",
71
+ onReUpload: "onReUpload"
69
72
  };
70
- var TOTAL_RETRIES = 30;
73
+ var TOTAL_RETRIES = 15;
71
74
  var INITIAL_RETRY_DELAY = 4000;
72
75
  var MAX_RETRY_DELAY = 16000;
73
76
  var DEFAULT_RETRY_CONFIG = {
@@ -95,5 +98,5 @@ var RECORDING_LIMIT_REACHED_WARNING_SOUND = "https://neeto-record-static-assets.
95
98
  var RECORDING_TIME_LIMIT_FREE_PLAN = 15 * ONE_MINUTE_IN_MILLISECONDS; // 15 minutes
96
99
  var RECORDING_TIME_LIMIT_PRO_PLAN = 2 * ONE_HOUR_IN_MILLISECONDS; // 2 hours
97
100
 
98
- export { DEFAULT_RETRY_CONFIG, HALF_A_SECOND_IN_MILLISECONDS, HAS_CHROME_NAMESPACE, INITIAL_RETRY_DELAY, IS_EXTENSION, IS_SAFARI, IS_SAFARI_EXTENSION, MAX_RETRY_DELAY, MIME_TYPE, NETWORK_ERROR, ONE_HOUR_IN_MILLISECONDS, ONE_MINUTE_IN_MILLISECONDS, ONE_SECOND, ONE_SECOND_IN_MILLISECONDS, PERMISSIONS_HELP_DOC, RECORDING_LIMIT_REACHED_WARNING_SOUND, RECORDING_TIME_LIMIT_FREE_PLAN, RECORDING_TIME_LIMIT_PRO_PLAN, RETRIABLE_ERRORS, SCREEN_RECORDER_ERROR, SCREEN_RECORDER_EVENT, SCREEN_RECORDER_STATUS, START_RECORDING_SOUND, STOP_RECORDING_DUE_TO_LIMIT_REACHED_SOUND, TIMEOUT_ERROR, TOTAL_RETRIES, TWO_HUNDRED_MILLISECONDS, UPLOAD_EVENT, UPLOAD_STATUS };
101
+ export { DEFAULT_RETRY_CONFIG, HALF_A_SECOND_IN_MILLISECONDS, HAS_CHROME_NAMESPACE, INITIAL_RETRY_DELAY, IS_EXTENSION, IS_SAFARI, IS_SAFARI_EXTENSION, MAX_RETRY_DELAY, MIME_TYPE, NETWORK_ERROR, ONE_HOUR_IN_MILLISECONDS, ONE_MINUTE_IN_MILLISECONDS, ONE_SECOND, ONE_SECOND_IN_MILLISECONDS, PERMISSIONS_HELP_DOC, RECORDING_LIMIT_REACHED_WARNING_SOUND, RECORDING_TIME_LIMIT_FREE_PLAN, RECORDING_TIME_LIMIT_PRO_PLAN, RETRYABLE_ERRORS, SCREEN_RECORDER_ERROR, SCREEN_RECORDER_EVENT, SCREEN_RECORDER_STATUS, START_RECORDING_SOUND, STOP_RECORDING_DUE_TO_LIMIT_REACHED_SOUND, TIMEOUT_ERROR, TOTAL_RETRIES, TWO_HUNDRED_MILLISECONDS, UPLOAD_EVENT, UPLOAD_STATUS };
99
102
  //# sourceMappingURL=constants.js.map
package/constants.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"constants.js","sources":["node_modules/@babel/runtime/helpers/esm/typeof.js","src/constants.js"],"sourcesContent":["export default function _typeof(obj) {\n \"@babel/helpers - typeof\";\n\n return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) {\n return typeof obj;\n } : function (obj) {\n return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj;\n }, _typeof(obj);\n}","import platform from \"platform\";\nimport { isNotNil } from \"ramda\";\n\n// https://docs.aws.amazon.com/AmazonS3/latest/API/ErrorResponses.html#ErrorCodeList\nexport const RETRIABLE_ERRORS = [500, 503];\n\nexport const ONE_SECOND_IN_MILLISECONDS = 1000;\nexport const HALF_A_SECOND_IN_MILLISECONDS = 500;\nexport const TWO_HUNDRED_MILLISECONDS = 200;\n\nexport const ONE_MINUTE_IN_MILLISECONDS = 60 * ONE_SECOND_IN_MILLISECONDS;\nexport const ONE_HOUR_IN_MILLISECONDS = 60 * ONE_MINUTE_IN_MILLISECONDS;\n\nexport const ONE_SECOND = 1;\n\nexport const UPLOAD_EVENT = { onComplete: \"onComplete\" };\n\nexport const UPLOAD_STATUS = {\n uploading: \"uploading\",\n completed: \"completed\",\n aborting: \"aborting\",\n insufficient_data: \"insufficient_data\",\n};\n\nexport const SCREEN_RECORDER_STATUS = {\n media_aborted: \"media_aborted\",\n permission_denied: \"permission_denied\",\n no_specified_media_found: \"no_specified_media_found\",\n media_in_use: \"media_in_use\",\n invalid_media_constraints: \"invalid_media_constraints\",\n no_chrome_flags_set: \"no_chrome_flags_set\",\n recorder_error: \"recorder_error\",\n idle: \"idle\",\n acquiring_media: \"acquiring_media\",\n media_acquired: \"media_acquired\",\n restarting: \"restarting\",\n recording: \"recording\",\n stopping: \"stopping\",\n stopped: \"stopped\",\n paused: \"paused\",\n};\n\nexport const SCREEN_RECORDER_ERROR = {\n MicPermissionDenied: \"mic_permission_denied\",\n AbortError: \"media_aborted\",\n NotAllowedError: \"permission_denied\",\n NotFoundError: \"no_specified_media_found\",\n NotReadableError: \"media_in_use\",\n NotSupportedError: \"not_supported_error\",\n InvalidStateError: \"invalid_state_error\",\n OverconstrainedError: \"invalid_media_constraints\",\n TypeError: \"no_chrome_flags_set\",\n None: \"\",\n NoRecorder: \"recorder_error\",\n UnSupportedBrowser: \"unsupported_browser\",\n};\n\nexport const SCREEN_RECORDER_EVENT = {\n onStart: \"onStart\",\n onStop: \"onStop\",\n onDiscard: \"onDiscard\",\n onDataAvailable: \"onDataAvailable\",\n onDiscardDuringCountdown: \"onDiscardDuringCountdown\",\n onRestart: \"onRestart\",\n};\n\nexport const TOTAL_RETRIES = 30;\nexport const INITIAL_RETRY_DELAY = 4000;\nexport const MAX_RETRY_DELAY = 16000;\n\nexport const DEFAULT_RETRY_CONFIG = {\n retries: TOTAL_RETRIES,\n retryDelay: INITIAL_RETRY_DELAY,\n retryableStatuses: [],\n};\n\n// No need to localize this since it will only be used in the code\n// eslint-disable-next-line @bigbinary/neeto/hard-coded-strings-should-be-localized\nexport const NETWORK_ERROR = \"Network Error\";\nexport const TIMEOUT_ERROR = \"ECONNABORTED\";\n\nexport const HAS_CHROME_NAMESPACE = typeof chrome === \"object\";\n\nexport const IS_EXTENSION = HAS_CHROME_NAMESPACE && isNotNil(chrome.extension);\n\nexport const IS_SAFARI = platform.name === \"Safari\";\n\nexport const IS_SAFARI_EXTENSION = IS_SAFARI && IS_EXTENSION;\n\nexport const PERMISSIONS_HELP_DOC =\n \"https://neetorecordhelp.neetokb.com/p/a-10efcfd7\";\n\nexport const MIME_TYPE = {\n mp4: \"video/mp4\",\n webmH264: \"video/webm;codecs=h264\",\n};\n\nexport const START_RECORDING_SOUND =\n \"https://neeto-record-static-assets.s3.amazonaws.com/recording-start-sound-2.mp3\";\n\nexport const STOP_RECORDING_DUE_TO_LIMIT_REACHED_SOUND =\n \"https://neeto-record-static-assets.s3.amazonaws.com/recording-end-sound.mp3\";\n\nexport const RECORDING_LIMIT_REACHED_WARNING_SOUND =\n \"https://neeto-record-static-assets.s3.amazonaws.com/recording-warning-sound.mp3\";\n\nexport const RECORDING_TIME_LIMIT_FREE_PLAN = 15 * ONE_MINUTE_IN_MILLISECONDS; // 15 minutes\nexport const RECORDING_TIME_LIMIT_PRO_PLAN = 2 * ONE_HOUR_IN_MILLISECONDS; // 2 hours\n"],"names":["RETRIABLE_ERRORS","ONE_SECOND_IN_MILLISECONDS","HALF_A_SECOND_IN_MILLISECONDS","TWO_HUNDRED_MILLISECONDS","ONE_MINUTE_IN_MILLISECONDS","ONE_HOUR_IN_MILLISECONDS","ONE_SECOND","UPLOAD_EVENT","onComplete","UPLOAD_STATUS","uploading","completed","aborting","insufficient_data","SCREEN_RECORDER_STATUS","media_aborted","permission_denied","no_specified_media_found","media_in_use","invalid_media_constraints","no_chrome_flags_set","recorder_error","idle","acquiring_media","media_acquired","restarting","recording","stopping","stopped","paused","SCREEN_RECORDER_ERROR","MicPermissionDenied","AbortError","NotAllowedError","NotFoundError","NotReadableError","NotSupportedError","InvalidStateError","OverconstrainedError","TypeError","None","NoRecorder","UnSupportedBrowser","SCREEN_RECORDER_EVENT","onStart","onStop","onDiscard","onDataAvailable","onDiscardDuringCountdown","onRestart","TOTAL_RETRIES","INITIAL_RETRY_DELAY","MAX_RETRY_DELAY","DEFAULT_RETRY_CONFIG","retries","retryDelay","retryableStatuses","NETWORK_ERROR","TIMEOUT_ERROR","HAS_CHROME_NAMESPACE","chrome","_typeof","IS_EXTENSION","isNotNil","extension","IS_SAFARI","platform","name","IS_SAFARI_EXTENSION","PERMISSIONS_HELP_DOC","MIME_TYPE","mp4","webmH264","START_RECORDING_SOUND","STOP_RECORDING_DUE_TO_LIMIT_REACHED_SOUND","RECORDING_LIMIT_REACHED_WARNING_SOUND","RECORDING_TIME_LIMIT_FREE_PLAN","RECORDING_TIME_LIMIT_PRO_PLAN"],"mappings":"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"}
1
+ {"version":3,"file":"constants.js","sources":["node_modules/@babel/runtime/helpers/esm/typeof.js","src/constants.js"],"sourcesContent":["export default function _typeof(obj) {\n \"@babel/helpers - typeof\";\n\n return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) {\n return typeof obj;\n } : function (obj) {\n return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj;\n }, _typeof(obj);\n}","import platform from \"platform\";\nimport { isNotNil } from \"ramda\";\n\n// https://docs.aws.amazon.com/AmazonS3/latest/API/ErrorResponses.html#ErrorCodeList\nexport const RETRYABLE_ERRORS = [500, 503];\n\nexport const ONE_SECOND_IN_MILLISECONDS = 1000;\nexport const HALF_A_SECOND_IN_MILLISECONDS = 500;\nexport const TWO_HUNDRED_MILLISECONDS = 200;\n\nexport const ONE_MINUTE_IN_MILLISECONDS = 60 * ONE_SECOND_IN_MILLISECONDS;\nexport const ONE_HOUR_IN_MILLISECONDS = 60 * ONE_MINUTE_IN_MILLISECONDS;\n\nexport const ONE_SECOND = 1;\n\nexport const UPLOAD_EVENT = {\n onComplete: \"onComplete\",\n onError: \"onError\",\n onProgress: \"onProgress\",\n};\n\nexport const UPLOAD_STATUS = {\n uploading: \"uploading\",\n completed: \"completed\",\n aborting: \"aborting\",\n insufficient_data: \"insufficient_data\",\n};\n\nexport const SCREEN_RECORDER_STATUS = {\n media_aborted: \"media_aborted\",\n permission_denied: \"permission_denied\",\n no_specified_media_found: \"no_specified_media_found\",\n media_in_use: \"media_in_use\",\n invalid_media_constraints: \"invalid_media_constraints\",\n no_chrome_flags_set: \"no_chrome_flags_set\",\n recorder_error: \"recorder_error\",\n idle: \"idle\",\n acquiring_media: \"acquiring_media\",\n media_acquired: \"media_acquired\",\n restarting: \"restarting\",\n recording: \"recording\",\n stopping: \"stopping\",\n stopped: \"stopped\",\n paused: \"paused\",\n};\n\nexport const SCREEN_RECORDER_ERROR = {\n MicPermissionDenied: \"mic_permission_denied\",\n AbortError: \"media_aborted\",\n NotAllowedError: \"permission_denied\",\n NotFoundError: \"no_specified_media_found\",\n NotReadableError: \"media_in_use\",\n NotSupportedError: \"not_supported_error\",\n InvalidStateError: \"invalid_state_error\",\n OverconstrainedError: \"invalid_media_constraints\",\n TypeError: \"no_chrome_flags_set\",\n None: \"\",\n NoRecorder: \"recorder_error\",\n UnSupportedBrowser: \"unsupported_browser\",\n};\n\nexport const SCREEN_RECORDER_EVENT = {\n onStart: \"onStart\",\n onStop: \"onStop\",\n onDiscard: \"onDiscard\",\n onDataAvailable: \"onDataAvailable\",\n onDiscardDuringCountdown: \"onDiscardDuringCountdown\",\n onRestart: \"onRestart\",\n onReUpload: \"onReUpload\",\n};\n\nexport const TOTAL_RETRIES = 15;\nexport const INITIAL_RETRY_DELAY = 4000;\nexport const MAX_RETRY_DELAY = 16000;\n\nexport const DEFAULT_RETRY_CONFIG = {\n retries: TOTAL_RETRIES,\n retryDelay: INITIAL_RETRY_DELAY,\n retryableStatuses: [],\n};\n\n// No need to localize this since it will only be used in the code\n// eslint-disable-next-line @bigbinary/neeto/hard-coded-strings-should-be-localized\nexport const NETWORK_ERROR = \"Network Error\";\nexport const TIMEOUT_ERROR = \"ECONNABORTED\";\n\nexport const HAS_CHROME_NAMESPACE = typeof chrome === \"object\";\n\nexport const IS_EXTENSION = HAS_CHROME_NAMESPACE && isNotNil(chrome.extension);\n\nexport const IS_SAFARI = platform.name === \"Safari\";\n\nexport const IS_SAFARI_EXTENSION = IS_SAFARI && IS_EXTENSION;\n\nexport const PERMISSIONS_HELP_DOC =\n \"https://neetorecordhelp.neetokb.com/p/a-10efcfd7\";\n\nexport const MIME_TYPE = {\n mp4: \"video/mp4\",\n webmH264: \"video/webm;codecs=h264\",\n};\n\nexport const START_RECORDING_SOUND =\n \"https://neeto-record-static-assets.s3.amazonaws.com/recording-start-sound-2.mp3\";\n\nexport const STOP_RECORDING_DUE_TO_LIMIT_REACHED_SOUND =\n \"https://neeto-record-static-assets.s3.amazonaws.com/recording-end-sound.mp3\";\n\nexport const RECORDING_LIMIT_REACHED_WARNING_SOUND =\n \"https://neeto-record-static-assets.s3.amazonaws.com/recording-warning-sound.mp3\";\n\nexport const RECORDING_TIME_LIMIT_FREE_PLAN = 15 * ONE_MINUTE_IN_MILLISECONDS; // 15 minutes\nexport const RECORDING_TIME_LIMIT_PRO_PLAN = 2 * ONE_HOUR_IN_MILLISECONDS; // 2 hours\n"],"names":["RETRYABLE_ERRORS","ONE_SECOND_IN_MILLISECONDS","HALF_A_SECOND_IN_MILLISECONDS","TWO_HUNDRED_MILLISECONDS","ONE_MINUTE_IN_MILLISECONDS","ONE_HOUR_IN_MILLISECONDS","ONE_SECOND","UPLOAD_EVENT","onComplete","onError","onProgress","UPLOAD_STATUS","uploading","completed","aborting","insufficient_data","SCREEN_RECORDER_STATUS","media_aborted","permission_denied","no_specified_media_found","media_in_use","invalid_media_constraints","no_chrome_flags_set","recorder_error","idle","acquiring_media","media_acquired","restarting","recording","stopping","stopped","paused","SCREEN_RECORDER_ERROR","MicPermissionDenied","AbortError","NotAllowedError","NotFoundError","NotReadableError","NotSupportedError","InvalidStateError","OverconstrainedError","TypeError","None","NoRecorder","UnSupportedBrowser","SCREEN_RECORDER_EVENT","onStart","onStop","onDiscard","onDataAvailable","onDiscardDuringCountdown","onRestart","onReUpload","TOTAL_RETRIES","INITIAL_RETRY_DELAY","MAX_RETRY_DELAY","DEFAULT_RETRY_CONFIG","retries","retryDelay","retryableStatuses","NETWORK_ERROR","TIMEOUT_ERROR","HAS_CHROME_NAMESPACE","chrome","_typeof","IS_EXTENSION","isNotNil","extension","IS_SAFARI","platform","name","IS_SAFARI_EXTENSION","PERMISSIONS_HELP_DOC","MIME_TYPE","mp4","webmH264","START_RECORDING_SOUND","STOP_RECORDING_DUE_TO_LIMIT_REACHED_SOUND","RECORDING_LIMIT_REACHED_WARNING_SOUND","RECORDING_TIME_LIMIT_FREE_PLAN","RECORDING_TIME_LIMIT_PRO_PLAN"],"mappings":"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"}
package/core.js CHANGED
@@ -1,8 +1,9 @@
1
1
  import axios from 'axios';
2
- import { isPresent, isNotEmpty, isNot, existsBy } from '@bigbinary/neeto-cist';
3
- import { RETRIABLE_ERRORS, UPLOAD_STATUS, UPLOAD_EVENT, SCREEN_RECORDER_STATUS, START_RECORDING_SOUND, RECORDING_LIMIT_REACHED_WARNING_SOUND, MIME_TYPE as MIME_TYPE$1, SCREEN_RECORDER_ERROR, SCREEN_RECORDER_EVENT, RECORDING_TIME_LIMIT_FREE_PLAN, ONE_SECOND, HALF_A_SECOND_IN_MILLISECONDS, ONE_SECOND_IN_MILLISECONDS, TWO_HUNDRED_MILLISECONDS, ONE_MINUTE_IN_MILLISECONDS, STOP_RECORDING_DUE_TO_LIMIT_REACHED_SOUND, IS_EXTENSION } from '@bigbinary/neeto-media-recorder/constants';
4
- import { isNotNil, min, identity, isEmpty, isNil, pick, equals, not } from 'ramda';
2
+ import { isPresent, existsBy, isNotEmpty, isNot } from '@bigbinary/neeto-cist';
3
+ import { MIME_TYPE as MIME_TYPE$1, RETRYABLE_ERRORS, UPLOAD_STATUS, UPLOAD_EVENT, SCREEN_RECORDER_STATUS, START_RECORDING_SOUND, RECORDING_LIMIT_REACHED_WARNING_SOUND, SCREEN_RECORDER_ERROR, SCREEN_RECORDER_EVENT, RECORDING_TIME_LIMIT_FREE_PLAN, ONE_SECOND, HALF_A_SECOND_IN_MILLISECONDS, ONE_SECOND_IN_MILLISECONDS, TWO_HUNDRED_MILLISECONDS, ONE_MINUTE_IN_MILLISECONDS, STOP_RECORDING_DUE_TO_LIMIT_REACHED_SOUND, IS_EXTENSION } from '@bigbinary/neeto-media-recorder/constants';
4
+ import { isNotNil, min, isNil, identity, isEmpty, pick, equals, not } from 'ramda';
5
5
  import platform from 'platform';
6
+ import '@bigbinary/neeto-media-recorder/core';
6
7
  import withImmutableActions from '@bigbinary/neeto-commons-frontend/react-utils/withImmutableActions';
7
8
  import { create as create$3 } from 'zustand';
8
9
 
@@ -629,7 +630,7 @@ function _wrapNativeSuper(Class) {
629
630
  return _wrapNativeSuper(Class);
630
631
  }
631
632
 
632
- var TOTAL_RETRIES = 30;
633
+ var TOTAL_RETRIES = 15;
633
634
  var INITIAL_RETRY_DELAY = 4000;
634
635
  var MAX_RETRY_DELAY = 16000;
635
636
  var DEFAULT_RETRY_CONFIG = {
@@ -690,7 +691,7 @@ var buildRetryableApi = function buildRetryableApi(apiConnector) {
690
691
  });
691
692
  case 4:
692
693
  if (!(remainingAttempts-- && !shouldCancelRetries)) {
693
- _context.next = 24;
694
+ _context.next = 26;
694
695
  break;
695
696
  }
696
697
  _context.prev = 5;
@@ -701,26 +702,28 @@ var buildRetryableApi = function buildRetryableApi(apiConnector) {
701
702
  case 11:
702
703
  _context.prev = 11;
703
704
  _context.t0 = _context["catch"](5);
705
+ logger.error("buildRetryableApi -> Failed to connect, remainingAttempts:", remainingAttempts);
704
706
  isRetryableStatus = isPresent(retryableStatuses) && retryableStatuses.includes((_error$response = _context.t0.response) === null || _error$response === void 0 ? void 0 : _error$response.status);
705
707
  isRetryableError = isRetryableStatus || _context.t0.message === NETWORK_ERROR || _context.t0.code === TIMEOUT_ERROR;
706
708
  if (!(isRetryableError && remainingAttempts > 0)) {
707
- _context.next = 21;
709
+ _context.next = 23;
708
710
  break;
709
711
  }
710
- _context.next = 18;
712
+ logger.info("buildRetryableApi -> Failed to connect, retry in:", retryDelay);
713
+ _context.next = 20;
711
714
  return sleep(retryDelay);
712
- case 18:
715
+ case 20:
713
716
  retryDelay = min(retryDelay * 2, MAX_RETRY_DELAY);
714
- _context.next = 22;
717
+ _context.next = 24;
715
718
  break;
716
- case 21:
719
+ case 23:
717
720
  throw _context.t0;
718
- case 22:
721
+ case 24:
719
722
  _context.next = 4;
720
723
  break;
721
- case 24:
724
+ case 26:
722
725
  throw new RetryError("Request cancelled or request retries exhausted");
723
- case 25:
726
+ case 27:
724
727
  case "end":
725
728
  return _context.stop();
726
729
  }
@@ -770,9 +773,53 @@ var partPresignedUrlApi = {
770
773
  create: retryableCreate
771
774
  };
772
775
 
776
+ var getUnSupportedConstraints = function getUnSupportedConstraints(mediaType) {
777
+ var supportedMediaConstraints = navigator.mediaDevices.getSupportedConstraints();
778
+ return Object.keys(mediaType).filter(function (constraint) {
779
+ return !supportedMediaConstraints[constraint];
780
+ });
781
+ };
782
+ var checkConstraints = function checkConstraints() {
783
+ if (isNil(navigator.mediaDevices)) {
784
+ return;
785
+ }
786
+ for (var _len = arguments.length, mediaTypes = new Array(_len), _key = 0; _key < _len; _key++) {
787
+ mediaTypes[_key] = arguments[_key];
788
+ }
789
+ var unSupportedConstraints = mediaTypes.filter(function (mediaType) {
790
+ return _typeof$1(mediaType) === "object";
791
+ }).map(getUnSupportedConstraints).flat();
792
+ if (isNotEmpty(unSupportedConstraints)) {
793
+ // eslint-disable-next-line no-console
794
+ console.error("The constraints ".concat(unSupportedConstraints.join(","), " doesn't support on this browser."));
795
+ }
796
+ };
797
+ var isStreamEnded = function isStreamEnded(mediaStream) {
798
+ return existsBy({
799
+ readyState: "ended"
800
+ }, mediaStream.getTracks());
801
+ };
802
+ var getSupportedMimeType = function getSupportedMimeType(fallback) {
803
+ if (MediaRecorder.isTypeSupported(MIME_TYPE.mp4)) {
804
+ return MIME_TYPE.mp4;
805
+ } else if (MediaRecorder.isTypeSupported(MIME_TYPE.webmH264)) {
806
+ return MIME_TYPE.webmH264;
807
+ }
808
+ return fallback;
809
+ };
810
+
811
+ // TODO: Support for mp4 in chrome version 126
812
+ var getMediaRecorderOptions = function getMediaRecorderOptions() {
813
+ var mimeType = getSupportedMimeType();
814
+ if (!mimeType) return {};
815
+ return {
816
+ mimeType: mimeType
817
+ };
818
+ };
819
+
773
820
  var s3AxiosInstance = axios.create({
774
821
  headers: {
775
- "Content-Type": MIME_TYPE.webmH264
822
+ "Content-Type": getSupportedMimeType(MIME_TYPE$1.webmH264)
776
823
  }
777
824
  });
778
825
  s3AxiosInstance.interceptors.response.use(identity, function (error) {
@@ -785,12 +832,16 @@ var presignedUpload = function presignedUpload(_ref) {
785
832
  return s3AxiosInstance.put(presignedUrl, blob, config);
786
833
  };
787
834
  var retryablePresignedUpload = buildRetryableApi(presignedUpload, {
788
- retryableStatuses: RETRIABLE_ERRORS
835
+ retryableStatuses: RETRYABLE_ERRORS
789
836
  });
790
837
  var s3Api = {
791
838
  presignedUpload: retryablePresignedUpload
792
839
  };
793
840
 
841
+ var isMp4Supported = function isMp4Supported() {
842
+ return getSupportedMimeType() === MIME_TYPE$1.mp4;
843
+ };
844
+
794
845
  var prepareStore$1 = function prepareStore() {
795
846
  return create$3(withImmutableActions(function () {
796
847
  return {
@@ -806,6 +857,15 @@ var prepareStore$1 = function prepareStore() {
806
857
  var isNotCancelledRequest = function isNotCancelledRequest(resolvedResponse) {
807
858
  return typeof resolvedResponse !== "boolean";
808
859
  };
860
+ var calculateUploadProgress = function calculateUploadProgress(uploadProgress) {
861
+ var total = Object.values(uploadProgress).reduce(function (sum, part) {
862
+ return sum + part.total;
863
+ }, 0);
864
+ var uploaded = Object.values(uploadProgress).reduce(function (sum, part) {
865
+ return sum + part.uploaded;
866
+ }, 0);
867
+ return Math.round(uploaded * 100 / total);
868
+ };
809
869
 
810
870
  function ownKeys$2(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
811
871
  function _objectSpread$2(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys$2(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys$2(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
@@ -821,6 +881,8 @@ var _store$1 = /*#__PURE__*/new WeakMap();
821
881
  var _abortController = /*#__PURE__*/new WeakMap();
822
882
  var _pendingS3ChunkUploads = /*#__PURE__*/new WeakMap();
823
883
  var _completeUploadPromise = /*#__PURE__*/new WeakMap();
884
+ var _failedUpload = /*#__PURE__*/new WeakMap();
885
+ var _uploadProgress = /*#__PURE__*/new WeakMap();
824
886
  var _fireCallbacks$1 = /*#__PURE__*/new WeakMap();
825
887
  var _uploadChunkToS = /*#__PURE__*/new WeakMap();
826
888
  var _getCurrentUnUploadedBlob = /*#__PURE__*/new WeakMap();
@@ -874,6 +936,14 @@ var MultipartS3Uploader = /*#__PURE__*/function () {
874
936
  writable: true,
875
937
  value: void 0
876
938
  });
939
+ _classPrivateFieldInitSpec$1(this, _failedUpload, {
940
+ writable: true,
941
+ value: []
942
+ });
943
+ _classPrivateFieldInitSpec$1(this, _uploadProgress, {
944
+ writable: true,
945
+ value: {}
946
+ });
877
947
  _defineProperty(this, "initialize", function (recordingId, uploadId) {
878
948
  _classPrivateFieldSet(_this, _recordingId, recordingId);
879
949
  _classPrivateFieldSet(_this, _uploadId, uploadId);
@@ -908,6 +978,7 @@ var MultipartS3Uploader = /*#__PURE__*/function () {
908
978
  case 4:
909
979
  // Upload last chunk; only if last chunk has data
910
980
  if (_classPrivateFieldGet(_this, _getCurrentUnUploadedBlob).call(_this).size > 0) {
981
+ logger.info("completeUpload -> need to upload last chunk");
911
982
  uploadChunkToS3Promise = _classPrivateFieldGet(_this, _uploadChunkToS).call(_this, _classPrivateFieldGet(_this, _unUploadedChunks));
912
983
  _classPrivateFieldGet(_this, _pendingS3ChunkUploads).push(uploadChunkToS3Promise);
913
984
  }
@@ -920,22 +991,36 @@ var MultipartS3Uploader = /*#__PURE__*/function () {
920
991
  * adding the new presignedUrl part upload to s3PartUploadPromises.
921
992
  * This results in incorrect partNumbers.
922
993
  */
923
- _context.next = 7;
994
+ logger.info("completeUpload -> uploading all pending chunks...", _classPrivateFieldGet(_this, _pendingS3ChunkUploads).length);
995
+ _context.next = 8;
924
996
  return Promise.all(_classPrivateFieldGet(_this, _pendingS3ChunkUploads));
925
- case 7:
926
- _context.next = 9;
997
+ case 8:
998
+ logger.info("completeUpload -> finishing part uploads...");
999
+ _context.next = 11;
927
1000
  return Promise.all(_classPrivateFieldGet(_this, _s3PartUploadPromises));
928
- case 9:
1001
+ case 11:
929
1002
  resolvedS3PartUploadPromises = _context.sent;
1003
+ if (!isNotEmpty(_classPrivateFieldGet(_this, _failedUpload))) {
1004
+ _context.next = 17;
1005
+ break;
1006
+ }
1007
+ logger.info("completeUpload -> chunks with these partNumbers failed:", _classPrivateFieldGet(_this, _failedUpload));
1008
+ _classPrivateFieldGet(_this, _fireCallbacks$1).call(_this, UPLOAD_EVENT.onError);
1009
+ _classPrivateFieldGet(_this, _store$1).setState({
1010
+ status: UPLOAD_STATUS.error
1011
+ });
1012
+ return _context.abrupt("return");
1013
+ case 17:
930
1014
  if (!(resolvedS3PartUploadPromises.length === 0)) {
931
- _context.next = 13;
1015
+ _context.next = 21;
932
1016
  break;
933
1017
  }
1018
+ logger.info("completeUpload -> insufficient data");
934
1019
  _classPrivateFieldGet(_this, _store$1).setState({
935
1020
  status: UPLOAD_STATUS.insufficient_data
936
1021
  });
937
1022
  return _context.abrupt("return");
938
- case 13:
1023
+ case 21:
939
1024
  parts = resolvedS3PartUploadPromises.filter(isNotCancelledRequest).map(function (resolvedResponse) {
940
1025
  return {
941
1026
  etag: resolvedResponse.headers.etag,
@@ -944,44 +1029,56 @@ var MultipartS3Uploader = /*#__PURE__*/function () {
944
1029
  }).toSorted(function (a, b) {
945
1030
  return Number(a.partNumber) - Number(b.partNumber);
946
1031
  });
1032
+ logger.info("completeUpload -> uploaded parts: ", parts);
947
1033
  _classPrivateFieldSet(_this, _completeUploadPromise, completeUploadApi.create({
948
1034
  recordingId: _classPrivateFieldGet(_this, _recordingId),
949
1035
  payload: {
950
1036
  parts: parts,
951
- uploadId: _classPrivateFieldGet(_this, _uploadId)
1037
+ uploadId: _classPrivateFieldGet(_this, _uploadId),
1038
+ isMp4: isMp4Supported()
952
1039
  },
953
1040
  config: {
954
1041
  signal: _classPrivateFieldGet(_this, _abortController).signal
955
1042
  }
956
1043
  }));
957
- _context.next = 17;
1044
+ logger.info("completeUpload -> completing upload... ");
1045
+ _context.next = 27;
958
1046
  return _classPrivateFieldGet(_this, _completeUploadPromise);
959
- case 17:
1047
+ case 27:
1048
+ logger.info("completeUpload -> upload completed");
960
1049
  if (!(_classPrivateFieldGet(_this, _store$1).getState().status === UPLOAD_STATUS.aborting)) {
961
- _context.next = 19;
1050
+ _context.next = 31;
962
1051
  break;
963
1052
  }
1053
+ logger.info("completeUpload -> upload was marked as aborted");
964
1054
  return _context.abrupt("return");
965
- case 19:
1055
+ case 31:
966
1056
  _classPrivateFieldGet(_this, _store$1).setState({
967
1057
  status: UPLOAD_STATUS.completed
968
1058
  });
969
1059
  _classPrivateFieldGet(_this, _fireCallbacks$1).call(_this, UPLOAD_EVENT.onComplete);
970
- _context.next = 26;
1060
+ _context.next = 38;
971
1061
  break;
972
- case 23:
973
- _context.prev = 23;
1062
+ case 35:
1063
+ _context.prev = 35;
974
1064
  _context.t0 = _context["catch"](0);
975
- logger.error(_context.t0);
976
- case 26:
977
- _context.prev = 26;
1065
+ // ignore if aborted
1066
+ if (!axios.isCancel(_context.t0)) {
1067
+ _classPrivateFieldGet(_this, _store$1).setState({
1068
+ status: UPLOAD_STATUS.error
1069
+ });
1070
+ _classPrivateFieldGet(_this, _fireCallbacks$1).call(_this, UPLOAD_EVENT.onError);
1071
+ logger.error(_context.t0);
1072
+ }
1073
+ case 38:
1074
+ _context.prev = 38;
978
1075
  _classPrivateFieldSet(_this, _completeUploadPromise, null);
979
- return _context.finish(26);
980
- case 29:
1076
+ return _context.finish(38);
1077
+ case 41:
981
1078
  case "end":
982
1079
  return _context.stop();
983
1080
  }
984
- }, _callee, null, [[0, 23, 26, 29]]);
1081
+ }, _callee, null, [[0, 35, 38, 41]]);
985
1082
  })));
986
1083
  _defineProperty(this, "abortUpload", /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee2() {
987
1084
  return _regeneratorRuntime.wrap(function _callee2$(_context2) {
@@ -1005,7 +1102,8 @@ var MultipartS3Uploader = /*#__PURE__*/function () {
1005
1102
  return abortUploadApi.create({
1006
1103
  recordingId: _classPrivateFieldGet(_this, _recordingId),
1007
1104
  payload: {
1008
- uploadId: _classPrivateFieldGet(_this, _uploadId)
1105
+ uploadId: _classPrivateFieldGet(_this, _uploadId),
1106
+ isMp4: isMp4Supported()
1009
1107
  }
1010
1108
  });
1011
1109
  case 9:
@@ -1035,6 +1133,8 @@ var MultipartS3Uploader = /*#__PURE__*/function () {
1035
1133
  _classPrivateFieldSet(_this, _partNumber, 1);
1036
1134
  _classPrivateFieldSet(_this, _s3PartUploadPromises, []);
1037
1135
  _classPrivateFieldSet(_this, _callbacks$1, {});
1136
+ _classPrivateFieldSet(_this, _failedUpload, []);
1137
+ _classPrivateFieldSet(_this, _uploadProgress, {});
1038
1138
  _classPrivateFieldGet(_this, _store$1).setState({
1039
1139
  status: ""
1040
1140
  });
@@ -1064,48 +1164,79 @@ var MultipartS3Uploader = /*#__PURE__*/function () {
1064
1164
  writable: true,
1065
1165
  value: function () {
1066
1166
  var _value = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee3(chunks) {
1067
- var _this$partNumber, _this$partNumber2, _yield$partPresignedU, presignedUrl, s3PartUploadPromise;
1167
+ var _this$partNumber;
1168
+ var partNumber, mimeType, _yield$partPresignedU, presignedUrl, s3PartUploadPromise;
1068
1169
  return _regeneratorRuntime.wrap(function _callee3$(_context3) {
1069
1170
  while (1) switch (_context3.prev = _context3.next) {
1070
1171
  case 0:
1071
1172
  logger.info("Part ready to be uploaded: ", _classPrivateFieldGet(_this, _partNumber));
1072
- _context3.prev = 1;
1073
- _context3.next = 4;
1173
+ partNumber = _classPrivateFieldGet(_this, _partNumber);
1174
+ _classPrivateFieldSet(_this, _partNumber, (_this$partNumber = _classPrivateFieldGet(_this, _partNumber), _this$partNumber++, _this$partNumber));
1175
+ _classPrivateFieldGet(_this, _uploadProgress)[partNumber] = {
1176
+ uploaded: 0,
1177
+ total: new Blob(chunks, {
1178
+ type: MIME_TYPE.webmH264
1179
+ }).size
1180
+ };
1181
+ _context3.prev = 4;
1182
+ mimeType = getSupportedMimeType(MIME_TYPE.webmH264);
1183
+ _context3.next = 8;
1074
1184
  return partPresignedUrlApi.create({
1075
1185
  recordingId: _classPrivateFieldGet(_this, _recordingId),
1076
1186
  payload: {
1077
- partNumber: (_classPrivateFieldSet(_this, _partNumber, (_this$partNumber = _classPrivateFieldGet(_this, _partNumber), _this$partNumber2 = _this$partNumber++, _this$partNumber)), _this$partNumber2),
1078
- uploadId: _classPrivateFieldGet(_this, _uploadId)
1187
+ partNumber: partNumber,
1188
+ uploadId: _classPrivateFieldGet(_this, _uploadId),
1189
+ isMp4: mimeType === MIME_TYPE.mp4
1079
1190
  },
1080
1191
  config: {
1081
1192
  signal: _classPrivateFieldGet(_this, _abortController).signal
1082
1193
  }
1083
1194
  });
1084
- case 4:
1195
+ case 8:
1085
1196
  _yield$partPresignedU = _context3.sent;
1086
1197
  presignedUrl = _yield$partPresignedU.presignedUrl;
1198
+ logger.info("Presigned url created for partNumber:", partNumber);
1087
1199
  s3PartUploadPromise = s3Api.presignedUpload({
1088
1200
  presignedUrl: presignedUrl,
1089
1201
  blob: new Blob(chunks, {
1090
- type: MIME_TYPE.webmH264
1202
+ type: mimeType
1091
1203
  }),
1092
1204
  config: {
1093
1205
  includeMetadataInResponse: true,
1094
- signal: _classPrivateFieldGet(_this, _abortController).signal
1206
+ signal: _classPrivateFieldGet(_this, _abortController).signal,
1207
+ onUploadProgress: function onUploadProgress(e) {
1208
+ _classPrivateFieldGet(_this, _uploadProgress)[partNumber] = {
1209
+ uploaded: e.loaded,
1210
+ total: e.total
1211
+ };
1212
+ if (_classPrivateFieldGet(_this, _store$1).getState().status === UPLOAD_STATUS.uploading) {
1213
+ var percentCompleted = calculateUploadProgress(_classPrivateFieldGet(_this, _uploadProgress));
1214
+ logger.info("Upload Progress: ".concat(percentCompleted, "%"));
1215
+ _classPrivateFieldGet(_this, _fireCallbacks$1).call(_this, UPLOAD_EVENT.onProgress, [percentCompleted]);
1216
+ }
1217
+ }
1095
1218
  }
1096
1219
  });
1097
1220
  _classPrivateFieldGet(_this, _s3PartUploadPromises).push(s3PartUploadPromise);
1098
- _context3.next = 13;
1221
+ _context3.next = 18;
1099
1222
  break;
1100
- case 10:
1101
- _context3.prev = 10;
1102
- _context3.t0 = _context3["catch"](1);
1103
- if (!axios.isCancel(_context3.t0)) logger.error(_context3.t0);
1104
- case 13:
1223
+ case 15:
1224
+ _context3.prev = 15;
1225
+ _context3.t0 = _context3["catch"](4);
1226
+ // ignore if aborted
1227
+ if (!axios.isCancel(_context3.t0)) {
1228
+ logger.error("Failed to upload partNumber:", partNumber);
1229
+ if (_classPrivateFieldGet(_this, _store$1).getState().status === UPLOAD_STATUS.uploading) {
1230
+ _classPrivateFieldGet(_this, _fireCallbacks$1).call(_this, UPLOAD_EVENT.onError);
1231
+ } else {
1232
+ _classPrivateFieldGet(_this, _failedUpload).push(partNumber);
1233
+ }
1234
+ }
1235
+ case 18:
1105
1236
  case "end":
1106
1237
  return _context3.stop();
1107
1238
  }
1108
- }, _callee3, null, [[1, 10]]);
1239
+ }, _callee3, null, [[4, 15]]);
1109
1240
  }));
1110
1241
  function value(_x) {
1111
1242
  return _value.apply(this, arguments);
@@ -1117,7 +1248,7 @@ var MultipartS3Uploader = /*#__PURE__*/function () {
1117
1248
  writable: true,
1118
1249
  value: function value() {
1119
1250
  return new Blob(_classPrivateFieldGet(_this, _unUploadedChunks), {
1120
- type: MIME_TYPE.webmH264
1251
+ type: getSupportedMimeType(MIME_TYPE.webmH264)
1121
1252
  });
1122
1253
  }
1123
1254
  });
@@ -1210,47 +1341,6 @@ var prepareStore = function prepareStore() {
1210
1341
  }));
1211
1342
  };
1212
1343
 
1213
- var getUnSupportedConstraints = function getUnSupportedConstraints(mediaType) {
1214
- var supportedMediaConstraints = navigator.mediaDevices.getSupportedConstraints();
1215
- return Object.keys(mediaType).filter(function (constraint) {
1216
- return !supportedMediaConstraints[constraint];
1217
- });
1218
- };
1219
- var checkConstraints = function checkConstraints() {
1220
- if (isNil(navigator.mediaDevices)) {
1221
- return;
1222
- }
1223
- for (var _len = arguments.length, mediaTypes = new Array(_len), _key = 0; _key < _len; _key++) {
1224
- mediaTypes[_key] = arguments[_key];
1225
- }
1226
- var unSupportedConstraints = mediaTypes.filter(function (mediaType) {
1227
- return _typeof$1(mediaType) === "object";
1228
- }).map(getUnSupportedConstraints).flat();
1229
- if (isNotEmpty(unSupportedConstraints)) {
1230
- // eslint-disable-next-line no-console
1231
- console.error("The constraints ".concat(unSupportedConstraints.join(","), " doesn't support on this browser."));
1232
- }
1233
- };
1234
- var isStreamEnded = function isStreamEnded(mediaStream) {
1235
- return existsBy({
1236
- readyState: "ended"
1237
- }, mediaStream.getTracks());
1238
- };
1239
-
1240
- // TODO: Support for mp4 in chrome version 126
1241
- var getMediaRecorderOptions = function getMediaRecorderOptions() {
1242
- return {
1243
- mimeType: MIME_TYPE.webmH264
1244
- };
1245
- };
1246
- // Required for safari
1247
- // if (MediaRecorder.isTypeSupported(MIME_TYPE.mp4)) {
1248
- // return { mimeType: MIME_TYPE.mp4 };
1249
- // } else if (MediaRecorder.isTypeSupported(MIME_TYPE.webmH264)) {
1250
- // return { mimeType: MIME_TYPE.webmH264 };
1251
- // }
1252
- // return {};
1253
-
1254
1344
  function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
1255
1345
  function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
1256
1346
  function _classPrivateFieldInitSpec(obj, privateMap, value) { _checkPrivateRedeclaration(obj, privateMap); privateMap.set(obj, value); }
@@ -1370,9 +1460,8 @@ var ScreenRecorder = /*#__PURE__*/function () {
1370
1460
  return _classPrivateFieldSet(_this, _timeLimit, timeLimit);
1371
1461
  });
1372
1462
  _defineProperty(this, "getWebmMediaBlob", function () {
1373
- var _getMediaRecorderOpti, _getMediaRecorderOpti2;
1374
1463
  return new Blob(_classPrivateFieldGet(_this, _mediaChunks), {
1375
- type: (_getMediaRecorderOpti = (_getMediaRecorderOpti2 = getMediaRecorderOptions()) === null || _getMediaRecorderOpti2 === void 0 ? void 0 : _getMediaRecorderOpti2.mimeType) !== null && _getMediaRecorderOpti !== void 0 ? _getMediaRecorderOpti : MIME_TYPE$1.webmH264
1464
+ type: getSupportedMimeType(MIME_TYPE$1.webmH264)
1376
1465
  });
1377
1466
  });
1378
1467
  _defineProperty(this, "addCallback", function (event, callback) {