(storage: OpenADEYjsStorageAdapter)
| 153 | } |
| 154 | |
| 155 | export function createOpenADEYjsProjection(storage: OpenADEYjsStorageAdapter): OpenADEYjsProjection { |
| 156 | async function readSnapshot(options: { version?: string; hostName?: string; workingTaskIds?: string[] } = {}): Promise<OpenADESnapshot> { |
| 157 | const settings = await readPersonalSettings(storage) |
| 158 | const workingTaskIds = options.workingTaskIds ?? [] |
| 159 | const pinnedTaskIds = Array.isArray(settings.pinnedTaskIds) |
| 160 | ? settings.pinnedTaskIds.filter((id): id is string => typeof id === "string") |
| 161 | : [] |
| 162 | |
| 163 | return { |
| 164 | server: { |
| 165 | version: options.version ?? "local", |
| 166 | hostName: options.hostName ?? storage.hostName?.() ?? "OpenADE", |
| 167 | theme: resolveTheme(settings), |
| 168 | }, |
| 169 | repos: await readRepos(storage, { workingTaskIds, pinnedTaskIds }), |
| 170 | workingTaskIds, |
| 171 | } |
| 172 | } |
| 173 | |
| 174 | async function readProjects(options: { workingTaskIds?: string[] } = {}): Promise<OpenADEProject[]> { |
| 175 | const snapshot = await readSnapshot(options) |
| 176 | return snapshot.repos |
| 177 | } |
| 178 | |
| 179 | async function readTaskList(repoId: string, options: { workingTaskIds?: string[] } = {}): Promise<OpenADETaskPreview[]> { |
| 180 | const repos = await readProjects(options) |
| 181 | return repos.find((repo) => repo.id === repoId)?.tasks ?? [] |
| 182 | } |
| 183 | |
| 184 | async function readTask(repoId: string, taskId: string): Promise<OpenADETask> { |
| 185 | const documentId = `code:task:${taskId}` |
| 186 | const [meta, events, comments, deviceEnvironments, preview] = await Promise.all([ |
| 187 | storage.readMapObject(documentId, "task:meta"), |
| 188 | storage.readOrderedArray<Record<string, unknown>>(documentId, "task:events"), |
| 189 | storage.readOrderedArray<Record<string, unknown>>(documentId, "task:comments"), |
| 190 | storage.readOrderedArray<Record<string, unknown>>(documentId, "task:deviceEnvironments"), |
| 191 | readTaskList(repoId).then((tasks) => tasks.find((task) => task.id === taskId)), |
| 192 | ]) |
| 193 | |
| 194 | if (!meta) { |
| 195 | if (!preview) throw new Error(`Task ${taskId} not found`) |
| 196 | return { |
| 197 | id: preview.id, |
| 198 | repoId, |
| 199 | slug: preview.slug, |
| 200 | title: preview.title, |
| 201 | description: "", |
| 202 | isolationStrategy: { type: "head" }, |
| 203 | closed: preview.closed, |
| 204 | unavailableReason: "Task data is unavailable on the desktop host.", |
| 205 | deviceEnvironments: [], |
| 206 | events: [], |
| 207 | comments: [], |
| 208 | } |
| 209 | } |
| 210 | |
| 211 | const metaId = stringValue(meta.id) |
| 212 | if (metaId !== taskId) { |
no test coverage detected