!7 cm PlaywrightModule > DynPrintLogAndEnabled { transient autoDispose new Borrowable sharedBrowser; start-thread { time "Chromium preloaded" { sharedBrowser.set(playwrightWithChromium()); } } // borrow or create temporarily PlaywrightAndBrowser acquireBrowser(IResourceHolder res) { var borrowedBrowser = res.add(sharedBrowser.tempBorrow()); var browser = borrowedBrowser!; if (browser == null) browser = res.add(tempPlaywrightWithChromium()); else print("Using borrowed browser"); ret browser; } // API WithURL youTubeSearch(S query) { try { printFunctionCall youTubeSearch(query); temp res = resourceHolder(); var browser = acquireBrowser(res); ret print(result := main youTubeSearch(browser!, query)); } on fail e { printStackTrace(e); } } WithURL googleSearch(S query) { ret first(googleSearch_all(query)); } L> googleSearch_all(S query, MapSO urlParams default null) { try { printFunctionCall googleSearch(query); temp res = resourceHolder(); var browser = acquireBrowser(res); GoogleSearch gs = new(browser!, query); addAll(gs.urlParams, urlParams); ret print(result := main googleSearch_all(gs)); } on fail e { printStackTrace(e); } } }