@bigbinary/neeto-media-recorder 2.5.3 → 2.5.5

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 { MIME_TYPE as MIME_TYPE$1, RETRYABLE_ERRORS, UPLOAD_STATUS, UPLOAD_EVENT, SCREEN_RECORDER_STATUS, START_RECORDING_SOUND, RECORDING_LIMIT_REACHED_WARNING_SOUND, SCREEN_RECORDER_ERROR, SCREEN_RECORDER_EVENT, RECORDING_TIME_LIMIT_FREE_PLAN, ONE_SECOND, HALF_A_SECOND_IN_MILLISECONDS, ONE_SECOND_IN_MILLISECONDS, TWO_HUNDRED_MILLISECONDS, ONE_MINUTE_IN_MILLISECONDS, STOP_RECORDING_DUE_TO_LIMIT_REACHED_SOUND, IS_EXTENSION } from '@bigbinary/neeto-media-recorder/constants';
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';
4
4
  import { isNotNil, min, isNil, identity, isEmpty, pick, equals, not } from 'ramda';
5
5
  import platform from 'platform';
6
6
  import '@bigbinary/neeto-media-recorder/core';
@@ -773,14 +773,6 @@ var partPresignedUrlApi = {
773
773
  create: retryableCreate
774
774
  };
775
775
 
776
- // https://www.w3.org/TR/screen-capture/#displaycapturesurfacetype
777
- var DISPLAY_SURFACE = {
778
- monitor: "monitor",
779
- window: "window",
780
- browser: "browser"
781
- };
782
- var MINIMUM_CHROMIUM_VERSION_FOR_MP4 = "128.0.6613.85";
783
-
784
776
  var getUnSupportedConstraints = function getUnSupportedConstraints(mediaType) {
785
777
  var supportedMediaConstraints = navigator.mediaDevices.getSupportedConstraints();
786
778
  return Object.keys(mediaType).filter(function (constraint) {
@@ -807,51 +799,45 @@ var isStreamEnded = function isStreamEnded(mediaStream) {
807
799
  readyState: "ended"
808
800
  }, mediaStream.getTracks());
809
801
  };
810
- function getChromiumVersion() {
811
- var userAgent = navigator.userAgent;
812
- var match = userAgent.match(/Chrom(e|ium)\/(([0-9][.]?)+)/);
813
- if (match) {
814
- return match[2];
815
- }
816
- return null;
817
- }
818
- function compareChromiumVersions(version1, version2) {
819
- var v1Parts = version1.split(".").map(Number);
820
- var v2Parts = version2.split(".").map(Number);
821
- for (var i = 0; i < Math.max(v1Parts.length, v2Parts.length); i++) {
822
- var v1Part = v1Parts[i] || 0;
823
- var v2Part = v2Parts[i] || 0;
824
- if (v1Part > v2Part) return 1;
825
- if (v1Part < v2Part) return -1;
826
- }
827
- return 0;
828
- }
829
- var getSupportedMimeType = function getSupportedMimeType(fallback) {
830
- var _platform$os, _platform$os$family;
831
- var isWindows = (_platform$os = platform.os) === null || _platform$os === void 0 ? void 0 : (_platform$os$family = _platform$os.family) === null || _platform$os$family === void 0 ? void 0 : _platform$os$family.includes("Windows");
832
- if (MediaRecorder.isTypeSupported(MIME_TYPE.mp4) && !isWindows) {
833
- if (platform.name === "Safari") {
834
- return MIME_TYPE.mp4;
835
- }
836
- var chromiumVersion = getChromiumVersion();
837
- if (isNil(chromiumVersion)) {
838
- return MIME_TYPE.webmH264;
839
- }
840
- var isChromiumVersionSupported = compareChromiumVersions(chromiumVersion, MINIMUM_CHROMIUM_VERSION_FOR_MP4) >= 0;
841
- if (isChromiumVersionSupported) {
842
- return MIME_TYPE.mp4;
843
- }
844
- return MIME_TYPE.webmH264;
845
- } else if (MediaRecorder.isTypeSupported(MIME_TYPE.webmH264)) {
846
- return MIME_TYPE.webmH264;
847
- }
848
- return fallback;
802
+ var getSupportedMimeType = function getSupportedMimeType() {
803
+ return MIME_TYPE.webmH264;
849
804
  };
850
805
 
851
- // TODO: Support for mp4 in chrome version 126
806
+ // TODO: Uncomment this when mp4 is stable
807
+ // export const getSupportedMimeType = fallback => {
808
+ // const isWindows = platform.os?.family?.includes("Windows");
809
+
810
+ // if (MediaRecorder.isTypeSupported(MIME_TYPE.mp4) && !isWindows) {
811
+ // if (platform.name === "Safari") {
812
+ // return MIME_TYPE.mp4;
813
+ // }
814
+
815
+ // const chromiumVersion = getChromiumVersion();
816
+
817
+ // if (isNil(chromiumVersion)) {
818
+ // return MIME_TYPE.webmH264;
819
+ // }
820
+
821
+ // const isChromiumVersionSupported =
822
+ // compareChromiumVersions(
823
+ // chromiumVersion,
824
+ // MINIMUM_CHROMIUM_VERSION_FOR_MP4
825
+ // ) >= 0;
826
+
827
+ // if (isChromiumVersionSupported) {
828
+ // return MIME_TYPE.mp4;
829
+ // }
830
+
831
+ // return MIME_TYPE.webmH264;
832
+ // } else if (MediaRecorder.isTypeSupported(MIME_TYPE.webmH264)) {
833
+ // return MIME_TYPE.webmH264;
834
+ // }
835
+
836
+ // return fallback;
837
+ // };
838
+
852
839
  var getMediaRecorderOptions = function getMediaRecorderOptions() {
853
840
  var mimeType = getSupportedMimeType();
854
- if (!mimeType) return {};
855
841
  return {
856
842
  mimeType: mimeType
857
843
  };
@@ -859,7 +845,7 @@ var getMediaRecorderOptions = function getMediaRecorderOptions() {
859
845
 
860
846
  var s3AxiosInstance = axios.create({
861
847
  headers: {
862
- "Content-Type": getSupportedMimeType(MIME_TYPE$1.webmH264)
848
+ "Content-Type": getSupportedMimeType()
863
849
  }
864
850
  });
865
851
  s3AxiosInstance.interceptors.response.use(identity, function (error) {
@@ -1011,11 +997,12 @@ var MultipartS3Uploader = /*#__PURE__*/function () {
1011
997
  status: UPLOAD_STATUS.uploading
1012
998
  });
1013
999
  if (!_classPrivateFieldGet(_this, _isNotInitialized)) {
1014
- _context.next = 4;
1000
+ _context.next = 5;
1015
1001
  break;
1016
1002
  }
1003
+ logger.error("completeUpload -> not initialized");
1017
1004
  return _context.abrupt("return");
1018
- case 4:
1005
+ case 5:
1019
1006
  // Upload last chunk; only if last chunk has data
1020
1007
  if (_classPrivateFieldGet(_this, _getCurrentUnUploadedBlob).call(_this).size > 0) {
1021
1008
  logger.info("completeUpload -> need to upload last chunk");
@@ -1032,16 +1019,16 @@ var MultipartS3Uploader = /*#__PURE__*/function () {
1032
1019
  * This results in incorrect partNumbers.
1033
1020
  */
1034
1021
  logger.info("completeUpload -> uploading all pending chunks...", _classPrivateFieldGet(_this, _pendingS3ChunkUploads).length);
1035
- _context.next = 8;
1022
+ _context.next = 9;
1036
1023
  return Promise.all(_classPrivateFieldGet(_this, _pendingS3ChunkUploads));
1037
- case 8:
1024
+ case 9:
1038
1025
  logger.info("completeUpload -> finishing part uploads...");
1039
- _context.next = 11;
1026
+ _context.next = 12;
1040
1027
  return Promise.all(_classPrivateFieldGet(_this, _s3PartUploadPromises));
1041
- case 11:
1028
+ case 12:
1042
1029
  resolvedS3PartUploadPromises = _context.sent;
1043
1030
  if (!isNotEmpty(_classPrivateFieldGet(_this, _failedUpload))) {
1044
- _context.next = 18;
1031
+ _context.next = 19;
1045
1032
  break;
1046
1033
  }
1047
1034
  logger.info("completeUpload -> chunks with these partNumbers failed:", _classPrivateFieldGet(_this, _failedUpload));
@@ -1053,9 +1040,9 @@ var MultipartS3Uploader = /*#__PURE__*/function () {
1053
1040
  status: UPLOAD_STATUS.error
1054
1041
  });
1055
1042
  return _context.abrupt("return");
1056
- case 18:
1043
+ case 19:
1057
1044
  if (!(resolvedS3PartUploadPromises.length === 0)) {
1058
- _context.next = 22;
1045
+ _context.next = 23;
1059
1046
  break;
1060
1047
  }
1061
1048
  logger.info("completeUpload -> insufficient data");
@@ -1063,7 +1050,7 @@ var MultipartS3Uploader = /*#__PURE__*/function () {
1063
1050
  status: UPLOAD_STATUS.insufficient_data
1064
1051
  });
1065
1052
  return _context.abrupt("return");
1066
- case 22:
1053
+ case 23:
1067
1054
  parts = resolvedS3PartUploadPromises.filter(isNotCancelledRequest).map(function (resolvedResponse) {
1068
1055
  return {
1069
1056
  etag: resolvedResponse.headers.etag,
@@ -1085,25 +1072,25 @@ var MultipartS3Uploader = /*#__PURE__*/function () {
1085
1072
  }
1086
1073
  }));
1087
1074
  logger.info("completeUpload -> completing upload... ");
1088
- _context.next = 28;
1075
+ _context.next = 29;
1089
1076
  return _classPrivateFieldGet(_this, _completeUploadPromise);
1090
- case 28:
1077
+ case 29:
1091
1078
  logger.info("completeUpload -> upload completed");
1092
1079
  if (!(_classPrivateFieldGet(_this, _store$1).getState().status === UPLOAD_STATUS.aborting)) {
1093
- _context.next = 32;
1080
+ _context.next = 33;
1094
1081
  break;
1095
1082
  }
1096
1083
  logger.info("completeUpload -> upload was marked as aborted");
1097
1084
  return _context.abrupt("return");
1098
- case 32:
1085
+ case 33:
1099
1086
  _classPrivateFieldGet(_this, _store$1).setState({
1100
1087
  status: UPLOAD_STATUS.completed
1101
1088
  });
1102
1089
  _classPrivateFieldGet(_this, _fireCallbacks$1).call(_this, UPLOAD_EVENT.onComplete);
1103
- _context.next = 39;
1090
+ _context.next = 40;
1104
1091
  break;
1105
- case 36:
1106
- _context.prev = 36;
1092
+ case 37:
1093
+ _context.prev = 37;
1107
1094
  _context.t0 = _context["catch"](0);
1108
1095
  // ignore if aborted
1109
1096
  if (!axios.isCancel(_context.t0)) {
@@ -1113,35 +1100,43 @@ var MultipartS3Uploader = /*#__PURE__*/function () {
1113
1100
  _classPrivateFieldGet(_this, _fireCallbacks$1).call(_this, UPLOAD_EVENT.onError);
1114
1101
  logger.error(_context.t0);
1115
1102
  }
1116
- case 39:
1117
- _context.prev = 39;
1103
+ case 40:
1104
+ _context.prev = 40;
1118
1105
  _classPrivateFieldSet(_this, _completeUploadPromise, null);
1119
- return _context.finish(39);
1120
- case 42:
1106
+ return _context.finish(40);
1107
+ case 43:
1121
1108
  case "end":
1122
1109
  return _context.stop();
1123
1110
  }
1124
- }, _callee, null, [[0, 36, 39, 42]]);
1111
+ }, _callee, null, [[0, 37, 40, 43]]);
1125
1112
  })));
1126
1113
  _defineProperty(this, "abortUpload", /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee2() {
1127
1114
  return _regeneratorRuntime.wrap(function _callee2$(_context2) {
1128
1115
  while (1) switch (_context2.prev = _context2.next) {
1129
1116
  case 0:
1130
1117
  _context2.prev = 0;
1118
+ if (!(_classPrivateFieldGet(_this, _store$1).getState().status === UPLOAD_STATUS.aborting)) {
1119
+ _context2.next = 4;
1120
+ break;
1121
+ }
1122
+ logger.info("abortUpload -> already aborting");
1123
+ return _context2.abrupt("return");
1124
+ case 4:
1131
1125
  _classPrivateFieldGet(_this, _store$1).setState({
1132
1126
  status: UPLOAD_STATUS.aborting
1133
1127
  });
1134
1128
  if (!_classPrivateFieldGet(_this, _isNotInitialized)) {
1135
- _context2.next = 4;
1129
+ _context2.next = 8;
1136
1130
  break;
1137
1131
  }
1132
+ logger.info("abortUpload -> not initialized");
1138
1133
  return _context2.abrupt("return");
1139
- case 4:
1140
- _context2.next = 6;
1134
+ case 8:
1135
+ _context2.next = 10;
1141
1136
  return _classPrivateFieldGet(_this, _completeUploadPromise);
1142
- case 6:
1137
+ case 10:
1143
1138
  _classPrivateFieldGet(_this, _abortController).abort();
1144
- _context2.next = 9;
1139
+ _context2.next = 13;
1145
1140
  return abortUploadApi.create({
1146
1141
  recordingId: _classPrivateFieldGet(_this, _recordingId),
1147
1142
  payload: {
@@ -1149,7 +1144,8 @@ var MultipartS3Uploader = /*#__PURE__*/function () {
1149
1144
  isMp4: isMp4Supported()
1150
1145
  }
1151
1146
  });
1152
- case 9:
1147
+ case 13:
1148
+ logger.info("abortUpload -> abort successful");
1153
1149
  _classPrivateFieldSet(_this, _unUploadedChunks, []);
1154
1150
  _classPrivateFieldSet(_this, _partNumber, 1);
1155
1151
  _classPrivateFieldSet(_this, _s3PartUploadPromises, []);
@@ -1157,17 +1153,17 @@ var MultipartS3Uploader = /*#__PURE__*/function () {
1157
1153
  status: ""
1158
1154
  });
1159
1155
  _classPrivateFieldSet(_this, _abortController, null);
1160
- _context2.next = 19;
1156
+ _context2.next = 24;
1161
1157
  break;
1162
- case 16:
1163
- _context2.prev = 16;
1158
+ case 21:
1159
+ _context2.prev = 21;
1164
1160
  _context2.t0 = _context2["catch"](0);
1165
1161
  logger.error(_context2.t0);
1166
- case 19:
1162
+ case 24:
1167
1163
  case "end":
1168
1164
  return _context2.stop();
1169
1165
  }
1170
- }, _callee2, null, [[0, 16]]);
1166
+ }, _callee2, null, [[0, 21]]);
1171
1167
  })));
1172
1168
  _defineProperty(this, "resetState", function () {
1173
1169
  _classPrivateFieldSet(_this, _recordingId, "");
@@ -1175,6 +1171,7 @@ var MultipartS3Uploader = /*#__PURE__*/function () {
1175
1171
  _classPrivateFieldSet(_this, _unUploadedChunks, []);
1176
1172
  _classPrivateFieldSet(_this, _partNumber, 1);
1177
1173
  _classPrivateFieldSet(_this, _s3PartUploadPromises, []);
1174
+ _classPrivateFieldSet(_this, _pendingS3ChunkUploads, []);
1178
1175
  _classPrivateFieldSet(_this, _callbacks$1, {});
1179
1176
  _classPrivateFieldSet(_this, _failedUpload, []);
1180
1177
  _classPrivateFieldSet(_this, _uploadProgress, {});
@@ -1214,15 +1211,15 @@ var MultipartS3Uploader = /*#__PURE__*/function () {
1214
1211
  case 0:
1215
1212
  logger.info("Part ready to be uploaded: ", _classPrivateFieldGet(_this, _partNumber));
1216
1213
  partNumber = _classPrivateFieldGet(_this, _partNumber);
1214
+ mimeType = getSupportedMimeType();
1217
1215
  _classPrivateFieldSet(_this, _partNumber, (_this$partNumber = _classPrivateFieldGet(_this, _partNumber), _this$partNumber++, _this$partNumber));
1218
1216
  _classPrivateFieldGet(_this, _uploadProgress)[partNumber] = {
1219
1217
  uploaded: 0,
1220
1218
  total: new Blob(chunks, {
1221
- type: MIME_TYPE.webmH264
1219
+ type: mimeType
1222
1220
  }).size
1223
1221
  };
1224
- _context3.prev = 4;
1225
- mimeType = getSupportedMimeType(MIME_TYPE.webmH264);
1222
+ _context3.prev = 5;
1226
1223
  _context3.next = 8;
1227
1224
  return partPresignedUrlApi.create({
1228
1225
  recordingId: _classPrivateFieldGet(_this, _recordingId),
@@ -1265,7 +1262,7 @@ var MultipartS3Uploader = /*#__PURE__*/function () {
1265
1262
  break;
1266
1263
  case 15:
1267
1264
  _context3.prev = 15;
1268
- _context3.t0 = _context3["catch"](4);
1265
+ _context3.t0 = _context3["catch"](5);
1269
1266
  // ignore if aborted
1270
1267
  if (!axios.isCancel(_context3.t0)) {
1271
1268
  logger.error("Failed to upload partNumber:", partNumber);
@@ -1282,7 +1279,7 @@ var MultipartS3Uploader = /*#__PURE__*/function () {
1282
1279
  case "end":
1283
1280
  return _context3.stop();
1284
1281
  }
1285
- }, _callee3, null, [[4, 15]]);
1282
+ }, _callee3, null, [[5, 15]]);
1286
1283
  }));
1287
1284
  function value(_x) {
1288
1285
  return _value.apply(this, arguments);
@@ -1294,7 +1291,7 @@ var MultipartS3Uploader = /*#__PURE__*/function () {
1294
1291
  writable: true,
1295
1292
  value: function value() {
1296
1293
  return new Blob(_classPrivateFieldGet(_this, _unUploadedChunks), {
1297
- type: getSupportedMimeType(MIME_TYPE.webmH264)
1294
+ type: getSupportedMimeType()
1298
1295
  });
1299
1296
  }
1300
1297
  });
@@ -1360,6 +1357,13 @@ function _slicedToArray(arr, i) {
1360
1357
  return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest();
1361
1358
  }
1362
1359
 
1360
+ // https://www.w3.org/TR/screen-capture/#displaycapturesurfacetype
1361
+ var DISPLAY_SURFACE = {
1362
+ monitor: "monitor",
1363
+ window: "window",
1364
+ browser: "browser"
1365
+ };
1366
+
1363
1367
  function ownKeys$1(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; }
1364
1368
  function _objectSpread$1(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys$1(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys$1(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
1365
1369
  var initialState = {
@@ -1499,7 +1503,7 @@ var ScreenRecorder = /*#__PURE__*/function () {
1499
1503
  });
1500
1504
  _defineProperty(this, "getWebmMediaBlob", function () {
1501
1505
  return new Blob(_classPrivateFieldGet(_this, _mediaChunks), {
1502
- type: getSupportedMimeType(MIME_TYPE$1.webmH264)
1506
+ type: getSupportedMimeType()
1503
1507
  });
1504
1508
  });
1505
1509
  _defineProperty(this, "addCallback", function (event, callback) {
@@ -1879,6 +1883,7 @@ var ScreenRecorder = /*#__PURE__*/function () {
1879
1883
  _classPrivateFieldGet(_this, _mediaRecorder).start(5000);
1880
1884
  _classPrivateFieldGet(_this, _startTimer).call(_this);
1881
1885
  } catch (error) {
1886
+ clearInterval(_classPrivateFieldGet(_this, _timerId));
1882
1887
  _classPrivateFieldGet(_this, _store).setState({
1883
1888
  status: SCREEN_RECORDER_STATUS.idle,
1884
1889
  error: SCREEN_RECORDER_ERROR[error.name]
@@ -1887,8 +1892,9 @@ var ScreenRecorder = /*#__PURE__*/function () {
1887
1892
  // To prevent triggering #onRecordingStop when the mediaRecorder is failed to start.
1888
1893
  _classPrivateFieldGet(_this, _mediaRecorder).onstop = noop;
1889
1894
  if (_classPrivateFieldGet(_this, _mediaStream)) {
1890
- _classPrivateFieldGet(_this, _mediaStream).getVideoTracks()[0].stop();
1891
- _classPrivateFieldGet(_this, _mediaStream).getAudioTracks()[0].stop();
1895
+ _classPrivateFieldGet(_this, _mediaStream).getTracks().forEach(function (track) {
1896
+ return track.stop();
1897
+ });
1892
1898
  _classPrivateFieldSet(_this, _mediaStream, null);
1893
1899
  }
1894
1900
  _classPrivateFieldSet(_this, _stream, null);