@bigbinary/neeto-media-recorder 2.6.0 → 2.6.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/README.md +8 -4
- package/constants.js +3 -1
- package/constants.js.map +1 -1
- package/core.js +267 -177
- package/core.js.map +1 -1
- package/index.js.map +1 -1
- package/package.json +2 -1
package/core.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import axios from 'axios';
|
|
2
2
|
import { isPresent, existsBy, isNotEmpty, isNot, noop } from '@bigbinary/neeto-cist';
|
|
3
|
-
import { RETRYABLE_ERRORS, MIME_TYPE as MIME_TYPE$1,
|
|
3
|
+
import { RETRYABLE_ERRORS, MIME_TYPE as MIME_TYPE$1, UPLOAD_EVENT, UPLOAD_STATUS, 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
4
|
import { useMultipartS3UploadStatus as useMultipartS3UploadStatus$1, getMultipartS3Uploader as getMultipartS3Uploader$1 } from '@bigbinary/neeto-media-recorder/core';
|
|
5
5
|
import { isNotNil, min, isNil, identity, isEmpty, pick, equals, not } from 'ramda';
|
|
6
6
|
import platform from 'platform';
|
|
@@ -519,6 +519,59 @@ try {
|
|
|
519
519
|
|
|
520
520
|
var _regeneratorRuntime = /*@__PURE__*/getDefaultExportFromCjs(regenerator);
|
|
521
521
|
|
|
522
|
+
const byteToHex = [];
|
|
523
|
+
for (let i = 0; i < 256; ++i) {
|
|
524
|
+
byteToHex.push((i + 0x100).toString(16).slice(1));
|
|
525
|
+
}
|
|
526
|
+
function unsafeStringify(arr, offset = 0) {
|
|
527
|
+
return (byteToHex[arr[offset + 0]] +
|
|
528
|
+
byteToHex[arr[offset + 1]] +
|
|
529
|
+
byteToHex[arr[offset + 2]] +
|
|
530
|
+
byteToHex[arr[offset + 3]] +
|
|
531
|
+
'-' +
|
|
532
|
+
byteToHex[arr[offset + 4]] +
|
|
533
|
+
byteToHex[arr[offset + 5]] +
|
|
534
|
+
'-' +
|
|
535
|
+
byteToHex[arr[offset + 6]] +
|
|
536
|
+
byteToHex[arr[offset + 7]] +
|
|
537
|
+
'-' +
|
|
538
|
+
byteToHex[arr[offset + 8]] +
|
|
539
|
+
byteToHex[arr[offset + 9]] +
|
|
540
|
+
'-' +
|
|
541
|
+
byteToHex[arr[offset + 10]] +
|
|
542
|
+
byteToHex[arr[offset + 11]] +
|
|
543
|
+
byteToHex[arr[offset + 12]] +
|
|
544
|
+
byteToHex[arr[offset + 13]] +
|
|
545
|
+
byteToHex[arr[offset + 14]] +
|
|
546
|
+
byteToHex[arr[offset + 15]]).toLowerCase();
|
|
547
|
+
}
|
|
548
|
+
|
|
549
|
+
let getRandomValues;
|
|
550
|
+
const rnds8 = new Uint8Array(16);
|
|
551
|
+
function rng() {
|
|
552
|
+
if (!getRandomValues) {
|
|
553
|
+
if (typeof crypto === 'undefined' || !crypto.getRandomValues) {
|
|
554
|
+
throw new Error('crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported');
|
|
555
|
+
}
|
|
556
|
+
getRandomValues = crypto.getRandomValues.bind(crypto);
|
|
557
|
+
}
|
|
558
|
+
return getRandomValues(rnds8);
|
|
559
|
+
}
|
|
560
|
+
|
|
561
|
+
const randomUUID = typeof crypto !== 'undefined' && crypto.randomUUID && crypto.randomUUID.bind(crypto);
|
|
562
|
+
var native = { randomUUID };
|
|
563
|
+
|
|
564
|
+
function v4(options, buf, offset) {
|
|
565
|
+
if (native.randomUUID && !buf && !options) {
|
|
566
|
+
return native.randomUUID();
|
|
567
|
+
}
|
|
568
|
+
options = options || {};
|
|
569
|
+
const rnds = options.random || (options.rng || rng)();
|
|
570
|
+
rnds[6] = (rnds[6] & 0x0f) | 0x40;
|
|
571
|
+
rnds[8] = (rnds[8] & 0x3f) | 0x80;
|
|
572
|
+
return unsafeStringify(rnds);
|
|
573
|
+
}
|
|
574
|
+
|
|
522
575
|
function _setPrototypeOf(o, p) {
|
|
523
576
|
_setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function _setPrototypeOf(o, p) {
|
|
524
577
|
o.__proto__ = p;
|
|
@@ -864,27 +917,6 @@ var isMp4Supported = function isMp4Supported() {
|
|
|
864
917
|
return getSupportedMimeType() === MIME_TYPE$1.mp4;
|
|
865
918
|
};
|
|
866
919
|
|
|
867
|
-
/**
|
|
868
|
-
* Due to the custom axios interceptor for s3Api,
|
|
869
|
-
* it'll return false for cancelled requests instead of a cancelled error object.
|
|
870
|
-
*/
|
|
871
|
-
var isNotCancelledRequest = function isNotCancelledRequest(resolvedResponse) {
|
|
872
|
-
return typeof resolvedResponse !== "boolean";
|
|
873
|
-
};
|
|
874
|
-
var calculateUploadProgress = function calculateUploadProgress(uploadProgress) {
|
|
875
|
-
var total = Object.values(uploadProgress).reduce(function (sum, part) {
|
|
876
|
-
return sum + part.total;
|
|
877
|
-
}, 0);
|
|
878
|
-
var uploaded = Object.values(uploadProgress).reduce(function (sum, part) {
|
|
879
|
-
return sum + part.uploaded;
|
|
880
|
-
}, 0);
|
|
881
|
-
return Math.round(uploaded * 100 / total);
|
|
882
|
-
};
|
|
883
|
-
|
|
884
|
-
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; }
|
|
885
|
-
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; }
|
|
886
|
-
function _classPrivateFieldInitSpec$1(obj, privateMap, value) { _checkPrivateRedeclaration$1(obj, privateMap); privateMap.set(obj, value); }
|
|
887
|
-
function _checkPrivateRedeclaration$1(obj, privateCollection) { if (privateCollection.has(obj)) { throw new TypeError("Cannot initialize the same private elements twice on an object"); } }
|
|
888
920
|
var createPrefixedLogger = function createPrefixedLogger(prefix) {
|
|
889
921
|
return {
|
|
890
922
|
info: function info() {
|
|
@@ -917,6 +949,28 @@ var createPrefixedLogger = function createPrefixedLogger(prefix) {
|
|
|
917
949
|
}
|
|
918
950
|
};
|
|
919
951
|
};
|
|
952
|
+
|
|
953
|
+
/**
|
|
954
|
+
* Due to the custom axios interceptor for s3Api,
|
|
955
|
+
* it'll return false for cancelled requests instead of a cancelled error object.
|
|
956
|
+
*/
|
|
957
|
+
var isNotCancelledRequest = function isNotCancelledRequest(resolvedResponse) {
|
|
958
|
+
return typeof resolvedResponse !== "boolean";
|
|
959
|
+
};
|
|
960
|
+
var calculateUploadProgress = function calculateUploadProgress(uploadProgress) {
|
|
961
|
+
var total = Object.values(uploadProgress).reduce(function (sum, part) {
|
|
962
|
+
return sum + part.total;
|
|
963
|
+
}, 0);
|
|
964
|
+
var uploaded = Object.values(uploadProgress).reduce(function (sum, part) {
|
|
965
|
+
return sum + part.uploaded;
|
|
966
|
+
}, 0);
|
|
967
|
+
return Math.round(uploaded * 100 / total);
|
|
968
|
+
};
|
|
969
|
+
|
|
970
|
+
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; }
|
|
971
|
+
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; }
|
|
972
|
+
function _classPrivateFieldInitSpec$1(obj, privateMap, value) { _checkPrivateRedeclaration$1(obj, privateMap); privateMap.set(obj, value); }
|
|
973
|
+
function _checkPrivateRedeclaration$1(obj, privateCollection) { if (privateCollection.has(obj)) { throw new TypeError("Cannot initialize the same private elements twice on an object"); } }
|
|
920
974
|
var _recordingId = /*#__PURE__*/new WeakMap();
|
|
921
975
|
var _uploadId = /*#__PURE__*/new WeakMap();
|
|
922
976
|
var _unUploadedChunks = /*#__PURE__*/new WeakMap();
|
|
@@ -930,18 +984,18 @@ var _failedUpload = /*#__PURE__*/new WeakMap();
|
|
|
930
984
|
var _uploadProgress = /*#__PURE__*/new WeakMap();
|
|
931
985
|
var _status = /*#__PURE__*/new WeakMap();
|
|
932
986
|
var _id = /*#__PURE__*/new WeakMap();
|
|
933
|
-
var
|
|
987
|
+
var _logger$1 = /*#__PURE__*/new WeakMap();
|
|
934
988
|
var _status2 = /*#__PURE__*/new WeakMap();
|
|
935
989
|
var _fireCallbacks$1 = /*#__PURE__*/new WeakMap();
|
|
936
990
|
var _uploadChunkToS = /*#__PURE__*/new WeakMap();
|
|
937
991
|
var _getCurrentUnUploadedBlob = /*#__PURE__*/new WeakMap();
|
|
938
|
-
var
|
|
992
|
+
var _isRecordingNotSet = /*#__PURE__*/new WeakMap();
|
|
939
993
|
var MultipartS3Uploader = /*#__PURE__*/function () {
|
|
940
994
|
function MultipartS3Uploader() {
|
|
941
995
|
var _this = this;
|
|
942
996
|
_classCallCheck(this, MultipartS3Uploader);
|
|
943
|
-
_classPrivateFieldInitSpec$1(this,
|
|
944
|
-
get:
|
|
997
|
+
_classPrivateFieldInitSpec$1(this, _isRecordingNotSet, {
|
|
998
|
+
get: _get_isRecordingNotSet,
|
|
945
999
|
set: void 0
|
|
946
1000
|
});
|
|
947
1001
|
_classPrivateFieldInitSpec$1(this, _status2, {
|
|
@@ -999,9 +1053,9 @@ var MultipartS3Uploader = /*#__PURE__*/function () {
|
|
|
999
1053
|
});
|
|
1000
1054
|
_classPrivateFieldInitSpec$1(this, _id, {
|
|
1001
1055
|
writable: true,
|
|
1002
|
-
value:
|
|
1056
|
+
value: v4()
|
|
1003
1057
|
});
|
|
1004
|
-
_classPrivateFieldInitSpec$1(this,
|
|
1058
|
+
_classPrivateFieldInitSpec$1(this, _logger$1, {
|
|
1005
1059
|
writable: true,
|
|
1006
1060
|
value: createPrefixedLogger("[".concat(_classPrivateFieldGet(this, _id), "]"))
|
|
1007
1061
|
});
|
|
@@ -1014,126 +1068,133 @@ var MultipartS3Uploader = /*#__PURE__*/function () {
|
|
|
1014
1068
|
if (data.size > 0) {
|
|
1015
1069
|
_classPrivateFieldGet(_this, _unUploadedChunks).push(data);
|
|
1016
1070
|
}
|
|
1017
|
-
if (_classPrivateFieldGet(_this,
|
|
1018
|
-
_classPrivateFieldGet(_this,
|
|
1071
|
+
if (_classPrivateFieldGet(_this, _isRecordingNotSet)) return;
|
|
1072
|
+
_classPrivateFieldGet(_this, _logger$1).info("Current unuploaded data size is ", _classPrivateFieldGet(_this, _getCurrentUnUploadedBlob).call(_this).size / 1024 / 1024, "MB");
|
|
1019
1073
|
if (_classPrivateFieldGet(_this, _getCurrentUnUploadedBlob).call(_this).size > _this.MIN_UPLOAD_CHUNK_SIZE) {
|
|
1020
1074
|
var uploadChunkToS3Promise = _classPrivateFieldGet(_this, _uploadChunkToS).call(_this, _classPrivateFieldGet(_this, _unUploadedChunks));
|
|
1021
1075
|
_classPrivateFieldGet(_this, _pendingS3ChunkUploads).push(uploadChunkToS3Promise);
|
|
1022
1076
|
_classPrivateFieldSet(_this, _unUploadedChunks, []);
|
|
1023
1077
|
}
|
|
1024
1078
|
});
|
|
1025
|
-
_defineProperty(this, "completeUpload", /*#__PURE__*/
|
|
1026
|
-
var
|
|
1027
|
-
|
|
1028
|
-
|
|
1029
|
-
|
|
1030
|
-
|
|
1031
|
-
|
|
1032
|
-
|
|
1033
|
-
|
|
1034
|
-
|
|
1035
|
-
|
|
1036
|
-
|
|
1037
|
-
|
|
1038
|
-
|
|
1039
|
-
|
|
1040
|
-
|
|
1041
|
-
_classPrivateFieldGet(_this,
|
|
1042
|
-
|
|
1043
|
-
|
|
1044
|
-
|
|
1079
|
+
_defineProperty(this, "completeUpload", /*#__PURE__*/function () {
|
|
1080
|
+
var _ref = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee(sessionLogs) {
|
|
1081
|
+
var uploadChunkToS3Promise, resolvedS3PartUploadPromises, parts;
|
|
1082
|
+
return _regeneratorRuntime.wrap(function _callee$(_context) {
|
|
1083
|
+
while (1) switch (_context.prev = _context.next) {
|
|
1084
|
+
case 0:
|
|
1085
|
+
_context.prev = 0;
|
|
1086
|
+
_classPrivateFieldSet(_this, _status2, UPLOAD_STATUS.uploading);
|
|
1087
|
+
if (!_classPrivateFieldGet(_this, _isRecordingNotSet)) {
|
|
1088
|
+
_context.next = 5;
|
|
1089
|
+
break;
|
|
1090
|
+
}
|
|
1091
|
+
_classPrivateFieldGet(_this, _logger$1).error("completeUpload -> not initialized");
|
|
1092
|
+
return _context.abrupt("return");
|
|
1093
|
+
case 5:
|
|
1094
|
+
// Upload last chunk; only if last chunk has data
|
|
1095
|
+
if (_classPrivateFieldGet(_this, _getCurrentUnUploadedBlob).call(_this).size > 0) {
|
|
1096
|
+
_classPrivateFieldGet(_this, _logger$1).info("completeUpload -> need to upload last chunk");
|
|
1097
|
+
uploadChunkToS3Promise = _classPrivateFieldGet(_this, _uploadChunkToS).call(_this, _classPrivateFieldGet(_this, _unUploadedChunks));
|
|
1098
|
+
_classPrivateFieldGet(_this, _pendingS3ChunkUploads).push(uploadChunkToS3Promise);
|
|
1099
|
+
}
|
|
1045
1100
|
|
|
1046
|
-
|
|
1047
|
-
|
|
1048
|
-
|
|
1049
|
-
|
|
1050
|
-
|
|
1051
|
-
|
|
1052
|
-
|
|
1053
|
-
|
|
1054
|
-
|
|
1055
|
-
|
|
1056
|
-
|
|
1057
|
-
|
|
1058
|
-
|
|
1059
|
-
|
|
1060
|
-
|
|
1061
|
-
|
|
1062
|
-
|
|
1063
|
-
|
|
1064
|
-
|
|
1065
|
-
|
|
1066
|
-
}
|
|
1067
|
-
_classPrivateFieldGet(_this, _logger5).info("completeUpload -> chunks with these partNumbers failed:", _classPrivateFieldGet(_this, _failedUpload));
|
|
1068
|
-
_classPrivateFieldSet(_this, _status2, UPLOAD_STATUS.error);
|
|
1069
|
-
_classPrivateFieldGet(_this, _fireCallbacks$1).call(_this, UPLOAD_EVENT.onError);
|
|
1070
|
-
return _context.abrupt("return");
|
|
1071
|
-
case 18:
|
|
1072
|
-
if (!(resolvedS3PartUploadPromises.length === 0)) {
|
|
1073
|
-
_context.next = 22;
|
|
1074
|
-
break;
|
|
1075
|
-
}
|
|
1076
|
-
_classPrivateFieldGet(_this, _logger5).info("completeUpload -> insufficient data");
|
|
1077
|
-
_classPrivateFieldSet(_this, _status2, UPLOAD_STATUS.insufficient_data);
|
|
1078
|
-
return _context.abrupt("return");
|
|
1079
|
-
case 22:
|
|
1080
|
-
parts = resolvedS3PartUploadPromises.filter(isNotCancelledRequest).map(function (resolvedResponse) {
|
|
1081
|
-
return {
|
|
1082
|
-
etag: resolvedResponse.headers.etag,
|
|
1083
|
-
partNumber: new URL(resolvedResponse.request.responseURL).searchParams.get("partNumber")
|
|
1084
|
-
};
|
|
1085
|
-
}).toSorted(function (a, b) {
|
|
1086
|
-
return Number(a.partNumber) - Number(b.partNumber);
|
|
1087
|
-
});
|
|
1088
|
-
_classPrivateFieldGet(_this, _logger5).info("completeUpload -> uploaded parts: ", parts);
|
|
1089
|
-
_classPrivateFieldSet(_this, _completeUploadPromise, completeUploadApi.create({
|
|
1090
|
-
recordingId: _classPrivateFieldGet(_this, _recordingId),
|
|
1091
|
-
payload: {
|
|
1092
|
-
parts: parts,
|
|
1093
|
-
uploadId: _classPrivateFieldGet(_this, _uploadId),
|
|
1094
|
-
isMp4: isMp4Supported()
|
|
1095
|
-
},
|
|
1096
|
-
config: {
|
|
1097
|
-
signal: _classPrivateFieldGet(_this, _abortController).signal
|
|
1101
|
+
/**
|
|
1102
|
+
* Wait for all the pending uploadToS3Promises.
|
|
1103
|
+
* Else we encounter a race condition where a new request is made for presignedUrl
|
|
1104
|
+
* but at the same time we reach the resolvedS3PartUploadPromises line and await
|
|
1105
|
+
* the s3PartUploadPromises. And the s3PartUploadPromises is resolved before
|
|
1106
|
+
* adding the new presignedUrl part upload to s3PartUploadPromises.
|
|
1107
|
+
* This results in incorrect partNumbers.
|
|
1108
|
+
*/
|
|
1109
|
+
_classPrivateFieldGet(_this, _logger$1).info("completeUpload -> uploading all pending chunks...", _classPrivateFieldGet(_this, _pendingS3ChunkUploads).length);
|
|
1110
|
+
_context.next = 9;
|
|
1111
|
+
return Promise.all(_classPrivateFieldGet(_this, _pendingS3ChunkUploads));
|
|
1112
|
+
case 9:
|
|
1113
|
+
_classPrivateFieldGet(_this, _logger$1).info("completeUpload -> finishing part uploads...");
|
|
1114
|
+
_context.next = 12;
|
|
1115
|
+
return Promise.all(_classPrivateFieldGet(_this, _s3PartUploadPromises));
|
|
1116
|
+
case 12:
|
|
1117
|
+
resolvedS3PartUploadPromises = _context.sent;
|
|
1118
|
+
if (!isNotEmpty(_classPrivateFieldGet(_this, _failedUpload))) {
|
|
1119
|
+
_context.next = 18;
|
|
1120
|
+
break;
|
|
1098
1121
|
}
|
|
1099
|
-
|
|
1100
|
-
_classPrivateFieldGet(_this, _logger5).info("completeUpload -> completing upload... ");
|
|
1101
|
-
_context.next = 28;
|
|
1102
|
-
return _classPrivateFieldGet(_this, _completeUploadPromise);
|
|
1103
|
-
case 28:
|
|
1104
|
-
_classPrivateFieldGet(_this, _logger5).info("completeUpload -> upload completed");
|
|
1105
|
-
if (!(_this.status === UPLOAD_STATUS.aborting)) {
|
|
1106
|
-
_context.next = 32;
|
|
1107
|
-
break;
|
|
1108
|
-
}
|
|
1109
|
-
_classPrivateFieldGet(_this, _logger5).info("completeUpload -> upload was marked as aborted");
|
|
1110
|
-
return _context.abrupt("return");
|
|
1111
|
-
case 32:
|
|
1112
|
-
_classPrivateFieldSet(_this, _status2, UPLOAD_STATUS.completed);
|
|
1113
|
-
_classPrivateFieldGet(_this, _fireCallbacks$1).call(_this, UPLOAD_EVENT.onComplete);
|
|
1114
|
-
_context.next = 39;
|
|
1115
|
-
break;
|
|
1116
|
-
case 36:
|
|
1117
|
-
_context.prev = 36;
|
|
1118
|
-
_context.t0 = _context["catch"](0);
|
|
1119
|
-
// ignore if aborted
|
|
1120
|
-
if (!axios.isCancel(_context.t0)) {
|
|
1122
|
+
_classPrivateFieldGet(_this, _logger$1).info("completeUpload -> chunks with these partNumbers failed:", _classPrivateFieldGet(_this, _failedUpload));
|
|
1121
1123
|
_classPrivateFieldSet(_this, _status2, UPLOAD_STATUS.error);
|
|
1122
1124
|
_classPrivateFieldGet(_this, _fireCallbacks$1).call(_this, UPLOAD_EVENT.onError);
|
|
1123
|
-
|
|
1124
|
-
|
|
1125
|
-
|
|
1126
|
-
|
|
1127
|
-
|
|
1128
|
-
|
|
1129
|
-
|
|
1130
|
-
|
|
1131
|
-
|
|
1132
|
-
|
|
1133
|
-
|
|
1134
|
-
|
|
1125
|
+
return _context.abrupt("return");
|
|
1126
|
+
case 18:
|
|
1127
|
+
if (!(resolvedS3PartUploadPromises.length === 0)) {
|
|
1128
|
+
_context.next = 22;
|
|
1129
|
+
break;
|
|
1130
|
+
}
|
|
1131
|
+
_classPrivateFieldGet(_this, _logger$1).info("completeUpload -> insufficient data");
|
|
1132
|
+
_classPrivateFieldSet(_this, _status2, UPLOAD_STATUS.insufficient_data);
|
|
1133
|
+
return _context.abrupt("return");
|
|
1134
|
+
case 22:
|
|
1135
|
+
parts = resolvedS3PartUploadPromises.filter(isNotCancelledRequest).map(function (resolvedResponse) {
|
|
1136
|
+
return {
|
|
1137
|
+
etag: resolvedResponse.headers.etag,
|
|
1138
|
+
partNumber: new URL(resolvedResponse.request.responseURL).searchParams.get("partNumber")
|
|
1139
|
+
};
|
|
1140
|
+
}).toSorted(function (a, b) {
|
|
1141
|
+
return Number(a.partNumber) - Number(b.partNumber);
|
|
1142
|
+
});
|
|
1143
|
+
_classPrivateFieldGet(_this, _logger$1).info("completeUpload -> uploaded parts: ", parts);
|
|
1144
|
+
_classPrivateFieldSet(_this, _completeUploadPromise, completeUploadApi.create({
|
|
1145
|
+
recordingId: _classPrivateFieldGet(_this, _recordingId),
|
|
1146
|
+
payload: {
|
|
1147
|
+
parts: parts,
|
|
1148
|
+
uploadId: _classPrivateFieldGet(_this, _uploadId),
|
|
1149
|
+
isMp4: isMp4Supported(),
|
|
1150
|
+
logs: sessionLogs
|
|
1151
|
+
},
|
|
1152
|
+
config: {
|
|
1153
|
+
signal: _classPrivateFieldGet(_this, _abortController).signal
|
|
1154
|
+
}
|
|
1155
|
+
}));
|
|
1156
|
+
_classPrivateFieldGet(_this, _logger$1).info("completeUpload -> completing upload... ");
|
|
1157
|
+
_context.next = 28;
|
|
1158
|
+
return _classPrivateFieldGet(_this, _completeUploadPromise);
|
|
1159
|
+
case 28:
|
|
1160
|
+
_classPrivateFieldGet(_this, _logger$1).info("completeUpload -> upload completed");
|
|
1161
|
+
if (!(_this.status === UPLOAD_STATUS.aborting)) {
|
|
1162
|
+
_context.next = 32;
|
|
1163
|
+
break;
|
|
1164
|
+
}
|
|
1165
|
+
_classPrivateFieldGet(_this, _logger$1).info("completeUpload -> upload was marked as aborted");
|
|
1166
|
+
return _context.abrupt("return");
|
|
1167
|
+
case 32:
|
|
1168
|
+
_classPrivateFieldSet(_this, _status2, UPLOAD_STATUS.completed);
|
|
1169
|
+
_classPrivateFieldGet(_this, _fireCallbacks$1).call(_this, UPLOAD_EVENT.onComplete);
|
|
1170
|
+
_context.next = 39;
|
|
1171
|
+
break;
|
|
1172
|
+
case 36:
|
|
1173
|
+
_context.prev = 36;
|
|
1174
|
+
_context.t0 = _context["catch"](0);
|
|
1175
|
+
// ignore if aborted
|
|
1176
|
+
if (!axios.isCancel(_context.t0)) {
|
|
1177
|
+
_classPrivateFieldSet(_this, _status2, UPLOAD_STATUS.error);
|
|
1178
|
+
_classPrivateFieldGet(_this, _fireCallbacks$1).call(_this, UPLOAD_EVENT.onError);
|
|
1179
|
+
_classPrivateFieldGet(_this, _logger$1).error(_context.t0);
|
|
1180
|
+
}
|
|
1181
|
+
case 39:
|
|
1182
|
+
_context.prev = 39;
|
|
1183
|
+
_classPrivateFieldSet(_this, _completeUploadPromise, null);
|
|
1184
|
+
return _context.finish(39);
|
|
1185
|
+
case 42:
|
|
1186
|
+
case "end":
|
|
1187
|
+
return _context.stop();
|
|
1188
|
+
}
|
|
1189
|
+
}, _callee, null, [[0, 36, 39, 42]]);
|
|
1190
|
+
}));
|
|
1191
|
+
return function (_x) {
|
|
1192
|
+
return _ref.apply(this, arguments);
|
|
1193
|
+
};
|
|
1194
|
+
}());
|
|
1135
1195
|
_defineProperty(this, "abortUpload", /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee2() {
|
|
1136
1196
|
var forceAbort,
|
|
1197
|
+
sessionLogs,
|
|
1137
1198
|
recordingId,
|
|
1138
1199
|
uploadId,
|
|
1139
1200
|
_args2 = arguments;
|
|
@@ -1141,55 +1202,57 @@ var MultipartS3Uploader = /*#__PURE__*/function () {
|
|
|
1141
1202
|
while (1) switch (_context2.prev = _context2.next) {
|
|
1142
1203
|
case 0:
|
|
1143
1204
|
forceAbort = _args2.length > 0 && _args2[0] !== undefined ? _args2[0] : false;
|
|
1144
|
-
|
|
1205
|
+
sessionLogs = _args2.length > 1 ? _args2[1] : undefined;
|
|
1206
|
+
_context2.prev = 2;
|
|
1145
1207
|
if (!(_this.status === UPLOAD_STATUS.aborting && !forceAbort)) {
|
|
1146
|
-
_context2.next =
|
|
1208
|
+
_context2.next = 6;
|
|
1147
1209
|
break;
|
|
1148
1210
|
}
|
|
1149
|
-
_classPrivateFieldGet(_this,
|
|
1211
|
+
_classPrivateFieldGet(_this, _logger$1).info("abortUpload -> already aborting");
|
|
1150
1212
|
return _context2.abrupt("return");
|
|
1151
|
-
case
|
|
1213
|
+
case 6:
|
|
1152
1214
|
_classPrivateFieldSet(_this, _status2, UPLOAD_STATUS.aborting);
|
|
1153
|
-
if (!_classPrivateFieldGet(_this,
|
|
1154
|
-
_context2.next =
|
|
1215
|
+
if (!_classPrivateFieldGet(_this, _isRecordingNotSet)) {
|
|
1216
|
+
_context2.next = 10;
|
|
1155
1217
|
break;
|
|
1156
1218
|
}
|
|
1157
|
-
_classPrivateFieldGet(_this,
|
|
1219
|
+
_classPrivateFieldGet(_this, _logger$1).info("abortUpload -> not initialized");
|
|
1158
1220
|
return _context2.abrupt("return");
|
|
1159
|
-
case
|
|
1221
|
+
case 10:
|
|
1160
1222
|
recordingId = _classPrivateFieldGet(_this, _recordingId);
|
|
1161
1223
|
uploadId = _classPrivateFieldGet(_this, _uploadId);
|
|
1162
|
-
_context2.next =
|
|
1224
|
+
_context2.next = 14;
|
|
1163
1225
|
return _classPrivateFieldGet(_this, _completeUploadPromise);
|
|
1164
|
-
case
|
|
1226
|
+
case 14:
|
|
1165
1227
|
_classPrivateFieldGet(_this, _abortController).abort();
|
|
1166
|
-
_context2.next =
|
|
1228
|
+
_context2.next = 17;
|
|
1167
1229
|
return abortUploadApi.create({
|
|
1168
1230
|
recordingId: recordingId,
|
|
1169
1231
|
payload: {
|
|
1170
1232
|
uploadId: uploadId,
|
|
1171
|
-
isMp4: isMp4Supported()
|
|
1233
|
+
isMp4: isMp4Supported(),
|
|
1234
|
+
logs: sessionLogs
|
|
1172
1235
|
}
|
|
1173
1236
|
});
|
|
1174
|
-
case
|
|
1175
|
-
_classPrivateFieldGet(_this,
|
|
1237
|
+
case 17:
|
|
1238
|
+
_classPrivateFieldGet(_this, _logger$1).info("abortUpload -> abort successful");
|
|
1176
1239
|
_classPrivateFieldGet(_this, _fireCallbacks$1).call(_this, UPLOAD_EVENT.onAbort);
|
|
1177
1240
|
_classPrivateFieldSet(_this, _unUploadedChunks, []);
|
|
1178
1241
|
_classPrivateFieldSet(_this, _partNumber, 1);
|
|
1179
1242
|
_classPrivateFieldSet(_this, _s3PartUploadPromises, []);
|
|
1180
1243
|
_classPrivateFieldSet(_this, _status2, "");
|
|
1181
1244
|
_classPrivateFieldSet(_this, _abortController, null);
|
|
1182
|
-
_context2.next =
|
|
1245
|
+
_context2.next = 29;
|
|
1183
1246
|
break;
|
|
1184
|
-
case
|
|
1185
|
-
_context2.prev =
|
|
1186
|
-
_context2.t0 = _context2["catch"](
|
|
1187
|
-
_classPrivateFieldGet(_this,
|
|
1188
|
-
case
|
|
1247
|
+
case 26:
|
|
1248
|
+
_context2.prev = 26;
|
|
1249
|
+
_context2.t0 = _context2["catch"](2);
|
|
1250
|
+
_classPrivateFieldGet(_this, _logger$1).error(_context2.t0);
|
|
1251
|
+
case 29:
|
|
1189
1252
|
case "end":
|
|
1190
1253
|
return _context2.stop();
|
|
1191
1254
|
}
|
|
1192
|
-
}, _callee2, null, [[
|
|
1255
|
+
}, _callee2, null, [[2, 26]]);
|
|
1193
1256
|
})));
|
|
1194
1257
|
_defineProperty(this, "resetState", function () {
|
|
1195
1258
|
_classPrivateFieldSet(_this, _recordingId, "");
|
|
@@ -1233,7 +1296,7 @@ var MultipartS3Uploader = /*#__PURE__*/function () {
|
|
|
1233
1296
|
return _regeneratorRuntime.wrap(function _callee3$(_context3) {
|
|
1234
1297
|
while (1) switch (_context3.prev = _context3.next) {
|
|
1235
1298
|
case 0:
|
|
1236
|
-
_classPrivateFieldGet(_this,
|
|
1299
|
+
_classPrivateFieldGet(_this, _logger$1).info("Part ready to be uploaded: ", _classPrivateFieldGet(_this, _partNumber));
|
|
1237
1300
|
partNumber = _classPrivateFieldGet(_this, _partNumber);
|
|
1238
1301
|
mimeType = getSupportedMimeType();
|
|
1239
1302
|
_classPrivateFieldSet(_this, _partNumber, (_this$partNumber = _classPrivateFieldGet(_this, _partNumber), _this$partNumber++, _this$partNumber));
|
|
@@ -1259,7 +1322,7 @@ var MultipartS3Uploader = /*#__PURE__*/function () {
|
|
|
1259
1322
|
case 8:
|
|
1260
1323
|
_yield$partPresignedU = _context3.sent;
|
|
1261
1324
|
presignedUrl = _yield$partPresignedU.presignedUrl;
|
|
1262
|
-
_classPrivateFieldGet(_this,
|
|
1325
|
+
_classPrivateFieldGet(_this, _logger$1).info("Presigned url created for partNumber:", partNumber);
|
|
1263
1326
|
s3PartUploadPromise = s3Api.presignedUpload({
|
|
1264
1327
|
presignedUrl: presignedUrl,
|
|
1265
1328
|
blob: new Blob(chunks, {
|
|
@@ -1275,7 +1338,7 @@ var MultipartS3Uploader = /*#__PURE__*/function () {
|
|
|
1275
1338
|
};
|
|
1276
1339
|
if (_this.status === UPLOAD_STATUS.uploading) {
|
|
1277
1340
|
var percentCompleted = calculateUploadProgress(_classPrivateFieldGet(_this, _uploadProgress));
|
|
1278
|
-
_classPrivateFieldGet(_this,
|
|
1341
|
+
_classPrivateFieldGet(_this, _logger$1).info("Upload Progress: ".concat(percentCompleted, "%"));
|
|
1279
1342
|
_classPrivateFieldGet(_this, _fireCallbacks$1).call(_this, UPLOAD_EVENT.onProgress, [percentCompleted]);
|
|
1280
1343
|
}
|
|
1281
1344
|
}
|
|
@@ -1289,7 +1352,7 @@ var MultipartS3Uploader = /*#__PURE__*/function () {
|
|
|
1289
1352
|
_context3.t0 = _context3["catch"](5);
|
|
1290
1353
|
// ignore if aborted
|
|
1291
1354
|
if (!axios.isCancel(_context3.t0)) {
|
|
1292
|
-
_classPrivateFieldGet(_this,
|
|
1355
|
+
_classPrivateFieldGet(_this, _logger$1).error("Failed to upload partNumber:", partNumber);
|
|
1293
1356
|
if (_this.status === UPLOAD_STATUS.uploading) {
|
|
1294
1357
|
_classPrivateFieldSet(_this, _status2, UPLOAD_STATUS.error);
|
|
1295
1358
|
_classPrivateFieldGet(_this, _fireCallbacks$1).call(_this, UPLOAD_EVENT.onError);
|
|
@@ -1303,7 +1366,7 @@ var MultipartS3Uploader = /*#__PURE__*/function () {
|
|
|
1303
1366
|
}
|
|
1304
1367
|
}, _callee3, null, [[5, 15]]);
|
|
1305
1368
|
}));
|
|
1306
|
-
function value(
|
|
1369
|
+
function value(_x2) {
|
|
1307
1370
|
return _value.apply(this, arguments);
|
|
1308
1371
|
}
|
|
1309
1372
|
return value;
|
|
@@ -1317,7 +1380,7 @@ var MultipartS3Uploader = /*#__PURE__*/function () {
|
|
|
1317
1380
|
});
|
|
1318
1381
|
}
|
|
1319
1382
|
});
|
|
1320
|
-
_classPrivateFieldGet(this,
|
|
1383
|
+
_classPrivateFieldGet(this, _logger$1).info("Uploader initialized");
|
|
1321
1384
|
}
|
|
1322
1385
|
_createClass(MultipartS3Uploader, [{
|
|
1323
1386
|
key: "status",
|
|
@@ -1336,7 +1399,7 @@ function _set_status(status) {
|
|
|
1336
1399
|
_classPrivateFieldSet(this, _status, status);
|
|
1337
1400
|
useMultipartS3UploadStatus$1.triggerStatusChange();
|
|
1338
1401
|
}
|
|
1339
|
-
function
|
|
1402
|
+
function _get_isRecordingNotSet() {
|
|
1340
1403
|
return isEmpty(_classPrivateFieldGet(this, _uploadId) + _classPrivateFieldGet(this, _recordingId));
|
|
1341
1404
|
}
|
|
1342
1405
|
var multipartS3Uploader = new MultipartS3Uploader();
|
|
@@ -1423,6 +1486,7 @@ var _video = /*#__PURE__*/new WeakMap();
|
|
|
1423
1486
|
var _mediaRecorder = /*#__PURE__*/new WeakMap();
|
|
1424
1487
|
var _mediaStream = /*#__PURE__*/new WeakMap();
|
|
1425
1488
|
var _store = /*#__PURE__*/new WeakMap();
|
|
1489
|
+
var _logger = /*#__PURE__*/new WeakMap();
|
|
1426
1490
|
var _mediaChunks = /*#__PURE__*/new WeakMap();
|
|
1427
1491
|
var _callbacks = /*#__PURE__*/new WeakMap();
|
|
1428
1492
|
var _lastTimerUpdatedAt = /*#__PURE__*/new WeakMap();
|
|
@@ -1470,6 +1534,10 @@ var ScreenRecorder = /*#__PURE__*/function () {
|
|
|
1470
1534
|
writable: true,
|
|
1471
1535
|
value: void 0
|
|
1472
1536
|
});
|
|
1537
|
+
_classPrivateFieldInitSpec(this, _logger, {
|
|
1538
|
+
writable: true,
|
|
1539
|
+
value: createPrefixedLogger("[ScreenRecorder]")
|
|
1540
|
+
});
|
|
1473
1541
|
_classPrivateFieldInitSpec(this, _mediaChunks, {
|
|
1474
1542
|
writable: true,
|
|
1475
1543
|
value: []
|
|
@@ -1558,25 +1626,27 @@ var ScreenRecorder = /*#__PURE__*/function () {
|
|
|
1558
1626
|
case 0:
|
|
1559
1627
|
_classPrivateFieldGet(_this, _store).setState(pick(["error"], initialState));
|
|
1560
1628
|
if (_classPrivateFieldGet(_this, _mediaStream)) {
|
|
1561
|
-
_context.next =
|
|
1629
|
+
_context.next = 5;
|
|
1562
1630
|
break;
|
|
1563
1631
|
}
|
|
1564
|
-
|
|
1632
|
+
_classPrivateFieldGet(_this, _logger).info("acquiring media stream");
|
|
1633
|
+
_context.next = 5;
|
|
1565
1634
|
return _classPrivateFieldGet(_this, _acquireMediaStream).call(_this);
|
|
1566
|
-
case
|
|
1635
|
+
case 5:
|
|
1567
1636
|
if (!(_classPrivateFieldGet(_this, _mediaStream) && isStreamEnded(_classPrivateFieldGet(_this, _mediaStream)))) {
|
|
1568
|
-
_context.next =
|
|
1637
|
+
_context.next = 9;
|
|
1569
1638
|
break;
|
|
1570
1639
|
}
|
|
1571
|
-
|
|
1640
|
+
_classPrivateFieldGet(_this, _logger).info("media stream ended, acquiring media stream again");
|
|
1641
|
+
_context.next = 9;
|
|
1572
1642
|
return _classPrivateFieldGet(_this, _acquireMediaStream).call(_this);
|
|
1573
|
-
case
|
|
1643
|
+
case 9:
|
|
1574
1644
|
if (!(!_classPrivateFieldGet(_this, _mediaStream) || isStreamEnded(_classPrivateFieldGet(_this, _mediaStream)))) {
|
|
1575
|
-
_context.next =
|
|
1645
|
+
_context.next = 11;
|
|
1576
1646
|
break;
|
|
1577
1647
|
}
|
|
1578
1648
|
return _context.abrupt("return");
|
|
1579
|
-
case
|
|
1649
|
+
case 11:
|
|
1580
1650
|
options = getMediaRecorderOptions();
|
|
1581
1651
|
_classPrivateFieldSet(_this, _mediaChunks, []);
|
|
1582
1652
|
_classPrivateFieldSet(_this, _mediaRecorder, new MediaRecorder(_classPrivateFieldGet(_this, _mediaStream), options));
|
|
@@ -1590,7 +1660,7 @@ var ScreenRecorder = /*#__PURE__*/function () {
|
|
|
1590
1660
|
});
|
|
1591
1661
|
};
|
|
1592
1662
|
_classPrivateFieldGet(_this, _countdownAndStartRecording).call(_this);
|
|
1593
|
-
case
|
|
1663
|
+
case 19:
|
|
1594
1664
|
case "end":
|
|
1595
1665
|
return _context.stop();
|
|
1596
1666
|
}
|
|
@@ -1829,7 +1899,7 @@ var ScreenRecorder = /*#__PURE__*/function () {
|
|
|
1829
1899
|
error: SCREEN_RECORDER_ERROR.MicPermissionDenied,
|
|
1830
1900
|
status: SCREEN_RECORDER_STATUS.idle
|
|
1831
1901
|
});
|
|
1832
|
-
} else if (!
|
|
1902
|
+
} else if (!_classPrivateFieldGet(_this, _mediaStream) || isStreamEnded(_classPrivateFieldGet(_this, _mediaStream))) {
|
|
1833
1903
|
_classPrivateFieldGet(_this, _store).setState({
|
|
1834
1904
|
error: SCREEN_RECORDER_ERROR[_context2.t1.name],
|
|
1835
1905
|
status: SCREEN_RECORDER_STATUS.idle
|
|
@@ -1867,7 +1937,7 @@ var ScreenRecorder = /*#__PURE__*/function () {
|
|
|
1867
1937
|
writable: true,
|
|
1868
1938
|
value: function value(_ref2) {
|
|
1869
1939
|
var data = _ref2.data;
|
|
1870
|
-
|
|
1940
|
+
_classPrivateFieldGet(_this, _logger).info("received data in onRecordingActive");
|
|
1871
1941
|
if (data.size <= 0) return;
|
|
1872
1942
|
_classPrivateFieldGet(_this, _mediaChunks).push(data);
|
|
1873
1943
|
_classPrivateFieldGet(_this, _fireCallbacks).call(_this, SCREEN_RECORDER_EVENT.onDataAvailable, [data]);
|
|
@@ -1876,7 +1946,7 @@ var ScreenRecorder = /*#__PURE__*/function () {
|
|
|
1876
1946
|
_classPrivateFieldInitSpec(this, _onRecordingStop, {
|
|
1877
1947
|
writable: true,
|
|
1878
1948
|
value: function value() {
|
|
1879
|
-
|
|
1949
|
+
_classPrivateFieldGet(_this, _logger).info("stopping recording in onRecordingStop");
|
|
1880
1950
|
_classPrivateFieldGet(_this, _store).setState({
|
|
1881
1951
|
status: SCREEN_RECORDER_STATUS.stopped
|
|
1882
1952
|
});
|
|
@@ -1894,6 +1964,7 @@ var ScreenRecorder = /*#__PURE__*/function () {
|
|
|
1894
1964
|
_classPrivateFieldInitSpec(this, _countdownAndStartRecording, {
|
|
1895
1965
|
writable: true,
|
|
1896
1966
|
value: function value() {
|
|
1967
|
+
if (_classPrivateFieldGet(_this, _countdownTimerId)) return;
|
|
1897
1968
|
_classPrivateFieldSet(_this, _countdownTimerId, setInterval(function () {
|
|
1898
1969
|
_classPrivateFieldGet(_this, _store).setState(function (_ref3) {
|
|
1899
1970
|
var countdownTimeLeft = _ref3.countdownTimeLeft;
|
|
@@ -1909,12 +1980,31 @@ var ScreenRecorder = /*#__PURE__*/function () {
|
|
|
1909
1980
|
status: SCREEN_RECORDER_STATUS.recording
|
|
1910
1981
|
});
|
|
1911
1982
|
clearInterval(_classPrivateFieldGet(_this, _countdownTimerId));
|
|
1983
|
+
_classPrivateFieldSet(_this, _countdownTimerId, null);
|
|
1912
1984
|
_classPrivateFieldSet(_this, _startRecordingTimeoutID, setTimeout(function () {
|
|
1913
1985
|
try {
|
|
1986
|
+
_classPrivateFieldGet(_this, _logger).info("starting mediaRecorder");
|
|
1987
|
+
if (!_classPrivateFieldGet(_this, _mediaRecorder)) {
|
|
1988
|
+
_classPrivateFieldGet(_this, _logger).info("mediaRecorder is not defined");
|
|
1989
|
+
_classPrivateFieldGet(_this, _store).setState({
|
|
1990
|
+
status: SCREEN_RECORDER_STATUS.idle,
|
|
1991
|
+
error: SCREEN_RECORDER_ERROR.FailedToStart
|
|
1992
|
+
});
|
|
1993
|
+
return;
|
|
1994
|
+
}
|
|
1995
|
+
if (!_classPrivateFieldGet(_this, _mediaStream) || isStreamEnded(_classPrivateFieldGet(_this, _mediaStream))) {
|
|
1996
|
+
_classPrivateFieldGet(_this, _logger).info("media stream ended, not starting mediaRecorder");
|
|
1997
|
+
_classPrivateFieldGet(_this, _store).setState({
|
|
1998
|
+
status: SCREEN_RECORDER_STATUS.idle,
|
|
1999
|
+
error: SCREEN_RECORDER_ERROR.FailedToStart
|
|
2000
|
+
});
|
|
2001
|
+
return;
|
|
2002
|
+
}
|
|
1914
2003
|
_classPrivateFieldGet(_this, _mediaRecorder).start(5000);
|
|
2004
|
+
_classPrivateFieldGet(_this, _logger).info("started mediaRecorder");
|
|
1915
2005
|
_classPrivateFieldGet(_this, _startTimer).call(_this);
|
|
1916
2006
|
} catch (error) {
|
|
1917
|
-
|
|
2007
|
+
_classPrivateFieldGet(_this, _logger).info("Failed to start mediaRecorder", error);
|
|
1918
2008
|
_classPrivateFieldGet(_this, _store).setState({
|
|
1919
2009
|
status: SCREEN_RECORDER_STATUS.idle,
|
|
1920
2010
|
error: SCREEN_RECORDER_ERROR.FailedToStart
|