Home / File/ generic.ts — astro Source File

generic.ts — astro Source File

Architecture documentation for generic.ts, a typescript file in the astro codebase. 7 imports, 0 dependents.

File typescript CoreAstro RenderingEngine 7 imports 2 functions

Entity Profile

Dependency Diagram

graph LR
  f0198079_a2ca_753b_3a72_e0742f6c13ac["generic.ts"]
  135a8084_d596_67c2_9209_cca6693604e6["../types/public/common.js"]
  f0198079_a2ca_753b_3a72_e0742f6c13ac --> 135a8084_d596_67c2_9209_cca6693604e6
  fe123607_0a2d_03dc_5e2c_f2f078ab4d7d["../internal.js"]
  f0198079_a2ca_753b_3a72_e0742f6c13ac --> fe123607_0a2d_03dc_5e2c_f2f078ab4d7d
  53084806_f991_1240_2e28_c545d7506087["../utils/etag.js"]
  f0198079_a2ca_753b_3a72_e0742f6c13ac --> 53084806_f991_1240_2e28_c545d7506087
  f6b816b8_cbf1_258a_b6ec_69418ae629ce["astro:assets"]
  f0198079_a2ca_753b_3a72_e0742f6c13ac --> f6b816b8_cbf1_258a_b6ec_69418ae629ce
  e4df8f29_fb2f_3d70_a962_fdf6a3670b22["path"]
  f0198079_a2ca_753b_3a72_e0742f6c13ac --> e4df8f29_fb2f_3d70_a962_fdf6a3670b22
  21f9daf1_9979_0313_afee_bbb8465c9f69["remote"]
  f0198079_a2ca_753b_3a72_e0742f6c13ac --> 21f9daf1_9979_0313_afee_bbb8465c9f69
  d5d79daf_16b4_bece_5a98_63bc92fc1431["mrmime"]
  f0198079_a2ca_753b_3a72_e0742f6c13ac --> d5d79daf_16b4_bece_5a98_63bc92fc1431
  style f0198079_a2ca_753b_3a72_e0742f6c13ac fill:#6366f1,stroke:#818cf8,color:#fff

Relationship Graph

Source Code

// @ts-expect-error
import { imageConfig } from 'astro:assets';
import { isRemotePath } from '@astrojs/internal-helpers/path';
import { isRemoteAllowed } from '@astrojs/internal-helpers/remote';
import * as mime from 'mrmime';
import type { APIRoute } from '../../types/public/common.js';
import { getConfiguredImageService } from '../internal.js';
import { etag } from '../utils/etag.js';

async function loadRemoteImage(src: URL, headers: Headers) {
	try {
		const res = await fetch(src, {
			// Forward all headers from the original request
			headers,
		});

		if (!res.ok) {
			return undefined;
		}

		return await res.arrayBuffer();
	} catch {
		return undefined;
	}
}

/**
 * Endpoint used in dev and SSR to serve optimized images by the base image services
 */
export const GET: APIRoute = async ({ request }) => {
	try {
		const imageService = await getConfiguredImageService();

		if (!('transform' in imageService)) {
			throw new Error('Configured image service is not a local service');
		}

		const url = new URL(request.url);
		const transform = await imageService.parseURL(url, imageConfig);

		if (!transform?.src) {
			throw new Error('Incorrect transform returned by `parseURL`');
		}

		let inputBuffer: ArrayBuffer | undefined = undefined;

		const isRemoteImage = isRemotePath(transform.src);

		if (isRemoteImage && isRemoteAllowed(transform.src, imageConfig) === false) {
			return new Response('Forbidden', { status: 403 });
		}

		const sourceUrl = new URL(transform.src, url.origin);

		// Have we been tricked into thinking this is local?
		if (!isRemoteImage && sourceUrl.origin !== url.origin) {
			return new Response('Forbidden', { status: 403 });
		}

		inputBuffer = await loadRemoteImage(sourceUrl, isRemoteImage ? new Headers() : request.headers);

		if (!inputBuffer) {
			return new Response('Not Found', { status: 404 });
		}

		const { data, format } = await imageService.transform(
			new Uint8Array(inputBuffer),
			transform,
			imageConfig,
		);

		return new Response(data as Uint8Array<ArrayBuffer>, {
			status: 200,
			headers: {
				'Content-Type': mime.lookup(format) ?? `image/${format}`,
				'Cache-Control': 'public, max-age=31536000',
				ETag: etag(data.toString()),
				Date: new Date().toUTCString(),
			},
		});
	} catch (err: unknown) {
		console.error('Could not process image request:', err);
		return new Response(`Server Error: ${err}`, { status: 500 });
	}
};

Domain

Subdomains

Dependencies

  • ../internal.js
  • ../types/public/common.js
  • ../utils/etag.js
  • astro:assets
  • mrmime
  • path
  • remote

Frequently Asked Questions

What does generic.ts do?
generic.ts is a source file in the astro codebase, written in typescript. It belongs to the CoreAstro domain, RenderingEngine subdomain.
What functions are defined in generic.ts?
generic.ts defines 2 function(s): GET, loadRemoteImage.
What does generic.ts depend on?
generic.ts imports 7 module(s): ../internal.js, ../types/public/common.js, ../utils/etag.js, astro:assets, mrmime, path, remote.
Where is generic.ts in the architecture?
generic.ts is located at packages/astro/src/assets/endpoint/generic.ts (domain: CoreAstro, subdomain: RenderingEngine, directory: packages/astro/src/assets/endpoint).

Analyze Your Own Codebase

Get architecture documentation, dependency graphs, and domain analysis for your codebase in minutes.

Try Supermodel Free