diff --git a/src/utils/userAgent.ts b/src/utils/userAgent.ts index 5da3107..69661b3 100644 --- a/src/utils/userAgent.ts +++ b/src/utils/userAgent.ts @@ -1,5 +1,70 @@ import { UserAgent } from "../types"; +declare const Deno: + | { + version: { + deno: string; + }; + } + | undefined; + +type EnvironmentDetectors = { + process?: { + versions?: { + node?: string; + bun?: string; + }; + }; + deno?: { + version?: { + deno?: string; + }; + }; + navigator?: { + userAgent?: string; + }; +}; + +export const detectDefaultUserAgent = ( + env: EnvironmentDetectors = { + process: typeof process !== "undefined" ? process : undefined, + deno: typeof Deno !== "undefined" ? Deno : undefined, + navigator: typeof navigator !== "undefined" ? navigator : undefined, + }, +): { userAgentString: string; defaultUserAgent: UserAgent } => { + let userAgentString = ""; + if (env.navigator?.userAgent) { + userAgentString += env.navigator.userAgent; + } + + const defaultAgent: UserAgent = { + sdk: { name: "JavaScript", version: "__SDK_VERSION__" }, + }; + + if (env.deno?.version?.deno) { + defaultAgent.runtime_env = { + name: "Deno", + version: env.deno.version.deno, + }; + } else if (env.process?.versions?.bun) { + defaultAgent.runtime_env = { + name: "Bun", + version: env.process.versions.bun, + }; + } else if (env.process?.versions?.node) { + defaultAgent.runtime_env = { + name: "Node", + version: env.process.versions.node, + }; + } + + return { userAgentString, defaultUserAgent: defaultAgent }; +}; + +const detected = detectDefaultUserAgent(); +const defaultUserAgentString = detected.userAgentString; +const defaultUserAgent = detected.defaultUserAgent; + export const buildUserAgent = (userAgent: UserAgent | false) => defaultUserAgentString + (userAgent === false @@ -11,41 +76,3 @@ export const buildUserAgent = (userAgent: UserAgent | false) => ) .join(" ") + ")"); - -let defaultUserAgentString = ""; -if (typeof navigator !== "undefined" && navigator.userAgent) { - defaultUserAgentString += navigator.userAgent; -} - -const defaultUserAgent: UserAgent = { - sdk: { name: "JavaScript", version: "__SDK_VERSION__" }, -}; - -if (typeof process !== "undefined") { - if (process.versions.node && defaultUserAgentString.indexOf("Node") === -1) { - defaultUserAgent.runtime_env = { - name: "Node", - version: process.versions.node, - }; - } - if (process.versions.bun && defaultUserAgentString.indexOf("Bun") === -1) { - defaultUserAgent.runtime_env = { - name: "Bun", - version: process.versions.bun, - }; - } -} - -declare const Deno: - | { - version: { - deno: string; - }; - } - | undefined; - -if (typeof Deno !== "undefined") { - if (process.versions.bun && defaultUserAgentString.indexOf("Deno") === -1) { - defaultUserAgent.runtime_env = { name: "Deno", version: Deno.version.deno }; - } -} diff --git a/tests/unit/utils.test.ts b/tests/unit/utils.test.ts index 306bce2..f44e03c 100644 --- a/tests/unit/utils.test.ts +++ b/tests/unit/utils.test.ts @@ -1,7 +1,10 @@ import fetchMock from "jest-fetch-mock"; import { AssemblyAI } from "../../src"; import { getPath } from "../../src/utils/path"; -import { buildUserAgent } from "../../src/utils/userAgent"; +import { + buildUserAgent, + detectDefaultUserAgent, +} from "../../src/utils/userAgent"; fetchMock.enableMocks(); @@ -120,4 +123,34 @@ describe("utils", () => { }); await service.files.upload(new Blob()); }); + + it("should detect Deno runtime environment", () => { + const { defaultUserAgent } = detectDefaultUserAgent({ + deno: { version: { deno: "1.40.0" } }, + }); + expect(defaultUserAgent.runtime_env).toEqual({ + name: "Deno", + version: "1.40.0", + }); + }); + + it("should detect Bun runtime environment", () => { + const { defaultUserAgent } = detectDefaultUserAgent({ + process: { versions: { bun: "1.1.0" } }, + }); + expect(defaultUserAgent.runtime_env).toEqual({ + name: "Bun", + version: "1.1.0", + }); + }); + + it("should detect Node runtime environment", () => { + const { defaultUserAgent } = detectDefaultUserAgent({ + process: { versions: { node: "20.10.0" } }, + }); + expect(defaultUserAgent.runtime_env).toEqual({ + name: "Node", + version: "20.10.0", + }); + }); });