diff --git a/internal/jobserver/buildid/version.go b/internal/jobserver/buildid/version.go index aea8c664..0f2da912 100644 --- a/internal/jobserver/buildid/version.go +++ b/internal/jobserver/buildid/version.go @@ -35,13 +35,10 @@ type ( VersionSuffixResponse string ) -func (*VersionSuffixRequest) Subject() string { - return versionSubject -} - -func (VersionSuffixResponse) IsResponseTo(*VersionSuffixRequest) {} +func (VersionSuffixRequest) Subject() string { return versionSubject } +func (VersionSuffixRequest) ResponseIs(VersionSuffixResponse) {} -func (s *service) versionSuffix(ctx context.Context, _ *VersionSuffixRequest) (VersionSuffixResponse, error) { +func (s *service) versionSuffix(ctx context.Context, _ VersionSuffixRequest) (VersionSuffixResponse, error) { log := zerolog.Ctx(ctx) s.mu.Lock() diff --git a/internal/jobserver/client/client.go b/internal/jobserver/client/client.go index 5da3bac0..a84548c9 100644 --- a/internal/jobserver/client/client.go +++ b/internal/jobserver/client/client.go @@ -43,12 +43,13 @@ func (c *Client) Close() { } type ( - request interface { + request[Res any] interface { Subject() string + common.Request[Res] } ) -func Request[Req request, Res common.ResponseTo[Req]](ctx context.Context, client *Client, req Req) (Res, error) { +func Request[Res any, Req request[Res]](ctx context.Context, client *Client, req Req) (Res, error) { reqData, err := json.Marshal(req) if err != nil { var zero Res diff --git a/internal/jobserver/common/handler.go b/internal/jobserver/common/handler.go index d6389c30..bb072687 100644 --- a/internal/jobserver/common/handler.go +++ b/internal/jobserver/common/handler.go @@ -16,19 +16,19 @@ import ( ) type ( - ResponseTo[Request any] interface { - IsResponseTo(Request) + Request[Res any] interface { + ResponseIs(Res) } // RequestHandler is a function that processes a request of a given type, and returns a response or an error to be // sent back to the client. - RequestHandler[Request any, Response ResponseTo[Request]] func(context.Context, Request) (Response, error) + RequestHandler[Res any, Req Request[Res]] func(context.Context, Req) (Res, error) ) // HandleRequest returns a NATS subscription target that calls the provided request handler in a new goroutine if the // NATS message payload can be parsed into the specified request type, and responds to the client appropriately. -func HandleRequest[Request any, Response ResponseTo[Request]](ctx context.Context, handler RequestHandler[Request, Response]) func(*nats.Msg) { +func HandleRequest[Res any, Req Request[Res]](ctx context.Context, handler RequestHandler[Res, Req]) func(*nats.Msg) { return func(msg *nats.Msg) { - var req Request + var req Req if err := json.Unmarshal(msg.Data, &req); err != nil { respond(ctx, msg, errorResponse{Error: err.Error()}) return @@ -41,7 +41,7 @@ func HandleRequest[Request any, Response ResponseTo[Request]](ctx context.Contex respond(ctx, msg, errorResponse{Error: err.Error()}) return } - respond(ctx, msg, successResponse[Response]{Result: resp}) + respond(ctx, msg, successResponse[Res]{Result: resp}) }() } } diff --git a/internal/jobserver/nbt/nbt.go b/internal/jobserver/nbt/nbt.go index 8cc5ac1d..e88ae416 100644 --- a/internal/jobserver/nbt/nbt.go +++ b/internal/jobserver/nbt/nbt.go @@ -117,8 +117,8 @@ const ( LabelAsmhdr Label = "go_asm.h" ) -func (StartRequest) Subject() string { return startSubject } -func (*StartResponse) IsResponseTo(StartRequest) {} +func (StartRequest) Subject() string { return startSubject } +func (StartRequest) ResponseIs(*StartResponse) {} func (s *service) start(ctx context.Context, req StartRequest) (*StartResponse, error) { if req.ImportPath == "" || req.BuildID == "" { @@ -183,8 +183,8 @@ type ( } ) -func (FinishRequest) Subject() string { return finishSubject } -func (*FinishResponse) IsResponseTo(FinishRequest) {} +func (FinishRequest) Subject() string { return finishSubject } +func (FinishRequest) ResponseIs(*FinishResponse) {} var errNoFilesNorError = errors.New("missing files, and no error reported") @@ -214,7 +214,7 @@ func (s *service) finish(ctx context.Context, req FinishRequest) (*FinishRespons if !state.isDone.CompareAndSwap(false, true) { log.Info().Msg("Task was already completed (concurrent retry?)") - return &FinishResponse{}, nil + return nil, nil } defer state.onDone() diff --git a/internal/jobserver/pkgs/resolve.go b/internal/jobserver/pkgs/resolve.go index fed9061d..a5c2ead7 100644 --- a/internal/jobserver/pkgs/resolve.go +++ b/internal/jobserver/pkgs/resolve.go @@ -60,19 +60,16 @@ type ( ResolveResponse map[string]string ) -func NewResolveRequest(dir string, pattern string) *ResolveRequest { - return &ResolveRequest{ +func NewResolveRequest(dir string, pattern string) ResolveRequest { + return ResolveRequest{ Dir: dir, Env: os.Environ(), Pattern: pattern, } } -func (*ResolveRequest) Subject() string { - return resolveSubject -} - -func (ResolveResponse) IsResponseTo(*ResolveRequest) {} +func (ResolveRequest) Subject() string { return resolveSubject } +func (ResolveRequest) ResponseIs(ResolveResponse) {} func (r *ResolveRequest) canonicalizeEnviron() { named := make(map[string]string, len(r.Env)) diff --git a/internal/jobserver/pkgs/resolve_test.go b/internal/jobserver/pkgs/resolve_test.go index fd30863e..8c3b0b1b 100644 --- a/internal/jobserver/pkgs/resolve_test.go +++ b/internal/jobserver/pkgs/resolve_test.go @@ -39,7 +39,7 @@ func Test(t *testing.T) { env := os.Environ() // First request is expected to always be a cache miss - resp, err := client.Request[*pkgs.ResolveRequest, pkgs.ResolveResponse]( + resp, err := client.Request( context.Background(), conn, &pkgs.ResolveRequest{ @@ -56,7 +56,7 @@ func Test(t *testing.T) { // of entries in `env` is also shuffled, which should have no impact on the // cache hitting or missing. rand.Shuffle(len(env), func(i, j int) { env[i], env[j] = env[j], env[i] }) - resp, err = client.Request[*pkgs.ResolveRequest, pkgs.ResolveResponse]( + resp, err = client.Request( context.Background(), conn, &pkgs.ResolveRequest{ @@ -70,7 +70,7 @@ func Test(t *testing.T) { assert.EqualValues(t, 1, server.CacheStats.Hits()) // Third request is different, should result in a cache miss again - resp, err = client.Request[*pkgs.ResolveRequest, pkgs.ResolveResponse]( + resp, err = client.Request( context.Background(), conn, &pkgs.ResolveRequest{ @@ -93,7 +93,7 @@ func Test(t *testing.T) { require.NoError(t, err) defer conn.Close() - resp, err := client.Request[*pkgs.ResolveRequest, pkgs.ResolveResponse]( + resp, err := client.Request( context.Background(), conn, &pkgs.ResolveRequest{Pattern: "definitely.not/a@valid\x01package"}, diff --git a/internal/toolexec/aspect/oncompile.go b/internal/toolexec/aspect/oncompile.go index b793f434..4fa46f17 100644 --- a/internal/toolexec/aspect/oncompile.go +++ b/internal/toolexec/aspect/oncompile.go @@ -76,7 +76,7 @@ func (w Weaver) OnCompile(ctx context.Context, cmd *proxy.CompileCommand) (resEr if js, err := client.FromEnvironment(ctx, cmd.WorkDir); err != nil { log.Debug().Str("work-dir", cmd.WorkDir).Err(err).Msg("Failed to obtain job server client") } else { - res, err := client.Request[nbt.StartRequest, *nbt.StartResponse](ctx, js, nbt.StartRequest{ImportPath: w.ImportPath, BuildID: cmd.Flags.BuildID}) + res, err := client.Request(ctx, js, nbt.StartRequest{ImportPath: w.ImportPath, BuildID: cmd.Flags.BuildID}) if err != nil { log.Error().Err(err).Msg("Never-build-twice start request failed") js.Close() @@ -133,7 +133,7 @@ func (w Weaver) OnCompile(ctx context.Context, cmd *proxy.CompileCommand) (resEr files[nbt.LabelAsmhdr] = asmhdr } } - _, err := client.Request[nbt.FinishRequest, *nbt.FinishResponse](ctx, js, nbt.FinishRequest{ + _, err := client.Request(ctx, js, nbt.FinishRequest{ ImportPath: w.ImportPath, FinishToken: res.FinishToken, Files: files, diff --git a/internal/toolexec/aspect/resolve.go b/internal/toolexec/aspect/resolve.go index 6cdd8a9d..074c6ce6 100644 --- a/internal/toolexec/aspect/resolve.go +++ b/internal/toolexec/aspect/resolve.go @@ -35,7 +35,7 @@ func resolvePackageFiles(ctx context.Context, importPath string, workDir string) // and the root work tree contains all child work trees involved in resolutions. req.TempDir = filepath.Join(workDir, "__tmp__") } - archives, err := client.Request[*pkgs.ResolveRequest, pkgs.ResolveResponse]( + archives, err := client.Request( context.Background(), conn, req, diff --git a/internal/toolexec/version.go b/internal/toolexec/version.go index 0f519841..a7a6369d 100644 --- a/internal/toolexec/version.go +++ b/internal/toolexec/version.go @@ -53,7 +53,7 @@ func ComputeVersion(ctx context.Context, cmd proxy.Command) (string, error) { } defer conn.Close() - res, err := client.Request[*buildid.VersionSuffixRequest, buildid.VersionSuffixResponse](context.Background(), conn, nil) + res, err := client.Request(context.Background(), conn, buildid.VersionSuffixRequest{}) if err != nil { return "", err }