elysiajs / elysia

Ergonomic Framework for Humans
https://elysiajs.com
MIT License
9.74k stars 207 forks source link

Add ability to use Connect middleware #497

Closed eagerestwolf closed 1 week ago

eagerestwolf commented 6 months ago

What is the problem this feature would solve?

There's already a ton of great middleware out there designed for Connect frameworks (Express, Koa, Hapi, etc.) that would be nice to use with Elysia. A prime example that comes to mind is Passport.js. While many plugins can be replaced, or substituted (Helmet comes to mind), some are just so deeply intertwined with Connect that it would be impossible to port them over.

What is the feature you are proposing to solve the problem?

Obviously adding a full blown Connect interface into the Elysia core simply doesn't make sense. One of the things that makes Bun and Elysia so great compared to the status quo is that much of the overhead has been reduced. However, I do think that an official plugin to translate Connect middleware into something Elysia can understand (much like Fastify has already done) would be amazing.

What alternatives have you considered?

I have looked into the possibility of porting Passport over to Elysia, but that isn't feasible. Getting Passport itself working likely wouldn't be an issue, but many strategies wouldn't work on my modified version. I am also aware of the Lucia integration, but Lucia is just a bit too limited for what I am after (it's missing 2FA and WebAuthn support, which Passport has). Furthermore, I could look into creating my own Connect translation layer (and I may still yet do that), but I don't really have a ton of time to dedicate to the project; and I lack a lot of knowledge about the internal workings of Elysia (granted that could be solved by diving head-first into the source code shudders).

SelfhostedPro commented 6 months ago

I would like to second this! There is an existing repo for this but it no longer works and I haven't been able to figure out what changes need to be made: https://github.com/timnghg/elysia-connect/issues/1

kravetsone commented 6 months ago

(it's missing 2FA and WebAuthn support, which Passport has)

Maybe you can talk about this topic with the author of Lucia? Passport.JS is already outdated in my opinion...

But it would be great to do something like fastify-express. It would be a great marketing move!

SelfhostedPro commented 6 months ago

It would also greatly expand the current ecosystem since you could then utilize most express middleware.

kravetsone commented 6 months ago

It would also greatly expand the current ecosystem since you could then utilize most express middleware.

But I still think it's more of an evil thing...

eagerestwolf commented 6 months ago

So, a proposal for the Elysia team if they are interested. I can look into creating the plugin, but then donate it to the Elysia project if there is interest, and I may well be able to find the time to maintain it as well.

As for a potential plugin, I kind of fancy a slightly different approach to what the previous connect implementation did. Perhaps something like this:

import { Elysia } from "elysia";
import { connect } from "whatever-package-name-I-decide";

// Example Express middlewares, I don't advocate using these in particular with Elysia
// these are just examples that everyone knows how to use
import { json } from "body-parser";
import helmet from "helmet";

new Elysia()
  .use(connect({
    middleware: [json(), helmet()]
  }))
  .get("/", ({ connect }) => {
    let res: Response;

    // If a middleware created a response (for example, Helmet), it's available as connect.res
    if (connect.res) {
      res = connect.res;
    } else {
      res = new Response();
    }

    // If a middleware modifies the request (for example, body-parser), it's available as connect.req
    if (req.body) {
      res.headers = {
        "Content-Type": "application/json"
      };

      res.body = JSON.stringify({ request: connect.req.body }); 
      res.status = 200;

      return res;
    } else {
      res.body = "Error";
      res.status = 400;

      return res;
    }
  })
  .listen(3000);

As I'm sure many of you will see, this is a very inconvenient way to use connect middleware, and that is intentional. While I would like to see connect support in Elysia, I think it should be a last resort. Ideally, you should always attempt to find a solution that fits within the confines of your framework. However, even I can admit that isn't always possible; so being able to tap the huge (and well maintained) ecosystem of Express middleware is a blessing.

SelfhostedPro commented 6 months ago

I mean, if you're going through the effort of building it, I wouldn't intentionally make it hard to use. Just state that there's minimal/no support if avoiding support getting overloaded is a worry.

kravetsone commented 1 month ago

What is the problem this feature would solve?

There's already a ton of great middleware out there designed for Connect frameworks (Express, Koa, Hapi, etc.) that would be nice to use with Elysia. A prime example that comes to mind is Passport.js. While many plugins can be replaced, or substituted (Helmet comes to mind), some are just so deeply intertwined with Connect that it would be impossible to port them over.

What is the feature you are proposing to solve the problem?

Obviously adding a full blown Connect interface into the Elysia core simply doesn't make sense. One of the things that makes Bun and Elysia so great compared to the status quo is that much of the overhead has been reduced. However, I do think that an official plugin to translate Connect middleware into something Elysia can understand (much like Fastify has already done) would be amazing.

What alternatives have you considered?

I have looked into the possibility of porting Passport over to Elysia, but that isn't feasible. Getting Passport itself working likely wouldn't be an issue, but many strategies wouldn't work on my modified version. I am also aware of the Lucia integration, but Lucia is just a bit too limited for what I am after (it's missing 2FA and WebAuthn support, which Passport has). Furthermore, I could look into creating my own Connect translation layer (and I may still yet do that), but I don't really have a ton of time to dedicate to the project; and I lack a lot of knowledge about the internal workings of Elysia (granted that could be solved by diving head-first into the source code shudders).

I create plugin for it

elysia-connect-middleware

Can you open an issue if something need to test&support?

kravetsone commented 1 month ago

But for now it really WIP

kravetsone commented 1 month ago

image

PassportJS works too!

kravetsone commented 1 month ago

I guess we can close it

if something not working properly you can open an issue in elysia-connect-middleware repo

SaltyAom commented 1 week ago

Closing as not planned and not going to implement on Elysia core. I'd recommended using a third party library instead as mentioned by kravetsone. Thanks.