feat(core): Add pluggable auth providers, storage hooks, multi-upstream cache awareness, and PyPI/RubyGems protocol implementations
This commit is contained in:
@@ -110,8 +110,18 @@ export abstract class BaseUpstream {
|
||||
return null;
|
||||
}
|
||||
|
||||
// Get applicable upstreams sorted by priority
|
||||
const applicableUpstreams = this.getApplicableUpstreams(context.resource);
|
||||
|
||||
if (applicableUpstreams.length === 0) {
|
||||
return null;
|
||||
}
|
||||
|
||||
// Use the first applicable upstream's URL for cache key
|
||||
const primaryUpstreamUrl = applicableUpstreams[0]?.url;
|
||||
|
||||
// Check cache first
|
||||
const cached = this.cache.get(context);
|
||||
const cached = await this.cache.get(context, primaryUpstreamUrl);
|
||||
if (cached && !cached.stale) {
|
||||
return {
|
||||
success: true,
|
||||
@@ -125,7 +135,7 @@ export abstract class BaseUpstream {
|
||||
}
|
||||
|
||||
// Check for negative cache (recent 404)
|
||||
if (this.cache.hasNegative(context)) {
|
||||
if (await this.cache.hasNegative(context, primaryUpstreamUrl)) {
|
||||
return {
|
||||
success: false,
|
||||
status: 404,
|
||||
@@ -136,13 +146,6 @@ export abstract class BaseUpstream {
|
||||
};
|
||||
}
|
||||
|
||||
// Get applicable upstreams sorted by priority
|
||||
const applicableUpstreams = this.getApplicableUpstreams(context.resource);
|
||||
|
||||
if (applicableUpstreams.length === 0) {
|
||||
return null;
|
||||
}
|
||||
|
||||
// If we have stale cache, return it immediately and revalidate in background
|
||||
if (cached?.stale && this.cacheConfig.staleWhileRevalidate) {
|
||||
// Fire and forget revalidation
|
||||
@@ -173,18 +176,19 @@ export abstract class BaseUpstream {
|
||||
|
||||
// Cache successful responses
|
||||
if (result.success && result.body) {
|
||||
this.cache.set(
|
||||
await this.cache.set(
|
||||
context,
|
||||
Buffer.isBuffer(result.body) ? result.body : Buffer.from(JSON.stringify(result.body)),
|
||||
result.headers['content-type'] || 'application/octet-stream',
|
||||
result.headers,
|
||||
upstream.id,
|
||||
upstream.url,
|
||||
);
|
||||
}
|
||||
|
||||
// Cache 404 responses
|
||||
if (result.status === 404) {
|
||||
this.cache.setNegative(context, upstream.id);
|
||||
await this.cache.setNegative(context, upstream.id, upstream.url);
|
||||
}
|
||||
|
||||
return result;
|
||||
@@ -210,15 +214,15 @@ export abstract class BaseUpstream {
|
||||
/**
|
||||
* Invalidate cache for a resource pattern.
|
||||
*/
|
||||
public invalidateCache(pattern: RegExp): number {
|
||||
public async invalidateCache(pattern: RegExp): Promise<number> {
|
||||
return this.cache.invalidatePattern(pattern);
|
||||
}
|
||||
|
||||
/**
|
||||
* Clear all cache entries.
|
||||
*/
|
||||
public clearCache(): void {
|
||||
this.cache.clear();
|
||||
public async clearCache(): Promise<void> {
|
||||
await this.cache.clear();
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -501,12 +505,13 @@ export abstract class BaseUpstream {
|
||||
);
|
||||
|
||||
if (result.success && result.body) {
|
||||
this.cache.set(
|
||||
await this.cache.set(
|
||||
context,
|
||||
Buffer.isBuffer(result.body) ? result.body : Buffer.from(JSON.stringify(result.body)),
|
||||
result.headers['content-type'] || 'application/octet-stream',
|
||||
result.headers,
|
||||
upstream.id,
|
||||
upstream.url,
|
||||
);
|
||||
return; // Successfully revalidated
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user