@convbased/sdk 0.1.0
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/LICENSE +21 -0
- package/README.md +235 -0
- package/dist/cjs/client.js +635 -0
- package/dist/cjs/client.js.map +1 -0
- package/dist/cjs/endpoints.js +10 -0
- package/dist/cjs/endpoints.js.map +1 -0
- package/dist/cjs/events.js +39 -0
- package/dist/cjs/events.js.map +1 -0
- package/dist/cjs/graphql.js +40 -0
- package/dist/cjs/graphql.js.map +1 -0
- package/dist/cjs/index.js +24 -0
- package/dist/cjs/index.js.map +1 -0
- package/dist/cjs/package.json +3 -0
- package/dist/cjs/rtcServers.js +35 -0
- package/dist/cjs/rtcServers.js.map +1 -0
- package/dist/cjs/sdp.js +37 -0
- package/dist/cjs/sdp.js.map +1 -0
- package/dist/cjs/signaling.js +146 -0
- package/dist/cjs/signaling.js.map +1 -0
- package/dist/cjs/tts.js +227 -0
- package/dist/cjs/tts.js.map +1 -0
- package/dist/cjs/types.js +26 -0
- package/dist/cjs/types.js.map +1 -0
- package/dist/cjs/upload.js +87 -0
- package/dist/cjs/upload.js.map +1 -0
- package/dist/client.d.ts +169 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +631 -0
- package/dist/client.js.map +1 -0
- package/dist/convbased-sdk.global.js +1291 -0
- package/dist/endpoints.d.ts +3 -0
- package/dist/endpoints.d.ts.map +1 -0
- package/dist/endpoints.js +7 -0
- package/dist/endpoints.js.map +1 -0
- package/dist/events.d.ts +9 -0
- package/dist/events.d.ts.map +1 -0
- package/dist/events.js +35 -0
- package/dist/events.js.map +1 -0
- package/dist/graphql.d.ts +18 -0
- package/dist/graphql.d.ts.map +1 -0
- package/dist/graphql.js +37 -0
- package/dist/graphql.js.map +1 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +9 -0
- package/dist/index.js.map +1 -0
- package/dist/rtcServers.d.ts +13 -0
- package/dist/rtcServers.d.ts.map +1 -0
- package/dist/rtcServers.js +31 -0
- package/dist/rtcServers.js.map +1 -0
- package/dist/sdp.d.ts +6 -0
- package/dist/sdp.d.ts.map +1 -0
- package/dist/sdp.js +34 -0
- package/dist/sdp.js.map +1 -0
- package/dist/signaling.d.ts +33 -0
- package/dist/signaling.d.ts.map +1 -0
- package/dist/signaling.js +142 -0
- package/dist/signaling.js.map +1 -0
- package/dist/tts.d.ts +111 -0
- package/dist/tts.d.ts.map +1 -0
- package/dist/tts.js +223 -0
- package/dist/tts.js.map +1 -0
- package/dist/types.d.ts +194 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +23 -0
- package/dist/types.js.map +1 -0
- package/dist/upload.d.ts +46 -0
- package/dist/upload.d.ts.map +1 -0
- package/dist/upload.js +82 -0
- package/dist/upload.js.map +1 -0
- package/package.json +57 -0
- package/src/client.ts +839 -0
- package/src/endpoints.ts +8 -0
- package/src/events.ts +38 -0
- package/src/graphql.ts +58 -0
- package/src/index.ts +50 -0
- package/src/rtcServers.ts +38 -0
- package/src/sdp.ts +45 -0
- package/src/signaling.ts +172 -0
- package/src/tts.ts +364 -0
- package/src/types.ts +201 -0
- package/src/upload.ts +132 -0
|
@@ -0,0 +1,635 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ConvbasedClient = void 0;
|
|
4
|
+
const events_js_1 = require("./events.js");
|
|
5
|
+
const endpoints_js_1 = require("./endpoints.js");
|
|
6
|
+
const sdp_js_1 = require("./sdp.js");
|
|
7
|
+
const signaling_js_1 = require("./signaling.js");
|
|
8
|
+
const rtcServers_js_1 = require("./rtcServers.js");
|
|
9
|
+
const upload_js_1 = require("./upload.js");
|
|
10
|
+
const types_js_1 = require("./types.js");
|
|
11
|
+
/**
|
|
12
|
+
* Real-time voice conversion client. Mirrors the flow used by Convbased-Web:
|
|
13
|
+
*
|
|
14
|
+
* 1. Open WebSocket to `${signalingUrl}/signaling/ws?api_key=…`.
|
|
15
|
+
* 2. Capture the microphone (or accept a user-provided `MediaStream`).
|
|
16
|
+
* 3. Build an `RTCPeerConnection`, attach the mic track, mangle the offer's
|
|
17
|
+
* Opus parameters, and send `{type: "offer", sdp, preferences}` over the
|
|
18
|
+
* signaling socket.
|
|
19
|
+
* 4. Apply the `answer` and `ice_candidate` messages from the server, fire
|
|
20
|
+
* local ICE candidates back over signaling.
|
|
21
|
+
* 5. When the server sends `{code: SERVICE_READY}` the processed track is
|
|
22
|
+
* emitted via the `track` event — wire it to an `<audio>` element to hear
|
|
23
|
+
* converted audio.
|
|
24
|
+
*
|
|
25
|
+
* The client is single-use: call `connect()` once, then `disconnect()` to
|
|
26
|
+
* tear everything down. Create a fresh instance for a new session.
|
|
27
|
+
*/
|
|
28
|
+
class ConvbasedClient extends events_js_1.TypedEmitter {
|
|
29
|
+
constructor(options) {
|
|
30
|
+
super();
|
|
31
|
+
this.state = "idle";
|
|
32
|
+
this.signaling = null;
|
|
33
|
+
this.pc = null;
|
|
34
|
+
this.localStream = null;
|
|
35
|
+
this.convertedStream = null;
|
|
36
|
+
this.serviceReadyTimer = null;
|
|
37
|
+
this.offerInFlight = false;
|
|
38
|
+
if (!options.apiKey && !options.accessToken) {
|
|
39
|
+
throw new Error("ConvbasedClient requires either `apiKey` or `accessToken`");
|
|
40
|
+
}
|
|
41
|
+
this.opts = {
|
|
42
|
+
iceTransportPolicy: "all",
|
|
43
|
+
bitrate: 64,
|
|
44
|
+
stereo: false,
|
|
45
|
+
signalingTimeoutMs: 120000,
|
|
46
|
+
connectTimeoutMs: 20000,
|
|
47
|
+
...options,
|
|
48
|
+
// Endpoints fall back to the baked-in Convbased production URLs.
|
|
49
|
+
signalingUrl: options.signalingUrl ?? endpoints_js_1.DEFAULT_SIGNALING_URL,
|
|
50
|
+
graphqlUrl: options.graphqlUrl === false
|
|
51
|
+
? false
|
|
52
|
+
: (options.graphqlUrl ?? endpoints_js_1.DEFAULT_GRAPHQL_URL),
|
|
53
|
+
};
|
|
54
|
+
const provided = options.logger ?? {};
|
|
55
|
+
this.logger = {
|
|
56
|
+
debug: provided.debug ?? (() => { }),
|
|
57
|
+
info: provided.info ?? (() => { }),
|
|
58
|
+
warn: provided.warn ?? console.warn.bind(console),
|
|
59
|
+
error: provided.error ?? console.error.bind(console),
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
getState() {
|
|
63
|
+
return this.state;
|
|
64
|
+
}
|
|
65
|
+
/** The converted (voice-changed) audio stream returned from the inference node. */
|
|
66
|
+
getConvertedStream() {
|
|
67
|
+
return this.convertedStream;
|
|
68
|
+
}
|
|
69
|
+
getPeerConnection() {
|
|
70
|
+
return this.pc;
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Open the signaling socket, capture audio, and run WebRTC negotiation.
|
|
74
|
+
* Resolves when the server emits SERVICE_READY (audio is flowing both ways).
|
|
75
|
+
* Rejects on auth failures, signaling errors, or negotiation timeouts.
|
|
76
|
+
*/
|
|
77
|
+
async connect(opts) {
|
|
78
|
+
if (this.state !== "idle") {
|
|
79
|
+
throw new Error(`ConvbasedClient.connect() called from invalid state "${this.state}"`);
|
|
80
|
+
}
|
|
81
|
+
if (!opts.modelId) {
|
|
82
|
+
throw new Error("ConnectOptions.modelId is required");
|
|
83
|
+
}
|
|
84
|
+
this.setState("signaling");
|
|
85
|
+
try {
|
|
86
|
+
await this.openSignaling();
|
|
87
|
+
const iceServers = await this.resolveIceServers();
|
|
88
|
+
this.setState("negotiating");
|
|
89
|
+
await this.openPeer(opts, iceServers);
|
|
90
|
+
await this.waitForServiceReady();
|
|
91
|
+
this.setState("connected");
|
|
92
|
+
}
|
|
93
|
+
catch (err) {
|
|
94
|
+
const error = err instanceof Error ? err : new Error(String(err));
|
|
95
|
+
this.emit("error", error);
|
|
96
|
+
await this.disconnect().catch(() => { });
|
|
97
|
+
this.setState("error");
|
|
98
|
+
throw error;
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Send a runtime config update to the inference node. Equivalent to the
|
|
103
|
+
* pitch / formant / RMS sliders in Convbased-Web — only the fields you set
|
|
104
|
+
* are forwarded.
|
|
105
|
+
*/
|
|
106
|
+
updateConfig(preferences) {
|
|
107
|
+
if (!this.signaling?.isOpen) {
|
|
108
|
+
throw new Error("Cannot updateConfig: signaling channel is closed");
|
|
109
|
+
}
|
|
110
|
+
this.signaling.send({ type: "config", preferences });
|
|
111
|
+
}
|
|
112
|
+
// ---------------------------------------------------------------------
|
|
113
|
+
// File inference (voice-to-voice) — convert an uploaded audio file within
|
|
114
|
+
// the current live session. Requires the client to be `connected` first;
|
|
115
|
+
// the inference node is provisioned by `connect()`.
|
|
116
|
+
// ---------------------------------------------------------------------
|
|
117
|
+
/**
|
|
118
|
+
* Upload a source-audio `Blob`/`File` and resolve its COS key, ready to pass
|
|
119
|
+
* to `startTask` / `runFileInference`. Requires `graphqlUrl` (the default
|
|
120
|
+
* production endpoint, or a self-hosted override — not `false`).
|
|
121
|
+
*/
|
|
122
|
+
async uploadAudio(file, opts) {
|
|
123
|
+
if (typeof this.opts.graphqlUrl !== "string") {
|
|
124
|
+
throw new Error("uploadAudio requires a GraphQL endpoint; do not set `graphqlUrl: false`");
|
|
125
|
+
}
|
|
126
|
+
return (0, upload_js_1.uploadAudio)({
|
|
127
|
+
graphqlUrl: this.opts.graphqlUrl,
|
|
128
|
+
apiKey: this.opts.apiKey,
|
|
129
|
+
accessToken: this.opts.accessToken,
|
|
130
|
+
file,
|
|
131
|
+
filename: opts?.filename,
|
|
132
|
+
contentType: opts?.contentType,
|
|
133
|
+
signal: opts?.signal,
|
|
134
|
+
});
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* Submit a file-inference task over the signaling channel and return its
|
|
138
|
+
* task id. The client must be `connected`. Results arrive asynchronously via
|
|
139
|
+
* the `taskAck` / `taskProgress` / `taskFinished` events — use
|
|
140
|
+
* `runFileInference` for a promise-based wrapper.
|
|
141
|
+
*/
|
|
142
|
+
startTask(opts) {
|
|
143
|
+
if (this.state !== "connected") {
|
|
144
|
+
throw new Error(`startTask requires a connected session (current state "${this.state}")`);
|
|
145
|
+
}
|
|
146
|
+
if (!this.signaling?.isOpen) {
|
|
147
|
+
throw new Error("Cannot startTask: signaling channel is closed");
|
|
148
|
+
}
|
|
149
|
+
if (!opts.audioKey) {
|
|
150
|
+
throw new Error("StartTaskOptions.audioKey is required");
|
|
151
|
+
}
|
|
152
|
+
const taskId = opts.taskId ?? generateTaskId();
|
|
153
|
+
this.signaling.send({
|
|
154
|
+
type: "task_start",
|
|
155
|
+
task_id: taskId,
|
|
156
|
+
audio_key: opts.audioKey,
|
|
157
|
+
generate_name: opts.generateName ?? "output",
|
|
158
|
+
format: opts.format ?? "wav",
|
|
159
|
+
preferences: opts.preferences,
|
|
160
|
+
});
|
|
161
|
+
return taskId;
|
|
162
|
+
}
|
|
163
|
+
/** Cancel a file-inference task. Omit `taskId` to stop the current one. */
|
|
164
|
+
stopTask(taskId) {
|
|
165
|
+
if (!this.signaling?.isOpen) {
|
|
166
|
+
throw new Error("Cannot stopTask: signaling channel is closed");
|
|
167
|
+
}
|
|
168
|
+
this.signaling.send({ type: "task_stop", task_id: taskId });
|
|
169
|
+
}
|
|
170
|
+
/**
|
|
171
|
+
* Promise-based file inference: (optionally upload the source audio,) start
|
|
172
|
+
* the task, and resolve with the `taskFinished` event on success. Rejects on
|
|
173
|
+
* task failure/cancellation, timeout, signaling close, or `signal` abort.
|
|
174
|
+
*/
|
|
175
|
+
async runFileInference(opts) {
|
|
176
|
+
if (!opts.audioKey && !opts.audio) {
|
|
177
|
+
throw new Error("runFileInference requires either `audioKey` or `audio`");
|
|
178
|
+
}
|
|
179
|
+
const audioKey = opts.audioKey ??
|
|
180
|
+
(await this.uploadAudio(opts.audio, { signal: opts.signal })).key;
|
|
181
|
+
const timeoutMs = opts.timeoutMs ?? 300000;
|
|
182
|
+
return new Promise((resolve, reject) => {
|
|
183
|
+
let taskId;
|
|
184
|
+
let timer = null;
|
|
185
|
+
const cleanup = () => {
|
|
186
|
+
offAck();
|
|
187
|
+
offProgress();
|
|
188
|
+
offFinished();
|
|
189
|
+
offErr();
|
|
190
|
+
offClosed();
|
|
191
|
+
if (timer)
|
|
192
|
+
clearTimeout(timer);
|
|
193
|
+
if (opts.signal)
|
|
194
|
+
opts.signal.removeEventListener("abort", onAbort);
|
|
195
|
+
};
|
|
196
|
+
const settleErr = (err) => {
|
|
197
|
+
cleanup();
|
|
198
|
+
reject(err);
|
|
199
|
+
};
|
|
200
|
+
const onAbort = () => {
|
|
201
|
+
try {
|
|
202
|
+
this.stopTask(taskId);
|
|
203
|
+
}
|
|
204
|
+
catch {
|
|
205
|
+
/* ignore */
|
|
206
|
+
}
|
|
207
|
+
settleErr(new DOMException("Aborted", "AbortError"));
|
|
208
|
+
};
|
|
209
|
+
const offAck = this.on("taskAck", (e) => {
|
|
210
|
+
if (e.taskId === taskId)
|
|
211
|
+
opts.onAck?.(e);
|
|
212
|
+
});
|
|
213
|
+
const offProgress = this.on("taskProgress", (e) => {
|
|
214
|
+
if (e.taskId === taskId)
|
|
215
|
+
opts.onProgress?.(e);
|
|
216
|
+
});
|
|
217
|
+
const offFinished = this.on("taskFinished", (e) => {
|
|
218
|
+
if (e.taskId !== taskId)
|
|
219
|
+
return;
|
|
220
|
+
if (e.status === "success") {
|
|
221
|
+
cleanup();
|
|
222
|
+
resolve(e);
|
|
223
|
+
}
|
|
224
|
+
else {
|
|
225
|
+
settleErr(new Error(e.error || `File inference task ${e.status}`));
|
|
226
|
+
}
|
|
227
|
+
});
|
|
228
|
+
const offErr = this.on("error", (err) => settleErr(err));
|
|
229
|
+
const offClosed = this.on("closed", () => settleErr(new Error("Session closed before task finished")));
|
|
230
|
+
if (opts.signal?.aborted) {
|
|
231
|
+
offAck();
|
|
232
|
+
offProgress();
|
|
233
|
+
offFinished();
|
|
234
|
+
offErr();
|
|
235
|
+
offClosed();
|
|
236
|
+
reject(new DOMException("Aborted", "AbortError"));
|
|
237
|
+
return;
|
|
238
|
+
}
|
|
239
|
+
opts.signal?.addEventListener("abort", onAbort, { once: true });
|
|
240
|
+
timer = setTimeout(() => {
|
|
241
|
+
settleErr(new Error(`Timed out waiting for file inference task after ${timeoutMs}ms`));
|
|
242
|
+
}, timeoutMs);
|
|
243
|
+
try {
|
|
244
|
+
taskId = this.startTask({
|
|
245
|
+
audioKey,
|
|
246
|
+
taskId: opts.taskId,
|
|
247
|
+
generateName: opts.generateName,
|
|
248
|
+
format: opts.format,
|
|
249
|
+
preferences: opts.preferences,
|
|
250
|
+
});
|
|
251
|
+
}
|
|
252
|
+
catch (err) {
|
|
253
|
+
settleErr(err instanceof Error ? err : new Error(String(err)));
|
|
254
|
+
}
|
|
255
|
+
});
|
|
256
|
+
}
|
|
257
|
+
/** Mute / unmute the local mic by toggling the captured audio track. */
|
|
258
|
+
setMuted(muted) {
|
|
259
|
+
const track = this.localStream?.getAudioTracks()[0];
|
|
260
|
+
if (track)
|
|
261
|
+
track.enabled = !muted;
|
|
262
|
+
}
|
|
263
|
+
/** Replace the local input stream (mic) with a different `MediaStream` (hot-swap). */
|
|
264
|
+
async replaceLocalStream(newStream) {
|
|
265
|
+
if (!this.pc)
|
|
266
|
+
throw new Error("PeerConnection is not active");
|
|
267
|
+
const newTrack = newStream.getAudioTracks()[0];
|
|
268
|
+
if (!newTrack)
|
|
269
|
+
throw new Error("Replacement stream has no audio track");
|
|
270
|
+
const sender = this.pc
|
|
271
|
+
.getSenders()
|
|
272
|
+
.find((s) => s.track?.kind === "audio");
|
|
273
|
+
if (!sender)
|
|
274
|
+
throw new Error("No audio sender on PeerConnection");
|
|
275
|
+
await sender.replaceTrack(newTrack);
|
|
276
|
+
this.stopTracks(this.localStream);
|
|
277
|
+
this.localStream = newStream;
|
|
278
|
+
}
|
|
279
|
+
/** Snapshot of jitter / loss / RTT (sampled from `RTCPeerConnection.getStats`). */
|
|
280
|
+
async getStats() {
|
|
281
|
+
if (!this.pc || this.pc.connectionState !== "connected")
|
|
282
|
+
return null;
|
|
283
|
+
const report = await this.pc.getStats();
|
|
284
|
+
const stats = { rttMs: 0, jitter: 0, packetsLost: 0 };
|
|
285
|
+
report.forEach((entry) => {
|
|
286
|
+
if (entry.type === "candidate-pair" &&
|
|
287
|
+
entry.state === "succeeded" &&
|
|
288
|
+
typeof entry.currentRoundTripTime === "number") {
|
|
289
|
+
stats.rttMs = Math.round(entry.currentRoundTripTime * 1000);
|
|
290
|
+
}
|
|
291
|
+
if (entry.type === "inbound-rtp" && entry.kind === "audio") {
|
|
292
|
+
if (typeof entry.jitter === "number")
|
|
293
|
+
stats.jitter = entry.jitter;
|
|
294
|
+
if (typeof entry.packetsLost === "number") {
|
|
295
|
+
stats.packetsLost = entry.packetsLost;
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
});
|
|
299
|
+
return stats;
|
|
300
|
+
}
|
|
301
|
+
/** Gracefully end the session — notifies the server, closes the PC. */
|
|
302
|
+
async disconnect() {
|
|
303
|
+
if (this.state === "closed" || this.state === "closing")
|
|
304
|
+
return;
|
|
305
|
+
this.setState("closing");
|
|
306
|
+
this.clearServiceReadyTimer();
|
|
307
|
+
try {
|
|
308
|
+
if (this.signaling?.isOpen) {
|
|
309
|
+
try {
|
|
310
|
+
this.signaling.send({ type: "exit" });
|
|
311
|
+
// Give the frame a tick to flush before we yank the socket.
|
|
312
|
+
await new Promise((r) => setTimeout(r, 25));
|
|
313
|
+
}
|
|
314
|
+
catch {
|
|
315
|
+
/* socket already gone */
|
|
316
|
+
}
|
|
317
|
+
}
|
|
318
|
+
}
|
|
319
|
+
finally {
|
|
320
|
+
this.tearDownPeer();
|
|
321
|
+
this.signaling?.close();
|
|
322
|
+
this.signaling = null;
|
|
323
|
+
this.setState("closed");
|
|
324
|
+
this.emit("closed", {});
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
// ---------------------------------------------------------------------
|
|
328
|
+
// Internal
|
|
329
|
+
// ---------------------------------------------------------------------
|
|
330
|
+
async openSignaling() {
|
|
331
|
+
const channel = new signaling_js_1.SignalingChannel({
|
|
332
|
+
signalingUrl: this.opts.signalingUrl,
|
|
333
|
+
apiKey: this.opts.apiKey,
|
|
334
|
+
accessToken: this.opts.accessToken,
|
|
335
|
+
connectTimeoutMs: this.opts.connectTimeoutMs,
|
|
336
|
+
logger: this.logger,
|
|
337
|
+
});
|
|
338
|
+
await channel.connect({
|
|
339
|
+
onMessage: (msg) => this.handleSignalingMessage(msg),
|
|
340
|
+
onClose: (e) => this.handleSignalingClose(e),
|
|
341
|
+
onError: (e) => this.logger.warn?.("[convbased-sdk] signaling error event", e),
|
|
342
|
+
});
|
|
343
|
+
this.signaling = channel;
|
|
344
|
+
}
|
|
345
|
+
async resolveIceServers() {
|
|
346
|
+
if (this.opts.iceServers?.length)
|
|
347
|
+
return this.opts.iceServers;
|
|
348
|
+
if (typeof this.opts.graphqlUrl === "string") {
|
|
349
|
+
try {
|
|
350
|
+
const cfg = await (0, rtcServers_js_1.fetchRTCServers)({
|
|
351
|
+
graphqlUrl: this.opts.graphqlUrl,
|
|
352
|
+
apiKey: this.opts.apiKey,
|
|
353
|
+
accessToken: this.opts.accessToken,
|
|
354
|
+
});
|
|
355
|
+
if (cfg.urls?.length)
|
|
356
|
+
return [cfg];
|
|
357
|
+
}
|
|
358
|
+
catch (e) {
|
|
359
|
+
this.logger.warn?.("[convbased-sdk] fetchRTCServers failed, falling back to STUN:", e);
|
|
360
|
+
}
|
|
361
|
+
}
|
|
362
|
+
return rtcServers_js_1.DEFAULT_STUN_SERVERS;
|
|
363
|
+
}
|
|
364
|
+
async openPeer(opts, iceServers) {
|
|
365
|
+
const pc = new RTCPeerConnection({
|
|
366
|
+
iceServers: iceServers,
|
|
367
|
+
iceTransportPolicy: this.opts.iceTransportPolicy,
|
|
368
|
+
});
|
|
369
|
+
this.pc = pc;
|
|
370
|
+
pc.onicecandidate = (event) => {
|
|
371
|
+
if (event.candidate && this.signaling?.isOpen) {
|
|
372
|
+
this.signaling.send({
|
|
373
|
+
type: "ice_candidate",
|
|
374
|
+
candidate: event.candidate.toJSON(),
|
|
375
|
+
});
|
|
376
|
+
}
|
|
377
|
+
};
|
|
378
|
+
pc.ontrack = (event) => {
|
|
379
|
+
const stream = event.streams[0] ?? new MediaStream([event.track]);
|
|
380
|
+
this.convertedStream = stream;
|
|
381
|
+
this.emit("track", { stream, track: event.track });
|
|
382
|
+
};
|
|
383
|
+
pc.onconnectionstatechange = () => {
|
|
384
|
+
const cs = pc.connectionState;
|
|
385
|
+
this.logger.debug?.("[convbased-sdk] pc state:", cs);
|
|
386
|
+
if (cs === "connecting") {
|
|
387
|
+
if (this.state === "negotiating")
|
|
388
|
+
this.setState("connecting");
|
|
389
|
+
}
|
|
390
|
+
else if (cs === "failed" || cs === "disconnected" || cs === "closed") {
|
|
391
|
+
if (this.state !== "closing" && this.state !== "closed") {
|
|
392
|
+
this.emit("error", new Error(`PeerConnection entered "${cs}" state`));
|
|
393
|
+
void this.disconnect();
|
|
394
|
+
}
|
|
395
|
+
}
|
|
396
|
+
};
|
|
397
|
+
this.localStream = await this.acquireLocalStream(opts.audio);
|
|
398
|
+
for (const track of this.localStream.getAudioTracks()) {
|
|
399
|
+
pc.addTrack(track, this.localStream);
|
|
400
|
+
}
|
|
401
|
+
const offer = await pc.createOffer({ offerToReceiveAudio: true });
|
|
402
|
+
offer.sdp = (0, sdp_js_1.applyOpusSdpOptions)(offer.sdp ?? "", {
|
|
403
|
+
bitrateKbps: this.opts.bitrate,
|
|
404
|
+
stereo: this.opts.stereo,
|
|
405
|
+
});
|
|
406
|
+
await pc.setLocalDescription(offer);
|
|
407
|
+
const sampleRate = opts.sampleRate ??
|
|
408
|
+
detectSampleRate(this.localStream) ??
|
|
409
|
+
48000;
|
|
410
|
+
const preferences = {
|
|
411
|
+
...(opts.preferences ?? {}),
|
|
412
|
+
model_id: opts.modelId,
|
|
413
|
+
sample_rate: sampleRate,
|
|
414
|
+
};
|
|
415
|
+
if (!this.signaling?.isOpen) {
|
|
416
|
+
throw new Error("Signaling channel closed before offer was sent");
|
|
417
|
+
}
|
|
418
|
+
this.offerInFlight = true;
|
|
419
|
+
this.signaling.send({ type: "offer", sdp: offer.sdp, preferences });
|
|
420
|
+
}
|
|
421
|
+
async acquireLocalStream(audio) {
|
|
422
|
+
if (audio instanceof MediaStream)
|
|
423
|
+
return audio;
|
|
424
|
+
const constraints = {
|
|
425
|
+
audio: audio === undefined ? true : audio,
|
|
426
|
+
video: false,
|
|
427
|
+
};
|
|
428
|
+
if (typeof navigator === "undefined" ||
|
|
429
|
+
!navigator.mediaDevices?.getUserMedia) {
|
|
430
|
+
throw new Error("navigator.mediaDevices.getUserMedia is unavailable — pass a MediaStream via `audio`");
|
|
431
|
+
}
|
|
432
|
+
return navigator.mediaDevices.getUserMedia(constraints);
|
|
433
|
+
}
|
|
434
|
+
waitForServiceReady() {
|
|
435
|
+
return new Promise((resolve, reject) => {
|
|
436
|
+
const off = this.on("ready", () => {
|
|
437
|
+
cleanup();
|
|
438
|
+
resolve();
|
|
439
|
+
});
|
|
440
|
+
const offErr = this.on("error", (err) => {
|
|
441
|
+
cleanup();
|
|
442
|
+
reject(err);
|
|
443
|
+
});
|
|
444
|
+
const offClosed = this.on("closed", () => {
|
|
445
|
+
cleanup();
|
|
446
|
+
reject(new Error("Signaling closed before SERVICE_READY"));
|
|
447
|
+
});
|
|
448
|
+
this.serviceReadyTimer = setTimeout(() => {
|
|
449
|
+
cleanup();
|
|
450
|
+
reject(new Error(`Timed out waiting for SERVICE_READY after ${this.opts.signalingTimeoutMs}ms`));
|
|
451
|
+
}, this.opts.signalingTimeoutMs);
|
|
452
|
+
const cleanup = () => {
|
|
453
|
+
off();
|
|
454
|
+
offErr();
|
|
455
|
+
offClosed();
|
|
456
|
+
this.clearServiceReadyTimer();
|
|
457
|
+
};
|
|
458
|
+
});
|
|
459
|
+
}
|
|
460
|
+
clearServiceReadyTimer() {
|
|
461
|
+
if (this.serviceReadyTimer) {
|
|
462
|
+
clearTimeout(this.serviceReadyTimer);
|
|
463
|
+
this.serviceReadyTimer = null;
|
|
464
|
+
}
|
|
465
|
+
}
|
|
466
|
+
handleSignalingMessage(msg) {
|
|
467
|
+
const type = msg.type;
|
|
468
|
+
this.emit("message", {
|
|
469
|
+
code: msg.code,
|
|
470
|
+
message: msg.message,
|
|
471
|
+
raw: msg,
|
|
472
|
+
});
|
|
473
|
+
switch (type) {
|
|
474
|
+
case "answer":
|
|
475
|
+
void this.applyAnswer(msg);
|
|
476
|
+
break;
|
|
477
|
+
case "ice_candidate":
|
|
478
|
+
void this.applyRemoteCandidate(msg);
|
|
479
|
+
break;
|
|
480
|
+
case "task_ack": {
|
|
481
|
+
const m = msg;
|
|
482
|
+
this.emit("taskAck", {
|
|
483
|
+
taskId: m.task_id,
|
|
484
|
+
status: m.status,
|
|
485
|
+
queuePosition: m.queue_position,
|
|
486
|
+
code: m.code,
|
|
487
|
+
});
|
|
488
|
+
break;
|
|
489
|
+
}
|
|
490
|
+
case "task_progress": {
|
|
491
|
+
const m = msg;
|
|
492
|
+
this.emit("taskProgress", {
|
|
493
|
+
taskId: m.task_id,
|
|
494
|
+
progress: m.progress,
|
|
495
|
+
code: m.code,
|
|
496
|
+
});
|
|
497
|
+
break;
|
|
498
|
+
}
|
|
499
|
+
case "task_finished": {
|
|
500
|
+
const m = msg;
|
|
501
|
+
this.emit("taskFinished", {
|
|
502
|
+
taskId: m.task_id,
|
|
503
|
+
status: m.status,
|
|
504
|
+
resultKey: m.result_key,
|
|
505
|
+
downloadUrl: m.download_url,
|
|
506
|
+
error: m.error,
|
|
507
|
+
code: m.code,
|
|
508
|
+
});
|
|
509
|
+
break;
|
|
510
|
+
}
|
|
511
|
+
case "message": {
|
|
512
|
+
const code = msg.code;
|
|
513
|
+
const text = msg.message;
|
|
514
|
+
if (code === types_js_1.RTCStatusCode.SERVICE_READY) {
|
|
515
|
+
this.emit("ready", { code, message: text });
|
|
516
|
+
}
|
|
517
|
+
else if (code === types_js_1.RTCStatusCode.ERROR ||
|
|
518
|
+
code === types_js_1.RTCStatusCode.GPU_INSUFFICIENT ||
|
|
519
|
+
code === types_js_1.RTCStatusCode.UNPAID_SERVICE ||
|
|
520
|
+
code === types_js_1.RTCStatusCode.MODEL_NOT_FOUND ||
|
|
521
|
+
code === types_js_1.RTCStatusCode.DUPLICATE_CONNECTION ||
|
|
522
|
+
code === types_js_1.RTCStatusCode.REQUEST_TOO_FAST) {
|
|
523
|
+
this.emit("error", new Error(text || `Server reported error code ${code}`));
|
|
524
|
+
}
|
|
525
|
+
else if (code === types_js_1.RTCStatusCode.SHUTDOWN) {
|
|
526
|
+
void this.disconnect();
|
|
527
|
+
}
|
|
528
|
+
break;
|
|
529
|
+
}
|
|
530
|
+
case "shutdown":
|
|
531
|
+
case "error": {
|
|
532
|
+
const text = msg.message;
|
|
533
|
+
this.emit("error", new Error(text || `Server sent "${type}"`));
|
|
534
|
+
void this.disconnect();
|
|
535
|
+
break;
|
|
536
|
+
}
|
|
537
|
+
case "ping":
|
|
538
|
+
if (this.signaling?.isOpen)
|
|
539
|
+
this.signaling.send({ type: "pong" });
|
|
540
|
+
break;
|
|
541
|
+
case "pong":
|
|
542
|
+
default:
|
|
543
|
+
// task_* and other passthrough messages are surfaced via the
|
|
544
|
+
// generic "message" event above.
|
|
545
|
+
break;
|
|
546
|
+
}
|
|
547
|
+
}
|
|
548
|
+
async applyAnswer(msg) {
|
|
549
|
+
if (!this.pc)
|
|
550
|
+
return;
|
|
551
|
+
try {
|
|
552
|
+
await this.pc.setRemoteDescription({ type: "answer", sdp: msg.sdp });
|
|
553
|
+
this.offerInFlight = false;
|
|
554
|
+
}
|
|
555
|
+
catch (e) {
|
|
556
|
+
this.emit("error", new Error(`Failed to apply remote answer: ${describeErr(e)}`));
|
|
557
|
+
}
|
|
558
|
+
}
|
|
559
|
+
async applyRemoteCandidate(msg) {
|
|
560
|
+
if (!this.pc)
|
|
561
|
+
return;
|
|
562
|
+
try {
|
|
563
|
+
await this.pc.addIceCandidate(msg.candidate);
|
|
564
|
+
}
|
|
565
|
+
catch (e) {
|
|
566
|
+
this.logger.warn?.("[convbased-sdk] addIceCandidate failed:", e);
|
|
567
|
+
}
|
|
568
|
+
}
|
|
569
|
+
handleSignalingClose(event) {
|
|
570
|
+
if (this.state === "closing" || this.state === "closed")
|
|
571
|
+
return;
|
|
572
|
+
this.emit("closed", { code: event.code, reason: event.reason });
|
|
573
|
+
// 1008 is what the server sends for auth + balance failures.
|
|
574
|
+
if (event.code === 1008) {
|
|
575
|
+
this.emit("error", new Error(`Signaling rejected the connection: ${event.reason || "policy violation"}`));
|
|
576
|
+
}
|
|
577
|
+
else if (event.code !== 1000) {
|
|
578
|
+
this.emit("error", new Error(`Signaling closed unexpectedly (code=${event.code}, reason=${event.reason || "?"})`));
|
|
579
|
+
}
|
|
580
|
+
this.tearDownPeer();
|
|
581
|
+
this.setState("closed");
|
|
582
|
+
}
|
|
583
|
+
tearDownPeer() {
|
|
584
|
+
if (this.pc) {
|
|
585
|
+
try {
|
|
586
|
+
this.pc.onicecandidate = null;
|
|
587
|
+
this.pc.ontrack = null;
|
|
588
|
+
this.pc.onconnectionstatechange = null;
|
|
589
|
+
this.pc.close();
|
|
590
|
+
}
|
|
591
|
+
catch {
|
|
592
|
+
/* ignore */
|
|
593
|
+
}
|
|
594
|
+
this.pc = null;
|
|
595
|
+
}
|
|
596
|
+
this.stopTracks(this.localStream);
|
|
597
|
+
this.localStream = null;
|
|
598
|
+
this.convertedStream = null;
|
|
599
|
+
}
|
|
600
|
+
stopTracks(stream) {
|
|
601
|
+
stream?.getTracks().forEach((t) => {
|
|
602
|
+
try {
|
|
603
|
+
t.stop();
|
|
604
|
+
}
|
|
605
|
+
catch {
|
|
606
|
+
/* ignore */
|
|
607
|
+
}
|
|
608
|
+
});
|
|
609
|
+
}
|
|
610
|
+
setState(next) {
|
|
611
|
+
if (next === this.state)
|
|
612
|
+
return;
|
|
613
|
+
const previous = this.state;
|
|
614
|
+
this.state = next;
|
|
615
|
+
this.emit("state", { state: next, previous });
|
|
616
|
+
}
|
|
617
|
+
}
|
|
618
|
+
exports.ConvbasedClient = ConvbasedClient;
|
|
619
|
+
function generateTaskId() {
|
|
620
|
+
if (typeof crypto !== "undefined" && "randomUUID" in crypto) {
|
|
621
|
+
return crypto.randomUUID();
|
|
622
|
+
}
|
|
623
|
+
return `${Date.now()}_${Math.random().toString(16).slice(2)}`;
|
|
624
|
+
}
|
|
625
|
+
function detectSampleRate(stream) {
|
|
626
|
+
const track = stream.getAudioTracks()[0];
|
|
627
|
+
const rate = track?.getSettings()?.sampleRate;
|
|
628
|
+
return typeof rate === "number" ? rate : null;
|
|
629
|
+
}
|
|
630
|
+
function describeErr(e) {
|
|
631
|
+
if (e instanceof Error)
|
|
632
|
+
return e.message;
|
|
633
|
+
return String(e);
|
|
634
|
+
}
|
|
635
|
+
//# sourceMappingURL=client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.DEFAULT_GRAPHQL_URL = exports.DEFAULT_SIGNALING_URL = void 0;
|
|
4
|
+
// Production endpoints baked into the SDK. These mirror Convbased-Web's
|
|
5
|
+
// `.env` (VITE_WS_ENDPOINT / VITE_API_BASE_URL) and are considered stable —
|
|
6
|
+
// they're consumed by every Convbased client today. Override only for
|
|
7
|
+
// self-hosted deployments or local development.
|
|
8
|
+
exports.DEFAULT_SIGNALING_URL = "wss://api.weights.chat/api/signaling/ws";
|
|
9
|
+
exports.DEFAULT_GRAPHQL_URL = "https://api.weights.chat/api/v1/graphql";
|
|
10
|
+
//# sourceMappingURL=endpoints.js.map
|