mirror of
https://github.com/FlareSolverr/FlareSolverr.git
synced 2025-12-24 02:11:31 +01:00
Refactor the app to use Express server and Jest for tests
This commit is contained in:
155
src/controllers/v1.ts
Normal file
155
src/controllers/v1.ts
Normal file
@@ -0,0 +1,155 @@
|
||||
// todo: avoid puppeter objects
|
||||
import {SetCookie, Headers, HttpMethod} from 'puppeteer'
|
||||
import {Request, Response} from 'express';
|
||||
|
||||
import log from '../services/log'
|
||||
import {browserRequest, ChallengeResolutionResultT, ChallengeResolutionT} from "../services/solver";
|
||||
import {SessionCreateOptions} from "../services/sessions";
|
||||
const sessions = require('../services/sessions')
|
||||
const version: string = require('../../package.json').version
|
||||
|
||||
interface V1Routes {
|
||||
[key: string]: (params: V1RequestBase, response: V1ResponseBase) => Promise<void>
|
||||
}
|
||||
|
||||
export interface V1RequestBase {
|
||||
cmd: string
|
||||
cookies?: SetCookie[],
|
||||
headers?: Headers
|
||||
maxTimeout?: number
|
||||
proxy?: any// TODO: use interface not any
|
||||
session: string
|
||||
userAgent?: string // deprecated, not used
|
||||
}
|
||||
|
||||
interface V1RequestSession extends V1RequestBase {
|
||||
}
|
||||
|
||||
export interface V1Request extends V1RequestBase {
|
||||
url: string
|
||||
method?: HttpMethod
|
||||
postData?: string
|
||||
download?: boolean
|
||||
returnOnlyCookies?: boolean
|
||||
returnRawHtml?: boolean
|
||||
}
|
||||
|
||||
export interface V1ResponseBase {
|
||||
status: string
|
||||
message: string
|
||||
startTimestamp: number
|
||||
endTimestamp: number
|
||||
version: string
|
||||
}
|
||||
|
||||
export interface V1ResponseSolution extends V1ResponseBase {
|
||||
solution: ChallengeResolutionResultT
|
||||
}
|
||||
|
||||
export interface V1ResponseSession extends V1ResponseBase {
|
||||
session: string
|
||||
}
|
||||
|
||||
export interface V1ResponseSessions extends V1ResponseBase {
|
||||
sessions: string[]
|
||||
}
|
||||
|
||||
export const routes: V1Routes = {
|
||||
'sessions.create': async (params: V1RequestSession, response: V1ResponseSession): Promise<void> => {
|
||||
const options: SessionCreateOptions = {
|
||||
oneTimeSession: false,
|
||||
cookies: params.cookies,
|
||||
headers: params.headers,
|
||||
maxTimeout: params.maxTimeout,
|
||||
proxy: params.proxy
|
||||
}
|
||||
const { sessionId, browser } = await sessions.create(params.session, options)
|
||||
if (browser) {
|
||||
response.status = "ok";
|
||||
response.message = "Session created successfully.";
|
||||
response.session = sessionId
|
||||
} else {
|
||||
throw Error('Error creating session.')
|
||||
}
|
||||
},
|
||||
'sessions.list': async (params: V1RequestSession, response: V1ResponseSessions): Promise<void> => {
|
||||
response.status = "ok";
|
||||
response.message = "";
|
||||
response.sessions = sessions.list();
|
||||
},
|
||||
'sessions.destroy': async (params: V1RequestSession, response: V1ResponseBase): Promise<void> => {
|
||||
if (await sessions.destroy(params.session)) {
|
||||
response.status = "ok";
|
||||
response.message = "The session has been removed.";
|
||||
} else {
|
||||
throw Error('This session does not exist.')
|
||||
}
|
||||
},
|
||||
'request.get': async (params: V1Request, response: V1ResponseSolution): Promise<void> => {
|
||||
params.method = 'GET'
|
||||
if (params.userAgent) {
|
||||
log.warn('Request parameter "userAgent" was removed in FlareSolverr v2.')
|
||||
}
|
||||
if (params.postData) {
|
||||
throw Error('Cannot use "postBody" when sending a GET request.')
|
||||
}
|
||||
const result: ChallengeResolutionT = await browserRequest(params)
|
||||
|
||||
response.status = result.status;
|
||||
response.message = result.message;
|
||||
response.solution = result.result;
|
||||
if (response.message) {
|
||||
log.info(response.message)
|
||||
}
|
||||
},
|
||||
'request.post': async (params: V1Request, response: V1ResponseSolution): Promise<void> => {
|
||||
params.method = 'POST'
|
||||
if (params.userAgent) {
|
||||
log.warn('Request parameter "userAgent" was removed in FlareSolverr v2.')
|
||||
}
|
||||
if (!params.postData) {
|
||||
throw Error('Must send param "postBody" when sending a POST request.')
|
||||
}
|
||||
const result: ChallengeResolutionT = await browserRequest(params)
|
||||
|
||||
response.status = result.status;
|
||||
response.message = result.message;
|
||||
response.solution = result.result;
|
||||
if (response.message) {
|
||||
log.info(response.message)
|
||||
}
|
||||
},
|
||||
}
|
||||
|
||||
export async function controllerV1(req: Request, res: Response): Promise<void> {
|
||||
const response: V1ResponseBase = {
|
||||
status: null,
|
||||
message: null,
|
||||
startTimestamp: Date.now(),
|
||||
endTimestamp: 0,
|
||||
version: version
|
||||
}
|
||||
|
||||
try {
|
||||
const params: V1RequestBase = req.body
|
||||
if (!params.cmd) {
|
||||
throw Error("Parameter 'cmd' is mandatory.")
|
||||
}
|
||||
const route = routes[params.cmd]
|
||||
if (route) {
|
||||
await route(params, response)
|
||||
|
||||
} else {
|
||||
throw Error(`The command '${params.cmd}' is invalid.`)
|
||||
}
|
||||
} catch (e) {
|
||||
res.status(500)
|
||||
response.status = "error";
|
||||
response.message = e.toString();
|
||||
log.error(response.message)
|
||||
}
|
||||
|
||||
response.endTimestamp = Date.now()
|
||||
log.info(`Response in ${(response.endTimestamp - response.startTimestamp) / 1000} s`)
|
||||
res.send(response)
|
||||
}
|
||||
Reference in New Issue
Block a user