Skip to content

Using crossws sse with expressjs frameworks (Nestjs) #150

@SOG-web

Description

@SOG-web

Describe the change

Is there a standard/recommended way to convert the express req object to web standard that works with crossws sse.

This is my current implementation

// utils/web-standard.ts
import { Request as ExpressRequest, Response as ExpressResponse } from 'express';
import { Readable } from 'stream';

export function toWebRequest(req: ExpressRequest): Request {
  const url = `${req.protocol}://${req.get('host')}${req.originalUrl}`;
  const body = ['GET', 'HEAD'].includes(req.method) ? undefined : Readable.toWeb(req).body;

  return new Request(url, {
    method: req.method,
    headers: req.headers as HeadersInit,
    body,
  });
}

export async function sendWebResponseToExpress(res: ExpressResponse, webRes: Response) {
  res.status(webRes.status);
  webRes.headers.forEach((value, key) => {
    res.setHeader(key, value);
  });

  if (webRes.body) {
    const reader = webRes.body.getReader();
    const stream = new ReadableStream({
      async start(controller) {
        while (true) {
          const { done, value } = await reader.read();
          if (done) break;
          controller.enqueue(value);
        }
        controller.close();
      }
    });

    const readable = Readable.fromWeb(stream);
    readable.pipe(res);
  } else {
    res.end();
  }
}

Thanks

URLs

No response

Additional information

  • Would you be willing to help?

URLs

No response

Additional information

  • Would you be willing to help?

Metadata

Metadata

Assignees

No one assigned

    Labels

    documentationImprovements or additions to documentation

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions