@@ -27,3 +27,3 @@ import { t as FastURL } from "../_chunks/_url.mjs"; | ||
| this.fetch = fetchHandler; | ||
| loader(fetchHandler); | ||
| loader({ server: this }); | ||
| return; | ||
@@ -30,0 +30,0 @@ } |
@@ -29,3 +29,3 @@ import { t as FastURL } from "../_chunks/_url.mjs"; | ||
| this.fetch = fetchHandler; | ||
| loader(fetchHandler); | ||
| loader({ server: this }); | ||
| return; | ||
@@ -32,0 +32,0 @@ } |
+13
-12
@@ -675,10 +675,2 @@ import { n as lazyInherit, t as FastURL } from "../_chunks/_url.mjs"; | ||
| const fetchHandler = this.fetch = wrapFetch(this); | ||
| const loader = globalThis.__srvxLoader__; | ||
| if (loader) { | ||
| loader(fetchHandler); | ||
| return; | ||
| } | ||
| gracefulShutdownPlugin(this); | ||
| this.#wait = createWaitUntil(); | ||
| this.waitUntil = this.#wait.waitUntil; | ||
| const handler = (nodeReq, nodeRes) => { | ||
@@ -693,2 +685,14 @@ const request = new NodeRequest({ | ||
| }; | ||
| this.node = { | ||
| handler, | ||
| server: void 0 | ||
| }; | ||
| const loader = globalThis.__srvxLoader__; | ||
| if (loader) { | ||
| loader({ server: this }); | ||
| return; | ||
| } | ||
| gracefulShutdownPlugin(this); | ||
| this.#wait = createWaitUntil(); | ||
| this.waitUntil = this.#wait.waitUntil; | ||
| const tls = resolveTLSOptions(this.options); | ||
@@ -716,6 +720,3 @@ const { port, hostname: host } = resolvePortAndHost(this.options); | ||
| else server = nodeHTTP.createServer(this.serveOptions, handler); | ||
| this.node = { | ||
| server, | ||
| handler | ||
| }; | ||
| this.node.server = server; | ||
| if (!options.manual) this.serve(); | ||
@@ -722,0 +723,0 @@ } |
+0
-4
| import { LoadOptions } from "./loader.mjs"; | ||
| import { Server } from "srvx"; | ||
| //#region src/cli/types.d.ts | ||
| declare global { | ||
| var __srvx__: Server | undefined; | ||
| } | ||
| type MainOptions = CLIOptions & { | ||
@@ -9,0 +5,0 @@ args?: string[]; |
+9
-4
@@ -13,5 +13,9 @@ import { a as green, c as url, i as gray, l as yellow, n as bold, o as magenta, r as cyan, s as red } from "./_chunks/_utils.mjs"; | ||
| if (!process.env.NODE_ENV) process.env.NODE_ENV = cliOpts.prod ? "production" : "development"; | ||
| let server; | ||
| const loaded = await loadServerEntry({ | ||
| entry: cliOpts.entry, | ||
| dir: cliOpts.dir | ||
| dir: cliOpts.dir, | ||
| get srvxServer() { | ||
| return server; | ||
| } | ||
| }); | ||
@@ -33,3 +37,3 @@ const { serve: srvxServe } = loaded.nodeCompat ? await import("srvx/node") : await import("srvx"); | ||
| printInfo(cliOpts, loaded); | ||
| await (globalThis.__srvx__ = srvxServe({ | ||
| server = srvxServe({ | ||
| ...serverOptions, | ||
@@ -53,3 +57,4 @@ gracefulShutdown: !!cliOpts.prod, | ||
| ].filter(Boolean) | ||
| })).ready(); | ||
| }); | ||
| await server.ready(); | ||
| } catch (error) { | ||
@@ -180,3 +185,3 @@ console.error(error); | ||
| name: "srvx", | ||
| version: "0.11.6", | ||
| version: "0.11.7", | ||
| description: "Universal Server." | ||
@@ -183,0 +188,0 @@ }; |
+14
-1
@@ -1,2 +0,2 @@ | ||
| import { ServerHandler } from "srvx"; | ||
| import { Server, ServerHandler } from "srvx"; | ||
@@ -33,2 +33,10 @@ //#region src/loader.d.ts | ||
| /** | ||
| * Node.js server instance to return when intercepting `http.Server.listen`. | ||
| */ | ||
| nodeServer?: NodeServer; | ||
| /** | ||
| * srvx server instance to return when intercepting `http.Server.listen`. | ||
| */ | ||
| srvxServer?: Server; | ||
| /** | ||
| * Hook called after the module is loaded to allow for custom processing. | ||
@@ -72,5 +80,10 @@ * | ||
| notFound?: boolean; | ||
| /** | ||
| * The original srvx server instance if the module used the loader API to export a server directly. | ||
| */ | ||
| srvxServer?: Server; | ||
| }; | ||
| declare function loadServerEntry(opts: LoadOptions): Promise<LoadedServerEntry>; | ||
| type NodeServer = NonNullable<Server["node"]>["server"]; | ||
| //#endregion | ||
| export { LoadOptions, LoadedServerEntry, defaultEntries, defaultExts, loadServerEntry }; |
+41
-19
@@ -5,2 +5,3 @@ import { pathToFileURL } from "node:url"; | ||
| import * as nodeHTTP$1 from "node:http"; | ||
| import { EventEmitter } from "node:events"; | ||
| const defaultExts = [ | ||
@@ -39,9 +40,9 @@ ".mjs", | ||
| let interceptedNodeHandler; | ||
| let interceptedFetchHandler; | ||
| let interceptedServer; | ||
| try { | ||
| if (opts.interceptHttpListen !== false) { | ||
| const loaded = await interceptListen(() => import(url)); | ||
| const loaded = await interceptListen(() => import(url), opts); | ||
| mod = loaded.res; | ||
| interceptedNodeHandler = loaded.listenHandler; | ||
| interceptedFetchHandler = loaded.fetchHandler; | ||
| interceptedServer = loaded.server; | ||
| } else mod = await import(url); | ||
@@ -57,3 +58,3 @@ } catch (error) { | ||
| mod = await opts?.onLoad?.(mod) || mod; | ||
| let fetchHandler = mod?.fetch || mod?.default?.fetch || mod?.default?.default?.fetch || interceptedFetchHandler; | ||
| let fetchHandler = mod?.fetch || mod?.default?.fetch || mod?.default?.default?.fetch || interceptedServer?.fetch; | ||
| if (!fetchHandler && typeof mod?.default === "function" && mod.default.length < 2) fetchHandler = mod.default; | ||
@@ -73,7 +74,8 @@ let nodeCompat = false; | ||
| url, | ||
| fetch: fetchHandler | ||
| fetch: fetchHandler, | ||
| srvxServer: interceptedServer | ||
| }; | ||
| } | ||
| let _interceptQueue = Promise.resolve(); | ||
| async function interceptListen(cb) { | ||
| async function interceptListen(cb, opts = {}) { | ||
| const result = _interceptQueue.then(async () => { | ||
@@ -83,5 +85,7 @@ const originalListen = nodeHTTP$1.Server.prototype.listen; | ||
| let listenHandler; | ||
| let fetchHandler; | ||
| globalThis.__srvxLoader__ = (handler) => { | ||
| fetchHandler = handler; | ||
| let server; | ||
| const nodeServerStub = opts.nodeServer || opts.srvxServer?.node?.server || new StubNodeServer(() => opts.srvxServer?.node?.server); | ||
| globalThis.__srvxLoader__ = (obj) => { | ||
| server = obj.server; | ||
| if (server && server.node) server.node.server ||= nodeServerStub; | ||
| }; | ||
@@ -97,11 +101,3 @@ try { | ||
| }); | ||
| return new Proxy({}, { get(_, prop) { | ||
| const server = globalThis.__srvx__; | ||
| if (!server && prop === "address") return () => ({ | ||
| address: "", | ||
| family: "", | ||
| port: 0 | ||
| }); | ||
| return server?.node?.server?.[prop]; | ||
| } }); | ||
| return nodeServerStub; | ||
| }; | ||
@@ -116,3 +112,3 @@ res = await cb(); | ||
| listenHandler, | ||
| fetchHandler | ||
| server | ||
| }; | ||
@@ -123,2 +119,28 @@ }); | ||
| } | ||
| var StubNodeServer = class extends EventEmitter { | ||
| constructor(getServer) { | ||
| super(); | ||
| return new Proxy(this, { get(target, prop, receiver) { | ||
| const server = getServer(); | ||
| if (!server) return Reflect.get(target, prop, receiver); | ||
| const value = server[prop]; | ||
| if (typeof value === "function") return value.bind(server); | ||
| return value; | ||
| } }); | ||
| } | ||
| address() { | ||
| return { | ||
| address: "", | ||
| family: "", | ||
| port: 0 | ||
| }; | ||
| } | ||
| listen() { | ||
| return this; | ||
| } | ||
| close(callback) { | ||
| callback?.(); | ||
| return this; | ||
| } | ||
| }; | ||
| export { defaultEntries, defaultExts, loadServerEntry }; |
+1
-1
| { | ||
| "name": "srvx", | ||
| "version": "0.11.6", | ||
| "version": "0.11.7", | ||
| "description": "Universal Server.", | ||
@@ -5,0 +5,0 @@ "homepage": "https://srvx.h3.dev", |
Network access
Supply chain riskThis module accesses the network.
Found 1 instance in 1 package
Environment variable access
Supply chain riskPackage accesses environment variables, which may be a sign of credential stuffing or data theft.
Found 4 instances in 1 package
Long strings
Supply chain riskContains long string literals, which may be a sign of obfuscated or packed code.
Found 1 instance in 1 package
Network access
Supply chain riskThis module accesses the network.
Found 1 instance in 1 package
Environment variable access
Supply chain riskPackage accesses environment variables, which may be a sign of credential stuffing or data theft.
Found 4 instances in 1 package
Long strings
Supply chain riskContains long string literals, which may be a sign of obfuscated or packed code.
Found 1 instance in 1 package
110293
0.91%2398
1.18%84
1.2%