Sfoglia il codice sorgente

Re-factor server for simplicity and correctness

George S. Baugh 5 anni fa
parent
commit
33a4c3c81e
6 ha cambiato i file con 21 aggiunte e 59 eliminazioni
  1. 13 50
      bin/playwright.js
  2. 2 3
      example.pl
  3. 3 3
      lib/Playwright.pm
  4. 1 1
      lib/Playwright/Frame.pm
  5. 1 1
      lib/Playwright/Page.pm
  6. 1 1
      lib/Playwright/Response.pm

+ 13 - 50
bin/playwright.js

@@ -58,29 +58,25 @@ const argv = yargs
 const app = express();
 const port = argv.port || 6969;
 
-var browser;
-var pages = {};
-var responses = {};
-var frames = {};
+var objects = {};
 
 app.use(express.json())
 
 app.get('/session', async (req, res) => {
     if (argv._.includes('firefox')) {
-        browser = await firefox.launch( { "headless" : !argv.visible } );
+        objects.browser = await firefox.launch( { "headless" : !argv.visible } );
     }
     if (argv._.includes('chrome')) {
-        browser = await chromium.launch( { "headless" : !argv.visible } );
+        objects.browser = await chromium.launch( { "headless" : !argv.visible } );
     }
     if (argv._.includes('webkit')) {
-        browser = await webkit.launch( { "headless" : !argv.visible } );
+        objects.browser = await webkit.launch( { "headless" : !argv.visible } );
     }
 
-    if (!browser) {
+    if (!objects.browser) {
         console.log('no browser selected, begone');
         process.exit(1);
     }
-    pages.default = await browser.newPage();
 
     if (argv.debug) {
         console.log('Browser Ready for use');
@@ -91,57 +87,24 @@ app.get('/session', async (req, res) => {
 app.post('/command', async (req, res) => {
 
 	var payload = req.body;
-    var page    = payload.page;
-    var resp    = payload.result;
-    var frame   = payload.frame;
+    var type    = payload.type;
+    var object  = payload.object;
     var command = payload.command;
     var args    = payload.args || [];
 
     var result = {};
 
-    if (pages[page] && spec.Page.members[command]) {
-        // Operate on the provided page
+    if (objects[object] && spec[type] && spec[type].members[command]) {
         try {
-            const res = await pages[page][command](...args);
+            const res = await objects[object][command](...args);
             result = { error : false, message : res };
 
-            if (res._type === 'Response') {
-                responses[res._guid] = res;
-            }
-            if (res._type === 'Frame') {
-                frames[res._guid] = res;
+            if (res._guid) {
+                objects[res._guid] = res;
             }
         } catch (e) {
             result = { error : true, message : e.message };
         }
-
-    } else if ( responses[resp] && spec.Response.members[command]) {
-        try {
-            const res = await responses[resp][command](...args);
-            result = { error : false, message : res };
-        } catch (e) {
-            result = { error : true, message : e.message };
-        }
-    } else if ( frames[frame] && spec.Frame.members[command]) {
-        try {
-            const res = await responses[resp][command](...args);
-            result = { error : false, message : res };
-        } catch (e) {
-            result = { error : true, message : e.message };
-        }
-    } else if ( spec.Browser.members[command] || spec.BrowserContext.members[command] ) {
-        try {
-            const res = await browser[command](...args);
-            result = { error : false, message : res };
-
-            if (command == 'newPage') {
-                pages[res._guid] = res;
-            }
-
-        } catch (e) {
-            result = { error : true, message : e.message };
-        }
-
     } else {
         result = { error : true, message : "No such object, or " + command + " is not a globally recognized command for puppeteer" };
     }
@@ -150,8 +113,8 @@ app.post('/command', async (req, res) => {
 });
 
 app.get('/shutdown', async (req, res) => {
-    if (browser) {
-        await browser.close();
+    if (objects.browser) {
+        await objects.browser.close();
     }
     res.json( { error: false, message : "Sent kill signal to browser" });
     process.exit(0);

+ 2 - 3
example.pl

@@ -4,10 +4,9 @@ use warnings;
 use Data::Dumper;
 use Playwright;
 
-my ($browser,$page) = Playwright->new( browser => 'chrome', visible => 1 );
-
+my ($browser) = Playwright->new( browser => 'chrome', visible => 1 );
+my $page = $browser->newPage();
 my $res = $page->goto('http://google.com', { waitUntil => 'networkidle' });
 print Dumper($res->status(), $browser->version());
 my $frameset = $page->mainFrame();
-print Dumper($frameset->{guid});
 print Dumper($frameset->childFrames());

+ 3 - 3
lib/Playwright.pm

@@ -72,7 +72,7 @@ my %transmogrify = (
     Page   => sub { 
         my ($self, $res) = @_;
         require Playwright::Page;
-        return Playwright::Page->new(   browser => $self, id => $res->{_guid} );
+        return Playwright::Page->new( browser => $self, id => $res->{_guid} );
     },
 );
 
@@ -92,7 +92,7 @@ BEGIN {
     # Install the subroutines if they aren't already
     foreach my $method (keys(%class_spec)) {
         Sub::Install::install_sub({
-            code => sub { _request(shift, \%transmogrify, args => [@_], command => $method ) },
+            code => sub { _request(shift, \%transmogrify, args => [@_], command => $method, type => 'Browser', object => 'browser' ) },
             as   => $method,
         });
     }
@@ -118,7 +118,7 @@ sub new ($class, %options) {
     }, $class);
 
     $self->_request( \%transmogrify, url => 'session' );
-    return ($self, Playwright::Page->new( browser => $self, id => 'default' ));
+    return $self;
 }
 
 =head1 METHODS

+ 1 - 1
lib/Playwright/Frame.pm

@@ -74,7 +74,7 @@ sub new ($class, %options) {
         Sub::Install::install_sub({
             code => sub {
                 my $self = shift;
-                $self->{browser}->_request( \%transmogrify, args => [@_], command => $method, frame => $self->{guid} )
+                $self->{browser}->_request( \%transmogrify, args => [@_], command => $method, object => $self->{guid}, type => 'Frame' )
             },
             as   => $method,
         }) unless $self->can($method);

+ 1 - 1
lib/Playwright/Page.pm

@@ -74,7 +74,7 @@ sub new ($class, %options) {
         Sub::Install::install_sub({
             code => sub { 
                 my $self = shift;
-                $self->{browser}->_request( \%transmogrify, args => [@_], command => $method, page => $self->{guid} )
+                $self->{browser}->_request( \%transmogrify, args => [@_], command => $method, object => $self->{guid}, type => 'Page' )
             },
             as   => $method,
         }) unless $self->can($method);

+ 1 - 1
lib/Playwright/Response.pm

@@ -56,7 +56,7 @@ sub new ($class, %options) {
         Sub::Install::install_sub({
             code => sub {
                 my $self = shift;
-                $self->{browser}->_request( undef, args => [@_], command => $method, result => $self->{guid} );
+                $self->{browser}->_request( undef, args => [@_], command => $method, object => $self->{guid}, type => 'Response' );
             },
             as   => $method,
         }) unless $self->can($method);