@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.
Files changed (82) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +235 -0
  3. package/dist/cjs/client.js +635 -0
  4. package/dist/cjs/client.js.map +1 -0
  5. package/dist/cjs/endpoints.js +10 -0
  6. package/dist/cjs/endpoints.js.map +1 -0
  7. package/dist/cjs/events.js +39 -0
  8. package/dist/cjs/events.js.map +1 -0
  9. package/dist/cjs/graphql.js +40 -0
  10. package/dist/cjs/graphql.js.map +1 -0
  11. package/dist/cjs/index.js +24 -0
  12. package/dist/cjs/index.js.map +1 -0
  13. package/dist/cjs/package.json +3 -0
  14. package/dist/cjs/rtcServers.js +35 -0
  15. package/dist/cjs/rtcServers.js.map +1 -0
  16. package/dist/cjs/sdp.js +37 -0
  17. package/dist/cjs/sdp.js.map +1 -0
  18. package/dist/cjs/signaling.js +146 -0
  19. package/dist/cjs/signaling.js.map +1 -0
  20. package/dist/cjs/tts.js +227 -0
  21. package/dist/cjs/tts.js.map +1 -0
  22. package/dist/cjs/types.js +26 -0
  23. package/dist/cjs/types.js.map +1 -0
  24. package/dist/cjs/upload.js +87 -0
  25. package/dist/cjs/upload.js.map +1 -0
  26. package/dist/client.d.ts +169 -0
  27. package/dist/client.d.ts.map +1 -0
  28. package/dist/client.js +631 -0
  29. package/dist/client.js.map +1 -0
  30. package/dist/convbased-sdk.global.js +1291 -0
  31. package/dist/endpoints.d.ts +3 -0
  32. package/dist/endpoints.d.ts.map +1 -0
  33. package/dist/endpoints.js +7 -0
  34. package/dist/endpoints.js.map +1 -0
  35. package/dist/events.d.ts +9 -0
  36. package/dist/events.d.ts.map +1 -0
  37. package/dist/events.js +35 -0
  38. package/dist/events.js.map +1 -0
  39. package/dist/graphql.d.ts +18 -0
  40. package/dist/graphql.d.ts.map +1 -0
  41. package/dist/graphql.js +37 -0
  42. package/dist/graphql.js.map +1 -0
  43. package/dist/index.d.ts +9 -0
  44. package/dist/index.d.ts.map +1 -0
  45. package/dist/index.js +9 -0
  46. package/dist/index.js.map +1 -0
  47. package/dist/rtcServers.d.ts +13 -0
  48. package/dist/rtcServers.d.ts.map +1 -0
  49. package/dist/rtcServers.js +31 -0
  50. package/dist/rtcServers.js.map +1 -0
  51. package/dist/sdp.d.ts +6 -0
  52. package/dist/sdp.d.ts.map +1 -0
  53. package/dist/sdp.js +34 -0
  54. package/dist/sdp.js.map +1 -0
  55. package/dist/signaling.d.ts +33 -0
  56. package/dist/signaling.d.ts.map +1 -0
  57. package/dist/signaling.js +142 -0
  58. package/dist/signaling.js.map +1 -0
  59. package/dist/tts.d.ts +111 -0
  60. package/dist/tts.d.ts.map +1 -0
  61. package/dist/tts.js +223 -0
  62. package/dist/tts.js.map +1 -0
  63. package/dist/types.d.ts +194 -0
  64. package/dist/types.d.ts.map +1 -0
  65. package/dist/types.js +23 -0
  66. package/dist/types.js.map +1 -0
  67. package/dist/upload.d.ts +46 -0
  68. package/dist/upload.d.ts.map +1 -0
  69. package/dist/upload.js +82 -0
  70. package/dist/upload.js.map +1 -0
  71. package/package.json +57 -0
  72. package/src/client.ts +839 -0
  73. package/src/endpoints.ts +8 -0
  74. package/src/events.ts +38 -0
  75. package/src/graphql.ts +58 -0
  76. package/src/index.ts +50 -0
  77. package/src/rtcServers.ts +38 -0
  78. package/src/sdp.ts +45 -0
  79. package/src/signaling.ts +172 -0
  80. package/src/tts.ts +364 -0
  81. package/src/types.ts +201 -0
  82. package/src/upload.ts +132 -0
@@ -0,0 +1,87 @@
1
+ "use strict";
2
+ // Audio upload helpers shared by TTS (reference voice) and file inference
3
+ // (source audio). Two steps mirror Convbased-Web: ask the GraphQL service for
4
+ // a presigned PUT (`requestAudioUpload`), then PUT the bytes straight to object
5
+ // storage. The returned COS `key` is what you hand to `submitTts` /
6
+ // `startTask`.
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ exports.requestAudioUpload = requestAudioUpload;
9
+ exports.putToPresigned = putToPresigned;
10
+ exports.uploadAudio = uploadAudio;
11
+ const graphql_js_1 = require("./graphql.js");
12
+ const REQUEST_AUDIO_UPLOAD = /* GraphQL */ `
13
+ mutation RequestAudioUpload($input: RequestUploadInput!) {
14
+ requestAudioUpload(input: $input) {
15
+ key
16
+ upload_url
17
+ method
18
+ expires_in
19
+ headers {
20
+ name
21
+ value
22
+ }
23
+ bucket
24
+ region
25
+ url
26
+ }
27
+ }
28
+ `;
29
+ /** Ask the service for a presigned PUT for an audio file. */
30
+ async function requestAudioUpload(args) {
31
+ const data = await (0, graphql_js_1.graphqlRequest)({
32
+ graphqlUrl: args.graphqlUrl,
33
+ apiKey: args.apiKey,
34
+ accessToken: args.accessToken,
35
+ signal: args.signal,
36
+ query: REQUEST_AUDIO_UPLOAD,
37
+ variables: {
38
+ input: {
39
+ filename: args.filename,
40
+ content_type: args.contentType,
41
+ size: args.size,
42
+ },
43
+ },
44
+ });
45
+ return data.requestAudioUpload;
46
+ }
47
+ /** PUT raw bytes to a presigned upload target. */
48
+ async function putToPresigned(presigned, body, signal) {
49
+ const headers = {};
50
+ for (const h of presigned.headers ?? []) {
51
+ if (h?.name)
52
+ headers[h.name] = h.value;
53
+ }
54
+ const res = await fetch(presigned.upload_url, {
55
+ method: presigned.method || "PUT",
56
+ headers,
57
+ body: body,
58
+ signal,
59
+ });
60
+ if (!res.ok) {
61
+ throw new Error(`Audio upload failed: HTTP ${res.status} ${res.statusText}`);
62
+ }
63
+ }
64
+ /**
65
+ * Upload an audio `Blob`/`File` end-to-end (presign + PUT) and resolve the COS
66
+ * `key`. Filename and content type are taken from the `File` when available;
67
+ * override via `opts` when uploading a bare `Blob`.
68
+ */
69
+ async function uploadAudio(args) {
70
+ const maybeFile = args.file;
71
+ const filename = args.filename ?? maybeFile.name ?? "audio.wav";
72
+ const contentType = args.contentType ||
73
+ args.file.type ||
74
+ "application/octet-stream";
75
+ const presigned = await requestAudioUpload({
76
+ graphqlUrl: args.graphqlUrl,
77
+ apiKey: args.apiKey,
78
+ accessToken: args.accessToken,
79
+ signal: args.signal,
80
+ filename,
81
+ contentType,
82
+ size: args.file.size,
83
+ });
84
+ await putToPresigned(presigned, args.file, args.signal);
85
+ return { key: presigned.key };
86
+ }
87
+ //# sourceMappingURL=upload.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"upload.js","sourceRoot":"","sources":["../../src/upload.ts"],"names":[],"mappings":";AAAA,0EAA0E;AAC1E,8EAA8E;AAC9E,gFAAgF;AAChF,oEAAoE;AACpE,eAAe;;AA6Cf,gDAwBC;AAGD,wCAoBC;AAOD,kCA4BC;AA7HD,6CAAgE;AAwBhE,MAAM,oBAAoB,GAAG,aAAa,CAAC;;;;;;;;;;;;;;;;CAgB1C,CAAC;AAEF,6DAA6D;AACtD,KAAK,UAAU,kBAAkB,CACvC,IAMC;IAED,MAAM,IAAI,GAAG,MAAM,IAAA,2BAAc,EAA0C;QAC1E,UAAU,EAAE,IAAI,CAAC,UAAU;QAC3B,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,WAAW,EAAE,IAAI,CAAC,WAAW;QAC7B,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,KAAK,EAAE,oBAAoB;QAC3B,SAAS,EAAE;YACV,KAAK,EAAE;gBACN,QAAQ,EAAE,IAAI,CAAC,QAAQ;gBACvB,YAAY,EAAE,IAAI,CAAC,WAAW;gBAC9B,IAAI,EAAE,IAAI,CAAC,IAAI;aACf;SACD;KACD,CAAC,CAAC;IACH,OAAO,IAAI,CAAC,kBAAkB,CAAC;AAChC,CAAC;AAED,kDAAkD;AAC3C,KAAK,UAAU,cAAc,CACnC,SAA0B,EAC1B,IAA0C,EAC1C,MAAoB;IAEpB,MAAM,OAAO,GAA2B,EAAE,CAAC;IAC3C,KAAK,MAAM,CAAC,IAAI,SAAS,CAAC,OAAO,IAAI,EAAE,EAAE,CAAC;QACzC,IAAI,CAAC,EAAE,IAAI;YAAE,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC;IACxC,CAAC;IACD,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,SAAS,CAAC,UAAU,EAAE;QAC7C,MAAM,EAAE,SAAS,CAAC,MAAM,IAAI,KAAK;QACjC,OAAO;QACP,IAAI,EAAE,IAAgB;QACtB,MAAM;KACN,CAAC,CAAC;IACH,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CACd,6BAA6B,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,UAAU,EAAE,CAC3D,CAAC;IACH,CAAC;AACF,CAAC;AAED;;;;GAIG;AACI,KAAK,UAAU,WAAW,CAChC,IAMC;IAED,MAAM,SAAS,GAAG,IAAI,CAAC,IAAY,CAAC;IACpC,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,IAAI,SAAS,CAAC,IAAI,IAAI,WAAW,CAAC;IAChE,MAAM,WAAW,GAChB,IAAI,CAAC,WAAW;QAChB,IAAI,CAAC,IAAI,CAAC,IAAI;QACd,0BAA0B,CAAC;IAE5B,MAAM,SAAS,GAAG,MAAM,kBAAkB,CAAC;QAC1C,UAAU,EAAE,IAAI,CAAC,UAAU;QAC3B,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,WAAW,EAAE,IAAI,CAAC,WAAW;QAC7B,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,QAAQ;QACR,WAAW;QACX,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI;KACpB,CAAC,CAAC;IAEH,MAAM,cAAc,CAAC,SAAS,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;IACxD,OAAO,EAAE,GAAG,EAAE,SAAS,CAAC,GAAG,EAAE,CAAC;AAC/B,CAAC"}
@@ -0,0 +1,169 @@
1
+ import { TypedEmitter } from "./events.js";
2
+ import { type ConnectionState, type ConnectionStats, type ConnectOptions, type ConvbasedClientOptions, type FileInferencePreferences, type RTCPreferences, type ServerMessageEvent, type TaskStatus } from "./types.js";
3
+ export interface TaskAckEvent {
4
+ taskId: string;
5
+ status: "queued" | "started";
6
+ queuePosition?: number;
7
+ code?: number;
8
+ }
9
+ export interface TaskProgressEvent {
10
+ taskId: string;
11
+ /** Progress in [0, 1]. */
12
+ progress: number;
13
+ code?: number;
14
+ }
15
+ export interface TaskFinishedEvent {
16
+ taskId: string;
17
+ status: TaskStatus;
18
+ /** COS key of the converted audio, on success. */
19
+ resultKey?: string;
20
+ /** Presigned download URL of the converted audio, on success. */
21
+ downloadUrl?: string;
22
+ /** Server-reported error, on failure. */
23
+ error?: string;
24
+ code?: number;
25
+ }
26
+ export interface StartTaskOptions {
27
+ /** COS key of the source audio to convert (upload via `uploadAudio`). */
28
+ audioKey: string;
29
+ /** Optional client-supplied task id; one is generated when omitted. */
30
+ taskId?: string;
31
+ /** Base name for the generated output file. Default `"output"`. */
32
+ generateName?: string;
33
+ /** Output container format. Default `"wav"`. */
34
+ format?: string;
35
+ /** Per-task conversion parameters. */
36
+ preferences?: FileInferencePreferences;
37
+ }
38
+ export interface RunFileInferenceOptions extends Omit<StartTaskOptions, "audioKey"> {
39
+ /** COS key of an already-uploaded source audio. Provide this or `audio`. */
40
+ audioKey?: string;
41
+ /** A source-audio `Blob`/`File` to upload first. Provide this or `audioKey`. */
42
+ audio?: Blob;
43
+ /** Give up waiting after this many ms. Default 300_000 (5 min). */
44
+ timeoutMs?: number;
45
+ /** Abort the wait (and stop the task). */
46
+ signal?: AbortSignal;
47
+ /** Called on `task_progress` frames. */
48
+ onProgress?: (event: TaskProgressEvent) => void;
49
+ /** Called on the `task_ack` frame. */
50
+ onAck?: (event: TaskAckEvent) => void;
51
+ }
52
+ type ClientEvents = {
53
+ state: {
54
+ state: ConnectionState;
55
+ previous: ConnectionState;
56
+ };
57
+ message: ServerMessageEvent;
58
+ ready: {
59
+ code: number;
60
+ message?: string;
61
+ };
62
+ track: {
63
+ stream: MediaStream;
64
+ track: MediaStreamTrack;
65
+ };
66
+ error: Error;
67
+ closed: {
68
+ code?: number;
69
+ reason?: string;
70
+ };
71
+ taskAck: TaskAckEvent;
72
+ taskProgress: TaskProgressEvent;
73
+ taskFinished: TaskFinishedEvent;
74
+ };
75
+ /**
76
+ * Real-time voice conversion client. Mirrors the flow used by Convbased-Web:
77
+ *
78
+ * 1. Open WebSocket to `${signalingUrl}/signaling/ws?api_key=…`.
79
+ * 2. Capture the microphone (or accept a user-provided `MediaStream`).
80
+ * 3. Build an `RTCPeerConnection`, attach the mic track, mangle the offer's
81
+ * Opus parameters, and send `{type: "offer", sdp, preferences}` over the
82
+ * signaling socket.
83
+ * 4. Apply the `answer` and `ice_candidate` messages from the server, fire
84
+ * local ICE candidates back over signaling.
85
+ * 5. When the server sends `{code: SERVICE_READY}` the processed track is
86
+ * emitted via the `track` event — wire it to an `<audio>` element to hear
87
+ * converted audio.
88
+ *
89
+ * The client is single-use: call `connect()` once, then `disconnect()` to
90
+ * tear everything down. Create a fresh instance for a new session.
91
+ */
92
+ export declare class ConvbasedClient extends TypedEmitter<ClientEvents> {
93
+ private readonly opts;
94
+ private readonly logger;
95
+ private state;
96
+ private signaling;
97
+ private pc;
98
+ private localStream;
99
+ private convertedStream;
100
+ private serviceReadyTimer;
101
+ private offerInFlight;
102
+ constructor(options: ConvbasedClientOptions);
103
+ getState(): ConnectionState;
104
+ /** The converted (voice-changed) audio stream returned from the inference node. */
105
+ getConvertedStream(): MediaStream | null;
106
+ getPeerConnection(): RTCPeerConnection | null;
107
+ /**
108
+ * Open the signaling socket, capture audio, and run WebRTC negotiation.
109
+ * Resolves when the server emits SERVICE_READY (audio is flowing both ways).
110
+ * Rejects on auth failures, signaling errors, or negotiation timeouts.
111
+ */
112
+ connect(opts: ConnectOptions): Promise<void>;
113
+ /**
114
+ * Send a runtime config update to the inference node. Equivalent to the
115
+ * pitch / formant / RMS sliders in Convbased-Web — only the fields you set
116
+ * are forwarded.
117
+ */
118
+ updateConfig(preferences: Partial<RTCPreferences>): void;
119
+ /**
120
+ * Upload a source-audio `Blob`/`File` and resolve its COS key, ready to pass
121
+ * to `startTask` / `runFileInference`. Requires `graphqlUrl` (the default
122
+ * production endpoint, or a self-hosted override — not `false`).
123
+ */
124
+ uploadAudio(file: Blob, opts?: {
125
+ filename?: string;
126
+ contentType?: string;
127
+ signal?: AbortSignal;
128
+ }): Promise<{
129
+ key: string;
130
+ }>;
131
+ /**
132
+ * Submit a file-inference task over the signaling channel and return its
133
+ * task id. The client must be `connected`. Results arrive asynchronously via
134
+ * the `taskAck` / `taskProgress` / `taskFinished` events — use
135
+ * `runFileInference` for a promise-based wrapper.
136
+ */
137
+ startTask(opts: StartTaskOptions): string;
138
+ /** Cancel a file-inference task. Omit `taskId` to stop the current one. */
139
+ stopTask(taskId?: string): void;
140
+ /**
141
+ * Promise-based file inference: (optionally upload the source audio,) start
142
+ * the task, and resolve with the `taskFinished` event on success. Rejects on
143
+ * task failure/cancellation, timeout, signaling close, or `signal` abort.
144
+ */
145
+ runFileInference(opts: RunFileInferenceOptions): Promise<TaskFinishedEvent>;
146
+ /** Mute / unmute the local mic by toggling the captured audio track. */
147
+ setMuted(muted: boolean): void;
148
+ /** Replace the local input stream (mic) with a different `MediaStream` (hot-swap). */
149
+ replaceLocalStream(newStream: MediaStream): Promise<void>;
150
+ /** Snapshot of jitter / loss / RTT (sampled from `RTCPeerConnection.getStats`). */
151
+ getStats(): Promise<ConnectionStats | null>;
152
+ /** Gracefully end the session — notifies the server, closes the PC. */
153
+ disconnect(): Promise<void>;
154
+ private openSignaling;
155
+ private resolveIceServers;
156
+ private openPeer;
157
+ private acquireLocalStream;
158
+ private waitForServiceReady;
159
+ private clearServiceReadyTimer;
160
+ private handleSignalingMessage;
161
+ private applyAnswer;
162
+ private applyRemoteCandidate;
163
+ private handleSignalingClose;
164
+ private tearDownPeer;
165
+ private stopTracks;
166
+ private setState;
167
+ }
168
+ export {};
169
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}