@corti/dictation-web 0.0.0-rc.359 → 0.0.0-test.571
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 +163 -102
- package/dist/CortiDictation.d.ts +6 -2
- package/dist/CortiDictation.js +36 -14
- package/dist/CortiDictation.js.map +1 -1
- package/dist/bundle.js +3888 -1787
- 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 +136 -0
- package/dist/components/corti-dictation.js +273 -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/keybinding-selector.d.ts +14 -0
- package/dist/components/keybinding-selector.js +81 -0
- package/dist/components/keybinding-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/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 +31 -0
- package/dist/components/recording-button.js +262 -0
- package/dist/components/recording-button.js.map +1 -0
- package/dist/components/settings-menu.d.ts +12 -14
- package/dist/components/settings-menu.js +68 -153
- 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 +107 -0
- package/dist/contexts/dictation-context.js +290 -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 +29 -0
- package/dist/controllers/dictation-controller.js +179 -0
- package/dist/controllers/dictation-controller.js.map +1 -0
- package/dist/controllers/keybinding-controller.d.ts +17 -0
- package/dist/controllers/keybinding-controller.js +80 -0
- package/dist/controllers/keybinding-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 +11 -1
- package/dist/index.js +39 -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 +6 -41
- 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 +3 -0
- package/dist/styles/component-styles.js +32 -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/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 +54 -0
- package/dist/styles/mode-selector.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.d.ts +1 -1
- package/dist/styles/select.js +14 -18
- package/dist/styles/select.js.map +1 -1
- package/dist/styles/settings-menu.d.ts +2 -0
- package/dist/styles/settings-menu.js +42 -0
- package/dist/styles/settings-menu.js.map +1 -0
- package/dist/tsconfig.stories.tsbuildinfo +1 -0
- package/dist/types.d.ts +9 -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 +53 -0
- package/dist/utils/events.js +102 -0
- package/dist/utils/events.js.map +1 -0
- package/dist/utils/keybinding.d.ts +49 -0
- package/dist/utils/keybinding.js +140 -0
- package/dist/utils/keybinding.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
package/dist/constants.d.ts
CHANGED
|
@@ -1,3 +1,9 @@
|
|
|
1
|
-
import { Corti } from
|
|
2
|
-
export declare const
|
|
1
|
+
import type { Corti } from "@corti/sdk";
|
|
2
|
+
export declare const LANGUAGES_SUPPORTED_EU: Corti.TranscribeSupportedLanguage[];
|
|
3
|
+
export declare const LANGUAGES_SUPPORTED_US: Corti.TranscribeSupportedLanguage[];
|
|
3
4
|
export declare const DEFAULT_DICTATION_CONFIG: Corti.TranscribeConfig;
|
|
5
|
+
/**
|
|
6
|
+
* Interval in milliseconds at which MediaRecorder fires dataavailable events.
|
|
7
|
+
* This controls how often audio chunks are sent to the WebSocket.
|
|
8
|
+
*/
|
|
9
|
+
export declare const AUDIO_CHUNK_INTERVAL_MS = 250;
|
package/dist/constants.js
CHANGED
|
@@ -1,16 +1,42 @@
|
|
|
1
|
-
export const
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
1
|
+
export const LANGUAGES_SUPPORTED_EU = [
|
|
2
|
+
"da",
|
|
3
|
+
"de",
|
|
4
|
+
"de-CH",
|
|
5
|
+
"en",
|
|
6
|
+
"en-GB",
|
|
7
|
+
"es",
|
|
8
|
+
"fr",
|
|
9
|
+
"hu",
|
|
10
|
+
"it",
|
|
11
|
+
"nl",
|
|
12
|
+
"no",
|
|
13
|
+
"pt",
|
|
14
|
+
"sv",
|
|
15
|
+
"gsw-CH",
|
|
16
|
+
].sort();
|
|
17
|
+
export const LANGUAGES_SUPPORTED_US = [
|
|
18
|
+
"da",
|
|
19
|
+
"de",
|
|
20
|
+
"de-CH",
|
|
21
|
+
"en",
|
|
22
|
+
"en-GB",
|
|
23
|
+
"es",
|
|
24
|
+
"fr",
|
|
25
|
+
"hu",
|
|
26
|
+
"it",
|
|
27
|
+
"nl",
|
|
28
|
+
"no",
|
|
29
|
+
"pt",
|
|
30
|
+
"sv",
|
|
31
|
+
].sort();
|
|
11
32
|
export const DEFAULT_DICTATION_CONFIG = {
|
|
12
|
-
|
|
33
|
+
automaticPunctuation: false,
|
|
34
|
+
primaryLanguage: "en",
|
|
13
35
|
spokenPunctuation: true,
|
|
14
|
-
automaticPunctuation: true,
|
|
15
36
|
};
|
|
37
|
+
/**
|
|
38
|
+
* Interval in milliseconds at which MediaRecorder fires dataavailable events.
|
|
39
|
+
* This controls how often audio chunks are sent to the WebSocket.
|
|
40
|
+
*/
|
|
41
|
+
export const AUDIO_CHUNK_INTERVAL_MS = 250;
|
|
16
42
|
//# sourceMappingURL=constants.js.map
|
package/dist/constants.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,
|
|
1
|
+
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,sBAAsB,GAAwC;IACzE,IAAI;IACJ,IAAI;IACJ,OAAO;IACP,IAAI;IACJ,OAAO;IACP,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,QAAQ;CACT,CAAC,IAAI,EAAE,CAAC;AACT,MAAM,CAAC,MAAM,sBAAsB,GAAwC;IACzE,IAAI;IACJ,IAAI;IACJ,OAAO;IACP,IAAI;IACJ,OAAO;IACP,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;CACL,CAAC,IAAI,EAAE,CAAC;AACT,MAAM,CAAC,MAAM,wBAAwB,GAA2B;IAC9D,oBAAoB,EAAE,KAAK;IAC3B,eAAe,EAAE,IAAI;IACrB,iBAAiB,EAAE,IAAI;CACxB,CAAC;AAEF;;;GAGG;AACH,MAAM,CAAC,MAAM,uBAAuB,GAAG,GAAG,CAAC","sourcesContent":["import type { Corti } from \"@corti/sdk\";\n\nexport const LANGUAGES_SUPPORTED_EU: Corti.TranscribeSupportedLanguage[] = [\n \"da\",\n \"de\",\n \"de-CH\",\n \"en\",\n \"en-GB\",\n \"es\",\n \"fr\",\n \"hu\",\n \"it\",\n \"nl\",\n \"no\",\n \"pt\",\n \"sv\",\n \"gsw-CH\",\n].sort();\nexport const LANGUAGES_SUPPORTED_US: Corti.TranscribeSupportedLanguage[] = [\n \"da\",\n \"de\",\n \"de-CH\",\n \"en\",\n \"en-GB\",\n \"es\",\n \"fr\",\n \"hu\",\n \"it\",\n \"nl\",\n \"no\",\n \"pt\",\n \"sv\",\n].sort();\nexport const DEFAULT_DICTATION_CONFIG: Corti.TranscribeConfig = {\n automaticPunctuation: false,\n primaryLanguage: \"en\",\n spokenPunctuation: true,\n};\n\n/**\n * Interval in milliseconds at which MediaRecorder fires dataavailable events.\n * This controls how often audio chunks are sent to the WebSocket.\n */\nexport const AUDIO_CHUNK_INTERVAL_MS = 250;\n"]}
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
import type { Corti } from "@corti/sdk";
|
|
2
|
+
import { type CSSResultGroup, LitElement } from "lit";
|
|
3
|
+
import type { DictationMode, ProxyOptions, RecordingState } from "../types.js";
|
|
4
|
+
export declare const regionContext: {
|
|
5
|
+
__context__: string | undefined;
|
|
6
|
+
};
|
|
7
|
+
export declare const tenantNameContext: {
|
|
8
|
+
__context__: string | undefined;
|
|
9
|
+
};
|
|
10
|
+
export declare const languagesContext: {
|
|
11
|
+
__context__: string[] | undefined;
|
|
12
|
+
};
|
|
13
|
+
export declare const devicesContext: {
|
|
14
|
+
__context__: MediaDeviceInfo[] | undefined;
|
|
15
|
+
};
|
|
16
|
+
export declare const selectedDeviceContext: {
|
|
17
|
+
__context__: MediaDeviceInfo | undefined;
|
|
18
|
+
};
|
|
19
|
+
export declare const recordingStateContext: {
|
|
20
|
+
__context__: RecordingState;
|
|
21
|
+
};
|
|
22
|
+
export declare const accessTokenContext: {
|
|
23
|
+
__context__: string | undefined;
|
|
24
|
+
};
|
|
25
|
+
export declare const dictationConfigContext: {
|
|
26
|
+
__context__: Corti.TranscribeConfig | undefined;
|
|
27
|
+
};
|
|
28
|
+
export declare const authConfigContext: {
|
|
29
|
+
__context__: Corti.BearerOptions | undefined;
|
|
30
|
+
};
|
|
31
|
+
export declare const socketUrlContext: {
|
|
32
|
+
__context__: string | undefined;
|
|
33
|
+
};
|
|
34
|
+
export declare const socketProxyContext: {
|
|
35
|
+
__context__: ProxyOptions | undefined;
|
|
36
|
+
};
|
|
37
|
+
export declare const debugDisplayAudioContext: {
|
|
38
|
+
__context__: boolean | undefined;
|
|
39
|
+
};
|
|
40
|
+
export declare const modeContext: {
|
|
41
|
+
__context__: DictationMode;
|
|
42
|
+
};
|
|
43
|
+
export declare const keybindingContext: {
|
|
44
|
+
__context__: string | null | undefined;
|
|
45
|
+
};
|
|
46
|
+
export declare class DictationRoot extends LitElement {
|
|
47
|
+
#private;
|
|
48
|
+
region?: string;
|
|
49
|
+
tenantName?: string;
|
|
50
|
+
recordingState: RecordingState;
|
|
51
|
+
_accessToken?: string;
|
|
52
|
+
set accessToken(token: string | undefined);
|
|
53
|
+
get accessToken(): string | undefined;
|
|
54
|
+
_authConfig?: Corti.BearerOptions;
|
|
55
|
+
set authConfig(config: Corti.BearerOptions | undefined);
|
|
56
|
+
get authConfig(): Corti.BearerOptions | undefined;
|
|
57
|
+
socketUrl?: string;
|
|
58
|
+
socketProxy?: ProxyOptions;
|
|
59
|
+
dictationConfig?: Corti.TranscribeConfig;
|
|
60
|
+
_languages?: Corti.TranscribeSupportedLanguage[];
|
|
61
|
+
set languages(value: Corti.TranscribeSupportedLanguage[] | undefined);
|
|
62
|
+
get languages(): Corti.TranscribeSupportedLanguage[] | undefined;
|
|
63
|
+
_devices?: MediaDeviceInfo[];
|
|
64
|
+
set devices(value: MediaDeviceInfo[] | undefined);
|
|
65
|
+
get devices(): MediaDeviceInfo[] | undefined;
|
|
66
|
+
selectedDevice?: MediaDeviceInfo;
|
|
67
|
+
debug_displayAudio?: boolean;
|
|
68
|
+
mode: DictationMode;
|
|
69
|
+
keybinding?: string | null;
|
|
70
|
+
noWrapper: boolean;
|
|
71
|
+
static styles: CSSResultGroup;
|
|
72
|
+
constructor();
|
|
73
|
+
/**
|
|
74
|
+
* Sets the access token and parses region/tenant from it.
|
|
75
|
+
* @returns ServerConfig with environment, tenant, and accessToken
|
|
76
|
+
* @deprecated Use 'accessToken' property instead.
|
|
77
|
+
*/
|
|
78
|
+
setAccessToken(token: string | undefined): {
|
|
79
|
+
accessToken: string | undefined;
|
|
80
|
+
environment: undefined;
|
|
81
|
+
tenant: undefined;
|
|
82
|
+
} | {
|
|
83
|
+
accessToken: string;
|
|
84
|
+
environment: string;
|
|
85
|
+
tenant: string;
|
|
86
|
+
};
|
|
87
|
+
/**
|
|
88
|
+
* Sets the auth config and parses region/tenant from the initial token.
|
|
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
|
+
render(): import("lit-html").TemplateResult<1>;
|
|
102
|
+
}
|
|
103
|
+
declare global {
|
|
104
|
+
interface HTMLElementTagNameMap {
|
|
105
|
+
"dictation-root": DictationRoot;
|
|
106
|
+
}
|
|
107
|
+
}
|
|
@@ -0,0 +1,290 @@
|
|
|
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
|
+
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 _DictationRoot_languagesController, _DictationRoot_devicesController, _DictationRoot_handleLanguageChanged, _DictationRoot_handleDeviceChanged, _DictationRoot_handleRecordingStateChanged, _DictationRoot_handleContextRequest, _DictationRoot_handleModeChanged, _DictationRoot_handleKeybindingChanged;
|
|
13
|
+
import { createContext, provide } from "@lit/context";
|
|
14
|
+
import { html, LitElement } from "lit";
|
|
15
|
+
import { customElement, property, state } from "lit/decorators.js";
|
|
16
|
+
import { DevicesController } from "../controllers/devices-controller.js";
|
|
17
|
+
import { LanguagesController } from "../controllers/languages-controller.js";
|
|
18
|
+
import ComponentStyles from "../styles/component-styles.js";
|
|
19
|
+
import { getInitialToken } from "../utils/auth.js";
|
|
20
|
+
import { commaSeparatedConverter } from "../utils/converters.js";
|
|
21
|
+
import { errorEvent, keybindingChangedEvent, } from "../utils/events.js";
|
|
22
|
+
import { normalizeKeybinding } from "../utils/keybinding.js";
|
|
23
|
+
import { decodeToken } from "../utils/token.js";
|
|
24
|
+
export const regionContext = createContext(Symbol("region"));
|
|
25
|
+
export const tenantNameContext = createContext(Symbol("tenantName"));
|
|
26
|
+
export const languagesContext = createContext(Symbol("languages"));
|
|
27
|
+
export const devicesContext = createContext(Symbol("devices"));
|
|
28
|
+
export const selectedDeviceContext = createContext(Symbol("selectedDevice"));
|
|
29
|
+
export const recordingStateContext = createContext(Symbol("recordingState"));
|
|
30
|
+
export const accessTokenContext = createContext(Symbol("accessToken"));
|
|
31
|
+
export const dictationConfigContext = createContext(Symbol("dictationConfig"));
|
|
32
|
+
export const authConfigContext = createContext(Symbol("authConfig"));
|
|
33
|
+
export const socketUrlContext = createContext(Symbol("socketUrl"));
|
|
34
|
+
export const socketProxyContext = createContext(Symbol("socketProxy"));
|
|
35
|
+
export const debugDisplayAudioContext = createContext(Symbol("debugDisplayAudio"));
|
|
36
|
+
export const modeContext = createContext(Symbol("mode"));
|
|
37
|
+
export const keybindingContext = createContext(Symbol("keybinding"));
|
|
38
|
+
let DictationRoot = class DictationRoot extends LitElement {
|
|
39
|
+
set accessToken(token) {
|
|
40
|
+
this.setAccessToken(token);
|
|
41
|
+
}
|
|
42
|
+
get accessToken() {
|
|
43
|
+
return this._accessToken;
|
|
44
|
+
}
|
|
45
|
+
set authConfig(config) {
|
|
46
|
+
this.setAuthConfig(config);
|
|
47
|
+
}
|
|
48
|
+
get authConfig() {
|
|
49
|
+
return this._authConfig;
|
|
50
|
+
}
|
|
51
|
+
set languages(value) {
|
|
52
|
+
this._languages = value;
|
|
53
|
+
// Clear auto-loaded flag when languages are set via property
|
|
54
|
+
if (value !== undefined) {
|
|
55
|
+
__classPrivateFieldGet(this, _DictationRoot_languagesController, "f").clearAutoLoadedFlag();
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
get languages() {
|
|
59
|
+
return this._languages;
|
|
60
|
+
}
|
|
61
|
+
set devices(value) {
|
|
62
|
+
this._devices = value;
|
|
63
|
+
// Clear auto-loaded flag when devices are set via property
|
|
64
|
+
if (value !== undefined) {
|
|
65
|
+
__classPrivateFieldGet(this, _DictationRoot_devicesController, "f").clearAutoLoadedFlag();
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
get devices() {
|
|
69
|
+
return this._devices;
|
|
70
|
+
}
|
|
71
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
72
|
+
// Lifecycle
|
|
73
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
74
|
+
constructor() {
|
|
75
|
+
super();
|
|
76
|
+
this.recordingState = "stopped";
|
|
77
|
+
_DictationRoot_languagesController.set(this, new LanguagesController(this));
|
|
78
|
+
_DictationRoot_devicesController.set(this, new DevicesController(this));
|
|
79
|
+
this.mode = "toggle-to-talk";
|
|
80
|
+
this.noWrapper = false;
|
|
81
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
82
|
+
// Private event handlers
|
|
83
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
84
|
+
_DictationRoot_handleLanguageChanged.set(this, (e) => {
|
|
85
|
+
const event = e;
|
|
86
|
+
this.dictationConfig = {
|
|
87
|
+
...this.dictationConfig,
|
|
88
|
+
primaryLanguage: event.detail.selectedLanguage,
|
|
89
|
+
};
|
|
90
|
+
});
|
|
91
|
+
_DictationRoot_handleDeviceChanged.set(this, (e) => {
|
|
92
|
+
const event = e;
|
|
93
|
+
this.selectedDevice = event.detail.selectedDevice;
|
|
94
|
+
});
|
|
95
|
+
_DictationRoot_handleRecordingStateChanged.set(this, (e) => {
|
|
96
|
+
const event = e;
|
|
97
|
+
this.recordingState = event.detail.state;
|
|
98
|
+
});
|
|
99
|
+
_DictationRoot_handleContextRequest.set(this, (e) => {
|
|
100
|
+
if (e.context === languagesContext) {
|
|
101
|
+
__classPrivateFieldGet(this, _DictationRoot_languagesController, "f").initialize();
|
|
102
|
+
}
|
|
103
|
+
else if (e.context === devicesContext) {
|
|
104
|
+
__classPrivateFieldGet(this, _DictationRoot_devicesController, "f").initialize();
|
|
105
|
+
}
|
|
106
|
+
else if (e.context === keybindingContext &&
|
|
107
|
+
e.contextTarget.tagName.toLowerCase() === "dictation-keybinding-selector") {
|
|
108
|
+
// Initialize keybinding to default "`" when setting first mounts
|
|
109
|
+
if (this.keybinding === undefined) {
|
|
110
|
+
this.keybinding = "`";
|
|
111
|
+
this.dispatchEvent(keybindingChangedEvent("`", "Backquote"));
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
});
|
|
115
|
+
_DictationRoot_handleModeChanged.set(this, (e) => {
|
|
116
|
+
const event = e;
|
|
117
|
+
this.mode = event.detail.mode;
|
|
118
|
+
});
|
|
119
|
+
_DictationRoot_handleKeybindingChanged.set(this, (e) => {
|
|
120
|
+
const event = e;
|
|
121
|
+
const normalizedKeybinding = normalizeKeybinding(event.detail.key);
|
|
122
|
+
this.keybinding = normalizedKeybinding;
|
|
123
|
+
});
|
|
124
|
+
this.addEventListener("languages-changed", __classPrivateFieldGet(this, _DictationRoot_handleLanguageChanged, "f"));
|
|
125
|
+
this.addEventListener("recording-devices-changed", __classPrivateFieldGet(this, _DictationRoot_handleDeviceChanged, "f"));
|
|
126
|
+
this.addEventListener("recording-state-changed", __classPrivateFieldGet(this, _DictationRoot_handleRecordingStateChanged, "f"));
|
|
127
|
+
this.addEventListener("context-request", __classPrivateFieldGet(this, _DictationRoot_handleContextRequest, "f"));
|
|
128
|
+
this.addEventListener("mode-changed", __classPrivateFieldGet(this, _DictationRoot_handleModeChanged, "f"));
|
|
129
|
+
this.addEventListener("keybinding-changed", __classPrivateFieldGet(this, _DictationRoot_handleKeybindingChanged, "f"));
|
|
130
|
+
}
|
|
131
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
132
|
+
// Public methods
|
|
133
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
134
|
+
/**
|
|
135
|
+
* Sets the access token and parses region/tenant from it.
|
|
136
|
+
* @returns ServerConfig with environment, tenant, and accessToken
|
|
137
|
+
* @deprecated Use 'accessToken' property instead.
|
|
138
|
+
*/
|
|
139
|
+
setAccessToken(token) {
|
|
140
|
+
this._accessToken = token;
|
|
141
|
+
this.region = undefined;
|
|
142
|
+
this.tenantName = undefined;
|
|
143
|
+
if (!token) {
|
|
144
|
+
return { accessToken: token, environment: undefined, tenant: undefined };
|
|
145
|
+
}
|
|
146
|
+
try {
|
|
147
|
+
const decoded = decodeToken(token);
|
|
148
|
+
this.region = decoded?.environment;
|
|
149
|
+
this.tenantName = decoded?.tenant;
|
|
150
|
+
return {
|
|
151
|
+
accessToken: token,
|
|
152
|
+
environment: decoded?.environment,
|
|
153
|
+
tenant: decoded?.tenant,
|
|
154
|
+
};
|
|
155
|
+
}
|
|
156
|
+
catch (error) {
|
|
157
|
+
this.dispatchEvent(errorEvent(error));
|
|
158
|
+
}
|
|
159
|
+
return { accessToken: token, environment: undefined, tenant: undefined };
|
|
160
|
+
}
|
|
161
|
+
/**
|
|
162
|
+
* Sets the auth config and parses region/tenant from the initial token.
|
|
163
|
+
* @returns Promise with ServerConfig containing environment, tenant, and accessToken
|
|
164
|
+
* @deprecated Use 'authConfig' property instead.
|
|
165
|
+
*/
|
|
166
|
+
async setAuthConfig(config) {
|
|
167
|
+
this._authConfig = config;
|
|
168
|
+
if (!config) {
|
|
169
|
+
return {
|
|
170
|
+
accessToken: undefined,
|
|
171
|
+
environment: undefined,
|
|
172
|
+
tenant: undefined,
|
|
173
|
+
};
|
|
174
|
+
}
|
|
175
|
+
try {
|
|
176
|
+
const { accessToken } = await getInitialToken(config);
|
|
177
|
+
return this.setAccessToken(accessToken);
|
|
178
|
+
}
|
|
179
|
+
catch (error) {
|
|
180
|
+
this.dispatchEvent(errorEvent(error));
|
|
181
|
+
}
|
|
182
|
+
return {
|
|
183
|
+
accessToken: undefined,
|
|
184
|
+
environment: undefined,
|
|
185
|
+
tenant: undefined,
|
|
186
|
+
};
|
|
187
|
+
}
|
|
188
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
189
|
+
// Render
|
|
190
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
191
|
+
render() {
|
|
192
|
+
if (this.noWrapper) {
|
|
193
|
+
return html `<slot></slot>`;
|
|
194
|
+
}
|
|
195
|
+
return html `<div class="wrapper">
|
|
196
|
+
<slot></slot>
|
|
197
|
+
</div>`;
|
|
198
|
+
}
|
|
199
|
+
};
|
|
200
|
+
_DictationRoot_languagesController = new WeakMap();
|
|
201
|
+
_DictationRoot_devicesController = new WeakMap();
|
|
202
|
+
_DictationRoot_handleLanguageChanged = new WeakMap();
|
|
203
|
+
_DictationRoot_handleDeviceChanged = new WeakMap();
|
|
204
|
+
_DictationRoot_handleRecordingStateChanged = new WeakMap();
|
|
205
|
+
_DictationRoot_handleContextRequest = new WeakMap();
|
|
206
|
+
_DictationRoot_handleModeChanged = new WeakMap();
|
|
207
|
+
_DictationRoot_handleKeybindingChanged = new WeakMap();
|
|
208
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
209
|
+
// Static
|
|
210
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
211
|
+
DictationRoot.styles = [ComponentStyles];
|
|
212
|
+
__decorate([
|
|
213
|
+
provide({ context: regionContext }),
|
|
214
|
+
state()
|
|
215
|
+
], DictationRoot.prototype, "region", void 0);
|
|
216
|
+
__decorate([
|
|
217
|
+
provide({ context: tenantNameContext }),
|
|
218
|
+
state()
|
|
219
|
+
], DictationRoot.prototype, "tenantName", void 0);
|
|
220
|
+
__decorate([
|
|
221
|
+
provide({ context: recordingStateContext }),
|
|
222
|
+
state()
|
|
223
|
+
], DictationRoot.prototype, "recordingState", void 0);
|
|
224
|
+
__decorate([
|
|
225
|
+
provide({ context: accessTokenContext }),
|
|
226
|
+
state()
|
|
227
|
+
], DictationRoot.prototype, "_accessToken", void 0);
|
|
228
|
+
__decorate([
|
|
229
|
+
property({ type: String })
|
|
230
|
+
], DictationRoot.prototype, "accessToken", null);
|
|
231
|
+
__decorate([
|
|
232
|
+
provide({ context: authConfigContext }),
|
|
233
|
+
state()
|
|
234
|
+
], DictationRoot.prototype, "_authConfig", void 0);
|
|
235
|
+
__decorate([
|
|
236
|
+
property({ attribute: false, type: Object })
|
|
237
|
+
], DictationRoot.prototype, "authConfig", null);
|
|
238
|
+
__decorate([
|
|
239
|
+
provide({ context: socketUrlContext }),
|
|
240
|
+
property({ type: String })
|
|
241
|
+
], DictationRoot.prototype, "socketUrl", void 0);
|
|
242
|
+
__decorate([
|
|
243
|
+
provide({ context: socketProxyContext }),
|
|
244
|
+
property({ attribute: false, type: Object })
|
|
245
|
+
], DictationRoot.prototype, "socketProxy", void 0);
|
|
246
|
+
__decorate([
|
|
247
|
+
provide({ context: dictationConfigContext }),
|
|
248
|
+
property({ attribute: false, type: Object })
|
|
249
|
+
], DictationRoot.prototype, "dictationConfig", void 0);
|
|
250
|
+
__decorate([
|
|
251
|
+
provide({ context: languagesContext }),
|
|
252
|
+
state()
|
|
253
|
+
], DictationRoot.prototype, "_languages", void 0);
|
|
254
|
+
__decorate([
|
|
255
|
+
property({
|
|
256
|
+
converter: commaSeparatedConverter,
|
|
257
|
+
type: Array,
|
|
258
|
+
})
|
|
259
|
+
], DictationRoot.prototype, "languages", null);
|
|
260
|
+
__decorate([
|
|
261
|
+
provide({ context: devicesContext }),
|
|
262
|
+
state()
|
|
263
|
+
], DictationRoot.prototype, "_devices", void 0);
|
|
264
|
+
__decorate([
|
|
265
|
+
property({ attribute: false, type: Array })
|
|
266
|
+
], DictationRoot.prototype, "devices", null);
|
|
267
|
+
__decorate([
|
|
268
|
+
provide({ context: selectedDeviceContext }),
|
|
269
|
+
property({ attribute: false, type: Object })
|
|
270
|
+
], DictationRoot.prototype, "selectedDevice", void 0);
|
|
271
|
+
__decorate([
|
|
272
|
+
provide({ context: debugDisplayAudioContext }),
|
|
273
|
+
property({ attribute: "debug-display-audio", type: Boolean })
|
|
274
|
+
], DictationRoot.prototype, "debug_displayAudio", void 0);
|
|
275
|
+
__decorate([
|
|
276
|
+
provide({ context: modeContext }),
|
|
277
|
+
property({ type: String })
|
|
278
|
+
], DictationRoot.prototype, "mode", void 0);
|
|
279
|
+
__decorate([
|
|
280
|
+
provide({ context: keybindingContext }),
|
|
281
|
+
property({ type: String })
|
|
282
|
+
], DictationRoot.prototype, "keybinding", void 0);
|
|
283
|
+
__decorate([
|
|
284
|
+
property({ type: Boolean })
|
|
285
|
+
], DictationRoot.prototype, "noWrapper", void 0);
|
|
286
|
+
DictationRoot = __decorate([
|
|
287
|
+
customElement("dictation-root")
|
|
288
|
+
], DictationRoot);
|
|
289
|
+
export { DictationRoot };
|
|
290
|
+
//# sourceMappingURL=dictation-context.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dictation-context.js","sourceRoot":"","sources":["../../src/contexts/dictation-context.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Corti } from \"@corti/sdk\";\nimport { type ContextEvent, createContext, provide } from \"@lit/context\";\nimport { type CSSResultGroup, html, LitElement } from \"lit\";\nimport { customElement, property, state } from \"lit/decorators.js\";\nimport { DevicesController } from \"../controllers/devices-controller.js\";\nimport { LanguagesController } from \"../controllers/languages-controller.js\";\nimport ComponentStyles from \"../styles/component-styles.js\";\nimport type { DictationMode, ProxyOptions, RecordingState } from \"../types.js\";\nimport { getInitialToken } from \"../utils/auth.js\";\nimport { commaSeparatedConverter } from \"../utils/converters.js\";\nimport {\n errorEvent,\n type KeybindingChangedEventDetail,\n keybindingChangedEvent,\n} from \"../utils/events.js\";\nimport { normalizeKeybinding } from \"../utils/keybinding.js\";\nimport { decodeToken } from \"../utils/token.js\";\n\nexport const regionContext = createContext<string | undefined>(\n Symbol(\"region\"),\n);\nexport const tenantNameContext = createContext<string | undefined>(\n Symbol(\"tenantName\"),\n);\nexport const languagesContext = createContext<\n Corti.TranscribeSupportedLanguage[] | undefined\n>(Symbol(\"languages\"));\nexport const devicesContext = createContext<MediaDeviceInfo[] | undefined>(\n Symbol(\"devices\"),\n);\nexport const selectedDeviceContext = createContext<MediaDeviceInfo | undefined>(\n Symbol(\"selectedDevice\"),\n);\nexport const recordingStateContext = createContext<RecordingState>(\n Symbol(\"recordingState\"),\n);\nexport const accessTokenContext = createContext<string | undefined>(\n Symbol(\"accessToken\"),\n);\nexport const dictationConfigContext = createContext<\n Corti.TranscribeConfig | undefined\n>(Symbol(\"dictationConfig\"));\nexport const authConfigContext = createContext<Corti.BearerOptions | undefined>(\n Symbol(\"authConfig\"),\n);\nexport const socketUrlContext = createContext<string | undefined>(\n Symbol(\"socketUrl\"),\n);\nexport const socketProxyContext = createContext<ProxyOptions | undefined>(\n Symbol(\"socketProxy\"),\n);\nexport const debugDisplayAudioContext = createContext<boolean | undefined>(\n Symbol(\"debugDisplayAudio\"),\n);\nexport const modeContext = createContext<DictationMode>(Symbol(\"mode\"));\nexport const keybindingContext = createContext<string | null | undefined>(\n Symbol(\"keybinding\"),\n);\n\n@customElement(\"dictation-root\")\nexport class DictationRoot extends LitElement {\n // ─────────────────────────────────────────────────────────────────────────────\n // Context state\n // ─────────────────────────────────────────────────────────────────────────────\n\n @provide({ context: regionContext })\n @state()\n region?: string;\n\n @provide({ context: tenantNameContext })\n @state()\n tenantName?: string;\n\n @provide({ context: recordingStateContext })\n @state()\n recordingState: RecordingState = \"stopped\";\n\n // ─────────────────────────────────────────────────────────────────────────────\n // Properties\n // ─────────────────────────────────────────────────────────────────────────────\n\n @provide({ context: accessTokenContext })\n @state()\n _accessToken?: string;\n\n @property({ type: String })\n set accessToken(token: string | undefined) {\n this.setAccessToken(token);\n }\n\n get accessToken(): string | undefined {\n return this._accessToken;\n }\n\n @provide({ context: authConfigContext })\n @state()\n _authConfig?: Corti.BearerOptions;\n\n @property({ attribute: false, type: Object })\n set authConfig(config: Corti.BearerOptions | undefined) {\n this.setAuthConfig(config);\n }\n\n get authConfig(): Corti.BearerOptions | undefined {\n return this._authConfig;\n }\n\n @provide({ context: socketUrlContext })\n @property({ type: String })\n socketUrl?: string;\n\n @provide({ context: socketProxyContext })\n @property({ attribute: false, type: Object })\n socketProxy?: ProxyOptions;\n\n @provide({ context: dictationConfigContext })\n @property({ attribute: false, type: Object })\n dictationConfig?: Corti.TranscribeConfig;\n\n #languagesController = new LanguagesController(this);\n #devicesController = new DevicesController(this);\n\n @provide({ context: languagesContext })\n @state()\n _languages?: Corti.TranscribeSupportedLanguage[];\n\n @property({\n converter: commaSeparatedConverter,\n type: Array,\n })\n set languages(value: Corti.TranscribeSupportedLanguage[] | undefined) {\n this._languages = value;\n\n // Clear auto-loaded flag when languages are set via property\n if (value !== undefined) {\n this.#languagesController.clearAutoLoadedFlag();\n }\n }\n\n get languages(): Corti.TranscribeSupportedLanguage[] | undefined {\n return this._languages;\n }\n\n @provide({ context: devicesContext })\n @state()\n _devices?: MediaDeviceInfo[];\n\n @property({ attribute: false, type: Array })\n set devices(value: MediaDeviceInfo[] | undefined) {\n this._devices = value;\n\n // Clear auto-loaded flag when devices are set via property\n if (value !== undefined) {\n this.#devicesController.clearAutoLoadedFlag();\n }\n }\n\n get devices(): MediaDeviceInfo[] | undefined {\n return this._devices;\n }\n\n @provide({ context: selectedDeviceContext })\n @property({ attribute: false, type: Object })\n selectedDevice?: MediaDeviceInfo;\n\n @provide({ context: debugDisplayAudioContext })\n @property({ attribute: \"debug-display-audio\", type: Boolean })\n debug_displayAudio?: boolean;\n\n @provide({ context: modeContext })\n @property({ type: String })\n mode: DictationMode = \"toggle-to-talk\";\n\n @provide({ context: keybindingContext })\n @property({ type: String })\n keybinding?: string | null;\n\n @property({ type: Boolean })\n noWrapper: boolean = false;\n\n // ─────────────────────────────────────────────────────────────────────────────\n // Static\n // ─────────────────────────────────────────────────────────────────────────────\n\n static styles: CSSResultGroup = [ComponentStyles];\n\n // ─────────────────────────────────────────────────────────────────────────────\n // Lifecycle\n // ─────────────────────────────────────────────────────────────────────────────\n\n constructor() {\n super();\n this.addEventListener(\"languages-changed\", this.#handleLanguageChanged);\n this.addEventListener(\n \"recording-devices-changed\",\n this.#handleDeviceChanged,\n );\n this.addEventListener(\n \"recording-state-changed\",\n this.#handleRecordingStateChanged,\n );\n this.addEventListener(\"context-request\", this.#handleContextRequest);\n this.addEventListener(\"mode-changed\", this.#handleModeChanged);\n this.addEventListener(\"keybinding-changed\", this.#handleKeybindingChanged);\n }\n\n // ─────────────────────────────────────────────────────────────────────────────\n // Public methods\n // ─────────────────────────────────────────────────────────────────────────────\n\n /**\n * Sets the access token and parses region/tenant from it.\n * @returns ServerConfig with environment, tenant, and accessToken\n * @deprecated Use 'accessToken' property instead.\n */\n public setAccessToken(token: string | undefined) {\n this._accessToken = token;\n this.region = undefined;\n this.tenantName = undefined;\n\n if (!token) {\n return { accessToken: token, environment: undefined, tenant: undefined };\n }\n\n try {\n const decoded = decodeToken(token);\n\n this.region = decoded?.environment;\n this.tenantName = decoded?.tenant;\n\n return {\n accessToken: token,\n environment: decoded?.environment,\n tenant: decoded?.tenant,\n };\n } catch (error) {\n this.dispatchEvent(errorEvent(error));\n }\n\n return { accessToken: token, environment: undefined, tenant: undefined };\n }\n\n /**\n * Sets the auth config and parses region/tenant from the initial token.\n * @returns Promise with ServerConfig containing environment, tenant, and accessToken\n * @deprecated Use 'authConfig' property instead.\n */\n public async setAuthConfig(config?: Corti.BearerOptions) {\n this._authConfig = config;\n\n if (!config) {\n return {\n accessToken: undefined,\n environment: undefined,\n tenant: undefined,\n };\n }\n\n try {\n const { accessToken } = await getInitialToken(config);\n\n return this.setAccessToken(accessToken);\n } catch (error) {\n this.dispatchEvent(errorEvent(error));\n }\n\n return {\n accessToken: undefined,\n environment: undefined,\n tenant: undefined,\n };\n }\n\n // ─────────────────────────────────────────────────────────────────────────────\n // Private event handlers\n // ─────────────────────────────────────────────────────────────────────────────\n\n #handleLanguageChanged = (e: Event) => {\n const event = e as CustomEvent;\n\n this.dictationConfig = {\n ...this.dictationConfig,\n primaryLanguage: event.detail.selectedLanguage,\n };\n };\n\n #handleDeviceChanged = (e: Event) => {\n const event = e as CustomEvent;\n\n this.selectedDevice = event.detail.selectedDevice;\n };\n\n #handleRecordingStateChanged = (e: Event) => {\n const event = e as CustomEvent;\n\n this.recordingState = event.detail.state;\n };\n\n #handleContextRequest = (e: ContextEvent<any>) => {\n if (e.context === languagesContext) {\n this.#languagesController.initialize();\n } else if (e.context === devicesContext) {\n this.#devicesController.initialize();\n } else if (\n e.context === keybindingContext &&\n e.contextTarget.tagName.toLowerCase() === \"dictation-keybinding-selector\"\n ) {\n // Initialize keybinding to default \"`\" when setting first mounts\n if (this.keybinding === undefined) {\n this.keybinding = \"`\";\n this.dispatchEvent(keybindingChangedEvent(\"`\", \"Backquote\"));\n }\n }\n };\n\n #handleModeChanged = (e: Event) => {\n const event = e as CustomEvent;\n\n this.mode = event.detail.mode;\n };\n\n #handleKeybindingChanged = (e: Event) => {\n const event = e as CustomEvent<KeybindingChangedEventDetail>;\n\n const normalizedKeybinding = normalizeKeybinding(event.detail.key);\n this.keybinding = normalizedKeybinding;\n };\n\n // ─────────────────────────────────────────────────────────────────────────────\n // Render\n // ─────────────────────────────────────────────────────────────────────────────\n\n render() {\n if (this.noWrapper) {\n return html`<slot></slot>`;\n }\n\n return html`<div class=\"wrapper\">\n <slot></slot>\n </div>`;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n \"dictation-root\": DictationRoot;\n }\n}\n"]}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { type Corti } from "@corti/sdk";
|
|
2
|
+
import type { ReactiveController, ReactiveControllerHost } from "lit";
|
|
3
|
+
import type { ProxyOptions } from "../types.js";
|
|
4
|
+
interface DictationControllerHost extends ReactiveControllerHost {
|
|
5
|
+
_accessToken?: string;
|
|
6
|
+
_authConfig?: Corti.BearerOptions;
|
|
7
|
+
_region?: string;
|
|
8
|
+
_tenantName?: string;
|
|
9
|
+
_socketUrl?: string;
|
|
10
|
+
_socketProxy?: ProxyOptions;
|
|
11
|
+
}
|
|
12
|
+
export type TranscribeMessage = Corti.TranscribeConfigStatusMessage | Corti.TranscribeUsageMessage | Corti.TranscribeEndedMessage | Corti.TranscribeErrorMessage | Corti.TranscribeTranscriptMessage | Corti.TranscribeCommandMessage | Corti.TranscribeFlushedMessage;
|
|
13
|
+
interface WebSocketCallbacks {
|
|
14
|
+
onMessage?: (message: TranscribeMessage) => void;
|
|
15
|
+
onError?: (error: Error) => void;
|
|
16
|
+
onClose?: (event: unknown) => void;
|
|
17
|
+
onNetworkActivity?: (direction: "sent" | "received", data: unknown) => void;
|
|
18
|
+
}
|
|
19
|
+
export declare class DictationController implements ReactiveController {
|
|
20
|
+
host: DictationControllerHost;
|
|
21
|
+
private _cortiClient;
|
|
22
|
+
private _webSocket;
|
|
23
|
+
private _closeTimeout?;
|
|
24
|
+
private _onNetworkActivity?;
|
|
25
|
+
constructor(host: DictationControllerHost);
|
|
26
|
+
hostDisconnected(): void;
|
|
27
|
+
connect(mediaRecorder: MediaRecorder | null, dictationConfig?: Corti.TranscribeConfig, callbacks?: WebSocketCallbacks): Promise<void>;
|
|
28
|
+
private connectProxy;
|
|
29
|
+
private connectAuth;
|
|
30
|
+
private setupWebSocketHandlers;
|
|
31
|
+
private setupMediaRecorder;
|
|
32
|
+
disconnect(onClose?: (event: unknown) => void): Promise<void>;
|
|
33
|
+
cleanup(): void;
|
|
34
|
+
}
|
|
35
|
+
export {};
|