@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/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, 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';
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 _logger5 = /*#__PURE__*/new WeakMap();
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 _isRecordingSet = /*#__PURE__*/new WeakMap();
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, _isRecordingSet, {
944
- get: _get_isRecordingSet,
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: crypto.randomUUID()
1056
+ value: v4()
1003
1057
  });
1004
- _classPrivateFieldInitSpec$1(this, _logger5, {
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, _isRecordingSet)) return;
1018
- _classPrivateFieldGet(_this, _logger5).info("Current unuploaded data size is ", _classPrivateFieldGet(_this, _getCurrentUnUploadedBlob).call(_this).size / 1024 / 1024, "MB");
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__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee() {
1026
- var uploadChunkToS3Promise, resolvedS3PartUploadPromises, parts;
1027
- return _regeneratorRuntime.wrap(function _callee$(_context) {
1028
- while (1) switch (_context.prev = _context.next) {
1029
- case 0:
1030
- _context.prev = 0;
1031
- _classPrivateFieldSet(_this, _status2, UPLOAD_STATUS.uploading);
1032
- if (!_classPrivateFieldGet(_this, _isRecordingSet)) {
1033
- _context.next = 5;
1034
- break;
1035
- }
1036
- _classPrivateFieldGet(_this, _logger5).error("completeUpload -> not initialized");
1037
- return _context.abrupt("return");
1038
- case 5:
1039
- // Upload last chunk; only if last chunk has data
1040
- if (_classPrivateFieldGet(_this, _getCurrentUnUploadedBlob).call(_this).size > 0) {
1041
- _classPrivateFieldGet(_this, _logger5).info("completeUpload -> need to upload last chunk");
1042
- uploadChunkToS3Promise = _classPrivateFieldGet(_this, _uploadChunkToS).call(_this, _classPrivateFieldGet(_this, _unUploadedChunks));
1043
- _classPrivateFieldGet(_this, _pendingS3ChunkUploads).push(uploadChunkToS3Promise);
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
- * Wait for all the pending uploadToS3Promises.
1048
- * Else we encounter a race condition where a new request is made for presignedUrl
1049
- * but at the same time we reach the resolvedS3PartUploadPromises line and await
1050
- * the s3PartUploadPromises. And the s3PartUploadPromises is resolved before
1051
- * adding the new presignedUrl part upload to s3PartUploadPromises.
1052
- * This results in incorrect partNumbers.
1053
- */
1054
- _classPrivateFieldGet(_this, _logger5).info("completeUpload -> uploading all pending chunks...", _classPrivateFieldGet(_this, _pendingS3ChunkUploads).length);
1055
- _context.next = 9;
1056
- return Promise.all(_classPrivateFieldGet(_this, _pendingS3ChunkUploads));
1057
- case 9:
1058
- _classPrivateFieldGet(_this, _logger5).info("completeUpload -> finishing part uploads...");
1059
- _context.next = 12;
1060
- return Promise.all(_classPrivateFieldGet(_this, _s3PartUploadPromises));
1061
- case 12:
1062
- resolvedS3PartUploadPromises = _context.sent;
1063
- if (!isNotEmpty(_classPrivateFieldGet(_this, _failedUpload))) {
1064
- _context.next = 18;
1065
- break;
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
- _classPrivateFieldGet(_this, _logger5).error(_context.t0);
1124
- }
1125
- case 39:
1126
- _context.prev = 39;
1127
- _classPrivateFieldSet(_this, _completeUploadPromise, null);
1128
- return _context.finish(39);
1129
- case 42:
1130
- case "end":
1131
- return _context.stop();
1132
- }
1133
- }, _callee, null, [[0, 36, 39, 42]]);
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
- _context2.prev = 1;
1205
+ sessionLogs = _args2.length > 1 ? _args2[1] : undefined;
1206
+ _context2.prev = 2;
1145
1207
  if (!(_this.status === UPLOAD_STATUS.aborting && !forceAbort)) {
1146
- _context2.next = 5;
1208
+ _context2.next = 6;
1147
1209
  break;
1148
1210
  }
1149
- _classPrivateFieldGet(_this, _logger5).info("abortUpload -> already aborting");
1211
+ _classPrivateFieldGet(_this, _logger$1).info("abortUpload -> already aborting");
1150
1212
  return _context2.abrupt("return");
1151
- case 5:
1213
+ case 6:
1152
1214
  _classPrivateFieldSet(_this, _status2, UPLOAD_STATUS.aborting);
1153
- if (!_classPrivateFieldGet(_this, _isRecordingSet)) {
1154
- _context2.next = 9;
1215
+ if (!_classPrivateFieldGet(_this, _isRecordingNotSet)) {
1216
+ _context2.next = 10;
1155
1217
  break;
1156
1218
  }
1157
- _classPrivateFieldGet(_this, _logger5).info("abortUpload -> not initialized");
1219
+ _classPrivateFieldGet(_this, _logger$1).info("abortUpload -> not initialized");
1158
1220
  return _context2.abrupt("return");
1159
- case 9:
1221
+ case 10:
1160
1222
  recordingId = _classPrivateFieldGet(_this, _recordingId);
1161
1223
  uploadId = _classPrivateFieldGet(_this, _uploadId);
1162
- _context2.next = 13;
1224
+ _context2.next = 14;
1163
1225
  return _classPrivateFieldGet(_this, _completeUploadPromise);
1164
- case 13:
1226
+ case 14:
1165
1227
  _classPrivateFieldGet(_this, _abortController).abort();
1166
- _context2.next = 16;
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 16:
1175
- _classPrivateFieldGet(_this, _logger5).info("abortUpload -> abort successful");
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 = 28;
1245
+ _context2.next = 29;
1183
1246
  break;
1184
- case 25:
1185
- _context2.prev = 25;
1186
- _context2.t0 = _context2["catch"](1);
1187
- _classPrivateFieldGet(_this, _logger5).error(_context2.t0);
1188
- case 28:
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, [[1, 25]]);
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, _logger5).info("Part ready to be uploaded: ", _classPrivateFieldGet(_this, _partNumber));
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, _logger5).info("Presigned url created for partNumber:", partNumber);
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, _logger5).info("Upload Progress: ".concat(percentCompleted, "%"));
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, _logger5).error("Failed to upload partNumber:", partNumber);
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(_x) {
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, _logger5).info("Uploader initialized");
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 _get_isRecordingSet() {
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 = 4;
1629
+ _context.next = 5;
1562
1630
  break;
1563
1631
  }
1564
- _context.next = 4;
1632
+ _classPrivateFieldGet(_this, _logger).info("acquiring media stream");
1633
+ _context.next = 5;
1565
1634
  return _classPrivateFieldGet(_this, _acquireMediaStream).call(_this);
1566
- case 4:
1635
+ case 5:
1567
1636
  if (!(_classPrivateFieldGet(_this, _mediaStream) && isStreamEnded(_classPrivateFieldGet(_this, _mediaStream)))) {
1568
- _context.next = 7;
1637
+ _context.next = 9;
1569
1638
  break;
1570
1639
  }
1571
- _context.next = 7;
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 7:
1643
+ case 9:
1574
1644
  if (!(!_classPrivateFieldGet(_this, _mediaStream) || isStreamEnded(_classPrivateFieldGet(_this, _mediaStream)))) {
1575
- _context.next = 9;
1645
+ _context.next = 11;
1576
1646
  break;
1577
1647
  }
1578
1648
  return _context.abrupt("return");
1579
- case 9:
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 17:
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 (!stream) {
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
- logger.info("received data in onRecordingActive");
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
- logger.info("stopping recording in onRecordingStop");
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
- logger.info("Failed to start mediaRecorder", error);
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