(ctx context.Context)
| 158 | } |
| 159 | |
| 160 | func (r *Resolver) open(ctx context.Context) (gatewayResolver, error) { |
| 161 | r.startOnce.Do(func() { |
| 162 | r.started.Store(true) |
| 163 | buildCtx, cancel := context.WithCancelCause(context.Background()) |
| 164 | r.cancel = cancel |
| 165 | |
| 166 | go func() { |
| 167 | r.doneErr = r.run(buildCtx, r.ready) |
| 168 | close(r.done) |
| 169 | }() |
| 170 | }) |
| 171 | |
| 172 | for { |
| 173 | r.mu.Lock() |
| 174 | if r.metaResolver != nil { |
| 175 | mr := r.metaResolver |
| 176 | r.mu.Unlock() |
| 177 | return mr, nil |
| 178 | } |
| 179 | if r.openErr != nil { |
| 180 | err := r.openErr |
| 181 | r.mu.Unlock() |
| 182 | return nil, err |
| 183 | } |
| 184 | r.mu.Unlock() |
| 185 | |
| 186 | select { |
| 187 | case mr := <-r.ready: |
| 188 | r.mu.Lock() |
| 189 | if r.metaResolver == nil { |
| 190 | r.metaResolver = mr |
| 191 | r.openOnce.Do(func() { |
| 192 | close(r.opened) |
| 193 | }) |
| 194 | } |
| 195 | r.mu.Unlock() |
| 196 | case <-r.done: |
| 197 | r.mu.Lock() |
| 198 | if r.metaResolver == nil && r.openErr == nil { |
| 199 | err := r.doneErr |
| 200 | if err == nil { |
| 201 | err = errors.New("gateway build finished without a source metadata resolver") |
| 202 | } |
| 203 | r.openErr = err |
| 204 | r.openOnce.Do(func() { |
| 205 | close(r.opened) |
| 206 | }) |
| 207 | } |
| 208 | r.mu.Unlock() |
| 209 | case <-r.opened: |
| 210 | case <-ctx.Done(): |
| 211 | return nil, context.Cause(ctx) |
| 212 | } |
| 213 | } |
| 214 | } |
no test coverage detected