(config, state, job)
| 243 | } |
| 244 | |
| 245 | async function allocateSession(config, state, job) { |
| 246 | const payload = job.payload || {}; |
| 247 | const templateName = |
| 248 | payload.simulatorTemplateName || |
| 249 | config.simulatorTemplateName || |
| 250 | "iPhone 17 Pro"; |
| 251 | let udid = ""; |
| 252 | try { |
| 253 | const template = await ensureTemplateSimulator(templateName); |
| 254 | const sessionName = `SimDeck ${payload.sessionId || job.sessionId}`; |
| 255 | udid = await cloneSimulator(template.udid, sessionName); |
| 256 | state.activeSessions.set(job.sessionId, { udid }); |
| 257 | await bootSimulator(config, udid); |
| 258 | if (payload.artifactId) { |
| 259 | const appPath = await downloadAndExtractArtifact(config, job.sessionId); |
| 260 | await localJson( |
| 261 | config, |
| 262 | `/api/simulators/${encodeURIComponent(udid)}/install`, |
| 263 | { |
| 264 | appPath, |
| 265 | }, |
| 266 | ); |
| 267 | } |
| 268 | if (payload.bundleId) { |
| 269 | await localJson( |
| 270 | config, |
| 271 | `/api/simulators/${encodeURIComponent(udid)}/action`, |
| 272 | { |
| 273 | action: "launch", |
| 274 | bundleId: payload.bundleId, |
| 275 | }, |
| 276 | ); |
| 277 | } |
| 278 | const simulator = await simulatorByUdid(config, udid); |
| 279 | await completeJob(config, job.id, { |
| 280 | activeSessionCount: state.activeSessions.size, |
| 281 | runtimeName: simulator?.runtimeName, |
| 282 | simulatorName: simulator?.name || sessionName, |
| 283 | simulatorUdid: udid, |
| 284 | status: "completed", |
| 285 | }); |
| 286 | console.log(`[simdeck-provider] allocated ${udid} for ${job.sessionId}`); |
| 287 | } catch (error) { |
| 288 | if (udid) { |
| 289 | await deleteSimulator(udid).catch(() => {}); |
| 290 | state.activeSessions.delete(job.sessionId); |
| 291 | } |
| 292 | await completeJob(config, job.id, { |
| 293 | activeSessionCount: state.activeSessions.size, |
| 294 | error: describeError(error), |
| 295 | status: "failed", |
| 296 | }); |
| 297 | } |
| 298 | } |
| 299 | |
| 300 | async function releaseSession(config, state, job) { |
| 301 | const payload = job.payload || {}; |
no test coverage detected