403Webshell
Server IP : 159.203.156.69  /  Your IP : 216.73.217.172
Web Server : nginx/1.24.0
System : Linux main-ubuntu 6.8.0-71-generic #71-Ubuntu SMP PREEMPT_DYNAMIC Tue Jul 22 16:52:38 UTC 2025 x86_64
User : root ( 0)
PHP Version : 8.3.6
Disable Function : NONE
MySQL : OFF  |  cURL : ON  |  WGET : ON  |  Perl : ON  |  Python : OFF  |  Sudo : ON  |  Pkexec : OFF
Directory :  /var/www/tanviranik.com/node_modules/vinext/dist/server/

Upload File :
current_dir [ Writeable ] document_root [ Writeable ]

 

Command :


[ Back ]     

Current File : /var/www/tanviranik.com/node_modules/vinext/dist/server/static-file-cache.js.map
{"version":3,"file":"static-file-cache.js","names":[],"sources":["../../src/server/static-file-cache.ts"],"sourcesContent":["/**\n * Startup metadata cache for static file serving.\n *\n * Walks dist/client/ once at server boot, pre-computes response headers for\n * every file variant (original, brotli, gzip, zstd), and caches everything\n * in memory. The per-request hot path is just: Map.get() → string compare\n * (ETag) → writeHead(precomputed) → pipe.\n *\n * Modeled after sirv's production mode. Key insight from sirv: pre-compute\n * ALL response headers at startup — Content-Type, Content-Length, ETag,\n * Cache-Control, Content-Encoding, Vary — as reusable objects. The common\n * per-request path (no extraHeaders) does zero object allocation for headers.\n */\nimport fsp from \"node:fs/promises\";\nimport path from \"node:path\";\n\n/** Content-type lookup for static assets. Shared with prod-server.ts. */\nexport const CONTENT_TYPES: Record<string, string> = {\n  \".js\": \"application/javascript\",\n  \".mjs\": \"application/javascript\",\n  \".css\": \"text/css\",\n  \".html\": \"text/html\",\n  \".json\": \"application/json\",\n  \".png\": \"image/png\",\n  \".jpg\": \"image/jpeg\",\n  \".jpeg\": \"image/jpeg\",\n  \".gif\": \"image/gif\",\n  \".svg\": \"image/svg+xml\",\n  \".ico\": \"image/x-icon\",\n  \".woff\": \"font/woff\",\n  \".woff2\": \"font/woff2\",\n  \".ttf\": \"font/ttf\",\n  \".eot\": \"application/vnd.ms-fontobject\",\n  \".webp\": \"image/webp\",\n  \".avif\": \"image/avif\",\n  \".map\": \"application/json\",\n  \".rsc\": \"text/x-component\",\n};\n\n/**\n * Files below this size are buffered in memory at startup for zero-syscall\n * serving via res.end(buffer). Above this, files stream via createReadStream.\n * 64KB covers virtually all precompressed assets (a 200KB JS bundle compresses\n * to ~50KB with brotli q5).\n */\nconst BUFFER_THRESHOLD = 64 * 1024;\n\n/** A servable file variant with pre-computed response headers. */\ntype FileVariant = {\n  /** Absolute file path (used for streaming large files). */\n  path: string;\n  /** Uncompressed or encoded byte size for buffer-threshold decisions. */\n  size: number;\n  /** Pre-computed response headers. */\n  headers: Record<string, string>;\n  /** In-memory buffer for small files (below BUFFER_THRESHOLD). */\n  buffer?: Buffer;\n};\n\ntype StaticFileEntry = {\n  /** Weak ETag for conditional request matching. */\n  etag: string;\n  /** Pre-computed headers for 304 Not Modified response. */\n  notModifiedHeaders: Record<string, string>;\n  /** Original file variant (uncompressed). */\n  original: FileVariant;\n  /** Brotli precompressed variant, if .br file exists. */\n  br?: FileVariant;\n  /** Gzip precompressed variant, if .gz file exists. */\n  gz?: FileVariant;\n  /** Zstandard precompressed variant, if .zst file exists. */\n  zst?: FileVariant;\n};\n\n/**\n * In-memory cache of static file metadata, populated once at server startup.\n *\n * Usage:\n *   const cache = await StaticFileCache.create(clientDir);\n *   const entry = cache.lookup(\"/assets/app-abc123.js\");\n *   // entry.br?.headers, entry.original.headers, etc.\n */\nexport class StaticFileCache {\n  private readonly entries: Map<string, StaticFileEntry>;\n\n  private constructor(entries: Map<string, StaticFileEntry>) {\n    this.entries = entries;\n  }\n\n  /**\n   * Scan the client directory and build the cache.\n   *\n   * Gracefully handles non-existent directories (returns an empty cache).\n   */\n  static async create(clientDir: string): Promise<StaticFileCache> {\n    const entries = new Map<string, StaticFileEntry>();\n\n    // First pass: collect all regular files with their metadata\n    const allFiles = new Map<string, { fullPath: string; size: number; mtimeMs: number }>();\n\n    for await (const { relativePath, fullPath, stat } of walkFilesWithStats(clientDir)) {\n      allFiles.set(relativePath, { fullPath, size: stat.size, mtimeMs: stat.mtimeMs });\n    }\n\n    // Second pass: build cache entries with pre-computed headers per variant\n    for (const [relativePath, fileInfo] of allFiles) {\n      // Skip precompressed variants — they're linked to their originals\n      if (\n        relativePath.endsWith(\".br\") ||\n        relativePath.endsWith(\".gz\") ||\n        relativePath.endsWith(\".zst\")\n      )\n        continue;\n\n      // Skip .vite/ internal directory\n      if (relativePath.startsWith(\".vite/\") || relativePath === \".vite\") continue;\n\n      const ext = path.extname(relativePath);\n      const contentType = CONTENT_TYPES[ext] ?? \"application/octet-stream\";\n      const isHashed = relativePath.startsWith(\"assets/\");\n      const cacheControl = isHashed\n        ? \"public, max-age=31536000, immutable\"\n        : \"public, max-age=3600\";\n      const etag =\n        (isHashed && etagFromFilenameHash(relativePath, ext)) ||\n        `W/\"${fileInfo.size}-${Math.floor(fileInfo.mtimeMs / 1000)}\"`;\n\n      // Base headers shared by all variants (Content-Type, Cache-Control, ETag)\n      const baseHeaders = {\n        \"Content-Type\": contentType,\n        \"Cache-Control\": cacheControl,\n        ETag: etag,\n      };\n\n      // Pre-compute original variant headers\n      const original: FileVariant = {\n        path: fileInfo.fullPath,\n        size: fileInfo.size,\n        headers: { ...baseHeaders, \"Content-Length\": String(fileInfo.size) },\n      };\n\n      const entry: StaticFileEntry = {\n        etag,\n        notModifiedHeaders: { ETag: etag, \"Cache-Control\": cacheControl },\n        original,\n      };\n\n      // Pre-compute compressed variant headers (with Content-Encoding, Vary, correct Content-Length)\n      const brInfo = allFiles.get(relativePath + \".br\");\n      if (brInfo) {\n        entry.br = buildVariant(brInfo, baseHeaders, \"br\");\n      }\n\n      const gzInfo = allFiles.get(relativePath + \".gz\");\n      if (gzInfo) {\n        entry.gz = buildVariant(gzInfo, baseHeaders, \"gzip\");\n      }\n\n      const zstInfo = allFiles.get(relativePath + \".zst\");\n      if (zstInfo) {\n        entry.zst = buildVariant(zstInfo, baseHeaders, \"zstd\");\n      }\n\n      // When compressed variants exist, the original needs Vary too so\n      // shared caches don't serve uncompressed to compression-capable clients.\n      if (entry.br || entry.gz || entry.zst) {\n        original.headers[\"Vary\"] = \"Accept-Encoding\";\n        entry.notModifiedHeaders[\"Vary\"] = \"Accept-Encoding\";\n      }\n\n      // Register under the URL pathname (leading /)\n      // NOTE: aliases below share the same entry by reference, so all header\n      // mutations (e.g. Vary above) must happen before registration.\n      const pathname = \"/\" + relativePath;\n      entries.set(pathname, entry);\n\n      // Register HTML fallback aliases (same entry object — no duplication)\n      if (ext === \".html\") {\n        if (relativePath.endsWith(\"/index.html\")) {\n          const dirPath = \"/\" + relativePath.slice(0, -\"/index.html\".length);\n          if (dirPath !== \"/\") {\n            entries.set(dirPath, entry);\n          }\n        } else {\n          const withoutExt = \"/\" + relativePath.slice(0, -ext.length);\n          entries.set(withoutExt, entry);\n        }\n      }\n    }\n\n    // Third pass: buffer small files in memory for zero-syscall serving.\n    // For small compressed variants (e.g. a 50KB JS bundle → ~15KB brotli),\n    // res.end(buffer) is ~2x faster than createReadStream().pipe() because\n    // it skips fd open/close and stream plumbing overhead.\n    // Reads are chunked at 64 concurrent to avoid fd exhaustion on large projects.\n    // Deduplicate at the entry level first: HTML aliases share the same\n    // StaticFileEntry by reference, so entries.values() yields duplicates for\n    // paths like /about and /about.html. Deduping entries avoids iterating\n    // their variants multiple times on sites with many HTML pages.\n    const toBuffer: FileVariant[] = [];\n    const seenEntries = new Set<StaticFileEntry>();\n    for (const entry of entries.values()) {\n      if (seenEntries.has(entry)) continue;\n      seenEntries.add(entry);\n      for (const variant of [entry.original, entry.br, entry.gz, entry.zst]) {\n        if (!variant || variant.size > BUFFER_THRESHOLD) continue;\n        toBuffer.push(variant);\n      }\n    }\n    for (let i = 0; i < toBuffer.length; i += 64) {\n      await Promise.all(\n        toBuffer.slice(i, i + 64).map(async (v) => {\n          v.buffer = await fsp.readFile(v.path);\n        }),\n      );\n    }\n\n    return new StaticFileCache(entries);\n  }\n\n  /**\n   * Look up cached metadata for a URL pathname.\n   *\n   * Returns undefined if the file is not in the cache. The root path \"/\"\n   * always returns undefined — index.html is served by SSR/RSC.\n   */\n  lookup(pathname: string): StaticFileEntry | undefined {\n    if (pathname === \"/\") return undefined;\n\n    // Block .vite/ access (including encoded variants that were decoded before lookup)\n    if (pathname.startsWith(\"/.vite/\") || pathname === \"/.vite\") return undefined;\n\n    return this.entries.get(pathname);\n  }\n}\n\n/**\n * Extract a stable weak ETag from a Vite hashed filename (e.g. `app-DqZc3R4n.js`).\n * The hash is a content hash computed by the bundler — deterministic across\n * identical builds regardless of filesystem timestamps.\n *\n * Must be a weak validator (W/) because the same tag is shared across\n * content-encoded variants (original, .br, .gz, .zst) which are byte-different.\n * Returns null if the filename doesn't contain a recognizable hash suffix,\n * so the caller can fall back to mtime-based ETags.\n */\nexport function etagFromFilenameHash(relativePath: string, ext: string): string | null {\n  const basename = path.basename(relativePath, ext);\n  const lastDash = basename.lastIndexOf(\"-\");\n  if (lastDash === -1 || lastDash === basename.length - 1) return null;\n  const suffix = basename.slice(lastDash + 1);\n  // Vite emits 8-char base64url hashes; allow 6-12 for other bundlers.\n  // If Rolldown changes its hash length, update this range.\n  return suffix.length >= 6 && suffix.length <= 12 && /^[A-Za-z0-9_-]+$/.test(suffix)\n    ? `W/\"${suffix}\"`\n    : null;\n}\n\nfunction buildVariant(\n  info: { fullPath: string; size: number },\n  baseHeaders: Record<string, string>,\n  encoding: string,\n): FileVariant {\n  return {\n    path: info.fullPath,\n    size: info.size,\n    headers: {\n      ...baseHeaders,\n      \"Content-Encoding\": encoding,\n      \"Content-Length\": String(info.size),\n      Vary: \"Accept-Encoding\",\n    },\n  };\n}\n\n/** Batch size for concurrent stat() calls during directory walk. */\nconst STAT_BATCH_SIZE = 64;\n\n/**\n * Walk a directory recursively, yielding file paths and stats.\n *\n * Batches stat() calls per directory to avoid sequential syscall overhead\n * for large dist/client/ directories.\n */\nasync function* walkFilesWithStats(\n  dir: string,\n  base: string = dir,\n): AsyncGenerator<{\n  relativePath: string;\n  fullPath: string;\n  stat: { size: number; mtimeMs: number };\n}> {\n  let entries;\n  try {\n    entries = await fsp.readdir(dir, { withFileTypes: true });\n  } catch {\n    return; // directory doesn't exist or unreadable\n  }\n\n  // Recurse into subdirectories first (they yield their own batched stats)\n  const files: string[] = [];\n  for (const entry of entries) {\n    const fullPath = path.join(dir, entry.name);\n    if (entry.isDirectory()) {\n      yield* walkFilesWithStats(fullPath, base);\n    } else if (entry.isFile()) {\n      files.push(fullPath);\n    }\n  }\n\n  // Batch stat() calls for files in this directory\n  for (let i = 0; i < files.length; i += STAT_BATCH_SIZE) {\n    const batch = files.slice(i, i + STAT_BATCH_SIZE);\n    const stats = await Promise.all(batch.map((f) => fsp.stat(f)));\n    for (let j = 0; j < batch.length; j++) {\n      yield {\n        relativePath: path.relative(base, batch[j]),\n        fullPath: batch[j],\n        stat: { size: stats[j].size, mtimeMs: stats[j].mtimeMs },\n      };\n    }\n  }\n}\n"],"mappings":"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"}

Youez - 2016 - github.com/yon3zu
LinuXploit