dvgateway-sdk 1.4.4 → 1.4.6
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/client.d.ts +46 -0
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +49 -0
- package/dist/client.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/simulator/simulator.d.ts +71 -0
- package/dist/simulator/simulator.d.ts.map +1 -0
- package/dist/simulator/simulator.js +306 -0
- package/dist/simulator/simulator.js.map +1 -0
- package/dist/simulator/simulator.test.d.ts +2 -0
- package/dist/simulator/simulator.test.d.ts.map +1 -0
- package/dist/simulator/simulator.test.js +105 -0
- package/dist/simulator/simulator.test.js.map +1 -0
- package/dist/simulator/wav.d.ts +19 -0
- package/dist/simulator/wav.d.ts.map +1 -0
- package/dist/simulator/wav.js +100 -0
- package/dist/simulator/wav.js.map +1 -0
- package/dist/streams/tts-stream.d.ts.map +1 -1
- package/dist/streams/tts-stream.js +24 -12
- package/dist/streams/tts-stream.js.map +1 -1
- package/dist/transport/ws-pool.d.ts +39 -0
- package/dist/transport/ws-pool.d.ts.map +1 -1
- package/dist/transport/ws-pool.js +88 -2
- package/dist/transport/ws-pool.js.map +1 -1
- package/package.json +1 -1
package/dist/client.d.ts
CHANGED
|
@@ -22,6 +22,7 @@
|
|
|
22
22
|
import { type AudioStreamHandle, type PipelineType } from './streams/audio-stream.js';
|
|
23
23
|
import { PipelineBuilder } from './pipeline/builder.js';
|
|
24
24
|
import { PipelineMetrics } from './observability/metrics.js';
|
|
25
|
+
import { type SimulateOptions, type SimulatedCall } from './simulator/simulator.js';
|
|
25
26
|
import type { DVGatewayOptions, CallSession, CallEvent, TTSCompleteEvent, TranscriptResult, StreamDir, TtsAdapter, Unsubscribe } from './types/index.js';
|
|
26
27
|
export declare class DVGatewayClient {
|
|
27
28
|
private readonly auth;
|
|
@@ -48,6 +49,51 @@ export declare class DVGatewayClient {
|
|
|
48
49
|
* ```
|
|
49
50
|
*/
|
|
50
51
|
pipeline(): PipelineBuilder;
|
|
52
|
+
/**
|
|
53
|
+
* Simulate an inbound call from a local audio file — no gateway, no
|
|
54
|
+
* PBX, no phone number required. The existing pipeline runs unchanged
|
|
55
|
+
* (same `pipeline().stt().llm().tts().start()`) and the simulator
|
|
56
|
+
* acts as a loopback gateway: it fires a synthetic `call:new` event,
|
|
57
|
+
* streams the audio file frame-by-frame into the pipeline, captures
|
|
58
|
+
* the bot's injected TTS reply into an in-memory buffer, then fires
|
|
59
|
+
* `call:ended` after a grace period.
|
|
60
|
+
*
|
|
61
|
+
* This is the recommended way to:
|
|
62
|
+
* - run SDK examples in the docs "Try it" widgets,
|
|
63
|
+
* - write unit tests for voice-bot logic,
|
|
64
|
+
* - onboard developers before their gateway and DID are provisioned.
|
|
65
|
+
*
|
|
66
|
+
* The audio file must be 16 kHz mono 16-bit PCM — either a WAV or a
|
|
67
|
+
* raw slin16 capture. Convert arbitrary assets with:
|
|
68
|
+
*
|
|
69
|
+
* `ffmpeg -i input.mp3 -ar 16000 -ac 1 -sample_fmt s16 caller.wav`
|
|
70
|
+
*
|
|
71
|
+
* @example
|
|
72
|
+
* ```typescript
|
|
73
|
+
* const gw = new DVGatewayClient({
|
|
74
|
+
* baseUrl: 'http://localhost:8080',
|
|
75
|
+
* auth: { type: 'apiKey', apiKey: 'simulation' },
|
|
76
|
+
* });
|
|
77
|
+
*
|
|
78
|
+
* // Start the pipeline (non-awaited — runs until gw.close()).
|
|
79
|
+
* void gw.pipeline().stt(stt).llm(llm).tts(tts).start();
|
|
80
|
+
*
|
|
81
|
+
* // Drive a fake call.
|
|
82
|
+
* const call = await gw.simulate({
|
|
83
|
+
* audioFile: './samples/customer-inquiry.wav',
|
|
84
|
+
* caller: '+82-10-1234-5678',
|
|
85
|
+
* });
|
|
86
|
+
* await call.waitForEnd();
|
|
87
|
+
* await call.saveTts('./samples/bot-reply.wav');
|
|
88
|
+
*
|
|
89
|
+
* gw.close();
|
|
90
|
+
* ```
|
|
91
|
+
*
|
|
92
|
+
* @param opts Simulation parameters — audio file path is required.
|
|
93
|
+
* @returns A handle exposing `waitForEnd()`, `saveTts(path)`,
|
|
94
|
+
* `capturedTtsBytes()`, and `stop()`.
|
|
95
|
+
*/
|
|
96
|
+
simulate(opts: SimulateOptions): Promise<SimulatedCall>;
|
|
51
97
|
/**
|
|
52
98
|
* Subscribe to real-time audio from a call.
|
|
53
99
|
* Returns an AsyncIterable that yields AudioChunk (Float32, 16kHz).
|
package/dist/client.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAMH,OAAO,EAAqB,KAAK,iBAAiB,EAAE,KAAK,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAIzG,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAMH,OAAO,EAAqB,KAAK,iBAAiB,EAAE,KAAK,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAIzG,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAE7D,OAAO,EAEL,KAAK,eAAe,EACpB,KAAK,aAAa,EACnB,MAAM,0BAA0B,CAAC;AAElC,OAAO,KAAK,EACV,gBAAgB,EAChB,WAAW,EACX,SAAS,EACT,gBAAgB,EAEhB,gBAAgB,EAChB,SAAS,EACT,UAAU,EACV,WAAW,EAEZ,MAAM,kBAAkB,CAAC;AAE1B,qBAAa,eAAe;IAC1B,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAc;IACnC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAa;IAClC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAkB;IAC7C,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAc;IAC1C,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAiB;IAC1C,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAiB;IACzC,QAAQ,CAAC,OAAO,EAAE,eAAe,CAAC;IAClC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;gBAEpB,IAAI,EAAE,gBAAgB;IAsBlC;;;;;;;;;;;;OAYG;IACH,QAAQ,IAAI,eAAe;IAW3B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OA2CG;IACG,QAAQ,CAAC,IAAI,EAAE,eAAe,GAAG,OAAO,CAAC,aAAa,CAAC;IAM7D;;;;;;;;;;;;;;;;;;;;;;;;OAwBG;IACH,WAAW,CACT,QAAQ,EAAE,MAAM,EAChB,IAAI,GAAE;QAAE,GAAG,CAAC,EAAE,SAAS,CAAC;QAAC,YAAY,CAAC,EAAE,YAAY,CAAA;KAAO,GAC1D,iBAAiB;IAMpB;;;;;;;;;;OAUG;IACG,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAKpD;;;OAGG;IACG,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAOnD;;;;;;;;;;;;;;;;;;;;;;;;;;OA0BG;IACG,OAAO,CACX,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,QAAQ,GAAG,QAAQ,EACzB,QAAQ,EAAE,OAAO,GAChB,OAAO,CAAC,IAAI,CAAC;IAShB;;;;;;;;;OASG;IACG,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,aAAa,CAAC,MAAM,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAIpF;;OAEG;IACG,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,aAAa,CAAC,MAAM,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAIrF;;;;;;;;;;;;;;;;;;OAkBG;IACG,GAAG,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAIzE;;;;;;;;OAQG;IACG,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAMhF;;;OAGG;IACG,MAAM,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAK7C;;;OAGG;IACG,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAWtF,kFAAkF;IAC5E,YAAY,IAAI,OAAO,CAAC,OAAO,CAAC;IAMtC,uDAAuD;IACjD,WAAW,CAAC,MAAM,EAAE;QACxB,MAAM,EAAE,MAAM,CAAC;QACf,MAAM,EAAE,MAAM,CAAC;QACf,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,YAAY,CAAC,EAAE,MAAM,CAAC;KACvB,GAAG,OAAO,CAAC,OAAO,CAAC;IAQpB,gDAAgD;IAC1C,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAM3E,8CAA8C;IACxC,YAAY,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,EAAE,MAAM,EAAE;QACjF,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,SAAS,CAAC,EAAE,MAAM,CAAC;KACpB,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAMvC,iDAAiD;IAC3C,eAAe,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAQlH,6CAA6C;IACvC,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAKtD,wEAAwE;IAClE,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE;QAC3C,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,YAAY,CAAC,EAAE,OAAO,CAAC;KACxB,GAAG,OAAO,CAAC,OAAO,CAAC;IAOpB;;;;;;;;;;;;;;;;;OAiBG;IACH,MAAM,CAAC,QAAQ,CAAC,uBAAuB,cAAc;IAErD;;;;;;;;;;;;;;;;;;;;;;OAsBG;IACG,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAM3E;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAiDG;IACG,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE;QAC7C,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,GAAG,CAAC,EAAE;YACJ,IAAI,EAAE,MAAM,CAAC;YACb,QAAQ,CAAC,EAAE,MAAM,CAAC;YAClB,KAAK,CAAC,EAAE,MAAM,CAAC;SAChB,CAAC;KACH,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAMvC;;;;OAIG;IACG,oBAAoB,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAI/D;;;;;;;;;;;;;;;;OAgBG;IACG,oBAAoB,CAAC,MAAM,EAAE;QACjC,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,GAAG,CAAC,EAAE;YACJ,IAAI,EAAE,MAAM,CAAC;YACb,QAAQ,CAAC,EAAE,MAAM,CAAC;YAClB,KAAK,CAAC,EAAE,MAAM,CAAC;SAChB,CAAC;KACH,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAMvC,yBAAyB;IACnB,aAAa,IAAI,OAAO,CAAC,OAAO,CAAC;IAKvC,4DAA4D;IACtD,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAKxD,2BAA2B;IACrB,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAK/C,wBAAwB;IAClB,cAAc,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAKnE,wBAAwB;IAClB,cAAc,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAKlD,+BAA+B;IACzB,aAAa,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAKjD,qBAAqB;IACf,aAAa,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAKjD,6BAA6B;IACvB,cAAc,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAKlD,sBAAsB;IAChB,cAAc,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAKlD,gCAAgC;IAC1B,kBAAkB,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAOtD;;;;;;;;;;;OAWG;IACH,WAAW,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,SAAS,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,WAAW;IAI7E,8CAA8C;IAC9C,EAAE,CAAC,CAAC,SAAS,SAAS,EACpB,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,EACf,OAAO,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,GAC1C,WAAW;IAId;;;;;;;;;;;;;;;;;;OAkBG;IACH,aAAa,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,gBAAgB,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,WAAW;IAMtF,8CAA8C;IACxC,YAAY,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC;IAI5C,sDAAsD;IAChD,oBAAoB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IAIpE,qEAAqE;IAC/D,iBAAiB,CACrB,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAC3B,OAAO,CAAC,IAAI,CAAC;IAMhB;;;OAGG;IACG,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC;IAI/E;;OAEG;IACG,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,GAAE,MAAM,GAAG,KAAa,GAAG,OAAO,CAAC,MAAM,CAAC;IAItF;;;OAGG;IACH,qBAAqB,CAAC,MAAM,EAAE,MAAM,GAAG,CAAC,MAAM,EAAE,gBAAgB,KAAK,OAAO,CAAC,IAAI,CAAC;IAMlF;;;OAGG;IACH,KAAK,IAAI,IAAI;IAOb,OAAO,CAAC,gBAAgB;IAgBxB;;;;;;;;OAQG;IACH,OAAO,CAAC,aAAa;CAmBtB"}
|
package/dist/client.js
CHANGED
|
@@ -30,6 +30,7 @@ import { MinutesManager } from './minutes/manager.js';
|
|
|
30
30
|
import { PipelineBuilder } from './pipeline/builder.js';
|
|
31
31
|
import { PipelineMetrics } from './observability/metrics.js';
|
|
32
32
|
import { createLogger } from './observability/logger.js';
|
|
33
|
+
import { createSimulatedCall, } from './simulator/simulator.js';
|
|
33
34
|
export class DVGatewayClient {
|
|
34
35
|
auth;
|
|
35
36
|
wsPool;
|
|
@@ -70,6 +71,54 @@ export class DVGatewayClient {
|
|
|
70
71
|
pipeline() {
|
|
71
72
|
return new PipelineBuilder(this.wsPool, this.callEvents, this.ttsInjector, this.logger);
|
|
72
73
|
}
|
|
74
|
+
// ─── Simulation (no gateway / no phone required) ────────────────────────
|
|
75
|
+
/**
|
|
76
|
+
* Simulate an inbound call from a local audio file — no gateway, no
|
|
77
|
+
* PBX, no phone number required. The existing pipeline runs unchanged
|
|
78
|
+
* (same `pipeline().stt().llm().tts().start()`) and the simulator
|
|
79
|
+
* acts as a loopback gateway: it fires a synthetic `call:new` event,
|
|
80
|
+
* streams the audio file frame-by-frame into the pipeline, captures
|
|
81
|
+
* the bot's injected TTS reply into an in-memory buffer, then fires
|
|
82
|
+
* `call:ended` after a grace period.
|
|
83
|
+
*
|
|
84
|
+
* This is the recommended way to:
|
|
85
|
+
* - run SDK examples in the docs "Try it" widgets,
|
|
86
|
+
* - write unit tests for voice-bot logic,
|
|
87
|
+
* - onboard developers before their gateway and DID are provisioned.
|
|
88
|
+
*
|
|
89
|
+
* The audio file must be 16 kHz mono 16-bit PCM — either a WAV or a
|
|
90
|
+
* raw slin16 capture. Convert arbitrary assets with:
|
|
91
|
+
*
|
|
92
|
+
* `ffmpeg -i input.mp3 -ar 16000 -ac 1 -sample_fmt s16 caller.wav`
|
|
93
|
+
*
|
|
94
|
+
* @example
|
|
95
|
+
* ```typescript
|
|
96
|
+
* const gw = new DVGatewayClient({
|
|
97
|
+
* baseUrl: 'http://localhost:8080',
|
|
98
|
+
* auth: { type: 'apiKey', apiKey: 'simulation' },
|
|
99
|
+
* });
|
|
100
|
+
*
|
|
101
|
+
* // Start the pipeline (non-awaited — runs until gw.close()).
|
|
102
|
+
* void gw.pipeline().stt(stt).llm(llm).tts(tts).start();
|
|
103
|
+
*
|
|
104
|
+
* // Drive a fake call.
|
|
105
|
+
* const call = await gw.simulate({
|
|
106
|
+
* audioFile: './samples/customer-inquiry.wav',
|
|
107
|
+
* caller: '+82-10-1234-5678',
|
|
108
|
+
* });
|
|
109
|
+
* await call.waitForEnd();
|
|
110
|
+
* await call.saveTts('./samples/bot-reply.wav');
|
|
111
|
+
*
|
|
112
|
+
* gw.close();
|
|
113
|
+
* ```
|
|
114
|
+
*
|
|
115
|
+
* @param opts Simulation parameters — audio file path is required.
|
|
116
|
+
* @returns A handle exposing `waitForEnd()`, `saveTts(path)`,
|
|
117
|
+
* `capturedTtsBytes()`, and `stop()`.
|
|
118
|
+
*/
|
|
119
|
+
async simulate(opts) {
|
|
120
|
+
return createSimulatedCall({ wsPool: this.wsPool, logger: this.logger }, opts);
|
|
121
|
+
}
|
|
73
122
|
// ─── Mid-Level: Audio Streaming ─────────────────────────────────────────
|
|
74
123
|
/**
|
|
75
124
|
* Subscribe to real-time audio from a call.
|
package/dist/client.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -29,6 +29,7 @@
|
|
|
29
29
|
*/
|
|
30
30
|
export { DVGatewayClient } from './client.js';
|
|
31
31
|
export type { PipelineType, AudioStreamOptions } from './streams/audio-stream.js';
|
|
32
|
+
export type { SimulateOptions, SimulatedCall } from './simulator/simulator.js';
|
|
32
33
|
export type { ApiKeyAuth, JwtAuth, Auth, DVGatewayOptions, ReconnectOptions, SecurityOptions, MtlsOptions, CallSession, ConferenceSession, ConferenceParticipant, StreamDir, CallEvent, CallNewEvent, CallEndedEvent, ConfJoinEvent, ConfLeaveEvent, ConfEndedEvent, TTSCompleteEvent, CallEventType, AudioChunk, RawAudioChunk, SttAdapter, TtsAdapter, LlmAdapter, TranscriptResult, TranscriptWord, SentimentResult, TtsOptions, VoiceInfo, HumanVoiceOptions, SttOptions, Message, LlmOptions, PipelineOptions, PipelineEventHandlers, HookContext, BeforeChatHook, AfterChatHook, HistoryOptions, PipelineConfig, MinutesDownloadOptions, Logger, Unsubscribe, Result, } from './types/index.js';
|
|
33
34
|
export { HUMAN_VOICE_DEFAULTS_KO, HUMAN_VOICE_DEFAULTS_EN, } from './types/index.js';
|
|
34
35
|
export { slin16ToFloat32, float32ToSlin16, ulawToSlin16, slin16ToUlaw, resample, calculateRms, detectVoiceActivity, } from './audio/codec.js';
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAGH,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAG9C,YAAY,EAAE,YAAY,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAGlF,YAAY,EAEV,UAAU,EACV,OAAO,EACP,IAAI,EAGJ,gBAAgB,EAChB,gBAAgB,EAChB,eAAe,EACf,WAAW,EAGX,WAAW,EACX,iBAAiB,EACjB,qBAAqB,EACrB,SAAS,EAGT,SAAS,EACT,YAAY,EACZ,cAAc,EACd,aAAa,EACb,cAAc,EACd,cAAc,EACd,gBAAgB,EAChB,aAAa,EAGb,UAAU,EACV,aAAa,EAGb,UAAU,EACV,UAAU,EACV,UAAU,EACV,gBAAgB,EAChB,cAAc,EACd,eAAe,EACf,UAAU,EACV,SAAS,EACT,iBAAiB,EACjB,UAAU,EACV,OAAO,EACP,UAAU,EAGV,eAAe,EACf,qBAAqB,EAGrB,WAAW,EACX,cAAc,EACd,aAAa,EACb,cAAc,EACd,cAAc,EAGd,sBAAsB,EAGtB,MAAM,EAGN,WAAW,EACX,MAAM,GACP,MAAM,kBAAkB,CAAC;AAG1B,OAAO,EACL,uBAAuB,EACvB,uBAAuB,GACxB,MAAM,kBAAkB,CAAC;AAG1B,OAAO,EACL,eAAe,EACf,eAAe,EACf,YAAY,EACZ,YAAY,EACZ,QAAQ,EACR,YAAY,EACZ,mBAAmB,GACpB,MAAM,kBAAkB,CAAC;AAG1B,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAGxE,OAAO,EAAE,eAAe,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,4BAA4B,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAGH,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAG9C,YAAY,EAAE,YAAY,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAGlF,YAAY,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAG/E,YAAY,EAEV,UAAU,EACV,OAAO,EACP,IAAI,EAGJ,gBAAgB,EAChB,gBAAgB,EAChB,eAAe,EACf,WAAW,EAGX,WAAW,EACX,iBAAiB,EACjB,qBAAqB,EACrB,SAAS,EAGT,SAAS,EACT,YAAY,EACZ,cAAc,EACd,aAAa,EACb,cAAc,EACd,cAAc,EACd,gBAAgB,EAChB,aAAa,EAGb,UAAU,EACV,aAAa,EAGb,UAAU,EACV,UAAU,EACV,UAAU,EACV,gBAAgB,EAChB,cAAc,EACd,eAAe,EACf,UAAU,EACV,SAAS,EACT,iBAAiB,EACjB,UAAU,EACV,OAAO,EACP,UAAU,EAGV,eAAe,EACf,qBAAqB,EAGrB,WAAW,EACX,cAAc,EACd,aAAa,EACb,cAAc,EACd,cAAc,EAGd,sBAAsB,EAGtB,MAAM,EAGN,WAAW,EACX,MAAM,GACP,MAAM,kBAAkB,CAAC;AAG1B,OAAO,EACL,uBAAuB,EACvB,uBAAuB,GACxB,MAAM,kBAAkB,CAAC;AAG1B,OAAO,EACL,eAAe,EACf,eAAe,EACf,YAAY,EACZ,YAAY,EACZ,QAAQ,EACR,YAAY,EACZ,mBAAmB,GACpB,MAAM,kBAAkB,CAAC;AAG1B,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAGxE,OAAO,EAAE,eAAe,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,4BAA4B,CAAC"}
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAEH,cAAc;AACd,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAEH,cAAc;AACd,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AA6E9C,sBAAsB;AACtB,OAAO,EACL,uBAAuB,EACvB,uBAAuB,GACxB,MAAM,kBAAkB,CAAC;AAE1B,qDAAqD;AACrD,OAAO,EACL,eAAe,EACf,eAAe,EACf,YAAY,EACZ,YAAY,EACZ,QAAQ,EACR,YAAY,EACZ,mBAAmB,GACpB,MAAM,kBAAkB,CAAC;AAE1B,iBAAiB;AACjB,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAExE,UAAU;AACV,OAAO,EAAE,eAAe,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,4BAA4B,CAAC"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import type { WsPool } from '../transport/ws-pool.js';
|
|
2
|
+
import type { CallSession, Logger } from '../types/index.js';
|
|
3
|
+
import { SIMULATOR_SAMPLE_RATE } from './wav.js';
|
|
4
|
+
/** Options passed to `DVGatewayClient.simulate()`. */
|
|
5
|
+
export interface SimulateOptions {
|
|
6
|
+
/**
|
|
7
|
+
* Path to the caller's audio. Accepts:
|
|
8
|
+
* - 16 kHz mono 16-bit PCM WAV (standard), or
|
|
9
|
+
* - raw slin16 PCM (no header).
|
|
10
|
+
*
|
|
11
|
+
* Convert arbitrary sources with:
|
|
12
|
+
* `ffmpeg -i input.mp3 -ar 16000 -ac 1 -sample_fmt s16 caller.wav`
|
|
13
|
+
*/
|
|
14
|
+
readonly audioFile: string;
|
|
15
|
+
/** Unique call identifier. Auto-generated if omitted. */
|
|
16
|
+
readonly linkedId?: string;
|
|
17
|
+
/** Synthetic CallerID number shown to the pipeline. */
|
|
18
|
+
readonly caller?: string;
|
|
19
|
+
/** Synthetic CallerID name. */
|
|
20
|
+
readonly callerName?: string;
|
|
21
|
+
/** Dialled extension shown to the pipeline. */
|
|
22
|
+
readonly callee?: string;
|
|
23
|
+
/** DID main number. */
|
|
24
|
+
readonly did?: string;
|
|
25
|
+
/** Tenant identifier — propagated into the synthetic call:new event. */
|
|
26
|
+
readonly tenantId?: string;
|
|
27
|
+
/**
|
|
28
|
+
* Pace playback at 20 ms/frame (default, mimics a real call). Set to
|
|
29
|
+
* `false` to flush all frames as fast as possible — useful in CI
|
|
30
|
+
* where wall-clock time matters more than fidelity.
|
|
31
|
+
*/
|
|
32
|
+
readonly realtime?: boolean;
|
|
33
|
+
/**
|
|
34
|
+
* Delay between end-of-caller-audio and the synthetic `call:ended`
|
|
35
|
+
* event. Gives the pipeline time to finish its last TTS response
|
|
36
|
+
* before the call is "hung up". Default: 5 seconds.
|
|
37
|
+
*/
|
|
38
|
+
readonly hangupDelayMs?: number;
|
|
39
|
+
/** Optional hook: invoked for every captured TTS frame. */
|
|
40
|
+
readonly onTts?: (chunk: Buffer) => void;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Handle returned from `simulate()`. Lets the caller wait for the
|
|
44
|
+
* simulated call to finish, retrieve the bot's spoken reply, or stop
|
|
45
|
+
* the simulation early.
|
|
46
|
+
*/
|
|
47
|
+
export interface SimulatedCall {
|
|
48
|
+
readonly linkedId: string;
|
|
49
|
+
readonly session: CallSession;
|
|
50
|
+
/** Resolves once the caller audio has drained and the hangup fires. */
|
|
51
|
+
waitForEnd(): Promise<void>;
|
|
52
|
+
/** Terminate early — emits `call:ended` and releases routes. */
|
|
53
|
+
stop(): Promise<void>;
|
|
54
|
+
/** Return the concatenated captured-TTS PCM (slin16). */
|
|
55
|
+
capturedTtsBytes(): Buffer;
|
|
56
|
+
/** Write captured TTS as a 16 kHz mono WAV to disk. */
|
|
57
|
+
saveTts(outputPath: string): Promise<void>;
|
|
58
|
+
}
|
|
59
|
+
/** Construction context — not part of the public API. */
|
|
60
|
+
export interface SimulatorContext {
|
|
61
|
+
readonly wsPool: WsPool;
|
|
62
|
+
readonly logger: Logger;
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Core factory — used by `DVGatewayClient.simulate()`. Returns a
|
|
66
|
+
* SimulatedCall that has already registered its WS routes; the pipeline
|
|
67
|
+
* will start pulling from them as soon as it subscribes.
|
|
68
|
+
*/
|
|
69
|
+
export declare function createSimulatedCall(ctx: SimulatorContext, opts: SimulateOptions): Promise<SimulatedCall>;
|
|
70
|
+
export { SIMULATOR_SAMPLE_RATE };
|
|
71
|
+
//# sourceMappingURL=simulator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"simulator.d.ts","sourceRoot":"","sources":["../../src/simulator/simulator.ts"],"names":[],"mappings":"AAiCA,OAAO,KAAK,EAAE,MAAM,EAAmD,MAAM,yBAAyB,CAAC;AACvG,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAC7D,OAAO,EAAE,qBAAqB,EAAkC,MAAM,UAAU,CAAC;AAMjF,sDAAsD;AACtD,MAAM,WAAW,eAAe;IAC9B;;;;;;;OAOG;IACH,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,yDAAyD;IACzD,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,uDAAuD;IACvD,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,+BAA+B;IAC/B,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,+CAA+C;IAC/C,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,uBAAuB;IACvB,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IACtB,wEAAwE;IACxE,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B;;;;OAIG;IACH,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;IAC5B;;;;OAIG;IACH,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAChC,2DAA2D;IAC3D,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;CAC1C;AAED;;;;GAIG;AACH,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,OAAO,EAAE,WAAW,CAAC;IAC9B,uEAAuE;IACvE,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5B,gEAAgE;IAChE,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACtB,yDAAyD;IACzD,gBAAgB,IAAI,MAAM,CAAC;IAC3B,uDAAuD;IACvD,OAAO,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC5C;AAED,yDAAyD;AACzD,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AAsBD;;;;GAIG;AACH,wBAAsB,mBAAmB,CACvC,GAAG,EAAE,gBAAgB,EACrB,IAAI,EAAE,eAAe,GACpB,OAAO,CAAC,aAAa,CAAC,CA2ExB;AAkLD,OAAO,EAAE,qBAAqB,EAAE,CAAC"}
|
|
@@ -0,0 +1,306 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* DVGateway SDK Simulator
|
|
3
|
+
*
|
|
4
|
+
* Drives an existing DVGatewayClient pipeline from a local audio file
|
|
5
|
+
* without ever opening a real connection to a gateway or placing a real
|
|
6
|
+
* phone call. Intended for unit tests, CI, docs "Try it" widgets, and
|
|
7
|
+
* developer onboarding — `npm start` → hear your bot answer a recorded
|
|
8
|
+
* customer inquiry in seconds.
|
|
9
|
+
*
|
|
10
|
+
* Implementation strategy: `DVGatewayClient.simulate()` installs three
|
|
11
|
+
* simulated routes on the internal `WsPool`:
|
|
12
|
+
*
|
|
13
|
+
* 1. `/api/v1/ws/callinfo` — emits one synthetic `call:new` event for
|
|
14
|
+
* the simulated call, then a `call:ended` event after the audio
|
|
15
|
+
* finishes plus a grace period.
|
|
16
|
+
* 2. `/api/v1/ws/stream?linkedid={id}` — streams slin16 frames from
|
|
17
|
+
* the caller's audio file, paced at 20 ms/frame by default
|
|
18
|
+
* (`realtime: true`). Any inbound `thinking:start/stop` signals
|
|
19
|
+
* from the pipeline are silently acknowledged.
|
|
20
|
+
* 3. `/api/v1/ws/tts/{linkedId}` — captures injected TTS bytes into
|
|
21
|
+
* an in-memory buffer. Retrievable via `capturedTtsBytes()` or
|
|
22
|
+
* written out via `saveTts()`.
|
|
23
|
+
*
|
|
24
|
+
* The pipeline code under test doesn't change — the same five-line
|
|
25
|
+
* `gw.pipeline().stt().llm().tts().start()` runs, and the simulator
|
|
26
|
+
* simply acts as a loopback gateway. The simulator drives call
|
|
27
|
+
* progression (audio playback, hangup) on its own clock so a call
|
|
28
|
+
* still completes cleanly even when the pipeline has not subscribed
|
|
29
|
+
* to the audio stream (useful for unit tests of event handling).
|
|
30
|
+
*/
|
|
31
|
+
import { EventEmitter } from 'events';
|
|
32
|
+
import { randomBytes } from 'crypto';
|
|
33
|
+
import { SIMULATOR_SAMPLE_RATE, writeSlin16Wav, readSlin16File } from './wav.js';
|
|
34
|
+
/** 20 ms slin16 frame — matches the gateway's native frame size. */
|
|
35
|
+
const FRAME_BYTES = 640;
|
|
36
|
+
const FRAME_DURATION_MS = 20;
|
|
37
|
+
/** Build a synthetic CallSession from user overrides + defaults. */
|
|
38
|
+
function buildSession(opts, linkedId) {
|
|
39
|
+
return {
|
|
40
|
+
linkedId,
|
|
41
|
+
dir: 'both',
|
|
42
|
+
caller: opts.caller ?? '+1-555-0100',
|
|
43
|
+
callerName: opts.callerName ?? 'Simulated Caller',
|
|
44
|
+
callee: opts.callee ?? '100',
|
|
45
|
+
did: opts.did ?? opts.callee ?? '100',
|
|
46
|
+
startedAt: new Date(),
|
|
47
|
+
streamUrl: `sim://audio/${linkedId}`,
|
|
48
|
+
tenantId: opts.tenantId,
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
/** Pick a linkedId that won't collide with real gateway IDs. */
|
|
52
|
+
function generateLinkedId() {
|
|
53
|
+
return `sim-${Date.now().toString(36)}-${randomBytes(4).toString('hex')}`;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Core factory — used by `DVGatewayClient.simulate()`. Returns a
|
|
57
|
+
* SimulatedCall that has already registered its WS routes; the pipeline
|
|
58
|
+
* will start pulling from them as soon as it subscribes.
|
|
59
|
+
*/
|
|
60
|
+
export async function createSimulatedCall(ctx, opts) {
|
|
61
|
+
const linkedId = opts.linkedId ?? generateLinkedId();
|
|
62
|
+
const session = buildSession(opts, linkedId);
|
|
63
|
+
const hangupDelayMs = opts.hangupDelayMs ?? 5_000;
|
|
64
|
+
const realtime = opts.realtime !== false;
|
|
65
|
+
const pcm = await readSlin16File(opts.audioFile);
|
|
66
|
+
if (pcm.length === 0) {
|
|
67
|
+
throw new Error(`simulator: audio file is empty: ${opts.audioFile}`);
|
|
68
|
+
}
|
|
69
|
+
const state = new SimulatorState(ctx.logger, linkedId, session, pcm, realtime, hangupDelayMs);
|
|
70
|
+
// ── Route 1: call events ────────────────────────────────────────────
|
|
71
|
+
const callInfoRoute = {
|
|
72
|
+
matches: (path) => path === '/api/v1/ws/callinfo',
|
|
73
|
+
onSubscribe: (sub) => {
|
|
74
|
+
state.attachCallinfo(sub);
|
|
75
|
+
return {
|
|
76
|
+
send: () => { },
|
|
77
|
+
sendText: () => { },
|
|
78
|
+
close: () => state.detachCallinfo(sub),
|
|
79
|
+
};
|
|
80
|
+
},
|
|
81
|
+
};
|
|
82
|
+
// ── Route 2: audio stream ───────────────────────────────────────────
|
|
83
|
+
const audioRoute = {
|
|
84
|
+
matches: (path, params) => path === '/api/v1/ws/stream' && params['linkedid'] === linkedId,
|
|
85
|
+
onSubscribe: (sub) => {
|
|
86
|
+
state.attachAudio(sub);
|
|
87
|
+
return {
|
|
88
|
+
// pipeline never sends binary on the inbound-audio WS
|
|
89
|
+
send: () => { },
|
|
90
|
+
sendText: (text) => {
|
|
91
|
+
// thinking:start / thinking:stop — log only, no side effects
|
|
92
|
+
ctx.logger.debug({ linkedId, text }, 'simulator: thinking signal');
|
|
93
|
+
},
|
|
94
|
+
close: () => state.detachAudio(sub),
|
|
95
|
+
};
|
|
96
|
+
},
|
|
97
|
+
};
|
|
98
|
+
// ── Route 3: TTS capture ────────────────────────────────────────────
|
|
99
|
+
const ttsPath = `/api/v1/ws/tts/${encodeURIComponent(linkedId)}`;
|
|
100
|
+
const ttsRoute = {
|
|
101
|
+
matches: (path) => path === ttsPath,
|
|
102
|
+
onSubscribe: () => {
|
|
103
|
+
return {
|
|
104
|
+
send: (chunk) => {
|
|
105
|
+
state.captureTts(chunk);
|
|
106
|
+
opts.onTts?.(chunk);
|
|
107
|
+
},
|
|
108
|
+
sendText: () => { },
|
|
109
|
+
close: () => { },
|
|
110
|
+
};
|
|
111
|
+
},
|
|
112
|
+
};
|
|
113
|
+
const disposers = [
|
|
114
|
+
ctx.wsPool.addSimulatedRoute(callInfoRoute),
|
|
115
|
+
ctx.wsPool.addSimulatedRoute(audioRoute),
|
|
116
|
+
ctx.wsPool.addSimulatedRoute(ttsRoute),
|
|
117
|
+
];
|
|
118
|
+
state.onStop = () => {
|
|
119
|
+
for (const d of disposers)
|
|
120
|
+
d();
|
|
121
|
+
};
|
|
122
|
+
// Kick off the call clock. Playback runs on its own timer so the
|
|
123
|
+
// simulation always terminates, even when nothing subscribes to the
|
|
124
|
+
// audio stream (e.g. a unit test that only listens for call events).
|
|
125
|
+
state.start();
|
|
126
|
+
return state.handle();
|
|
127
|
+
}
|
|
128
|
+
// ─── Private implementation ──────────────────────────────────────────
|
|
129
|
+
class SimulatorState {
|
|
130
|
+
logger;
|
|
131
|
+
linkedId;
|
|
132
|
+
session;
|
|
133
|
+
pcm;
|
|
134
|
+
realtime;
|
|
135
|
+
hangupDelayMs;
|
|
136
|
+
callNewPayload;
|
|
137
|
+
callNewDeliveredTo = new WeakSet();
|
|
138
|
+
callinfoSubs = new Set();
|
|
139
|
+
audioSubs = new Set();
|
|
140
|
+
callEndedDelivered = false;
|
|
141
|
+
frameIndex = 0;
|
|
142
|
+
totalFrames;
|
|
143
|
+
playbackTimer = null;
|
|
144
|
+
hangupTimer = null;
|
|
145
|
+
captured = [];
|
|
146
|
+
end = new EventEmitter();
|
|
147
|
+
stopped = false;
|
|
148
|
+
startedAt = 0;
|
|
149
|
+
onStop = () => undefined;
|
|
150
|
+
constructor(logger, linkedId, session, pcm, realtime, hangupDelayMs) {
|
|
151
|
+
this.logger = logger;
|
|
152
|
+
this.linkedId = linkedId;
|
|
153
|
+
this.session = session;
|
|
154
|
+
this.pcm = pcm;
|
|
155
|
+
this.realtime = realtime;
|
|
156
|
+
this.hangupDelayMs = hangupDelayMs;
|
|
157
|
+
this.totalFrames = Math.ceil(pcm.length / FRAME_BYTES);
|
|
158
|
+
this.callNewPayload = Buffer.from(JSON.stringify({
|
|
159
|
+
event: 'call:new',
|
|
160
|
+
linkedId: this.linkedId,
|
|
161
|
+
dir: this.session.dir,
|
|
162
|
+
caller: this.session.caller,
|
|
163
|
+
callerName: this.session.callerName,
|
|
164
|
+
callee: this.session.callee,
|
|
165
|
+
did: this.session.did,
|
|
166
|
+
streamUrl: this.session.streamUrl,
|
|
167
|
+
tenantId: this.session.tenantId,
|
|
168
|
+
}), 'utf8');
|
|
169
|
+
}
|
|
170
|
+
start() {
|
|
171
|
+
this.startedAt = Date.now();
|
|
172
|
+
if (this.realtime) {
|
|
173
|
+
// Realtime: one 20 ms frame per tick; setInterval naturally calls
|
|
174
|
+
// `tick()` once more after the last frame, which triggers
|
|
175
|
+
// `onPlaybackComplete()` via the frameIndex >= totalFrames branch.
|
|
176
|
+
this.playbackTimer = setInterval(() => this.tick(), FRAME_DURATION_MS);
|
|
177
|
+
}
|
|
178
|
+
else {
|
|
179
|
+
// Fast path for tests/CI: flush all frames on a microtask, then
|
|
180
|
+
// explicitly complete. Subscribers attaching synchronously after
|
|
181
|
+
// simulate() resolves still catch every frame (they register
|
|
182
|
+
// before this microtask runs).
|
|
183
|
+
queueMicrotask(() => {
|
|
184
|
+
while (!this.stopped && this.frameIndex < this.totalFrames) {
|
|
185
|
+
this.pushFrame();
|
|
186
|
+
}
|
|
187
|
+
if (!this.stopped)
|
|
188
|
+
this.onPlaybackComplete();
|
|
189
|
+
});
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
tick() {
|
|
193
|
+
if (this.stopped)
|
|
194
|
+
return;
|
|
195
|
+
if (this.frameIndex >= this.totalFrames) {
|
|
196
|
+
this.onPlaybackComplete();
|
|
197
|
+
return;
|
|
198
|
+
}
|
|
199
|
+
this.pushFrame();
|
|
200
|
+
}
|
|
201
|
+
pushFrame() {
|
|
202
|
+
const start = this.frameIndex * FRAME_BYTES;
|
|
203
|
+
const end = Math.min(start + FRAME_BYTES, this.pcm.length);
|
|
204
|
+
const frame = this.pcm.subarray(start, end);
|
|
205
|
+
// Share the slice; subscribers that modify must copy. All known
|
|
206
|
+
// SDK consumers only read.
|
|
207
|
+
for (const sub of this.audioSubs) {
|
|
208
|
+
sub.onMessage(Buffer.from(frame));
|
|
209
|
+
}
|
|
210
|
+
this.frameIndex++;
|
|
211
|
+
}
|
|
212
|
+
onPlaybackComplete() {
|
|
213
|
+
if (this.playbackTimer) {
|
|
214
|
+
clearInterval(this.playbackTimer);
|
|
215
|
+
this.playbackTimer = null;
|
|
216
|
+
}
|
|
217
|
+
// Close audio streams so the STT adapter sees EOF.
|
|
218
|
+
for (const sub of this.audioSubs) {
|
|
219
|
+
sub.onClose?.();
|
|
220
|
+
}
|
|
221
|
+
// Schedule the hangup so the pipeline finishes its last TTS reply.
|
|
222
|
+
this.hangupTimer = setTimeout(() => {
|
|
223
|
+
this.emitCallEnded((Date.now() - this.startedAt) / 1000);
|
|
224
|
+
this.end.emit('end');
|
|
225
|
+
}, this.hangupDelayMs);
|
|
226
|
+
}
|
|
227
|
+
attachCallinfo(sub) {
|
|
228
|
+
this.callinfoSubs.add(sub);
|
|
229
|
+
// Deliver call:new on the next microtask so subscribe() returns
|
|
230
|
+
// before the event lands in the caller's handler.
|
|
231
|
+
queueMicrotask(() => {
|
|
232
|
+
if (this.stopped)
|
|
233
|
+
return;
|
|
234
|
+
if (this.callNewDeliveredTo.has(sub))
|
|
235
|
+
return;
|
|
236
|
+
this.callNewDeliveredTo.add(sub);
|
|
237
|
+
sub.onMessage(Buffer.from(this.callNewPayload));
|
|
238
|
+
this.logger.info({ linkedId: this.linkedId }, 'simulator: call:new delivered');
|
|
239
|
+
});
|
|
240
|
+
}
|
|
241
|
+
detachCallinfo(sub) {
|
|
242
|
+
this.callinfoSubs.delete(sub);
|
|
243
|
+
}
|
|
244
|
+
attachAudio(sub) {
|
|
245
|
+
this.audioSubs.add(sub);
|
|
246
|
+
}
|
|
247
|
+
detachAudio(sub) {
|
|
248
|
+
this.audioSubs.delete(sub);
|
|
249
|
+
}
|
|
250
|
+
captureTts(chunk) {
|
|
251
|
+
this.captured.push(Buffer.from(chunk));
|
|
252
|
+
}
|
|
253
|
+
emitCallEnded(durationSec) {
|
|
254
|
+
if (this.callEndedDelivered)
|
|
255
|
+
return;
|
|
256
|
+
this.callEndedDelivered = true;
|
|
257
|
+
const payload = Buffer.from(JSON.stringify({
|
|
258
|
+
event: 'call:ended',
|
|
259
|
+
linkedId: this.linkedId,
|
|
260
|
+
duration: durationSec,
|
|
261
|
+
}), 'utf8');
|
|
262
|
+
for (const sub of this.callinfoSubs) {
|
|
263
|
+
sub.onMessage(payload);
|
|
264
|
+
}
|
|
265
|
+
this.logger.info({ linkedId: this.linkedId, durationSec }, 'simulator: call:ended delivered');
|
|
266
|
+
}
|
|
267
|
+
handle() {
|
|
268
|
+
const self = this;
|
|
269
|
+
return {
|
|
270
|
+
linkedId: self.linkedId,
|
|
271
|
+
session: self.session,
|
|
272
|
+
waitForEnd() {
|
|
273
|
+
if (self.callEndedDelivered)
|
|
274
|
+
return Promise.resolve();
|
|
275
|
+
return new Promise((resolve) => {
|
|
276
|
+
self.end.once('end', () => resolve());
|
|
277
|
+
});
|
|
278
|
+
},
|
|
279
|
+
async stop() {
|
|
280
|
+
if (self.stopped)
|
|
281
|
+
return;
|
|
282
|
+
self.stopped = true;
|
|
283
|
+
if (self.playbackTimer) {
|
|
284
|
+
clearInterval(self.playbackTimer);
|
|
285
|
+
self.playbackTimer = null;
|
|
286
|
+
}
|
|
287
|
+
if (self.hangupTimer) {
|
|
288
|
+
clearTimeout(self.hangupTimer);
|
|
289
|
+
self.hangupTimer = null;
|
|
290
|
+
}
|
|
291
|
+
self.emitCallEnded(0);
|
|
292
|
+
self.end.emit('end');
|
|
293
|
+
self.onStop();
|
|
294
|
+
},
|
|
295
|
+
capturedTtsBytes() {
|
|
296
|
+
return Buffer.concat(self.captured);
|
|
297
|
+
},
|
|
298
|
+
async saveTts(outputPath) {
|
|
299
|
+
const buf = Buffer.concat(self.captured);
|
|
300
|
+
await writeSlin16Wav(outputPath, buf);
|
|
301
|
+
},
|
|
302
|
+
};
|
|
303
|
+
}
|
|
304
|
+
}
|
|
305
|
+
export { SIMULATOR_SAMPLE_RATE };
|
|
306
|
+
//# sourceMappingURL=simulator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"simulator.js","sourceRoot":"","sources":["../../src/simulator/simulator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"simulator.test.d.ts","sourceRoot":"","sources":["../../src/simulator/simulator.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Unit tests for the SDK simulator.
|
|
3
|
+
*
|
|
4
|
+
* Exercises the end-to-end shape of `DVGatewayClient.simulate()`:
|
|
5
|
+
* - synthetic `call:new` delivery,
|
|
6
|
+
* - paced slin16 frame playback,
|
|
7
|
+
* - captured-TTS buffer round-trip,
|
|
8
|
+
* - graceful hangup.
|
|
9
|
+
*/
|
|
10
|
+
import { promises as fs } from 'fs';
|
|
11
|
+
import { tmpdir } from 'os';
|
|
12
|
+
import { join } from 'path';
|
|
13
|
+
import { DVGatewayClient } from '../client.js';
|
|
14
|
+
import { writeSlin16Wav } from './wav.js';
|
|
15
|
+
// 800 ms of silence at 16 kHz → 40 frames of 640 bytes each.
|
|
16
|
+
const SILENCE_PCM = Buffer.alloc(16_000 * 2 * 0.8);
|
|
17
|
+
async function tmpWav() {
|
|
18
|
+
const p = join(tmpdir(), `dvgateway-sim-${Date.now()}-${Math.random().toString(36).slice(2)}.wav`);
|
|
19
|
+
await writeSlin16Wav(p, SILENCE_PCM);
|
|
20
|
+
return p;
|
|
21
|
+
}
|
|
22
|
+
describe('DVGatewayClient.simulate', () => {
|
|
23
|
+
it('delivers a synthetic call:new event and resolves waitForEnd', async () => {
|
|
24
|
+
const gw = new DVGatewayClient({
|
|
25
|
+
baseUrl: 'http://localhost:8080',
|
|
26
|
+
auth: { type: 'apiKey', apiKey: 'simulation' },
|
|
27
|
+
});
|
|
28
|
+
const wavPath = await tmpWav();
|
|
29
|
+
try {
|
|
30
|
+
const events = [];
|
|
31
|
+
gw.onCallEvent((e) => { events.push(e.type); });
|
|
32
|
+
const call = await gw.simulate({
|
|
33
|
+
audioFile: wavPath,
|
|
34
|
+
caller: '+82-10-0000-1111',
|
|
35
|
+
realtime: false, // flush ASAP in tests
|
|
36
|
+
hangupDelayMs: 50, // short grace period
|
|
37
|
+
});
|
|
38
|
+
expect(call.linkedId).toMatch(/^sim-/);
|
|
39
|
+
expect(call.session.caller).toBe('+82-10-0000-1111');
|
|
40
|
+
await call.waitForEnd();
|
|
41
|
+
expect(events).toContain('call:new');
|
|
42
|
+
expect(events).toContain('call:ended');
|
|
43
|
+
}
|
|
44
|
+
finally {
|
|
45
|
+
gw.close();
|
|
46
|
+
await fs.unlink(wavPath).catch(() => undefined);
|
|
47
|
+
}
|
|
48
|
+
});
|
|
49
|
+
it('captures injected TTS into the handle buffer', async () => {
|
|
50
|
+
const gw = new DVGatewayClient({
|
|
51
|
+
baseUrl: 'http://localhost:8080',
|
|
52
|
+
auth: { type: 'apiKey', apiKey: 'simulation' },
|
|
53
|
+
});
|
|
54
|
+
const wavPath = await tmpWav();
|
|
55
|
+
try {
|
|
56
|
+
const call = await gw.simulate({
|
|
57
|
+
audioFile: wavPath,
|
|
58
|
+
realtime: false,
|
|
59
|
+
hangupDelayMs: 100,
|
|
60
|
+
});
|
|
61
|
+
// Generate ~200 ms of fake TTS (sine-wave placeholder values would be
|
|
62
|
+
// ideal, but for capture semantics any slin16 bytes suffice).
|
|
63
|
+
async function* fakeTts() {
|
|
64
|
+
for (let i = 0; i < 5; i++) {
|
|
65
|
+
yield Buffer.alloc(640, i + 1);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
await gw.injectTts(call.linkedId, fakeTts());
|
|
69
|
+
const captured = call.capturedTtsBytes();
|
|
70
|
+
expect(captured.length).toBe(5 * 640);
|
|
71
|
+
const outPath = join(tmpdir(), `sim-tts-${Date.now()}.wav`);
|
|
72
|
+
await call.saveTts(outPath);
|
|
73
|
+
const onDisk = await fs.readFile(outPath);
|
|
74
|
+
// 44-byte WAV header + pcm
|
|
75
|
+
expect(onDisk.length).toBe(44 + captured.length);
|
|
76
|
+
await fs.unlink(outPath).catch(() => undefined);
|
|
77
|
+
await call.waitForEnd();
|
|
78
|
+
}
|
|
79
|
+
finally {
|
|
80
|
+
gw.close();
|
|
81
|
+
await fs.unlink(wavPath).catch(() => undefined);
|
|
82
|
+
}
|
|
83
|
+
});
|
|
84
|
+
it('stop() short-circuits the simulation', async () => {
|
|
85
|
+
const gw = new DVGatewayClient({
|
|
86
|
+
baseUrl: 'http://localhost:8080',
|
|
87
|
+
auth: { type: 'apiKey', apiKey: 'simulation' },
|
|
88
|
+
});
|
|
89
|
+
const wavPath = await tmpWav();
|
|
90
|
+
try {
|
|
91
|
+
const call = await gw.simulate({
|
|
92
|
+
audioFile: wavPath,
|
|
93
|
+
realtime: true, // would otherwise run for 800ms
|
|
94
|
+
hangupDelayMs: 60_000, // ridiculous grace period we want to skip
|
|
95
|
+
});
|
|
96
|
+
await call.stop();
|
|
97
|
+
await call.waitForEnd(); // must resolve immediately
|
|
98
|
+
}
|
|
99
|
+
finally {
|
|
100
|
+
gw.close();
|
|
101
|
+
await fs.unlink(wavPath).catch(() => undefined);
|
|
102
|
+
}
|
|
103
|
+
});
|
|
104
|
+
});
|
|
105
|
+
//# sourceMappingURL=simulator.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"simulator.test.js","sourceRoot":"","sources":["../../src/simulator/simulator.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/** Target sample rate for all gateway audio (slin16). */
|
|
2
|
+
export declare const SIMULATOR_SAMPLE_RATE: 16000;
|
|
3
|
+
/**
|
|
4
|
+
* Read a WAV or raw slin16 file into a single Buffer of 16-bit LE PCM.
|
|
5
|
+
* The returned buffer can be sliced into 640-byte frames directly.
|
|
6
|
+
*
|
|
7
|
+
* @throws If the file is a WAV with unsupported format (non-PCM,
|
|
8
|
+
* non-mono, or sample rate != 16 kHz).
|
|
9
|
+
*/
|
|
10
|
+
export declare function readSlin16File(path: string): Promise<Buffer>;
|
|
11
|
+
/** Same as readSlin16File but operates on an in-memory Buffer. */
|
|
12
|
+
export declare function parseSlin16(data: Buffer): Buffer;
|
|
13
|
+
/**
|
|
14
|
+
* Wrap raw 16 kHz mono slin16 PCM into a minimal WAV container and write
|
|
15
|
+
* it to disk. Used by `SimulatedCall.saveTts()` so captured TTS can be
|
|
16
|
+
* played back in any audio tool.
|
|
17
|
+
*/
|
|
18
|
+
export declare function writeSlin16Wav(path: string, pcm: Buffer): Promise<void>;
|
|
19
|
+
//# sourceMappingURL=wav.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wav.d.ts","sourceRoot":"","sources":["../../src/simulator/wav.ts"],"names":[],"mappings":"AAaA,yDAAyD;AACzD,eAAO,MAAM,qBAAqB,EAAG,KAAe,CAAC;AAErD;;;;;;GAMG;AACH,wBAAsB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAGlE;AAED,kEAAkE;AAClE,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAyDhD;AAED;;;;GAIG;AACH,wBAAsB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAqB7E"}
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Minimal WAV file reader/writer for the SDK simulator.
|
|
3
|
+
*
|
|
4
|
+
* Supports the narrow format needed by DVGateway simulation:
|
|
5
|
+
* - PCM (format code 1), 16-bit little-endian, mono, 16 kHz.
|
|
6
|
+
*
|
|
7
|
+
* Also accepts raw slin16 files (no RIFF header) — any file whose first
|
|
8
|
+
* four bytes are not `RIFF` is treated as a raw slin16 stream. This lets
|
|
9
|
+
* callers point `audioFile` at either a standard WAV asset or a raw PCM
|
|
10
|
+
* capture without juggling conversions themselves.
|
|
11
|
+
*/
|
|
12
|
+
import { promises as fs } from 'fs';
|
|
13
|
+
/** Target sample rate for all gateway audio (slin16). */
|
|
14
|
+
export const SIMULATOR_SAMPLE_RATE = 16_000;
|
|
15
|
+
/**
|
|
16
|
+
* Read a WAV or raw slin16 file into a single Buffer of 16-bit LE PCM.
|
|
17
|
+
* The returned buffer can be sliced into 640-byte frames directly.
|
|
18
|
+
*
|
|
19
|
+
* @throws If the file is a WAV with unsupported format (non-PCM,
|
|
20
|
+
* non-mono, or sample rate != 16 kHz).
|
|
21
|
+
*/
|
|
22
|
+
export async function readSlin16File(path) {
|
|
23
|
+
const data = await fs.readFile(path);
|
|
24
|
+
return parseSlin16(data);
|
|
25
|
+
}
|
|
26
|
+
/** Same as readSlin16File but operates on an in-memory Buffer. */
|
|
27
|
+
export function parseSlin16(data) {
|
|
28
|
+
if (data.length < 4 || data.subarray(0, 4).toString('ascii') !== 'RIFF') {
|
|
29
|
+
// Not a RIFF container — treat as raw slin16 PCM.
|
|
30
|
+
return data;
|
|
31
|
+
}
|
|
32
|
+
// RIFF WAV — find fmt and data chunks.
|
|
33
|
+
if (data.subarray(8, 12).toString('ascii') !== 'WAVE') {
|
|
34
|
+
throw new Error('simulator: file starts with RIFF but is not a WAVE');
|
|
35
|
+
}
|
|
36
|
+
let offset = 12;
|
|
37
|
+
let audioFormat = 0;
|
|
38
|
+
let numChannels = 0;
|
|
39
|
+
let sampleRate = 0;
|
|
40
|
+
let bitsPerSample = 0;
|
|
41
|
+
let pcm = null;
|
|
42
|
+
while (offset + 8 <= data.length) {
|
|
43
|
+
const id = data.subarray(offset, offset + 4).toString('ascii');
|
|
44
|
+
const size = data.readUInt32LE(offset + 4);
|
|
45
|
+
const body = data.subarray(offset + 8, offset + 8 + size);
|
|
46
|
+
if (id === 'fmt ') {
|
|
47
|
+
audioFormat = body.readUInt16LE(0);
|
|
48
|
+
numChannels = body.readUInt16LE(2);
|
|
49
|
+
sampleRate = body.readUInt32LE(4);
|
|
50
|
+
bitsPerSample = body.readUInt16LE(14);
|
|
51
|
+
}
|
|
52
|
+
else if (id === 'data') {
|
|
53
|
+
pcm = body;
|
|
54
|
+
break; // we've got everything we need
|
|
55
|
+
}
|
|
56
|
+
// Chunks are word-aligned — odd sizes carry a trailing pad byte.
|
|
57
|
+
offset += 8 + size + (size % 2);
|
|
58
|
+
}
|
|
59
|
+
if (!pcm) {
|
|
60
|
+
throw new Error('simulator: WAV file has no data chunk');
|
|
61
|
+
}
|
|
62
|
+
if (audioFormat !== 1) {
|
|
63
|
+
throw new Error(`simulator: unsupported WAV format code ${audioFormat} (need PCM=1)`);
|
|
64
|
+
}
|
|
65
|
+
if (numChannels !== 1) {
|
|
66
|
+
throw new Error(`simulator: unsupported channel count ${numChannels} (need mono)`);
|
|
67
|
+
}
|
|
68
|
+
if (sampleRate !== SIMULATOR_SAMPLE_RATE) {
|
|
69
|
+
throw new Error(`simulator: unsupported sample rate ${sampleRate} Hz (need ${SIMULATOR_SAMPLE_RATE} Hz); ` +
|
|
70
|
+
`convert with: ffmpeg -i input.wav -ar 16000 -ac 1 -sample_fmt s16 output.wav`);
|
|
71
|
+
}
|
|
72
|
+
if (bitsPerSample !== 16) {
|
|
73
|
+
throw new Error(`simulator: unsupported bit depth ${bitsPerSample} (need 16)`);
|
|
74
|
+
}
|
|
75
|
+
return pcm;
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Wrap raw 16 kHz mono slin16 PCM into a minimal WAV container and write
|
|
79
|
+
* it to disk. Used by `SimulatedCall.saveTts()` so captured TTS can be
|
|
80
|
+
* played back in any audio tool.
|
|
81
|
+
*/
|
|
82
|
+
export async function writeSlin16Wav(path, pcm) {
|
|
83
|
+
const header = Buffer.alloc(44);
|
|
84
|
+
const byteRate = SIMULATOR_SAMPLE_RATE * 2; // 16-bit mono
|
|
85
|
+
header.write('RIFF', 0, 'ascii');
|
|
86
|
+
header.writeUInt32LE(36 + pcm.length, 4);
|
|
87
|
+
header.write('WAVE', 8, 'ascii');
|
|
88
|
+
header.write('fmt ', 12, 'ascii');
|
|
89
|
+
header.writeUInt32LE(16, 16); // fmt chunk size
|
|
90
|
+
header.writeUInt16LE(1, 20); // PCM
|
|
91
|
+
header.writeUInt16LE(1, 22); // mono
|
|
92
|
+
header.writeUInt32LE(SIMULATOR_SAMPLE_RATE, 24);
|
|
93
|
+
header.writeUInt32LE(byteRate, 28);
|
|
94
|
+
header.writeUInt16LE(2, 32); // block align
|
|
95
|
+
header.writeUInt16LE(16, 34); // bits per sample
|
|
96
|
+
header.write('data', 36, 'ascii');
|
|
97
|
+
header.writeUInt32LE(pcm.length, 40);
|
|
98
|
+
await fs.writeFile(path, Buffer.concat([header, pcm]));
|
|
99
|
+
}
|
|
100
|
+
//# sourceMappingURL=wav.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wav.js","sourceRoot":"","sources":["../../src/simulator/wav.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tts-stream.d.ts","sourceRoot":"","sources":["../../src/streams/tts-stream.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAGH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAC;AACtD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAC;AAE9D,qBAAa,WAAW;IACtB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAa;IAClC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;gBAEpB,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM;IAM5D;;;;;;;;OAQG;IACG,eAAe,CACnB,QAAQ,EAAE,MAAM,EAChB,WAAW,EAAE,aAAa,CAAC,MAAM,CAAC,GACjC,OAAO,CAAC,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"tts-stream.d.ts","sourceRoot":"","sources":["../../src/streams/tts-stream.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAGH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAC;AACtD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAC;AAE9D,qBAAa,WAAW;IACtB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAa;IAClC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;gBAEpB,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM;IAM5D;;;;;;;;OAQG;IACG,eAAe,CACnB,QAAQ,EAAE,MAAM,EAChB,WAAW,EAAE,aAAa,CAAC,MAAM,CAAC,GACjC,OAAO,CAAC,IAAI,CAAC;IAwDhB;;;;;;OAMG;IACG,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAStE;;;;;OAKG;IACG,qBAAqB,CACzB,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,aAAa,CAAC,MAAM,CAAC,GACjC,OAAO,CAAC,IAAI,CAAC;CAejB"}
|
|
@@ -32,7 +32,29 @@ export class TtsInjector {
|
|
|
32
32
|
const subId = `tts-ws-${linkedId}-${uuidv4()}`;
|
|
33
33
|
let wsReady = false;
|
|
34
34
|
let pendingSend = [];
|
|
35
|
-
//
|
|
35
|
+
// Attach the "connected" listener BEFORE calling subscribe() so we
|
|
36
|
+
// never miss the event. The simulator (and any future transport
|
|
37
|
+
// that completes the handshake synchronously) fires `connected` on
|
|
38
|
+
// the very next microtask after subscribe() resolves; if the for-
|
|
39
|
+
// await loop below runs synchronously-yielding chunks, it can drain
|
|
40
|
+
// its entire microtask queue before the listener registration —
|
|
41
|
+
// losing the event and all buffered frames. Using `on` + manual
|
|
42
|
+
// `off` instead of `once` also avoids the cross-subscription race
|
|
43
|
+
// where an unrelated `connected` (different subId) would consume
|
|
44
|
+
// our one-shot listener.
|
|
45
|
+
const onConnected = (id) => {
|
|
46
|
+
if (id !== subId)
|
|
47
|
+
return;
|
|
48
|
+
wsReady = true;
|
|
49
|
+
for (const buf of pendingSend) {
|
|
50
|
+
this.wsPool.emit('__send', subId, buf);
|
|
51
|
+
}
|
|
52
|
+
pendingSend = [];
|
|
53
|
+
this.wsPool.off('connected', onConnected);
|
|
54
|
+
};
|
|
55
|
+
this.wsPool.on('connected', onConnected);
|
|
56
|
+
// Establish WebSocket; early audio frames buffer in pendingSend
|
|
57
|
+
// until the handler above flips `wsReady`.
|
|
36
58
|
await this.wsPool.subscribe({
|
|
37
59
|
id: subId,
|
|
38
60
|
path: `/api/v1/ws/tts/${encodeURIComponent(linkedId)}`,
|
|
@@ -42,17 +64,6 @@ export class TtsInjector {
|
|
|
42
64
|
this.logger.debug({ linkedId }, 'TTS WebSocket closed');
|
|
43
65
|
},
|
|
44
66
|
});
|
|
45
|
-
// The WsPool emits 'connected' when the handshake completes
|
|
46
|
-
this.wsPool.once('connected', (id) => {
|
|
47
|
-
if (id !== subId)
|
|
48
|
-
return;
|
|
49
|
-
wsReady = true;
|
|
50
|
-
// Flush buffered frames
|
|
51
|
-
for (const buf of pendingSend) {
|
|
52
|
-
this.wsPool.emit('__send', subId, buf);
|
|
53
|
-
}
|
|
54
|
-
pendingSend = [];
|
|
55
|
-
});
|
|
56
67
|
// Stream audio chunks
|
|
57
68
|
try {
|
|
58
69
|
for await (const chunk of audioChunks) {
|
|
@@ -68,6 +79,7 @@ export class TtsInjector {
|
|
|
68
79
|
}
|
|
69
80
|
}
|
|
70
81
|
finally {
|
|
82
|
+
this.wsPool.off('connected', onConnected);
|
|
71
83
|
this.wsPool.unsubscribe(subId);
|
|
72
84
|
}
|
|
73
85
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tts-stream.js","sourceRoot":"","sources":["../../src/streams/tts-stream.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,EAAE,IAAI,MAAM,EAAE,MAAM,MAAM,CAAC;AAKpC,MAAM,OAAO,WAAW;IACL,MAAM,CAAS;IACf,IAAI,CAAa;IACjB,MAAM,CAAS;IAEhC,YAAY,MAAc,EAAE,IAAgB,EAAE,MAAc;QAC1D,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;IAED;;;;;;;;OAQG;IACH,KAAK,CAAC,eAAe,CACnB,QAAgB,EAChB,WAAkC;QAElC,MAAM,KAAK,GAAG,UAAU,QAAQ,IAAI,MAAM,EAAE,EAAE,CAAC;QAC/C,IAAI,OAAO,GAAG,KAAK,CAAC;QACpB,IAAI,WAAW,GAAa,EAAE,CAAC;QAE/B,
|
|
1
|
+
{"version":3,"file":"tts-stream.js","sourceRoot":"","sources":["../../src/streams/tts-stream.ts"],"names":[],"mappings":"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"}
|
|
@@ -16,12 +16,51 @@ export interface WsSubscription {
|
|
|
16
16
|
readonly onMessage: (data: Buffer) => void;
|
|
17
17
|
readonly onClose?: () => void;
|
|
18
18
|
}
|
|
19
|
+
/**
|
|
20
|
+
* Handle returned from a simulated route's `onSubscribe` callback.
|
|
21
|
+
* Allows the WsPool to forward outbound `__send` / `__sendText` events
|
|
22
|
+
* into the simulator, and close the virtual connection cleanly.
|
|
23
|
+
*/
|
|
24
|
+
export interface SimulatedSocket {
|
|
25
|
+
send(data: Buffer): void;
|
|
26
|
+
sendText(text: string): void;
|
|
27
|
+
close(): void;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Route interceptor used by the simulator to replace real WebSocket
|
|
31
|
+
* connections with in-process virtual sockets. When `matches()` returns
|
|
32
|
+
* true for a subscription's `path + params`, `onSubscribe()` is invoked
|
|
33
|
+
* and the returned handle receives all outbound sends, while inbound
|
|
34
|
+
* frames are pushed back into the subscription's `onMessage` callback.
|
|
35
|
+
*
|
|
36
|
+
* Registered via `WsPool.addSimulatedRoute()` and unregistered via the
|
|
37
|
+
* returned disposer. Routes are matched in registration order; the first
|
|
38
|
+
* match wins.
|
|
39
|
+
*/
|
|
40
|
+
export interface SimulatedRoute {
|
|
41
|
+
matches(path: string, params: Record<string, string>): boolean;
|
|
42
|
+
onSubscribe(sub: WsSubscription): SimulatedSocket;
|
|
43
|
+
}
|
|
19
44
|
export declare class WsPool extends EventEmitter {
|
|
20
45
|
private readonly auth;
|
|
21
46
|
private readonly reconnect;
|
|
22
47
|
private readonly logger;
|
|
23
48
|
private readonly connections;
|
|
49
|
+
/** Simulated routes registered by the simulator; checked before real WS connect. */
|
|
50
|
+
private readonly simulatedRoutes;
|
|
24
51
|
constructor(auth: AuthManager, reconnect: ReconnectOptions, logger: Logger);
|
|
52
|
+
/**
|
|
53
|
+
* Register a simulated route. Returns a disposer that removes the
|
|
54
|
+
* route. Used exclusively by the simulator — production code should
|
|
55
|
+
* never touch this.
|
|
56
|
+
*
|
|
57
|
+
* If any existing connections have already subscribed to a path that
|
|
58
|
+
* matches this route (e.g. a pipeline started before `simulate()`
|
|
59
|
+
* was called), those connections are cut over to the simulator: any
|
|
60
|
+
* pending real-WS attempt is cancelled, a virtual socket is attached,
|
|
61
|
+
* and a synthetic `connected` event is emitted.
|
|
62
|
+
*/
|
|
63
|
+
addSimulatedRoute(route: SimulatedRoute): () => void;
|
|
25
64
|
/** Open a managed WebSocket connection for a subscription */
|
|
26
65
|
subscribe(sub: WsSubscription): Promise<void>;
|
|
27
66
|
/** Close a specific subscription */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ws-pool.d.ts","sourceRoot":"","sources":["../../src/transport/ws-pool.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAEtC,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAClE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAEtD,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACxC,QAAQ,CAAC,SAAS,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAC3C,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;CAC/B;
|
|
1
|
+
{"version":3,"file":"ws-pool.d.ts","sourceRoot":"","sources":["../../src/transport/ws-pool.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAEtC,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAClE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAEtD,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACxC,QAAQ,CAAC,SAAS,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAC3C,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;CAC/B;AAED;;;;GAIG;AACH,MAAM,WAAW,eAAe;IAC9B,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,KAAK,IAAI,IAAI,CAAC;CACf;AAED;;;;;;;;;;GAUG;AACH,MAAM,WAAW,cAAc;IAC7B,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC;IAC/D,WAAW,CAAC,GAAG,EAAE,cAAc,GAAG,eAAe,CAAC;CACnD;AAYD,qBAAa,MAAO,SAAQ,YAAY;IACtC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAc;IACnC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAA6B;IACvD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAwC;IACpE,oFAAoF;IACpF,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAwB;gBAE5C,IAAI,EAAE,WAAW,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,EAAE,MAAM;IAwC1E;;;;;;;;;;OAUG;IACH,iBAAiB,CAAC,KAAK,EAAE,cAAc,GAAG,MAAM,IAAI;IA6BpD,6DAA6D;IACvD,SAAS,CAAC,GAAG,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;IAiCnD,oCAAoC;IACpC,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI;IAkB7B,sDAAsD;IACtD,QAAQ,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI;IAIxC,4BAA4B;IAC5B,QAAQ,IAAI,IAAI;YAMF,OAAO;IAwDrB,OAAO,CAAC,iBAAiB;CA+B1B"}
|
|
@@ -13,6 +13,8 @@ export class WsPool extends EventEmitter {
|
|
|
13
13
|
reconnect;
|
|
14
14
|
logger;
|
|
15
15
|
connections = new Map();
|
|
16
|
+
/** Simulated routes registered by the simulator; checked before real WS connect. */
|
|
17
|
+
simulatedRoutes = [];
|
|
16
18
|
constructor(auth, reconnect, logger) {
|
|
17
19
|
super();
|
|
18
20
|
this.auth = auth;
|
|
@@ -28,22 +30,84 @@ export class WsPool extends EventEmitter {
|
|
|
28
30
|
// Handle binary frame sends from TtsInjector
|
|
29
31
|
this.on('__send', (id, data) => {
|
|
30
32
|
const conn = this.connections.get(id);
|
|
31
|
-
if (conn
|
|
33
|
+
if (!conn)
|
|
34
|
+
return;
|
|
35
|
+
if (conn.simulated) {
|
|
36
|
+
conn.simulated.send(data);
|
|
37
|
+
return;
|
|
38
|
+
}
|
|
39
|
+
if (conn.ws && conn.ws.readyState === WebSocket.OPEN) {
|
|
32
40
|
conn.ws.send(data);
|
|
33
41
|
}
|
|
34
42
|
});
|
|
35
43
|
// Handle text message sends (e.g., thinking signals)
|
|
36
44
|
this.on('__sendText', (id, text) => {
|
|
37
45
|
const conn = this.connections.get(id);
|
|
38
|
-
if (conn
|
|
46
|
+
if (!conn)
|
|
47
|
+
return;
|
|
48
|
+
if (conn.simulated) {
|
|
49
|
+
conn.simulated.sendText(text);
|
|
50
|
+
return;
|
|
51
|
+
}
|
|
52
|
+
if (conn.ws && conn.ws.readyState === WebSocket.OPEN) {
|
|
39
53
|
conn.ws.send(text);
|
|
40
54
|
}
|
|
41
55
|
});
|
|
42
56
|
}
|
|
57
|
+
/**
|
|
58
|
+
* Register a simulated route. Returns a disposer that removes the
|
|
59
|
+
* route. Used exclusively by the simulator — production code should
|
|
60
|
+
* never touch this.
|
|
61
|
+
*
|
|
62
|
+
* If any existing connections have already subscribed to a path that
|
|
63
|
+
* matches this route (e.g. a pipeline started before `simulate()`
|
|
64
|
+
* was called), those connections are cut over to the simulator: any
|
|
65
|
+
* pending real-WS attempt is cancelled, a virtual socket is attached,
|
|
66
|
+
* and a synthetic `connected` event is emitted.
|
|
67
|
+
*/
|
|
68
|
+
addSimulatedRoute(route) {
|
|
69
|
+
this.simulatedRoutes.push(route);
|
|
70
|
+
// Cut over any live connections that now match this route.
|
|
71
|
+
for (const [id, conn] of this.connections) {
|
|
72
|
+
if (conn.closed || conn.simulated)
|
|
73
|
+
continue;
|
|
74
|
+
if (!route.matches(conn.subscription.path, conn.subscription.params))
|
|
75
|
+
continue;
|
|
76
|
+
// Cancel pending reconnect and any real WS that's in flight.
|
|
77
|
+
if (conn.reconnectTimer) {
|
|
78
|
+
clearTimeout(conn.reconnectTimer);
|
|
79
|
+
conn.reconnectTimer = null;
|
|
80
|
+
}
|
|
81
|
+
if (conn.pingTimer) {
|
|
82
|
+
clearInterval(conn.pingTimer);
|
|
83
|
+
conn.pingTimer = null;
|
|
84
|
+
}
|
|
85
|
+
if (conn.ws) {
|
|
86
|
+
conn.ws.removeAllListeners();
|
|
87
|
+
try {
|
|
88
|
+
conn.ws.close(1000, 'replaced by simulator');
|
|
89
|
+
}
|
|
90
|
+
catch { /* already closing */ }
|
|
91
|
+
conn.ws = null;
|
|
92
|
+
}
|
|
93
|
+
conn.reconnectAttempts = 0;
|
|
94
|
+
conn.simulated = route.onSubscribe(conn.subscription);
|
|
95
|
+
queueMicrotask(() => {
|
|
96
|
+
if (!conn.closed)
|
|
97
|
+
this.emit('connected', id);
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
return () => {
|
|
101
|
+
const idx = this.simulatedRoutes.indexOf(route);
|
|
102
|
+
if (idx >= 0)
|
|
103
|
+
this.simulatedRoutes.splice(idx, 1);
|
|
104
|
+
};
|
|
105
|
+
}
|
|
43
106
|
/** Open a managed WebSocket connection for a subscription */
|
|
44
107
|
async subscribe(sub) {
|
|
45
108
|
const conn = {
|
|
46
109
|
ws: null,
|
|
110
|
+
simulated: null,
|
|
47
111
|
subscription: sub,
|
|
48
112
|
reconnectAttempts: 0,
|
|
49
113
|
closed: false,
|
|
@@ -51,6 +115,24 @@ export class WsPool extends EventEmitter {
|
|
|
51
115
|
pingTimer: null,
|
|
52
116
|
};
|
|
53
117
|
this.connections.set(sub.id, conn);
|
|
118
|
+
// Check simulated routes first — matches intercept before we open a
|
|
119
|
+
// real socket. This is how the SDK simulator replaces the gateway.
|
|
120
|
+
for (const route of this.simulatedRoutes) {
|
|
121
|
+
if (route.matches(sub.path, sub.params)) {
|
|
122
|
+
conn.simulated = route.onSubscribe(sub);
|
|
123
|
+
// Announce "connected" as a microtask so subscribers that attach
|
|
124
|
+
// `on('connected')` (or `once`) synchronously after the await
|
|
125
|
+
// return still catch the event. Microtask FIFO order: the
|
|
126
|
+
// caller's await-continuation is queued first (when this async
|
|
127
|
+
// function resolves), then this emit runs — so handlers have
|
|
128
|
+
// been registered by the time the event fires.
|
|
129
|
+
queueMicrotask(() => {
|
|
130
|
+
if (!conn.closed)
|
|
131
|
+
this.emit('connected', sub.id);
|
|
132
|
+
});
|
|
133
|
+
return;
|
|
134
|
+
}
|
|
135
|
+
}
|
|
54
136
|
await this.connect(conn);
|
|
55
137
|
}
|
|
56
138
|
/** Close a specific subscription */
|
|
@@ -63,6 +145,10 @@ export class WsPool extends EventEmitter {
|
|
|
63
145
|
clearInterval(conn.pingTimer);
|
|
64
146
|
if (conn.reconnectTimer)
|
|
65
147
|
clearTimeout(conn.reconnectTimer);
|
|
148
|
+
if (conn.simulated) {
|
|
149
|
+
conn.simulated.close();
|
|
150
|
+
conn.simulated = null;
|
|
151
|
+
}
|
|
66
152
|
if (conn.ws) {
|
|
67
153
|
conn.ws.removeAllListeners();
|
|
68
154
|
conn.ws.close(1000, 'unsubscribed');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ws-pool.js","sourceRoot":"","sources":["../../src/transport/ws-pool.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AACtC,OAAO,SAAS,MAAM,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"ws-pool.js","sourceRoot":"","sources":["../../src/transport/ws-pool.ts"],"names":[],"mappings":"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"}
|