ugly-app 0.1.282 → 0.1.284

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.
@@ -1,2 +1,2 @@
1
- export declare const CLI_VERSION = "0.1.282";
1
+ export declare const CLI_VERSION = "0.1.284";
2
2
  //# sourceMappingURL=version.d.ts.map
@@ -1,3 +1,3 @@
1
1
  // Auto-generated by prebuild — do not edit manually
2
- export const CLI_VERSION = "0.1.282";
2
+ export const CLI_VERSION = "0.1.284";
3
3
  //# sourceMappingURL=version.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"AudioRecorder.d.ts","sourceRoot":"","sources":["../../../src/client/audio/AudioRecorder.ts"],"names":[],"mappings":"AA8BA,qBAAa,aAAa;IACxB,OAAO,CAAC,GAAG,CAA6B;IACxC,OAAO,CAAC,MAAM,CAA4B;IAC1C,OAAO,CAAC,OAAO,CAAiC;IAChD,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,OAAO,CAA2C;IAE1D,IAAI,SAAS,IAAI,OAAO,CAEvB;IAEK,KAAK,CAAC,OAAO,EAAE,CAAC,WAAW,EAAE,MAAM,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IAgClE,IAAI,IAAI,IAAI;CAWb"}
1
+ {"version":3,"file":"AudioRecorder.d.ts","sourceRoot":"","sources":["../../../src/client/audio/AudioRecorder.ts"],"names":[],"mappings":"AA8BA,qBAAa,aAAa;IACxB,OAAO,CAAC,GAAG,CAA6B;IACxC,OAAO,CAAC,MAAM,CAA4B;IAC1C,OAAO,CAAC,OAAO,CAAiC;IAChD,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,OAAO,CAA2C;IAE1D,IAAI,SAAS,IAAI,OAAO,CAEvB;IAEK,KAAK,CAAC,OAAO,EAAE,CAAC,WAAW,EAAE,MAAM,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IA2DlE,IAAI,IAAI,IAAI;CAYb"}
@@ -40,6 +40,7 @@ export class AudioRecorder {
40
40
  if (this._listening)
41
41
  return;
42
42
  this.onChunk = onChunk;
43
+ console.log('[AudioRecorder] requesting mic access…');
43
44
  this.stream = await navigator.mediaDevices.getUserMedia({
44
45
  audio: {
45
46
  sampleRate: TARGET_SAMPLE_RATE,
@@ -48,13 +49,35 @@ export class AudioRecorder {
48
49
  noiseSuppression: true,
49
50
  },
50
51
  });
52
+ const track = this.stream.getAudioTracks()[0];
53
+ if (track) {
54
+ const settings = track.getSettings();
55
+ console.log(`[AudioRecorder] mic acquired: ${track.label} (${settings.sampleRate ?? '?'}Hz, ${settings.channelCount ?? '?'}ch)`);
56
+ }
51
57
  this.ctx = new AudioContext({ sampleRate: TARGET_SAMPLE_RATE });
58
+ console.log(`[AudioRecorder] AudioContext state=${this.ctx.state} sampleRate=${this.ctx.sampleRate}`);
52
59
  const source = this.ctx.createMediaStreamSource(this.stream);
53
60
  await this.ctx.audioWorklet.addModule(WORKLET_URL);
61
+ console.log('[AudioRecorder] worklet loaded');
54
62
  this.worklet = new AudioWorkletNode(this.ctx, 'audio-recorder');
63
+ let chunkCount = 0;
64
+ let silentChunks = 0;
55
65
  this.worklet.port.onmessage = (event) => {
56
66
  if (event.data?.type === 'chunk') {
57
67
  const floatData = event.data.samples;
68
+ chunkCount++;
69
+ // Check for silence (all samples near zero)
70
+ let maxAbs = 0;
71
+ for (let i = 0; i < floatData.length; i += 64) {
72
+ const abs = Math.abs(floatData[i] ?? 0);
73
+ if (abs > maxAbs)
74
+ maxAbs = abs;
75
+ }
76
+ if (maxAbs < 0.001)
77
+ silentChunks++;
78
+ if (chunkCount <= 3 || chunkCount % 100 === 0) {
79
+ console.log(`[AudioRecorder] chunk #${chunkCount} maxAbs=${maxAbs.toFixed(4)} silentChunks=${silentChunks}/${chunkCount}`);
80
+ }
58
81
  const int16 = float32ToInt16(floatData);
59
82
  const base64 = arrayBufferToBase64(int16.buffer);
60
83
  this.onChunk?.(base64);
@@ -63,10 +86,12 @@ export class AudioRecorder {
63
86
  source.connect(this.worklet);
64
87
  this.worklet.connect(this.ctx.destination);
65
88
  this._listening = true;
89
+ console.log('[AudioRecorder] recording started');
66
90
  }
67
91
  stop() {
68
92
  if (!this._listening)
69
93
  return;
94
+ console.log('[AudioRecorder] stopping');
70
95
  this.worklet?.disconnect();
71
96
  this.stream?.getTracks().forEach((t) => t.stop());
72
97
  this.ctx?.close().catch(() => { });
@@ -1 +1 @@
1
- {"version":3,"file":"AudioRecorder.js","sourceRoot":"","sources":["../../../src/client/audio/AudioRecorder.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"AudioRecorder.js","sourceRoot":"","sources":["../../../src/client/audio/AudioRecorder.ts"],"names":[],"mappings":"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"}
@@ -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;;;;;;;EAuGrE"}
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;;;;;;;EA+HrE"}
@@ -28,20 +28,27 @@ export function useSTT(socket, options = {}) {
28
28
  setIsFinal(false);
29
29
  setError(null);
30
30
  setListening(true);
31
+ const mode = options.mode ?? 'auto';
32
+ console.log(`[STT] start streamId=${streamId} mode=${mode} lang=${options.lang ?? 'auto'}`);
31
33
  await socket.acquire();
34
+ console.log('[STT] socket acquired');
32
35
  cleanupListeners();
36
+ let chunkCount = 0;
33
37
  unsubsRef.current.push(socket.on('stt:ready', (data) => {
34
38
  if (data.streamId !== streamId)
35
39
  return;
40
+ console.log(`[STT] ready streamId=${streamId}`);
36
41
  readyRef.current = true;
37
42
  }), socket.on('stt:transcript', (data) => {
38
43
  if (data.streamId !== streamId)
39
44
  return;
45
+ console.log(`[STT] transcript isFinal=${data.isFinal} text="${data.text}" (after ${chunkCount} chunks)`);
40
46
  setTranscript(data.text);
41
47
  setIsFinal(data.isFinal);
42
48
  }), socket.on('stt:error', (data) => {
43
49
  if (data.streamId !== streamId)
44
50
  return;
51
+ console.error(`[STT] error streamId=${streamId}: ${data.message}`);
45
52
  setError(data.message);
46
53
  setListening(false);
47
54
  cleanupListeners();
@@ -49,34 +56,49 @@ export function useSTT(socket, options = {}) {
49
56
  }), socket.on('stt:stopped', (data) => {
50
57
  if (data.streamId !== streamId)
51
58
  return;
59
+ console.log(`[STT] stopped streamId=${streamId} (sent ${chunkCount} audio chunks)`);
52
60
  setListening(false);
53
61
  cleanupListeners();
54
62
  socket.release();
55
63
  }));
56
64
  socket.send('stt:start', {
57
65
  streamId,
58
- mode: options.mode ?? 'auto',
66
+ mode,
59
67
  lang: options.lang,
60
68
  });
61
69
  // Wait for stt:ready (timeout after 5s)
70
+ const readyStart = Date.now();
62
71
  await new Promise((resolve) => {
63
- const startTime = Date.now();
64
72
  const poll = setInterval(() => {
65
- if (readyRef.current || Date.now() - startTime > 5000) {
73
+ if (readyRef.current || Date.now() - readyStart > 5000) {
66
74
  clearInterval(poll);
67
75
  resolve();
68
76
  }
69
77
  }, 50);
70
78
  });
71
- if (cancelledRef.current)
79
+ if (!readyRef.current) {
80
+ console.warn(`[STT] ready timeout after ${Date.now() - readyStart}ms — proceeding anyway`);
81
+ }
82
+ else {
83
+ console.log(`[STT] ready in ${Date.now() - readyStart}ms`);
84
+ }
85
+ if (cancelledRef.current) {
86
+ console.log('[STT] cancelled before recording started');
72
87
  return;
88
+ }
73
89
  if (!recorderRef.current)
74
90
  recorderRef.current = new AudioRecorder();
75
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
+ }
76
96
  socket.send('stt:audio', { streamId, audio });
77
97
  });
98
+ console.log('[STT] recording started');
78
99
  }, [socket, listening, options.mode, options.lang]);
79
100
  const stop = useCallback(() => {
101
+ console.log(`[STT] stop streamId=${streamIdRef.current}`);
80
102
  cancelledRef.current = true;
81
103
  recorderRef.current?.stop();
82
104
  if (streamIdRef.current) {
@@ -1 +1 @@
1
- {"version":3,"file":"useSTT.js","sourceRoot":"","sources":["../../../src/client/audio/useSTT.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"useSTT.js","sourceRoot":"","sources":["../../../src/client/audio/useSTT.ts"],"names":[],"mappings":"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"}
@@ -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;AAGpE,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,GAAG,aAAa,CAyGnE"}
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;AAGpE,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,GAAG,aAAa,CAmHnE"}
@@ -8,11 +8,15 @@ export function createUglyBotSocket(appToken) {
8
8
  const listeners = new Map();
9
9
  function handleMessage(event) {
10
10
  const msg = JSON.parse(event.data);
11
+ console.log(`[UglyBotSocket] recv ${msg.type}`, msg.data);
11
12
  const set = listeners.get(msg.type);
12
13
  if (set) {
13
14
  for (const handler of set)
14
15
  handler(msg.data);
15
16
  }
17
+ else {
18
+ console.warn(`[UglyBotSocket] no listeners for ${msg.type}`);
19
+ }
16
20
  }
17
21
  function ensureConnection() {
18
22
  if (ws && ws.readyState === WebSocket.OPEN) {
@@ -22,17 +26,21 @@ export function createUglyBotSocket(appToken) {
22
26
  return connectPromise;
23
27
  connectPromise = new Promise((resolve, reject) => {
24
28
  const url = `${getUglyBotWsUrl()}/ws?token=${encodeURIComponent(appToken)}`;
29
+ console.log(`[UglyBotSocket] connecting to ${url.replace(/token=[^&]+/, 'token=***')}`);
25
30
  const socket = new WebSocket(url);
26
31
  socket.addEventListener('open', () => {
32
+ console.log('[UglyBotSocket] connected');
27
33
  ws = socket;
28
34
  connectPromise = null;
29
35
  resolve();
30
36
  });
31
- socket.addEventListener('error', () => {
37
+ socket.addEventListener('error', (e) => {
38
+ console.error('[UglyBotSocket] connection error', e);
32
39
  connectPromise = null;
33
40
  reject(new Error('ugly.bot WebSocket connection failed'));
34
41
  });
35
- socket.addEventListener('close', () => {
42
+ socket.addEventListener('close', (e) => {
43
+ console.log(`[UglyBotSocket] closed code=${e.code} reason=${e.reason}`);
36
44
  if (ws === socket)
37
45
  ws = null;
38
46
  connectPromise = null;
@@ -65,8 +73,12 @@ export function createUglyBotSocket(appToken) {
65
73
  return {
66
74
  send(type, data) {
67
75
  if (ws && ws.readyState === WebSocket.OPEN) {
76
+ console.log(`[UglyBotSocket] send ${type}`, data);
68
77
  ws.send(JSON.stringify({ type, data }));
69
78
  }
79
+ else {
80
+ console.error(`[UglyBotSocket] send DROPPED ${type} — ws ${ws ? `readyState=${ws.readyState}` : 'null'}`);
81
+ }
70
82
  },
71
83
  on(event, handler) {
72
84
  let set = listeners.get(event);
@@ -1 +1 @@
1
- {"version":3,"file":"uglyBotSocket.js","sourceRoot":"","sources":["../../src/client/uglyBotSocket.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"uglyBotSocket.js","sourceRoot":"","sources":["../../src/client/uglyBotSocket.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"Socket.d.ts","sourceRoot":"","sources":["../../src/server/Socket.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,IAAI,mBAAmB,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AAC3E,OAAO,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,IAAI,CAAC;AAChD,OAAO,KAAK,EAAE,kBAAkB,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAI/E,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AA+ClD,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,SAAS,EACjB,WAAW,EAAE,kBAAkB,EAC/B,QAAQ,EAAE,aAAa,GAAG,IAAI,EAE9B,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,EAErB,WAAW,EAAE,UAAU,CAAC,GAAG,CAAC,EAC5B,MAAM,SAAS,EACf,uBAAuB,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,KAAK,OAAO,CAAC,EAAE;AACtF;yEACyE;AACzE,WAAW,CAAC,EAAE,eAAe;AAC7B;+EAC+E;AAC/E,MAAM,CAAC,EAAE,CAAC,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,mBAAmB,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,GACzF,eAAe,CAiYjB"}
1
+ {"version":3,"file":"Socket.d.ts","sourceRoot":"","sources":["../../src/server/Socket.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,IAAI,mBAAmB,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AAC3E,OAAO,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,IAAI,CAAC;AAChD,OAAO,KAAK,EAAE,kBAAkB,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAI/E,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AA+ClD,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,SAAS,EACjB,WAAW,EAAE,kBAAkB,EAC/B,QAAQ,EAAE,aAAa,GAAG,IAAI,EAE9B,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,EAErB,WAAW,EAAE,UAAU,CAAC,GAAG,CAAC,EAC5B,MAAM,SAAS,EACf,uBAAuB,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,KAAK,OAAO,CAAC,EAAE;AACtF;yEACyE;AACzE,WAAW,CAAC,EAAE,eAAe;AAC7B;+EAC+E;AAC/E,MAAM,CAAC,EAAE,CAAC,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,mBAAmB,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,GACzF,eAAe,CA4ZjB"}
@@ -29,7 +29,33 @@ onAuth) {
29
29
  const sessions = new Map();
30
30
  wss.on('connection', (ws, req) => {
31
31
  let session = null;
32
+ // Support URL token auth: ws://host/ws?token=JWT
33
+ // This allows direct connections (e.g. UglyBotSocket) without a message-based auth handshake.
34
+ const connUrl = new URL(req.url ?? '/', `http://${req.headers.host ?? 'localhost'}`);
35
+ const urlToken = connUrl.searchParams.get('token');
36
+ let urlAuthPromise = null;
37
+ if (urlToken) {
38
+ urlAuthPromise = (async () => {
39
+ try {
40
+ const userId = await verifyToken(urlToken);
41
+ const user = { _id: userId, userId };
42
+ const unregisterPush = await registerPushConnection(userId, ws);
43
+ session = { userId, ws, subscriptions: new Map(), unregisterPush };
44
+ sessions.set(ws, session);
45
+ if (onAuth)
46
+ await onAuth(ws, userId, req);
47
+ }
48
+ catch {
49
+ ws.close(4001, 'Invalid token');
50
+ }
51
+ })();
52
+ }
32
53
  ws.on('message', async (data) => {
54
+ // If URL token auth is in progress, wait for it to complete
55
+ if (urlAuthPromise) {
56
+ await urlAuthPromise;
57
+ urlAuthPromise = null;
58
+ }
33
59
  let msg;
34
60
  try {
35
61
  msg = JSON.parse(String(data));
@@ -38,7 +64,7 @@ onAuth) {
38
64
  ws.close();
39
65
  return;
40
66
  }
41
- // Auth handshake must be first message
67
+ // Auth handshake must be first message (unless URL token was used)
42
68
  if (!session) {
43
69
  if (msg.type !== 'auth') {
44
70
  ws.close();
@@ -1 +1 @@
1
- {"version":3,"file":"Socket.js","sourceRoot":"","sources":["../../src/server/Socket.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"Socket.js","sourceRoot":"","sources":["../../src/server/Socket.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ugly-app",
3
- "version": "0.1.282",
3
+ "version": "0.1.284",
4
4
  "type": "module",
5
5
  "main": "./dist/server/index.js",
6
6
  "exports": {
@@ -1,2 +1,2 @@
1
1
  // Auto-generated by prebuild — do not edit manually
2
- export const CLI_VERSION = "0.1.282";
2
+ export const CLI_VERSION = "0.1.284";
@@ -43,6 +43,7 @@ export class AudioRecorder {
43
43
  if (this._listening) return;
44
44
  this.onChunk = onChunk;
45
45
 
46
+ console.log('[AudioRecorder] requesting mic access…');
46
47
  this.stream = await navigator.mediaDevices.getUserMedia({
47
48
  audio: {
48
49
  sampleRate: TARGET_SAMPLE_RATE,
@@ -52,14 +53,39 @@ export class AudioRecorder {
52
53
  },
53
54
  });
54
55
 
56
+ const track = this.stream.getAudioTracks()[0];
57
+ if (track) {
58
+ const settings = track.getSettings();
59
+ console.log(`[AudioRecorder] mic acquired: ${track.label} (${settings.sampleRate ?? '?'}Hz, ${settings.channelCount ?? '?'}ch)`);
60
+ }
61
+
55
62
  this.ctx = new AudioContext({ sampleRate: TARGET_SAMPLE_RATE });
63
+ console.log(`[AudioRecorder] AudioContext state=${this.ctx.state} sampleRate=${this.ctx.sampleRate}`);
56
64
  const source = this.ctx.createMediaStreamSource(this.stream);
57
65
 
58
66
  await this.ctx.audioWorklet.addModule(WORKLET_URL);
67
+ console.log('[AudioRecorder] worklet loaded');
59
68
  this.worklet = new AudioWorkletNode(this.ctx, 'audio-recorder');
69
+
70
+ let chunkCount = 0;
71
+ let silentChunks = 0;
60
72
  this.worklet.port.onmessage = (event: MessageEvent) => {
61
73
  if (event.data?.type === 'chunk') {
62
74
  const floatData = event.data.samples as Float32Array;
75
+ chunkCount++;
76
+
77
+ // Check for silence (all samples near zero)
78
+ let maxAbs = 0;
79
+ for (let i = 0; i < floatData.length; i += 64) {
80
+ const abs = Math.abs(floatData[i] ?? 0);
81
+ if (abs > maxAbs) maxAbs = abs;
82
+ }
83
+ if (maxAbs < 0.001) silentChunks++;
84
+
85
+ if (chunkCount <= 3 || chunkCount % 100 === 0) {
86
+ console.log(`[AudioRecorder] chunk #${chunkCount} maxAbs=${maxAbs.toFixed(4)} silentChunks=${silentChunks}/${chunkCount}`);
87
+ }
88
+
63
89
  const int16 = float32ToInt16(floatData);
64
90
  const base64 = arrayBufferToBase64(int16.buffer as ArrayBuffer);
65
91
  this.onChunk?.(base64);
@@ -69,10 +95,12 @@ export class AudioRecorder {
69
95
  source.connect(this.worklet);
70
96
  this.worklet.connect(this.ctx.destination);
71
97
  this._listening = true;
98
+ console.log('[AudioRecorder] recording started');
72
99
  }
73
100
 
74
101
  stop(): void {
75
102
  if (!this._listening) return;
103
+ console.log('[AudioRecorder] stopping');
76
104
  this.worklet?.disconnect();
77
105
  this.stream?.getTracks().forEach((t) => t.stop());
78
106
  this.ctx?.close().catch(() => {});
@@ -38,21 +38,29 @@ export function useSTT(socket: UglyBotSocket, options: STTOptions = {}) {
38
38
  setError(null);
39
39
  setListening(true);
40
40
 
41
+ const mode = options.mode ?? 'auto';
42
+ console.log(`[STT] start streamId=${streamId} mode=${mode} lang=${options.lang ?? 'auto'}`);
43
+
41
44
  await socket.acquire();
45
+ console.log('[STT] socket acquired');
42
46
 
43
47
  cleanupListeners();
48
+ let chunkCount = 0;
44
49
  unsubsRef.current.push(
45
50
  socket.on('stt:ready', (data) => {
46
51
  if (data.streamId !== streamId) return;
52
+ console.log(`[STT] ready streamId=${streamId}`);
47
53
  readyRef.current = true;
48
54
  }),
49
55
  socket.on('stt:transcript', (data) => {
50
56
  if (data.streamId !== streamId) return;
57
+ console.log(`[STT] transcript isFinal=${data.isFinal} text="${data.text}" (after ${chunkCount} chunks)`);
51
58
  setTranscript(data.text);
52
59
  setIsFinal(data.isFinal);
53
60
  }),
54
61
  socket.on('stt:error', (data) => {
55
62
  if (data.streamId !== streamId) return;
63
+ console.error(`[STT] error streamId=${streamId}: ${data.message}`);
56
64
  setError(data.message);
57
65
  setListening(false);
58
66
  cleanupListeners();
@@ -60,6 +68,7 @@ export function useSTT(socket: UglyBotSocket, options: STTOptions = {}) {
60
68
  }),
61
69
  socket.on('stt:stopped', (data) => {
62
70
  if (data.streamId !== streamId) return;
71
+ console.log(`[STT] stopped streamId=${streamId} (sent ${chunkCount} audio chunks)`);
63
72
  setListening(false);
64
73
  cleanupListeners();
65
74
  socket.release();
@@ -68,30 +77,45 @@ export function useSTT(socket: UglyBotSocket, options: STTOptions = {}) {
68
77
 
69
78
  socket.send('stt:start', {
70
79
  streamId,
71
- mode: options.mode ?? 'auto',
80
+ mode,
72
81
  lang: options.lang,
73
82
  });
74
83
 
75
84
  // Wait for stt:ready (timeout after 5s)
85
+ const readyStart = Date.now();
76
86
  await new Promise<void>((resolve) => {
77
- const startTime = Date.now();
78
87
  const poll = setInterval(() => {
79
- if (readyRef.current || Date.now() - startTime > 5000) {
88
+ if (readyRef.current || Date.now() - readyStart > 5000) {
80
89
  clearInterval(poll);
81
90
  resolve();
82
91
  }
83
92
  }, 50);
84
93
  });
85
94
 
86
- if (cancelledRef.current) return;
95
+ if (!readyRef.current) {
96
+ console.warn(`[STT] ready timeout after ${Date.now() - readyStart}ms — proceeding anyway`);
97
+ } else {
98
+ console.log(`[STT] ready in ${Date.now() - readyStart}ms`);
99
+ }
100
+
101
+ if (cancelledRef.current) {
102
+ console.log('[STT] cancelled before recording started');
103
+ return;
104
+ }
87
105
 
88
106
  if (!recorderRef.current) recorderRef.current = new AudioRecorder();
89
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
+ }
90
112
  socket.send('stt:audio', { streamId, audio });
91
113
  });
114
+ console.log('[STT] recording started');
92
115
  }, [socket, listening, options.mode, options.lang]);
93
116
 
94
117
  const stop = useCallback(() => {
118
+ console.log(`[STT] stop streamId=${streamIdRef.current}`);
95
119
  cancelledRef.current = true;
96
120
  recorderRef.current?.stop();
97
121
  if (streamIdRef.current) {
@@ -33,9 +33,12 @@ export function createUglyBotSocket(appToken: string): UglyBotSocket {
33
33
  type: string;
34
34
  data?: unknown;
35
35
  };
36
+ console.log(`[UglyBotSocket] recv ${msg.type}`, msg.data);
36
37
  const set = listeners.get(msg.type);
37
38
  if (set) {
38
39
  for (const handler of set) handler(msg.data);
40
+ } else {
41
+ console.warn(`[UglyBotSocket] no listeners for ${msg.type}`);
39
42
  }
40
43
  }
41
44
 
@@ -47,20 +50,24 @@ export function createUglyBotSocket(appToken: string): UglyBotSocket {
47
50
 
48
51
  connectPromise = new Promise<void>((resolve, reject) => {
49
52
  const url = `${getUglyBotWsUrl()}/ws?token=${encodeURIComponent(appToken)}`;
53
+ console.log(`[UglyBotSocket] connecting to ${url.replace(/token=[^&]+/, 'token=***')}`);
50
54
  const socket = new WebSocket(url);
51
55
 
52
56
  socket.addEventListener('open', () => {
57
+ console.log('[UglyBotSocket] connected');
53
58
  ws = socket;
54
59
  connectPromise = null;
55
60
  resolve();
56
61
  });
57
62
 
58
- socket.addEventListener('error', () => {
63
+ socket.addEventListener('error', (e) => {
64
+ console.error('[UglyBotSocket] connection error', e);
59
65
  connectPromise = null;
60
66
  reject(new Error('ugly.bot WebSocket connection failed'));
61
67
  });
62
68
 
63
- socket.addEventListener('close', () => {
69
+ socket.addEventListener('close', (e) => {
70
+ console.log(`[UglyBotSocket] closed code=${e.code} reason=${e.reason}`);
64
71
  if (ws === socket) ws = null;
65
72
  connectPromise = null;
66
73
  });
@@ -97,7 +104,10 @@ export function createUglyBotSocket(appToken: string): UglyBotSocket {
97
104
  return {
98
105
  send(type, data) {
99
106
  if (ws && ws.readyState === WebSocket.OPEN) {
107
+ console.log(`[UglyBotSocket] send ${type as string}`, data);
100
108
  ws.send(JSON.stringify({ type, data }));
109
+ } else {
110
+ console.error(`[UglyBotSocket] send DROPPED ${type as string} — ws ${ws ? `readyState=${ws.readyState}` : 'null'}`);
101
111
  }
102
112
  },
103
113
 
@@ -88,7 +88,34 @@ export function initWebSocketServer(
88
88
 
89
89
  wss.on('connection', (ws, req) => {
90
90
  let session: Session | null = null;
91
+
92
+ // Support URL token auth: ws://host/ws?token=JWT
93
+ // This allows direct connections (e.g. UglyBotSocket) without a message-based auth handshake.
94
+ const connUrl = new URL(req.url ?? '/', `http://${req.headers.host ?? 'localhost'}`);
95
+ const urlToken = connUrl.searchParams.get('token');
96
+ let urlAuthPromise: Promise<void> | null = null;
97
+ if (urlToken) {
98
+ urlAuthPromise = (async () => {
99
+ try {
100
+ const userId = await verifyToken(urlToken);
101
+ const user = { _id: userId, userId };
102
+ const unregisterPush = await registerPushConnection(userId, ws);
103
+ session = { userId, ws, subscriptions: new Map(), unregisterPush };
104
+ sessions.set(ws, session);
105
+ if (onAuth) await onAuth(ws, userId, req);
106
+ } catch {
107
+ ws.close(4001, 'Invalid token');
108
+ }
109
+ })();
110
+ }
111
+
91
112
  ws.on('message', async (data) => {
113
+ // If URL token auth is in progress, wait for it to complete
114
+ if (urlAuthPromise) {
115
+ await urlAuthPromise;
116
+ urlAuthPromise = null;
117
+ }
118
+
92
119
  let msg: IncomingMessage;
93
120
  try {
94
121
  msg = JSON.parse(String(data)) as IncomingMessage;
@@ -97,7 +124,7 @@ export function initWebSocketServer(
97
124
  return;
98
125
  }
99
126
 
100
- // Auth handshake must be first message
127
+ // Auth handshake must be first message (unless URL token was used)
101
128
  if (!session) {
102
129
  if (msg.type !== 'auth') {
103
130
  ws.close();
@@ -203,6 +203,7 @@ function useTTSAnalyzer() {
203
203
  const ctxRef = useRef<AudioContext | null>(null);
204
204
  const analyzerRef = useRef<AnalyserNode | null>(null);
205
205
  const gainRef = useRef<GainNode | null>(null);
206
+ const nextStartRef = useRef(0);
206
207
  const [analyzer, setAnalyzer] = useState<AnalyserNode | null>(null);
207
208
 
208
209
  const init = useCallback(() => {
@@ -216,6 +217,7 @@ function useTTSAnalyzer() {
216
217
  ctxRef.current = ctx;
217
218
  analyzerRef.current = node;
218
219
  gainRef.current = gain;
220
+ nextStartRef.current = 0;
219
221
  setAnalyzer(node);
220
222
  }, []);
221
223
 
@@ -232,7 +234,10 @@ function useTTSAnalyzer() {
232
234
  const source = ctx.createBufferSource();
233
235
  source.buffer = buffer;
234
236
  source.connect(gain);
235
- source.start();
237
+ const now = ctx.currentTime;
238
+ if (nextStartRef.current < now) nextStartRef.current = now;
239
+ source.start(nextStartRef.current);
240
+ nextStartRef.current += buffer.duration;
236
241
  }, []);
237
242
 
238
243
  const close = useCallback(() => {
@@ -484,7 +489,7 @@ function STTSection({ socket }: { socket: UglyBotSocket }) {
484
489
  let ttsCounter = 0;
485
490
 
486
491
  function TTSSection({ socket }: { socket: UglyBotSocket }) {
487
- const [text, setText] = useState('');
492
+ const [text, setText] = useState('The quick brown fox jumps over the lazy dog. Hello, this is a text to speech test.');
488
493
  const [voice, setVoice] = useState('');
489
494
  const [vizType, setVizType] = useState<VizType>('wave');
490
495
  const [playing, setPlaying] = useState(false);
@@ -511,16 +516,19 @@ function TTSSection({ socket }: { socket: UglyBotSocket }) {
511
516
 
512
517
  function subscribe(streamId: string) {
513
518
  unsubAll();
519
+ addLog(`Subscribing to events for stream ${streamId}`);
514
520
  unsubsRef.current.push(
515
521
  socket.on('tts:chunk', (data) => {
522
+ addLog(`Got tts:chunk streamId=${data.streamId} (expected=${streamId}) audioLen=${data.audio?.length ?? 0}`);
516
523
  if (data.streamId !== streamId) return;
517
524
  if (data.audio) {
518
525
  ttsAudio.playChunk(data.audio);
519
- addLog(`Received audio chunk (${data.audio.length} b64 chars)`);
526
+ addLog(`Queued audio chunk (${data.audio.length} b64 chars)`, 'ok');
520
527
  }
521
528
  }),
522
529
  socket.on('tts:word', (data) => {
523
530
  if (data.streamId !== streamId) return;
531
+ addLog(`Word: "${data.word}"`);
524
532
  if (data.word) {
525
533
  setCurrentWord(data.word);
526
534
  activeWordIdxRef.current++;
@@ -535,6 +543,7 @@ function TTSSection({ socket }: { socket: UglyBotSocket }) {
535
543
  }
536
544
  }),
537
545
  socket.on('tts:done', (data) => {
546
+ addLog(`Got tts:done streamId=${data.streamId}`);
538
547
  if (data.streamId !== streamId) return;
539
548
  setPlaying(false);
540
549
  setCurrentWord('');
@@ -543,6 +552,7 @@ function TTSSection({ socket }: { socket: UglyBotSocket }) {
543
552
  socket.release();
544
553
  }),
545
554
  socket.on('tts:error', (data) => {
555
+ addLog(`Got tts:error streamId=${data.streamId} msg=${data.message}`, 'err');
546
556
  if (data.streamId !== streamId) return;
547
557
  setPlaying(false);
548
558
  addLog(`TTS error: ${data.message ?? 'unknown'}`, 'err');
@@ -568,16 +578,29 @@ function TTSSection({ socket }: { socket: UglyBotSocket }) {
568
578
 
569
579
  ttsAudio.init();
570
580
  addLog(`Voice: ${voice || 'default'}`);
571
- addLog('Streaming…');
581
+ addLog(`Stream ID: ${streamId}`);
582
+ addLog('Acquiring socket…');
583
+
584
+ try {
585
+ await socket.acquire();
586
+ addLog('Socket acquired', 'ok');
587
+ } catch (err) {
588
+ addLog(`Socket acquire failed: ${err}`, 'err');
589
+ setPlaying(false);
590
+ return;
591
+ }
572
592
 
573
- await socket.acquire();
574
593
  subscribe(streamId);
575
- socket.send('tts:start', {
594
+
595
+ const payload = {
576
596
  streamId,
577
597
  text: text.trim(),
578
598
  ...(voice ? { voice } : {}),
579
599
  requestVisemes: false,
580
- });
600
+ };
601
+ addLog(`Sending tts:start ${JSON.stringify(payload).slice(0, 200)}`);
602
+ socket.send('tts:start', payload);
603
+ addLog('tts:start sent, waiting for chunks…');
581
604
  }
582
605
 
583
606
  function handleStop() {