-
-
Notifications
You must be signed in to change notification settings - Fork 576
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
base: main
Are you sure you want to change the base?
Conversation
|
There was a problem hiding this 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:
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.
@@ -36,8 +36,7 @@ export async function makeExampleServer( | |||
}); | |||
|
|||
const serv = grafserv({ schema, preset }); | |||
const server = createServer(); | |||
serv.addTo(server); | |||
const server = createServer(serv.createHandler()); |
There was a problem hiding this comment.
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.
There was a problem hiding this comment.
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.
There was a problem hiding this comment.
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?
const text = await request.text() | ||
return { | ||
type: "text", | ||
text, | ||
}; |
There was a problem hiding this comment.
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?
There was a problem hiding this comment.
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.
requestContext: { | ||
whatwg: {request} | ||
}, | ||
preferJSON: true, |
There was a problem hiding this comment.
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.
There was a problem hiding this comment.
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?
), | ||
); | ||
}) | ||
} |
There was a problem hiding this comment.
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.:
crystal/grafast/grafserv/src/servers/node/index.ts
Lines 290 to 298 in 36c41e8
async addTo( | |
server: HTTPServer | HTTPSServer, | |
addExclusiveWebsocketHandler = true, | |
) { | |
const handler = this._createHandler(); | |
server.on("request", handler); | |
this.onRelease(() => { | |
server.off("request", handler); | |
}); |
There was a problem hiding this comment.
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)
There was a problem hiding this comment.
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.
There was a problem hiding this 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.
whatwg: { | ||
version:string |
There was a problem hiding this comment.
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.
whatwg: { | |
version:string | |
whatwgv0_9: { |
There was a problem hiding this comment.
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.
whatwg: { | ||
version:'whatwgv1', |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
whatwg: { | |
version:'whatwgv1', | |
whatwgv0_9: { |
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
yarn lint:fix
passes.yarn test
passes (Well, sort of - I ran the grafserv tests with it and it passed)RELEASE_NOTES.md
file (if one exists).