@corti/dictation-web 0.0.0-test.562 → 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.
Files changed (129) hide show
  1. package/README.md +164 -112
  2. package/dist/bundle.js +1416 -546
  3. package/dist/components/audio-visualiser.d.ts +3 -2
  4. package/dist/components/audio-visualiser.js +15 -12
  5. package/dist/components/audio-visualiser.js.map +1 -1
  6. package/dist/components/corti-dictation.d.ts +26 -13
  7. package/dist/components/corti-dictation.js +70 -21
  8. package/dist/components/corti-dictation.js.map +1 -1
  9. package/dist/components/device-selector.d.ts +6 -16
  10. package/dist/components/device-selector.js +27 -58
  11. package/dist/components/device-selector.js.map +1 -1
  12. package/dist/components/keybinding-selector.d.ts +14 -0
  13. package/dist/components/keybinding-selector.js +81 -0
  14. package/dist/components/keybinding-selector.js.map +1 -0
  15. package/dist/components/language-selector.d.ts +8 -17
  16. package/dist/components/language-selector.js +26 -52
  17. package/dist/components/language-selector.js.map +1 -1
  18. package/dist/components/mode-selector.d.ts +14 -0
  19. package/dist/components/mode-selector.js +73 -0
  20. package/dist/components/mode-selector.js.map +1 -0
  21. package/dist/components/recording-button.d.ts +8 -14
  22. package/dist/components/recording-button.js +155 -96
  23. package/dist/components/recording-button.js.map +1 -1
  24. package/dist/components/settings-menu.d.ts +4 -2
  25. package/dist/components/settings-menu.js +34 -14
  26. package/dist/components/settings-menu.js.map +1 -1
  27. package/dist/constants.d.ts +5 -0
  28. package/dist/constants.js +5 -0
  29. package/dist/constants.js.map +1 -1
  30. package/dist/contexts/dictation-context.d.ts +24 -14
  31. package/dist/contexts/dictation-context.js +128 -46
  32. package/dist/contexts/dictation-context.js.map +1 -1
  33. package/dist/controllers/devices-controller.d.ts +26 -0
  34. package/dist/controllers/devices-controller.js +99 -0
  35. package/dist/controllers/devices-controller.js.map +1 -0
  36. package/dist/controllers/dictation-controller.d.ts +29 -0
  37. package/dist/controllers/dictation-controller.js +179 -0
  38. package/dist/controllers/dictation-controller.js.map +1 -0
  39. package/dist/controllers/keybinding-controller.d.ts +17 -0
  40. package/dist/controllers/keybinding-controller.js +80 -0
  41. package/dist/controllers/keybinding-controller.js.map +1 -0
  42. package/dist/controllers/languages-controller.d.ts +26 -0
  43. package/dist/controllers/languages-controller.js +83 -0
  44. package/dist/controllers/languages-controller.js.map +1 -0
  45. package/dist/controllers/media-controller.d.ts +24 -0
  46. package/dist/controllers/media-controller.js +115 -0
  47. package/dist/controllers/media-controller.js.map +1 -0
  48. package/dist/index.d.ts +9 -7
  49. package/dist/index.js +30 -20
  50. package/dist/index.js.map +1 -1
  51. package/dist/src/components/audio-visualiser.d.ts +1 -0
  52. package/dist/src/components/audio-visualiser.js +6 -3
  53. package/dist/src/components/audio-visualiser.js.map +1 -1
  54. package/dist/src/components/corti-dictation.d.ts +21 -6
  55. package/dist/src/components/corti-dictation.js +25 -2
  56. package/dist/src/components/corti-dictation.js.map +1 -1
  57. package/dist/src/components/recording-button.d.ts +4 -0
  58. package/dist/src/components/recording-button.js +34 -10
  59. package/dist/src/components/recording-button.js.map +1 -1
  60. package/dist/src/components/settings-menu.js +1 -1
  61. package/dist/src/components/settings-menu.js.map +1 -1
  62. package/dist/src/constants.js +24 -6
  63. package/dist/src/constants.js.map +1 -1
  64. package/dist/src/contexts/dictation-context.d.ts +19 -5
  65. package/dist/src/contexts/dictation-context.js +32 -12
  66. package/dist/src/contexts/dictation-context.js.map +1 -1
  67. package/dist/src/controllers/DictationController.d.ts +5 -0
  68. package/dist/src/controllers/DictationController.js +27 -8
  69. package/dist/src/controllers/DictationController.js.map +1 -1
  70. package/dist/src/controllers/MediaController.d.ts +6 -0
  71. package/dist/src/controllers/MediaController.js +17 -1
  72. package/dist/src/controllers/MediaController.js.map +1 -1
  73. package/dist/src/styles/ComponentStyles.js +5 -5
  74. package/dist/src/styles/ComponentStyles.js.map +1 -1
  75. package/dist/src/styles/audio-visualiser.js +1 -1
  76. package/dist/src/styles/audio-visualiser.js.map +1 -1
  77. package/dist/src/styles/buttons.js +12 -12
  78. package/dist/src/styles/buttons.js.map +1 -1
  79. package/dist/src/styles/callout.js +7 -7
  80. package/dist/src/styles/callout.js.map +1 -1
  81. package/dist/src/styles/select.js +8 -8
  82. package/dist/src/styles/select.js.map +1 -1
  83. package/dist/src/styles/settings-menu.js +4 -4
  84. package/dist/src/styles/settings-menu.js.map +1 -1
  85. package/dist/src/types.d.ts +5 -0
  86. package/dist/src/types.js.map +1 -1
  87. package/dist/src/utils/converters.js +4 -1
  88. package/dist/src/utils/converters.js.map +1 -1
  89. package/dist/src/utils/events.d.ts +11 -4
  90. package/dist/src/utils/events.js.map +1 -1
  91. package/dist/src/utils/languages.js +2 -1
  92. package/dist/src/utils/languages.js.map +1 -1
  93. package/dist/src/utils/media.d.ts +1 -1
  94. package/dist/src/utils/media.js +13 -1
  95. package/dist/src/utils/media.js.map +1 -1
  96. package/dist/src/utils/token.d.ts +1 -1
  97. package/dist/src/utils/token.js +12 -11
  98. package/dist/src/utils/token.js.map +1 -1
  99. package/dist/styles/buttons.js +1 -2
  100. package/dist/styles/buttons.js.map +1 -1
  101. package/dist/styles/component-styles.d.ts +3 -0
  102. package/dist/styles/component-styles.js +32 -0
  103. package/dist/styles/component-styles.js.map +1 -0
  104. package/dist/styles/keybinding-selector.d.ts +2 -0
  105. package/dist/styles/keybinding-selector.js +72 -0
  106. package/dist/styles/keybinding-selector.js.map +1 -0
  107. package/dist/styles/mode-selector.d.ts +2 -0
  108. package/dist/styles/mode-selector.js +54 -0
  109. package/dist/styles/mode-selector.js.map +1 -0
  110. package/dist/styles/select.d.ts +1 -1
  111. package/dist/styles/select.js +6 -10
  112. package/dist/styles/select.js.map +1 -1
  113. package/dist/styles/settings-menu.js +9 -1
  114. package/dist/styles/settings-menu.js.map +1 -1
  115. package/dist/tsconfig.stories.tsbuildinfo +1 -1
  116. package/dist/types.d.ts +3 -1
  117. package/dist/types.js.map +1 -1
  118. package/dist/utils/events.d.ts +12 -3
  119. package/dist/utils/events.js +14 -0
  120. package/dist/utils/events.js.map +1 -1
  121. package/dist/utils/keybinding.d.ts +49 -0
  122. package/dist/utils/keybinding.js +140 -0
  123. package/dist/utils/keybinding.js.map +1 -0
  124. package/dist/utils/languages.d.ts +4 -3
  125. package/dist/utils/languages.js.map +1 -1
  126. package/dist/utils/token.d.ts +1 -1
  127. package/dist/utils/token.js +12 -11
  128. package/dist/utils/token.js.map +1 -1
  129. package/package.json +9 -8
@@ -1,6 +1,6 @@
1
1
  import type { Corti } from "@corti/sdk";
2
2
  import { type CSSResultGroup, LitElement } from "lit";
3
- import type { ProxyOptions, RecordingState } from "../types.js";
3
+ import type { DictationMode, ProxyOptions, RecordingState } from "../types.js";
4
4
  export declare const regionContext: {
5
5
  __context__: string | undefined;
6
6
  };
@@ -37,23 +37,36 @@ export declare const socketProxyContext: {
37
37
  export declare const debugDisplayAudioContext: {
38
38
  __context__: boolean | undefined;
39
39
  };
40
- export declare class DictationContext extends LitElement {
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;
41
48
  region?: string;
42
49
  tenantName?: string;
43
50
  recordingState: RecordingState;
44
- private _accessToken?;
51
+ _accessToken?: string;
45
52
  set accessToken(token: string | undefined);
46
53
  get accessToken(): string | undefined;
47
- private _authConfig?;
54
+ _authConfig?: Corti.BearerOptions;
48
55
  set authConfig(config: Corti.BearerOptions | undefined);
49
56
  get authConfig(): Corti.BearerOptions | undefined;
50
57
  socketUrl?: string;
51
58
  socketProxy?: ProxyOptions;
52
59
  dictationConfig?: Corti.TranscribeConfig;
53
- languages?: string[];
54
- devices?: MediaDeviceInfo[];
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;
55
66
  selectedDevice?: MediaDeviceInfo;
56
67
  debug_displayAudio?: boolean;
68
+ mode: DictationMode;
69
+ keybinding?: string | null;
57
70
  noWrapper: boolean;
58
71
  static styles: CSSResultGroup;
59
72
  constructor();
@@ -68,8 +81,8 @@ export declare class DictationContext extends LitElement {
68
81
  tenant: undefined;
69
82
  } | {
70
83
  accessToken: string;
71
- environment: string | undefined;
72
- tenant: string | undefined;
84
+ environment: string;
85
+ tenant: string;
73
86
  };
74
87
  /**
75
88
  * Sets the auth config and parses region/tenant from the initial token.
@@ -82,16 +95,13 @@ export declare class DictationContext extends LitElement {
82
95
  tenant: undefined;
83
96
  } | {
84
97
  accessToken: string;
85
- environment: string | undefined;
86
- tenant: string | undefined;
98
+ environment: string;
99
+ tenant: string;
87
100
  }>;
88
- private _handleLanguageChanged;
89
- private _handleDeviceChanged;
90
- private _handleRecordingStateChanged;
91
101
  render(): import("lit-html").TemplateResult<1>;
92
102
  }
93
103
  declare global {
94
104
  interface HTMLElementTagNameMap {
95
- "dictation-context-provider": DictationContext;
105
+ "dictation-root": DictationRoot;
96
106
  }
97
107
  }
@@ -4,27 +4,38 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
4
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
5
  return c > 3 && r && Object.defineProperty(target, key, r), r;
6
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;
7
13
  import { createContext, provide } from "@lit/context";
8
14
  import { html, LitElement } from "lit";
9
15
  import { customElement, property, state } from "lit/decorators.js";
10
- import ComponentStyles from "../styles/ComponentStyles.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";
11
19
  import { getInitialToken } from "../utils/auth.js";
12
20
  import { commaSeparatedConverter } from "../utils/converters.js";
13
- import { errorEvent } from "../utils/events.js";
21
+ import { errorEvent, keybindingChangedEvent, } from "../utils/events.js";
22
+ import { normalizeKeybinding } from "../utils/keybinding.js";
14
23
  import { decodeToken } from "../utils/token.js";
15
- export const regionContext = createContext("region");
16
- export const tenantNameContext = createContext("tenantName");
17
- export const languagesContext = createContext("languages");
18
- export const devicesContext = createContext("devices");
19
- export const selectedDeviceContext = createContext("selectedDevice");
20
- export const recordingStateContext = createContext("recordingState");
21
- export const accessTokenContext = createContext("accessToken");
22
- export const dictationConfigContext = createContext("dictationConfig");
23
- export const authConfigContext = createContext("authConfig");
24
- export const socketUrlContext = createContext("socketUrl");
25
- export const socketProxyContext = createContext("socketProxy");
26
- export const debugDisplayAudioContext = createContext("debugDisplayAudio");
27
- let DictationContext = class DictationContext extends LitElement {
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 {
28
39
  set accessToken(token) {
29
40
  this.setAccessToken(token);
30
41
  }
@@ -37,36 +48,85 @@ let DictationContext = class DictationContext extends LitElement {
37
48
  get authConfig() {
38
49
  return this._authConfig;
39
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
+ }
40
71
  // ─────────────────────────────────────────────────────────────────────────────
41
72
  // Lifecycle
42
73
  // ─────────────────────────────────────────────────────────────────────────────
43
74
  constructor() {
44
75
  super();
45
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";
46
80
  this.noWrapper = false;
47
81
  // ─────────────────────────────────────────────────────────────────────────────
48
82
  // Private event handlers
49
83
  // ─────────────────────────────────────────────────────────────────────────────
50
- this._handleLanguageChanged = (e) => {
84
+ _DictationRoot_handleLanguageChanged.set(this, (e) => {
51
85
  const event = e;
52
- this.languages = event.detail.languages;
53
86
  this.dictationConfig = {
54
87
  ...this.dictationConfig,
55
88
  primaryLanguage: event.detail.selectedLanguage,
56
89
  };
57
- };
58
- this._handleDeviceChanged = (e) => {
90
+ });
91
+ _DictationRoot_handleDeviceChanged.set(this, (e) => {
59
92
  const event = e;
60
- this.devices = event.detail.devices;
61
93
  this.selectedDevice = event.detail.selectedDevice;
62
- };
63
- this._handleRecordingStateChanged = (e) => {
94
+ });
95
+ _DictationRoot_handleRecordingStateChanged.set(this, (e) => {
64
96
  const event = e;
65
97
  this.recordingState = event.detail.state;
66
- };
67
- this.addEventListener("languages-changed", this._handleLanguageChanged);
68
- this.addEventListener("recording-devices-changed", this._handleDeviceChanged);
69
- this.addEventListener("recording-state-changed", this._handleRecordingStateChanged);
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"));
70
130
  }
71
131
  // ─────────────────────────────────────────────────────────────────────────────
72
132
  // Public methods
@@ -137,72 +197,94 @@ let DictationContext = class DictationContext extends LitElement {
137
197
  </div>`;
138
198
  }
139
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();
140
208
  // ─────────────────────────────────────────────────────────────────────────────
141
209
  // Static
142
210
  // ─────────────────────────────────────────────────────────────────────────────
143
- DictationContext.styles = [ComponentStyles];
211
+ DictationRoot.styles = [ComponentStyles];
144
212
  __decorate([
145
213
  provide({ context: regionContext }),
146
214
  state()
147
- ], DictationContext.prototype, "region", void 0);
215
+ ], DictationRoot.prototype, "region", void 0);
148
216
  __decorate([
149
217
  provide({ context: tenantNameContext }),
150
218
  state()
151
- ], DictationContext.prototype, "tenantName", void 0);
219
+ ], DictationRoot.prototype, "tenantName", void 0);
152
220
  __decorate([
153
221
  provide({ context: recordingStateContext }),
154
222
  state()
155
- ], DictationContext.prototype, "recordingState", void 0);
223
+ ], DictationRoot.prototype, "recordingState", void 0);
156
224
  __decorate([
157
225
  provide({ context: accessTokenContext }),
158
226
  state()
159
- ], DictationContext.prototype, "_accessToken", void 0);
227
+ ], DictationRoot.prototype, "_accessToken", void 0);
160
228
  __decorate([
161
229
  property({ type: String })
162
- ], DictationContext.prototype, "accessToken", null);
230
+ ], DictationRoot.prototype, "accessToken", null);
163
231
  __decorate([
164
232
  provide({ context: authConfigContext }),
165
233
  state()
166
- ], DictationContext.prototype, "_authConfig", void 0);
234
+ ], DictationRoot.prototype, "_authConfig", void 0);
167
235
  __decorate([
168
236
  property({ attribute: false, type: Object })
169
- ], DictationContext.prototype, "authConfig", null);
237
+ ], DictationRoot.prototype, "authConfig", null);
170
238
  __decorate([
171
239
  provide({ context: socketUrlContext }),
172
240
  property({ type: String })
173
- ], DictationContext.prototype, "socketUrl", void 0);
241
+ ], DictationRoot.prototype, "socketUrl", void 0);
174
242
  __decorate([
175
243
  provide({ context: socketProxyContext }),
176
244
  property({ attribute: false, type: Object })
177
- ], DictationContext.prototype, "socketProxy", void 0);
245
+ ], DictationRoot.prototype, "socketProxy", void 0);
178
246
  __decorate([
179
247
  provide({ context: dictationConfigContext }),
180
248
  property({ attribute: false, type: Object })
181
- ], DictationContext.prototype, "dictationConfig", void 0);
249
+ ], DictationRoot.prototype, "dictationConfig", void 0);
182
250
  __decorate([
183
251
  provide({ context: languagesContext }),
252
+ state()
253
+ ], DictationRoot.prototype, "_languages", void 0);
254
+ __decorate([
184
255
  property({
185
256
  converter: commaSeparatedConverter,
186
257
  type: Array,
187
258
  })
188
- ], DictationContext.prototype, "languages", void 0);
259
+ ], DictationRoot.prototype, "languages", null);
189
260
  __decorate([
190
261
  provide({ context: devicesContext }),
262
+ state()
263
+ ], DictationRoot.prototype, "_devices", void 0);
264
+ __decorate([
191
265
  property({ attribute: false, type: Array })
192
- ], DictationContext.prototype, "devices", void 0);
266
+ ], DictationRoot.prototype, "devices", null);
193
267
  __decorate([
194
268
  provide({ context: selectedDeviceContext }),
195
269
  property({ attribute: false, type: Object })
196
- ], DictationContext.prototype, "selectedDevice", void 0);
270
+ ], DictationRoot.prototype, "selectedDevice", void 0);
197
271
  __decorate([
198
272
  provide({ context: debugDisplayAudioContext }),
199
273
  property({ attribute: "debug-display-audio", type: Boolean })
200
- ], DictationContext.prototype, "debug_displayAudio", void 0);
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);
201
283
  __decorate([
202
284
  property({ type: Boolean })
203
- ], DictationContext.prototype, "noWrapper", void 0);
204
- DictationContext = __decorate([
205
- customElement("dictation-context-provider")
206
- ], DictationContext);
207
- export { DictationContext };
285
+ ], DictationRoot.prototype, "noWrapper", void 0);
286
+ DictationRoot = __decorate([
287
+ customElement("dictation-root")
288
+ ], DictationRoot);
289
+ export { DictationRoot };
208
290
  //# sourceMappingURL=dictation-context.js.map
@@ -1 +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 { createContext, provide } from \"@lit/context\";\nimport { type CSSResultGroup, html, LitElement } from \"lit\";\nimport { customElement, property, state } from \"lit/decorators.js\";\nimport ComponentStyles from \"../styles/ComponentStyles.js\";\nimport type { ProxyOptions, RecordingState } from \"../types.js\";\nimport { getInitialToken } from \"../utils/auth.js\";\nimport { commaSeparatedConverter } from \"../utils/converters.js\";\nimport { errorEvent } from \"../utils/events.js\";\nimport { decodeToken } from \"../utils/token.js\";\n\nexport const regionContext = createContext<string | undefined>(\"region\");\nexport const tenantNameContext = createContext<string | undefined>(\n \"tenantName\",\n);\nexport const languagesContext = createContext<string[] | undefined>(\n \"languages\",\n);\nexport const devicesContext = createContext<MediaDeviceInfo[] | undefined>(\n \"devices\",\n);\nexport const selectedDeviceContext = createContext<MediaDeviceInfo | undefined>(\n \"selectedDevice\",\n);\nexport const recordingStateContext =\n createContext<RecordingState>(\"recordingState\");\nexport const accessTokenContext = createContext<string | undefined>(\n \"accessToken\",\n);\nexport const dictationConfigContext = createContext<\n Corti.TranscribeConfig | undefined\n>(\"dictationConfig\");\nexport const authConfigContext = createContext<Corti.BearerOptions | undefined>(\n \"authConfig\",\n);\nexport const socketUrlContext = createContext<string | undefined>(\"socketUrl\");\nexport const socketProxyContext = createContext<ProxyOptions | undefined>(\n \"socketProxy\",\n);\nexport const debugDisplayAudioContext = createContext<boolean | undefined>(\n \"debugDisplayAudio\",\n);\n\n@customElement(\"dictation-context-provider\")\nexport class DictationContext 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 private _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 private _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 @provide({ context: languagesContext })\n @property({\n converter: commaSeparatedConverter,\n type: Array,\n })\n languages?: string[];\n\n @provide({ context: devicesContext })\n @property({ attribute: false, type: Array })\n devices?: MediaDeviceInfo[];\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 @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 }\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 private _handleLanguageChanged = (e: Event) => {\n const event = e as CustomEvent;\n\n this.languages = event.detail.languages;\n this.dictationConfig = {\n ...this.dictationConfig,\n primaryLanguage: event.detail.selectedLanguage,\n };\n };\n\n private _handleDeviceChanged = (e: Event) => {\n const event = e as CustomEvent;\n\n this.devices = event.detail.devices;\n this.selectedDevice = event.detail.selectedDevice;\n };\n\n private _handleRecordingStateChanged = (e: Event) => {\n const event = e as CustomEvent;\n\n this.recordingState = event.detail.state;\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-context-provider\": DictationContext;\n }\n}\n"]}
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,26 @@
1
+ import type { ReactiveController, ReactiveControllerHost } from "lit";
2
+ interface DevicesControllerHost extends ReactiveControllerHost {
3
+ devices?: MediaDeviceInfo[];
4
+ selectedDevice?: MediaDeviceInfo;
5
+ dispatchEvent(event: CustomEvent): boolean;
6
+ requestUpdate(): void;
7
+ _devices?: MediaDeviceInfo[];
8
+ }
9
+ /**
10
+ * Controller that manages automatic device loading.
11
+ * Loads devices when they're not present and handles device changes.
12
+ * Reacts to updates and automatically loads devices when needed.
13
+ */
14
+ export declare class DevicesController implements ReactiveController {
15
+ #private;
16
+ host: DevicesControllerHost;
17
+ constructor(host: DevicesControllerHost);
18
+ initialize(): void;
19
+ hostDisconnected(): void;
20
+ hostUpdate(): void;
21
+ /**
22
+ * Clear the auto-loaded flag (when devices are set externally)
23
+ */
24
+ clearAutoLoadedFlag(): void;
25
+ }
26
+ export {};
@@ -0,0 +1,99 @@
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 _DevicesController_instances, _DevicesController_autoLoadedDevices, _DevicesController_loadingDevices, _DevicesController_deviceChangeHandler, _DevicesController_initialized, _DevicesController_setupDeviceChangeListener, _DevicesController_removeDeviceChangeListener, _DevicesController_loadDevices;
13
+ import { getAudioDevices } from "../utils/devices.js";
14
+ import { errorEvent, readyEvent, recordingDevicesChangedEvent, } from "../utils/events.js";
15
+ /**
16
+ * Controller that manages automatic device loading.
17
+ * Loads devices when they're not present and handles device changes.
18
+ * Reacts to updates and automatically loads devices when needed.
19
+ */
20
+ export class DevicesController {
21
+ constructor(host) {
22
+ _DevicesController_instances.add(this);
23
+ _DevicesController_autoLoadedDevices.set(this, false);
24
+ _DevicesController_loadingDevices.set(this, false);
25
+ _DevicesController_deviceChangeHandler.set(this, void 0);
26
+ _DevicesController_initialized.set(this, false);
27
+ this.host = host;
28
+ host.addController(this);
29
+ }
30
+ initialize() {
31
+ __classPrivateFieldSet(this, _DevicesController_initialized, true, "f");
32
+ if (this.host.devices === undefined) {
33
+ __classPrivateFieldGet(this, _DevicesController_instances, "m", _DevicesController_loadDevices).call(this);
34
+ __classPrivateFieldGet(this, _DevicesController_instances, "m", _DevicesController_setupDeviceChangeListener).call(this);
35
+ }
36
+ }
37
+ hostDisconnected() {
38
+ __classPrivateFieldGet(this, _DevicesController_instances, "m", _DevicesController_removeDeviceChangeListener).call(this);
39
+ }
40
+ hostUpdate() {
41
+ // Only react to updates after initialization
42
+ if (!__classPrivateFieldGet(this, _DevicesController_initialized, "f")) {
43
+ return;
44
+ }
45
+ // When devices are accessed but not present, load them
46
+ if (this.host.devices === undefined) {
47
+ __classPrivateFieldGet(this, _DevicesController_instances, "m", _DevicesController_loadDevices).call(this);
48
+ }
49
+ }
50
+ /**
51
+ * Clear the auto-loaded flag (when devices are set externally)
52
+ */
53
+ clearAutoLoadedFlag() {
54
+ __classPrivateFieldSet(this, _DevicesController_autoLoadedDevices, false, "f");
55
+ }
56
+ }
57
+ _DevicesController_autoLoadedDevices = new WeakMap(), _DevicesController_loadingDevices = new WeakMap(), _DevicesController_deviceChangeHandler = new WeakMap(), _DevicesController_initialized = new WeakMap(), _DevicesController_instances = new WeakSet(), _DevicesController_setupDeviceChangeListener = function _DevicesController_setupDeviceChangeListener() {
58
+ if (__classPrivateFieldGet(this, _DevicesController_deviceChangeHandler, "f")) {
59
+ return;
60
+ }
61
+ __classPrivateFieldSet(this, _DevicesController_deviceChangeHandler, () => {
62
+ if (__classPrivateFieldGet(this, _DevicesController_autoLoadedDevices, "f")) {
63
+ __classPrivateFieldGet(this, _DevicesController_instances, "m", _DevicesController_loadDevices).call(this);
64
+ }
65
+ }, "f");
66
+ navigator.mediaDevices.addEventListener("devicechange", __classPrivateFieldGet(this, _DevicesController_deviceChangeHandler, "f"));
67
+ }, _DevicesController_removeDeviceChangeListener = function _DevicesController_removeDeviceChangeListener() {
68
+ if (!__classPrivateFieldGet(this, _DevicesController_deviceChangeHandler, "f")) {
69
+ return;
70
+ }
71
+ navigator.mediaDevices.removeEventListener("devicechange", __classPrivateFieldGet(this, _DevicesController_deviceChangeHandler, "f"));
72
+ __classPrivateFieldSet(this, _DevicesController_deviceChangeHandler, undefined, "f");
73
+ }, _DevicesController_loadDevices = async function _DevicesController_loadDevices() {
74
+ if (__classPrivateFieldGet(this, _DevicesController_loadingDevices, "f")) {
75
+ return;
76
+ }
77
+ __classPrivateFieldSet(this, _DevicesController_loadingDevices, true, "f");
78
+ try {
79
+ const { devices, defaultDevice } = await getAudioDevices();
80
+ __classPrivateFieldSet(this, _DevicesController_autoLoadedDevices, true, "f");
81
+ this.host._devices = devices;
82
+ // Use selected device if it still exists, otherwise fall back to default
83
+ const previousDevice = this.host.selectedDevice;
84
+ const selectedDevice = (previousDevice &&
85
+ devices.find((d) => d.deviceId === previousDevice.deviceId)) ??
86
+ defaultDevice;
87
+ this.host.selectedDevice = selectedDevice;
88
+ this.host.requestUpdate();
89
+ this.host.dispatchEvent(recordingDevicesChangedEvent(devices, selectedDevice));
90
+ this.host.dispatchEvent(readyEvent());
91
+ }
92
+ catch (error) {
93
+ this.host.dispatchEvent(errorEvent(error));
94
+ }
95
+ finally {
96
+ __classPrivateFieldSet(this, _DevicesController_loadingDevices, false, "f");
97
+ }
98
+ };
99
+ //# sourceMappingURL=devices-controller.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"devices-controller.js","sourceRoot":"","sources":["../../src/controllers/devices-controller.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ReactiveController, ReactiveControllerHost } from \"lit\";\nimport { getAudioDevices } from \"../utils/devices.js\";\nimport {\n errorEvent,\n readyEvent,\n recordingDevicesChangedEvent,\n} from \"../utils/events.js\";\n\ninterface DevicesControllerHost extends ReactiveControllerHost {\n devices?: MediaDeviceInfo[];\n selectedDevice?: MediaDeviceInfo;\n dispatchEvent(event: CustomEvent): boolean;\n requestUpdate(): void;\n _devices?: MediaDeviceInfo[];\n}\n\n/**\n * Controller that manages automatic device loading.\n * Loads devices when they're not present and handles device changes.\n * Reacts to updates and automatically loads devices when needed.\n */\nexport class DevicesController implements ReactiveController {\n host: DevicesControllerHost;\n #autoLoadedDevices: boolean = false;\n #loadingDevices: boolean = false;\n #deviceChangeHandler?: () => void;\n #initialized: boolean = false;\n\n constructor(host: DevicesControllerHost) {\n this.host = host;\n host.addController(this);\n }\n\n initialize(): void {\n this.#initialized = true;\n if (this.host.devices === undefined) {\n this.#loadDevices();\n this.#setupDeviceChangeListener();\n }\n }\n\n hostDisconnected(): void {\n this.#removeDeviceChangeListener();\n }\n\n hostUpdate(): void {\n // Only react to updates after initialization\n if (!this.#initialized) {\n return;\n }\n\n // When devices are accessed but not present, load them\n if (this.host.devices === undefined) {\n this.#loadDevices();\n }\n }\n\n #setupDeviceChangeListener(): void {\n if (this.#deviceChangeHandler) {\n return;\n }\n\n this.#deviceChangeHandler = () => {\n if (this.#autoLoadedDevices) {\n this.#loadDevices();\n }\n };\n\n navigator.mediaDevices.addEventListener(\n \"devicechange\",\n this.#deviceChangeHandler,\n );\n }\n\n #removeDeviceChangeListener(): void {\n if (!this.#deviceChangeHandler) {\n return;\n }\n\n navigator.mediaDevices.removeEventListener(\n \"devicechange\",\n this.#deviceChangeHandler,\n );\n this.#deviceChangeHandler = undefined;\n }\n\n async #loadDevices(): Promise<void> {\n if (this.#loadingDevices) {\n return;\n }\n\n this.#loadingDevices = true;\n\n try {\n const { devices, defaultDevice } = await getAudioDevices();\n\n this.#autoLoadedDevices = true;\n this.host._devices = devices;\n\n // Use selected device if it still exists, otherwise fall back to default\n const previousDevice = this.host.selectedDevice;\n const selectedDevice =\n (previousDevice &&\n devices.find((d) => d.deviceId === previousDevice.deviceId)) ??\n defaultDevice;\n\n this.host.selectedDevice = selectedDevice;\n\n this.host.requestUpdate();\n this.host.dispatchEvent(\n recordingDevicesChangedEvent(devices, selectedDevice),\n );\n this.host.dispatchEvent(readyEvent());\n } catch (error) {\n this.host.dispatchEvent(errorEvent(error));\n } finally {\n this.#loadingDevices = false;\n }\n }\n\n /**\n * Clear the auto-loaded flag (when devices are set externally)\n */\n clearAutoLoadedFlag(): void {\n this.#autoLoadedDevices = false;\n }\n}\n"]}
@@ -0,0 +1,29 @@
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
+ _dictationConfig?: Corti.TranscribeConfig;
12
+ }
13
+ export type TranscribeMessage = Corti.TranscribeConfigStatusMessage | Corti.TranscribeUsageMessage | Corti.TranscribeEndedMessage | Corti.TranscribeErrorMessage | Corti.TranscribeTranscriptMessage | Corti.TranscribeCommandMessage | Corti.TranscribeFlushedMessage;
14
+ interface WebSocketCallbacks {
15
+ onMessage?: (message: TranscribeMessage) => void;
16
+ onError?: (error: Error) => void;
17
+ onClose?: (event: unknown) => void;
18
+ onNetworkActivity?: (direction: "sent" | "received", data: unknown) => void;
19
+ }
20
+ export declare class DictationController implements ReactiveController {
21
+ #private;
22
+ host: DictationControllerHost;
23
+ constructor(host: DictationControllerHost);
24
+ hostDisconnected(): void;
25
+ connect(mediaRecorder: MediaRecorder | null, dictationConfig?: Corti.TranscribeConfig, callbacks?: WebSocketCallbacks): Promise<boolean>;
26
+ disconnect(onClose?: (event: unknown) => void): Promise<void>;
27
+ cleanup(): void;
28
+ }
29
+ export {};