utils.mjs 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. // src/utils.ts
  2. async function readWithoutBlocking(readPromise) {
  3. return Promise.race([readPromise, Promise.resolve().then(() => Promise.resolve(void 0))]);
  4. }
  5. function writeFromReadableStreamDefaultReader(reader, writable, currentReadPromise) {
  6. const cancel = (error) => {
  7. reader.cancel(error).catch(() => {
  8. });
  9. };
  10. writable.on("close", cancel);
  11. writable.on("error", cancel);
  12. (currentReadPromise ?? reader.read()).then(flow, handleStreamError);
  13. return reader.closed.finally(() => {
  14. writable.off("close", cancel);
  15. writable.off("error", cancel);
  16. });
  17. function handleStreamError(error) {
  18. if (error) {
  19. writable.destroy(error);
  20. }
  21. }
  22. function onDrain() {
  23. reader.read().then(flow, handleStreamError);
  24. }
  25. function flow({ done, value }) {
  26. try {
  27. if (done) {
  28. writable.end();
  29. } else if (!writable.write(value)) {
  30. writable.once("drain", onDrain);
  31. } else {
  32. return reader.read().then(flow, handleStreamError);
  33. }
  34. } catch (e) {
  35. handleStreamError(e);
  36. }
  37. }
  38. }
  39. function writeFromReadableStream(stream, writable) {
  40. if (stream.locked) {
  41. throw new TypeError("ReadableStream is locked.");
  42. } else if (writable.destroyed) {
  43. return;
  44. }
  45. return writeFromReadableStreamDefaultReader(stream.getReader(), writable);
  46. }
  47. var buildOutgoingHttpHeaders = (headers) => {
  48. const res = {};
  49. if (!(headers instanceof Headers)) {
  50. headers = new Headers(headers ?? void 0);
  51. }
  52. const cookies = [];
  53. for (const [k, v] of headers) {
  54. if (k === "set-cookie") {
  55. cookies.push(v);
  56. } else {
  57. res[k] = v;
  58. }
  59. }
  60. if (cookies.length > 0) {
  61. res["set-cookie"] = cookies;
  62. }
  63. res["content-type"] ??= "text/plain; charset=UTF-8";
  64. return res;
  65. };
  66. export {
  67. buildOutgoingHttpHeaders,
  68. readWithoutBlocking,
  69. writeFromReadableStream,
  70. writeFromReadableStreamDefaultReader
  71. };