mozilla

Compare Revisions

Securable Modules

Change Revisions

Revision 93401:

Revision 93401 by Petermichaux on

Revision 93402:

Revision 93402 by Kris.kowal on

Title:
Securable Modules
Securable Modules
Slug:
CommonJS/Modules/Securable_Modules
CommonJS/Modules/Securable_Modules
Content:

Revision 93401
Revision 93402
n8      This specification addresses how modules should be written n8      This page has been moved to&nbsp;<a class="link-https" href
>in order to be interoperable among a class of module systems that>="https://wiki.mozilla.org/ServerJS/Modules/SecurableModules" tit
> can be both client and server side, secure or insecure, implemen>le="https://wiki.mozilla.org/ServerJS/Modules/SecurableModules">h
>ted today or supported by future systems with syntax extensions.&>ttps://wiki.mozilla.org/ServerJS/Modules/SecurableModules</a>&nbs
>nbsp; These modules are offered privacy of their top scope, facil>p;
>ity for importing singleton objects from other modules, and expor 
>ting their own API. 
t10    <ul>t
11      <li>A module receives a "require" function.&nbsp; The "requ
>ire" function accepts a module identifier. &nbsp;"require" return 
>s an object containing the exported API&nbsp;of the foreign modul 
>e.&nbsp; If there is a dependency cycle, the foreign module may n 
>ot have finished executing at the time it is required by one of i 
>ts transitive dependencies; in this case, the object returned by  
>"require" must contain at least the exports that the foreign modu 
>le has prepared before the call to require that led to the curren 
>t module's execution.&nbsp; If the requested module cannot be ret 
>urned, "require" throws an error. 
12      </li>
13      <li>A module receives an "exports" object that it may add i
>ts exported API&nbsp;to as it executes. 
14      </li>
15      <li>Interoperable modules must use the exports object as th
>e only means of exporting, since an implementation may prevent ta 
>mpering with any other object shared among modules. 
16      </li>
17    </ul>
18    <p>
19      To be interoperable with secure environments, a module must
> satisfy the following additional constraints: 
20    </p>
21    <ul>
22      <li>A module must not have any free variables apart from pr
>imordials ("Object", "Array", etc.), "require", and "exports". 
23      </li>
24      <li>A module must not tamper with (assign to, assign to mem
>bers of, delete, or otherwise mutate) the transitive primordials, 
> the "require" object, or any object returned by "require". 
25      </li>
26    </ul>
27    <p>
28      This specification leaves the following important points of
> interoperability unspecified: 
29    </p>
30    <ul>
31      <li>The domain of module identifiers.
32      </li>
33      <li>Whether relative module identifiers are supported.
34      </li>
35      <li>Whether a PATH is supported by the module loader for re
>solving module identifiers. 
36      </li>
37    </ul>
38    <h3>
39      Sample code
40    </h3>
41    <pre>
42<code>// ========================================================
>==========<br>// source code ------------------------------------ 
>------------------<br><br>//<br>// math.js<br>//<br>export.add =  
>function() {<br>  var sum = arguments[0];<br>  for (var i=1; i&lt 
>;arguments.length; i++) {<br>    sum += arguments[i];   }<br>  re 
>turn sum;<br>};<br><br>//<br>// increment.js<br>//<br>var add = r 
>equire('math').add;<br>export.increment = function(val) {<br>  ad 
>d(val, 1);<br>};<br><br>//<br>// program.js<br>//<br>var inc = re 
>quire('increment').increment;<br>var a = 1;<br>inc(a); // 2<br><b 
>r><br>// ======================================================== 
>==========<br>// browser code in development<br><br>// locked int 
>o on of these options<br>//<br>//  1) using a special XHR synchro 
>nous script loader and    <br>//     less than ideal error messag 
>es with strange line numbering<br>//<br>//  2) edit-compile-load- 
>test cycle using the code below. Also<br>//     strange numbering 
> in error messages that does not match<br>//     source files. To 
>ols could make compile automatic but that<br>//     means tools a 
>re required and that is not the case in <br>//     the current br 
>owser scripting world.<br><br><br>// ============================ 
>======================================<br>// compiled for product 
>ion in browser<br><br>//<br>// library.js<br>//<br>var require =  
>(function() {<br>  <br>  // memoized export objects<br>  var expo 
>rtObjects = {}<br><br>  // don't want outsider redefining "requir 
>e" and don't want<br>  // to use arguments.callee so name the fun 
>ction here.<br>  var require = function(name) {<br>    if (export 
>sObject.hasOwnProperty(name)) {<br>      return exportsObject[nam 
>e];<br>    }<br>    var exports = {};<br>    // memoize before ex 
>ecuting module for cyclic dependencies<br>    exportsObject[name] 
> = exports;<br>    modules[name](require, exports);<br>    return 
> exports;<br>  };<br>  <br>  return require;<br>})();<br><br>var  
>run = function(name) {<br>  require(name); // doesn't return expo 
>rts<br>};<br><br>var modules = {};<br><br>//<br>// compiledModule 
>s.js<br>//<br>modules["math"] = function(require, exports) {<br>  
> export.add = function() {<br>    var sum = arguments[0];<br>     
> for (var i=1; i&lt;arguments.length; i++) {<br>           sum += 
> arguments[i];<br>      }<br>   return sum;<br>  };<br>};<br><br> 
>modules["increment"] = function(require, exports) {<br>  var add  
>= require('math').add;<br>  export.increment = function(val) {<br 
>>    add(val, 1);<br>  };<br>};<br><br>modules["program"] = funct 
>ion(require, exports) {<br>  var inc = requrie('increment').incre 
>ment;<br>  var a = 1;<br>  inc(a); // 2<br>};<br><br>//<br>// htm 
>l in document head<br>//<br>&lt;script src="library.js" type="tex 
>t/javascript"&gt;&lt;/script&gt;<br>&lt;script src="compiledModul 
>es.js" type="text/javascript"&gt;&lt;/script&gt;<br>&lt;script ty 
>pe="text/javascript"&gt;<br>  // You might not use use the window 
>.onload property<br>  // but rather addEventListener/attachEvent. 
><br>  window.onload = function() {     run("program");   };<br>&l 
>t;/script&gt;<br><br></code> 
43</pre>

Back to History