@corti/dictation-web 0.6.0 → 0.7.0-ambient
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/dist/bundle.js +1838 -1455
- package/dist/components/ambient-recording-button.d.ts +16 -0
- package/dist/components/ambient-recording-button.js +68 -0
- package/dist/components/ambient-recording-button.js.map +1 -0
- package/dist/components/corti-ambient.d.ts +27 -0
- package/dist/components/corti-ambient.js +97 -0
- package/dist/components/corti-ambient.js.map +1 -0
- package/dist/components/corti-dictation.d.ts +9 -109
- package/dist/components/corti-dictation.js +12 -187
- package/dist/components/corti-dictation.js.map +1 -1
- package/dist/components/corti-root.d.ts +121 -0
- package/dist/components/corti-root.js +196 -0
- package/dist/components/corti-root.js.map +1 -0
- package/dist/components/device-selector.js +1 -1
- package/dist/components/device-selector.js.map +1 -1
- package/dist/components/dictation-recording-button.d.ts +13 -0
- package/dist/components/dictation-recording-button.js +30 -0
- package/dist/components/dictation-recording-button.js.map +1 -0
- package/dist/components/keybinding-input.js +1 -1
- package/dist/components/keybinding-input.js.map +1 -1
- package/dist/components/keybinding-selector.js +1 -1
- package/dist/components/keybinding-selector.js.map +1 -1
- package/dist/components/language-selector.js +2 -1
- package/dist/components/language-selector.js.map +1 -1
- package/dist/components/{recording-button.d.ts → recording-button-base.d.ts} +7 -9
- package/dist/components/recording-button-base.js +321 -0
- package/dist/components/recording-button-base.js.map +1 -0
- package/dist/components/settings-menu.js +1 -1
- package/dist/components/settings-menu.js.map +1 -1
- package/dist/constants.d.ts +1 -0
- package/dist/constants.js +9 -0
- package/dist/constants.js.map +1 -1
- package/dist/contexts/ambient-context.d.ts +18 -0
- package/dist/contexts/ambient-context.js +48 -0
- package/dist/contexts/ambient-context.js.map +1 -0
- package/dist/contexts/dictation-context.d.ts +3 -92
- package/dist/contexts/dictation-context.js +5 -257
- package/dist/contexts/dictation-context.js.map +1 -1
- package/dist/contexts/mixins/auth-context.d.ts +32 -0
- package/dist/contexts/mixins/auth-context.js +116 -0
- package/dist/contexts/mixins/auth-context.js.map +1 -0
- package/dist/contexts/mixins/devices-context.d.ts +14 -0
- package/dist/contexts/mixins/devices-context.js +58 -0
- package/dist/contexts/mixins/devices-context.js.map +1 -0
- package/dist/contexts/mixins/keybindings-context.d.ts +13 -0
- package/dist/contexts/mixins/keybindings-context.js +62 -0
- package/dist/contexts/mixins/keybindings-context.js.map +1 -0
- package/dist/contexts/mixins/languages-context.d.ts +11 -0
- package/dist/contexts/mixins/languages-context.js +54 -0
- package/dist/contexts/mixins/languages-context.js.map +1 -0
- package/dist/contexts/mixins/proxy-context.d.ts +14 -0
- package/dist/contexts/mixins/proxy-context.js +24 -0
- package/dist/contexts/mixins/proxy-context.js.map +1 -0
- package/dist/contexts/mixins/recording-state-context.d.ts +13 -0
- package/dist/contexts/mixins/recording-state-context.js +30 -0
- package/dist/contexts/mixins/recording-state-context.js.map +1 -0
- package/dist/contexts/mixins/types.d.ts +5 -0
- package/dist/contexts/mixins/types.js +2 -0
- package/dist/contexts/mixins/types.js.map +1 -0
- package/dist/contexts/root-context.d.ts +8 -0
- package/dist/contexts/root-context.js +34 -0
- package/dist/contexts/root-context.js.map +1 -0
- package/dist/controllers/ambient-controller.d.ts +16 -0
- package/dist/controllers/ambient-controller.js +24 -0
- package/dist/controllers/ambient-controller.js.map +1 -0
- package/dist/controllers/dictation-controller.d.ts +8 -31
- package/dist/controllers/dictation-controller.js +17 -283
- package/dist/controllers/dictation-controller.js.map +1 -1
- package/dist/controllers/languages-controller.js +0 -4
- package/dist/controllers/languages-controller.js.map +1 -1
- package/dist/controllers/socket-controller.d.ts +51 -0
- package/dist/controllers/socket-controller.js +281 -0
- package/dist/controllers/socket-controller.js.map +1 -0
- package/dist/index.d.ts +5 -2
- package/dist/index.js +12 -2
- package/dist/index.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/dist/types.d.ts +3 -0
- package/dist/types.js.map +1 -1
- package/dist/utils/devices.d.ts +12 -8
- package/dist/utils/devices.js +39 -28
- package/dist/utils/devices.js.map +1 -1
- package/dist/utils/events.d.ts +5 -3
- package/dist/utils/events.js +7 -0
- package/dist/utils/events.js.map +1 -1
- package/dist/utils/keybinding.d.ts +2 -1
- package/dist/utils/keybinding.js +12 -6
- package/dist/utils/keybinding.js.map +1 -1
- package/package.json +1 -1
- package/dist/components/recording-button.js +0 -331
- package/dist/components/recording-button.js.map +0 -1
|
@@ -0,0 +1,281 @@
|
|
|
1
|
+
var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
|
|
2
|
+
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
|
|
3
|
+
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");
|
|
4
|
+
return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
|
|
5
|
+
};
|
|
6
|
+
var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {
|
|
7
|
+
if (kind === "m") throw new TypeError("Private method is not writable");
|
|
8
|
+
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
|
|
9
|
+
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");
|
|
10
|
+
return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
|
|
11
|
+
};
|
|
12
|
+
var _SocketController_instances, _SocketController_webSocket, _SocketController_cortiClient, _SocketController_connectionGeneration, _SocketController_socketReady, _SocketController_closeTimeout, _SocketController_outboundQueue, _SocketController_callbacks, _SocketController_lastConfig, _SocketController_lastSocketUrl, _SocketController_lastSocketProxy, _SocketController_connectingPromise, _SocketController_isConnecting, _SocketController_openViaProxy, _SocketController_openViaAuth, _SocketController_doConnect, _SocketController_isSocketOpen, _SocketController_configHasChanged, _SocketController_drain, _SocketController_setupWebSocketHandlers;
|
|
13
|
+
import { CortiClient } from "@corti/sdk";
|
|
14
|
+
import { errorEvent } from "../utils/events.js";
|
|
15
|
+
export class SocketController {
|
|
16
|
+
constructor(host) {
|
|
17
|
+
_SocketController_instances.add(this);
|
|
18
|
+
_SocketController_webSocket.set(this, null);
|
|
19
|
+
_SocketController_cortiClient.set(this, null);
|
|
20
|
+
_SocketController_connectionGeneration.set(this, 0);
|
|
21
|
+
_SocketController_socketReady.set(this, false);
|
|
22
|
+
_SocketController_closeTimeout.set(this, void 0);
|
|
23
|
+
_SocketController_outboundQueue.set(this, []);
|
|
24
|
+
_SocketController_callbacks.set(this, void 0);
|
|
25
|
+
_SocketController_lastConfig.set(this, null);
|
|
26
|
+
_SocketController_lastSocketUrl.set(this, void 0);
|
|
27
|
+
_SocketController_lastSocketProxy.set(this, void 0);
|
|
28
|
+
_SocketController_connectingPromise.set(this, null);
|
|
29
|
+
_SocketController_isConnecting.set(this, false);
|
|
30
|
+
this.mediaRecorderHandler = (data) => {
|
|
31
|
+
if (__classPrivateFieldGet(this, _SocketController_socketReady, "f") && __classPrivateFieldGet(this, _SocketController_instances, "m", _SocketController_isSocketOpen).call(this)) {
|
|
32
|
+
__classPrivateFieldGet(this, _SocketController_webSocket, "f")?.send(data);
|
|
33
|
+
__classPrivateFieldGet(this, _SocketController_callbacks, "f")?.onNetworkActivity?.("sent", {
|
|
34
|
+
size: data.size,
|
|
35
|
+
type: "audio",
|
|
36
|
+
});
|
|
37
|
+
return;
|
|
38
|
+
}
|
|
39
|
+
__classPrivateFieldGet(this, _SocketController_outboundQueue, "f").push(data);
|
|
40
|
+
};
|
|
41
|
+
this.host = host;
|
|
42
|
+
host.addController(this);
|
|
43
|
+
}
|
|
44
|
+
async connect(config, callbacks) {
|
|
45
|
+
// If a connection attempt is already in progress with the same config, reuse it
|
|
46
|
+
// to avoid opening multiple sockets when connect() is called concurrently.
|
|
47
|
+
if (__classPrivateFieldGet(this, _SocketController_connectingPromise, "f") && !__classPrivateFieldGet(this, _SocketController_instances, "m", _SocketController_configHasChanged).call(this, config)) {
|
|
48
|
+
return __classPrivateFieldGet(this, _SocketController_connectingPromise, "f");
|
|
49
|
+
}
|
|
50
|
+
// #isConnecting must be set synchronously before #doConnect runs, because
|
|
51
|
+
// #doConnect calls cleanup() which closes the old socket, firing its "close"
|
|
52
|
+
// event synchronously. Handlers that check isConnecting() need to see true
|
|
53
|
+
// at that point — before #connectingPromise is even assigned.
|
|
54
|
+
__classPrivateFieldSet(this, _SocketController_isConnecting, true, "f");
|
|
55
|
+
__classPrivateFieldSet(this, _SocketController_connectingPromise, __classPrivateFieldGet(this, _SocketController_instances, "m", _SocketController_doConnect).call(this, config, callbacks).finally(() => {
|
|
56
|
+
__classPrivateFieldSet(this, _SocketController_isConnecting, false, "f");
|
|
57
|
+
__classPrivateFieldSet(this, _SocketController_connectingPromise, null, "f");
|
|
58
|
+
}), "f");
|
|
59
|
+
return __classPrivateFieldGet(this, _SocketController_connectingPromise, "f");
|
|
60
|
+
}
|
|
61
|
+
hostDisconnected() {
|
|
62
|
+
this.cleanup();
|
|
63
|
+
}
|
|
64
|
+
isConnectionOpen() {
|
|
65
|
+
return (__classPrivateFieldGet(this, _SocketController_webSocket, "f") !== null &&
|
|
66
|
+
(__classPrivateFieldGet(this, _SocketController_webSocket, "f").readyState === WebSocket.OPEN ||
|
|
67
|
+
__classPrivateFieldGet(this, _SocketController_webSocket, "f").readyState === WebSocket.CONNECTING));
|
|
68
|
+
}
|
|
69
|
+
isConnecting() {
|
|
70
|
+
return __classPrivateFieldGet(this, _SocketController_isConnecting, "f");
|
|
71
|
+
}
|
|
72
|
+
async waitForConnection() {
|
|
73
|
+
await __classPrivateFieldGet(this, _SocketController_connectingPromise, "f");
|
|
74
|
+
}
|
|
75
|
+
async pause() {
|
|
76
|
+
if (__classPrivateFieldGet(this, _SocketController_socketReady, "f") && __classPrivateFieldGet(this, _SocketController_instances, "m", _SocketController_isSocketOpen).call(this)) {
|
|
77
|
+
__classPrivateFieldGet(this, _SocketController_webSocket, "f")?.send(JSON.stringify({ type: "flush" }));
|
|
78
|
+
__classPrivateFieldGet(this, _SocketController_callbacks, "f")?.onNetworkActivity?.("sent", { type: "flush" });
|
|
79
|
+
return;
|
|
80
|
+
}
|
|
81
|
+
__classPrivateFieldGet(this, _SocketController_outboundQueue, "f").push({ type: "flush" });
|
|
82
|
+
}
|
|
83
|
+
async stopRecording() {
|
|
84
|
+
await this.pause();
|
|
85
|
+
}
|
|
86
|
+
async closeConnection(onClose) {
|
|
87
|
+
await new Promise((resolve, reject) => {
|
|
88
|
+
const oldSocket = __classPrivateFieldGet(this, _SocketController_webSocket, "f");
|
|
89
|
+
__classPrivateFieldSet(this, _SocketController_webSocket, null, "f");
|
|
90
|
+
if (!oldSocket ||
|
|
91
|
+
(oldSocket.readyState !== WebSocket.OPEN &&
|
|
92
|
+
oldSocket.readyState !== WebSocket.CONNECTING)) {
|
|
93
|
+
__classPrivateFieldSet(this, _SocketController_socketReady, false, "f");
|
|
94
|
+
resolve();
|
|
95
|
+
return;
|
|
96
|
+
}
|
|
97
|
+
oldSocket.on("close", (event) => {
|
|
98
|
+
if (__classPrivateFieldGet(this, _SocketController_closeTimeout, "f")) {
|
|
99
|
+
clearTimeout(__classPrivateFieldGet(this, _SocketController_closeTimeout, "f"));
|
|
100
|
+
__classPrivateFieldSet(this, _SocketController_closeTimeout, undefined, "f");
|
|
101
|
+
}
|
|
102
|
+
if (onClose) {
|
|
103
|
+
onClose(event);
|
|
104
|
+
}
|
|
105
|
+
else if (__classPrivateFieldGet(this, _SocketController_callbacks, "f")?.onClose) {
|
|
106
|
+
__classPrivateFieldGet(this, _SocketController_callbacks, "f").onClose(event);
|
|
107
|
+
}
|
|
108
|
+
resolve();
|
|
109
|
+
});
|
|
110
|
+
const wasReady = __classPrivateFieldGet(this, _SocketController_socketReady, "f");
|
|
111
|
+
__classPrivateFieldSet(this, _SocketController_socketReady, false, "f");
|
|
112
|
+
oldSocket.on("message", (message) => {
|
|
113
|
+
__classPrivateFieldGet(this, _SocketController_callbacks, "f")?.onNetworkActivity?.("received", message);
|
|
114
|
+
if (__classPrivateFieldGet(this, _SocketController_callbacks, "f")?.onMessage) {
|
|
115
|
+
__classPrivateFieldGet(this, _SocketController_callbacks, "f").onMessage(message);
|
|
116
|
+
}
|
|
117
|
+
// closeConnection() may be called before CONFIG_ACCEPTED arrives (e.g.
|
|
118
|
+
// openConnection() followed immediately by closeConnection()). We can't
|
|
119
|
+
// use the outbound queue here because #webSocket is already null, so we
|
|
120
|
+
// send "end" directly on oldSocket as soon as config is accepted.
|
|
121
|
+
if (!wasReady && message.type === "CONFIG_ACCEPTED") {
|
|
122
|
+
oldSocket.sendEnd({ type: "end" });
|
|
123
|
+
__classPrivateFieldGet(this, _SocketController_callbacks, "f")?.onNetworkActivity?.("sent", { type: "end" });
|
|
124
|
+
return;
|
|
125
|
+
}
|
|
126
|
+
if (message.type === "ended" || message.type === "ENDED") {
|
|
127
|
+
if (__classPrivateFieldGet(this, _SocketController_closeTimeout, "f")) {
|
|
128
|
+
clearTimeout(__classPrivateFieldGet(this, _SocketController_closeTimeout, "f"));
|
|
129
|
+
__classPrivateFieldSet(this, _SocketController_closeTimeout, undefined, "f");
|
|
130
|
+
}
|
|
131
|
+
resolve();
|
|
132
|
+
return;
|
|
133
|
+
}
|
|
134
|
+
});
|
|
135
|
+
if (wasReady) {
|
|
136
|
+
oldSocket.sendEnd({ type: "end" });
|
|
137
|
+
__classPrivateFieldGet(this, _SocketController_callbacks, "f")?.onNetworkActivity?.("sent", { type: "end" });
|
|
138
|
+
}
|
|
139
|
+
__classPrivateFieldSet(this, _SocketController_closeTimeout, window.setTimeout(() => {
|
|
140
|
+
reject(new Error("Connection close timeout"));
|
|
141
|
+
if (oldSocket?.readyState === WebSocket.OPEN) {
|
|
142
|
+
oldSocket.close();
|
|
143
|
+
}
|
|
144
|
+
}, 10000), "f");
|
|
145
|
+
});
|
|
146
|
+
}
|
|
147
|
+
cleanup() {
|
|
148
|
+
var _a;
|
|
149
|
+
__classPrivateFieldSet(this, _SocketController_connectionGeneration, (_a = __classPrivateFieldGet(this, _SocketController_connectionGeneration, "f"), _a++, _a), "f");
|
|
150
|
+
__classPrivateFieldSet(this, _SocketController_socketReady, false, "f");
|
|
151
|
+
if (__classPrivateFieldGet(this, _SocketController_closeTimeout, "f")) {
|
|
152
|
+
clearTimeout(__classPrivateFieldGet(this, _SocketController_closeTimeout, "f"));
|
|
153
|
+
__classPrivateFieldSet(this, _SocketController_closeTimeout, undefined, "f");
|
|
154
|
+
}
|
|
155
|
+
if (this.isConnectionOpen()) {
|
|
156
|
+
__classPrivateFieldGet(this, _SocketController_webSocket, "f")?.close();
|
|
157
|
+
}
|
|
158
|
+
__classPrivateFieldSet(this, _SocketController_webSocket, null, "f");
|
|
159
|
+
__classPrivateFieldSet(this, _SocketController_cortiClient, null, "f");
|
|
160
|
+
__classPrivateFieldSet(this, _SocketController_lastConfig, null, "f");
|
|
161
|
+
__classPrivateFieldSet(this, _SocketController_lastSocketUrl, undefined, "f");
|
|
162
|
+
__classPrivateFieldSet(this, _SocketController_lastSocketProxy, undefined, "f");
|
|
163
|
+
if (__classPrivateFieldGet(this, _SocketController_outboundQueue, "f").length > 0) {
|
|
164
|
+
this.host.dispatchEvent(errorEvent(`${__classPrivateFieldGet(this, _SocketController_outboundQueue, "f").length} unsent message(s) were discarded because the configuration changed before the connection was closed`));
|
|
165
|
+
}
|
|
166
|
+
__classPrivateFieldSet(this, _SocketController_outboundQueue, [], "f");
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
_SocketController_webSocket = new WeakMap(), _SocketController_cortiClient = new WeakMap(), _SocketController_connectionGeneration = new WeakMap(), _SocketController_socketReady = new WeakMap(), _SocketController_closeTimeout = new WeakMap(), _SocketController_outboundQueue = new WeakMap(), _SocketController_callbacks = new WeakMap(), _SocketController_lastConfig = new WeakMap(), _SocketController_lastSocketUrl = new WeakMap(), _SocketController_lastSocketProxy = new WeakMap(), _SocketController_connectingPromise = new WeakMap(), _SocketController_isConnecting = new WeakMap(), _SocketController_instances = new WeakSet(), _SocketController_openViaProxy = async function _SocketController_openViaProxy(config) {
|
|
170
|
+
const proxyOptions = this.host._socketProxy || {
|
|
171
|
+
url: this.host._socketUrl || "",
|
|
172
|
+
};
|
|
173
|
+
if (!proxyOptions.url) {
|
|
174
|
+
throw new Error("Proxy URL is required when using proxy client");
|
|
175
|
+
}
|
|
176
|
+
return this._connectThroughProxy(config, proxyOptions);
|
|
177
|
+
}, _SocketController_openViaAuth = async function _SocketController_openViaAuth(config) {
|
|
178
|
+
if (!this.host._authConfig && !this.host._accessToken) {
|
|
179
|
+
throw new Error("Auth configuration or access token is required to connect");
|
|
180
|
+
}
|
|
181
|
+
const auth = this.host._authConfig || {
|
|
182
|
+
accessToken: this.host._accessToken || "",
|
|
183
|
+
refreshAccessToken: () => ({
|
|
184
|
+
accessToken: this.host._accessToken || "",
|
|
185
|
+
}),
|
|
186
|
+
};
|
|
187
|
+
__classPrivateFieldSet(this, _SocketController_cortiClient, new CortiClient({
|
|
188
|
+
auth,
|
|
189
|
+
environment: this.host._region,
|
|
190
|
+
tenantName: this.host._tenantName,
|
|
191
|
+
}), "f");
|
|
192
|
+
return this._connectThroughAuth(__classPrivateFieldGet(this, _SocketController_cortiClient, "f"), config);
|
|
193
|
+
}, _SocketController_doConnect = async function _SocketController_doConnect(config, callbacks) {
|
|
194
|
+
const newConnection = __classPrivateFieldGet(this, _SocketController_instances, "m", _SocketController_configHasChanged).call(this, config) || !this.isConnectionOpen();
|
|
195
|
+
if (newConnection) {
|
|
196
|
+
this.cleanup();
|
|
197
|
+
__classPrivateFieldSet(this, _SocketController_lastConfig, config, "f");
|
|
198
|
+
__classPrivateFieldSet(this, _SocketController_lastSocketUrl, this.host._socketUrl, "f");
|
|
199
|
+
__classPrivateFieldSet(this, _SocketController_lastSocketProxy, this.host._socketProxy, "f");
|
|
200
|
+
const generation = __classPrivateFieldGet(this, _SocketController_connectionGeneration, "f");
|
|
201
|
+
const socket = this.host._socketUrl || this.host._socketProxy
|
|
202
|
+
? await __classPrivateFieldGet(this, _SocketController_instances, "m", _SocketController_openViaProxy).call(this, config)
|
|
203
|
+
: await __classPrivateFieldGet(this, _SocketController_instances, "m", _SocketController_openViaAuth).call(this, config);
|
|
204
|
+
// If cleanup() was called while we were awaiting (e.g. config changed),
|
|
205
|
+
// the generation counter will have advanced — discard this stale socket.
|
|
206
|
+
if (__classPrivateFieldGet(this, _SocketController_connectionGeneration, "f") !== generation) {
|
|
207
|
+
socket.close();
|
|
208
|
+
return "superseded";
|
|
209
|
+
}
|
|
210
|
+
__classPrivateFieldSet(this, _SocketController_webSocket, socket, "f");
|
|
211
|
+
__classPrivateFieldGet(this, _SocketController_callbacks, "f")?.onNetworkActivity?.("sent", {
|
|
212
|
+
configuration: config,
|
|
213
|
+
type: "config",
|
|
214
|
+
});
|
|
215
|
+
}
|
|
216
|
+
__classPrivateFieldSet(this, _SocketController_callbacks, callbacks, "f");
|
|
217
|
+
__classPrivateFieldGet(this, _SocketController_instances, "m", _SocketController_setupWebSocketHandlers).call(this, callbacks);
|
|
218
|
+
if (!newConnection && this.isConnectionOpen()) {
|
|
219
|
+
__classPrivateFieldSet(this, _SocketController_socketReady, true, "f");
|
|
220
|
+
__classPrivateFieldGet(this, _SocketController_instances, "m", _SocketController_drain).call(this);
|
|
221
|
+
}
|
|
222
|
+
return newConnection;
|
|
223
|
+
}, _SocketController_isSocketOpen = function _SocketController_isSocketOpen() {
|
|
224
|
+
return (__classPrivateFieldGet(this, _SocketController_webSocket, "f") !== null && __classPrivateFieldGet(this, _SocketController_webSocket, "f").readyState === WebSocket.OPEN);
|
|
225
|
+
}, _SocketController_configHasChanged = function _SocketController_configHasChanged(nextConfig) {
|
|
226
|
+
return (JSON.stringify(nextConfig) !== JSON.stringify(__classPrivateFieldGet(this, _SocketController_lastConfig, "f")) ||
|
|
227
|
+
this.host._socketUrl !== __classPrivateFieldGet(this, _SocketController_lastSocketUrl, "f") ||
|
|
228
|
+
JSON.stringify(this.host._socketProxy) !==
|
|
229
|
+
JSON.stringify(__classPrivateFieldGet(this, _SocketController_lastSocketProxy, "f")));
|
|
230
|
+
}, _SocketController_drain = function _SocketController_drain() {
|
|
231
|
+
if (!__classPrivateFieldGet(this, _SocketController_socketReady, "f") ||
|
|
232
|
+
!__classPrivateFieldGet(this, _SocketController_instances, "m", _SocketController_isSocketOpen).call(this) ||
|
|
233
|
+
__classPrivateFieldGet(this, _SocketController_outboundQueue, "f").length === 0) {
|
|
234
|
+
return;
|
|
235
|
+
}
|
|
236
|
+
while (__classPrivateFieldGet(this, _SocketController_outboundQueue, "f").length > 0 && __classPrivateFieldGet(this, _SocketController_instances, "m", _SocketController_isSocketOpen).call(this)) {
|
|
237
|
+
const item = __classPrivateFieldGet(this, _SocketController_outboundQueue, "f").shift();
|
|
238
|
+
if (item === undefined) {
|
|
239
|
+
break;
|
|
240
|
+
}
|
|
241
|
+
if (item instanceof Blob) {
|
|
242
|
+
__classPrivateFieldGet(this, _SocketController_webSocket, "f").send(item);
|
|
243
|
+
__classPrivateFieldGet(this, _SocketController_callbacks, "f")?.onNetworkActivity?.("sent", {
|
|
244
|
+
size: item.size,
|
|
245
|
+
type: "audio",
|
|
246
|
+
});
|
|
247
|
+
continue;
|
|
248
|
+
}
|
|
249
|
+
__classPrivateFieldGet(this, _SocketController_webSocket, "f").send(JSON.stringify(item));
|
|
250
|
+
__classPrivateFieldGet(this, _SocketController_callbacks, "f")?.onNetworkActivity?.("sent", {
|
|
251
|
+
type: item.type,
|
|
252
|
+
});
|
|
253
|
+
}
|
|
254
|
+
}, _SocketController_setupWebSocketHandlers = function _SocketController_setupWebSocketHandlers(callbacks) {
|
|
255
|
+
if (!__classPrivateFieldGet(this, _SocketController_webSocket, "f")) {
|
|
256
|
+
throw new Error("WebSocket not initialized");
|
|
257
|
+
}
|
|
258
|
+
__classPrivateFieldGet(this, _SocketController_webSocket, "f").on("message", (message) => {
|
|
259
|
+
if (message.type === "CONFIG_ACCEPTED") {
|
|
260
|
+
__classPrivateFieldSet(this, _SocketController_socketReady, true, "f");
|
|
261
|
+
__classPrivateFieldGet(this, _SocketController_instances, "m", _SocketController_drain).call(this);
|
|
262
|
+
}
|
|
263
|
+
callbacks.onNetworkActivity?.("received", message);
|
|
264
|
+
if (callbacks.onMessage) {
|
|
265
|
+
callbacks.onMessage(message);
|
|
266
|
+
}
|
|
267
|
+
});
|
|
268
|
+
__classPrivateFieldGet(this, _SocketController_webSocket, "f").on("error", (event) => {
|
|
269
|
+
__classPrivateFieldSet(this, _SocketController_socketReady, false, "f");
|
|
270
|
+
if (callbacks.onError) {
|
|
271
|
+
callbacks.onError(event);
|
|
272
|
+
}
|
|
273
|
+
});
|
|
274
|
+
__classPrivateFieldGet(this, _SocketController_webSocket, "f").on("close", (event) => {
|
|
275
|
+
__classPrivateFieldSet(this, _SocketController_socketReady, false, "f");
|
|
276
|
+
if (callbacks.onClose) {
|
|
277
|
+
callbacks.onClose(event);
|
|
278
|
+
}
|
|
279
|
+
});
|
|
280
|
+
};
|
|
281
|
+
//# sourceMappingURL=socket-controller.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"socket-controller.js","sourceRoot":"","sources":["../../src/controllers/socket-controller.ts"],"names":[],"mappings":"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","sourcesContent":["import { type CortiAuth, CortiClient } from \"@corti/sdk\";\nimport type { ReactiveController, ReactiveControllerHost } from \"lit\";\nimport type { ProxyOptions } from \"../types.js\";\nimport { errorEvent } from \"../utils/events.js\";\n\nexport interface SocketControllerHost extends ReactiveControllerHost {\n dispatchEvent: (event: Event) => void;\n _accessToken?: string;\n _authConfig?: CortiAuth.AuthTokenDerivable;\n _region?: string;\n _tenantName?: string;\n _socketUrl?: string;\n _socketProxy?: ProxyOptions;\n}\n\nexport type SocketControllerWebSocket = {\n readyState: number;\n close(): void;\n on(event: \"message\", handler: (message: { type: string }) => void): void;\n on(event: \"error\", handler: (error: Error) => void): void;\n on(event: \"close\", handler: (event: unknown) => void): void;\n send(data: Blob | ArrayBufferLike | string): void;\n sendEnd(message: { type: \"end\" }): void;\n};\n\nexport type SocketControllerCallbacks<TMessage = unknown> = {\n onMessage?: (message: TMessage) => void;\n onError?: (error: Error) => void;\n onClose?: (event: unknown) => void;\n onNetworkActivity?: (direction: \"sent\" | \"received\", data: unknown) => void;\n};\n\nexport type SocketControllerOutboundItem = Blob | { type: string };\n\nexport abstract class SocketController<\n TOutbound extends SocketControllerOutboundItem,\n TMessage = unknown,\n TConfig = unknown,\n TSocket extends SocketControllerWebSocket = SocketControllerWebSocket,\n> implements ReactiveController\n{\n readonly host: SocketControllerHost;\n\n #webSocket: TSocket | null = null;\n #cortiClient: CortiClient | null = null;\n #connectionGeneration = 0;\n #socketReady = false;\n #closeTimeout?: number;\n #outboundQueue: TOutbound[] = [];\n #callbacks?: SocketControllerCallbacks<TMessage>;\n #lastConfig: TConfig | null = null;\n #lastSocketUrl?: string;\n #lastSocketProxy?: ProxyOptions;\n #connectingPromise: Promise<boolean | \"superseded\"> | null = null;\n #isConnecting = false;\n\n protected abstract _connectThroughProxy(\n config: TConfig,\n proxy: ProxyOptions,\n ): Promise<TSocket>;\n protected abstract _connectThroughAuth(\n client: CortiClient,\n config: TConfig,\n ): Promise<TSocket>;\n\n constructor(host: SocketControllerHost) {\n this.host = host;\n host.addController(this);\n }\n\n async #openViaProxy(config: TConfig): Promise<TSocket> {\n const proxyOptions = this.host._socketProxy || {\n url: this.host._socketUrl || \"\",\n };\n\n if (!proxyOptions.url) {\n throw new Error(\"Proxy URL is required when using proxy client\");\n }\n\n return this._connectThroughProxy(config, proxyOptions);\n }\n\n async #openViaAuth(config: TConfig): Promise<TSocket> {\n if (!this.host._authConfig && !this.host._accessToken) {\n throw new Error(\n \"Auth configuration or access token is required to connect\",\n );\n }\n\n const auth: CortiAuth.AuthTokenDerivable = this.host._authConfig || {\n accessToken: this.host._accessToken || \"\",\n refreshAccessToken: () => ({\n accessToken: this.host._accessToken || \"\",\n }),\n };\n\n this.#cortiClient = new CortiClient({\n auth,\n environment: this.host._region,\n tenantName: this.host._tenantName,\n });\n\n return this._connectThroughAuth(this.#cortiClient, config);\n }\n\n async connect(\n config: TConfig,\n callbacks: SocketControllerCallbacks<TMessage>,\n ): Promise<boolean | \"superseded\"> {\n // If a connection attempt is already in progress with the same config, reuse it\n // to avoid opening multiple sockets when connect() is called concurrently.\n if (this.#connectingPromise && !this.#configHasChanged(config)) {\n return this.#connectingPromise;\n }\n\n // #isConnecting must be set synchronously before #doConnect runs, because\n // #doConnect calls cleanup() which closes the old socket, firing its \"close\"\n // event synchronously. Handlers that check isConnecting() need to see true\n // at that point — before #connectingPromise is even assigned.\n this.#isConnecting = true;\n this.#connectingPromise = this.#doConnect(config, callbacks).finally(() => {\n this.#isConnecting = false;\n this.#connectingPromise = null;\n });\n\n return this.#connectingPromise;\n }\n\n async #doConnect(\n config: TConfig,\n callbacks: SocketControllerCallbacks<TMessage>,\n ): Promise<boolean | \"superseded\"> {\n const newConnection =\n this.#configHasChanged(config) || !this.isConnectionOpen();\n\n if (newConnection) {\n this.cleanup();\n\n this.#lastConfig = config;\n this.#lastSocketUrl = this.host._socketUrl;\n this.#lastSocketProxy = this.host._socketProxy;\n\n const generation = this.#connectionGeneration;\n\n const socket =\n this.host._socketUrl || this.host._socketProxy\n ? await this.#openViaProxy(config)\n : await this.#openViaAuth(config);\n\n // If cleanup() was called while we were awaiting (e.g. config changed),\n // the generation counter will have advanced — discard this stale socket.\n if (this.#connectionGeneration !== generation) {\n socket.close();\n return \"superseded\";\n }\n\n this.#webSocket = socket;\n\n this.#callbacks?.onNetworkActivity?.(\"sent\", {\n configuration: config,\n type: \"config\",\n });\n }\n\n this.#callbacks = callbacks;\n this.#setupWebSocketHandlers(callbacks);\n\n if (!newConnection && this.isConnectionOpen()) {\n this.#socketReady = true;\n this.#drain();\n }\n\n return newConnection;\n }\n\n hostDisconnected(): void {\n this.cleanup();\n }\n\n isConnectionOpen(): boolean {\n return (\n this.#webSocket !== null &&\n (this.#webSocket.readyState === WebSocket.OPEN ||\n this.#webSocket.readyState === WebSocket.CONNECTING)\n );\n }\n\n isConnecting(): boolean {\n return this.#isConnecting;\n }\n\n async waitForConnection(): Promise<void> {\n await this.#connectingPromise;\n }\n\n #isSocketOpen(): boolean {\n return (\n this.#webSocket !== null && this.#webSocket.readyState === WebSocket.OPEN\n );\n }\n\n #configHasChanged(nextConfig: TConfig): boolean {\n return (\n JSON.stringify(nextConfig) !== JSON.stringify(this.#lastConfig) ||\n this.host._socketUrl !== this.#lastSocketUrl ||\n JSON.stringify(this.host._socketProxy) !==\n JSON.stringify(this.#lastSocketProxy)\n );\n }\n\n #drain(): void {\n if (\n !this.#socketReady ||\n !this.#isSocketOpen() ||\n this.#outboundQueue.length === 0\n ) {\n return;\n }\n\n while (this.#outboundQueue.length > 0 && this.#isSocketOpen()) {\n const item = this.#outboundQueue.shift();\n\n if (item === undefined) {\n break;\n }\n\n if (item instanceof Blob) {\n this.#webSocket!.send(item);\n this.#callbacks?.onNetworkActivity?.(\"sent\", {\n size: item.size,\n type: \"audio\",\n });\n continue;\n }\n\n this.#webSocket!.send(JSON.stringify(item));\n this.#callbacks?.onNetworkActivity?.(\"sent\", {\n type: item.type,\n });\n }\n }\n\n mediaRecorderHandler = (data: Blob): void => {\n if (this.#socketReady && this.#isSocketOpen()) {\n this.#webSocket?.send(data);\n this.#callbacks?.onNetworkActivity?.(\"sent\", {\n size: data.size,\n type: \"audio\",\n });\n return;\n }\n\n this.#outboundQueue.push(data as TOutbound);\n };\n\n async pause(): Promise<void> {\n if (this.#socketReady && this.#isSocketOpen()) {\n this.#webSocket?.send(JSON.stringify({ type: \"flush\" }));\n this.#callbacks?.onNetworkActivity?.(\"sent\", { type: \"flush\" });\n return;\n }\n\n this.#outboundQueue.push({ type: \"flush\" } as TOutbound);\n }\n\n async stopRecording(): Promise<void> {\n await this.pause();\n }\n\n async closeConnection(onClose?: (event: unknown) => void): Promise<void> {\n await new Promise<void>((resolve, reject) => {\n const oldSocket = this.#webSocket;\n this.#webSocket = null;\n\n if (\n !oldSocket ||\n (oldSocket.readyState !== WebSocket.OPEN &&\n oldSocket.readyState !== WebSocket.CONNECTING)\n ) {\n this.#socketReady = false;\n resolve();\n return;\n }\n\n oldSocket.on(\"close\", (event) => {\n if (this.#closeTimeout) {\n clearTimeout(this.#closeTimeout);\n this.#closeTimeout = undefined;\n }\n\n if (onClose) {\n onClose(event);\n } else if (this.#callbacks?.onClose) {\n this.#callbacks.onClose(event);\n }\n\n resolve();\n });\n\n const wasReady = this.#socketReady;\n this.#socketReady = false;\n\n oldSocket.on(\"message\", (message) => {\n this.#callbacks?.onNetworkActivity?.(\"received\", message);\n\n if (this.#callbacks?.onMessage) {\n this.#callbacks.onMessage(message as TMessage);\n }\n\n // closeConnection() may be called before CONFIG_ACCEPTED arrives (e.g.\n // openConnection() followed immediately by closeConnection()). We can't\n // use the outbound queue here because #webSocket is already null, so we\n // send \"end\" directly on oldSocket as soon as config is accepted.\n if (!wasReady && message.type === \"CONFIG_ACCEPTED\") {\n oldSocket.sendEnd({ type: \"end\" });\n this.#callbacks?.onNetworkActivity?.(\"sent\", { type: \"end\" });\n return;\n }\n\n if (message.type === \"ended\" || message.type === \"ENDED\") {\n if (this.#closeTimeout) {\n clearTimeout(this.#closeTimeout);\n this.#closeTimeout = undefined;\n }\n\n resolve();\n return;\n }\n });\n\n if (wasReady) {\n oldSocket.sendEnd({ type: \"end\" });\n this.#callbacks?.onNetworkActivity?.(\"sent\", { type: \"end\" });\n }\n\n this.#closeTimeout = window.setTimeout(() => {\n reject(new Error(\"Connection close timeout\"));\n\n if (oldSocket?.readyState === WebSocket.OPEN) {\n oldSocket.close();\n }\n }, 10000);\n });\n }\n\n cleanup(): void {\n this.#connectionGeneration++;\n this.#socketReady = false;\n\n if (this.#closeTimeout) {\n clearTimeout(this.#closeTimeout);\n this.#closeTimeout = undefined;\n }\n\n if (this.isConnectionOpen()) {\n this.#webSocket?.close();\n }\n\n this.#webSocket = null;\n this.#cortiClient = null;\n this.#lastConfig = null;\n this.#lastSocketUrl = undefined;\n this.#lastSocketProxy = undefined;\n\n if (this.#outboundQueue.length > 0) {\n this.host.dispatchEvent(\n errorEvent(\n `${this.#outboundQueue.length} unsent message(s) were discarded because the configuration changed before the connection was closed`,\n ),\n );\n }\n\n this.#outboundQueue = [];\n }\n\n #setupWebSocketHandlers(\n callbacks: SocketControllerCallbacks<TMessage>,\n ): void {\n if (!this.#webSocket) {\n throw new Error(\"WebSocket not initialized\");\n }\n\n this.#webSocket.on(\"message\", (message) => {\n if (message.type === \"CONFIG_ACCEPTED\") {\n this.#socketReady = true;\n this.#drain();\n }\n\n callbacks.onNetworkActivity?.(\"received\", message);\n\n if (callbacks.onMessage) {\n callbacks.onMessage(message as TMessage);\n }\n });\n\n this.#webSocket.on(\"error\", (event: Error) => {\n this.#socketReady = false;\n if (callbacks.onError) {\n callbacks.onError(event);\n }\n });\n\n this.#webSocket.on(\"close\", (event: unknown) => {\n this.#socketReady = false;\n if (callbacks.onClose) {\n callbacks.onClose(event);\n }\n });\n }\n}\n"]}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,11 +1,14 @@
|
|
|
1
1
|
import { CortiDictation } from "./components/corti-dictation.js";
|
|
2
|
+
export { AmbientRecordingButton } from "./components/ambient-recording-button.js";
|
|
3
|
+
export { CortiAmbient } from "./components/corti-ambient.js";
|
|
2
4
|
export { CortiDictation } from "./components/corti-dictation.js";
|
|
3
5
|
export { DictationDeviceSelector } from "./components/device-selector.js";
|
|
6
|
+
export { DictationRecordingButton } from "./components/dictation-recording-button.js";
|
|
4
7
|
export { DictationKeybindingSelector } from "./components/keybinding-selector.js";
|
|
5
8
|
export { DictationLanguageSelector } from "./components/language-selector.js";
|
|
6
|
-
export { DictationRecordingButton } from "./components/recording-button.js";
|
|
7
9
|
export { DictationSettingsMenu } from "./components/settings-menu.js";
|
|
8
10
|
export { DictationRoot } from "./contexts/dictation-context.js";
|
|
11
|
+
export type { AmbientStreamSessionConfig } from "./controllers/ambient-controller.js";
|
|
9
12
|
export type { ConfigurableSettings, Keybinding, RecordingState, } from "./types.js";
|
|
10
|
-
export type { AudioLevelChangedEventDetail, CommandEventDetail, DeltaUsageEventDetail, ErrorEventDetail, KeybindingActivatedEventDetail, KeybindingChangedEventDetail, LanguageChangedEventDetail, LanguagesChangedEventDetail, NetworkActivityEventDetail, RecordingDevicesChangedEventDetail, RecordingStateChangedEventDetail, TranscriptEventDetail, UsageEventDetail, } from "./utils/events.js";
|
|
13
|
+
export type { AudioLevelChangedEventDetail, CommandEventDetail, DeltaUsageEventDetail, ErrorEventDetail, FactsEventDetail, KeybindingActivatedEventDetail, KeybindingChangedEventDetail, LanguageChangedEventDetail, LanguagesChangedEventDetail, NetworkActivityEventDetail, RecordingDevicesChangedEventDetail, RecordingStateChangedEventDetail, TranscriptEventDetail, UsageEventDetail, } from "./utils/events.js";
|
|
11
14
|
export default CortiDictation;
|
package/dist/index.js
CHANGED
|
@@ -1,10 +1,18 @@
|
|
|
1
|
+
import { AmbientRecordingButton } from "./components/ambient-recording-button.js";
|
|
2
|
+
import { CortiAmbient } from "./components/corti-ambient.js";
|
|
1
3
|
import { CortiDictation } from "./components/corti-dictation.js";
|
|
2
4
|
import { DictationDeviceSelector } from "./components/device-selector.js";
|
|
5
|
+
import { DictationRecordingButton } from "./components/dictation-recording-button.js";
|
|
3
6
|
import { DictationKeybindingSelector } from "./components/keybinding-selector.js";
|
|
4
7
|
import { DictationLanguageSelector } from "./components/language-selector.js";
|
|
5
|
-
import { DictationRecordingButton } from "./components/recording-button.js";
|
|
6
8
|
import { DictationSettingsMenu } from "./components/settings-menu.js";
|
|
7
9
|
import { DictationRoot } from "./contexts/dictation-context.js";
|
|
10
|
+
if (!customElements.get("ambient-recording-button")) {
|
|
11
|
+
customElements.define("ambient-recording-button", AmbientRecordingButton);
|
|
12
|
+
}
|
|
13
|
+
if (!customElements.get("corti-ambient")) {
|
|
14
|
+
customElements.define("corti-ambient", CortiAmbient);
|
|
15
|
+
}
|
|
8
16
|
if (!customElements.get("corti-dictation")) {
|
|
9
17
|
customElements.define("corti-dictation", CortiDictation);
|
|
10
18
|
}
|
|
@@ -26,11 +34,13 @@ if (!customElements.get("dictation-settings-menu")) {
|
|
|
26
34
|
if (!customElements.get("dictation-root")) {
|
|
27
35
|
customElements.define("dictation-root", DictationRoot);
|
|
28
36
|
}
|
|
37
|
+
export { AmbientRecordingButton } from "./components/ambient-recording-button.js";
|
|
38
|
+
export { CortiAmbient } from "./components/corti-ambient.js";
|
|
29
39
|
export { CortiDictation } from "./components/corti-dictation.js";
|
|
30
40
|
export { DictationDeviceSelector } from "./components/device-selector.js";
|
|
41
|
+
export { DictationRecordingButton } from "./components/dictation-recording-button.js";
|
|
31
42
|
export { DictationKeybindingSelector } from "./components/keybinding-selector.js";
|
|
32
43
|
export { DictationLanguageSelector } from "./components/language-selector.js";
|
|
33
|
-
export { DictationRecordingButton } from "./components/recording-button.js";
|
|
34
44
|
export { DictationSettingsMenu } from "./components/settings-menu.js";
|
|
35
45
|
export { DictationRoot } from "./contexts/dictation-context.js";
|
|
36
46
|
export default CortiDictation;
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAC;AACjE,OAAO,EAAE,uBAAuB,EAAE,MAAM,iCAAiC,CAAC;AAC1E,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,MAAM,0CAA0C,CAAC;AAClF,OAAO,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAC7D,OAAO,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAC;AACjE,OAAO,EAAE,uBAAuB,EAAE,MAAM,iCAAiC,CAAC;AAC1E,OAAO,EAAE,wBAAwB,EAAE,MAAM,4CAA4C,CAAC;AACtF,OAAO,EAAE,2BAA2B,EAAE,MAAM,qCAAqC,CAAC;AAClF,OAAO,EAAE,yBAAyB,EAAE,MAAM,mCAAmC,CAAC;AAC9E,OAAO,EAAE,qBAAqB,EAAE,MAAM,+BAA+B,CAAC;AACtE,OAAO,EAAE,aAAa,EAAE,MAAM,iCAAiC,CAAC;AAEhE,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,0BAA0B,CAAC,EAAE,CAAC;IACpD,cAAc,CAAC,MAAM,CAAC,0BAA0B,EAAE,sBAAsB,CAAC,CAAC;AAC5E,CAAC;AAED,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,eAAe,CAAC,EAAE,CAAC;IACzC,cAAc,CAAC,MAAM,CAAC,eAAe,EAAE,YAAY,CAAC,CAAC;AACvD,CAAC;AAED,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,iBAAiB,CAAC,EAAE,CAAC;IAC3C,cAAc,CAAC,MAAM,CAAC,iBAAiB,EAAE,cAAc,CAAC,CAAC;AAC3D,CAAC;AAED,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,4BAA4B,CAAC,EAAE,CAAC;IACtD,cAAc,CAAC,MAAM,CAAC,4BAA4B,EAAE,wBAAwB,CAAC,CAAC;AAChF,CAAC;AAED,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,2BAA2B,CAAC,EAAE,CAAC;IACrD,cAAc,CAAC,MAAM,CAAC,2BAA2B,EAAE,uBAAuB,CAAC,CAAC;AAC9E,CAAC;AAED,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,6BAA6B,CAAC,EAAE,CAAC;IACvD,cAAc,CAAC,MAAM,CACnB,6BAA6B,EAC7B,yBAAyB,CAC1B,CAAC;AACJ,CAAC;AAED,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,+BAA+B,CAAC,EAAE,CAAC;IACzD,cAAc,CAAC,MAAM,CACnB,+BAA+B,EAC/B,2BAA2B,CAC5B,CAAC;AACJ,CAAC;AAED,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,yBAAyB,CAAC,EAAE,CAAC;IACnD,cAAc,CAAC,MAAM,CAAC,yBAAyB,EAAE,qBAAqB,CAAC,CAAC;AAC1E,CAAC;AAED,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,gBAAgB,CAAC,EAAE,CAAC;IAC1C,cAAc,CAAC,MAAM,CAAC,gBAAgB,EAAE,aAAa,CAAC,CAAC;AACzD,CAAC;AAED,OAAO,EAAE,sBAAsB,EAAE,MAAM,0CAA0C,CAAC;AAClF,OAAO,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAC7D,OAAO,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAC;AACjE,OAAO,EAAE,uBAAuB,EAAE,MAAM,iCAAiC,CAAC;AAC1E,OAAO,EAAE,wBAAwB,EAAE,MAAM,4CAA4C,CAAC;AACtF,OAAO,EAAE,2BAA2B,EAAE,MAAM,qCAAqC,CAAC;AAClF,OAAO,EAAE,yBAAyB,EAAE,MAAM,mCAAmC,CAAC;AAC9E,OAAO,EAAE,qBAAqB,EAAE,MAAM,+BAA+B,CAAC;AACtE,OAAO,EAAE,aAAa,EAAE,MAAM,iCAAiC,CAAC;AAyBhE,eAAe,cAAc,CAAC","sourcesContent":["import { AmbientRecordingButton } from \"./components/ambient-recording-button.js\";\nimport { CortiAmbient } from \"./components/corti-ambient.js\";\nimport { CortiDictation } from \"./components/corti-dictation.js\";\nimport { DictationDeviceSelector } from \"./components/device-selector.js\";\nimport { DictationRecordingButton } from \"./components/dictation-recording-button.js\";\nimport { DictationKeybindingSelector } from \"./components/keybinding-selector.js\";\nimport { DictationLanguageSelector } from \"./components/language-selector.js\";\nimport { DictationSettingsMenu } from \"./components/settings-menu.js\";\nimport { DictationRoot } from \"./contexts/dictation-context.js\";\n\nif (!customElements.get(\"ambient-recording-button\")) {\n customElements.define(\"ambient-recording-button\", AmbientRecordingButton);\n}\n\nif (!customElements.get(\"corti-ambient\")) {\n customElements.define(\"corti-ambient\", CortiAmbient);\n}\n\nif (!customElements.get(\"corti-dictation\")) {\n customElements.define(\"corti-dictation\", CortiDictation);\n}\n\nif (!customElements.get(\"dictation-recording-button\")) {\n customElements.define(\"dictation-recording-button\", DictationRecordingButton);\n}\n\nif (!customElements.get(\"dictation-device-selector\")) {\n customElements.define(\"dictation-device-selector\", DictationDeviceSelector);\n}\n\nif (!customElements.get(\"dictation-language-selector\")) {\n customElements.define(\n \"dictation-language-selector\",\n DictationLanguageSelector,\n );\n}\n\nif (!customElements.get(\"dictation-keybinding-selector\")) {\n customElements.define(\n \"dictation-keybinding-selector\",\n DictationKeybindingSelector,\n );\n}\n\nif (!customElements.get(\"dictation-settings-menu\")) {\n customElements.define(\"dictation-settings-menu\", DictationSettingsMenu);\n}\n\nif (!customElements.get(\"dictation-root\")) {\n customElements.define(\"dictation-root\", DictationRoot);\n}\n\nexport { AmbientRecordingButton } from \"./components/ambient-recording-button.js\";\nexport { CortiAmbient } from \"./components/corti-ambient.js\";\nexport { CortiDictation } from \"./components/corti-dictation.js\";\nexport { DictationDeviceSelector } from \"./components/device-selector.js\";\nexport { DictationRecordingButton } from \"./components/dictation-recording-button.js\";\nexport { DictationKeybindingSelector } from \"./components/keybinding-selector.js\";\nexport { DictationLanguageSelector } from \"./components/language-selector.js\";\nexport { DictationSettingsMenu } from \"./components/settings-menu.js\";\nexport { DictationRoot } from \"./contexts/dictation-context.js\";\n\nexport type { AmbientStreamSessionConfig } from \"./controllers/ambient-controller.js\";\nexport type {\n ConfigurableSettings,\n Keybinding,\n RecordingState,\n} from \"./types.js\";\nexport type {\n AudioLevelChangedEventDetail,\n CommandEventDetail,\n DeltaUsageEventDetail,\n ErrorEventDetail,\n FactsEventDetail,\n KeybindingActivatedEventDetail,\n KeybindingChangedEventDetail,\n LanguageChangedEventDetail,\n LanguagesChangedEventDetail,\n NetworkActivityEventDetail,\n RecordingDevicesChangedEventDetail,\n RecordingStateChangedEventDetail,\n TranscriptEventDetail,\n UsageEventDetail,\n} from \"./utils/events.js\";\n\nexport default CortiDictation;\n"]}
|