@corti/dictation-web 0.1.19-rc → 0.1.19

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.
@@ -0,0 +1,14 @@
1
+ import type { DictationConfig, ServerConfig } from './types.js';
2
+ export declare class DictationServiceSpeechMatics extends EventTarget {
3
+ private mediaRecorder;
4
+ private webSocket;
5
+ private serverConfig;
6
+ private dictationConfig;
7
+ constructor(mediaStream: MediaStream, { dictationConfig, serverConfig, }: {
8
+ dictationConfig: DictationConfig;
9
+ serverConfig: ServerConfig;
10
+ });
11
+ private dispatchCustomEvent;
12
+ startRecording(): void;
13
+ stopRecording(): Promise<void>;
14
+ }
@@ -0,0 +1,80 @@
1
+ export class DictationServiceSpeechMatics extends EventTarget {
2
+ constructor(mediaStream, { dictationConfig, serverConfig, }) {
3
+ super();
4
+ this.mediaRecorder = new MediaRecorder(mediaStream);
5
+ this.serverConfig = serverConfig;
6
+ this.dictationConfig = dictationConfig;
7
+ this.mediaRecorder.ondataavailable = event => {
8
+ if (this.webSocket?.readyState === WebSocket.OPEN) {
9
+ this.webSocket.send(event.data);
10
+ }
11
+ };
12
+ }
13
+ dispatchCustomEvent(eventName, detail) {
14
+ this.dispatchEvent(new CustomEvent(eventName, {
15
+ detail,
16
+ bubbles: true,
17
+ composed: true,
18
+ }));
19
+ }
20
+ startRecording() {
21
+ if (!this.serverConfig) {
22
+ this.dispatchEvent(new CustomEvent('error', {
23
+ detail: 'Invalid token',
24
+ bubbles: true,
25
+ composed: true,
26
+ }));
27
+ return;
28
+ }
29
+ const url = `wss://api.${this.serverConfig.environment}.corti.app/audio-bridge/v2/transcribe?tenant-name=${this.serverConfig.tenant}&token=Bearer%20${this.serverConfig.accessToken}`;
30
+ this.webSocket = new WebSocket(url);
31
+ this.webSocket.onopen = () => {
32
+ this.webSocket.send(JSON.stringify({
33
+ type: 'config',
34
+ configuration: this.dictationConfig,
35
+ }));
36
+ };
37
+ this.webSocket.onmessage = event => {
38
+ const message = JSON.parse(event.data);
39
+ switch (message.type) {
40
+ case 'CONFIG_ACCEPTED':
41
+ this.mediaRecorder.start(250);
42
+ break;
43
+ case 'CONFIG_DENIED':
44
+ this.dispatchCustomEvent('error', message);
45
+ return this.stopRecording();
46
+ case 'transcript':
47
+ this.dispatchCustomEvent('transcript', message);
48
+ break;
49
+ case 'command':
50
+ this.dispatchCustomEvent('command', message);
51
+ break;
52
+ default:
53
+ console.warn(`Unhandled message type: ${message.type}`);
54
+ break;
55
+ }
56
+ };
57
+ this.webSocket.onerror = event => {
58
+ this.dispatchCustomEvent('error', event);
59
+ };
60
+ this.webSocket.onclose = event => {
61
+ this.dispatchCustomEvent('stream-closed', event);
62
+ };
63
+ }
64
+ async stopRecording() {
65
+ this.mediaRecorder?.stop();
66
+ if (this.webSocket?.readyState === WebSocket.OPEN) {
67
+ this.webSocket.send(JSON.stringify({ type: 'end' }));
68
+ }
69
+ const timeout = setTimeout(() => {
70
+ if (this.webSocket?.readyState === WebSocket.OPEN) {
71
+ this.webSocket.close();
72
+ }
73
+ }, 10000);
74
+ this.webSocket.onclose = () => {
75
+ this.webSocket?.close();
76
+ clearTimeout(timeout);
77
+ };
78
+ }
79
+ }
80
+ //# sourceMappingURL=DictationServiceSM.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DictationServiceSM.js","sourceRoot":"","sources":["../src/DictationServiceSM.ts"],"names":[],"mappings":"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","sourcesContent":["import type { DictationConfig, ServerConfig } from './types.js';\n\nexport class DictationServiceSpeechMatics extends EventTarget {\n private mediaRecorder: MediaRecorder;\n private webSocket!: WebSocket;\n private serverConfig: ServerConfig;\n private dictationConfig: DictationConfig;\n\n constructor(\n mediaStream: MediaStream,\n {\n dictationConfig,\n serverConfig,\n }: { dictationConfig: DictationConfig; serverConfig: ServerConfig },\n ) {\n super();\n this.mediaRecorder = new MediaRecorder(mediaStream);\n this.serverConfig = serverConfig;\n this.dictationConfig = dictationConfig;\n\n this.mediaRecorder.ondataavailable = event => {\n if (this.webSocket?.readyState === WebSocket.OPEN) {\n this.webSocket.send(event.data);\n }\n };\n }\n\n private dispatchCustomEvent(eventName: string, detail?: unknown): void {\n this.dispatchEvent(\n new CustomEvent(eventName, {\n detail,\n bubbles: true,\n composed: true,\n }),\n );\n }\n\n public startRecording() {\n if (!this.serverConfig) {\n this.dispatchEvent(\n new CustomEvent('error', {\n detail: 'Invalid token',\n bubbles: true,\n composed: true,\n }),\n );\n return;\n }\n\n const url = `wss://api.${this.serverConfig.environment}.corti.app/audio-bridge/v2/transcribe?tenant-name=${this.serverConfig.tenant}&token=Bearer%20${this.serverConfig.accessToken}`;\n this.webSocket = new WebSocket(url);\n\n this.webSocket.onopen = () => {\n this.webSocket.send(\n JSON.stringify({\n type: 'config',\n configuration: this.dictationConfig,\n }),\n );\n };\n\n this.webSocket.onmessage = event => {\n const message = JSON.parse(event.data);\n switch (message.type) {\n case 'CONFIG_ACCEPTED':\n this.mediaRecorder.start(250);\n break;\n case 'CONFIG_DENIED':\n this.dispatchCustomEvent('error', message);\n return this.stopRecording();\n case 'transcript':\n this.dispatchCustomEvent('transcript', message);\n break;\n case 'command':\n this.dispatchCustomEvent('command', message);\n break;\n default:\n console.warn(`Unhandled message type: ${message.type}`);\n break;\n }\n };\n\n this.webSocket.onerror = event => {\n this.dispatchCustomEvent('error', event);\n };\n\n this.webSocket.onclose = event => {\n this.dispatchCustomEvent('stream-closed', event);\n };\n }\n\n public async stopRecording(): Promise<void> {\n this.mediaRecorder?.stop();\n\n if (this.webSocket?.readyState === WebSocket.OPEN) {\n this.webSocket.send(JSON.stringify({ type: 'end' }));\n }\n\n const timeout: NodeJS.Timeout = setTimeout(() => {\n if (this.webSocket?.readyState === WebSocket.OPEN) {\n this.webSocket.close();\n }\n }, 10000);\n\n this.webSocket.onclose = () => {\n this.webSocket?.close();\n clearTimeout(timeout);\n };\n }\n}\n"]}
@@ -0,0 +1 @@
1
+ export {};
@@ -1,2 +1,2 @@
1
- "use strict";
1
+ export {};
2
2
  //# sourceMappingURL=index.js.map
package/package.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "name": "@corti/dictation-web",
3
3
  "description": "Web component for Corti Dictation",
4
4
  "author": "Corti ApS",
5
- "version": "0.1.19-rc",
5
+ "version": "0.1.19",
6
6
  "license": "MIT",
7
7
  "type": "module",
8
8
  "main": "dist/index.js",