@corti/dictation-web
Version:
Web component for Corti Dictation
126 lines • 8.32 kB
JavaScript
var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {
if (kind === "m") throw new TypeError("Private method is not writable");
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
};
var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
};
var _MediaController_mediaStream, _MediaController_audioContext, _MediaController_analyser, _MediaController_mediaRecorder, _MediaController_visualiserInterval, _MediaController_audioLevel, _MediaController_onTrackEnded, _MediaController_onAudioLevelChange, _MediaController_dataHandler;
import { calculateAudioLevel, createAudioAnalyzer, getMediaStream, } from "../utils/media.js";
export class MediaController {
constructor(host) {
_MediaController_mediaStream.set(this, null);
_MediaController_audioContext.set(this, null);
_MediaController_analyser.set(this, null);
_MediaController_mediaRecorder.set(this, null);
_MediaController_visualiserInterval.set(this, void 0);
_MediaController_audioLevel.set(this, 0);
_MediaController_onTrackEnded.set(this, void 0);
_MediaController_onAudioLevelChange.set(this, void 0);
_MediaController_dataHandler.set(this, void 0);
this.host = host;
host.addController(this);
}
hostDisconnected() {
this.cleanup();
}
async initialize(onTrackEnded, dataHandler) {
await this.cleanup();
__classPrivateFieldSet(this, _MediaController_onTrackEnded, onTrackEnded, "f");
__classPrivateFieldSet(this, _MediaController_dataHandler, dataHandler, "f");
__classPrivateFieldSet(this, _MediaController_mediaStream, await getMediaStream(this.host._selectedDevice?.deviceId, this.host._debug_displayAudio), "f");
__classPrivateFieldGet(this, _MediaController_mediaStream, "f").getTracks().forEach((track) => {
track.addEventListener("ended", () => {
if (__classPrivateFieldGet(this, _MediaController_onTrackEnded, "f")) {
__classPrivateFieldGet(this, _MediaController_onTrackEnded, "f").call(this);
}
});
});
const { audioContext, analyser } = createAudioAnalyzer(__classPrivateFieldGet(this, _MediaController_mediaStream, "f"));
__classPrivateFieldSet(this, _MediaController_audioContext, audioContext, "f");
__classPrivateFieldSet(this, _MediaController_analyser, analyser, "f");
__classPrivateFieldSet(this, _MediaController_mediaRecorder, new MediaRecorder(__classPrivateFieldGet(this, _MediaController_mediaStream, "f")), "f");
__classPrivateFieldGet(this, _MediaController_mediaRecorder, "f").ondataavailable = (event) => {
if (__classPrivateFieldGet(this, _MediaController_dataHandler, "f")) {
__classPrivateFieldGet(this, _MediaController_dataHandler, "f").call(this, event.data);
}
};
}
getAudioLevel() {
return __classPrivateFieldGet(this, _MediaController_analyser, "f") ? calculateAudioLevel(__classPrivateFieldGet(this, _MediaController_analyser, "f")) : 0;
}
startAudioLevelMonitoring(onAudioLevelChange) {
this.stopAudioLevelMonitoring();
__classPrivateFieldSet(this, _MediaController_onAudioLevelChange, onAudioLevelChange, "f");
__classPrivateFieldSet(this, _MediaController_visualiserInterval, window.setInterval(() => {
__classPrivateFieldSet(this, _MediaController_audioLevel, this.getAudioLevel() * 3, "f");
this.host.requestUpdate();
if (__classPrivateFieldGet(this, _MediaController_onAudioLevelChange, "f")) {
__classPrivateFieldGet(this, _MediaController_onAudioLevelChange, "f").call(this, __classPrivateFieldGet(this, _MediaController_audioLevel, "f"));
}
}, 150), "f");
}
stopAudioLevelMonitoring() {
if (__classPrivateFieldGet(this, _MediaController_visualiserInterval, "f")) {
clearInterval(__classPrivateFieldGet(this, _MediaController_visualiserInterval, "f"));
__classPrivateFieldSet(this, _MediaController_visualiserInterval, undefined, "f");
}
__classPrivateFieldSet(this, _MediaController_audioLevel, 0, "f");
this.host.requestUpdate();
if (__classPrivateFieldGet(this, _MediaController_onAudioLevelChange, "f")) {
__classPrivateFieldGet(this, _MediaController_onAudioLevelChange, "f").call(this, __classPrivateFieldGet(this, _MediaController_audioLevel, "f"));
}
}
async cleanup() {
this.stopAudioLevelMonitoring();
if (__classPrivateFieldGet(this, _MediaController_mediaRecorder, "f")?.state === "recording") {
__classPrivateFieldGet(this, _MediaController_mediaRecorder, "f").stop();
}
if (__classPrivateFieldGet(this, _MediaController_mediaRecorder, "f")) {
__classPrivateFieldGet(this, _MediaController_mediaRecorder, "f").ondataavailable = null;
}
if (__classPrivateFieldGet(this, _MediaController_mediaStream, "f")) {
__classPrivateFieldGet(this, _MediaController_mediaStream, "f").getTracks().forEach((track) => {
track.stop();
});
__classPrivateFieldSet(this, _MediaController_mediaStream, null, "f");
}
if (__classPrivateFieldGet(this, _MediaController_audioContext, "f") && __classPrivateFieldGet(this, _MediaController_audioContext, "f").state !== "closed") {
await __classPrivateFieldGet(this, _MediaController_audioContext, "f").close();
}
__classPrivateFieldSet(this, _MediaController_audioContext, null, "f");
__classPrivateFieldSet(this, _MediaController_analyser, null, "f");
__classPrivateFieldSet(this, _MediaController_mediaRecorder, null, "f");
__classPrivateFieldSet(this, _MediaController_onTrackEnded, undefined, "f");
__classPrivateFieldSet(this, _MediaController_onAudioLevelChange, undefined, "f");
__classPrivateFieldSet(this, _MediaController_dataHandler, undefined, "f");
}
/**
* Stops the media recorder and waits for all buffered data to be flushed.
* This ensures the final ondataavailable event fires before resolving.
*/
async stopRecording() {
return new Promise((resolve) => {
if (!__classPrivateFieldGet(this, _MediaController_mediaRecorder, "f") || __classPrivateFieldGet(this, _MediaController_mediaRecorder, "f").state !== "recording") {
resolve();
return;
}
__classPrivateFieldGet(this, _MediaController_mediaRecorder, "f").onstop = () => {
resolve();
};
__classPrivateFieldGet(this, _MediaController_mediaRecorder, "f").stop();
});
}
get mediaRecorder() {
return __classPrivateFieldGet(this, _MediaController_mediaRecorder, "f");
}
get audioLevel() {
return __classPrivateFieldGet(this, _MediaController_audioLevel, "f");
}
}
_MediaController_mediaStream = new WeakMap(), _MediaController_audioContext = new WeakMap(), _MediaController_analyser = new WeakMap(), _MediaController_mediaRecorder = new WeakMap(), _MediaController_visualiserInterval = new WeakMap(), _MediaController_audioLevel = new WeakMap(), _MediaController_onTrackEnded = new WeakMap(), _MediaController_onAudioLevelChange = new WeakMap(), _MediaController_dataHandler = new WeakMap();
//# sourceMappingURL=media-controller.js.map