Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
103 changes: 65 additions & 38 deletions src/utils/userAgent.ts
Original file line number Diff line number Diff line change
@@ -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
Expand All @@ -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 };
}
}
35 changes: 34 additions & 1 deletion tests/unit/utils.test.ts
Original file line number Diff line number Diff line change
@@ -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();

Expand Down Expand Up @@ -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",
});
});
});