loop-protect
JS Bin's loop protection implementation as a reusable library.
This code protects use cases where user code includes an infinite loop using a while
, for
or do
loop.
Note that this does not solve the halting problem but simply rewrites JavaScript (using Babel's AST) wrapping loops with a conditional break. This also does not protect against recursive loops.
Example
With loop protection in place, it means that a user can enter the code as follows on JS Bin, and the final console.log
will still work.
The code is transformed from this:
while true ; console;
…to this:
let i = 0;var _LP = Date;while true if Date - _LP > 100 break; ; console;
Usage
The loop protection is a babel transform, so can be used on the server or in the client.
The previous implementation used an injected library to handle tracking loops - this version does not.
Example (client) implementation
;; const timeout = 100; // defaults to 100msBabel; const transform = Babelcode; // rewrite the user's JavaScript to protect loopsvar processed = ; // run in an iframe, and expose the loopProtect variable under a new namevar iframe = ; // append the iframe to allow our code to run as soon as .close is calleddocumentbody; // open the iframe and write the code to itvar win = iframecontentWindow;var doc = windocument;doc; doc;doc; // code now runs, and if there's an infinite loop, it's cleanly exited
Contributors
- Author: Remy Sharp
- All contributors