@rent-scraper/browser-server 1.0.15 → 1.0.17

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,2 +1,2 @@
1
1
  #!/usr/bin/env node
2
- import{r}from"../shared/browser-server.CTHRk1um.mjs";import"express";import"puppeteer";import"child_process";import"@rent-scraper/utils/config";import"@rent-scraper/utils";r();
2
+ import{r}from"../shared/browser-server.BEbqkWW0.mjs";import"express";import"puppeteer";import"child_process";import"@rent-scraper/utils/config";import"@rent-scraper/utils";r();
package/dist/index.d.mts CHANGED
@@ -12,7 +12,7 @@ declare const closeBrowser: () => Promise<void>;
12
12
  declare const launchBrowser: (source?: ListingsSource) => Promise<{
13
13
  status: string;
14
14
  }>;
15
- declare const openBrowser: (url?: string) => Promise<{
15
+ declare const openBrowser: (url: string) => Promise<{
16
16
  status: string;
17
17
  }>;
18
18
  declare const shutdownBrowser: () => Promise<{
@@ -21,7 +21,12 @@ declare const shutdownBrowser: () => Promise<{
21
21
 
22
22
  declare function runConfirmBrowserLaunch(): Promise<undefined>;
23
23
 
24
- declare const getZillowCookie: () => Promise<puppeteer.Cookie | undefined>;
24
+ declare const getZillowCookie: (attempt?: number) => Promise<{
25
+ name: string;
26
+ value: string;
27
+ } | undefined>;
28
+ declare const getRedfinCookie: (attempt?: number) => Promise<string | undefined>;
29
+ declare const saveRedfinCookie: () => Promise<void>;
25
30
  declare const saveZillowCookie: () => Promise<void>;
26
31
 
27
32
  // This extracts the core definitions from express to prevent a circular dependency between express and serve-static
@@ -1245,6 +1250,6 @@ interface Express extends Application {
1245
1250
  response: Response;
1246
1251
  }
1247
1252
 
1248
- declare function runBrowserServer(): Express;
1253
+ declare function runBrowserServer(source?: ListingsSource): Express;
1249
1254
 
1250
- export { closeBrowser, getBrowser, getZillowCookie, launchBrowser, openBrowser, runBrowserServer, runConfirmBrowserLaunch, saveZillowCookie, shutdownBrowser };
1255
+ export { closeBrowser, getBrowser, getRedfinCookie, getZillowCookie, launchBrowser, openBrowser, runBrowserServer, runConfirmBrowserLaunch, saveRedfinCookie, saveZillowCookie, shutdownBrowser };
package/dist/index.mjs CHANGED
@@ -1 +1 @@
1
- export{c as closeBrowser,g as getBrowser,a as getZillowCookie,l as launchBrowser,o as openBrowser,r as runBrowserServer,b as saveZillowCookie,s as shutdownBrowser}from"./shared/browser-server.CTHRk1um.mjs";import{confirm as r,isCancel as a,cancel as s,outro as t}from"@clack/prompts";import{setTimeout as o}from"node:timers/promises";import"express";import"puppeteer";import"child_process";import"@rent-scraper/utils/config";import"@rent-scraper/utils";async function i(){const e=await r({message:"We need to launch your browser to continue",active:"OK",inactive:"Cancel"});if(a(e)||!e)return s("Create config canceled. Please try again."),process.exit(1);await o(1e3),t("Browser Launching..."),await o(1e3)}export{i as runConfirmBrowserLaunch};
1
+ export{c as closeBrowser,g as getBrowser,b as getRedfinCookie,a as getZillowCookie,l as launchBrowser,o as openBrowser,r as runBrowserServer,d as saveRedfinCookie,e as saveZillowCookie,s as shutdownBrowser}from"./shared/browser-server.BEbqkWW0.mjs";import{confirm as r,isCancel as a,cancel as s,outro as i}from"@clack/prompts";import{setTimeout as o}from"node:timers/promises";import"express";import"puppeteer";import"child_process";import"@rent-scraper/utils/config";import"@rent-scraper/utils";async function t(){const e=await r({message:"We need to launch your browser to continue",active:"OK",inactive:"Cancel"});if(a(e)||!e)return s("Create config canceled. Please try again."),process.exit(1);await o(1e3),i("Browser Launching..."),await o(1e3)}export{t as runConfirmBrowserLaunch};
@@ -0,0 +1 @@
1
+ import L from"express";import T from"puppeteer";import{exec as J}from"child_process";import{checkForConfigFile as q,waitForConfigFile as Q,getValueFromConfigFile as X,updateConfigFile as D}from"@rent-scraper/utils/config";import{parseError as H}from"@rent-scraper/utils";const Y="http://127.0.0.1:9222/json/version",_=async()=>{try{return await T.connect({browserURL:Y})}catch{return null}},A=async()=>{const o=await(await _())?.pages();o&&await Promise.all(o.map(i=>i.close()))},N=async(o="zillow")=>{if(await _())return{status:"already launched"};{await q(o)||await Q(o),await q(o);const i=await X(o,"browser")==="brave"?"/Applications/Brave\\ Browser.app/Contents/MacOS/Brave\\ Browser":"/Applications/Google\\ Chrome.app/Contents/MacOS/Google\\ Chrome";return J(`${i} --remote-debugging-port=9222 --no-first-run --no-default-browser-check --user-data-dir=$(mktemp -d -t 'chrome-remote_data_dir')`,f=>{f&&console.error(`Error: ${f.message}`)}),{status:"launched"}}},S=async o=>{const i=await _();if(i){const f=o,s=(await i.pages())?.[0]??await i.newPage();return(await s.title()).includes("denied")||await s.goto(f,{waitUntil:"load"}),{status:"opened"}}else return{status:"not connected"}},I=async()=>{const o=await _();return o?(await o.close(),{status:"closed"}):{status:"not connected"}},V="http://127.0.0.1:9222/json/version",F=async(o=0)=>{const i=await T.connect({browserURL:V});o===0&&await S("https://www.zillow.com/homes/for_rent/");const f=await i.pages();if((f?.[0]?await f[0].title():"").includes("Access to this page has been denied"))return await new Promise(r=>setTimeout(r,2e3)),await F(o+1);const[s]=(await i.cookies()).filter(r=>r.name==="_pxvid");return s?(await A(),s):(console.log("refetching zillow cookie"),await new Promise(r=>setTimeout(r,2e3)),await F(o+1))},M=async(o=0)=>{const i=await T.connect({browserURL:V});o===0&&(await S("https://www.redfin.com"),await new Promise(t=>setTimeout(t,3e3)));const f=await i.pages(),s=f?.[0]?await f[0].title():"",r=(await i.cookies()).filter(t=>t.domain.includes("redfin.com"));return r.some(t=>t.name==="aws-waf-token")&&s.includes("Redfin")?(await A(),r.map(t=>`${t.name}=${t.value}`).join("; ")):(console.log("refetching redfin cookie"),await new Promise(t=>setTimeout(t,2e3)),await M(o+1))},G=async()=>{try{const o=await M();o&&await D("redfin",{redfinCookie:o})}catch(o){const{status:i,message:f}=H(o);console.error(i,f)}},U=async()=>{try{const{name:o,value:i}=await F()??{},f={zillowCookie:`${o}=${i}`};await D("zillow",f)}catch(o){const{status:i,message:f}=H(o);console.error(i,f)}};function j(o){return o&&o.__esModule&&Object.prototype.hasOwnProperty.call(o,"default")?o.default:o}var Z,W;function x(){if(W)return Z;W=1;function o(s,r){var t=s;r.slice(0,-1).forEach(function(p){t=t[p]||{}});var d=r[r.length-1];return d in t}function i(s){return typeof s=="number"||/^0x[0-9a-f]+$/i.test(s)?!0:/^[-+]?(?:\d+(?:\.\d*)?|\.\d+)(e[-+]?\d+)?$/.test(s)}function f(s,r){return r==="constructor"&&typeof s[r]=="function"||r==="__proto__"}return Z=function(s,r){r||(r={});var t={bools:{},strings:{},unknownFn:null};typeof r.unknown=="function"&&(t.unknownFn=r.unknown),typeof r.boolean=="boolean"&&r.boolean?t.allBools=!0:[].concat(r.boolean).filter(Boolean).forEach(function(n){t.bools[n]=!0});var d={};function p(n){return d[n].some(function(w){return t.bools[w]})}Object.keys(r.alias||{}).forEach(function(n){d[n]=[].concat(r.alias[n]),d[n].forEach(function(w){d[w]=[n].concat(d[n].filter(function(E){return w!==E}))})}),[].concat(r.string).filter(Boolean).forEach(function(n){t.strings[n]=!0,d[n]&&[].concat(d[n]).forEach(function(w){t.strings[w]=!0})});var a=r.default||{},e={_:[]};function z(n,w){return t.allBools&&/^--[^=]+$/.test(w)||t.strings[n]||t.bools[n]||d[n]}function O(n,w,E){for(var l=n,$=0;$<w.length-1;$++){var B=w[$];if(f(l,B))return;l[B]===void 0&&(l[B]={}),(l[B]===Object.prototype||l[B]===Number.prototype||l[B]===String.prototype)&&(l[B]={}),l[B]===Array.prototype&&(l[B]=[]),l=l[B]}var C=w[w.length-1];f(l,C)||((l===Object.prototype||l===Number.prototype||l===String.prototype)&&(l={}),l===Array.prototype&&(l=[]),l[C]===void 0||t.bools[C]||typeof l[C]=="boolean"?l[C]=E:Array.isArray(l[C])?l[C].push(E):l[C]=[l[C],E])}function h(n,w,E){if(!(E&&t.unknownFn&&!z(n,E)&&t.unknownFn(E)===!1)){var l=!t.strings[n]&&i(w)?Number(w):w;O(e,n.split("."),l),(d[n]||[]).forEach(function($){O(e,$.split("."),l)})}}Object.keys(t.bools).forEach(function(n){h(n,a[n]===void 0?!1:a[n])});var P=[];s.indexOf("--")!==-1&&(P=s.slice(s.indexOf("--")+1),s=s.slice(0,s.indexOf("--")));for(var m=0;m<s.length;m++){var c=s[m],u,v;if(/^--.+=/.test(c)){var K=c.match(/^--([^=]+)=([\s\S]*)$/);u=K[1];var R=K[2];t.bools[u]&&(R=R!=="false"),h(u,R,c)}else if(/^--no-.+/.test(c))u=c.match(/^--no-(.+)/)[1],h(u,!1,c);else if(/^--.+/.test(c))u=c.match(/^--(.+)/)[1],v=s[m+1],v!==void 0&&!/^(-|--)[^-]/.test(v)&&!t.bools[u]&&!t.allBools&&(!d[u]||!p(u))?(h(u,v,c),m+=1):/^(true|false)$/.test(v)?(h(u,v==="true",c),m+=1):h(u,t.strings[u]?"":!0,c);else if(/^-[^-]+/.test(c)){for(var g=c.slice(1,-1).split(""),y=!1,b=0;b<g.length;b++){if(v=c.slice(b+2),v==="-"){h(g[b],v,c);continue}if(/[A-Za-z]/.test(g[b])&&v[0]==="="){h(g[b],v.slice(1),c),y=!0;break}if(/[A-Za-z]/.test(g[b])&&/-?\d+(\.\d*)?(e-?\d+)?$/.test(v)){h(g[b],v,c),y=!0;break}if(g[b+1]&&g[b+1].match(/\W/)){h(g[b],c.slice(b+2),c),y=!0;break}else h(g[b],t.strings[g[b]]?"":!0,c)}u=c.slice(-1)[0],!y&&u!=="-"&&(s[m+1]&&!/^(-|--)[^-]/.test(s[m+1])&&!t.bools[u]&&(!d[u]||!p(u))?(h(u,s[m+1],c),m+=1):s[m+1]&&/^(true|false)$/.test(s[m+1])?(h(u,s[m+1]==="true",c),m+=1):h(u,t.strings[u]?"":!0,c))}else if((!t.unknownFn||t.unknownFn(c)!==!1)&&e._.push(t.strings._||!i(c)?c:Number(c)),r.stopEarly){e._.push.apply(e._,s.slice(m+1));break}}return Object.keys(a).forEach(function(n){o(e,n.split("."))||(O(e,n.split("."),a[n]),(d[n]||[]).forEach(function(w){O(e,w.split("."),a[n])}))}),r["--"]?e["--"]=P.slice():P.forEach(function(n){e._.push(n)}),e},Z}var k=x();const tt=j(k);function et(o="zillow"){const i=L(),f=process.env.HOST??"127.0.0.1",s=process.env.PORT??8082;i.use(L.json());const r=tt(process.argv.slice(2)).debug,t=i.listen(Number(s),async()=>{await N(o);const p=setInterval(async()=>{(await _())?.connected&&(clearInterval(p),r&&console.log("Browser listening at 127.0.0.1:9222"),o==="zillow"?await U():o==="redfin"&&(await G(),await I()))},1e3);r&&console.log(`Server listening at ${f}:${s}`)}),d=()=>(t.close(async p=>{const a=await I();r&&(console.log(a),console.log("server closed")),process.exit(p?1:0)}),{status:"shutdown"});return i.get("/server",(p,a)=>{try{a.send({running:!0})}catch(e){a.send(e)}}),i.post("/browser/launch",async(p,a)=>{try{const e=await N();a.send({browser:e})}catch(e){a.send(e)}}),i.post("/browser/open",async(p,a)=>{try{const{url:e}=p?.body??{},z=await S(e);a.send({browser:z})}catch(e){a.send(e)}}),i.get("/cookie",async(p,a)=>{try{const e=await F();a.send({cookie:e})}catch(e){a.send(e)}}),i.post("/cookie/save",async(p,a)=>{try{const e=await U();a.send({cookie:e})}catch(e){a.send(e)}}),i.post("/cookie/redfin/save",async(p,a)=>{try{const e=await G();a.send({cookie:e})}catch(e){a.send(e)}}),i.post("/browser/close",async(p,a)=>{try{const e=await A();a.send({browser:e})}catch(e){a.send(e)}}),i.post("/server/shutdown",(p,a)=>{try{const e=d();a.send({server:e})}catch(e){a.send(e)}}),process.on("SIGINT",d),process.on("SIGTERM",d),i}export{F as a,M as b,A as c,G as d,U as e,_ as g,N as l,S as o,et as r,I as s};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rent-scraper/browser-server",
3
- "version": "1.0.15",
3
+ "version": "1.0.17",
4
4
  "type": "module",
5
5
  "exports": {
6
6
  ".": {
@@ -26,8 +26,8 @@
26
26
  "express": "^4.21.2",
27
27
  "picocolors": "^1.1.1",
28
28
  "puppeteer": "^24.11.2",
29
- "@rent-scraper/utils": "1.0.15",
30
- "@rent-scraper/api": "1.0.15"
29
+ "@rent-scraper/api": "1.0.17",
30
+ "@rent-scraper/utils": "1.0.17"
31
31
  },
32
32
  "devDependencies": {
33
33
  "@types/express": "^5.0.3",
package/src/browser.ts CHANGED
@@ -19,7 +19,7 @@ export const getBrowser = async () => {
19
19
  export const closeBrowser = async () => {
20
20
  const browser = await getBrowser()
21
21
  const pages = await browser?.pages()
22
- pages?.forEach(async page => page.close())
22
+ if (pages) await Promise.all(pages.map(page => page.close()))
23
23
  }
24
24
 
25
25
  export const launchBrowser = async (source = 'zillow' as ListingsSource) => {
@@ -33,22 +33,16 @@ export const launchBrowser = async (source = 'zillow' as ListingsSource) => {
33
33
  await checkForConfigFile(source)
34
34
  const browserKey = await getValueFromConfigFile(source, 'browser')
35
35
  const browserPath = browserKey === 'brave' ? '/Applications/Brave\\ Browser.app/Contents/MacOS/Brave\\ Browser' : '/Applications/Google\\ Chrome.app/Contents/MacOS/Google\\ Chrome'
36
- exec(`${browserPath} --remote-debugging-port=9222 --no-first-run --no-default-browser-check --user-data-dir=$(mktemp -d -t 'chrome-remote_data_dir')`, (error, stdout, stderr) => {
36
+ exec(`${browserPath} --remote-debugging-port=9222 --no-first-run --no-default-browser-check --user-data-dir=$(mktemp -d -t 'chrome-remote_data_dir')`, (error) => {
37
37
  if (error) {
38
38
  console.error(`Error: ${error.message}`)
39
- return
40
39
  }
41
- if (stderr) {
42
- console.error(`Stderr: ${stderr}`)
43
- return
44
- }
45
- console.log(`Stdout: ${stdout}`)
46
40
  })
47
41
  return { status: 'launched' }
48
42
  }
49
43
  }
50
44
 
51
- export const openBrowser = async (url = 'https://zillow.com') => {
45
+ export const openBrowser = async (url: string) => {
52
46
  const browser = await getBrowser()
53
47
  if (browser) {
54
48
  const pageUrl = url
@@ -71,7 +65,6 @@ export const shutdownBrowser = async () => {
71
65
  const browser = await getBrowser()
72
66
  if (browser) {
73
67
  await browser.close()
74
- await browser.disconnect()
75
68
  return { status: 'closed' }
76
69
  } else {
77
70
  return { status: 'not connected' }
package/src/cookie.ts CHANGED
@@ -3,21 +3,62 @@ import { closeBrowser, openBrowser } from './browser.js'
3
3
  import { updateConfigFile } from '@rent-scraper/utils/config'
4
4
  import { parseError } from '@rent-scraper/utils'
5
5
 
6
- export const getZillowCookie = async () => {
7
- const wsChromeEndpointurl = 'http://127.0.0.1:9222/json/version'
6
+ const wsChromeEndpointurl = 'http://127.0.0.1:9222/json/version'
7
+
8
+ export const getZillowCookie = async (attempt = 0): Promise<{ name: string, value: string } | undefined> => {
8
9
  const browser = await puppeteer.connect({
9
10
  browserURL: wsChromeEndpointurl,
10
11
  })
11
- await openBrowser('https://www.zillow.com/homes/for_rent/')
12
+ if (attempt === 0) {
13
+ await openBrowser('https://www.zillow.com/homes/for_rent/')
14
+ }
15
+ const pages = await browser.pages()
16
+ const title = pages?.[0] ? await pages[0].title() : ''
17
+ if (title.includes('Access to this page has been denied')) {
18
+ await new Promise(resolve => setTimeout(resolve, 2000))
19
+ return await getZillowCookie(attempt + 1)
20
+ }
12
21
  const [cookie] = (await browser.cookies()).filter(cookie => cookie.name === '_pxvid')
13
22
  if (cookie) {
14
23
  await closeBrowser()
15
24
  return cookie
16
25
  } else {
17
- console.log('refetching cookie')
18
- setTimeout(async () => {
19
- await getZillowCookie()
20
- }, 2000)
26
+ console.log('refetching zillow cookie')
27
+ await new Promise(resolve => setTimeout(resolve, 2000))
28
+ return await getZillowCookie(attempt + 1)
29
+ }
30
+ }
31
+
32
+ export const getRedfinCookie = async (attempt = 0): Promise<string | undefined> => {
33
+ const browser = await puppeteer.connect({
34
+ browserURL: wsChromeEndpointurl,
35
+ })
36
+ if (attempt === 0) {
37
+ await openBrowser('https://www.redfin.com')
38
+ await new Promise(resolve => setTimeout(resolve, 3000))
39
+ }
40
+ const pages = await browser.pages()
41
+ const title = pages?.[0] ? await pages[0].title() : ''
42
+ const cookies = (await browser.cookies()).filter(cookie => cookie.domain.includes('redfin.com'))
43
+ if (cookies.some(cookie => cookie.name === 'aws-waf-token') && title.includes('Redfin')) {
44
+ await closeBrowser()
45
+ return cookies.map(c => `${c.name}=${c.value}`).join('; ')
46
+ } else {
47
+ console.log('refetching redfin cookie')
48
+ await new Promise(resolve => setTimeout(resolve, 2000))
49
+ return await getRedfinCookie(attempt + 1)
50
+ }
51
+ }
52
+
53
+ export const saveRedfinCookie = async () => {
54
+ try {
55
+ const redfinCookie = await getRedfinCookie()
56
+ if (redfinCookie) {
57
+ await updateConfigFile('redfin', { redfinCookie })
58
+ }
59
+ } catch (error: any) {
60
+ const { status, message } = parseError(error)
61
+ console.error(status, message)
21
62
  }
22
63
  }
23
64
 
package/src/server.ts CHANGED
@@ -1,9 +1,10 @@
1
1
  import express from 'express'
2
2
  import minimist from 'minimist'
3
- import { getZillowCookie, saveZillowCookie } from './cookie.js'
3
+ import { getZillowCookie, saveZillowCookie, saveRedfinCookie } from './cookie.js'
4
4
  import { launchBrowser, closeBrowser, getBrowser, shutdownBrowser, openBrowser } from './browser.js'
5
+ import type { ListingsSource } from '@rent-scraper/api'
5
6
 
6
- export function runBrowserServer() {
7
+ export function runBrowserServer(source: ListingsSource = 'zillow') {
7
8
  const app = express()
8
9
  const host = process.env.HOST ?? '127.0.0.1'
9
10
  const port = process.env.PORT ?? 8082
@@ -12,8 +13,8 @@ export function runBrowserServer() {
12
13
  const args = minimist(process.argv.slice(2))
13
14
  const debug = args.debug
14
15
 
15
- const server = app.listen(8082, async () => {
16
- await launchBrowser()
16
+ const server = app.listen(Number(port), async () => {
17
+ await launchBrowser(source)
17
18
  const connecting = setInterval(async () => {
18
19
  const browser = await getBrowser()
19
20
  if (browser?.connected) {
@@ -21,7 +22,12 @@ export function runBrowserServer() {
21
22
  if (debug) {
22
23
  console.log(`Browser listening at 127.0.0.1:9222`)
23
24
  }
24
- await saveZillowCookie()
25
+ if (source === 'zillow') {
26
+ await saveZillowCookie()
27
+ } else if (source === 'redfin') {
28
+ await saveRedfinCookie()
29
+ await shutdownBrowser()
30
+ }
25
31
  }
26
32
  }, 1000)
27
33
  if (debug) {
@@ -77,7 +83,7 @@ export function runBrowserServer() {
77
83
  }
78
84
  })
79
85
 
80
- app.get('/cookie/save', async (_req, res) => {
86
+ app.post('/cookie/save', async (_req, res) => {
81
87
  try {
82
88
  const cookie = await saveZillowCookie()
83
89
  res.send({ cookie })
@@ -86,6 +92,15 @@ export function runBrowserServer() {
86
92
  }
87
93
  })
88
94
 
95
+ app.post('/cookie/redfin/save', async (_req, res) => {
96
+ try {
97
+ const cookie = await saveRedfinCookie()
98
+ res.send({ cookie })
99
+ } catch (error) {
100
+ res.send(error)
101
+ }
102
+ })
103
+
89
104
  app.post('/browser/close', async (_req, res) => {
90
105
  try {
91
106
  const browser = await closeBrowser()
@@ -1 +0,0 @@
1
- import G from"express";import P from"puppeteer";import{exec as D}from"child_process";import{checkForConfigFile as Z,waitForConfigFile as L,getValueFromConfigFile as H,updateConfigFile as V}from"@rent-scraper/utils/config";import{parseError as W}from"@rent-scraper/utils";const J="http://127.0.0.1:9222/json/version",F=async()=>{try{return await P.connect({browserURL:J})}catch{return null}},y=async()=>{(await(await F())?.pages())?.forEach(async o=>o.close())},I=async(o="zillow")=>{if(await F())return{status:"already launched"};{await Z(o)||await L(o),await Z(o);const w=await H(o,"browser")==="brave"?"/Applications/Brave\\ Browser.app/Contents/MacOS/Brave\\ Browser":"/Applications/Google\\ Chrome.app/Contents/MacOS/Google\\ Chrome";return D(`${w} --remote-debugging-port=9222 --no-first-run --no-default-browser-check --user-data-dir=$(mktemp -d -t 'chrome-remote_data_dir')`,(d,n,c)=>{if(d){console.error(`Error: ${d.message}`);return}if(c){console.error(`Stderr: ${c}`);return}console.log(`Stdout: ${n}`)}),{status:"launched"}}},M=async(o="https://zillow.com")=>{const w=await F();if(w){const d=o,n=(await w.pages())?.[0]??await w.newPage();return(await n.title()).includes("denied")||await n.goto(d,{waitUntil:"load"}),{status:"opened"}}else return{status:"not connected"}},K=async()=>{const o=await F();return o?(await o.close(),await o.disconnect(),{status:"closed"}):{status:"not connected"}},S=async()=>{const o=await P.connect({browserURL:"http://127.0.0.1:9222/json/version"});await M("https://www.zillow.com/homes/for_rent/");const[w]=(await o.cookies()).filter(d=>d.name==="_pxvid");if(w)return await y(),w;console.log("refetching cookie"),setTimeout(async()=>{await S()},2e3)},N=async()=>{try{const{name:o,value:w}=await S()??{},d={zillowCookie:`${o}=${w}`};await V("zillow",d)}catch(o){const{status:w,message:d}=W(o);console.error(w,d)}};function Q(o){return o&&o.__esModule&&Object.prototype.hasOwnProperty.call(o,"default")?o.default:o}var R,U;function X(){if(U)return R;U=1;function o(n,c){var e=n;c.slice(0,-1).forEach(function(a){e=e[a]||{}});var l=c[c.length-1];return l in e}function w(n){return typeof n=="number"||/^0x[0-9a-f]+$/i.test(n)?!0:/^[-+]?(?:\d+(?:\.\d*)?|\.\d+)(e[-+]?\d+)?$/.test(n)}function d(n,c){return c==="constructor"&&typeof n[c]=="function"||c==="__proto__"}return R=function(n,c){c||(c={});var e={bools:{},strings:{},unknownFn:null};typeof c.unknown=="function"&&(e.unknownFn=c.unknown),typeof c.boolean=="boolean"&&c.boolean?e.allBools=!0:[].concat(c.boolean).filter(Boolean).forEach(function(t){e.bools[t]=!0});var l={};function a(t){return l[t].some(function(f){return e.bools[f]})}Object.keys(c.alias||{}).forEach(function(t){l[t]=[].concat(c.alias[t]),l[t].forEach(function(f){l[f]=[t].concat(l[t].filter(function($){return f!==$}))})}),[].concat(c.string).filter(Boolean).forEach(function(t){e.strings[t]=!0,l[t]&&[].concat(l[t]).forEach(function(f){e.strings[f]=!0})});var r=c.default||{},b={_:[]};function q(t,f){return e.allBools&&/^--[^=]+$/.test(f)||e.strings[t]||e.bools[t]||l[t]}function g(t,f,$){for(var i=t,O=0;O<f.length-1;O++){var B=f[O];if(d(i,B))return;i[B]===void 0&&(i[B]={}),(i[B]===Object.prototype||i[B]===Number.prototype||i[B]===String.prototype)&&(i[B]={}),i[B]===Array.prototype&&(i[B]=[]),i=i[B]}var _=f[f.length-1];d(i,_)||((i===Object.prototype||i===Number.prototype||i===String.prototype)&&(i={}),i===Array.prototype&&(i=[]),i[_]===void 0||e.bools[_]||typeof i[_]=="boolean"?i[_]=$:Array.isArray(i[_])?i[_].push($):i[_]=[i[_],$])}function h(t,f,$){if(!($&&e.unknownFn&&!q(t,$)&&e.unknownFn($)===!1)){var i=!e.strings[t]&&w(f)?Number(f):f;g(b,t.split("."),i),(l[t]||[]).forEach(function(O){g(b,O.split("."),i)})}}Object.keys(e.bools).forEach(function(t){h(t,r[t]===void 0?!1:r[t])});var A=[];n.indexOf("--")!==-1&&(A=n.slice(n.indexOf("--")+1),n=n.slice(0,n.indexOf("--")));for(var p=0;p<n.length;p++){var s=n[p],u,v;if(/^--.+=/.test(s)){var T=s.match(/^--([^=]+)=([\s\S]*)$/);u=T[1];var z=T[2];e.bools[u]&&(z=z!=="false"),h(u,z,s)}else if(/^--no-.+/.test(s))u=s.match(/^--no-(.+)/)[1],h(u,!1,s);else if(/^--.+/.test(s))u=s.match(/^--(.+)/)[1],v=n[p+1],v!==void 0&&!/^(-|--)[^-]/.test(v)&&!e.bools[u]&&!e.allBools&&(!l[u]||!a(u))?(h(u,v,s),p+=1):/^(true|false)$/.test(v)?(h(u,v==="true",s),p+=1):h(u,e.strings[u]?"":!0,s);else if(/^-[^-]+/.test(s)){for(var E=s.slice(1,-1).split(""),C=!1,m=0;m<E.length;m++){if(v=s.slice(m+2),v==="-"){h(E[m],v,s);continue}if(/[A-Za-z]/.test(E[m])&&v[0]==="="){h(E[m],v.slice(1),s),C=!0;break}if(/[A-Za-z]/.test(E[m])&&/-?\d+(\.\d*)?(e-?\d+)?$/.test(v)){h(E[m],v,s),C=!0;break}if(E[m+1]&&E[m+1].match(/\W/)){h(E[m],s.slice(m+2),s),C=!0;break}else h(E[m],e.strings[E[m]]?"":!0,s)}u=s.slice(-1)[0],!C&&u!=="-"&&(n[p+1]&&!/^(-|--)[^-]/.test(n[p+1])&&!e.bools[u]&&(!l[u]||!a(u))?(h(u,n[p+1],s),p+=1):n[p+1]&&/^(true|false)$/.test(n[p+1])?(h(u,n[p+1]==="true",s),p+=1):h(u,e.strings[u]?"":!0,s))}else if((!e.unknownFn||e.unknownFn(s)!==!1)&&b._.push(e.strings._||!w(s)?s:Number(s)),c.stopEarly){b._.push.apply(b._,n.slice(p+1));break}}return Object.keys(r).forEach(function(t){o(b,t.split("."))||(g(b,t.split("."),r[t]),(l[t]||[]).forEach(function(f){g(b,f.split("."),r[t])}))}),c["--"]?b["--"]=A.slice():A.forEach(function(t){b._.push(t)}),b},R}var Y=X();const j=Q(Y);function x(){const o=G(),w=process.env.HOST??"127.0.0.1",d=process.env.PORT??8082;o.use(G.json());const n=j(process.argv.slice(2)).debug,c=o.listen(8082,async()=>{await I();const l=setInterval(async()=>{(await F())?.connected&&(clearInterval(l),n&&console.log("Browser listening at 127.0.0.1:9222"),await N())},1e3);n&&console.log(`Server listening at ${w}:${d}`)}),e=()=>(c.close(async l=>{const a=await K();n&&(console.log(a),console.log("server closed")),process.exit(l?1:0)}),{status:"shutdown"});return o.get("/server",(l,a)=>{try{a.send({running:!0})}catch(r){a.send(r)}}),o.post("/browser/launch",async(l,a)=>{try{const r=await I();a.send({browser:r})}catch(r){a.send(r)}}),o.post("/browser/open",async(l,a)=>{try{const{url:r}=l?.body??{},b=await M(r);a.send({browser:b})}catch(r){a.send(r)}}),o.get("/cookie",async(l,a)=>{try{const r=await S();a.send({cookie:r})}catch(r){a.send(r)}}),o.get("/cookie/save",async(l,a)=>{try{const r=await N();a.send({cookie:r})}catch(r){a.send(r)}}),o.post("/browser/close",async(l,a)=>{try{const r=await y();a.send({browser:r})}catch(r){a.send(r)}}),o.post("/server/shutdown",(l,a)=>{try{const r=e();a.send({server:r})}catch(r){a.send(r)}}),process.on("SIGINT",e),process.on("SIGTERM",e),o}export{S as a,N as b,y as c,F as g,I as l,M as o,x as r,K as s};