Merge branch 'develop' into all-record
This commit is contained in:
90
.github/ISSUE_TEMPLATE/bug_report.yml
vendored
Normal file
90
.github/ISSUE_TEMPLATE/bug_report.yml
vendored
Normal file
@@ -0,0 +1,90 @@
|
|||||||
|
name: Bug Report
|
||||||
|
description: Report a bug to help us improve
|
||||||
|
title: "[Bug]: "
|
||||||
|
labels: [bug]
|
||||||
|
assignees: []
|
||||||
|
|
||||||
|
body:
|
||||||
|
- type: dropdown
|
||||||
|
id: environment
|
||||||
|
attributes:
|
||||||
|
label: Where are you using the app?
|
||||||
|
options:
|
||||||
|
- Cloud (Hosted by Us)
|
||||||
|
- Self-Hosted (OSS) with Docker
|
||||||
|
- Self-Hosted (OSS) without Docker
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
|
||||||
|
- type: input
|
||||||
|
id: app_version
|
||||||
|
attributes:
|
||||||
|
label: App Version
|
||||||
|
description: Enter the version number you are using (if known).
|
||||||
|
placeholder: "e.g., v1.2.3"
|
||||||
|
validations:
|
||||||
|
required: false
|
||||||
|
|
||||||
|
- type: input
|
||||||
|
id: browser
|
||||||
|
attributes:
|
||||||
|
label: Browser
|
||||||
|
description: Which browser are you using?
|
||||||
|
placeholder: "e.g., Chrome 124, Firefox 115, Safari 17"
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
|
||||||
|
- type: input
|
||||||
|
id: operating_system
|
||||||
|
attributes:
|
||||||
|
label: Operating System
|
||||||
|
description: Your operating system and version.
|
||||||
|
placeholder: "e.g., Windows 11, macOS Sonoma, Ubuntu 22.04"
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
|
||||||
|
- type: textarea
|
||||||
|
id: steps_to_reproduce
|
||||||
|
attributes:
|
||||||
|
label: Steps to Reproduce
|
||||||
|
description: How can we reproduce the problem?
|
||||||
|
placeholder: |
|
||||||
|
1. Go to '...'
|
||||||
|
2. Click on '...'
|
||||||
|
3. Scroll down to '...'
|
||||||
|
4. See error
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
|
||||||
|
- type: textarea
|
||||||
|
id: expected_behavior
|
||||||
|
attributes:
|
||||||
|
label: Expected Behavior
|
||||||
|
description: What did you expect to happen instead?
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
|
||||||
|
- type: textarea
|
||||||
|
id: actual_behavior
|
||||||
|
attributes:
|
||||||
|
label: Actual Behavior
|
||||||
|
description: What actually happened?
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
|
||||||
|
- type: textarea
|
||||||
|
id: logs
|
||||||
|
attributes:
|
||||||
|
label: Relevant Logs or Screenshots
|
||||||
|
description: Please paste any logs, screenshots, or console errors if available.
|
||||||
|
placeholder: "Paste logs or upload screenshots."
|
||||||
|
validations:
|
||||||
|
required: false
|
||||||
|
|
||||||
|
- type: textarea
|
||||||
|
id: additional_context
|
||||||
|
attributes:
|
||||||
|
label: Additional Context
|
||||||
|
description: Anything else we should know?
|
||||||
|
validations:
|
||||||
|
required: false
|
||||||
@@ -6,7 +6,7 @@
|
|||||||
<meta name="theme-color" content="#000000" />
|
<meta name="theme-color" content="#000000" />
|
||||||
<meta
|
<meta
|
||||||
name="description"
|
name="description"
|
||||||
content="Web site created using Vite"
|
content="Maxun is an open-source no-code web data extraction platform. Train a robot in 2 minutes to extract data on auto-pilot!"
|
||||||
/>
|
/>
|
||||||
<link rel="icon" type="image/png" href="src/assets/maxunlogo.png">
|
<link rel="icon" type="image/png" href="src/assets/maxunlogo.png">
|
||||||
<title>Maxun | Open Source No Code Web Data Extraction Platform</title>
|
<title>Maxun | Open Source No Code Web Data Extraction Platform</title>
|
||||||
|
|||||||
43
nginx.conf
43
nginx.conf
@@ -1,45 +1,24 @@
|
|||||||
server {
|
server {
|
||||||
listen 80;
|
listen 80;
|
||||||
|
server_name _;
|
||||||
|
|
||||||
|
root /var/www/maxun;
|
||||||
|
index index.html;
|
||||||
|
|
||||||
|
# Serve the frontend
|
||||||
location / {
|
location / {
|
||||||
root /usr/share/nginx/html;
|
|
||||||
try_files $uri $uri/ /index.html;
|
try_files $uri $uri/ /index.html;
|
||||||
}
|
}
|
||||||
|
|
||||||
location /api {
|
# Proxy for backend
|
||||||
proxy_pass http://localhost:8080;
|
location ^/(auth|storage|record|workflow|robot|proxy|api-docs|api)(/|$) {
|
||||||
|
proxy_pass http://localhost:8080; # change as per your setup
|
||||||
proxy_http_version 1.1;
|
proxy_http_version 1.1;
|
||||||
proxy_set_header Upgrade $http_upgrade;
|
proxy_set_header Upgrade $http_upgrade;
|
||||||
proxy_set_header Connection 'upgrade';
|
proxy_set_header Connection 'upgrade';
|
||||||
proxy_set_header Host $host;
|
proxy_set_header Host $host;
|
||||||
proxy_cache_bypass $http_upgrade;
|
proxy_set_header X-Real-IP $remote_addr;
|
||||||
|
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||||
# Add timeout configurations
|
proxy_set_header X-Forwarded-Proto $scheme;
|
||||||
proxy_connect_timeout 60s;
|
|
||||||
proxy_send_timeout 60s;
|
|
||||||
proxy_read_timeout 60s;
|
|
||||||
|
|
||||||
# Add error handling
|
|
||||||
proxy_intercept_errors on;
|
|
||||||
error_page 502 503 504 /50x.html;
|
|
||||||
}
|
|
||||||
|
|
||||||
location ~ ^/(record|workflow|storage|auth|integration|proxy|api-docs) {
|
|
||||||
proxy_pass http://localhost:8080;
|
|
||||||
proxy_http_version 1.1;
|
|
||||||
proxy_set_header Upgrade $http_upgrade;
|
|
||||||
proxy_set_header Connection 'keep-alive'; # Ensure connections remain open
|
|
||||||
proxy_set_header Connection 'upgrade';
|
|
||||||
proxy_set_header Host $host;
|
|
||||||
proxy_cache_bypass $http_upgrade;
|
|
||||||
|
|
||||||
# Timeout configurations
|
|
||||||
proxy_connect_timeout 60s;
|
|
||||||
proxy_send_timeout 60s;
|
|
||||||
proxy_read_timeout 60s;
|
|
||||||
|
|
||||||
# Error handling for these routes
|
|
||||||
proxy_intercept_errors on;
|
|
||||||
error_page 502 503 504 /50x.html;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -224,9 +224,15 @@ const onMousemove = async (socket: AuthenticatedSocket, coordinates: Coordinates
|
|||||||
*/
|
*/
|
||||||
const handleMousemove = async (generator: WorkflowGenerator, page: Page, { x, y }: Coordinates) => {
|
const handleMousemove = async (generator: WorkflowGenerator, page: Page, { x, y }: Coordinates) => {
|
||||||
try {
|
try {
|
||||||
|
if (page.isClosed()) {
|
||||||
|
logger.log('debug', `Ignoring mousemove event: page is closed`);
|
||||||
|
return;
|
||||||
|
}
|
||||||
await page.mouse.move(x, y);
|
await page.mouse.move(x, y);
|
||||||
throttle(async () => {
|
throttle(async () => {
|
||||||
await generator.generateDataForHighlighter(page, { x, y });
|
if (!page.isClosed()) {
|
||||||
|
await generator.generateDataForHighlighter(page, { x, y });
|
||||||
|
}
|
||||||
}, 100)();
|
}, 100)();
|
||||||
logger.log('debug', `Moved over position x:${x}, y:${y}`);
|
logger.log('debug', `Moved over position x:${x}, y:${y}`);
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
@@ -402,7 +408,7 @@ const handleChangeUrl = async (generator: WorkflowGenerator, page: Page, url: st
|
|||||||
if (url) {
|
if (url) {
|
||||||
await generator.onChangeUrl(url, page);
|
await generator.onChangeUrl(url, page);
|
||||||
try {
|
try {
|
||||||
await page.goto(url);
|
await page.goto(url, { waitUntil: 'networkidle', timeout: 10000 });
|
||||||
logger.log('debug', `Went to ${url}`);
|
logger.log('debug', `Went to ${url}`);
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
const { message } = e as Error;
|
const { message } = e as Error;
|
||||||
|
|||||||
@@ -93,7 +93,7 @@ async function resetBrowserState(browser: RemoteBrowser): Promise<boolean> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Navigate to blank page to reset state
|
// Navigate to blank page to reset state
|
||||||
await currentPage.goto('about:blank');
|
await currentPage.goto('about:blank', { waitUntil: 'networkidle', timeout: 10000 });
|
||||||
|
|
||||||
// Clear browser storage
|
// Clear browser storage
|
||||||
await currentPage.evaluate(() => {
|
await currentPage.evaluate(() => {
|
||||||
|
|||||||
@@ -10,6 +10,7 @@ import {
|
|||||||
getRemoteBrowserCurrentUrl,
|
getRemoteBrowserCurrentUrl,
|
||||||
getRemoteBrowserCurrentTabs,
|
getRemoteBrowserCurrentTabs,
|
||||||
getActiveBrowserIdByState,
|
getActiveBrowserIdByState,
|
||||||
|
destroyRemoteBrowser,
|
||||||
} from '../browser-management/controller';
|
} from '../browser-management/controller';
|
||||||
import { chromium } from 'playwright-extra';
|
import { chromium } from 'playwright-extra';
|
||||||
import stealthPlugin from 'puppeteer-extra-plugin-stealth';
|
import stealthPlugin from 'puppeteer-extra-plugin-stealth';
|
||||||
@@ -146,8 +147,8 @@ router.get('/stop/:browserId', requireSignIn, async (req: AuthenticatedRequest,
|
|||||||
});
|
});
|
||||||
|
|
||||||
if (!jobId) {
|
if (!jobId) {
|
||||||
const browserId = initializeRemoteBrowserForRecording(req.user.id);
|
await destroyRemoteBrowser(req.params.browserId, req.user.id);
|
||||||
return res.send( browserId );
|
return res.send(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
logger.log('info', `Queued browser destruction job: ${jobId}, waiting for completion...`);
|
logger.log('info', `Queued browser destruction job: ${jobId}, waiting for completion...`);
|
||||||
|
|||||||
@@ -441,6 +441,8 @@ export const RightSidePanel: React.FC<RightSidePanelProps> = ({ onFinishCapture
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
resetListState();
|
resetListState();
|
||||||
|
stopPaginationMode();
|
||||||
|
stopLimitMode();
|
||||||
setShowPaginationOptions(false);
|
setShowPaginationOptions(false);
|
||||||
setShowLimitOptions(false);
|
setShowLimitOptions(false);
|
||||||
setCaptureStage('initial');
|
setCaptureStage('initial');
|
||||||
|
|||||||
@@ -147,6 +147,7 @@ export const ActionProvider = ({ children }: { children: ReactNode }) => {
|
|||||||
|
|
||||||
const stopGetList = () => {
|
const stopGetList = () => {
|
||||||
setGetList(false);
|
setGetList(false);
|
||||||
|
socket?.emit('setGetList', { getList: false });
|
||||||
setPaginationType('');
|
setPaginationType('');
|
||||||
setLimitType('');
|
setLimitType('');
|
||||||
setCustomLimit('');
|
setCustomLimit('');
|
||||||
|
|||||||
Reference in New Issue
Block a user