@voiceinput/provider 0.1.0-beta.1

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.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transport.cjs","names":["VoiceInputError"],"sources":["../src/transport.ts"],"sourcesContent":["import { VoiceInputError } from \"./index.js\";\n\nconst MAX_BUFFERED_BYTES = 1024 * 1024;\nconst DRAIN_TIMEOUT_MS = 5_000;\n\n/** Keeps nominal sends synchronous; congested sends are abortable and bounded. */\nexport function sendWithBackpressure(\n socket: { readonly bufferedAmount: number; readonly readyState: number },\n bytes: number,\n signal: AbortSignal,\n provider: string,\n send: () => void,\n): Promise<void> | void {\n const failure = () =>\n new VoiceInputError({\n code: \"network-error\",\n provider,\n retryable: true,\n message: `The ${provider} audio connection is stalled or closed.`,\n });\n if (signal.aborted || socket.readyState !== 1 || bytes > MAX_BUFFERED_BYTES)\n throw failure();\n if ((socket.bufferedAmount ?? 0) + bytes <= MAX_BUFFERED_BYTES) return send();\n return new Promise<void>((resolve, reject) => {\n const started = Date.now();\n let timer: ReturnType<typeof setTimeout>;\n const cleanup = (): void => {\n clearTimeout(timer);\n signal.removeEventListener(\"abort\", abort);\n };\n const abort = (): void => {\n cleanup();\n reject(failure());\n };\n const check = (): void => {\n if (\n signal.aborted ||\n socket.readyState !== 1 ||\n Date.now() - started >= DRAIN_TIMEOUT_MS\n ) {\n abort();\n } else if ((socket.bufferedAmount ?? 0) + bytes <= MAX_BUFFERED_BYTES) {\n cleanup();\n try {\n send();\n resolve();\n } catch (error) {\n reject(error);\n }\n } else timer = setTimeout(check, 25);\n };\n signal.addEventListener(\"abort\", abort, { once: true });\n timer = setTimeout(check, 25);\n });\n}\n"],"mappings":";;;AAEA,MAAM,qBAAqB;AAC3B,MAAM,mBAAmB;;AAGzB,SAAgB,qBACd,QACA,OACA,QACA,UACA,MACsB;CACtB,MAAM,gBACJ,IAAIA,cAAAA,gBAAgB;EAClB,MAAM;EACN;EACA,WAAW;EACX,SAAS,OAAO,SAAS;CAC3B,CAAC;CACH,IAAI,OAAO,WAAW,OAAO,eAAe,KAAK,QAAQ,oBACvD,MAAM,QAAQ;CAChB,KAAK,OAAO,kBAAkB,KAAK,SAAS,oBAAoB,OAAO,KAAK;CAC5E,OAAO,IAAI,SAAe,SAAS,WAAW;EAC5C,MAAM,UAAU,KAAK,IAAI;EACzB,IAAI;EACJ,MAAM,gBAAsB;GAC1B,aAAa,KAAK;GAClB,OAAO,oBAAoB,SAAS,KAAK;EAC3C;EACA,MAAM,cAAoB;GACxB,QAAQ;GACR,OAAO,QAAQ,CAAC;EAClB;EACA,MAAM,cAAoB;GACxB,IACE,OAAO,WACP,OAAO,eAAe,KACtB,KAAK,IAAI,IAAI,WAAW,kBAExB,MAAM;QACD,KAAK,OAAO,kBAAkB,KAAK,SAAS,oBAAoB;IACrE,QAAQ;IACR,IAAI;KACF,KAAK;KACL,QAAQ;IACV,SAAS,OAAO;KACd,OAAO,KAAK;IACd;GACF,OAAO,QAAQ,WAAW,OAAO,EAAE;EACrC;EACA,OAAO,iBAAiB,SAAS,OAAO,EAAE,MAAM,KAAK,CAAC;EACtD,QAAQ,WAAW,OAAO,EAAE;CAC9B,CAAC;AACH"}
@@ -0,0 +1,9 @@
1
+ //#region src/transport.d.ts
2
+ /** Keeps nominal sends synchronous; congested sends are abortable and bounded. */
3
+ declare function sendWithBackpressure(socket: {
4
+ readonly bufferedAmount: number;
5
+ readonly readyState: number;
6
+ }, bytes: number, signal: AbortSignal, provider: string, send: () => void): Promise<void> | void;
7
+ //#endregion
8
+ export { sendWithBackpressure };
9
+ //# sourceMappingURL=transport.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transport.d.cts","names":[],"sources":["../src/transport.ts"],"mappings":";;iBAMgB,qBACd;WAAmB;WAAiC;GACpD,eACA,QAAQ,aACR,kBACA,mBACC"}
@@ -0,0 +1,9 @@
1
+ //#region src/transport.d.ts
2
+ /** Keeps nominal sends synchronous; congested sends are abortable and bounded. */
3
+ declare function sendWithBackpressure(socket: {
4
+ readonly bufferedAmount: number;
5
+ readonly readyState: number;
6
+ }, bytes: number, signal: AbortSignal, provider: string, send: () => void): Promise<void> | void;
7
+ //#endregion
8
+ export { sendWithBackpressure };
9
+ //# sourceMappingURL=transport.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transport.d.ts","names":[],"sources":["../src/transport.ts"],"mappings":";;iBAMgB,qBACd;WAAmB;WAAiC;GACpD,eACA,QAAQ,aACR,kBACA,mBACC"}
@@ -0,0 +1,45 @@
1
+ import { VoiceInputError } from "./index.js";
2
+ //#region src/transport.ts
3
+ const MAX_BUFFERED_BYTES = 1048576;
4
+ const DRAIN_TIMEOUT_MS = 5e3;
5
+ /** Keeps nominal sends synchronous; congested sends are abortable and bounded. */
6
+ function sendWithBackpressure(socket, bytes, signal, provider, send) {
7
+ const failure = () => new VoiceInputError({
8
+ code: "network-error",
9
+ provider,
10
+ retryable: true,
11
+ message: `The ${provider} audio connection is stalled or closed.`
12
+ });
13
+ if (signal.aborted || socket.readyState !== 1 || bytes > MAX_BUFFERED_BYTES) throw failure();
14
+ if ((socket.bufferedAmount ?? 0) + bytes <= MAX_BUFFERED_BYTES) return send();
15
+ return new Promise((resolve, reject) => {
16
+ const started = Date.now();
17
+ let timer;
18
+ const cleanup = () => {
19
+ clearTimeout(timer);
20
+ signal.removeEventListener("abort", abort);
21
+ };
22
+ const abort = () => {
23
+ cleanup();
24
+ reject(failure());
25
+ };
26
+ const check = () => {
27
+ if (signal.aborted || socket.readyState !== 1 || Date.now() - started >= DRAIN_TIMEOUT_MS) abort();
28
+ else if ((socket.bufferedAmount ?? 0) + bytes <= MAX_BUFFERED_BYTES) {
29
+ cleanup();
30
+ try {
31
+ send();
32
+ resolve();
33
+ } catch (error) {
34
+ reject(error);
35
+ }
36
+ } else timer = setTimeout(check, 25);
37
+ };
38
+ signal.addEventListener("abort", abort, { once: true });
39
+ timer = setTimeout(check, 25);
40
+ });
41
+ }
42
+ //#endregion
43
+ export { sendWithBackpressure };
44
+
45
+ //# sourceMappingURL=transport.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transport.js","names":[],"sources":["../src/transport.ts"],"sourcesContent":["import { VoiceInputError } from \"./index.js\";\n\nconst MAX_BUFFERED_BYTES = 1024 * 1024;\nconst DRAIN_TIMEOUT_MS = 5_000;\n\n/** Keeps nominal sends synchronous; congested sends are abortable and bounded. */\nexport function sendWithBackpressure(\n socket: { readonly bufferedAmount: number; readonly readyState: number },\n bytes: number,\n signal: AbortSignal,\n provider: string,\n send: () => void,\n): Promise<void> | void {\n const failure = () =>\n new VoiceInputError({\n code: \"network-error\",\n provider,\n retryable: true,\n message: `The ${provider} audio connection is stalled or closed.`,\n });\n if (signal.aborted || socket.readyState !== 1 || bytes > MAX_BUFFERED_BYTES)\n throw failure();\n if ((socket.bufferedAmount ?? 0) + bytes <= MAX_BUFFERED_BYTES) return send();\n return new Promise<void>((resolve, reject) => {\n const started = Date.now();\n let timer: ReturnType<typeof setTimeout>;\n const cleanup = (): void => {\n clearTimeout(timer);\n signal.removeEventListener(\"abort\", abort);\n };\n const abort = (): void => {\n cleanup();\n reject(failure());\n };\n const check = (): void => {\n if (\n signal.aborted ||\n socket.readyState !== 1 ||\n Date.now() - started >= DRAIN_TIMEOUT_MS\n ) {\n abort();\n } else if ((socket.bufferedAmount ?? 0) + bytes <= MAX_BUFFERED_BYTES) {\n cleanup();\n try {\n send();\n resolve();\n } catch (error) {\n reject(error);\n }\n } else timer = setTimeout(check, 25);\n };\n signal.addEventListener(\"abort\", abort, { once: true });\n timer = setTimeout(check, 25);\n });\n}\n"],"mappings":";;AAEA,MAAM,qBAAqB;AAC3B,MAAM,mBAAmB;;AAGzB,SAAgB,qBACd,QACA,OACA,QACA,UACA,MACsB;CACtB,MAAM,gBACJ,IAAI,gBAAgB;EAClB,MAAM;EACN;EACA,WAAW;EACX,SAAS,OAAO,SAAS;CAC3B,CAAC;CACH,IAAI,OAAO,WAAW,OAAO,eAAe,KAAK,QAAQ,oBACvD,MAAM,QAAQ;CAChB,KAAK,OAAO,kBAAkB,KAAK,SAAS,oBAAoB,OAAO,KAAK;CAC5E,OAAO,IAAI,SAAe,SAAS,WAAW;EAC5C,MAAM,UAAU,KAAK,IAAI;EACzB,IAAI;EACJ,MAAM,gBAAsB;GAC1B,aAAa,KAAK;GAClB,OAAO,oBAAoB,SAAS,KAAK;EAC3C;EACA,MAAM,cAAoB;GACxB,QAAQ;GACR,OAAO,QAAQ,CAAC;EAClB;EACA,MAAM,cAAoB;GACxB,IACE,OAAO,WACP,OAAO,eAAe,KACtB,KAAK,IAAI,IAAI,WAAW,kBAExB,MAAM;QACD,KAAK,OAAO,kBAAkB,KAAK,SAAS,oBAAoB;IACrE,QAAQ;IACR,IAAI;KACF,KAAK;KACL,QAAQ;IACV,SAAS,OAAO;KACd,OAAO,KAAK;IACd;GACF,OAAO,QAAQ,WAAW,OAAO,EAAE;EACrC;EACA,OAAO,iBAAiB,SAAS,OAAO,EAAE,MAAM,KAAK,CAAC;EACtD,QAAQ,WAAW,OAAO,EAAE;CAC9B,CAAC;AACH"}
package/package.json ADDED
@@ -0,0 +1,80 @@
1
+ {
2
+ "name": "@voiceinput/provider",
3
+ "version": "0.1.0-beta.1",
4
+ "description": "Versioned provider contracts and conformance tools for VoiceInput.",
5
+ "keywords": [
6
+ "voice-input",
7
+ "speech-to-text",
8
+ "transcription",
9
+ "provider"
10
+ ],
11
+ "homepage": "https://voiceinput.dev/docs/provider",
12
+ "bugs": {
13
+ "url": "https://github.com/VoiceInput/voiceinput/issues"
14
+ },
15
+ "author": "VoiceInput contributors",
16
+ "maintainers": [
17
+ "Hirad Arshadi (https://github.com/hiradary)"
18
+ ],
19
+ "type": "module",
20
+ "license": "MIT",
21
+ "engines": {
22
+ "node": ">=22"
23
+ },
24
+ "repository": {
25
+ "type": "git",
26
+ "url": "git+https://github.com/VoiceInput/voiceinput.git",
27
+ "directory": "packages/provider"
28
+ },
29
+ "files": [
30
+ "dist"
31
+ ],
32
+ "sideEffects": false,
33
+ "main": "./dist/index.cjs",
34
+ "module": "./dist/index.js",
35
+ "types": "./dist/index.d.ts",
36
+ "exports": {
37
+ ".": {
38
+ "import": {
39
+ "types": "./dist/index.d.ts",
40
+ "default": "./dist/index.js"
41
+ },
42
+ "require": {
43
+ "types": "./dist/index.d.cts",
44
+ "default": "./dist/index.cjs"
45
+ }
46
+ },
47
+ "./test": {
48
+ "import": {
49
+ "types": "./dist/test.d.ts",
50
+ "default": "./dist/test.js"
51
+ },
52
+ "require": {
53
+ "types": "./dist/test.d.cts",
54
+ "default": "./dist/test.cjs"
55
+ }
56
+ },
57
+ "./transport": {
58
+ "import": {
59
+ "types": "./dist/transport.d.ts",
60
+ "default": "./dist/transport.js"
61
+ },
62
+ "require": {
63
+ "types": "./dist/transport.d.cts",
64
+ "default": "./dist/transport.cjs"
65
+ }
66
+ }
67
+ },
68
+ "publishConfig": {
69
+ "access": "public"
70
+ },
71
+ "scripts": {
72
+ "build": "tsdown src/index.ts src/test.ts src/transport.ts",
73
+ "dev": "tsdown src/index.ts src/test.ts --watch --no-clean",
74
+ "pack": "pnpm pack --pack-destination .",
75
+ "test": "vitest run",
76
+ "typecheck": "tsc --project tsconfig.json --noEmit",
77
+ "lint": "oxlint --config ../../.oxlintrc.json .",
78
+ "format:check": "prettier --check ."
79
+ }
80
+ }