Nashorn Polyfill
This is the polyfill for Nashorn:
- global, window, self, console, process
- Blob
- setTimeout, clearTimeout, setInterval, clearInterval
- URLSearchParams
- XmlHttpRequest
- core-js:shim
Missing polyfill:
- FormData
Variable injected in ScriptContext
Required
__NASHORN_POLYFILL_TIMER__
instance of ScheduledExecutorService.
Sample:
static ScheduledExecutorService globalScheduledThreadPool = Executors.newScheduledThreadPool(20);
// Injection of __NASHORN_POLYFILL_TIMER__ in ScriptContext
sc.setAttribute("__NASHORN_POLYFILL_TIMER__", globalScheduledThreadPool, ScriptContext.ENGINE_SCOPE);
Optional
__HTTP_SERVLET_REQUEST__
The HttpServletRequest instance. If this variable injected, XmlHttpRequest polyfill will copy Cookie
and Authorization
headers of HttpServletRequest, so that AJAX call from Javascript application will act like user session fired from browser.
If more headers want to be copied, it is easy to customize it in xml-http-request-polyfill line 92.
Required Java Jars:
gradle
compile group: 'org.apache.httpcomponents', name: 'httpclient', version: '4.5.2'
compile group: 'org.apache.httpcomponents', name: 'httpasyncclient', version: '4.1.2'
compile group: 'org.apache.commons', name: 'commons-pool2', version: '2.4.2'
Important Notes
In https://github.com/morungos/java-xmlhttprequest, it uses Timer
to run setTimeout
and setInterval
task, but they are run in a separate thread of the Timer
creates that is different with the main JavaScript thread.
This implementation uses ScheduledExecutorService
instead of Timer
so the threads for task scheduling can be reused instead of each JavasScript thread create a Timer
thread when using Timer
.
And most important thing is this adds global.nashornEventLoop
and scheduled tasks only add function callback object in eventLoop (ArrayQueue), and it is main JavaScript thread to run these function callback by calling global.nashornEventLoop.process();
at the end of JavaScript Application. It is just like browser or NodeJS that event loop is called when the main stack is cleared.
When runs on server with Promise, remember to call nashornEventLoop.process()
when waiting for Promise by Thread.sleep(), and call nashornEventLoop.reset()
if server thread (e.g. Servlet thread) decides to be timeout so that eventLoop will be clean for next request.
Link
Product Demo: This is demo of a product with react, react-router, apollo (GraphQL client)
Moqui React SSR Demo:
This demo shows how react app is rendered on server side. The code playing with Nashorn Script Engine sits in Moqui React SSR which is easy to extract to be used in any Java application.