Skip to content

Latest commit

 

History

History
203 lines (149 loc) · 9.7 KB

notes.md

File metadata and controls

203 lines (149 loc) · 9.7 KB

[ Using - Building - 🦋 - Notes - Legal - Wiki ]

Misc. Notes on WebPerl

Links

Other places I've written about WebPerl:

Talks

DOI 10.5281/zenodo.1400490

"In the Press"

Prior Art

Several people have built microperl with Emscripten:

TODOs

  1. Testing

    • How to best disable individual tests that we know won't work? (qx etc.)
    • How to handle the many tests that call an external Perl?
      • patching t/test.pl's runperl() seems easiest at the moment, and we can use the iframe method from the IDE
    • Continue work on WebPerl.t
      • More tests for Unicode support (Perl/JS interface, Perl.eval(), plus Emscripten's virtual FS)
    • Focus on getting the tests running in the browser instead of node.js
    • How to best package tests?
      • If possible, a separate bundle, so that it can be loaded optionally and we don't need to rebuild
      • How does make test find and handle all the various modules' ts?
  2. Misc

    • Write up a full RPC example
    • Future
      • Would Future::AsyncAwait work in WebPerl? (Or maybe with a JS backend?)
      • Future::HTTP (probably just as a frontend to XHR?)
    • Improve Perl 6 integration
    • Investigate Emscripten's main loop concept for handling nonblocking sockets?
    • Use Multiplicity for re-starting perl? (Thanks to Nick Clark for the idea)
    • Add Regex::Debugger into regex tester? (Thanks to Renee for the idea)
    • Turn some patches from emperl5 into patches for P5P
    • Submit some patches to Emscripten
    • Add Perl.Util functions for making file uploads and downloads easier
      • Plus an example showing how to use it to run a "legacy" Perl script with inputs and output
    • There is some potential for restructuring:
      • Perl.glue() and Perl.dispatch() could go into WebPerl.xs (?)
      • Parts of webperl.js could go into common_preamble.js or WebPerl.xs, so that emperl.js is runnable on its own in a Web Worker (?) (see notes in perlrunner.html / e12f1aa25a000) → this might be interesting for running tests?!
      • nodeperl_dev_prerun.js could probably be merged into that as well
    • Could put a WebPerl stub on CPAN
      • In theory could write a WebPerl::Local that contains the WebPerl API, and have various drivers such as WebPerl::WebDriver or WebPerl::JSAny that runs the code given to WebPerl's js()...
    • Regarding the funky syntax highlighting on GitHub: atom/language-html#88 (comment)
  3. See Also

SSL

$ openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout selfsigned.key -out selfsigned.crt
...
Common Name (e.g. server FQDN or YOUR name) []: localhost
...
$ plackup --enable-ssl --ssl-key-file=selfsigned.key --ssl-cert-file=selfsigned.crt web/webperl.psgi
# then go to https://localhost:5000 and accept the certificate warning

Possible Improvements

  • More efficient JS/C/Perl glue
  • Test/Support sockets/WebSockets
    • for example, can we compile a DBD:: module to connect to a DB on the server?
  • A RPC module for communicating between client and server Perls
    • I think it's probably best to not have WebPerl prescribe a specific RPC mechanism, since there's a big variety and many are pretty simple to implement using e.g. jQuery
  • Support some of the Emscripten C API (like wget?)
  • Try to shrink the download size more (exclude more modules, ...?)

Limitations

  • Only works in browsers with WebAssembly support (asm.js requires aligned memory access, and Perl apparently has quite a few places with unaligned access)
  • 32-bit ints
  • No system, qx, fork, kill, wait, waitpid, threads, etc.
    • Theoretically, we could link in BusyBox to get a shell and utilities (??)
    • (system and qx support could theoretically be added by patching pp_system/pp_backtick in pp_sys.c)
  • No signals (except SIGALRM)
  • In the current configuration, exit is not supported, and therefore atexit handlers aren't supported (see discussion in Using WebPerl, and NO_EXIT_RUNTIME in the Emscripten documentation - currently it seems to make the most sense to build with NO_EXIT_RUNTIME=1)
  • Static linking, requires rebuild to add modules (Emscripten apparently only supports asm.js dynamic linking when dynamic memory growth is disabled, which is not very useful)

Release Checklist

  • Update Changes.md with all changes since last release

    As an example, to list changes since a specific version, excluding the regex tester:

    $ git log --stat v0.05-beta.. -- . ':!web/regex_tester.html' ':!.gitignore'
    
    • Also make sure that the documentation in using.md etc. mentions when features were added/deprecated
  • Update version numbers everywhere; use grep to find them, for example:

    $ grep -Er --exclude-dir=hostperl --exclude-dir=.git --exclude-dir=emperl5 --exclude=emperl.* '0\.[01][0-9]' .
    $ ( cd emperl5; grep -Er '0\.[01][0-9]' `git diff --numstat --diff-filter=ACMRT v5.28.1 HEAD | cut -f3` )
    

    At a minimum there is:

    • web/webperl.js - Perl.WebPerlVersion
    • emperl5/ext/WebPerl/lib/WebPerl.pm - $VERSION
    • pages/index.md and pages/using.md - download links
  • Update Subresource Integrity values as needed, e.g.:

    $ perl -wMstrict -MDigest::SRI=sri -le 'print sri "SHA-256","web/webperl.js"'
    
  • Build and create dist, e.g. build/build.pl --reconfig --dist=webperl_prebuilt_v0.07-beta

  • Test all build results, both from file://... and http://localhost

  • Add tags, the webperl repo gets an annotated tag such as v0.07-beta, and the emperl5 repo gets an unannotated tag such as webperl_v0.07-beta, then git push --tags

  • Create a release on GitHub and upload the webperl_prebuilt_*.zip as an asset

  • Uploading to AWS S3:

    1. for X in emperl.* webperl.js; do gzip -v -9 $X && mv -v $X.gz $X ; done
    2. Upload them with the appropriate Content-Type (see e.g. web/webperl.psgi) and a Content-Encoding of gzip
  • If there was a pages_for_vX.XX branch of gh-pages, don't forget to merge that


Copyright (c) 2018 Hauke Daempfling (haukex@zero-g.net) at the Leibniz Institute of Freshwater Ecology and Inland Fisheries (IGB), Berlin, Germany, http://www.igb-berlin.de

Please see the "Legal" page for details.


You can find the source for this page at https://github.com/haukex/webperl/blob/gh-pages/notes.md