trasherdk / uWebSockets.js

μWebSockets for Node.js back-ends :metal:
Apache License 2.0
0 stars 0 forks source link

Snippet: File upload example #9

Open trasherdk opened 1 year ago

trasherdk commented 1 year ago
import { App, us_listen_socket_close } from 'uWebSockets.js'
import fs from 'fs'
import dotenv from 'dotenv'
import path, { resolve } from 'path'
import { fileURLToPath } from 'url'

const __filename = fileURLToPath(import.meta.url)
const __dirname = path.dirname(__filename)
const envpath = resolve(__dirname, '.env')

console.log('env:', envpath)
dotenv.config({ path: envpath })
const { JWT_SECRET, UWS_HOST, UWS_PORT } = process.env

let listenSocket

const app = App({
  key_file_name: "misc/key.pem",
  cert_file_name: "misc/cert.pem",
  passphrase: "1234"
})

app
  .post("/audio.mp3", (res, req) => {
    console.log("Posted to " + req.getUrl());
    const fileStream = fs.createWriteStream(
      path.resolve("./examples/audio.mp3")
    );
    res.onData((chunk, isLast) => {
      /* Buffer must be a copy, not reference */
      fileStream.write(Buffer.concat([Buffer.from(chunk)]));

      if (isLast) {
        fileStream.end();
        res.end("File Uploaded");
      }
    });

    res.onAborted(() => {
      /* Request was prematurely aborted, stop reading */
      fileStream.destroy();
      console.log("Eh, okay. Thanks for nothing!");
    });
  })
  .any('/*', (res, req) => {
    // default response + requested url
    res.writeHeader('Set-Cookie', '_token=jwt; SameSite=Strict; HttpOnly')
    res.end(`default response [${req.getUrl()}]`)
  })
  .listen(UWS_HOST, UWS_PORT, token => {
    listenSocket = token
    if (token) console.log(`listening on ${UWS_HOST}:${UWS_PORT}`)
    else console.log(`failed to listen on ${UWS_HOST}:${UWS_PORT}`)
  });

Source: https://github.com/uNetworking/uWebSockets.js/discussions/251

trasherdk commented 1 year ago

This seems relevant, handling different types of data uploaded.

const request = {
  url: req.getUrl(),
  method: req.getMethod(),
  headers: new Map(),
  buffer: null,
  json: null,
  parts: null,
  error: null,
};
req.forEach((key, value) => {
  request.headers.set(key, value);
});
request.buffer = Buffer.from([]);
res.onData((chunk_arraybuffer, is_last) => {
  const chunk_buffer = Buffer.from(chunk_arraybuffer.slice(0));
  request.buffer = Buffer.concat([request.buffer, chunk_buffer]);
  if (is_last === true) {
    if (request.buffer.length > 0) {
      try {
        if (request.headers.get('Content-Type').includes('application/json') === true) {
          request.json = JSON.parse(request.buffer.toString());
        }
        if (request.headers.get('Content-Type').includes('multipart/form-data') === true) {
          request.parts = uws.getParts(request.buffer, request.headers.get('Content-Type'));
        }
      } catch (e) {
        request.error = e;
        console.error(e);
      }
    }

    // do your fetch here, use https://www.npmjs.com/package/node-fetch

    // craft your response here
    res.writeStatus('200');
    res.end();

  }
});
res.onAborted(() => {
  // this handler is required
});

Source: https://github.com/uNetworking/uWebSockets.js/discussions/106#discussioncomment-4031954