Releases: connectrpc/connect-es
v1.4.0
What's Changed
This release includes support for server-side interceptors! Here's a quick example:
import * as http from "http";
import routes from "./connect";
import { connectNodeAdapter } from "@connectrpc/connect-node";
import type { Interceptor } from "@connectrpc/connect";
const logger: Interceptor = (next) => async (req) => {
console.log(`recevied message on ${req.url}`);
return await next(req);
};
http
.createServer(
connectNodeAdapter({
routes,
interceptors: [logger],
}),
)
.listen(8080);
For more on them please see the docs.
Other Changes
- Add service and method in grpc-web unary response by @minimal1 in #984
- Document the
ts_nocheck
plugin option by @timostamm in #1012 - Remove node export condition by @smaye81 in #1017
- Avoid instanceof Message by @timostamm in #1023
New Contributors
Full Changelog: v1.3.0...v1.4.0
v1.3.0
What's Changed
- Export
*TransportOptions
types forconnect-node
by @jrschumacher in #959 - Override
instanceof
forConnectError
by @srikrsna-buf in #974
New Contributors
- @jrschumacher made their first contribution in #959
Full Changelog: v1.2.1...v1.3.0
v1.2.1
What's Changed
- Fix normalization of partial messages by @timostamm in #975
Full Changelog: v1.2.0...v1.2.1
v1.2.0
What's Changed
By default, protoc-gen-connect-es (and all other plugins based on @bufbuild/protoplugin) generate ECMAScript import
and export
statements. For use cases where CommonJS is difficult to avoid, a new plugin option has been added named js_import_style
which can be used to generate CommonJS require()
calls.
Here is an example buf.gen.yaml:
version: v1
plugins:
# You'll need @bufbuild/protoc-gen-es v1.6.0 or later
- plugin: es
out: src/gen
opt: js_import_style=legacy_commonjs
- plugin: connect-es
out: src/gen
opt: js_import_style=legacy_commonjs
To view the full PR, see Support CommonJS in protoc-gen-connect-es
by @timostamm in #956
Full Changelog: v1.1.4...v1.2.0
v1.1.4
What's Changed
- Support zero-length compressed request and response messages on Node.js by @timostamm in #893.
- Don't set
User-Agent
header in connect-web by @srikrsna-buf in #912. - Always capture header in
ConnectError
by @srikrsna-buf in #924. - Introduce experimental
ConnectRouter.rpc
overload to not require fullServiceType
by @paul-sachs in #925. - Add explicit exports for node by @smaye81 in #921.
Full Changelog: v1.1.3...v1.1.4
v1.1.3
What's Changed
- Fix multiple read attempts in fetch client by @srikrsna-buf in #876
Full Changelog: v1.1.2...v1.1.3
v1.1.2
What's Changed
- Add ESM wrapper to avoid dual package hazard by @timostamm in #842
Full Changelog: v1.1.1...v1.1.2
v1.1.1
What's Changed
- Fix ping not timing out in nodejs after H2 sessions verify by @srikrsna-buf in #869
Full Changelog: v1.1.0...v1.1.1
v1.1.0
What's Changed
Add support for user provided context values in handlers and clients.
Create a context key with a default value:
export interface User {
id: string;
}
import { createContextKey } from "@connectrpc/connect";
export const kUser = createContextKey<User | undefined>(
undefined // The default value.
);
Use the contextValues
option to provide the context values for each request:
import { fastify } from "fastify";
import routes from "./connect";
import { fastifyConnectPlugin } from "@connectrpc/connect-fastify";
import { authenticate } from "./authenticate.js";
import { kUser } from "./user-ctx.js";
const server = fastify();
await server.register(fastifyConnectPlugin, {
routes,
contextValues: (req) => createContextValues().set(kUser, authenticate(req)),
});
await server.listen({
host: "localhost",
port: 8080,
});
Use the context value in the handler:
import { ConnectRouter } from "@connectrpc/connect";
import { ElizaService } from "./gen/eliza_connect.js";
export default (router: ConnectRouter) => {
// using const say
router.service(ElizaService, {
say: (req, { values }) => {
const currentUser = values.get(kUser);
if (currentUser === undefined) {
throw new ConnectError("Unauthenticated", Code.Unauthenticated);
}
// ...
},
});
};
Can be used in clients too:
import { ElizaService } from "gen/...";
import { createPromiseClient } from "@connectrpc/connect";
import transport from "./transport.js";
import kUser from "user-context.js";
const client = createPromiseClient(ElizeService, trasport);
await client.say({ sentence: "Hi" }, { values: createContextValues().set(kUser, { ... }) });
Which can be accessed in an interceptor:
const tokenInterceptor = (next) => {
return (req) => {
req.header.set("Authorization", `Bearer ${req.values.get(kUser).token}`);
return next(req);
};
};
Enhancements
- Update to latest versions in
connect-migrate
by @mkusaka in #837 - Add default request timeout for clients by @srikrsna-buf in #844
- Add support for graceful shutdown in fastify by @srikrsna-buf in #843
Bug fixes
- Fix early event loop exit on nodejs when H2 sessions are in the verify state by @srikrsna-buf in #861
- Fix type exports and integrate
arethetypeswrong
by @smaye81 in #838
New Contributors
Full Changelog: v1.0.0...v1.1.0