@corti/dictation-web 0.1.6 → 0.1.8
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/README.md +108 -109
- package/dist/CortiDictation.d.ts +7 -1
- package/dist/CortiDictation.js +21 -16
- package/dist/CortiDictation.js.map +1 -1
- package/dist/DictationService.d.ts +4 -5
- package/dist/DictationService.js +28 -16
- package/dist/DictationService.js.map +1 -1
- package/dist/RecorderManager.d.ts +3 -2
- package/dist/RecorderManager.js +37 -14
- package/dist/RecorderManager.js.map +1 -1
- package/dist/bundle.js +137 -97
- package/dist/components/settings-menu.js +3 -4
- package/dist/components/settings-menu.js.map +1 -1
- package/dist/constants.js +1 -1
- package/dist/constants.js.map +1 -1
- package/dist/styles/callout.js +12 -12
- package/dist/styles/callout.js.map +1 -1
- package/dist/styles/theme.js +20 -41
- package/dist/styles/theme.js.map +1 -1
- package/dist/types.d.ts +12 -6
- package/dist/types.js.map +1 -1
- package/dist/utils.d.ts +3 -2
- package/dist/utils.js +25 -3
- package/dist/utils.js.map +1 -1
- package/package.json +7 -5
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RecorderManager.js","sourceRoot":"","sources":["../src/RecorderManager.ts"],"names":[],"mappings":"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","sourcesContent":["import { getAudioDevices } from './utils.js';\nimport { AudioService } from './audioService.js';\nimport { DictationService } from './DictationService.js';\nimport type { DictationConfig, RecordingState } from './types.js';\n\nexport class RecorderManager extends EventTarget {\n public devices: MediaDeviceInfo[] = [];\n\n public selectedDevice: MediaDeviceInfo | undefined;\n\n public recordingState: RecordingState = 'stopped';\n\n private _mediaStream: MediaStream | null = null;\n\n private _audioService: AudioService | null = null;\n\n private _dictationService: DictationService | null = null;\n\n private _visualiserInterval?: number;\n\n constructor() {\n super();\n navigator.mediaDevices.addEventListener(\n 'devicechange',\n this.handleDevicesChange.bind(this),\n );\n }\n\n async initialize() {\n const deviceResponse = await getAudioDevices();\n this.devices = deviceResponse.devices;\n this.selectedDevice = deviceResponse.defaultDevice;\n return { devices: this.devices, selectedDevice: this.selectedDevice };\n }\n\n private dispatchCustomEvent(eventName: string, detail?: unknown): void {\n this.dispatchEvent(\n new CustomEvent(eventName, {\n detail,\n bubbles: true,\n composed: true,\n }),\n );\n }\n\n private async handleDevicesChange() {\n const deviceResponse = await getAudioDevices();\n this.devices = deviceResponse.devices;\n if (\n !this.devices.find(\n device => device.deviceId === this.selectedDevice?.deviceId,\n )\n ) {\n this.selectedDevice = deviceResponse.defaultDevice;\n }\n this.dispatchCustomEvent('recording-devices-changed', {\n devices: deviceResponse.devices,\n selectedDevice: this.selectedDevice || deviceResponse.defaultDevice,\n });\n }\n\n async startRecording(params: {\n dictationConfig: DictationConfig;\n authToken: string;\n }): Promise<void> {\n this._updateRecordingState('initializing');\n\n // Choose constraints based on whether the selected device is \"default\".\n const constraints =\n this.selectedDevice?.deviceId === 'default'\n ? { audio: true }\n : { audio: { deviceId: this.selectedDevice?.deviceId } };\n\n try {\n this._mediaStream =\n await navigator.mediaDevices.getUserMedia(constraints);\n this._mediaStream.getTracks().forEach((track: MediaStreamTrack) => {\n track.addEventListener('ended', () => {\n if (this.recordingState === 'recording') {\n this.dispatchCustomEvent('error', {\n message: 'Microphone access was lost.',\n });\n this.stopRecording();\n }\n });\n });\n this._audioService = new AudioService(this._mediaStream);\n } catch (error) {\n this.dispatchCustomEvent('error', error);\n this._updateRecordingState('stopped');\n return;\n }\n\n // Initialize dictation service.\n try {\n this._dictationService = new DictationService(this._mediaStream, params);\n } catch (error) {\n this.dispatchCustomEvent('error', error);\n this.stopRecording();\n return;\n }\n\n // Forward dictation service events.\n this._dictationService.addEventListener('error', e =>\n this.dispatchCustomEvent('error', (e as CustomEvent).detail),\n );\n this._dictationService.addEventListener('stream-closed', () =>\n this.stopRecording(),\n );\n this._dictationService.addEventListener('transcript', e =>\n this.dispatchCustomEvent('transcript', (e as CustomEvent).detail),\n );\n\n this._dictationService.startRecording();\n this._updateRecordingState('recording');\n\n // Update audio level visualization.\n this._visualiserInterval = window.setInterval(() => {\n const level = this._audioService\n ? this._audioService.getAudioLevel() * 3\n : 0;\n this.dispatchCustomEvent('audio-level-changed', { audioLevel: level });\n }, 150);\n }\n\n async stopRecording() {\n this._updateRecordingState('stopping');\n if (this._visualiserInterval) {\n clearInterval(this._visualiserInterval);\n this._visualiserInterval = undefined;\n }\n if (this._mediaStream) {\n this._mediaStream.getTracks().forEach(track => track.stop());\n this._mediaStream = null;\n }\n this.dispatchCustomEvent('audio-level-changed', { audioLevel: 0 });\n await this._dictationService?.stopRecording();\n this._updateRecordingState('stopped');\n }\n\n private _updateRecordingState(state: RecordingState) {\n this.recordingState = state;\n this.dispatchEvent(\n new CustomEvent('recording-state-changed', {\n detail: { state },\n bubbles: true,\n composed: true,\n }),\n );\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"RecorderManager.js","sourceRoot":"","sources":["../src/RecorderManager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAC7D,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAGzD,MAAM,OAAO,eAAgB,SAAQ,WAAW;IAe9C;QACE,KAAK,EAAE,CAAC;QAfH,YAAO,GAAsB,EAAE,CAAC;QAIhC,mBAAc,GAAmB,SAAS,CAAC;QAE1C,iBAAY,GAAuB,IAAI,CAAC;QAExC,kBAAa,GAAwB,IAAI,CAAC;QAE1C,sBAAiB,GAA4B,IAAI,CAAC;QAMxD,SAAS,CAAC,YAAY,CAAC,gBAAgB,CACrC,cAAc,EACd,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC,CACpC,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,UAAU;QACd,MAAM,cAAc,GAAG,MAAM,eAAe,EAAE,CAAC;QAC/C,IAAI,CAAC,OAAO,GAAG,cAAc,CAAC,OAAO,CAAC;QACtC,IAAI,CAAC,cAAc,GAAG,cAAc,CAAC,aAAa,CAAC;QACnD,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,cAAc,EAAE,IAAI,CAAC,cAAc,EAAE,CAAC;IACxE,CAAC;IAEO,mBAAmB,CAAC,SAAiB,EAAE,MAAgB;QAC7D,IAAI,CAAC,aAAa,CAChB,IAAI,WAAW,CAAC,SAAS,EAAE;YACzB,MAAM;YACN,OAAO,EAAE,IAAI;YACb,QAAQ,EAAE,IAAI;SACf,CAAC,CACH,CAAC;IACJ,CAAC;IAEO,KAAK,CAAC,mBAAmB;QAC/B,MAAM,cAAc,GAAG,MAAM,eAAe,EAAE,CAAC;QAC/C,IAAI,CAAC,OAAO,GAAG,cAAc,CAAC,OAAO,CAAC;QACtC,IACE,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAChB,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,QAAQ,KAAK,IAAI,CAAC,cAAc,EAAE,QAAQ,CAC5D,EACD,CAAC;YACD,IAAI,CAAC,cAAc,GAAG,cAAc,CAAC,aAAa,CAAC;QACrD,CAAC;QACD,IAAI,CAAC,mBAAmB,CAAC,2BAA2B,EAAE;YACpD,OAAO,EAAE,cAAc,CAAC,OAAO;YAC/B,cAAc,EAAE,IAAI,CAAC,cAAc,IAAI,cAAc,CAAC,aAAa;SACpE,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,cAAc,CAAC,MAIpB;QACC,IAAI,CAAC,qBAAqB,CAAC,cAAc,CAAC,CAAC;QAE3C,IAAI,CAAC;YACH,IAAI,CAAC,YAAY,GAAG,MAAM,cAAc,CACtC,MAAM,CAAC,kBAAkB;gBACvB,CAAC,CAAC,eAAe;gBACjB,CAAC,CAAC,IAAI,CAAC,cAAc,EAAE,QAAQ,CAClC,CAAC;YAEF,IAAI,CAAC,YAAY,CAAC,SAAS,EAAE,CAAC,OAAO,CAAC,CAAC,KAAuB,EAAE,EAAE;gBAChE,KAAK,CAAC,gBAAgB,CAAC,OAAO,EAAE,GAAG,EAAE;oBACnC,IAAI,IAAI,CAAC,cAAc,KAAK,WAAW,EAAE,CAAC;wBACxC,IAAI,CAAC,mBAAmB,CAAC,OAAO,EAAE;4BAChC,OAAO,EAAE,6BAA6B;yBACvC,CAAC,CAAC;wBACH,IAAI,CAAC,aAAa,EAAE,CAAC;oBACvB,CAAC;gBACH,CAAC,CAAC,CAAC;YACL,CAAC,CAAC,CAAC;YAEH,IAAI,CAAC,aAAa,GAAG,IAAI,YAAY,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QAC3D,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,mBAAmB,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;YACzC,IAAI,CAAC,aAAa,EAAE,CAAC;YACrB,OAAO;QACT,CAAC;QAED,gCAAgC;QAChC,IAAI,CAAC;YACH,IAAI,CAAC,iBAAiB,GAAG,IAAI,gBAAgB,CAAC,IAAI,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC;YAEzE,+CAA+C;YAC/C,IAAI,CAAC,iBAAiB,CAAC,gBAAgB,CAAC,OAAO,EAAE,CAAC,CAAC,EAAE;gBACnD,IAAI,CAAC,aAAa,CAChB,IAAI,WAAW,CAAC,OAAO,EAAE;oBACvB,MAAM,EAAG,CAAiB,CAAC,MAAM;oBACjC,OAAO,EAAE,IAAI;oBACb,QAAQ,EAAE,IAAI;iBACf,CAAC,CACH,CAAC;gBACF,IAAI,CAAC,aAAa,EAAE,CAAC;YACvB,CAAC,CAAC,CAAC;YACH,IAAI,CAAC,iBAAiB,CAAC,gBAAgB,CAAC,eAAe,EAAE,GAAG,EAAE,CAC5D,IAAI,CAAC,aAAa,EAAE,CACrB,CAAC;YACF,IAAI,CAAC,iBAAiB,CAAC,gBAAgB,CAAC,YAAY,EAAE,CAAC,CAAC,EAAE,CACxD,IAAI,CAAC,aAAa,CAChB,IAAI,WAAW,CAAC,YAAY,EAAE;gBAC5B,MAAM,EAAG,CAAiB,CAAC,MAAM;gBACjC,OAAO,EAAE,IAAI;gBACb,QAAQ,EAAE,IAAI;aACf,CAAC,CACH,CACF,CAAC;YACF,IAAI,CAAC,iBAAiB,CAAC,gBAAgB,CAAC,SAAS,EAAE,CAAC,CAAC,EAAE,CACrD,IAAI,CAAC,aAAa,CAChB,IAAI,WAAW,CAAC,SAAS,EAAE;gBACzB,MAAM,EAAG,CAAiB,CAAC,MAAM;gBACjC,OAAO,EAAE,IAAI;gBACb,QAAQ,EAAE,IAAI;aACf,CAAC,CACH,CACF,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,mBAAmB,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;YACzC,IAAI,CAAC,aAAa,EAAE,CAAC;YACrB,OAAO;QACT,CAAC;QAED,IAAI,CAAC;YACH,IAAI,CAAC,iBAAiB,EAAE,cAAc,EAAE,CAAC;QAC3C,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,aAAa,CAChB,IAAI,WAAW,CAAC,OAAO,EAAE;gBACvB,MAAM,EAAE,KAAK;gBACb,OAAO,EAAE,IAAI;gBACb,QAAQ,EAAE,IAAI;aACf,CAAC,CACH,CAAC;YACF,IAAI,CAAC,aAAa,EAAE,CAAC;YACrB,OAAO;QACT,CAAC;QACD,IAAI,CAAC,qBAAqB,CAAC,WAAW,CAAC,CAAC;QAExC,oCAAoC;QACpC,IAAI,CAAC,mBAAmB,GAAG,MAAM,CAAC,WAAW,CAAC,GAAG,EAAE;YACjD,MAAM,KAAK,GAAG,IAAI,CAAC,aAAa;gBAC9B,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,aAAa,EAAE,GAAG,CAAC;gBACxC,CAAC,CAAC,CAAC,CAAC;YACN,IAAI,CAAC,mBAAmB,CAAC,qBAAqB,EAAE,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC,CAAC;QACzE,CAAC,EAAE,GAAG,CAAC,CAAC;IACV,CAAC;IAED,KAAK,CAAC,aAAa;QACjB,IAAI,CAAC,qBAAqB,CAAC,UAAU,CAAC,CAAC;QACvC,IAAI,IAAI,CAAC,mBAAmB,EAAE,CAAC;YAC7B,aAAa,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;YACxC,IAAI,CAAC,mBAAmB,GAAG,SAAS,CAAC;QACvC,CAAC;QACD,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;YACtB,IAAI,CAAC,YAAY,CAAC,SAAS,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;QAC/D,CAAC;QACD,IAAI,CAAC,mBAAmB,CAAC,qBAAqB,EAAE,EAAE,UAAU,EAAE,CAAC,EAAE,CAAC,CAAC;QACnE,MAAM,IAAI,CAAC,iBAAiB,EAAE,aAAa,EAAE,CAAC;QAC9C,IAAI,CAAC,qBAAqB,CAAC,SAAS,CAAC,CAAC;IACxC,CAAC;IAEO,qBAAqB,CAAC,KAAqB;QACjD,IAAI,CAAC,cAAc,GAAG,KAAK,CAAC;QAC5B,IAAI,CAAC,aAAa,CAChB,IAAI,WAAW,CAAC,yBAAyB,EAAE;YACzC,MAAM,EAAE,EAAE,KAAK,EAAE;YACjB,OAAO,EAAE,IAAI;YACb,QAAQ,EAAE,IAAI;SACf,CAAC,CACH,CAAC;IACJ,CAAC;CACF","sourcesContent":["import { getAudioDevices, getMediaStream } from './utils.js';\nimport { AudioService } from './audioService.js';\nimport { DictationService } from './DictationService.js';\nimport type { DictationConfig, RecordingState, ServerConfig } from './types.js';\n\nexport class RecorderManager extends EventTarget {\n public devices: MediaDeviceInfo[] = [];\n\n public selectedDevice: MediaDeviceInfo | undefined;\n\n public recordingState: RecordingState = 'stopped';\n\n private _mediaStream: MediaStream | null = null;\n\n private _audioService: AudioService | null = null;\n\n private _dictationService: DictationService | null = null;\n\n private _visualiserInterval?: number;\n\n constructor() {\n super();\n navigator.mediaDevices.addEventListener(\n 'devicechange',\n this.handleDevicesChange.bind(this),\n );\n }\n\n async initialize() {\n const deviceResponse = await getAudioDevices();\n this.devices = deviceResponse.devices;\n this.selectedDevice = deviceResponse.defaultDevice;\n return { devices: this.devices, selectedDevice: this.selectedDevice };\n }\n\n private dispatchCustomEvent(eventName: string, detail?: unknown): void {\n this.dispatchEvent(\n new CustomEvent(eventName, {\n detail,\n bubbles: true,\n composed: true,\n }),\n );\n }\n\n private async handleDevicesChange() {\n const deviceResponse = await getAudioDevices();\n this.devices = deviceResponse.devices;\n if (\n !this.devices.find(\n device => device.deviceId === this.selectedDevice?.deviceId,\n )\n ) {\n this.selectedDevice = deviceResponse.defaultDevice;\n }\n this.dispatchCustomEvent('recording-devices-changed', {\n devices: deviceResponse.devices,\n selectedDevice: this.selectedDevice || deviceResponse.defaultDevice,\n });\n }\n\n async startRecording(params: {\n dictationConfig: DictationConfig;\n serverConfig: ServerConfig;\n debug_displayAudio?: boolean;\n }): Promise<void> {\n this._updateRecordingState('initializing');\n\n try {\n this._mediaStream = await getMediaStream(\n params.debug_displayAudio\n ? 'display_audio'\n : this.selectedDevice?.deviceId,\n );\n\n this._mediaStream.getTracks().forEach((track: MediaStreamTrack) => {\n track.addEventListener('ended', () => {\n if (this.recordingState === 'recording') {\n this.dispatchCustomEvent('error', {\n message: 'Microphone access was lost.',\n });\n this.stopRecording();\n }\n });\n });\n\n this._audioService = new AudioService(this._mediaStream);\n } catch (error) {\n this.dispatchCustomEvent('error', error);\n this.stopRecording();\n return;\n }\n\n // Initialize dictation service.\n try {\n this._dictationService = new DictationService(this._mediaStream, params);\n\n // Forward custom events from dictation service\n this._dictationService.addEventListener('error', e => {\n this.dispatchEvent(\n new CustomEvent('error', {\n detail: (e as CustomEvent).detail,\n bubbles: true,\n composed: true,\n }),\n );\n this.stopRecording();\n });\n this._dictationService.addEventListener('stream-closed', () =>\n this.stopRecording(),\n );\n this._dictationService.addEventListener('transcript', e =>\n this.dispatchEvent(\n new CustomEvent('transcript', {\n detail: (e as CustomEvent).detail,\n bubbles: true,\n composed: true,\n }),\n ),\n );\n this._dictationService.addEventListener('command', e =>\n this.dispatchEvent(\n new CustomEvent('command', {\n detail: (e as CustomEvent).detail,\n bubbles: true,\n composed: true,\n }),\n ),\n );\n } catch (error) {\n this.dispatchCustomEvent('error', error);\n this.stopRecording();\n return;\n }\n\n try {\n this._dictationService?.startRecording();\n } catch (error) {\n this.dispatchEvent(\n new CustomEvent('error', {\n detail: error,\n bubbles: true,\n composed: true,\n }),\n );\n this.stopRecording();\n return;\n }\n this._updateRecordingState('recording');\n\n // Update audio level visualization.\n this._visualiserInterval = window.setInterval(() => {\n const level = this._audioService\n ? this._audioService.getAudioLevel() * 3\n : 0;\n this.dispatchCustomEvent('audio-level-changed', { audioLevel: level });\n }, 150);\n }\n\n async stopRecording() {\n this._updateRecordingState('stopping');\n if (this._visualiserInterval) {\n clearInterval(this._visualiserInterval);\n this._visualiserInterval = undefined;\n }\n if (this._mediaStream) {\n this._mediaStream.getTracks().forEach(track => track.stop());\n }\n this.dispatchCustomEvent('audio-level-changed', { audioLevel: 0 });\n await this._dictationService?.stopRecording();\n this._updateRecordingState('stopped');\n }\n\n private _updateRecordingState(state: RecordingState) {\n this.recordingState = state;\n this.dispatchEvent(\n new CustomEvent('recording-state-changed', {\n detail: { state },\n bubbles: true,\n composed: true,\n }),\n );\n }\n}\n"]}
|
package/dist/bundle.js
CHANGED
|
@@ -633,7 +633,7 @@ async function getAudioDevices() {
|
|
|
633
633
|
function decodeToken(token) {
|
|
634
634
|
const parts = token.split(".");
|
|
635
635
|
if (parts.length < 2) {
|
|
636
|
-
throw new Error("Invalid token format
|
|
636
|
+
throw new Error("Invalid token format");
|
|
637
637
|
}
|
|
638
638
|
const base64Url = parts[1];
|
|
639
639
|
const base64 = base64Url.replace(/-/g, "+").replace(/_/g, "/");
|
|
@@ -659,10 +659,29 @@ function decodeToken(token) {
|
|
|
659
659
|
return {
|
|
660
660
|
environment: match[2],
|
|
661
661
|
tenant: match[3],
|
|
662
|
-
token
|
|
662
|
+
accessToken: token
|
|
663
663
|
};
|
|
664
664
|
}
|
|
665
665
|
}
|
|
666
|
+
async function getMediaStream(deviceId) {
|
|
667
|
+
if (!deviceId) {
|
|
668
|
+
throw new Error("No device ID provided");
|
|
669
|
+
}
|
|
670
|
+
if (deviceId === "display_audio") {
|
|
671
|
+
const stream = await navigator.mediaDevices.getDisplayMedia({
|
|
672
|
+
audio: true,
|
|
673
|
+
video: true
|
|
674
|
+
});
|
|
675
|
+
stream.getTracks().forEach((track) => {
|
|
676
|
+
if (track.kind === "video") {
|
|
677
|
+
stream.removeTrack(track);
|
|
678
|
+
}
|
|
679
|
+
});
|
|
680
|
+
return stream;
|
|
681
|
+
}
|
|
682
|
+
const constraints = deviceId !== "default" ? { audio: { deviceId: { exact: deviceId } } } : { audio: true };
|
|
683
|
+
return await navigator.mediaDevices.getUserMedia(constraints);
|
|
684
|
+
}
|
|
666
685
|
|
|
667
686
|
// dist/audioService.js
|
|
668
687
|
var AudioService = class {
|
|
@@ -688,16 +707,11 @@ var AudioService = class {
|
|
|
688
707
|
|
|
689
708
|
// dist/DictationService.js
|
|
690
709
|
var DictationService = class extends EventTarget {
|
|
691
|
-
constructor(mediaStream, { dictationConfig,
|
|
710
|
+
constructor(mediaStream, { dictationConfig, serverConfig }) {
|
|
692
711
|
super();
|
|
693
712
|
this.mediaRecorder = new MediaRecorder(mediaStream);
|
|
694
|
-
this.
|
|
713
|
+
this.serverConfig = serverConfig;
|
|
695
714
|
this.dictationConfig = dictationConfig;
|
|
696
|
-
const config = decodeToken(this.authToken);
|
|
697
|
-
if (!config) {
|
|
698
|
-
throw new Error("Invalid token");
|
|
699
|
-
}
|
|
700
|
-
this.serverConfig = config;
|
|
701
715
|
this.mediaRecorder.ondataavailable = (event) => {
|
|
702
716
|
if (this.webSocket?.readyState === WebSocket.OPEN) {
|
|
703
717
|
this.webSocket.send(event.data);
|
|
@@ -712,7 +726,15 @@ var DictationService = class extends EventTarget {
|
|
|
712
726
|
}));
|
|
713
727
|
}
|
|
714
728
|
startRecording() {
|
|
715
|
-
|
|
729
|
+
if (!this.serverConfig) {
|
|
730
|
+
this.dispatchEvent(new CustomEvent("error", {
|
|
731
|
+
detail: "Invalid token",
|
|
732
|
+
bubbles: true,
|
|
733
|
+
composed: true
|
|
734
|
+
}));
|
|
735
|
+
return;
|
|
736
|
+
}
|
|
737
|
+
const url = `wss://api.${this.serverConfig.environment}.corti.app/audio-bridge/v2/transcribe?tenant-name=${this.serverConfig.tenant}&token=Bearer%20${this.serverConfig.accessToken}`;
|
|
716
738
|
this.webSocket = new WebSocket(url);
|
|
717
739
|
this.webSocket.onopen = () => {
|
|
718
740
|
this.webSocket.send(JSON.stringify({
|
|
@@ -722,10 +744,22 @@ var DictationService = class extends EventTarget {
|
|
|
722
744
|
};
|
|
723
745
|
this.webSocket.onmessage = (event) => {
|
|
724
746
|
const message = JSON.parse(event.data);
|
|
725
|
-
|
|
726
|
-
|
|
727
|
-
|
|
728
|
-
|
|
747
|
+
switch (message.type) {
|
|
748
|
+
case "CONFIG_ACCEPTED":
|
|
749
|
+
this.mediaRecorder.start(250);
|
|
750
|
+
break;
|
|
751
|
+
case "CONFIG_DENIED":
|
|
752
|
+
this.dispatchCustomEvent("error", message);
|
|
753
|
+
return this.stopRecording();
|
|
754
|
+
case "transcript":
|
|
755
|
+
this.dispatchCustomEvent("transcript", message);
|
|
756
|
+
break;
|
|
757
|
+
case "command":
|
|
758
|
+
this.dispatchCustomEvent("command", message);
|
|
759
|
+
break;
|
|
760
|
+
default:
|
|
761
|
+
console.warn(`Unhandled message type: ${message.type}`);
|
|
762
|
+
break;
|
|
729
763
|
}
|
|
730
764
|
};
|
|
731
765
|
this.webSocket.onerror = (event) => {
|
|
@@ -736,7 +770,7 @@ var DictationService = class extends EventTarget {
|
|
|
736
770
|
};
|
|
737
771
|
}
|
|
738
772
|
async stopRecording() {
|
|
739
|
-
this.mediaRecorder
|
|
773
|
+
this.mediaRecorder?.stop();
|
|
740
774
|
if (this.webSocket?.readyState === WebSocket.OPEN) {
|
|
741
775
|
this.webSocket.send(JSON.stringify({ type: "end" }));
|
|
742
776
|
}
|
|
@@ -789,9 +823,8 @@ var RecorderManager = class extends EventTarget {
|
|
|
789
823
|
}
|
|
790
824
|
async startRecording(params) {
|
|
791
825
|
this._updateRecordingState("initializing");
|
|
792
|
-
const constraints = this.selectedDevice?.deviceId === "default" ? { audio: true } : { audio: { deviceId: this.selectedDevice?.deviceId } };
|
|
793
826
|
try {
|
|
794
|
-
this._mediaStream = await
|
|
827
|
+
this._mediaStream = await getMediaStream(params.debug_displayAudio ? "display_audio" : this.selectedDevice?.deviceId);
|
|
795
828
|
this._mediaStream.getTracks().forEach((track) => {
|
|
796
829
|
track.addEventListener("ended", () => {
|
|
797
830
|
if (this.recordingState === "recording") {
|
|
@@ -805,20 +838,46 @@ var RecorderManager = class extends EventTarget {
|
|
|
805
838
|
this._audioService = new AudioService(this._mediaStream);
|
|
806
839
|
} catch (error) {
|
|
807
840
|
this.dispatchCustomEvent("error", error);
|
|
808
|
-
this.
|
|
841
|
+
this.stopRecording();
|
|
809
842
|
return;
|
|
810
843
|
}
|
|
811
844
|
try {
|
|
812
845
|
this._dictationService = new DictationService(this._mediaStream, params);
|
|
846
|
+
this._dictationService.addEventListener("error", (e5) => {
|
|
847
|
+
this.dispatchEvent(new CustomEvent("error", {
|
|
848
|
+
detail: e5.detail,
|
|
849
|
+
bubbles: true,
|
|
850
|
+
composed: true
|
|
851
|
+
}));
|
|
852
|
+
this.stopRecording();
|
|
853
|
+
});
|
|
854
|
+
this._dictationService.addEventListener("stream-closed", () => this.stopRecording());
|
|
855
|
+
this._dictationService.addEventListener("transcript", (e5) => this.dispatchEvent(new CustomEvent("transcript", {
|
|
856
|
+
detail: e5.detail,
|
|
857
|
+
bubbles: true,
|
|
858
|
+
composed: true
|
|
859
|
+
})));
|
|
860
|
+
this._dictationService.addEventListener("command", (e5) => this.dispatchEvent(new CustomEvent("command", {
|
|
861
|
+
detail: e5.detail,
|
|
862
|
+
bubbles: true,
|
|
863
|
+
composed: true
|
|
864
|
+
})));
|
|
813
865
|
} catch (error) {
|
|
814
866
|
this.dispatchCustomEvent("error", error);
|
|
815
867
|
this.stopRecording();
|
|
816
868
|
return;
|
|
817
869
|
}
|
|
818
|
-
|
|
819
|
-
|
|
820
|
-
|
|
821
|
-
|
|
870
|
+
try {
|
|
871
|
+
this._dictationService?.startRecording();
|
|
872
|
+
} catch (error) {
|
|
873
|
+
this.dispatchEvent(new CustomEvent("error", {
|
|
874
|
+
detail: error,
|
|
875
|
+
bubbles: true,
|
|
876
|
+
composed: true
|
|
877
|
+
}));
|
|
878
|
+
this.stopRecording();
|
|
879
|
+
return;
|
|
880
|
+
}
|
|
822
881
|
this._updateRecordingState("recording");
|
|
823
882
|
this._visualiserInterval = window.setInterval(() => {
|
|
824
883
|
const level = this._audioService ? this._audioService.getAudioLevel() * 3 : 0;
|
|
@@ -833,7 +892,6 @@ var RecorderManager = class extends EventTarget {
|
|
|
833
892
|
}
|
|
834
893
|
if (this._mediaStream) {
|
|
835
894
|
this._mediaStream.getTracks().forEach((track) => track.stop());
|
|
836
|
-
this._mediaStream = null;
|
|
837
895
|
}
|
|
838
896
|
this.dispatchCustomEvent("audio-level-changed", { audioLevel: 0 });
|
|
839
897
|
await this._dictationService?.stopRecording();
|
|
@@ -949,33 +1007,33 @@ var DEFAULT_DICTATION_CONFIG = {
|
|
|
949
1007
|
primaryLanguage: "en",
|
|
950
1008
|
interimResults: true,
|
|
951
1009
|
spokenPunctuation: true,
|
|
952
|
-
automaticPunctuation:
|
|
1010
|
+
automaticPunctuation: true,
|
|
953
1011
|
model: "others"
|
|
954
1012
|
};
|
|
955
1013
|
|
|
956
1014
|
// dist/styles/callout.js
|
|
957
1015
|
var CalloutStyles = i`
|
|
958
1016
|
.callout {
|
|
959
|
-
background: var(--callout-
|
|
960
|
-
border: 1px solid var(--callout-
|
|
961
|
-
color: var(--callout-
|
|
1017
|
+
background: var(--callout-info-background);
|
|
1018
|
+
border: 1px solid var(--callout-info-border);
|
|
1019
|
+
color: var(--callout-info-text);
|
|
962
1020
|
padding: 8px;
|
|
963
1021
|
border-radius: var(--card-inner-border-radius);
|
|
964
1022
|
display: flex;
|
|
965
1023
|
font-size: 0.9rem;
|
|
966
1024
|
gap: 8px;
|
|
967
|
-
align-items:
|
|
1025
|
+
align-items: center;
|
|
968
1026
|
max-width: 100%;
|
|
969
1027
|
height: fit-content;
|
|
970
|
-
&.
|
|
971
|
-
background: var(--callout-
|
|
972
|
-
border: 1px solid var(--callout-
|
|
973
|
-
color: var(--callout-
|
|
1028
|
+
&.error {
|
|
1029
|
+
background: var(--callout-error-background);
|
|
1030
|
+
border: 1px solid var(--callout-error-border);
|
|
1031
|
+
color: var(--callout-warn-text);
|
|
974
1032
|
}
|
|
975
|
-
&.
|
|
976
|
-
background: var(--callout-
|
|
977
|
-
border: 1px solid var(--callout-
|
|
978
|
-
color: var(--callout-
|
|
1033
|
+
&.warn {
|
|
1034
|
+
background: var(--callout-warn-background);
|
|
1035
|
+
border: 1px solid var(--callout-warn-border);
|
|
1036
|
+
color: var(--callout-warn-text);
|
|
979
1037
|
}
|
|
980
1038
|
&.small {
|
|
981
1039
|
width: 100%;
|
|
@@ -1035,7 +1093,7 @@ var SettingsMenu = class SettingsMenu2 extends r4 {
|
|
|
1035
1093
|
<div id="settings-popover" popover>
|
|
1036
1094
|
<div class="settings-wrapper">
|
|
1037
1095
|
${this.settingsDisabled ? x`
|
|
1038
|
-
<div class="callout
|
|
1096
|
+
<div class="callout warn">
|
|
1039
1097
|
Recording is in progress. Stop recording to change settings.
|
|
1040
1098
|
</div>
|
|
1041
1099
|
` : ""}
|
|
@@ -1112,10 +1170,9 @@ SettingsMenu.styles = [
|
|
|
1112
1170
|
width: 100%;
|
|
1113
1171
|
min-width: 200px;
|
|
1114
1172
|
position-anchor: --settings_popover_btn;
|
|
1115
|
-
position-area: bottom;
|
|
1173
|
+
position-area: bottom span-right;
|
|
1116
1174
|
position-visibility: always;
|
|
1117
|
-
|
|
1118
|
-
transform: translateX(40%);
|
|
1175
|
+
position-try-fallbacks: flip-inline;
|
|
1119
1176
|
overflow-x: hidden;
|
|
1120
1177
|
}
|
|
1121
1178
|
.settings-wrapper {
|
|
@@ -1360,69 +1417,48 @@ IconLoadingSpinner = __decorate3([
|
|
|
1360
1417
|
// dist/styles/theme.js
|
|
1361
1418
|
var ThemeStyles = i`
|
|
1362
1419
|
:host {
|
|
1420
|
+
color-scheme: light dark;
|
|
1363
1421
|
/* Component Defaults */
|
|
1364
1422
|
--component-font-family: 'Segoe UI', Roboto, sans-serif;
|
|
1365
|
-
--component-text-color: #333;
|
|
1423
|
+
--component-text-color: light-dark(#333, #eee);
|
|
1366
1424
|
|
|
1367
1425
|
/* Card Defaults */
|
|
1368
|
-
--card-background: #fff;
|
|
1369
|
-
--card-border-color: #ddd;
|
|
1426
|
+
--card-background: light-dark(#fff, #333);
|
|
1427
|
+
--card-border-color: light-dark(#ddd, #555);
|
|
1370
1428
|
--card-padding: 4px;
|
|
1371
1429
|
--card-border-radius: 8px;
|
|
1372
1430
|
--card-inner-border-radius: 6px;
|
|
1373
1431
|
--card-box-shadow: 0 2px 5px rgba(0, 0, 0, 0.1);
|
|
1374
1432
|
|
|
1375
1433
|
/* Actions Defaults */
|
|
1376
|
-
--action-plain-border-color: #ccc;
|
|
1377
|
-
--action-plain-background-hover: #ddd;
|
|
1434
|
+
--action-plain-border-color: light-dark(#ccc, #555);
|
|
1435
|
+
--action-plain-background-hover: light-dark(#ddd, #444);
|
|
1378
1436
|
|
|
1379
|
-
--action-accent-background: #007bff;
|
|
1380
|
-
--action-accent-background-hover: #0056b3;
|
|
1437
|
+
--action-accent-background: light-dark(#007bff, #0056b3);
|
|
1438
|
+
--action-accent-background-hover: light-dark(#0056b3, #003d80);
|
|
1381
1439
|
--action-accent-text-color: #fff;
|
|
1382
1440
|
|
|
1383
|
-
--action-red-background: #dc3545;
|
|
1384
|
-
--action-red-background-hover: #bd2130;
|
|
1441
|
+
--action-red-background: light-dark(#dc3545, #bd2130);
|
|
1442
|
+
--action-red-background-hover: light-dark(#bd2130, #a71c24);
|
|
1385
1443
|
--action-red-text-color: #fff;
|
|
1386
1444
|
|
|
1387
1445
|
/* Callout Defaults */
|
|
1388
|
-
--callout-
|
|
1389
|
-
--callout-
|
|
1390
|
-
--callout-
|
|
1446
|
+
--callout-info-background: light-dark(#007bff33, #0056b333);
|
|
1447
|
+
--callout-info-border: light-dark(#007bff99, #0056b399);
|
|
1448
|
+
--callout-info-text: light-dark(#007bff, #0056b3);
|
|
1391
1449
|
|
|
1392
|
-
--callout-
|
|
1393
|
-
--callout-
|
|
1394
|
-
--callout-
|
|
1450
|
+
--callout-error-background: light-dark(#dc354533, #bd213033);
|
|
1451
|
+
--callout-error-border: light-dark(#dc354599, #bd213099);
|
|
1452
|
+
--callout-error-text: light-dark(#dc3545, #bd2130);
|
|
1395
1453
|
|
|
1396
|
-
--callout-
|
|
1397
|
-
--callout-
|
|
1398
|
-
--callout-
|
|
1454
|
+
--callout-warn-background: light-dark(#fd7e1433, #e06c1233);
|
|
1455
|
+
--callout-warn-border: light-dark(#fd7e1499, #e06c1299);
|
|
1456
|
+
--callout-warn-text: light-dark(#fd7e14, #e06c12);
|
|
1399
1457
|
|
|
1400
1458
|
/* Visualiser Defaults */
|
|
1401
|
-
--visualiser-background: #e0e0e0;
|
|
1402
|
-
--visualiser-level-color: #28a745;
|
|
1459
|
+
--visualiser-background: light-dark(#e0e0e0, #fff);
|
|
1403
1460
|
}
|
|
1404
1461
|
|
|
1405
|
-
@media (prefers-color-scheme: dark) {
|
|
1406
|
-
:host {
|
|
1407
|
-
/* Component Dark */
|
|
1408
|
-
--component-text-color: #eee;
|
|
1409
|
-
|
|
1410
|
-
/* Card Dark */
|
|
1411
|
-
--card-background: #333;
|
|
1412
|
-
--card-border-color: #555;
|
|
1413
|
-
|
|
1414
|
-
/* Actions Dark */
|
|
1415
|
-
--action-plain-border-color: #555;
|
|
1416
|
-
--action-plain-background: #333;
|
|
1417
|
-
--action-plain-background-hover: #444;
|
|
1418
|
-
|
|
1419
|
-
--action-accent-background: #0056b3;
|
|
1420
|
-
--action-accent-background-hover: #003d80;
|
|
1421
|
-
|
|
1422
|
-
/* Visualiser Dark */
|
|
1423
|
-
--visualiser-background: #fff;
|
|
1424
|
-
}
|
|
1425
|
-
}
|
|
1426
1462
|
:host {
|
|
1427
1463
|
box-sizing: border-box;
|
|
1428
1464
|
font-family: var(--component-font-family);
|
|
@@ -1495,6 +1531,7 @@ var CortiDictation = class extends r4 {
|
|
|
1495
1531
|
constructor() {
|
|
1496
1532
|
super(...arguments);
|
|
1497
1533
|
this.dictationConfig = DEFAULT_DICTATION_CONFIG;
|
|
1534
|
+
this.debug_displayAudio = false;
|
|
1498
1535
|
this._audioLevel = 0;
|
|
1499
1536
|
this._recordingState = "stopped";
|
|
1500
1537
|
this._devices = [];
|
|
@@ -1527,6 +1564,7 @@ var CortiDictation = class extends r4 {
|
|
|
1527
1564
|
"audio-level-changed",
|
|
1528
1565
|
"error",
|
|
1529
1566
|
"transcript",
|
|
1567
|
+
"command",
|
|
1530
1568
|
"ready"
|
|
1531
1569
|
];
|
|
1532
1570
|
eventsToRelay.forEach((eventName) => {
|
|
@@ -1546,6 +1584,14 @@ var CortiDictation = class extends r4 {
|
|
|
1546
1584
|
toggleRecording() {
|
|
1547
1585
|
this._toggleRecording();
|
|
1548
1586
|
}
|
|
1587
|
+
setAccessToken(token) {
|
|
1588
|
+
const decoded = decodeToken(token);
|
|
1589
|
+
if (!decoded) {
|
|
1590
|
+
throw new Error("Invalid token");
|
|
1591
|
+
}
|
|
1592
|
+
this._serverConfig = decoded;
|
|
1593
|
+
return decoded;
|
|
1594
|
+
}
|
|
1549
1595
|
get selectedDevice() {
|
|
1550
1596
|
return this.recorderManager.selectedDevice || null;
|
|
1551
1597
|
}
|
|
@@ -1558,25 +1604,26 @@ var CortiDictation = class extends r4 {
|
|
|
1558
1604
|
async setRecordingDevice(device) {
|
|
1559
1605
|
this.recorderManager.selectedDevice = device;
|
|
1560
1606
|
this._selectedDevice = device;
|
|
1561
|
-
if (!this.
|
|
1607
|
+
if (!this._serverConfig)
|
|
1562
1608
|
return;
|
|
1563
1609
|
if (this._recordingState === "recording") {
|
|
1564
1610
|
await this.recorderManager.stopRecording();
|
|
1565
1611
|
await this.recorderManager.startRecording({
|
|
1566
1612
|
dictationConfig: this.dictationConfig,
|
|
1567
|
-
|
|
1613
|
+
serverConfig: this._serverConfig
|
|
1568
1614
|
});
|
|
1569
1615
|
}
|
|
1570
1616
|
}
|
|
1571
1617
|
_toggleRecording() {
|
|
1572
|
-
if (!this.
|
|
1618
|
+
if (!this._serverConfig)
|
|
1573
1619
|
return;
|
|
1574
1620
|
if (this._recordingState === "recording") {
|
|
1575
1621
|
this.recorderManager.stopRecording();
|
|
1576
1622
|
} else if (this._recordingState === "stopped") {
|
|
1577
1623
|
this.recorderManager.startRecording({
|
|
1578
1624
|
dictationConfig: this.dictationConfig,
|
|
1579
|
-
|
|
1625
|
+
serverConfig: this._serverConfig,
|
|
1626
|
+
debug_displayAudio: this.debug_displayAudio
|
|
1580
1627
|
});
|
|
1581
1628
|
}
|
|
1582
1629
|
}
|
|
@@ -1586,16 +1633,6 @@ var CortiDictation = class extends r4 {
|
|
|
1586
1633
|
this.setRecordingDevice(customEvent.detail.selectedDevice);
|
|
1587
1634
|
}
|
|
1588
1635
|
render() {
|
|
1589
|
-
const isConfigured = this.authToken;
|
|
1590
|
-
if (!isConfigured) {
|
|
1591
|
-
return x`
|
|
1592
|
-
<div class="wrapper">
|
|
1593
|
-
<div class="callout red small">
|
|
1594
|
-
No Auth Token
|
|
1595
|
-
</div>
|
|
1596
|
-
</div>
|
|
1597
|
-
`;
|
|
1598
|
-
}
|
|
1599
1636
|
const isLoading = this._recordingState === "initializing" || this._recordingState === "stopping";
|
|
1600
1637
|
const isRecording = this._recordingState === "recording";
|
|
1601
1638
|
return x`
|
|
@@ -1625,8 +1662,11 @@ __decorate4([
|
|
|
1625
1662
|
n4({ type: Object })
|
|
1626
1663
|
], CortiDictation.prototype, "dictationConfig", void 0);
|
|
1627
1664
|
__decorate4([
|
|
1628
|
-
n4({ type:
|
|
1629
|
-
], CortiDictation.prototype, "
|
|
1665
|
+
n4({ type: Boolean })
|
|
1666
|
+
], CortiDictation.prototype, "debug_displayAudio", void 0);
|
|
1667
|
+
__decorate4([
|
|
1668
|
+
r6()
|
|
1669
|
+
], CortiDictation.prototype, "_serverConfig", void 0);
|
|
1630
1670
|
__decorate4([
|
|
1631
1671
|
r6()
|
|
1632
1672
|
], CortiDictation.prototype, "_audioLevel", void 0);
|
|
@@ -56,7 +56,7 @@ let SettingsMenu = class SettingsMenu extends LitElement {
|
|
|
56
56
|
<div class="settings-wrapper">
|
|
57
57
|
${this.settingsDisabled
|
|
58
58
|
? html `
|
|
59
|
-
<div class="callout
|
|
59
|
+
<div class="callout warn">
|
|
60
60
|
Recording is in progress. Stop recording to change settings.
|
|
61
61
|
</div>
|
|
62
62
|
`
|
|
@@ -134,10 +134,9 @@ SettingsMenu.styles = [
|
|
|
134
134
|
width: 100%;
|
|
135
135
|
min-width: 200px;
|
|
136
136
|
position-anchor: --settings_popover_btn;
|
|
137
|
-
position-area: bottom;
|
|
137
|
+
position-area: bottom span-right;
|
|
138
138
|
position-visibility: always;
|
|
139
|
-
|
|
140
|
-
transform: translateX(40%);
|
|
139
|
+
position-try-fallbacks: flip-inline;
|
|
141
140
|
overflow-x: hidden;
|
|
142
141
|
}
|
|
143
142
|
.settings-wrapper {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"settings-menu.js","sourceRoot":"","sources":["../../src/components/settings-menu.ts"],"names":[],"mappings":";;;;;;AAAA,kBAAkB;AAClB,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,GAAG,EAAkC,MAAM,KAAK,CAAC;AAC5E,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAEnE,OAAO,YAAY,MAAM,sBAAsB,CAAC;AAChD,OAAO,YAAY,MAAM,qBAAqB,CAAC;AAC/C,OAAO,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AACtD,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC/D,OAAO,aAAa,MAAM,sBAAsB,CAAC;AAG1C,IAAM,YAAY,GAAlB,MAAM,YAAa,SAAQ,UAAU;IAa1C;QACE,KAAK,EAAE,CAAC;QATV,qBAAgB,GAAW,EAAE,CAAC;QAG9B,qBAAgB,GAAY,KAAK,CAAC;QAG1B,aAAQ,GAAsB,EAAE,CAAC;QAIvC,SAAS,CAAC,YAAY,CAAC,gBAAgB,CACrC,cAAc,EACd,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC,CACpC,CAAC;IACJ,CAAC;IAED,qCAAqC;IACrC,KAAK,CAAC,iBAAiB;QACrB,KAAK,CAAC,iBAAiB,EAAE,CAAC;QAC1B,MAAM,cAAc,GAAG,MAAM,eAAe,EAAE,CAAC;QAC/C,IAAI,CAAC,QAAQ,GAAG,cAAc,CAAC,OAAO,CAAC;IACzC,CAAC;IAEO,KAAK,CAAC,mBAAmB;QAC/B,MAAM,cAAc,GAAG,MAAM,eAAe,EAAE,CAAC;QAC/C,IAAI,CAAC,QAAQ,GAAG,cAAc,CAAC,OAAO,CAAC;IACzC,CAAC;
|
|
1
|
+
{"version":3,"file":"settings-menu.js","sourceRoot":"","sources":["../../src/components/settings-menu.ts"],"names":[],"mappings":"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","sourcesContent":["// mic-selector.ts\nimport { LitElement, html, css, TemplateResult, CSSResultGroup } from 'lit';\nimport { customElement, property, state } from 'lit/decorators.js';\n\nimport ButtonStyles from '../styles/buttons.js';\nimport SelectStyles from '../styles/select.js';\nimport { LANGUAGES_SUPPORTED } from '../constants.js';\nimport { getAudioDevices, getLanguageName } from '../utils.js';\nimport CalloutStyles from '../styles/callout.js';\n\n@customElement('settings-menu')\nexport class SettingsMenu extends LitElement {\n @property({ type: String })\n selectedDevice: MediaDeviceInfo | undefined;\n\n @property({ type: String })\n selectedLanguage: string = '';\n\n @property({ type: Boolean })\n settingsDisabled: boolean = false;\n\n @state()\n private _devices: MediaDeviceInfo[] = [];\n\n constructor() {\n super();\n navigator.mediaDevices.addEventListener(\n 'devicechange',\n this.handleDevicesChange.bind(this),\n );\n }\n\n // on load, get the available devices\n async connectedCallback(): Promise<void> {\n super.connectedCallback();\n const deviceResponse = await getAudioDevices();\n this._devices = deviceResponse.devices;\n }\n\n private async handleDevicesChange() {\n const deviceResponse = await getAudioDevices();\n this._devices = deviceResponse.devices;\n }\n\n static styles: CSSResultGroup = [\n css`\n :host {\n display: block;\n font-family: var(--component-font-family);\n }\n /* Retain the anchor-name styling for this component */\n #settings-popover-button {\n anchor-name: --settings_popover_btn;\n }\n [popover] {\n margin: 0;\n padding: 16px;\n border: 0;\n background: var(--card-background);\n border: 1px solid var(--card-border-color);\n border-radius: var(--card-border-radius);\n box-shadow: var(--card-box-shadow);\n z-index: 1000;\n max-width: 260px;\n width: 100%;\n min-width: 200px;\n position-anchor: --settings_popover_btn;\n position-area: bottom span-right;\n position-visibility: always;\n position-try-fallbacks: flip-inline;\n overflow-x: hidden;\n }\n .settings-wrapper {\n display: flex;\n flex-direction: column;\n gap: 20px;\n }\n `,\n ButtonStyles,\n SelectStyles,\n CalloutStyles,\n ];\n\n private _selectDevice(deviceId: string): void {\n // Find the device object\n const device = this._devices.find(d => d.deviceId === deviceId);\n if (!device) {\n return;\n }\n this.selectedDevice = device;\n this.dispatchEvent(\n new CustomEvent('recording-devices-changed', {\n detail: {\n devices: this._devices,\n selectedDevice: device,\n },\n bubbles: true,\n composed: true,\n }),\n );\n }\n\n render(): TemplateResult {\n return html`\n <div class=\"mic-selector\">\n <button id=\"settings-popover-button\" popovertarget=\"settings-popover\">\n <icon-settings></icon-settings>\n </button>\n <div id=\"settings-popover\" popover>\n <div class=\"settings-wrapper\">\n ${this.settingsDisabled\n ? html`\n <div class=\"callout warn\">\n Recording is in progress. Stop recording to change settings.\n </div>\n `\n : ''}\n <div class=\"form-group\">\n <label id=\"device-select-label\" for=\"device-select\">\n Recording Device\n </label>\n <select\n id=\"device-select\"\n aria-labelledby=\"device-select-label\"\n @change=${(e: Event) => {\n this._selectDevice((e.target as HTMLSelectElement).value);\n }}\n ?disabled=${this.settingsDisabled}\n >\n ${this._devices.map(\n device => html`\n <option\n value=${device.deviceId}\n ?selected=${this.selectedDevice === device}\n >\n ${device.label || 'Unknown Device'}\n </option>\n `,\n )}\n </select>\n </div>\n <div class=\"form-group\">\n <label id=\"language-select-label\" for=\"language-select\">\n Dictation Language\n </label>\n <select\n id=\"language-select\"\n aria-labelledby=\"language-select-label\"\n @change=${(e: Event) => {\n this._selectDevice((e.target as HTMLSelectElement).value);\n }}\n ?disabled=${this.settingsDisabled}\n >\n ${LANGUAGES_SUPPORTED.map(\n language => html`\n <option\n value=${language}\n ?selected=${this.selectedLanguage === language}\n >\n ${getLanguageName(language)}\n </option>\n `,\n )}\n </select>\n </div>\n </div>\n </div>\n </div>\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'settings-menu': SettingsMenu;\n }\n}\n"]}
|
package/dist/constants.js
CHANGED
package/dist/constants.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;AAChD,MAAM,CAAC,MAAM,wBAAwB,GAAoB;IACvD,eAAe,EAAE,IAAI;IACrB,cAAc,EAAE,IAAI;IACpB,iBAAiB,EAAE,IAAI;IACvB,oBAAoB,EAAE,
|
|
1
|
+
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;AAChD,MAAM,CAAC,MAAM,wBAAwB,GAAoB;IACvD,eAAe,EAAE,IAAI;IACrB,cAAc,EAAE,IAAI;IACpB,iBAAiB,EAAE,IAAI;IACvB,oBAAoB,EAAE,IAAI;IAC1B,KAAK,EAAE,QAAQ;CAChB,CAAC","sourcesContent":["import { DictationConfig } from './types.js';\n\nexport const LANGUAGES_SUPPORTED = ['en', 'da'];\nexport const DEFAULT_DICTATION_CONFIG: DictationConfig = {\n primaryLanguage: 'en',\n interimResults: true,\n spokenPunctuation: true,\n automaticPunctuation: true,\n model: 'others',\n};\n"]}
|
package/dist/styles/callout.js
CHANGED
|
@@ -1,26 +1,26 @@
|
|
|
1
1
|
import { css } from 'lit';
|
|
2
2
|
const CalloutStyles = css `
|
|
3
3
|
.callout {
|
|
4
|
-
background: var(--callout-
|
|
5
|
-
border: 1px solid var(--callout-
|
|
6
|
-
color: var(--callout-
|
|
4
|
+
background: var(--callout-info-background);
|
|
5
|
+
border: 1px solid var(--callout-info-border);
|
|
6
|
+
color: var(--callout-info-text);
|
|
7
7
|
padding: 8px;
|
|
8
8
|
border-radius: var(--card-inner-border-radius);
|
|
9
9
|
display: flex;
|
|
10
10
|
font-size: 0.9rem;
|
|
11
11
|
gap: 8px;
|
|
12
|
-
align-items:
|
|
12
|
+
align-items: center;
|
|
13
13
|
max-width: 100%;
|
|
14
14
|
height: fit-content;
|
|
15
|
-
&.
|
|
16
|
-
background: var(--callout-
|
|
17
|
-
border: 1px solid var(--callout-
|
|
18
|
-
color: var(--callout-
|
|
15
|
+
&.error {
|
|
16
|
+
background: var(--callout-error-background);
|
|
17
|
+
border: 1px solid var(--callout-error-border);
|
|
18
|
+
color: var(--callout-warn-text);
|
|
19
19
|
}
|
|
20
|
-
&.
|
|
21
|
-
background: var(--callout-
|
|
22
|
-
border: 1px solid var(--callout-
|
|
23
|
-
color: var(--callout-
|
|
20
|
+
&.warn {
|
|
21
|
+
background: var(--callout-warn-background);
|
|
22
|
+
border: 1px solid var(--callout-warn-border);
|
|
23
|
+
color: var(--callout-warn-text);
|
|
24
24
|
}
|
|
25
25
|
&.small {
|
|
26
26
|
width: 100%;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"callout.js","sourceRoot":"","sources":["../../src/styles/callout.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,KAAK,CAAC;AAE1B,MAAM,aAAa,GAAG,GAAG,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA6BxB,CAAC;AAEF,eAAe,aAAa,CAAC","sourcesContent":["import { css } from 'lit';\n\nconst CalloutStyles = css`\n .callout {\n background: var(--callout-
|
|
1
|
+
{"version":3,"file":"callout.js","sourceRoot":"","sources":["../../src/styles/callout.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,KAAK,CAAC;AAE1B,MAAM,aAAa,GAAG,GAAG,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA6BxB,CAAC;AAEF,eAAe,aAAa,CAAC","sourcesContent":["import { css } from 'lit';\n\nconst CalloutStyles = css`\n .callout {\n background: var(--callout-info-background);\n border: 1px solid var(--callout-info-border);\n color: var(--callout-info-text);\n padding: 8px;\n border-radius: var(--card-inner-border-radius);\n display: flex;\n font-size: 0.9rem;\n gap: 8px;\n align-items: center;\n max-width: 100%;\n height: fit-content;\n &.error {\n background: var(--callout-error-background);\n border: 1px solid var(--callout-error-border);\n color: var(--callout-warn-text);\n }\n &.warn {\n background: var(--callout-warn-background);\n border: 1px solid var(--callout-warn-border);\n color: var(--callout-warn-text);\n }\n &.small {\n width: 100%;\n padding: 6px;\n font-size: 0.7rem;\n }\n }\n`;\n\nexport default CalloutStyles;\n"]}
|