@corti/dictation-web 0.3.0 → 0.4.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 +9 -4
- package/dist/bundle.js +3098 -1630
- package/dist/components/audio-visualiser.d.ts +5 -3
- package/dist/components/audio-visualiser.js +38 -46
- package/dist/components/audio-visualiser.js.map +1 -1
- package/dist/components/corti-dictation.d.ts +122 -0
- package/dist/components/corti-dictation.js +234 -0
- package/dist/components/corti-dictation.js.map +1 -0
- package/dist/components/device-selector.d.ts +14 -0
- package/dist/components/device-selector.js +75 -0
- package/dist/components/device-selector.js.map +1 -0
- package/dist/components/language-selector.d.ts +15 -0
- package/dist/components/language-selector.js +74 -0
- package/dist/components/language-selector.js.map +1 -0
- package/dist/components/recording-button.d.ts +29 -0
- package/dist/components/recording-button.js +217 -0
- package/dist/components/recording-button.js.map +1 -0
- package/dist/components/settings-menu.d.ts +9 -15
- package/dist/components/settings-menu.js +48 -161
- package/dist/components/settings-menu.js.map +1 -1
- package/dist/constants.d.ts +8 -2
- package/dist/constants.js +38 -12
- package/dist/constants.js.map +1 -1
- package/dist/contexts/dictation-context.d.ts +99 -0
- package/dist/contexts/dictation-context.js +257 -0
- package/dist/contexts/dictation-context.js.map +1 -0
- package/dist/controllers/DictationController.d.ts +35 -0
- package/dist/controllers/DictationController.js +130 -0
- package/dist/controllers/DictationController.js.map +1 -0
- package/dist/controllers/MediaController.d.ts +31 -0
- package/dist/controllers/MediaController.js +99 -0
- package/dist/controllers/MediaController.js.map +1 -0
- package/dist/controllers/devices-controller.d.ts +26 -0
- package/dist/controllers/devices-controller.js +99 -0
- package/dist/controllers/devices-controller.js.map +1 -0
- package/dist/controllers/dictation-controller.d.ts +28 -0
- package/dist/controllers/dictation-controller.js +141 -0
- package/dist/controllers/dictation-controller.js.map +1 -0
- package/dist/controllers/languages-controller.d.ts +26 -0
- package/dist/controllers/languages-controller.js +83 -0
- package/dist/controllers/languages-controller.js.map +1 -0
- package/dist/controllers/media-controller.d.ts +24 -0
- package/dist/controllers/media-controller.js +115 -0
- package/dist/controllers/media-controller.js.map +1 -0
- package/dist/index.d.ts +9 -1
- package/dist/index.js +29 -3
- package/dist/index.js.map +1 -1
- package/dist/package.json +14 -0
- package/dist/src/components/audio-visualiser.d.ts +14 -0
- package/dist/src/components/audio-visualiser.js +57 -0
- package/dist/src/components/audio-visualiser.js.map +1 -0
- package/dist/src/components/corti-dictation.d.ts +123 -0
- package/dist/src/components/corti-dictation.js +224 -0
- package/dist/src/components/corti-dictation.js.map +1 -0
- package/dist/src/components/device-selector.d.ts +24 -0
- package/dist/src/components/device-selector.js +106 -0
- package/dist/src/components/device-selector.js.map +1 -0
- package/dist/src/components/language-selector.d.ts +24 -0
- package/dist/src/components/language-selector.js +100 -0
- package/dist/src/components/language-selector.js.map +1 -0
- package/dist/src/components/recording-button.d.ts +37 -0
- package/dist/src/components/recording-button.js +203 -0
- package/dist/src/components/recording-button.js.map +1 -0
- package/dist/src/components/settings-menu.d.ts +16 -0
- package/dist/src/components/settings-menu.js +80 -0
- package/dist/src/components/settings-menu.js.map +1 -0
- package/dist/src/constants.d.ts +4 -0
- package/dist/src/constants.js +37 -0
- package/dist/src/constants.js.map +1 -0
- package/dist/src/contexts/dictation-context.d.ts +97 -0
- package/dist/src/contexts/dictation-context.js +208 -0
- package/dist/src/contexts/dictation-context.js.map +1 -0
- package/dist/src/controllers/DictationController.d.ts +35 -0
- package/dist/src/controllers/DictationController.js +130 -0
- package/dist/src/controllers/DictationController.js.map +1 -0
- package/dist/src/controllers/MediaController.d.ts +31 -0
- package/dist/src/controllers/MediaController.js +99 -0
- package/dist/src/controllers/MediaController.js.map +1 -0
- package/dist/src/icons/icons.d.ts +17 -0
- package/dist/src/icons/icons.js +158 -0
- package/dist/src/icons/icons.js.map +1 -0
- package/dist/src/styles/ComponentStyles.d.ts +2 -0
- package/dist/src/styles/ComponentStyles.js +18 -0
- package/dist/src/styles/ComponentStyles.js.map +1 -0
- package/dist/src/styles/audio-visualiser.d.ts +2 -0
- package/dist/src/styles/audio-visualiser.js +33 -0
- package/dist/src/styles/audio-visualiser.js.map +1 -0
- package/dist/src/styles/buttons.d.ts +2 -0
- package/dist/src/styles/buttons.js +52 -0
- package/dist/src/styles/buttons.js.map +1 -0
- package/dist/src/styles/callout.d.ts +2 -0
- package/dist/src/styles/callout.js +23 -0
- package/dist/src/styles/callout.js.map +1 -0
- package/dist/src/styles/default-theme.d.ts +2 -0
- package/dist/src/styles/default-theme.js +50 -0
- package/dist/src/styles/default-theme.js.map +1 -0
- package/dist/src/styles/recording-button.d.ts +2 -0
- package/dist/src/styles/recording-button.js +8 -0
- package/dist/src/styles/recording-button.js.map +1 -0
- package/dist/src/styles/select.d.ts +2 -0
- package/dist/src/styles/select.js +36 -0
- package/dist/src/styles/select.js.map +1 -0
- package/dist/src/styles/settings-menu.d.ts +2 -0
- package/dist/src/styles/settings-menu.js +34 -0
- package/dist/src/styles/settings-menu.js.map +1 -0
- package/dist/src/types.d.ts +7 -0
- package/dist/src/types.js +2 -0
- package/dist/src/types.js.map +1 -0
- package/dist/src/utils/auth.d.ts +9 -0
- package/dist/src/utils/auth.js +21 -0
- package/dist/src/utils/auth.js.map +1 -0
- package/dist/src/utils/converters.d.ts +4 -0
- package/dist/src/utils/converters.js +8 -0
- package/dist/src/utils/converters.js.map +1 -0
- package/dist/src/utils/devices.d.ts +26 -0
- package/dist/src/utils/devices.js +53 -0
- package/dist/src/utils/devices.js.map +1 -0
- package/dist/src/utils/events.d.ts +44 -0
- package/dist/src/utils/events.js +88 -0
- package/dist/src/utils/events.js.map +1 -0
- package/dist/src/utils/languages.d.ts +7 -0
- package/dist/src/utils/languages.js +29 -0
- package/dist/src/utils/languages.js.map +1 -0
- package/dist/src/utils/media.d.ts +6 -0
- package/dist/src/utils/media.js +39 -0
- package/dist/src/utils/media.js.map +1 -0
- package/dist/src/utils/token.d.ts +13 -0
- package/dist/src/utils/token.js +60 -0
- package/dist/src/utils/token.js.map +1 -0
- package/dist/src/utils/validation.d.ts +1 -0
- package/dist/src/utils/validation.js +7 -0
- package/dist/src/utils/validation.js.map +1 -0
- package/dist/stories/audio-visualiser.stories.d.ts +39 -0
- package/dist/stories/audio-visualiser.stories.js +71 -0
- package/dist/stories/audio-visualiser.stories.js.map +1 -0
- package/dist/stories/corti-dictation.stories.d.ts +27 -0
- package/dist/stories/corti-dictation.stories.js +129 -0
- package/dist/stories/corti-dictation.stories.js.map +1 -0
- package/dist/stories/device-selector.stories.d.ts +18 -0
- package/dist/stories/device-selector.stories.js +84 -0
- package/dist/stories/device-selector.stories.js.map +1 -0
- package/dist/stories/language-selector.stories.d.ts +18 -0
- package/dist/stories/language-selector.stories.js +53 -0
- package/dist/stories/language-selector.stories.js.map +1 -0
- package/dist/stories/recording-button.stories.d.ts +27 -0
- package/dist/stories/recording-button.stories.js +90 -0
- package/dist/stories/recording-button.stories.js.map +1 -0
- package/dist/stories/settings-menu.stories.d.ts +23 -0
- package/dist/stories/settings-menu.stories.js +156 -0
- package/dist/stories/settings-menu.stories.js.map +1 -0
- package/dist/styles/ComponentStyles.js +5 -39
- package/dist/styles/ComponentStyles.js.map +1 -1
- package/dist/styles/audio-visualiser.d.ts +2 -0
- package/dist/styles/audio-visualiser.js +33 -0
- package/dist/styles/audio-visualiser.js.map +1 -0
- package/dist/styles/buttons.js +19 -26
- package/dist/styles/buttons.js.map +1 -1
- package/dist/styles/callout.js +7 -17
- package/dist/styles/callout.js.map +1 -1
- package/dist/styles/component-styles.d.ts +2 -0
- package/dist/styles/component-styles.js +22 -0
- package/dist/styles/component-styles.js.map +1 -0
- package/dist/styles/default-theme.d.ts +2 -0
- package/dist/styles/default-theme.js +14 -0
- package/dist/styles/default-theme.js.map +1 -0
- package/dist/styles/recording-button.d.ts +2 -0
- package/dist/styles/recording-button.js +8 -0
- package/dist/styles/recording-button.js.map +1 -0
- package/dist/styles/select.js +9 -9
- package/dist/styles/select.js.map +1 -1
- package/dist/styles/settings-menu.d.ts +2 -0
- package/dist/styles/settings-menu.js +34 -0
- package/dist/styles/settings-menu.js.map +1 -0
- package/dist/tsconfig.stories.tsbuildinfo +1 -0
- package/dist/types.d.ts +6 -8
- package/dist/types.js.map +1 -1
- package/dist/utils/auth.d.ts +9 -0
- package/dist/utils/auth.js +21 -0
- package/dist/utils/auth.js.map +1 -0
- package/dist/utils/converters.d.ts +4 -0
- package/dist/utils/converters.js +8 -0
- package/dist/utils/converters.js.map +1 -0
- package/dist/utils/devices.d.ts +26 -0
- package/dist/utils/devices.js +53 -0
- package/dist/utils/devices.js.map +1 -0
- package/dist/utils/events.d.ts +44 -0
- package/dist/utils/events.js +88 -0
- package/dist/utils/events.js.map +1 -0
- package/dist/utils/languages.d.ts +8 -0
- package/dist/utils/languages.js +29 -0
- package/dist/utils/languages.js.map +1 -0
- package/dist/utils/media.d.ts +6 -0
- package/dist/utils/media.js +39 -0
- package/dist/utils/media.js.map +1 -0
- package/dist/utils/token.d.ts +13 -0
- package/dist/utils/token.js +60 -0
- package/dist/utils/token.js.map +1 -0
- package/dist/utils/validation.d.ts +1 -0
- package/dist/utils/validation.js +7 -0
- package/dist/utils/validation.js.map +1 -0
- package/package.json +29 -55
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import type { Corti } from "@corti/sdk";
|
|
2
|
+
import type { ReactiveController, ReactiveControllerHost } from "lit";
|
|
3
|
+
interface LanguagesControllerHost extends ReactiveControllerHost {
|
|
4
|
+
region?: string;
|
|
5
|
+
dictationConfig?: Corti.TranscribeConfig;
|
|
6
|
+
dispatchEvent(event: CustomEvent): boolean;
|
|
7
|
+
requestUpdate(): void;
|
|
8
|
+
_languages?: Corti.TranscribeSupportedLanguage[];
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Controller that manages automatic language loading based on region.
|
|
12
|
+
* Loads languages when they're not present and handles region changes.
|
|
13
|
+
* Reacts to updates and automatically loads languages when needed.
|
|
14
|
+
*/
|
|
15
|
+
export declare class LanguagesController implements ReactiveController {
|
|
16
|
+
#private;
|
|
17
|
+
host: LanguagesControllerHost;
|
|
18
|
+
constructor(host: LanguagesControllerHost);
|
|
19
|
+
initialize(): void;
|
|
20
|
+
hostUpdate(): void;
|
|
21
|
+
/**
|
|
22
|
+
* Clear the auto-loaded flag (when languages are set externally)
|
|
23
|
+
*/
|
|
24
|
+
clearAutoLoadedFlag(): void;
|
|
25
|
+
}
|
|
26
|
+
export {};
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {
|
|
2
|
+
if (kind === "m") throw new TypeError("Private method is not writable");
|
|
3
|
+
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
|
|
4
|
+
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
|
|
5
|
+
return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
|
|
6
|
+
};
|
|
7
|
+
var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
|
|
8
|
+
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
|
|
9
|
+
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
|
|
10
|
+
return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
|
|
11
|
+
};
|
|
12
|
+
var _LanguagesController_instances, _LanguagesController_autoLoadedLanguages, _LanguagesController_loadingLanguages, _LanguagesController_previousRegion, _LanguagesController_initialized, _LanguagesController_loadLanguages;
|
|
13
|
+
import { errorEvent, languagesChangedEvent } from "../utils/events.js";
|
|
14
|
+
import { getLanguagesByRegion } from "../utils/languages.js";
|
|
15
|
+
/**
|
|
16
|
+
* Controller that manages automatic language loading based on region.
|
|
17
|
+
* Loads languages when they're not present and handles region changes.
|
|
18
|
+
* Reacts to updates and automatically loads languages when needed.
|
|
19
|
+
*/
|
|
20
|
+
export class LanguagesController {
|
|
21
|
+
constructor(host) {
|
|
22
|
+
_LanguagesController_instances.add(this);
|
|
23
|
+
_LanguagesController_autoLoadedLanguages.set(this, false);
|
|
24
|
+
_LanguagesController_loadingLanguages.set(this, false);
|
|
25
|
+
_LanguagesController_previousRegion.set(this, void 0);
|
|
26
|
+
_LanguagesController_initialized.set(this, false);
|
|
27
|
+
this.host = host;
|
|
28
|
+
host.addController(this);
|
|
29
|
+
}
|
|
30
|
+
initialize() {
|
|
31
|
+
__classPrivateFieldSet(this, _LanguagesController_initialized, true, "f");
|
|
32
|
+
if (this.host._languages === undefined) {
|
|
33
|
+
__classPrivateFieldGet(this, _LanguagesController_instances, "m", _LanguagesController_loadLanguages).call(this);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
hostUpdate() {
|
|
37
|
+
// Only react to updates after initialization
|
|
38
|
+
if (!__classPrivateFieldGet(this, _LanguagesController_initialized, "f")) {
|
|
39
|
+
return;
|
|
40
|
+
}
|
|
41
|
+
// When region changes, reload languages if they were auto-loaded
|
|
42
|
+
if ((__classPrivateFieldGet(this, _LanguagesController_previousRegion, "f") !== this.host.region &&
|
|
43
|
+
__classPrivateFieldGet(this, _LanguagesController_autoLoadedLanguages, "f")) ||
|
|
44
|
+
this.host._languages === undefined) {
|
|
45
|
+
__classPrivateFieldGet(this, _LanguagesController_instances, "m", _LanguagesController_loadLanguages).call(this);
|
|
46
|
+
}
|
|
47
|
+
__classPrivateFieldSet(this, _LanguagesController_previousRegion, this.host.region, "f");
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Clear the auto-loaded flag (when languages are set externally)
|
|
51
|
+
*/
|
|
52
|
+
clearAutoLoadedFlag() {
|
|
53
|
+
__classPrivateFieldSet(this, _LanguagesController_autoLoadedLanguages, false, "f");
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
_LanguagesController_autoLoadedLanguages = new WeakMap(), _LanguagesController_loadingLanguages = new WeakMap(), _LanguagesController_previousRegion = new WeakMap(), _LanguagesController_initialized = new WeakMap(), _LanguagesController_instances = new WeakSet(), _LanguagesController_loadLanguages = async function _LanguagesController_loadLanguages() {
|
|
57
|
+
if (__classPrivateFieldGet(this, _LanguagesController_loadingLanguages, "f")) {
|
|
58
|
+
return;
|
|
59
|
+
}
|
|
60
|
+
__classPrivateFieldSet(this, _LanguagesController_loadingLanguages, true, "f");
|
|
61
|
+
try {
|
|
62
|
+
const { languages, defaultLanguage } = getLanguagesByRegion(this.host.region);
|
|
63
|
+
__classPrivateFieldSet(this, _LanguagesController_autoLoadedLanguages, true, "f");
|
|
64
|
+
this.host._languages = languages;
|
|
65
|
+
const previousLanguage = this.host.dictationConfig?.primaryLanguage;
|
|
66
|
+
const selectedLanguage = previousLanguage && languages.includes(previousLanguage)
|
|
67
|
+
? previousLanguage
|
|
68
|
+
: defaultLanguage;
|
|
69
|
+
this.host.dictationConfig = {
|
|
70
|
+
...this.host.dictationConfig,
|
|
71
|
+
primaryLanguage: selectedLanguage || "en",
|
|
72
|
+
};
|
|
73
|
+
this.host.requestUpdate();
|
|
74
|
+
this.host.dispatchEvent(languagesChangedEvent(languages, selectedLanguage));
|
|
75
|
+
}
|
|
76
|
+
catch (error) {
|
|
77
|
+
this.host.dispatchEvent(errorEvent(error));
|
|
78
|
+
}
|
|
79
|
+
finally {
|
|
80
|
+
__classPrivateFieldSet(this, _LanguagesController_loadingLanguages, false, "f");
|
|
81
|
+
}
|
|
82
|
+
};
|
|
83
|
+
//# sourceMappingURL=languages-controller.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"languages-controller.js","sourceRoot":"","sources":["../../src/controllers/languages-controller.ts"],"names":[],"mappings":";;;;;;;;;;;;AAEA,OAAO,EAAE,UAAU,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AACvE,OAAO,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAU7D;;;;GAIG;AACH,MAAM,OAAO,mBAAmB;IAO9B,YAAY,IAA6B;;QALzC,mDAAgC,KAAK,EAAC;QACtC,gDAA6B,KAAK,EAAC;QACnC,sDAAyB;QACzB,2CAAwB,KAAK,EAAC;QAG5B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;IAC3B,CAAC;IAED,UAAU;QACR,uBAAA,IAAI,oCAAgB,IAAI,MAAA,CAAC;QAEzB,IAAI,IAAI,CAAC,IAAI,CAAC,UAAU,KAAK,SAAS,EAAE,CAAC;YACvC,uBAAA,IAAI,0EAAe,MAAnB,IAAI,CAAiB,CAAC;QACxB,CAAC;IACH,CAAC;IAED,UAAU;QACR,6CAA6C;QAC7C,IAAI,CAAC,uBAAA,IAAI,wCAAa,EAAE,CAAC;YACvB,OAAO;QACT,CAAC;QAED,iEAAiE;QACjE,IACE,CAAC,uBAAA,IAAI,2CAAgB,KAAK,IAAI,CAAC,IAAI,CAAC,MAAM;YACxC,uBAAA,IAAI,gDAAqB,CAAC;YAC5B,IAAI,CAAC,IAAI,CAAC,UAAU,KAAK,SAAS,EAClC,CAAC;YACD,uBAAA,IAAI,0EAAe,MAAnB,IAAI,CAAiB,CAAC;QACxB,CAAC;QAED,uBAAA,IAAI,uCAAmB,IAAI,CAAC,IAAI,CAAC,MAAM,MAAA,CAAC;IAC1C,CAAC;IAuCD;;OAEG;IACH,mBAAmB;QACjB,uBAAA,IAAI,4CAAwB,KAAK,MAAA,CAAC;IACpC,CAAC;CACF;6SA3CC,KAAK;IACH,IAAI,uBAAA,IAAI,6CAAkB,EAAE,CAAC;QAC3B,OAAO;IACT,CAAC;IAED,uBAAA,IAAI,yCAAqB,IAAI,MAAA,CAAC;IAE9B,IAAI,CAAC;QACH,MAAM,EAAE,SAAS,EAAE,eAAe,EAAE,GAAG,oBAAoB,CACzD,IAAI,CAAC,IAAI,CAAC,MAAM,CACjB,CAAC;QAEF,uBAAA,IAAI,4CAAwB,IAAI,MAAA,CAAC;QACjC,IAAI,CAAC,IAAI,CAAC,UAAU,GAAG,SAAS,CAAC;QAEjC,MAAM,gBAAgB,GAAG,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,eAAe,CAAC;QACpE,MAAM,gBAAgB,GACpB,gBAAgB,IAAI,SAAS,CAAC,QAAQ,CAAC,gBAAgB,CAAC;YACtD,CAAC,CAAC,gBAAgB;YAClB,CAAC,CAAC,eAAe,CAAC;QAEtB,IAAI,CAAC,IAAI,CAAC,eAAe,GAAG;YAC1B,GAAG,IAAI,CAAC,IAAI,CAAC,eAAe;YAC5B,eAAe,EAAE,gBAAgB,IAAI,IAAI;SAC1C,CAAC;QAEF,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC;QAC1B,IAAI,CAAC,IAAI,CAAC,aAAa,CACrB,qBAAqB,CAAC,SAAS,EAAE,gBAAgB,CAAC,CACnD,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC;IAC7C,CAAC;YAAS,CAAC;QACT,uBAAA,IAAI,yCAAqB,KAAK,MAAA,CAAC;IACjC,CAAC;AACH,CAAC","sourcesContent":["import type { Corti } from \"@corti/sdk\";\nimport type { ReactiveController, ReactiveControllerHost } from \"lit\";\nimport { errorEvent, languagesChangedEvent } from \"../utils/events.js\";\nimport { getLanguagesByRegion } from \"../utils/languages.js\";\n\ninterface LanguagesControllerHost extends ReactiveControllerHost {\n region?: string;\n dictationConfig?: Corti.TranscribeConfig;\n dispatchEvent(event: CustomEvent): boolean;\n requestUpdate(): void;\n _languages?: Corti.TranscribeSupportedLanguage[];\n}\n\n/**\n * Controller that manages automatic language loading based on region.\n * Loads languages when they're not present and handles region changes.\n * Reacts to updates and automatically loads languages when needed.\n */\nexport class LanguagesController implements ReactiveController {\n host: LanguagesControllerHost;\n #autoLoadedLanguages: boolean = false;\n #loadingLanguages: boolean = false;\n #previousRegion?: string;\n #initialized: boolean = false;\n\n constructor(host: LanguagesControllerHost) {\n this.host = host;\n host.addController(this);\n }\n\n initialize(): void {\n this.#initialized = true;\n\n if (this.host._languages === undefined) {\n this.#loadLanguages();\n }\n }\n\n hostUpdate(): void {\n // Only react to updates after initialization\n if (!this.#initialized) {\n return;\n }\n\n // When region changes, reload languages if they were auto-loaded\n if (\n (this.#previousRegion !== this.host.region &&\n this.#autoLoadedLanguages) ||\n this.host._languages === undefined\n ) {\n this.#loadLanguages();\n }\n\n this.#previousRegion = this.host.region;\n }\n\n async #loadLanguages(): Promise<void> {\n if (this.#loadingLanguages) {\n return;\n }\n\n this.#loadingLanguages = true;\n\n try {\n const { languages, defaultLanguage } = getLanguagesByRegion(\n this.host.region,\n );\n\n this.#autoLoadedLanguages = true;\n this.host._languages = languages;\n\n const previousLanguage = this.host.dictationConfig?.primaryLanguage;\n const selectedLanguage =\n previousLanguage && languages.includes(previousLanguage)\n ? previousLanguage\n : defaultLanguage;\n\n this.host.dictationConfig = {\n ...this.host.dictationConfig,\n primaryLanguage: selectedLanguage || \"en\",\n };\n\n this.host.requestUpdate();\n this.host.dispatchEvent(\n languagesChangedEvent(languages, selectedLanguage),\n );\n } catch (error) {\n this.host.dispatchEvent(errorEvent(error));\n } finally {\n this.#loadingLanguages = false;\n }\n }\n\n /**\n * Clear the auto-loaded flag (when languages are set externally)\n */\n clearAutoLoadedFlag(): void {\n this.#autoLoadedLanguages = false;\n }\n}\n"]}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { ReactiveController, ReactiveControllerHost } from "lit";
|
|
2
|
+
interface MediaControllerHost extends ReactiveControllerHost {
|
|
3
|
+
_selectedDevice?: MediaDeviceInfo;
|
|
4
|
+
_debug_displayAudio?: boolean;
|
|
5
|
+
}
|
|
6
|
+
export declare class MediaController implements ReactiveController {
|
|
7
|
+
#private;
|
|
8
|
+
host: MediaControllerHost;
|
|
9
|
+
constructor(host: MediaControllerHost);
|
|
10
|
+
hostDisconnected(): void;
|
|
11
|
+
initialize(onTrackEnded?: () => void): Promise<void>;
|
|
12
|
+
getAudioLevel(): number;
|
|
13
|
+
startAudioLevelMonitoring(onAudioLevelChange?: (level: number) => void): void;
|
|
14
|
+
stopAudioLevelMonitoring(): void;
|
|
15
|
+
cleanup(): Promise<void>;
|
|
16
|
+
/**
|
|
17
|
+
* Stops the media recorder and waits for all buffered data to be flushed.
|
|
18
|
+
* This ensures the final ondataavailable event fires before resolving.
|
|
19
|
+
*/
|
|
20
|
+
stopRecording(): Promise<void>;
|
|
21
|
+
get mediaRecorder(): MediaRecorder | null;
|
|
22
|
+
get audioLevel(): number;
|
|
23
|
+
}
|
|
24
|
+
export {};
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {
|
|
2
|
+
if (kind === "m") throw new TypeError("Private method is not writable");
|
|
3
|
+
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
|
|
4
|
+
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
|
|
5
|
+
return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
|
|
6
|
+
};
|
|
7
|
+
var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
|
|
8
|
+
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
|
|
9
|
+
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
|
|
10
|
+
return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
|
|
11
|
+
};
|
|
12
|
+
var _MediaController_mediaStream, _MediaController_audioContext, _MediaController_analyser, _MediaController_mediaRecorder, _MediaController_visualiserInterval, _MediaController_audioLevel, _MediaController_onTrackEnded, _MediaController_onAudioLevelChange;
|
|
13
|
+
import { calculateAudioLevel, createAudioAnalyzer, getMediaStream, } from "../utils/media.js";
|
|
14
|
+
export class MediaController {
|
|
15
|
+
constructor(host) {
|
|
16
|
+
_MediaController_mediaStream.set(this, null);
|
|
17
|
+
_MediaController_audioContext.set(this, null);
|
|
18
|
+
_MediaController_analyser.set(this, null);
|
|
19
|
+
_MediaController_mediaRecorder.set(this, null);
|
|
20
|
+
_MediaController_visualiserInterval.set(this, void 0);
|
|
21
|
+
_MediaController_audioLevel.set(this, 0);
|
|
22
|
+
_MediaController_onTrackEnded.set(this, void 0);
|
|
23
|
+
_MediaController_onAudioLevelChange.set(this, void 0);
|
|
24
|
+
this.host = host;
|
|
25
|
+
host.addController(this);
|
|
26
|
+
}
|
|
27
|
+
hostDisconnected() {
|
|
28
|
+
this.cleanup();
|
|
29
|
+
}
|
|
30
|
+
async initialize(onTrackEnded) {
|
|
31
|
+
await this.cleanup();
|
|
32
|
+
__classPrivateFieldSet(this, _MediaController_onTrackEnded, onTrackEnded, "f");
|
|
33
|
+
__classPrivateFieldSet(this, _MediaController_mediaStream, await getMediaStream(this.host._selectedDevice?.deviceId, this.host._debug_displayAudio), "f");
|
|
34
|
+
__classPrivateFieldGet(this, _MediaController_mediaStream, "f").getTracks().forEach((track) => {
|
|
35
|
+
track.addEventListener("ended", () => {
|
|
36
|
+
if (__classPrivateFieldGet(this, _MediaController_onTrackEnded, "f")) {
|
|
37
|
+
__classPrivateFieldGet(this, _MediaController_onTrackEnded, "f").call(this);
|
|
38
|
+
}
|
|
39
|
+
});
|
|
40
|
+
});
|
|
41
|
+
const { audioContext, analyser } = createAudioAnalyzer(__classPrivateFieldGet(this, _MediaController_mediaStream, "f"));
|
|
42
|
+
__classPrivateFieldSet(this, _MediaController_audioContext, audioContext, "f");
|
|
43
|
+
__classPrivateFieldSet(this, _MediaController_analyser, analyser, "f");
|
|
44
|
+
__classPrivateFieldSet(this, _MediaController_mediaRecorder, new MediaRecorder(__classPrivateFieldGet(this, _MediaController_mediaStream, "f")), "f");
|
|
45
|
+
}
|
|
46
|
+
getAudioLevel() {
|
|
47
|
+
return __classPrivateFieldGet(this, _MediaController_analyser, "f") ? calculateAudioLevel(__classPrivateFieldGet(this, _MediaController_analyser, "f")) : 0;
|
|
48
|
+
}
|
|
49
|
+
startAudioLevelMonitoring(onAudioLevelChange) {
|
|
50
|
+
this.stopAudioLevelMonitoring();
|
|
51
|
+
__classPrivateFieldSet(this, _MediaController_onAudioLevelChange, onAudioLevelChange, "f");
|
|
52
|
+
__classPrivateFieldSet(this, _MediaController_visualiserInterval, window.setInterval(() => {
|
|
53
|
+
__classPrivateFieldSet(this, _MediaController_audioLevel, this.getAudioLevel() * 3, "f");
|
|
54
|
+
this.host.requestUpdate();
|
|
55
|
+
if (__classPrivateFieldGet(this, _MediaController_onAudioLevelChange, "f")) {
|
|
56
|
+
__classPrivateFieldGet(this, _MediaController_onAudioLevelChange, "f").call(this, __classPrivateFieldGet(this, _MediaController_audioLevel, "f"));
|
|
57
|
+
}
|
|
58
|
+
}, 150), "f");
|
|
59
|
+
}
|
|
60
|
+
stopAudioLevelMonitoring() {
|
|
61
|
+
if (__classPrivateFieldGet(this, _MediaController_visualiserInterval, "f")) {
|
|
62
|
+
clearInterval(__classPrivateFieldGet(this, _MediaController_visualiserInterval, "f"));
|
|
63
|
+
__classPrivateFieldSet(this, _MediaController_visualiserInterval, undefined, "f");
|
|
64
|
+
}
|
|
65
|
+
__classPrivateFieldSet(this, _MediaController_audioLevel, 0, "f");
|
|
66
|
+
this.host.requestUpdate();
|
|
67
|
+
if (__classPrivateFieldGet(this, _MediaController_onAudioLevelChange, "f")) {
|
|
68
|
+
__classPrivateFieldGet(this, _MediaController_onAudioLevelChange, "f").call(this, __classPrivateFieldGet(this, _MediaController_audioLevel, "f"));
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
async cleanup() {
|
|
72
|
+
this.stopAudioLevelMonitoring();
|
|
73
|
+
if (__classPrivateFieldGet(this, _MediaController_mediaRecorder, "f")?.state === "recording") {
|
|
74
|
+
__classPrivateFieldGet(this, _MediaController_mediaRecorder, "f").stop();
|
|
75
|
+
}
|
|
76
|
+
if (__classPrivateFieldGet(this, _MediaController_mediaStream, "f")) {
|
|
77
|
+
__classPrivateFieldGet(this, _MediaController_mediaStream, "f").getTracks().forEach((track) => {
|
|
78
|
+
track.stop();
|
|
79
|
+
});
|
|
80
|
+
__classPrivateFieldSet(this, _MediaController_mediaStream, null, "f");
|
|
81
|
+
}
|
|
82
|
+
if (__classPrivateFieldGet(this, _MediaController_audioContext, "f") && __classPrivateFieldGet(this, _MediaController_audioContext, "f").state !== "closed") {
|
|
83
|
+
await __classPrivateFieldGet(this, _MediaController_audioContext, "f").close();
|
|
84
|
+
}
|
|
85
|
+
__classPrivateFieldSet(this, _MediaController_audioContext, null, "f");
|
|
86
|
+
__classPrivateFieldSet(this, _MediaController_analyser, null, "f");
|
|
87
|
+
__classPrivateFieldSet(this, _MediaController_mediaRecorder, null, "f");
|
|
88
|
+
__classPrivateFieldSet(this, _MediaController_onTrackEnded, undefined, "f");
|
|
89
|
+
__classPrivateFieldSet(this, _MediaController_onAudioLevelChange, undefined, "f");
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Stops the media recorder and waits for all buffered data to be flushed.
|
|
93
|
+
* This ensures the final ondataavailable event fires before resolving.
|
|
94
|
+
*/
|
|
95
|
+
async stopRecording() {
|
|
96
|
+
return new Promise((resolve) => {
|
|
97
|
+
if (!__classPrivateFieldGet(this, _MediaController_mediaRecorder, "f") || __classPrivateFieldGet(this, _MediaController_mediaRecorder, "f").state !== "recording") {
|
|
98
|
+
resolve();
|
|
99
|
+
return;
|
|
100
|
+
}
|
|
101
|
+
__classPrivateFieldGet(this, _MediaController_mediaRecorder, "f").onstop = () => {
|
|
102
|
+
resolve();
|
|
103
|
+
};
|
|
104
|
+
__classPrivateFieldGet(this, _MediaController_mediaRecorder, "f").stop();
|
|
105
|
+
});
|
|
106
|
+
}
|
|
107
|
+
get mediaRecorder() {
|
|
108
|
+
return __classPrivateFieldGet(this, _MediaController_mediaRecorder, "f");
|
|
109
|
+
}
|
|
110
|
+
get audioLevel() {
|
|
111
|
+
return __classPrivateFieldGet(this, _MediaController_audioLevel, "f");
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
_MediaController_mediaStream = new WeakMap(), _MediaController_audioContext = new WeakMap(), _MediaController_analyser = new WeakMap(), _MediaController_mediaRecorder = new WeakMap(), _MediaController_visualiserInterval = new WeakMap(), _MediaController_audioLevel = new WeakMap(), _MediaController_onTrackEnded = new WeakMap(), _MediaController_onAudioLevelChange = new WeakMap();
|
|
115
|
+
//# sourceMappingURL=media-controller.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"media-controller.js","sourceRoot":"","sources":["../../src/controllers/media-controller.ts"],"names":[],"mappings":";;;;;;;;;;;;AACA,OAAO,EACL,mBAAmB,EACnB,mBAAmB,EACnB,cAAc,GACf,MAAM,mBAAmB,CAAC;AAO3B,MAAM,OAAO,eAAe;IAY1B,YAAY,IAAyB;QATrC,uCAAmC,IAAI,EAAC;QACxC,wCAAqC,IAAI,EAAC;QAC1C,oCAAiC,IAAI,EAAC;QACtC,yCAAuC,IAAI,EAAC;QAC5C,sDAA6B;QAC7B,sCAAsB,CAAC,EAAC;QACxB,gDAA2B;QAC3B,sDAA8C;QAG5C,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;IAC3B,CAAC;IAED,gBAAgB;QACd,IAAI,CAAC,OAAO,EAAE,CAAC;IACjB,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,YAAyB;QACxC,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC;QAErB,uBAAA,IAAI,iCAAiB,YAAY,MAAA,CAAC;QAClC,uBAAA,IAAI,gCAAgB,MAAM,cAAc,CACtC,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,QAAQ,EACnC,IAAI,CAAC,IAAI,CAAC,mBAAmB,CAC9B,MAAA,CAAC;QAEF,uBAAA,IAAI,oCAAa,CAAC,SAAS,EAAE,CAAC,OAAO,CAAC,CAAC,KAAuB,EAAE,EAAE;YAChE,KAAK,CAAC,gBAAgB,CAAC,OAAO,EAAE,GAAG,EAAE;gBACnC,IAAI,uBAAA,IAAI,qCAAc,EAAE,CAAC;oBACvB,uBAAA,IAAI,qCAAc,MAAlB,IAAI,CAAgB,CAAC;gBACvB,CAAC;YACH,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,MAAM,EAAE,YAAY,EAAE,QAAQ,EAAE,GAAG,mBAAmB,CAAC,uBAAA,IAAI,oCAAa,CAAC,CAAC;QAE1E,uBAAA,IAAI,iCAAiB,YAAY,MAAA,CAAC;QAClC,uBAAA,IAAI,6BAAa,QAAQ,MAAA,CAAC;QAE1B,uBAAA,IAAI,kCAAkB,IAAI,aAAa,CAAC,uBAAA,IAAI,oCAAa,CAAC,MAAA,CAAC;IAC7D,CAAC;IAED,aAAa;QACX,OAAO,uBAAA,IAAI,iCAAU,CAAC,CAAC,CAAC,mBAAmB,CAAC,uBAAA,IAAI,iCAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAClE,CAAC;IAED,yBAAyB,CACvB,kBAA4C;QAE5C,IAAI,CAAC,wBAAwB,EAAE,CAAC;QAEhC,uBAAA,IAAI,uCAAuB,kBAAkB,MAAA,CAAC;QAE9C,uBAAA,IAAI,uCAAuB,MAAM,CAAC,WAAW,CAAC,GAAG,EAAE;YACjD,uBAAA,IAAI,+BAAe,IAAI,CAAC,aAAa,EAAE,GAAG,CAAC,MAAA,CAAC;YAC5C,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC;YAE1B,IAAI,uBAAA,IAAI,2CAAoB,EAAE,CAAC;gBAC7B,uBAAA,IAAI,2CAAoB,MAAxB,IAAI,EAAqB,uBAAA,IAAI,mCAAY,CAAC,CAAC;YAC7C,CAAC;QACH,CAAC,EAAE,GAAG,CAAC,MAAA,CAAC;IACV,CAAC;IAED,wBAAwB;QACtB,IAAI,uBAAA,IAAI,2CAAoB,EAAE,CAAC;YAC7B,aAAa,CAAC,uBAAA,IAAI,2CAAoB,CAAC,CAAC;YACxC,uBAAA,IAAI,uCAAuB,SAAS,MAAA,CAAC;QACvC,CAAC;QAED,uBAAA,IAAI,+BAAe,CAAC,MAAA,CAAC;QACrB,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC;QAE1B,IAAI,uBAAA,IAAI,2CAAoB,EAAE,CAAC;YAC7B,uBAAA,IAAI,2CAAoB,MAAxB,IAAI,EAAqB,uBAAA,IAAI,mCAAY,CAAC,CAAC;QAC7C,CAAC;IACH,CAAC;IAED,KAAK,CAAC,OAAO;QACX,IAAI,CAAC,wBAAwB,EAAE,CAAC;QAEhC,IAAI,uBAAA,IAAI,sCAAe,EAAE,KAAK,KAAK,WAAW,EAAE,CAAC;YAC/C,uBAAA,IAAI,sCAAe,CAAC,IAAI,EAAE,CAAC;QAC7B,CAAC;QAED,IAAI,uBAAA,IAAI,oCAAa,EAAE,CAAC;YACtB,uBAAA,IAAI,oCAAa,CAAC,SAAS,EAAE,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE;gBAC9C,KAAK,CAAC,IAAI,EAAE,CAAC;YACf,CAAC,CAAC,CAAC;YACH,uBAAA,IAAI,gCAAgB,IAAI,MAAA,CAAC;QAC3B,CAAC;QAED,IAAI,uBAAA,IAAI,qCAAc,IAAI,uBAAA,IAAI,qCAAc,CAAC,KAAK,KAAK,QAAQ,EAAE,CAAC;YAChE,MAAM,uBAAA,IAAI,qCAAc,CAAC,KAAK,EAAE,CAAC;QACnC,CAAC;QAED,uBAAA,IAAI,iCAAiB,IAAI,MAAA,CAAC;QAE1B,uBAAA,IAAI,6BAAa,IAAI,MAAA,CAAC;QACtB,uBAAA,IAAI,kCAAkB,IAAI,MAAA,CAAC;QAC3B,uBAAA,IAAI,iCAAiB,SAAS,MAAA,CAAC;QAC/B,uBAAA,IAAI,uCAAuB,SAAS,MAAA,CAAC;IACvC,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,aAAa;QACjB,OAAO,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;YACnC,IAAI,CAAC,uBAAA,IAAI,sCAAe,IAAI,uBAAA,IAAI,sCAAe,CAAC,KAAK,KAAK,WAAW,EAAE,CAAC;gBACtE,OAAO,EAAE,CAAC;gBACV,OAAO;YACT,CAAC;YAED,uBAAA,IAAI,sCAAe,CAAC,MAAM,GAAG,GAAG,EAAE;gBAChC,OAAO,EAAE,CAAC;YACZ,CAAC,CAAC;YAEF,uBAAA,IAAI,sCAAe,CAAC,IAAI,EAAE,CAAC;QAC7B,CAAC,CAAC,CAAC;IACL,CAAC;IAED,IAAI,aAAa;QACf,OAAO,uBAAA,IAAI,sCAAe,CAAC;IAC7B,CAAC;IAED,IAAI,UAAU;QACZ,OAAO,uBAAA,IAAI,mCAAY,CAAC;IAC1B,CAAC;CACF","sourcesContent":["import type { ReactiveController, ReactiveControllerHost } from \"lit\";\nimport {\n calculateAudioLevel,\n createAudioAnalyzer,\n getMediaStream,\n} from \"../utils/media.js\";\n\ninterface MediaControllerHost extends ReactiveControllerHost {\n _selectedDevice?: MediaDeviceInfo;\n _debug_displayAudio?: boolean;\n}\n\nexport class MediaController implements ReactiveController {\n host: MediaControllerHost;\n\n #mediaStream: MediaStream | null = null;\n #audioContext: AudioContext | null = null;\n #analyser: AnalyserNode | null = null;\n #mediaRecorder: MediaRecorder | null = null;\n #visualiserInterval?: number;\n #audioLevel: number = 0;\n #onTrackEnded?: () => void;\n #onAudioLevelChange?: (level: number) => void;\n\n constructor(host: MediaControllerHost) {\n this.host = host;\n host.addController(this);\n }\n\n hostDisconnected(): void {\n this.cleanup();\n }\n\n async initialize(onTrackEnded?: () => void): Promise<void> {\n await this.cleanup();\n\n this.#onTrackEnded = onTrackEnded;\n this.#mediaStream = await getMediaStream(\n this.host._selectedDevice?.deviceId,\n this.host._debug_displayAudio,\n );\n\n this.#mediaStream.getTracks().forEach((track: MediaStreamTrack) => {\n track.addEventListener(\"ended\", () => {\n if (this.#onTrackEnded) {\n this.#onTrackEnded();\n }\n });\n });\n\n const { audioContext, analyser } = createAudioAnalyzer(this.#mediaStream);\n\n this.#audioContext = audioContext;\n this.#analyser = analyser;\n\n this.#mediaRecorder = new MediaRecorder(this.#mediaStream);\n }\n\n getAudioLevel(): number {\n return this.#analyser ? calculateAudioLevel(this.#analyser) : 0;\n }\n\n startAudioLevelMonitoring(\n onAudioLevelChange?: (level: number) => void,\n ): void {\n this.stopAudioLevelMonitoring();\n\n this.#onAudioLevelChange = onAudioLevelChange;\n\n this.#visualiserInterval = window.setInterval(() => {\n this.#audioLevel = this.getAudioLevel() * 3;\n this.host.requestUpdate();\n\n if (this.#onAudioLevelChange) {\n this.#onAudioLevelChange(this.#audioLevel);\n }\n }, 150);\n }\n\n stopAudioLevelMonitoring(): void {\n if (this.#visualiserInterval) {\n clearInterval(this.#visualiserInterval);\n this.#visualiserInterval = undefined;\n }\n\n this.#audioLevel = 0;\n this.host.requestUpdate();\n\n if (this.#onAudioLevelChange) {\n this.#onAudioLevelChange(this.#audioLevel);\n }\n }\n\n async cleanup(): Promise<void> {\n this.stopAudioLevelMonitoring();\n\n if (this.#mediaRecorder?.state === \"recording\") {\n this.#mediaRecorder.stop();\n }\n\n if (this.#mediaStream) {\n this.#mediaStream.getTracks().forEach((track) => {\n track.stop();\n });\n this.#mediaStream = null;\n }\n\n if (this.#audioContext && this.#audioContext.state !== \"closed\") {\n await this.#audioContext.close();\n }\n\n this.#audioContext = null;\n\n this.#analyser = null;\n this.#mediaRecorder = null;\n this.#onTrackEnded = undefined;\n this.#onAudioLevelChange = undefined;\n }\n\n /**\n * Stops the media recorder and waits for all buffered data to be flushed.\n * This ensures the final ondataavailable event fires before resolving.\n */\n async stopRecording(): Promise<void> {\n return new Promise<void>((resolve) => {\n if (!this.#mediaRecorder || this.#mediaRecorder.state !== \"recording\") {\n resolve();\n return;\n }\n\n this.#mediaRecorder.onstop = () => {\n resolve();\n };\n\n this.#mediaRecorder.stop();\n });\n }\n\n get mediaRecorder(): MediaRecorder | null {\n return this.#mediaRecorder;\n }\n\n get audioLevel(): number {\n return this.#audioLevel;\n }\n}\n"]}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,2 +1,10 @@
|
|
|
1
|
-
import CortiDictation from
|
|
1
|
+
import { CortiDictation } from "./components/corti-dictation.js";
|
|
2
|
+
export { CortiDictation } from "./components/corti-dictation.js";
|
|
3
|
+
export { DictationDeviceSelector } from "./components/device-selector.js";
|
|
4
|
+
export { DictationLanguageSelector } from "./components/language-selector.js";
|
|
5
|
+
export { DictationRecordingButton } from "./components/recording-button.js";
|
|
6
|
+
export { DictationSettingsMenu } from "./components/settings-menu.js";
|
|
7
|
+
export { DictationRoot } from "./contexts/dictation-context.js";
|
|
8
|
+
export type { ConfigurableSettings, RecordingState } from "./types.js";
|
|
9
|
+
export type { AudioLevelChangedEventDetail, CommandEventDetail, ErrorEventDetail, LanguageChangedEventDetail, LanguagesChangedEventDetail, NetworkActivityEventDetail, RecordingDevicesChangedEventDetail, RecordingStateChangedEventDetail, TranscriptEventDetail, UsageEventDetail, } from "./utils/events.js";
|
|
2
10
|
export default CortiDictation;
|
package/dist/index.js
CHANGED
|
@@ -1,6 +1,32 @@
|
|
|
1
|
-
import CortiDictation from
|
|
2
|
-
|
|
3
|
-
|
|
1
|
+
import { CortiDictation } from "./components/corti-dictation.js";
|
|
2
|
+
import { DictationDeviceSelector } from "./components/device-selector.js";
|
|
3
|
+
import { DictationLanguageSelector } from "./components/language-selector.js";
|
|
4
|
+
import { DictationRecordingButton } from "./components/recording-button.js";
|
|
5
|
+
import { DictationSettingsMenu } from "./components/settings-menu.js";
|
|
6
|
+
import { DictationRoot } from "./contexts/dictation-context.js";
|
|
7
|
+
if (!customElements.get("corti-dictation")) {
|
|
8
|
+
customElements.define("corti-dictation", CortiDictation);
|
|
4
9
|
}
|
|
10
|
+
if (!customElements.get("dictation-recording-button")) {
|
|
11
|
+
customElements.define("dictation-recording-button", DictationRecordingButton);
|
|
12
|
+
}
|
|
13
|
+
if (!customElements.get("dictation-device-selector")) {
|
|
14
|
+
customElements.define("dictation-device-selector", DictationDeviceSelector);
|
|
15
|
+
}
|
|
16
|
+
if (!customElements.get("dictation-language-selector")) {
|
|
17
|
+
customElements.define("dictation-language-selector", DictationLanguageSelector);
|
|
18
|
+
}
|
|
19
|
+
if (!customElements.get("dictation-settings-menu")) {
|
|
20
|
+
customElements.define("dictation-settings-menu", DictationSettingsMenu);
|
|
21
|
+
}
|
|
22
|
+
if (!customElements.get("dictation-root")) {
|
|
23
|
+
customElements.define("dictation-root", DictationRoot);
|
|
24
|
+
}
|
|
25
|
+
export { CortiDictation } from "./components/corti-dictation.js";
|
|
26
|
+
export { DictationDeviceSelector } from "./components/device-selector.js";
|
|
27
|
+
export { DictationLanguageSelector } from "./components/language-selector.js";
|
|
28
|
+
export { DictationRecordingButton } from "./components/recording-button.js";
|
|
29
|
+
export { DictationSettingsMenu } from "./components/settings-menu.js";
|
|
30
|
+
export { DictationRoot } from "./contexts/dictation-context.js";
|
|
5
31
|
export default CortiDictation;
|
|
6
32
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,cAAc,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAC;AACjE,OAAO,EAAE,uBAAuB,EAAE,MAAM,iCAAiC,CAAC;AAC1E,OAAO,EAAE,yBAAyB,EAAE,MAAM,mCAAmC,CAAC;AAC9E,OAAO,EAAE,wBAAwB,EAAE,MAAM,kCAAkC,CAAC;AAC5E,OAAO,EAAE,qBAAqB,EAAE,MAAM,+BAA+B,CAAC;AACtE,OAAO,EAAE,aAAa,EAAE,MAAM,iCAAiC,CAAC;AAEhE,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,iBAAiB,CAAC,EAAE,CAAC;IAC3C,cAAc,CAAC,MAAM,CAAC,iBAAiB,EAAE,cAAc,CAAC,CAAC;AAC3D,CAAC;AAED,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,4BAA4B,CAAC,EAAE,CAAC;IACtD,cAAc,CAAC,MAAM,CAAC,4BAA4B,EAAE,wBAAwB,CAAC,CAAC;AAChF,CAAC;AAED,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,2BAA2B,CAAC,EAAE,CAAC;IACrD,cAAc,CAAC,MAAM,CAAC,2BAA2B,EAAE,uBAAuB,CAAC,CAAC;AAC9E,CAAC;AAED,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,6BAA6B,CAAC,EAAE,CAAC;IACvD,cAAc,CAAC,MAAM,CACnB,6BAA6B,EAC7B,yBAAyB,CAC1B,CAAC;AACJ,CAAC;AAED,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,yBAAyB,CAAC,EAAE,CAAC;IACnD,cAAc,CAAC,MAAM,CAAC,yBAAyB,EAAE,qBAAqB,CAAC,CAAC;AAC1E,CAAC;AAED,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,gBAAgB,CAAC,EAAE,CAAC;IAC1C,cAAc,CAAC,MAAM,CAAC,gBAAgB,EAAE,aAAa,CAAC,CAAC;AACzD,CAAC;AAED,OAAO,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAC;AACjE,OAAO,EAAE,uBAAuB,EAAE,MAAM,iCAAiC,CAAC;AAC1E,OAAO,EAAE,yBAAyB,EAAE,MAAM,mCAAmC,CAAC;AAC9E,OAAO,EAAE,wBAAwB,EAAE,MAAM,kCAAkC,CAAC;AAC5E,OAAO,EAAE,qBAAqB,EAAE,MAAM,+BAA+B,CAAC;AACtE,OAAO,EAAE,aAAa,EAAE,MAAM,iCAAiC,CAAC;AAgBhE,eAAe,cAAc,CAAC","sourcesContent":["import { CortiDictation } from \"./components/corti-dictation.js\";\nimport { DictationDeviceSelector } from \"./components/device-selector.js\";\nimport { DictationLanguageSelector } from \"./components/language-selector.js\";\nimport { DictationRecordingButton } from \"./components/recording-button.js\";\nimport { DictationSettingsMenu } from \"./components/settings-menu.js\";\nimport { DictationRoot } from \"./contexts/dictation-context.js\";\n\nif (!customElements.get(\"corti-dictation\")) {\n customElements.define(\"corti-dictation\", CortiDictation);\n}\n\nif (!customElements.get(\"dictation-recording-button\")) {\n customElements.define(\"dictation-recording-button\", DictationRecordingButton);\n}\n\nif (!customElements.get(\"dictation-device-selector\")) {\n customElements.define(\"dictation-device-selector\", DictationDeviceSelector);\n}\n\nif (!customElements.get(\"dictation-language-selector\")) {\n customElements.define(\n \"dictation-language-selector\",\n DictationLanguageSelector,\n );\n}\n\nif (!customElements.get(\"dictation-settings-menu\")) {\n customElements.define(\"dictation-settings-menu\", DictationSettingsMenu);\n}\n\nif (!customElements.get(\"dictation-root\")) {\n customElements.define(\"dictation-root\", DictationRoot);\n}\n\nexport { CortiDictation } from \"./components/corti-dictation.js\";\nexport { DictationDeviceSelector } from \"./components/device-selector.js\";\nexport { DictationLanguageSelector } from \"./components/language-selector.js\";\nexport { DictationRecordingButton } from \"./components/recording-button.js\";\nexport { DictationSettingsMenu } from \"./components/settings-menu.js\";\nexport { DictationRoot } from \"./contexts/dictation-context.js\";\n\nexport type { ConfigurableSettings, RecordingState } from \"./types.js\";\nexport type {\n AudioLevelChangedEventDetail,\n CommandEventDetail,\n ErrorEventDetail,\n LanguageChangedEventDetail,\n LanguagesChangedEventDetail,\n NetworkActivityEventDetail,\n RecordingDevicesChangedEventDetail,\n RecordingStateChangedEventDetail,\n TranscriptEventDetail,\n UsageEventDetail,\n} from \"./utils/events.js\";\n\nexport default CortiDictation;\n"]}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { LitElement, type PropertyValues } from "lit";
|
|
2
|
+
export declare class AudioVisualiser extends LitElement {
|
|
3
|
+
level: number;
|
|
4
|
+
active: boolean;
|
|
5
|
+
segmentCount: number;
|
|
6
|
+
static styles: import("lit").CSSResult;
|
|
7
|
+
willUpdate(changedProperties: PropertyValues<this>): void;
|
|
8
|
+
render(): import("lit-html").TemplateResult<1>;
|
|
9
|
+
}
|
|
10
|
+
declare global {
|
|
11
|
+
interface HTMLElementTagNameMap {
|
|
12
|
+
"audio-visualiser": AudioVisualiser;
|
|
13
|
+
}
|
|
14
|
+
}
|
|
@@ -0,0 +1,57 @@
|
|
|
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
|
+
import { html, LitElement } from "lit";
|
|
8
|
+
import { customElement, property } from "lit/decorators.js";
|
|
9
|
+
import { classMap } from "lit/directives/class-map.js";
|
|
10
|
+
import { map } from "lit/directives/map.js";
|
|
11
|
+
import { range } from "lit/directives/range.js";
|
|
12
|
+
import AudioVisualiserStyles from "../styles/audio-visualiser.js";
|
|
13
|
+
import { normalizeToRange } from "../utils/validation.js";
|
|
14
|
+
let AudioVisualiser = class AudioVisualiser extends LitElement {
|
|
15
|
+
constructor() {
|
|
16
|
+
super(...arguments);
|
|
17
|
+
this.level = 0;
|
|
18
|
+
this.active = false;
|
|
19
|
+
this.segmentCount = 5;
|
|
20
|
+
}
|
|
21
|
+
willUpdate(changedProperties) {
|
|
22
|
+
if (changedProperties.has("level")) {
|
|
23
|
+
this.level = normalizeToRange(this.level);
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
render() {
|
|
27
|
+
// Each segment represents 20%. Using Math.round to fill segments.
|
|
28
|
+
const activeSegments = Math.round(this.level * this.segmentCount);
|
|
29
|
+
const segments = map(range(this.segmentCount), (i) => html `<div class=${classMap({
|
|
30
|
+
active: i < activeSegments,
|
|
31
|
+
segment: true,
|
|
32
|
+
})}></div>`);
|
|
33
|
+
return html `
|
|
34
|
+
<div class=${classMap({
|
|
35
|
+
active: this.active,
|
|
36
|
+
container: true,
|
|
37
|
+
})}>
|
|
38
|
+
${segments}
|
|
39
|
+
</div>
|
|
40
|
+
`;
|
|
41
|
+
}
|
|
42
|
+
};
|
|
43
|
+
AudioVisualiser.styles = AudioVisualiserStyles;
|
|
44
|
+
__decorate([
|
|
45
|
+
property({ type: Number })
|
|
46
|
+
], AudioVisualiser.prototype, "level", void 0);
|
|
47
|
+
__decorate([
|
|
48
|
+
property({ type: Boolean })
|
|
49
|
+
], AudioVisualiser.prototype, "active", void 0);
|
|
50
|
+
__decorate([
|
|
51
|
+
property({ type: Number })
|
|
52
|
+
], AudioVisualiser.prototype, "segmentCount", void 0);
|
|
53
|
+
AudioVisualiser = __decorate([
|
|
54
|
+
customElement("audio-visualiser")
|
|
55
|
+
], AudioVisualiser);
|
|
56
|
+
export { AudioVisualiser };
|
|
57
|
+
//# sourceMappingURL=audio-visualiser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"audio-visualiser.js","sourceRoot":"","sources":["../../../src/components/audio-visualiser.ts"],"names":[],"mappings":";;;;;;AAAA,OAAO,EAAE,IAAI,EAAE,UAAU,EAAuB,MAAM,KAAK,CAAC;AAC5D,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAC5D,OAAO,EAAE,QAAQ,EAAE,MAAM,6BAA6B,CAAC;AACvD,OAAO,EAAE,GAAG,EAAE,MAAM,uBAAuB,CAAC;AAC5C,OAAO,EAAE,KAAK,EAAE,MAAM,yBAAyB,CAAC;AAChD,OAAO,qBAAqB,MAAM,+BAA+B,CAAC;AAClE,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAGnD,IAAM,eAAe,GAArB,MAAM,eAAgB,SAAQ,UAAU;IAAxC;;QAEL,UAAK,GAAW,CAAC,CAAC;QAGlB,WAAM,GAAY,KAAK,CAAC;QAGxB,iBAAY,GAAW,CAAC,CAAC;IA+B3B,CAAC;IA3BC,UAAU,CAAC,iBAAuC;QAChD,IAAI,iBAAiB,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;YACnC,IAAI,CAAC,KAAK,GAAG,gBAAgB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC5C,CAAC;IACH,CAAC;IAED,MAAM;QACJ,kEAAkE;QAClE,MAAM,cAAc,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,YAAY,CAAC,CAAC;QAClE,MAAM,QAAQ,GAAG,GAAG,CAClB,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,EACxB,CAAC,CAAC,EAAE,EAAE,CACJ,IAAI,CAAA,cAAc,QAAQ,CAAC;YACzB,MAAM,EAAE,CAAC,GAAG,cAAc;YAC1B,OAAO,EAAE,IAAI;SACd,CAAC,SAAS,CACd,CAAC;QAEF,OAAO,IAAI,CAAA;mBACI,QAAQ,CAAC;YACpB,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,SAAS,EAAE,IAAI;SAChB,CAAC;UACE,QAAQ;;KAEb,CAAC;IACJ,CAAC;;AA5BM,sBAAM,GAAG,qBAAqB,AAAxB,CAAyB;AARtC;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;8CACT;AAGlB;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;+CACJ;AAGxB;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;qDACF;AARd,eAAe;IAD3B,aAAa,CAAC,kBAAkB,CAAC;GACrB,eAAe,CAuC3B","sourcesContent":["import { html, LitElement, type PropertyValues } from \"lit\";\nimport { customElement, property } from \"lit/decorators.js\";\nimport { classMap } from \"lit/directives/class-map.js\";\nimport { map } from \"lit/directives/map.js\";\nimport { range } from \"lit/directives/range.js\";\nimport AudioVisualiserStyles from \"../styles/audio-visualiser.js\";\nimport { normalizeToRange } from \"../utils/validation.js\";\n\n@customElement(\"audio-visualiser\")\nexport class AudioVisualiser extends LitElement {\n @property({ type: Number })\n level: number = 0;\n\n @property({ type: Boolean })\n active: boolean = false;\n\n @property({ type: Number })\n segmentCount: number = 5;\n\n static styles = AudioVisualiserStyles;\n\n willUpdate(changedProperties: PropertyValues<this>): void {\n if (changedProperties.has(\"level\")) {\n this.level = normalizeToRange(this.level);\n }\n }\n\n render() {\n // Each segment represents 20%. Using Math.round to fill segments.\n const activeSegments = Math.round(this.level * this.segmentCount);\n const segments = map(\n range(this.segmentCount),\n (i) =>\n html`<div class=${classMap({\n active: i < activeSegments,\n segment: true,\n })}></div>`,\n );\n\n return html`\n <div class=${classMap({\n active: this.active,\n container: true,\n })}>\n ${segments}\n </div>\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n \"audio-visualiser\": AudioVisualiser;\n }\n}\n"]}
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
import type { Corti } from "@corti/sdk";
|
|
2
|
+
import { LitElement } from "lit";
|
|
3
|
+
import type { ConfigurableSettings, ProxyOptions, RecordingState } from "../types.js";
|
|
4
|
+
import "../contexts/dictation-context.js";
|
|
5
|
+
import "./recording-button.js";
|
|
6
|
+
import "./settings-menu.js";
|
|
7
|
+
export declare class CortiDictation extends LitElement {
|
|
8
|
+
static styles: import("lit").CSSResult;
|
|
9
|
+
private recordingButtonRef;
|
|
10
|
+
private contextProviderRef;
|
|
11
|
+
/**
|
|
12
|
+
* Latest access token
|
|
13
|
+
*/
|
|
14
|
+
accessToken?: string;
|
|
15
|
+
/**
|
|
16
|
+
* Authentication configuration with optional refresh mechanism.
|
|
17
|
+
*/
|
|
18
|
+
authConfig?: Corti.BearerOptions;
|
|
19
|
+
/**
|
|
20
|
+
* WebSocket URL for proxy connection. When provided, uses CortiWebSocketProxyClient instead of CortiClient.
|
|
21
|
+
*/
|
|
22
|
+
socketUrl?: string;
|
|
23
|
+
/**
|
|
24
|
+
* Socket proxy configuration object. When provided, uses CortiWebSocketProxyClient instead of CortiClient.
|
|
25
|
+
*/
|
|
26
|
+
socketProxy?: ProxyOptions;
|
|
27
|
+
/**
|
|
28
|
+
* List of all language codes available for use with the Web Component.
|
|
29
|
+
* Default list depends on the accessToken
|
|
30
|
+
*/
|
|
31
|
+
set languagesSupported(value: string[] | undefined);
|
|
32
|
+
get languagesSupported(): string[];
|
|
33
|
+
private _languagesSupported?;
|
|
34
|
+
/**
|
|
35
|
+
* Which settings should be available in the UI.
|
|
36
|
+
* If an empty array is passed, the settings will be disabled entirely.
|
|
37
|
+
* Options are language and devices
|
|
38
|
+
*/
|
|
39
|
+
settingsEnabled: ConfigurableSettings[];
|
|
40
|
+
/**
|
|
41
|
+
* When false (default), allows the start/stop button from taking focus when clicked,
|
|
42
|
+
* disabling textareas or other input elements to maintain focus.
|
|
43
|
+
* Set to "true" to allow the button to receive focus on click.
|
|
44
|
+
*/
|
|
45
|
+
allowButtonFocus: boolean;
|
|
46
|
+
/**
|
|
47
|
+
* Overrides any device selection and instead uses getDisplayMedia to stream system audio.
|
|
48
|
+
* Should only be used for debugging.
|
|
49
|
+
*/
|
|
50
|
+
debug_displayAudio: boolean;
|
|
51
|
+
/**
|
|
52
|
+
* Configuration settings for dictation
|
|
53
|
+
*/
|
|
54
|
+
set dictationConfig(value: Corti.TranscribeConfig);
|
|
55
|
+
get dictationConfig(): Corti.TranscribeConfig;
|
|
56
|
+
private _dictationConfig;
|
|
57
|
+
/**
|
|
58
|
+
* List of available recording devices
|
|
59
|
+
*/
|
|
60
|
+
set devices(value: MediaDeviceInfo[] | undefined);
|
|
61
|
+
get devices(): MediaDeviceInfo[];
|
|
62
|
+
private _devices?;
|
|
63
|
+
/**
|
|
64
|
+
* The selected device used for recording (MediaDeviceInfo).
|
|
65
|
+
*/
|
|
66
|
+
set selectedDevice(value: MediaDeviceInfo | undefined);
|
|
67
|
+
get selectedDevice(): MediaDeviceInfo | undefined;
|
|
68
|
+
private _selectedDevice?;
|
|
69
|
+
/**
|
|
70
|
+
* Current state of recording (stopped, recording, initializing and stopping, ).
|
|
71
|
+
*/
|
|
72
|
+
get recordingState(): RecordingState;
|
|
73
|
+
/**
|
|
74
|
+
* Set the latest access token.
|
|
75
|
+
* @returns ServerConfig with environment, tenant, and accessToken
|
|
76
|
+
* @deprecated Use 'accessToken' property instead.
|
|
77
|
+
*/
|
|
78
|
+
setAccessToken(token: string): {
|
|
79
|
+
accessToken: string | undefined;
|
|
80
|
+
environment: undefined;
|
|
81
|
+
tenant: undefined;
|
|
82
|
+
} | {
|
|
83
|
+
accessToken: string;
|
|
84
|
+
environment: string;
|
|
85
|
+
tenant: string;
|
|
86
|
+
};
|
|
87
|
+
/**
|
|
88
|
+
* Set the auth configuration for OAuth flows.
|
|
89
|
+
* @returns Promise with ServerConfig containing environment, tenant, and accessToken
|
|
90
|
+
* @deprecated Use 'authConfig' property instead.
|
|
91
|
+
*/
|
|
92
|
+
setAuthConfig(config: Corti.BearerOptions): Promise<{
|
|
93
|
+
accessToken: string | undefined;
|
|
94
|
+
environment: undefined;
|
|
95
|
+
tenant: undefined;
|
|
96
|
+
} | {
|
|
97
|
+
accessToken: string;
|
|
98
|
+
environment: string;
|
|
99
|
+
tenant: string;
|
|
100
|
+
} | {
|
|
101
|
+
accessToken: undefined;
|
|
102
|
+
environment: undefined;
|
|
103
|
+
tenant: undefined;
|
|
104
|
+
}>;
|
|
105
|
+
/**
|
|
106
|
+
* Starts a recording.
|
|
107
|
+
*/
|
|
108
|
+
startRecording(): void;
|
|
109
|
+
/**
|
|
110
|
+
* Stops a recording.
|
|
111
|
+
*/
|
|
112
|
+
stopRecording(): void;
|
|
113
|
+
/**
|
|
114
|
+
* Starts or stops recording. Convenience layer on top of the start/stop methods.
|
|
115
|
+
*/
|
|
116
|
+
toggleRecording(): void;
|
|
117
|
+
render(): import("lit-html").TemplateResult<1>;
|
|
118
|
+
}
|
|
119
|
+
declare global {
|
|
120
|
+
interface HTMLElementTagNameMap {
|
|
121
|
+
"corti-dictation": CortiDictation;
|
|
122
|
+
}
|
|
123
|
+
}
|