jsreport now supports the third strategy for running scripts and helpers. Just to remind you the strategy is specified in the tasks.strategy
option and the first two are:
dedicated-process
(default) - run each script and template compilation in dedicated node process and communicate with the main one through node messageshttp-server
- avoid starting node processes over and over and rather reuse them, this is provided through multiple worker processes communicating with the main one through http callsThe third one which is now provided in the latest jsreport release is called in-process
and the name says pretty much everything. It simply runs the scripts and helpers directly in the same process as everything else. This has three benefits.
The first and second benefits are quite obvious, but the third one is more interesting. If jsreport needs to pass helpers to the external process it always need to send it as string, there is no other way and that is why you cannot use jsreport node.js API with your local functions. However with in-process
strategy it is possible to pass javascript object with helpers directly to the render
method and it will work.
var jsreport = require(jsreport);
jsreport.render({
template: {
content: '{{:~foo()}}',
helpers: {
foo: function() {
return 'Yes, we can!'
}
},
engine: 'jsrender',
recipe: 'phantom-pdf'
}
})
When this is so simple and so good why is this not provided since the start? Because this strategy is NOT SECURE for running users' custom report templates. If a helper contains an infinite loop and you use in-process
strategy jsreport just completely freezes and the process restart is required. Keep this in mind and use this strategy only when you are sure the report templates are safe and well written.