@bigbinary/neeto-media-recorder 2.1.5 → 2.1.6-beta.2
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 +5 -2
- package/constants.js.map +1 -1
- package/core.js +166 -85
- package/core.js.map +1 -1
- package/index.js.map +1 -1
- package/package.json +1 -1
package/constants.js
CHANGED
|
@@ -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",
|
|
@@ -63,7 +65,8 @@ var SCREEN_RECORDER_EVENT = {
|
|
|
63
65
|
onDiscard: "onDiscard",
|
|
64
66
|
onDataAvailable: "onDataAvailable",
|
|
65
67
|
onDiscardDuringCountdown: "onDiscardDuringCountdown",
|
|
66
|
-
onRestart: "onRestart"
|
|
68
|
+
onRestart: "onRestart",
|
|
69
|
+
onReUpload: "onReUpload"
|
|
67
70
|
};
|
|
68
71
|
var TOTAL_RETRIES = 30;
|
|
69
72
|
var INITIAL_RETRY_DELAY = 4000;
|
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 = {
|
|
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 = {\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 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 = 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","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","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
|
@@ -690,7 +690,7 @@ var buildRetryableApi = function buildRetryableApi(apiConnector) {
|
|
|
690
690
|
});
|
|
691
691
|
case 4:
|
|
692
692
|
if (!(remainingAttempts-- && !shouldCancelRetries)) {
|
|
693
|
-
_context.next =
|
|
693
|
+
_context.next = 26;
|
|
694
694
|
break;
|
|
695
695
|
}
|
|
696
696
|
_context.prev = 5;
|
|
@@ -701,26 +701,28 @@ var buildRetryableApi = function buildRetryableApi(apiConnector) {
|
|
|
701
701
|
case 11:
|
|
702
702
|
_context.prev = 11;
|
|
703
703
|
_context.t0 = _context["catch"](5);
|
|
704
|
+
logger.error("buildRetryableApi -> Failed to connect, remainingAttempts:", remainingAttempts);
|
|
704
705
|
isRetryableStatus = isPresent(retryableStatuses) && retryableStatuses.includes((_error$response = _context.t0.response) === null || _error$response === void 0 ? void 0 : _error$response.status);
|
|
705
706
|
isRetryableError = isRetryableStatus || _context.t0.message === NETWORK_ERROR || _context.t0.code === TIMEOUT_ERROR;
|
|
706
707
|
if (!(isRetryableError && remainingAttempts > 0)) {
|
|
707
|
-
_context.next =
|
|
708
|
+
_context.next = 23;
|
|
708
709
|
break;
|
|
709
710
|
}
|
|
710
|
-
|
|
711
|
+
logger.info("buildRetryableApi -> Failed to connect, retry in:", retryDelay);
|
|
712
|
+
_context.next = 20;
|
|
711
713
|
return sleep(retryDelay);
|
|
712
|
-
case
|
|
714
|
+
case 20:
|
|
713
715
|
retryDelay = min(retryDelay * 2, MAX_RETRY_DELAY);
|
|
714
|
-
_context.next =
|
|
716
|
+
_context.next = 24;
|
|
715
717
|
break;
|
|
716
|
-
case
|
|
718
|
+
case 23:
|
|
717
719
|
throw _context.t0;
|
|
718
|
-
case
|
|
720
|
+
case 24:
|
|
719
721
|
_context.next = 4;
|
|
720
722
|
break;
|
|
721
|
-
case
|
|
723
|
+
case 26:
|
|
722
724
|
throw new RetryError("Request cancelled or request retries exhausted");
|
|
723
|
-
case
|
|
725
|
+
case 27:
|
|
724
726
|
case "end":
|
|
725
727
|
return _context.stop();
|
|
726
728
|
}
|
|
@@ -806,6 +808,15 @@ var prepareStore$1 = function prepareStore() {
|
|
|
806
808
|
var isNotCancelledRequest = function isNotCancelledRequest(resolvedResponse) {
|
|
807
809
|
return typeof resolvedResponse !== "boolean";
|
|
808
810
|
};
|
|
811
|
+
var calculateUploadProgress = function calculateUploadProgress(uploadProgress) {
|
|
812
|
+
var total = Object.values(uploadProgress).reduce(function (sum, part) {
|
|
813
|
+
return sum + part.total;
|
|
814
|
+
}, 0);
|
|
815
|
+
var uploaded = Object.values(uploadProgress).reduce(function (sum, part) {
|
|
816
|
+
return sum + part.uploaded;
|
|
817
|
+
}, 0);
|
|
818
|
+
return Math.round(uploaded * 100 / total);
|
|
819
|
+
};
|
|
809
820
|
|
|
810
821
|
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
822
|
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 +832,8 @@ var _store$1 = /*#__PURE__*/new WeakMap();
|
|
|
821
832
|
var _abortController = /*#__PURE__*/new WeakMap();
|
|
822
833
|
var _pendingS3ChunkUploads = /*#__PURE__*/new WeakMap();
|
|
823
834
|
var _completeUploadPromise = /*#__PURE__*/new WeakMap();
|
|
835
|
+
var _failedUpload = /*#__PURE__*/new WeakMap();
|
|
836
|
+
var _uploadProgress = /*#__PURE__*/new WeakMap();
|
|
824
837
|
var _fireCallbacks$1 = /*#__PURE__*/new WeakMap();
|
|
825
838
|
var _uploadChunkToS = /*#__PURE__*/new WeakMap();
|
|
826
839
|
var _getCurrentUnUploadedBlob = /*#__PURE__*/new WeakMap();
|
|
@@ -874,6 +887,14 @@ var MultipartS3Uploader = /*#__PURE__*/function () {
|
|
|
874
887
|
writable: true,
|
|
875
888
|
value: void 0
|
|
876
889
|
});
|
|
890
|
+
_classPrivateFieldInitSpec$1(this, _failedUpload, {
|
|
891
|
+
writable: true,
|
|
892
|
+
value: []
|
|
893
|
+
});
|
|
894
|
+
_classPrivateFieldInitSpec$1(this, _uploadProgress, {
|
|
895
|
+
writable: true,
|
|
896
|
+
value: {}
|
|
897
|
+
});
|
|
877
898
|
_defineProperty(this, "initialize", function (recordingId, uploadId) {
|
|
878
899
|
_classPrivateFieldSet(_this, _recordingId, recordingId);
|
|
879
900
|
_classPrivateFieldSet(_this, _uploadId, uploadId);
|
|
@@ -883,7 +904,10 @@ var MultipartS3Uploader = /*#__PURE__*/function () {
|
|
|
883
904
|
if (data.size > 0) {
|
|
884
905
|
_classPrivateFieldGet(_this, _unUploadedChunks).push(data);
|
|
885
906
|
}
|
|
886
|
-
if (_classPrivateFieldGet(_this, _isNotInitialized))
|
|
907
|
+
if (_classPrivateFieldGet(_this, _isNotInitialized)) {
|
|
908
|
+
logger.info("upload push -> not initialized");
|
|
909
|
+
return;
|
|
910
|
+
}
|
|
887
911
|
logger.info("Current unuploaded data size is ", _classPrivateFieldGet(_this, _getCurrentUnUploadedBlob).call(_this).size / 1024 / 1024, "MB");
|
|
888
912
|
if (_classPrivateFieldGet(_this, _getCurrentUnUploadedBlob).call(_this).size > _this.MIN_UPLOAD_CHUNK_SIZE) {
|
|
889
913
|
var uploadChunkToS3Promise = _classPrivateFieldGet(_this, _uploadChunkToS).call(_this, _classPrivateFieldGet(_this, _unUploadedChunks));
|
|
@@ -901,13 +925,15 @@ var MultipartS3Uploader = /*#__PURE__*/function () {
|
|
|
901
925
|
status: UPLOAD_STATUS.uploading
|
|
902
926
|
});
|
|
903
927
|
if (!_classPrivateFieldGet(_this, _isNotInitialized)) {
|
|
904
|
-
_context.next =
|
|
928
|
+
_context.next = 5;
|
|
905
929
|
break;
|
|
906
930
|
}
|
|
931
|
+
logger.error("completeUpload -> not initialized");
|
|
907
932
|
return _context.abrupt("return");
|
|
908
|
-
case
|
|
933
|
+
case 5:
|
|
909
934
|
// Upload last chunk; only if last chunk has data
|
|
910
935
|
if (_classPrivateFieldGet(_this, _getCurrentUnUploadedBlob).call(_this).size > 0) {
|
|
936
|
+
logger.info("completeUpload -> need to upload last chunk");
|
|
911
937
|
uploadChunkToS3Promise = _classPrivateFieldGet(_this, _uploadChunkToS).call(_this, _classPrivateFieldGet(_this, _unUploadedChunks));
|
|
912
938
|
_classPrivateFieldGet(_this, _pendingS3ChunkUploads).push(uploadChunkToS3Promise);
|
|
913
939
|
}
|
|
@@ -920,22 +946,36 @@ var MultipartS3Uploader = /*#__PURE__*/function () {
|
|
|
920
946
|
* adding the new presignedUrl part upload to s3PartUploadPromises.
|
|
921
947
|
* This results in incorrect partNumbers.
|
|
922
948
|
*/
|
|
923
|
-
|
|
924
|
-
return Promise.all(_classPrivateFieldGet(_this, _pendingS3ChunkUploads));
|
|
925
|
-
case 7:
|
|
949
|
+
logger.info("completeUpload -> uploading all pending chunks...", _classPrivateFieldGet(_this, _pendingS3ChunkUploads).length);
|
|
926
950
|
_context.next = 9;
|
|
927
|
-
return Promise.all(_classPrivateFieldGet(_this,
|
|
951
|
+
return Promise.all(_classPrivateFieldGet(_this, _pendingS3ChunkUploads));
|
|
928
952
|
case 9:
|
|
953
|
+
logger.info("completeUpload -> finishing part uploads...");
|
|
954
|
+
_context.next = 12;
|
|
955
|
+
return Promise.all(_classPrivateFieldGet(_this, _s3PartUploadPromises));
|
|
956
|
+
case 12:
|
|
929
957
|
resolvedS3PartUploadPromises = _context.sent;
|
|
958
|
+
if (!isNotEmpty(_classPrivateFieldGet(_this, _failedUpload))) {
|
|
959
|
+
_context.next = 18;
|
|
960
|
+
break;
|
|
961
|
+
}
|
|
962
|
+
logger.info("completeUpload -> chunks with these partNumbers failed:", _classPrivateFieldGet(_this, _failedUpload));
|
|
963
|
+
_classPrivateFieldGet(_this, _fireCallbacks$1).call(_this, UPLOAD_EVENT.onError);
|
|
964
|
+
_classPrivateFieldGet(_this, _store$1).setState({
|
|
965
|
+
status: UPLOAD_STATUS.error
|
|
966
|
+
});
|
|
967
|
+
return _context.abrupt("return");
|
|
968
|
+
case 18:
|
|
930
969
|
if (!(resolvedS3PartUploadPromises.length === 0)) {
|
|
931
|
-
_context.next =
|
|
970
|
+
_context.next = 22;
|
|
932
971
|
break;
|
|
933
972
|
}
|
|
973
|
+
logger.info("completeUpload -> insufficient data");
|
|
934
974
|
_classPrivateFieldGet(_this, _store$1).setState({
|
|
935
975
|
status: UPLOAD_STATUS.insufficient_data
|
|
936
976
|
});
|
|
937
977
|
return _context.abrupt("return");
|
|
938
|
-
case
|
|
978
|
+
case 22:
|
|
939
979
|
parts = resolvedS3PartUploadPromises.filter(isNotCancelledRequest).map(function (resolvedResponse) {
|
|
940
980
|
return {
|
|
941
981
|
etag: resolvedResponse.headers.etag,
|
|
@@ -944,6 +984,7 @@ var MultipartS3Uploader = /*#__PURE__*/function () {
|
|
|
944
984
|
}).toSorted(function (a, b) {
|
|
945
985
|
return Number(a.partNumber) - Number(b.partNumber);
|
|
946
986
|
});
|
|
987
|
+
logger.info("completeUpload -> uploaded parts: ", parts);
|
|
947
988
|
_classPrivateFieldSet(_this, _completeUploadPromise, completeUploadApi.create({
|
|
948
989
|
recordingId: _classPrivateFieldGet(_this, _recordingId),
|
|
949
990
|
payload: {
|
|
@@ -954,34 +995,41 @@ var MultipartS3Uploader = /*#__PURE__*/function () {
|
|
|
954
995
|
signal: _classPrivateFieldGet(_this, _abortController).signal
|
|
955
996
|
}
|
|
956
997
|
}));
|
|
957
|
-
|
|
998
|
+
logger.info("completeUpload -> completing upload... ");
|
|
999
|
+
_context.next = 28;
|
|
958
1000
|
return _classPrivateFieldGet(_this, _completeUploadPromise);
|
|
959
|
-
case
|
|
1001
|
+
case 28:
|
|
1002
|
+
logger.info("completeUpload -> upload completed");
|
|
960
1003
|
if (!(_classPrivateFieldGet(_this, _store$1).getState().status === UPLOAD_STATUS.aborting)) {
|
|
961
|
-
_context.next =
|
|
1004
|
+
_context.next = 32;
|
|
962
1005
|
break;
|
|
963
1006
|
}
|
|
1007
|
+
logger.info("completeUpload -> upload was marked as aborted");
|
|
964
1008
|
return _context.abrupt("return");
|
|
965
|
-
case
|
|
1009
|
+
case 32:
|
|
966
1010
|
_classPrivateFieldGet(_this, _store$1).setState({
|
|
967
1011
|
status: UPLOAD_STATUS.completed
|
|
968
1012
|
});
|
|
969
1013
|
_classPrivateFieldGet(_this, _fireCallbacks$1).call(_this, UPLOAD_EVENT.onComplete);
|
|
970
|
-
_context.next =
|
|
1014
|
+
_context.next = 41;
|
|
971
1015
|
break;
|
|
972
|
-
case
|
|
973
|
-
_context.prev =
|
|
1016
|
+
case 36:
|
|
1017
|
+
_context.prev = 36;
|
|
974
1018
|
_context.t0 = _context["catch"](0);
|
|
1019
|
+
_classPrivateFieldGet(_this, _store$1).setState({
|
|
1020
|
+
status: UPLOAD_STATUS.error
|
|
1021
|
+
});
|
|
1022
|
+
_classPrivateFieldGet(_this, _fireCallbacks$1).call(_this, UPLOAD_EVENT.onError);
|
|
975
1023
|
logger.error(_context.t0);
|
|
976
|
-
case
|
|
977
|
-
_context.prev =
|
|
1024
|
+
case 41:
|
|
1025
|
+
_context.prev = 41;
|
|
978
1026
|
_classPrivateFieldSet(_this, _completeUploadPromise, null);
|
|
979
|
-
return _context.finish(
|
|
980
|
-
case
|
|
1027
|
+
return _context.finish(41);
|
|
1028
|
+
case 44:
|
|
981
1029
|
case "end":
|
|
982
1030
|
return _context.stop();
|
|
983
1031
|
}
|
|
984
|
-
}, _callee, null, [[0,
|
|
1032
|
+
}, _callee, null, [[0, 36, 41, 44]]);
|
|
985
1033
|
})));
|
|
986
1034
|
_defineProperty(this, "abortUpload", /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee2() {
|
|
987
1035
|
return _regeneratorRuntime.wrap(function _callee2$(_context2) {
|
|
@@ -1035,6 +1083,8 @@ var MultipartS3Uploader = /*#__PURE__*/function () {
|
|
|
1035
1083
|
_classPrivateFieldSet(_this, _partNumber, 1);
|
|
1036
1084
|
_classPrivateFieldSet(_this, _s3PartUploadPromises, []);
|
|
1037
1085
|
_classPrivateFieldSet(_this, _callbacks$1, {});
|
|
1086
|
+
_classPrivateFieldSet(_this, _failedUpload, []);
|
|
1087
|
+
_classPrivateFieldSet(_this, _uploadProgress, {});
|
|
1038
1088
|
_classPrivateFieldGet(_this, _store$1).setState({
|
|
1039
1089
|
status: ""
|
|
1040
1090
|
});
|
|
@@ -1064,26 +1114,36 @@ var MultipartS3Uploader = /*#__PURE__*/function () {
|
|
|
1064
1114
|
writable: true,
|
|
1065
1115
|
value: function () {
|
|
1066
1116
|
var _value = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee3(chunks) {
|
|
1067
|
-
var _this$partNumber
|
|
1117
|
+
var _this$partNumber;
|
|
1118
|
+
var partNumber, _yield$partPresignedU, presignedUrl, s3PartUploadPromise;
|
|
1068
1119
|
return _regeneratorRuntime.wrap(function _callee3$(_context3) {
|
|
1069
1120
|
while (1) switch (_context3.prev = _context3.next) {
|
|
1070
1121
|
case 0:
|
|
1071
1122
|
logger.info("Part ready to be uploaded: ", _classPrivateFieldGet(_this, _partNumber));
|
|
1072
|
-
|
|
1073
|
-
|
|
1123
|
+
partNumber = _classPrivateFieldGet(_this, _partNumber);
|
|
1124
|
+
_classPrivateFieldSet(_this, _partNumber, (_this$partNumber = _classPrivateFieldGet(_this, _partNumber), _this$partNumber++, _this$partNumber));
|
|
1125
|
+
_classPrivateFieldGet(_this, _uploadProgress)[partNumber] = {
|
|
1126
|
+
uploaded: 0,
|
|
1127
|
+
total: new Blob(chunks, {
|
|
1128
|
+
type: MIME_TYPE.webmH264
|
|
1129
|
+
}).size
|
|
1130
|
+
};
|
|
1131
|
+
_context3.prev = 4;
|
|
1132
|
+
_context3.next = 7;
|
|
1074
1133
|
return partPresignedUrlApi.create({
|
|
1075
1134
|
recordingId: _classPrivateFieldGet(_this, _recordingId),
|
|
1076
1135
|
payload: {
|
|
1077
|
-
partNumber:
|
|
1136
|
+
partNumber: partNumber,
|
|
1078
1137
|
uploadId: _classPrivateFieldGet(_this, _uploadId)
|
|
1079
1138
|
},
|
|
1080
1139
|
config: {
|
|
1081
1140
|
signal: _classPrivateFieldGet(_this, _abortController).signal
|
|
1082
1141
|
}
|
|
1083
1142
|
});
|
|
1084
|
-
case
|
|
1143
|
+
case 7:
|
|
1085
1144
|
_yield$partPresignedU = _context3.sent;
|
|
1086
1145
|
presignedUrl = _yield$partPresignedU.presignedUrl;
|
|
1146
|
+
logger.info("Presigned url created for partNumber:", partNumber);
|
|
1087
1147
|
s3PartUploadPromise = s3Api.presignedUpload({
|
|
1088
1148
|
presignedUrl: presignedUrl,
|
|
1089
1149
|
blob: new Blob(chunks, {
|
|
@@ -1091,21 +1151,37 @@ var MultipartS3Uploader = /*#__PURE__*/function () {
|
|
|
1091
1151
|
}),
|
|
1092
1152
|
config: {
|
|
1093
1153
|
includeMetadataInResponse: true,
|
|
1094
|
-
signal: _classPrivateFieldGet(_this, _abortController).signal
|
|
1154
|
+
signal: _classPrivateFieldGet(_this, _abortController).signal,
|
|
1155
|
+
onUploadProgress: function onUploadProgress(e) {
|
|
1156
|
+
_classPrivateFieldGet(_this, _uploadProgress)[partNumber] = {
|
|
1157
|
+
uploaded: e.loaded,
|
|
1158
|
+
total: e.total
|
|
1159
|
+
};
|
|
1160
|
+
if (_classPrivateFieldGet(_this, _store$1).getState().status === UPLOAD_STATUS.uploading) {
|
|
1161
|
+
var percentCompleted = calculateUploadProgress(_classPrivateFieldGet(_this, _uploadProgress));
|
|
1162
|
+
logger.info("Upload Progress: ".concat(percentCompleted, "%"));
|
|
1163
|
+
_classPrivateFieldGet(_this, _fireCallbacks$1).call(_this, UPLOAD_EVENT.onProgress, [percentCompleted]);
|
|
1164
|
+
}
|
|
1165
|
+
}
|
|
1095
1166
|
}
|
|
1096
1167
|
});
|
|
1168
|
+
s3PartUploadPromise.then(function () {
|
|
1169
|
+
logger.info("Chunk uploaded for partNumber:", partNumber);
|
|
1170
|
+
});
|
|
1097
1171
|
_classPrivateFieldGet(_this, _s3PartUploadPromises).push(s3PartUploadPromise);
|
|
1098
|
-
_context3.next =
|
|
1172
|
+
_context3.next = 20;
|
|
1099
1173
|
break;
|
|
1100
|
-
case
|
|
1101
|
-
_context3.prev =
|
|
1102
|
-
_context3.t0 = _context3["catch"](
|
|
1174
|
+
case 15:
|
|
1175
|
+
_context3.prev = 15;
|
|
1176
|
+
_context3.t0 = _context3["catch"](4);
|
|
1177
|
+
logger.error("Failed to upload partNumber:", partNumber);
|
|
1178
|
+
_classPrivateFieldGet(_this, _failedUpload).push(partNumber);
|
|
1103
1179
|
if (!axios.isCancel(_context3.t0)) logger.error(_context3.t0);
|
|
1104
|
-
case
|
|
1180
|
+
case 20:
|
|
1105
1181
|
case "end":
|
|
1106
1182
|
return _context3.stop();
|
|
1107
1183
|
}
|
|
1108
|
-
}, _callee3, null, [[
|
|
1184
|
+
}, _callee3, null, [[4, 15]]);
|
|
1109
1185
|
}));
|
|
1110
1186
|
function value(_x) {
|
|
1111
1187
|
return _value.apply(this, arguments);
|
|
@@ -1270,6 +1346,7 @@ var _recordingLimitWarningAudio = /*#__PURE__*/new WeakMap();
|
|
|
1270
1346
|
var _stopRecordingDueToLimitReachedAudio = /*#__PURE__*/new WeakMap();
|
|
1271
1347
|
var _stream = /*#__PURE__*/new WeakMap();
|
|
1272
1348
|
var _audioStream = /*#__PURE__*/new WeakMap();
|
|
1349
|
+
var _audioContext = /*#__PURE__*/new WeakMap();
|
|
1273
1350
|
var _timeLimit = /*#__PURE__*/new WeakMap();
|
|
1274
1351
|
var _startRecordingTimeoutID = /*#__PURE__*/new WeakMap();
|
|
1275
1352
|
var _enableNoiseCancellation = /*#__PURE__*/new WeakMap();
|
|
@@ -1347,6 +1424,10 @@ var ScreenRecorder = /*#__PURE__*/function () {
|
|
|
1347
1424
|
writable: true,
|
|
1348
1425
|
value: void 0
|
|
1349
1426
|
});
|
|
1427
|
+
_classPrivateFieldInitSpec(this, _audioContext, {
|
|
1428
|
+
writable: true,
|
|
1429
|
+
value: void 0
|
|
1430
|
+
});
|
|
1350
1431
|
_classPrivateFieldInitSpec(this, _timeLimit, {
|
|
1351
1432
|
writable: true,
|
|
1352
1433
|
value: RECORDING_TIME_LIMIT_FREE_PLAN
|
|
@@ -1576,56 +1657,56 @@ var ScreenRecorder = /*#__PURE__*/function () {
|
|
|
1576
1657
|
writable: true,
|
|
1577
1658
|
value: function () {
|
|
1578
1659
|
var _value = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee2() {
|
|
1579
|
-
var
|
|
1660
|
+
var isAudioWorkletLoaded, stream, workletUrl, audioStream, audioStreamSource, destinationStream, noiseSuppressorNode, finalStream, audioContext, desktopAudio, microphoneAudio, combinedAudio;
|
|
1580
1661
|
return _regeneratorRuntime.wrap(function _callee2$(_context2) {
|
|
1581
1662
|
while (1) switch (_context2.prev = _context2.next) {
|
|
1582
1663
|
case 0:
|
|
1583
1664
|
_classPrivateFieldGet(_this, _store).setState({
|
|
1584
1665
|
status: SCREEN_RECORDER_STATUS.acquiring_media
|
|
1585
1666
|
});
|
|
1586
|
-
|
|
1667
|
+
isAudioWorkletLoaded = false;
|
|
1668
|
+
_context2.prev = 2;
|
|
1587
1669
|
if (!_classPrivateFieldGet(_this, _audio)) {
|
|
1588
|
-
_context2.next =
|
|
1670
|
+
_context2.next = 19;
|
|
1589
1671
|
break;
|
|
1590
1672
|
}
|
|
1591
|
-
|
|
1673
|
+
_classPrivateFieldSet(_this, _audioContext, new AudioContext());
|
|
1674
|
+
_context2.prev = 5;
|
|
1675
|
+
workletUrl = IS_EXTENSION ? chrome.runtime.getURL("public/NoiseSuppressorWorklet.js") : "NoiseSuppressorWorklet.js";
|
|
1676
|
+
_context2.next = 9;
|
|
1677
|
+
return _classPrivateFieldGet(_this, _audioContext).audioWorklet.addModule(workletUrl);
|
|
1678
|
+
case 9:
|
|
1679
|
+
isAudioWorkletLoaded = true;
|
|
1680
|
+
_context2.next = 15;
|
|
1681
|
+
break;
|
|
1682
|
+
case 12:
|
|
1683
|
+
_context2.prev = 12;
|
|
1684
|
+
_context2.t0 = _context2["catch"](5);
|
|
1685
|
+
console.error("Failed to load audio worklet:", _context2.t0);
|
|
1686
|
+
case 15:
|
|
1687
|
+
_context2.next = 17;
|
|
1592
1688
|
return window.navigator.mediaDevices.getUserMedia({
|
|
1593
|
-
audio: _classPrivateFieldGet(_this, _audio) ?
|
|
1594
|
-
echoCancellation: false
|
|
1595
|
-
}, _classPrivateFieldGet(_this, _audio)) : false
|
|
1689
|
+
audio: _classPrivateFieldGet(_this, _audio) ? _classPrivateFieldGet(_this, _audio) : false
|
|
1596
1690
|
});
|
|
1597
|
-
case
|
|
1691
|
+
case 17:
|
|
1598
1692
|
audioStream = _context2.sent;
|
|
1599
|
-
|
|
1600
|
-
|
|
1601
|
-
|
|
1602
|
-
|
|
1693
|
+
if (isAudioWorkletLoaded && _classPrivateFieldGet(_this, _enableNoiseCancellation)) {
|
|
1694
|
+
audioStreamSource = _classPrivateFieldGet(_this, _audioContext).createMediaStreamSource(audioStream);
|
|
1695
|
+
destinationStream = _classPrivateFieldGet(_this, _audioContext).createMediaStreamDestination();
|
|
1696
|
+
noiseSuppressorNode = new AudioWorkletNode(_classPrivateFieldGet(_this, _audioContext), "nn-suppressor-processor");
|
|
1697
|
+
audioStreamSource.connect(noiseSuppressorNode);
|
|
1698
|
+
noiseSuppressorNode.connect(destinationStream);
|
|
1699
|
+
_classPrivateFieldSet(_this, _audioStream, destinationStream.stream);
|
|
1700
|
+
} else {
|
|
1701
|
+
_classPrivateFieldSet(_this, _audioStream, audioStream);
|
|
1603
1702
|
}
|
|
1604
|
-
|
|
1605
|
-
|
|
1606
|
-
audioContext = new AudioContext();
|
|
1607
|
-
_context2.next = 13;
|
|
1608
|
-
return audioContext.audioWorklet.addModule(workletUrl);
|
|
1609
|
-
case 13:
|
|
1610
|
-
audioStreamSource = audioContext.createMediaStreamSource(audioStream);
|
|
1611
|
-
destinationStream = audioContext.createMediaStreamDestination();
|
|
1612
|
-
noiseSuppressorNode = new AudioWorkletNode(audioContext, "nn-suppressor-processor");
|
|
1613
|
-
audioStreamSource.connect(noiseSuppressorNode);
|
|
1614
|
-
noiseSuppressorNode.connect(destinationStream);
|
|
1615
|
-
_classPrivateFieldSet(_this, _audioStream, destinationStream.stream);
|
|
1616
|
-
_context2.next = 24;
|
|
1617
|
-
break;
|
|
1618
|
-
case 21:
|
|
1619
|
-
_context2.prev = 21;
|
|
1620
|
-
_context2.t0 = _context2["catch"](8);
|
|
1621
|
-
console.error("Failed to load audio worklet:", _context2.t0);
|
|
1622
|
-
case 24:
|
|
1623
|
-
_context2.next = 26;
|
|
1703
|
+
case 19:
|
|
1704
|
+
_context2.next = 21;
|
|
1624
1705
|
return window.navigator.mediaDevices.getDisplayMedia({
|
|
1625
1706
|
video: _classPrivateFieldGet(_this, _video) || true,
|
|
1626
1707
|
audio: true
|
|
1627
1708
|
});
|
|
1628
|
-
case
|
|
1709
|
+
case 21:
|
|
1629
1710
|
stream = _context2.sent;
|
|
1630
1711
|
// Event triggered when the user clicks on the stop sharing overlay button
|
|
1631
1712
|
stream.getVideoTracks()[0].addEventListener("ended", function () {
|
|
@@ -1634,10 +1715,10 @@ var ScreenRecorder = /*#__PURE__*/function () {
|
|
|
1634
1715
|
finalStream = new MediaStream();
|
|
1635
1716
|
if (_classPrivateFieldGet(_this, _audio) && _classPrivateFieldGet(_this, _audioStream)) {
|
|
1636
1717
|
if (isNotEmpty(stream.getAudioTracks())) {
|
|
1637
|
-
|
|
1638
|
-
desktopAudio =
|
|
1639
|
-
microphoneAudio =
|
|
1640
|
-
combinedAudio =
|
|
1718
|
+
audioContext = new AudioContext();
|
|
1719
|
+
desktopAudio = audioContext.createMediaStreamSource(stream);
|
|
1720
|
+
microphoneAudio = audioContext.createMediaStreamSource(_classPrivateFieldGet(_this, _audioStream));
|
|
1721
|
+
combinedAudio = audioContext.createMediaStreamDestination();
|
|
1641
1722
|
desktopAudio.connect(combinedAudio);
|
|
1642
1723
|
microphoneAudio.connect(combinedAudio);
|
|
1643
1724
|
combinedAudio.stream.getAudioTracks().forEach(function (track) {
|
|
@@ -1657,11 +1738,11 @@ var ScreenRecorder = /*#__PURE__*/function () {
|
|
|
1657
1738
|
_classPrivateFieldGet(_this, _store).setState({
|
|
1658
1739
|
status: SCREEN_RECORDER_STATUS.media_acquired
|
|
1659
1740
|
});
|
|
1660
|
-
_context2.next =
|
|
1741
|
+
_context2.next = 34;
|
|
1661
1742
|
break;
|
|
1662
|
-
case
|
|
1663
|
-
_context2.prev =
|
|
1664
|
-
_context2.t1 = _context2["catch"](
|
|
1743
|
+
case 31:
|
|
1744
|
+
_context2.prev = 31;
|
|
1745
|
+
_context2.t1 = _context2["catch"](2);
|
|
1665
1746
|
if (_classPrivateFieldGet(_this, _audio) && !_classPrivateFieldGet(_this, _audioStream)) {
|
|
1666
1747
|
_classPrivateFieldGet(_this, _store).setState({
|
|
1667
1748
|
error: SCREEN_RECORDER_ERROR.MicPermissionDenied,
|
|
@@ -1673,11 +1754,11 @@ var ScreenRecorder = /*#__PURE__*/function () {
|
|
|
1673
1754
|
status: SCREEN_RECORDER_STATUS.idle
|
|
1674
1755
|
});
|
|
1675
1756
|
}
|
|
1676
|
-
case
|
|
1757
|
+
case 34:
|
|
1677
1758
|
case "end":
|
|
1678
1759
|
return _context2.stop();
|
|
1679
1760
|
}
|
|
1680
|
-
}, _callee2, null, [[
|
|
1761
|
+
}, _callee2, null, [[2, 31], [5, 12]]);
|
|
1681
1762
|
}));
|
|
1682
1763
|
function value() {
|
|
1683
1764
|
return _value.apply(this, arguments);
|