@@ -3,6 +3,7 @@ import * as Fiber from "effect/Fiber"
33
44import { request } from "./api-http.js"
55import { asArray , asObject , asString , type JsonValue } from "./api-json.js"
6+ import { type ApiProjectDetails , decodeProjectDetails } from "./api-project-codec.js"
67import type { ControllerRuntime } from "./controller.js"
78import type { ApiAuthRequiredError , ApiRequestError } from "./host-errors.js"
89import { formatProjectEventLine } from "./project-event-lines.js"
@@ -23,6 +24,11 @@ type ProjectEventPollResponse = {
2324
2425type ProjectCreationWaitError = ApiAuthRequiredError | ApiRequestError
2526
27+ export type ProjectCreationResult = {
28+ readonly projectId : string
29+ readonly project : ApiProjectDetails | null
30+ }
31+
2632export type ProjectEventPolling = {
2733 readonly cursorRef : Ref . Ref < number >
2834 readonly fiber : Fiber . RuntimeFiber < number >
@@ -88,13 +94,19 @@ const readProjectEventPayloadField = (
8894 return object === null ? null : asString ( object [ key ] )
8995}
9096
91- const readCreatedProjectId = (
97+ const readCreatedProject = (
9298 event : ProjectEvent ,
9399 fallbackProjectId : string
94- ) : string | null =>
95- event . type === "project.created"
96- ? ( readProjectEventPayloadField ( event , "projectId" ) ?? fallbackProjectId )
97- : null
100+ ) : ProjectCreationResult | null => {
101+ if ( event . type !== "project.created" ) {
102+ return null
103+ }
104+
105+ const payload = asObject ( event . payload )
106+ const projectId = readProjectEventPayloadField ( event , "projectId" ) ?? fallbackProjectId
107+ const project = payload === null ? null : decodeProjectDetails ( payload [ "project" ] ?? null )
108+ return { projectId, project }
109+ }
98110
99111const readFailedMessage = ( event : ProjectEvent ) : string | null =>
100112 event . type === "project.deployment.status" && readProjectEventPayloadField ( event , "phase" ) === "failed"
@@ -137,14 +149,14 @@ const pollProjectEventsOnce = (
137149 return response
138150 } )
139151
140- const findCreatedProjectId = (
152+ const findCreatedProject = (
141153 projectId : string ,
142154 events : ReadonlyArray < ProjectEvent >
143- ) : string | null => {
155+ ) : ProjectCreationResult | null => {
144156 for ( const event of events ) {
145- const createdProjectId = readCreatedProjectId ( event , projectId )
146- if ( createdProjectId !== null ) {
147- return createdProjectId
157+ const created = readCreatedProject ( event , projectId )
158+ if ( created !== null ) {
159+ return created
148160 }
149161 }
150162 return null
@@ -165,17 +177,17 @@ const findFailureMessage = (
165177const waitForProjectCreationLoop = (
166178 projectId : string ,
167179 cursorRef : Ref . Ref < number >
168- ) : Effect . Effect < string , ProjectCreationWaitError , ControllerRuntime > =>
180+ ) : Effect . Effect < ProjectCreationResult , ProjectCreationWaitError , ControllerRuntime > =>
169181 Effect . gen ( function * ( _ ) {
170182 const response = yield * _ ( pollProjectEventsOnce ( projectId , cursorRef ) )
171183 const failureMessage = findFailureMessage ( response . events )
172184 if ( failureMessage !== null ) {
173185 return yield * _ ( Effect . fail ( toProjectCreationError ( projectId , failureMessage ) ) )
174186 }
175187
176- const createdProjectId = findCreatedProjectId ( projectId , response . events )
177- if ( createdProjectId !== null ) {
178- return createdProjectId
188+ const created = findCreatedProject ( projectId , response . events )
189+ if ( created !== null ) {
190+ return created
179191 }
180192
181193 yield * _ ( Effect . sleep ( projectEventPollInterval ) )
0 commit comments