1import {
2 EnvironmentId,
3 ProjectId,
4 ThreadId,
5 type EnvironmentId as EnvironmentIdType,
6 type ProjectId as ProjectIdType,
7 type ScopedProjectRef,
8 type ScopedThreadRef,
9} from "@t3tools/contracts";
10
11export function scopeProjectRef(
12 environmentId: EnvironmentIdType,
13 projectId: ProjectIdType,
14): ScopedProjectRef {
15 return { environmentId, projectId };
16}
17
18export function scopeThreadRef(
19 environmentId: EnvironmentIdType,
20 threadId: ThreadId,
21): ScopedThreadRef {
22 return { environmentId, threadId };
23}
24
25function scopedRefKey(ref: ScopedProjectRef | ScopedThreadRef): string {
26 const localId = "projectId" in ref ? ref.projectId : ref.threadId;
27 return `${ref.environmentId}:${localId}`;
28}
29
30export function scopedProjectKey(ref: ScopedProjectRef): string {
31 return scopedRefKey(ref);
32}
33
34export function scopedThreadKey(ref: ScopedThreadRef): string {
35 return scopedRefKey(ref);
36}
37
38function parseScopedKey(key: string): { environmentId: EnvironmentIdType; localId: string } | null {
39 const separatorIndex = key.indexOf(":");
40 if (separatorIndex <= 0 || separatorIndex >= key.length - 1) {
41 return null;
42 }
43 return {
44 environmentId: EnvironmentId.make(key.slice(0, separatorIndex)),
45 localId: key.slice(separatorIndex + 1),
46 };
47}
48
49export function parseScopedProjectKey(key: string): ScopedProjectRef | null {
50 const parsed = parseScopedKey(key);
51 if (!parsed) {
52 return null;
53 }
54 return {
55 environmentId: parsed.environmentId,
56 projectId: ProjectId.make(parsed.localId),
57 };
58}
59
60export function parseScopedThreadKey(key: string): ScopedThreadRef | null {
61 const parsed = parseScopedKey(key);
62 if (!parsed) {
63 return null;
64 }
65 return {
66 environmentId: parsed.environmentId,
67 threadId: ThreadId.make(parsed.localId),
68 };
69}