@dimer47/gladia-sdk 1.0.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/dist/index.js ADDED
@@ -0,0 +1,533 @@
1
+ // src/errors.ts
2
+ var GladiaError = class extends Error {
3
+ constructor(message) {
4
+ super(message);
5
+ this.name = "GladiaError";
6
+ }
7
+ };
8
+ var GladiaApiError = class extends GladiaError {
9
+ status;
10
+ body;
11
+ constructor(status, body) {
12
+ super(body.message ?? `API error ${status}`);
13
+ this.name = "GladiaApiError";
14
+ this.status = status;
15
+ this.body = body;
16
+ }
17
+ };
18
+ var BadRequestError = class extends GladiaApiError {
19
+ validationErrors;
20
+ constructor(body) {
21
+ super(400, body);
22
+ this.name = "BadRequestError";
23
+ this.validationErrors = body.validation_errors ?? [];
24
+ }
25
+ };
26
+ var UnauthorizedError = class extends GladiaApiError {
27
+ constructor(body) {
28
+ super(401, body);
29
+ this.name = "UnauthorizedError";
30
+ }
31
+ };
32
+ var ForbiddenError = class extends GladiaApiError {
33
+ constructor(body) {
34
+ super(403, body);
35
+ this.name = "ForbiddenError";
36
+ }
37
+ };
38
+ var NotFoundError = class extends GladiaApiError {
39
+ constructor(body) {
40
+ super(404, body);
41
+ this.name = "NotFoundError";
42
+ }
43
+ };
44
+ var UnprocessableEntityError = class extends GladiaApiError {
45
+ constructor(body) {
46
+ super(422, body);
47
+ this.name = "UnprocessableEntityError";
48
+ }
49
+ };
50
+ var GladiaTimeoutError = class extends GladiaError {
51
+ constructor(message = "Polling timed out") {
52
+ super(message);
53
+ this.name = "GladiaTimeoutError";
54
+ }
55
+ };
56
+ var GladiaWebSocketError = class extends GladiaError {
57
+ code;
58
+ reason;
59
+ constructor(message, code, reason) {
60
+ super(message);
61
+ this.name = "GladiaWebSocketError";
62
+ this.code = code;
63
+ this.reason = reason;
64
+ }
65
+ };
66
+
67
+ // src/http.ts
68
+ var HttpClient = class {
69
+ apiKey;
70
+ baseUrl;
71
+ constructor(config) {
72
+ this.apiKey = config.apiKey;
73
+ this.baseUrl = config.baseUrl.replace(/\/+$/, "");
74
+ }
75
+ async get(path, query, signal) {
76
+ const url = this.buildUrl(path, query);
77
+ return this.request(url, { method: "GET", signal });
78
+ }
79
+ async post(path, body, signal) {
80
+ const url = this.buildUrl(path);
81
+ return this.request(url, {
82
+ method: "POST",
83
+ headers: { "Content-Type": "application/json" },
84
+ body: body != null ? JSON.stringify(body) : void 0,
85
+ signal
86
+ });
87
+ }
88
+ async postForm(path, formData, signal) {
89
+ const url = this.buildUrl(path);
90
+ return this.request(url, {
91
+ method: "POST",
92
+ body: formData,
93
+ signal
94
+ });
95
+ }
96
+ async delete(path, signal) {
97
+ const url = this.buildUrl(path);
98
+ const res = await fetch(url, {
99
+ method: "DELETE",
100
+ headers: this.headers(),
101
+ signal
102
+ });
103
+ if (!res.ok) {
104
+ await this.throwApiError(res);
105
+ }
106
+ }
107
+ async getBlob(path, signal) {
108
+ const url = this.buildUrl(path);
109
+ const res = await fetch(url, {
110
+ method: "GET",
111
+ headers: this.headers(),
112
+ signal
113
+ });
114
+ if (!res.ok) {
115
+ await this.throwApiError(res);
116
+ }
117
+ return res.blob();
118
+ }
119
+ buildUrl(path, query) {
120
+ const url = new URL(`${this.baseUrl}${path}`);
121
+ if (query) {
122
+ for (const [key, value] of Object.entries(query)) {
123
+ if (value == null) continue;
124
+ if (Array.isArray(value)) {
125
+ for (const v of value) {
126
+ url.searchParams.append(key, String(v));
127
+ }
128
+ } else if (typeof value === "object") {
129
+ url.searchParams.set(key, JSON.stringify(value));
130
+ } else {
131
+ url.searchParams.set(key, String(value));
132
+ }
133
+ }
134
+ }
135
+ return url.toString();
136
+ }
137
+ headers() {
138
+ return { "x-gladia-key": this.apiKey };
139
+ }
140
+ async request(url, init) {
141
+ const headers = {
142
+ ...this.headers(),
143
+ ...init.headers
144
+ };
145
+ const res = await fetch(url, { ...init, headers });
146
+ if (!res.ok) {
147
+ await this.throwApiError(res);
148
+ }
149
+ return await res.json();
150
+ }
151
+ async throwApiError(res) {
152
+ let body;
153
+ try {
154
+ body = await res.json();
155
+ } catch {
156
+ body = { message: res.statusText, statusCode: res.status };
157
+ }
158
+ switch (res.status) {
159
+ case 400:
160
+ throw new BadRequestError(body);
161
+ case 401:
162
+ throw new UnauthorizedError(body);
163
+ case 403:
164
+ throw new ForbiddenError(body);
165
+ case 404:
166
+ throw new NotFoundError(body);
167
+ case 422:
168
+ throw new UnprocessableEntityError(body);
169
+ default:
170
+ throw new GladiaApiError(res.status, body);
171
+ }
172
+ }
173
+ };
174
+
175
+ // src/resources/upload.ts
176
+ var UploadResource = class {
177
+ constructor(http) {
178
+ this.http = http;
179
+ }
180
+ /**
181
+ * Upload a file (Blob, File, or Buffer) to Gladia.
182
+ */
183
+ async fromFile(file, filename = "audio", signal) {
184
+ const form = new FormData();
185
+ form.append("audio", file, filename);
186
+ return this.http.postForm("/v2/upload", form, signal);
187
+ }
188
+ /**
189
+ * Upload from a remote URL.
190
+ */
191
+ async fromUrl(audioUrl, signal) {
192
+ return this.http.post("/v2/upload", { audio_url: audioUrl }, signal);
193
+ }
194
+ };
195
+
196
+ // src/utils/polling.ts
197
+ async function poll(options) {
198
+ const {
199
+ fn,
200
+ isDone,
201
+ onPoll,
202
+ interval = 1e3,
203
+ backoffMultiplier = 1.5,
204
+ maxInterval = 1e4,
205
+ timeout,
206
+ signal
207
+ } = options;
208
+ const start = Date.now();
209
+ let currentInterval = interval;
210
+ while (true) {
211
+ if (signal?.aborted) {
212
+ throw new GladiaTimeoutError("Polling aborted");
213
+ }
214
+ const result = await fn();
215
+ onPoll?.(result);
216
+ if (isDone(result)) {
217
+ return result;
218
+ }
219
+ if (timeout && Date.now() - start >= timeout) {
220
+ throw new GladiaTimeoutError(`Polling timed out after ${timeout}ms`);
221
+ }
222
+ await sleep(currentInterval, signal);
223
+ currentInterval = Math.min(currentInterval * backoffMultiplier, maxInterval);
224
+ }
225
+ }
226
+ function sleep(ms, signal) {
227
+ return new Promise((resolve, reject) => {
228
+ if (signal?.aborted) {
229
+ reject(new GladiaTimeoutError("Polling aborted"));
230
+ return;
231
+ }
232
+ const timer = setTimeout(resolve, ms);
233
+ signal?.addEventListener(
234
+ "abort",
235
+ () => {
236
+ clearTimeout(timer);
237
+ reject(new GladiaTimeoutError("Polling aborted"));
238
+ },
239
+ { once: true }
240
+ );
241
+ });
242
+ }
243
+ function isTerminalStatus(status) {
244
+ return status === "done" || status === "error";
245
+ }
246
+
247
+ // src/resources/pre-recorded.ts
248
+ var PreRecordedResource = class {
249
+ constructor(http) {
250
+ this.http = http;
251
+ }
252
+ /**
253
+ * Create a pre-recorded transcription job.
254
+ */
255
+ async create(request, signal) {
256
+ return this.http.post("/v2/pre-recorded", request, signal);
257
+ }
258
+ /**
259
+ * Get a pre-recorded transcription by ID.
260
+ */
261
+ async get(id, signal) {
262
+ return this.http.get(`/v2/pre-recorded/${id}`, void 0, signal);
263
+ }
264
+ /**
265
+ * List pre-recorded transcriptions with pagination.
266
+ */
267
+ async list(params, signal) {
268
+ return this.http.get(
269
+ "/v2/pre-recorded",
270
+ params,
271
+ signal
272
+ );
273
+ }
274
+ /**
275
+ * Delete a pre-recorded transcription.
276
+ */
277
+ async delete(id, signal) {
278
+ return this.http.delete(`/v2/pre-recorded/${id}`, signal);
279
+ }
280
+ /**
281
+ * Download the original audio file for a transcription.
282
+ */
283
+ async getFile(id, signal) {
284
+ return this.http.getBlob(`/v2/pre-recorded/${id}/file`, signal);
285
+ }
286
+ /**
287
+ * High-level helper: create a job and poll until completion.
288
+ */
289
+ async transcribe(options) {
290
+ const { onPoll, pollTimeout, signal, ...request } = options;
291
+ const created = await this.create(request, signal);
292
+ return poll({
293
+ fn: () => this.get(created.id, signal),
294
+ isDone: (res) => isTerminalStatus(res.status),
295
+ onPoll,
296
+ timeout: pollTimeout,
297
+ signal
298
+ });
299
+ }
300
+ };
301
+
302
+ // src/live/session.ts
303
+ var LiveSession = class {
304
+ ws;
305
+ listeners = /* @__PURE__ */ new Map();
306
+ _closed = false;
307
+ _donePromiseResolve;
308
+ _donePromise;
309
+ constructor(url, WebSocketCtor) {
310
+ const WS = WebSocketCtor ?? globalThis.WebSocket;
311
+ this.ws = new WS(url);
312
+ this.ws.binaryType = "arraybuffer";
313
+ this._donePromise = new Promise((resolve) => {
314
+ this._donePromiseResolve = resolve;
315
+ });
316
+ this.ws.addEventListener("message", (event) => {
317
+ this.handleMessage(event);
318
+ });
319
+ this.ws.addEventListener("close", (event) => {
320
+ this._closed = true;
321
+ if (event.code !== 1e3 && event.code !== 1005) {
322
+ this.emit("error", {
323
+ type: "error",
324
+ code: event.code,
325
+ message: event.reason || `WebSocket closed with code ${event.code}`
326
+ });
327
+ }
328
+ this._donePromiseResolve?.();
329
+ });
330
+ this.ws.addEventListener("error", () => {
331
+ this.emit("error", {
332
+ type: "error",
333
+ message: "WebSocket connection error"
334
+ });
335
+ });
336
+ }
337
+ /**
338
+ * Register a typed event listener.
339
+ */
340
+ on(event, listener) {
341
+ if (!this.listeners.has(event)) {
342
+ this.listeners.set(event, /* @__PURE__ */ new Set());
343
+ }
344
+ this.listeners.get(event).add(listener);
345
+ return this;
346
+ }
347
+ /**
348
+ * Remove a typed event listener.
349
+ */
350
+ off(event, listener) {
351
+ this.listeners.get(event)?.delete(listener);
352
+ return this;
353
+ }
354
+ /**
355
+ * Send raw audio data (ArrayBuffer, Uint8Array, or Blob).
356
+ */
357
+ sendAudio(data) {
358
+ if (this._closed) {
359
+ throw new GladiaWebSocketError("Cannot send audio: session is closed");
360
+ }
361
+ this.ws.send(data);
362
+ }
363
+ /**
364
+ * Signal end of audio and wait for the server to finish processing.
365
+ * Returns a promise that resolves when the "done" message is received or the socket closes.
366
+ */
367
+ async stop() {
368
+ if (this._closed) return;
369
+ this.ws.send(JSON.stringify({ type: "stop" }));
370
+ await this._donePromise;
371
+ }
372
+ /**
373
+ * Returns true if the WebSocket is closed.
374
+ */
375
+ get closed() {
376
+ return this._closed;
377
+ }
378
+ handleMessage(event) {
379
+ if (typeof event.data !== "string") return;
380
+ let msg;
381
+ try {
382
+ msg = JSON.parse(event.data);
383
+ } catch {
384
+ return;
385
+ }
386
+ this.emit("message", msg);
387
+ if (msg.type === "transcript") {
388
+ const transcript = msg;
389
+ if (transcript.transcription?.type === "partial") {
390
+ this.emit("transcript:partial", transcript);
391
+ } else if (transcript.transcription?.type === "final") {
392
+ this.emit("transcript:final", transcript);
393
+ }
394
+ return;
395
+ }
396
+ if (msg.type === "done") {
397
+ this.emit("done", msg);
398
+ this._donePromiseResolve?.();
399
+ return;
400
+ }
401
+ this.emit(msg.type, msg);
402
+ }
403
+ emit(event, data) {
404
+ const set = this.listeners.get(event);
405
+ if (!set) return;
406
+ for (const listener of set) {
407
+ listener(data);
408
+ }
409
+ }
410
+ };
411
+
412
+ // src/resources/live.ts
413
+ var LiveResource = class {
414
+ constructor(http, WebSocketCtor) {
415
+ this.http = http;
416
+ this.WebSocketCtor = WebSocketCtor;
417
+ }
418
+ WebSocketCtor;
419
+ /**
420
+ * Initialize a live transcription session (returns metadata + WebSocket URL).
421
+ */
422
+ async init(request, options) {
423
+ const query = {};
424
+ if (options?.region) {
425
+ query["region"] = options.region;
426
+ }
427
+ return this.http.post(
428
+ `/v2/live${buildQuery(query)}`,
429
+ request ?? {},
430
+ options?.signal
431
+ );
432
+ }
433
+ /**
434
+ * Get a live session by ID.
435
+ */
436
+ async get(id, signal) {
437
+ return this.http.get(`/v2/live/${id}`, void 0, signal);
438
+ }
439
+ /**
440
+ * List live sessions with pagination.
441
+ */
442
+ async list(params, signal) {
443
+ return this.http.get(
444
+ "/v2/live",
445
+ params,
446
+ signal
447
+ );
448
+ }
449
+ /**
450
+ * Delete a live session.
451
+ */
452
+ async delete(id, signal) {
453
+ return this.http.delete(`/v2/live/${id}`, signal);
454
+ }
455
+ /**
456
+ * Download the audio recording of a live session.
457
+ */
458
+ async getFile(id, signal) {
459
+ return this.http.getBlob(`/v2/live/${id}/file`, signal);
460
+ }
461
+ /**
462
+ * High-level helper: init a session and return a connected LiveSession.
463
+ */
464
+ async stream(options) {
465
+ const { region, WebSocket: wsCtor, signal, ...request } = options ?? {};
466
+ const created = await this.init(request, { region, signal });
467
+ return new Promise((resolve, reject) => {
468
+ const session = new LiveSession(
469
+ created.url,
470
+ wsCtor ?? this.WebSocketCtor
471
+ );
472
+ const onReady = () => {
473
+ session.off("ready", onReady);
474
+ session.off("error", onError);
475
+ resolve(session);
476
+ };
477
+ const onError = (err) => {
478
+ session.off("ready", onReady);
479
+ session.off("error", onError);
480
+ reject(new Error(err.message ?? "WebSocket connection failed"));
481
+ };
482
+ session.on("ready", onReady);
483
+ session.on("error", onError);
484
+ });
485
+ }
486
+ };
487
+ function buildQuery(query) {
488
+ const params = new URLSearchParams();
489
+ for (const [key, value] of Object.entries(query)) {
490
+ if (value != null) params.set(key, String(value));
491
+ }
492
+ const str = params.toString();
493
+ return str ? `?${str}` : "";
494
+ }
495
+
496
+ // src/client.ts
497
+ var DEFAULT_BASE_URL = "https://api.gladia.io";
498
+ var GladiaClient = class {
499
+ upload;
500
+ preRecorded;
501
+ live;
502
+ constructor(config) {
503
+ if (!config.apiKey) {
504
+ throw new Error("apiKey is required");
505
+ }
506
+ const http = new HttpClient({
507
+ apiKey: config.apiKey,
508
+ baseUrl: config.baseUrl ?? DEFAULT_BASE_URL
509
+ });
510
+ this.upload = new UploadResource(http);
511
+ this.preRecorded = new PreRecordedResource(http);
512
+ this.live = new LiveResource(http, config.WebSocket);
513
+ }
514
+ };
515
+ export {
516
+ BadRequestError,
517
+ ForbiddenError,
518
+ GladiaApiError,
519
+ GladiaClient,
520
+ GladiaError,
521
+ GladiaTimeoutError,
522
+ GladiaWebSocketError,
523
+ LiveResource,
524
+ LiveSession,
525
+ NotFoundError,
526
+ PreRecordedResource,
527
+ UnauthorizedError,
528
+ UnprocessableEntityError,
529
+ UploadResource,
530
+ isTerminalStatus,
531
+ poll
532
+ };
533
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/errors.ts","../src/http.ts","../src/resources/upload.ts","../src/utils/polling.ts","../src/resources/pre-recorded.ts","../src/live/session.ts","../src/resources/live.ts","../src/client.ts"],"sourcesContent":["export class GladiaError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'GladiaError';\n }\n}\n\nexport interface ApiErrorBody {\n timestamp?: string;\n path?: string;\n request_id?: string;\n statusCode?: number;\n message?: string;\n validation_errors?: string[];\n}\n\nexport class GladiaApiError extends GladiaError {\n readonly status: number;\n readonly body: ApiErrorBody;\n\n constructor(status: number, body: ApiErrorBody) {\n super(body.message ?? `API error ${status}`);\n this.name = 'GladiaApiError';\n this.status = status;\n this.body = body;\n }\n}\n\nexport class BadRequestError extends GladiaApiError {\n readonly validationErrors: string[];\n\n constructor(body: ApiErrorBody) {\n super(400, body);\n this.name = 'BadRequestError';\n this.validationErrors = body.validation_errors ?? [];\n }\n}\n\nexport class UnauthorizedError extends GladiaApiError {\n constructor(body: ApiErrorBody) {\n super(401, body);\n this.name = 'UnauthorizedError';\n }\n}\n\nexport class ForbiddenError extends GladiaApiError {\n constructor(body: ApiErrorBody) {\n super(403, body);\n this.name = 'ForbiddenError';\n }\n}\n\nexport class NotFoundError extends GladiaApiError {\n constructor(body: ApiErrorBody) {\n super(404, body);\n this.name = 'NotFoundError';\n }\n}\n\nexport class UnprocessableEntityError extends GladiaApiError {\n constructor(body: ApiErrorBody) {\n super(422, body);\n this.name = 'UnprocessableEntityError';\n }\n}\n\nexport class GladiaTimeoutError extends GladiaError {\n constructor(message = 'Polling timed out') {\n super(message);\n this.name = 'GladiaTimeoutError';\n }\n}\n\nexport class GladiaWebSocketError extends GladiaError {\n readonly code?: number;\n readonly reason?: string;\n\n constructor(message: string, code?: number, reason?: string) {\n super(message);\n this.name = 'GladiaWebSocketError';\n this.code = code;\n this.reason = reason;\n }\n}\n","import {\n GladiaApiError,\n BadRequestError,\n UnauthorizedError,\n ForbiddenError,\n NotFoundError,\n UnprocessableEntityError,\n type ApiErrorBody,\n} from './errors.js';\n\nexport interface HttpClientConfig {\n apiKey: string;\n baseUrl: string;\n}\n\nexport class HttpClient {\n private readonly apiKey: string;\n private readonly baseUrl: string;\n\n constructor(config: HttpClientConfig) {\n this.apiKey = config.apiKey;\n this.baseUrl = config.baseUrl.replace(/\\/+$/, '');\n }\n\n async get<T>(path: string, query?: Record<string, unknown>, signal?: AbortSignal): Promise<T> {\n const url = this.buildUrl(path, query);\n return this.request<T>(url, { method: 'GET', signal });\n }\n\n async post<T>(path: string, body?: unknown, signal?: AbortSignal): Promise<T> {\n const url = this.buildUrl(path);\n return this.request<T>(url, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: body != null ? JSON.stringify(body) : undefined,\n signal,\n });\n }\n\n async postForm<T>(path: string, formData: FormData, signal?: AbortSignal): Promise<T> {\n const url = this.buildUrl(path);\n return this.request<T>(url, {\n method: 'POST',\n body: formData,\n signal,\n });\n }\n\n async delete(path: string, signal?: AbortSignal): Promise<void> {\n const url = this.buildUrl(path);\n const res = await fetch(url, {\n method: 'DELETE',\n headers: this.headers(),\n signal,\n });\n if (!res.ok) {\n await this.throwApiError(res);\n }\n }\n\n async getBlob(path: string, signal?: AbortSignal): Promise<Blob> {\n const url = this.buildUrl(path);\n const res = await fetch(url, {\n method: 'GET',\n headers: this.headers(),\n signal,\n });\n if (!res.ok) {\n await this.throwApiError(res);\n }\n return res.blob();\n }\n\n private buildUrl(path: string, query?: Record<string, unknown>): string {\n const url = new URL(`${this.baseUrl}${path}`);\n if (query) {\n for (const [key, value] of Object.entries(query)) {\n if (value == null) continue;\n if (Array.isArray(value)) {\n for (const v of value) {\n url.searchParams.append(key, String(v));\n }\n } else if (typeof value === 'object') {\n url.searchParams.set(key, JSON.stringify(value));\n } else {\n url.searchParams.set(key, String(value));\n }\n }\n }\n return url.toString();\n }\n\n private headers(): Record<string, string> {\n return { 'x-gladia-key': this.apiKey };\n }\n\n private async request<T>(url: string, init: RequestInit): Promise<T> {\n const headers: Record<string, string> = {\n ...this.headers(),\n ...(init.headers as Record<string, string> | undefined),\n };\n\n const res = await fetch(url, { ...init, headers });\n if (!res.ok) {\n await this.throwApiError(res);\n }\n return (await res.json()) as T;\n }\n\n private async throwApiError(res: Response): Promise<never> {\n let body: ApiErrorBody;\n try {\n body = (await res.json()) as ApiErrorBody;\n } catch {\n body = { message: res.statusText, statusCode: res.status };\n }\n\n switch (res.status) {\n case 400:\n throw new BadRequestError(body);\n case 401:\n throw new UnauthorizedError(body);\n case 403:\n throw new ForbiddenError(body);\n case 404:\n throw new NotFoundError(body);\n case 422:\n throw new UnprocessableEntityError(body);\n default:\n throw new GladiaApiError(res.status, body);\n }\n }\n}\n","import type { HttpClient } from '../http.js';\nimport type { UploadResponse } from '../types/upload.js';\n\nexport class UploadResource {\n constructor(private readonly http: HttpClient) {}\n\n /**\n * Upload a file (Blob, File, or Buffer) to Gladia.\n */\n async fromFile(\n file: Blob,\n filename = 'audio',\n signal?: AbortSignal,\n ): Promise<UploadResponse> {\n const form = new FormData();\n form.append('audio', file, filename);\n return this.http.postForm<UploadResponse>('/v2/upload', form, signal);\n }\n\n /**\n * Upload from a remote URL.\n */\n async fromUrl(audioUrl: string, signal?: AbortSignal): Promise<UploadResponse> {\n return this.http.post<UploadResponse>('/v2/upload', { audio_url: audioUrl }, signal);\n }\n}\n","import { GladiaTimeoutError } from '../errors.js';\nimport type { JobStatus } from '../types/common.js';\n\nexport interface PollOptions<T> {\n fn: () => Promise<T>;\n isDone: (result: T) => boolean;\n onPoll?: (result: T) => void;\n /** Initial interval in ms (default: 1000) */\n interval?: number;\n /** Multiplier for exponential backoff (default: 1.5) */\n backoffMultiplier?: number;\n /** Maximum interval in ms (default: 10000) */\n maxInterval?: number;\n /** Maximum total time in ms (default: none) */\n timeout?: number;\n signal?: AbortSignal;\n}\n\nexport async function poll<T>(options: PollOptions<T>): Promise<T> {\n const {\n fn,\n isDone,\n onPoll,\n interval = 1000,\n backoffMultiplier = 1.5,\n maxInterval = 10_000,\n timeout,\n signal,\n } = options;\n\n const start = Date.now();\n let currentInterval = interval;\n\n while (true) {\n if (signal?.aborted) {\n throw new GladiaTimeoutError('Polling aborted');\n }\n\n const result = await fn();\n onPoll?.(result);\n\n if (isDone(result)) {\n return result;\n }\n\n if (timeout && Date.now() - start >= timeout) {\n throw new GladiaTimeoutError(`Polling timed out after ${timeout}ms`);\n }\n\n await sleep(currentInterval, signal);\n currentInterval = Math.min(currentInterval * backoffMultiplier, maxInterval);\n }\n}\n\nfunction sleep(ms: number, signal?: AbortSignal): Promise<void> {\n return new Promise<void>((resolve, reject) => {\n if (signal?.aborted) {\n reject(new GladiaTimeoutError('Polling aborted'));\n return;\n }\n\n const timer = setTimeout(resolve, ms);\n\n signal?.addEventListener(\n 'abort',\n () => {\n clearTimeout(timer);\n reject(new GladiaTimeoutError('Polling aborted'));\n },\n { once: true },\n );\n });\n}\n\nexport function isTerminalStatus(status: JobStatus): boolean {\n return status === 'done' || status === 'error';\n}\n","import type { HttpClient } from '../http.js';\nimport type { PaginationParams, PaginatedResponse } from '../types/common.js';\nimport type {\n PreRecordedRequest,\n PreRecordedCreatedResponse,\n PreRecordedResponse,\n} from '../types/pre-recorded.js';\nimport { poll, isTerminalStatus } from '../utils/polling.js';\n\nexport interface TranscribeOptions extends PreRecordedRequest {\n /** Called on each poll with the current response */\n onPoll?: (response: PreRecordedResponse) => void;\n /** Maximum polling time in ms */\n pollTimeout?: number;\n signal?: AbortSignal;\n}\n\nexport class PreRecordedResource {\n constructor(private readonly http: HttpClient) {}\n\n /**\n * Create a pre-recorded transcription job.\n */\n async create(\n request: PreRecordedRequest,\n signal?: AbortSignal,\n ): Promise<PreRecordedCreatedResponse> {\n return this.http.post<PreRecordedCreatedResponse>('/v2/pre-recorded', request, signal);\n }\n\n /**\n * Get a pre-recorded transcription by ID.\n */\n async get(id: string, signal?: AbortSignal): Promise<PreRecordedResponse> {\n return this.http.get<PreRecordedResponse>(`/v2/pre-recorded/${id}`, undefined, signal);\n }\n\n /**\n * List pre-recorded transcriptions with pagination.\n */\n async list(\n params?: PaginationParams,\n signal?: AbortSignal,\n ): Promise<PaginatedResponse<PreRecordedResponse>> {\n return this.http.get<PaginatedResponse<PreRecordedResponse>>(\n '/v2/pre-recorded',\n params as Record<string, unknown>,\n signal,\n );\n }\n\n /**\n * Delete a pre-recorded transcription.\n */\n async delete(id: string, signal?: AbortSignal): Promise<void> {\n return this.http.delete(`/v2/pre-recorded/${id}`, signal);\n }\n\n /**\n * Download the original audio file for a transcription.\n */\n async getFile(id: string, signal?: AbortSignal): Promise<Blob> {\n return this.http.getBlob(`/v2/pre-recorded/${id}/file`, signal);\n }\n\n /**\n * High-level helper: create a job and poll until completion.\n */\n async transcribe(options: TranscribeOptions): Promise<PreRecordedResponse> {\n const { onPoll, pollTimeout, signal, ...request } = options;\n\n const created = await this.create(request, signal);\n\n return poll<PreRecordedResponse>({\n fn: () => this.get(created.id, signal),\n isDone: (res) => isTerminalStatus(res.status),\n onPoll,\n timeout: pollTimeout,\n signal,\n });\n }\n}\n","import { GladiaWebSocketError } from '../errors.js';\nimport type { LiveEventMap, LiveEventName, LiveBaseMessage, LiveTranscriptMessage } from './events.js';\n\ntype Listener<T> = (data: T) => void;\n\nexport class LiveSession {\n private ws: WebSocket;\n private listeners = new Map<string, Set<Listener<unknown>>>();\n private _closed = false;\n private _donePromiseResolve?: () => void;\n private _donePromise: Promise<void>;\n\n constructor(url: string, WebSocketCtor?: unknown) {\n const WS = (WebSocketCtor ?? globalThis.WebSocket) as typeof WebSocket;\n this.ws = new WS(url);\n this.ws.binaryType = 'arraybuffer';\n\n this._donePromise = new Promise<void>((resolve) => {\n this._donePromiseResolve = resolve;\n });\n\n this.ws.addEventListener('message', (event: MessageEvent) => {\n this.handleMessage(event);\n });\n\n this.ws.addEventListener('close', (event: CloseEvent) => {\n this._closed = true;\n if (event.code !== 1000 && event.code !== 1005) {\n this.emit('error', {\n type: 'error',\n code: event.code,\n message: event.reason || `WebSocket closed with code ${event.code}`,\n });\n }\n this._donePromiseResolve?.();\n });\n\n this.ws.addEventListener('error', () => {\n this.emit('error', {\n type: 'error',\n message: 'WebSocket connection error',\n });\n });\n }\n\n /**\n * Register a typed event listener.\n */\n on<K extends LiveEventName>(event: K, listener: Listener<LiveEventMap[K]>): this {\n if (!this.listeners.has(event)) {\n this.listeners.set(event, new Set());\n }\n this.listeners.get(event)!.add(listener as Listener<unknown>);\n return this;\n }\n\n /**\n * Remove a typed event listener.\n */\n off<K extends LiveEventName>(event: K, listener: Listener<LiveEventMap[K]>): this {\n this.listeners.get(event)?.delete(listener as Listener<unknown>);\n return this;\n }\n\n /**\n * Send raw audio data (ArrayBuffer, Uint8Array, or Blob).\n */\n sendAudio(data: ArrayBuffer | Uint8Array | Blob): void {\n if (this._closed) {\n throw new GladiaWebSocketError('Cannot send audio: session is closed');\n }\n this.ws.send(data);\n }\n\n /**\n * Signal end of audio and wait for the server to finish processing.\n * Returns a promise that resolves when the \"done\" message is received or the socket closes.\n */\n async stop(): Promise<void> {\n if (this._closed) return;\n\n this.ws.send(JSON.stringify({ type: 'stop' }));\n await this._donePromise;\n }\n\n /**\n * Returns true if the WebSocket is closed.\n */\n get closed(): boolean {\n return this._closed;\n }\n\n private handleMessage(event: MessageEvent): void {\n if (typeof event.data !== 'string') return;\n\n let msg: LiveBaseMessage;\n try {\n msg = JSON.parse(event.data) as LiveBaseMessage;\n } catch {\n return;\n }\n\n // Emit the raw message on the generic \"message\" channel\n this.emit('message', msg);\n\n // Route transcript messages to typed channels\n if (msg.type === 'transcript') {\n const transcript = msg as unknown as LiveTranscriptMessage;\n if (transcript.transcription?.type === 'partial') {\n this.emit('transcript:partial', transcript);\n } else if (transcript.transcription?.type === 'final') {\n this.emit('transcript:final', transcript);\n }\n return;\n }\n\n // Route \"done\" to resolve the stop promise\n if (msg.type === 'done') {\n this.emit('done', msg as LiveEventMap['done']);\n this._donePromiseResolve?.();\n return;\n }\n\n // Emit other message types as-is\n this.emit(msg.type as LiveEventName, msg as never);\n }\n\n private emit<K extends LiveEventName>(event: K, data: LiveEventMap[K]): void {\n const set = this.listeners.get(event);\n if (!set) return;\n for (const listener of set) {\n listener(data);\n }\n }\n}\n","import type { HttpClient } from '../http.js';\nimport type { PaginationParams, PaginatedResponse } from '../types/common.js';\nimport type { LiveRequest, LiveCreatedResponse, LiveResponse, LiveRegion } from '../types/live.js';\nimport { LiveSession } from '../live/session.js';\n\nexport interface LiveStreamOptions extends LiveRequest {\n region?: LiveRegion;\n /** Custom WebSocket constructor (for Node < 21, pass `ws`) */\n WebSocket?: unknown;\n signal?: AbortSignal;\n}\n\nexport class LiveResource {\n private readonly WebSocketCtor?: unknown;\n\n constructor(\n private readonly http: HttpClient,\n WebSocketCtor?: unknown,\n ) {\n this.WebSocketCtor = WebSocketCtor;\n }\n\n /**\n * Initialize a live transcription session (returns metadata + WebSocket URL).\n */\n async init(\n request?: LiveRequest,\n options?: { region?: LiveRegion; signal?: AbortSignal },\n ): Promise<LiveCreatedResponse> {\n const query: Record<string, unknown> = {};\n if (options?.region) {\n query['region'] = options.region;\n }\n return this.http.post<LiveCreatedResponse>(\n `/v2/live${buildQuery(query)}`,\n request ?? {},\n options?.signal,\n );\n }\n\n /**\n * Get a live session by ID.\n */\n async get(id: string, signal?: AbortSignal): Promise<LiveResponse> {\n return this.http.get<LiveResponse>(`/v2/live/${id}`, undefined, signal);\n }\n\n /**\n * List live sessions with pagination.\n */\n async list(\n params?: PaginationParams,\n signal?: AbortSignal,\n ): Promise<PaginatedResponse<LiveResponse>> {\n return this.http.get<PaginatedResponse<LiveResponse>>(\n '/v2/live',\n params as Record<string, unknown>,\n signal,\n );\n }\n\n /**\n * Delete a live session.\n */\n async delete(id: string, signal?: AbortSignal): Promise<void> {\n return this.http.delete(`/v2/live/${id}`, signal);\n }\n\n /**\n * Download the audio recording of a live session.\n */\n async getFile(id: string, signal?: AbortSignal): Promise<Blob> {\n return this.http.getBlob(`/v2/live/${id}/file`, signal);\n }\n\n /**\n * High-level helper: init a session and return a connected LiveSession.\n */\n async stream(options?: LiveStreamOptions): Promise<LiveSession> {\n const { region, WebSocket: wsCtor, signal, ...request } = options ?? {};\n\n const created = await this.init(request, { region, signal });\n\n return new Promise<LiveSession>((resolve, reject) => {\n const session = new LiveSession(\n created.url,\n wsCtor ?? this.WebSocketCtor,\n );\n\n const onReady = () => {\n session.off('ready', onReady);\n session.off('error', onError);\n resolve(session);\n };\n\n const onError = (err: { message?: string }) => {\n session.off('ready', onReady);\n session.off('error', onError);\n reject(new Error(err.message ?? 'WebSocket connection failed'));\n };\n\n session.on('ready', onReady);\n session.on('error', onError);\n });\n }\n}\n\nfunction buildQuery(query: Record<string, unknown>): string {\n const params = new URLSearchParams();\n for (const [key, value] of Object.entries(query)) {\n if (value != null) params.set(key, String(value));\n }\n const str = params.toString();\n return str ? `?${str}` : '';\n}\n","import type { GladiaClientConfig } from './types/common.js';\nimport { HttpClient } from './http.js';\nimport { UploadResource } from './resources/upload.js';\nimport { PreRecordedResource } from './resources/pre-recorded.js';\nimport { LiveResource } from './resources/live.js';\n\nconst DEFAULT_BASE_URL = 'https://api.gladia.io';\n\nexport class GladiaClient {\n readonly upload: UploadResource;\n readonly preRecorded: PreRecordedResource;\n readonly live: LiveResource;\n\n constructor(config: GladiaClientConfig) {\n if (!config.apiKey) {\n throw new Error('apiKey is required');\n }\n\n const http = new HttpClient({\n apiKey: config.apiKey,\n baseUrl: config.baseUrl ?? DEFAULT_BASE_URL,\n });\n\n this.upload = new UploadResource(http);\n this.preRecorded = new PreRecordedResource(http);\n this.live = new LiveResource(http, config.WebSocket);\n }\n}\n"],"mappings":"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","names":[]}
package/package.json ADDED
@@ -0,0 +1,58 @@
1
+ {
2
+ "name": "@dimer47/gladia-sdk",
3
+ "version": "1.0.0",
4
+ "description": "Handcrafted TypeScript SDK for the Gladia API — pre-recorded transcription & real-time live streaming via WebSocket",
5
+ "type": "module",
6
+ "publishConfig": {
7
+ "access": "public"
8
+ },
9
+ "repository": {
10
+ "type": "git",
11
+ "url": "https://github.com/dimer47/gladia-sdk"
12
+ },
13
+ "keywords": [
14
+ "gladia",
15
+ "transcription",
16
+ "speech-to-text",
17
+ "websocket",
18
+ "live-streaming",
19
+ "diarization",
20
+ "translation",
21
+ "typescript",
22
+ "sdk"
23
+ ],
24
+ "author": "dimer47",
25
+ "main": "./dist/index.cjs",
26
+ "module": "./dist/index.js",
27
+ "types": "./dist/index.d.ts",
28
+ "exports": {
29
+ ".": {
30
+ "import": {
31
+ "types": "./dist/index.d.ts",
32
+ "default": "./dist/index.js"
33
+ },
34
+ "require": {
35
+ "types": "./dist/index.d.cts",
36
+ "default": "./dist/index.cjs"
37
+ }
38
+ }
39
+ },
40
+ "files": [
41
+ "dist"
42
+ ],
43
+ "scripts": {
44
+ "build": "tsup",
45
+ "typecheck": "tsc --noEmit",
46
+ "test": "vitest run",
47
+ "test:watch": "vitest"
48
+ },
49
+ "devDependencies": {
50
+ "typescript": "^5.7.0",
51
+ "tsup": "^8.4.0",
52
+ "vitest": "^3.0.0"
53
+ },
54
+ "engines": {
55
+ "node": ">=18"
56
+ },
57
+ "license": "MIT"
58
+ }