@@ -17,19 +17,31 @@ import (
1717
1818var ErrEmptyRequest = errors .New ("empty request" )
1919
20+ type APIv2HandlerConfig struct {
21+ Client * goplay.Client
22+ Builder builder.BuildService
23+ BuildTimeout time.Duration
24+ }
25+
26+ func (cfg APIv2HandlerConfig ) buildContext (parentCtx context.Context ) (context.Context , context.CancelFunc ) {
27+ if cfg .BuildTimeout == 0 {
28+ return parentCtx , func () {}
29+ }
30+
31+ return context .WithDeadline (parentCtx , time .Now ().Add (cfg .BuildTimeout ))
32+ }
33+
2034type APIv2Handler struct {
21- logger * zap.Logger
22- compiler builder.BuildService
23- client * goplay.Client
24- limiter * rate.Limiter
35+ logger * zap.Logger
36+ limiter * rate.Limiter
37+ cfg APIv2HandlerConfig
2538}
2639
27- func NewAPIv2Handler (client * goplay. Client , builder builder. BuildService ) * APIv2Handler {
40+ func NewAPIv2Handler (cfg APIv2HandlerConfig ) * APIv2Handler {
2841 return & APIv2Handler {
29- logger : zap .L ().Named ("api.v2" ),
30- compiler : builder ,
31- client : client ,
32- limiter : rate .NewLimiter (rate .Every (frameTime ), compileRequestsPerFrame ),
42+ logger : zap .L ().Named ("api.v2" ),
43+ cfg : cfg ,
44+ limiter : rate .NewLimiter (rate .Every (frameTime ), compileRequestsPerFrame ),
3345 }
3446}
3547
@@ -38,7 +50,7 @@ func (h *APIv2Handler) HandleGetSnippet(w http.ResponseWriter, r *http.Request)
3850 vars := mux .Vars (r )
3951 snippetID := vars ["id" ]
4052
41- snippet , err := h .client .GetSnippet (r .Context (), snippetID )
53+ snippet , err := h .cfg . Client .GetSnippet (r .Context (), snippetID )
4254 if err != nil {
4355 if errors .Is (err , goplay .ErrSnippetNotFound ) {
4456 return Errorf (http .StatusNotFound , "snippet %q not found" , snippetID )
@@ -76,7 +88,7 @@ func (h *APIv2Handler) HandleShare(w http.ResponseWriter, r *http.Request) error
7688 return err
7789 }
7890
79- snippetID , err := h .client .Share (ctx , payload .Reader ())
91+ snippetID , err := h .cfg . Client .Share (ctx , payload .Reader ())
8092 if err != nil {
8193 return err
8294 }
@@ -108,7 +120,7 @@ func (h *APIv2Handler) HandleFormat(w http.ResponseWriter, r *http.Request) erro
108120 return err
109121 }
110122
111- rsp , err := h .client .GoImports (ctx , payload .Bytes (), backend )
123+ rsp , err := h .cfg . Client .GoImports (ctx , payload .Bytes (), backend )
112124 if err != nil {
113125 if isContentLengthError (err ) {
114126 return ErrSnippetTooLarge
@@ -148,7 +160,7 @@ func (h *APIv2Handler) HandleRun(w http.ResponseWriter, r *http.Request) error {
148160 return NewBadRequestError (err )
149161 }
150162
151- res , err := h .client .Evaluate (ctx , goplay.CompileRequest {
163+ res , err := h .cfg . Client .Evaluate (ctx , goplay.CompileRequest {
152164 Version : goplay .DefaultVersion ,
153165 WithVet : params .Vet ,
154166 Body : snippet ,
@@ -172,7 +184,7 @@ func (h *APIv2Handler) HandleRun(w http.ResponseWriter, r *http.Request) error {
172184// HandleCompile handles WebAssembly compile requests.
173185func (h * APIv2Handler ) HandleCompile (w http.ResponseWriter , r * http.Request ) error {
174186 // Limit for request timeout
175- ctx , cancel := context . WithDeadline (r .Context (), time . Now (). Add ( maxBuildTimeDuration ))
187+ ctx , cancel := h . cfg . buildContext (r .Context ())
176188 defer cancel ()
177189
178190 // Wait for our queue in line for compilation
@@ -185,11 +197,12 @@ func (h *APIv2Handler) HandleCompile(w http.ResponseWriter, r *http.Request) err
185197 return err
186198 }
187199
188- result , err := h .compiler .Build (ctx , files )
189- if builder .IsBuildError (err ) {
190- return NewHTTPError (http .StatusBadRequest , err )
191- }
200+ result , err := h .cfg .Builder .Build (ctx , files )
192201 if err != nil {
202+ if builder .IsBuildError (err ) || errors .Is (err , context .Canceled ) {
203+ return NewHTTPError (http .StatusBadRequest , err )
204+ }
205+
193206 return err
194207 }
195208
0 commit comments