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

Added whatwg-node-server adapter for grafserv #2288

Open
wants to merge 2 commits into
base: main
Choose a base branch
from

Conversation

kzlar
Copy link
Contributor

@kzlar kzlar commented Dec 23, 2024

Description

@whatwg-node/server is an adapter that helps create generic servers across runtimes (https://www.npmjs.com/package/@whatwg-node/server). It could, at least in theory, replace all of the servers currently implemented, while supporting several more. If this all works out it should help integrations while having to maintain less code.

Note: This doesn't support web-sockets, I'm still looking for a way to do that in a generic fashion, but I see some of the other adapters don't support web-sockets either so I believe this is good enough for now.

Performance impact

unknown, but this PR won't affect anything by itself, it's just adding the adapter.

Security impact

None

Checklist

  • My code matches the project's code style and yarn lint:fix passes.
  • I've added tests for the new feature, and yarn test passes (Well, sort of - I ran the grafserv tests with it and it passed)
  • I have detailed the new feature in the relevant documentation.
  • I have added this feature to 'Pending' in the RELEASE_NOTES.md file (if one exists).
  • If this is a breaking change I've explained why.

Copy link

changeset-bot bot commented Dec 23, 2024

⚠️ No Changeset found

Latest commit: c2d085f

Merging this PR will not cause a version bump for any packages. If these changes should not result in a new version, you're good to go. If these changes should result in a version bump, you need to add a changeset.

This PR includes no changesets

When changesets are added to this PR, you'll see the packages that this PR includes changesets for and the associated semver types

Click here to learn what changesets are, and how to add one.

Click here if you're a maintainer who wants to add a changeset to this PR

Copy link
Member

@benjie benjie left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for starting work on this; it would be great to add @whatwg-node/server as a supported server framework!

Please be sure to format your code; you can run yarn lint:fix in the root. May be worth installing a prettier extension into your editor of choice and configuring it so that it happens automatically on save.

We will also need some tests before this can be merged. Probably makes sense for makeExampleServer() in this file:

https://github.com/graphile/crystal/blob/36c41e80bfe312f584af42545688fb78d3adaf3f/grafast/grafserv/__tests__/graphql-http.test.ts

to accept an argument choosing the server framework to use - then we can test it on each different adaptor easily using the same test suite.

grafast/grafserv/__tests__/exampleServer.ts Outdated Show resolved Hide resolved
@@ -36,8 +36,7 @@ export async function makeExampleServer(
});

const serv = grafserv({ schema, preset });
const server = createServer();
serv.addTo(server);
const server = createServer(serv.createHandler());
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please don't make this change, it does not handle websockets and other concerns. It means that serv is not passed an instance of server and thus cannot add any event listeners.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm not sure this would work, wouldn't that make the WHATWG adapter reliant on node types?
I also see that the lambda adapter does not have an addTo implementation.

For now I changed the makeExampleServer function to receive a type parameter to revert the node behavior to addTo while keeping the different behavior for whatwg. Let me know if that works.

Copy link
Member

@benjie benjie Jan 5, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I also see that the lambda adapter does not have an addTo implementation.

I think Lambda does not support addTo since there is no server to add it to - the handler is used directly by lambda. That's not the case for this though?

wouldn't that make the WHATWG adapter reliant on node types?

Are there alternatives to createServer() you'd use here? Perhaps you can expand the examples to show why this would be a concern?

grafast/grafserv/package.json Show resolved Hide resolved
grafast/grafserv/src/servers/whtatwg-node-server/index.ts Outdated Show resolved Hide resolved
grafast/grafserv/src/servers/whtatwg-node-server/index.ts Outdated Show resolved Hide resolved
Comment on lines 38 to 42
const text = await request.text()
return {
type: "text",
text,
};
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Are we certain the body will always be text?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Tried changing this based on the other adapters, let me know if this looks better.

grafast/grafserv/src/servers/whtatwg-node-server/index.ts Outdated Show resolved Hide resolved
requestContext: {
whatwg: {request}
},
preferJSON: true,
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Disappointing, this opts out of some performance enhancements.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm honestly not sure about this. How can I tell if this can be set to false?

grafast/grafserv/src/servers/whtatwg-node-server/index.ts Outdated Show resolved Hide resolved
),
);
})
}
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please also implement an addTo method to follow convention; e.g.:

async addTo(
server: HTTPServer | HTTPSServer,
addExclusiveWebsocketHandler = true,
) {
const handler = this._createHandler();
server.on("request", handler);
this.onRelease(() => {
server.off("request", handler);
});

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

See this comment #2288 (comment)

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is there a common interface that all the servers support that would allow for this? I'd rather consistency if possible, but if we have to do it a different way for this one adaptor that's fine. Another option would be to have addTo only support Node-like servers, and other servers would need to use a lower level API.

Copy link
Member

@benjie benjie left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please use prettier to format the code.

Comment on lines +51 to +52
whatwg: {
version:string
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Sorry; I meant that the version should be part of the scope key like with the other servers; then when a new version is supported we can add support for that without breaking existing users. See the Koa, Express, Fastify, Lambda and H3 adaptors for example.

Suggested change
whatwg: {
version:string
whatwgv0_9: {

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This should also be factored into the file name; e.g. src/servers/whatwg-node-server/v0_9/... - see the same list of other adaptors for examples.

Comment on lines +80 to +81
whatwg: {
version:'whatwgv1',
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
whatwg: {
version:'whatwgv1',
whatwgv0_9: {

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

Successfully merging this pull request may close these issues.

2 participants