@corti/dictation-web 0.4.0-rc.2 → 0.5.0-rc
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 +53 -3
- package/dist/bundle.js +795 -152
- package/dist/components/corti-dictation.d.ts +15 -1
- package/dist/components/corti-dictation.js +35 -0
- package/dist/components/corti-dictation.js.map +1 -1
- package/dist/components/device-selector.d.ts +1 -1
- package/dist/components/keybinding-selector.d.ts +14 -0
- package/dist/components/keybinding-selector.js +82 -0
- package/dist/components/keybinding-selector.js.map +1 -0
- package/dist/components/language-selector.d.ts +1 -1
- package/dist/components/mode-selector.d.ts +14 -0
- package/dist/components/mode-selector.js +73 -0
- package/dist/components/mode-selector.js.map +1 -0
- package/dist/components/recording-button.d.ts +5 -2
- package/dist/components/recording-button.js +83 -17
- package/dist/components/recording-button.js.map +1 -1
- package/dist/components/settings-menu.d.ts +2 -0
- package/dist/components/settings-menu.js +20 -0
- package/dist/components/settings-menu.js.map +1 -1
- package/dist/contexts/dictation-context.d.ts +9 -1
- package/dist/contexts/dictation-context.js +35 -2
- package/dist/contexts/dictation-context.js.map +1 -1
- package/dist/controllers/dictation-controller.d.ts +2 -1
- package/dist/controllers/dictation-controller.js +53 -19
- package/dist/controllers/dictation-controller.js.map +1 -1
- package/dist/controllers/keybinding-controller.d.ts +18 -0
- package/dist/controllers/keybinding-controller.js +86 -0
- package/dist/controllers/keybinding-controller.js.map +1 -0
- package/dist/index.d.ts +4 -2
- package/dist/index.js +10 -0
- package/dist/index.js.map +1 -1
- package/dist/package.json +87 -7
- package/dist/styles/component-styles.d.ts +1 -0
- package/dist/styles/component-styles.js +10 -0
- package/dist/styles/component-styles.js.map +1 -1
- package/dist/styles/keybinding-selector.d.ts +2 -0
- package/dist/styles/keybinding-selector.js +72 -0
- package/dist/styles/keybinding-selector.js.map +1 -0
- package/dist/styles/mode-selector.d.ts +2 -0
- package/dist/styles/mode-selector.js +56 -0
- package/dist/styles/mode-selector.js.map +1 -0
- package/dist/styles/select.d.ts +1 -1
- package/dist/styles/select.js +6 -10
- package/dist/styles/select.js.map +1 -1
- package/dist/styles/settings-menu.js +9 -1
- package/dist/styles/settings-menu.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -0
- package/dist/types.d.ts +3 -1
- package/dist/types.js.map +1 -1
- package/dist/utils/events.d.ts +14 -1
- package/dist/utils/events.js +22 -0
- package/dist/utils/events.js.map +1 -1
- package/dist/utils/keybinding.d.ts +36 -0
- package/dist/utils/keybinding.js +125 -0
- package/dist/utils/keybinding.js.map +1 -0
- package/package.json +2 -2
- package/dist/CortiDictation.d.ts +0 -55
- package/dist/CortiDictation.js +0 -303
- package/dist/CortiDictation.js.map +0 -1
- package/dist/DictationService.d.ts +0 -16
- package/dist/DictationService.js +0 -88
- package/dist/DictationService.js.map +0 -1
- package/dist/RecorderManager.d.ts +0 -25
- package/dist/RecorderManager.js +0 -145
- package/dist/RecorderManager.js.map +0 -1
- package/dist/audioService.d.ts +0 -6
- package/dist/audioService.js +0 -21
- package/dist/audioService.js.map +0 -1
- package/dist/controllers/DictationController.d.ts +0 -35
- package/dist/controllers/DictationController.js +0 -130
- package/dist/controllers/DictationController.js.map +0 -1
- package/dist/controllers/MediaController.d.ts +0 -31
- package/dist/controllers/MediaController.js +0 -99
- package/dist/controllers/MediaController.js.map +0 -1
- package/dist/src/components/audio-visualiser.d.ts +0 -14
- package/dist/src/components/audio-visualiser.js +0 -57
- package/dist/src/components/audio-visualiser.js.map +0 -1
- package/dist/src/components/corti-dictation.d.ts +0 -123
- package/dist/src/components/corti-dictation.js +0 -224
- package/dist/src/components/corti-dictation.js.map +0 -1
- package/dist/src/components/device-selector.d.ts +0 -24
- package/dist/src/components/device-selector.js +0 -106
- package/dist/src/components/device-selector.js.map +0 -1
- package/dist/src/components/language-selector.d.ts +0 -24
- package/dist/src/components/language-selector.js +0 -100
- package/dist/src/components/language-selector.js.map +0 -1
- package/dist/src/components/recording-button.d.ts +0 -37
- package/dist/src/components/recording-button.js +0 -203
- package/dist/src/components/recording-button.js.map +0 -1
- package/dist/src/components/settings-menu.d.ts +0 -16
- package/dist/src/components/settings-menu.js +0 -80
- package/dist/src/components/settings-menu.js.map +0 -1
- package/dist/src/constants.d.ts +0 -4
- package/dist/src/constants.js +0 -37
- package/dist/src/constants.js.map +0 -1
- package/dist/src/contexts/dictation-context.d.ts +0 -97
- package/dist/src/contexts/dictation-context.js +0 -208
- package/dist/src/contexts/dictation-context.js.map +0 -1
- package/dist/src/controllers/DictationController.d.ts +0 -35
- package/dist/src/controllers/DictationController.js +0 -130
- package/dist/src/controllers/DictationController.js.map +0 -1
- package/dist/src/controllers/MediaController.d.ts +0 -31
- package/dist/src/controllers/MediaController.js +0 -99
- package/dist/src/controllers/MediaController.js.map +0 -1
- package/dist/src/icons/icons.d.ts +0 -17
- package/dist/src/icons/icons.js +0 -158
- package/dist/src/icons/icons.js.map +0 -1
- package/dist/src/styles/ComponentStyles.d.ts +0 -2
- package/dist/src/styles/ComponentStyles.js +0 -18
- package/dist/src/styles/ComponentStyles.js.map +0 -1
- package/dist/src/styles/audio-visualiser.d.ts +0 -2
- package/dist/src/styles/audio-visualiser.js +0 -33
- package/dist/src/styles/audio-visualiser.js.map +0 -1
- package/dist/src/styles/buttons.d.ts +0 -2
- package/dist/src/styles/buttons.js +0 -52
- package/dist/src/styles/buttons.js.map +0 -1
- package/dist/src/styles/callout.d.ts +0 -2
- package/dist/src/styles/callout.js +0 -23
- package/dist/src/styles/callout.js.map +0 -1
- package/dist/src/styles/default-theme.d.ts +0 -2
- package/dist/src/styles/default-theme.js +0 -50
- package/dist/src/styles/default-theme.js.map +0 -1
- package/dist/src/styles/recording-button.d.ts +0 -2
- package/dist/src/styles/recording-button.js +0 -8
- package/dist/src/styles/recording-button.js.map +0 -1
- package/dist/src/styles/select.d.ts +0 -2
- package/dist/src/styles/select.js +0 -36
- package/dist/src/styles/select.js.map +0 -1
- package/dist/src/styles/settings-menu.d.ts +0 -2
- package/dist/src/styles/settings-menu.js +0 -34
- package/dist/src/styles/settings-menu.js.map +0 -1
- package/dist/src/types.d.ts +0 -7
- package/dist/src/types.js +0 -2
- package/dist/src/types.js.map +0 -1
- package/dist/src/utils/auth.d.ts +0 -9
- package/dist/src/utils/auth.js +0 -21
- package/dist/src/utils/auth.js.map +0 -1
- package/dist/src/utils/converters.d.ts +0 -4
- package/dist/src/utils/converters.js +0 -8
- package/dist/src/utils/converters.js.map +0 -1
- package/dist/src/utils/devices.d.ts +0 -26
- package/dist/src/utils/devices.js +0 -53
- package/dist/src/utils/devices.js.map +0 -1
- package/dist/src/utils/events.d.ts +0 -44
- package/dist/src/utils/events.js +0 -88
- package/dist/src/utils/events.js.map +0 -1
- package/dist/src/utils/languages.d.ts +0 -7
- package/dist/src/utils/languages.js +0 -29
- package/dist/src/utils/languages.js.map +0 -1
- package/dist/src/utils/media.d.ts +0 -6
- package/dist/src/utils/media.js +0 -39
- package/dist/src/utils/media.js.map +0 -1
- package/dist/src/utils/token.d.ts +0 -13
- package/dist/src/utils/token.js +0 -60
- package/dist/src/utils/token.js.map +0 -1
- package/dist/src/utils/validation.d.ts +0 -1
- package/dist/src/utils/validation.js +0 -7
- package/dist/src/utils/validation.js.map +0 -1
- package/dist/stories/audio-visualiser.stories.d.ts +0 -39
- package/dist/stories/audio-visualiser.stories.js +0 -71
- package/dist/stories/audio-visualiser.stories.js.map +0 -1
- package/dist/stories/corti-dictation.stories.d.ts +0 -27
- package/dist/stories/corti-dictation.stories.js +0 -129
- package/dist/stories/corti-dictation.stories.js.map +0 -1
- package/dist/stories/device-selector.stories.d.ts +0 -18
- package/dist/stories/device-selector.stories.js +0 -84
- package/dist/stories/device-selector.stories.js.map +0 -1
- package/dist/stories/language-selector.stories.d.ts +0 -18
- package/dist/stories/language-selector.stories.js +0 -53
- package/dist/stories/language-selector.stories.js.map +0 -1
- package/dist/stories/recording-button.stories.d.ts +0 -27
- package/dist/stories/recording-button.stories.js +0 -90
- package/dist/stories/recording-button.stories.js.map +0 -1
- package/dist/stories/settings-menu.stories.d.ts +0 -23
- package/dist/stories/settings-menu.stories.js +0 -156
- package/dist/stories/settings-menu.stories.js.map +0 -1
- package/dist/styles/ComponentStyles.d.ts +0 -2
- package/dist/styles/ComponentStyles.js +0 -18
- package/dist/styles/ComponentStyles.js.map +0 -1
- package/dist/styles/default-theme.d.ts +0 -2
- package/dist/styles/default-theme.js +0 -14
- package/dist/styles/default-theme.js.map +0 -1
- package/dist/styles/theme.d.ts +0 -2
- package/dist/styles/theme.js +0 -56
- package/dist/styles/theme.js.map +0 -1
- package/dist/tsconfig.stories.tsbuildinfo +0 -1
- package/dist/utils.d.ts +0 -59
- package/dist/utils.js +0 -179
- package/dist/utils.js.map +0 -1
package/dist/utils/events.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"events.js","sourceRoot":"","sources":["../../src/utils/events.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Corti } from \"@corti/sdk\";\nimport type { RecordingState } from \"../types.js\";\n\nexport type LanguagesChangedEventDetail = {\n languages: Corti.TranscribeSupportedLanguage[];\n selectedLanguage: string | undefined;\n};\n\nexport type LanguageChangedEventDetail = {\n language: string;\n};\n\nexport type RecordingDevicesChangedEventDetail = {\n devices: MediaDeviceInfo[];\n selectedDevice: MediaDeviceInfo | undefined;\n};\n\nexport type RecordingStateChangedEventDetail = {\n state: RecordingState;\n};\n\nexport type AudioLevelChangedEventDetail = {\n audioLevel: number;\n};\n\nexport type TranscriptEventDetail = Corti.TranscribeTranscriptMessage;\nexport type CommandEventDetail = Corti.TranscribeCommandMessage;\nexport type UsageEventDetail = Corti.TranscribeUsageMessage;\n\nexport type ErrorEventDetail = {\n message: string;\n};\n\nexport function languagesChangedEvent(\n languages: Corti.TranscribeSupportedLanguage[],\n selectedLanguage: string | undefined,\n): CustomEvent<LanguagesChangedEventDetail> {\n return new CustomEvent(\"languages-changed\", {\n bubbles: true,\n composed: true,\n detail: { languages, selectedLanguage },\n });\n}\n\n/**\n * @deprecated Use languagesChangedEvent instead. This event is kept for backward compatibility.\n */\nexport function languageChangedEvent(\n language: string,\n): CustomEvent<LanguageChangedEventDetail> {\n return new CustomEvent(\"language-changed\", {\n bubbles: true,\n composed: true,\n detail: { language },\n });\n}\n\nexport function recordingDevicesChangedEvent(\n devices: MediaDeviceInfo[],\n selectedDevice: MediaDeviceInfo | undefined,\n): CustomEvent<RecordingDevicesChangedEventDetail> {\n return new CustomEvent(\"recording-devices-changed\", {\n bubbles: true,\n composed: true,\n detail: { devices, selectedDevice },\n });\n}\n\nexport function recordingStateChangedEvent(\n state: RecordingState,\n): CustomEvent<RecordingStateChangedEventDetail> {\n return new CustomEvent(\"recording-state-changed\", {\n bubbles: true,\n composed: true,\n detail: { state },\n });\n}\n\nexport function transcriptEvent(\n detail: TranscriptEventDetail,\n): CustomEvent<TranscriptEventDetail> {\n return new CustomEvent(\"transcript\", {\n bubbles: true,\n composed: true,\n detail,\n });\n}\n\nexport function commandEvent(\n detail: CommandEventDetail,\n): CustomEvent<CommandEventDetail> {\n return new CustomEvent(\"command\", {\n bubbles: true,\n composed: true,\n detail,\n });\n}\n\nexport function usageEvent(\n detail: UsageEventDetail,\n): CustomEvent<UsageEventDetail> {\n return new CustomEvent(\"usage\", {\n bubbles: true,\n composed: true,\n detail,\n });\n}\n\nexport function errorEvent(error: unknown): CustomEvent<ErrorEventDetail> {\n const message =\n error instanceof Error && error.message ? error.message : String(error);\n\n return new CustomEvent(\"error\", {\n bubbles: false,\n composed: true,\n detail: { message },\n });\n}\n\nexport function streamClosedEvent(detail: unknown): CustomEvent {\n return new CustomEvent(\"stream-closed\", {\n bubbles: true,\n composed: true,\n detail,\n });\n}\n\nexport function readyEvent(): CustomEvent {\n return new CustomEvent(\"ready\", {\n bubbles: true,\n composed: true,\n });\n}\n\nexport function audioLevelChangedEvent(\n audioLevel: number,\n): CustomEvent<AudioLevelChangedEventDetail> {\n return new CustomEvent(\"audio-level-changed\", {\n bubbles: true,\n composed: true,\n detail: { audioLevel },\n });\n}\n\nexport type NetworkActivityEventDetail = {\n direction: \"sent\" | \"received\";\n data: unknown;\n};\n\nexport function networkActivityEvent(\n direction: \"sent\" | \"received\",\n data: unknown,\n): CustomEvent<NetworkActivityEventDetail> {\n return new CustomEvent(\"network-activity\", {\n bubbles: true,\n composed: true,\n detail: { data, direction },\n });\n}\n"]}
|
|
1
|
+
{"version":3,"file":"events.js","sourceRoot":"","sources":["../../src/utils/events.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Corti } from \"@corti/sdk\";\nimport type { DictationMode, RecordingState } from \"../types.js\";\n\nexport type LanguagesChangedEventDetail = {\n languages: Corti.TranscribeSupportedLanguage[];\n selectedLanguage: string | undefined;\n};\n\nexport type LanguageChangedEventDetail = {\n language: string;\n};\n\nexport type RecordingDevicesChangedEventDetail = {\n devices: MediaDeviceInfo[];\n selectedDevice: MediaDeviceInfo | undefined;\n};\n\nexport type RecordingStateChangedEventDetail = {\n state: RecordingState;\n};\n\nexport type AudioLevelChangedEventDetail = {\n audioLevel: number;\n};\n\nexport type TranscriptEventDetail = Corti.TranscribeTranscriptMessage;\nexport type CommandEventDetail = Corti.TranscribeCommandMessage;\nexport type UsageEventDetail = Corti.TranscribeUsageMessage;\n\nexport type ErrorEventDetail = {\n message: string;\n};\n\nexport function languagesChangedEvent(\n languages: Corti.TranscribeSupportedLanguage[],\n selectedLanguage: string | undefined,\n): CustomEvent<LanguagesChangedEventDetail> {\n return new CustomEvent(\"languages-changed\", {\n bubbles: true,\n composed: true,\n detail: { languages, selectedLanguage },\n });\n}\n\n/**\n * @deprecated Use languagesChangedEvent instead. This event is kept for backward compatibility.\n */\nexport function languageChangedEvent(\n language: string,\n): CustomEvent<LanguageChangedEventDetail> {\n return new CustomEvent(\"language-changed\", {\n bubbles: true,\n composed: true,\n detail: { language },\n });\n}\n\nexport function recordingDevicesChangedEvent(\n devices: MediaDeviceInfo[],\n selectedDevice: MediaDeviceInfo | undefined,\n): CustomEvent<RecordingDevicesChangedEventDetail> {\n return new CustomEvent(\"recording-devices-changed\", {\n bubbles: true,\n composed: true,\n detail: { devices, selectedDevice },\n });\n}\n\nexport function recordingStateChangedEvent(\n state: RecordingState,\n): CustomEvent<RecordingStateChangedEventDetail> {\n return new CustomEvent(\"recording-state-changed\", {\n bubbles: true,\n composed: true,\n detail: { state },\n });\n}\n\nexport function transcriptEvent(\n detail: TranscriptEventDetail,\n): CustomEvent<TranscriptEventDetail> {\n return new CustomEvent(\"transcript\", {\n bubbles: true,\n composed: true,\n detail,\n });\n}\n\nexport function commandEvent(\n detail: CommandEventDetail,\n): CustomEvent<CommandEventDetail> {\n return new CustomEvent(\"command\", {\n bubbles: true,\n composed: true,\n detail,\n });\n}\n\nexport function usageEvent(\n detail: UsageEventDetail,\n): CustomEvent<UsageEventDetail> {\n return new CustomEvent(\"usage\", {\n bubbles: true,\n composed: true,\n detail,\n });\n}\n\nexport function errorEvent(error: unknown): CustomEvent<ErrorEventDetail> {\n const message =\n error instanceof Error && error.message ? error.message : String(error);\n\n return new CustomEvent(\"error\", {\n bubbles: false,\n composed: true,\n detail: { message },\n });\n}\n\nexport function streamClosedEvent(detail: unknown): CustomEvent {\n return new CustomEvent(\"stream-closed\", {\n bubbles: true,\n composed: true,\n detail,\n });\n}\n\nexport function readyEvent(): CustomEvent {\n return new CustomEvent(\"ready\", {\n bubbles: true,\n composed: true,\n });\n}\n\nexport function audioLevelChangedEvent(\n audioLevel: number,\n): CustomEvent<AudioLevelChangedEventDetail> {\n return new CustomEvent(\"audio-level-changed\", {\n bubbles: true,\n composed: true,\n detail: { audioLevel },\n });\n}\n\nexport type NetworkActivityEventDetail = {\n direction: \"sent\" | \"received\";\n data: unknown;\n};\n\nexport function networkActivityEvent(\n direction: \"sent\" | \"received\",\n data: unknown,\n): CustomEvent<NetworkActivityEventDetail> {\n return new CustomEvent(\"network-activity\", {\n bubbles: true,\n composed: true,\n detail: { data, direction },\n });\n}\n\nexport type ModeChangedEventDetail = {\n mode: DictationMode;\n};\n\nexport type KeybindingChangedEventDetail = {\n key: string | null | undefined;\n code: string | null | undefined;\n};\n\nexport type KeybindingActivatedEventDetail = {\n keyboardEvent: KeyboardEvent;\n};\n\nexport function modeChangedEvent(\n mode: DictationMode,\n): CustomEvent<ModeChangedEventDetail> {\n return new CustomEvent(\"mode-changed\", {\n bubbles: true,\n composed: true,\n detail: { mode },\n });\n}\n\nexport function keybindingChangedEvent(\n key: string | null | undefined,\n code: string | null | undefined,\n): CustomEvent<KeybindingChangedEventDetail> {\n return new CustomEvent(\"keybinding-changed\", {\n bubbles: true,\n composed: true,\n detail: { code, key },\n });\n}\n\nexport function keybindingActivatedEvent(\n keyboardEvent: KeyboardEvent,\n): CustomEvent<KeybindingActivatedEventDetail> {\n return new CustomEvent(\"keybinding-activated\", {\n bubbles: true,\n cancelable: true,\n composed: true,\n detail: { keyboardEvent },\n });\n}\n"]}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Normalizes a keybinding string.
|
|
3
|
+
*
|
|
4
|
+
* @param keybinding - Keybinding string to normalize
|
|
5
|
+
* @returns Normalized keybinding string or null if empty
|
|
6
|
+
*
|
|
7
|
+
* @example
|
|
8
|
+
* normalizeKeybinding("k") // "k"
|
|
9
|
+
* normalizeKeybinding("meta") // "Cmd" on Mac
|
|
10
|
+
* normalizeKeybinding(" space ") // "Space"
|
|
11
|
+
*/
|
|
12
|
+
export declare function normalizeKeybinding(keybinding: string | null | undefined): string | null;
|
|
13
|
+
/**
|
|
14
|
+
* Checks if a pressed key matches the keybinding.
|
|
15
|
+
* Checks both event.key and event.code for better reliability.
|
|
16
|
+
*
|
|
17
|
+
* @param event - KeyboardEvent to check
|
|
18
|
+
* @param keybinding - Keybinding string to match against
|
|
19
|
+
* @returns true if either the key or code matches the keybinding
|
|
20
|
+
*
|
|
21
|
+
* @example
|
|
22
|
+
* matchesKeybinding(event, "k") // true if event.key is "k" or event.code is "KeyK"
|
|
23
|
+
* matchesKeybinding(event, "`") // true if event.key is "`" or event.code is "Backquote"
|
|
24
|
+
*/
|
|
25
|
+
export declare function matchesKeybinding(event: KeyboardEvent, keybinding: string | null | undefined): boolean;
|
|
26
|
+
/**
|
|
27
|
+
* Checks if keybindings should be ignored for the current active element.
|
|
28
|
+
* Returns true if the user is typing in an input field.
|
|
29
|
+
*
|
|
30
|
+
* @param element - Element to check
|
|
31
|
+
* @returns true if keybindings should be ignored for this element
|
|
32
|
+
*
|
|
33
|
+
* @example
|
|
34
|
+
* shouldIgnoreKeybinding(document.activeElement) // true if input/textarea/contenteditable
|
|
35
|
+
*/
|
|
36
|
+
export declare function shouldIgnoreKeybinding(element: Element | null): boolean;
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Checks if the current platform is macOS.
|
|
3
|
+
* Uses userAgent string for reliable cross-browser detection.
|
|
4
|
+
*
|
|
5
|
+
* @returns true if running on macOS
|
|
6
|
+
*/
|
|
7
|
+
function isMac() {
|
|
8
|
+
if (typeof navigator === "undefined") {
|
|
9
|
+
return false;
|
|
10
|
+
}
|
|
11
|
+
// Check user agent for Mac patterns (most reliable method)
|
|
12
|
+
return /Mac|iPhone|iPad|iPod/.test(navigator.userAgent);
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Capitalizes the first letter of a string.
|
|
16
|
+
*
|
|
17
|
+
* @param str - String to capitalize
|
|
18
|
+
* @returns String with first letter capitalized
|
|
19
|
+
*/
|
|
20
|
+
function capitalize(str) {
|
|
21
|
+
if (str.length === 0) {
|
|
22
|
+
return str;
|
|
23
|
+
}
|
|
24
|
+
return str.charAt(0).toUpperCase() + str.slice(1);
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Normalizes a key string to the keybinding format.
|
|
28
|
+
* Handles platform-specific mappings and capitalization.
|
|
29
|
+
*
|
|
30
|
+
* @param key - Key string to normalize (will be trimmed and lowercased)
|
|
31
|
+
* @returns Formatted key string for keybinding
|
|
32
|
+
*
|
|
33
|
+
* @example
|
|
34
|
+
* normalizeKeyForKeybinding("Control") // "Ctrl"
|
|
35
|
+
* normalizeKeyForKeybinding("META") // "Cmd" on Mac, "Meta" elsewhere
|
|
36
|
+
* normalizeKeyForKeybinding(" alt ") // "Opt" on Mac, "Alt" elsewhere
|
|
37
|
+
* normalizeKeyForKeybinding("shift") // "Shift"
|
|
38
|
+
* normalizeKeyForKeybinding("k") // "k"
|
|
39
|
+
*/
|
|
40
|
+
function normalizeKeyForKeybinding(key) {
|
|
41
|
+
if (key === " ") {
|
|
42
|
+
return "Space";
|
|
43
|
+
}
|
|
44
|
+
const normalized = key.trim().toLowerCase();
|
|
45
|
+
if (normalized === "control") {
|
|
46
|
+
return "Ctrl";
|
|
47
|
+
}
|
|
48
|
+
if (normalized === "meta" || normalized === "cmd") {
|
|
49
|
+
return isMac() ? "Cmd" : "Meta";
|
|
50
|
+
}
|
|
51
|
+
if (normalized === "alt" || normalized === "opt") {
|
|
52
|
+
return isMac() ? "Opt" : "Alt";
|
|
53
|
+
}
|
|
54
|
+
if (normalized === "space") {
|
|
55
|
+
return "Space";
|
|
56
|
+
}
|
|
57
|
+
return normalized.length > 1 ? capitalize(normalized) : normalized;
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Normalizes a keybinding string.
|
|
61
|
+
*
|
|
62
|
+
* @param keybinding - Keybinding string to normalize
|
|
63
|
+
* @returns Normalized keybinding string or null if empty
|
|
64
|
+
*
|
|
65
|
+
* @example
|
|
66
|
+
* normalizeKeybinding("k") // "k"
|
|
67
|
+
* normalizeKeybinding("meta") // "Cmd" on Mac
|
|
68
|
+
* normalizeKeybinding(" space ") // "Space"
|
|
69
|
+
*/
|
|
70
|
+
export function normalizeKeybinding(keybinding) {
|
|
71
|
+
if (!keybinding) {
|
|
72
|
+
return null;
|
|
73
|
+
}
|
|
74
|
+
const trimmed = keybinding.trim();
|
|
75
|
+
if (trimmed === "") {
|
|
76
|
+
return null;
|
|
77
|
+
}
|
|
78
|
+
return normalizeKeyForKeybinding(trimmed);
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Checks if a pressed key matches the keybinding.
|
|
82
|
+
* Checks both event.key and event.code for better reliability.
|
|
83
|
+
*
|
|
84
|
+
* @param event - KeyboardEvent to check
|
|
85
|
+
* @param keybinding - Keybinding string to match against
|
|
86
|
+
* @returns true if either the key or code matches the keybinding
|
|
87
|
+
*
|
|
88
|
+
* @example
|
|
89
|
+
* matchesKeybinding(event, "k") // true if event.key is "k" or event.code is "KeyK"
|
|
90
|
+
* matchesKeybinding(event, "`") // true if event.key is "`" or event.code is "Backquote"
|
|
91
|
+
*/
|
|
92
|
+
export function matchesKeybinding(event, keybinding) {
|
|
93
|
+
const normalizedKeybinding = normalizeKeybinding(keybinding);
|
|
94
|
+
if (!normalizedKeybinding) {
|
|
95
|
+
return false;
|
|
96
|
+
}
|
|
97
|
+
const normalizedKey = normalizeKeyForKeybinding(event.key);
|
|
98
|
+
const normalizedCode = normalizeKeyForKeybinding(event.code);
|
|
99
|
+
return (normalizedKey === normalizedKeybinding ||
|
|
100
|
+
normalizedCode === normalizedKeybinding);
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Checks if keybindings should be ignored for the current active element.
|
|
104
|
+
* Returns true if the user is typing in an input field.
|
|
105
|
+
*
|
|
106
|
+
* @param element - Element to check
|
|
107
|
+
* @returns true if keybindings should be ignored for this element
|
|
108
|
+
*
|
|
109
|
+
* @example
|
|
110
|
+
* shouldIgnoreKeybinding(document.activeElement) // true if input/textarea/contenteditable
|
|
111
|
+
*/
|
|
112
|
+
export function shouldIgnoreKeybinding(element) {
|
|
113
|
+
if (!element) {
|
|
114
|
+
return false;
|
|
115
|
+
}
|
|
116
|
+
const tagName = element.tagName.toLowerCase();
|
|
117
|
+
if (tagName === "input" || tagName === "textarea") {
|
|
118
|
+
return true;
|
|
119
|
+
}
|
|
120
|
+
if (element instanceof HTMLElement && element.contentEditable === "true") {
|
|
121
|
+
return true;
|
|
122
|
+
}
|
|
123
|
+
return false;
|
|
124
|
+
}
|
|
125
|
+
//# sourceMappingURL=keybinding.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"keybinding.js","sourceRoot":"","sources":["../../src/utils/keybinding.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Checks if the current platform is macOS.\n * Uses userAgent string for reliable cross-browser detection.\n *\n * @returns true if running on macOS\n */\nfunction isMac(): boolean {\n if (typeof navigator === \"undefined\") {\n return false;\n }\n\n // Check user agent for Mac patterns (most reliable method)\n return /Mac|iPhone|iPad|iPod/.test(navigator.userAgent);\n}\n\n/**\n * Capitalizes the first letter of a string.\n *\n * @param str - String to capitalize\n * @returns String with first letter capitalized\n */\nfunction capitalize(str: string): string {\n if (str.length === 0) {\n return str;\n }\n\n return str.charAt(0).toUpperCase() + str.slice(1);\n}\n\n/**\n * Normalizes a key string to the keybinding format.\n * Handles platform-specific mappings and capitalization.\n *\n * @param key - Key string to normalize (will be trimmed and lowercased)\n * @returns Formatted key string for keybinding\n *\n * @example\n * normalizeKeyForKeybinding(\"Control\") // \"Ctrl\"\n * normalizeKeyForKeybinding(\"META\") // \"Cmd\" on Mac, \"Meta\" elsewhere\n * normalizeKeyForKeybinding(\" alt \") // \"Opt\" on Mac, \"Alt\" elsewhere\n * normalizeKeyForKeybinding(\"shift\") // \"Shift\"\n * normalizeKeyForKeybinding(\"k\") // \"k\"\n */\nfunction normalizeKeyForKeybinding(key: string): string {\n if (key === \" \") {\n return \"Space\";\n }\n\n const normalized = key.trim().toLowerCase();\n\n if (normalized === \"control\") {\n return \"Ctrl\";\n }\n if (normalized === \"meta\" || normalized === \"cmd\") {\n return isMac() ? \"Cmd\" : \"Meta\";\n }\n if (normalized === \"alt\" || normalized === \"opt\") {\n return isMac() ? \"Opt\" : \"Alt\";\n }\n if (normalized === \"space\") {\n return \"Space\";\n }\n\n return normalized.length > 1 ? capitalize(normalized) : normalized;\n}\n\n/**\n * Normalizes a keybinding string.\n *\n * @param keybinding - Keybinding string to normalize\n * @returns Normalized keybinding string or null if empty\n *\n * @example\n * normalizeKeybinding(\"k\") // \"k\"\n * normalizeKeybinding(\"meta\") // \"Cmd\" on Mac\n * normalizeKeybinding(\" space \") // \"Space\"\n */\nexport function normalizeKeybinding(\n keybinding: string | null | undefined,\n): string | null {\n if (!keybinding) {\n return null;\n }\n\n const trimmed = keybinding.trim();\n\n if (trimmed === \"\") {\n return null;\n }\n\n return normalizeKeyForKeybinding(trimmed);\n}\n\n/**\n * Checks if a pressed key matches the keybinding.\n * Checks both event.key and event.code for better reliability.\n *\n * @param event - KeyboardEvent to check\n * @param keybinding - Keybinding string to match against\n * @returns true if either the key or code matches the keybinding\n *\n * @example\n * matchesKeybinding(event, \"k\") // true if event.key is \"k\" or event.code is \"KeyK\"\n * matchesKeybinding(event, \"`\") // true if event.key is \"`\" or event.code is \"Backquote\"\n */\nexport function matchesKeybinding(\n event: KeyboardEvent,\n keybinding: string | null | undefined,\n): boolean {\n const normalizedKeybinding = normalizeKeybinding(keybinding);\n\n if (!normalizedKeybinding) {\n return false;\n }\n\n const normalizedKey = normalizeKeyForKeybinding(event.key);\n const normalizedCode = normalizeKeyForKeybinding(event.code);\n\n return (\n normalizedKey === normalizedKeybinding ||\n normalizedCode === normalizedKeybinding\n );\n}\n\n/**\n * Checks if keybindings should be ignored for the current active element.\n * Returns true if the user is typing in an input field.\n *\n * @param element - Element to check\n * @returns true if keybindings should be ignored for this element\n *\n * @example\n * shouldIgnoreKeybinding(document.activeElement) // true if input/textarea/contenteditable\n */\nexport function shouldIgnoreKeybinding(element: Element | null): boolean {\n if (!element) {\n return false;\n }\n\n const tagName = element.tagName.toLowerCase();\n\n if (tagName === \"input\" || tagName === \"textarea\") {\n return true;\n }\n\n if (element instanceof HTMLElement && element.contentEditable === \"true\") {\n return true;\n }\n\n return false;\n}\n"]}
|
package/package.json
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"name": "@corti/dictation-web",
|
|
3
3
|
"description": "Web component for Corti Dictation",
|
|
4
4
|
"author": "Corti ApS",
|
|
5
|
-
"version": "0.
|
|
5
|
+
"version": "0.5.0-rc",
|
|
6
6
|
"license": "MIT",
|
|
7
7
|
"type": "module",
|
|
8
8
|
"main": "dist/index.js",
|
|
@@ -58,7 +58,7 @@
|
|
|
58
58
|
"storybook:build": "tsc && tsc -p tsconfig.stories.json && npm run analyze -- --exclude dist && storybook build"
|
|
59
59
|
},
|
|
60
60
|
"dependencies": {
|
|
61
|
-
"@corti/sdk": "^0.8.0
|
|
61
|
+
"@corti/sdk": "^0.8.0",
|
|
62
62
|
"@lit/context": "^1.1.6",
|
|
63
63
|
"lit": "^3.3.1"
|
|
64
64
|
},
|
package/dist/CortiDictation.d.ts
DELETED
|
@@ -1,55 +0,0 @@
|
|
|
1
|
-
import { type Corti } from '@corti/sdk';
|
|
2
|
-
import { LitElement } from 'lit';
|
|
3
|
-
import './components/settings-menu.js';
|
|
4
|
-
import './components/audio-visualiser.js';
|
|
5
|
-
import './icons/icons.js';
|
|
6
|
-
import type { ConfigurableSettings, RecordingState, ServerConfig } from './types.js';
|
|
7
|
-
export declare class CortiDictation extends LitElement {
|
|
8
|
-
static styles: import("lit").CSSResult[];
|
|
9
|
-
dictationConfig: Corti.TranscribeConfig;
|
|
10
|
-
languagesSupported: Corti.TranscribeSupportedLanguage[];
|
|
11
|
-
debug_displayAudio: boolean;
|
|
12
|
-
settingsEnabled: ConfigurableSettings[];
|
|
13
|
-
preventButtonFocus: boolean;
|
|
14
|
-
private _serverConfig;
|
|
15
|
-
private _audioLevel;
|
|
16
|
-
private _recordingState;
|
|
17
|
-
private _selectedDevice;
|
|
18
|
-
private _devices;
|
|
19
|
-
private recorderManager;
|
|
20
|
-
connectedCallback(): Promise<void>;
|
|
21
|
-
startRecording(): void;
|
|
22
|
-
stopRecording(): void;
|
|
23
|
-
toggleRecording(): void;
|
|
24
|
-
/**
|
|
25
|
-
* Sets the access token and returns the server configuration.
|
|
26
|
-
*
|
|
27
|
-
* NOTE: We decode the token here only for backward compatibility in return values.
|
|
28
|
-
* The SDK now handles token parsing internally, so this return value should be
|
|
29
|
-
* reduced in the future to only include necessary fields.
|
|
30
|
-
*/
|
|
31
|
-
setAccessToken(token: string): {
|
|
32
|
-
environment: string;
|
|
33
|
-
tenant: string;
|
|
34
|
-
accessToken: string;
|
|
35
|
-
expiresAt: number | undefined;
|
|
36
|
-
} | undefined;
|
|
37
|
-
/**
|
|
38
|
-
* Sets the authentication configuration and returns the server configuration.
|
|
39
|
-
*
|
|
40
|
-
* NOTE: We decode tokens here only for backward compatibility in return values.
|
|
41
|
-
* The SDK now handles token parsing internally, so this return value should be
|
|
42
|
-
* reduced in the future to only include necessary fields.
|
|
43
|
-
*/
|
|
44
|
-
setAuthConfig(config: Corti.BearerOptions): Promise<ServerConfig>;
|
|
45
|
-
get selectedDevice(): MediaDeviceInfo | null;
|
|
46
|
-
get recordingState(): RecordingState;
|
|
47
|
-
get devices(): MediaDeviceInfo[];
|
|
48
|
-
setRecordingDevice(device: MediaDeviceInfo): Promise<void>;
|
|
49
|
-
setPrimaryLanguage(language: string): void;
|
|
50
|
-
_onButtonMouseDown(event: MouseEvent): void;
|
|
51
|
-
_onRecordingDevicesChanged(event: Event): Promise<void>;
|
|
52
|
-
_onLanguageChanged(event: Event): void;
|
|
53
|
-
render(): import("lit-html").TemplateResult<1>;
|
|
54
|
-
}
|
|
55
|
-
export default CortiDictation;
|
package/dist/CortiDictation.js
DELETED
|
@@ -1,303 +0,0 @@
|
|
|
1
|
-
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
2
|
-
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
3
|
-
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
4
|
-
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
5
|
-
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
|
-
};
|
|
7
|
-
// corti-dictation.ts
|
|
8
|
-
import { html, LitElement } from 'lit';
|
|
9
|
-
import { property, state } from 'lit/decorators.js';
|
|
10
|
-
import { RecorderManager } from './RecorderManager.js';
|
|
11
|
-
import './components/settings-menu.js';
|
|
12
|
-
import './components/audio-visualiser.js';
|
|
13
|
-
import './icons/icons.js';
|
|
14
|
-
import ThemeStyles from './styles/theme.js';
|
|
15
|
-
import ButtonStyles from './styles/buttons.js';
|
|
16
|
-
import ComponentStyles from './styles/ComponentStyles.js';
|
|
17
|
-
import { DEFAULT_DICTATION_CONFIG, LANGUAGES_SUPPORTED } from './constants.js';
|
|
18
|
-
import CalloutStyles from './styles/callout.js';
|
|
19
|
-
import { decodeToken } from './utils.js';
|
|
20
|
-
export class CortiDictation extends LitElement {
|
|
21
|
-
constructor() {
|
|
22
|
-
super(...arguments);
|
|
23
|
-
this.dictationConfig = DEFAULT_DICTATION_CONFIG;
|
|
24
|
-
this.languagesSupported = LANGUAGES_SUPPORTED;
|
|
25
|
-
this.debug_displayAudio = false;
|
|
26
|
-
this.settingsEnabled = ["device", "language"];
|
|
27
|
-
this.preventButtonFocus = true;
|
|
28
|
-
this._audioLevel = 0;
|
|
29
|
-
this._recordingState = 'stopped';
|
|
30
|
-
this._devices = [];
|
|
31
|
-
this.recorderManager = new RecorderManager();
|
|
32
|
-
}
|
|
33
|
-
async connectedCallback() {
|
|
34
|
-
super.connectedCallback();
|
|
35
|
-
const devices = await this.recorderManager.initialize();
|
|
36
|
-
if (devices.selectedDevice) {
|
|
37
|
-
this._selectedDevice = this.recorderManager.selectedDevice;
|
|
38
|
-
this._devices = this.recorderManager.devices;
|
|
39
|
-
this.dispatchEvent(new CustomEvent('ready'));
|
|
40
|
-
}
|
|
41
|
-
// Map event names to any extra handling logic
|
|
42
|
-
const eventHandlers = {
|
|
43
|
-
'recording-state-changed': e => {
|
|
44
|
-
this._recordingState = e.detail.state;
|
|
45
|
-
},
|
|
46
|
-
'devices-changed': () => {
|
|
47
|
-
this._devices = [...this.recorderManager.devices];
|
|
48
|
-
this.requestUpdate();
|
|
49
|
-
},
|
|
50
|
-
'audio-level-changed': e => {
|
|
51
|
-
this._audioLevel = e.detail.audioLevel;
|
|
52
|
-
this.requestUpdate();
|
|
53
|
-
},
|
|
54
|
-
};
|
|
55
|
-
const eventsToRelay = [
|
|
56
|
-
'recording-state-changed',
|
|
57
|
-
'recording-devices-changed',
|
|
58
|
-
'audio-level-changed',
|
|
59
|
-
'error',
|
|
60
|
-
'transcript',
|
|
61
|
-
'command',
|
|
62
|
-
'ready',
|
|
63
|
-
'usage',
|
|
64
|
-
'stream-closed',
|
|
65
|
-
];
|
|
66
|
-
eventsToRelay.forEach(eventName => {
|
|
67
|
-
this.recorderManager.addEventListener(eventName, (e) => {
|
|
68
|
-
const customEvent = e;
|
|
69
|
-
// Perform any additional handling if defined
|
|
70
|
-
if (eventHandlers[eventName]) {
|
|
71
|
-
eventHandlers[eventName](customEvent);
|
|
72
|
-
}
|
|
73
|
-
// Re-dispatch the event from the component
|
|
74
|
-
this.dispatchEvent(new CustomEvent(eventName, {
|
|
75
|
-
detail: customEvent.detail,
|
|
76
|
-
bubbles: eventName !== 'error',
|
|
77
|
-
composed: true,
|
|
78
|
-
}));
|
|
79
|
-
});
|
|
80
|
-
});
|
|
81
|
-
}
|
|
82
|
-
startRecording() {
|
|
83
|
-
if (!this._serverConfig)
|
|
84
|
-
return;
|
|
85
|
-
this.recorderManager.startRecording({
|
|
86
|
-
dictationConfig: this.dictationConfig,
|
|
87
|
-
serverConfig: this._serverConfig,
|
|
88
|
-
debug_displayAudio: this.debug_displayAudio,
|
|
89
|
-
});
|
|
90
|
-
}
|
|
91
|
-
stopRecording() {
|
|
92
|
-
this.recorderManager.stopRecording();
|
|
93
|
-
}
|
|
94
|
-
toggleRecording() {
|
|
95
|
-
if (this._recordingState === 'recording') {
|
|
96
|
-
this.stopRecording();
|
|
97
|
-
}
|
|
98
|
-
else if (this._recordingState === 'stopped') {
|
|
99
|
-
this.startRecording();
|
|
100
|
-
}
|
|
101
|
-
}
|
|
102
|
-
/**
|
|
103
|
-
* Sets the access token and returns the server configuration.
|
|
104
|
-
*
|
|
105
|
-
* NOTE: We decode the token here only for backward compatibility in return values.
|
|
106
|
-
* The SDK now handles token parsing internally, so this return value should be
|
|
107
|
-
* reduced in the future to only include necessary fields.
|
|
108
|
-
*/
|
|
109
|
-
setAccessToken(token) {
|
|
110
|
-
try {
|
|
111
|
-
const decoded = decodeToken(token);
|
|
112
|
-
this._serverConfig = decoded;
|
|
113
|
-
return decoded;
|
|
114
|
-
}
|
|
115
|
-
catch (e) {
|
|
116
|
-
throw new Error('Invalid token');
|
|
117
|
-
}
|
|
118
|
-
}
|
|
119
|
-
/**
|
|
120
|
-
* Sets the authentication configuration and returns the server configuration.
|
|
121
|
-
*
|
|
122
|
-
* NOTE: We decode tokens here only for backward compatibility in return values.
|
|
123
|
-
* The SDK now handles token parsing internally, so this return value should be
|
|
124
|
-
* reduced in the future to only include necessary fields.
|
|
125
|
-
*/
|
|
126
|
-
async setAuthConfig(config) {
|
|
127
|
-
try {
|
|
128
|
-
const initialToken = 'accessToken' in config
|
|
129
|
-
? { accessToken: config.accessToken, refreshToken: config.refreshToken }
|
|
130
|
-
: await config.refreshAccessToken();
|
|
131
|
-
if (!initialToken?.accessToken ||
|
|
132
|
-
typeof initialToken.accessToken !== 'string') {
|
|
133
|
-
throw new Error('Access token is required and must be a string');
|
|
134
|
-
}
|
|
135
|
-
// Decode tokens only for return value compatibility
|
|
136
|
-
// The SDK handles its own token parsing internally
|
|
137
|
-
const decoded = decodeToken(initialToken.accessToken);
|
|
138
|
-
if (!decoded) {
|
|
139
|
-
throw new Error('Invalid token format');
|
|
140
|
-
}
|
|
141
|
-
this._serverConfig = {
|
|
142
|
-
environment: decoded.environment,
|
|
143
|
-
tenant: decoded.tenant,
|
|
144
|
-
accessToken: initialToken.accessToken,
|
|
145
|
-
refreshToken: config.refreshToken,
|
|
146
|
-
refreshAccessToken: async (refreshToken) => {
|
|
147
|
-
try {
|
|
148
|
-
if (!config.refreshAccessToken) {
|
|
149
|
-
return {
|
|
150
|
-
accessToken: this._serverConfig?.accessToken || 'no_token',
|
|
151
|
-
expiresIn: Infinity,
|
|
152
|
-
refreshToken,
|
|
153
|
-
};
|
|
154
|
-
}
|
|
155
|
-
const response = await config.refreshAccessToken(refreshToken);
|
|
156
|
-
if (this._serverConfig) {
|
|
157
|
-
this._serverConfig.accessToken = response.accessToken;
|
|
158
|
-
this._serverConfig.refreshToken = response.refreshToken;
|
|
159
|
-
}
|
|
160
|
-
return response;
|
|
161
|
-
}
|
|
162
|
-
catch (e) {
|
|
163
|
-
throw new Error('Error when refreshing access token');
|
|
164
|
-
}
|
|
165
|
-
},
|
|
166
|
-
};
|
|
167
|
-
return this._serverConfig;
|
|
168
|
-
}
|
|
169
|
-
catch (e) {
|
|
170
|
-
throw new Error('Invalid config');
|
|
171
|
-
}
|
|
172
|
-
}
|
|
173
|
-
get selectedDevice() {
|
|
174
|
-
return this.recorderManager.selectedDevice || null;
|
|
175
|
-
}
|
|
176
|
-
get recordingState() {
|
|
177
|
-
return this._recordingState;
|
|
178
|
-
}
|
|
179
|
-
get devices() {
|
|
180
|
-
return this._devices;
|
|
181
|
-
}
|
|
182
|
-
async setRecordingDevice(device) {
|
|
183
|
-
this.recorderManager.selectedDevice = device;
|
|
184
|
-
this._selectedDevice = device;
|
|
185
|
-
if (!this._serverConfig)
|
|
186
|
-
return;
|
|
187
|
-
if (this._recordingState === 'recording') {
|
|
188
|
-
await this.recorderManager.stopRecording();
|
|
189
|
-
await this.recorderManager.startRecording({
|
|
190
|
-
dictationConfig: this.dictationConfig,
|
|
191
|
-
serverConfig: this._serverConfig,
|
|
192
|
-
});
|
|
193
|
-
}
|
|
194
|
-
}
|
|
195
|
-
setPrimaryLanguage(language) {
|
|
196
|
-
if (LANGUAGES_SUPPORTED.includes(language)) {
|
|
197
|
-
this.dictationConfig = {
|
|
198
|
-
...this.dictationConfig,
|
|
199
|
-
primaryLanguage: language,
|
|
200
|
-
};
|
|
201
|
-
// If recording is in progress, restart to apply the language change
|
|
202
|
-
if (this._serverConfig && this._recordingState === 'recording') {
|
|
203
|
-
this.recorderManager.stopRecording();
|
|
204
|
-
this.recorderManager.startRecording({
|
|
205
|
-
dictationConfig: this.dictationConfig,
|
|
206
|
-
serverConfig: this._serverConfig,
|
|
207
|
-
debug_displayAudio: this.debug_displayAudio,
|
|
208
|
-
});
|
|
209
|
-
}
|
|
210
|
-
}
|
|
211
|
-
}
|
|
212
|
-
_onButtonMouseDown(event) {
|
|
213
|
-
// Prevent button from taking focus on mouse click
|
|
214
|
-
// This keeps focus on the textarea
|
|
215
|
-
if (this.preventButtonFocus) {
|
|
216
|
-
event.preventDefault();
|
|
217
|
-
}
|
|
218
|
-
}
|
|
219
|
-
// Handle device change events if needed
|
|
220
|
-
async _onRecordingDevicesChanged(event) {
|
|
221
|
-
const customEvent = event;
|
|
222
|
-
this.setRecordingDevice(customEvent.detail.selectedDevice);
|
|
223
|
-
}
|
|
224
|
-
// Handle language change events
|
|
225
|
-
_onLanguageChanged(event) {
|
|
226
|
-
const customEvent = event;
|
|
227
|
-
const language = customEvent.detail.language;
|
|
228
|
-
if (language) {
|
|
229
|
-
this.setPrimaryLanguage(language);
|
|
230
|
-
}
|
|
231
|
-
}
|
|
232
|
-
render() {
|
|
233
|
-
if (!this._serverConfig) {
|
|
234
|
-
return html ` <div style="display: none"></div> `;
|
|
235
|
-
}
|
|
236
|
-
const isLoading = this._recordingState === 'initializing' ||
|
|
237
|
-
this._recordingState === 'stopping';
|
|
238
|
-
const isRecording = this._recordingState === 'recording';
|
|
239
|
-
return html `
|
|
240
|
-
<div class="wrapper">
|
|
241
|
-
<button
|
|
242
|
-
@click=${this.toggleRecording}
|
|
243
|
-
@mousedown=${this._onButtonMouseDown}
|
|
244
|
-
class=${isRecording ? 'red' : 'accent'}
|
|
245
|
-
>
|
|
246
|
-
${isLoading
|
|
247
|
-
? html ` <icon-loading-spinner></icon-loading-spinner>`
|
|
248
|
-
: isRecording
|
|
249
|
-
? html ` <icon-recording></icon-recording>`
|
|
250
|
-
: html ` <icon-mic-on></icon-mic-on>`}
|
|
251
|
-
<audio-visualiser
|
|
252
|
-
.level=${this._audioLevel}
|
|
253
|
-
.active=${isRecording}
|
|
254
|
-
></audio-visualiser>
|
|
255
|
-
</button>
|
|
256
|
-
|
|
257
|
-
${this.settingsEnabled.length > 0 ? html `
|
|
258
|
-
<settings-menu
|
|
259
|
-
.selectedDevice=${this._selectedDevice}
|
|
260
|
-
.selectedLanguage=${this.dictationConfig.primaryLanguage}
|
|
261
|
-
?settingsDisabled=${this._recordingState !== 'stopped'}
|
|
262
|
-
@recording-devices-changed=${this._onRecordingDevicesChanged}
|
|
263
|
-
@language-changed=${this._onLanguageChanged}
|
|
264
|
-
.settingsEnabled=${this.settingsEnabled}
|
|
265
|
-
></settings-menu>
|
|
266
|
-
` : ''}
|
|
267
|
-
</div>
|
|
268
|
-
`;
|
|
269
|
-
}
|
|
270
|
-
}
|
|
271
|
-
CortiDictation.styles = [ButtonStyles, ThemeStyles, ComponentStyles, CalloutStyles];
|
|
272
|
-
__decorate([
|
|
273
|
-
property({ type: Object })
|
|
274
|
-
], CortiDictation.prototype, "dictationConfig", void 0);
|
|
275
|
-
__decorate([
|
|
276
|
-
property({ type: Array })
|
|
277
|
-
], CortiDictation.prototype, "languagesSupported", void 0);
|
|
278
|
-
__decorate([
|
|
279
|
-
property({ type: Boolean })
|
|
280
|
-
], CortiDictation.prototype, "debug_displayAudio", void 0);
|
|
281
|
-
__decorate([
|
|
282
|
-
property({ type: Array })
|
|
283
|
-
], CortiDictation.prototype, "settingsEnabled", void 0);
|
|
284
|
-
__decorate([
|
|
285
|
-
property({ type: Boolean })
|
|
286
|
-
], CortiDictation.prototype, "preventButtonFocus", void 0);
|
|
287
|
-
__decorate([
|
|
288
|
-
state()
|
|
289
|
-
], CortiDictation.prototype, "_serverConfig", void 0);
|
|
290
|
-
__decorate([
|
|
291
|
-
state()
|
|
292
|
-
], CortiDictation.prototype, "_audioLevel", void 0);
|
|
293
|
-
__decorate([
|
|
294
|
-
state()
|
|
295
|
-
], CortiDictation.prototype, "_recordingState", void 0);
|
|
296
|
-
__decorate([
|
|
297
|
-
state()
|
|
298
|
-
], CortiDictation.prototype, "_selectedDevice", void 0);
|
|
299
|
-
__decorate([
|
|
300
|
-
state()
|
|
301
|
-
], CortiDictation.prototype, "_devices", void 0);
|
|
302
|
-
export default CortiDictation;
|
|
303
|
-
//# sourceMappingURL=CortiDictation.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"CortiDictation.js","sourceRoot":"","sources":["../src/CortiDictation.ts"],"names":[],"mappings":";;;;;;AAEA,qBAAqB;AACrB,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,KAAK,CAAC;AACvC,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,+BAA+B,CAAC;AACvC,OAAO,kCAAkC,CAAC;AAC1C,OAAO,kBAAkB,CAAC;AAC1B,OAAO,WAAW,MAAM,mBAAmB,CAAC;AAC5C,OAAO,YAAY,MAAM,qBAAqB,CAAC;AAC/C,OAAO,eAAe,MAAM,6BAA6B,CAAC;AAG1D,OAAO,EAAE,wBAAwB,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AAC/E,OAAO,aAAa,MAAM,qBAAqB,CAAC;AAChD,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAEzC,MAAM,OAAO,cAAe,SAAQ,UAAU;IAA9C;;QAIE,oBAAe,GAA2B,wBAAwB,CAAC;QAGnE,uBAAkB,GAAwC,mBAAmB,CAAC;QAG9E,uBAAkB,GAAY,KAAK,CAAC;QAGpC,oBAAe,GAA2B,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;QAGjE,uBAAkB,GAAY,IAAI,CAAC;QAM3B,gBAAW,GAAW,CAAC,CAAC;QAGxB,oBAAe,GAAmB,SAAS,CAAC;QAM5C,aAAQ,GAAsB,EAAE,CAAC;QAEjC,oBAAe,GAAG,IAAI,eAAe,EAAE,CAAC;IA4QlD,CAAC;IA1QC,KAAK,CAAC,iBAAiB;QACrB,KAAK,CAAC,iBAAiB,EAAE,CAAC;QAC1B,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,UAAU,EAAE,CAAC;QACxD,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC;YAC3B,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,eAAe,CAAC,cAAc,CAAC;YAC3D,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC;YAC7C,IAAI,CAAC,aAAa,CAAC,IAAI,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC;QAC/C,CAAC;QAED,8CAA8C;QAC9C,MAAM,aAAa,GAA6C;YAC9D,yBAAyB,EAAE,CAAC,CAAC,EAAE;gBAC7B,IAAI,CAAC,eAAe,GAAG,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;YACxC,CAAC;YACD,iBAAiB,EAAE,GAAG,EAAE;gBACtB,IAAI,CAAC,QAAQ,GAAG,CAAC,GAAG,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;gBAClD,IAAI,CAAC,aAAa,EAAE,CAAC;YACvB,CAAC;YACD,qBAAqB,EAAE,CAAC,CAAC,EAAE;gBACzB,IAAI,CAAC,WAAW,GAAG,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC;gBACvC,IAAI,CAAC,aAAa,EAAE,CAAC;YACvB,CAAC;SACF,CAAC;QAEF,MAAM,aAAa,GAAG;YACpB,yBAAyB;YACzB,2BAA2B;YAC3B,qBAAqB;YACrB,OAAO;YACP,YAAY;YACZ,SAAS;YACT,OAAO;YACP,OAAO;YACP,eAAe;SAChB,CAAC;QAEF,aAAa,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE;YAChC,IAAI,CAAC,eAAe,CAAC,gBAAgB,CAAC,SAAS,EAAE,CAAC,CAAQ,EAAE,EAAE;gBAC5D,MAAM,WAAW,GAAG,CAAgB,CAAC;gBACrC,6CAA6C;gBAC7C,IAAI,aAAa,CAAC,SAAS,CAAC,EAAE,CAAC;oBAC7B,aAAa,CAAC,SAAS,CAAC,CAAC,WAAW,CAAC,CAAC;gBACxC,CAAC;gBACD,2CAA2C;gBAC3C,IAAI,CAAC,aAAa,CAChB,IAAI,WAAW,CAAC,SAAS,EAAE;oBACzB,MAAM,EAAE,WAAW,CAAC,MAAM;oBAC1B,OAAO,EAAE,SAAS,KAAK,OAAO;oBAC9B,QAAQ,EAAE,IAAI;iBACf,CAAC,CACH,CAAC;YACJ,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC;IAEM,cAAc;QACnB,IAAI,CAAC,IAAI,CAAC,aAAa;YAAE,OAAO;QAChC,IAAI,CAAC,eAAe,CAAC,cAAc,CAAC;YAClC,eAAe,EAAE,IAAI,CAAC,eAAe;YACrC,YAAY,EAAE,IAAI,CAAC,aAAc;YACjC,kBAAkB,EAAE,IAAI,CAAC,kBAAkB;SAC5C,CAAC,CAAC;IACL,CAAC;IAEM,aAAa;QAClB,IAAI,CAAC,eAAe,CAAC,aAAa,EAAE,CAAC;IACvC,CAAC;IAEM,eAAe;QACpB,IAAI,IAAI,CAAC,eAAe,KAAK,WAAW,EAAE,CAAC;YACzC,IAAI,CAAC,aAAa,EAAE,CAAC;QACvB,CAAC;aAAM,IAAI,IAAI,CAAC,eAAe,KAAK,SAAS,EAAE,CAAC;YAC9C,IAAI,CAAC,cAAc,EAAE,CAAC;QACxB,CAAC;IACH,CAAC;IAED;;;;;;OAMG;IACI,cAAc,CAAC,KAAa;QACjC,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC;YACnC,IAAI,CAAC,aAAa,GAAG,OAAO,CAAC;YAC7B,OAAO,OAAO,CAAC;QACjB,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,MAAM,IAAI,KAAK,CAAC,eAAe,CAAC,CAAC;QACnC,CAAC;IACH,CAAC;IAED;;;;;;OAMG;IACI,KAAK,CAAC,aAAa,CACxB,MAA2B;QAE3B,IAAI,CAAC;YACH,MAAM,YAAY,GAChB,aAAa,IAAI,MAAM;gBACrB,CAAC,CAAC,EAAE,WAAW,EAAE,MAAM,CAAC,WAAW,EAAE,YAAY,EAAE,MAAM,CAAC,YAAY,EAAE;gBACxE,CAAC,CAAC,MAAM,MAAM,CAAC,kBAAkB,EAAE,CAAC;YAExC,IACE,CAAC,YAAY,EAAE,WAAW;gBAC1B,OAAO,YAAY,CAAC,WAAW,KAAK,QAAQ,EAC5C,CAAC;gBACD,MAAM,IAAI,KAAK,CAAC,+CAA+C,CAAC,CAAC;YACnE,CAAC;YAED,oDAAoD;YACpD,mDAAmD;YACnD,MAAM,OAAO,GAAG,WAAW,CAAC,YAAY,CAAC,WAAW,CAAC,CAAC;YAEtD,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,MAAM,IAAI,KAAK,CAAC,sBAAsB,CAAC,CAAC;YAC1C,CAAC;YAED,IAAI,CAAC,aAAa,GAAG;gBACnB,WAAW,EAAE,OAAO,CAAC,WAAW;gBAChC,MAAM,EAAE,OAAO,CAAC,MAAM;gBACtB,WAAW,EAAE,YAAY,CAAC,WAAW;gBACrC,YAAY,EAAE,MAAM,CAAC,YAAY;gBACjC,kBAAkB,EAAE,KAAK,EAAE,YAAqB,EAAE,EAAE;oBAClD,IAAI,CAAC;wBACH,IAAI,CAAC,MAAM,CAAC,kBAAkB,EAAE,CAAC;4BAC/B,OAAO;gCACL,WAAW,EAAE,IAAI,CAAC,aAAa,EAAE,WAAW,IAAI,UAAU;gCAC1D,SAAS,EAAE,QAAQ;gCACnB,YAAY;6BACb,CAAC;wBACJ,CAAC;wBAED,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,kBAAkB,CAAC,YAAY,CAAC,CAAC;wBAE/D,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;4BACvB,IAAI,CAAC,aAAa,CAAC,WAAW,GAAG,QAAQ,CAAC,WAAW,CAAC;4BACtD,IAAI,CAAC,aAAa,CAAC,YAAY,GAAG,QAAQ,CAAC,YAAY,CAAC;wBAC1D,CAAC;wBAED,OAAO,QAAQ,CAAC;oBAClB,CAAC;oBAAC,OAAO,CAAC,EAAE,CAAC;wBACX,MAAM,IAAI,KAAK,CAAC,oCAAoC,CAAC,CAAC;oBACxD,CAAC;gBACH,CAAC;aACF,CAAC;YAEF,OAAO,IAAI,CAAC,aAAa,CAAC;QAC5B,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,MAAM,IAAI,KAAK,CAAC,gBAAgB,CAAC,CAAC;QACpC,CAAC;IACH,CAAC;IAED,IAAW,cAAc;QACvB,OAAO,IAAI,CAAC,eAAe,CAAC,cAAc,IAAI,IAAI,CAAC;IACrD,CAAC;IAED,IAAW,cAAc;QACvB,OAAO,IAAI,CAAC,eAAe,CAAC;IAC9B,CAAC;IAED,IAAW,OAAO;QAChB,OAAO,IAAI,CAAC,QAAQ,CAAC;IACvB,CAAC;IAEM,KAAK,CAAC,kBAAkB,CAAC,MAAuB;QACrD,IAAI,CAAC,eAAe,CAAC,cAAc,GAAG,MAAM,CAAC;QAC7C,IAAI,CAAC,eAAe,GAAG,MAAM,CAAC;QAC9B,IAAI,CAAC,IAAI,CAAC,aAAa;YAAE,OAAO;QAChC,IAAI,IAAI,CAAC,eAAe,KAAK,WAAW,EAAE,CAAC;YACzC,MAAM,IAAI,CAAC,eAAe,CAAC,aAAa,EAAE,CAAC;YAC3C,MAAM,IAAI,CAAC,eAAe,CAAC,cAAc,CAAC;gBACxC,eAAe,EAAE,IAAI,CAAC,eAAe;gBACrC,YAAY,EAAE,IAAI,CAAC,aAAa;aACjC,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAEM,kBAAkB,CAAC,QAAgB;QACxC,IAAI,mBAAmB,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC3C,IAAI,CAAC,eAAe,GAAG;gBACrB,GAAG,IAAI,CAAC,eAAe;gBACvB,eAAe,EAAE,QAAQ;aAC1B,CAAC;YAEF,oEAAoE;YACpE,IAAI,IAAI,CAAC,aAAa,IAAI,IAAI,CAAC,eAAe,KAAK,WAAW,EAAE,CAAC;gBAC/D,IAAI,CAAC,eAAe,CAAC,aAAa,EAAE,CAAC;gBACrC,IAAI,CAAC,eAAe,CAAC,cAAc,CAAC;oBAClC,eAAe,EAAE,IAAI,CAAC,eAAe;oBACrC,YAAY,EAAE,IAAI,CAAC,aAAa;oBAChC,kBAAkB,EAAE,IAAI,CAAC,kBAAkB;iBAC5C,CAAC,CAAC;YACL,CAAC;QACH,CAAC;IACH,CAAC;IAED,kBAAkB,CAAC,KAAiB;QAClC,kDAAkD;QAClD,mCAAmC;QACnC,IAAI,IAAI,CAAC,kBAAkB,EAAE,CAAC;YAC5B,KAAK,CAAC,cAAc,EAAE,CAAC;QACzB,CAAC;IACH,CAAC;IAED,wCAAwC;IACxC,KAAK,CAAC,0BAA0B,CAAC,KAAY;QAC3C,MAAM,WAAW,GAAG,KAAoB,CAAC;QACzC,IAAI,CAAC,kBAAkB,CAAC,WAAW,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC;IAC7D,CAAC;IAED,gCAAgC;IAChC,kBAAkB,CAAC,KAAY;QAC7B,MAAM,WAAW,GAAG,KAAoB,CAAC;QACzC,MAAM,QAAQ,GAAG,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC;QAC7C,IAAI,QAAQ,EAAE,CAAC;YACb,IAAI,CAAC,kBAAkB,CAAC,QAAQ,CAAC,CAAC;QACpC,CAAC;IACH,CAAC;IAED,MAAM;QACJ,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC;YACxB,OAAO,IAAI,CAAA,qCAAqC,CAAC;QACnD,CAAC;QAED,MAAM,SAAS,GACb,IAAI,CAAC,eAAe,KAAK,cAAc;YACvC,IAAI,CAAC,eAAe,KAAK,UAAU,CAAC;QACtC,MAAM,WAAW,GAAG,IAAI,CAAC,eAAe,KAAK,WAAW,CAAC;QACzD,OAAO,IAAI,CAAA;;;mBAGI,IAAI,CAAC,eAAe;uBAChB,IAAI,CAAC,kBAAkB;kBAC5B,WAAW,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ;;YAEpC,SAAS;YACT,CAAC,CAAC,IAAI,CAAA,gDAAgD;YACtD,CAAC,CAAC,WAAW;gBACX,CAAC,CAAC,IAAI,CAAA,oCAAoC;gBAC1C,CAAC,CAAC,IAAI,CAAA,8BAA8B;;qBAE7B,IAAI,CAAC,WAAW;sBACf,WAAW;;;;UAIvB,IAAI,CAAC,eAAe,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAA;;4BAEpB,IAAI,CAAC,eAAe;8BAClB,IAAI,CAAC,eAAe,CAAC,eAAe;8BACpC,IAAI,CAAC,eAAe,KAAK,SAAS;uCACzB,IAAI,CAAC,0BAA0B;8BACxC,IAAI,CAAC,kBAAkB;6BACxB,IAAI,CAAC,eAAe;;SAExC,CAAC,CAAC,CAAC,EAAE;;KAET,CAAC;IACJ,CAAC;;AA3SM,qBAAM,GAAG,CAAC,YAAY,EAAE,WAAW,EAAE,eAAe,EAAE,aAAa,CAAC,AAA9D,CAA+D;AAG5E;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;uDACwC;AAGnE;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;0DACoD;AAG9E;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;0DACQ;AAGpC;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;uDACuC;AAGjE;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;0DACO;AAG3B;IADP,KAAK,EAAE;qDACwC;AAGxC;IADP,KAAK,EAAE;mDACwB;AAGxB;IADP,KAAK,EAAE;uDAC4C;AAG5C;IADP,KAAK,EAAE;uDAC6C;AAG7C;IADP,KAAK,EAAE;gDACiC;AAgR3C,eAAe,cAAc,CAAC","sourcesContent":["import { type Corti } from '@corti/sdk';\n\n// corti-dictation.ts\nimport { html, LitElement } from 'lit';\nimport { property, state } from 'lit/decorators.js';\nimport { RecorderManager } from './RecorderManager.js';\nimport './components/settings-menu.js';\nimport './components/audio-visualiser.js';\nimport './icons/icons.js';\nimport ThemeStyles from './styles/theme.js';\nimport ButtonStyles from './styles/buttons.js';\nimport ComponentStyles from './styles/ComponentStyles.js';\n\nimport type { ConfigurableSettings, RecordingState, ServerConfig } from './types.js';\nimport { DEFAULT_DICTATION_CONFIG, LANGUAGES_SUPPORTED } from './constants.js';\nimport CalloutStyles from './styles/callout.js';\nimport { decodeToken } from './utils.js';\n\nexport class CortiDictation extends LitElement {\n static styles = [ButtonStyles, ThemeStyles, ComponentStyles, CalloutStyles];\n\n @property({ type: Object })\n dictationConfig: Corti.TranscribeConfig = DEFAULT_DICTATION_CONFIG;\n\n @property({ type: Array })\n languagesSupported: Corti.TranscribeSupportedLanguage[] = LANGUAGES_SUPPORTED;\n\n @property({ type: Boolean })\n debug_displayAudio: boolean = false;\n\n @property({ type: Array })\n settingsEnabled: ConfigurableSettings[] = [\"device\", \"language\"];\n \n @property({ type: Boolean })\n preventButtonFocus: boolean = true;\n\n @state()\n private _serverConfig: ServerConfig | undefined;\n\n @state()\n private _audioLevel: number = 0;\n\n @state()\n private _recordingState: RecordingState = 'stopped';\n\n @state()\n private _selectedDevice: MediaDeviceInfo | undefined;\n\n @state()\n private _devices: MediaDeviceInfo[] = [];\n\n private recorderManager = new RecorderManager();\n\n async connectedCallback() {\n super.connectedCallback();\n const devices = await this.recorderManager.initialize();\n if (devices.selectedDevice) {\n this._selectedDevice = this.recorderManager.selectedDevice;\n this._devices = this.recorderManager.devices;\n this.dispatchEvent(new CustomEvent('ready'));\n }\n\n // Map event names to any extra handling logic\n const eventHandlers: Record<string, (e: CustomEvent) => void> = {\n 'recording-state-changed': e => {\n this._recordingState = e.detail.state;\n },\n 'devices-changed': () => {\n this._devices = [...this.recorderManager.devices];\n this.requestUpdate();\n },\n 'audio-level-changed': e => {\n this._audioLevel = e.detail.audioLevel;\n this.requestUpdate();\n },\n };\n\n const eventsToRelay = [\n 'recording-state-changed',\n 'recording-devices-changed',\n 'audio-level-changed',\n 'error',\n 'transcript',\n 'command',\n 'ready',\n 'usage',\n 'stream-closed',\n ];\n\n eventsToRelay.forEach(eventName => {\n this.recorderManager.addEventListener(eventName, (e: Event) => {\n const customEvent = e as CustomEvent;\n // Perform any additional handling if defined\n if (eventHandlers[eventName]) {\n eventHandlers[eventName](customEvent);\n }\n // Re-dispatch the event from the component\n this.dispatchEvent(\n new CustomEvent(eventName, {\n detail: customEvent.detail,\n bubbles: eventName !== 'error',\n composed: true,\n }),\n );\n });\n });\n }\n\n public startRecording() {\n if (!this._serverConfig) return;\n this.recorderManager.startRecording({\n dictationConfig: this.dictationConfig,\n serverConfig: this._serverConfig!,\n debug_displayAudio: this.debug_displayAudio,\n });\n }\n\n public stopRecording() {\n this.recorderManager.stopRecording();\n }\n\n public toggleRecording() {\n if (this._recordingState === 'recording') {\n this.stopRecording();\n } else if (this._recordingState === 'stopped') {\n this.startRecording();\n }\n }\n\n /**\n * Sets the access token and returns the server configuration.\n *\n * NOTE: We decode the token here only for backward compatibility in return values.\n * The SDK now handles token parsing internally, so this return value should be\n * reduced in the future to only include necessary fields.\n */\n public setAccessToken(token: string) {\n try {\n const decoded = decodeToken(token);\n this._serverConfig = decoded;\n return decoded;\n } catch (e) {\n throw new Error('Invalid token');\n }\n }\n\n /**\n * Sets the authentication configuration and returns the server configuration.\n *\n * NOTE: We decode tokens here only for backward compatibility in return values.\n * The SDK now handles token parsing internally, so this return value should be\n * reduced in the future to only include necessary fields.\n */\n public async setAuthConfig(\n config: Corti.BearerOptions,\n ): Promise<ServerConfig> {\n try {\n const initialToken =\n 'accessToken' in config\n ? { accessToken: config.accessToken, refreshToken: config.refreshToken }\n : await config.refreshAccessToken();\n\n if (\n !initialToken?.accessToken ||\n typeof initialToken.accessToken !== 'string'\n ) {\n throw new Error('Access token is required and must be a string');\n }\n\n // Decode tokens only for return value compatibility\n // The SDK handles its own token parsing internally\n const decoded = decodeToken(initialToken.accessToken);\n\n if (!decoded) {\n throw new Error('Invalid token format');\n }\n\n this._serverConfig = {\n environment: decoded.environment,\n tenant: decoded.tenant,\n accessToken: initialToken.accessToken,\n refreshToken: config.refreshToken,\n refreshAccessToken: async (refreshToken?: string) => {\n try {\n if (!config.refreshAccessToken) {\n return {\n accessToken: this._serverConfig?.accessToken || 'no_token',\n expiresIn: Infinity,\n refreshToken,\n };\n }\n\n const response = await config.refreshAccessToken(refreshToken);\n\n if (this._serverConfig) {\n this._serverConfig.accessToken = response.accessToken;\n this._serverConfig.refreshToken = response.refreshToken;\n }\n\n return response;\n } catch (e) {\n throw new Error('Error when refreshing access token');\n }\n },\n };\n\n return this._serverConfig;\n } catch (e) {\n throw new Error('Invalid config');\n }\n }\n\n public get selectedDevice(): MediaDeviceInfo | null {\n return this.recorderManager.selectedDevice || null;\n }\n\n public get recordingState(): RecordingState {\n return this._recordingState;\n }\n\n public get devices(): MediaDeviceInfo[] {\n return this._devices;\n }\n\n public async setRecordingDevice(device: MediaDeviceInfo) {\n this.recorderManager.selectedDevice = device;\n this._selectedDevice = device;\n if (!this._serverConfig) return;\n if (this._recordingState === 'recording') {\n await this.recorderManager.stopRecording();\n await this.recorderManager.startRecording({\n dictationConfig: this.dictationConfig,\n serverConfig: this._serverConfig,\n });\n }\n }\n\n public setPrimaryLanguage(language: string) {\n if (LANGUAGES_SUPPORTED.includes(language)) {\n this.dictationConfig = {\n ...this.dictationConfig,\n primaryLanguage: language,\n };\n\n // If recording is in progress, restart to apply the language change\n if (this._serverConfig && this._recordingState === 'recording') {\n this.recorderManager.stopRecording();\n this.recorderManager.startRecording({\n dictationConfig: this.dictationConfig,\n serverConfig: this._serverConfig,\n debug_displayAudio: this.debug_displayAudio,\n });\n }\n }\n }\n\n _onButtonMouseDown(event: MouseEvent) {\n // Prevent button from taking focus on mouse click\n // This keeps focus on the textarea\n if (this.preventButtonFocus) {\n event.preventDefault();\n }\n }\n\n // Handle device change events if needed\n async _onRecordingDevicesChanged(event: Event) {\n const customEvent = event as CustomEvent;\n this.setRecordingDevice(customEvent.detail.selectedDevice);\n }\n\n // Handle language change events\n _onLanguageChanged(event: Event) {\n const customEvent = event as CustomEvent;\n const language = customEvent.detail.language;\n if (language) {\n this.setPrimaryLanguage(language);\n }\n }\n\n render() {\n if (!this._serverConfig) {\n return html` <div style=\"display: none\"></div> `;\n }\n\n const isLoading =\n this._recordingState === 'initializing' ||\n this._recordingState === 'stopping';\n const isRecording = this._recordingState === 'recording';\n return html`\n <div class=\"wrapper\">\n <button\n @click=${this.toggleRecording}\n @mousedown=${this._onButtonMouseDown}\n class=${isRecording ? 'red' : 'accent'}\n >\n ${isLoading\n ? html` <icon-loading-spinner></icon-loading-spinner>`\n : isRecording\n ? html` <icon-recording></icon-recording>`\n : html` <icon-mic-on></icon-mic-on>`}\n <audio-visualiser\n .level=${this._audioLevel}\n .active=${isRecording}\n ></audio-visualiser>\n </button>\n\n ${this.settingsEnabled.length > 0 ? html`\n <settings-menu\n .selectedDevice=${this._selectedDevice}\n .selectedLanguage=${this.dictationConfig.primaryLanguage}\n ?settingsDisabled=${this._recordingState !== 'stopped'}\n @recording-devices-changed=${this._onRecordingDevicesChanged}\n @language-changed=${this._onLanguageChanged}\n .settingsEnabled=${this.settingsEnabled}\n ></settings-menu>\n ` : ''}\n </div>\n `;\n }\n}\n\nexport default CortiDictation;\n"]}
|
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
import { Corti } from '@corti/sdk';
|
|
2
|
-
import type { ServerConfig } from './types.js';
|
|
3
|
-
export declare class DictationService extends EventTarget {
|
|
4
|
-
private mediaRecorder;
|
|
5
|
-
private webSocket;
|
|
6
|
-
private serverConfig;
|
|
7
|
-
private dictationConfig;
|
|
8
|
-
private cortiClient;
|
|
9
|
-
constructor(mediaStream: MediaStream, { dictationConfig, serverConfig, }: {
|
|
10
|
-
dictationConfig: Corti.TranscribeConfig;
|
|
11
|
-
serverConfig: ServerConfig;
|
|
12
|
-
});
|
|
13
|
-
private dispatchCustomEvent;
|
|
14
|
-
startRecording(): Promise<void>;
|
|
15
|
-
stopRecording(): Promise<void>;
|
|
16
|
-
}
|