chore(apps.web): add prettier to apps/web

Signed-off-by: hansputera <hanifdwyputrasembiring@gmail.com>
This commit is contained in:
hansputera
2022-03-06 13:51:47 +07:00
parent 6b411a2a3f
commit f476b660dd
14 changed files with 127 additions and 114 deletions

View File

@@ -1,8 +1,6 @@
const eslintConfigs = require('tiktok-dl-config/eslint.typescript');
const eslintConfigs = require("tiktok-dl-config/eslint.typescript");
module.exports = {
...eslintConfigs,
extends: eslintConfigs.extends.concat([
'plugin:@next/next/recommended',
])
...eslintConfigs,
extends: eslintConfigs.extends.concat(["plugin:@next/next/recommended"]),
};

3
apps/web/.prettierignore Normal file
View File

@@ -0,0 +1,3 @@
*.json
.next

View File

@@ -1,16 +1,16 @@
export const rateLimitConfig = {
'enable': true, // you can set it to 'false'
enable: true, // you can set it to 'false'
/**
* How much rate limit count per x second(s)
* -is allowed? Default: 60 requests
*/
'maxRatelimitPerXSeconds': 60,
* How much rate limit count per x second(s)
* -is allowed? Default: 60 requests
*/
maxRatelimitPerXSeconds: 60,
/**
* Every x second(s), the ratelimit data will removed.
* So, their ratelimit data will removed.
* PS: Data stored on redis.
*/
'ratelimitTime': 60,
* Every x second(s), the ratelimit data will removed.
* So, their ratelimit data will removed.
* PS: Data stored on redis.
*/
ratelimitTime: 60,
};
/**

View File

@@ -1,2 +1,2 @@
export * from './redis';
export * from './rotator';
export * from "./redis";
export * from "./rotator";

View File

@@ -1,3 +1,3 @@
import Redis from 'ioredis';
import Redis from "ioredis";
export const client = new Redis(process.env.REDIS_URL);

View File

@@ -1,6 +1,6 @@
import {providerCache} from '../config';
import {BaseProvider, ExtractedInfo, getRandomProvider} from 'tiktok-dl-core';
import {client as redisClient} from './redis';
import { providerCache } from "../config";
import { BaseProvider, ExtractedInfo, getRandomProvider } from "tiktok-dl-core";
import { client as redisClient } from "./redis";
/**
* Rotate provider.
@@ -10,11 +10,12 @@ import {client as redisClient} from './redis';
* @return {Promise<ExtractedInfo>}
*/
export const rotateProvider = async (
provider: BaseProvider, url: string,
skipOnError: boolean = true):
Promise<ExtractedInfo & { provider: string; }> => {
// await redisClient.del(url);
// console.log(provider.resourceName());
provider: BaseProvider,
url: string,
skipOnError: boolean = true
): Promise<ExtractedInfo & { provider: string }> => {
// await redisClient.del(url);
// console.log(provider.resourceName());
if (provider.maintenance) {
return await rotateProvider(getRandomProvider(), url, skipOnError);
}
@@ -28,11 +29,13 @@ export const rotateProvider = async (
} else if (data.video && !data.video.urls.length) {
return await rotateProvider(getRandomProvider(), url);
} else {
redisClient.set(url,
JSON.stringify(
{...data, provider: provider.resourceName()}), 'ex',
providerCache);
return {...data, provider: provider.resourceName()};
redisClient.set(
url,
JSON.stringify({ ...data, provider: provider.resourceName() }),
"ex",
providerCache
);
return { ...data, provider: provider.resourceName() };
}
} catch (e) {
if (skipOnError) {

View File

@@ -1,26 +1,31 @@
import type { NextApiRequest, NextApiResponse } from 'next';
import {rateLimitConfig} from '../config';
import {client} from '../lib';
import type { NextApiRequest, NextApiResponse } from "next";
import { rateLimitConfig } from "../config";
import { client } from "../lib";
export const ratelimitMiddleware = async (req: NextApiRequest, res: NextApiResponse) => {
const ip = req.headers['x-real-ip'] ||
req.headers['x-forwarded-for'];
if (!rateLimitConfig.enable || process.env.NODE_ENV === 'development') return true;
else if (!ip) {
return res.status(401).json({ 'message': 'Couldn\'t find your real ip address.' });
}
client.get('rate-' + ip, (_, result) => {
if (result) {
if (parseInt(result) > rateLimitConfig.maxRatelimitPerXSeconds) {
return res.status(429).json({
'message': 'Please try again, you are getting ratelimit!'
});
};
client.incr('rate-' + ip);
return true;
} else {
client.set('rate-' + ip, '1', 'ex', rateLimitConfig.ratelimitTime);
return true;
export const ratelimitMiddleware = async (
req: NextApiRequest,
res: NextApiResponse
) => {
const ip = req.headers["x-real-ip"] || req.headers["x-forwarded-for"];
if (!rateLimitConfig.enable || process.env.NODE_ENV === "development")
return true;
else if (!ip) {
return res
.status(401)
.json({ message: "Couldn't find your real ip address." });
}
client.get("rate-" + ip, (_, result) => {
if (result) {
if (parseInt(result) > rateLimitConfig.maxRatelimitPerXSeconds) {
return res.status(429).json({
message: "Please try again, you are getting ratelimit!",
});
}
});
client.incr("rate-" + ip);
return true;
} else {
client.set("rate-" + ip, "1", "ex", rateLimitConfig.ratelimitTime);
return true;
}
});
};

View File

@@ -1,18 +1,16 @@
const webpack = require('webpack');
const withTM = require('next-transpile-modules')(['tiktok-dl-core']);
const webpack = require("webpack");
const withTM = require("next-transpile-modules")(["tiktok-dl-core"]);
const { parsed: cusEnv } = require('dotenv').config({
path: require('path').resolve(__dirname, '..', '..', '.env'),
const { parsed: cusEnv } = require("dotenv").config({
path: require("path").resolve(__dirname, "..", "..", ".env"),
});
module.exports = withTM({
reactStrictMode: true,
webpack(config) {
if (typeof cusEnv !== 'undefined') {
config.plugins.push(
new webpack.EnvironmentPlugin(cusEnv)
);
}
return config;
}
reactStrictMode: true,
webpack(config) {
if (typeof cusEnv !== "undefined") {
config.plugins.push(new webpack.EnvironmentPlugin(cusEnv));
}
return config;
},
});

View File

@@ -15,13 +15,15 @@
"scripts": {
"build": "next build",
"dev": "next dev",
"lint": "next lint"
"lint": "next lint",
"format": "prettier . --write"
},
"devDependencies": {
"@next/eslint-plugin-next": "^12.0.10",
"@types/ioredis": "^4.28.7",
"@types/react": "^17.0.39",
"next-transpile-modules": "^9.0.0",
"prettier": "^2.5.1",
"tiktok-dl-config": "*",
"typescript": "latest"
}

View File

@@ -1,49 +1,52 @@
import type {NextApiRequest, NextApiResponse} from 'next';
import ow from 'ow';
import {getProvider, Providers, BaseProvider} from 'tiktok-dl-core';
import {rotateProvider} from '../../lib/rotator';
import {ratelimitMiddleware} from '../../middleware/ratelimit';
import type { NextApiRequest, NextApiResponse } from "next";
import ow from "ow";
import { getProvider, Providers, BaseProvider } from "tiktok-dl-core";
import { rotateProvider } from "../../lib/rotator";
import { ratelimitMiddleware } from "../../middleware/ratelimit";
export default async (req: NextApiRequest, res: NextApiResponse) => {
try {
const continueOrNah = await ratelimitMiddleware(req, res);
if (typeof continueOrNah !== 'boolean') return;
if (typeof continueOrNah !== "boolean") return;
const providersType = Providers.map((p) => p.resourceName());
ow(req.body || req.query, ow.object.partialShape({
'url': ow.string.url.validate((v) => ({
'validator': /^http(s?)(:\/\/)([a-z]+\.)*tiktok\.com\/(.*)$/gi
.test(v),
'message': 'Expected (.*).tiktok.com',
})),
'type': ow.optional.string.validate((v) => ({
'validator': typeof v === 'string' &&
providersType.includes(v.toLowerCase()),
'message': 'Invalid Provider, available provider is: ' +
Providers.map((x) => x.resourceName()).join(', '),
})),
'nocache': req.method === 'POST' ?
ow.optional.boolean : ow.optional.string,
'rotateOnError': req.method === 'POST' ?
ow.optional.boolean : ow.optional.string,
}));
ow(
req.body || req.query,
ow.object.partialShape({
url: ow.string.url.validate((v) => ({
validator: /^http(s?)(:\/\/)([a-z]+\.)*tiktok\.com\/(.*)$/gi.test(v),
message: "Expected (.*).tiktok.com",
})),
type: ow.optional.string.validate((v) => ({
validator:
typeof v === "string" && providersType.includes(v.toLowerCase()),
message:
"Invalid Provider, available provider is: " +
Providers.map((x) => x.resourceName()).join(", "),
})),
nocache:
req.method === "POST" ? ow.optional.boolean : ow.optional.string,
rotateOnError:
req.method === "POST" ? ow.optional.boolean : ow.optional.string,
})
);
const provider = getProvider((req.query.type || req.body.type) ?? 'random');
const provider = getProvider((req.query.type || req.body.type) ?? "random");
if (!provider) {
return res.status(400).json({
'error': 'Invalid provider',
'providers': providersType,
error: "Invalid provider",
providers: providersType,
});
}
const result = await rotateProvider(
provider as BaseProvider, (req.query.url ||
req.body.url), req.method === 'POST' ?
req.body.rotateOnError :
!!req.query.rotateOnError);
provider as BaseProvider,
req.query.url || req.body.url,
req.method === "POST" ? req.body.rotateOnError : !!req.query.rotateOnError
);
return res.status(200).json(result);
} catch (e) {
return res.status(500).json({
'error': (e as Error).message,
error: (e as Error).message,
});
}
};

View File

@@ -1,5 +1,5 @@
import type {NextApiRequest, NextApiResponse} from 'next';
import type { NextApiRequest, NextApiResponse } from "next";
export default async (_: NextApiRequest, res: NextApiResponse) => {
res.send('Y');
res.send("Y");
};

View File

@@ -1,15 +1,15 @@
import type {NextApiRequest, NextApiResponse} from 'next';
import {Providers} from 'tiktok-dl-core';
import {ratelimitMiddleware} from '../../middleware/ratelimit';
import type { NextApiRequest, NextApiResponse } from "next";
import { Providers } from "tiktok-dl-core";
import { ratelimitMiddleware } from "../../middleware/ratelimit";
export default async (req: NextApiRequest, res: NextApiResponse) => {
const continueOrNah = await ratelimitMiddleware(req, res);
if (typeof continueOrNah !== 'boolean') return;
if (typeof continueOrNah !== "boolean") return;
const providers = Providers.map((p) => ({
'name': p.resourceName(),
'url': p.client?.defaults.options.prefixUrl,
'maintenance': p.maintenance,
name: p.resourceName(),
url: p.client?.defaults.options.prefixUrl,
maintenance: p.maintenance,
}));
return res.send(providers);

View File

@@ -1,11 +1,11 @@
import type {NextApiRequest, NextApiResponse} from 'next';
import {client} from '../../lib';
import {ratelimitMiddleware} from '../../middleware/ratelimit';
import {matchLink} from 'tiktok-dl-core';
import type { NextApiRequest, NextApiResponse } from "next";
import { client } from "../../lib";
import { ratelimitMiddleware } from "../../middleware/ratelimit";
import { matchLink } from "tiktok-dl-core";
export default async (req: NextApiRequest, res: NextApiResponse) => {
const continueOrNah = await ratelimitMiddleware(req, res);
if (typeof continueOrNah !== 'boolean') return;
const keys = await client.keys('*');
if (typeof continueOrNah !== "boolean") return;
const keys = await client.keys("*");
res.status(200).json(keys.filter((x) => matchLink(x)));
};

View File

@@ -1861,6 +1861,7 @@ __metadata:
next: ^12.0.10
next-transpile-modules: ^9.0.0
ow: ^0.28.1
prettier: ^2.5.1
react: ^17.0.2
react-dom: ^17.0.2
tiktok-dl-config: "*"