@cogitator-ai/voice 0.1.12 → 0.1.13
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/audio.d.ts.map +1 -1
- package/dist/audio.js +6 -0
- package/dist/audio.js.map +1 -1
- package/dist/pipeline/pipeline-session.d.ts +2 -1
- package/dist/pipeline/pipeline-session.d.ts.map +1 -1
- package/dist/pipeline/pipeline-session.js +8 -4
- package/dist/pipeline/pipeline-session.js.map +1 -1
- package/dist/realtime/gemini-realtime.d.ts +8 -0
- package/dist/realtime/gemini-realtime.d.ts.map +1 -1
- package/dist/realtime/gemini-realtime.js +84 -22
- package/dist/realtime/gemini-realtime.js.map +1 -1
- package/dist/realtime/openai-realtime.d.ts +2 -0
- package/dist/realtime/openai-realtime.d.ts.map +1 -1
- package/dist/realtime/openai-realtime.js +72 -14
- package/dist/realtime/openai-realtime.js.map +1 -1
- package/dist/realtime/realtime-session.d.ts +4 -0
- package/dist/realtime/realtime-session.d.ts.map +1 -1
- package/dist/realtime/realtime-session.js +15 -2
- package/dist/realtime/realtime-session.js.map +1 -1
- package/dist/stt/deepgram-stt.d.ts.map +1 -1
- package/dist/stt/deepgram-stt.js +39 -9
- package/dist/stt/deepgram-stt.js.map +1 -1
- package/dist/stt/openai-stt.js +8 -0
- package/dist/stt/openai-stt.js.map +1 -1
- package/dist/tools.d.ts +8 -0
- package/dist/tools.d.ts.map +1 -1
- package/dist/tools.js +12 -4
- package/dist/tools.js.map +1 -1
- package/dist/transport/index.d.ts +1 -0
- package/dist/transport/index.d.ts.map +1 -1
- package/dist/transport/ws-transport.d.ts +16 -1
- package/dist/transport/ws-transport.d.ts.map +1 -1
- package/dist/transport/ws-transport.js +74 -8
- package/dist/transport/ws-transport.js.map +1 -1
- package/dist/tts/elevenlabs-tts.d.ts +1 -0
- package/dist/tts/elevenlabs-tts.d.ts.map +1 -1
- package/dist/tts/elevenlabs-tts.js +11 -2
- package/dist/tts/elevenlabs-tts.js.map +1 -1
- package/dist/tts/openai-tts.d.ts +1 -0
- package/dist/tts/openai-tts.d.ts.map +1 -1
- package/dist/tts/openai-tts.js +23 -9
- package/dist/tts/openai-tts.js.map +1 -1
- package/dist/types.d.ts +1 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/vad/silero-vad.d.ts +2 -0
- package/dist/vad/silero-vad.d.ts.map +1 -1
- package/dist/vad/silero-vad.js +13 -0
- package/dist/vad/silero-vad.js.map +1 -1
- package/dist/voice-agent.js +8 -8
- package/dist/voice-agent.js.map +1 -1
- package/package.json +3 -3
|
@@ -3,15 +3,19 @@ import { OpenAIRealtimeAdapter } from './openai-realtime.js';
|
|
|
3
3
|
import { GeminiRealtimeAdapter } from './gemini-realtime.js';
|
|
4
4
|
const FORWARDED_EVENTS = [
|
|
5
5
|
'connected',
|
|
6
|
+
'disconnected',
|
|
6
7
|
'speech_start',
|
|
7
8
|
'transcript',
|
|
8
9
|
'audio',
|
|
9
10
|
'tool_call',
|
|
11
|
+
'turn_end',
|
|
10
12
|
'error',
|
|
11
13
|
];
|
|
12
14
|
export class RealtimeSession extends EventEmitter {
|
|
13
15
|
adapter;
|
|
14
16
|
_provider;
|
|
17
|
+
forwarders = new Map();
|
|
18
|
+
_closed = false;
|
|
15
19
|
constructor(config) {
|
|
16
20
|
super();
|
|
17
21
|
this._provider = config.provider;
|
|
@@ -26,9 +30,11 @@ export class RealtimeSession extends EventEmitter {
|
|
|
26
30
|
throw new Error(`Unknown realtime provider: ${config.provider}`);
|
|
27
31
|
}
|
|
28
32
|
for (const event of FORWARDED_EVENTS) {
|
|
29
|
-
|
|
33
|
+
const forwarder = (...args) => {
|
|
30
34
|
this.emit(event, ...args);
|
|
31
|
-
}
|
|
35
|
+
};
|
|
36
|
+
this.forwarders.set(event, forwarder);
|
|
37
|
+
this.adapter.on(event, forwarder);
|
|
32
38
|
}
|
|
33
39
|
}
|
|
34
40
|
get provider() {
|
|
@@ -47,6 +53,13 @@ export class RealtimeSession extends EventEmitter {
|
|
|
47
53
|
this.adapter.interrupt();
|
|
48
54
|
}
|
|
49
55
|
close() {
|
|
56
|
+
if (this._closed)
|
|
57
|
+
return;
|
|
58
|
+
this._closed = true;
|
|
59
|
+
for (const [event, forwarder] of this.forwarders) {
|
|
60
|
+
this.adapter.off(event, forwarder);
|
|
61
|
+
}
|
|
62
|
+
this.forwarders.clear();
|
|
50
63
|
this.adapter.close();
|
|
51
64
|
}
|
|
52
65
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"realtime-session.js","sourceRoot":"","sources":["../../src/realtime/realtime-session.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAI7D,MAAM,gBAAgB,GAAG;IACvB,WAAW;IACX,cAAc;IACd,YAAY;IACZ,OAAO;IACP,WAAW;IACX,OAAO;CACC,CAAC;
|
|
1
|
+
{"version":3,"file":"realtime-session.js","sourceRoot":"","sources":["../../src/realtime/realtime-session.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAI7D,MAAM,gBAAgB,GAAG;IACvB,WAAW;IACX,cAAc;IACd,cAAc;IACd,YAAY;IACZ,OAAO;IACP,WAAW;IACX,UAAU;IACV,OAAO;CACC,CAAC;AAaX,MAAM,OAAO,eAAgB,SAAQ,YAAmC;IACrD,OAAO,CAAkB;IACzB,SAAS,CAAoC;IAC7C,UAAU,GAAG,IAAI,GAAG,EAAwC,CAAC;IACtE,OAAO,GAAG,KAAK,CAAC;IAExB,YAAY,MAA6B;QACvC,KAAK,EAAE,CAAC;QACR,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC,QAAQ,CAAC;QACjC,QAAQ,MAAM,CAAC,QAAQ,EAAE,CAAC;YACxB,KAAK,QAAQ;gBACX,IAAI,CAAC,OAAO,GAAG,IAAI,qBAAqB,CAAC,MAAM,CAAC,CAAC;gBACjD,MAAM;YACR,KAAK,QAAQ;gBACX,IAAI,CAAC,OAAO,GAAG,IAAI,qBAAqB,CAAC,MAAM,CAAC,CAAC;gBACjD,MAAM;YACR;gBACE,MAAM,IAAI,KAAK,CAAC,8BAA8B,MAAM,CAAC,QAAkB,EAAE,CAAC,CAAC;QAC/E,CAAC;QAED,KAAK,MAAM,KAAK,IAAI,gBAAgB,EAAE,CAAC;YACrC,MAAM,SAAS,GAAG,CAAC,GAAG,IAAe,EAAE,EAAE;gBACvC,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,GAAI,IAAc,CAAC,CAAC;YACvC,CAAC,CAAC;YACF,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;YACtC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;QACpC,CAAC;IACH,CAAC;IAED,IAAI,QAAQ;QACV,OAAO,IAAI,CAAC,SAAS,CAAC;IACxB,CAAC;IAED,KAAK,CAAC,OAAO;QACX,OAAO,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;IAChC,CAAC;IAED,SAAS,CAAC,KAAa;QACrB,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;IAChC,CAAC;IAED,QAAQ,CAAC,IAAY;QACnB,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;IAC9B,CAAC;IAED,SAAS;QACP,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC;IAC3B,CAAC;IAED,KAAK;QACH,IAAI,IAAI,CAAC,OAAO;YAAE,OAAO;QACzB,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;QACpB,KAAK,MAAM,CAAC,KAAK,EAAE,SAAS,CAAC,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YACjD,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;QACrC,CAAC;QACD,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;QACxB,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;IACvB,CAAC;CACF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"deepgram-stt.d.ts","sourceRoot":"","sources":["../../src/stt/deepgram-stt.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,WAAW,EACX,UAAU,EACV,gBAAgB,EAChB,SAAS,EACT,gBAAgB,EACjB,MAAM,aAAa,CAAC;AAErB,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAkCD,qBAAa,WAAY,YAAW,WAAW;IAC7C,QAAQ,CAAC,IAAI,cAAc;IAE3B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAS;IAC/B,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAS;gBAEvB,MAAM,EAAE,iBAAiB;IAM/B,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,UAAU,GAAG,OAAO,CAAC,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"deepgram-stt.d.ts","sourceRoot":"","sources":["../../src/stt/deepgram-stt.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,WAAW,EACX,UAAU,EACV,gBAAgB,EAChB,SAAS,EACT,gBAAgB,EACjB,MAAM,aAAa,CAAC;AAErB,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAkCD,qBAAa,WAAY,YAAW,WAAW;IAC7C,QAAQ,CAAC,IAAI,cAAc;IAE3B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAS;IAC/B,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAS;gBAEvB,MAAM,EAAE,iBAAiB;IAM/B,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,UAAU,GAAG,OAAO,CAAC,gBAAgB,CAAC;IA4BhF,YAAY,CAAC,OAAO,CAAC,EAAE,gBAAgB,GAAG,SAAS;IAInD,OAAO,CAAC,gBAAgB;CAsBzB"}
|
package/dist/stt/deepgram-stt.js
CHANGED
|
@@ -28,6 +28,7 @@ export class DeepgramSTT {
|
|
|
28
28
|
'Content-Type': 'audio/wav',
|
|
29
29
|
},
|
|
30
30
|
body: new Uint8Array(audio),
|
|
31
|
+
signal: AbortSignal.timeout(30_000),
|
|
31
32
|
});
|
|
32
33
|
if (!response.ok) {
|
|
33
34
|
const body = await response.text();
|
|
@@ -40,7 +41,7 @@ export class DeepgramSTT {
|
|
|
40
41
|
return new DeepgramSTTStream(this.apiKey, this.model, this.language, options);
|
|
41
42
|
}
|
|
42
43
|
mapBatchResponse(data) {
|
|
43
|
-
const alt = data.results
|
|
44
|
+
const alt = data.results?.channels?.[0]?.alternatives?.[0];
|
|
44
45
|
const result = {
|
|
45
46
|
text: alt?.transcript ?? '',
|
|
46
47
|
};
|
|
@@ -58,9 +59,12 @@ export class DeepgramSTT {
|
|
|
58
59
|
return result;
|
|
59
60
|
}
|
|
60
61
|
}
|
|
62
|
+
const CLOSE_TIMEOUT_MS = 10_000;
|
|
61
63
|
class DeepgramSTTStream extends EventEmitter {
|
|
62
64
|
ws;
|
|
63
65
|
ready = false;
|
|
66
|
+
closed = false;
|
|
67
|
+
closePromise = null;
|
|
64
68
|
pendingChunks = [];
|
|
65
69
|
lastResult = { text: '' };
|
|
66
70
|
constructor(apiKey, model, language, options) {
|
|
@@ -68,7 +72,7 @@ class DeepgramSTTStream extends EventEmitter {
|
|
|
68
72
|
const params = new URLSearchParams({
|
|
69
73
|
model,
|
|
70
74
|
punctuate: 'true',
|
|
71
|
-
interim_results:
|
|
75
|
+
interim_results: String(options?.interimResults ?? true),
|
|
72
76
|
});
|
|
73
77
|
const lang = options?.language ?? language;
|
|
74
78
|
if (lang)
|
|
@@ -112,6 +116,9 @@ class DeepgramSTTStream extends EventEmitter {
|
|
|
112
116
|
});
|
|
113
117
|
}
|
|
114
118
|
write(chunk) {
|
|
119
|
+
if (this.closed) {
|
|
120
|
+
throw new Error('DeepgramSTTStream: cannot write after close');
|
|
121
|
+
}
|
|
115
122
|
if (this.ready) {
|
|
116
123
|
this.ws.send(chunk);
|
|
117
124
|
}
|
|
@@ -120,14 +127,37 @@ class DeepgramSTTStream extends EventEmitter {
|
|
|
120
127
|
}
|
|
121
128
|
}
|
|
122
129
|
async close() {
|
|
123
|
-
if (
|
|
124
|
-
this.
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
+
if (this.closePromise)
|
|
131
|
+
return this.closePromise;
|
|
132
|
+
this.closed = true;
|
|
133
|
+
this.closePromise = new Promise((resolve) => {
|
|
134
|
+
if (this.ws.readyState === WebSocket.CLOSED || this.ws.readyState === WebSocket.CONNECTING) {
|
|
135
|
+
if (this.ws.readyState === WebSocket.CONNECTING) {
|
|
136
|
+
this.ws.terminate();
|
|
137
|
+
}
|
|
138
|
+
resolve(this.lastResult);
|
|
139
|
+
return;
|
|
140
|
+
}
|
|
141
|
+
const timeout = setTimeout(() => {
|
|
142
|
+
this.ws.terminate();
|
|
143
|
+
resolve(this.lastResult);
|
|
144
|
+
}, CLOSE_TIMEOUT_MS);
|
|
145
|
+
this.ws.once('close', () => {
|
|
146
|
+
clearTimeout(timeout);
|
|
147
|
+
resolve(this.lastResult);
|
|
148
|
+
});
|
|
149
|
+
if (this.ready) {
|
|
150
|
+
this.ws.send(JSON.stringify({ type: 'CloseStream' }));
|
|
151
|
+
}
|
|
152
|
+
else {
|
|
153
|
+
if (this.pendingChunks.length > 0) {
|
|
154
|
+
this.emit('error', new Error(`DeepgramSTTStream: ${this.pendingChunks.length} chunk(s) dropped (connection not ready)`));
|
|
155
|
+
this.pendingChunks = [];
|
|
156
|
+
}
|
|
157
|
+
this.ws.close();
|
|
158
|
+
}
|
|
130
159
|
});
|
|
160
|
+
return this.closePromise;
|
|
131
161
|
}
|
|
132
162
|
mapStreamResult(msg) {
|
|
133
163
|
const alt = msg.channel.alternatives[0];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"deepgram-stt.js","sourceRoot":"","sources":["../../src/stt/deepgram-stt.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,SAAS,EAAE,MAAM,IAAI,CAAC;AAe/B,MAAM,aAAa,GAAG,QAAQ,CAAC;AAC/B,MAAM,QAAQ,GAAG,oCAAoC,CAAC;AACtD,MAAM,MAAM,GAAG,kCAAkC,CAAC;AA8BlD,MAAM,OAAO,WAAW;IACb,IAAI,GAAG,UAAU,CAAC;IAEV,MAAM,CAAS;IACf,KAAK,CAAS;IACd,QAAQ,CAAU;IAEnC,YAAY,MAAyB;QACnC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;QAC5B,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,IAAI,aAAa,CAAC;QAC3C,IAAI,CAAC,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;IAClC,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,KAAa,EAAE,OAAoB;QAClD,MAAM,MAAM,GAAG,IAAI,eAAe,CAAC;YACjC,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,SAAS,EAAE,MAAM;SAClB,CAAC,CAAC;QAEH,MAAM,IAAI,GAAG,OAAO,EAAE,QAAQ,IAAI,IAAI,CAAC,QAAQ,CAAC;QAChD,IAAI,IAAI;YAAE,MAAM,CAAC,GAAG,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;QAEvC,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,QAAQ,IAAI,MAAM,EAAE,EAAE;YACpD,MAAM,EAAE,MAAM;YACd,OAAO,EAAE;gBACP,aAAa,EAAE,SAAS,IAAI,CAAC,MAAM,EAAE;gBACrC,cAAc,EAAE,WAAW;aAC5B;YACD,IAAI,EAAE,IAAI,UAAU,CAAC,KAAK,CAAC;
|
|
1
|
+
{"version":3,"file":"deepgram-stt.js","sourceRoot":"","sources":["../../src/stt/deepgram-stt.ts"],"names":[],"mappings":"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"}
|
package/dist/stt/openai-stt.js
CHANGED
|
@@ -50,6 +50,7 @@ export class OpenAISTT {
|
|
|
50
50
|
}
|
|
51
51
|
class OpenAISTTStream extends EventEmitter {
|
|
52
52
|
chunks = [];
|
|
53
|
+
closed = false;
|
|
53
54
|
transcribeFn;
|
|
54
55
|
options;
|
|
55
56
|
constructor(transcribeFn, options) {
|
|
@@ -58,9 +59,16 @@ class OpenAISTTStream extends EventEmitter {
|
|
|
58
59
|
this.options = options;
|
|
59
60
|
}
|
|
60
61
|
write(chunk) {
|
|
62
|
+
if (this.closed) {
|
|
63
|
+
throw new Error('OpenAISTTStream: cannot write after close');
|
|
64
|
+
}
|
|
61
65
|
this.chunks.push(chunk);
|
|
62
66
|
}
|
|
63
67
|
async close() {
|
|
68
|
+
if (this.closed) {
|
|
69
|
+
return { text: '' };
|
|
70
|
+
}
|
|
71
|
+
this.closed = true;
|
|
64
72
|
const combined = Buffer.concat(this.chunks);
|
|
65
73
|
this.chunks = [];
|
|
66
74
|
try {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"openai-stt.js","sourceRoot":"","sources":["../../src/stt/openai-stt.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,MAAM,MAAM,QAAQ,CAAC;AAgB5B,MAAM,aAAa,GAAG,wBAAwB,CAAC;AAE/C,MAAM,OAAO,SAAS;IACX,IAAI,GAAG,QAAQ,CAAC;IAER,MAAM,CAAS;IACf,KAAK,CAAS;IAE/B,YAAY,MAAuB;QACjC,IAAI,CAAC,MAAM,GAAG,IAAI,MAAM,CAAC;YACvB,MAAM,EAAE,MAAM,CAAC,MAAM;YACrB,GAAG,CAAC,MAAM,CAAC,OAAO,IAAI,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC;SACnD,CAAC,CAAC;QACH,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,IAAI,aAAa,CAAC;IAC7C,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,KAAa,EAAE,OAAoB;QAClD,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,CAAC,IAAI,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,WAAW,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC,CAAC;QAEnF,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,cAAc,CAAC,MAAM,CAAC;YAC7D,IAAI;YACJ,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,eAAe,EAAE,cAAc;YAC/B,uBAAuB,EAAE,CAAC,MAAM,CAAC;YACjC,GAAG,CAAC,OAAO,EAAE,QAAQ,IAAI,EAAE,QAAQ,EAAE,OAAO,CAAC,QAAQ,EAAE,CAAC;YACxD,GAAG,CAAC,OAAO,EAAE,MAAM,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC;SACnD,CAAC,CAAC;QAEH,OAAO,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;IACpC,CAAC;IAED,YAAY,CAAC,OAA0B;QACrC,OAAO,IAAI,eAAe,CAAC,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,IAAI,CAAC,EAAE,OAAO,CAAC,CAAC;IACrF,CAAC;IAEO,WAAW,CAAC,QAA8B;QAChD,MAAM,MAAM,GAAqB;YAC/B,IAAI,EAAE,QAAQ,CAAC,IAAI;SACpB,CAAC;QAEF,IAAI,QAAQ,CAAC,QAAQ,EAAE,CAAC;YACtB,MAAM,CAAC,QAAQ,GAAG,QAAQ,CAAC,QAAQ,CAAC;QACtC,CAAC;QAED,IAAI,QAAQ,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;YACpC,MAAM,CAAC,QAAQ,GAAG,QAAQ,CAAC,QAAQ,CAAC;QACtC,CAAC;QAED,IAAI,QAAQ,CAAC,KAAK,IAAI,QAAQ,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAChD,MAAM,CAAC,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;gBACxC,IAAI,EAAE,CAAC,CAAC,IAAI;gBACZ,KAAK,EAAE,CAAC,CAAC,KAAK;gBACd,GAAG,EAAE,CAAC,CAAC,GAAG;gBACV,UAAU,EAAE,CAAC;aACd,CAAC,CAAC,CAAC;QACN,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;CACF;AAID,MAAM,eAAgB,SAAQ,YAAY;IAChC,MAAM,GAAa,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"openai-stt.js","sourceRoot":"","sources":["../../src/stt/openai-stt.ts"],"names":[],"mappings":"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"}
|
package/dist/tools.d.ts
CHANGED
|
@@ -14,6 +14,14 @@ type TranscribeParams = z.infer<typeof TranscribeParamsSchema>;
|
|
|
14
14
|
declare const SpeakParamsSchema: z.ZodObject<{
|
|
15
15
|
text: z.ZodString;
|
|
16
16
|
voice: z.ZodOptional<z.ZodString>;
|
|
17
|
+
format: z.ZodOptional<z.ZodEnum<{
|
|
18
|
+
pcm16: "pcm16";
|
|
19
|
+
mp3: "mp3";
|
|
20
|
+
opus: "opus";
|
|
21
|
+
aac: "aac";
|
|
22
|
+
flac: "flac";
|
|
23
|
+
wav: "wav";
|
|
24
|
+
}>>;
|
|
17
25
|
}, z.core.$strip>;
|
|
18
26
|
type SpeakParams = z.infer<typeof SpeakParamsSchema>;
|
|
19
27
|
export declare function transcribeTool(stt: STTProvider): VoiceTool<TranscribeParams>;
|
package/dist/tools.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../src/tools.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE3D,MAAM,WAAW,SAAS,CAAC,OAAO,GAAG,OAAO;IAC1C,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IAC/B,OAAO,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;CAChD;
|
|
1
|
+
{"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../src/tools.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE3D,MAAM,WAAW,SAAS,CAAC,OAAO,GAAG,OAAO;IAC1C,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IAC/B,OAAO,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;CAChD;AAID,QAAA,MAAM,sBAAsB;;;iBAM1B,CAAC;AAEH,KAAK,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,sBAAsB,CAAC,CAAC;AAE/D,QAAA,MAAM,iBAAiB;;;;;;;;;;;iBAOrB,CAAC;AAEH,KAAK,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAErD,wBAAgB,cAAc,CAAC,GAAG,EAAE,WAAW,GAAG,SAAS,CAAC,gBAAgB,CAAC,CAW5E;AAED,wBAAgB,SAAS,CAAC,GAAG,EAAE,WAAW,GAAG,SAAS,CAAC,WAAW,CAAC,CAUlE;AAED,wBAAgB,UAAU,CAAC,MAAM,EAAE;IACjC,GAAG,EAAE,WAAW,CAAC;IACjB,GAAG,EAAE,WAAW,CAAC;CAClB,GAAG,CAAC,SAAS,CAAC,gBAAgB,CAAC,EAAE,SAAS,CAAC,WAAW,CAAC,CAAC,CAExD"}
|
package/dist/tools.js
CHANGED
|
@@ -1,11 +1,19 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
|
+
const MAX_AUDIO_BASE64_LENGTH = 50 * 1024 * 1024 * 1.37;
|
|
2
3
|
const TranscribeParamsSchema = z.object({
|
|
3
|
-
audioBase64: z
|
|
4
|
+
audioBase64: z
|
|
5
|
+
.string()
|
|
6
|
+
.max(Math.ceil(MAX_AUDIO_BASE64_LENGTH))
|
|
7
|
+
.describe('Base64-encoded audio data'),
|
|
4
8
|
language: z.string().optional().describe('Language code (e.g., "en", "es")'),
|
|
5
9
|
});
|
|
6
10
|
const SpeakParamsSchema = z.object({
|
|
7
11
|
text: z.string().describe('Text to convert to speech'),
|
|
8
12
|
voice: z.string().optional().describe('Voice to use'),
|
|
13
|
+
format: z
|
|
14
|
+
.enum(['pcm16', 'mp3', 'opus', 'aac', 'flac', 'wav'])
|
|
15
|
+
.optional()
|
|
16
|
+
.describe('Output audio format'),
|
|
9
17
|
});
|
|
10
18
|
export function transcribeTool(stt) {
|
|
11
19
|
return {
|
|
@@ -24,9 +32,9 @@ export function speakTool(tts) {
|
|
|
24
32
|
name: 'speak_text',
|
|
25
33
|
description: 'Convert text to speech audio',
|
|
26
34
|
parameters: SpeakParamsSchema,
|
|
27
|
-
execute: async ({ text, voice }) => {
|
|
28
|
-
const audio = await tts.synthesize(text, { voice });
|
|
29
|
-
return { audioBase64: audio.toString('base64'), format: 'mp3' };
|
|
35
|
+
execute: async ({ text, voice, format }) => {
|
|
36
|
+
const audio = await tts.synthesize(text, { voice, format });
|
|
37
|
+
return { audioBase64: audio.toString('base64'), format: format ?? 'mp3' };
|
|
30
38
|
},
|
|
31
39
|
};
|
|
32
40
|
}
|
package/dist/tools.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tools.js","sourceRoot":"","sources":["../src/tools.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAUxB,MAAM,sBAAsB,GAAG,CAAC,CAAC,MAAM,CAAC;IACtC,WAAW,EAAE,CAAC,
|
|
1
|
+
{"version":3,"file":"tools.js","sourceRoot":"","sources":["../src/tools.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAUxB,MAAM,uBAAuB,GAAG,EAAE,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;AAExD,MAAM,sBAAsB,GAAG,CAAC,CAAC,MAAM,CAAC;IACtC,WAAW,EAAE,CAAC;SACX,MAAM,EAAE;SACR,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;SACvC,QAAQ,CAAC,2BAA2B,CAAC;IACxC,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,kCAAkC,CAAC;CAC7E,CAAC,CAAC;AAIH,MAAM,iBAAiB,GAAG,CAAC,CAAC,MAAM,CAAC;IACjC,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,2BAA2B,CAAC;IACtD,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,cAAc,CAAC;IACrD,MAAM,EAAE,CAAC;SACN,IAAI,CAAC,CAAC,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;SACpD,QAAQ,EAAE;SACV,QAAQ,CAAC,qBAAqB,CAAC;CACnC,CAAC,CAAC;AAIH,MAAM,UAAU,cAAc,CAAC,GAAgB;IAC7C,OAAO;QACL,IAAI,EAAE,kBAAkB;QACxB,WAAW,EAAE,yDAAyD;QACtE,UAAU,EAAE,sBAAsB;QAClC,OAAO,EAAE,KAAK,EAAE,EAAE,WAAW,EAAE,QAAQ,EAAE,EAAE,EAAE;YAC3C,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC;YACjD,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC;YACzD,OAAO,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE,CAAC;QACrF,CAAC;KACF,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,GAAgB;IACxC,OAAO;QACL,IAAI,EAAE,YAAY;QAClB,WAAW,EAAE,8BAA8B;QAC3C,UAAU,EAAE,iBAAiB;QAC7B,OAAO,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE;YACzC,MAAM,KAAK,GAAG,MAAM,GAAG,CAAC,UAAU,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;YAC5D,OAAO,EAAE,WAAW,EAAE,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,MAAM,IAAI,KAAK,EAAE,CAAC;QAC5E,CAAC;KACF,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,MAG1B;IACC,OAAO,CAAC,cAAc,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,SAAS,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;AAC7D,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/transport/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/transport/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AACpE,YAAY,EAAE,yBAAyB,EAAE,MAAM,mBAAmB,CAAC"}
|
|
@@ -2,6 +2,12 @@ import { EventEmitter } from 'node:events';
|
|
|
2
2
|
import http from 'node:http';
|
|
3
3
|
import { WebSocket } from 'ws';
|
|
4
4
|
import type { WebSocketTransportConfig } from '../types.js';
|
|
5
|
+
export interface WebSocketTransportOptions extends WebSocketTransportConfig {
|
|
6
|
+
verifyClient?: (req: http.IncomingMessage) => true | {
|
|
7
|
+
code: number;
|
|
8
|
+
message: string;
|
|
9
|
+
};
|
|
10
|
+
}
|
|
5
11
|
interface VoiceClientEvents {
|
|
6
12
|
audio: [chunk: Buffer];
|
|
7
13
|
message: [msg: Record<string, unknown>];
|
|
@@ -11,7 +17,11 @@ interface VoiceClientEvents {
|
|
|
11
17
|
export declare class VoiceClient extends EventEmitter<VoiceClientEvents> {
|
|
12
18
|
private readonly ws;
|
|
13
19
|
readonly id: string;
|
|
20
|
+
private alive;
|
|
14
21
|
constructor(ws: WebSocket);
|
|
22
|
+
get isAlive(): boolean;
|
|
23
|
+
markDead(): void;
|
|
24
|
+
ping(): void;
|
|
15
25
|
sendAudio(chunk: Buffer): void;
|
|
16
26
|
sendMessage(msg: Record<string, unknown>): void;
|
|
17
27
|
close(code?: number, reason?: string): void;
|
|
@@ -22,16 +32,21 @@ interface TransportEvents {
|
|
|
22
32
|
export declare class WebSocketTransport extends EventEmitter<TransportEvents> {
|
|
23
33
|
private readonly path;
|
|
24
34
|
private readonly maxConnections;
|
|
35
|
+
private readonly verifyClient?;
|
|
25
36
|
private wss;
|
|
26
37
|
private server;
|
|
27
38
|
private ownsServer;
|
|
28
39
|
private clients;
|
|
29
|
-
|
|
40
|
+
private upgradeHandler;
|
|
41
|
+
private pingInterval;
|
|
42
|
+
constructor(config?: WebSocketTransportOptions);
|
|
30
43
|
listen(port: number): Promise<void>;
|
|
31
44
|
attachToServer(server: http.Server): void;
|
|
32
45
|
get port(): number | undefined;
|
|
33
46
|
close(): Promise<void>;
|
|
34
47
|
private setupWss;
|
|
48
|
+
private startKeepalive;
|
|
49
|
+
private stopKeepalive;
|
|
35
50
|
}
|
|
36
51
|
export {};
|
|
37
52
|
//# sourceMappingURL=ws-transport.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ws-transport.d.ts","sourceRoot":"","sources":["../../src/transport/ws-transport.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,IAAI,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"ws-transport.d.ts","sourceRoot":"","sources":["../../src/transport/ws-transport.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,OAAO,EAAmB,SAAS,EAAE,MAAM,IAAI,CAAC;AAEhD,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,aAAa,CAAC;AAE5D,MAAM,WAAW,yBAA0B,SAAQ,wBAAwB;IACzE,YAAY,CAAC,EAAE,CAAC,GAAG,EAAE,IAAI,CAAC,eAAe,KAAK,IAAI,GAAG;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;CACxF;AAID,UAAU,iBAAiB;IACzB,KAAK,EAAE,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;IACvB,OAAO,EAAE,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IACxC,KAAK,EAAE,EAAE,CAAC;IACV,KAAK,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;CACvB;AAED,qBAAa,WAAY,SAAQ,YAAY,CAAC,iBAAiB,CAAC;IAIlD,OAAO,CAAC,QAAQ,CAAC,EAAE;IAH/B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,KAAK,CAAQ;gBAEQ,EAAE,EAAE,SAAS;IA+B1C,IAAI,OAAO,IAAI,OAAO,CAErB;IAED,QAAQ,IAAI,IAAI;IAIhB,IAAI,IAAI,IAAI;IAMZ,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAM9B,WAAW,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IAM/C,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI;CAG5C;AAED,UAAU,eAAe;IACvB,UAAU,EAAE,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;CACnC;AAED,qBAAa,kBAAmB,SAAQ,YAAY,CAAC,eAAe,CAAC;IACnE,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAS;IAC9B,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAS;IACxC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAC,CAA4C;IAC1E,OAAO,CAAC,GAAG,CAAgC;IAC3C,OAAO,CAAC,MAAM,CAA4B;IAC1C,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,OAAO,CAA0B;IACzC,OAAO,CAAC,cAAc,CAEN;IAChB,OAAO,CAAC,YAAY,CAA+C;gBAEvD,MAAM,CAAC,EAAE,yBAAyB;IAOxC,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAczC,cAAc,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,GAAG,IAAI;IAOzC,IAAI,IAAI,IAAI,MAAM,GAAG,SAAS,CAI7B;IAEK,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IA2B5B,OAAO,CAAC,QAAQ;IA+ChB,OAAO,CAAC,cAAc;IActB,OAAO,CAAC,aAAa;CAMtB"}
|
|
@@ -2,20 +2,28 @@ import { EventEmitter } from 'node:events';
|
|
|
2
2
|
import http from 'node:http';
|
|
3
3
|
import { WebSocketServer, WebSocket } from 'ws';
|
|
4
4
|
import { nanoid } from 'nanoid';
|
|
5
|
+
const KEEPALIVE_INTERVAL_MS = 30_000;
|
|
5
6
|
export class VoiceClient extends EventEmitter {
|
|
6
7
|
ws;
|
|
7
8
|
id;
|
|
9
|
+
alive = true;
|
|
8
10
|
constructor(ws) {
|
|
9
11
|
super();
|
|
10
12
|
this.ws = ws;
|
|
11
13
|
this.id = nanoid();
|
|
12
14
|
ws.on('message', (data, isBinary) => {
|
|
15
|
+
const buf = Array.isArray(data)
|
|
16
|
+
? Buffer.concat(data)
|
|
17
|
+
: data instanceof ArrayBuffer
|
|
18
|
+
? Buffer.from(new Uint8Array(data))
|
|
19
|
+
: data;
|
|
13
20
|
if (isBinary) {
|
|
14
|
-
this.emit('audio',
|
|
21
|
+
this.emit('audio', buf);
|
|
15
22
|
}
|
|
16
23
|
else {
|
|
17
24
|
try {
|
|
18
|
-
const
|
|
25
|
+
const raw = buf.toString();
|
|
26
|
+
const parsed = JSON.parse(raw);
|
|
19
27
|
this.emit('message', parsed);
|
|
20
28
|
}
|
|
21
29
|
catch (err) {
|
|
@@ -23,9 +31,23 @@ export class VoiceClient extends EventEmitter {
|
|
|
23
31
|
}
|
|
24
32
|
}
|
|
25
33
|
});
|
|
34
|
+
ws.on('pong', () => {
|
|
35
|
+
this.alive = true;
|
|
36
|
+
});
|
|
26
37
|
ws.on('close', () => this.emit('close'));
|
|
27
38
|
ws.on('error', (err) => this.emit('error', err));
|
|
28
39
|
}
|
|
40
|
+
get isAlive() {
|
|
41
|
+
return this.alive;
|
|
42
|
+
}
|
|
43
|
+
markDead() {
|
|
44
|
+
this.alive = false;
|
|
45
|
+
}
|
|
46
|
+
ping() {
|
|
47
|
+
if (this.ws.readyState === WebSocket.OPEN) {
|
|
48
|
+
this.ws.ping();
|
|
49
|
+
}
|
|
50
|
+
}
|
|
29
51
|
sendAudio(chunk) {
|
|
30
52
|
if (this.ws.readyState === WebSocket.OPEN) {
|
|
31
53
|
this.ws.send(chunk);
|
|
@@ -43,14 +65,18 @@ export class VoiceClient extends EventEmitter {
|
|
|
43
65
|
export class WebSocketTransport extends EventEmitter {
|
|
44
66
|
path;
|
|
45
67
|
maxConnections;
|
|
68
|
+
verifyClient;
|
|
46
69
|
wss = null;
|
|
47
70
|
server = null;
|
|
48
71
|
ownsServer = false;
|
|
49
72
|
clients = new Set();
|
|
73
|
+
upgradeHandler = null;
|
|
74
|
+
pingInterval = null;
|
|
50
75
|
constructor(config) {
|
|
51
76
|
super();
|
|
52
77
|
this.path = config?.path ?? '/voice';
|
|
53
78
|
this.maxConnections = config?.maxConnections ?? 100;
|
|
79
|
+
this.verifyClient = config?.verifyClient;
|
|
54
80
|
}
|
|
55
81
|
async listen(port) {
|
|
56
82
|
if (this.wss)
|
|
@@ -67,6 +93,8 @@ export class WebSocketTransport extends EventEmitter {
|
|
|
67
93
|
});
|
|
68
94
|
}
|
|
69
95
|
attachToServer(server) {
|
|
96
|
+
if (this.wss)
|
|
97
|
+
throw new Error('Transport already set up — call close() first');
|
|
70
98
|
this.server = server;
|
|
71
99
|
this.ownsServer = false;
|
|
72
100
|
this.setupWss(server);
|
|
@@ -78,14 +106,19 @@ export class WebSocketTransport extends EventEmitter {
|
|
|
78
106
|
return undefined;
|
|
79
107
|
}
|
|
80
108
|
async close() {
|
|
109
|
+
this.stopKeepalive();
|
|
110
|
+
if (this.server && this.upgradeHandler) {
|
|
111
|
+
this.server.removeListener('upgrade', this.upgradeHandler);
|
|
112
|
+
this.upgradeHandler = null;
|
|
113
|
+
}
|
|
81
114
|
for (const client of this.clients) {
|
|
82
115
|
client.close(1001, 'server shutting down');
|
|
83
116
|
}
|
|
84
|
-
this.clients.clear();
|
|
85
117
|
if (this.wss) {
|
|
86
118
|
await new Promise((resolve) => this.wss.close(() => resolve()));
|
|
87
119
|
this.wss = null;
|
|
88
120
|
}
|
|
121
|
+
this.clients.clear();
|
|
89
122
|
if (this.ownsServer && this.server) {
|
|
90
123
|
await new Promise((resolve, reject) => this.server.close((err) => (err ? reject(err) : resolve())));
|
|
91
124
|
this.server = null;
|
|
@@ -93,18 +126,30 @@ export class WebSocketTransport extends EventEmitter {
|
|
|
93
126
|
}
|
|
94
127
|
setupWss(server) {
|
|
95
128
|
this.wss = new WebSocketServer({ noServer: true });
|
|
96
|
-
|
|
129
|
+
this.upgradeHandler = (req, socket, head) => {
|
|
97
130
|
socket.on('error', () => socket.destroy());
|
|
131
|
+
if (!this.wss) {
|
|
132
|
+
socket.write('HTTP/1.1 503 Service Unavailable\r\n\r\n');
|
|
133
|
+
socket.destroy();
|
|
134
|
+
return;
|
|
135
|
+
}
|
|
98
136
|
const url = new URL(req.url || '/', `http://${req.headers.host || 'localhost'}`);
|
|
99
137
|
if (url.pathname !== this.path) {
|
|
100
138
|
socket.write('HTTP/1.1 404 Not Found\r\n\r\n');
|
|
101
139
|
socket.destroy();
|
|
102
140
|
return;
|
|
103
141
|
}
|
|
142
|
+
if (this.verifyClient) {
|
|
143
|
+
const result = this.verifyClient(req);
|
|
144
|
+
if (result !== true) {
|
|
145
|
+
socket.write(`HTTP/1.1 ${result.code} ${result.message}\r\n\r\n`);
|
|
146
|
+
socket.destroy();
|
|
147
|
+
return;
|
|
148
|
+
}
|
|
149
|
+
}
|
|
104
150
|
if (this.clients.size >= this.maxConnections) {
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
});
|
|
151
|
+
socket.write('HTTP/1.1 503 Service Unavailable\r\n\r\n');
|
|
152
|
+
socket.destroy();
|
|
108
153
|
return;
|
|
109
154
|
}
|
|
110
155
|
this.wss.handleUpgrade(req, socket, head, (ws) => {
|
|
@@ -113,7 +158,28 @@ export class WebSocketTransport extends EventEmitter {
|
|
|
113
158
|
client.on('close', () => this.clients.delete(client));
|
|
114
159
|
this.emit('connection', client);
|
|
115
160
|
});
|
|
116
|
-
}
|
|
161
|
+
};
|
|
162
|
+
server.on('upgrade', this.upgradeHandler);
|
|
163
|
+
this.startKeepalive();
|
|
164
|
+
}
|
|
165
|
+
startKeepalive() {
|
|
166
|
+
this.pingInterval = setInterval(() => {
|
|
167
|
+
for (const client of this.clients) {
|
|
168
|
+
if (!client.isAlive) {
|
|
169
|
+
client.close(1001, 'pong timeout');
|
|
170
|
+
this.clients.delete(client);
|
|
171
|
+
continue;
|
|
172
|
+
}
|
|
173
|
+
client.markDead();
|
|
174
|
+
client.ping();
|
|
175
|
+
}
|
|
176
|
+
}, KEEPALIVE_INTERVAL_MS);
|
|
177
|
+
}
|
|
178
|
+
stopKeepalive() {
|
|
179
|
+
if (this.pingInterval) {
|
|
180
|
+
clearInterval(this.pingInterval);
|
|
181
|
+
this.pingInterval = null;
|
|
182
|
+
}
|
|
117
183
|
}
|
|
118
184
|
}
|
|
119
185
|
//# sourceMappingURL=ws-transport.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ws-transport.js","sourceRoot":"","sources":["../../src/transport/ws-transport.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,IAAI,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"ws-transport.js","sourceRoot":"","sources":["../../src/transport/ws-transport.ts"],"names":[],"mappings":"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"}
|
|
@@ -13,5 +13,6 @@ export declare class ElevenLabsTTS implements TTSProvider {
|
|
|
13
13
|
synthesize(text: string, options?: TTSOptions): Promise<Buffer>;
|
|
14
14
|
streamSynthesize(text: string, options?: TTSOptions): AsyncGenerator<Buffer>;
|
|
15
15
|
private request;
|
|
16
|
+
private validateText;
|
|
16
17
|
}
|
|
17
18
|
//# sourceMappingURL=elevenlabs-tts.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"elevenlabs-tts.d.ts","sourceRoot":"","sources":["../../src/tts/elevenlabs-tts.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,UAAU,EAAoB,MAAM,aAAa,CAAC;AAE7E,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;
|
|
1
|
+
{"version":3,"file":"elevenlabs-tts.d.ts","sourceRoot":"","sources":["../../src/tts/elevenlabs-tts.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,UAAU,EAAoB,MAAM,aAAa,CAAC;AAE7E,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AA0BD,qBAAa,aAAc,YAAW,WAAW;IAC/C,QAAQ,CAAC,IAAI,gBAAgB;IAE7B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAS;gBAEnB,MAAM,EAAE,mBAAmB;IAMjC,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC;IAO9D,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,UAAU,GAAG,cAAc,CAAC,MAAM,CAAC;YAqBrE,OAAO;IA8BrB,OAAO,CAAC,YAAY;CAKrB"}
|
|
@@ -10,9 +10,9 @@ function mapFormat(format) {
|
|
|
10
10
|
case 'flac':
|
|
11
11
|
return 'flac_22050';
|
|
12
12
|
case 'wav':
|
|
13
|
-
|
|
13
|
+
throw new Error('ElevenLabs does not support WAV output. Use pcm16 for raw PCM or mp3 for a compressed format.');
|
|
14
14
|
case 'aac':
|
|
15
|
-
|
|
15
|
+
throw new Error('ElevenLabs does not support AAC output. Use mp3 for a compressed format.');
|
|
16
16
|
case 'mp3':
|
|
17
17
|
default:
|
|
18
18
|
return 'mp3_44100_128';
|
|
@@ -29,11 +29,13 @@ export class ElevenLabsTTS {
|
|
|
29
29
|
this.model = config.model ?? DEFAULT_MODEL;
|
|
30
30
|
}
|
|
31
31
|
async synthesize(text, options) {
|
|
32
|
+
this.validateText(text);
|
|
32
33
|
const response = await this.request(text, options);
|
|
33
34
|
const arrayBuffer = await response.arrayBuffer();
|
|
34
35
|
return Buffer.from(arrayBuffer);
|
|
35
36
|
}
|
|
36
37
|
async *streamSynthesize(text, options) {
|
|
38
|
+
this.validateText(text);
|
|
37
39
|
const response = await this.request(text, options, '/stream');
|
|
38
40
|
if (!response.body) {
|
|
39
41
|
throw new Error('ElevenLabs returned empty response body');
|
|
@@ -48,6 +50,7 @@ export class ElevenLabsTTS {
|
|
|
48
50
|
}
|
|
49
51
|
}
|
|
50
52
|
finally {
|
|
53
|
+
await reader.cancel();
|
|
51
54
|
reader.releaseLock();
|
|
52
55
|
}
|
|
53
56
|
}
|
|
@@ -69,6 +72,7 @@ export class ElevenLabsTTS {
|
|
|
69
72
|
similarity_boost: 0.75,
|
|
70
73
|
},
|
|
71
74
|
}),
|
|
75
|
+
signal: AbortSignal.timeout(60_000),
|
|
72
76
|
});
|
|
73
77
|
if (!response.ok) {
|
|
74
78
|
const body = await response.text();
|
|
@@ -76,5 +80,10 @@ export class ElevenLabsTTS {
|
|
|
76
80
|
}
|
|
77
81
|
return response;
|
|
78
82
|
}
|
|
83
|
+
validateText(text) {
|
|
84
|
+
if (!text || text.trim().length === 0) {
|
|
85
|
+
throw new Error('ElevenLabs TTS: text must not be empty');
|
|
86
|
+
}
|
|
87
|
+
}
|
|
79
88
|
}
|
|
80
89
|
//# sourceMappingURL=elevenlabs-tts.js.map
|