mirror of
https://github.com/Viren070/AIOStreams.git
synced 2025-12-01 23:14:04 +01:00
fix: improve pattern fetching with retry logic and increased timeout
This commit is contained in:
@@ -15,56 +15,72 @@ if (Env.REDIS_URI) {
|
||||
}
|
||||
|
||||
async function fetchPatternsFromUrl(url: string): Promise<string[]> {
|
||||
try {
|
||||
if (remotePatternCache) {
|
||||
await remotePatternCache.waitUntilReady();
|
||||
const cached = await remotePatternCache.get(url);
|
||||
if (cached) {
|
||||
return cached;
|
||||
let patterns: string[] | undefined;
|
||||
for (let i = 0; i < 3; i++) {
|
||||
logger.debug(
|
||||
`Fetching allowed regex patterns from ${url}${i > 0 ? ` (attempt ${i + 1} of 3)` : ''}`
|
||||
);
|
||||
try {
|
||||
if (remotePatternCache) {
|
||||
await remotePatternCache.waitUntilReady();
|
||||
const cached = await remotePatternCache.get(url);
|
||||
if (cached) {
|
||||
patterns = cached;
|
||||
break;
|
||||
}
|
||||
}
|
||||
const response = await makeRequest(url, {
|
||||
method: 'GET',
|
||||
headers: {
|
||||
'Content-Type': 'application/json',
|
||||
},
|
||||
timeout: 5000,
|
||||
});
|
||||
if (!response.ok) {
|
||||
logger.error(
|
||||
`Failed to fetch allowed regex patterns from ${url}: ${response.status} ${response.statusText}`
|
||||
);
|
||||
await new Promise((resolve) => setTimeout(resolve, 1000));
|
||||
continue;
|
||||
}
|
||||
}
|
||||
const response = await makeRequest(url, {
|
||||
method: 'GET',
|
||||
headers: {
|
||||
'Content-Type': 'application/json',
|
||||
},
|
||||
timeout: 1000,
|
||||
});
|
||||
if (!response.ok) {
|
||||
logger.error(
|
||||
`Failed to fetch allowed regex patterns from ${url}: ${response.status} ${response.statusText}`
|
||||
);
|
||||
return [];
|
||||
}
|
||||
|
||||
const schema = z.union([
|
||||
z.array(
|
||||
const schema = z.union([
|
||||
z.array(
|
||||
z.object({
|
||||
name: z.string(),
|
||||
pattern: z.string(),
|
||||
})
|
||||
),
|
||||
z.object({
|
||||
name: z.string(),
|
||||
pattern: z.string(),
|
||||
})
|
||||
),
|
||||
z.object({
|
||||
values: z.array(z.string()),
|
||||
}),
|
||||
]);
|
||||
const data = await response.json();
|
||||
const parsedData = schema.parse(data);
|
||||
const patterns = Array.isArray(parsedData)
|
||||
? parsedData.map((item) => item.pattern)
|
||||
: parsedData.values;
|
||||
if (remotePatternCache) {
|
||||
await remotePatternCache.set(
|
||||
url,
|
||||
patterns,
|
||||
Math.floor(Env.ALLOWED_REGEX_PATTERNS_URLS_REFRESH_INTERVAL / 1000)
|
||||
);
|
||||
values: z.array(z.string()),
|
||||
}),
|
||||
]);
|
||||
const data = await response.json();
|
||||
const parsedData = schema.parse(data);
|
||||
patterns = Array.isArray(parsedData)
|
||||
? parsedData.map((item) => item.pattern)
|
||||
: parsedData.values;
|
||||
if (remotePatternCache) {
|
||||
await remotePatternCache.set(
|
||||
url,
|
||||
patterns,
|
||||
Math.floor(Env.ALLOWED_REGEX_PATTERNS_URLS_REFRESH_INTERVAL / 1000)
|
||||
);
|
||||
}
|
||||
break;
|
||||
} catch (error) {
|
||||
logger.error(`Error fetching or parsing patterns from ${url}:`, error);
|
||||
await new Promise((resolve) => setTimeout(resolve, 1000));
|
||||
continue;
|
||||
}
|
||||
return patterns;
|
||||
} catch (error) {
|
||||
logger.error(`Error fetching or parsing patterns from ${url}:`, error);
|
||||
}
|
||||
if (!patterns) {
|
||||
logger.error(
|
||||
`Exhausted all attempts to fetch patterns from ${url}, will retry on next interval`
|
||||
);
|
||||
return [];
|
||||
}
|
||||
return patterns;
|
||||
}
|
||||
|
||||
export class FeatureControl {
|
||||
|
||||
Reference in New Issue
Block a user