elysia icon indicating copy to clipboard operation
elysia copied to clipboard

Add ability to use Connect middleware

Open eagerestwolf opened this issue 1 year ago • 10 comments

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).

eagerestwolf avatar Feb 23 '24 05:02 eagerestwolf

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

SelfhostedPro avatar Feb 23 '24 17:02 SelfhostedPro

(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!

kravetsone avatar Feb 23 '24 18:02 kravetsone

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

SelfhostedPro avatar Feb 23 '24 19:02 SelfhostedPro

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...

kravetsone avatar Feb 23 '24 19:02 kravetsone

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.

eagerestwolf avatar Feb 24 '24 04:02 eagerestwolf

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.

SelfhostedPro avatar Feb 27 '24 06:02 SelfhostedPro

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 avatar Jul 19 '24 22:07 kravetsone

But for now it really WIP

kravetsone avatar Jul 19 '24 22:07 kravetsone

image

PassportJS works too!

kravetsone avatar Jul 21 '24 09:07 kravetsone

I guess we can close it

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

kravetsone avatar Jul 21 '24 10:07 kravetsone

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.

SaltyAom avatar Aug 30 '24 19:08 SaltyAom