diff --git a/.github/workflows/CI.yml b/.github/workflows/CI.yml index b3775b48..a28aba1f 100644 --- a/.github/workflows/CI.yml +++ b/.github/workflows/CI.yml @@ -32,7 +32,7 @@ jobs: strategy: matrix: os: [ubuntu-latest] - node: ["16"] + node: ["18"] runs-on: ${{ matrix.os }} diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml index 59d3839b..34846147 100644 --- a/.github/workflows/docs.yml +++ b/.github/workflows/docs.yml @@ -12,7 +12,7 @@ jobs: strategy: matrix: os: [ubuntu-latest] - node: ["16"] + node: ["18"] runs-on: ${{ matrix.os }} diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 640cdeac..6bdf3a79 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -15,7 +15,7 @@ jobs: name: Release / Node ${{ matrix.node }} strategy: matrix: - node: ["16"] + node: ["18"] runs-on: ubuntu-latest diff --git a/package-lock.json b/package-lock.json index 4359286c..f664e84c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -32,7 +32,6 @@ "pretty-quick": "^3.1.3", "rimraf": "^3.0.2", "semantic-release-plugin-update-version-in-files": "^1.1.0", - "ts-json-schema-generator": "^1.4.0", "ts-loader": "^8.0.11", "ts-node": "^10.9.1", "typedoc": "^0.22.16", @@ -40,6 +39,9 @@ "webpack": "^5.69.1", "webpack-cli": "^4.9.2", "ws": "^8.13.0" + }, + "engines": { + "node": ">=18.0.0" } }, "node_modules/@babel/code-frame": { @@ -5968,15 +5970,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/safe-stable-stringify": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.4.3.tgz", - "integrity": "sha512-e2bDA2WJT0wxseVd4lsDP4+3ONX6HpMXQa1ZhFQ7SU+GjvORCmShbCMltrtIDfkYhVHrOcPtj+KhmDBdPdZD1g==", - "dev": true, - "engines": { - "node": ">=10" - } - }, "node_modules/safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", @@ -6611,89 +6604,6 @@ "node": ">=8" } }, - "node_modules/ts-json-schema-generator": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/ts-json-schema-generator/-/ts-json-schema-generator-1.4.0.tgz", - "integrity": "sha512-wm8vyihmGgYpxrqRshmYkWGNwEk+sf3xV2rUgxv8Ryeh7bSpMO7pZQOht+2rS002eDkFTxR7EwRPXVzrS0WJTg==", - "dev": true, - "dependencies": { - "@types/json-schema": "^7.0.12", - "commander": "^11.0.0", - "glob": "^8.0.3", - "json5": "^2.2.3", - "normalize-path": "^3.0.0", - "safe-stable-stringify": "^2.4.3", - "typescript": "~5.2.2" - }, - "bin": { - "ts-json-schema-generator": "bin/ts-json-schema-generator" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/ts-json-schema-generator/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/ts-json-schema-generator/node_modules/commander": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-11.1.0.tgz", - "integrity": "sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==", - "dev": true, - "engines": { - "node": ">=16" - } - }, - "node_modules/ts-json-schema-generator/node_modules/glob": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", - "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^5.0.1", - "once": "^1.3.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/ts-json-schema-generator/node_modules/minimatch": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", - "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", - "dev": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/ts-json-schema-generator/node_modules/typescript": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.2.2.tgz", - "integrity": "sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==", - "dev": true, - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - }, "node_modules/ts-loader": { "version": "8.4.0", "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-8.4.0.tgz", diff --git a/package.json b/package.json index 4bfe9644..4a1aceab 100644 --- a/package.json +++ b/package.json @@ -29,6 +29,9 @@ "dist", "src" ], + "engines": { + "node": ">=18.0.0" + }, "main": "dist/main/index.js", "module": "dist/module/index.js", "types": "dist/module/index.d.ts", diff --git a/src/packages/LiveClient.ts b/src/packages/LiveClient.ts index 4b080825..4cdc3d5d 100644 --- a/src/packages/LiveClient.ts +++ b/src/packages/LiveClient.ts @@ -2,13 +2,15 @@ import { EventEmitter } from "events"; import { appendSearchParams, isBrowser } from "../lib/helpers"; import WebSocket from "modern-isomorphic-ws"; import { LiveConnectionState, LiveTranscriptionEvents } from "../lib/enums"; +import { DEFAULT_HEADERS } from "../lib/constants"; +import { DeepgramError } from "../lib/errors"; + import type { LiveSchema, LiveConfigOptions, LiveMetadataEvent, LiveTranscriptionEvent, } from "../lib/types"; -import { DEFAULT_HEADERS } from "../lib/constants"; export class LiveClient extends EventEmitter { private _socket: WebSocket; @@ -101,16 +103,21 @@ export class LiveClient extends EventEmitter { * Sends data to the Deepgram API via websocket connection * @param data Audio data to send to Deepgram * - * Conforms to RFC #146 - does not send an empty byte. + * Conforms to RFC #146 for Node.js - does not send an empty byte. + * In the browser, a Blob will contain length with no audio. * @see https://github.com/deepgram/deepgram-python-sdk/issues/146 */ - public send(data: string | ArrayBufferLike | ArrayBufferView): void { + public send(data: string | ArrayBufferLike | Blob): void { if (this._socket.readyState === LiveConnectionState.OPEN) { if (typeof data === "string") { this._socket.send(data); // send text data + } else if ((data as any) instanceof Blob) { + this._socket.send(data as unknown as ArrayBufferLike); // send blob data } else { - if (data.byteLength > 0) { - this._socket.send(data); // send buffer when not zero-byte + const buffer = data as ArrayBufferLike; + + if (buffer.byteLength > 0) { + this._socket.send(buffer); // send buffer when not zero-byte (or browser) } else { this.emit( LiveTranscriptionEvents.Warning, @@ -119,7 +126,7 @@ export class LiveClient extends EventEmitter { } } } else { - this.emit(LiveTranscriptionEvents.Error, "Could not send. Connection not open."); + throw new DeepgramError("Could not send. Connection not open."); } }