ugly-app 0.1.284 → 0.1.285
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/cli/version.d.ts +1 -1
- package/dist/cli/version.js +1 -1
- package/dist/client/audio/useSTT.d.ts.map +1 -1
- package/dist/client/audio/useSTT.js +12 -10
- package/dist/client/audio/useSTT.js.map +1 -1
- package/dist/client/bootstrapApp.js +1 -1
- package/dist/client/bootstrapApp.js.map +1 -1
- package/dist/client/uglyBotSocket.d.ts +1 -1
- package/dist/client/uglyBotSocket.d.ts.map +1 -1
- package/dist/client/uglyBotSocket.js +12 -9
- package/dist/client/uglyBotSocket.js.map +1 -1
- package/package.json +1 -1
- package/src/cli/version.ts +1 -1
- package/src/client/audio/useSTT.ts +12 -9
- package/src/client/bootstrapApp.tsx +1 -1
- package/src/client/uglyBotSocket.ts +13 -12
- package/templates/client/pages/AudioTestPage.tsx +23 -17
package/dist/cli/version.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export declare const CLI_VERSION = "0.1.
|
|
1
|
+
export declare const CLI_VERSION = "0.1.285";
|
|
2
2
|
//# sourceMappingURL=version.d.ts.map
|
package/dist/cli/version.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useSTT.d.ts","sourceRoot":"","sources":["../../../src/client/audio/useSTT.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAGzD,UAAU,UAAU;IAClB,IAAI,CAAC,EAAE,UAAU,GAAG,OAAO,GAAG,MAAM,CAAC;IACrC,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAID,wBAAgB,MAAM,CAAC,MAAM,EAAE,aAAa,EAAE,OAAO,GAAE,UAAe;;;;;;;
|
|
1
|
+
{"version":3,"file":"useSTT.d.ts","sourceRoot":"","sources":["../../../src/client/audio/useSTT.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAGzD,UAAU,UAAU;IAClB,IAAI,CAAC,EAAE,UAAU,GAAG,OAAO,GAAG,MAAM,CAAC;IACrC,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAID,wBAAgB,MAAM,CAAC,MAAM,EAAE,aAAa,EAAE,OAAO,GAAE,UAAe;;;;;;;EAkIrE"}
|
|
@@ -30,10 +30,20 @@ export function useSTT(socket, options = {}) {
|
|
|
30
30
|
setListening(true);
|
|
31
31
|
const mode = options.mode ?? 'auto';
|
|
32
32
|
console.log(`[STT] start streamId=${streamId} mode=${mode} lang=${options.lang ?? 'auto'}`);
|
|
33
|
+
// Start mic acquisition in parallel with socket connection for faster startup
|
|
34
|
+
if (!recorderRef.current)
|
|
35
|
+
recorderRef.current = new AudioRecorder();
|
|
36
|
+
let chunkCount = 0;
|
|
37
|
+
const micReady = recorderRef.current.start((audio) => {
|
|
38
|
+
chunkCount++;
|
|
39
|
+
if (chunkCount <= 3 || chunkCount % 50 === 0) {
|
|
40
|
+
console.log(`[STT] audio chunk #${chunkCount} (${audio.length} b64 chars)`);
|
|
41
|
+
}
|
|
42
|
+
socket.send('stt:audio', { streamId, audio });
|
|
43
|
+
});
|
|
33
44
|
await socket.acquire();
|
|
34
45
|
console.log('[STT] socket acquired');
|
|
35
46
|
cleanupListeners();
|
|
36
|
-
let chunkCount = 0;
|
|
37
47
|
unsubsRef.current.push(socket.on('stt:ready', (data) => {
|
|
38
48
|
if (data.streamId !== streamId)
|
|
39
49
|
return;
|
|
@@ -86,15 +96,7 @@ export function useSTT(socket, options = {}) {
|
|
|
86
96
|
console.log('[STT] cancelled before recording started');
|
|
87
97
|
return;
|
|
88
98
|
}
|
|
89
|
-
|
|
90
|
-
recorderRef.current = new AudioRecorder();
|
|
91
|
-
await recorderRef.current.start((audio) => {
|
|
92
|
-
chunkCount++;
|
|
93
|
-
if (chunkCount <= 3 || chunkCount % 50 === 0) {
|
|
94
|
-
console.log(`[STT] audio chunk #${chunkCount} (${audio.length} b64 chars)`);
|
|
95
|
-
}
|
|
96
|
-
socket.send('stt:audio', { streamId, audio });
|
|
97
|
-
});
|
|
99
|
+
await micReady;
|
|
98
100
|
console.log('[STT] recording started');
|
|
99
101
|
}, [socket, listening, options.mode, options.lang]);
|
|
100
102
|
const stop = useCallback(() => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useSTT.js","sourceRoot":"","sources":["../../../src/client/audio/useSTT.ts"],"names":[],"mappings":"AAAA,6BAA6B;AAC7B,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAEjE,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAOnD,IAAI,UAAU,GAAG,CAAC,CAAC;AAEnB,MAAM,UAAU,MAAM,CAAC,MAAqB,EAAE,UAAsB,EAAE;IACpE,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAC;IACjD,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC9C,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAClD,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAgB,IAAI,CAAC,CAAC;IAExD,MAAM,WAAW,GAAG,MAAM,CAAuB,IAAI,CAAC,CAAC;IACvD,MAAM,WAAW,GAAG,MAAM,CAAgB,IAAI,CAAC,CAAC;IAChD,MAAM,QAAQ,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;IAC/B,MAAM,YAAY,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;IACnC,MAAM,SAAS,GAAG,MAAM,CAAiB,EAAE,CAAC,CAAC;IAE7C,SAAS,gBAAgB;QACvB,KAAK,MAAM,KAAK,IAAI,SAAS,CAAC,OAAO;YAAE,KAAK,EAAE,CAAC;QAC/C,SAAS,CAAC,OAAO,GAAG,EAAE,CAAC;IACzB,CAAC;IAED,MAAM,KAAK,GAAG,WAAW,CAAC,KAAK,IAAI,EAAE;QACnC,IAAI,SAAS;YAAE,OAAO;QACtB,MAAM,QAAQ,GAAG,OAAO,EAAE,UAAU,EAAE,CAAC;QACvC,WAAW,CAAC,OAAO,GAAG,QAAQ,CAAC;QAC/B,QAAQ,CAAC,OAAO,GAAG,KAAK,CAAC;QACzB,YAAY,CAAC,OAAO,GAAG,KAAK,CAAC;QAC7B,aAAa,CAAC,EAAE,CAAC,CAAC;QAClB,UAAU,CAAC,KAAK,CAAC,CAAC;QAClB,QAAQ,CAAC,IAAI,CAAC,CAAC;QACf,YAAY,CAAC,IAAI,CAAC,CAAC;QAEnB,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,IAAI,MAAM,CAAC;QACpC,OAAO,CAAC,GAAG,CAAC,wBAAwB,QAAQ,SAAS,IAAI,SAAS,OAAO,CAAC,IAAI,IAAI,MAAM,EAAE,CAAC,CAAC;QAE5F,
|
|
1
|
+
{"version":3,"file":"useSTT.js","sourceRoot":"","sources":["../../../src/client/audio/useSTT.ts"],"names":[],"mappings":"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"}
|
|
@@ -34,7 +34,7 @@ export function bootstrapApp(options) {
|
|
|
34
34
|
socket
|
|
35
35
|
.connect(token)
|
|
36
36
|
.then(({ user, appToken }) => {
|
|
37
|
-
const uglyBotSocket = appToken ? createUglyBotSocket(appToken) : null;
|
|
37
|
+
const uglyBotSocket = appToken ? createUglyBotSocket(appToken, uglyBotUrl) : null;
|
|
38
38
|
renderWithRouter(true, false, _jsx(AppProvider, { socket: socket, uglyBotSocket: uglyBotSocket, userId: userId, user: user, children: renderApp() }));
|
|
39
39
|
})
|
|
40
40
|
.catch((err) => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bootstrapApp.js","sourceRoot":"","sources":["../../src/client/bootstrapApp.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAE9C,OAAO,EAAE,iBAAiB,EAAE,MAAM,gCAAgC,CAAC;AACnE,OAAO,EAAE,iBAAiB,EAAE,MAAM,gCAAgC,CAAC;AACnE,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AA8BzD,MAAM,CAAC,GAAG,OAAO,MAAM,KAAK,WAAW,CAAC,CAAC,CAAC,MAAuD,CAAC,CAAC,CAAC,EAAwC,CAAC;AAE7I,MAAM,UAAU,YAAY,CAAC,OAA4B;IACvD,MAAM,EACJ,QAAQ,EAAE,WAAW,EACrB,QAAQ,EAAE,WAAW,GAAG,EAAE,EAC1B,cAAc,EACd,MAAM,EAAE,SAAS,EACjB,IAAI,EAAE,OAAO,GAAG,OAAO,EACvB,QAAQ,GAAG,sDAA+B,EAC1C,SAAS,GAAG,MAAM,GACnB,GAAG,OAAO,CAAC;IAEZ,MAAM,MAAM,GACV,OAAO,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,aAAa,CAAC,OAAO,CAAE,CAAC,CAAC,CAAC,OAAO,CAAC;IAC3E,MAAM,IAAI,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC;IAEhC,sCAAsC;IACtC,MAAM,UAAU,GAAG,CAAC,CAAC,kBAAkB,CAAC,IAAI,kBAAkB,CAAC;IAC/D,MAAM,gBAAgB,GAAG,CAAC,CAAC,yBAAyB,CAAC,IAAI,EAAE,CAAC;IAC5D,IAAI,gBAAgB,EAAE,CAAC;QACrB,UAAU,CAAC,EAAE,SAAS,EAAE,UAAU,EAAE,SAAS,EAAE,gBAAgB,EAAE,CAAC,CAAC;IACrE,CAAC;IAED,MAAM,KAAK,GAAG,CAAC,CAAC,gBAAgB,CAAC,CAAC;IAElC,SAAS,gBAAgB,CACvB,eAAwB,EACxB,SAAkB,EAClB,QAAsB;QAEtB,IAAI,CAAC,MAAM,CACT,KAAC,cAAc,IACb,QAAQ,EAAE,QAAQ,EAClB,eAAe,EAAE,GAAG,EAAE,CAAC,eAAe,EACtC,SAAS,EAAE,SAAS,YAEnB,QAAQ,GACM,CAClB,CAAC;IACJ,CAAC;IAED,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,gBAAgB,CAAC,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC;QAC3C,OAAO;IACT,CAAC;IAED,MAAM,MAAM,GACV,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAE,CAAC,CACtC,CAAC,GAAG,CAAC;IACN,MAAM,MAAM,GAAG,YAAY,CAAC;QAC1B,QAAQ,EAAE,EAAE,GAAG,iBAAiB,EAAE,GAAG,WAAW,EAAE;QAClD,QAAQ,EAAE,EAAE,GAAG,iBAAiB,EAAE,GAAG,WAAW,EAAE;QAClD,GAAG,EAAE,SAAS;KACf,CAAC,CAAC;IAEH,MAAM;SACH,OAAO,CAAC,KAAK,CAAC;SACd,IAAI,CAAC,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE;QAC3B,MAAM,aAAa,GAAG,QAAQ,CAAC,CAAC,CAAC,mBAAmB,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"bootstrapApp.js","sourceRoot":"","sources":["../../src/client/bootstrapApp.tsx"],"names":[],"mappings":"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"}
|
|
@@ -8,6 +8,6 @@ export interface UglyBotSocket {
|
|
|
8
8
|
acquire(): Promise<void>;
|
|
9
9
|
release(): void;
|
|
10
10
|
}
|
|
11
|
-
export declare function createUglyBotSocket(appToken: string): UglyBotSocket;
|
|
11
|
+
export declare function createUglyBotSocket(appToken: string, baseUrl?: string): UglyBotSocket;
|
|
12
12
|
export {};
|
|
13
13
|
//# sourceMappingURL=uglyBotSocket.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"uglyBotSocket.d.ts","sourceRoot":"","sources":["../../src/client/uglyBotSocket.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;
|
|
1
|
+
{"version":3,"file":"uglyBotSocket.d.ts","sourceRoot":"","sources":["../../src/client/uglyBotSocket.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAEpE,KAAK,WAAW,GAAG,MAAM,IAAI,CAAC;AAC9B,KAAK,aAAa,GAAG,MAAM,eAAe,CAAC;AAE3C,MAAM,WAAW,aAAa;IAC5B,IAAI,CAAC,CAAC,SAAS,aAAa,EAC1B,IAAI,EAAE,CAAC,EACP,IAAI,EAAE,WAAW,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,GACpC,IAAI,CAAC;IACR,EAAE,CAAC,CAAC,SAAS,aAAa,EACxB,KAAK,EAAE,CAAC,EACR,OAAO,EAAE,CAAC,IAAI,EAAE,WAAW,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,KAAK,IAAI,GACvD,WAAW,CAAC;IACf,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACzB,OAAO,IAAI,IAAI,CAAC;CACjB;AAID,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,aAAa,CAqHrF"}
|
|
@@ -1,6 +1,5 @@
|
|
|
1
|
-
import { getUglyBotWsUrl } from '../shared/uglyBotUrl.js';
|
|
2
1
|
const IDLE_TIMEOUT_MS = 10_000;
|
|
3
|
-
export function createUglyBotSocket(appToken) {
|
|
2
|
+
export function createUglyBotSocket(appToken, baseUrl) {
|
|
4
3
|
let ws = null;
|
|
5
4
|
let connectPromise = null;
|
|
6
5
|
let refCount = 0;
|
|
@@ -8,14 +7,16 @@ export function createUglyBotSocket(appToken) {
|
|
|
8
7
|
const listeners = new Map();
|
|
9
8
|
function handleMessage(event) {
|
|
10
9
|
const msg = JSON.parse(event.data);
|
|
11
|
-
|
|
12
|
-
|
|
10
|
+
const type = msg.type;
|
|
11
|
+
// Support both { type, data: {...} } and flat { type, streamId, audio, ... } formats
|
|
12
|
+
const data = msg.data !== undefined ? msg.data : (() => {
|
|
13
|
+
const { type: _t, ...rest } = msg;
|
|
14
|
+
return Object.keys(rest).length > 0 ? rest : {};
|
|
15
|
+
})();
|
|
16
|
+
const set = listeners.get(type);
|
|
13
17
|
if (set) {
|
|
14
18
|
for (const handler of set)
|
|
15
|
-
handler(
|
|
16
|
-
}
|
|
17
|
-
else {
|
|
18
|
-
console.warn(`[UglyBotSocket] no listeners for ${msg.type}`);
|
|
19
|
+
handler(data);
|
|
19
20
|
}
|
|
20
21
|
}
|
|
21
22
|
function ensureConnection() {
|
|
@@ -25,7 +26,9 @@ export function createUglyBotSocket(appToken) {
|
|
|
25
26
|
if (connectPromise)
|
|
26
27
|
return connectPromise;
|
|
27
28
|
connectPromise = new Promise((resolve, reject) => {
|
|
28
|
-
const
|
|
29
|
+
const httpBase = baseUrl ?? 'https://ugly.bot';
|
|
30
|
+
const wsBase = httpBase.replace(/^http/, 'ws');
|
|
31
|
+
const url = `${wsBase}/ws?token=${encodeURIComponent(appToken)}`;
|
|
29
32
|
console.log(`[UglyBotSocket] connecting to ${url.replace(/token=[^&]+/, 'token=***')}`);
|
|
30
33
|
const socket = new WebSocket(url);
|
|
31
34
|
socket.addEventListener('open', () => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"uglyBotSocket.js","sourceRoot":"","sources":["../../src/client/uglyBotSocket.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"uglyBotSocket.js","sourceRoot":"","sources":["../../src/client/uglyBotSocket.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
package/src/cli/version.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
// Auto-generated by prebuild — do not edit manually
|
|
2
|
-
export const CLI_VERSION = "0.1.
|
|
2
|
+
export const CLI_VERSION = "0.1.285";
|
|
@@ -41,11 +41,21 @@ export function useSTT(socket: UglyBotSocket, options: STTOptions = {}) {
|
|
|
41
41
|
const mode = options.mode ?? 'auto';
|
|
42
42
|
console.log(`[STT] start streamId=${streamId} mode=${mode} lang=${options.lang ?? 'auto'}`);
|
|
43
43
|
|
|
44
|
+
// Start mic acquisition in parallel with socket connection for faster startup
|
|
45
|
+
if (!recorderRef.current) recorderRef.current = new AudioRecorder();
|
|
46
|
+
let chunkCount = 0;
|
|
47
|
+
const micReady = recorderRef.current.start((audio) => {
|
|
48
|
+
chunkCount++;
|
|
49
|
+
if (chunkCount <= 3 || chunkCount % 50 === 0) {
|
|
50
|
+
console.log(`[STT] audio chunk #${chunkCount} (${audio.length} b64 chars)`);
|
|
51
|
+
}
|
|
52
|
+
socket.send('stt:audio', { streamId, audio });
|
|
53
|
+
});
|
|
54
|
+
|
|
44
55
|
await socket.acquire();
|
|
45
56
|
console.log('[STT] socket acquired');
|
|
46
57
|
|
|
47
58
|
cleanupListeners();
|
|
48
|
-
let chunkCount = 0;
|
|
49
59
|
unsubsRef.current.push(
|
|
50
60
|
socket.on('stt:ready', (data) => {
|
|
51
61
|
if (data.streamId !== streamId) return;
|
|
@@ -103,14 +113,7 @@ export function useSTT(socket: UglyBotSocket, options: STTOptions = {}) {
|
|
|
103
113
|
return;
|
|
104
114
|
}
|
|
105
115
|
|
|
106
|
-
|
|
107
|
-
await recorderRef.current.start((audio) => {
|
|
108
|
-
chunkCount++;
|
|
109
|
-
if (chunkCount <= 3 || chunkCount % 50 === 0) {
|
|
110
|
-
console.log(`[STT] audio chunk #${chunkCount} (${audio.length} b64 chars)`);
|
|
111
|
-
}
|
|
112
|
-
socket.send('stt:audio', { streamId, audio });
|
|
113
|
-
});
|
|
116
|
+
await micReady;
|
|
114
117
|
console.log('[STT] recording started');
|
|
115
118
|
}, [socket, listening, options.mode, options.lang]);
|
|
116
119
|
|
|
@@ -95,7 +95,7 @@ export function bootstrapApp(options: BootstrapAppOptions): void {
|
|
|
95
95
|
socket
|
|
96
96
|
.connect(token)
|
|
97
97
|
.then(({ user, appToken }) => {
|
|
98
|
-
const uglyBotSocket = appToken ? createUglyBotSocket(appToken) : null;
|
|
98
|
+
const uglyBotSocket = appToken ? createUglyBotSocket(appToken, uglyBotUrl) : null;
|
|
99
99
|
renderWithRouter(
|
|
100
100
|
true,
|
|
101
101
|
false,
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import type { MessageData } from '../shared/Api.js';
|
|
2
2
|
import type { UglyBotMessages } from '../shared/UglyBotMessages.js';
|
|
3
|
-
import { getUglyBotWsUrl } from '../shared/uglyBotUrl.js';
|
|
4
3
|
|
|
5
4
|
type Unsubscribe = () => void;
|
|
6
5
|
type UglyBotMsgKey = keyof UglyBotMessages;
|
|
@@ -20,7 +19,7 @@ export interface UglyBotSocket {
|
|
|
20
19
|
|
|
21
20
|
const IDLE_TIMEOUT_MS = 10_000;
|
|
22
21
|
|
|
23
|
-
export function createUglyBotSocket(appToken: string): UglyBotSocket {
|
|
22
|
+
export function createUglyBotSocket(appToken: string, baseUrl?: string): UglyBotSocket {
|
|
24
23
|
let ws: WebSocket | null = null;
|
|
25
24
|
let connectPromise: Promise<void> | null = null;
|
|
26
25
|
let refCount = 0;
|
|
@@ -29,16 +28,16 @@ export function createUglyBotSocket(appToken: string): UglyBotSocket {
|
|
|
29
28
|
const listeners = new Map<string, Set<(data: unknown) => void>>();
|
|
30
29
|
|
|
31
30
|
function handleMessage(event: MessageEvent) {
|
|
32
|
-
const msg = JSON.parse(event.data as string) as
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
31
|
+
const msg = JSON.parse(event.data as string) as Record<string, unknown>;
|
|
32
|
+
const type = msg.type as string;
|
|
33
|
+
// Support both { type, data: {...} } and flat { type, streamId, audio, ... } formats
|
|
34
|
+
const data = msg.data !== undefined ? msg.data : (() => {
|
|
35
|
+
const { type: _t, ...rest } = msg;
|
|
36
|
+
return Object.keys(rest).length > 0 ? rest : {};
|
|
37
|
+
})();
|
|
38
|
+
const set = listeners.get(type);
|
|
38
39
|
if (set) {
|
|
39
|
-
for (const handler of set) handler(
|
|
40
|
-
} else {
|
|
41
|
-
console.warn(`[UglyBotSocket] no listeners for ${msg.type}`);
|
|
40
|
+
for (const handler of set) handler(data);
|
|
42
41
|
}
|
|
43
42
|
}
|
|
44
43
|
|
|
@@ -49,7 +48,9 @@ export function createUglyBotSocket(appToken: string): UglyBotSocket {
|
|
|
49
48
|
if (connectPromise) return connectPromise;
|
|
50
49
|
|
|
51
50
|
connectPromise = new Promise<void>((resolve, reject) => {
|
|
52
|
-
const
|
|
51
|
+
const httpBase = baseUrl ?? 'https://ugly.bot';
|
|
52
|
+
const wsBase = httpBase.replace(/^http/, 'ws');
|
|
53
|
+
const url = `${wsBase}/ws?token=${encodeURIComponent(appToken)}`;
|
|
53
54
|
console.log(`[UglyBotSocket] connecting to ${url.replace(/token=[^&]+/, 'token=***')}`);
|
|
54
55
|
const socket = new WebSocket(url);
|
|
55
56
|
|
|
@@ -285,7 +285,7 @@ function STTSection({ socket }: { socket: UglyBotSocket }) {
|
|
|
285
285
|
unsubAll();
|
|
286
286
|
unsubsRef.current.push(
|
|
287
287
|
socket.on('stt:transcript', (data) => {
|
|
288
|
-
if (data.streamId !== streamId) return;
|
|
288
|
+
if (data.streamId && data.streamId !== streamId) return;
|
|
289
289
|
addLog(`Transcript${data.isFinal ? ' (final)' : ''}: ${data.text ?? ''}`, data.isFinal ? 'ok' : 'info');
|
|
290
290
|
setTranscript(data.text ?? '');
|
|
291
291
|
if (data.isFinal && data.text) {
|
|
@@ -294,13 +294,15 @@ function STTSection({ socket }: { socket: UglyBotSocket }) {
|
|
|
294
294
|
}
|
|
295
295
|
}),
|
|
296
296
|
socket.on('stt:error', (data) => {
|
|
297
|
-
if (data.streamId !== streamId) return;
|
|
297
|
+
if (data.streamId && data.streamId !== streamId) return;
|
|
298
298
|
addLog(`STT error: ${data.message ?? 'unknown'}`, 'err');
|
|
299
299
|
stopListening();
|
|
300
300
|
}),
|
|
301
301
|
socket.on('stt:stopped', (data) => {
|
|
302
|
-
if (data.streamId !== streamId) return;
|
|
302
|
+
if (data.streamId && data.streamId !== streamId) return;
|
|
303
303
|
addLog(`STT stopped — sent ${chunkCountRef.current} audio chunks`, 'ok');
|
|
304
|
+
unsubAll();
|
|
305
|
+
socket.release();
|
|
304
306
|
}),
|
|
305
307
|
);
|
|
306
308
|
}
|
|
@@ -315,6 +317,17 @@ function STTSection({ socket }: { socket: UglyBotSocket }) {
|
|
|
315
317
|
const started = Date.now();
|
|
316
318
|
addLog(`Mode: ${sttMode}${sttMode === 'continuous' ? ' (VAD enabled)' : ''}`);
|
|
317
319
|
|
|
320
|
+
// Start mic + socket in parallel for faster startup
|
|
321
|
+
if (!recorderRef.current) recorderRef.current = new AudioRecorder();
|
|
322
|
+
const micReady = Promise.all([
|
|
323
|
+
mic.start(),
|
|
324
|
+
recorderRef.current.start((audio) => {
|
|
325
|
+
chunkCountRef.current++;
|
|
326
|
+
console.log(`[STT] audio chunk #${chunkCountRef.current} (${audio.length} b64 chars)`);
|
|
327
|
+
socket.send('stt:audio', { streamId, audio });
|
|
328
|
+
}),
|
|
329
|
+
]);
|
|
330
|
+
|
|
318
331
|
await socket.acquire();
|
|
319
332
|
subscribe(streamId);
|
|
320
333
|
|
|
@@ -328,7 +341,7 @@ function STTSection({ socket }: { socket: UglyBotSocket }) {
|
|
|
328
341
|
await new Promise<void>((resolve) => {
|
|
329
342
|
let resolved = false;
|
|
330
343
|
const unsub = socket.on('stt:ready', (data) => {
|
|
331
|
-
if (data.streamId === streamId) {
|
|
344
|
+
if (!data.streamId || data.streamId === streamId) {
|
|
332
345
|
resolved = true;
|
|
333
346
|
unsub();
|
|
334
347
|
resolve();
|
|
@@ -344,15 +357,7 @@ function STTSection({ socket }: { socket: UglyBotSocket }) {
|
|
|
344
357
|
|
|
345
358
|
addLog(`Ready in ${fmt(Date.now() - started)}`, 'ok');
|
|
346
359
|
|
|
347
|
-
|
|
348
|
-
await mic.start();
|
|
349
|
-
|
|
350
|
-
// Start recording with AudioRecorder (uses AudioWorkletNode)
|
|
351
|
-
if (!recorderRef.current) recorderRef.current = new AudioRecorder();
|
|
352
|
-
await recorderRef.current.start((audio) => {
|
|
353
|
-
chunkCountRef.current++;
|
|
354
|
-
socket.send('stt:audio', { streamId, audio });
|
|
355
|
-
});
|
|
360
|
+
await micReady;
|
|
356
361
|
addLog('Recording started', 'ok');
|
|
357
362
|
|
|
358
363
|
setListening(true);
|
|
@@ -365,8 +370,7 @@ function STTSection({ socket }: { socket: UglyBotSocket }) {
|
|
|
365
370
|
if (streamIdRef.current) {
|
|
366
371
|
socket.send('stt:stop', { streamId: streamIdRef.current });
|
|
367
372
|
}
|
|
368
|
-
unsubAll
|
|
369
|
-
socket.release();
|
|
373
|
+
// Don't unsubAll/release here — wait for stt:stopped handler to clean up
|
|
370
374
|
setListening(false);
|
|
371
375
|
}
|
|
372
376
|
|
|
@@ -428,12 +432,14 @@ function STTSection({ socket }: { socket: UglyBotSocket }) {
|
|
|
428
432
|
<div style={{ marginTop: 12 }}>
|
|
429
433
|
{sttMode === 'continuous' ? (
|
|
430
434
|
<Button
|
|
435
|
+
data-id="stt-toggle"
|
|
431
436
|
onClick={listening ? stopListening : () => void startListening()}
|
|
432
437
|
>
|
|
433
438
|
{listening ? 'Stop Listening' : 'Start Listening'}
|
|
434
439
|
</Button>
|
|
435
440
|
) : (
|
|
436
441
|
<button
|
|
442
|
+
data-id="stt-ptt"
|
|
437
443
|
onPointerDown={handlePTTDown}
|
|
438
444
|
onPointerUp={handlePTTUp}
|
|
439
445
|
onPointerLeave={listening ? handlePTTUp : undefined}
|
|
@@ -471,9 +477,9 @@ function STTSection({ socket }: { socket: UglyBotSocket }) {
|
|
|
471
477
|
|
|
472
478
|
{/* Logs */}
|
|
473
479
|
{logs.length > 0 && (
|
|
474
|
-
<div style={{ marginTop: 8, fontSize: '0.85em', opacity: 0.7 }}>
|
|
480
|
+
<div data-id="stt-logs" style={{ marginTop: 8, fontSize: '0.85em', opacity: 0.7 }}>
|
|
475
481
|
{logs.map((entry, i) => (
|
|
476
|
-
<div key={i}>
|
|
482
|
+
<div key={i} data-log-kind={entry.kind}>
|
|
477
483
|
{entry.kind === 'err' ? '✗' : entry.kind === 'ok' ? '✓' : '·'}{' '}
|
|
478
484
|
{entry.msg}
|
|
479
485
|
</div>
|