From b63701c67324086d479dd26e72457cd8fc1a79e0 Mon Sep 17 00:00:00 2001 From: Rohit Date: Fri, 25 Apr 2025 19:33:12 +0530 Subject: [PATCH 01/18] feat: emit list false on discard --- src/context/browserActions.tsx | 1 + 1 file changed, 1 insertion(+) diff --git a/src/context/browserActions.tsx b/src/context/browserActions.tsx index bc377bbb..d344f6af 100644 --- a/src/context/browserActions.tsx +++ b/src/context/browserActions.tsx @@ -88,6 +88,7 @@ export const ActionProvider = ({ children }: { children: ReactNode }) => { const stopGetList = () => { setGetList(false); + socket?.emit('setGetList', { getList: false }); setPaginationType(''); setLimitType(''); setCustomLimit(''); From 3160ee8474b5f6012294102a4020f74b566f7ac3 Mon Sep 17 00:00:00 2001 From: Rohit Date: Fri, 25 Apr 2025 22:35:42 +0530 Subject: [PATCH 02/18] feat: stop pagination and limit mode on discard --- src/components/recorder/RightSidePanel.tsx | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/components/recorder/RightSidePanel.tsx b/src/components/recorder/RightSidePanel.tsx index 6027e26d..9bbbc8b2 100644 --- a/src/components/recorder/RightSidePanel.tsx +++ b/src/components/recorder/RightSidePanel.tsx @@ -423,6 +423,8 @@ export const RightSidePanel: React.FC = ({ onFinishCapture } }); resetListState(); + stopPaginationMode(); + stopLimitMode(); setShowPaginationOptions(false); setShowLimitOptions(false); setCaptureStage('initial'); From fa34500c3ab6ef06d1097fa127bcf5822fd77f3b Mon Sep 17 00:00:00 2001 From: Rohit Date: Fri, 25 Apr 2025 22:36:12 +0530 Subject: [PATCH 03/18] feat: set pagination socket event false --- src/context/browserActions.tsx | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/context/browserActions.tsx b/src/context/browserActions.tsx index d344f6af..42f9f95e 100644 --- a/src/context/browserActions.tsx +++ b/src/context/browserActions.tsx @@ -68,7 +68,10 @@ export const ActionProvider = ({ children }: { children: ReactNode }) => { socket?.emit('setPaginationMode', { pagination: true }); }; - const stopPaginationMode = () => setPaginationMode(false); + const stopPaginationMode = () => { + setPaginationMode(false); + socket?.emit('setPaginationMode', { pagination: false }); + }; const startLimitMode = () => { setLimitMode(true); From 9510336a5fd6a6913fcef38d713a3975b6180a1e Mon Sep 17 00:00:00 2001 From: Karishma Shukla Date: Sat, 26 Apr 2025 14:41:47 +0530 Subject: [PATCH 04/18] chore: add bug report issue template --- .github/ISSUE_TEMPLATE/bug_report.yml | 90 +++++++++++++++++++++++++++ 1 file changed, 90 insertions(+) create mode 100644 .github/ISSUE_TEMPLATE/bug_report.yml diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml new file mode 100644 index 00000000..6d929769 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug_report.yml @@ -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 From cbc77f00c1c0538f7097c3191c9ff28d0a1a7f98 Mon Sep 17 00:00:00 2001 From: Karishma Shukla Date: Sat, 26 Apr 2025 15:19:03 +0530 Subject: [PATCH 05/18] fix: add page closed condition for highlighter --- server/src/browser-management/inputHandlers.ts | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/server/src/browser-management/inputHandlers.ts b/server/src/browser-management/inputHandlers.ts index 598c528e..f238ed65 100644 --- a/server/src/browser-management/inputHandlers.ts +++ b/server/src/browser-management/inputHandlers.ts @@ -224,9 +224,15 @@ const onMousemove = async (socket: AuthenticatedSocket, coordinates: Coordinates */ const handleMousemove = async (generator: WorkflowGenerator, page: Page, { x, y }: Coordinates) => { try { + if (page.isClosed()) { + logger.log('debug', `Ignoring mousemove event: page is closed`); + return; + } await page.mouse.move(x, y); throttle(async () => { - await generator.generateDataForHighlighter(page, { x, y }); + if (!page.isClosed()) { + await generator.generateDataForHighlighter(page, { x, y }); + } }, 100)(); logger.log('debug', `Moved over position x:${x}, y:${y}`); } catch (e) { @@ -514,4 +520,4 @@ const registerInputHandlers = (socket: Socket) => { socket.on("action", (data) => onGenerateAction(authSocket, data)); }; -export default registerInputHandlers; \ No newline at end of file +export default registerInputHandlers; From 2dbec99c6fd96a31f35f4f5db296a6d1c299e654 Mon Sep 17 00:00:00 2001 From: Karishma Shukla Date: Sat, 26 Apr 2025 15:55:40 +0530 Subject: [PATCH 06/18] feat: _ server name --- nginx.conf | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/nginx.conf b/nginx.conf index 1ea52146..2e57dc53 100644 --- a/nginx.conf +++ b/nginx.conf @@ -1,5 +1,6 @@ server { listen 80; + server_name _; location / { root /usr/share/nginx/html; @@ -42,4 +43,4 @@ server { proxy_intercept_errors on; error_page 502 503 504 /50x.html; } -} \ No newline at end of file +} From 84bad0c89d878e3a829a9e3381ff4c193032ce7f Mon Sep 17 00:00:00 2001 From: Karishma Shukla Date: Sat, 26 Apr 2025 15:56:40 +0530 Subject: [PATCH 07/18] feat: serve frontend --- nginx.conf | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/nginx.conf b/nginx.conf index 2e57dc53..77282e65 100644 --- a/nginx.conf +++ b/nginx.conf @@ -2,8 +2,11 @@ server { listen 80; server_name _; + root /var/www/maxun; + index index.html; + + # Serve the frontend location / { - root /usr/share/nginx/html; try_files $uri $uri/ /index.html; } From 6b86d351497798d6ba04af9eb983ca28248d4e38 Mon Sep 17 00:00:00 2001 From: Karishma Shukla Date: Sat, 26 Apr 2025 15:58:00 +0530 Subject: [PATCH 08/18] feat: backend proxy --- nginx.conf | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/nginx.conf b/nginx.conf index 77282e65..29c6f990 100644 --- a/nginx.conf +++ b/nginx.conf @@ -9,8 +9,9 @@ server { location / { try_files $uri $uri/ /index.html; } - - location /api { + + # Proxy for backend + location ^/(auth|storage|record|workflow|robot|proxy|api-docs)(/|$) { proxy_pass http://localhost:8080; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; From a67d93a37e4d648de842ce9d63ddf0d5d311cc74 Mon Sep 17 00:00:00 2001 From: Karishma Shukla Date: Sat, 26 Apr 2025 15:59:01 +0530 Subject: [PATCH 09/18] feat: handle websocket connections --- nginx.conf | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/nginx.conf b/nginx.conf index 29c6f990..a48fba88 100644 --- a/nginx.conf +++ b/nginx.conf @@ -12,12 +12,15 @@ server { # Proxy for backend location ^/(auth|storage|record|workflow|robot|proxy|api-docs)(/|$) { - proxy_pass http://localhost:8080; + proxy_pass http://localhost:8080; # change as per your setup proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection 'upgrade'; 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; + proxy_set_header X-Forwarded-Proto $scheme; + # Add timeout configurations proxy_connect_timeout 60s; From 69aedcb9ff93e65a3157fa590e629a0956618080 Mon Sep 17 00:00:00 2001 From: Karishma Shukla Date: Sat, 26 Apr 2025 17:09:35 +0530 Subject: [PATCH 10/18] chore: cleanup stale config --- nginx.conf | 19 ------------------- 1 file changed, 19 deletions(-) diff --git a/nginx.conf b/nginx.conf index a48fba88..23438209 100644 --- a/nginx.conf +++ b/nginx.conf @@ -31,23 +31,4 @@ server { 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; - } } From 50ec36110ea907200a95766044fccfe71027c907 Mon Sep 17 00:00:00 2001 From: Karishma Shukla Date: Sat, 26 Apr 2025 17:11:15 +0530 Subject: [PATCH 11/18] chore: cleanup stale config --- nginx.conf | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/nginx.conf b/nginx.conf index 23438209..8f168ac9 100644 --- a/nginx.conf +++ b/nginx.conf @@ -18,15 +18,9 @@ server { proxy_set_header Connection 'upgrade'; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; - proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; - - # Add timeout configurations - 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; From 235d731ad2c5c026a62f0ebf418b51f105efad8a Mon Sep 17 00:00:00 2001 From: Karishma Shukla Date: Sat, 26 Apr 2025 17:11:31 +0530 Subject: [PATCH 12/18] feat: app api --- nginx.conf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nginx.conf b/nginx.conf index 8f168ac9..859c5686 100644 --- a/nginx.conf +++ b/nginx.conf @@ -11,7 +11,7 @@ server { } # Proxy for backend - location ^/(auth|storage|record|workflow|robot|proxy|api-docs)(/|$) { + 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_set_header Upgrade $http_upgrade; From e3651046e7cc0e4553623e3766866a064094d4a0 Mon Sep 17 00:00:00 2001 From: Karishma Shukla Date: Mon, 28 Apr 2025 01:02:53 +0530 Subject: [PATCH 13/18] feat: -rm error handling --- nginx.conf | 4 ---- 1 file changed, 4 deletions(-) diff --git a/nginx.conf b/nginx.conf index 859c5686..c3651437 100644 --- a/nginx.conf +++ b/nginx.conf @@ -20,9 +20,5 @@ server { proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; - - # Add error handling - proxy_intercept_errors on; - error_page 502 503 504 /50x.html; } } From f805608127d9f4898a115007a43b41f44b0a3ab4 Mon Sep 17 00:00:00 2001 From: Harsh G <89582365+HarshGID100@users.noreply.github.com> Date: Mon, 28 Apr 2025 13:21:54 +0530 Subject: [PATCH 14/18] feat: add meta content --- index.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/index.html b/index.html index c1ebd718..d6a1a5f8 100644 --- a/index.html +++ b/index.html @@ -6,7 +6,7 @@ Maxun | Open Source No Code Web Data Extraction Platform From d1d9fea474b5b47a9ebb7f8844ae263322961eac Mon Sep 17 00:00:00 2001 From: Karishma Shukla Date: Mon, 28 Apr 2025 18:35:23 +0530 Subject: [PATCH 15/18] feat: add wait until timeout state for navigation --- server/src/browser-management/inputHandlers.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/server/src/browser-management/inputHandlers.ts b/server/src/browser-management/inputHandlers.ts index 598c528e..d6a68a61 100644 --- a/server/src/browser-management/inputHandlers.ts +++ b/server/src/browser-management/inputHandlers.ts @@ -402,7 +402,7 @@ const handleChangeUrl = async (generator: WorkflowGenerator, page: Page, url: st if (url) { await generator.onChangeUrl(url, page); try { - await page.goto(url); + await page.goto(url, { waitUntil: 'networkidle', timeout: 10000 }); logger.log('debug', `Went to ${url}`); } catch (e) { const { message } = e as Error; @@ -514,4 +514,4 @@ const registerInputHandlers = (socket: Socket) => { socket.on("action", (data) => onGenerateAction(authSocket, data)); }; -export default registerInputHandlers; \ No newline at end of file +export default registerInputHandlers; From ce0242e95823337abdfc973763f30ca3bae1d1ea Mon Sep 17 00:00:00 2001 From: Karishma Shukla Date: Mon, 28 Apr 2025 18:36:11 +0530 Subject: [PATCH 16/18] feat: add wait until timeout state for navigation --- server/src/pgboss-worker.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/src/pgboss-worker.ts b/server/src/pgboss-worker.ts index 3ac993a7..0639f4c7 100644 --- a/server/src/pgboss-worker.ts +++ b/server/src/pgboss-worker.ts @@ -93,7 +93,7 @@ async function resetBrowserState(browser: RemoteBrowser): Promise { } // Navigate to blank page to reset state - await currentPage.goto('about:blank'); + await currentPage.goto('about:blank', { waitUntil: 'networkidle', timeout: 10000 }); // Clear browser storage await currentPage.evaluate(() => { From 5be117247492bf2ce50e1d96d6f1826ed70ecf7f Mon Sep 17 00:00:00 2001 From: Rohit Date: Tue, 29 Apr 2025 00:47:05 +0530 Subject: [PATCH 17/18] feat: destroy browser fallback fix --- server/src/routes/record.ts | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/server/src/routes/record.ts b/server/src/routes/record.ts index 411767c2..cee9d4ae 100644 --- a/server/src/routes/record.ts +++ b/server/src/routes/record.ts @@ -10,6 +10,7 @@ import { getRemoteBrowserCurrentUrl, getRemoteBrowserCurrentTabs, getActiveBrowserIdByState, + destroyRemoteBrowser, } from '../browser-management/controller'; import { chromium } from 'playwright-extra'; import stealthPlugin from 'puppeteer-extra-plugin-stealth'; @@ -146,8 +147,8 @@ router.get('/stop/:browserId', requireSignIn, async (req: AuthenticatedRequest, }); if (!jobId) { - const browserId = initializeRemoteBrowserForRecording(req.user.id); - return res.send( browserId ); + await destroyRemoteBrowser(req.user.id, req.user.id); + return res.send(false); } logger.log('info', `Queued browser destruction job: ${jobId}, waiting for completion...`); From 863603fac39fbf7295d38207a40dd317dbb7c4b8 Mon Sep 17 00:00:00 2001 From: Rohit Date: Tue, 29 Apr 2025 00:50:12 +0530 Subject: [PATCH 18/18] feat: pass browser id --- server/src/routes/record.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/src/routes/record.ts b/server/src/routes/record.ts index cee9d4ae..374f837a 100644 --- a/server/src/routes/record.ts +++ b/server/src/routes/record.ts @@ -147,7 +147,7 @@ router.get('/stop/:browserId', requireSignIn, async (req: AuthenticatedRequest, }); if (!jobId) { - await destroyRemoteBrowser(req.user.id, req.user.id); + await destroyRemoteBrowser(req.params.browserId, req.user.id); return res.send(false); }