@speechweave/node 1.0.0 → 1.0.3

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/README.md CHANGED
@@ -3,7 +3,7 @@
3
3
  [![npm version](https://img.shields.io/npm/v/@speechweave/node.svg)](https://www.npmjs.com/package/@speechweave/node)
4
4
  [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
5
5
 
6
- Official Node.js client for the SpeechWeave `/v1` API. Node.js 18+.
6
+ The native Node.js SDK for SpeechWeave background job polling, presigned uploads, and webhook verification. Node.js 18+.
7
7
 
8
8
  **Docs:** [speechweave.com/docs](https://speechweave.com/docs) · [API reference](https://speechweave.com/docs/api)
9
9
 
@@ -19,31 +19,6 @@ Set your API key:
19
19
  export SPEECHWEAVE_API_KEY="sk_..."
20
20
  ```
21
21
 
22
- ## Migrating from OpenAI
23
-
24
- You don't need this SDK for a quick swap — use the official `openai` package and point it at SpeechWeave:
25
-
26
- ```ts
27
- import fs from "node:fs";
28
- import OpenAI from "openai";
29
-
30
- const client = new OpenAI({
31
- apiKey: process.env.SPEECHWEAVE_API_KEY!,
32
- baseURL: "https://api.speechweave.com/v1",
33
- });
34
-
35
- const result = await client.audio.transcriptions.create({
36
- file: fs.createReadStream("clip.mp3"),
37
- model: "core",
38
- });
39
-
40
- console.log(result.text);
41
- ```
42
-
43
- OpenAI model names like `whisper-1` are aliased to `core` on our backend. See the [OpenAI migration guide](https://speechweave.com/docs/migration/openai).
44
-
45
- **When to use @speechweave/node:** native jobs API, presigned uploads for large files, `waitForJob`, and webhook verification.
46
-
47
22
  ## Quick start
48
23
 
49
24
  ```ts
@@ -63,27 +38,19 @@ console.log(result.transcript);
63
38
 
64
39
  For `jobs.create`, URL input, cancel, and other job operations, see the [API reference](https://speechweave.com/docs/api).
65
40
 
66
- ## Provider-shaped helpers (optional)
67
-
68
- Convenience helpers if you want OpenAI/Deepgram/AssemblyAI response shapes without adding another package. They use presigned uploads like the native API.
41
+ ## Webhooks
69
42
 
70
43
  ```ts
71
- const { text } = await client.audio.transcriptions.create({
72
- file: buffer,
73
- filename: "clip.mp3",
74
- model: "core",
75
- });
76
- ```
77
-
78
- Pass `wait: false` to return the created job without polling.
79
-
80
- More examples: [OpenAI](https://speechweave.com/docs/migration/openai) · [Deepgram](https://speechweave.com/docs/migration/deepgram) · [AssemblyAI](https://speechweave.com/docs/migration/assemblyai)
44
+ import { verifyWebhook } from "@speechweave/node";
81
45
 
82
- ## Configuration
46
+ const result = verifyWebhook(
47
+ WEBHOOK_SECRET,
48
+ rawBody,
49
+ signatureHeader,
50
+ );
51
+ ```
83
52
 
84
- - `api_key` or set `SPEECHWEAVE_API_KEY`
85
- - `base_url` — defaults to `https://api.speechweave.com/v1`
86
- - `fetch_func` — optional custom `fetch` implementation
53
+ Configure webhooks in the dashboard. Payloads are signed with `SpeechWeave-Signature`.
87
54
 
88
55
  ## Errors
89
56
 
@@ -101,16 +68,51 @@ try {
101
68
  }
102
69
  ```
103
70
 
104
- ## Webhooks
71
+ ## Configuration
72
+
73
+ - `api_key` — or set `SPEECHWEAVE_API_KEY`
74
+ - `base_url` — defaults to `https://api.speechweave.com/v1`
75
+ - `fetch_func` — optional custom `fetch` implementation
76
+
77
+ ## Compatibility & Migration
78
+
79
+ If you are building a new application, use the native SDK above for full feature support. If you have an existing OpenAI, Deepgram, or AssemblyAI codebase, use the options below to switch with minimal changes.
80
+
81
+ ### Drop-in usage
82
+
83
+ Convenience helpers if you want OpenAI/Deepgram/AssemblyAI response shapes without adding another package. They use presigned uploads like the native API.
105
84
 
106
85
  ```ts
107
- import { verifyWebhook } from "@speechweave/node";
86
+ const { text } = await client.audio.transcriptions.create({
87
+ file: buffer,
88
+ filename: "clip.mp3",
89
+ model: "core",
90
+ });
91
+ ```
108
92
 
109
- const result = verifyWebhook(
110
- WEBHOOK_SECRET,
111
- rawBody,
112
- signatureHeader,
113
- );
93
+ Pass `wait: false` to return the created job without polling.
94
+
95
+ More examples: [OpenAI](https://speechweave.com/docs/migration/openai) · [Deepgram](https://speechweave.com/docs/migration/deepgram) · [AssemblyAI](https://speechweave.com/docs/migration/assemblyai)
96
+
97
+ ### Migrating from OpenAI
98
+
99
+ You don't need this SDK for a quick swap — use the official `openai` package and point it at SpeechWeave:
100
+
101
+ ```ts
102
+ import fs from "node:fs";
103
+ import OpenAI from "openai";
104
+
105
+ const client = new OpenAI({
106
+ apiKey: process.env.SPEECHWEAVE_API_KEY!,
107
+ baseURL: "https://api.speechweave.com/v1",
108
+ });
109
+
110
+ const result = await client.audio.transcriptions.create({
111
+ file: fs.createReadStream("clip.mp3"),
112
+ model: "core",
113
+ });
114
+
115
+ console.log(result.text);
114
116
  ```
115
117
 
116
- Configure webhooks in the dashboard. Payloads are signed with `SpeechWeave-Signature`.
118
+ OpenAI model names like `whisper-1` are aliased to `core` on our backend. See the [OpenAI migration guide](https://speechweave.com/docs/migration/openai).
package/dist/index.cjs CHANGED
@@ -91,7 +91,7 @@ async function waitForJob(client, job_id, opts = {}) {
91
91
  }
92
92
 
93
93
  // src/version.ts
94
- var VERSION = "1.0.0";
94
+ var VERSION = "1.0.1";
95
95
 
96
96
  // src/client.ts
97
97
  function normalizeBaseURL(url) {
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/client.ts","../src/errors.ts","../src/polling.ts","../src/version.ts","../src/compat_shapes.ts","../src/webhooks.ts","../src/openai/openai_compat.ts","../src/deepgram/deepgram_compat.ts","../src/assembly/assembly_compat.ts"],"sourcesContent":["export { SpeechWeaveClient } from \"./client.js\";\nexport { SpeechWeaveError } from \"./errors.js\";\nexport { waitForJob } from \"./polling.js\";\nexport type { WaitForJobOptions } from \"./polling.js\";\nexport {\n\tcreateJobFromUrl,\n\tfinishCompatJob,\n\tshapeAssemblyResponse,\n\tshapeDeepgramResponse,\n\tshapeOpenAiResponse,\n\tuploadAndCreateJob,\n} from \"./compat_shapes.js\";\nexport type {\n\tCreateJobResponse,\n\tListJobsResponse,\n\tPresignResponse,\n\tPublicJobStatus,\n\tServiceMode,\n\tSpeechWeaveClientOptions,\n\tV1Job,\n} from \"./types.js\";\nexport { VERSION } from \"./version.js\";\nexport { verifyWebhook } from \"./webhooks.js\";\nexport type { VerifyWebhookResult } from \"./webhooks.js\";\n\nimport { SpeechWeaveClient } from \"./client.js\";\nimport { createOpenAiAudioNamespace } from \"./openai/openai_compat.js\";\nimport { createDeepgramListenNamespace } from \"./deepgram/deepgram_compat.js\";\nimport { createAssemblyTranscriptsNamespace } from \"./assembly/assembly_compat.js\";\nimport type { ServiceMode, SpeechWeaveClientOptions } from \"./types.js\";\n\nfunction createJobsNamespace(\n\tclient : SpeechWeaveClient,\n) {\n\n\treturn {\n\t\t/**\n\t\t * Create a job from a local file or a remote URL / object_key.\n\t\t * Pass `file` (path, Buffer, Blob, or stream) to presign-upload then create.\n\t\t * Otherwise pass one of `object_key`, `input_url`, or `audio_url` (no upload).\n\t\t * Omitting service_mode leaves the API default (deferred).\n\t\t */\n\t\tcreate: async ( params : {\n\t\t\tfile ?: string | Buffer | Blob | import( \"node:fs\" ).ReadStream;\n\t\t\tfilename ?: string;\n\t\t\tcontent_type ?: string;\n\t\t\tobject_key ?: string;\n\t\t\tinput_url ?: string;\n\t\t\taudio_url ?: string;\n\t\t\tmodel ?: string;\n\t\t\tservice_mode ?: ServiceMode;\n\t\t\tlanguage ?: string;\n\t\t\ttype ?: string;\n\t\t\tmetadata ?: Record<string, unknown>;\n\t\t\tfile_size ?: number;\n\t\t} ) => {\n\n\t\t\tif ( params.file != null ) {\n\n\t\t\t\tif ( typeof params.file === \"string\" ) {\n\n\t\t\t\t\treturn client.transcribeFilePath(\n\t\t\t\t\t\tparams.file,\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tmodel: params.model,\n\t\t\t\t\t\t\tservice_mode: params.service_mode,\n\t\t\t\t\t\t\tlanguage: params.language,\n\t\t\t\t\t\t\tcontent_type: params.content_type,\n\t\t\t\t\t\t\tmetadata: params.metadata,\n\t\t\t\t\t\t\tfile_size: params.file_size,\n\t\t\t\t\t\t},\n\t\t\t\t\t);\n\t\t\t\t\n\t\t\t\t}\n\n\t\t\t\treturn client.transcribeFile(\n\t\t\t\t\tparams.file,\n\t\t\t\t\t{\n\t\t\t\t\t\tfilename: params.filename,\n\t\t\t\t\t\tcontent_type: params.content_type,\n\t\t\t\t\t\tmodel: params.model,\n\t\t\t\t\t\tservice_mode: params.service_mode,\n\t\t\t\t\t\tlanguage: params.language,\n\t\t\t\t\t\tmetadata: params.metadata,\n\t\t\t\t\t\tfile_size: params.file_size,\n\t\t\t\t\t},\n\t\t\t\t);\n\t\t\t\n\t\t\t}\n\n\t\t\treturn client.createJob( {\n\t\t\t\tobject_key: params.object_key,\n\t\t\t\tinput_url: params.input_url,\n\t\t\t\taudio_url: params.audio_url,\n\t\t\t\tmodel: params.model,\n\t\t\t\tservice_mode: params.service_mode,\n\t\t\t\tlanguage: params.language,\n\t\t\t\ttype: params.type,\n\t\t\t\tmetadata: params.metadata,\n\t\t\t} );\n\t\t\n\t\t},\n\t\t/** Fetch the current job record. */\n\t\tget: client.getJob.bind( client ),\n\t\t/** List jobs for the authenticated account. */\n\t\tlist: client.listJobs.bind( client ),\n\t\t/**\n\t\t * Cancel a pending or processing job.\n\t\t * Fails if the job is already completed, failed, or cancelled.\n\t\t */\n\t\tcancel: client.cancelJob.bind( client ),\n\t};\n\n}\n\nexport class SpeechWeave extends SpeechWeaveClient {\n\n\treadonly audio : ReturnType<typeof createOpenAiAudioNamespace>;\n\treadonly listen : ReturnType<typeof createDeepgramListenNamespace>;\n\treadonly transcripts : ReturnType<typeof createAssemblyTranscriptsNamespace>;\n\treadonly jobs : ReturnType<typeof createJobsNamespace>;\n\n\tconstructor( options : SpeechWeaveClientOptions = {} ) {\n\n\t\tsuper( options );\n\t\tthis.audio = createOpenAiAudioNamespace( this );\n\t\tthis.listen = createDeepgramListenNamespace( this );\n\t\tthis.transcripts = createAssemblyTranscriptsNamespace( this );\n\t\tthis.jobs = createJobsNamespace( this );\n\t\n\t}\n\n}\n","import { createReadStream } from \"node:fs\";\nimport type { ReadStream } from \"node:fs\";\nimport { stat } from \"node:fs/promises\";\nimport { SpeechWeaveError } from \"./errors.js\";\nimport { waitForJob } from \"./polling.js\";\nimport type {\n\tCreateJobResponse,\n\tCancelJobResponse,\n\tListJobsResponse,\n\tPresignResponse,\n\tServiceMode,\n\tSpeechWeaveClientOptions,\n\tV1Job,\n} from \"./types.js\";\nimport { VERSION } from \"./version.js\";\n\nfunction normalizeBaseURL(\n\turl : string,\n) : string {\n\n\tconst s = String( url || \"\" ).trim().replace( /\\/+$/, \"\" );\n\n\treturn s || \"https://api.speechweave.com/v1\";\n\n}\n\nasync function readErrorMessage(\n\tresponse : Response,\n) : Promise<string> {\n\n\tconst content_type = response.headers.get( \"content-type\" ) || \"\";\n\ttry {\n\n\t\tif ( content_type.includes( \"application/json\" ) ) {\n\n\t\t\tconst json = ( await response.json() ) as { error ?: string;\n\t\t\t\tmessage ?: string; };\n\n\t\t\treturn String( json?.error || json?.message || response.statusText );\n\t\t\n\t\t}\n\t\tconst text = await response.text();\n\n\t\treturn text.slice( 0, 500 ) || response.statusText;\n\t\n\t}\n\tcatch {\n\n\t\treturn response.statusText;\n\t\n\t}\n\n}\n\nasync function getBodyLength(\n\tbody : Buffer | ReadStream | Blob,\n\tfile_size ?: number,\n) : Promise<number | undefined> {\n\n\tif ( file_size != null && Number.isFinite( file_size ) && file_size >= 0 ) {\n\n\t\treturn file_size;\n\t\n\t}\n\tif ( Buffer.isBuffer( body ) ) {\n\n\t\treturn body.byteLength;\n\t\n\t}\n\tif ( body instanceof Blob ) {\n\n\t\treturn body.size;\n\t\n\t}\n\n\tconst path_like : unknown = ( body as ReadStream & { path ?: unknown } ).path;\n\tif (\n\t\ttypeof path_like === \"string\"\n\t\t|| Buffer.isBuffer( path_like )\n\t\t|| path_like instanceof URL\n\t) {\n\n\t\ttry {\n\n\t\t\treturn ( await stat( path_like ) ).size;\n\t\t\n\t\t}\n\t\tcatch {\n\n\t\t\treturn undefined;\n\t\t\n\t\t}\n\t\n\t}\n\n\treturn undefined;\n\n}\n\n/** Low-level SpeechWeave `/v1` client (presign, jobs, uploads). */\nexport class SpeechWeaveClient {\n\n\tprotected readonly api_key : string;\n\tprotected readonly base_url : string;\n\tprotected readonly fetch_func : typeof fetch;\n\n\t/**\n\t * @param options.api_key - Falls back to SPEECHWEAVE_API_KEY. Throws if neither is set.\n\t * @param options.base_url - Defaults to https://api.speechweave.com/v1.\n\t */\n\tconstructor(\n\t\toptions : SpeechWeaveClientOptions = {},\n\t) {\n\n\t\tthis.api_key = (\n\t\t\toptions.api_key\n\t\t\t|| (\n\t\t\t\ttypeof process !== \"undefined\"\n\t\t\t\t&& process.env?.SPEECHWEAVE_API_KEY\n\t\t\t)\n\t\t\t|| \"\"\n\t\t);\n\t\tthis.base_url = normalizeBaseURL(\n\t\t\toptions.base_url || \"https://api.speechweave.com/v1\",\n\t\t);\n\t\tthis.fetch_func = options.fetch_func || fetch;\n\t\tif ( ! this.api_key ) {\n\n\t\t\tthrow new Error( \"SpeechWeave API key is required (api_key, or SPEECHWEAVE_API_KEY)\" );\n\t\t\n\t\t}\n\t\n\t}\n\n\t/**\n\t * Authenticated fetch against base_url.\n\t * Adds Bearer and User-Agent when missing. Path is relative (leading `/` optional).\n\t */\n\tasync rawFetch(\n\t\tpath : string,\n\t\tinit : RequestInit = {},\n\t) : Promise<Response> {\n\n\t\tconst formatted_path = path.startsWith( \"/\" ) ? path : `/${ path }`;\n\t\tconst url = `${ this.base_url }${ formatted_path }`;\n\t\tconst h = new Headers( init.headers );\n\t\tif ( ! h.has( \"Authorization\" ) ) {\n\n\t\t\th.set( \"Authorization\", `Bearer ${ this.api_key }` );\n\t\t\n\t\t}\n\t\tif ( ! h.has( \"User-Agent\" ) ) {\n\n\t\t\th.set( \"User-Agent\", `speechweave-node/${ VERSION }` );\n\t\t\n\t\t}\n\n\t\treturn this.fetch_func( url, { ...init,\n\t\t\theaders: h } );\n\t\n\t}\n\n\tprotected async requestJson<T>(\n\t\tmethod : string,\n\t\tpath : string,\n\t\tjson ?: unknown,\n\t\tparams ?: Record<string, string | number | boolean | undefined | null>,\n\t) : Promise<T> {\n\n\t\tlet request_path = path;\n\t\tif ( params ) {\n\n\t\t\tconst search = new URLSearchParams();\n\t\t\tfor ( const [\n\t\t\t\tkey,\n\t\t\t\tvalue, \n\t\t\t] of Object.entries( params ) ) {\n\n\t\t\t\tif ( value === undefined || value === null ) {\n\n\t\t\t\t\tcontinue;\n\t\t\t\t\n\t\t\t\t}\n\t\t\t\tsearch.set( key, String( value ) );\n\t\t\t\n\t\t\t}\n\t\t\tconst qs = search.toString();\n\t\t\tif ( qs ) {\n\n\t\t\t\trequest_path = `${ path }${ path.includes( \"?\" ) ? \"&\" : \"?\" }${ qs }`;\n\t\t\t\n\t\t\t}\n\t\t\n\t\t}\n\n\t\tconst headers : HeadersInit = { Accept: \"application/json\" };\n\t\tlet body : string | undefined;\n\t\tif ( json !== undefined ) {\n\n\t\t\t( headers as Record<string, string> )[ \"Content-Type\" ] = \"application/json\";\n\t\t\tbody = JSON.stringify( json );\n\t\t\n\t\t}\n\n\t\tconst response = await this.rawFetch( request_path, { method,\n\t\t\theaders,\n\t\t\tbody } );\n\t\tif ( ! response.ok ) {\n\n\t\t\tconst ct = response.headers.get( \"content-type\" ) || \"\";\n\t\t\tlet err_body : unknown;\n\t\t\tlet message : string;\n\t\t\tlet code : string | undefined = String( response.status );\n\t\t\tlet retry_after : number | undefined;\n\t\t\tconst header_retry = response.headers.get( \"Retry-After\" );\n\t\t\tif ( header_retry ) {\n\n\t\t\t\tconst n = parseInt( header_retry, 10 );\n\t\t\t\tif ( Number.isFinite( n ) ) {\n\n\t\t\t\t\tretry_after = n;\n\t\t\t\t\n\t\t\t\t}\n\t\t\t\n\t\t\t}\n\t\t\ttry {\n\n\t\t\t\tif ( ct.includes( \"application/json\" ) ) {\n\n\t\t\t\t\terr_body = await response.json();\n\t\t\t\t\tconst j = err_body as {\n\t\t\t\t\t\terror ?: string;\n\t\t\t\t\t\tmessage ?: string;\n\t\t\t\t\t\tcode ?: string;\n\t\t\t\t\t\tretry_after ?: number;\n\t\t\t\t\t};\n\t\t\t\t\tmessage = String( j?.error || j?.message || response.statusText );\n\t\t\t\t\tif ( j?.code ) {\n\n\t\t\t\t\t\tcode = j.code;\n\t\t\t\t\t\n\t\t\t\t\t}\n\t\t\t\t\tif ( typeof j?.retry_after === \"number\" ) {\n\n\t\t\t\t\t\tretry_after = j.retry_after;\n\t\t\t\t\t\n\t\t\t\t\t}\n\t\t\t\t\n\t\t\t\t}\n\t\t\t\telse {\n\n\t\t\t\t\tconst t = await response.text();\n\t\t\t\t\tmessage = t.slice( 0, 500 ) || response.statusText;\n\t\t\t\t\n\t\t\t\t}\n\t\t\t\n\t\t\t}\n\t\t\tcatch {\n\n\t\t\t\tmessage = response.statusText;\n\t\t\t\n\t\t\t}\n\n\t\t\tthrow new SpeechWeaveError(\n\t\t\t\tmessage,\n\t\t\t\tresponse.status,\n\t\t\t\tcode,\n\t\t\t\terr_body,\n\t\t\t\tretry_after,\n\t\t\t);\n\t\t\n\t\t}\n\n\t\treturn ( await response.json() ) as T;\n\t\n\t}\n\n\t/**\n\t * Request a short-lived PUT URL and object_key for direct upload to storage.\n\t *\n\t * @param params.filename - Original name (used in the storage key).\n\t * @param params.content_type - MIME type that must match the subsequent PUT.\n\t */\n\tasync presignUpload(\n\t\tparams : {\n\t\t\tfilename : string;\n\t\t\tcontent_type : string;\n\t\t},\n\t) : Promise<PresignResponse> {\n\n\t\treturn this.requestJson<PresignResponse>(\n\t\t\t\"POST\",\n\t\t\t\"/uploads\",\n\t\t\t{\n\t\t\t\tfilename: params.filename,\n\t\t\t\tcontent_type: params.content_type,\n\t\t\t},\n\t\t);\n\t\n\t}\n\n\t/**\n\t * PUT audio bytes to a presigned upload_url.\n\t * Sets Content-Length when the body can be measured; pass file_size for pipes/live streams.\n\t *\n\t * @param uploadUrl - upload_url from presignUpload.\n\t */\n\tasync putToPresignedUrl(\n\t\tuploadUrl : string,\n\t\tbody : Buffer | ReadStream | Blob,\n\t\tcontentType : string,\n\t\toptions : { file_size ?: number } = {},\n\t) : Promise<void> {\n\n\t\tconst headers = new Headers( { \"Content-Type\": contentType } );\n\t\tconst content_length = await getBodyLength( body, options.file_size );\n\t\tif ( content_length != null ) {\n\n\t\t\theaders.set( \"Content-Length\", String( content_length ) );\n\t\t\n\t\t}\n\n\t\tconst init : RequestInit & { duplex ?: string } = {\n\t\t\tmethod: \"PUT\",\n\t\t\theaders,\n\t\t\tbody: body as BodyInit,\n\t\t};\n\t\tconst is_node_stream = body && typeof ( body as ReadStream ).pipe === \"function\";\n\t\tif ( is_node_stream ) {\n\n\t\t\tinit.duplex = \"half\";\n\t\t\n\t\t}\n\t\tconst response = await this.fetch_func( uploadUrl, init );\n\t\tif ( ! response.ok ) {\n\n\t\t\tconst message = await readErrorMessage( response );\n\t\t\tthrow new SpeechWeaveError(\n\t\t\t\t`R2 upload failed: ${ message }`,\n\t\t\t\tresponse.status,\n\t\t\t\t\"UPLOAD_FAILED\",\n\t\t\t);\n\t\t\n\t\t}\n\t\n\t}\n\n\t/**\n\t * Presign → PUT → create job. Returns the create ack (no transcript); poll getJob or waitForJob.\n\t * Omitting service_mode leaves the API default (deferred). Synchronous rejects files over the sync size cap (default 512 MiB).\n\t *\n\t * @param options.filename - Defaults to audio.bin.\n\t * @param options.content_type - Defaults to application/octet-stream.\n\t * @param options.language - Two-letter ISO code (e.g. 'en', 'es').\n\t * @param options.file_size - Content-Length when the body cannot be measured (pipes, live streams).\n\t */\n\tasync transcribeFile(\n\t\tfile : ReadStream | Buffer | Blob,\n\t\toptions : {\n\t\t\tfilename ?: string;\n\t\t\tcontent_type ?: string;\n\t\t\tmodel ?: string;\n\t\t\tservice_mode ?: ServiceMode;\n\t\t\tlanguage ?: string;\n\t\t\tmetadata ?: Record<string, unknown>;\n\t\t\tfile_size ?: number;\n\t\t} = {},\n\t) : Promise<CreateJobResponse> {\n\n\t\tconst filename = options.filename || \"audio.bin\";\n\t\tconst content_type = options.content_type || \"application/octet-stream\";\n\t\tconst presign = await this.presignUpload( {\n\t\t\tfilename,\n\t\t\tcontent_type,\n\t\t} );\n\t\tconst put_opts = { file_size: options.file_size };\n\n\t\tif ( Buffer.isBuffer( file ) || file instanceof Blob ) {\n\n\t\t\tawait this.putToPresignedUrl( presign.upload_url, file, content_type, put_opts );\n\t\t\n\t\t}\n\t\telse {\n\n\t\t\tawait this.putToPresignedUrl(\n\t\t\t\tpresign.upload_url,\n\t\t\t\tfile as ReadStream,\n\t\t\t\tcontent_type,\n\t\t\t\tput_opts,\n\t\t\t);\n\t\t\n\t\t}\n\n\t\treturn this.createJob( {\n\t\t\tobject_key: presign.object_key,\n\t\t\tmodel: options.model,\n\t\t\tservice_mode: options.service_mode,\n\t\t\tlanguage: options.language,\n\t\t\tmetadata: options.metadata,\n\t\t} );\n\t\n\t}\n\n\t/**\n\t * Same as {@link transcribeFile}, then poll until completed, failed, or cancelled.\n\t *\n\t * @param options.wait_timeout_ms - Defaults to SPEECHWEAVE_JOB_WAIT_MS or 300_000.\n\t * @param options.poll_ms - Poll interval; defaults to 1500.\n\t */\n\tasync transcribeFileBlocking(\n\t\tfile : ReadStream | Buffer | Blob,\n\t\toptions : {\n\t\t\tfilename ?: string;\n\t\t\tcontent_type ?: string;\n\t\t\tmodel ?: string;\n\t\t\tservice_mode ?: ServiceMode;\n\t\t\tlanguage ?: string;\n\t\t\tmetadata ?: Record<string, unknown>;\n\t\t\tfile_size ?: number;\n\t\t\twait_timeout_ms ?: number;\n\t\t\tpoll_ms ?: number;\n\t\t} = {},\n\t) : Promise<V1Job> {\n\n\t\tconst created = await this.transcribeFile( file, options );\n\n\t\treturn waitForJob(\n\t\t\tthis,\n\t\t\tcreated.id,\n\t\t\t{\n\t\t\t\ttimeout_ms: options.wait_timeout_ms ?? Number( process.env?.SPEECHWEAVE_JOB_WAIT_MS || 300_000 ),\n\t\t\t\tpoll_ms: options.poll_ms ?? 1_500,\n\t\t\t},\n\t\t);\n\t\n\t}\n\n\t/**\n\t * Create a transcription job from an already-uploaded object or a remote URL.\n\t * Provide exactly one of object_key, input_url, or audio_url. type defaults to transcription.\n\t * Omitting service_mode leaves the API default (deferred).\n\t *\n\t * @param params.object_key - From PresignResponse after a successful PUT.\n\t * @param params.input_url - Publicly reachable audio URL.\n\t * @param params.audio_url - Alias for input_url.\n\t * @param params.language - Two-letter ISO code (e.g. 'en', 'es').\n\t */\n\tasync createJob(\n\t\tparams : {\n\t\t\tobject_key ?: string;\n\t\t\tinput_url ?: string;\n\t\t\taudio_url ?: string;\n\t\t\tmodel ?: string;\n\t\t\tservice_mode ?: ServiceMode;\n\t\t\tlanguage ?: string;\n\t\t\ttype ?: string;\n\t\t\tmetadata ?: Record<string, unknown>;\n\t\t},\n\t) : Promise<CreateJobResponse> {\n\n\t\tconst payload : Record<string, unknown> = {\n\t\t\ttype: params.type || \"transcription\",\n\t\t};\n\t\tif ( params.object_key != null ) {\n\n\t\t\tpayload.object_key = params.object_key;\n\t\t\n\t\t}\n\t\tif ( params.input_url != null ) {\n\n\t\t\tpayload.input_url = params.input_url;\n\t\t\n\t\t}\n\t\tif ( params.audio_url != null ) {\n\n\t\t\tpayload.audio_url = params.audio_url;\n\t\t\n\t\t}\n\t\tif ( params.model != null ) {\n\n\t\t\tpayload.model = params.model;\n\t\t\n\t\t}\n\t\tif ( params.service_mode != null ) {\n\n\t\t\tpayload.service_mode = params.service_mode;\n\t\t\n\t\t}\n\t\tif ( params.language != null ) {\n\n\t\t\tpayload.language = params.language;\n\t\t\n\t\t}\n\t\tif ( params.metadata != null ) {\n\n\t\t\tpayload.metadata = params.metadata;\n\t\t\n\t\t}\n\n\t\treturn this.requestJson<CreateJobResponse>( \"POST\", \"/jobs\", payload );\n\t\n\t}\n\n\t/**\n\t * Fetch the current job record (status, transcript when completed, error when failed).\n\t *\n\t * @param job_id - Id from createJob / transcribeFile.\n\t */\n\tasync getJob(\n\t\tjob_id : string,\n\t) : Promise<V1Job> {\n\n\t\treturn this.requestJson<V1Job>(\n\t\t\t\"GET\",\n\t\t\t`/jobs/${ encodeURIComponent( job_id ) }`,\n\t\t);\n\t\n\t}\n\n\t/**\n\t * List jobs for the authenticated account.\n\t *\n\t * @param params.status - Filter by PublicJobStatus value.\n\t * @param params.page - 1-based page; API default if omitted.\n\t * @param params.limit - Page size; API default if omitted.\n\t */\n\tasync listJobs(\n\t\tparams : {\n\t\t\tpage ?: number;\n\t\t\tlimit ?: number;\n\t\t\tstatus ?: string;\n\t\t} = {},\n\t) : Promise<ListJobsResponse> {\n\n\t\treturn this.requestJson<ListJobsResponse>(\n\t\t\t\"GET\",\n\t\t\t\"/jobs\",\n\t\t\tundefined,\n\t\t\t{\n\t\t\t\tpage: params.page,\n\t\t\t\tlimit: params.limit,\n\t\t\t\tstatus: params.status,\n\t\t\t},\n\t\t);\n\t\n\t}\n\n\t/**\n\t * Cancel a pending or processing job.\n\t * Fails if the job is already completed, failed, or cancelled.\n\t *\n\t * @param job_id - Id from createJob / transcribeFile.\n\t */\n\tasync cancelJob(\n\t\tjob_id : string,\n\t) : Promise<CancelJobResponse> {\n\n\t\treturn this.requestJson(\n\t\t\t\"POST\",\n\t\t\t`/jobs/${ encodeURIComponent( job_id ) }/cancel`,\n\t\t\t{},\n\t\t);\n\t\n\t}\n\n\t/**\n\t * Open a disk path and run {@link transcribeFile}.\n\t * filename is taken from the path basename.\n\t *\n\t * @param file_path - Absolute or relative path on the local filesystem.\n\t */\n\tasync transcribeFilePath(\n\t\tfile_path : string,\n\t\toptions : {\n\t\t\tmodel ?: string;\n\t\t\tservice_mode ?: ServiceMode;\n\t\t\tlanguage ?: string;\n\t\t\tcontent_type ?: string;\n\t\t\tmetadata ?: Record<string, unknown>;\n\t\t\tfile_size ?: number;\n\t\t} = {},\n\t) : Promise<CreateJobResponse> {\n\n\t\tconst stream = createReadStream( file_path );\n\t\tconst base = file_path.split( /[/\\\\]/ ).pop() || \"audio.bin\";\n\n\t\treturn this.transcribeFile(\n\t\t\tstream,\n\t\t\t{\n\t\t\t\tfilename: base,\n\t\t\t\tcontent_type: options.content_type,\n\t\t\t\tmodel: options.model,\n\t\t\t\tservice_mode: options.service_mode,\n\t\t\t\tlanguage: options.language,\n\t\t\t\tmetadata: options.metadata,\n\t\t\t\tfile_size: options.file_size,\n\t\t\t},\n\t\t);\n\t\n\t}\n\n}\n","export class SpeechWeaveError extends Error {\n\n\treadonly status : number;\n\treadonly code ?: string;\n\treadonly body ?: unknown;\n\treadonly retry_after ?: number;\n\n\tconstructor(\n\t\tmessage : string,\n\t\tstatus = 500,\n\t\tcode ?: string,\n\t\tbody ?: unknown,\n\t\tretry_after ?: number,\n\t) {\n\n\t\tsuper( message );\n\n\t\tthis.name = \"SpeechWeaveError\";\n\t\tthis.status = status;\n\t\tthis.code = code;\n\t\tthis.body = body;\n\t\tthis.retry_after = retry_after;\n\t\n\t}\n\n}\n","import type { SpeechWeaveClient } from \"./client.js\";\nimport type { V1Job } from \"./types.js\";\nimport { SpeechWeaveError } from \"./errors.js\";\n\nconst TERMINAL = new Set( [\n\t\"completed\",\n\t\"failed\",\n\t\"cancelled\",\n] );\n\nexport interface WaitForJobOptions {\n\t/** Max wait in ms; defaults to 3_600_000. */\n\ttimeout_ms ?: number;\n\t/** Interval between getJob polls; defaults to 2000. */\n\tpoll_ms ?: number;\n}\n\n/**\n * Poll getJob until completed, failed, or cancelled.\n * Throws SpeechWeaveError with code JOB_WAIT_TIMEOUT on deadline.\n *\n * @param job_id - Id from createJob / transcribeFile.\n */\nexport async function waitForJob(\n\tclient : SpeechWeaveClient,\n\tjob_id : string,\n\topts : WaitForJobOptions = {},\n) : Promise< V1Job > {\n\n\tconst timeout_ms = opts.timeout_ms ?? 3_600_000;\n\tconst poll_ms = opts.poll_ms ?? 2_000;\n\tconst deadline = ( Date.now() + timeout_ms );\n\n\twhile ( Date.now() < deadline ) {\n\n\t\tconst job = await client.getJob( job_id );\n\t\tif ( TERMINAL.has( String( job.status ) ) ) {\n\n\t\t\treturn job;\n\t\t\n\t\t}\n\n\t\tawait new Promise( ( r ) => setTimeout( r, poll_ms ) );\n\t\n\t}\n\n\tthrow new SpeechWeaveError(\n\t\t\"Timed out waiting for job\",\n\t\t504,\n\t\t\"JOB_WAIT_TIMEOUT\",\n\t\t{ job_id },\n\t);\n\n}\n","export const VERSION = \"1.0.0\";\n","import type { ReadStream } from \"node:fs\";\nimport type { SpeechWeaveClient } from \"./client.js\";\nimport { SpeechWeaveError } from \"./errors.js\";\nimport { waitForJob } from \"./polling.js\";\nimport type { CreateJobResponse, ServiceMode, V1Job, UploadBodyResult } from \"./types.js\";\n\nexport type UploadBody = Buffer | Blob | ReadStream | Uint8Array;\n\nfunction jobText(\n\tjob : Record<string, unknown>,\n) : string {\n\n\tconst text = job.transcript;\n\n\treturn typeof text === \"string\" ? text : \"\";\n\n}\n\nfunction jobDuration(\n\tjob : Record<string, unknown>,\n) : number | undefined {\n\n\tconst duration = job.duration;\n\tif ( duration == null ) {\n\n\t\treturn undefined;\n\t\n\t}\n\tconst value = Number( duration );\n\tif ( ! Number.isFinite( value ) || value < 0 ) {\n\n\t\treturn undefined;\n\t\n\t}\n\n\treturn value;\n\n}\n\nfunction jobLanguage(\n\tjob : Record<string, unknown>,\n) : string | undefined {\n\n\tconst language = job.language;\n\tif ( language == null ) {\n\n\t\treturn undefined;\n\t\n\t}\n\tconst text = String( language ).trim().toLowerCase();\n\n\treturn text || undefined;\n\n}\n\nexport function shapeOpenAiResponse(\n\tjob : Record<string, unknown>,\n) : {\n\ttext : string;\n\ttask : \"transcribe\";\n\tduration ?: number;\n\tlanguage ?: string;\n} {\n\n\tconst response : {\n\t\ttext : string;\n\t\ttask : \"transcribe\";\n\t\tduration ?: number;\n\t\tlanguage ?: string;\n\t} = {\n\t\ttext: jobText( job ),\n\t\ttask: \"transcribe\",\n\t};\n\tconst duration = jobDuration( job );\n\tif ( duration !== undefined ) {\n\n\t\tresponse.duration = duration;\n\t\n\t}\n\tconst language = jobLanguage( job );\n\tif ( language !== undefined ) {\n\n\t\tresponse.language = language;\n\t\n\t}\n\n\treturn response;\n\n}\n\nexport function shapeDeepgramResponse(\n\tjob : Record<string, unknown>,\n\toptions : { model ?: string | null } = {},\n) : Record<string, unknown> {\n\n\tconst job_id = String( job.id || \"\" );\n\tconst model_name = options.model || String( job.model || \"core\" );\n\tconst text = jobText( job );\n\tconst language = jobLanguage( job );\n\n\tconst alternative : Record<string, unknown> = {\n\t\ttranscript: text,\n\t\tconfidence: 1,\n\t\twords: [\n\t\t],\n\t};\n\tif ( language !== undefined ) {\n\n\t\talternative.language = language;\n\t\n\t}\n\n\treturn {\n\t\tmetadata: {\n\t\t\trequest_id: job_id,\n\t\t\tmodel_info: {\n\t\t\t\tname: model_name,\n\t\t\t\tversion: \"1\",\n\t\t\t\tarch: \"speechweave\",\n\t\t\t},\n\t\t},\n\t\tresults: {\n\t\t\tchannels: [\n\t\t\t\t{\n\t\t\t\t\talternatives: [\n\t\t\t\t\t\talternative, \n\t\t\t\t\t],\n\t\t\t\t},\n\t\t\t],\n\t\t},\n\t};\n\n}\n\nexport function shapeAssemblyResponse(\n\tjob : Record<string, unknown>,\n) : Record<string, unknown> {\n\n\tconst status = String( job.status || \"unknown\" );\n\tconst pub_status = status === \"completed\" ? \"completed\" : status;\n\tconst duration = jobDuration( job );\n\tconst language = jobLanguage( job );\n\tconst error = job.error;\n\n\tconst response : Record<string, unknown> = {\n\t\tid: String( job.id || \"\" ),\n\t\tstatus: pub_status,\n\t\ttext: jobText( job ),\n\t};\n\tif ( duration !== undefined ) {\n\n\t\tresponse.audio_duration = duration;\n\t\n\t}\n\tif ( language !== undefined ) {\n\n\t\tresponse.language = language;\n\t\n\t}\n\tif ( error != null && pub_status === \"failed\" ) {\n\n\t\tresponse.error = String( error );\n\t\n\t}\n\telse {\n\n\t\tresponse.error = null;\n\t\n\t}\n\n\treturn response;\n\n}\n\nasync function toUploadBody(\n\tdata : UploadBody,\n) : Promise<UploadBodyResult> {\n\n\tif ( data instanceof Blob ) {\n\n\t\treturn {\n\t\t\tbody: data,\n\t\t\tcontent_type: data.type || \"application/octet-stream\",\n\t\t};\n\t\n\t}\n\tif ( Buffer.isBuffer( data ) || data instanceof Uint8Array ) {\n\n\t\tconst buf = Buffer.isBuffer( data ) ? data : Buffer.from( data );\n\n\t\treturn {\n\t\t\tbody: buf,\n\t\t\tcontent_type: \"application/octet-stream\",\n\t\t};\n\t\n\t}\n\n\t// Pass ReadStream through — putToPresignedUrl streams with duplex: \"half\".\n\treturn {\n\t\tbody: data,\n\t\tcontent_type: \"application/octet-stream\",\n\t};\n\n}\n\nexport async function uploadAndCreateJob(\n\tclient : SpeechWeaveClient,\n\tparams : {\n\t\tdata : UploadBody;\n\t\tfilename : string;\n\t\tcontent_type ?: string;\n\t\tmodel ?: string;\n\t\tlanguage ?: string;\n\t\tservice_mode ?: ServiceMode;\n\t\tmetadata ?: Record<string, unknown>;\n\t\tfile_size ?: number;\n\t},\n) : Promise<CreateJobResponse> {\n\n\tconst prepared = await toUploadBody( params.data );\n\tconst content_type = params.content_type || prepared.content_type;\n\tconst body = prepared.body;\n\n\tconst presign = await client.presignUpload( {\n\t\tfilename: params.filename,\n\t\tcontent_type,\n\t} );\n\tawait client.putToPresignedUrl(\n\t\tpresign.upload_url,\n\t\tbody as Buffer | Blob | ReadStream,\n\t\tcontent_type,\n\t\t{ file_size: params.file_size },\n\t);\n\n\treturn client.createJob( {\n\t\tobject_key: presign.object_key,\n\t\tmodel: params.model,\n\t\tlanguage: params.language,\n\t\tservice_mode: params.service_mode ?? \"synchronous\",\n\t\tmetadata: params.metadata,\n\t} );\n\n}\n\nexport async function createJobFromUrl(\n\tclient : SpeechWeaveClient,\n\tparams : {\n\t\turl : string;\n\t\tmodel ?: string;\n\t\tlanguage ?: string;\n\t\tservice_mode ?: ServiceMode;\n\t\tmetadata ?: Record<string, unknown>;\n\t},\n) : Promise<CreateJobResponse> {\n\n\treturn client.createJob( {\n\t\tinput_url: params.url,\n\t\tmodel: params.model,\n\t\tlanguage: params.language,\n\t\tservice_mode: params.service_mode ?? \"synchronous\",\n\t\tmetadata: params.metadata,\n\t} );\n\n}\n\nexport async function finishCompatJob(\n\tclient : SpeechWeaveClient,\n\tjob : CreateJobResponse | V1Job | Record<string, unknown>,\n\toptions : {\n\t\twait : boolean;\n\t\terror_code : string;\n\t\ttimeout_ms ?: number;\n\t\tpoll_ms ?: number;\n\t},\n) : Promise<V1Job | CreateJobResponse | Record<string, unknown>> {\n\n\tif ( ! options.wait ) {\n\n\t\treturn job;\n\t\n\t}\n\n\tconst finished = await waitForJob(\n\t\tclient,\n\t\tString( ( job as { id ?: string } ).id || \"\" ),\n\t\t{\n\t\t\ttimeout_ms: options.timeout_ms ?? 300_000,\n\t\t\tpoll_ms: options.poll_ms ?? 1_500,\n\t\t},\n\t);\n\n\tif ( String( finished.status ) === \"failed\" ) {\n\n\t\tthrow new SpeechWeaveError(\n\t\t\tString( finished.error || \"Transcription failed\" ),\n\t\t\t500,\n\t\t\toptions.error_code,\n\t\t\tfinished,\n\t\t);\n\t\n\t}\n\n\treturn finished;\n\n}\n","import crypto from \"node:crypto\";\n\nexport interface VerifyWebhookResult {\n\tok : boolean;\n\treason ?: string;\n}\n\nfunction timingSafeEqual(\n\ta : string,\n\tb : string,\n) : boolean {\n\n\tconst ab = Buffer.from( a, \"utf8\" );\n\tconst bb = Buffer.from( b, \"utf8\" );\n\tif ( ab.length !== bb.length ) {\n\n\t\treturn false;\n\t\n\t}\n\n\treturn crypto.timingSafeEqual( ab, bb );\n\n}\n\n/**\n * Verify `SpeechWeave-Signature` header (Stripe-style: `t=unix,v1=hex` — may include multiple `v1=` during secret rotation).\n *\n * @param secret — active webhook signing secret, or array of `[active, previous]` during a rotation window\n * @param raw_body — exact request body string (use raw bytes as UTF-8 string)\n * @param signature_header — value of the `SpeechWeave-Signature` header\n * @param tolerance_seconds — max clock skew; defaults to 300\n */\nexport function verifyWebhook(\n\tsecret : string | string[],\n\traw_body : string,\n\tsignature_header : string,\n\ttolerance_seconds = 300,\n) : VerifyWebhookResult {\n\n\tconst secrets = ( Array.isArray( secret ) ? secret : [\n\t\tsecret, \n\t] )\n\t\t.map( s => String( s || \"\" ).trim() )\n\t\t.filter( Boolean );\n\tif ( ! secrets.length ) {\n\n\t\treturn {\n\t\t\tok: false,\n\t\t\treason: \"no_secrets\",\n\t\t};\n\t\n\t}\n\n\tconst header = String( signature_header || \"\" ).trim();\n\tconst parts = header.split( \",\" ).map( p => p.trim() );\n\tlet t : string | null = null;\n\tconst v1_list : string[] = [\n\t];\n\tfor ( const part of parts ) {\n\n\t\tif ( part.startsWith( \"t=\" ) ) {\n\n\t\t\tt = part.slice( 2 );\n\t\t\n\t\t}\n\n\t\tif ( part.startsWith( \"v1=\" ) ) {\n\n\t\t\tv1_list.push( part.slice( 3 ) );\n\t\t\n\t\t}\n\t\n\t}\n\tif (\n\t\t! t\n\t\t|| ! v1_list.length\n\t) {\n\n\t\treturn {\n\t\t\tok: false,\n\t\t\treason: \"missing_t_or_v1\",\n\t\t};\n\t\n\t}\n\tconst ts = Number( t );\n\tif ( ! Number.isFinite( ts ) ) {\n\n\t\treturn {\n\t\t\tok: false,\n\t\t\treason: \"bad_timestamp\",\n\t\t};\n\t\n\t}\n\tconst now = Math.floor( Date.now() / 1000 );\n\tif ( Math.abs( now - ts ) > tolerance_seconds ) {\n\n\t\treturn {\n\t\t\tok: false,\n\t\t\treason: \"timestamp_skew\",\n\t\t};\n\t\n\t}\n\n\tfor ( const secret of secrets ) {\n\n\t\tconst expected = crypto.createHmac( \"sha256\", secret ).update( `${ t }.${ raw_body }` ).digest( \"hex\" );\n\t\tfor ( const v1 of v1_list ) {\n\n\t\t\tif ( timingSafeEqual( expected, v1 ) ) {\n\n\t\t\t\treturn {\n\t\t\t\t\tok: true,\n\t\t\t\t};\n\t\t\t\n\t\t\t}\n\t\t\n\t\t}\n\t\n\t}\n\n\treturn {\n\t\tok: false,\n\t\treason: \"bad_signature\",\n\t};\n\n}\n","/**\n * OpenAI-shaped transcription helpers.\n * For OpenAI migration, prefer the official `openai` package with `baseURL` set to SpeechWeave.\n */\nimport type { SpeechWeaveClient } from \"../client.js\";\nimport {\n\tfinishCompatJob,\n\tshapeOpenAiResponse,\n\tuploadAndCreateJob,\n\ttype UploadBody,\n} from \"../compat_shapes.js\";\n\nexport interface OpenAiTranscriptionCreateOptions {\n\tfile : UploadBody;\n\tfilename ?: string;\n\tmodel ?: string;\n\tlanguage ?: string;\n\t// Explicit Content-Length when the body cannot be measured.\n\tfile_size ?: number;\n\t// When false, return the created job without polling (default true).\n\twait ?: boolean;\n}\n\nexport function createOpenAiAudioNamespace(\n\tclient : SpeechWeaveClient,\n) {\n\n\treturn {\n\t\ttranscriptions: {\n\t\t\t/** OpenAI-shaped transcription create — drop-in compatibility wrapper. */\n\t\t\tcreate: async ( opts : OpenAiTranscriptionCreateOptions ) => {\n\n\t\t\t\tconst name = opts.filename || \"audio.bin\";\n\t\t\t\tconst job = await uploadAndCreateJob( client, {\n\t\t\t\t\tdata: opts.file,\n\t\t\t\t\tfilename: name,\n\t\t\t\t\tmodel: opts.model,\n\t\t\t\t\tlanguage: opts.language,\n\t\t\t\t\tfile_size: opts.file_size,\n\t\t\t\t} );\n\t\t\t\tconst finished = await finishCompatJob( client, job, {\n\t\t\t\t\twait: opts.wait ?? true,\n\t\t\t\t\terror_code: \"OPENAI_PROXY\",\n\t\t\t\t} );\n\t\t\t\tif ( opts.wait === false ) {\n\n\t\t\t\t\treturn finished;\n\t\t\t\t\n\t\t\t\t}\n\n\t\t\t\treturn shapeOpenAiResponse( finished as Record<string, unknown> );\n\t\t\t\n\t\t\t},\n\t\t},\n\t};\n\n}\n","/**\n * Deepgram-shaped listen helpers.\n * Prefer the official Deepgram SDK with SpeechWeave base URL when migrating.\n */\nimport type { ReadStream } from \"node:fs\";\nimport type { SpeechWeaveClient } from \"../client.js\";\nimport {\n\tcreateJobFromUrl,\n\tfinishCompatJob,\n\tshapeDeepgramResponse,\n\tuploadAndCreateJob,\n\ttype UploadBody,\n} from \"../compat_shapes.js\";\n\nexport interface DeepgramTranscribeFileOptions {\n\tmodel ?: string;\n\tfilename ?: string;\n\tlanguage ?: string;\n\t// Explicit Content-Length when the body cannot be measured\n\tfile_size ?: number;\n\t// When false, return the created job without polling (default true).\n\twait ?: boolean;\n}\n\nexport interface DeepgramTranscribeUrlOptions {\n\tmodel ?: string;\n\tlanguage ?: string;\n\t// When false, return the created job without polling (default true).\n\twait ?: boolean;\n}\n\nexport function createDeepgramListenNamespace(\n\tclient : SpeechWeaveClient,\n) {\n\n\treturn {\n\t\tprerecorded: {\n\t\t\t/** Deepgram-shaped prerecorded file transcription — drop-in compatibility wrapper. */\n\t\t\ttranscribeFile: async (\n\t\t\t\tstream : UploadBody | ReadStream,\n\t\t\t\toptions : DeepgramTranscribeFileOptions = {},\n\t\t\t) => {\n\n\t\t\t\tconst job = await uploadAndCreateJob( client, {\n\t\t\t\t\tdata: stream,\n\t\t\t\t\tfilename: options.filename || \"audio.bin\",\n\t\t\t\t\tmodel: options.model,\n\t\t\t\t\tlanguage: options.language,\n\t\t\t\t\tfile_size: options.file_size,\n\t\t\t\t} );\n\t\t\t\tconst finished = await finishCompatJob( client, job, {\n\t\t\t\t\twait: options.wait ?? true,\n\t\t\t\t\terror_code: \"DEEPGRAM_PROXY\",\n\t\t\t\t} );\n\t\t\t\tif ( options.wait === false ) {\n\n\t\t\t\t\treturn finished;\n\t\t\t\t\n\t\t\t\t}\n\n\t\t\t\treturn shapeDeepgramResponse(\n\t\t\t\t\tfinished as Record<string, unknown>,\n\t\t\t\t\t{ model: options.model },\n\t\t\t\t);\n\t\t\t\n\t\t\t},\n\t\t\t/** Deepgram-shaped prerecorded URL transcription — drop-in compatibility wrapper. */\n\t\t\ttranscribeUrl: async (\n\t\t\t\turl : string,\n\t\t\t\toptions : DeepgramTranscribeUrlOptions = {},\n\t\t\t) => {\n\n\t\t\t\tconst job = await createJobFromUrl( client, {\n\t\t\t\t\turl,\n\t\t\t\t\tmodel: options.model,\n\t\t\t\t\tlanguage: options.language,\n\t\t\t\t} );\n\t\t\t\tconst finished = await finishCompatJob( client, job, {\n\t\t\t\t\twait: options.wait ?? true,\n\t\t\t\t\terror_code: \"DEEPGRAM_PROXY\",\n\t\t\t\t} );\n\t\t\t\tif ( options.wait === false ) {\n\n\t\t\t\t\treturn finished;\n\t\t\t\t\n\t\t\t\t}\n\n\t\t\t\treturn shapeDeepgramResponse(\n\t\t\t\t\tfinished as Record<string, unknown>,\n\t\t\t\t\t{ model: options.model },\n\t\t\t\t);\n\t\t\t\n\t\t\t},\n\t\t},\n\t};\n\n}\n","/**\n * AssemblyAI-shaped transcripts helpers.\n * Prefer the official AssemblyAI SDK with SpeechWeave when migrating.\n */\nimport type { ReadStream } from \"node:fs\";\nimport type { SpeechWeaveClient } from \"../client.js\";\nimport {\n\tcreateJobFromUrl,\n\tfinishCompatJob,\n\tshapeAssemblyResponse,\n\tuploadAndCreateJob,\n\ttype UploadBody,\n} from \"../compat_shapes.js\";\n\nexport interface AssemblyTranscribeConfig {\n\tmodel ?: string;\n\tlanguage ?: string;\n\t// Explicit Content-Length when the body cannot be measured\n\tfile_size ?: number;\n}\n\nexport function createAssemblyTranscriptsNamespace(\n\tclient : SpeechWeaveClient,\n) {\n\n\treturn {\n\t\t/** AssemblyAI-shaped transcription — drop-in compatibility wrapper. Pass a URL string or binary/file body. */\n\t\ttranscribe: async (\n\t\t\taudio : string | UploadBody | ReadStream,\n\t\t\tconfig ?: AssemblyTranscribeConfig,\n\t\t\toptions : { wait ?: boolean } = {},\n\t\t) => {\n\n\t\t\tconst cfg = config || {};\n\t\t\tconst wait = options.wait ?? true;\n\n\t\t\tlet job;\n\t\t\tif ( typeof audio === \"string\" ) {\n\n\t\t\t\tjob = await createJobFromUrl( client, {\n\t\t\t\t\turl: audio,\n\t\t\t\t\tmodel: cfg.model,\n\t\t\t\t\tlanguage: cfg.language,\n\t\t\t\t} );\n\t\t\t\n\t\t\t}\n\t\t\telse {\n\n\t\t\t\tjob = await uploadAndCreateJob( client, {\n\t\t\t\t\tdata: audio,\n\t\t\t\t\tfilename: \"audio.bin\",\n\t\t\t\t\tmodel: cfg.model,\n\t\t\t\t\tlanguage: cfg.language,\n\t\t\t\t\tfile_size: cfg.file_size,\n\t\t\t\t} );\n\t\t\t\n\t\t\t}\n\n\t\t\tconst finished = await finishCompatJob( client, job, {\n\t\t\t\twait,\n\t\t\t\terror_code: \"ASSEMBLY_PROXY\",\n\t\t\t} );\n\t\t\tif ( ! wait ) {\n\n\t\t\t\treturn finished;\n\t\t\t\n\t\t\t}\n\n\t\t\treturn shapeAssemblyResponse( finished as Record<string, unknown> );\n\t\t\n\t\t},\n\t};\n\n}\n"],"mappings":"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","names":["crypto","secret"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/client.ts","../src/errors.ts","../src/polling.ts","../src/version.ts","../src/compat_shapes.ts","../src/webhooks.ts","../src/openai/openai_compat.ts","../src/deepgram/deepgram_compat.ts","../src/assembly/assembly_compat.ts"],"sourcesContent":["export { SpeechWeaveClient } from \"./client.js\";\nexport { SpeechWeaveError } from \"./errors.js\";\nexport { waitForJob } from \"./polling.js\";\nexport type { WaitForJobOptions } from \"./polling.js\";\nexport {\n\tcreateJobFromUrl,\n\tfinishCompatJob,\n\tshapeAssemblyResponse,\n\tshapeDeepgramResponse,\n\tshapeOpenAiResponse,\n\tuploadAndCreateJob,\n} from \"./compat_shapes.js\";\nexport type {\n\tCreateJobResponse,\n\tListJobsResponse,\n\tPresignResponse,\n\tPublicJobStatus,\n\tServiceMode,\n\tSpeechWeaveClientOptions,\n\tV1Job,\n} from \"./types.js\";\nexport { VERSION } from \"./version.js\";\nexport { verifyWebhook } from \"./webhooks.js\";\nexport type { VerifyWebhookResult } from \"./webhooks.js\";\n\nimport { SpeechWeaveClient } from \"./client.js\";\nimport { createOpenAiAudioNamespace } from \"./openai/openai_compat.js\";\nimport { createDeepgramListenNamespace } from \"./deepgram/deepgram_compat.js\";\nimport { createAssemblyTranscriptsNamespace } from \"./assembly/assembly_compat.js\";\nimport type { ServiceMode, SpeechWeaveClientOptions } from \"./types.js\";\n\nfunction createJobsNamespace(\n\tclient : SpeechWeaveClient,\n) {\n\n\treturn {\n\t\t/**\n\t\t * Create a job from a local file or a remote URL / object_key.\n\t\t * Pass `file` (path, Buffer, Blob, or stream) to presign-upload then create.\n\t\t * Otherwise pass one of `object_key`, `input_url`, or `audio_url` (no upload).\n\t\t * Omitting service_mode leaves the API default (deferred).\n\t\t */\n\t\tcreate: async ( params : {\n\t\t\tfile ?: string | Buffer | Blob | import( \"node:fs\" ).ReadStream;\n\t\t\tfilename ?: string;\n\t\t\tcontent_type ?: string;\n\t\t\tobject_key ?: string;\n\t\t\tinput_url ?: string;\n\t\t\taudio_url ?: string;\n\t\t\tmodel ?: string;\n\t\t\tservice_mode ?: ServiceMode;\n\t\t\tlanguage ?: string;\n\t\t\ttype ?: string;\n\t\t\tmetadata ?: Record<string, unknown>;\n\t\t\tfile_size ?: number;\n\t\t} ) => {\n\n\t\t\tif ( params.file != null ) {\n\n\t\t\t\tif ( typeof params.file === \"string\" ) {\n\n\t\t\t\t\treturn client.transcribeFilePath(\n\t\t\t\t\t\tparams.file,\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tmodel: params.model,\n\t\t\t\t\t\t\tservice_mode: params.service_mode,\n\t\t\t\t\t\t\tlanguage: params.language,\n\t\t\t\t\t\t\tcontent_type: params.content_type,\n\t\t\t\t\t\t\tmetadata: params.metadata,\n\t\t\t\t\t\t\tfile_size: params.file_size,\n\t\t\t\t\t\t},\n\t\t\t\t\t);\n\t\t\t\t\n\t\t\t\t}\n\n\t\t\t\treturn client.transcribeFile(\n\t\t\t\t\tparams.file,\n\t\t\t\t\t{\n\t\t\t\t\t\tfilename: params.filename,\n\t\t\t\t\t\tcontent_type: params.content_type,\n\t\t\t\t\t\tmodel: params.model,\n\t\t\t\t\t\tservice_mode: params.service_mode,\n\t\t\t\t\t\tlanguage: params.language,\n\t\t\t\t\t\tmetadata: params.metadata,\n\t\t\t\t\t\tfile_size: params.file_size,\n\t\t\t\t\t},\n\t\t\t\t);\n\t\t\t\n\t\t\t}\n\n\t\t\treturn client.createJob( {\n\t\t\t\tobject_key: params.object_key,\n\t\t\t\tinput_url: params.input_url,\n\t\t\t\taudio_url: params.audio_url,\n\t\t\t\tmodel: params.model,\n\t\t\t\tservice_mode: params.service_mode,\n\t\t\t\tlanguage: params.language,\n\t\t\t\ttype: params.type,\n\t\t\t\tmetadata: params.metadata,\n\t\t\t} );\n\t\t\n\t\t},\n\t\t/** Fetch the current job record. */\n\t\tget: client.getJob.bind( client ),\n\t\t/** List jobs for the authenticated account. */\n\t\tlist: client.listJobs.bind( client ),\n\t\t/**\n\t\t * Cancel a pending or processing job.\n\t\t * Fails if the job is already completed, failed, or cancelled.\n\t\t */\n\t\tcancel: client.cancelJob.bind( client ),\n\t};\n\n}\n\nexport class SpeechWeave extends SpeechWeaveClient {\n\n\treadonly audio : ReturnType<typeof createOpenAiAudioNamespace>;\n\treadonly listen : ReturnType<typeof createDeepgramListenNamespace>;\n\treadonly transcripts : ReturnType<typeof createAssemblyTranscriptsNamespace>;\n\treadonly jobs : ReturnType<typeof createJobsNamespace>;\n\n\tconstructor( options : SpeechWeaveClientOptions = {} ) {\n\n\t\tsuper( options );\n\t\tthis.audio = createOpenAiAudioNamespace( this );\n\t\tthis.listen = createDeepgramListenNamespace( this );\n\t\tthis.transcripts = createAssemblyTranscriptsNamespace( this );\n\t\tthis.jobs = createJobsNamespace( this );\n\t\n\t}\n\n}\n","import { createReadStream } from \"node:fs\";\nimport type { ReadStream } from \"node:fs\";\nimport { stat } from \"node:fs/promises\";\nimport { SpeechWeaveError } from \"./errors.js\";\nimport { waitForJob } from \"./polling.js\";\nimport type {\n\tCreateJobResponse,\n\tCancelJobResponse,\n\tListJobsResponse,\n\tPresignResponse,\n\tServiceMode,\n\tSpeechWeaveClientOptions,\n\tV1Job,\n} from \"./types.js\";\nimport { VERSION } from \"./version.js\";\n\nfunction normalizeBaseURL(\n\turl : string,\n) : string {\n\n\tconst s = String( url || \"\" ).trim().replace( /\\/+$/, \"\" );\n\n\treturn s || \"https://api.speechweave.com/v1\";\n\n}\n\nasync function readErrorMessage(\n\tresponse : Response,\n) : Promise<string> {\n\n\tconst content_type = response.headers.get( \"content-type\" ) || \"\";\n\ttry {\n\n\t\tif ( content_type.includes( \"application/json\" ) ) {\n\n\t\t\tconst json = ( await response.json() ) as { error ?: string;\n\t\t\t\tmessage ?: string; };\n\n\t\t\treturn String( json?.error || json?.message || response.statusText );\n\t\t\n\t\t}\n\t\tconst text = await response.text();\n\n\t\treturn text.slice( 0, 500 ) || response.statusText;\n\t\n\t}\n\tcatch {\n\n\t\treturn response.statusText;\n\t\n\t}\n\n}\n\nasync function getBodyLength(\n\tbody : Buffer | ReadStream | Blob,\n\tfile_size ?: number,\n) : Promise<number | undefined> {\n\n\tif ( file_size != null && Number.isFinite( file_size ) && file_size >= 0 ) {\n\n\t\treturn file_size;\n\t\n\t}\n\tif ( Buffer.isBuffer( body ) ) {\n\n\t\treturn body.byteLength;\n\t\n\t}\n\tif ( body instanceof Blob ) {\n\n\t\treturn body.size;\n\t\n\t}\n\n\tconst path_like : unknown = ( body as ReadStream & { path ?: unknown } ).path;\n\tif (\n\t\ttypeof path_like === \"string\"\n\t\t|| Buffer.isBuffer( path_like )\n\t\t|| path_like instanceof URL\n\t) {\n\n\t\ttry {\n\n\t\t\treturn ( await stat( path_like ) ).size;\n\t\t\n\t\t}\n\t\tcatch {\n\n\t\t\treturn undefined;\n\t\t\n\t\t}\n\t\n\t}\n\n\treturn undefined;\n\n}\n\n/** Low-level SpeechWeave `/v1` client (presign, jobs, uploads). */\nexport class SpeechWeaveClient {\n\n\tprotected readonly api_key : string;\n\tprotected readonly base_url : string;\n\tprotected readonly fetch_func : typeof fetch;\n\n\t/**\n\t * @param options.api_key - Falls back to SPEECHWEAVE_API_KEY. Throws if neither is set.\n\t * @param options.base_url - Defaults to https://api.speechweave.com/v1.\n\t */\n\tconstructor(\n\t\toptions : SpeechWeaveClientOptions = {},\n\t) {\n\n\t\tthis.api_key = (\n\t\t\toptions.api_key\n\t\t\t|| (\n\t\t\t\ttypeof process !== \"undefined\"\n\t\t\t\t&& process.env?.SPEECHWEAVE_API_KEY\n\t\t\t)\n\t\t\t|| \"\"\n\t\t);\n\t\tthis.base_url = normalizeBaseURL(\n\t\t\toptions.base_url || \"https://api.speechweave.com/v1\",\n\t\t);\n\t\tthis.fetch_func = options.fetch_func || fetch;\n\t\tif ( ! this.api_key ) {\n\n\t\t\tthrow new Error( \"SpeechWeave API key is required (api_key, or SPEECHWEAVE_API_KEY)\" );\n\t\t\n\t\t}\n\t\n\t}\n\n\t/**\n\t * Authenticated fetch against base_url.\n\t * Adds Bearer and User-Agent when missing. Path is relative (leading `/` optional).\n\t */\n\tasync rawFetch(\n\t\tpath : string,\n\t\tinit : RequestInit = {},\n\t) : Promise<Response> {\n\n\t\tconst formatted_path = path.startsWith( \"/\" ) ? path : `/${ path }`;\n\t\tconst url = `${ this.base_url }${ formatted_path }`;\n\t\tconst h = new Headers( init.headers );\n\t\tif ( ! h.has( \"Authorization\" ) ) {\n\n\t\t\th.set( \"Authorization\", `Bearer ${ this.api_key }` );\n\t\t\n\t\t}\n\t\tif ( ! h.has( \"User-Agent\" ) ) {\n\n\t\t\th.set( \"User-Agent\", `speechweave-node/${ VERSION }` );\n\t\t\n\t\t}\n\n\t\treturn this.fetch_func( url, { ...init,\n\t\t\theaders: h } );\n\t\n\t}\n\n\tprotected async requestJson<T>(\n\t\tmethod : string,\n\t\tpath : string,\n\t\tjson ?: unknown,\n\t\tparams ?: Record<string, string | number | boolean | undefined | null>,\n\t) : Promise<T> {\n\n\t\tlet request_path = path;\n\t\tif ( params ) {\n\n\t\t\tconst search = new URLSearchParams();\n\t\t\tfor ( const [\n\t\t\t\tkey,\n\t\t\t\tvalue, \n\t\t\t] of Object.entries( params ) ) {\n\n\t\t\t\tif ( value === undefined || value === null ) {\n\n\t\t\t\t\tcontinue;\n\t\t\t\t\n\t\t\t\t}\n\t\t\t\tsearch.set( key, String( value ) );\n\t\t\t\n\t\t\t}\n\t\t\tconst qs = search.toString();\n\t\t\tif ( qs ) {\n\n\t\t\t\trequest_path = `${ path }${ path.includes( \"?\" ) ? \"&\" : \"?\" }${ qs }`;\n\t\t\t\n\t\t\t}\n\t\t\n\t\t}\n\n\t\tconst headers : HeadersInit = { Accept: \"application/json\" };\n\t\tlet body : string | undefined;\n\t\tif ( json !== undefined ) {\n\n\t\t\t( headers as Record<string, string> )[ \"Content-Type\" ] = \"application/json\";\n\t\t\tbody = JSON.stringify( json );\n\t\t\n\t\t}\n\n\t\tconst response = await this.rawFetch( request_path, { method,\n\t\t\theaders,\n\t\t\tbody } );\n\t\tif ( ! response.ok ) {\n\n\t\t\tconst ct = response.headers.get( \"content-type\" ) || \"\";\n\t\t\tlet err_body : unknown;\n\t\t\tlet message : string;\n\t\t\tlet code : string | undefined = String( response.status );\n\t\t\tlet retry_after : number | undefined;\n\t\t\tconst header_retry = response.headers.get( \"Retry-After\" );\n\t\t\tif ( header_retry ) {\n\n\t\t\t\tconst n = parseInt( header_retry, 10 );\n\t\t\t\tif ( Number.isFinite( n ) ) {\n\n\t\t\t\t\tretry_after = n;\n\t\t\t\t\n\t\t\t\t}\n\t\t\t\n\t\t\t}\n\t\t\ttry {\n\n\t\t\t\tif ( ct.includes( \"application/json\" ) ) {\n\n\t\t\t\t\terr_body = await response.json();\n\t\t\t\t\tconst j = err_body as {\n\t\t\t\t\t\terror ?: string;\n\t\t\t\t\t\tmessage ?: string;\n\t\t\t\t\t\tcode ?: string;\n\t\t\t\t\t\tretry_after ?: number;\n\t\t\t\t\t};\n\t\t\t\t\tmessage = String( j?.error || j?.message || response.statusText );\n\t\t\t\t\tif ( j?.code ) {\n\n\t\t\t\t\t\tcode = j.code;\n\t\t\t\t\t\n\t\t\t\t\t}\n\t\t\t\t\tif ( typeof j?.retry_after === \"number\" ) {\n\n\t\t\t\t\t\tretry_after = j.retry_after;\n\t\t\t\t\t\n\t\t\t\t\t}\n\t\t\t\t\n\t\t\t\t}\n\t\t\t\telse {\n\n\t\t\t\t\tconst t = await response.text();\n\t\t\t\t\tmessage = t.slice( 0, 500 ) || response.statusText;\n\t\t\t\t\n\t\t\t\t}\n\t\t\t\n\t\t\t}\n\t\t\tcatch {\n\n\t\t\t\tmessage = response.statusText;\n\t\t\t\n\t\t\t}\n\n\t\t\tthrow new SpeechWeaveError(\n\t\t\t\tmessage,\n\t\t\t\tresponse.status,\n\t\t\t\tcode,\n\t\t\t\terr_body,\n\t\t\t\tretry_after,\n\t\t\t);\n\t\t\n\t\t}\n\n\t\treturn ( await response.json() ) as T;\n\t\n\t}\n\n\t/**\n\t * Request a short-lived PUT URL and object_key for direct upload to storage.\n\t *\n\t * @param params.filename - Original name (used in the storage key).\n\t * @param params.content_type - MIME type that must match the subsequent PUT.\n\t */\n\tasync presignUpload(\n\t\tparams : {\n\t\t\tfilename : string;\n\t\t\tcontent_type : string;\n\t\t},\n\t) : Promise<PresignResponse> {\n\n\t\treturn this.requestJson<PresignResponse>(\n\t\t\t\"POST\",\n\t\t\t\"/uploads\",\n\t\t\t{\n\t\t\t\tfilename: params.filename,\n\t\t\t\tcontent_type: params.content_type,\n\t\t\t},\n\t\t);\n\t\n\t}\n\n\t/**\n\t * PUT audio bytes to a presigned upload_url.\n\t * Sets Content-Length when the body can be measured; pass file_size for pipes/live streams.\n\t *\n\t * @param uploadUrl - upload_url from presignUpload.\n\t */\n\tasync putToPresignedUrl(\n\t\tuploadUrl : string,\n\t\tbody : Buffer | ReadStream | Blob,\n\t\tcontentType : string,\n\t\toptions : { file_size ?: number } = {},\n\t) : Promise<void> {\n\n\t\tconst headers = new Headers( { \"Content-Type\": contentType } );\n\t\tconst content_length = await getBodyLength( body, options.file_size );\n\t\tif ( content_length != null ) {\n\n\t\t\theaders.set( \"Content-Length\", String( content_length ) );\n\t\t\n\t\t}\n\n\t\tconst init : RequestInit & { duplex ?: string } = {\n\t\t\tmethod: \"PUT\",\n\t\t\theaders,\n\t\t\tbody: body as BodyInit,\n\t\t};\n\t\tconst is_node_stream = body && typeof ( body as ReadStream ).pipe === \"function\";\n\t\tif ( is_node_stream ) {\n\n\t\t\tinit.duplex = \"half\";\n\t\t\n\t\t}\n\t\tconst response = await this.fetch_func( uploadUrl, init );\n\t\tif ( ! response.ok ) {\n\n\t\t\tconst message = await readErrorMessage( response );\n\t\t\tthrow new SpeechWeaveError(\n\t\t\t\t`R2 upload failed: ${ message }`,\n\t\t\t\tresponse.status,\n\t\t\t\t\"UPLOAD_FAILED\",\n\t\t\t);\n\t\t\n\t\t}\n\t\n\t}\n\n\t/**\n\t * Presign → PUT → create job. Returns the create ack (no transcript); poll getJob or waitForJob.\n\t * Omitting service_mode leaves the API default (deferred). Synchronous rejects files over the sync size cap (default 512 MiB).\n\t *\n\t * @param options.filename - Defaults to audio.bin.\n\t * @param options.content_type - Defaults to application/octet-stream.\n\t * @param options.language - Two-letter ISO code (e.g. 'en', 'es').\n\t * @param options.file_size - Content-Length when the body cannot be measured (pipes, live streams).\n\t */\n\tasync transcribeFile(\n\t\tfile : ReadStream | Buffer | Blob,\n\t\toptions : {\n\t\t\tfilename ?: string;\n\t\t\tcontent_type ?: string;\n\t\t\tmodel ?: string;\n\t\t\tservice_mode ?: ServiceMode;\n\t\t\tlanguage ?: string;\n\t\t\tmetadata ?: Record<string, unknown>;\n\t\t\tfile_size ?: number;\n\t\t} = {},\n\t) : Promise<CreateJobResponse> {\n\n\t\tconst filename = options.filename || \"audio.bin\";\n\t\tconst content_type = options.content_type || \"application/octet-stream\";\n\t\tconst presign = await this.presignUpload( {\n\t\t\tfilename,\n\t\t\tcontent_type,\n\t\t} );\n\t\tconst put_opts = { file_size: options.file_size };\n\n\t\tif ( Buffer.isBuffer( file ) || file instanceof Blob ) {\n\n\t\t\tawait this.putToPresignedUrl( presign.upload_url, file, content_type, put_opts );\n\t\t\n\t\t}\n\t\telse {\n\n\t\t\tawait this.putToPresignedUrl(\n\t\t\t\tpresign.upload_url,\n\t\t\t\tfile as ReadStream,\n\t\t\t\tcontent_type,\n\t\t\t\tput_opts,\n\t\t\t);\n\t\t\n\t\t}\n\n\t\treturn this.createJob( {\n\t\t\tobject_key: presign.object_key,\n\t\t\tmodel: options.model,\n\t\t\tservice_mode: options.service_mode,\n\t\t\tlanguage: options.language,\n\t\t\tmetadata: options.metadata,\n\t\t} );\n\t\n\t}\n\n\t/**\n\t * Same as {@link transcribeFile}, then poll until completed, failed, or cancelled.\n\t *\n\t * @param options.wait_timeout_ms - Defaults to SPEECHWEAVE_JOB_WAIT_MS or 300_000.\n\t * @param options.poll_ms - Poll interval; defaults to 1500.\n\t */\n\tasync transcribeFileBlocking(\n\t\tfile : ReadStream | Buffer | Blob,\n\t\toptions : {\n\t\t\tfilename ?: string;\n\t\t\tcontent_type ?: string;\n\t\t\tmodel ?: string;\n\t\t\tservice_mode ?: ServiceMode;\n\t\t\tlanguage ?: string;\n\t\t\tmetadata ?: Record<string, unknown>;\n\t\t\tfile_size ?: number;\n\t\t\twait_timeout_ms ?: number;\n\t\t\tpoll_ms ?: number;\n\t\t} = {},\n\t) : Promise<V1Job> {\n\n\t\tconst created = await this.transcribeFile( file, options );\n\n\t\treturn waitForJob(\n\t\t\tthis,\n\t\t\tcreated.id,\n\t\t\t{\n\t\t\t\ttimeout_ms: options.wait_timeout_ms ?? Number( process.env?.SPEECHWEAVE_JOB_WAIT_MS || 300_000 ),\n\t\t\t\tpoll_ms: options.poll_ms ?? 1_500,\n\t\t\t},\n\t\t);\n\t\n\t}\n\n\t/**\n\t * Create a transcription job from an already-uploaded object or a remote URL.\n\t * Provide exactly one of object_key, input_url, or audio_url. type defaults to transcription.\n\t * Omitting service_mode leaves the API default (deferred).\n\t *\n\t * @param params.object_key - From PresignResponse after a successful PUT.\n\t * @param params.input_url - Publicly reachable audio URL.\n\t * @param params.audio_url - Alias for input_url.\n\t * @param params.language - Two-letter ISO code (e.g. 'en', 'es').\n\t */\n\tasync createJob(\n\t\tparams : {\n\t\t\tobject_key ?: string;\n\t\t\tinput_url ?: string;\n\t\t\taudio_url ?: string;\n\t\t\tmodel ?: string;\n\t\t\tservice_mode ?: ServiceMode;\n\t\t\tlanguage ?: string;\n\t\t\ttype ?: string;\n\t\t\tmetadata ?: Record<string, unknown>;\n\t\t},\n\t) : Promise<CreateJobResponse> {\n\n\t\tconst payload : Record<string, unknown> = {\n\t\t\ttype: params.type || \"transcription\",\n\t\t};\n\t\tif ( params.object_key != null ) {\n\n\t\t\tpayload.object_key = params.object_key;\n\t\t\n\t\t}\n\t\tif ( params.input_url != null ) {\n\n\t\t\tpayload.input_url = params.input_url;\n\t\t\n\t\t}\n\t\tif ( params.audio_url != null ) {\n\n\t\t\tpayload.audio_url = params.audio_url;\n\t\t\n\t\t}\n\t\tif ( params.model != null ) {\n\n\t\t\tpayload.model = params.model;\n\t\t\n\t\t}\n\t\tif ( params.service_mode != null ) {\n\n\t\t\tpayload.service_mode = params.service_mode;\n\t\t\n\t\t}\n\t\tif ( params.language != null ) {\n\n\t\t\tpayload.language = params.language;\n\t\t\n\t\t}\n\t\tif ( params.metadata != null ) {\n\n\t\t\tpayload.metadata = params.metadata;\n\t\t\n\t\t}\n\n\t\treturn this.requestJson<CreateJobResponse>( \"POST\", \"/jobs\", payload );\n\t\n\t}\n\n\t/**\n\t * Fetch the current job record (status, transcript when completed, error when failed).\n\t *\n\t * @param job_id - Id from createJob / transcribeFile.\n\t */\n\tasync getJob(\n\t\tjob_id : string,\n\t) : Promise<V1Job> {\n\n\t\treturn this.requestJson<V1Job>(\n\t\t\t\"GET\",\n\t\t\t`/jobs/${ encodeURIComponent( job_id ) }`,\n\t\t);\n\t\n\t}\n\n\t/**\n\t * List jobs for the authenticated account.\n\t *\n\t * @param params.status - Filter by PublicJobStatus value.\n\t * @param params.page - 1-based page; API default if omitted.\n\t * @param params.limit - Page size; API default if omitted.\n\t */\n\tasync listJobs(\n\t\tparams : {\n\t\t\tpage ?: number;\n\t\t\tlimit ?: number;\n\t\t\tstatus ?: string;\n\t\t} = {},\n\t) : Promise<ListJobsResponse> {\n\n\t\treturn this.requestJson<ListJobsResponse>(\n\t\t\t\"GET\",\n\t\t\t\"/jobs\",\n\t\t\tundefined,\n\t\t\t{\n\t\t\t\tpage: params.page,\n\t\t\t\tlimit: params.limit,\n\t\t\t\tstatus: params.status,\n\t\t\t},\n\t\t);\n\t\n\t}\n\n\t/**\n\t * Cancel a pending or processing job.\n\t * Fails if the job is already completed, failed, or cancelled.\n\t *\n\t * @param job_id - Id from createJob / transcribeFile.\n\t */\n\tasync cancelJob(\n\t\tjob_id : string,\n\t) : Promise<CancelJobResponse> {\n\n\t\treturn this.requestJson(\n\t\t\t\"POST\",\n\t\t\t`/jobs/${ encodeURIComponent( job_id ) }/cancel`,\n\t\t\t{},\n\t\t);\n\t\n\t}\n\n\t/**\n\t * Open a disk path and run {@link transcribeFile}.\n\t * filename is taken from the path basename.\n\t *\n\t * @param file_path - Absolute or relative path on the local filesystem.\n\t */\n\tasync transcribeFilePath(\n\t\tfile_path : string,\n\t\toptions : {\n\t\t\tmodel ?: string;\n\t\t\tservice_mode ?: ServiceMode;\n\t\t\tlanguage ?: string;\n\t\t\tcontent_type ?: string;\n\t\t\tmetadata ?: Record<string, unknown>;\n\t\t\tfile_size ?: number;\n\t\t} = {},\n\t) : Promise<CreateJobResponse> {\n\n\t\tconst stream = createReadStream( file_path );\n\t\tconst base = file_path.split( /[/\\\\]/ ).pop() || \"audio.bin\";\n\n\t\treturn this.transcribeFile(\n\t\t\tstream,\n\t\t\t{\n\t\t\t\tfilename: base,\n\t\t\t\tcontent_type: options.content_type,\n\t\t\t\tmodel: options.model,\n\t\t\t\tservice_mode: options.service_mode,\n\t\t\t\tlanguage: options.language,\n\t\t\t\tmetadata: options.metadata,\n\t\t\t\tfile_size: options.file_size,\n\t\t\t},\n\t\t);\n\t\n\t}\n\n}\n","export class SpeechWeaveError extends Error {\n\n\treadonly status : number;\n\treadonly code ?: string;\n\treadonly body ?: unknown;\n\treadonly retry_after ?: number;\n\n\tconstructor(\n\t\tmessage : string,\n\t\tstatus = 500,\n\t\tcode ?: string,\n\t\tbody ?: unknown,\n\t\tretry_after ?: number,\n\t) {\n\n\t\tsuper( message );\n\n\t\tthis.name = \"SpeechWeaveError\";\n\t\tthis.status = status;\n\t\tthis.code = code;\n\t\tthis.body = body;\n\t\tthis.retry_after = retry_after;\n\t\n\t}\n\n}\n","import type { SpeechWeaveClient } from \"./client.js\";\nimport type { V1Job } from \"./types.js\";\nimport { SpeechWeaveError } from \"./errors.js\";\n\nconst TERMINAL = new Set( [\n\t\"completed\",\n\t\"failed\",\n\t\"cancelled\",\n] );\n\nexport interface WaitForJobOptions {\n\t/** Max wait in ms; defaults to 3_600_000. */\n\ttimeout_ms ?: number;\n\t/** Interval between getJob polls; defaults to 2000. */\n\tpoll_ms ?: number;\n}\n\n/**\n * Poll getJob until completed, failed, or cancelled.\n * Throws SpeechWeaveError with code JOB_WAIT_TIMEOUT on deadline.\n *\n * @param job_id - Id from createJob / transcribeFile.\n */\nexport async function waitForJob(\n\tclient : SpeechWeaveClient,\n\tjob_id : string,\n\topts : WaitForJobOptions = {},\n) : Promise< V1Job > {\n\n\tconst timeout_ms = opts.timeout_ms ?? 3_600_000;\n\tconst poll_ms = opts.poll_ms ?? 2_000;\n\tconst deadline = ( Date.now() + timeout_ms );\n\n\twhile ( Date.now() < deadline ) {\n\n\t\tconst job = await client.getJob( job_id );\n\t\tif ( TERMINAL.has( String( job.status ) ) ) {\n\n\t\t\treturn job;\n\t\t\n\t\t}\n\n\t\tawait new Promise( ( r ) => setTimeout( r, poll_ms ) );\n\t\n\t}\n\n\tthrow new SpeechWeaveError(\n\t\t\"Timed out waiting for job\",\n\t\t504,\n\t\t\"JOB_WAIT_TIMEOUT\",\n\t\t{ job_id },\n\t);\n\n}\n","export const VERSION = \"1.0.1\";\n","import type { ReadStream } from \"node:fs\";\nimport type { SpeechWeaveClient } from \"./client.js\";\nimport { SpeechWeaveError } from \"./errors.js\";\nimport { waitForJob } from \"./polling.js\";\nimport type { CreateJobResponse, ServiceMode, V1Job, UploadBodyResult } from \"./types.js\";\n\nexport type UploadBody = Buffer | Blob | ReadStream | Uint8Array;\n\nfunction jobText(\n\tjob : Record<string, unknown>,\n) : string {\n\n\tconst text = job.transcript;\n\n\treturn typeof text === \"string\" ? text : \"\";\n\n}\n\nfunction jobDuration(\n\tjob : Record<string, unknown>,\n) : number | undefined {\n\n\tconst duration = job.duration;\n\tif ( duration == null ) {\n\n\t\treturn undefined;\n\t\n\t}\n\tconst value = Number( duration );\n\tif ( ! Number.isFinite( value ) || value < 0 ) {\n\n\t\treturn undefined;\n\t\n\t}\n\n\treturn value;\n\n}\n\nfunction jobLanguage(\n\tjob : Record<string, unknown>,\n) : string | undefined {\n\n\tconst language = job.language;\n\tif ( language == null ) {\n\n\t\treturn undefined;\n\t\n\t}\n\tconst text = String( language ).trim().toLowerCase();\n\n\treturn text || undefined;\n\n}\n\nexport function shapeOpenAiResponse(\n\tjob : Record<string, unknown>,\n) : {\n\ttext : string;\n\ttask : \"transcribe\";\n\tduration ?: number;\n\tlanguage ?: string;\n} {\n\n\tconst response : {\n\t\ttext : string;\n\t\ttask : \"transcribe\";\n\t\tduration ?: number;\n\t\tlanguage ?: string;\n\t} = {\n\t\ttext: jobText( job ),\n\t\ttask: \"transcribe\",\n\t};\n\tconst duration = jobDuration( job );\n\tif ( duration !== undefined ) {\n\n\t\tresponse.duration = duration;\n\t\n\t}\n\tconst language = jobLanguage( job );\n\tif ( language !== undefined ) {\n\n\t\tresponse.language = language;\n\t\n\t}\n\n\treturn response;\n\n}\n\nexport function shapeDeepgramResponse(\n\tjob : Record<string, unknown>,\n\toptions : { model ?: string | null } = {},\n) : Record<string, unknown> {\n\n\tconst job_id = String( job.id || \"\" );\n\tconst model_name = options.model || String( job.model || \"core\" );\n\tconst text = jobText( job );\n\tconst language = jobLanguage( job );\n\n\tconst alternative : Record<string, unknown> = {\n\t\ttranscript: text,\n\t\tconfidence: 1,\n\t\twords: [\n\t\t],\n\t};\n\tif ( language !== undefined ) {\n\n\t\talternative.language = language;\n\t\n\t}\n\n\treturn {\n\t\tmetadata: {\n\t\t\trequest_id: job_id,\n\t\t\tmodel_info: {\n\t\t\t\tname: model_name,\n\t\t\t\tversion: \"1\",\n\t\t\t\tarch: \"speechweave\",\n\t\t\t},\n\t\t},\n\t\tresults: {\n\t\t\tchannels: [\n\t\t\t\t{\n\t\t\t\t\talternatives: [\n\t\t\t\t\t\talternative, \n\t\t\t\t\t],\n\t\t\t\t},\n\t\t\t],\n\t\t},\n\t};\n\n}\n\nexport function shapeAssemblyResponse(\n\tjob : Record<string, unknown>,\n) : Record<string, unknown> {\n\n\tconst status = String( job.status || \"unknown\" );\n\tconst pub_status = status === \"completed\" ? \"completed\" : status;\n\tconst duration = jobDuration( job );\n\tconst language = jobLanguage( job );\n\tconst error = job.error;\n\n\tconst response : Record<string, unknown> = {\n\t\tid: String( job.id || \"\" ),\n\t\tstatus: pub_status,\n\t\ttext: jobText( job ),\n\t};\n\tif ( duration !== undefined ) {\n\n\t\tresponse.audio_duration = duration;\n\t\n\t}\n\tif ( language !== undefined ) {\n\n\t\tresponse.language = language;\n\t\n\t}\n\tif ( error != null && pub_status === \"failed\" ) {\n\n\t\tresponse.error = String( error );\n\t\n\t}\n\telse {\n\n\t\tresponse.error = null;\n\t\n\t}\n\n\treturn response;\n\n}\n\nasync function toUploadBody(\n\tdata : UploadBody,\n) : Promise<UploadBodyResult> {\n\n\tif ( data instanceof Blob ) {\n\n\t\treturn {\n\t\t\tbody: data,\n\t\t\tcontent_type: data.type || \"application/octet-stream\",\n\t\t};\n\t\n\t}\n\tif ( Buffer.isBuffer( data ) || data instanceof Uint8Array ) {\n\n\t\tconst buf = Buffer.isBuffer( data ) ? data : Buffer.from( data );\n\n\t\treturn {\n\t\t\tbody: buf,\n\t\t\tcontent_type: \"application/octet-stream\",\n\t\t};\n\t\n\t}\n\n\t// Pass ReadStream through — putToPresignedUrl streams with duplex: \"half\".\n\treturn {\n\t\tbody: data,\n\t\tcontent_type: \"application/octet-stream\",\n\t};\n\n}\n\nexport async function uploadAndCreateJob(\n\tclient : SpeechWeaveClient,\n\tparams : {\n\t\tdata : UploadBody;\n\t\tfilename : string;\n\t\tcontent_type ?: string;\n\t\tmodel ?: string;\n\t\tlanguage ?: string;\n\t\tservice_mode ?: ServiceMode;\n\t\tmetadata ?: Record<string, unknown>;\n\t\tfile_size ?: number;\n\t},\n) : Promise<CreateJobResponse> {\n\n\tconst prepared = await toUploadBody( params.data );\n\tconst content_type = params.content_type || prepared.content_type;\n\tconst body = prepared.body;\n\n\tconst presign = await client.presignUpload( {\n\t\tfilename: params.filename,\n\t\tcontent_type,\n\t} );\n\tawait client.putToPresignedUrl(\n\t\tpresign.upload_url,\n\t\tbody as Buffer | Blob | ReadStream,\n\t\tcontent_type,\n\t\t{ file_size: params.file_size },\n\t);\n\n\treturn client.createJob( {\n\t\tobject_key: presign.object_key,\n\t\tmodel: params.model,\n\t\tlanguage: params.language,\n\t\tservice_mode: params.service_mode ?? \"synchronous\",\n\t\tmetadata: params.metadata,\n\t} );\n\n}\n\nexport async function createJobFromUrl(\n\tclient : SpeechWeaveClient,\n\tparams : {\n\t\turl : string;\n\t\tmodel ?: string;\n\t\tlanguage ?: string;\n\t\tservice_mode ?: ServiceMode;\n\t\tmetadata ?: Record<string, unknown>;\n\t},\n) : Promise<CreateJobResponse> {\n\n\treturn client.createJob( {\n\t\tinput_url: params.url,\n\t\tmodel: params.model,\n\t\tlanguage: params.language,\n\t\tservice_mode: params.service_mode ?? \"synchronous\",\n\t\tmetadata: params.metadata,\n\t} );\n\n}\n\nexport async function finishCompatJob(\n\tclient : SpeechWeaveClient,\n\tjob : CreateJobResponse | V1Job | Record<string, unknown>,\n\toptions : {\n\t\twait : boolean;\n\t\terror_code : string;\n\t\ttimeout_ms ?: number;\n\t\tpoll_ms ?: number;\n\t},\n) : Promise<V1Job | CreateJobResponse | Record<string, unknown>> {\n\n\tif ( ! options.wait ) {\n\n\t\treturn job;\n\t\n\t}\n\n\tconst finished = await waitForJob(\n\t\tclient,\n\t\tString( ( job as { id ?: string } ).id || \"\" ),\n\t\t{\n\t\t\ttimeout_ms: options.timeout_ms ?? 300_000,\n\t\t\tpoll_ms: options.poll_ms ?? 1_500,\n\t\t},\n\t);\n\n\tif ( String( finished.status ) === \"failed\" ) {\n\n\t\tthrow new SpeechWeaveError(\n\t\t\tString( finished.error || \"Transcription failed\" ),\n\t\t\t500,\n\t\t\toptions.error_code,\n\t\t\tfinished,\n\t\t);\n\t\n\t}\n\n\treturn finished;\n\n}\n","import crypto from \"node:crypto\";\n\nexport interface VerifyWebhookResult {\n\tok : boolean;\n\treason ?: string;\n}\n\nfunction timingSafeEqual(\n\ta : string,\n\tb : string,\n) : boolean {\n\n\tconst ab = Buffer.from( a, \"utf8\" );\n\tconst bb = Buffer.from( b, \"utf8\" );\n\tif ( ab.length !== bb.length ) {\n\n\t\treturn false;\n\t\n\t}\n\n\treturn crypto.timingSafeEqual( ab, bb );\n\n}\n\n/**\n * Verify `SpeechWeave-Signature` header (Stripe-style: `t=unix,v1=hex` — may include multiple `v1=` during secret rotation).\n *\n * @param secret — active webhook signing secret, or array of `[active, previous]` during a rotation window\n * @param raw_body — exact request body string (use raw bytes as UTF-8 string)\n * @param signature_header — value of the `SpeechWeave-Signature` header\n * @param tolerance_seconds — max clock skew; defaults to 300\n */\nexport function verifyWebhook(\n\tsecret : string | string[],\n\traw_body : string,\n\tsignature_header : string,\n\ttolerance_seconds = 300,\n) : VerifyWebhookResult {\n\n\tconst secrets = ( Array.isArray( secret ) ? secret : [\n\t\tsecret, \n\t] )\n\t\t.map( s => String( s || \"\" ).trim() )\n\t\t.filter( Boolean );\n\tif ( ! secrets.length ) {\n\n\t\treturn {\n\t\t\tok: false,\n\t\t\treason: \"no_secrets\",\n\t\t};\n\t\n\t}\n\n\tconst header = String( signature_header || \"\" ).trim();\n\tconst parts = header.split( \",\" ).map( p => p.trim() );\n\tlet t : string | null = null;\n\tconst v1_list : string[] = [\n\t];\n\tfor ( const part of parts ) {\n\n\t\tif ( part.startsWith( \"t=\" ) ) {\n\n\t\t\tt = part.slice( 2 );\n\t\t\n\t\t}\n\n\t\tif ( part.startsWith( \"v1=\" ) ) {\n\n\t\t\tv1_list.push( part.slice( 3 ) );\n\t\t\n\t\t}\n\t\n\t}\n\tif (\n\t\t! t\n\t\t|| ! v1_list.length\n\t) {\n\n\t\treturn {\n\t\t\tok: false,\n\t\t\treason: \"missing_t_or_v1\",\n\t\t};\n\t\n\t}\n\tconst ts = Number( t );\n\tif ( ! Number.isFinite( ts ) ) {\n\n\t\treturn {\n\t\t\tok: false,\n\t\t\treason: \"bad_timestamp\",\n\t\t};\n\t\n\t}\n\tconst now = Math.floor( Date.now() / 1000 );\n\tif ( Math.abs( now - ts ) > tolerance_seconds ) {\n\n\t\treturn {\n\t\t\tok: false,\n\t\t\treason: \"timestamp_skew\",\n\t\t};\n\t\n\t}\n\n\tfor ( const secret of secrets ) {\n\n\t\tconst expected = crypto.createHmac( \"sha256\", secret ).update( `${ t }.${ raw_body }` ).digest( \"hex\" );\n\t\tfor ( const v1 of v1_list ) {\n\n\t\t\tif ( timingSafeEqual( expected, v1 ) ) {\n\n\t\t\t\treturn {\n\t\t\t\t\tok: true,\n\t\t\t\t};\n\t\t\t\n\t\t\t}\n\t\t\n\t\t}\n\t\n\t}\n\n\treturn {\n\t\tok: false,\n\t\treason: \"bad_signature\",\n\t};\n\n}\n","/**\n * OpenAI-shaped transcription helpers.\n * For OpenAI migration, prefer the official `openai` package with `baseURL` set to SpeechWeave.\n */\nimport type { SpeechWeaveClient } from \"../client.js\";\nimport {\n\tfinishCompatJob,\n\tshapeOpenAiResponse,\n\tuploadAndCreateJob,\n\ttype UploadBody,\n} from \"../compat_shapes.js\";\n\nexport interface OpenAiTranscriptionCreateOptions {\n\tfile : UploadBody;\n\tfilename ?: string;\n\tmodel ?: string;\n\tlanguage ?: string;\n\t// Explicit Content-Length when the body cannot be measured.\n\tfile_size ?: number;\n\t// When false, return the created job without polling (default true).\n\twait ?: boolean;\n}\n\nexport function createOpenAiAudioNamespace(\n\tclient : SpeechWeaveClient,\n) {\n\n\treturn {\n\t\ttranscriptions: {\n\t\t\t/** OpenAI-shaped transcription create — drop-in compatibility wrapper. */\n\t\t\tcreate: async ( opts : OpenAiTranscriptionCreateOptions ) => {\n\n\t\t\t\tconst name = opts.filename || \"audio.bin\";\n\t\t\t\tconst job = await uploadAndCreateJob( client, {\n\t\t\t\t\tdata: opts.file,\n\t\t\t\t\tfilename: name,\n\t\t\t\t\tmodel: opts.model,\n\t\t\t\t\tlanguage: opts.language,\n\t\t\t\t\tfile_size: opts.file_size,\n\t\t\t\t} );\n\t\t\t\tconst finished = await finishCompatJob( client, job, {\n\t\t\t\t\twait: opts.wait ?? true,\n\t\t\t\t\terror_code: \"OPENAI_PROXY\",\n\t\t\t\t} );\n\t\t\t\tif ( opts.wait === false ) {\n\n\t\t\t\t\treturn finished;\n\t\t\t\t\n\t\t\t\t}\n\n\t\t\t\treturn shapeOpenAiResponse( finished as Record<string, unknown> );\n\t\t\t\n\t\t\t},\n\t\t},\n\t};\n\n}\n","/**\n * Deepgram-shaped listen helpers.\n * Prefer the official Deepgram SDK with SpeechWeave base URL when migrating.\n */\nimport type { ReadStream } from \"node:fs\";\nimport type { SpeechWeaveClient } from \"../client.js\";\nimport {\n\tcreateJobFromUrl,\n\tfinishCompatJob,\n\tshapeDeepgramResponse,\n\tuploadAndCreateJob,\n\ttype UploadBody,\n} from \"../compat_shapes.js\";\n\nexport interface DeepgramTranscribeFileOptions {\n\tmodel ?: string;\n\tfilename ?: string;\n\tlanguage ?: string;\n\t// Explicit Content-Length when the body cannot be measured\n\tfile_size ?: number;\n\t// When false, return the created job without polling (default true).\n\twait ?: boolean;\n}\n\nexport interface DeepgramTranscribeUrlOptions {\n\tmodel ?: string;\n\tlanguage ?: string;\n\t// When false, return the created job without polling (default true).\n\twait ?: boolean;\n}\n\nexport function createDeepgramListenNamespace(\n\tclient : SpeechWeaveClient,\n) {\n\n\treturn {\n\t\tprerecorded: {\n\t\t\t/** Deepgram-shaped prerecorded file transcription — drop-in compatibility wrapper. */\n\t\t\ttranscribeFile: async (\n\t\t\t\tstream : UploadBody | ReadStream,\n\t\t\t\toptions : DeepgramTranscribeFileOptions = {},\n\t\t\t) => {\n\n\t\t\t\tconst job = await uploadAndCreateJob( client, {\n\t\t\t\t\tdata: stream,\n\t\t\t\t\tfilename: options.filename || \"audio.bin\",\n\t\t\t\t\tmodel: options.model,\n\t\t\t\t\tlanguage: options.language,\n\t\t\t\t\tfile_size: options.file_size,\n\t\t\t\t} );\n\t\t\t\tconst finished = await finishCompatJob( client, job, {\n\t\t\t\t\twait: options.wait ?? true,\n\t\t\t\t\terror_code: \"DEEPGRAM_PROXY\",\n\t\t\t\t} );\n\t\t\t\tif ( options.wait === false ) {\n\n\t\t\t\t\treturn finished;\n\t\t\t\t\n\t\t\t\t}\n\n\t\t\t\treturn shapeDeepgramResponse(\n\t\t\t\t\tfinished as Record<string, unknown>,\n\t\t\t\t\t{ model: options.model },\n\t\t\t\t);\n\t\t\t\n\t\t\t},\n\t\t\t/** Deepgram-shaped prerecorded URL transcription — drop-in compatibility wrapper. */\n\t\t\ttranscribeUrl: async (\n\t\t\t\turl : string,\n\t\t\t\toptions : DeepgramTranscribeUrlOptions = {},\n\t\t\t) => {\n\n\t\t\t\tconst job = await createJobFromUrl( client, {\n\t\t\t\t\turl,\n\t\t\t\t\tmodel: options.model,\n\t\t\t\t\tlanguage: options.language,\n\t\t\t\t} );\n\t\t\t\tconst finished = await finishCompatJob( client, job, {\n\t\t\t\t\twait: options.wait ?? true,\n\t\t\t\t\terror_code: \"DEEPGRAM_PROXY\",\n\t\t\t\t} );\n\t\t\t\tif ( options.wait === false ) {\n\n\t\t\t\t\treturn finished;\n\t\t\t\t\n\t\t\t\t}\n\n\t\t\t\treturn shapeDeepgramResponse(\n\t\t\t\t\tfinished as Record<string, unknown>,\n\t\t\t\t\t{ model: options.model },\n\t\t\t\t);\n\t\t\t\n\t\t\t},\n\t\t},\n\t};\n\n}\n","/**\n * AssemblyAI-shaped transcripts helpers.\n * Prefer the official AssemblyAI SDK with SpeechWeave when migrating.\n */\nimport type { ReadStream } from \"node:fs\";\nimport type { SpeechWeaveClient } from \"../client.js\";\nimport {\n\tcreateJobFromUrl,\n\tfinishCompatJob,\n\tshapeAssemblyResponse,\n\tuploadAndCreateJob,\n\ttype UploadBody,\n} from \"../compat_shapes.js\";\n\nexport interface AssemblyTranscribeConfig {\n\tmodel ?: string;\n\tlanguage ?: string;\n\t// Explicit Content-Length when the body cannot be measured\n\tfile_size ?: number;\n}\n\nexport function createAssemblyTranscriptsNamespace(\n\tclient : SpeechWeaveClient,\n) {\n\n\treturn {\n\t\t/** AssemblyAI-shaped transcription — drop-in compatibility wrapper. Pass a URL string or binary/file body. */\n\t\ttranscribe: async (\n\t\t\taudio : string | UploadBody | ReadStream,\n\t\t\tconfig ?: AssemblyTranscribeConfig,\n\t\t\toptions : { wait ?: boolean } = {},\n\t\t) => {\n\n\t\t\tconst cfg = config || {};\n\t\t\tconst wait = options.wait ?? true;\n\n\t\t\tlet job;\n\t\t\tif ( typeof audio === \"string\" ) {\n\n\t\t\t\tjob = await createJobFromUrl( client, {\n\t\t\t\t\turl: audio,\n\t\t\t\t\tmodel: cfg.model,\n\t\t\t\t\tlanguage: cfg.language,\n\t\t\t\t} );\n\t\t\t\n\t\t\t}\n\t\t\telse {\n\n\t\t\t\tjob = await uploadAndCreateJob( client, {\n\t\t\t\t\tdata: audio,\n\t\t\t\t\tfilename: \"audio.bin\",\n\t\t\t\t\tmodel: cfg.model,\n\t\t\t\t\tlanguage: cfg.language,\n\t\t\t\t\tfile_size: cfg.file_size,\n\t\t\t\t} );\n\t\t\t\n\t\t\t}\n\n\t\t\tconst finished = await finishCompatJob( client, job, {\n\t\t\t\twait,\n\t\t\t\terror_code: \"ASSEMBLY_PROXY\",\n\t\t\t} );\n\t\t\tif ( ! wait ) {\n\n\t\t\t\treturn finished;\n\t\t\t\n\t\t\t}\n\n\t\t\treturn shapeAssemblyResponse( finished as Record<string, unknown> );\n\t\t\n\t\t},\n\t};\n\n}\n"],"mappings":"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","names":["crypto","secret"]}
package/dist/index.d.cts CHANGED
@@ -260,7 +260,7 @@ declare function finishCompatJob(client: SpeechWeaveClient, job: CreateJobRespon
260
260
  poll_ms?: number;
261
261
  }): Promise<V1Job | CreateJobResponse | Record<string, unknown>>;
262
262
 
263
- declare const VERSION = "1.0.0";
263
+ declare const VERSION = "1.0.1";
264
264
 
265
265
  interface VerifyWebhookResult {
266
266
  ok: boolean;
package/dist/index.d.ts CHANGED
@@ -260,7 +260,7 @@ declare function finishCompatJob(client: SpeechWeaveClient, job: CreateJobRespon
260
260
  poll_ms?: number;
261
261
  }): Promise<V1Job | CreateJobResponse | Record<string, unknown>>;
262
262
 
263
- declare const VERSION = "1.0.0";
263
+ declare const VERSION = "1.0.1";
264
264
 
265
265
  interface VerifyWebhookResult {
266
266
  ok: boolean;
package/dist/index.js CHANGED
@@ -44,7 +44,7 @@ async function waitForJob(client, job_id, opts = {}) {
44
44
  }
45
45
 
46
46
  // src/version.ts
47
- var VERSION = "1.0.0";
47
+ var VERSION = "1.0.1";
48
48
 
49
49
  // src/client.ts
50
50
  function normalizeBaseURL(url) {
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/client.ts","../src/errors.ts","../src/polling.ts","../src/version.ts","../src/compat_shapes.ts","../src/webhooks.ts","../src/openai/openai_compat.ts","../src/deepgram/deepgram_compat.ts","../src/assembly/assembly_compat.ts","../src/index.ts"],"sourcesContent":["import { createReadStream } from \"node:fs\";\nimport type { ReadStream } from \"node:fs\";\nimport { stat } from \"node:fs/promises\";\nimport { SpeechWeaveError } from \"./errors.js\";\nimport { waitForJob } from \"./polling.js\";\nimport type {\n\tCreateJobResponse,\n\tCancelJobResponse,\n\tListJobsResponse,\n\tPresignResponse,\n\tServiceMode,\n\tSpeechWeaveClientOptions,\n\tV1Job,\n} from \"./types.js\";\nimport { VERSION } from \"./version.js\";\n\nfunction normalizeBaseURL(\n\turl : string,\n) : string {\n\n\tconst s = String( url || \"\" ).trim().replace( /\\/+$/, \"\" );\n\n\treturn s || \"https://api.speechweave.com/v1\";\n\n}\n\nasync function readErrorMessage(\n\tresponse : Response,\n) : Promise<string> {\n\n\tconst content_type = response.headers.get( \"content-type\" ) || \"\";\n\ttry {\n\n\t\tif ( content_type.includes( \"application/json\" ) ) {\n\n\t\t\tconst json = ( await response.json() ) as { error ?: string;\n\t\t\t\tmessage ?: string; };\n\n\t\t\treturn String( json?.error || json?.message || response.statusText );\n\t\t\n\t\t}\n\t\tconst text = await response.text();\n\n\t\treturn text.slice( 0, 500 ) || response.statusText;\n\t\n\t}\n\tcatch {\n\n\t\treturn response.statusText;\n\t\n\t}\n\n}\n\nasync function getBodyLength(\n\tbody : Buffer | ReadStream | Blob,\n\tfile_size ?: number,\n) : Promise<number | undefined> {\n\n\tif ( file_size != null && Number.isFinite( file_size ) && file_size >= 0 ) {\n\n\t\treturn file_size;\n\t\n\t}\n\tif ( Buffer.isBuffer( body ) ) {\n\n\t\treturn body.byteLength;\n\t\n\t}\n\tif ( body instanceof Blob ) {\n\n\t\treturn body.size;\n\t\n\t}\n\n\tconst path_like : unknown = ( body as ReadStream & { path ?: unknown } ).path;\n\tif (\n\t\ttypeof path_like === \"string\"\n\t\t|| Buffer.isBuffer( path_like )\n\t\t|| path_like instanceof URL\n\t) {\n\n\t\ttry {\n\n\t\t\treturn ( await stat( path_like ) ).size;\n\t\t\n\t\t}\n\t\tcatch {\n\n\t\t\treturn undefined;\n\t\t\n\t\t}\n\t\n\t}\n\n\treturn undefined;\n\n}\n\n/** Low-level SpeechWeave `/v1` client (presign, jobs, uploads). */\nexport class SpeechWeaveClient {\n\n\tprotected readonly api_key : string;\n\tprotected readonly base_url : string;\n\tprotected readonly fetch_func : typeof fetch;\n\n\t/**\n\t * @param options.api_key - Falls back to SPEECHWEAVE_API_KEY. Throws if neither is set.\n\t * @param options.base_url - Defaults to https://api.speechweave.com/v1.\n\t */\n\tconstructor(\n\t\toptions : SpeechWeaveClientOptions = {},\n\t) {\n\n\t\tthis.api_key = (\n\t\t\toptions.api_key\n\t\t\t|| (\n\t\t\t\ttypeof process !== \"undefined\"\n\t\t\t\t&& process.env?.SPEECHWEAVE_API_KEY\n\t\t\t)\n\t\t\t|| \"\"\n\t\t);\n\t\tthis.base_url = normalizeBaseURL(\n\t\t\toptions.base_url || \"https://api.speechweave.com/v1\",\n\t\t);\n\t\tthis.fetch_func = options.fetch_func || fetch;\n\t\tif ( ! this.api_key ) {\n\n\t\t\tthrow new Error( \"SpeechWeave API key is required (api_key, or SPEECHWEAVE_API_KEY)\" );\n\t\t\n\t\t}\n\t\n\t}\n\n\t/**\n\t * Authenticated fetch against base_url.\n\t * Adds Bearer and User-Agent when missing. Path is relative (leading `/` optional).\n\t */\n\tasync rawFetch(\n\t\tpath : string,\n\t\tinit : RequestInit = {},\n\t) : Promise<Response> {\n\n\t\tconst formatted_path = path.startsWith( \"/\" ) ? path : `/${ path }`;\n\t\tconst url = `${ this.base_url }${ formatted_path }`;\n\t\tconst h = new Headers( init.headers );\n\t\tif ( ! h.has( \"Authorization\" ) ) {\n\n\t\t\th.set( \"Authorization\", `Bearer ${ this.api_key }` );\n\t\t\n\t\t}\n\t\tif ( ! h.has( \"User-Agent\" ) ) {\n\n\t\t\th.set( \"User-Agent\", `speechweave-node/${ VERSION }` );\n\t\t\n\t\t}\n\n\t\treturn this.fetch_func( url, { ...init,\n\t\t\theaders: h } );\n\t\n\t}\n\n\tprotected async requestJson<T>(\n\t\tmethod : string,\n\t\tpath : string,\n\t\tjson ?: unknown,\n\t\tparams ?: Record<string, string | number | boolean | undefined | null>,\n\t) : Promise<T> {\n\n\t\tlet request_path = path;\n\t\tif ( params ) {\n\n\t\t\tconst search = new URLSearchParams();\n\t\t\tfor ( const [\n\t\t\t\tkey,\n\t\t\t\tvalue, \n\t\t\t] of Object.entries( params ) ) {\n\n\t\t\t\tif ( value === undefined || value === null ) {\n\n\t\t\t\t\tcontinue;\n\t\t\t\t\n\t\t\t\t}\n\t\t\t\tsearch.set( key, String( value ) );\n\t\t\t\n\t\t\t}\n\t\t\tconst qs = search.toString();\n\t\t\tif ( qs ) {\n\n\t\t\t\trequest_path = `${ path }${ path.includes( \"?\" ) ? \"&\" : \"?\" }${ qs }`;\n\t\t\t\n\t\t\t}\n\t\t\n\t\t}\n\n\t\tconst headers : HeadersInit = { Accept: \"application/json\" };\n\t\tlet body : string | undefined;\n\t\tif ( json !== undefined ) {\n\n\t\t\t( headers as Record<string, string> )[ \"Content-Type\" ] = \"application/json\";\n\t\t\tbody = JSON.stringify( json );\n\t\t\n\t\t}\n\n\t\tconst response = await this.rawFetch( request_path, { method,\n\t\t\theaders,\n\t\t\tbody } );\n\t\tif ( ! response.ok ) {\n\n\t\t\tconst ct = response.headers.get( \"content-type\" ) || \"\";\n\t\t\tlet err_body : unknown;\n\t\t\tlet message : string;\n\t\t\tlet code : string | undefined = String( response.status );\n\t\t\tlet retry_after : number | undefined;\n\t\t\tconst header_retry = response.headers.get( \"Retry-After\" );\n\t\t\tif ( header_retry ) {\n\n\t\t\t\tconst n = parseInt( header_retry, 10 );\n\t\t\t\tif ( Number.isFinite( n ) ) {\n\n\t\t\t\t\tretry_after = n;\n\t\t\t\t\n\t\t\t\t}\n\t\t\t\n\t\t\t}\n\t\t\ttry {\n\n\t\t\t\tif ( ct.includes( \"application/json\" ) ) {\n\n\t\t\t\t\terr_body = await response.json();\n\t\t\t\t\tconst j = err_body as {\n\t\t\t\t\t\terror ?: string;\n\t\t\t\t\t\tmessage ?: string;\n\t\t\t\t\t\tcode ?: string;\n\t\t\t\t\t\tretry_after ?: number;\n\t\t\t\t\t};\n\t\t\t\t\tmessage = String( j?.error || j?.message || response.statusText );\n\t\t\t\t\tif ( j?.code ) {\n\n\t\t\t\t\t\tcode = j.code;\n\t\t\t\t\t\n\t\t\t\t\t}\n\t\t\t\t\tif ( typeof j?.retry_after === \"number\" ) {\n\n\t\t\t\t\t\tretry_after = j.retry_after;\n\t\t\t\t\t\n\t\t\t\t\t}\n\t\t\t\t\n\t\t\t\t}\n\t\t\t\telse {\n\n\t\t\t\t\tconst t = await response.text();\n\t\t\t\t\tmessage = t.slice( 0, 500 ) || response.statusText;\n\t\t\t\t\n\t\t\t\t}\n\t\t\t\n\t\t\t}\n\t\t\tcatch {\n\n\t\t\t\tmessage = response.statusText;\n\t\t\t\n\t\t\t}\n\n\t\t\tthrow new SpeechWeaveError(\n\t\t\t\tmessage,\n\t\t\t\tresponse.status,\n\t\t\t\tcode,\n\t\t\t\terr_body,\n\t\t\t\tretry_after,\n\t\t\t);\n\t\t\n\t\t}\n\n\t\treturn ( await response.json() ) as T;\n\t\n\t}\n\n\t/**\n\t * Request a short-lived PUT URL and object_key for direct upload to storage.\n\t *\n\t * @param params.filename - Original name (used in the storage key).\n\t * @param params.content_type - MIME type that must match the subsequent PUT.\n\t */\n\tasync presignUpload(\n\t\tparams : {\n\t\t\tfilename : string;\n\t\t\tcontent_type : string;\n\t\t},\n\t) : Promise<PresignResponse> {\n\n\t\treturn this.requestJson<PresignResponse>(\n\t\t\t\"POST\",\n\t\t\t\"/uploads\",\n\t\t\t{\n\t\t\t\tfilename: params.filename,\n\t\t\t\tcontent_type: params.content_type,\n\t\t\t},\n\t\t);\n\t\n\t}\n\n\t/**\n\t * PUT audio bytes to a presigned upload_url.\n\t * Sets Content-Length when the body can be measured; pass file_size for pipes/live streams.\n\t *\n\t * @param uploadUrl - upload_url from presignUpload.\n\t */\n\tasync putToPresignedUrl(\n\t\tuploadUrl : string,\n\t\tbody : Buffer | ReadStream | Blob,\n\t\tcontentType : string,\n\t\toptions : { file_size ?: number } = {},\n\t) : Promise<void> {\n\n\t\tconst headers = new Headers( { \"Content-Type\": contentType } );\n\t\tconst content_length = await getBodyLength( body, options.file_size );\n\t\tif ( content_length != null ) {\n\n\t\t\theaders.set( \"Content-Length\", String( content_length ) );\n\t\t\n\t\t}\n\n\t\tconst init : RequestInit & { duplex ?: string } = {\n\t\t\tmethod: \"PUT\",\n\t\t\theaders,\n\t\t\tbody: body as BodyInit,\n\t\t};\n\t\tconst is_node_stream = body && typeof ( body as ReadStream ).pipe === \"function\";\n\t\tif ( is_node_stream ) {\n\n\t\t\tinit.duplex = \"half\";\n\t\t\n\t\t}\n\t\tconst response = await this.fetch_func( uploadUrl, init );\n\t\tif ( ! response.ok ) {\n\n\t\t\tconst message = await readErrorMessage( response );\n\t\t\tthrow new SpeechWeaveError(\n\t\t\t\t`R2 upload failed: ${ message }`,\n\t\t\t\tresponse.status,\n\t\t\t\t\"UPLOAD_FAILED\",\n\t\t\t);\n\t\t\n\t\t}\n\t\n\t}\n\n\t/**\n\t * Presign → PUT → create job. Returns the create ack (no transcript); poll getJob or waitForJob.\n\t * Omitting service_mode leaves the API default (deferred). Synchronous rejects files over the sync size cap (default 512 MiB).\n\t *\n\t * @param options.filename - Defaults to audio.bin.\n\t * @param options.content_type - Defaults to application/octet-stream.\n\t * @param options.language - Two-letter ISO code (e.g. 'en', 'es').\n\t * @param options.file_size - Content-Length when the body cannot be measured (pipes, live streams).\n\t */\n\tasync transcribeFile(\n\t\tfile : ReadStream | Buffer | Blob,\n\t\toptions : {\n\t\t\tfilename ?: string;\n\t\t\tcontent_type ?: string;\n\t\t\tmodel ?: string;\n\t\t\tservice_mode ?: ServiceMode;\n\t\t\tlanguage ?: string;\n\t\t\tmetadata ?: Record<string, unknown>;\n\t\t\tfile_size ?: number;\n\t\t} = {},\n\t) : Promise<CreateJobResponse> {\n\n\t\tconst filename = options.filename || \"audio.bin\";\n\t\tconst content_type = options.content_type || \"application/octet-stream\";\n\t\tconst presign = await this.presignUpload( {\n\t\t\tfilename,\n\t\t\tcontent_type,\n\t\t} );\n\t\tconst put_opts = { file_size: options.file_size };\n\n\t\tif ( Buffer.isBuffer( file ) || file instanceof Blob ) {\n\n\t\t\tawait this.putToPresignedUrl( presign.upload_url, file, content_type, put_opts );\n\t\t\n\t\t}\n\t\telse {\n\n\t\t\tawait this.putToPresignedUrl(\n\t\t\t\tpresign.upload_url,\n\t\t\t\tfile as ReadStream,\n\t\t\t\tcontent_type,\n\t\t\t\tput_opts,\n\t\t\t);\n\t\t\n\t\t}\n\n\t\treturn this.createJob( {\n\t\t\tobject_key: presign.object_key,\n\t\t\tmodel: options.model,\n\t\t\tservice_mode: options.service_mode,\n\t\t\tlanguage: options.language,\n\t\t\tmetadata: options.metadata,\n\t\t} );\n\t\n\t}\n\n\t/**\n\t * Same as {@link transcribeFile}, then poll until completed, failed, or cancelled.\n\t *\n\t * @param options.wait_timeout_ms - Defaults to SPEECHWEAVE_JOB_WAIT_MS or 300_000.\n\t * @param options.poll_ms - Poll interval; defaults to 1500.\n\t */\n\tasync transcribeFileBlocking(\n\t\tfile : ReadStream | Buffer | Blob,\n\t\toptions : {\n\t\t\tfilename ?: string;\n\t\t\tcontent_type ?: string;\n\t\t\tmodel ?: string;\n\t\t\tservice_mode ?: ServiceMode;\n\t\t\tlanguage ?: string;\n\t\t\tmetadata ?: Record<string, unknown>;\n\t\t\tfile_size ?: number;\n\t\t\twait_timeout_ms ?: number;\n\t\t\tpoll_ms ?: number;\n\t\t} = {},\n\t) : Promise<V1Job> {\n\n\t\tconst created = await this.transcribeFile( file, options );\n\n\t\treturn waitForJob(\n\t\t\tthis,\n\t\t\tcreated.id,\n\t\t\t{\n\t\t\t\ttimeout_ms: options.wait_timeout_ms ?? Number( process.env?.SPEECHWEAVE_JOB_WAIT_MS || 300_000 ),\n\t\t\t\tpoll_ms: options.poll_ms ?? 1_500,\n\t\t\t},\n\t\t);\n\t\n\t}\n\n\t/**\n\t * Create a transcription job from an already-uploaded object or a remote URL.\n\t * Provide exactly one of object_key, input_url, or audio_url. type defaults to transcription.\n\t * Omitting service_mode leaves the API default (deferred).\n\t *\n\t * @param params.object_key - From PresignResponse after a successful PUT.\n\t * @param params.input_url - Publicly reachable audio URL.\n\t * @param params.audio_url - Alias for input_url.\n\t * @param params.language - Two-letter ISO code (e.g. 'en', 'es').\n\t */\n\tasync createJob(\n\t\tparams : {\n\t\t\tobject_key ?: string;\n\t\t\tinput_url ?: string;\n\t\t\taudio_url ?: string;\n\t\t\tmodel ?: string;\n\t\t\tservice_mode ?: ServiceMode;\n\t\t\tlanguage ?: string;\n\t\t\ttype ?: string;\n\t\t\tmetadata ?: Record<string, unknown>;\n\t\t},\n\t) : Promise<CreateJobResponse> {\n\n\t\tconst payload : Record<string, unknown> = {\n\t\t\ttype: params.type || \"transcription\",\n\t\t};\n\t\tif ( params.object_key != null ) {\n\n\t\t\tpayload.object_key = params.object_key;\n\t\t\n\t\t}\n\t\tif ( params.input_url != null ) {\n\n\t\t\tpayload.input_url = params.input_url;\n\t\t\n\t\t}\n\t\tif ( params.audio_url != null ) {\n\n\t\t\tpayload.audio_url = params.audio_url;\n\t\t\n\t\t}\n\t\tif ( params.model != null ) {\n\n\t\t\tpayload.model = params.model;\n\t\t\n\t\t}\n\t\tif ( params.service_mode != null ) {\n\n\t\t\tpayload.service_mode = params.service_mode;\n\t\t\n\t\t}\n\t\tif ( params.language != null ) {\n\n\t\t\tpayload.language = params.language;\n\t\t\n\t\t}\n\t\tif ( params.metadata != null ) {\n\n\t\t\tpayload.metadata = params.metadata;\n\t\t\n\t\t}\n\n\t\treturn this.requestJson<CreateJobResponse>( \"POST\", \"/jobs\", payload );\n\t\n\t}\n\n\t/**\n\t * Fetch the current job record (status, transcript when completed, error when failed).\n\t *\n\t * @param job_id - Id from createJob / transcribeFile.\n\t */\n\tasync getJob(\n\t\tjob_id : string,\n\t) : Promise<V1Job> {\n\n\t\treturn this.requestJson<V1Job>(\n\t\t\t\"GET\",\n\t\t\t`/jobs/${ encodeURIComponent( job_id ) }`,\n\t\t);\n\t\n\t}\n\n\t/**\n\t * List jobs for the authenticated account.\n\t *\n\t * @param params.status - Filter by PublicJobStatus value.\n\t * @param params.page - 1-based page; API default if omitted.\n\t * @param params.limit - Page size; API default if omitted.\n\t */\n\tasync listJobs(\n\t\tparams : {\n\t\t\tpage ?: number;\n\t\t\tlimit ?: number;\n\t\t\tstatus ?: string;\n\t\t} = {},\n\t) : Promise<ListJobsResponse> {\n\n\t\treturn this.requestJson<ListJobsResponse>(\n\t\t\t\"GET\",\n\t\t\t\"/jobs\",\n\t\t\tundefined,\n\t\t\t{\n\t\t\t\tpage: params.page,\n\t\t\t\tlimit: params.limit,\n\t\t\t\tstatus: params.status,\n\t\t\t},\n\t\t);\n\t\n\t}\n\n\t/**\n\t * Cancel a pending or processing job.\n\t * Fails if the job is already completed, failed, or cancelled.\n\t *\n\t * @param job_id - Id from createJob / transcribeFile.\n\t */\n\tasync cancelJob(\n\t\tjob_id : string,\n\t) : Promise<CancelJobResponse> {\n\n\t\treturn this.requestJson(\n\t\t\t\"POST\",\n\t\t\t`/jobs/${ encodeURIComponent( job_id ) }/cancel`,\n\t\t\t{},\n\t\t);\n\t\n\t}\n\n\t/**\n\t * Open a disk path and run {@link transcribeFile}.\n\t * filename is taken from the path basename.\n\t *\n\t * @param file_path - Absolute or relative path on the local filesystem.\n\t */\n\tasync transcribeFilePath(\n\t\tfile_path : string,\n\t\toptions : {\n\t\t\tmodel ?: string;\n\t\t\tservice_mode ?: ServiceMode;\n\t\t\tlanguage ?: string;\n\t\t\tcontent_type ?: string;\n\t\t\tmetadata ?: Record<string, unknown>;\n\t\t\tfile_size ?: number;\n\t\t} = {},\n\t) : Promise<CreateJobResponse> {\n\n\t\tconst stream = createReadStream( file_path );\n\t\tconst base = file_path.split( /[/\\\\]/ ).pop() || \"audio.bin\";\n\n\t\treturn this.transcribeFile(\n\t\t\tstream,\n\t\t\t{\n\t\t\t\tfilename: base,\n\t\t\t\tcontent_type: options.content_type,\n\t\t\t\tmodel: options.model,\n\t\t\t\tservice_mode: options.service_mode,\n\t\t\t\tlanguage: options.language,\n\t\t\t\tmetadata: options.metadata,\n\t\t\t\tfile_size: options.file_size,\n\t\t\t},\n\t\t);\n\t\n\t}\n\n}\n","export class SpeechWeaveError extends Error {\n\n\treadonly status : number;\n\treadonly code ?: string;\n\treadonly body ?: unknown;\n\treadonly retry_after ?: number;\n\n\tconstructor(\n\t\tmessage : string,\n\t\tstatus = 500,\n\t\tcode ?: string,\n\t\tbody ?: unknown,\n\t\tretry_after ?: number,\n\t) {\n\n\t\tsuper( message );\n\n\t\tthis.name = \"SpeechWeaveError\";\n\t\tthis.status = status;\n\t\tthis.code = code;\n\t\tthis.body = body;\n\t\tthis.retry_after = retry_after;\n\t\n\t}\n\n}\n","import type { SpeechWeaveClient } from \"./client.js\";\nimport type { V1Job } from \"./types.js\";\nimport { SpeechWeaveError } from \"./errors.js\";\n\nconst TERMINAL = new Set( [\n\t\"completed\",\n\t\"failed\",\n\t\"cancelled\",\n] );\n\nexport interface WaitForJobOptions {\n\t/** Max wait in ms; defaults to 3_600_000. */\n\ttimeout_ms ?: number;\n\t/** Interval between getJob polls; defaults to 2000. */\n\tpoll_ms ?: number;\n}\n\n/**\n * Poll getJob until completed, failed, or cancelled.\n * Throws SpeechWeaveError with code JOB_WAIT_TIMEOUT on deadline.\n *\n * @param job_id - Id from createJob / transcribeFile.\n */\nexport async function waitForJob(\n\tclient : SpeechWeaveClient,\n\tjob_id : string,\n\topts : WaitForJobOptions = {},\n) : Promise< V1Job > {\n\n\tconst timeout_ms = opts.timeout_ms ?? 3_600_000;\n\tconst poll_ms = opts.poll_ms ?? 2_000;\n\tconst deadline = ( Date.now() + timeout_ms );\n\n\twhile ( Date.now() < deadline ) {\n\n\t\tconst job = await client.getJob( job_id );\n\t\tif ( TERMINAL.has( String( job.status ) ) ) {\n\n\t\t\treturn job;\n\t\t\n\t\t}\n\n\t\tawait new Promise( ( r ) => setTimeout( r, poll_ms ) );\n\t\n\t}\n\n\tthrow new SpeechWeaveError(\n\t\t\"Timed out waiting for job\",\n\t\t504,\n\t\t\"JOB_WAIT_TIMEOUT\",\n\t\t{ job_id },\n\t);\n\n}\n","export const VERSION = \"1.0.0\";\n","import type { ReadStream } from \"node:fs\";\nimport type { SpeechWeaveClient } from \"./client.js\";\nimport { SpeechWeaveError } from \"./errors.js\";\nimport { waitForJob } from \"./polling.js\";\nimport type { CreateJobResponse, ServiceMode, V1Job, UploadBodyResult } from \"./types.js\";\n\nexport type UploadBody = Buffer | Blob | ReadStream | Uint8Array;\n\nfunction jobText(\n\tjob : Record<string, unknown>,\n) : string {\n\n\tconst text = job.transcript;\n\n\treturn typeof text === \"string\" ? text : \"\";\n\n}\n\nfunction jobDuration(\n\tjob : Record<string, unknown>,\n) : number | undefined {\n\n\tconst duration = job.duration;\n\tif ( duration == null ) {\n\n\t\treturn undefined;\n\t\n\t}\n\tconst value = Number( duration );\n\tif ( ! Number.isFinite( value ) || value < 0 ) {\n\n\t\treturn undefined;\n\t\n\t}\n\n\treturn value;\n\n}\n\nfunction jobLanguage(\n\tjob : Record<string, unknown>,\n) : string | undefined {\n\n\tconst language = job.language;\n\tif ( language == null ) {\n\n\t\treturn undefined;\n\t\n\t}\n\tconst text = String( language ).trim().toLowerCase();\n\n\treturn text || undefined;\n\n}\n\nexport function shapeOpenAiResponse(\n\tjob : Record<string, unknown>,\n) : {\n\ttext : string;\n\ttask : \"transcribe\";\n\tduration ?: number;\n\tlanguage ?: string;\n} {\n\n\tconst response : {\n\t\ttext : string;\n\t\ttask : \"transcribe\";\n\t\tduration ?: number;\n\t\tlanguage ?: string;\n\t} = {\n\t\ttext: jobText( job ),\n\t\ttask: \"transcribe\",\n\t};\n\tconst duration = jobDuration( job );\n\tif ( duration !== undefined ) {\n\n\t\tresponse.duration = duration;\n\t\n\t}\n\tconst language = jobLanguage( job );\n\tif ( language !== undefined ) {\n\n\t\tresponse.language = language;\n\t\n\t}\n\n\treturn response;\n\n}\n\nexport function shapeDeepgramResponse(\n\tjob : Record<string, unknown>,\n\toptions : { model ?: string | null } = {},\n) : Record<string, unknown> {\n\n\tconst job_id = String( job.id || \"\" );\n\tconst model_name = options.model || String( job.model || \"core\" );\n\tconst text = jobText( job );\n\tconst language = jobLanguage( job );\n\n\tconst alternative : Record<string, unknown> = {\n\t\ttranscript: text,\n\t\tconfidence: 1,\n\t\twords: [\n\t\t],\n\t};\n\tif ( language !== undefined ) {\n\n\t\talternative.language = language;\n\t\n\t}\n\n\treturn {\n\t\tmetadata: {\n\t\t\trequest_id: job_id,\n\t\t\tmodel_info: {\n\t\t\t\tname: model_name,\n\t\t\t\tversion: \"1\",\n\t\t\t\tarch: \"speechweave\",\n\t\t\t},\n\t\t},\n\t\tresults: {\n\t\t\tchannels: [\n\t\t\t\t{\n\t\t\t\t\talternatives: [\n\t\t\t\t\t\talternative, \n\t\t\t\t\t],\n\t\t\t\t},\n\t\t\t],\n\t\t},\n\t};\n\n}\n\nexport function shapeAssemblyResponse(\n\tjob : Record<string, unknown>,\n) : Record<string, unknown> {\n\n\tconst status = String( job.status || \"unknown\" );\n\tconst pub_status = status === \"completed\" ? \"completed\" : status;\n\tconst duration = jobDuration( job );\n\tconst language = jobLanguage( job );\n\tconst error = job.error;\n\n\tconst response : Record<string, unknown> = {\n\t\tid: String( job.id || \"\" ),\n\t\tstatus: pub_status,\n\t\ttext: jobText( job ),\n\t};\n\tif ( duration !== undefined ) {\n\n\t\tresponse.audio_duration = duration;\n\t\n\t}\n\tif ( language !== undefined ) {\n\n\t\tresponse.language = language;\n\t\n\t}\n\tif ( error != null && pub_status === \"failed\" ) {\n\n\t\tresponse.error = String( error );\n\t\n\t}\n\telse {\n\n\t\tresponse.error = null;\n\t\n\t}\n\n\treturn response;\n\n}\n\nasync function toUploadBody(\n\tdata : UploadBody,\n) : Promise<UploadBodyResult> {\n\n\tif ( data instanceof Blob ) {\n\n\t\treturn {\n\t\t\tbody: data,\n\t\t\tcontent_type: data.type || \"application/octet-stream\",\n\t\t};\n\t\n\t}\n\tif ( Buffer.isBuffer( data ) || data instanceof Uint8Array ) {\n\n\t\tconst buf = Buffer.isBuffer( data ) ? data : Buffer.from( data );\n\n\t\treturn {\n\t\t\tbody: buf,\n\t\t\tcontent_type: \"application/octet-stream\",\n\t\t};\n\t\n\t}\n\n\t// Pass ReadStream through — putToPresignedUrl streams with duplex: \"half\".\n\treturn {\n\t\tbody: data,\n\t\tcontent_type: \"application/octet-stream\",\n\t};\n\n}\n\nexport async function uploadAndCreateJob(\n\tclient : SpeechWeaveClient,\n\tparams : {\n\t\tdata : UploadBody;\n\t\tfilename : string;\n\t\tcontent_type ?: string;\n\t\tmodel ?: string;\n\t\tlanguage ?: string;\n\t\tservice_mode ?: ServiceMode;\n\t\tmetadata ?: Record<string, unknown>;\n\t\tfile_size ?: number;\n\t},\n) : Promise<CreateJobResponse> {\n\n\tconst prepared = await toUploadBody( params.data );\n\tconst content_type = params.content_type || prepared.content_type;\n\tconst body = prepared.body;\n\n\tconst presign = await client.presignUpload( {\n\t\tfilename: params.filename,\n\t\tcontent_type,\n\t} );\n\tawait client.putToPresignedUrl(\n\t\tpresign.upload_url,\n\t\tbody as Buffer | Blob | ReadStream,\n\t\tcontent_type,\n\t\t{ file_size: params.file_size },\n\t);\n\n\treturn client.createJob( {\n\t\tobject_key: presign.object_key,\n\t\tmodel: params.model,\n\t\tlanguage: params.language,\n\t\tservice_mode: params.service_mode ?? \"synchronous\",\n\t\tmetadata: params.metadata,\n\t} );\n\n}\n\nexport async function createJobFromUrl(\n\tclient : SpeechWeaveClient,\n\tparams : {\n\t\turl : string;\n\t\tmodel ?: string;\n\t\tlanguage ?: string;\n\t\tservice_mode ?: ServiceMode;\n\t\tmetadata ?: Record<string, unknown>;\n\t},\n) : Promise<CreateJobResponse> {\n\n\treturn client.createJob( {\n\t\tinput_url: params.url,\n\t\tmodel: params.model,\n\t\tlanguage: params.language,\n\t\tservice_mode: params.service_mode ?? \"synchronous\",\n\t\tmetadata: params.metadata,\n\t} );\n\n}\n\nexport async function finishCompatJob(\n\tclient : SpeechWeaveClient,\n\tjob : CreateJobResponse | V1Job | Record<string, unknown>,\n\toptions : {\n\t\twait : boolean;\n\t\terror_code : string;\n\t\ttimeout_ms ?: number;\n\t\tpoll_ms ?: number;\n\t},\n) : Promise<V1Job | CreateJobResponse | Record<string, unknown>> {\n\n\tif ( ! options.wait ) {\n\n\t\treturn job;\n\t\n\t}\n\n\tconst finished = await waitForJob(\n\t\tclient,\n\t\tString( ( job as { id ?: string } ).id || \"\" ),\n\t\t{\n\t\t\ttimeout_ms: options.timeout_ms ?? 300_000,\n\t\t\tpoll_ms: options.poll_ms ?? 1_500,\n\t\t},\n\t);\n\n\tif ( String( finished.status ) === \"failed\" ) {\n\n\t\tthrow new SpeechWeaveError(\n\t\t\tString( finished.error || \"Transcription failed\" ),\n\t\t\t500,\n\t\t\toptions.error_code,\n\t\t\tfinished,\n\t\t);\n\t\n\t}\n\n\treturn finished;\n\n}\n","import crypto from \"node:crypto\";\n\nexport interface VerifyWebhookResult {\n\tok : boolean;\n\treason ?: string;\n}\n\nfunction timingSafeEqual(\n\ta : string,\n\tb : string,\n) : boolean {\n\n\tconst ab = Buffer.from( a, \"utf8\" );\n\tconst bb = Buffer.from( b, \"utf8\" );\n\tif ( ab.length !== bb.length ) {\n\n\t\treturn false;\n\t\n\t}\n\n\treturn crypto.timingSafeEqual( ab, bb );\n\n}\n\n/**\n * Verify `SpeechWeave-Signature` header (Stripe-style: `t=unix,v1=hex` — may include multiple `v1=` during secret rotation).\n *\n * @param secret — active webhook signing secret, or array of `[active, previous]` during a rotation window\n * @param raw_body — exact request body string (use raw bytes as UTF-8 string)\n * @param signature_header — value of the `SpeechWeave-Signature` header\n * @param tolerance_seconds — max clock skew; defaults to 300\n */\nexport function verifyWebhook(\n\tsecret : string | string[],\n\traw_body : string,\n\tsignature_header : string,\n\ttolerance_seconds = 300,\n) : VerifyWebhookResult {\n\n\tconst secrets = ( Array.isArray( secret ) ? secret : [\n\t\tsecret, \n\t] )\n\t\t.map( s => String( s || \"\" ).trim() )\n\t\t.filter( Boolean );\n\tif ( ! secrets.length ) {\n\n\t\treturn {\n\t\t\tok: false,\n\t\t\treason: \"no_secrets\",\n\t\t};\n\t\n\t}\n\n\tconst header = String( signature_header || \"\" ).trim();\n\tconst parts = header.split( \",\" ).map( p => p.trim() );\n\tlet t : string | null = null;\n\tconst v1_list : string[] = [\n\t];\n\tfor ( const part of parts ) {\n\n\t\tif ( part.startsWith( \"t=\" ) ) {\n\n\t\t\tt = part.slice( 2 );\n\t\t\n\t\t}\n\n\t\tif ( part.startsWith( \"v1=\" ) ) {\n\n\t\t\tv1_list.push( part.slice( 3 ) );\n\t\t\n\t\t}\n\t\n\t}\n\tif (\n\t\t! t\n\t\t|| ! v1_list.length\n\t) {\n\n\t\treturn {\n\t\t\tok: false,\n\t\t\treason: \"missing_t_or_v1\",\n\t\t};\n\t\n\t}\n\tconst ts = Number( t );\n\tif ( ! Number.isFinite( ts ) ) {\n\n\t\treturn {\n\t\t\tok: false,\n\t\t\treason: \"bad_timestamp\",\n\t\t};\n\t\n\t}\n\tconst now = Math.floor( Date.now() / 1000 );\n\tif ( Math.abs( now - ts ) > tolerance_seconds ) {\n\n\t\treturn {\n\t\t\tok: false,\n\t\t\treason: \"timestamp_skew\",\n\t\t};\n\t\n\t}\n\n\tfor ( const secret of secrets ) {\n\n\t\tconst expected = crypto.createHmac( \"sha256\", secret ).update( `${ t }.${ raw_body }` ).digest( \"hex\" );\n\t\tfor ( const v1 of v1_list ) {\n\n\t\t\tif ( timingSafeEqual( expected, v1 ) ) {\n\n\t\t\t\treturn {\n\t\t\t\t\tok: true,\n\t\t\t\t};\n\t\t\t\n\t\t\t}\n\t\t\n\t\t}\n\t\n\t}\n\n\treturn {\n\t\tok: false,\n\t\treason: \"bad_signature\",\n\t};\n\n}\n","/**\n * OpenAI-shaped transcription helpers.\n * For OpenAI migration, prefer the official `openai` package with `baseURL` set to SpeechWeave.\n */\nimport type { SpeechWeaveClient } from \"../client.js\";\nimport {\n\tfinishCompatJob,\n\tshapeOpenAiResponse,\n\tuploadAndCreateJob,\n\ttype UploadBody,\n} from \"../compat_shapes.js\";\n\nexport interface OpenAiTranscriptionCreateOptions {\n\tfile : UploadBody;\n\tfilename ?: string;\n\tmodel ?: string;\n\tlanguage ?: string;\n\t// Explicit Content-Length when the body cannot be measured.\n\tfile_size ?: number;\n\t// When false, return the created job without polling (default true).\n\twait ?: boolean;\n}\n\nexport function createOpenAiAudioNamespace(\n\tclient : SpeechWeaveClient,\n) {\n\n\treturn {\n\t\ttranscriptions: {\n\t\t\t/** OpenAI-shaped transcription create — drop-in compatibility wrapper. */\n\t\t\tcreate: async ( opts : OpenAiTranscriptionCreateOptions ) => {\n\n\t\t\t\tconst name = opts.filename || \"audio.bin\";\n\t\t\t\tconst job = await uploadAndCreateJob( client, {\n\t\t\t\t\tdata: opts.file,\n\t\t\t\t\tfilename: name,\n\t\t\t\t\tmodel: opts.model,\n\t\t\t\t\tlanguage: opts.language,\n\t\t\t\t\tfile_size: opts.file_size,\n\t\t\t\t} );\n\t\t\t\tconst finished = await finishCompatJob( client, job, {\n\t\t\t\t\twait: opts.wait ?? true,\n\t\t\t\t\terror_code: \"OPENAI_PROXY\",\n\t\t\t\t} );\n\t\t\t\tif ( opts.wait === false ) {\n\n\t\t\t\t\treturn finished;\n\t\t\t\t\n\t\t\t\t}\n\n\t\t\t\treturn shapeOpenAiResponse( finished as Record<string, unknown> );\n\t\t\t\n\t\t\t},\n\t\t},\n\t};\n\n}\n","/**\n * Deepgram-shaped listen helpers.\n * Prefer the official Deepgram SDK with SpeechWeave base URL when migrating.\n */\nimport type { ReadStream } from \"node:fs\";\nimport type { SpeechWeaveClient } from \"../client.js\";\nimport {\n\tcreateJobFromUrl,\n\tfinishCompatJob,\n\tshapeDeepgramResponse,\n\tuploadAndCreateJob,\n\ttype UploadBody,\n} from \"../compat_shapes.js\";\n\nexport interface DeepgramTranscribeFileOptions {\n\tmodel ?: string;\n\tfilename ?: string;\n\tlanguage ?: string;\n\t// Explicit Content-Length when the body cannot be measured\n\tfile_size ?: number;\n\t// When false, return the created job without polling (default true).\n\twait ?: boolean;\n}\n\nexport interface DeepgramTranscribeUrlOptions {\n\tmodel ?: string;\n\tlanguage ?: string;\n\t// When false, return the created job without polling (default true).\n\twait ?: boolean;\n}\n\nexport function createDeepgramListenNamespace(\n\tclient : SpeechWeaveClient,\n) {\n\n\treturn {\n\t\tprerecorded: {\n\t\t\t/** Deepgram-shaped prerecorded file transcription — drop-in compatibility wrapper. */\n\t\t\ttranscribeFile: async (\n\t\t\t\tstream : UploadBody | ReadStream,\n\t\t\t\toptions : DeepgramTranscribeFileOptions = {},\n\t\t\t) => {\n\n\t\t\t\tconst job = await uploadAndCreateJob( client, {\n\t\t\t\t\tdata: stream,\n\t\t\t\t\tfilename: options.filename || \"audio.bin\",\n\t\t\t\t\tmodel: options.model,\n\t\t\t\t\tlanguage: options.language,\n\t\t\t\t\tfile_size: options.file_size,\n\t\t\t\t} );\n\t\t\t\tconst finished = await finishCompatJob( client, job, {\n\t\t\t\t\twait: options.wait ?? true,\n\t\t\t\t\terror_code: \"DEEPGRAM_PROXY\",\n\t\t\t\t} );\n\t\t\t\tif ( options.wait === false ) {\n\n\t\t\t\t\treturn finished;\n\t\t\t\t\n\t\t\t\t}\n\n\t\t\t\treturn shapeDeepgramResponse(\n\t\t\t\t\tfinished as Record<string, unknown>,\n\t\t\t\t\t{ model: options.model },\n\t\t\t\t);\n\t\t\t\n\t\t\t},\n\t\t\t/** Deepgram-shaped prerecorded URL transcription — drop-in compatibility wrapper. */\n\t\t\ttranscribeUrl: async (\n\t\t\t\turl : string,\n\t\t\t\toptions : DeepgramTranscribeUrlOptions = {},\n\t\t\t) => {\n\n\t\t\t\tconst job = await createJobFromUrl( client, {\n\t\t\t\t\turl,\n\t\t\t\t\tmodel: options.model,\n\t\t\t\t\tlanguage: options.language,\n\t\t\t\t} );\n\t\t\t\tconst finished = await finishCompatJob( client, job, {\n\t\t\t\t\twait: options.wait ?? true,\n\t\t\t\t\terror_code: \"DEEPGRAM_PROXY\",\n\t\t\t\t} );\n\t\t\t\tif ( options.wait === false ) {\n\n\t\t\t\t\treturn finished;\n\t\t\t\t\n\t\t\t\t}\n\n\t\t\t\treturn shapeDeepgramResponse(\n\t\t\t\t\tfinished as Record<string, unknown>,\n\t\t\t\t\t{ model: options.model },\n\t\t\t\t);\n\t\t\t\n\t\t\t},\n\t\t},\n\t};\n\n}\n","/**\n * AssemblyAI-shaped transcripts helpers.\n * Prefer the official AssemblyAI SDK with SpeechWeave when migrating.\n */\nimport type { ReadStream } from \"node:fs\";\nimport type { SpeechWeaveClient } from \"../client.js\";\nimport {\n\tcreateJobFromUrl,\n\tfinishCompatJob,\n\tshapeAssemblyResponse,\n\tuploadAndCreateJob,\n\ttype UploadBody,\n} from \"../compat_shapes.js\";\n\nexport interface AssemblyTranscribeConfig {\n\tmodel ?: string;\n\tlanguage ?: string;\n\t// Explicit Content-Length when the body cannot be measured\n\tfile_size ?: number;\n}\n\nexport function createAssemblyTranscriptsNamespace(\n\tclient : SpeechWeaveClient,\n) {\n\n\treturn {\n\t\t/** AssemblyAI-shaped transcription — drop-in compatibility wrapper. Pass a URL string or binary/file body. */\n\t\ttranscribe: async (\n\t\t\taudio : string | UploadBody | ReadStream,\n\t\t\tconfig ?: AssemblyTranscribeConfig,\n\t\t\toptions : { wait ?: boolean } = {},\n\t\t) => {\n\n\t\t\tconst cfg = config || {};\n\t\t\tconst wait = options.wait ?? true;\n\n\t\t\tlet job;\n\t\t\tif ( typeof audio === \"string\" ) {\n\n\t\t\t\tjob = await createJobFromUrl( client, {\n\t\t\t\t\turl: audio,\n\t\t\t\t\tmodel: cfg.model,\n\t\t\t\t\tlanguage: cfg.language,\n\t\t\t\t} );\n\t\t\t\n\t\t\t}\n\t\t\telse {\n\n\t\t\t\tjob = await uploadAndCreateJob( client, {\n\t\t\t\t\tdata: audio,\n\t\t\t\t\tfilename: \"audio.bin\",\n\t\t\t\t\tmodel: cfg.model,\n\t\t\t\t\tlanguage: cfg.language,\n\t\t\t\t\tfile_size: cfg.file_size,\n\t\t\t\t} );\n\t\t\t\n\t\t\t}\n\n\t\t\tconst finished = await finishCompatJob( client, job, {\n\t\t\t\twait,\n\t\t\t\terror_code: \"ASSEMBLY_PROXY\",\n\t\t\t} );\n\t\t\tif ( ! wait ) {\n\n\t\t\t\treturn finished;\n\t\t\t\n\t\t\t}\n\n\t\t\treturn shapeAssemblyResponse( finished as Record<string, unknown> );\n\t\t\n\t\t},\n\t};\n\n}\n","export { SpeechWeaveClient } from \"./client.js\";\nexport { SpeechWeaveError } from \"./errors.js\";\nexport { waitForJob } from \"./polling.js\";\nexport type { WaitForJobOptions } from \"./polling.js\";\nexport {\n\tcreateJobFromUrl,\n\tfinishCompatJob,\n\tshapeAssemblyResponse,\n\tshapeDeepgramResponse,\n\tshapeOpenAiResponse,\n\tuploadAndCreateJob,\n} from \"./compat_shapes.js\";\nexport type {\n\tCreateJobResponse,\n\tListJobsResponse,\n\tPresignResponse,\n\tPublicJobStatus,\n\tServiceMode,\n\tSpeechWeaveClientOptions,\n\tV1Job,\n} from \"./types.js\";\nexport { VERSION } from \"./version.js\";\nexport { verifyWebhook } from \"./webhooks.js\";\nexport type { VerifyWebhookResult } from \"./webhooks.js\";\n\nimport { SpeechWeaveClient } from \"./client.js\";\nimport { createOpenAiAudioNamespace } from \"./openai/openai_compat.js\";\nimport { createDeepgramListenNamespace } from \"./deepgram/deepgram_compat.js\";\nimport { createAssemblyTranscriptsNamespace } from \"./assembly/assembly_compat.js\";\nimport type { ServiceMode, SpeechWeaveClientOptions } from \"./types.js\";\n\nfunction createJobsNamespace(\n\tclient : SpeechWeaveClient,\n) {\n\n\treturn {\n\t\t/**\n\t\t * Create a job from a local file or a remote URL / object_key.\n\t\t * Pass `file` (path, Buffer, Blob, or stream) to presign-upload then create.\n\t\t * Otherwise pass one of `object_key`, `input_url`, or `audio_url` (no upload).\n\t\t * Omitting service_mode leaves the API default (deferred).\n\t\t */\n\t\tcreate: async ( params : {\n\t\t\tfile ?: string | Buffer | Blob | import( \"node:fs\" ).ReadStream;\n\t\t\tfilename ?: string;\n\t\t\tcontent_type ?: string;\n\t\t\tobject_key ?: string;\n\t\t\tinput_url ?: string;\n\t\t\taudio_url ?: string;\n\t\t\tmodel ?: string;\n\t\t\tservice_mode ?: ServiceMode;\n\t\t\tlanguage ?: string;\n\t\t\ttype ?: string;\n\t\t\tmetadata ?: Record<string, unknown>;\n\t\t\tfile_size ?: number;\n\t\t} ) => {\n\n\t\t\tif ( params.file != null ) {\n\n\t\t\t\tif ( typeof params.file === \"string\" ) {\n\n\t\t\t\t\treturn client.transcribeFilePath(\n\t\t\t\t\t\tparams.file,\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tmodel: params.model,\n\t\t\t\t\t\t\tservice_mode: params.service_mode,\n\t\t\t\t\t\t\tlanguage: params.language,\n\t\t\t\t\t\t\tcontent_type: params.content_type,\n\t\t\t\t\t\t\tmetadata: params.metadata,\n\t\t\t\t\t\t\tfile_size: params.file_size,\n\t\t\t\t\t\t},\n\t\t\t\t\t);\n\t\t\t\t\n\t\t\t\t}\n\n\t\t\t\treturn client.transcribeFile(\n\t\t\t\t\tparams.file,\n\t\t\t\t\t{\n\t\t\t\t\t\tfilename: params.filename,\n\t\t\t\t\t\tcontent_type: params.content_type,\n\t\t\t\t\t\tmodel: params.model,\n\t\t\t\t\t\tservice_mode: params.service_mode,\n\t\t\t\t\t\tlanguage: params.language,\n\t\t\t\t\t\tmetadata: params.metadata,\n\t\t\t\t\t\tfile_size: params.file_size,\n\t\t\t\t\t},\n\t\t\t\t);\n\t\t\t\n\t\t\t}\n\n\t\t\treturn client.createJob( {\n\t\t\t\tobject_key: params.object_key,\n\t\t\t\tinput_url: params.input_url,\n\t\t\t\taudio_url: params.audio_url,\n\t\t\t\tmodel: params.model,\n\t\t\t\tservice_mode: params.service_mode,\n\t\t\t\tlanguage: params.language,\n\t\t\t\ttype: params.type,\n\t\t\t\tmetadata: params.metadata,\n\t\t\t} );\n\t\t\n\t\t},\n\t\t/** Fetch the current job record. */\n\t\tget: client.getJob.bind( client ),\n\t\t/** List jobs for the authenticated account. */\n\t\tlist: client.listJobs.bind( client ),\n\t\t/**\n\t\t * Cancel a pending or processing job.\n\t\t * Fails if the job is already completed, failed, or cancelled.\n\t\t */\n\t\tcancel: client.cancelJob.bind( client ),\n\t};\n\n}\n\nexport class SpeechWeave extends SpeechWeaveClient {\n\n\treadonly audio : ReturnType<typeof createOpenAiAudioNamespace>;\n\treadonly listen : ReturnType<typeof createDeepgramListenNamespace>;\n\treadonly transcripts : ReturnType<typeof createAssemblyTranscriptsNamespace>;\n\treadonly jobs : ReturnType<typeof createJobsNamespace>;\n\n\tconstructor( options : SpeechWeaveClientOptions = {} ) {\n\n\t\tsuper( options );\n\t\tthis.audio = createOpenAiAudioNamespace( this );\n\t\tthis.listen = createDeepgramListenNamespace( this );\n\t\tthis.transcripts = createAssemblyTranscriptsNamespace( this );\n\t\tthis.jobs = createJobsNamespace( this );\n\t\n\t}\n\n}\n"],"mappings":";AAAA,SAAS,wBAAwB;AAEjC,SAAS,YAAY;;;ACFd,IAAM,mBAAN,cAA+B,MAAM;AAAA,EAElC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAET,YACC,SACA,SAAS,KACT,MACA,MACA,aACC;AAED,UAAO,OAAQ;AAEf,SAAK,OAAO;AACZ,SAAK,SAAS;AACd,SAAK,OAAO;AACZ,SAAK,OAAO;AACZ,SAAK,cAAc;AAAA,EAEpB;AAED;;;ACrBA,IAAM,WAAW,oBAAI,IAAK;AAAA,EACzB;AAAA,EACA;AAAA,EACA;AACD,CAAE;AAeF,eAAsB,WACrB,QACA,QACA,OAA2B,CAAC,GACR;AAEpB,QAAM,aAAa,KAAK,cAAc;AACtC,QAAM,UAAU,KAAK,WAAW;AAChC,QAAM,WAAa,KAAK,IAAI,IAAI;AAEhC,SAAQ,KAAK,IAAI,IAAI,UAAW;AAE/B,UAAM,MAAM,MAAM,OAAO,OAAQ,MAAO;AACxC,QAAK,SAAS,IAAK,OAAQ,IAAI,MAAO,CAAE,GAAI;AAE3C,aAAO;AAAA,IAER;AAEA,UAAM,IAAI,QAAS,CAAE,MAAO,WAAY,GAAG,OAAQ,CAAE;AAAA,EAEtD;AAEA,QAAM,IAAI;AAAA,IACT;AAAA,IACA;AAAA,IACA;AAAA,IACA,EAAE,OAAO;AAAA,EACV;AAED;;;ACrDO,IAAM,UAAU;;;AHgBvB,SAAS,iBACR,KACU;AAEV,QAAM,IAAI,OAAQ,OAAO,EAAG,EAAE,KAAK,EAAE,QAAS,QAAQ,EAAG;AAEzD,SAAO,KAAK;AAEb;AAEA,eAAe,iBACd,UACmB;AAEnB,QAAM,eAAe,SAAS,QAAQ,IAAK,cAAe,KAAK;AAC/D,MAAI;AAEH,QAAK,aAAa,SAAU,kBAAmB,GAAI;AAElD,YAAM,OAAS,MAAM,SAAS,KAAK;AAGnC,aAAO,OAAQ,MAAM,SAAS,MAAM,WAAW,SAAS,UAAW;AAAA,IAEpE;AACA,UAAM,OAAO,MAAM,SAAS,KAAK;AAEjC,WAAO,KAAK,MAAO,GAAG,GAAI,KAAK,SAAS;AAAA,EAEzC,QACM;AAEL,WAAO,SAAS;AAAA,EAEjB;AAED;AAEA,eAAe,cACd,MACA,WAC+B;AAE/B,MAAK,aAAa,QAAQ,OAAO,SAAU,SAAU,KAAK,aAAa,GAAI;AAE1E,WAAO;AAAA,EAER;AACA,MAAK,OAAO,SAAU,IAAK,GAAI;AAE9B,WAAO,KAAK;AAAA,EAEb;AACA,MAAK,gBAAgB,MAAO;AAE3B,WAAO,KAAK;AAAA,EAEb;AAEA,QAAM,YAAwB,KAA2C;AACzE,MACC,OAAO,cAAc,YAClB,OAAO,SAAU,SAAU,KAC3B,qBAAqB,KACvB;AAED,QAAI;AAEH,cAAS,MAAM,KAAM,SAAU,GAAI;AAAA,IAEpC,QACM;AAEL,aAAO;AAAA,IAER;AAAA,EAED;AAEA,SAAO;AAER;AAGO,IAAM,oBAAN,MAAwB;AAAA,EAEX;AAAA,EACA;AAAA,EACA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMnB,YACC,UAAqC,CAAC,GACrC;AAED,SAAK,UACJ,QAAQ,WAEP,OAAO,YAAY,eAChB,QAAQ,KAAK,uBAEd;AAEJ,SAAK,WAAW;AAAA,MACf,QAAQ,YAAY;AAAA,IACrB;AACA,SAAK,aAAa,QAAQ,cAAc;AACxC,QAAK,CAAE,KAAK,SAAU;AAErB,YAAM,IAAI,MAAO,mEAAoE;AAAA,IAEtF;AAAA,EAED;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,SACL,MACA,OAAqB,CAAC,GACD;AAErB,UAAM,iBAAiB,KAAK,WAAY,GAAI,IAAI,OAAO,IAAK,IAAK;AACjE,UAAM,MAAM,GAAI,KAAK,QAAS,GAAI,cAAe;AACjD,UAAM,IAAI,IAAI,QAAS,KAAK,OAAQ;AACpC,QAAK,CAAE,EAAE,IAAK,eAAgB,GAAI;AAEjC,QAAE,IAAK,iBAAiB,UAAW,KAAK,OAAQ,EAAG;AAAA,IAEpD;AACA,QAAK,CAAE,EAAE,IAAK,YAAa,GAAI;AAE9B,QAAE,IAAK,cAAc,oBAAqB,OAAQ,EAAG;AAAA,IAEtD;AAEA,WAAO,KAAK,WAAY,KAAK;AAAA,MAAE,GAAG;AAAA,MACjC,SAAS;AAAA,IAAE,CAAE;AAAA,EAEf;AAAA,EAEA,MAAgB,YACf,QACA,MACA,MACA,QACc;AAEd,QAAI,eAAe;AACnB,QAAK,QAAS;AAEb,YAAM,SAAS,IAAI,gBAAgB;AACnC,iBAAY;AAAA,QACX;AAAA,QACA;AAAA,MACD,KAAK,OAAO,QAAS,MAAO,GAAI;AAE/B,YAAK,UAAU,UAAa,UAAU,MAAO;AAE5C;AAAA,QAED;AACA,eAAO,IAAK,KAAK,OAAQ,KAAM,CAAE;AAAA,MAElC;AACA,YAAM,KAAK,OAAO,SAAS;AAC3B,UAAK,IAAK;AAET,uBAAe,GAAI,IAAK,GAAI,KAAK,SAAU,GAAI,IAAI,MAAM,GAAI,GAAI,EAAG;AAAA,MAErE;AAAA,IAED;AAEA,UAAM,UAAwB,EAAE,QAAQ,mBAAmB;AAC3D,QAAI;AACJ,QAAK,SAAS,QAAY;AAEzB,MAAE,QAAqC,cAAe,IAAI;AAC1D,aAAO,KAAK,UAAW,IAAK;AAAA,IAE7B;AAEA,UAAM,WAAW,MAAM,KAAK,SAAU,cAAc;AAAA,MAAE;AAAA,MACrD;AAAA,MACA;AAAA,IAAK,CAAE;AACR,QAAK,CAAE,SAAS,IAAK;AAEpB,YAAM,KAAK,SAAS,QAAQ,IAAK,cAAe,KAAK;AACrD,UAAI;AACJ,UAAI;AACJ,UAAI,OAA4B,OAAQ,SAAS,MAAO;AACxD,UAAI;AACJ,YAAM,eAAe,SAAS,QAAQ,IAAK,aAAc;AACzD,UAAK,cAAe;AAEnB,cAAM,IAAI,SAAU,cAAc,EAAG;AACrC,YAAK,OAAO,SAAU,CAAE,GAAI;AAE3B,wBAAc;AAAA,QAEf;AAAA,MAED;AACA,UAAI;AAEH,YAAK,GAAG,SAAU,kBAAmB,GAAI;AAExC,qBAAW,MAAM,SAAS,KAAK;AAC/B,gBAAM,IAAI;AAMV,oBAAU,OAAQ,GAAG,SAAS,GAAG,WAAW,SAAS,UAAW;AAChE,cAAK,GAAG,MAAO;AAEd,mBAAO,EAAE;AAAA,UAEV;AACA,cAAK,OAAO,GAAG,gBAAgB,UAAW;AAEzC,0BAAc,EAAE;AAAA,UAEjB;AAAA,QAED,OACK;AAEJ,gBAAM,IAAI,MAAM,SAAS,KAAK;AAC9B,oBAAU,EAAE,MAAO,GAAG,GAAI,KAAK,SAAS;AAAA,QAEzC;AAAA,MAED,QACM;AAEL,kBAAU,SAAS;AAAA,MAEpB;AAEA,YAAM,IAAI;AAAA,QACT;AAAA,QACA,SAAS;AAAA,QACT;AAAA,QACA;AAAA,QACA;AAAA,MACD;AAAA,IAED;AAEA,WAAS,MAAM,SAAS,KAAK;AAAA,EAE9B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,cACL,QAI4B;AAE5B,WAAO,KAAK;AAAA,MACX;AAAA,MACA;AAAA,MACA;AAAA,QACC,UAAU,OAAO;AAAA,QACjB,cAAc,OAAO;AAAA,MACtB;AAAA,IACD;AAAA,EAED;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,kBACL,WACA,MACA,aACA,UAAoC,CAAC,GACpB;AAEjB,UAAM,UAAU,IAAI,QAAS,EAAE,gBAAgB,YAAY,CAAE;AAC7D,UAAM,iBAAiB,MAAM,cAAe,MAAM,QAAQ,SAAU;AACpE,QAAK,kBAAkB,MAAO;AAE7B,cAAQ,IAAK,kBAAkB,OAAQ,cAAe,CAAE;AAAA,IAEzD;AAEA,UAAM,OAA4C;AAAA,MACjD,QAAQ;AAAA,MACR;AAAA,MACA;AAAA,IACD;AACA,UAAM,iBAAiB,QAAQ,OAAS,KAAqB,SAAS;AACtE,QAAK,gBAAiB;AAErB,WAAK,SAAS;AAAA,IAEf;AACA,UAAM,WAAW,MAAM,KAAK,WAAY,WAAW,IAAK;AACxD,QAAK,CAAE,SAAS,IAAK;AAEpB,YAAM,UAAU,MAAM,iBAAkB,QAAS;AACjD,YAAM,IAAI;AAAA,QACT,qBAAsB,OAAQ;AAAA,QAC9B,SAAS;AAAA,QACT;AAAA,MACD;AAAA,IAED;AAAA,EAED;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,MAAM,eACL,MACA,UAQI,CAAC,GACyB;AAE9B,UAAM,WAAW,QAAQ,YAAY;AACrC,UAAM,eAAe,QAAQ,gBAAgB;AAC7C,UAAM,UAAU,MAAM,KAAK,cAAe;AAAA,MACzC;AAAA,MACA;AAAA,IACD,CAAE;AACF,UAAM,WAAW,EAAE,WAAW,QAAQ,UAAU;AAEhD,QAAK,OAAO,SAAU,IAAK,KAAK,gBAAgB,MAAO;AAEtD,YAAM,KAAK,kBAAmB,QAAQ,YAAY,MAAM,cAAc,QAAS;AAAA,IAEhF,OACK;AAEJ,YAAM,KAAK;AAAA,QACV,QAAQ;AAAA,QACR;AAAA,QACA;AAAA,QACA;AAAA,MACD;AAAA,IAED;AAEA,WAAO,KAAK,UAAW;AAAA,MACtB,YAAY,QAAQ;AAAA,MACpB,OAAO,QAAQ;AAAA,MACf,cAAc,QAAQ;AAAA,MACtB,UAAU,QAAQ;AAAA,MAClB,UAAU,QAAQ;AAAA,IACnB,CAAE;AAAA,EAEH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,uBACL,MACA,UAUI,CAAC,GACa;AAElB,UAAM,UAAU,MAAM,KAAK,eAAgB,MAAM,OAAQ;AAEzD,WAAO;AAAA,MACN;AAAA,MACA,QAAQ;AAAA,MACR;AAAA,QACC,YAAY,QAAQ,mBAAmB,OAAQ,QAAQ,KAAK,2BAA2B,GAAQ;AAAA,QAC/F,SAAS,QAAQ,WAAW;AAAA,MAC7B;AAAA,IACD;AAAA,EAED;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYA,MAAM,UACL,QAU8B;AAE9B,UAAM,UAAoC;AAAA,MACzC,MAAM,OAAO,QAAQ;AAAA,IACtB;AACA,QAAK,OAAO,cAAc,MAAO;AAEhC,cAAQ,aAAa,OAAO;AAAA,IAE7B;AACA,QAAK,OAAO,aAAa,MAAO;AAE/B,cAAQ,YAAY,OAAO;AAAA,IAE5B;AACA,QAAK,OAAO,aAAa,MAAO;AAE/B,cAAQ,YAAY,OAAO;AAAA,IAE5B;AACA,QAAK,OAAO,SAAS,MAAO;AAE3B,cAAQ,QAAQ,OAAO;AAAA,IAExB;AACA,QAAK,OAAO,gBAAgB,MAAO;AAElC,cAAQ,eAAe,OAAO;AAAA,IAE/B;AACA,QAAK,OAAO,YAAY,MAAO;AAE9B,cAAQ,WAAW,OAAO;AAAA,IAE3B;AACA,QAAK,OAAO,YAAY,MAAO;AAE9B,cAAQ,WAAW,OAAO;AAAA,IAE3B;AAEA,WAAO,KAAK,YAAgC,QAAQ,SAAS,OAAQ;AAAA,EAEtE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,OACL,QACkB;AAElB,WAAO,KAAK;AAAA,MACX;AAAA,MACA,SAAU,mBAAoB,MAAO,CAAE;AAAA,IACxC;AAAA,EAED;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,SACL,SAII,CAAC,GACwB;AAE7B,WAAO,KAAK;AAAA,MACX;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,QACC,MAAM,OAAO;AAAA,QACb,OAAO,OAAO;AAAA,QACd,QAAQ,OAAO;AAAA,MAChB;AAAA,IACD;AAAA,EAED;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,UACL,QAC8B;AAE9B,WAAO,KAAK;AAAA,MACX;AAAA,MACA,SAAU,mBAAoB,MAAO,CAAE;AAAA,MACvC,CAAC;AAAA,IACF;AAAA,EAED;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,mBACL,WACA,UAOI,CAAC,GACyB;AAE9B,UAAM,SAAS,iBAAkB,SAAU;AAC3C,UAAM,OAAO,UAAU,MAAO,OAAQ,EAAE,IAAI,KAAK;AAEjD,WAAO,KAAK;AAAA,MACX;AAAA,MACA;AAAA,QACC,UAAU;AAAA,QACV,cAAc,QAAQ;AAAA,QACtB,OAAO,QAAQ;AAAA,QACf,cAAc,QAAQ;AAAA,QACtB,UAAU,QAAQ;AAAA,QAClB,UAAU,QAAQ;AAAA,QAClB,WAAW,QAAQ;AAAA,MACpB;AAAA,IACD;AAAA,EAED;AAED;;;AIjlBA,SAAS,QACR,KACU;AAEV,QAAM,OAAO,IAAI;AAEjB,SAAO,OAAO,SAAS,WAAW,OAAO;AAE1C;AAEA,SAAS,YACR,KACsB;AAEtB,QAAM,WAAW,IAAI;AACrB,MAAK,YAAY,MAAO;AAEvB,WAAO;AAAA,EAER;AACA,QAAM,QAAQ,OAAQ,QAAS;AAC/B,MAAK,CAAE,OAAO,SAAU,KAAM,KAAK,QAAQ,GAAI;AAE9C,WAAO;AAAA,EAER;AAEA,SAAO;AAER;AAEA,SAAS,YACR,KACsB;AAEtB,QAAM,WAAW,IAAI;AACrB,MAAK,YAAY,MAAO;AAEvB,WAAO;AAAA,EAER;AACA,QAAM,OAAO,OAAQ,QAAS,EAAE,KAAK,EAAE,YAAY;AAEnD,SAAO,QAAQ;AAEhB;AAEO,SAAS,oBACf,KAMC;AAED,QAAM,WAKF;AAAA,IACH,MAAM,QAAS,GAAI;AAAA,IACnB,MAAM;AAAA,EACP;AACA,QAAM,WAAW,YAAa,GAAI;AAClC,MAAK,aAAa,QAAY;AAE7B,aAAS,WAAW;AAAA,EAErB;AACA,QAAM,WAAW,YAAa,GAAI;AAClC,MAAK,aAAa,QAAY;AAE7B,aAAS,WAAW;AAAA,EAErB;AAEA,SAAO;AAER;AAEO,SAAS,sBACf,KACA,UAAuC,CAAC,GACb;AAE3B,QAAM,SAAS,OAAQ,IAAI,MAAM,EAAG;AACpC,QAAM,aAAa,QAAQ,SAAS,OAAQ,IAAI,SAAS,MAAO;AAChE,QAAM,OAAO,QAAS,GAAI;AAC1B,QAAM,WAAW,YAAa,GAAI;AAElC,QAAM,cAAwC;AAAA,IAC7C,YAAY;AAAA,IACZ,YAAY;AAAA,IACZ,OAAO,CACP;AAAA,EACD;AACA,MAAK,aAAa,QAAY;AAE7B,gBAAY,WAAW;AAAA,EAExB;AAEA,SAAO;AAAA,IACN,UAAU;AAAA,MACT,YAAY;AAAA,MACZ,YAAY;AAAA,QACX,MAAM;AAAA,QACN,SAAS;AAAA,QACT,MAAM;AAAA,MACP;AAAA,IACD;AAAA,IACA,SAAS;AAAA,MACR,UAAU;AAAA,QACT;AAAA,UACC,cAAc;AAAA,YACb;AAAA,UACD;AAAA,QACD;AAAA,MACD;AAAA,IACD;AAAA,EACD;AAED;AAEO,SAAS,sBACf,KAC2B;AAE3B,QAAM,SAAS,OAAQ,IAAI,UAAU,SAAU;AAC/C,QAAM,aAAa,WAAW,cAAc,cAAc;AAC1D,QAAM,WAAW,YAAa,GAAI;AAClC,QAAM,WAAW,YAAa,GAAI;AAClC,QAAM,QAAQ,IAAI;AAElB,QAAM,WAAqC;AAAA,IAC1C,IAAI,OAAQ,IAAI,MAAM,EAAG;AAAA,IACzB,QAAQ;AAAA,IACR,MAAM,QAAS,GAAI;AAAA,EACpB;AACA,MAAK,aAAa,QAAY;AAE7B,aAAS,iBAAiB;AAAA,EAE3B;AACA,MAAK,aAAa,QAAY;AAE7B,aAAS,WAAW;AAAA,EAErB;AACA,MAAK,SAAS,QAAQ,eAAe,UAAW;AAE/C,aAAS,QAAQ,OAAQ,KAAM;AAAA,EAEhC,OACK;AAEJ,aAAS,QAAQ;AAAA,EAElB;AAEA,SAAO;AAER;AAEA,eAAe,aACd,MAC6B;AAE7B,MAAK,gBAAgB,MAAO;AAE3B,WAAO;AAAA,MACN,MAAM;AAAA,MACN,cAAc,KAAK,QAAQ;AAAA,IAC5B;AAAA,EAED;AACA,MAAK,OAAO,SAAU,IAAK,KAAK,gBAAgB,YAAa;AAE5D,UAAM,MAAM,OAAO,SAAU,IAAK,IAAI,OAAO,OAAO,KAAM,IAAK;AAE/D,WAAO;AAAA,MACN,MAAM;AAAA,MACN,cAAc;AAAA,IACf;AAAA,EAED;AAGA,SAAO;AAAA,IACN,MAAM;AAAA,IACN,cAAc;AAAA,EACf;AAED;AAEA,eAAsB,mBACrB,QACA,QAU8B;AAE9B,QAAM,WAAW,MAAM,aAAc,OAAO,IAAK;AACjD,QAAM,eAAe,OAAO,gBAAgB,SAAS;AACrD,QAAM,OAAO,SAAS;AAEtB,QAAM,UAAU,MAAM,OAAO,cAAe;AAAA,IAC3C,UAAU,OAAO;AAAA,IACjB;AAAA,EACD,CAAE;AACF,QAAM,OAAO;AAAA,IACZ,QAAQ;AAAA,IACR;AAAA,IACA;AAAA,IACA,EAAE,WAAW,OAAO,UAAU;AAAA,EAC/B;AAEA,SAAO,OAAO,UAAW;AAAA,IACxB,YAAY,QAAQ;AAAA,IACpB,OAAO,OAAO;AAAA,IACd,UAAU,OAAO;AAAA,IACjB,cAAc,OAAO,gBAAgB;AAAA,IACrC,UAAU,OAAO;AAAA,EAClB,CAAE;AAEH;AAEA,eAAsB,iBACrB,QACA,QAO8B;AAE9B,SAAO,OAAO,UAAW;AAAA,IACxB,WAAW,OAAO;AAAA,IAClB,OAAO,OAAO;AAAA,IACd,UAAU,OAAO;AAAA,IACjB,cAAc,OAAO,gBAAgB;AAAA,IACrC,UAAU,OAAO;AAAA,EAClB,CAAE;AAEH;AAEA,eAAsB,gBACrB,QACA,KACA,SAMgE;AAEhE,MAAK,CAAE,QAAQ,MAAO;AAErB,WAAO;AAAA,EAER;AAEA,QAAM,WAAW,MAAM;AAAA,IACtB;AAAA,IACA,OAAU,IAA0B,MAAM,EAAG;AAAA,IAC7C;AAAA,MACC,YAAY,QAAQ,cAAc;AAAA,MAClC,SAAS,QAAQ,WAAW;AAAA,IAC7B;AAAA,EACD;AAEA,MAAK,OAAQ,SAAS,MAAO,MAAM,UAAW;AAE7C,UAAM,IAAI;AAAA,MACT,OAAQ,SAAS,SAAS,sBAAuB;AAAA,MACjD;AAAA,MACA,QAAQ;AAAA,MACR;AAAA,IACD;AAAA,EAED;AAEA,SAAO;AAER;;;AChTA,OAAO,YAAY;AAOnB,SAAS,gBACR,GACA,GACW;AAEX,QAAM,KAAK,OAAO,KAAM,GAAG,MAAO;AAClC,QAAM,KAAK,OAAO,KAAM,GAAG,MAAO;AAClC,MAAK,GAAG,WAAW,GAAG,QAAS;AAE9B,WAAO;AAAA,EAER;AAEA,SAAO,OAAO,gBAAiB,IAAI,EAAG;AAEvC;AAUO,SAAS,cACf,QACA,UACA,kBACA,oBAAoB,KACG;AAEvB,QAAM,WAAY,MAAM,QAAS,MAAO,IAAI,SAAS;AAAA,IACpD;AAAA,EACD,GACE,IAAK,OAAK,OAAQ,KAAK,EAAG,EAAE,KAAK,CAAE,EACnC,OAAQ,OAAQ;AAClB,MAAK,CAAE,QAAQ,QAAS;AAEvB,WAAO;AAAA,MACN,IAAI;AAAA,MACJ,QAAQ;AAAA,IACT;AAAA,EAED;AAEA,QAAM,SAAS,OAAQ,oBAAoB,EAAG,EAAE,KAAK;AACrD,QAAM,QAAQ,OAAO,MAAO,GAAI,EAAE,IAAK,OAAK,EAAE,KAAK,CAAE;AACrD,MAAI,IAAoB;AACxB,QAAM,UAAqB,CAC3B;AACA,aAAY,QAAQ,OAAQ;AAE3B,QAAK,KAAK,WAAY,IAAK,GAAI;AAE9B,UAAI,KAAK,MAAO,CAAE;AAAA,IAEnB;AAEA,QAAK,KAAK,WAAY,KAAM,GAAI;AAE/B,cAAQ,KAAM,KAAK,MAAO,CAAE,CAAE;AAAA,IAE/B;AAAA,EAED;AACA,MACC,CAAE,KACC,CAAE,QAAQ,QACZ;AAED,WAAO;AAAA,MACN,IAAI;AAAA,MACJ,QAAQ;AAAA,IACT;AAAA,EAED;AACA,QAAM,KAAK,OAAQ,CAAE;AACrB,MAAK,CAAE,OAAO,SAAU,EAAG,GAAI;AAE9B,WAAO;AAAA,MACN,IAAI;AAAA,MACJ,QAAQ;AAAA,IACT;AAAA,EAED;AACA,QAAM,MAAM,KAAK,MAAO,KAAK,IAAI,IAAI,GAAK;AAC1C,MAAK,KAAK,IAAK,MAAM,EAAG,IAAI,mBAAoB;AAE/C,WAAO;AAAA,MACN,IAAI;AAAA,MACJ,QAAQ;AAAA,IACT;AAAA,EAED;AAEA,aAAYA,WAAU,SAAU;AAE/B,UAAM,WAAW,OAAO,WAAY,UAAUA,OAAO,EAAE,OAAQ,GAAI,CAAE,IAAK,QAAS,EAAG,EAAE,OAAQ,KAAM;AACtG,eAAY,MAAM,SAAU;AAE3B,UAAK,gBAAiB,UAAU,EAAG,GAAI;AAEtC,eAAO;AAAA,UACN,IAAI;AAAA,QACL;AAAA,MAED;AAAA,IAED;AAAA,EAED;AAEA,SAAO;AAAA,IACN,IAAI;AAAA,IACJ,QAAQ;AAAA,EACT;AAED;;;ACtGO,SAAS,2BACf,QACC;AAED,SAAO;AAAA,IACN,gBAAgB;AAAA;AAAA,MAEf,QAAQ,OAAQ,SAA6C;AAE5D,cAAM,OAAO,KAAK,YAAY;AAC9B,cAAM,MAAM,MAAM,mBAAoB,QAAQ;AAAA,UAC7C,MAAM,KAAK;AAAA,UACX,UAAU;AAAA,UACV,OAAO,KAAK;AAAA,UACZ,UAAU,KAAK;AAAA,UACf,WAAW,KAAK;AAAA,QACjB,CAAE;AACF,cAAM,WAAW,MAAM,gBAAiB,QAAQ,KAAK;AAAA,UACpD,MAAM,KAAK,QAAQ;AAAA,UACnB,YAAY;AAAA,QACb,CAAE;AACF,YAAK,KAAK,SAAS,OAAQ;AAE1B,iBAAO;AAAA,QAER;AAEA,eAAO,oBAAqB,QAAoC;AAAA,MAEjE;AAAA,IACD;AAAA,EACD;AAED;;;ACzBO,SAAS,8BACf,QACC;AAED,SAAO;AAAA,IACN,aAAa;AAAA;AAAA,MAEZ,gBAAgB,OACf,QACA,UAA0C,CAAC,MACvC;AAEJ,cAAM,MAAM,MAAM,mBAAoB,QAAQ;AAAA,UAC7C,MAAM;AAAA,UACN,UAAU,QAAQ,YAAY;AAAA,UAC9B,OAAO,QAAQ;AAAA,UACf,UAAU,QAAQ;AAAA,UAClB,WAAW,QAAQ;AAAA,QACpB,CAAE;AACF,cAAM,WAAW,MAAM,gBAAiB,QAAQ,KAAK;AAAA,UACpD,MAAM,QAAQ,QAAQ;AAAA,UACtB,YAAY;AAAA,QACb,CAAE;AACF,YAAK,QAAQ,SAAS,OAAQ;AAE7B,iBAAO;AAAA,QAER;AAEA,eAAO;AAAA,UACN;AAAA,UACA,EAAE,OAAO,QAAQ,MAAM;AAAA,QACxB;AAAA,MAED;AAAA;AAAA,MAEA,eAAe,OACd,KACA,UAAyC,CAAC,MACtC;AAEJ,cAAM,MAAM,MAAM,iBAAkB,QAAQ;AAAA,UAC3C;AAAA,UACA,OAAO,QAAQ;AAAA,UACf,UAAU,QAAQ;AAAA,QACnB,CAAE;AACF,cAAM,WAAW,MAAM,gBAAiB,QAAQ,KAAK;AAAA,UACpD,MAAM,QAAQ,QAAQ;AAAA,UACtB,YAAY;AAAA,QACb,CAAE;AACF,YAAK,QAAQ,SAAS,OAAQ;AAE7B,iBAAO;AAAA,QAER;AAEA,eAAO;AAAA,UACN;AAAA,UACA,EAAE,OAAO,QAAQ,MAAM;AAAA,QACxB;AAAA,MAED;AAAA,IACD;AAAA,EACD;AAED;;;AC3EO,SAAS,mCACf,QACC;AAED,SAAO;AAAA;AAAA,IAEN,YAAY,OACX,OACA,QACA,UAAgC,CAAC,MAC7B;AAEJ,YAAM,MAAM,UAAU,CAAC;AACvB,YAAM,OAAO,QAAQ,QAAQ;AAE7B,UAAI;AACJ,UAAK,OAAO,UAAU,UAAW;AAEhC,cAAM,MAAM,iBAAkB,QAAQ;AAAA,UACrC,KAAK;AAAA,UACL,OAAO,IAAI;AAAA,UACX,UAAU,IAAI;AAAA,QACf,CAAE;AAAA,MAEH,OACK;AAEJ,cAAM,MAAM,mBAAoB,QAAQ;AAAA,UACvC,MAAM;AAAA,UACN,UAAU;AAAA,UACV,OAAO,IAAI;AAAA,UACX,UAAU,IAAI;AAAA,UACd,WAAW,IAAI;AAAA,QAChB,CAAE;AAAA,MAEH;AAEA,YAAM,WAAW,MAAM,gBAAiB,QAAQ,KAAK;AAAA,QACpD;AAAA,QACA,YAAY;AAAA,MACb,CAAE;AACF,UAAK,CAAE,MAAO;AAEb,eAAO;AAAA,MAER;AAEA,aAAO,sBAAuB,QAAoC;AAAA,IAEnE;AAAA,EACD;AAED;;;AC1CA,SAAS,oBACR,QACC;AAED,SAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAON,QAAQ,OAAQ,WAaT;AAEN,UAAK,OAAO,QAAQ,MAAO;AAE1B,YAAK,OAAO,OAAO,SAAS,UAAW;AAEtC,iBAAO,OAAO;AAAA,YACb,OAAO;AAAA,YACP;AAAA,cACC,OAAO,OAAO;AAAA,cACd,cAAc,OAAO;AAAA,cACrB,UAAU,OAAO;AAAA,cACjB,cAAc,OAAO;AAAA,cACrB,UAAU,OAAO;AAAA,cACjB,WAAW,OAAO;AAAA,YACnB;AAAA,UACD;AAAA,QAED;AAEA,eAAO,OAAO;AAAA,UACb,OAAO;AAAA,UACP;AAAA,YACC,UAAU,OAAO;AAAA,YACjB,cAAc,OAAO;AAAA,YACrB,OAAO,OAAO;AAAA,YACd,cAAc,OAAO;AAAA,YACrB,UAAU,OAAO;AAAA,YACjB,UAAU,OAAO;AAAA,YACjB,WAAW,OAAO;AAAA,UACnB;AAAA,QACD;AAAA,MAED;AAEA,aAAO,OAAO,UAAW;AAAA,QACxB,YAAY,OAAO;AAAA,QACnB,WAAW,OAAO;AAAA,QAClB,WAAW,OAAO;AAAA,QAClB,OAAO,OAAO;AAAA,QACd,cAAc,OAAO;AAAA,QACrB,UAAU,OAAO;AAAA,QACjB,MAAM,OAAO;AAAA,QACb,UAAU,OAAO;AAAA,MAClB,CAAE;AAAA,IAEH;AAAA;AAAA,IAEA,KAAK,OAAO,OAAO,KAAM,MAAO;AAAA;AAAA,IAEhC,MAAM,OAAO,SAAS,KAAM,MAAO;AAAA;AAAA;AAAA;AAAA;AAAA,IAKnC,QAAQ,OAAO,UAAU,KAAM,MAAO;AAAA,EACvC;AAED;AAEO,IAAM,cAAN,cAA0B,kBAAkB;AAAA,EAEzC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAET,YAAa,UAAqC,CAAC,GAAI;AAEtD,UAAO,OAAQ;AACf,SAAK,QAAQ,2BAA4B,IAAK;AAC9C,SAAK,SAAS,8BAA+B,IAAK;AAClD,SAAK,cAAc,mCAAoC,IAAK;AAC5D,SAAK,OAAO,oBAAqB,IAAK;AAAA,EAEvC;AAED;","names":["secret"]}
1
+ {"version":3,"sources":["../src/client.ts","../src/errors.ts","../src/polling.ts","../src/version.ts","../src/compat_shapes.ts","../src/webhooks.ts","../src/openai/openai_compat.ts","../src/deepgram/deepgram_compat.ts","../src/assembly/assembly_compat.ts","../src/index.ts"],"sourcesContent":["import { createReadStream } from \"node:fs\";\nimport type { ReadStream } from \"node:fs\";\nimport { stat } from \"node:fs/promises\";\nimport { SpeechWeaveError } from \"./errors.js\";\nimport { waitForJob } from \"./polling.js\";\nimport type {\n\tCreateJobResponse,\n\tCancelJobResponse,\n\tListJobsResponse,\n\tPresignResponse,\n\tServiceMode,\n\tSpeechWeaveClientOptions,\n\tV1Job,\n} from \"./types.js\";\nimport { VERSION } from \"./version.js\";\n\nfunction normalizeBaseURL(\n\turl : string,\n) : string {\n\n\tconst s = String( url || \"\" ).trim().replace( /\\/+$/, \"\" );\n\n\treturn s || \"https://api.speechweave.com/v1\";\n\n}\n\nasync function readErrorMessage(\n\tresponse : Response,\n) : Promise<string> {\n\n\tconst content_type = response.headers.get( \"content-type\" ) || \"\";\n\ttry {\n\n\t\tif ( content_type.includes( \"application/json\" ) ) {\n\n\t\t\tconst json = ( await response.json() ) as { error ?: string;\n\t\t\t\tmessage ?: string; };\n\n\t\t\treturn String( json?.error || json?.message || response.statusText );\n\t\t\n\t\t}\n\t\tconst text = await response.text();\n\n\t\treturn text.slice( 0, 500 ) || response.statusText;\n\t\n\t}\n\tcatch {\n\n\t\treturn response.statusText;\n\t\n\t}\n\n}\n\nasync function getBodyLength(\n\tbody : Buffer | ReadStream | Blob,\n\tfile_size ?: number,\n) : Promise<number | undefined> {\n\n\tif ( file_size != null && Number.isFinite( file_size ) && file_size >= 0 ) {\n\n\t\treturn file_size;\n\t\n\t}\n\tif ( Buffer.isBuffer( body ) ) {\n\n\t\treturn body.byteLength;\n\t\n\t}\n\tif ( body instanceof Blob ) {\n\n\t\treturn body.size;\n\t\n\t}\n\n\tconst path_like : unknown = ( body as ReadStream & { path ?: unknown } ).path;\n\tif (\n\t\ttypeof path_like === \"string\"\n\t\t|| Buffer.isBuffer( path_like )\n\t\t|| path_like instanceof URL\n\t) {\n\n\t\ttry {\n\n\t\t\treturn ( await stat( path_like ) ).size;\n\t\t\n\t\t}\n\t\tcatch {\n\n\t\t\treturn undefined;\n\t\t\n\t\t}\n\t\n\t}\n\n\treturn undefined;\n\n}\n\n/** Low-level SpeechWeave `/v1` client (presign, jobs, uploads). */\nexport class SpeechWeaveClient {\n\n\tprotected readonly api_key : string;\n\tprotected readonly base_url : string;\n\tprotected readonly fetch_func : typeof fetch;\n\n\t/**\n\t * @param options.api_key - Falls back to SPEECHWEAVE_API_KEY. Throws if neither is set.\n\t * @param options.base_url - Defaults to https://api.speechweave.com/v1.\n\t */\n\tconstructor(\n\t\toptions : SpeechWeaveClientOptions = {},\n\t) {\n\n\t\tthis.api_key = (\n\t\t\toptions.api_key\n\t\t\t|| (\n\t\t\t\ttypeof process !== \"undefined\"\n\t\t\t\t&& process.env?.SPEECHWEAVE_API_KEY\n\t\t\t)\n\t\t\t|| \"\"\n\t\t);\n\t\tthis.base_url = normalizeBaseURL(\n\t\t\toptions.base_url || \"https://api.speechweave.com/v1\",\n\t\t);\n\t\tthis.fetch_func = options.fetch_func || fetch;\n\t\tif ( ! this.api_key ) {\n\n\t\t\tthrow new Error( \"SpeechWeave API key is required (api_key, or SPEECHWEAVE_API_KEY)\" );\n\t\t\n\t\t}\n\t\n\t}\n\n\t/**\n\t * Authenticated fetch against base_url.\n\t * Adds Bearer and User-Agent when missing. Path is relative (leading `/` optional).\n\t */\n\tasync rawFetch(\n\t\tpath : string,\n\t\tinit : RequestInit = {},\n\t) : Promise<Response> {\n\n\t\tconst formatted_path = path.startsWith( \"/\" ) ? path : `/${ path }`;\n\t\tconst url = `${ this.base_url }${ formatted_path }`;\n\t\tconst h = new Headers( init.headers );\n\t\tif ( ! h.has( \"Authorization\" ) ) {\n\n\t\t\th.set( \"Authorization\", `Bearer ${ this.api_key }` );\n\t\t\n\t\t}\n\t\tif ( ! h.has( \"User-Agent\" ) ) {\n\n\t\t\th.set( \"User-Agent\", `speechweave-node/${ VERSION }` );\n\t\t\n\t\t}\n\n\t\treturn this.fetch_func( url, { ...init,\n\t\t\theaders: h } );\n\t\n\t}\n\n\tprotected async requestJson<T>(\n\t\tmethod : string,\n\t\tpath : string,\n\t\tjson ?: unknown,\n\t\tparams ?: Record<string, string | number | boolean | undefined | null>,\n\t) : Promise<T> {\n\n\t\tlet request_path = path;\n\t\tif ( params ) {\n\n\t\t\tconst search = new URLSearchParams();\n\t\t\tfor ( const [\n\t\t\t\tkey,\n\t\t\t\tvalue, \n\t\t\t] of Object.entries( params ) ) {\n\n\t\t\t\tif ( value === undefined || value === null ) {\n\n\t\t\t\t\tcontinue;\n\t\t\t\t\n\t\t\t\t}\n\t\t\t\tsearch.set( key, String( value ) );\n\t\t\t\n\t\t\t}\n\t\t\tconst qs = search.toString();\n\t\t\tif ( qs ) {\n\n\t\t\t\trequest_path = `${ path }${ path.includes( \"?\" ) ? \"&\" : \"?\" }${ qs }`;\n\t\t\t\n\t\t\t}\n\t\t\n\t\t}\n\n\t\tconst headers : HeadersInit = { Accept: \"application/json\" };\n\t\tlet body : string | undefined;\n\t\tif ( json !== undefined ) {\n\n\t\t\t( headers as Record<string, string> )[ \"Content-Type\" ] = \"application/json\";\n\t\t\tbody = JSON.stringify( json );\n\t\t\n\t\t}\n\n\t\tconst response = await this.rawFetch( request_path, { method,\n\t\t\theaders,\n\t\t\tbody } );\n\t\tif ( ! response.ok ) {\n\n\t\t\tconst ct = response.headers.get( \"content-type\" ) || \"\";\n\t\t\tlet err_body : unknown;\n\t\t\tlet message : string;\n\t\t\tlet code : string | undefined = String( response.status );\n\t\t\tlet retry_after : number | undefined;\n\t\t\tconst header_retry = response.headers.get( \"Retry-After\" );\n\t\t\tif ( header_retry ) {\n\n\t\t\t\tconst n = parseInt( header_retry, 10 );\n\t\t\t\tif ( Number.isFinite( n ) ) {\n\n\t\t\t\t\tretry_after = n;\n\t\t\t\t\n\t\t\t\t}\n\t\t\t\n\t\t\t}\n\t\t\ttry {\n\n\t\t\t\tif ( ct.includes( \"application/json\" ) ) {\n\n\t\t\t\t\terr_body = await response.json();\n\t\t\t\t\tconst j = err_body as {\n\t\t\t\t\t\terror ?: string;\n\t\t\t\t\t\tmessage ?: string;\n\t\t\t\t\t\tcode ?: string;\n\t\t\t\t\t\tretry_after ?: number;\n\t\t\t\t\t};\n\t\t\t\t\tmessage = String( j?.error || j?.message || response.statusText );\n\t\t\t\t\tif ( j?.code ) {\n\n\t\t\t\t\t\tcode = j.code;\n\t\t\t\t\t\n\t\t\t\t\t}\n\t\t\t\t\tif ( typeof j?.retry_after === \"number\" ) {\n\n\t\t\t\t\t\tretry_after = j.retry_after;\n\t\t\t\t\t\n\t\t\t\t\t}\n\t\t\t\t\n\t\t\t\t}\n\t\t\t\telse {\n\n\t\t\t\t\tconst t = await response.text();\n\t\t\t\t\tmessage = t.slice( 0, 500 ) || response.statusText;\n\t\t\t\t\n\t\t\t\t}\n\t\t\t\n\t\t\t}\n\t\t\tcatch {\n\n\t\t\t\tmessage = response.statusText;\n\t\t\t\n\t\t\t}\n\n\t\t\tthrow new SpeechWeaveError(\n\t\t\t\tmessage,\n\t\t\t\tresponse.status,\n\t\t\t\tcode,\n\t\t\t\terr_body,\n\t\t\t\tretry_after,\n\t\t\t);\n\t\t\n\t\t}\n\n\t\treturn ( await response.json() ) as T;\n\t\n\t}\n\n\t/**\n\t * Request a short-lived PUT URL and object_key for direct upload to storage.\n\t *\n\t * @param params.filename - Original name (used in the storage key).\n\t * @param params.content_type - MIME type that must match the subsequent PUT.\n\t */\n\tasync presignUpload(\n\t\tparams : {\n\t\t\tfilename : string;\n\t\t\tcontent_type : string;\n\t\t},\n\t) : Promise<PresignResponse> {\n\n\t\treturn this.requestJson<PresignResponse>(\n\t\t\t\"POST\",\n\t\t\t\"/uploads\",\n\t\t\t{\n\t\t\t\tfilename: params.filename,\n\t\t\t\tcontent_type: params.content_type,\n\t\t\t},\n\t\t);\n\t\n\t}\n\n\t/**\n\t * PUT audio bytes to a presigned upload_url.\n\t * Sets Content-Length when the body can be measured; pass file_size for pipes/live streams.\n\t *\n\t * @param uploadUrl - upload_url from presignUpload.\n\t */\n\tasync putToPresignedUrl(\n\t\tuploadUrl : string,\n\t\tbody : Buffer | ReadStream | Blob,\n\t\tcontentType : string,\n\t\toptions : { file_size ?: number } = {},\n\t) : Promise<void> {\n\n\t\tconst headers = new Headers( { \"Content-Type\": contentType } );\n\t\tconst content_length = await getBodyLength( body, options.file_size );\n\t\tif ( content_length != null ) {\n\n\t\t\theaders.set( \"Content-Length\", String( content_length ) );\n\t\t\n\t\t}\n\n\t\tconst init : RequestInit & { duplex ?: string } = {\n\t\t\tmethod: \"PUT\",\n\t\t\theaders,\n\t\t\tbody: body as BodyInit,\n\t\t};\n\t\tconst is_node_stream = body && typeof ( body as ReadStream ).pipe === \"function\";\n\t\tif ( is_node_stream ) {\n\n\t\t\tinit.duplex = \"half\";\n\t\t\n\t\t}\n\t\tconst response = await this.fetch_func( uploadUrl, init );\n\t\tif ( ! response.ok ) {\n\n\t\t\tconst message = await readErrorMessage( response );\n\t\t\tthrow new SpeechWeaveError(\n\t\t\t\t`R2 upload failed: ${ message }`,\n\t\t\t\tresponse.status,\n\t\t\t\t\"UPLOAD_FAILED\",\n\t\t\t);\n\t\t\n\t\t}\n\t\n\t}\n\n\t/**\n\t * Presign → PUT → create job. Returns the create ack (no transcript); poll getJob or waitForJob.\n\t * Omitting service_mode leaves the API default (deferred). Synchronous rejects files over the sync size cap (default 512 MiB).\n\t *\n\t * @param options.filename - Defaults to audio.bin.\n\t * @param options.content_type - Defaults to application/octet-stream.\n\t * @param options.language - Two-letter ISO code (e.g. 'en', 'es').\n\t * @param options.file_size - Content-Length when the body cannot be measured (pipes, live streams).\n\t */\n\tasync transcribeFile(\n\t\tfile : ReadStream | Buffer | Blob,\n\t\toptions : {\n\t\t\tfilename ?: string;\n\t\t\tcontent_type ?: string;\n\t\t\tmodel ?: string;\n\t\t\tservice_mode ?: ServiceMode;\n\t\t\tlanguage ?: string;\n\t\t\tmetadata ?: Record<string, unknown>;\n\t\t\tfile_size ?: number;\n\t\t} = {},\n\t) : Promise<CreateJobResponse> {\n\n\t\tconst filename = options.filename || \"audio.bin\";\n\t\tconst content_type = options.content_type || \"application/octet-stream\";\n\t\tconst presign = await this.presignUpload( {\n\t\t\tfilename,\n\t\t\tcontent_type,\n\t\t} );\n\t\tconst put_opts = { file_size: options.file_size };\n\n\t\tif ( Buffer.isBuffer( file ) || file instanceof Blob ) {\n\n\t\t\tawait this.putToPresignedUrl( presign.upload_url, file, content_type, put_opts );\n\t\t\n\t\t}\n\t\telse {\n\n\t\t\tawait this.putToPresignedUrl(\n\t\t\t\tpresign.upload_url,\n\t\t\t\tfile as ReadStream,\n\t\t\t\tcontent_type,\n\t\t\t\tput_opts,\n\t\t\t);\n\t\t\n\t\t}\n\n\t\treturn this.createJob( {\n\t\t\tobject_key: presign.object_key,\n\t\t\tmodel: options.model,\n\t\t\tservice_mode: options.service_mode,\n\t\t\tlanguage: options.language,\n\t\t\tmetadata: options.metadata,\n\t\t} );\n\t\n\t}\n\n\t/**\n\t * Same as {@link transcribeFile}, then poll until completed, failed, or cancelled.\n\t *\n\t * @param options.wait_timeout_ms - Defaults to SPEECHWEAVE_JOB_WAIT_MS or 300_000.\n\t * @param options.poll_ms - Poll interval; defaults to 1500.\n\t */\n\tasync transcribeFileBlocking(\n\t\tfile : ReadStream | Buffer | Blob,\n\t\toptions : {\n\t\t\tfilename ?: string;\n\t\t\tcontent_type ?: string;\n\t\t\tmodel ?: string;\n\t\t\tservice_mode ?: ServiceMode;\n\t\t\tlanguage ?: string;\n\t\t\tmetadata ?: Record<string, unknown>;\n\t\t\tfile_size ?: number;\n\t\t\twait_timeout_ms ?: number;\n\t\t\tpoll_ms ?: number;\n\t\t} = {},\n\t) : Promise<V1Job> {\n\n\t\tconst created = await this.transcribeFile( file, options );\n\n\t\treturn waitForJob(\n\t\t\tthis,\n\t\t\tcreated.id,\n\t\t\t{\n\t\t\t\ttimeout_ms: options.wait_timeout_ms ?? Number( process.env?.SPEECHWEAVE_JOB_WAIT_MS || 300_000 ),\n\t\t\t\tpoll_ms: options.poll_ms ?? 1_500,\n\t\t\t},\n\t\t);\n\t\n\t}\n\n\t/**\n\t * Create a transcription job from an already-uploaded object or a remote URL.\n\t * Provide exactly one of object_key, input_url, or audio_url. type defaults to transcription.\n\t * Omitting service_mode leaves the API default (deferred).\n\t *\n\t * @param params.object_key - From PresignResponse after a successful PUT.\n\t * @param params.input_url - Publicly reachable audio URL.\n\t * @param params.audio_url - Alias for input_url.\n\t * @param params.language - Two-letter ISO code (e.g. 'en', 'es').\n\t */\n\tasync createJob(\n\t\tparams : {\n\t\t\tobject_key ?: string;\n\t\t\tinput_url ?: string;\n\t\t\taudio_url ?: string;\n\t\t\tmodel ?: string;\n\t\t\tservice_mode ?: ServiceMode;\n\t\t\tlanguage ?: string;\n\t\t\ttype ?: string;\n\t\t\tmetadata ?: Record<string, unknown>;\n\t\t},\n\t) : Promise<CreateJobResponse> {\n\n\t\tconst payload : Record<string, unknown> = {\n\t\t\ttype: params.type || \"transcription\",\n\t\t};\n\t\tif ( params.object_key != null ) {\n\n\t\t\tpayload.object_key = params.object_key;\n\t\t\n\t\t}\n\t\tif ( params.input_url != null ) {\n\n\t\t\tpayload.input_url = params.input_url;\n\t\t\n\t\t}\n\t\tif ( params.audio_url != null ) {\n\n\t\t\tpayload.audio_url = params.audio_url;\n\t\t\n\t\t}\n\t\tif ( params.model != null ) {\n\n\t\t\tpayload.model = params.model;\n\t\t\n\t\t}\n\t\tif ( params.service_mode != null ) {\n\n\t\t\tpayload.service_mode = params.service_mode;\n\t\t\n\t\t}\n\t\tif ( params.language != null ) {\n\n\t\t\tpayload.language = params.language;\n\t\t\n\t\t}\n\t\tif ( params.metadata != null ) {\n\n\t\t\tpayload.metadata = params.metadata;\n\t\t\n\t\t}\n\n\t\treturn this.requestJson<CreateJobResponse>( \"POST\", \"/jobs\", payload );\n\t\n\t}\n\n\t/**\n\t * Fetch the current job record (status, transcript when completed, error when failed).\n\t *\n\t * @param job_id - Id from createJob / transcribeFile.\n\t */\n\tasync getJob(\n\t\tjob_id : string,\n\t) : Promise<V1Job> {\n\n\t\treturn this.requestJson<V1Job>(\n\t\t\t\"GET\",\n\t\t\t`/jobs/${ encodeURIComponent( job_id ) }`,\n\t\t);\n\t\n\t}\n\n\t/**\n\t * List jobs for the authenticated account.\n\t *\n\t * @param params.status - Filter by PublicJobStatus value.\n\t * @param params.page - 1-based page; API default if omitted.\n\t * @param params.limit - Page size; API default if omitted.\n\t */\n\tasync listJobs(\n\t\tparams : {\n\t\t\tpage ?: number;\n\t\t\tlimit ?: number;\n\t\t\tstatus ?: string;\n\t\t} = {},\n\t) : Promise<ListJobsResponse> {\n\n\t\treturn this.requestJson<ListJobsResponse>(\n\t\t\t\"GET\",\n\t\t\t\"/jobs\",\n\t\t\tundefined,\n\t\t\t{\n\t\t\t\tpage: params.page,\n\t\t\t\tlimit: params.limit,\n\t\t\t\tstatus: params.status,\n\t\t\t},\n\t\t);\n\t\n\t}\n\n\t/**\n\t * Cancel a pending or processing job.\n\t * Fails if the job is already completed, failed, or cancelled.\n\t *\n\t * @param job_id - Id from createJob / transcribeFile.\n\t */\n\tasync cancelJob(\n\t\tjob_id : string,\n\t) : Promise<CancelJobResponse> {\n\n\t\treturn this.requestJson(\n\t\t\t\"POST\",\n\t\t\t`/jobs/${ encodeURIComponent( job_id ) }/cancel`,\n\t\t\t{},\n\t\t);\n\t\n\t}\n\n\t/**\n\t * Open a disk path and run {@link transcribeFile}.\n\t * filename is taken from the path basename.\n\t *\n\t * @param file_path - Absolute or relative path on the local filesystem.\n\t */\n\tasync transcribeFilePath(\n\t\tfile_path : string,\n\t\toptions : {\n\t\t\tmodel ?: string;\n\t\t\tservice_mode ?: ServiceMode;\n\t\t\tlanguage ?: string;\n\t\t\tcontent_type ?: string;\n\t\t\tmetadata ?: Record<string, unknown>;\n\t\t\tfile_size ?: number;\n\t\t} = {},\n\t) : Promise<CreateJobResponse> {\n\n\t\tconst stream = createReadStream( file_path );\n\t\tconst base = file_path.split( /[/\\\\]/ ).pop() || \"audio.bin\";\n\n\t\treturn this.transcribeFile(\n\t\t\tstream,\n\t\t\t{\n\t\t\t\tfilename: base,\n\t\t\t\tcontent_type: options.content_type,\n\t\t\t\tmodel: options.model,\n\t\t\t\tservice_mode: options.service_mode,\n\t\t\t\tlanguage: options.language,\n\t\t\t\tmetadata: options.metadata,\n\t\t\t\tfile_size: options.file_size,\n\t\t\t},\n\t\t);\n\t\n\t}\n\n}\n","export class SpeechWeaveError extends Error {\n\n\treadonly status : number;\n\treadonly code ?: string;\n\treadonly body ?: unknown;\n\treadonly retry_after ?: number;\n\n\tconstructor(\n\t\tmessage : string,\n\t\tstatus = 500,\n\t\tcode ?: string,\n\t\tbody ?: unknown,\n\t\tretry_after ?: number,\n\t) {\n\n\t\tsuper( message );\n\n\t\tthis.name = \"SpeechWeaveError\";\n\t\tthis.status = status;\n\t\tthis.code = code;\n\t\tthis.body = body;\n\t\tthis.retry_after = retry_after;\n\t\n\t}\n\n}\n","import type { SpeechWeaveClient } from \"./client.js\";\nimport type { V1Job } from \"./types.js\";\nimport { SpeechWeaveError } from \"./errors.js\";\n\nconst TERMINAL = new Set( [\n\t\"completed\",\n\t\"failed\",\n\t\"cancelled\",\n] );\n\nexport interface WaitForJobOptions {\n\t/** Max wait in ms; defaults to 3_600_000. */\n\ttimeout_ms ?: number;\n\t/** Interval between getJob polls; defaults to 2000. */\n\tpoll_ms ?: number;\n}\n\n/**\n * Poll getJob until completed, failed, or cancelled.\n * Throws SpeechWeaveError with code JOB_WAIT_TIMEOUT on deadline.\n *\n * @param job_id - Id from createJob / transcribeFile.\n */\nexport async function waitForJob(\n\tclient : SpeechWeaveClient,\n\tjob_id : string,\n\topts : WaitForJobOptions = {},\n) : Promise< V1Job > {\n\n\tconst timeout_ms = opts.timeout_ms ?? 3_600_000;\n\tconst poll_ms = opts.poll_ms ?? 2_000;\n\tconst deadline = ( Date.now() + timeout_ms );\n\n\twhile ( Date.now() < deadline ) {\n\n\t\tconst job = await client.getJob( job_id );\n\t\tif ( TERMINAL.has( String( job.status ) ) ) {\n\n\t\t\treturn job;\n\t\t\n\t\t}\n\n\t\tawait new Promise( ( r ) => setTimeout( r, poll_ms ) );\n\t\n\t}\n\n\tthrow new SpeechWeaveError(\n\t\t\"Timed out waiting for job\",\n\t\t504,\n\t\t\"JOB_WAIT_TIMEOUT\",\n\t\t{ job_id },\n\t);\n\n}\n","export const VERSION = \"1.0.1\";\n","import type { ReadStream } from \"node:fs\";\nimport type { SpeechWeaveClient } from \"./client.js\";\nimport { SpeechWeaveError } from \"./errors.js\";\nimport { waitForJob } from \"./polling.js\";\nimport type { CreateJobResponse, ServiceMode, V1Job, UploadBodyResult } from \"./types.js\";\n\nexport type UploadBody = Buffer | Blob | ReadStream | Uint8Array;\n\nfunction jobText(\n\tjob : Record<string, unknown>,\n) : string {\n\n\tconst text = job.transcript;\n\n\treturn typeof text === \"string\" ? text : \"\";\n\n}\n\nfunction jobDuration(\n\tjob : Record<string, unknown>,\n) : number | undefined {\n\n\tconst duration = job.duration;\n\tif ( duration == null ) {\n\n\t\treturn undefined;\n\t\n\t}\n\tconst value = Number( duration );\n\tif ( ! Number.isFinite( value ) || value < 0 ) {\n\n\t\treturn undefined;\n\t\n\t}\n\n\treturn value;\n\n}\n\nfunction jobLanguage(\n\tjob : Record<string, unknown>,\n) : string | undefined {\n\n\tconst language = job.language;\n\tif ( language == null ) {\n\n\t\treturn undefined;\n\t\n\t}\n\tconst text = String( language ).trim().toLowerCase();\n\n\treturn text || undefined;\n\n}\n\nexport function shapeOpenAiResponse(\n\tjob : Record<string, unknown>,\n) : {\n\ttext : string;\n\ttask : \"transcribe\";\n\tduration ?: number;\n\tlanguage ?: string;\n} {\n\n\tconst response : {\n\t\ttext : string;\n\t\ttask : \"transcribe\";\n\t\tduration ?: number;\n\t\tlanguage ?: string;\n\t} = {\n\t\ttext: jobText( job ),\n\t\ttask: \"transcribe\",\n\t};\n\tconst duration = jobDuration( job );\n\tif ( duration !== undefined ) {\n\n\t\tresponse.duration = duration;\n\t\n\t}\n\tconst language = jobLanguage( job );\n\tif ( language !== undefined ) {\n\n\t\tresponse.language = language;\n\t\n\t}\n\n\treturn response;\n\n}\n\nexport function shapeDeepgramResponse(\n\tjob : Record<string, unknown>,\n\toptions : { model ?: string | null } = {},\n) : Record<string, unknown> {\n\n\tconst job_id = String( job.id || \"\" );\n\tconst model_name = options.model || String( job.model || \"core\" );\n\tconst text = jobText( job );\n\tconst language = jobLanguage( job );\n\n\tconst alternative : Record<string, unknown> = {\n\t\ttranscript: text,\n\t\tconfidence: 1,\n\t\twords: [\n\t\t],\n\t};\n\tif ( language !== undefined ) {\n\n\t\talternative.language = language;\n\t\n\t}\n\n\treturn {\n\t\tmetadata: {\n\t\t\trequest_id: job_id,\n\t\t\tmodel_info: {\n\t\t\t\tname: model_name,\n\t\t\t\tversion: \"1\",\n\t\t\t\tarch: \"speechweave\",\n\t\t\t},\n\t\t},\n\t\tresults: {\n\t\t\tchannels: [\n\t\t\t\t{\n\t\t\t\t\talternatives: [\n\t\t\t\t\t\talternative, \n\t\t\t\t\t],\n\t\t\t\t},\n\t\t\t],\n\t\t},\n\t};\n\n}\n\nexport function shapeAssemblyResponse(\n\tjob : Record<string, unknown>,\n) : Record<string, unknown> {\n\n\tconst status = String( job.status || \"unknown\" );\n\tconst pub_status = status === \"completed\" ? \"completed\" : status;\n\tconst duration = jobDuration( job );\n\tconst language = jobLanguage( job );\n\tconst error = job.error;\n\n\tconst response : Record<string, unknown> = {\n\t\tid: String( job.id || \"\" ),\n\t\tstatus: pub_status,\n\t\ttext: jobText( job ),\n\t};\n\tif ( duration !== undefined ) {\n\n\t\tresponse.audio_duration = duration;\n\t\n\t}\n\tif ( language !== undefined ) {\n\n\t\tresponse.language = language;\n\t\n\t}\n\tif ( error != null && pub_status === \"failed\" ) {\n\n\t\tresponse.error = String( error );\n\t\n\t}\n\telse {\n\n\t\tresponse.error = null;\n\t\n\t}\n\n\treturn response;\n\n}\n\nasync function toUploadBody(\n\tdata : UploadBody,\n) : Promise<UploadBodyResult> {\n\n\tif ( data instanceof Blob ) {\n\n\t\treturn {\n\t\t\tbody: data,\n\t\t\tcontent_type: data.type || \"application/octet-stream\",\n\t\t};\n\t\n\t}\n\tif ( Buffer.isBuffer( data ) || data instanceof Uint8Array ) {\n\n\t\tconst buf = Buffer.isBuffer( data ) ? data : Buffer.from( data );\n\n\t\treturn {\n\t\t\tbody: buf,\n\t\t\tcontent_type: \"application/octet-stream\",\n\t\t};\n\t\n\t}\n\n\t// Pass ReadStream through — putToPresignedUrl streams with duplex: \"half\".\n\treturn {\n\t\tbody: data,\n\t\tcontent_type: \"application/octet-stream\",\n\t};\n\n}\n\nexport async function uploadAndCreateJob(\n\tclient : SpeechWeaveClient,\n\tparams : {\n\t\tdata : UploadBody;\n\t\tfilename : string;\n\t\tcontent_type ?: string;\n\t\tmodel ?: string;\n\t\tlanguage ?: string;\n\t\tservice_mode ?: ServiceMode;\n\t\tmetadata ?: Record<string, unknown>;\n\t\tfile_size ?: number;\n\t},\n) : Promise<CreateJobResponse> {\n\n\tconst prepared = await toUploadBody( params.data );\n\tconst content_type = params.content_type || prepared.content_type;\n\tconst body = prepared.body;\n\n\tconst presign = await client.presignUpload( {\n\t\tfilename: params.filename,\n\t\tcontent_type,\n\t} );\n\tawait client.putToPresignedUrl(\n\t\tpresign.upload_url,\n\t\tbody as Buffer | Blob | ReadStream,\n\t\tcontent_type,\n\t\t{ file_size: params.file_size },\n\t);\n\n\treturn client.createJob( {\n\t\tobject_key: presign.object_key,\n\t\tmodel: params.model,\n\t\tlanguage: params.language,\n\t\tservice_mode: params.service_mode ?? \"synchronous\",\n\t\tmetadata: params.metadata,\n\t} );\n\n}\n\nexport async function createJobFromUrl(\n\tclient : SpeechWeaveClient,\n\tparams : {\n\t\turl : string;\n\t\tmodel ?: string;\n\t\tlanguage ?: string;\n\t\tservice_mode ?: ServiceMode;\n\t\tmetadata ?: Record<string, unknown>;\n\t},\n) : Promise<CreateJobResponse> {\n\n\treturn client.createJob( {\n\t\tinput_url: params.url,\n\t\tmodel: params.model,\n\t\tlanguage: params.language,\n\t\tservice_mode: params.service_mode ?? \"synchronous\",\n\t\tmetadata: params.metadata,\n\t} );\n\n}\n\nexport async function finishCompatJob(\n\tclient : SpeechWeaveClient,\n\tjob : CreateJobResponse | V1Job | Record<string, unknown>,\n\toptions : {\n\t\twait : boolean;\n\t\terror_code : string;\n\t\ttimeout_ms ?: number;\n\t\tpoll_ms ?: number;\n\t},\n) : Promise<V1Job | CreateJobResponse | Record<string, unknown>> {\n\n\tif ( ! options.wait ) {\n\n\t\treturn job;\n\t\n\t}\n\n\tconst finished = await waitForJob(\n\t\tclient,\n\t\tString( ( job as { id ?: string } ).id || \"\" ),\n\t\t{\n\t\t\ttimeout_ms: options.timeout_ms ?? 300_000,\n\t\t\tpoll_ms: options.poll_ms ?? 1_500,\n\t\t},\n\t);\n\n\tif ( String( finished.status ) === \"failed\" ) {\n\n\t\tthrow new SpeechWeaveError(\n\t\t\tString( finished.error || \"Transcription failed\" ),\n\t\t\t500,\n\t\t\toptions.error_code,\n\t\t\tfinished,\n\t\t);\n\t\n\t}\n\n\treturn finished;\n\n}\n","import crypto from \"node:crypto\";\n\nexport interface VerifyWebhookResult {\n\tok : boolean;\n\treason ?: string;\n}\n\nfunction timingSafeEqual(\n\ta : string,\n\tb : string,\n) : boolean {\n\n\tconst ab = Buffer.from( a, \"utf8\" );\n\tconst bb = Buffer.from( b, \"utf8\" );\n\tif ( ab.length !== bb.length ) {\n\n\t\treturn false;\n\t\n\t}\n\n\treturn crypto.timingSafeEqual( ab, bb );\n\n}\n\n/**\n * Verify `SpeechWeave-Signature` header (Stripe-style: `t=unix,v1=hex` — may include multiple `v1=` during secret rotation).\n *\n * @param secret — active webhook signing secret, or array of `[active, previous]` during a rotation window\n * @param raw_body — exact request body string (use raw bytes as UTF-8 string)\n * @param signature_header — value of the `SpeechWeave-Signature` header\n * @param tolerance_seconds — max clock skew; defaults to 300\n */\nexport function verifyWebhook(\n\tsecret : string | string[],\n\traw_body : string,\n\tsignature_header : string,\n\ttolerance_seconds = 300,\n) : VerifyWebhookResult {\n\n\tconst secrets = ( Array.isArray( secret ) ? secret : [\n\t\tsecret, \n\t] )\n\t\t.map( s => String( s || \"\" ).trim() )\n\t\t.filter( Boolean );\n\tif ( ! secrets.length ) {\n\n\t\treturn {\n\t\t\tok: false,\n\t\t\treason: \"no_secrets\",\n\t\t};\n\t\n\t}\n\n\tconst header = String( signature_header || \"\" ).trim();\n\tconst parts = header.split( \",\" ).map( p => p.trim() );\n\tlet t : string | null = null;\n\tconst v1_list : string[] = [\n\t];\n\tfor ( const part of parts ) {\n\n\t\tif ( part.startsWith( \"t=\" ) ) {\n\n\t\t\tt = part.slice( 2 );\n\t\t\n\t\t}\n\n\t\tif ( part.startsWith( \"v1=\" ) ) {\n\n\t\t\tv1_list.push( part.slice( 3 ) );\n\t\t\n\t\t}\n\t\n\t}\n\tif (\n\t\t! t\n\t\t|| ! v1_list.length\n\t) {\n\n\t\treturn {\n\t\t\tok: false,\n\t\t\treason: \"missing_t_or_v1\",\n\t\t};\n\t\n\t}\n\tconst ts = Number( t );\n\tif ( ! Number.isFinite( ts ) ) {\n\n\t\treturn {\n\t\t\tok: false,\n\t\t\treason: \"bad_timestamp\",\n\t\t};\n\t\n\t}\n\tconst now = Math.floor( Date.now() / 1000 );\n\tif ( Math.abs( now - ts ) > tolerance_seconds ) {\n\n\t\treturn {\n\t\t\tok: false,\n\t\t\treason: \"timestamp_skew\",\n\t\t};\n\t\n\t}\n\n\tfor ( const secret of secrets ) {\n\n\t\tconst expected = crypto.createHmac( \"sha256\", secret ).update( `${ t }.${ raw_body }` ).digest( \"hex\" );\n\t\tfor ( const v1 of v1_list ) {\n\n\t\t\tif ( timingSafeEqual( expected, v1 ) ) {\n\n\t\t\t\treturn {\n\t\t\t\t\tok: true,\n\t\t\t\t};\n\t\t\t\n\t\t\t}\n\t\t\n\t\t}\n\t\n\t}\n\n\treturn {\n\t\tok: false,\n\t\treason: \"bad_signature\",\n\t};\n\n}\n","/**\n * OpenAI-shaped transcription helpers.\n * For OpenAI migration, prefer the official `openai` package with `baseURL` set to SpeechWeave.\n */\nimport type { SpeechWeaveClient } from \"../client.js\";\nimport {\n\tfinishCompatJob,\n\tshapeOpenAiResponse,\n\tuploadAndCreateJob,\n\ttype UploadBody,\n} from \"../compat_shapes.js\";\n\nexport interface OpenAiTranscriptionCreateOptions {\n\tfile : UploadBody;\n\tfilename ?: string;\n\tmodel ?: string;\n\tlanguage ?: string;\n\t// Explicit Content-Length when the body cannot be measured.\n\tfile_size ?: number;\n\t// When false, return the created job without polling (default true).\n\twait ?: boolean;\n}\n\nexport function createOpenAiAudioNamespace(\n\tclient : SpeechWeaveClient,\n) {\n\n\treturn {\n\t\ttranscriptions: {\n\t\t\t/** OpenAI-shaped transcription create — drop-in compatibility wrapper. */\n\t\t\tcreate: async ( opts : OpenAiTranscriptionCreateOptions ) => {\n\n\t\t\t\tconst name = opts.filename || \"audio.bin\";\n\t\t\t\tconst job = await uploadAndCreateJob( client, {\n\t\t\t\t\tdata: opts.file,\n\t\t\t\t\tfilename: name,\n\t\t\t\t\tmodel: opts.model,\n\t\t\t\t\tlanguage: opts.language,\n\t\t\t\t\tfile_size: opts.file_size,\n\t\t\t\t} );\n\t\t\t\tconst finished = await finishCompatJob( client, job, {\n\t\t\t\t\twait: opts.wait ?? true,\n\t\t\t\t\terror_code: \"OPENAI_PROXY\",\n\t\t\t\t} );\n\t\t\t\tif ( opts.wait === false ) {\n\n\t\t\t\t\treturn finished;\n\t\t\t\t\n\t\t\t\t}\n\n\t\t\t\treturn shapeOpenAiResponse( finished as Record<string, unknown> );\n\t\t\t\n\t\t\t},\n\t\t},\n\t};\n\n}\n","/**\n * Deepgram-shaped listen helpers.\n * Prefer the official Deepgram SDK with SpeechWeave base URL when migrating.\n */\nimport type { ReadStream } from \"node:fs\";\nimport type { SpeechWeaveClient } from \"../client.js\";\nimport {\n\tcreateJobFromUrl,\n\tfinishCompatJob,\n\tshapeDeepgramResponse,\n\tuploadAndCreateJob,\n\ttype UploadBody,\n} from \"../compat_shapes.js\";\n\nexport interface DeepgramTranscribeFileOptions {\n\tmodel ?: string;\n\tfilename ?: string;\n\tlanguage ?: string;\n\t// Explicit Content-Length when the body cannot be measured\n\tfile_size ?: number;\n\t// When false, return the created job without polling (default true).\n\twait ?: boolean;\n}\n\nexport interface DeepgramTranscribeUrlOptions {\n\tmodel ?: string;\n\tlanguage ?: string;\n\t// When false, return the created job without polling (default true).\n\twait ?: boolean;\n}\n\nexport function createDeepgramListenNamespace(\n\tclient : SpeechWeaveClient,\n) {\n\n\treturn {\n\t\tprerecorded: {\n\t\t\t/** Deepgram-shaped prerecorded file transcription — drop-in compatibility wrapper. */\n\t\t\ttranscribeFile: async (\n\t\t\t\tstream : UploadBody | ReadStream,\n\t\t\t\toptions : DeepgramTranscribeFileOptions = {},\n\t\t\t) => {\n\n\t\t\t\tconst job = await uploadAndCreateJob( client, {\n\t\t\t\t\tdata: stream,\n\t\t\t\t\tfilename: options.filename || \"audio.bin\",\n\t\t\t\t\tmodel: options.model,\n\t\t\t\t\tlanguage: options.language,\n\t\t\t\t\tfile_size: options.file_size,\n\t\t\t\t} );\n\t\t\t\tconst finished = await finishCompatJob( client, job, {\n\t\t\t\t\twait: options.wait ?? true,\n\t\t\t\t\terror_code: \"DEEPGRAM_PROXY\",\n\t\t\t\t} );\n\t\t\t\tif ( options.wait === false ) {\n\n\t\t\t\t\treturn finished;\n\t\t\t\t\n\t\t\t\t}\n\n\t\t\t\treturn shapeDeepgramResponse(\n\t\t\t\t\tfinished as Record<string, unknown>,\n\t\t\t\t\t{ model: options.model },\n\t\t\t\t);\n\t\t\t\n\t\t\t},\n\t\t\t/** Deepgram-shaped prerecorded URL transcription — drop-in compatibility wrapper. */\n\t\t\ttranscribeUrl: async (\n\t\t\t\turl : string,\n\t\t\t\toptions : DeepgramTranscribeUrlOptions = {},\n\t\t\t) => {\n\n\t\t\t\tconst job = await createJobFromUrl( client, {\n\t\t\t\t\turl,\n\t\t\t\t\tmodel: options.model,\n\t\t\t\t\tlanguage: options.language,\n\t\t\t\t} );\n\t\t\t\tconst finished = await finishCompatJob( client, job, {\n\t\t\t\t\twait: options.wait ?? true,\n\t\t\t\t\terror_code: \"DEEPGRAM_PROXY\",\n\t\t\t\t} );\n\t\t\t\tif ( options.wait === false ) {\n\n\t\t\t\t\treturn finished;\n\t\t\t\t\n\t\t\t\t}\n\n\t\t\t\treturn shapeDeepgramResponse(\n\t\t\t\t\tfinished as Record<string, unknown>,\n\t\t\t\t\t{ model: options.model },\n\t\t\t\t);\n\t\t\t\n\t\t\t},\n\t\t},\n\t};\n\n}\n","/**\n * AssemblyAI-shaped transcripts helpers.\n * Prefer the official AssemblyAI SDK with SpeechWeave when migrating.\n */\nimport type { ReadStream } from \"node:fs\";\nimport type { SpeechWeaveClient } from \"../client.js\";\nimport {\n\tcreateJobFromUrl,\n\tfinishCompatJob,\n\tshapeAssemblyResponse,\n\tuploadAndCreateJob,\n\ttype UploadBody,\n} from \"../compat_shapes.js\";\n\nexport interface AssemblyTranscribeConfig {\n\tmodel ?: string;\n\tlanguage ?: string;\n\t// Explicit Content-Length when the body cannot be measured\n\tfile_size ?: number;\n}\n\nexport function createAssemblyTranscriptsNamespace(\n\tclient : SpeechWeaveClient,\n) {\n\n\treturn {\n\t\t/** AssemblyAI-shaped transcription — drop-in compatibility wrapper. Pass a URL string or binary/file body. */\n\t\ttranscribe: async (\n\t\t\taudio : string | UploadBody | ReadStream,\n\t\t\tconfig ?: AssemblyTranscribeConfig,\n\t\t\toptions : { wait ?: boolean } = {},\n\t\t) => {\n\n\t\t\tconst cfg = config || {};\n\t\t\tconst wait = options.wait ?? true;\n\n\t\t\tlet job;\n\t\t\tif ( typeof audio === \"string\" ) {\n\n\t\t\t\tjob = await createJobFromUrl( client, {\n\t\t\t\t\turl: audio,\n\t\t\t\t\tmodel: cfg.model,\n\t\t\t\t\tlanguage: cfg.language,\n\t\t\t\t} );\n\t\t\t\n\t\t\t}\n\t\t\telse {\n\n\t\t\t\tjob = await uploadAndCreateJob( client, {\n\t\t\t\t\tdata: audio,\n\t\t\t\t\tfilename: \"audio.bin\",\n\t\t\t\t\tmodel: cfg.model,\n\t\t\t\t\tlanguage: cfg.language,\n\t\t\t\t\tfile_size: cfg.file_size,\n\t\t\t\t} );\n\t\t\t\n\t\t\t}\n\n\t\t\tconst finished = await finishCompatJob( client, job, {\n\t\t\t\twait,\n\t\t\t\terror_code: \"ASSEMBLY_PROXY\",\n\t\t\t} );\n\t\t\tif ( ! wait ) {\n\n\t\t\t\treturn finished;\n\t\t\t\n\t\t\t}\n\n\t\t\treturn shapeAssemblyResponse( finished as Record<string, unknown> );\n\t\t\n\t\t},\n\t};\n\n}\n","export { SpeechWeaveClient } from \"./client.js\";\nexport { SpeechWeaveError } from \"./errors.js\";\nexport { waitForJob } from \"./polling.js\";\nexport type { WaitForJobOptions } from \"./polling.js\";\nexport {\n\tcreateJobFromUrl,\n\tfinishCompatJob,\n\tshapeAssemblyResponse,\n\tshapeDeepgramResponse,\n\tshapeOpenAiResponse,\n\tuploadAndCreateJob,\n} from \"./compat_shapes.js\";\nexport type {\n\tCreateJobResponse,\n\tListJobsResponse,\n\tPresignResponse,\n\tPublicJobStatus,\n\tServiceMode,\n\tSpeechWeaveClientOptions,\n\tV1Job,\n} from \"./types.js\";\nexport { VERSION } from \"./version.js\";\nexport { verifyWebhook } from \"./webhooks.js\";\nexport type { VerifyWebhookResult } from \"./webhooks.js\";\n\nimport { SpeechWeaveClient } from \"./client.js\";\nimport { createOpenAiAudioNamespace } from \"./openai/openai_compat.js\";\nimport { createDeepgramListenNamespace } from \"./deepgram/deepgram_compat.js\";\nimport { createAssemblyTranscriptsNamespace } from \"./assembly/assembly_compat.js\";\nimport type { ServiceMode, SpeechWeaveClientOptions } from \"./types.js\";\n\nfunction createJobsNamespace(\n\tclient : SpeechWeaveClient,\n) {\n\n\treturn {\n\t\t/**\n\t\t * Create a job from a local file or a remote URL / object_key.\n\t\t * Pass `file` (path, Buffer, Blob, or stream) to presign-upload then create.\n\t\t * Otherwise pass one of `object_key`, `input_url`, or `audio_url` (no upload).\n\t\t * Omitting service_mode leaves the API default (deferred).\n\t\t */\n\t\tcreate: async ( params : {\n\t\t\tfile ?: string | Buffer | Blob | import( \"node:fs\" ).ReadStream;\n\t\t\tfilename ?: string;\n\t\t\tcontent_type ?: string;\n\t\t\tobject_key ?: string;\n\t\t\tinput_url ?: string;\n\t\t\taudio_url ?: string;\n\t\t\tmodel ?: string;\n\t\t\tservice_mode ?: ServiceMode;\n\t\t\tlanguage ?: string;\n\t\t\ttype ?: string;\n\t\t\tmetadata ?: Record<string, unknown>;\n\t\t\tfile_size ?: number;\n\t\t} ) => {\n\n\t\t\tif ( params.file != null ) {\n\n\t\t\t\tif ( typeof params.file === \"string\" ) {\n\n\t\t\t\t\treturn client.transcribeFilePath(\n\t\t\t\t\t\tparams.file,\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tmodel: params.model,\n\t\t\t\t\t\t\tservice_mode: params.service_mode,\n\t\t\t\t\t\t\tlanguage: params.language,\n\t\t\t\t\t\t\tcontent_type: params.content_type,\n\t\t\t\t\t\t\tmetadata: params.metadata,\n\t\t\t\t\t\t\tfile_size: params.file_size,\n\t\t\t\t\t\t},\n\t\t\t\t\t);\n\t\t\t\t\n\t\t\t\t}\n\n\t\t\t\treturn client.transcribeFile(\n\t\t\t\t\tparams.file,\n\t\t\t\t\t{\n\t\t\t\t\t\tfilename: params.filename,\n\t\t\t\t\t\tcontent_type: params.content_type,\n\t\t\t\t\t\tmodel: params.model,\n\t\t\t\t\t\tservice_mode: params.service_mode,\n\t\t\t\t\t\tlanguage: params.language,\n\t\t\t\t\t\tmetadata: params.metadata,\n\t\t\t\t\t\tfile_size: params.file_size,\n\t\t\t\t\t},\n\t\t\t\t);\n\t\t\t\n\t\t\t}\n\n\t\t\treturn client.createJob( {\n\t\t\t\tobject_key: params.object_key,\n\t\t\t\tinput_url: params.input_url,\n\t\t\t\taudio_url: params.audio_url,\n\t\t\t\tmodel: params.model,\n\t\t\t\tservice_mode: params.service_mode,\n\t\t\t\tlanguage: params.language,\n\t\t\t\ttype: params.type,\n\t\t\t\tmetadata: params.metadata,\n\t\t\t} );\n\t\t\n\t\t},\n\t\t/** Fetch the current job record. */\n\t\tget: client.getJob.bind( client ),\n\t\t/** List jobs for the authenticated account. */\n\t\tlist: client.listJobs.bind( client ),\n\t\t/**\n\t\t * Cancel a pending or processing job.\n\t\t * Fails if the job is already completed, failed, or cancelled.\n\t\t */\n\t\tcancel: client.cancelJob.bind( client ),\n\t};\n\n}\n\nexport class SpeechWeave extends SpeechWeaveClient {\n\n\treadonly audio : ReturnType<typeof createOpenAiAudioNamespace>;\n\treadonly listen : ReturnType<typeof createDeepgramListenNamespace>;\n\treadonly transcripts : ReturnType<typeof createAssemblyTranscriptsNamespace>;\n\treadonly jobs : ReturnType<typeof createJobsNamespace>;\n\n\tconstructor( options : SpeechWeaveClientOptions = {} ) {\n\n\t\tsuper( options );\n\t\tthis.audio = createOpenAiAudioNamespace( this );\n\t\tthis.listen = createDeepgramListenNamespace( this );\n\t\tthis.transcripts = createAssemblyTranscriptsNamespace( this );\n\t\tthis.jobs = createJobsNamespace( this );\n\t\n\t}\n\n}\n"],"mappings":"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","names":["secret"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@speechweave/node",
3
- "version": "1.0.0",
3
+ "version": "1.0.3",
4
4
  "description": "Official SpeechWeave Node.js SDK",
5
5
  "type": "module",
6
6
  "main": "./dist/index.cjs",
@@ -34,6 +34,14 @@
34
34
  "whisper"
35
35
  ],
36
36
  "license": "MIT",
37
+ "repository": {
38
+ "type": "git",
39
+ "url": "git+https://github.com/speechweave/speechweave-node.git"
40
+ },
41
+ "publishConfig": {
42
+ "access": "public",
43
+ "provenance": true
44
+ },
37
45
  "devDependencies": {
38
46
  "@eslint/js": "^10.0.1",
39
47
  "@stylistic/eslint-plugin": "^5.10.0",