import type { EnvironmentId, ProjectId, ScopedProjectRef, ScopedThreadRef, ThreadId, } from "@t3tools/contracts"; export function scopeProjectRef( environmentId: EnvironmentId, projectId: ProjectId, ): ScopedProjectRef { return { environmentId, projectId }; } export function scopeThreadRef(environmentId: EnvironmentId, threadId: ThreadId): ScopedThreadRef { return { environmentId, threadId }; } export function scopedRefKey(ref: ScopedProjectRef | ScopedThreadRef): string { const localId = "projectId" in ref ? ref.projectId : ref.threadId; return `${ref.environmentId}:${localId}`; } export function scopedProjectKey(ref: ScopedProjectRef): string { return scopedRefKey(ref); } export function scopedThreadKey(ref: ScopedThreadRef): string { return scopedRefKey(ref); } function parseScopedKey(key: string): { environmentId: EnvironmentId; localId: string } | null { const separatorIndex = key.indexOf(":"); if (separatorIndex <= 0 || separatorIndex >= key.length - 1) { return null; } return { environmentId: key.slice(0, separatorIndex) as EnvironmentId, localId: key.slice(separatorIndex + 1), }; } export function parseScopedProjectKey(key: string): ScopedProjectRef | null { const parsed = parseScopedKey(key); if (!parsed) { return null; } return { environmentId: parsed.environmentId, projectId: parsed.localId as ProjectId, }; } export function parseScopedThreadKey(key: string): ScopedThreadRef | null { const parsed = parseScopedKey(key); if (!parsed) { return null; } return { environmentId: parsed.environmentId, threadId: parsed.localId as ThreadId, }; }