diff --git a/src/utils/limit-options.ts b/src/utils/limit-options.ts new file mode 100644 index 0000000..c9ddf55 --- /dev/null +++ b/src/utils/limit-options.ts @@ -0,0 +1,17 @@ +import rateLimit from "express-rate-limit"; +import slowDown from "express-slow-down"; + +const limiter = rateLimit({ + windowMs: 15 * 60 * 1000, + max: 50, + message: "Too nasty, please slow down" +}); + +const slow = slowDown({ + delayAfter: 50, + windowMs: 15 * 60 * 1000, + delayMs: 1000, + maxDelayMs: 20000, +}); + +export { limiter, slow }; \ No newline at end of file diff --git a/src/utils/logger.ts b/src/utils/logger.ts new file mode 100644 index 0000000..99cef2d --- /dev/null +++ b/src/utils/logger.ts @@ -0,0 +1,8 @@ +import pino from "pino"; + +export const logger = pino({ + level: "info", + transport: { + target: "pino-pretty" + }, +}); \ No newline at end of file diff --git a/src/utils/modifier.ts b/src/utils/modifier.ts new file mode 100644 index 0000000..70fad88 --- /dev/null +++ b/src/utils/modifier.ts @@ -0,0 +1,39 @@ +/** + * Auto space on url + * @param str the string to be spaced + * @returns string + */ +export function spacer(str: string) { + return str.replace(/\s/g, "+"); +} + +/** + * Error handler + * @param success when success is false, it will return error + * @param message error message + * @returns object + */ +export function maybeError(success: boolean, message: string) { + return { success, message }; +} + +export function timeAgo(input: Date) { + const date = new Date(input); + const formatter: any = new Intl.RelativeTimeFormat("en"); + const ranges: { [key: string]: number } = { + years: 3600 * 24 * 365, + months: 3600 * 24 * 30, + weeks: 3600 * 24 * 7, + days: 3600 * 24, + hours: 3600, + minutes: 60, + seconds: 1 + }; + const secondsElapsed = (date.getTime() - Date.now()) / 1000; + for (const key in ranges) { + if (ranges[key] < Math.abs(secondsElapsed)) { + const delta = secondsElapsed / ranges[key]; + return formatter.format(Math.round(delta), key); + } + } +} \ No newline at end of file