@bigbinary/neeto-media-recorder 2.7.35 → 2.7.37
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 +1 -0
- package/constants.js.map +1 -1
- package/core.js +136 -55
- package/core.js.map +1 -1
- package/index.js +293 -12
- package/index.js.map +1 -1
- package/package.json +1 -1
package/constants.js
CHANGED
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":["function _typeof(o) {\n \"@babel/helpers - typeof\";\n\n return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (o) {\n return typeof o;\n } : function (o) {\n return o && \"function\" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? \"symbol\" : typeof o;\n }, _typeof(o);\n}\nexport { _typeof as default };","import platform from \"platform\";\nimport { isNotNil } from \"ramda\";\n\n// https://docs.aws.amazon.com/AmazonS3/latest/API/ErrorResponses.html#ErrorCodeList\nexport const RETRYABLE_ERRORS = [500, 503];\n\nexport const ONE_SECOND_IN_MILLISECONDS = 1000;\nexport const HALF_A_SECOND_IN_MILLISECONDS = 500;\nexport const TWO_HUNDRED_MILLISECONDS = 200;\n\nexport const ONE_MINUTE_IN_MILLISECONDS = 60 * ONE_SECOND_IN_MILLISECONDS;\nexport const ONE_HOUR_IN_MILLISECONDS = 60 * ONE_MINUTE_IN_MILLISECONDS;\n\nexport const ONE_SECOND = 1;\n\nexport const COUNTDOWN_TIME = 3;\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 error: \"error\",\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 FailedToStart: \"failed_to_start\",\n CreateRecordingError: \"create_recording_error\",\n InsufficientData: \"insufficient_data\",\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 onReUploadFromDisk: \"onReUploadFromDisk\",\n onPause: \"onPause\",\n onResume: \"onResume\",\n onCountdownStart: \"onCountdownStart\",\n onCountdown: \"onCountDown\",\n onCountdownEnd: \"onCountdownEnd\",\n onShareSelected: \"onShareSelected\",\n};\n\nexport const TOTAL_RETRIES = 15;\nexport const ABORT_UPLOAD_RETRIES = 2;\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\n// Firefox refuses to start a MediaRecorder on a stream that has both audio and\n// video tracks unless the MIME string declares the audio codec too. Chromium\n// and Safari accept the video-only form and silently pick Opus/AAC. We keep\n// both variants and always prefer the codec-complete ones in\n// getSupportedMimeType so a single code path works across browsers.\nexport const MIME_TYPE = {\n mp4: \"video/mp4\",\n webmH264Opus: \"video/webm;codecs=h264,opus\",\n webmH264: \"video/webm;codecs=h264\",\n webmVp9Opus: \"video/webm;codecs=vp9,opus\",\n webmVp9: \"video/webm;codecs=vp9\",\n webmVp8Opus: \"video/webm;codecs=vp8,opus\",\n webmVp8: \"video/webm;codecs=vp8\",\n webm: \"video/webm\",\n};\n\nexport const START_RECORDING_SOUND =\n \"https://neeto-record-static-assets.s3.amazonaws.com/recording-start-sound-2.mp3\";\n\nexport const COUNTDOWN_TICK_SOUND =\n \"https://neeto-record-static-assets.s3.us-east-1.amazonaws.com/recording-tick-sound.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\nexport const MIC_NOT_WORKING_ALERT_TIME = 30;\nexport const MIC_NOT_WORKING_SILENCE_TIMEOUT =\n MIC_NOT_WORKING_ALERT_TIME * 1000;\n"],"names":["RETRYABLE_ERRORS","ONE_SECOND_IN_MILLISECONDS","HALF_A_SECOND_IN_MILLISECONDS","TWO_HUNDRED_MILLISECONDS","ONE_MINUTE_IN_MILLISECONDS","ONE_HOUR_IN_MILLISECONDS","ONE_SECOND","COUNTDOWN_TIME","UPLOAD_EVENT","onComplete","onError","onProgress","UPLOAD_STATUS","uploading","completed","aborting","insufficient_data","error","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","FailedToStart","CreateRecordingError","InsufficientData","SCREEN_RECORDER_EVENT","onStart","onStop","onDiscard","onDataAvailable","onDiscardDuringCountdown","onRestart","onReUpload","onReUploadFromDisk","onPause","onResume","onCountdownStart","onCountdown","onCountdownEnd","onShareSelected","TOTAL_RETRIES","ABORT_UPLOAD_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","webmH264Opus","webmH264","webmVp9Opus","webmVp9","webmVp8Opus","webmVp8","webm","START_RECORDING_SOUND","COUNTDOWN_TICK_SOUND","STOP_RECORDING_DUE_TO_LIMIT_REACHED_SOUND","RECORDING_LIMIT_REACHED_WARNING_SOUND","RECORDING_TIME_LIMIT_FREE_PLAN","RECORDING_TIME_LIMIT_PRO_PLAN","MIC_NOT_WORKING_ALERT_TIME","MIC_NOT_WORKING_SILENCE_TIMEOUT"],"mappings":"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","x_google_ignoreList":[0]}
|
|
1
|
+
{"version":3,"file":"constants.js","sources":["node_modules/@babel/runtime/helpers/esm/typeof.js","src/constants.js"],"sourcesContent":["function _typeof(o) {\n \"@babel/helpers - typeof\";\n\n return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (o) {\n return typeof o;\n } : function (o) {\n return o && \"function\" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? \"symbol\" : typeof o;\n }, _typeof(o);\n}\nexport { _typeof as default };","import platform from \"platform\";\nimport { isNotNil } from \"ramda\";\n\n// https://docs.aws.amazon.com/AmazonS3/latest/API/ErrorResponses.html#ErrorCodeList\nexport const RETRYABLE_ERRORS = [500, 503];\n\nexport const ONE_SECOND_IN_MILLISECONDS = 1000;\nexport const HALF_A_SECOND_IN_MILLISECONDS = 500;\nexport const TWO_HUNDRED_MILLISECONDS = 200;\n\nexport const ONE_MINUTE_IN_MILLISECONDS = 60 * ONE_SECOND_IN_MILLISECONDS;\nexport const ONE_HOUR_IN_MILLISECONDS = 60 * ONE_MINUTE_IN_MILLISECONDS;\n\nexport const ONE_SECOND = 1;\n\nexport const COUNTDOWN_TIME = 3;\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 error: \"error\",\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 FailedToStart: \"failed_to_start\",\n CreateRecordingError: \"create_recording_error\",\n InsufficientData: \"insufficient_data\",\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 onReUploadFromDisk: \"onReUploadFromDisk\",\n onPause: \"onPause\",\n onResume: \"onResume\",\n onCountdownStart: \"onCountdownStart\",\n onCountdown: \"onCountDown\",\n onCountdownEnd: \"onCountdownEnd\",\n onCountdownSkip: \"onCountdownSkip\",\n onShareSelected: \"onShareSelected\",\n};\n\nexport const TOTAL_RETRIES = 15;\nexport const ABORT_UPLOAD_RETRIES = 2;\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\n// Firefox refuses to start a MediaRecorder on a stream that has both audio and\n// video tracks unless the MIME string declares the audio codec too. Chromium\n// and Safari accept the video-only form and silently pick Opus/AAC. We keep\n// both variants and always prefer the codec-complete ones in\n// getSupportedMimeType so a single code path works across browsers.\nexport const MIME_TYPE = {\n mp4: \"video/mp4\",\n webmH264Opus: \"video/webm;codecs=h264,opus\",\n webmH264: \"video/webm;codecs=h264\",\n webmVp9Opus: \"video/webm;codecs=vp9,opus\",\n webmVp9: \"video/webm;codecs=vp9\",\n webmVp8Opus: \"video/webm;codecs=vp8,opus\",\n webmVp8: \"video/webm;codecs=vp8\",\n webm: \"video/webm\",\n};\n\nexport const START_RECORDING_SOUND =\n \"https://neeto-record-static-assets.s3.amazonaws.com/recording-start-sound-2.mp3\";\n\nexport const COUNTDOWN_TICK_SOUND =\n \"https://neeto-record-static-assets.s3.us-east-1.amazonaws.com/recording-tick-sound.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\nexport const MIC_NOT_WORKING_ALERT_TIME = 30;\nexport const MIC_NOT_WORKING_SILENCE_TIMEOUT =\n MIC_NOT_WORKING_ALERT_TIME * 1000;\n"],"names":["RETRYABLE_ERRORS","ONE_SECOND_IN_MILLISECONDS","HALF_A_SECOND_IN_MILLISECONDS","TWO_HUNDRED_MILLISECONDS","ONE_MINUTE_IN_MILLISECONDS","ONE_HOUR_IN_MILLISECONDS","ONE_SECOND","COUNTDOWN_TIME","UPLOAD_EVENT","onComplete","onError","onProgress","UPLOAD_STATUS","uploading","completed","aborting","insufficient_data","error","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","FailedToStart","CreateRecordingError","InsufficientData","SCREEN_RECORDER_EVENT","onStart","onStop","onDiscard","onDataAvailable","onDiscardDuringCountdown","onRestart","onReUpload","onReUploadFromDisk","onPause","onResume","onCountdownStart","onCountdown","onCountdownEnd","onCountdownSkip","onShareSelected","TOTAL_RETRIES","ABORT_UPLOAD_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","webmH264Opus","webmH264","webmVp9Opus","webmVp9","webmVp8Opus","webmVp8","webm","START_RECORDING_SOUND","COUNTDOWN_TICK_SOUND","STOP_RECORDING_DUE_TO_LIMIT_REACHED_SOUND","RECORDING_LIMIT_REACHED_WARNING_SOUND","RECORDING_TIME_LIMIT_FREE_PLAN","RECORDING_TIME_LIMIT_PRO_PLAN","MIC_NOT_WORKING_ALERT_TIME","MIC_NOT_WORKING_SILENCE_TIMEOUT"],"mappings":";;;AAAA,SAAS,OAAO,CAAC,CAAC,EAAE;AACpB,EAAE,yBAAyB,CAAC;AAC5B;AACA,EAAE,OAAO,OAAO,GAAG,UAAU,IAAI,OAAO,MAAM,IAAI,QAAQ,IAAI,OAAO,MAAM,CAAC,QAAQ,GAAG,UAAU,CAAC,EAAE;AACpG,IAAI,OAAO,OAAO,CAAC,CAAC;AACpB,GAAG,GAAG,UAAU,CAAC,EAAE;AACnB,IAAI,OAAO,CAAC,IAAI,UAAU,IAAI,OAAO,MAAM,IAAI,CAAC,CAAC,WAAW,KAAK,MAAM,IAAI,CAAC,KAAK,MAAM,CAAC,SAAS,GAAG,QAAQ,GAAG,OAAO,CAAC,CAAC;AACxH,GAAG,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC;AAChB;;ACLA;IACaA,gBAAgB,GAAG,CAAC,GAAG,EAAE,GAAG,EAAC;AAEnC,IAAMC,0BAA0B,GAAG,KAAI;AACvC,IAAMC,6BAA6B,GAAG,IAAG;AACzC,IAAMC,wBAAwB,GAAG,IAAG;AAE9BC,IAAAA,0BAA0B,GAAG,EAAE,GAAGH,2BAA0B;AAC5DI,IAAAA,wBAAwB,GAAG,EAAE,GAAGD,2BAA0B;AAEhE,IAAME,UAAU,GAAG,EAAC;AAEpB,IAAMC,cAAc,GAAG,EAAC;AAExB,IAAMC,YAAY,GAAG;AAC1BC,EAAAA,UAAU,EAAE,YAAY;AACxBC,EAAAA,OAAO,EAAE,SAAS;AAClBC,EAAAA,UAAU,EAAE,YAAA;AACd,EAAC;AAEM,IAAMC,aAAa,GAAG;AAC3BC,EAAAA,SAAS,EAAE,WAAW;AACtBC,EAAAA,SAAS,EAAE,WAAW;AACtBC,EAAAA,QAAQ,EAAE,UAAU;AACpBC,EAAAA,iBAAiB,EAAE,mBAAmB;AACtCC,EAAAA,KAAK,EAAE,OAAA;AACT,EAAC;AAEM,IAAMC,sBAAsB,GAAG;AACpCC,EAAAA,aAAa,EAAE,eAAe;AAC9BC,EAAAA,iBAAiB,EAAE,mBAAmB;AACtCC,EAAAA,wBAAwB,EAAE,0BAA0B;AACpDC,EAAAA,YAAY,EAAE,cAAc;AAC5BC,EAAAA,yBAAyB,EAAE,2BAA2B;AACtDC,EAAAA,mBAAmB,EAAE,qBAAqB;AAC1CC,EAAAA,cAAc,EAAE,gBAAgB;AAChCC,EAAAA,IAAI,EAAE,MAAM;AACZC,EAAAA,eAAe,EAAE,iBAAiB;AAClCC,EAAAA,cAAc,EAAE,gBAAgB;AAChCC,EAAAA,UAAU,EAAE,YAAY;AACxBC,EAAAA,SAAS,EAAE,WAAW;AACtBC,EAAAA,QAAQ,EAAE,UAAU;AACpBC,EAAAA,OAAO,EAAE,SAAS;AAClBC,EAAAA,MAAM,EAAE,QAAA;AACV,EAAC;AAEM,IAAMC,qBAAqB,GAAG;AACnCC,EAAAA,mBAAmB,EAAE,uBAAuB;AAC5CC,EAAAA,UAAU,EAAE,eAAe;AAC3BC,EAAAA,eAAe,EAAE,mBAAmB;AACpCC,EAAAA,aAAa,EAAE,0BAA0B;AACzCC,EAAAA,gBAAgB,EAAE,cAAc;AAChCC,EAAAA,oBAAoB,EAAE,2BAA2B;AACjDC,EAAAA,SAAS,EAAE,qBAAqB;AAChCC,EAAAA,IAAI,EAAE,EAAE;AACRC,EAAAA,UAAU,EAAE,gBAAgB;AAC5BC,EAAAA,kBAAkB,EAAE,qBAAqB;AACzCC,EAAAA,aAAa,EAAE,iBAAiB;AAChCC,EAAAA,oBAAoB,EAAE,wBAAwB;AAC9CC,EAAAA,gBAAgB,EAAE,mBAAA;AACpB,EAAC;AAEM,IAAMC,qBAAqB,GAAG;AACnCC,EAAAA,OAAO,EAAE,SAAS;AAClBC,EAAAA,MAAM,EAAE,QAAQ;AAChBC,EAAAA,SAAS,EAAE,WAAW;AACtBC,EAAAA,eAAe,EAAE,iBAAiB;AAClCC,EAAAA,wBAAwB,EAAE,0BAA0B;AACpDC,EAAAA,SAAS,EAAE,WAAW;AACtBC,EAAAA,UAAU,EAAE,YAAY;AACxBC,EAAAA,kBAAkB,EAAE,oBAAoB;AACxCC,EAAAA,OAAO,EAAE,SAAS;AAClBC,EAAAA,QAAQ,EAAE,UAAU;AACpBC,EAAAA,gBAAgB,EAAE,kBAAkB;AACpCC,EAAAA,WAAW,EAAE,aAAa;AAC1BC,EAAAA,cAAc,EAAE,gBAAgB;AAChCC,EAAAA,eAAe,EAAE,iBAAiB;AAClCC,EAAAA,eAAe,EAAE,iBAAA;AACnB,EAAC;AAEM,IAAMC,aAAa,GAAG,GAAE;AACxB,IAAMC,oBAAoB,GAAG,EAAC;AAC9B,IAAMC,mBAAmB,GAAG,KAAI;AAChC,IAAMC,eAAe,GAAG,MAAK;AAE7B,IAAMC,oBAAoB,GAAG;AAClCC,EAAAA,OAAO,EAAEL,aAAa;AACtBM,EAAAA,UAAU,EAAEJ,mBAAmB;AAC/BK,EAAAA,iBAAiB,EAAE,EAAA;AACrB,EAAC;;AAED;AACA;AACO,IAAMC,aAAa,GAAG,gBAAe;AACrC,IAAMC,aAAa,GAAG,eAAc;AAEpC,IAAMC,oBAAoB,GAAG,CAAOC,OAAAA,MAAM,iCAAAC,OAAA,CAAND,MAAM,CAAA,MAAK,SAAQ;AAEvD,IAAME,YAAY,GAAGH,oBAAoB,IAAII,QAAQ,CAACH,MAAM,CAACI,SAAS,EAAC;IAEjEC,SAAS,GAAGC,QAAQ,CAACC,IAAI,KAAK,SAAQ;AAEtCC,IAAAA,mBAAmB,GAAGH,SAAS,IAAIH,aAAY;AAErD,IAAMO,oBAAoB,GAC/B,mDAAkD;;AAEpD;AACA;AACA;AACA;AACA;AACO,IAAMC,SAAS,GAAG;AACvBC,EAAAA,GAAG,EAAE,WAAW;AAChBC,EAAAA,YAAY,EAAE,6BAA6B;AAC3CC,EAAAA,QAAQ,EAAE,wBAAwB;AAClCC,EAAAA,WAAW,EAAE,4BAA4B;AACzCC,EAAAA,OAAO,EAAE,uBAAuB;AAChCC,EAAAA,WAAW,EAAE,4BAA4B;AACzCC,EAAAA,OAAO,EAAE,uBAAuB;AAChCC,EAAAA,IAAI,EAAE,YAAA;AACR,EAAC;AAEM,IAAMC,qBAAqB,GAChC,kFAAiF;AAE5E,IAAMC,oBAAoB,GAC/B,yFAAwF;AAEnF,IAAMC,yCAAyC,GACpD,8EAA6E;AAExE,IAAMC,qCAAqC,GAChD,kFAAiF;IAEtEC,8BAA8B,GAAG,EAAE,GAAG9F,2BAA2B;IACjE+F,6BAA6B,GAAG,CAAC,GAAG9F,yBAAyB;;AAEnE,IAAM+F,0BAA0B,GAAG,GAAE;AAC/BC,IAAAA,+BAA+B,GAC1CD,0BAA0B,GAAG;;;;","x_google_ignoreList":[0]}
|
package/core.js
CHANGED
|
@@ -600,6 +600,7 @@ var SCREEN_RECORDER_EVENT = {
|
|
|
600
600
|
onCountdownStart: "onCountdownStart",
|
|
601
601
|
onCountdown: "onCountDown",
|
|
602
602
|
onCountdownEnd: "onCountdownEnd",
|
|
603
|
+
onCountdownSkip: "onCountdownSkip",
|
|
603
604
|
onShareSelected: "onShareSelected"
|
|
604
605
|
};
|
|
605
606
|
var TOTAL_RETRIES = 15;
|
|
@@ -745,54 +746,74 @@ var buildRetryableApi = function buildRetryableApi(apiConnector) {
|
|
|
745
746
|
retryDelay = _ref$retryDelay === void 0 ? INITIAL_RETRY_DELAY : _ref$retryDelay;
|
|
746
747
|
return /*#__PURE__*/function () {
|
|
747
748
|
var _ref2 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee(apiConnectorArgs) {
|
|
748
|
-
var _config$signal;
|
|
749
|
+
var _config$signal, _config$signal2;
|
|
749
750
|
var _apiConnectorArgs$con, config, remainingAttempts, shouldCancelRetries, _error$config, _error$response, _error$response2;
|
|
750
751
|
return _regeneratorRuntime.wrap(function _callee$(_context) {
|
|
751
752
|
while (1) switch (_context.prev = _context.next) {
|
|
752
753
|
case 0:
|
|
753
|
-
_apiConnectorArgs$con = apiConnectorArgs.config, config = _apiConnectorArgs$con === void 0 ? null : _apiConnectorArgs$con;
|
|
754
|
+
_apiConnectorArgs$con = apiConnectorArgs.config, config = _apiConnectorArgs$con === void 0 ? null : _apiConnectorArgs$con; // If the signal is already aborted before we start, addEventListener("abort")
|
|
755
|
+
// will never fire — so we'd otherwise run the full retry/backoff schedule
|
|
756
|
+
// against an aborted request.
|
|
757
|
+
if (!(config !== null && config !== void 0 && (_config$signal = config.signal) !== null && _config$signal !== void 0 && _config$signal.aborted)) {
|
|
758
|
+
_context.next = 3;
|
|
759
|
+
break;
|
|
760
|
+
}
|
|
761
|
+
throw new RetryError("Request cancelled or request retries exhausted");
|
|
762
|
+
case 3:
|
|
754
763
|
remainingAttempts = retries + 1;
|
|
755
764
|
shouldCancelRetries = false;
|
|
756
|
-
config === null || config === void 0 ? void 0 : (_config$
|
|
765
|
+
config === null || config === void 0 ? void 0 : (_config$signal2 = config.signal) === null || _config$signal2 === void 0 ? void 0 : _config$signal2.addEventListener("abort", function () {
|
|
757
766
|
shouldCancelRetries = true;
|
|
758
767
|
});
|
|
759
|
-
case
|
|
768
|
+
case 6:
|
|
760
769
|
if (!(remainingAttempts-- && !shouldCancelRetries)) {
|
|
761
|
-
_context.next =
|
|
770
|
+
_context.next = 30;
|
|
762
771
|
break;
|
|
763
772
|
}
|
|
764
|
-
_context.prev =
|
|
765
|
-
_context.next =
|
|
773
|
+
_context.prev = 7;
|
|
774
|
+
_context.next = 10;
|
|
766
775
|
return apiConnector(apiConnectorArgs);
|
|
767
|
-
case
|
|
776
|
+
case 10:
|
|
768
777
|
return _context.abrupt("return", _context.sent);
|
|
769
|
-
case
|
|
770
|
-
_context.prev =
|
|
771
|
-
_context.t0 = _context["catch"](
|
|
778
|
+
case 13:
|
|
779
|
+
_context.prev = 13;
|
|
780
|
+
_context.t0 = _context["catch"](7);
|
|
781
|
+
if (!axios.isCancel(_context.t0)) {
|
|
782
|
+
_context.next = 17;
|
|
783
|
+
break;
|
|
784
|
+
}
|
|
785
|
+
throw _context.t0;
|
|
786
|
+
case 17:
|
|
772
787
|
logger.error("buildRetryableApi -> Failed to connect, remainingAttempts:", _context.t0 === null || _context.t0 === void 0 ? void 0 : (_error$config = _context.t0.config) === null || _error$config === void 0 ? void 0 : _error$config.url, (_error$response = _context.t0.response) === null || _error$response === void 0 ? void 0 : _error$response.status, remainingAttempts);
|
|
773
788
|
if (!(((_error$response2 = _context.t0.response) === null || _error$response2 === void 0 ? void 0 : _error$response2.status) !== 401 && remainingAttempts > 0)) {
|
|
774
|
-
_context.next =
|
|
789
|
+
_context.next = 27;
|
|
775
790
|
break;
|
|
776
791
|
}
|
|
777
792
|
logger.info("buildRetryableApi -> Failed to connect -> retry in:", retryDelay);
|
|
778
|
-
_context.next =
|
|
793
|
+
_context.next = 22;
|
|
779
794
|
return sleep(retryDelay);
|
|
780
|
-
case
|
|
795
|
+
case 22:
|
|
781
796
|
retryDelay = min(retryDelay * 2, MAX_RETRY_DELAY);
|
|
782
|
-
|
|
797
|
+
if (!shouldCancelRetries) {
|
|
798
|
+
_context.next = 25;
|
|
799
|
+
break;
|
|
800
|
+
}
|
|
801
|
+
throw _context.t0;
|
|
802
|
+
case 25:
|
|
803
|
+
_context.next = 28;
|
|
783
804
|
break;
|
|
784
|
-
case
|
|
805
|
+
case 27:
|
|
785
806
|
throw _context.t0;
|
|
786
|
-
case
|
|
787
|
-
_context.next =
|
|
807
|
+
case 28:
|
|
808
|
+
_context.next = 6;
|
|
788
809
|
break;
|
|
789
|
-
case
|
|
810
|
+
case 30:
|
|
790
811
|
throw new RetryError("Request cancelled or request retries exhausted");
|
|
791
|
-
case
|
|
812
|
+
case 31:
|
|
792
813
|
case "end":
|
|
793
814
|
return _context.stop();
|
|
794
815
|
}
|
|
795
|
-
}, _callee, null, [[
|
|
816
|
+
}, _callee, null, [[7, 13]]);
|
|
796
817
|
}));
|
|
797
818
|
return function (_x) {
|
|
798
819
|
return _ref2.apply(this, arguments);
|
|
@@ -1007,10 +1028,15 @@ var _serializeUploadError = /*#__PURE__*/new WeakMap();
|
|
|
1007
1028
|
var _uploadChunkToS = /*#__PURE__*/new WeakMap();
|
|
1008
1029
|
var _getCurrentUnUploadedBlob = /*#__PURE__*/new WeakMap();
|
|
1009
1030
|
var _isRecordingNotSet = /*#__PURE__*/new WeakMap();
|
|
1031
|
+
var _isTerminalStatus = /*#__PURE__*/new WeakMap();
|
|
1010
1032
|
var MultipartS3Uploader = /*#__PURE__*/function () {
|
|
1011
1033
|
function MultipartS3Uploader() {
|
|
1012
1034
|
var _this = this;
|
|
1013
1035
|
_classCallCheck(this, MultipartS3Uploader);
|
|
1036
|
+
_classPrivateFieldInitSpec$1(this, _isTerminalStatus, {
|
|
1037
|
+
get: _get_isTerminalStatus,
|
|
1038
|
+
set: void 0
|
|
1039
|
+
});
|
|
1014
1040
|
_classPrivateFieldInitSpec$1(this, _isRecordingNotSet, {
|
|
1015
1041
|
get: _get_isRecordingNotSet,
|
|
1016
1042
|
set: void 0
|
|
@@ -1097,6 +1123,19 @@ var MultipartS3Uploader = /*#__PURE__*/function () {
|
|
|
1097
1123
|
_classPrivateFieldSet(_this, _abortController, new AbortController());
|
|
1098
1124
|
});
|
|
1099
1125
|
_defineProperty(this, "push", function (data) {
|
|
1126
|
+
// Once an uploader has been aborted, any further chunks belong to a
|
|
1127
|
+
// recording that no longer exists server-side. Drop them so we don't
|
|
1128
|
+
// spawn new part uploads against an aborted multipart upload (which
|
|
1129
|
+
// would otherwise loop on retries until the network gives up).
|
|
1130
|
+
if (_classPrivateFieldGet(_this, _isTerminalStatus)) {
|
|
1131
|
+
_classPrivateFieldGet(_this, _logger$1).warn("push -> uploader is no longer active, dropping chunk", {
|
|
1132
|
+
chunkBytes: data === null || data === void 0 ? void 0 : data.size,
|
|
1133
|
+
status: _classPrivateFieldGet(_this, _status),
|
|
1134
|
+
recordingId: _classPrivateFieldGet(_this, _recordingId)
|
|
1135
|
+
});
|
|
1136
|
+
_classPrivateFieldSet(_this, _unUploadedChunks, []);
|
|
1137
|
+
return;
|
|
1138
|
+
}
|
|
1100
1139
|
if (data.size > 0) {
|
|
1101
1140
|
_classPrivateFieldGet(_this, _unUploadedChunks).push(data);
|
|
1102
1141
|
}
|
|
@@ -1280,6 +1319,8 @@ var MultipartS3Uploader = /*#__PURE__*/function () {
|
|
|
1280
1319
|
var forceAbort,
|
|
1281
1320
|
sessionLogs,
|
|
1282
1321
|
abortStartedAt,
|
|
1322
|
+
phase,
|
|
1323
|
+
_classPrivateFieldGet3,
|
|
1283
1324
|
recordingId,
|
|
1284
1325
|
uploadId,
|
|
1285
1326
|
_args2 = arguments;
|
|
@@ -1289,24 +1330,25 @@ var MultipartS3Uploader = /*#__PURE__*/function () {
|
|
|
1289
1330
|
forceAbort = _args2.length > 0 && _args2[0] !== undefined ? _args2[0] : false;
|
|
1290
1331
|
sessionLogs = _args2.length > 1 ? _args2[1] : undefined;
|
|
1291
1332
|
abortStartedAt = Date.now();
|
|
1292
|
-
|
|
1333
|
+
phase = "init";
|
|
1334
|
+
_context2.prev = 4;
|
|
1293
1335
|
if (!(_this.status === UPLOAD_STATUS.aborting && !forceAbort)) {
|
|
1294
|
-
_context2.next =
|
|
1336
|
+
_context2.next = 8;
|
|
1295
1337
|
break;
|
|
1296
1338
|
}
|
|
1297
1339
|
_classPrivateFieldGet(_this, _logger$1).info("abortUpload -> already aborting", {
|
|
1298
1340
|
forceAbort: forceAbort
|
|
1299
1341
|
});
|
|
1300
1342
|
return _context2.abrupt("return");
|
|
1301
|
-
case
|
|
1343
|
+
case 8:
|
|
1302
1344
|
_classPrivateFieldSet(_this, _status2, UPLOAD_STATUS.aborting);
|
|
1303
1345
|
if (!_classPrivateFieldGet(_this, _isRecordingNotSet)) {
|
|
1304
|
-
_context2.next =
|
|
1346
|
+
_context2.next = 12;
|
|
1305
1347
|
break;
|
|
1306
1348
|
}
|
|
1307
1349
|
_classPrivateFieldGet(_this, _logger$1).info("abortUpload -> not initialized");
|
|
1308
1350
|
return _context2.abrupt("return");
|
|
1309
|
-
case
|
|
1351
|
+
case 12:
|
|
1310
1352
|
recordingId = _classPrivateFieldGet(_this, _recordingId);
|
|
1311
1353
|
uploadId = _classPrivateFieldGet(_this, _uploadId);
|
|
1312
1354
|
_classPrivateFieldGet(_this, _logger$1).info("abortUpload -> begin", {
|
|
@@ -1314,18 +1356,25 @@ var MultipartS3Uploader = /*#__PURE__*/function () {
|
|
|
1314
1356
|
uploadId: uploadId,
|
|
1315
1357
|
forceAbort: forceAbort,
|
|
1316
1358
|
partsStarted: _classPrivateFieldGet(_this, _partNumber) - 1,
|
|
1317
|
-
pendingS3ChunkUploads: _classPrivateFieldGet(_this, _pendingS3ChunkUploads).length
|
|
1359
|
+
pendingS3ChunkUploads: _classPrivateFieldGet(_this, _pendingS3ChunkUploads).length,
|
|
1360
|
+
hasAbortController: Boolean(_classPrivateFieldGet(_this, _abortController))
|
|
1318
1361
|
});
|
|
1319
1362
|
|
|
1320
1363
|
// Don't let a rejected completeUpload stop us from issuing the abort API
|
|
1321
1364
|
// call below — we still need to release the upload server-side.
|
|
1365
|
+
phase = "awaitCompleteUploadPromise";
|
|
1322
1366
|
// eslint-disable-next-line promise/prefer-await-to-then
|
|
1323
|
-
_context2.next =
|
|
1367
|
+
_context2.next = 18;
|
|
1324
1368
|
return Promise.resolve(_classPrivateFieldGet(_this, _completeUploadPromise))["catch"](function () {});
|
|
1325
|
-
case
|
|
1326
|
-
|
|
1327
|
-
|
|
1328
|
-
|
|
1369
|
+
case 18:
|
|
1370
|
+
// Guard against a missing AbortController. If abortUpload is somehow
|
|
1371
|
+
// invoked twice, the second call would hit a null #abortController and
|
|
1372
|
+
// throw a TypeError into the outer catch — masking the real failure.
|
|
1373
|
+
phase = "abortInflight";
|
|
1374
|
+
(_classPrivateFieldGet3 = _classPrivateFieldGet(_this, _abortController)) === null || _classPrivateFieldGet3 === void 0 ? void 0 : _classPrivateFieldGet3.abort();
|
|
1375
|
+
phase = "abortUploadApi";
|
|
1376
|
+
_context2.prev = 21;
|
|
1377
|
+
_context2.next = 24;
|
|
1329
1378
|
return abortUploadApi.create({
|
|
1330
1379
|
recordingId: recordingId,
|
|
1331
1380
|
payload: {
|
|
@@ -1334,41 +1383,45 @@ var MultipartS3Uploader = /*#__PURE__*/function () {
|
|
|
1334
1383
|
logs: sessionLogs
|
|
1335
1384
|
}
|
|
1336
1385
|
});
|
|
1337
|
-
case
|
|
1386
|
+
case 24:
|
|
1338
1387
|
_classPrivateFieldGet(_this, _logger$1).info("abortUpload -> success", {
|
|
1339
1388
|
durationMs: Date.now() - abortStartedAt
|
|
1340
1389
|
});
|
|
1341
|
-
_context2.next =
|
|
1390
|
+
_context2.next = 30;
|
|
1342
1391
|
break;
|
|
1343
|
-
case
|
|
1344
|
-
_context2.prev =
|
|
1345
|
-
_context2.t0 = _context2["catch"](
|
|
1392
|
+
case 27:
|
|
1393
|
+
_context2.prev = 27;
|
|
1394
|
+
_context2.t0 = _context2["catch"](21);
|
|
1346
1395
|
// After retries are exhausted, proceed with local cleanup so the
|
|
1347
1396
|
// caller can navigate away / close tab. The server-side upload
|
|
1348
1397
|
// will be cleaned up by S3 lifecycle rules.
|
|
1349
1398
|
_classPrivateFieldGet(_this, _logger$1).error("abortUpload -> mark as discarded failed", _objectSpread$2(_objectSpread$2({}, _classPrivateFieldGet(_this, _serializeUploadError).call(_this, _context2.t0)), {}, {
|
|
1350
1399
|
durationMs: Date.now() - abortStartedAt
|
|
1351
1400
|
}));
|
|
1352
|
-
case
|
|
1401
|
+
case 30:
|
|
1402
|
+
phase = "fireOnAbort";
|
|
1353
1403
|
_classPrivateFieldGet(_this, _fireCallbacks$1).call(_this, UPLOAD_EVENT.onAbort);
|
|
1404
|
+
phase = "cleanup";
|
|
1354
1405
|
_classPrivateFieldSet(_this, _unUploadedChunks, []);
|
|
1355
1406
|
_classPrivateFieldSet(_this, _partNumber, 1);
|
|
1356
1407
|
_classPrivateFieldSet(_this, _s3PartUploadPromises, []);
|
|
1357
1408
|
_classPrivateFieldSet(_this, _status2, "");
|
|
1358
1409
|
_classPrivateFieldSet(_this, _abortController, null);
|
|
1359
|
-
_context2.next =
|
|
1410
|
+
_context2.next = 43;
|
|
1360
1411
|
break;
|
|
1361
|
-
case
|
|
1362
|
-
_context2.prev =
|
|
1363
|
-
_context2.t1 = _context2["catch"](
|
|
1364
|
-
_classPrivateFieldGet(_this, _logger$1).error("abortUpload -> failed", _objectSpread$2(_objectSpread$2({
|
|
1412
|
+
case 40:
|
|
1413
|
+
_context2.prev = 40;
|
|
1414
|
+
_context2.t1 = _context2["catch"](4);
|
|
1415
|
+
_classPrivateFieldGet(_this, _logger$1).error("abortUpload -> failed", _objectSpread$2(_objectSpread$2({
|
|
1416
|
+
phase: phase
|
|
1417
|
+
}, _classPrivateFieldGet(_this, _serializeUploadError).call(_this, _context2.t1)), {}, {
|
|
1365
1418
|
durationMs: Date.now() - abortStartedAt
|
|
1366
1419
|
}));
|
|
1367
|
-
case
|
|
1420
|
+
case 43:
|
|
1368
1421
|
case "end":
|
|
1369
1422
|
return _context2.stop();
|
|
1370
1423
|
}
|
|
1371
|
-
}, _callee2, null, [[
|
|
1424
|
+
}, _callee2, null, [[4, 40], [21, 27]]);
|
|
1372
1425
|
})));
|
|
1373
1426
|
_defineProperty(this, "resetState", function () {
|
|
1374
1427
|
_classPrivateFieldSet(_this, _recordingId, "");
|
|
@@ -1384,22 +1437,22 @@ var MultipartS3Uploader = /*#__PURE__*/function () {
|
|
|
1384
1437
|
_classPrivateFieldSet(_this, _status2, "");
|
|
1385
1438
|
});
|
|
1386
1439
|
_defineProperty(this, "addCallback", function (event, callback) {
|
|
1387
|
-
var
|
|
1388
|
-
var existingCallbacks = (
|
|
1440
|
+
var _classPrivateFieldGet4;
|
|
1441
|
+
var existingCallbacks = (_classPrivateFieldGet4 = _classPrivateFieldGet(_this, _callbacks$1)[event]) !== null && _classPrivateFieldGet4 !== void 0 ? _classPrivateFieldGet4 : [];
|
|
1389
1442
|
_classPrivateFieldSet(_this, _callbacks$1, _objectSpread$2(_objectSpread$2({}, _classPrivateFieldGet(_this, _callbacks$1)), {}, _defineProperty({}, event, [].concat(_toConsumableArray(existingCallbacks), [callback]))));
|
|
1390
1443
|
});
|
|
1391
1444
|
_defineProperty(this, "removeCallback", function (event, callback) {
|
|
1392
|
-
var
|
|
1393
|
-
var registeredCallbacks = (
|
|
1445
|
+
var _classPrivateFieldGet5;
|
|
1446
|
+
var registeredCallbacks = (_classPrivateFieldGet5 = _classPrivateFieldGet(_this, _callbacks$1)[event]) !== null && _classPrivateFieldGet5 !== void 0 ? _classPrivateFieldGet5 : [];
|
|
1394
1447
|
var updatedCallbacks = registeredCallbacks.filter(isNot(callback));
|
|
1395
1448
|
_classPrivateFieldSet(_this, _callbacks$1, _objectSpread$2(_objectSpread$2({}, _classPrivateFieldGet(_this, _callbacks$1)), {}, _defineProperty({}, event, updatedCallbacks)));
|
|
1396
1449
|
});
|
|
1397
1450
|
_classPrivateFieldInitSpec$1(this, _fireCallbacks$1, {
|
|
1398
1451
|
writable: true,
|
|
1399
1452
|
value: function value(event) {
|
|
1400
|
-
var
|
|
1453
|
+
var _classPrivateFieldGet6;
|
|
1401
1454
|
var args = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];
|
|
1402
|
-
(
|
|
1455
|
+
(_classPrivateFieldGet6 = _classPrivateFieldGet(_this, _callbacks$1)[event]) === null || _classPrivateFieldGet6 === void 0 ? void 0 : _classPrivateFieldGet6.forEach(function (callback) {
|
|
1403
1456
|
callback.apply(void 0, _toConsumableArray(args));
|
|
1404
1457
|
});
|
|
1405
1458
|
}
|
|
@@ -1449,7 +1502,7 @@ var MultipartS3Uploader = /*#__PURE__*/function () {
|
|
|
1449
1502
|
}
|
|
1450
1503
|
});
|
|
1451
1504
|
_defineProperty(this, "generatePreSignedUrl", function (partNumber) {
|
|
1452
|
-
var
|
|
1505
|
+
var _classPrivateFieldGet7;
|
|
1453
1506
|
return partPresignedUrlApi.create({
|
|
1454
1507
|
recordingId: _classPrivateFieldGet(_this, _recordingId),
|
|
1455
1508
|
payload: {
|
|
@@ -1458,7 +1511,7 @@ var MultipartS3Uploader = /*#__PURE__*/function () {
|
|
|
1458
1511
|
isMp4: _classPrivateFieldGet(_this, _mimeType$1).includes(MIME_TYPE.mp4)
|
|
1459
1512
|
},
|
|
1460
1513
|
config: {
|
|
1461
|
-
signal: (
|
|
1514
|
+
signal: (_classPrivateFieldGet7 = _classPrivateFieldGet(_this, _abortController)) === null || _classPrivateFieldGet7 === void 0 ? void 0 : _classPrivateFieldGet7.signal
|
|
1462
1515
|
}
|
|
1463
1516
|
});
|
|
1464
1517
|
});
|
|
@@ -1466,7 +1519,7 @@ var MultipartS3Uploader = /*#__PURE__*/function () {
|
|
|
1466
1519
|
writable: true,
|
|
1467
1520
|
value: function () {
|
|
1468
1521
|
var _value = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee3(chunks) {
|
|
1469
|
-
var _this$partNumber,
|
|
1522
|
+
var _this$partNumber, _classPrivateFieldGet8;
|
|
1470
1523
|
var partNumber, partBlob, partBytes, presignStartedAt, presignedUrl, _yield$_this$generate, uploadStartedAt, s3PartUploadPromise;
|
|
1471
1524
|
return _regeneratorRuntime.wrap(function _callee3$(_context3) {
|
|
1472
1525
|
while (1) switch (_context3.prev = _context3.next) {
|
|
@@ -1520,7 +1573,7 @@ var MultipartS3Uploader = /*#__PURE__*/function () {
|
|
|
1520
1573
|
"Content-Type": _classPrivateFieldGet(_this, _mimeType$1)
|
|
1521
1574
|
},
|
|
1522
1575
|
includeMetadataInResponse: true,
|
|
1523
|
-
signal: (
|
|
1576
|
+
signal: (_classPrivateFieldGet8 = _classPrivateFieldGet(_this, _abortController)) === null || _classPrivateFieldGet8 === void 0 ? void 0 : _classPrivateFieldGet8.signal,
|
|
1524
1577
|
onUploadProgress: function onUploadProgress(e) {
|
|
1525
1578
|
_classPrivateFieldGet(_this, _uploadProgress)[partNumber] = {
|
|
1526
1579
|
uploaded: e.loaded,
|
|
@@ -1621,6 +1674,9 @@ function _set_status(status) {
|
|
|
1621
1674
|
function _get_isRecordingNotSet() {
|
|
1622
1675
|
return isEmpty(_classPrivateFieldGet(this, _uploadId) + _classPrivateFieldGet(this, _recordingId));
|
|
1623
1676
|
}
|
|
1677
|
+
function _get_isTerminalStatus() {
|
|
1678
|
+
return _classPrivateFieldGet(this, _status) === UPLOAD_STATUS.aborting || _classPrivateFieldGet(this, _status) === UPLOAD_STATUS.completed || _classPrivateFieldGet(this, _status) === UPLOAD_STATUS.error;
|
|
1679
|
+
}
|
|
1624
1680
|
var multipartS3Uploader = new MultipartS3Uploader();
|
|
1625
1681
|
var getMultipartS3Uploader = function getMultipartS3Uploader() {
|
|
1626
1682
|
var _ref3 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
|
|
@@ -2062,6 +2118,26 @@ var ScreenRecorder = /*#__PURE__*/function () {
|
|
|
2062
2118
|
_classPrivateFieldGet(_this, _stopAllStreams).call(_this);
|
|
2063
2119
|
_classPrivateFieldGet(_this, _stopTimer).call(_this);
|
|
2064
2120
|
});
|
|
2121
|
+
_defineProperty(this, "skipCountdown", function () {
|
|
2122
|
+
if (!_classPrivateFieldGet(_this, _countdownTimerId)) {
|
|
2123
|
+
_classPrivateFieldGet(_this, _logger).warn("skipCountdown -> ignored, no countdown running", _classPrivateFieldGet(_this, _summarizeRecorderState).call(_this));
|
|
2124
|
+
return;
|
|
2125
|
+
}
|
|
2126
|
+
_classPrivateFieldGet(_this, _logger).info("skipCountdown", _classPrivateFieldGet(_this, _summarizeRecorderState).call(_this));
|
|
2127
|
+
clearInterval(_classPrivateFieldGet(_this, _countdownTimerId));
|
|
2128
|
+
_classPrivateFieldSet(_this, _countdownTimerId, null);
|
|
2129
|
+
_classPrivateFieldGet(_this, _fireCallbacks).call(_this, SCREEN_RECORDER_EVENT.onCountdown, [0]);
|
|
2130
|
+
_classPrivateFieldGet(_this, _fireCallbacks).call(_this, SCREEN_RECORDER_EVENT.onCountdownSkip);
|
|
2131
|
+
// onCountdownEnd is the canonical "countdown phase finished" hook —
|
|
2132
|
+
// listeners that just want to know the count-in is over shouldn't have
|
|
2133
|
+
// to subscribe to onCountdownSkip too.
|
|
2134
|
+
_classPrivateFieldGet(_this, _fireCallbacks).call(_this, SCREEN_RECORDER_EVENT.onCountdownEnd);
|
|
2135
|
+
_classPrivateFieldGet(_this, _store).setState({
|
|
2136
|
+
countdownTimeLeft: 0,
|
|
2137
|
+
status: SCREEN_RECORDER_STATUS.recording
|
|
2138
|
+
});
|
|
2139
|
+
_classPrivateFieldGet(_this, _startMediaRecorder).call(_this);
|
|
2140
|
+
});
|
|
2065
2141
|
_defineProperty(this, "pauseRecording", function () {
|
|
2066
2142
|
var _classPrivateFieldGet6;
|
|
2067
2143
|
if (((_classPrivateFieldGet6 = _classPrivateFieldGet(_this, _mediaRecorder)) === null || _classPrivateFieldGet6 === void 0 ? void 0 : _classPrivateFieldGet6.state) === "recording") {
|
|
@@ -2787,6 +2863,11 @@ var ScreenRecorder = /*#__PURE__*/function () {
|
|
|
2787
2863
|
set: function set(value) {
|
|
2788
2864
|
_classPrivateFieldSet(this, _videoStream, value);
|
|
2789
2865
|
}
|
|
2866
|
+
|
|
2867
|
+
// Skip the in-flight countdown and start the actual recording immediately.
|
|
2868
|
+
// The chime is suppressed (vs. natural completion which plays it) since the
|
|
2869
|
+
// user explicitly opted out of the count-in. Listeners hook onCountdownSkip
|
|
2870
|
+
// to clean up countdown-only side effects like scheduled beeps.
|
|
2790
2871
|
}]);
|
|
2791
2872
|
return ScreenRecorder;
|
|
2792
2873
|
}();
|