@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
package/dist/tts.js ADDED
@@ -0,0 +1,223 @@
1
+ // Text-to-speech client for the Convbased IndexTTS2 service. This path is pure
2
+ // GraphQL — it does not touch WebRTC or the signaling socket. Synthesis is
3
+ // asynchronous: you submit a job, then poll until it reaches a terminal state.
4
+ //
5
+ // Typical flow:
6
+ // const tts = new TtsClient({ apiKey });
7
+ // const { key } = await tts.uploadReferenceAudio(file); // reference voice
8
+ // const result = await tts.synthesize({ referenceKey: key, text: "你好" });
9
+ // audio.src = result.url; // presigned, ~1h
10
+ import { DEFAULT_GRAPHQL_URL } from "./endpoints.js";
11
+ import { graphqlRequest } from "./graphql.js";
12
+ import { uploadAudio } from "./upload.js";
13
+ const JOB_FIELDS = /* GraphQL */ `
14
+ job_id
15
+ status
16
+ position
17
+ result {
18
+ key
19
+ url
20
+ token_count
21
+ audio_duration_sec
22
+ amount_charged
23
+ balance_after
24
+ }
25
+ error
26
+ `;
27
+ export class TtsClient {
28
+ constructor(options) {
29
+ if (!options.apiKey && !options.accessToken) {
30
+ throw new Error("TtsClient requires either `apiKey` or `accessToken`");
31
+ }
32
+ this.graphqlUrl = options.graphqlUrl ?? DEFAULT_GRAPHQL_URL;
33
+ this.apiKey = options.apiKey;
34
+ this.accessToken = options.accessToken;
35
+ const provided = options.logger ?? {};
36
+ this.logger = {
37
+ debug: provided.debug ?? (() => { }),
38
+ info: provided.info ?? (() => { }),
39
+ warn: provided.warn ?? console.warn.bind(console),
40
+ error: provided.error ?? console.error.bind(console),
41
+ };
42
+ }
43
+ /** Upload a reference-voice `Blob`/`File` and resolve its COS key. */
44
+ async uploadReferenceAudio(file, opts) {
45
+ return uploadAudio({
46
+ graphqlUrl: this.graphqlUrl,
47
+ apiKey: this.apiKey,
48
+ accessToken: this.accessToken,
49
+ file,
50
+ filename: opts?.filename,
51
+ contentType: opts?.contentType,
52
+ signal: opts?.signal,
53
+ });
54
+ }
55
+ /** Current billing rule: `cost = max(tokens * pricePerToken, minCharge)`. */
56
+ async getPricing(signal) {
57
+ const data = await graphqlRequest({
58
+ graphqlUrl: this.graphqlUrl,
59
+ apiKey: this.apiKey,
60
+ accessToken: this.accessToken,
61
+ signal,
62
+ query: /* GraphQL */ `
63
+ query {
64
+ ttsPricing {
65
+ price_per_token
66
+ min_charge
67
+ }
68
+ }
69
+ `,
70
+ });
71
+ return {
72
+ pricePerToken: data.ttsPricing.price_per_token,
73
+ minCharge: data.ttsPricing.min_charge,
74
+ };
75
+ }
76
+ /** Enqueue a synthesis job; resolves immediately with the queued job. */
77
+ async submit(opts, signal) {
78
+ const data = await graphqlRequest({
79
+ graphqlUrl: this.graphqlUrl,
80
+ apiKey: this.apiKey,
81
+ accessToken: this.accessToken,
82
+ signal,
83
+ query: /* GraphQL */ `
84
+ mutation SubmitTts($input: SynthesizeTtsInput!) {
85
+ submitTts(input: $input) {
86
+ ${JOB_FIELDS}
87
+ }
88
+ }
89
+ `,
90
+ variables: {
91
+ input: {
92
+ reference_key: opts.referenceKey,
93
+ text: opts.text,
94
+ params: opts.params ?? null,
95
+ },
96
+ },
97
+ });
98
+ return toJob(data.submitTts);
99
+ }
100
+ /** Read the current status/result of a job. */
101
+ async getJob(jobId, signal) {
102
+ const data = await graphqlRequest({
103
+ graphqlUrl: this.graphqlUrl,
104
+ apiKey: this.apiKey,
105
+ accessToken: this.accessToken,
106
+ signal,
107
+ query: /* GraphQL */ `
108
+ query TtsJob($jobId: String!) {
109
+ ttsJob(jobId: $jobId) {
110
+ ${JOB_FIELDS}
111
+ }
112
+ }
113
+ `,
114
+ variables: { jobId },
115
+ });
116
+ return toJob(data.ttsJob);
117
+ }
118
+ /** Cancel a job. Only effective while it is still `queued`. */
119
+ async cancel(jobId, signal) {
120
+ const data = await graphqlRequest({
121
+ graphqlUrl: this.graphqlUrl,
122
+ apiKey: this.apiKey,
123
+ accessToken: this.accessToken,
124
+ signal,
125
+ query: /* GraphQL */ `
126
+ mutation CancelTtsJob($jobId: String!) {
127
+ cancelTtsJob(jobId: $jobId) {
128
+ ${JOB_FIELDS}
129
+ }
130
+ }
131
+ `,
132
+ variables: { jobId },
133
+ });
134
+ return toJob(data.cancelTtsJob);
135
+ }
136
+ /**
137
+ * One-call synthesis: (optionally upload the reference voice,) submit, then
138
+ * poll until the job finishes. Resolves with the `TtsResult` on success;
139
+ * rejects if the job fails/cancels, times out, or `signal` aborts.
140
+ */
141
+ async synthesize(opts) {
142
+ if (!opts.referenceKey && !opts.referenceAudio) {
143
+ throw new Error("synthesize() requires either `referenceKey` or `referenceAudio`");
144
+ }
145
+ const pollIntervalMs = opts.pollIntervalMs ?? 1500;
146
+ const timeoutMs = opts.timeoutMs ?? 300000;
147
+ const deadline = Date.now() + timeoutMs;
148
+ const referenceKey = opts.referenceKey ??
149
+ (await this.uploadReferenceAudio(opts.referenceAudio, {
150
+ signal: opts.signal,
151
+ })).key;
152
+ const submitted = await this.submit({ referenceKey, text: opts.text, params: opts.params }, opts.signal);
153
+ opts.onJob?.(submitted);
154
+ let job = submitted;
155
+ try {
156
+ while (job.status !== "done") {
157
+ if (opts.signal?.aborted) {
158
+ throw new DOMException("Aborted", "AbortError");
159
+ }
160
+ if (job.status === "failed") {
161
+ throw new Error(job.error || "TTS job failed");
162
+ }
163
+ if (job.status === "cancelled") {
164
+ throw new Error("TTS job was cancelled");
165
+ }
166
+ if (Date.now() > deadline) {
167
+ throw new Error(`Timed out waiting for TTS job ${job.jobId} after ${timeoutMs}ms`);
168
+ }
169
+ await delay(pollIntervalMs, opts.signal);
170
+ job = await this.getJob(job.jobId, opts.signal);
171
+ opts.onJob?.(job);
172
+ }
173
+ }
174
+ catch (err) {
175
+ // Best-effort: stop a still-queued job so we don't pay for a result
176
+ // nobody is waiting for.
177
+ if (opts.signal?.aborted) {
178
+ this.cancel(job.jobId).catch(() => { });
179
+ }
180
+ throw err;
181
+ }
182
+ if (!job.result) {
183
+ throw new Error("TTS job is done but carried no result");
184
+ }
185
+ return job.result;
186
+ }
187
+ }
188
+ function toJob(wire) {
189
+ return {
190
+ jobId: wire.job_id,
191
+ status: wire.status,
192
+ position: wire.position,
193
+ result: wire.result
194
+ ? {
195
+ key: wire.result.key,
196
+ url: wire.result.url,
197
+ tokenCount: wire.result.token_count,
198
+ audioDurationSec: wire.result.audio_duration_sec,
199
+ amountCharged: wire.result.amount_charged,
200
+ balanceAfter: wire.result.balance_after,
201
+ }
202
+ : null,
203
+ error: wire.error,
204
+ };
205
+ }
206
+ function delay(ms, signal) {
207
+ return new Promise((resolve, reject) => {
208
+ if (signal?.aborted) {
209
+ reject(new DOMException("Aborted", "AbortError"));
210
+ return;
211
+ }
212
+ const timer = setTimeout(() => {
213
+ signal?.removeEventListener("abort", onAbort);
214
+ resolve();
215
+ }, ms);
216
+ const onAbort = () => {
217
+ clearTimeout(timer);
218
+ reject(new DOMException("Aborted", "AbortError"));
219
+ };
220
+ signal?.addEventListener("abort", onAbort, { once: true });
221
+ });
222
+ }
223
+ //# sourceMappingURL=tts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tts.js","sourceRoot":"","sources":["../src/tts.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,194 @@
1
+ export interface RTCServersConfig {
2
+ urls: string[];
3
+ username?: string;
4
+ credential?: string;
5
+ }
6
+ export interface RTCPreferences {
7
+ model_id: string;
8
+ sample_rate: number;
9
+ pitch?: number;
10
+ rms_mix_rate?: number;
11
+ f0_threshold?: number;
12
+ block_time?: number;
13
+ crossfade_time?: number;
14
+ extra_time?: number;
15
+ f0_autotune?: boolean;
16
+ f0_autotune_strength?: number;
17
+ proposed_pitch?: boolean;
18
+ proposed_pitch_threshold?: number;
19
+ enable_limiter?: boolean;
20
+ limiter_threshold?: number;
21
+ enable_lookahead?: boolean;
22
+ lookahead_time?: number;
23
+ formant?: number;
24
+ index_rate?: number;
25
+ protect?: number;
26
+ threshold?: number;
27
+ [key: string]: unknown;
28
+ }
29
+ /**
30
+ * Per-task parameters for offline file inference (voice-to-voice). Forwarded
31
+ * verbatim to the inference node alongside `task_start`. Distinct from the
32
+ * live `RTCPreferences` — file inference exposes `f0_method`, `use_pv`, etc.
33
+ */
34
+ export interface FileInferencePreferences {
35
+ pitch?: number;
36
+ f0_method?: "rmvpe" | "fcpe";
37
+ f0_threshold?: number;
38
+ index_rate?: number;
39
+ protect?: number;
40
+ f0_autotune?: boolean;
41
+ f0_autotune_strength?: number;
42
+ proposed_pitch?: boolean;
43
+ proposed_pitch_threshold?: number;
44
+ sample_rate?: number;
45
+ formant?: number;
46
+ block_time?: number;
47
+ crossfade_time?: number;
48
+ extra_time?: number;
49
+ use_pv?: boolean;
50
+ rms_mix_rate?: number;
51
+ threshold?: number;
52
+ enable_limiter?: boolean;
53
+ limiter_threshold?: number;
54
+ enable_lookahead?: boolean;
55
+ lookahead_time?: number;
56
+ [key: string]: unknown;
57
+ }
58
+ export type OutgoingMessage = {
59
+ type: "offer";
60
+ sdp?: string;
61
+ preferences: RTCPreferences;
62
+ } | {
63
+ type: "ice_candidate";
64
+ candidate: RTCIceCandidateInit;
65
+ } | {
66
+ type: "config";
67
+ preferences: Partial<RTCPreferences>;
68
+ } | {
69
+ type: "task_start";
70
+ task_id: string;
71
+ audio_key: string;
72
+ generate_name?: string;
73
+ format?: string;
74
+ preferences?: FileInferencePreferences;
75
+ } | {
76
+ type: "task_stop";
77
+ task_id?: string;
78
+ } | {
79
+ type: "exit";
80
+ } | {
81
+ type: "ping";
82
+ } | {
83
+ type: "pong";
84
+ };
85
+ export declare enum RTCStatusCode {
86
+ ERROR = 2000,
87
+ GPU_INSUFFICIENT = 2001,
88
+ DUPLICATE_CONNECTION = 2002,
89
+ MODEL_NOT_FOUND = 2003,
90
+ UNPAID_SERVICE = 2004,
91
+ REQUEST_TOO_FAST = 2005,
92
+ CONNECTED = 3000,
93
+ REQUEST_RECEIVED = 3001,
94
+ TRACK_READY = 3002,
95
+ RESPONSE_SENT = 3003,
96
+ LOADING_MODEL = 3004,
97
+ SERVICE_READY = 3009,
98
+ TASK_PROGRESS = 3010,
99
+ TASK_FINISHED = 3011,
100
+ TASK_ACK = 3012,
101
+ SHUTDOWN = 4000,
102
+ SERVER_CLOSED = 5000
103
+ }
104
+ export type TaskStatus = "success" | "failure" | "cancelled";
105
+ export type IncomingMessage = {
106
+ type: "message" | "shutdown" | "error";
107
+ message?: string;
108
+ code?: number;
109
+ } | {
110
+ type: "answer";
111
+ sdp: string;
112
+ } | {
113
+ type: "ice_candidate";
114
+ candidate: RTCIceCandidateInit;
115
+ } | {
116
+ type: "task_ack";
117
+ task_id: string;
118
+ status: "queued" | "started";
119
+ queue_position?: number;
120
+ code?: number;
121
+ } | {
122
+ type: "task_progress";
123
+ task_id: string;
124
+ progress: number;
125
+ code?: number;
126
+ } | {
127
+ type: "task_finished";
128
+ task_id: string;
129
+ status: TaskStatus;
130
+ result_key?: string;
131
+ download_url?: string;
132
+ error?: string;
133
+ code?: number;
134
+ } | {
135
+ type: "ping";
136
+ } | {
137
+ type: "pong";
138
+ } | Record<string, unknown>;
139
+ export type ConnectionState = "idle" | "signaling" | "negotiating" | "connecting" | "connected" | "closing" | "closed" | "error";
140
+ export interface ConvbasedClientOptions {
141
+ /** Convbased API key issued in the Web console. Required unless `accessToken` is provided. */
142
+ apiKey?: string;
143
+ /** Optional JWT access token; takes a back seat to `apiKey` if both are provided. */
144
+ accessToken?: string;
145
+ /**
146
+ * Signaling WebSocket URL. Defaults to the production Convbased endpoint
147
+ * (`wss://api.weights.chat/api/signaling/ws`). Override only for
148
+ * self-hosted deployments. URLs ending in `/ws` are used as-is; bare
149
+ * hosts get `/signaling/ws` appended.
150
+ */
151
+ signalingUrl?: string;
152
+ /**
153
+ * GraphQL endpoint used to fetch TURN credentials. Defaults to the
154
+ * production Convbased endpoint (`https://api.weights.chat/api/v1/graphql`).
155
+ * Pass `false` to disable the auto-fetch entirely (will fall back to
156
+ * `iceServers` if provided, else public STUN).
157
+ */
158
+ graphqlUrl?: string | false;
159
+ /** Statically-configured ICE servers. If omitted and `graphqlUrl` is set, the SDK fetches `rtcServers`. */
160
+ iceServers?: RTCServersConfig[];
161
+ /** `relay` forces TURN-only — useful when STUN is blocked. */
162
+ iceTransportPolicy?: RTCIceTransportPolicy;
163
+ /** Opus bitrate in kbps. Default 64. */
164
+ bitrate?: number;
165
+ /** Send stereo. Default false. */
166
+ stereo?: boolean;
167
+ /** How long to wait for `SERVICE_READY` after sending the offer, in ms. Default 120_000. */
168
+ signalingTimeoutMs?: number;
169
+ /** How long to wait for the initial WebSocket open, in ms. Default 20_000. */
170
+ connectTimeoutMs?: number;
171
+ /** Optional logger; defaults to `console` for warn/error only. */
172
+ logger?: Partial<Pick<Console, "debug" | "info" | "warn" | "error">>;
173
+ }
174
+ export interface ConnectOptions {
175
+ /** Model ID to load on the inference node — required. */
176
+ modelId: string;
177
+ /** Microphone constraints. Pass an existing `MediaStream` to skip getUserMedia entirely. */
178
+ audio?: MediaStream | MediaTrackConstraints | boolean;
179
+ /** Additional RVC preferences forwarded to the node. */
180
+ preferences?: Partial<Omit<RTCPreferences, "model_id" | "sample_rate">>;
181
+ /** Sample rate to advertise to the node. Defaults to the AudioContext's `sampleRate`, falling back to 48000. */
182
+ sampleRate?: number;
183
+ }
184
+ export interface ConnectionStats {
185
+ rttMs: number;
186
+ jitter: number;
187
+ packetsLost: number;
188
+ }
189
+ export interface ServerMessageEvent {
190
+ code?: number;
191
+ message?: string;
192
+ raw: IncomingMessage;
193
+ }
194
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
package/dist/types.js ADDED
@@ -0,0 +1,23 @@
1
+ // Wire-protocol types mirrored from ServerAPI / signaling.
2
+ export var RTCStatusCode;
3
+ (function (RTCStatusCode) {
4
+ RTCStatusCode[RTCStatusCode["ERROR"] = 2000] = "ERROR";
5
+ RTCStatusCode[RTCStatusCode["GPU_INSUFFICIENT"] = 2001] = "GPU_INSUFFICIENT";
6
+ RTCStatusCode[RTCStatusCode["DUPLICATE_CONNECTION"] = 2002] = "DUPLICATE_CONNECTION";
7
+ RTCStatusCode[RTCStatusCode["MODEL_NOT_FOUND"] = 2003] = "MODEL_NOT_FOUND";
8
+ RTCStatusCode[RTCStatusCode["UNPAID_SERVICE"] = 2004] = "UNPAID_SERVICE";
9
+ RTCStatusCode[RTCStatusCode["REQUEST_TOO_FAST"] = 2005] = "REQUEST_TOO_FAST";
10
+ RTCStatusCode[RTCStatusCode["CONNECTED"] = 3000] = "CONNECTED";
11
+ RTCStatusCode[RTCStatusCode["REQUEST_RECEIVED"] = 3001] = "REQUEST_RECEIVED";
12
+ RTCStatusCode[RTCStatusCode["TRACK_READY"] = 3002] = "TRACK_READY";
13
+ RTCStatusCode[RTCStatusCode["RESPONSE_SENT"] = 3003] = "RESPONSE_SENT";
14
+ RTCStatusCode[RTCStatusCode["LOADING_MODEL"] = 3004] = "LOADING_MODEL";
15
+ RTCStatusCode[RTCStatusCode["SERVICE_READY"] = 3009] = "SERVICE_READY";
16
+ // File inference (voice-to-voice) task lifecycle codes.
17
+ RTCStatusCode[RTCStatusCode["TASK_PROGRESS"] = 3010] = "TASK_PROGRESS";
18
+ RTCStatusCode[RTCStatusCode["TASK_FINISHED"] = 3011] = "TASK_FINISHED";
19
+ RTCStatusCode[RTCStatusCode["TASK_ACK"] = 3012] = "TASK_ACK";
20
+ RTCStatusCode[RTCStatusCode["SHUTDOWN"] = 4000] = "SHUTDOWN";
21
+ RTCStatusCode[RTCStatusCode["SERVER_CLOSED"] = 5000] = "SERVER_CLOSED";
22
+ })(RTCStatusCode || (RTCStatusCode = {}));
23
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,2DAA2D;AA+E3D,MAAM,CAAN,IAAY,aAsBX;AAtBD,WAAY,aAAa;IACxB,sDAAY,CAAA;IACZ,4EAAuB,CAAA;IACvB,oFAA2B,CAAA;IAC3B,0EAAsB,CAAA;IACtB,wEAAqB,CAAA;IACrB,4EAAuB,CAAA;IAEvB,8DAAgB,CAAA;IAChB,4EAAuB,CAAA;IACvB,kEAAkB,CAAA;IAClB,sEAAoB,CAAA;IACpB,sEAAoB,CAAA;IACpB,sEAAoB,CAAA;IAEpB,wDAAwD;IACxD,sEAAoB,CAAA;IACpB,sEAAoB,CAAA;IACpB,4DAAe,CAAA;IAEf,4DAAe,CAAA;IACf,sEAAoB,CAAA;AACrB,CAAC,EAtBW,aAAa,KAAb,aAAa,QAsBxB"}
@@ -0,0 +1,46 @@
1
+ import { type GraphQLAuth } from "./graphql.js";
2
+ export interface HeaderKV {
3
+ name: string;
4
+ value: string;
5
+ }
6
+ export interface PresignedUpload {
7
+ /** COS object key — pass this back to the service (e.g. as `reference_key` / `audio_key`). */
8
+ key: string;
9
+ /** Presigned URL to PUT the bytes to. */
10
+ upload_url: string;
11
+ /** HTTP method to use for the upload (always `PUT` today). */
12
+ method: string;
13
+ /** Headers the upload request must include (notably `Content-Type`). */
14
+ headers: HeaderKV[];
15
+ /** Seconds until the presigned URL expires. */
16
+ expires_in: number;
17
+ bucket?: string | null;
18
+ region?: string | null;
19
+ /** CDN base URL for the bucket, when configured. */
20
+ url?: string | null;
21
+ }
22
+ /** Ask the service for a presigned PUT for an audio file. */
23
+ export declare function requestAudioUpload(args: GraphQLAuth & {
24
+ graphqlUrl: string;
25
+ filename: string;
26
+ contentType: string;
27
+ size: number;
28
+ signal?: AbortSignal;
29
+ }): Promise<PresignedUpload>;
30
+ /** PUT raw bytes to a presigned upload target. */
31
+ export declare function putToPresigned(presigned: PresignedUpload, body: Blob | ArrayBuffer | ArrayBufferView, signal?: AbortSignal): Promise<void>;
32
+ /**
33
+ * Upload an audio `Blob`/`File` end-to-end (presign + PUT) and resolve the COS
34
+ * `key`. Filename and content type are taken from the `File` when available;
35
+ * override via `opts` when uploading a bare `Blob`.
36
+ */
37
+ export declare function uploadAudio(args: GraphQLAuth & {
38
+ graphqlUrl: string;
39
+ file: Blob;
40
+ filename?: string;
41
+ contentType?: string;
42
+ signal?: AbortSignal;
43
+ }): Promise<{
44
+ key: string;
45
+ }>;
46
+ //# sourceMappingURL=upload.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"upload.d.ts","sourceRoot":"","sources":["../src/upload.ts"],"names":[],"mappings":"AAMA,OAAO,EAAkB,KAAK,WAAW,EAAE,MAAM,cAAc,CAAC;AAEhE,MAAM,WAAW,QAAQ;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,eAAe;IAC/B,8FAA8F;IAC9F,GAAG,EAAE,MAAM,CAAC;IACZ,yCAAyC;IACzC,UAAU,EAAE,MAAM,CAAC;IACnB,8DAA8D;IAC9D,MAAM,EAAE,MAAM,CAAC;IACf,wEAAwE;IACxE,OAAO,EAAE,QAAQ,EAAE,CAAC;IACpB,+CAA+C;IAC/C,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,oDAAoD;IACpD,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACpB;AAoBD,6DAA6D;AAC7D,wBAAsB,kBAAkB,CACvC,IAAI,EAAE,WAAW,GAAG;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,WAAW,CAAC;CACrB,GACC,OAAO,CAAC,eAAe,CAAC,CAgB1B;AAED,kDAAkD;AAClD,wBAAsB,cAAc,CACnC,SAAS,EAAE,eAAe,EAC1B,IAAI,EAAE,IAAI,GAAG,WAAW,GAAG,eAAe,EAC1C,MAAM,CAAC,EAAE,WAAW,GAClB,OAAO,CAAC,IAAI,CAAC,CAgBf;AAED;;;;GAIG;AACH,wBAAsB,WAAW,CAChC,IAAI,EAAE,WAAW,GAAG;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,IAAI,CAAC;IACX,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,WAAW,CAAC;CACrB,GACC,OAAO,CAAC;IAAE,GAAG,EAAE,MAAM,CAAA;CAAE,CAAC,CAoB1B"}
package/dist/upload.js ADDED
@@ -0,0 +1,82 @@
1
+ // Audio upload helpers shared by TTS (reference voice) and file inference
2
+ // (source audio). Two steps mirror Convbased-Web: ask the GraphQL service for
3
+ // a presigned PUT (`requestAudioUpload`), then PUT the bytes straight to object
4
+ // storage. The returned COS `key` is what you hand to `submitTts` /
5
+ // `startTask`.
6
+ import { graphqlRequest } from "./graphql.js";
7
+ const REQUEST_AUDIO_UPLOAD = /* GraphQL */ `
8
+ mutation RequestAudioUpload($input: RequestUploadInput!) {
9
+ requestAudioUpload(input: $input) {
10
+ key
11
+ upload_url
12
+ method
13
+ expires_in
14
+ headers {
15
+ name
16
+ value
17
+ }
18
+ bucket
19
+ region
20
+ url
21
+ }
22
+ }
23
+ `;
24
+ /** Ask the service for a presigned PUT for an audio file. */
25
+ export async function requestAudioUpload(args) {
26
+ const data = await graphqlRequest({
27
+ graphqlUrl: args.graphqlUrl,
28
+ apiKey: args.apiKey,
29
+ accessToken: args.accessToken,
30
+ signal: args.signal,
31
+ query: REQUEST_AUDIO_UPLOAD,
32
+ variables: {
33
+ input: {
34
+ filename: args.filename,
35
+ content_type: args.contentType,
36
+ size: args.size,
37
+ },
38
+ },
39
+ });
40
+ return data.requestAudioUpload;
41
+ }
42
+ /** PUT raw bytes to a presigned upload target. */
43
+ export async function putToPresigned(presigned, body, signal) {
44
+ const headers = {};
45
+ for (const h of presigned.headers ?? []) {
46
+ if (h?.name)
47
+ headers[h.name] = h.value;
48
+ }
49
+ const res = await fetch(presigned.upload_url, {
50
+ method: presigned.method || "PUT",
51
+ headers,
52
+ body: body,
53
+ signal,
54
+ });
55
+ if (!res.ok) {
56
+ throw new Error(`Audio upload failed: HTTP ${res.status} ${res.statusText}`);
57
+ }
58
+ }
59
+ /**
60
+ * Upload an audio `Blob`/`File` end-to-end (presign + PUT) and resolve the COS
61
+ * `key`. Filename and content type are taken from the `File` when available;
62
+ * override via `opts` when uploading a bare `Blob`.
63
+ */
64
+ export async function uploadAudio(args) {
65
+ const maybeFile = args.file;
66
+ const filename = args.filename ?? maybeFile.name ?? "audio.wav";
67
+ const contentType = args.contentType ||
68
+ args.file.type ||
69
+ "application/octet-stream";
70
+ const presigned = await requestAudioUpload({
71
+ graphqlUrl: args.graphqlUrl,
72
+ apiKey: args.apiKey,
73
+ accessToken: args.accessToken,
74
+ signal: args.signal,
75
+ filename,
76
+ contentType,
77
+ size: args.file.size,
78
+ });
79
+ await putToPresigned(presigned, args.file, args.signal);
80
+ return { key: presigned.key };
81
+ }
82
+ //# 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;AAEf,OAAO,EAAE,cAAc,EAAoB,MAAM,cAAc,CAAC;AAwBhE,MAAM,oBAAoB,GAAG,aAAa,CAAC;;;;;;;;;;;;;;;;CAgB1C,CAAC;AAEF,6DAA6D;AAC7D,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACvC,IAMC;IAED,MAAM,IAAI,GAAG,MAAM,cAAc,CAA0C;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;AAClD,MAAM,CAAC,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;AACH,MAAM,CAAC,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"}
package/package.json ADDED
@@ -0,0 +1,57 @@
1
+ {
2
+ "name": "@convbased/sdk",
3
+ "version": "0.1.0",
4
+ "description": "Convbased real-time voice conversion SDK — connect to the signaling service with an API key and stream audio through WebRTC.",
5
+ "type": "module",
6
+ "main": "./dist/cjs/index.js",
7
+ "module": "./dist/index.js",
8
+ "types": "./dist/index.d.ts",
9
+ "exports": {
10
+ ".": {
11
+ "types": "./dist/index.d.ts",
12
+ "import": "./dist/index.js",
13
+ "require": "./dist/cjs/index.js"
14
+ }
15
+ },
16
+ "files": [
17
+ "dist",
18
+ "src",
19
+ "README.md",
20
+ "LICENSE"
21
+ ],
22
+ "publishConfig": {
23
+ "access": "public"
24
+ },
25
+ "scripts": {
26
+ "build": "tsc -p tsconfig.json && tsc -p tsconfig.cjs.json && node scripts/emit-cjs-pkg.mjs && node scripts/bundle.mjs",
27
+ "build:bundle": "node scripts/bundle.mjs",
28
+ "typecheck": "tsc --noEmit",
29
+ "clean": "node -e \"require('fs').rmSync('dist',{recursive:true,force:true})\"",
30
+ "prepublishOnly": "npm run clean && npm run build",
31
+ "demo": "npm run build && node scripts/serve-demo.mjs",
32
+ "serve": "node scripts/serve-demo.mjs"
33
+ },
34
+ "keywords": [
35
+ "convbased",
36
+ "webrtc",
37
+ "voice-conversion",
38
+ "realtime",
39
+ "audio",
40
+ "sdk"
41
+ ],
42
+ "author": "Convbased",
43
+ "license": "MIT",
44
+ "repository": {
45
+ "type": "git",
46
+ "url": "git+https://github.com/Convbased/convbased-sdk.git",
47
+ "directory": "packages/sdk-js"
48
+ },
49
+ "homepage": "https://github.com/Convbased/convbased-sdk/tree/main/packages/sdk-js#readme",
50
+ "bugs": "https://github.com/Convbased/convbased-sdk/issues",
51
+ "devDependencies": {
52
+ "typescript": "^5.9.3"
53
+ },
54
+ "engines": {
55
+ "node": ">=18"
56
+ }
57
+ }