| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364 |
- import { randomUUID, type UUID } from 'crypto'
- import { validateUuid } from './uuid.js'
- export type ParsedSessionUrl = {
- sessionId: UUID
- ingressUrl: string | null
- isUrl: boolean
- jsonlFile: string | null
- isJsonlFile: boolean
- }
- /**
- * Parses a session resume identifier which can be either:
- * - A URL containing session ID (e.g., https://api.example.com/v1/session_ingress/session/550e8400-e29b-41d4-a716-446655440000)
- * - A plain session ID (UUID)
- *
- * @param resumeIdentifier - The URL or session ID to parse
- * @returns Parsed session information or null if invalid
- */
- export function parseSessionIdentifier(
- resumeIdentifier: string,
- ): ParsedSessionUrl | null {
- // Check for JSONL file path before URL parsing, since Windows absolute
- // paths (e.g., C:\path\file.jsonl) are parsed as valid URLs with C: as protocol
- if (resumeIdentifier.toLowerCase().endsWith('.jsonl')) {
- return {
- sessionId: randomUUID() as UUID,
- ingressUrl: null,
- isUrl: false,
- jsonlFile: resumeIdentifier,
- isJsonlFile: true,
- }
- }
- // Check if it's a plain UUID
- if (validateUuid(resumeIdentifier)) {
- return {
- sessionId: resumeIdentifier as UUID,
- ingressUrl: null,
- isUrl: false,
- jsonlFile: null,
- isJsonlFile: false,
- }
- }
- // Check if it's a URL
- try {
- const url = new URL(resumeIdentifier)
- // Use the entire URL as the ingress URL
- // Always generate a random session ID
- return {
- sessionId: randomUUID() as UUID,
- ingressUrl: url.href,
- isUrl: true,
- jsonlFile: null,
- isJsonlFile: false,
- }
- } catch {
- // Not a valid URL
- }
- return null
- }
|