0

Merge branch 'main' into 194-sdk-ci-pipeline-for-publishing-pythonnode-sdk

This commit is contained in:
rafaelsideguide 2024-06-06 15:44:29 -03:00
commit b234b4be5a
2 changed files with 54 additions and 26 deletions

View File

@ -3,9 +3,6 @@ import { withAuth } from "../../lib/withAuth";
import { Resend } from "resend"; import { Resend } from "resend";
import { NotificationType } from "../../types"; import { NotificationType } from "../../types";
const emailTemplates: Record< const emailTemplates: Record<
NotificationType, NotificationType,
{ subject: string; html: string } { subject: string; html: string }
@ -15,12 +12,13 @@ const emailTemplates: Record<
html: "Hey there,<br/><p>You are approaching your credit limit for this billing period. Your usage right now is around 80% of your total credit limit. Consider upgrading your plan to avoid hitting the limit. Check out our <a href='https://firecrawl.dev/pricing'>pricing page</a> for more info.</p><br/>Thanks,<br/>Firecrawl Team<br/>", html: "Hey there,<br/><p>You are approaching your credit limit for this billing period. Your usage right now is around 80% of your total credit limit. Consider upgrading your plan to avoid hitting the limit. Check out our <a href='https://firecrawl.dev/pricing'>pricing page</a> for more info.</p><br/>Thanks,<br/>Firecrawl Team<br/>",
}, },
[NotificationType.LIMIT_REACHED]: { [NotificationType.LIMIT_REACHED]: {
subject: "Credit Limit Reached! Take action now to resume usage - Firecrawl", subject:
"Credit Limit Reached! Take action now to resume usage - Firecrawl",
html: "Hey there,<br/><p>You have reached your credit limit for this billing period. To resume usage, please upgrade your plan. Check out our <a href='https://firecrawl.dev/pricing'>pricing page</a> for more info.</p><br/>Thanks,<br/>Firecrawl Team<br/>", html: "Hey there,<br/><p>You have reached your credit limit for this billing period. To resume usage, please upgrade your plan. Check out our <a href='https://firecrawl.dev/pricing'>pricing page</a> for more info.</p><br/>Thanks,<br/>Firecrawl Team<br/>",
}, },
[NotificationType.RATE_LIMIT_REACHED]: { [NotificationType.RATE_LIMIT_REACHED]: {
subject: "Rate Limit Reached - Firecrawl", subject: "Rate Limit Reached - Firecrawl",
html: "Hey there,<br/><p>You've hit your Firecrawl rate limit! Take a breather and try again in a few moments. If you need higher rate limits, consider upgrading your plan. Check out our <a href='https://firecrawl.dev/pricing'>pricing page</a> for more info.</p><p>If you have any questions, feel free to reach out to us at <a href='mailto:hello@firecrawl.com'>hello@firecrawl.com</a></p><br/>Thanks,<br/>Firecrawl Team<br/><br/>Ps. this email is only sent once every 7 days if you reach the limit.", html: "Hey there,<br/><p>You've hit one of the Firecrawl endpoint's rate limit! Take a breather and try again in a few moments. If you need higher rate limits, consider upgrading your plan. Check out our <a href='https://firecrawl.dev/pricing'>pricing page</a> for more info.</p><p>If you have any questions, feel free to reach out to us at <a href='mailto:hello@firecrawl.com'>hello@firecrawl.com</a></p><br/>Thanks,<br/>Firecrawl Team<br/><br/>Ps. this email is only sent once every 7 days if you reach a rate limit.",
}, },
}; };
@ -42,7 +40,7 @@ async function sendEmailNotification(
email: string, email: string,
notificationType: NotificationType notificationType: NotificationType
) { ) {
const resend = new Resend(process.env.RESEND_API_KEY); const resend = new Resend(process.env.RESEND_API_KEY);
try { try {
const { data, error } = await resend.emails.send({ const { data, error } = await resend.emails.send({
@ -69,6 +67,9 @@ export async function sendNotificationInternal(
startDateString: string, startDateString: string,
endDateString: string endDateString: string
): Promise<{ success: boolean }> { ): Promise<{ success: boolean }> {
if (team_id === "preview") {
return { success: true };
}
const { data, error } = await supabase_service const { data, error } = await supabase_service
.from("user_notifications") .from("user_notifications")
.select("*") .select("*")

View File

@ -4,6 +4,7 @@ import { RateLimiterMode } from "../../src/types";
const RATE_LIMITS = { const RATE_LIMITS = {
crawl: { crawl: {
default: 3,
free: 2, free: 2,
starter: 3, starter: 3,
standard: 5, standard: 5,
@ -14,6 +15,7 @@ const RATE_LIMITS = {
growth: 50, growth: 50,
}, },
scrape: { scrape: {
default: 20,
free: 5, free: 5,
starter: 20, starter: 20,
standard: 50, standard: 50,
@ -24,6 +26,7 @@ const RATE_LIMITS = {
growth: 500, growth: 500,
}, },
search: { search: {
default: 20,
free: 5, free: 5,
starter: 20, starter: 20,
standard: 40, standard: 40,
@ -33,10 +36,18 @@ const RATE_LIMITS = {
standardNew: 50, standardNew: 50,
growth: 500, growth: 500,
}, },
preview: 5, preview: {
account: 20, default: 5,
crawlStatus: 150, },
testSuite: 10000, account: {
default: 20,
},
crawlStatus: {
default: 150,
},
testSuite: {
default: 10000,
},
}; };
export const redisClient = redis.createClient({ export const redisClient = redis.createClient({
@ -44,30 +55,46 @@ export const redisClient = redis.createClient({
legacyMode: true, legacyMode: true,
}); });
const createRateLimiter = (keyPrefix, points) => new RateLimiterRedis({ const createRateLimiter = (keyPrefix, points) =>
storeClient: redisClient, new RateLimiterRedis({
keyPrefix, storeClient: redisClient,
points, keyPrefix,
duration: 60, // Duration in seconds points,
}); duration: 60, // Duration in seconds
});
export const previewRateLimiter = createRateLimiter("preview", RATE_LIMITS.preview); export const previewRateLimiter = createRateLimiter(
export const serverRateLimiter = createRateLimiter("server", RATE_LIMITS.account); "preview",
export const crawlStatusRateLimiter = createRateLimiter("crawl-status", RATE_LIMITS.crawlStatus); RATE_LIMITS.preview
export const testSuiteRateLimiter = createRateLimiter("test-suite", RATE_LIMITS.testSuite); );
export const serverRateLimiter = createRateLimiter(
"server",
RATE_LIMITS.account
);
export const crawlStatusRateLimiter = createRateLimiter(
"crawl-status",
RATE_LIMITS.crawlStatus
);
export const testSuiteRateLimiter = createRateLimiter(
"test-suite",
RATE_LIMITS.testSuite
);
export function getRateLimiter(mode: RateLimiterMode, token: string, plan?: string) { export function getRateLimiter(
mode: RateLimiterMode,
token: string,
plan?: string
) {
if (token.includes("a01ccae") || token.includes("6254cf9")) { if (token.includes("a01ccae") || token.includes("6254cf9")) {
return testSuiteRateLimiter; return testSuiteRateLimiter;
} }
const rateLimitConfig = RATE_LIMITS[mode]; const rateLimitConfig = RATE_LIMITS[mode]; // {default : 5}
if (!rateLimitConfig) return serverRateLimiter; if (!rateLimitConfig) return serverRateLimiter;
const planKey = plan ? plan.replace("-", "") : "starter"; const planKey = plan ? plan.replace("-", "") : "default"; // "default"
const points = rateLimitConfig[planKey] || rateLimitConfig.preview; const points =
rateLimitConfig[planKey] || rateLimitConfig.default || rateLimitConfig; // 5
return createRateLimiter(`${mode}-${planKey}`, points); return createRateLimiter(`${mode}-${planKey}`, points);
} }