@hono/node-server
Advanced tools
| Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); | ||
| let node_stream = require("node:stream"); | ||
| let node_process = require("node:process"); | ||
| //#region src/utils/stream.ts | ||
| const pr54206Applied = () => { | ||
| const [major, minor] = node_process.versions.node.split(".").map((component) => parseInt(component)); | ||
| return major >= 23 || major === 22 && minor >= 7 || major === 20 && minor >= 18; | ||
| }; | ||
| const useReadableToWeb = pr54206Applied(); | ||
| const createStreamBody = (stream, useNativeReadableToWeb = useReadableToWeb) => { | ||
| if (useNativeReadableToWeb) return node_stream.Readable.toWeb(stream); | ||
| let controller; | ||
| let settled = false; | ||
| const cleanup = () => { | ||
| stream.off("data", onData); | ||
| stream.off("error", onError); | ||
| stream.off("end", onTerminate); | ||
| stream.off("close", onTerminate); | ||
| }; | ||
| const settle = (callback) => { | ||
| if (settled) return; | ||
| settled = true; | ||
| cleanup(); | ||
| callback?.(); | ||
| }; | ||
| const onData = (chunk) => { | ||
| if (settled || !controller) return; | ||
| controller.enqueue(chunk); | ||
| if ((controller.desiredSize ?? 0) <= 0) stream.pause(); | ||
| }; | ||
| const onError = (error) => { | ||
| settle(() => { | ||
| controller?.error(error); | ||
| }); | ||
| }; | ||
| const onTerminate = () => { | ||
| settle(() => { | ||
| controller?.close(); | ||
| }); | ||
| }; | ||
| return new ReadableStream({ | ||
| start(streamController) { | ||
| controller = streamController; | ||
| stream.on("data", onData); | ||
| stream.on("error", onError); | ||
| stream.on("end", onTerminate); | ||
| stream.on("close", onTerminate); | ||
| stream.pause(); | ||
| }, | ||
| pull() { | ||
| if (!settled) stream.resume(); | ||
| }, | ||
| cancel() { | ||
| settle(); | ||
| const ignoreError = () => {}; | ||
| stream.on("error", ignoreError); | ||
| stream.once("close", () => stream.off("error", ignoreError)); | ||
| stream.destroy(); | ||
| } | ||
| }); | ||
| }; | ||
| //#endregion | ||
| exports.createStreamBody = createStreamBody; |
| import { ReadStream } from "node:fs"; | ||
| //#region src/utils/stream.d.ts | ||
| declare const createStreamBody: (stream: ReadStream, useNativeReadableToWeb?: boolean) => ReadableStream<Uint8Array>; | ||
| //#endregion | ||
| export { createStreamBody }; |
| import { ReadStream } from "node:fs"; | ||
| //#region src/utils/stream.d.ts | ||
| declare const createStreamBody: (stream: ReadStream, useNativeReadableToWeb?: boolean) => ReadableStream<Uint8Array>; | ||
| //#endregion | ||
| export { createStreamBody }; |
| import { Readable } from "node:stream"; | ||
| import { versions } from "node:process"; | ||
| //#region src/utils/stream.ts | ||
| const pr54206Applied = () => { | ||
| const [major, minor] = versions.node.split(".").map((component) => parseInt(component)); | ||
| return major >= 23 || major === 22 && minor >= 7 || major === 20 && minor >= 18; | ||
| }; | ||
| const useReadableToWeb = pr54206Applied(); | ||
| const createStreamBody = (stream, useNativeReadableToWeb = useReadableToWeb) => { | ||
| if (useNativeReadableToWeb) return Readable.toWeb(stream); | ||
| let controller; | ||
| let settled = false; | ||
| const cleanup = () => { | ||
| stream.off("data", onData); | ||
| stream.off("error", onError); | ||
| stream.off("end", onTerminate); | ||
| stream.off("close", onTerminate); | ||
| }; | ||
| const settle = (callback) => { | ||
| if (settled) return; | ||
| settled = true; | ||
| cleanup(); | ||
| callback?.(); | ||
| }; | ||
| const onData = (chunk) => { | ||
| if (settled || !controller) return; | ||
| controller.enqueue(chunk); | ||
| if ((controller.desiredSize ?? 0) <= 0) stream.pause(); | ||
| }; | ||
| const onError = (error) => { | ||
| settle(() => { | ||
| controller?.error(error); | ||
| }); | ||
| }; | ||
| const onTerminate = () => { | ||
| settle(() => { | ||
| controller?.close(); | ||
| }); | ||
| }; | ||
| return new ReadableStream({ | ||
| start(streamController) { | ||
| controller = streamController; | ||
| stream.on("data", onData); | ||
| stream.on("error", onError); | ||
| stream.on("end", onTerminate); | ||
| stream.on("close", onTerminate); | ||
| stream.pause(); | ||
| }, | ||
| pull() { | ||
| if (!settled) stream.resume(); | ||
| }, | ||
| cancel() { | ||
| settle(); | ||
| const ignoreError = () => {}; | ||
| stream.on("error", ignoreError); | ||
| stream.once("close", () => stream.off("error", ignoreError)); | ||
| stream.destroy(); | ||
| } | ||
| }); | ||
| }; | ||
| //#endregion | ||
| export { createStreamBody }; |
| Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); | ||
| let node_stream = require("node:stream"); | ||
| const require_utils_stream = require('./utils/stream.cjs'); | ||
| let hono_utils_mime = require("hono/utils/mime"); | ||
| let node_fs = require("node:fs"); | ||
| let node_path = require("node:path"); | ||
| let node_process = require("node:process"); | ||
@@ -16,26 +15,2 @@ //#region src/serve-static.ts | ||
| const ENCODINGS_ORDERED_KEYS = Object.keys(ENCODINGS); | ||
| const pr54206Applied = () => { | ||
| const [major, minor] = node_process.versions.node.split(".").map((component) => parseInt(component)); | ||
| return major >= 23 || major === 22 && minor >= 7 || major === 20 && minor >= 18; | ||
| }; | ||
| const useReadableToWeb = pr54206Applied(); | ||
| const createStreamBody = (stream) => { | ||
| if (useReadableToWeb) return node_stream.Readable.toWeb(stream); | ||
| return new ReadableStream({ | ||
| start(controller) { | ||
| stream.on("data", (chunk) => { | ||
| controller.enqueue(chunk); | ||
| }); | ||
| stream.on("error", (err) => { | ||
| controller.error(err); | ||
| }); | ||
| stream.on("end", () => { | ||
| controller.close(); | ||
| }); | ||
| }, | ||
| cancel() { | ||
| stream.destroy(); | ||
| } | ||
| }); | ||
| }; | ||
| const getStats = (path) => { | ||
@@ -107,2 +82,3 @@ let stats; | ||
| const range = c.req.header("range") || ""; | ||
| c.header("Last-Modified", stats.mtime.toUTCString()); | ||
| if (c.req.method == "HEAD" || c.req.method == "OPTIONS") { | ||
@@ -114,6 +90,5 @@ c.header("Content-Length", size.toString()); | ||
| c.header("Content-Length", size.toString()); | ||
| result = c.body(createStreamBody((0, node_fs.createReadStream)(path)), 200); | ||
| result = c.body(require_utils_stream.createStreamBody((0, node_fs.createReadStream)(path)), 200); | ||
| } else { | ||
| c.header("Accept-Ranges", "bytes"); | ||
| c.header("Date", stats.birthtime.toUTCString()); | ||
| const parts = range.replace(/bytes=/, "").split("-", 2); | ||
@@ -130,3 +105,3 @@ const start = parseInt(parts[0], 10) || 0; | ||
| c.header("Content-Range", `bytes ${start}-${end}/${stats.size}`); | ||
| result = c.body(createStreamBody(stream), 206); | ||
| result = c.body(require_utils_stream.createStreamBody(stream), 206); | ||
| } | ||
@@ -133,0 +108,0 @@ await options.onFound?.(path, c); |
@@ -1,6 +0,5 @@ | ||
| import { Readable } from "node:stream"; | ||
| import { createStreamBody } from "./utils/stream.mjs"; | ||
| import { getMimeType } from "hono/utils/mime"; | ||
| import { createReadStream, existsSync, statSync } from "node:fs"; | ||
| import { join } from "node:path"; | ||
| import { versions } from "node:process"; | ||
@@ -15,26 +14,2 @@ //#region src/serve-static.ts | ||
| const ENCODINGS_ORDERED_KEYS = Object.keys(ENCODINGS); | ||
| const pr54206Applied = () => { | ||
| const [major, minor] = versions.node.split(".").map((component) => parseInt(component)); | ||
| return major >= 23 || major === 22 && minor >= 7 || major === 20 && minor >= 18; | ||
| }; | ||
| const useReadableToWeb = pr54206Applied(); | ||
| const createStreamBody = (stream) => { | ||
| if (useReadableToWeb) return Readable.toWeb(stream); | ||
| return new ReadableStream({ | ||
| start(controller) { | ||
| stream.on("data", (chunk) => { | ||
| controller.enqueue(chunk); | ||
| }); | ||
| stream.on("error", (err) => { | ||
| controller.error(err); | ||
| }); | ||
| stream.on("end", () => { | ||
| controller.close(); | ||
| }); | ||
| }, | ||
| cancel() { | ||
| stream.destroy(); | ||
| } | ||
| }); | ||
| }; | ||
| const getStats = (path) => { | ||
@@ -106,2 +81,3 @@ let stats; | ||
| const range = c.req.header("range") || ""; | ||
| c.header("Last-Modified", stats.mtime.toUTCString()); | ||
| if (c.req.method == "HEAD" || c.req.method == "OPTIONS") { | ||
@@ -116,3 +92,2 @@ c.header("Content-Length", size.toString()); | ||
| c.header("Accept-Ranges", "bytes"); | ||
| c.header("Date", stats.birthtime.toUTCString()); | ||
| const parts = range.replace(/bytes=/, "").split("-", 2); | ||
@@ -119,0 +94,0 @@ const start = parseInt(parts[0], 10) || 0; |
+1
-1
| { | ||
| "name": "@hono/node-server", | ||
| "version": "2.0.1", | ||
| "version": "2.0.2", | ||
| "description": "Node.js Adapter for Hono", | ||
@@ -5,0 +5,0 @@ "main": "dist/index.mjs", |
105106
2.53%25
19.05%2450
3.07%