Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[NATS transport] Support for headers in EncodeJSONResponse #1238

Open
mcosta74 opened this issue Jun 29, 2022 · 6 comments
Open

[NATS transport] Support for headers in EncodeJSONResponse #1238

mcosta74 opened this issue Jun 29, 2022 · 6 comments

Comments

@mcosta74
Copy link

mcosta74 commented Jun 29, 2022

What would you like?

Overview

Since release v1.11.0, nats.go supports message headers. headers are very useful to transfer metadata together with messages.

I'm proposing to add basic support for headers in the default response encoder.

Proposed API

The idea is to do something similar it's done for transport/http with the Headerer interface. API change proposal is backward compatible (no public API change)

type Headerer interface {
    Headers() Header
}

func EncodeJSONResponse(_ context.Context, reply string, nc *nats.Conn, response interface{}) error {
        msg := nats.NewMessage(reply)
        if nc. HeadersSupported() {
                if headerer, ok := response.(Headerer); ok {
                         msg.Header = headerer.Headers()  // I wrote that to make it shorter
                }
        }

	msg.Data, err := json.Marshal(response)
	if err != nil {
		return err
	}

	return nc.PublishMsg(msg)
}

If the proposal is accepted I can raise a PR

@peterbourgon
Copy link
Member

EncodeJSONResponse is a default implementation of a function that consumers can also provide themselves. Does anything prevent that, here?

@mcosta74
Copy link
Author

mcosta74 commented Jun 29, 2022 via email

@peterbourgon
Copy link
Member

So I'd like to try to avoid the situation where default implementations provided by Go kit, like this function, being continuously updated with new features/capabilities of their underlying systems. I see that as unsustainable, as well as unnecessary: Go kit is designed specifically to allow consumers to provide their own EncodeJSONResponse functions.

Can you suggest some wording for the docs that would make this clear?

@mcosta74
Copy link
Author

Something like

Go kit provides default implementation for many functions (for instance http.EncodeJSONResponse, nats.EncodeJSONResponse, http.DefaultErrorEncoder, nats.DefaultErrorEncoder,...) but is designed to allow consumers to provide their implementation (maybe to use the latest features of the underlying systems).

?

@peterbourgon
Copy link
Member

SGTM

@mcosta74
Copy link
Author

Can you suggest "where" to put this sentence in the documentation?

  • website
  • README file
  • ...
    ?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants