Socket
Socket
Sign inDemoInstall

extendable-media-recorder

Package Overview
Dependencies
18
Maintainers
1
Versions
373
Alerts
File Explorer

Advanced tools

Install Socket

Detect and block malicious and high-risk dependencies

Install

Comparing version 7.1.22 to 8.0.0

75

build/es2019/factories/is-supported-promise.js

@@ -7,32 +7,53 @@ export const createIsSupportedPromise = (window) => {

/*
* Bug #10: An early experimental implemenation in Safari did not provide the isTypeSupported() function.
* Bug #10: An early experimental implemenation in Safari v14 did not provide the isTypeSupported() function.
*
* Bug #17: Safari up to v14.1.2 throttled the processing on hidden tabs if there was no active audio output. This is not tested
* here but should be covered by the following test, too.
*/
(window.MediaRecorder === undefined || window.MediaRecorder.isTypeSupported !== undefined)) {
/*
* Bug #5: Up until v70 Firefox did emit a blob of type video/webm when asked to encode a MediaStream with a video track into an
* audio codec.
*/
return new Promise((resolve) => {
// Bug #11 Safari does not yet support the MediaRecorder but that isn't tested here.
if (window.MediaRecorder === undefined) {
return resolve(true);
}
const canvasElement = window.document.createElement('canvas');
// @todo https://bugzilla.mozilla.org/show_bug.cgi?id=1388974
canvasElement.getContext('2d');
if (typeof canvasElement.captureStream !== 'function') {
return resolve(false);
}
const mediaStream = canvasElement.captureStream();
const mimeType = 'audio/webm';
try {
const mediaRecorder = new window.MediaRecorder(mediaStream, { mimeType });
mediaRecorder.addEventListener('dataavailable', ({ data }) => resolve(data.type === mimeType));
// Bug #11 Safari up to v14.1.2 did not support the MediaRecorder but that isn't tested here.
if (window.MediaRecorder === undefined) {
return Promise.resolve(true);
}
const canvasElement = window.document.createElement('canvas');
// @todo https://bugzilla.mozilla.org/show_bug.cgi?id=1388974
canvasElement.getContext('2d');
if (typeof canvasElement.captureStream !== 'function') {
return Promise.resolve(false);
}
const mediaStream = canvasElement.captureStream();
return Promise.all([
/*
* Bug #5: Up until v70 Firefox did emit a blob of type video/webm when asked to encode a MediaStream with a video track into an
* audio codec.
*/
new Promise((resolve) => {
const mimeType = 'audio/webm';
try {
const mediaRecorder = new window.MediaRecorder(mediaStream, { mimeType });
mediaRecorder.addEventListener('dataavailable', ({ data }) => resolve(data.type === mimeType));
mediaRecorder.start();
setTimeout(() => mediaRecorder.stop(), 10);
}
catch (err) {
resolve(err.name === 'NotSupportedError');
}
}),
/*
* Bug #1 & #2: Up until v83 Firefox fired an error event with an UnknownError when adding or removing a track.
*/
new Promise((resolve) => {
const mediaRecorder = new window.MediaRecorder(mediaStream);
mediaRecorder.addEventListener('error', (event) => {
resolve('error' in event &&
event.error !== null &&
typeof event.error === 'object' &&
'name' in event.error &&
event.error.name !== 'UnknownError');
mediaRecorder.stop();
});
mediaRecorder.start();
setTimeout(() => mediaRecorder.stop(), 10);
}
catch (err) {
resolve(err.name === 'NotSupportedError');
}
});
mediaStream.removeTrack(mediaStream.getVideoTracks()[0]);
})
]).then((results) => results.every((result) => result));
}

@@ -39,0 +60,0 @@ return Promise.resolve(false);

@@ -40,8 +40,3 @@ export const createNativeMediaRecorderFactory = (createInvalidModificationError, createNotSupportedError) => {

listener.call(nativeMediaRecorder, new ErrorEvent('error', { error: createInvalidModificationError() }));
// Bug #1 & #2: Firefox throws an error event with an UnknownError.
}
else if (event.error.name === 'UnknownError') {
const message = event.error.message;
listener.call(nativeMediaRecorder, new ErrorEvent('error', { error: createInvalidModificationError(message) }));
}
else if (event instanceof ErrorEvent) {

@@ -48,0 +43,0 @@ listener.call(nativeMediaRecorder, event);

import { encode, instantiate } from 'media-encoder-host';
import { addRecorderAudioWorkletModule, createRecorderAudioWorkletNode } from 'recorder-audio-worklet';
import { AudioBuffer, AudioBufferSourceNode, AudioWorkletNode, ConstantSourceNode, MediaStreamAudioSourceNode, MinimalAudioContext, addAudioWorkletModule } from 'standardized-audio-context';
import { AudioBuffer, AudioBufferSourceNode, AudioWorkletNode, MediaStreamAudioSourceNode, MinimalAudioContext, addAudioWorkletModule } from 'standardized-audio-context';
const ERROR_MESSAGE = 'Missing AudioWorklet support. Maybe this is not running in a secure context.';

@@ -63,3 +63,3 @@ // @todo This should live in a separate file.

}
promisedAudioNodesAndEncoderId.then(async ({ constantSourceNode, encoderId, mediaStreamAudioSourceNode, recorderAudioWorkletNode }) => {
promisedAudioNodesAndEncoderId.then(async ({ encoderId, mediaStreamAudioSourceNode, recorderAudioWorkletNode }) => {
if (promisedPartialRecording !== null) {

@@ -73,3 +73,2 @@ promisedPartialRecording.catch(() => {

mediaStreamAudioSourceNode.disconnect(recorderAudioWorkletNode);
constantSourceNode.stop();
const arrayBuffers = await encode(encoderId, null);

@@ -140,7 +139,2 @@ if (promisedAudioNodesAndEncoderId === null) {

audioBufferSourceNode.disconnect(recorderAudioWorkletNode);
// Bug #17: Safari does throttle the processing on hidden tabs if there is no active audio output.
const constantSourceNode = new ConstantSourceNode(audioContext, { offset: 0 });
constantSourceNode.onended = () => constantSourceNode.disconnect();
constantSourceNode.connect(audioContext.destination);
constantSourceNode.start();
await recorderAudioWorkletNode.record(port);

@@ -150,3 +144,3 @@ if (timeslice !== undefined) {

}
return { constantSourceNode, encoderId, mediaStreamAudioSourceNode, recorderAudioWorkletNode };
return { encoderId, mediaStreamAudioSourceNode, recorderAudioWorkletNode };
});

@@ -153,0 +147,0 @@ const tracks = mediaStream.getTracks();

import { IRecorderAudioWorkletNode } from 'recorder-audio-worklet';
import { IConstantSourceNode, IMediaStreamAudioSourceNode, IMinimalAudioContext } from 'standardized-audio-context';
import { IMediaStreamAudioSourceNode, IMinimalAudioContext } from 'standardized-audio-context';
export interface IAudioNodesAndEncoderId {
constantSourceNode: IConstantSourceNode<IMinimalAudioContext>;
encoderId: number;

@@ -6,0 +5,0 @@ mediaStreamAudioSourceNode: IMediaStreamAudioSourceNode<IMinimalAudioContext>;

(function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('@babel/runtime/helpers/asyncToGenerator'), require('@babel/runtime/regenerator'), require('media-encoder-host'), require('@babel/runtime/helpers/classCallCheck'), require('@babel/runtime/helpers/createClass'), require('@babel/runtime/helpers/assertThisInitialized'), require('@babel/runtime/helpers/inherits'), require('@babel/runtime/helpers/possibleConstructorReturn'), require('@babel/runtime/helpers/getPrototypeOf'), require('@babel/runtime/helpers/slicedToArray'), require('@babel/runtime/helpers/toConsumableArray'), require('recorder-audio-worklet'), require('standardized-audio-context'), require('multi-buffer-data-view'), require('subscribable-things')) :
typeof define === 'function' && define.amd ? define(['exports', '@babel/runtime/helpers/asyncToGenerator', '@babel/runtime/regenerator', 'media-encoder-host', '@babel/runtime/helpers/classCallCheck', '@babel/runtime/helpers/createClass', '@babel/runtime/helpers/assertThisInitialized', '@babel/runtime/helpers/inherits', '@babel/runtime/helpers/possibleConstructorReturn', '@babel/runtime/helpers/getPrototypeOf', '@babel/runtime/helpers/slicedToArray', '@babel/runtime/helpers/toConsumableArray', 'recorder-audio-worklet', 'standardized-audio-context', 'multi-buffer-data-view', 'subscribable-things'], factory) :
(global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.extendableMediaRecorder = {}, global._asyncToGenerator, global._regeneratorRuntime, global.mediaEncoderHost, global._classCallCheck, global._createClass, global._assertThisInitialized, global._inherits, global._possibleConstructorReturn, global._getPrototypeOf, global._slicedToArray, global._toConsumableArray, global.recorderAudioWorklet, global.standardizedAudioContext, global.multiBufferDataView, global.subscribableThings));
})(this, (function (exports, _asyncToGenerator, _regeneratorRuntime, mediaEncoderHost, _classCallCheck, _createClass, _assertThisInitialized, _inherits, _possibleConstructorReturn, _getPrototypeOf, _slicedToArray, _toConsumableArray, recorderAudioWorklet, standardizedAudioContext, multiBufferDataView, subscribableThings) { 'use strict';
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('@babel/runtime/helpers/asyncToGenerator'), require('@babel/runtime/regenerator'), require('media-encoder-host'), require('@babel/runtime/helpers/classCallCheck'), require('@babel/runtime/helpers/createClass'), require('@babel/runtime/helpers/typeof'), require('@babel/runtime/helpers/assertThisInitialized'), require('@babel/runtime/helpers/inherits'), require('@babel/runtime/helpers/possibleConstructorReturn'), require('@babel/runtime/helpers/getPrototypeOf'), require('@babel/runtime/helpers/slicedToArray'), require('@babel/runtime/helpers/toConsumableArray'), require('recorder-audio-worklet'), require('standardized-audio-context'), require('multi-buffer-data-view'), require('subscribable-things')) :
typeof define === 'function' && define.amd ? define(['exports', '@babel/runtime/helpers/asyncToGenerator', '@babel/runtime/regenerator', 'media-encoder-host', '@babel/runtime/helpers/classCallCheck', '@babel/runtime/helpers/createClass', '@babel/runtime/helpers/typeof', '@babel/runtime/helpers/assertThisInitialized', '@babel/runtime/helpers/inherits', '@babel/runtime/helpers/possibleConstructorReturn', '@babel/runtime/helpers/getPrototypeOf', '@babel/runtime/helpers/slicedToArray', '@babel/runtime/helpers/toConsumableArray', 'recorder-audio-worklet', 'standardized-audio-context', 'multi-buffer-data-view', 'subscribable-things'], factory) :
(global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.extendableMediaRecorder = {}, global._asyncToGenerator, global._regeneratorRuntime, global.mediaEncoderHost, global._classCallCheck, global._createClass, global._typeof, global._assertThisInitialized, global._inherits, global._possibleConstructorReturn, global._getPrototypeOf, global._slicedToArray, global._toConsumableArray, global.recorderAudioWorklet, global.standardizedAudioContext, global.multiBufferDataView, global.subscribableThings));
})(this, (function (exports, _asyncToGenerator, _regeneratorRuntime, mediaEncoderHost, _classCallCheck, _createClass, _typeof, _assertThisInitialized, _inherits, _possibleConstructorReturn, _getPrototypeOf, _slicedToArray, _toConsumableArray, recorderAudioWorklet, standardizedAudioContext, multiBufferDataView, subscribableThings) { 'use strict';

@@ -129,5 +129,20 @@ var createBlobEventFactory = function createBlobEventFactory(nativeBlobEventConstructor) {

/*
* Bug #10: An early experimental implemenation in Safari did not provide the isTypeSupported() function.
* Bug #10: An early experimental implemenation in Safari v14 did not provide the isTypeSupported() function.
*
* Bug #17: Safari up to v14.1.2 throttled the processing on hidden tabs if there was no active audio output. This is not tested
* here but should be covered by the following test, too.
*/
window.MediaRecorder === undefined || window.MediaRecorder.isTypeSupported !== undefined)) {
// Bug #11 Safari up to v14.1.2 did not support the MediaRecorder but that isn't tested here.
if (window.MediaRecorder === undefined) {
return Promise.resolve(true);
}
var canvasElement = window.document.createElement('canvas');
// @todo https://bugzilla.mozilla.org/show_bug.cgi?id=1388974
canvasElement.getContext('2d');
if (typeof canvasElement.captureStream !== 'function') {
return Promise.resolve(false);
}
var mediaStream = canvasElement.captureStream();
return Promise.all([
/*

@@ -137,14 +152,3 @@ * Bug #5: Up until v70 Firefox did emit a blob of type video/webm when asked to encode a MediaStream with a video track into an

*/
return new Promise(function (resolve) {
// Bug #11 Safari does not yet support the MediaRecorder but that isn't tested here.
if (window.MediaRecorder === undefined) {
return resolve(true);
}
var canvasElement = window.document.createElement('canvas');
// @todo https://bugzilla.mozilla.org/show_bug.cgi?id=1388974
canvasElement.getContext('2d');
if (typeof canvasElement.captureStream !== 'function') {
return resolve(false);
}
var mediaStream = canvasElement.captureStream();
new Promise(function (resolve) {
var mimeType = 'audio/webm';

@@ -166,2 +170,18 @@ try {

}
}),
/*
* Bug #1 & #2: Up until v83 Firefox fired an error event with an UnknownError when adding or removing a track.
*/
new Promise(function (resolve) {
var mediaRecorder = new window.MediaRecorder(mediaStream);
mediaRecorder.addEventListener('error', function (event) {
resolve('error' in event && event.error !== null && _typeof(event.error) === 'object' && 'name' in event.error && event.error.name !== 'UnknownError');
mediaRecorder.stop();
});
mediaRecorder.start();
mediaStream.removeTrack(mediaStream.getVideoTracks()[0]);
})]).then(function (results) {
return results.every(function (result) {
return result;
});
});

@@ -408,8 +428,2 @@ }

}));
// Bug #1 & #2: Firefox throws an error event with an UnknownError.
} else if (event.error.name === 'UnknownError') {
var message = event.error.message;
listener.call(nativeMediaRecorder, new ErrorEvent('error', {
error: createInvalidModificationError(message)
}));
} else if (event instanceof ErrorEvent) {

@@ -726,7 +740,7 @@ listener.call(nativeMediaRecorder, event);

var _ref4 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee3(_ref3) {
var constantSourceNode, encoderId, mediaStreamAudioSourceNode, recorderAudioWorkletNode, arrayBuffers;
var encoderId, mediaStreamAudioSourceNode, recorderAudioWorkletNode, arrayBuffers;
return _regeneratorRuntime.wrap(function _callee3$(_context3) {
while (1) switch (_context3.prev = _context3.next) {
case 0:
constantSourceNode = _ref3.constantSourceNode, encoderId = _ref3.encoderId, mediaStreamAudioSourceNode = _ref3.mediaStreamAudioSourceNode, recorderAudioWorkletNode = _ref3.recorderAudioWorkletNode;
encoderId = _ref3.encoderId, mediaStreamAudioSourceNode = _ref3.mediaStreamAudioSourceNode, recorderAudioWorkletNode = _ref3.recorderAudioWorkletNode;
if (promisedPartialRecording !== null) {

@@ -742,18 +756,17 @@ promisedPartialRecording["catch"](function () {

mediaStreamAudioSourceNode.disconnect(recorderAudioWorkletNode);
constantSourceNode.stop();
_context3.next = 8;
_context3.next = 7;
return mediaEncoderHost.encode(encoderId, null);
case 8:
case 7:
arrayBuffers = _context3.sent;
if (!(promisedAudioNodesAndEncoderId === null)) {
_context3.next = 12;
_context3.next = 11;
break;
}
_context3.next = 12;
_context3.next = 11;
return suspend();
case 12:
case 11:
dispatchDataAvailableEvent([].concat(bufferedArrayBuffers, _toConsumableArray(arrayBuffers)));
bufferedArrayBuffers.length = 0;
eventTarget.dispatchEvent(new Event('stop'));
case 15:
case 14:
case "end":

@@ -816,3 +829,3 @@ return _context3.stop();

var _ref6 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee4(_ref5) {
var _ref7, _ref7$, audioBufferSourceNode, encoderId, mediaStreamAudioSourceNode, port, recorderAudioWorkletNode, constantSourceNode;
var _ref7, _ref7$, audioBufferSourceNode, encoderId, mediaStreamAudioSourceNode, port, recorderAudioWorkletNode;
return _regeneratorRuntime.wrap(function _callee4$(_context4) {

@@ -831,14 +844,5 @@ while (1) switch (_context4.prev = _context4.next) {

audioBufferSourceNode.disconnect(recorderAudioWorkletNode);
// Bug #17: Safari does throttle the processing on hidden tabs if there is no active audio output.
constantSourceNode = new standardizedAudioContext.ConstantSourceNode(audioContext, {
offset: 0
});
constantSourceNode.onended = function () {
return constantSourceNode.disconnect();
};
constantSourceNode.connect(audioContext.destination);
constantSourceNode.start();
_context4.next = 11;
_context4.next = 7;
return recorderAudioWorkletNode.record(port);
case 11:
case 7:
if (timeslice !== undefined) {

@@ -848,3 +852,2 @@ promisedPartialRecording = requestNextPartialRecording(encoderId, timeslice);

return _context4.abrupt("return", {
constantSourceNode: constantSourceNode,
encoderId: encoderId,

@@ -854,3 +857,3 @@ mediaStreamAudioSourceNode: mediaStreamAudioSourceNode,

});
case 13:
case 9:
case "end":

@@ -857,0 +860,0 @@ return _context4.stop();

@@ -24,12 +24,12 @@ {

"subscribable-things": "^2.1.22",
"tslib": "^2.6.0"
"tslib": "^2.6.1"
},
"description": "An extendable drop-in replacement for the native MediaRecorder.",
"devDependencies": {
"@babel/core": "^7.22.8",
"@babel/core": "^7.22.9",
"@babel/plugin-external-helpers": "^7.22.5",
"@babel/plugin-transform-runtime": "^7.22.7",
"@babel/preset-env": "^7.22.7",
"@commitlint/cli": "^17.6.6",
"@commitlint/config-angular": "^17.6.6",
"@babel/plugin-transform-runtime": "^7.22.9",
"@babel/preset-env": "^7.22.9",
"@commitlint/cli": "^17.6.7",
"@commitlint/config-angular": "^17.6.7",
"@rollup/plugin-babel": "^6.0.3",

@@ -39,8 +39,7 @@ "chai": "^4.3.7",

"cz-conventional-changelog": "^3.3.0",
"eslint": "^8.44.0",
"eslint-config-holy-grail": "^57.2.13",
"eslint": "^8.45.0",
"eslint-config-holy-grail": "^57.2.16",
"extendable-media-recorder-wav-encoder": "^7.0.95",
"grunt": "^1.6.1",
"grunt-cli": "^1.4.3",
"grunt-contrib-watch": "^1.1.0",
"grunt-sh": "^0.2.1",

@@ -61,3 +60,3 @@ "husky": "^8.0.3",

"rimraf": "^5.0.1",
"rollup": "^3.26.2",
"rollup": "^3.26.3",
"sinon": "^15.2.0",

@@ -70,3 +69,3 @@ "sinon-chai": "^3.7.0",

"typescript": "^5.1.6",
"webpack": "^5.88.1"
"webpack": "^5.88.2"
},

@@ -93,2 +92,6 @@ "files": [

"scripts": {
"lint": "npm run lint:config && npm run lint:src && npm run lint:test",
"lint:config": "eslint --config config/eslint/config.json --ext .js --report-unused-disable-directives config/",
"lint:src": "tslint --config config/tslint/src.json --project src/tsconfig.json src/*.ts src/**/*.ts",
"lint:test": "eslint --config config/eslint/test.json --ext .js --report-unused-disable-directives test/",
"prepare": "husky install",

@@ -99,3 +102,3 @@ "prepublishOnly": "grunt build",

"types": "build/es2019/module.d.ts",
"version": "7.1.22"
"version": "8.0.0"
}

@@ -10,39 +10,64 @@ import { TIsSupportedPromiseFactory } from '../types';

/*
* Bug #10: An early experimental implemenation in Safari did not provide the isTypeSupported() function.
* Bug #10: An early experimental implemenation in Safari v14 did not provide the isTypeSupported() function.
*
* Bug #17: Safari up to v14.1.2 throttled the processing on hidden tabs if there was no active audio output. This is not tested
* here but should be covered by the following test, too.
*/
(window.MediaRecorder === undefined || window.MediaRecorder.isTypeSupported !== undefined)
) {
/*
* Bug #5: Up until v70 Firefox did emit a blob of type video/webm when asked to encode a MediaStream with a video track into an
* audio codec.
*/
return new Promise((resolve) => {
// Bug #11 Safari does not yet support the MediaRecorder but that isn't tested here.
if (window.MediaRecorder === undefined) {
return resolve(true);
}
// Bug #11 Safari up to v14.1.2 did not support the MediaRecorder but that isn't tested here.
if (window.MediaRecorder === undefined) {
return Promise.resolve(true);
}
const canvasElement: HTMLCanvasElement & { captureStream?(): MediaStream } = window.document.createElement('canvas');
const canvasElement = window.document.createElement('canvas');
// @todo https://bugzilla.mozilla.org/show_bug.cgi?id=1388974
canvasElement.getContext('2d');
// @todo https://bugzilla.mozilla.org/show_bug.cgi?id=1388974
canvasElement.getContext('2d');
if (typeof canvasElement.captureStream !== 'function') {
return resolve(false);
}
if (typeof canvasElement.captureStream !== 'function') {
return Promise.resolve(false);
}
const mediaStream = canvasElement.captureStream();
const mimeType = 'audio/webm';
const mediaStream = canvasElement.captureStream();
try {
const mediaRecorder = new window.MediaRecorder(mediaStream, { mimeType });
return Promise.all([
/*
* Bug #5: Up until v70 Firefox did emit a blob of type video/webm when asked to encode a MediaStream with a video track into an
* audio codec.
*/
new Promise((resolve) => {
const mimeType = 'audio/webm';
mediaRecorder.addEventListener('dataavailable', ({ data }) => resolve(data.type === mimeType));
try {
const mediaRecorder = new window.MediaRecorder(mediaStream, { mimeType });
mediaRecorder.addEventListener('dataavailable', ({ data }) => resolve(data.type === mimeType));
mediaRecorder.start();
setTimeout(() => mediaRecorder.stop(), 10);
} catch (err) {
resolve(err.name === 'NotSupportedError');
}
}),
/*
* Bug #1 & #2: Up until v83 Firefox fired an error event with an UnknownError when adding or removing a track.
*/
new Promise((resolve) => {
const mediaRecorder = new window.MediaRecorder(mediaStream);
mediaRecorder.addEventListener('error', (event) => {
resolve(
'error' in event &&
event.error !== null &&
typeof event.error === 'object' &&
'name' in event.error &&
event.error.name !== 'UnknownError'
);
mediaRecorder.stop();
});
mediaRecorder.start();
setTimeout(() => mediaRecorder.stop(), 10);
} catch (err) {
resolve(err.name === 'NotSupportedError');
}
});
mediaStream.removeTrack(mediaStream.getVideoTracks()[0]);
})
]).then((results) => results.every((result) => result));
}

@@ -49,0 +74,0 @@

@@ -55,10 +55,2 @@ import { IBlobEvent, IMediaRecorder } from '../interfaces';

listener.call(nativeMediaRecorder, new ErrorEvent('error', { error: createInvalidModificationError() }));
// Bug #1 & #2: Firefox throws an error event with an UnknownError.
} else if (event.error.name === 'UnknownError') {
const message = event.error.message;
listener.call(
nativeMediaRecorder,
new ErrorEvent('error', { error: createInvalidModificationError(message) })
);
} else if (event instanceof ErrorEvent) {

@@ -65,0 +57,0 @@ listener.call(nativeMediaRecorder, event);

@@ -7,3 +7,2 @@ import { encode, instantiate } from 'media-encoder-host';

AudioWorkletNode,
ConstantSourceNode,
IAudioBuffer,

@@ -103,29 +102,26 @@ IMinimalAudioContext,

promisedAudioNodesAndEncoderId.then(
async ({ constantSourceNode, encoderId, mediaStreamAudioSourceNode, recorderAudioWorkletNode }) => {
if (promisedPartialRecording !== null) {
promisedPartialRecording.catch(() => {
/* @todo Only catch the errors caused by a duplicate call to encode. */
});
promisedPartialRecording = null;
}
promisedAudioNodesAndEncoderId.then(async ({ encoderId, mediaStreamAudioSourceNode, recorderAudioWorkletNode }) => {
if (promisedPartialRecording !== null) {
promisedPartialRecording.catch(() => {
/* @todo Only catch the errors caused by a duplicate call to encode. */
});
promisedPartialRecording = null;
}
await recorderAudioWorkletNode.stop();
await recorderAudioWorkletNode.stop();
mediaStreamAudioSourceNode.disconnect(recorderAudioWorkletNode);
constantSourceNode.stop();
mediaStreamAudioSourceNode.disconnect(recorderAudioWorkletNode);
const arrayBuffers = await encode(encoderId, null);
const arrayBuffers = await encode(encoderId, null);
if (promisedAudioNodesAndEncoderId === null) {
await suspend();
}
if (promisedAudioNodesAndEncoderId === null) {
await suspend();
}
dispatchDataAvailableEvent([...bufferedArrayBuffers, ...arrayBuffers]);
dispatchDataAvailableEvent([...bufferedArrayBuffers, ...arrayBuffers]);
bufferedArrayBuffers.length = 0;
bufferedArrayBuffers.length = 0;
eventTarget.dispatchEvent(new Event('stop'));
}
);
eventTarget.dispatchEvent(new Event('stop'));
});

@@ -208,9 +204,2 @@ promisedAudioNodesAndEncoderId = null;

// Bug #17: Safari does throttle the processing on hidden tabs if there is no active audio output.
const constantSourceNode = new ConstantSourceNode(audioContext, { offset: 0 });
constantSourceNode.onended = () => constantSourceNode.disconnect();
constantSourceNode.connect(audioContext.destination);
constantSourceNode.start();
await recorderAudioWorkletNode.record(port);

@@ -222,3 +211,3 @@

return { constantSourceNode, encoderId, mediaStreamAudioSourceNode, recorderAudioWorkletNode };
return { encoderId, mediaStreamAudioSourceNode, recorderAudioWorkletNode };
});

@@ -225,0 +214,0 @@

import { IRecorderAudioWorkletNode } from 'recorder-audio-worklet';
import { IConstantSourceNode, IMediaStreamAudioSourceNode, IMinimalAudioContext } from 'standardized-audio-context';
import { IMediaStreamAudioSourceNode, IMinimalAudioContext } from 'standardized-audio-context';
export interface IAudioNodesAndEncoderId {
constantSourceNode: IConstantSourceNode<IMinimalAudioContext>;
encoderId: number;

@@ -8,0 +6,0 @@

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap

Packages

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc