Platforms
Narwhal is a standard library and tools for multiple JavaScript engines; each engine has its own “platform” library. Use tusk platform {name} to select an engine, or edit narwhal.conf. The following engines are presently in development:
rhino: is the default and most complete platform, based on Mozilla Rhino for Java, used for out-of-the-box functionality.k7: is av8based engine, in development by Sébastien Pierre.helma: is based on Rhino with extensions, being developed by Hannes Wallnöefer.xulrunner: is in development for Firefox extensions and XULRunner applications on the Spidermonkey platform by Irakli Gozalishvili, Christoph Dorn, and Zach Carter.jaxer: is an engine based on Mozilla SpiderMonkey, for deploying web pages with both server and client side scripts, being developed by Nathan L Smith.v8cgi: is based on the work of Ondrej Zara, and has not been updated in a long while.default: is a catchall platform that implements modules that can be shared among platforms.browser: will eventually be available for client side loading of modules with various techniques.secure: will eventually be available for dependency injection sandboxed module systems within some other platforms.
Creating new Platform Adapters
We have a template for new platforms at “platforms/template” that you can copy to “platforms/{name}” and fill in the blanks. These consist of:
-
An executable (shell script or binary) at “platforms/{name}/bin/platform-{name}” that executes the interpreter engine of choice and causes it to load a bootstrap script. This script will be loaded by “bin/narwhal” with the environment variable
NARWHAL_HOMEset to the Narwhal project directory andNARWHAL_PLATFORM_HOMEset to the platform directory. This script will be run ifNARWHAL_PLATFORMis set to your platform name. You can setNARWHAL_DEFAULT_PLATFORMorNARWHAL_PLATFORMin a “narwhal.conf” in your Narwhal project directory (template provided). -
A “thunk”, at
platforms/{name}/bootstrap.jsthat evaluatesnarwhal.jsand passes the returned function a preliminarysystemobject with a few required properties (global,evalGlobal,platform,platforms,print,evaluate,prefix,fs.read, andfs.isFile). This should be enough to get to an interactive console. -
Platform implementations for core modules, such as
fileandsystemlocated inplatforms/{name}/lib/. You can implementfile-platforminstead offileif you implement the subset of the ServerJS file API used bylib/file.js(and similar forio,os,binary, etc). The next steps are:-
system: You must implement
system.argsto be able to pass command line options to Narwhal. -
file: To enable the package system you must implement
list,canonical,mtime,isDirectory,isFile.
-