Spaces:
Running
Running
| import type { Context } from "hono" | |
| import { expect, test } from "bun:test" | |
| import { createHash, randomUUID } from "node:crypto" | |
| import type { AnthropicMessagesPayload } from "~/routes/messages/anthropic-types" | |
| import { getRootSessionId, getUUID } from "../src/lib/utils" | |
| const jsonStyleUserId = JSON.stringify({ | |
| device_id: "3f4a1b7c8d9e0f1234567890abcdef1234567890abcdef1234567890abcdef12", | |
| account_uuid: "", | |
| session_id: "2c4e1cf0-7a67-4d2e-9a4b-1d16d3f44752", | |
| }) | |
| const legacyStyleUserId = | |
| "user_8b7e2c1d4f6a9b3c0d1e2f3456789abcdeffedcba9876543210fedcba1234567_account__session_7d0e2f61-4b5c-4a9d-8f11-2c3d4e5f6a7b" | |
| const getLegacyUUID = (content: string): string => { | |
| const hash32 = createHash("sha256").update(content).digest("hex").slice(0, 32) | |
| return `${hash32.slice(0, 8)}-${hash32.slice(8, 12)}-${hash32.slice(12, 16)}-${hash32.slice(16, 20)}-${hash32.slice(20)}` | |
| } | |
| test("getUUID returns a deterministic standards-compliant UUIDv4", () => { | |
| const uuid = getUUID("hello world") | |
| expect(uuid).toBe("b94d27b9-934d-4e08-a52e-52d7da7dabfa") | |
| expect(uuid).toMatch( | |
| /^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/, | |
| ) | |
| expect(getUUID("hello world")).toBe(uuid) | |
| expect(getUUID("hello world!")).not.toBe(uuid) | |
| }) | |
| test("prints randomUUID and deterministic UUID for comparison", () => { | |
| const input = "hello world" | |
| const random = randomUUID() | |
| const legacy = getLegacyUUID(input) | |
| const derived = getUUID(input) | |
| const derivedAgain = getUUID(input) | |
| console.info(`randomUUID(): ${random}`) | |
| console.info(`legacy getUUID(${JSON.stringify(input)}): ${legacy}`) | |
| console.info(`getUUID(${JSON.stringify(input)}): ${derived}`) | |
| console.info(`getUUID(${JSON.stringify(input)}) again: ${derivedAgain}`) | |
| expect(random).toMatch( | |
| /^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/, | |
| ) | |
| expect(derived).toMatch( | |
| /^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/, | |
| ) | |
| expect(legacy).toBe("b94d27b9-934d-3e08-a52e-52d7da7dabfa") | |
| expect(derived).toBe("b94d27b9-934d-4e08-a52e-52d7da7dabfa") | |
| expect(derivedAgain).toBe(derived) | |
| expect(legacy).not.toBe(derived) | |
| expect(random).not.toBe(derived) | |
| }) | |
| test("getRootSessionId supports JSON-like user_id metadata", () => { | |
| const anthropicPayload = { | |
| model: "claude-3-5-sonnet", | |
| messages: [], | |
| max_tokens: 0, | |
| metadata: { | |
| user_id: jsonStyleUserId, | |
| }, | |
| } as AnthropicMessagesPayload | |
| const context = { | |
| req: { | |
| header: (_name: string) => undefined, | |
| }, | |
| } as unknown as Context | |
| expect(getRootSessionId(anthropicPayload, context)).toBe( | |
| getUUID("2c4e1cf0-7a67-4d2e-9a4b-1d16d3f44752"), | |
| ) | |
| }) | |
| test("getRootSessionId keeps legacy parsing before JSON fallback", () => { | |
| const anthropicPayload = { | |
| model: "claude-3-5-sonnet", | |
| messages: [], | |
| max_tokens: 0, | |
| metadata: { | |
| user_id: legacyStyleUserId, | |
| }, | |
| } as AnthropicMessagesPayload | |
| const context = { | |
| req: { | |
| header: (_name: string) => undefined, | |
| }, | |
| } as unknown as Context | |
| expect(getRootSessionId(anthropicPayload, context)).toBe( | |
| getUUID("7d0e2f61-4b5c-4a9d-8f11-2c3d4e5f6a7b"), | |
| ) | |
| }) | |