{"_id":"@apptek/streaming-js-sdk","_rev":"5-21c0ff36e620f06ce89d5b7ebe1b5101","name":"@apptek/streaming-js-sdk","dist-tags":{"latest":"1.3.0"},"versions":{"1.0.0":{"name":"@apptek/streaming-js-sdk","version":"1.0.0","author":{"name":"AppTek"},"license":"MIT","_id":"@apptek/streaming-js-sdk@1.0.0","maintainers":[{"name":"mk_bob","email":"manoj@apptek.com"}],"dist":{"shasum":"5e2b3dd859e9d3f7dae0a1dc797df63bf7931002","tarball":"https://registry.npmjs.org/@apptek/streaming-js-sdk/-/streaming-js-sdk-1.0.0.tgz","fileCount":6,"integrity":"sha512-aCs7H7Omf9WxIk1Rj0q/3R8YDlFY3Zg5Gqx5b8g18Uzhi36bUyDVuuTt6yUKpMh/tgQSu65hMVhqfWSCS8CKgQ==","signatures":[{"sig":"MEYCIQDmrvoEpvUt/d9ylKQoFvor+2jEjOdB5ZH8kyjz69Le0wIhAO5PWDx15jgJ7E//724PC6XWtYQVlQd/A8CFN8VBo6WQ","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":42165},"main":"./dist/index.umd.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.es.js","exports":{".":{"import":"./dist/index.es.js","require":"./dist/index.umd.js"}},"gitHead":"1e061b87a7c58325f617ef67b5dd36c0879a9f88","scripts":{"dev":"vite","docs":"node scripts/build-docs.js","build":"tsc && vite build","prepare":"npm run build","preview":"vite preview"},"_npmUser":{"name":"mk_bob","email":"manoj@apptek.com"},"_npmVersion":"10.9.3","description":"AppTek Streaming JavaScript SDK","directories":{},"_nodeVersion":"22.18.0","_hasShrinkwrap":false,"devDependencies":{"vite":"^7.2.4","typedoc":"^0.28.16","typescript":"~5.9.3","@types/node":"^25.0.10","vite-plugin-dts":"^3.9.1"},"_npmOperationalInternal":{"tmp":"tmp/streaming-js-sdk_1.0.0_1769812087144_0.8716036604055404","host":"s3://npm-registry-packages-npm-production"}},"1.0.1":{"name":"@apptek/streaming-js-sdk","version":"1.0.1","keywords":["apptek","asr","speech-to-text","transcription","translation","streaming","websocket","audio","voice"],"author":{"name":"AppTek"},"license":"MIT","_id":"@apptek/streaming-js-sdk@1.0.1","maintainers":[{"name":"mk_bob","email":"manoj@apptek.com"}],"dist":{"shasum":"d86d2c1b81e25e4bb6b809d589e356cd260a8731","tarball":"https://registry.npmjs.org/@apptek/streaming-js-sdk/-/streaming-js-sdk-1.0.1.tgz","fileCount":6,"integrity":"sha512-p64SBarNLDnRdyHxPJbNs852fYHCaBO729aqDoMY72hT/rdx6WmDwkjdd8uX+oAXJpBZZEeGoMK6YWC/R3YUBw==","signatures":[{"sig":"MEUCIE/LhbcJNX3N1er3jICi2Mg1v18rFpdB1agJ85fAP/dtAiEA9qQFJHxV+a8NqY++cwfxJUAQndx2MUy5t3ZFvGJuhN8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":42449},"main":"./dist/index.umd.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.es.js","exports":{".":{"import":"./dist/index.es.js","require":"./dist/index.umd.js"}},"gitHead":"edd3cf6ab5025f10f8ece353d11be2132549a939","scripts":{"dev":"vite","docs":"node scripts/build-docs.js","build":"tsc && vite build","prepare":"npm run build","preview":"vite preview"},"_npmUser":{"name":"mk_bob","email":"manoj@apptek.com"},"_npmVersion":"10.9.3","description":"AppTek Streaming JavaScript SDK","directories":{},"_nodeVersion":"22.18.0","_hasShrinkwrap":false,"devDependencies":{"vite":"^7.2.4","typedoc":"^0.28.16","typescript":"~5.9.3","@types/node":"^25.0.10","vite-plugin-dts":"^3.9.1"},"_npmOperationalInternal":{"tmp":"tmp/streaming-js-sdk_1.0.1_1769814316924_0.38599074411471945","host":"s3://npm-registry-packages-npm-production"}},"1.2.0":{"name":"@apptek/streaming-js-sdk","version":"1.2.0","keywords":["apptek","asr","speech-to-text","transcription","translation","streaming","websocket","audio","voice"],"author":{"name":"AppTek"},"license":"MIT","_id":"@apptek/streaming-js-sdk@1.2.0","maintainers":[{"name":"mk_bob","email":"manoj@apptek.com"},{"name":"scook-apptek","email":"scook@apptek.com"}],"dist":{"shasum":"3ff3f1b89a19471ef458c30e513de347f7f471cc","tarball":"https://registry.npmjs.org/@apptek/streaming-js-sdk/-/streaming-js-sdk-1.2.0.tgz","fileCount":9,"integrity":"sha512-7wEmlHpSwV+6qFt5ZTQqN30GnYZ9ZKDDkYU/KsEADIzSFF5jEb+YNYsUKEFf+R3T30Av+12Ryl+yy89FN8iuGw==","signatures":[{"sig":"MEQCIGsT4IgjhiKzAyKoz5dUxFehM18ewh8DYJWkIwBYZq6vAiBWOGrz4O2+2dT6hJkStBFDCA6OoGO//d5+NbdBiOEexw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":64554},"main":"./dist/index.cjs.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"import":"./dist/index.js","require":"./dist/index.cjs.js"}},"gitHead":"31bbab5296fbee1b002a2084c424d24e51f70912","scripts":{"dev":"vite demo","docs":"node scripts/build-docs.js","build":"tsc && vite build","prepare":"npm run build","preview":"vite preview","docs:serve":"vite docs --port 5174"},"_npmUser":{"name":"mk_bob","email":"manoj@apptek.com"},"_npmVersion":"10.9.3","description":"AppTek Streaming JavaScript SDK","directories":{},"_nodeVersion":"22.18.0","_hasShrinkwrap":false,"devDependencies":{"vite":"^7.2.4","typedoc":"^0.28.16","typescript":"~5.9.3","@types/node":"^25.0.10","vite-plugin-dts":"^3.9.1"},"_npmOperationalInternal":{"tmp":"tmp/streaming-js-sdk_1.2.0_1786976330672_0.9090861444276099","host":"s3://npm-registry-packages-npm-production"}},"1.3.0":{"name":"@apptek/streaming-js-sdk","description":"AppTek Streaming JavaScript SDK","author":{"name":"AppTek"},"license":"MIT","keywords":["apptek","asr","speech-to-text","transcription","translation","streaming","websocket","audio","voice"],"version":"1.3.0","type":"module","main":"./dist/index.cjs.js","module":"./dist/index.js","types":"./dist/index.d.ts","exports":{".":{"import":"./dist/index.js","require":"./dist/index.cjs.js"}},"scripts":{"dev":"vite demo","docs:serve":"vite docs --port 5174","build":"tsc && vite build","preview":"vite preview","docs":"node scripts/build-docs.js","docs:md":"node scripts/build-markdown-docs.js","prepare":"npm run build"},"devDependencies":{"@types/node":"^25.0.10","typedoc":"^0.28.16","typedoc-plugin-markdown":"^4.12.0","typescript":"~5.9.3","vite":"^7.2.4","vite-plugin-dts":"^3.9.1"},"_id":"@apptek/streaming-js-sdk@1.3.0","gitHead":"fe223bde0fe0c4dec7a0b71d25c46a9d6fd335d9","_nodeVersion":"22.18.0","_npmVersion":"10.9.3","dist":{"integrity":"sha512-6BVlpD9NCKhgS2xn9MMs09n/2JZS+KgvUzPRKPkFApA2fi/w0dTQ+9+7ReGMlOIRr1mC7FWbh4LZ86Cl4lK2/A==","shasum":"025c6e574d6bae0e55658cadee90256923b1c9ac","tarball":"https://registry.npmjs.org/@apptek/streaming-js-sdk/-/streaming-js-sdk-1.3.0.tgz","fileCount":9,"unpackedSize":65695,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQCGtWotZu2693EPzgI5v9QiXrBLklCgO9SRMchXBLTqGQIhALKPp4XwBT4+MH5i9uPiXTpuR2kNIxYJxonjPzY3EceP"}]},"_npmUser":{"name":"mk_bob","email":"manoj@apptek.com"},"directories":{},"maintainers":[{"name":"mk_bob","email":"manoj@apptek.com"},{"name":"scook-apptek","email":"scook@apptek.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/streaming-js-sdk_1.3.0_1787258083569_0.7789336189415295"},"_hasShrinkwrap":false}},"time":{"created":"2026-01-30T22:28:07.028Z","modified":"2026-08-20T20:34:43.938Z","1.0.0":"2026-01-30T22:28:07.296Z","1.0.1":"2026-01-30T23:05:17.063Z","1.2.0":"2026-08-17T14:18:50.842Z","1.3.0":"2026-08-20T20:34:43.764Z"},"author":{"name":"AppTek"},"license":"MIT","keywords":["apptek","asr","speech-to-text","transcription","translation","streaming","websocket","audio","voice"],"description":"AppTek Streaming JavaScript SDK","maintainers":[{"name":"mk_bob","email":"manoj@apptek.com"},{"name":"scook-apptek","email":"scook@apptek.com"}],"readme":"# AppTek Streaming JS SDK\n\nA TypeScript SDK for integrating bidirectional streaming ASR (Automatic Speech Recognition) and Translation with AppTek's services.\n\n## Features\n\n- **SDK Documentation**: [View Type Definitions](https://docs.apptek.com/reference/appteksdk)\n- **Full GRPC Documentation**: [Read the GRPC Docs](https://docs.apptek.com/reference/protobuf-documentation)\n- **High-Level SDK**: Easy-to-use `AppTekSDK` class for managing sessions.\n- **Room Management & Broadcasting**: Create rooms and broadcast live transcriptions to multiple consumers via SSE.\n- **Microphone Streaming**: Built-in support for capturing and streaming microphone audio.\n- **Generic MediaStream Support**: Process audio from `<video>` or `<audio>` elements or any WebRTC stream.\n- **Get available languages**: Access available languages for live transcription and translation.\n\n## Installation\n\n```bash\nnpm install @apptek/streaming-js-sdk\n```\n\n## Getting Started\n\n### 1. Initialize the SDK\n\nYou can initialize the SDK with your proxy URL and license key.\n\n```typescript\nimport { AppTekSDK } from \"@apptek/streaming-js-sdk\";\n\n// The proxyUrl defaults to \"https://accessibility.apptek.com/grpc-proxy\" if omitted.\nconst sdk = new AppTekSDK(\n  \"https://accessibility.apptek.com/grpc-proxy\",\n  \"YOUR_APPTEK_LICENSE_KEY\",\n);\n\n// specific license validation call\nawait sdk.init();\n```\n\n### 2. Get available languages for transcription and translation\n\nExample config:\n\n```\nconst config = {\n    audioConfiguration: {\n        sampleType: \"INT16\",\n        sampleRateHz: 16000,\n        channels: 1\n    },\n    speechConfiguration: {\n        langCode: \"en-US\"\n    }\n};\n```\n\n### 3. Stream from Microphone\n\nTo start recording from the user's microphone:\n\n```typescript\nconst config = {\n  audioConfiguration: {\n    sampleType: \"INT16\",\n    sampleRateHz: 16000,\n    channels: 1,\n  },\n  speechConfiguration: {\n    langCode: \"en-US\",\n  },\n};\n\nawait sdk.startMicrophone(config, {\n  onData: (data) => {\n    // Handle partial or final transcriptions\n    if (data.transcription?.stableTranscriptions) {\n      console.log(\"Partial:\", data.transcription.stableTranscriptions);\n    }\n    if (data.segment) {\n      console.log(\"Final:\", data.segment.text);\n    }\n  },\n  onError: (err) => {\n    console.error(\"Streaming Error:\", err);\n  },\n  onStatusChange: (status) => {\n    console.log(\"SDK Status:\", status); // Idle, Connecting, Recording, etc.\n  },\n});\n```\n\n### 4. Stream from Video/Audio Element\n\nYou can process audio from an existing `MediaStream` (e.g., from a `<video>` element):\n\n```typescript\nconst videoElement = document.querySelector(\"video\");\nconst stream = videoElement.captureStream(); // or valid MediaStream\n\nawait sdk.startFromStream(stream, config, {\n  onData: (data) => console.log(data),\n  onError: (err) => console.error(err),\n});\n```\n\n### 5. Waveform Visualization\n\nYou can receive raw audio data (Float32Array) to draw a real-time waveform.\n\n```typescript\nawait sdk.startMicrophone(config, {\n  onData: handleTranscription,\n  onError: handleError,\n  onMicrophoneData: (audioData) => {\n    // audioData is a Float32Array (-1.0 to 1.0)\n    // can be used to visualize audio data\n  },\n});\n```\n\n## API Reference\n\n### `AppTekSDK`\n\n#### Constructor\n\n```typescript\nnew AppTekSDK(proxyUrl?: string, licenseKey?: string)\n```\n\n- `proxyUrl`: Base URL of the proxy server (Default: `https://accessibility.apptek.com/grpc-proxy`).\n- `licenseKey`: AppTek license key.\n\n#### Methods\n\n- **`init(licenseKey?: string): Promise<boolean>`**\n  Validates the license key with the server.\n\n- **`startMicrophone(config, callbacks, stream?): Promise<void>`**\n  Starts an audio session.\n  - `config`: `Recognize2StreamConfig` object.\n  - `callbacks`: Event handlers (`onData`, `onError`, `onStatusChange`, `onMicrophoneData`).\n  - `stream`: Optional `MediaStream` to use (overrides microphone).\n\n- **`startFromStream(stream, config, callbacks): Promise<void>`**\n  Alias for `startMicrophone` specifically for external streams.\n\n- **`stopMicrophone(): void`**\n  Stops the current streaming session.\n\n- **`getLanguages(): Promise<Recognize2AvailableResponse>`**\n  Fetch available recognition languages.\n\n- **`getTranslateLanguages(): Promise<TranslateAvailableResponse>`**\n  Fetch available translation languages.\n\n- **`getAvailable(): Promise<AvailableResponse>`**\n  Fetch both recognition and translation configurations in a single unified API request.\n\n## Configuration Object\n\n```typescript\ninterface Recognize2StreamConfig {\n  audioConfiguration: {\n    sampleType: \"INT16\";\n    sampleRateHz: number; // e.g., 16000\n    channels: 1;\n  };\n  speechConfiguration: {\n    langCode: string; // e.g., \"en-US\"\n    model?: string;\n  };\n  translateConfigurations?: Array<{\n    domain: string;\n    targetLangCode: string; // e.g., \"es\"\n  }>;\n  diarizerConfiguration?: {\n    enable: boolean;\n  };\n}\n```\n\n## Room Management & Broadcasting\n\nThe SDK allows you to orchestrate \"Rooms\" where transcriptions from a producer (microphone or stream) are broadcast to multiple consumers in real-time.\n\n### 1. Managing Rooms (Producer)\n\nYou can create and list rooms directly from the SDK:\n\n```typescript\n// Create a new room\nconst { room_id } = await sdk.createRoom();\n\n// List active rooms for your license key\nconst { rooms } = await sdk.listRooms();\n```\n\n### 2. Broadcasting to a Room\n\nTo broadcast transcriptions to a room, pass the `roomId` when starting the session:\n\n```typescript\nawait sdk.startMicrophone(config, callbacks, undefined, {\n  roomId: \"your-room-id\",\n});\n\n// Or activate a room mid-session\nsdk.activateRoom(\"another-room-id\");\n```\n\n### 3. Consuming from a Room (Listener)\n\nUse the `RoomConsumer` to listen to live transcriptions from any device:\n\n```typescript\nimport { RoomConsumer } from \"@apptek/streaming-js-sdk\";\n\nconst consumer = new RoomConsumer(proxyUrl, \"your-room-id\");\n\nconsumer.connect(\n  (data) => console.log(\"Received data:\", data),\n  (err) => console.error(\"Consumer error:\", err),\n);\n\n// To stop listening\n// consumer.disconnect();\n```\n\n## Troubleshooting & Advanced Configuration\n\n### AudioWorklet & CORS / CSP Issues\n\nThe SDK uses an **AudioWorklet** to process microphone audio efficiently. By default, it attempts to load this worklet via an inline `Blob` URL to make getting started easier. However, this can cause issues in two scenarios:\n\n1.  **Content Security Policy (CSP)**: Your site blocks `worker-src blob:`.\n2.  **CORS**: In some strict browser environments, loading worklets from cross-origin Blobs can fail.\n\n**Symptoms:**\n\n- Error: `DOMException: The user aborted a request.`\n- Error: `SecurityError: The operation is insecure.`\n- Network error loading `blob:...`\n\n**Workaround (Recommended for Production):**\n\nHost the processor file yourself to avoid Blob/CSP issues.\n\n1.  Locate `pcm-processor.js` in the `dist` folder of the `@apptek/streaming-js-sdk` package.\n2.  Host this file on your server (e.g., `/assets/pcm-processor.js`).\n3.  Pass the `workletUrl` to `startMicrophone`.\n\n```typescript\nconst micConfig = {\n    audioConfiguration: { ... },\n    speechConfiguration: { ... }\n};\n\n// Use your own hosted processor file\nawait sdk.startMicrophone(micConfig, callbacks, undefined, {\n    workletUrl: \"/assets/pcm-processor.js\"\n});\n```\n\n_Note: You may need to access the internal `MicrophoneRecorder` directly if the high-level SDK doesn't expose `workletUrl` in the top-level config yet, or ensure your `config` object is passed correctly down to the microphone._\n","readmeFilename":"README.md"}