@corti/dictation-web 0.5.0 → 0.5.1
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 +32 -106
- package/dist/components/recording-button.js +5 -19
- package/dist/components/recording-button.js.map +1 -1
- package/dist/controllers/dictation-controller.js +5 -81
- package/dist/controllers/dictation-controller.js.map +1 -1
- package/dist/controllers/media-controller.d.ts +3 -1
- package/dist/controllers/media-controller.js +22 -4
- package/dist/controllers/media-controller.js.map +1 -1
- package/dist/icons/icons.d.ts +1 -1
- package/dist/icons/icons.js +7 -7
- package/dist/icons/icons.js.map +1 -1
- package/dist/styles/audio-visualiser.js.map +1 -1
- package/dist/styles/callout.js +1 -1
- package/dist/styles/callout.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/dist/utils/languages.js +1 -1
- package/dist/utils/languages.js.map +1 -1
- package/dist/utils/token.js +3 -3
- package/dist/utils/token.js.map +1 -1
- package/package.json +1 -1
|
@@ -9,7 +9,7 @@ var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (
|
|
|
9
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
10
|
return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
|
|
11
11
|
};
|
|
12
|
-
var _DictationController_instances, _DictationController_cortiClient, _DictationController_webSocket, _DictationController_closeTimeout, _DictationController_callbacks, _DictationController_lastDictationConfig, _DictationController_lastSocketUrl, _DictationController_lastSocketProxy,
|
|
12
|
+
var _DictationController_instances, _DictationController_cortiClient, _DictationController_webSocket, _DictationController_closeTimeout, _DictationController_callbacks, _DictationController_lastDictationConfig, _DictationController_lastSocketUrl, _DictationController_lastSocketProxy, _DictationController_configHasChanged, _DictationController_connectProxy, _DictationController_connectAuth, _DictationController_setupWebSocketHandlers;
|
|
13
13
|
import { CortiClient, CortiWebSocketProxyClient } from "@corti/sdk";
|
|
14
14
|
import { DEFAULT_DICTATION_CONFIG } from "../constants.js";
|
|
15
15
|
export class DictationController {
|
|
@@ -22,18 +22,7 @@ export class DictationController {
|
|
|
22
22
|
_DictationController_lastDictationConfig.set(this, null);
|
|
23
23
|
_DictationController_lastSocketUrl.set(this, void 0);
|
|
24
24
|
_DictationController_lastSocketProxy.set(this, void 0);
|
|
25
|
-
_DictationController_messageBuffer.set(this, []);
|
|
26
|
-
_DictationController_connectionPromise.set(this, null);
|
|
27
25
|
this.mediaRecorderHandler = (data) => {
|
|
28
|
-
if (__classPrivateFieldGet(this, _DictationController_connectionPromise, "f")) {
|
|
29
|
-
console.log("[DictationController] Buffering audio chunk (connection pending):", data.size);
|
|
30
|
-
__classPrivateFieldGet(this, _DictationController_messageBuffer, "f").push({ data, type: "audio" });
|
|
31
|
-
return;
|
|
32
|
-
}
|
|
33
|
-
console.log("[DictationController] Sending audio chunk directly:", {
|
|
34
|
-
size: data.size,
|
|
35
|
-
socketState: __classPrivateFieldGet(this, _DictationController_webSocket, "f")?.readyState,
|
|
36
|
-
});
|
|
37
26
|
__classPrivateFieldGet(this, _DictationController_webSocket, "f")?.sendAudio(data);
|
|
38
27
|
__classPrivateFieldGet(this, _DictationController_callbacks, "f")?.onNetworkActivity?.("sent", {
|
|
39
28
|
size: data.size,
|
|
@@ -53,8 +42,9 @@ export class DictationController {
|
|
|
53
42
|
if (__classPrivateFieldGet(this, _DictationController_webSocket, "f")?.readyState === WebSocket.OPEN) {
|
|
54
43
|
throw new Error("Already connected. Disconnect before reconnecting.");
|
|
55
44
|
}
|
|
56
|
-
__classPrivateFieldSet(this,
|
|
57
|
-
|
|
45
|
+
__classPrivateFieldSet(this, _DictationController_webSocket, this.host._socketUrl || this.host._socketProxy
|
|
46
|
+
? await __classPrivateFieldGet(this, _DictationController_instances, "m", _DictationController_connectProxy).call(this, dictationConfig)
|
|
47
|
+
: await __classPrivateFieldGet(this, _DictationController_instances, "m", _DictationController_connectAuth).call(this, dictationConfig), "f");
|
|
58
48
|
__classPrivateFieldGet(this, _DictationController_callbacks, "f")?.onNetworkActivity?.("sent", {
|
|
59
49
|
configuration: dictationConfig,
|
|
60
50
|
type: "config",
|
|
@@ -68,18 +58,6 @@ export class DictationController {
|
|
|
68
58
|
return newConnection;
|
|
69
59
|
}
|
|
70
60
|
async pause() {
|
|
71
|
-
console.log("[DictationController] pause() called", {
|
|
72
|
-
connectionPending: !!__classPrivateFieldGet(this, _DictationController_connectionPromise, "f"),
|
|
73
|
-
socketState: __classPrivateFieldGet(this, _DictationController_webSocket, "f")?.readyState,
|
|
74
|
-
});
|
|
75
|
-
if (__classPrivateFieldGet(this, _DictationController_connectionPromise, "f")) {
|
|
76
|
-
console.log("[DictationController] Buffering flush (connection pending)");
|
|
77
|
-
__classPrivateFieldGet(this, _DictationController_messageBuffer, "f").push({ data: { type: "flush" }, type: "flush" });
|
|
78
|
-
return;
|
|
79
|
-
}
|
|
80
|
-
console.log("[DictationController] Sending flush", {
|
|
81
|
-
socketState: __classPrivateFieldGet(this, _DictationController_webSocket, "f")?.readyState,
|
|
82
|
-
});
|
|
83
61
|
__classPrivateFieldGet(this, _DictationController_webSocket, "f")?.sendFlush({ type: "flush" });
|
|
84
62
|
__classPrivateFieldGet(this, _DictationController_callbacks, "f")?.onNetworkActivity?.("sent", { type: "flush" });
|
|
85
63
|
}
|
|
@@ -143,68 +121,14 @@ export class DictationController {
|
|
|
143
121
|
__classPrivateFieldSet(this, _DictationController_lastDictationConfig, null, "f");
|
|
144
122
|
__classPrivateFieldSet(this, _DictationController_lastSocketUrl, undefined, "f");
|
|
145
123
|
__classPrivateFieldSet(this, _DictationController_lastSocketProxy, undefined, "f");
|
|
146
|
-
__classPrivateFieldSet(this, _DictationController_messageBuffer, [], "f");
|
|
147
|
-
__classPrivateFieldSet(this, _DictationController_connectionPromise, null, "f");
|
|
148
124
|
}
|
|
149
125
|
}
|
|
150
|
-
_DictationController_cortiClient = new WeakMap(), _DictationController_webSocket = new WeakMap(), _DictationController_closeTimeout = new WeakMap(), _DictationController_callbacks = new WeakMap(), _DictationController_lastDictationConfig = new WeakMap(), _DictationController_lastSocketUrl = new WeakMap(), _DictationController_lastSocketProxy = new WeakMap(),
|
|
126
|
+
_DictationController_cortiClient = new WeakMap(), _DictationController_webSocket = new WeakMap(), _DictationController_closeTimeout = new WeakMap(), _DictationController_callbacks = new WeakMap(), _DictationController_lastDictationConfig = new WeakMap(), _DictationController_lastSocketUrl = new WeakMap(), _DictationController_lastSocketProxy = new WeakMap(), _DictationController_instances = new WeakSet(), _DictationController_configHasChanged = function _DictationController_configHasChanged() {
|
|
151
127
|
return (JSON.stringify(this.host._dictationConfig) !==
|
|
152
128
|
JSON.stringify(__classPrivateFieldGet(this, _DictationController_lastDictationConfig, "f")) ||
|
|
153
129
|
this.host._socketUrl !== __classPrivateFieldGet(this, _DictationController_lastSocketUrl, "f") ||
|
|
154
130
|
JSON.stringify(this.host._socketProxy) !==
|
|
155
131
|
JSON.stringify(__classPrivateFieldGet(this, _DictationController_lastSocketProxy, "f")));
|
|
156
|
-
}, _DictationController_establishConnection = async function _DictationController_establishConnection(dictationConfig) {
|
|
157
|
-
try {
|
|
158
|
-
console.log("[DictationController] Delay complete, connecting to WebSocket...");
|
|
159
|
-
__classPrivateFieldSet(this, _DictationController_webSocket, this.host._socketUrl || this.host._socketProxy
|
|
160
|
-
? await __classPrivateFieldGet(this, _DictationController_instances, "m", _DictationController_connectProxy).call(this, dictationConfig)
|
|
161
|
-
: await __classPrivateFieldGet(this, _DictationController_instances, "m", _DictationController_connectAuth).call(this, dictationConfig), "f");
|
|
162
|
-
console.log("[DictationController] Starting connection establishment (10s delay)...");
|
|
163
|
-
await new Promise((resolve) => setTimeout(resolve, 10000));
|
|
164
|
-
console.log("[DictationController] WebSocket connected, flushing message buffer...", {
|
|
165
|
-
bufferedMessages: __classPrivateFieldGet(this, _DictationController_messageBuffer, "f").length,
|
|
166
|
-
socketState: __classPrivateFieldGet(this, _DictationController_webSocket, "f")?.readyState,
|
|
167
|
-
});
|
|
168
|
-
__classPrivateFieldGet(this, _DictationController_instances, "m", _DictationController_flushMessageBuffer).call(this);
|
|
169
|
-
}
|
|
170
|
-
catch (error) {
|
|
171
|
-
console.error("[DictationController] Connection establishment failed:", error);
|
|
172
|
-
__classPrivateFieldSet(this, _DictationController_messageBuffer, [], "f");
|
|
173
|
-
throw error;
|
|
174
|
-
}
|
|
175
|
-
finally {
|
|
176
|
-
console.log("[DictationController] Connection promise cleared");
|
|
177
|
-
__classPrivateFieldSet(this, _DictationController_connectionPromise, null, "f");
|
|
178
|
-
}
|
|
179
|
-
}, _DictationController_flushMessageBuffer = function _DictationController_flushMessageBuffer() {
|
|
180
|
-
console.log("[DictationController] Flushing buffer:", {
|
|
181
|
-
messages: __classPrivateFieldGet(this, _DictationController_messageBuffer, "f").length,
|
|
182
|
-
socketState: __classPrivateFieldGet(this, _DictationController_webSocket, "f")?.readyState,
|
|
183
|
-
});
|
|
184
|
-
for (const message of __classPrivateFieldGet(this, _DictationController_messageBuffer, "f")) {
|
|
185
|
-
switch (message.type) {
|
|
186
|
-
case "audio":
|
|
187
|
-
console.log("[DictationController] Sending buffered audio chunk:", message.data.size);
|
|
188
|
-
__classPrivateFieldGet(this, _DictationController_webSocket, "f")?.sendAudio(message.data);
|
|
189
|
-
__classPrivateFieldGet(this, _DictationController_callbacks, "f")?.onNetworkActivity?.("sent", {
|
|
190
|
-
size: message.data.size,
|
|
191
|
-
type: "audio",
|
|
192
|
-
});
|
|
193
|
-
break;
|
|
194
|
-
case "flush":
|
|
195
|
-
console.log("[DictationController] Sending buffered flush");
|
|
196
|
-
__classPrivateFieldGet(this, _DictationController_webSocket, "f")?.sendFlush(message.data);
|
|
197
|
-
__classPrivateFieldGet(this, _DictationController_callbacks, "f")?.onNetworkActivity?.("sent", message.data);
|
|
198
|
-
break;
|
|
199
|
-
case "end":
|
|
200
|
-
console.log("[DictationController] Sending buffered end");
|
|
201
|
-
__classPrivateFieldGet(this, _DictationController_webSocket, "f")?.sendEnd(message.data);
|
|
202
|
-
__classPrivateFieldGet(this, _DictationController_callbacks, "f")?.onNetworkActivity?.("sent", message.data);
|
|
203
|
-
break;
|
|
204
|
-
}
|
|
205
|
-
}
|
|
206
|
-
console.log("[DictationController] Buffer cleared");
|
|
207
|
-
__classPrivateFieldSet(this, _DictationController_messageBuffer, [], "f");
|
|
208
132
|
}, _DictationController_connectProxy = async function _DictationController_connectProxy(dictationConfig) {
|
|
209
133
|
const proxyOptions = this.host._socketProxy || {
|
|
210
134
|
url: this.host._socketUrl || "",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dictation-controller.js","sourceRoot":"","sources":["../../src/controllers/dictation-controller.ts"],"names":[],"mappings":"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","sourcesContent":["import { type Corti, CortiClient, CortiWebSocketProxyClient } from \"@corti/sdk\";\nimport type { ReactiveController, ReactiveControllerHost } from \"lit\";\nimport { DEFAULT_DICTATION_CONFIG } from \"../constants.js\";\nimport type { ProxyOptions } from \"../types.js\";\n\ntype TranscribeSocket = Awaited<\n ReturnType<CortiClient[\"transcribe\"][\"connect\"]>\n>;\n\ninterface DictationControllerHost extends ReactiveControllerHost {\n _accessToken?: string;\n _authConfig?: Corti.BearerOptions;\n _region?: string;\n _tenantName?: string;\n _socketUrl?: string;\n _socketProxy?: ProxyOptions;\n _dictationConfig?: Corti.TranscribeConfig;\n}\n\nexport type TranscribeMessage =\n | Corti.TranscribeConfigStatusMessage\n | Corti.TranscribeUsageMessage\n | Corti.TranscribeEndedMessage\n | Corti.TranscribeErrorMessage\n | Corti.TranscribeTranscriptMessage\n | Corti.TranscribeCommandMessage\n | Corti.TranscribeFlushedMessage;\n\ninterface WebSocketCallbacks {\n onMessage?: (message: TranscribeMessage) => void;\n onError?: (error: Error) => void;\n onClose?: (event: unknown) => void;\n onNetworkActivity?: (direction: \"sent\" | \"received\", data: unknown) => void;\n}\n\ntype BufferedMessage =\n | { type: \"audio\"; data: Blob }\n | { type: \"flush\"; data: { type: \"flush\" } }\n | { type: \"end\"; data: { type: \"end\" } };\n\nexport class DictationController implements ReactiveController {\n host: DictationControllerHost;\n\n #cortiClient: CortiClient | null = null;\n #webSocket: TranscribeSocket | null = null;\n #closeTimeout?: number;\n #callbacks?: WebSocketCallbacks;\n #lastDictationConfig: Corti.TranscribeConfig | null = null;\n #lastSocketUrl?: string;\n #lastSocketProxy?: ProxyOptions;\n #messageBuffer: BufferedMessage[] = [];\n #connectionPromise: Promise<void> | null = null;\n\n constructor(host: DictationControllerHost) {\n this.host = host;\n host.addController(this);\n }\n\n hostDisconnected(): void {\n this.cleanup();\n }\n\n #configHasChanged(): boolean {\n return (\n JSON.stringify(this.host._dictationConfig) !==\n JSON.stringify(this.#lastDictationConfig) ||\n this.host._socketUrl !== this.#lastSocketUrl ||\n JSON.stringify(this.host._socketProxy) !==\n JSON.stringify(this.#lastSocketProxy)\n );\n }\n\n async connect(\n dictationConfig: Corti.TranscribeConfig = DEFAULT_DICTATION_CONFIG,\n callbacks: WebSocketCallbacks = {},\n ): Promise<boolean> {\n const newConnection = this.#configHasChanged() || !this.isConnectionOpen();\n\n if (newConnection) {\n this.cleanup();\n\n if (this.#webSocket?.readyState === WebSocket.OPEN) {\n throw new Error(\"Already connected. Disconnect before reconnecting.\");\n }\n\n this.#connectionPromise = this.#establishConnection(dictationConfig);\n await this.#connectionPromise;\n\n this.#callbacks?.onNetworkActivity?.(\"sent\", {\n configuration: dictationConfig,\n type: \"config\",\n });\n\n this.#lastDictationConfig = this.host._dictationConfig || null;\n this.#lastSocketUrl = this.host._socketUrl;\n this.#lastSocketProxy = this.host._socketProxy;\n }\n\n this.#callbacks = callbacks;\n this.#setupWebSocketHandlers(callbacks);\n\n return newConnection;\n }\n\n async #establishConnection(\n dictationConfig: Corti.TranscribeConfig,\n ): Promise<void> {\n try {\n console.log(\n \"[DictationController] Delay complete, connecting to WebSocket...\",\n );\n this.#webSocket =\n this.host._socketUrl || this.host._socketProxy\n ? await this.#connectProxy(dictationConfig)\n : await this.#connectAuth(dictationConfig);\n\n console.log(\n \"[DictationController] Starting connection establishment (10s delay)...\",\n );\n await new Promise((resolve) => setTimeout(resolve, 10000));\n\n console.log(\n \"[DictationController] WebSocket connected, flushing message buffer...\",\n {\n bufferedMessages: this.#messageBuffer.length,\n socketState: this.#webSocket?.readyState,\n },\n );\n this.#flushMessageBuffer();\n } catch (error) {\n console.error(\n \"[DictationController] Connection establishment failed:\",\n error,\n );\n this.#messageBuffer = [];\n throw error;\n } finally {\n console.log(\"[DictationController] Connection promise cleared\");\n this.#connectionPromise = null;\n }\n }\n\n #flushMessageBuffer(): void {\n console.log(\"[DictationController] Flushing buffer:\", {\n messages: this.#messageBuffer.length,\n socketState: this.#webSocket?.readyState,\n });\n\n for (const message of this.#messageBuffer) {\n switch (message.type) {\n case \"audio\":\n console.log(\n \"[DictationController] Sending buffered audio chunk:\",\n message.data.size,\n );\n this.#webSocket?.sendAudio(message.data);\n this.#callbacks?.onNetworkActivity?.(\"sent\", {\n size: message.data.size,\n type: \"audio\",\n });\n break;\n case \"flush\":\n console.log(\"[DictationController] Sending buffered flush\");\n this.#webSocket?.sendFlush(message.data);\n this.#callbacks?.onNetworkActivity?.(\"sent\", message.data);\n break;\n case \"end\":\n console.log(\"[DictationController] Sending buffered end\");\n this.#webSocket?.sendEnd(message.data);\n this.#callbacks?.onNetworkActivity?.(\"sent\", message.data);\n break;\n }\n }\n\n console.log(\"[DictationController] Buffer cleared\");\n this.#messageBuffer = [];\n }\n\n async #connectProxy(\n dictationConfig: Corti.TranscribeConfig,\n ): Promise<TranscribeSocket> {\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 await CortiWebSocketProxyClient.transcribe.connect({\n configuration: dictationConfig,\n proxy: proxyOptions,\n });\n }\n\n async #connectAuth(\n dictationConfig: Corti.TranscribeConfig,\n ): Promise<TranscribeSocket> {\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 // Use authConfig if available, otherwise create one from accessToken\n const auth: Corti.BearerOptions = 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 await this.#cortiClient.transcribe.connect({\n configuration: dictationConfig,\n });\n }\n\n #setupWebSocketHandlers(callbacks: WebSocketCallbacks): void {\n if (!this.#webSocket) {\n throw new Error(\"WebSocket not initialized\");\n }\n\n this.#webSocket.on(\"message\", (message: TranscribeMessage) => {\n callbacks.onNetworkActivity?.(\"received\", message);\n\n if (callbacks.onMessage) {\n callbacks.onMessage(message);\n }\n });\n\n this.#webSocket.on(\"error\", (event: Error) => {\n if (callbacks.onError) {\n callbacks.onError(event);\n }\n });\n\n this.#webSocket.on(\"close\", (event: unknown) => {\n if (callbacks.onClose) {\n callbacks.onClose(event);\n }\n });\n }\n\n mediaRecorderHandler = (data: Blob): void => {\n if (this.#connectionPromise) {\n console.log(\n \"[DictationController] Buffering audio chunk (connection pending):\",\n data.size,\n );\n this.#messageBuffer.push({ data, type: \"audio\" });\n return;\n }\n\n console.log(\"[DictationController] Sending audio chunk directly:\", {\n size: data.size,\n socketState: this.#webSocket?.readyState,\n });\n this.#webSocket?.sendAudio(data);\n this.#callbacks?.onNetworkActivity?.(\"sent\", {\n size: data.size,\n type: \"audio\",\n });\n };\n\n async pause(): Promise<void> {\n console.log(\"[DictationController] pause() called\", {\n connectionPending: !!this.#connectionPromise,\n socketState: this.#webSocket?.readyState,\n });\n\n if (this.#connectionPromise) {\n console.log(\"[DictationController] Buffering flush (connection pending)\");\n this.#messageBuffer.push({ data: { type: \"flush\" }, type: \"flush\" });\n return;\n }\n\n console.log(\"[DictationController] Sending flush\", {\n socketState: this.#webSocket?.readyState,\n });\n this.#webSocket?.sendFlush({ type: \"flush\" });\n this.#callbacks?.onNetworkActivity?.(\"sent\", { type: \"flush\" });\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 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 (!oldSocket || oldSocket.readyState !== WebSocket.OPEN) {\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 }\n\n resolve();\n });\n\n oldSocket.on(\"message\", (message) => {\n this.#callbacks?.onNetworkActivity?.(\"received\", message);\n\n if (this.#callbacks?.onMessage) {\n this.#callbacks?.onMessage(message);\n }\n\n if (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 oldSocket.sendEnd({ type: \"end\" });\n this.#callbacks?.onNetworkActivity?.(\"sent\", { type: \"end\" });\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 if (this.#closeTimeout) {\n clearTimeout(this.#closeTimeout);\n this.#closeTimeout = undefined;\n }\n\n if (this.#webSocket?.readyState === WebSocket.OPEN) {\n this.#webSocket.close();\n }\n\n this.#webSocket = null;\n this.#cortiClient = null;\n this.#lastDictationConfig = null;\n this.#lastSocketUrl = undefined;\n this.#lastSocketProxy = undefined;\n this.#messageBuffer = [];\n this.#connectionPromise = null;\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"dictation-controller.js","sourceRoot":"","sources":["../../src/controllers/dictation-controller.ts"],"names":[],"mappings":"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","sourcesContent":["import { type Corti, CortiClient, CortiWebSocketProxyClient } from \"@corti/sdk\";\nimport type { ReactiveController, ReactiveControllerHost } from \"lit\";\nimport { DEFAULT_DICTATION_CONFIG } from \"../constants.js\";\nimport type { ProxyOptions } from \"../types.js\";\n\ntype TranscribeSocket = Awaited<\n ReturnType<CortiClient[\"transcribe\"][\"connect\"]>\n>;\n\ninterface DictationControllerHost extends ReactiveControllerHost {\n _accessToken?: string;\n _authConfig?: Corti.BearerOptions;\n _region?: string;\n _tenantName?: string;\n _socketUrl?: string;\n _socketProxy?: ProxyOptions;\n _dictationConfig?: Corti.TranscribeConfig;\n}\n\nexport type TranscribeMessage =\n | Corti.TranscribeConfigStatusMessage\n | Corti.TranscribeUsageMessage\n | Corti.TranscribeEndedMessage\n | Corti.TranscribeErrorMessage\n | Corti.TranscribeTranscriptMessage\n | Corti.TranscribeCommandMessage\n | Corti.TranscribeFlushedMessage;\n\ninterface WebSocketCallbacks {\n onMessage?: (message: TranscribeMessage) => void;\n onError?: (error: Error) => void;\n onClose?: (event: unknown) => void;\n onNetworkActivity?: (direction: \"sent\" | \"received\", data: unknown) => void;\n}\n\nexport class DictationController implements ReactiveController {\n host: DictationControllerHost;\n\n #cortiClient: CortiClient | null = null;\n #webSocket: TranscribeSocket | null = null;\n #closeTimeout?: number;\n #callbacks?: WebSocketCallbacks;\n #lastDictationConfig: Corti.TranscribeConfig | null = null;\n #lastSocketUrl?: string;\n #lastSocketProxy?: ProxyOptions;\n\n constructor(host: DictationControllerHost) {\n this.host = host;\n host.addController(this);\n }\n\n hostDisconnected(): void {\n this.cleanup();\n }\n\n #configHasChanged(): boolean {\n return (\n JSON.stringify(this.host._dictationConfig) !==\n JSON.stringify(this.#lastDictationConfig) ||\n this.host._socketUrl !== this.#lastSocketUrl ||\n JSON.stringify(this.host._socketProxy) !==\n JSON.stringify(this.#lastSocketProxy)\n );\n }\n\n async connect(\n dictationConfig: Corti.TranscribeConfig = DEFAULT_DICTATION_CONFIG,\n callbacks: WebSocketCallbacks = {},\n ): Promise<boolean> {\n const newConnection = this.#configHasChanged() || !this.isConnectionOpen();\n\n if (newConnection) {\n this.cleanup();\n\n if (this.#webSocket?.readyState === WebSocket.OPEN) {\n throw new Error(\"Already connected. Disconnect before reconnecting.\");\n }\n\n this.#webSocket =\n this.host._socketUrl || this.host._socketProxy\n ? await this.#connectProxy(dictationConfig)\n : await this.#connectAuth(dictationConfig);\n\n this.#callbacks?.onNetworkActivity?.(\"sent\", {\n configuration: dictationConfig,\n type: \"config\",\n });\n\n this.#lastDictationConfig = this.host._dictationConfig || null;\n this.#lastSocketUrl = this.host._socketUrl;\n this.#lastSocketProxy = this.host._socketProxy;\n }\n\n this.#callbacks = callbacks;\n this.#setupWebSocketHandlers(callbacks);\n\n return newConnection;\n }\n\n async #connectProxy(\n dictationConfig: Corti.TranscribeConfig,\n ): Promise<TranscribeSocket> {\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 await CortiWebSocketProxyClient.transcribe.connect({\n configuration: dictationConfig,\n proxy: proxyOptions,\n });\n }\n\n async #connectAuth(\n dictationConfig: Corti.TranscribeConfig,\n ): Promise<TranscribeSocket> {\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 // Use authConfig if available, otherwise create one from accessToken\n const auth: Corti.BearerOptions = 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 await this.#cortiClient.transcribe.connect({\n configuration: dictationConfig,\n });\n }\n\n #setupWebSocketHandlers(callbacks: WebSocketCallbacks): void {\n if (!this.#webSocket) {\n throw new Error(\"WebSocket not initialized\");\n }\n\n this.#webSocket.on(\"message\", (message: TranscribeMessage) => {\n callbacks.onNetworkActivity?.(\"received\", message);\n\n if (callbacks.onMessage) {\n callbacks.onMessage(message);\n }\n });\n\n this.#webSocket.on(\"error\", (event: Error) => {\n if (callbacks.onError) {\n callbacks.onError(event);\n }\n });\n\n this.#webSocket.on(\"close\", (event: unknown) => {\n if (callbacks.onClose) {\n callbacks.onClose(event);\n }\n });\n }\n\n mediaRecorderHandler = (data: Blob): void => {\n this.#webSocket?.sendAudio(data);\n this.#callbacks?.onNetworkActivity?.(\"sent\", {\n size: data.size,\n type: \"audio\",\n });\n };\n\n async pause(): Promise<void> {\n this.#webSocket?.sendFlush({ type: \"flush\" });\n this.#callbacks?.onNetworkActivity?.(\"sent\", { type: \"flush\" });\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 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 (!oldSocket || oldSocket.readyState !== WebSocket.OPEN) {\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 }\n\n resolve();\n });\n\n oldSocket.on(\"message\", (message) => {\n this.#callbacks?.onNetworkActivity?.(\"received\", message);\n\n if (this.#callbacks?.onMessage) {\n this.#callbacks?.onMessage(message);\n }\n\n if (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 oldSocket.sendEnd({ type: \"end\" });\n this.#callbacks?.onNetworkActivity?.(\"sent\", { type: \"end\" });\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 if (this.#closeTimeout) {\n clearTimeout(this.#closeTimeout);\n this.#closeTimeout = undefined;\n }\n\n if (this.#webSocket?.readyState === WebSocket.OPEN) {\n this.#webSocket.close();\n }\n\n this.#webSocket = null;\n this.#cortiClient = null;\n this.#lastDictationConfig = null;\n this.#lastSocketUrl = undefined;\n this.#lastSocketProxy = undefined;\n }\n}\n"]}
|
|
@@ -9,7 +9,7 @@ export declare class MediaController implements ReactiveController {
|
|
|
9
9
|
host: MediaControllerHost;
|
|
10
10
|
constructor(host: MediaControllerHost);
|
|
11
11
|
hostDisconnected(): void;
|
|
12
|
-
initialize(
|
|
12
|
+
initialize(onTrackEnded?: () => void): Promise<void>;
|
|
13
13
|
getAudioLevel(): number;
|
|
14
14
|
startAudioLevelMonitoring(onAudioLevelChange?: (level: number) => void): void;
|
|
15
15
|
stopAudioLevelMonitoring(): void;
|
|
@@ -19,6 +19,8 @@ export declare class MediaController implements ReactiveController {
|
|
|
19
19
|
* This ensures the final ondataavailable event fires before resolving.
|
|
20
20
|
*/
|
|
21
21
|
stopRecording(): Promise<void>;
|
|
22
|
+
addDataHandler(handler: (data: Blob) => void): void;
|
|
23
|
+
removeDataHandler(): void;
|
|
22
24
|
get mediaRecorder(): MediaRecorder | null;
|
|
23
25
|
get audioLevel(): number;
|
|
24
26
|
}
|
|
@@ -9,7 +9,8 @@ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (
|
|
|
9
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
10
|
return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
|
|
11
11
|
};
|
|
12
|
-
var _MediaController_mediaStream, _MediaController_audioContext, _MediaController_analyser, _MediaController_mediaRecorder, _MediaController_visualiserInterval, _MediaController_audioLevel, _MediaController_onTrackEnded, _MediaController_onAudioLevelChange, _MediaController_dataHandler;
|
|
12
|
+
var _MediaController_mediaStream, _MediaController_audioContext, _MediaController_analyser, _MediaController_mediaRecorder, _MediaController_visualiserInterval, _MediaController_audioLevel, _MediaController_onTrackEnded, _MediaController_onAudioLevelChange, _MediaController_dataHandler, _MediaController_bufferedChunks;
|
|
13
|
+
import { errorEvent } from "../utils/events.js";
|
|
13
14
|
import { calculateAudioLevel, createAudioAnalyzer, getMediaStream, } from "../utils/media.js";
|
|
14
15
|
export class MediaController {
|
|
15
16
|
constructor(host) {
|
|
@@ -22,15 +23,15 @@ export class MediaController {
|
|
|
22
23
|
_MediaController_onTrackEnded.set(this, void 0);
|
|
23
24
|
_MediaController_onAudioLevelChange.set(this, void 0);
|
|
24
25
|
_MediaController_dataHandler.set(this, void 0);
|
|
26
|
+
_MediaController_bufferedChunks.set(this, []);
|
|
25
27
|
this.host = host;
|
|
26
28
|
host.addController(this);
|
|
27
29
|
}
|
|
28
30
|
hostDisconnected() {
|
|
29
31
|
this.cleanup();
|
|
30
32
|
}
|
|
31
|
-
async initialize(
|
|
33
|
+
async initialize(onTrackEnded) {
|
|
32
34
|
await this.cleanup();
|
|
33
|
-
__classPrivateFieldSet(this, _MediaController_dataHandler, dataHandler, "f");
|
|
34
35
|
__classPrivateFieldSet(this, _MediaController_onTrackEnded, onTrackEnded, "f");
|
|
35
36
|
__classPrivateFieldSet(this, _MediaController_mediaStream, await getMediaStream(this.host._selectedDevice?.deviceId, this.host._debug_displayAudio), "f");
|
|
36
37
|
__classPrivateFieldGet(this, _MediaController_mediaStream, "f").getTracks().forEach((track) => {
|
|
@@ -47,7 +48,9 @@ export class MediaController {
|
|
|
47
48
|
__classPrivateFieldGet(this, _MediaController_mediaRecorder, "f").ondataavailable = (event) => {
|
|
48
49
|
if (__classPrivateFieldGet(this, _MediaController_dataHandler, "f")) {
|
|
49
50
|
__classPrivateFieldGet(this, _MediaController_dataHandler, "f").call(this, event.data);
|
|
51
|
+
return;
|
|
50
52
|
}
|
|
53
|
+
__classPrivateFieldGet(this, _MediaController_bufferedChunks, "f").push(event.data);
|
|
51
54
|
};
|
|
52
55
|
}
|
|
53
56
|
getAudioLevel() {
|
|
@@ -98,6 +101,7 @@ export class MediaController {
|
|
|
98
101
|
__classPrivateFieldSet(this, _MediaController_onTrackEnded, undefined, "f");
|
|
99
102
|
__classPrivateFieldSet(this, _MediaController_onAudioLevelChange, undefined, "f");
|
|
100
103
|
__classPrivateFieldSet(this, _MediaController_dataHandler, undefined, "f");
|
|
104
|
+
__classPrivateFieldSet(this, _MediaController_bufferedChunks, [], "f");
|
|
101
105
|
}
|
|
102
106
|
/**
|
|
103
107
|
* Stops the media recorder and waits for all buffered data to be flushed.
|
|
@@ -115,6 +119,20 @@ export class MediaController {
|
|
|
115
119
|
__classPrivateFieldGet(this, _MediaController_mediaRecorder, "f").stop();
|
|
116
120
|
});
|
|
117
121
|
}
|
|
122
|
+
addDataHandler(handler) {
|
|
123
|
+
for (const chunk of __classPrivateFieldGet(this, _MediaController_bufferedChunks, "f")) {
|
|
124
|
+
handler(chunk);
|
|
125
|
+
}
|
|
126
|
+
__classPrivateFieldSet(this, _MediaController_bufferedChunks, [], "f");
|
|
127
|
+
__classPrivateFieldSet(this, _MediaController_dataHandler, handler, "f");
|
|
128
|
+
}
|
|
129
|
+
removeDataHandler() {
|
|
130
|
+
if (__classPrivateFieldGet(this, _MediaController_bufferedChunks, "f").length > 0) {
|
|
131
|
+
this.host.dispatchEvent(errorEvent("Connection timeout: server did not respond in time. Buffered audio was not processed."));
|
|
132
|
+
__classPrivateFieldSet(this, _MediaController_bufferedChunks, [], "f");
|
|
133
|
+
}
|
|
134
|
+
__classPrivateFieldSet(this, _MediaController_dataHandler, undefined, "f");
|
|
135
|
+
}
|
|
118
136
|
get mediaRecorder() {
|
|
119
137
|
return __classPrivateFieldGet(this, _MediaController_mediaRecorder, "f");
|
|
120
138
|
}
|
|
@@ -122,5 +140,5 @@ export class MediaController {
|
|
|
122
140
|
return __classPrivateFieldGet(this, _MediaController_audioLevel, "f");
|
|
123
141
|
}
|
|
124
142
|
}
|
|
125
|
-
_MediaController_mediaStream = new WeakMap(), _MediaController_audioContext = new WeakMap(), _MediaController_analyser = new WeakMap(), _MediaController_mediaRecorder = new WeakMap(), _MediaController_visualiserInterval = new WeakMap(), _MediaController_audioLevel = new WeakMap(), _MediaController_onTrackEnded = new WeakMap(), _MediaController_onAudioLevelChange = new WeakMap(), _MediaController_dataHandler = new WeakMap();
|
|
143
|
+
_MediaController_mediaStream = new WeakMap(), _MediaController_audioContext = new WeakMap(), _MediaController_analyser = new WeakMap(), _MediaController_mediaRecorder = new WeakMap(), _MediaController_visualiserInterval = new WeakMap(), _MediaController_audioLevel = new WeakMap(), _MediaController_onTrackEnded = new WeakMap(), _MediaController_onAudioLevelChange = new WeakMap(), _MediaController_dataHandler = new WeakMap(), _MediaController_bufferedChunks = new WeakMap();
|
|
126
144
|
//# sourceMappingURL=media-controller.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"media-controller.js","sourceRoot":"","sources":["../../src/controllers/media-controller.ts"],"names":[],"mappings":";;;;;;;;;;;;AACA,OAAO,EACL,mBAAmB,EACnB,mBAAmB,EACnB,cAAc,GACf,MAAM,mBAAmB,CAAC;AAQ3B,MAAM,OAAO,eAAe;
|
|
1
|
+
{"version":3,"file":"media-controller.js","sourceRoot":"","sources":["../../src/controllers/media-controller.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ReactiveController, ReactiveControllerHost } from \"lit\";\nimport { errorEvent } from \"../utils/events.js\";\nimport {\n calculateAudioLevel,\n createAudioAnalyzer,\n getMediaStream,\n} from \"../utils/media.js\";\n\ninterface MediaControllerHost extends ReactiveControllerHost {\n _selectedDevice?: MediaDeviceInfo;\n _debug_displayAudio?: boolean;\n dispatchEvent(event: Event): boolean;\n}\n\nexport class MediaController implements ReactiveController {\n host: MediaControllerHost;\n\n #mediaStream: MediaStream | null = null;\n #audioContext: AudioContext | null = null;\n #analyser: AnalyserNode | null = null;\n #mediaRecorder: MediaRecorder | null = null;\n #visualiserInterval?: number;\n #audioLevel: number = 0;\n #onTrackEnded?: () => void;\n #onAudioLevelChange?: (level: number) => void;\n #dataHandler?: (data: Blob) => void;\n #bufferedChunks: Blob[] = [];\n\n constructor(host: MediaControllerHost) {\n this.host = host;\n host.addController(this);\n }\n\n hostDisconnected(): void {\n this.cleanup();\n }\n\n async initialize(onTrackEnded?: () => void): Promise<void> {\n await this.cleanup();\n\n this.#onTrackEnded = onTrackEnded;\n this.#mediaStream = await getMediaStream(\n this.host._selectedDevice?.deviceId,\n this.host._debug_displayAudio,\n );\n\n this.#mediaStream.getTracks().forEach((track: MediaStreamTrack) => {\n track.addEventListener(\"ended\", () => {\n if (this.#onTrackEnded) {\n this.#onTrackEnded();\n }\n });\n });\n\n const { audioContext, analyser } = createAudioAnalyzer(this.#mediaStream);\n\n this.#audioContext = audioContext;\n this.#analyser = analyser;\n\n this.#mediaRecorder = new MediaRecorder(this.#mediaStream);\n this.#mediaRecorder.ondataavailable = (event) => {\n if (this.#dataHandler) {\n this.#dataHandler(event.data);\n return;\n }\n\n this.#bufferedChunks.push(event.data);\n };\n }\n\n getAudioLevel(): number {\n return this.#analyser ? calculateAudioLevel(this.#analyser) : 0;\n }\n\n startAudioLevelMonitoring(\n onAudioLevelChange?: (level: number) => void,\n ): void {\n this.stopAudioLevelMonitoring();\n\n this.#onAudioLevelChange = onAudioLevelChange;\n\n this.#visualiserInterval = window.setInterval(() => {\n this.#audioLevel = this.getAudioLevel() * 3;\n this.host.requestUpdate();\n\n if (this.#onAudioLevelChange) {\n this.#onAudioLevelChange(this.#audioLevel);\n }\n }, 150);\n }\n\n stopAudioLevelMonitoring(): void {\n if (this.#visualiserInterval) {\n clearInterval(this.#visualiserInterval);\n this.#visualiserInterval = undefined;\n }\n\n this.#audioLevel = 0;\n this.host.requestUpdate();\n\n if (this.#onAudioLevelChange) {\n this.#onAudioLevelChange(this.#audioLevel);\n }\n }\n\n async cleanup(): Promise<void> {\n this.stopAudioLevelMonitoring();\n\n if (this.#mediaRecorder?.state === \"recording\") {\n this.#mediaRecorder.stop();\n }\n\n if (this.#mediaRecorder) {\n this.#mediaRecorder.ondataavailable = null;\n }\n\n if (this.#mediaStream) {\n this.#mediaStream.getTracks().forEach((track) => {\n track.stop();\n });\n this.#mediaStream = null;\n }\n\n if (this.#audioContext && this.#audioContext.state !== \"closed\") {\n await this.#audioContext.close();\n }\n\n this.#audioContext = null;\n\n this.#analyser = null;\n this.#mediaRecorder = null;\n this.#onTrackEnded = undefined;\n this.#onAudioLevelChange = undefined;\n this.#dataHandler = undefined;\n this.#bufferedChunks = [];\n }\n\n /**\n * Stops the media recorder and waits for all buffered data to be flushed.\n * This ensures the final ondataavailable event fires before resolving.\n */\n async stopRecording(): Promise<void> {\n return new Promise<void>((resolve) => {\n if (!this.#mediaRecorder || this.#mediaRecorder.state !== \"recording\") {\n resolve();\n return;\n }\n\n this.#mediaRecorder.onstop = () => {\n resolve();\n };\n\n this.#mediaRecorder.stop();\n });\n }\n\n addDataHandler(handler: (data: Blob) => void): void {\n for (const chunk of this.#bufferedChunks) {\n handler(chunk);\n }\n\n this.#bufferedChunks = [];\n this.#dataHandler = handler;\n }\n\n removeDataHandler(): void {\n if (this.#bufferedChunks.length > 0) {\n this.host.dispatchEvent(\n errorEvent(\n \"Connection timeout: server did not respond in time. Buffered audio was not processed.\",\n ),\n );\n this.#bufferedChunks = [];\n }\n\n this.#dataHandler = undefined;\n }\n\n get mediaRecorder(): MediaRecorder | null {\n return this.#mediaRecorder;\n }\n\n get audioLevel(): number {\n return this.#audioLevel;\n }\n}\n"]}
|
package/dist/icons/icons.d.ts
CHANGED
package/dist/icons/icons.js
CHANGED
|
@@ -5,8 +5,8 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
|
|
|
5
5
|
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
6
|
};
|
|
7
7
|
/* eslint-disable max-classes-per-file */
|
|
8
|
-
import { css, html
|
|
9
|
-
import { customElement } from
|
|
8
|
+
import { LitElement, css, html } from 'lit';
|
|
9
|
+
import { customElement } from 'lit/decorators.js';
|
|
10
10
|
let IconMicOn = class IconMicOn extends LitElement {
|
|
11
11
|
render() {
|
|
12
12
|
return html `
|
|
@@ -32,7 +32,7 @@ let IconMicOn = class IconMicOn extends LitElement {
|
|
|
32
32
|
}
|
|
33
33
|
};
|
|
34
34
|
IconMicOn = __decorate([
|
|
35
|
-
customElement(
|
|
35
|
+
customElement('icon-mic-on')
|
|
36
36
|
], IconMicOn);
|
|
37
37
|
export { IconMicOn };
|
|
38
38
|
let IconMicOff = class IconMicOff extends LitElement {
|
|
@@ -61,7 +61,7 @@ let IconMicOff = class IconMicOff extends LitElement {
|
|
|
61
61
|
}
|
|
62
62
|
};
|
|
63
63
|
IconMicOff = __decorate([
|
|
64
|
-
customElement(
|
|
64
|
+
customElement('icon-mic-off')
|
|
65
65
|
], IconMicOff);
|
|
66
66
|
export { IconMicOff };
|
|
67
67
|
let IconRecording = class IconRecording extends LitElement {
|
|
@@ -88,7 +88,7 @@ let IconRecording = class IconRecording extends LitElement {
|
|
|
88
88
|
}
|
|
89
89
|
};
|
|
90
90
|
IconRecording = __decorate([
|
|
91
|
-
customElement(
|
|
91
|
+
customElement('icon-recording')
|
|
92
92
|
], IconRecording);
|
|
93
93
|
export { IconRecording };
|
|
94
94
|
let IconSettings = class IconSettings extends LitElement {
|
|
@@ -115,7 +115,7 @@ let IconSettings = class IconSettings extends LitElement {
|
|
|
115
115
|
}
|
|
116
116
|
};
|
|
117
117
|
IconSettings = __decorate([
|
|
118
|
-
customElement(
|
|
118
|
+
customElement('icon-settings')
|
|
119
119
|
], IconSettings);
|
|
120
120
|
export { IconSettings };
|
|
121
121
|
let IconLoadingSpinner = class IconLoadingSpinner extends LitElement {
|
|
@@ -152,7 +152,7 @@ IconLoadingSpinner.styles = css `
|
|
|
152
152
|
}
|
|
153
153
|
`;
|
|
154
154
|
IconLoadingSpinner = __decorate([
|
|
155
|
-
customElement(
|
|
155
|
+
customElement('icon-loading-spinner')
|
|
156
156
|
], IconLoadingSpinner);
|
|
157
157
|
export { IconLoadingSpinner };
|
|
158
158
|
//# sourceMappingURL=icons.js.map
|
package/dist/icons/icons.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"icons.js","sourceRoot":"","sources":["../../src/icons/icons.ts"],"names":[],"mappings":";;;;;;AAAA,yCAAyC;AACzC,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"icons.js","sourceRoot":"","sources":["../../src/icons/icons.ts"],"names":[],"mappings":";;;;;;AAAA,yCAAyC;AACzC,OAAO,EAAE,UAAU,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAG3C,IAAM,SAAS,GAAf,MAAM,SAAU,SAAQ,UAAU;IACvC,MAAM;QACJ,OAAO,IAAI,CAAA;;;;;;;;;;;;;;;;;;;KAmBV,CAAC;IACJ,CAAC;CACF,CAAA;AAvBY,SAAS;IADrB,aAAa,CAAC,aAAa,CAAC;GAChB,SAAS,CAuBrB;;AAGM,IAAM,UAAU,GAAhB,MAAM,UAAW,SAAQ,UAAU;IACxC,MAAM;QACJ,OAAO,IAAI,CAAA;;;;;;;;;;;;;;;;;;;;WAoBJ,CAAC;IACV,CAAC;CACF,CAAA;AAxBY,UAAU;IADtB,aAAa,CAAC,cAAc,CAAC;GACjB,UAAU,CAwBtB;;AAGM,IAAM,aAAa,GAAnB,MAAM,aAAc,SAAQ,UAAU;IAC3C,MAAM;QACJ,OAAO,IAAI,CAAA;;;;;;;;;;;;;;;;;;KAkBV,CAAC;IACJ,CAAC;CACF,CAAA;AAtBY,aAAa;IADzB,aAAa,CAAC,gBAAgB,CAAC;GACnB,aAAa,CAsBzB;;AAEM,IAAM,YAAY,GAAlB,MAAM,YAAa,SAAQ,UAAU;IAC1C,MAAM;QACJ,OAAO,IAAI,CAAA;;;;;;;;;;;;;;;;;;WAkBJ,CAAC;IACV,CAAC;CACF,CAAA;AAtBY,YAAY;IADxB,aAAa,CAAC,eAAe,CAAC;GAClB,YAAY,CAsBxB;;AAGM,IAAM,kBAAkB,GAAxB,MAAM,kBAAmB,SAAQ,UAAU;IAehD,MAAM;QACJ,OAAO,IAAI,CAAA;;;;;;;;;;;;;;;WAeJ,CAAC;IACV,CAAC;;AA/BM,yBAAM,GAAG,GAAG,CAAA;;;;;;;;;;;;GAYlB,AAZY,CAYX;AAbS,kBAAkB;IAD9B,aAAa,CAAC,sBAAsB,CAAC;GACzB,kBAAkB,CAiC9B","sourcesContent":["/* eslint-disable max-classes-per-file */\nimport { LitElement, css, html } from 'lit';\nimport { customElement } from 'lit/decorators.js';\n\n@customElement('icon-mic-on')\nexport class IconMicOn extends LitElement {\n render() {\n return html`\n <div style=\"display: flex\">\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"20\"\n height=\"20\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n class=\"lucide lucide-mic\"\n >\n <path d=\"M12 2a3 3 0 0 0-3 3v7a3 3 0 0 0 6 0V5a3 3 0 0 0-3-3Z\" />\n <path d=\"M19 10v2a7 7 0 0 1-14 0v-2\" />\n <line x1=\"12\" x2=\"12\" y1=\"19\" y2=\"22\" />\n </svg>\n </div>\n `;\n }\n}\n\n@customElement('icon-mic-off')\nexport class IconMicOff extends LitElement {\n render() {\n return html` <div style=\"display: flex\">\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"20\"\n height=\"20\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n class=\"lucide lucide-mic-off\"\n >\n <line x1=\"2\" x2=\"22\" y1=\"2\" y2=\"22\" />\n <path d=\"M18.89 13.23A7.12 7.12 0 0 0 19 12v-2\" />\n <path d=\"M5 10v2a7 7 0 0 0 12 5\" />\n <path d=\"M15 9.34V5a3 3 0 0 0-5.68-1.33\" />\n <path d=\"M9 9v3a3 3 0 0 0 5.12 2.12\" />\n <line x1=\"12\" x2=\"12\" y1=\"19\" y2=\"22\" />\n </svg>\n </div>`;\n }\n}\n\n@customElement('icon-recording')\nexport class IconRecording extends LitElement {\n render() {\n return html`\n <div style=\"display: flex;\">\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"20\"\n height=\"20\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n class=\"lucide lucide-circle-stop\"\n >\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n <rect x=\"9\" y=\"9\" width=\"6\" height=\"6\" rx=\"1\" fill=\"currentColor\" />\n </svg>\n </div>\n `;\n }\n}\n@customElement('icon-settings')\nexport class IconSettings extends LitElement {\n render() {\n return html`<div style=\"display: flex\">\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"20\"\n height=\"20\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n class=\"lucide lucide-settings-2\"\n >\n <path d=\"M20 7h-9\" />\n <path d=\"M14 17H5\" />\n <circle cx=\"17\" cy=\"17\" r=\"3\" />\n <circle cx=\"7\" cy=\"7\" r=\"3\" />\n </svg>\n </div>`;\n }\n}\n\n@customElement('icon-loading-spinner')\nexport class IconLoadingSpinner extends LitElement {\n static styles = css`\n @keyframes spin {\n 0% {\n transform: rotate(0deg);\n }\n 100% {\n transform: rotate(360deg);\n }\n }\n .spin {\n animation: spin 1s linear infinite;\n }\n `;\n\n render() {\n return html`<div style=\"display: flex\">\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"20\"\n height=\"20\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n class=\"lucide lucide-loader-circle spin\"\n >\n <path d=\"M21 12a9 9 0 1 1-6.219-8.56\" />\n </svg>\n </div>`;\n }\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"audio-visualiser.js","sourceRoot":"","sources":["../../src/styles/audio-visualiser.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,KAAK,CAAC;AAE1B,MAAM,qBAAqB,GAAG,GAAG,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA6BhC,CAAC;AAEF,eAAe,qBAAqB,CAAC","sourcesContent":["import { css } from \"lit\";\n\nconst AudioVisualiserStyles = css`\n :host {\n height: 100%;\n }\n\n .container {\n display: flex;\n width: 8px;\n flex-direction: column-reverse; /* Bottom-up stacking */\n height: 100%;\n gap: 1px;\n opacity: 0.5;\n\n &.active {\n opacity: 1;\n }\n }\n\n .segment {\n flex: 1;\n background-color: var(--action-accent-text-color, light-dark(#fff, #fff));\n transition: background-color 0.25s;\n border-radius: 1px;\n opacity: 0.5;\n }\n\n .segment.active {\n opacity: 1;\n }\n`;\n\nexport default AudioVisualiserStyles;\n"]}
|
|
1
|
+
{"version":3,"file":"audio-visualiser.js","sourceRoot":"","sources":["../../src/styles/audio-visualiser.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,KAAK,CAAC;AAE1B,MAAM,qBAAqB,GAAG,GAAG,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA6BhC,CAAC;AAEF,eAAe,qBAAqB,CAAC","sourcesContent":["import { css } from \"lit\";\n\nconst AudioVisualiserStyles = css`\n :host {\n height: 100%;\n }\n\n .container {\n display: flex;\n width: 8px;\n flex-direction: column-reverse; /* Bottom-up stacking */\n height: 100%;\n gap: 1px;\n opacity: 0.5;\n\n &.active {\n opacity: 1;\n }\n }\n\n .segment {\n flex: 1;\n background-color: var(--action-accent-text-color, light-dark(#fff, #fff));\n transition: background-color 0.25s;\n border-radius: 1px;\n opacity: 0.5;\n }\n\n .segment.active {\n opacity: 1;\n }\n`;\n\nexport default AudioVisualiserStyles;\n\n"]}
|
package/dist/styles/callout.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"callout.js","sourceRoot":"","sources":["../../src/styles/callout.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,KAAK,CAAC;AAE1B,MAAM,aAAa,GAAG,GAAG,CAAA;;;;;;;;;;;;;;;;;;;CAmBxB,CAAC;AAEF,eAAe,aAAa,CAAC","sourcesContent":["import { css } from
|
|
1
|
+
{"version":3,"file":"callout.js","sourceRoot":"","sources":["../../src/styles/callout.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,KAAK,CAAC;AAE1B,MAAM,aAAa,GAAG,GAAG,CAAA;;;;;;;;;;;;;;;;;;;CAmBxB,CAAC;AAEF,eAAe,aAAa,CAAC","sourcesContent":["import { css } from 'lit';\n\nconst CalloutStyles = css`\n .callout {\n background: var(--callout-info-background, light-dark(#007bff33, #0056b333));\n border: 1px solid var(--callout-info-border, light-dark(#007bff99, #0056b399));\n color: var(--callout-info-text, light-dark(#007bff, #0056b3));\n padding: 8px;\n border-radius: var(--card-inner-border-radius, 6px);\n display: flex;\n font-size: 0.9rem;\n gap: 8px;\n align-items: center;\n max-width: 100%;\n height: fit-content;\n &.warn {\n background: var(--callout-warn-background, light-dark(#fd7e1433, #e06c1233));\n border: 1px solid var(--callout-warn-border, light-dark(#fd7e1499, #e06c1299));\n color: var(--callout-warn-text, light-dark(#fd7e14, #e06c12));\n }\n }\n`;\n\nexport default CalloutStyles;\n"]}
|