spas
Version:
spas is a pragmatic tool for bundling multiple API requests into a single request/response for the end user. spas throttles, caches, parses, filters, concatenates and minifies API responses. It serves them all up in one tidy little package resulting in fe
89 lines (77 loc) • 22 kB
HTML
<html> <head> <title>little-spas.js</title> <meta http-equiv="content-type" content="text/html; charset=UTF-8"> <link rel="stylesheet" media="all" href="docco.css" /> </head> <body> <div id="container"> <div id="background"></div> <table cellpadding="0" cellspacing="0"> <thead> <tr> <th class="docs"> <h1> little-spas.js </h1> </th> <th class="code"> </th> </tr> </thead> <tbody> <tr id="section-1"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-1">¶</a> </div> </td> <td class="code"> <div class="highlight"><pre><span class="cm">/*</span>
<span class="cm">The MIT License (MIT)</span>
<span class="cm">Copyright (c) 2012 Donovan Buck</span>
<span class="cm">Permission is hereby granted, free of charge, to any person obtaining a copy of this</span>
<span class="cm">software and associated documentation files (the "Software"), to deal in the Software</span>
<span class="cm">without restriction, including without limitation the rights to use, copy, modify,</span>
<span class="cm">merge, publish, distribute, sublicense, and/or sell copies of the Software, and to</span>
<span class="cm">permit persons to whom the Software is furnished to do so, subject to the following</span>
<span class="cm">conditions:</span>
<span class="cm">The above copyright notice and this permission notice shall be included in all copies</span>
<span class="cm">or substantial portions of the Software.</span>
<span class="cm">THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,</span>
<span class="cm">INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A</span>
<span class="cm">PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT</span>
<span class="cm">HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF</span>
<span class="cm">CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE</span>
<span class="cm">OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.</span>
<span class="cm">*/</span></pre></div> </td> </tr> <tr id="section-2"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-2">¶</a> </div> <h2>Module dependencies.</h2> </td> <td class="code"> <div class="highlight"><pre><span class="kd">var</span> </pre></div> </td> </tr> <tr id="section-3"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-3">¶</a> </div> <p>Built in modules</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nx">http</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">'http'</span><span class="p">)</span>
<span class="p">,</span> <span class="nx">url</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">'url'</span><span class="p">)</span>
<span class="p">,</span> <span class="nx">querystring</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">'querystring'</span><span class="p">)</span>
<span class="p">,</span> <span class="nx">fs</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">'fs'</span><span class="p">)</span>
<span class="p">,</span> <span class="nx">spawn</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">'child_process'</span><span class="p">).</span><span class="nx">spawn</span>
</pre></div> </td> </tr> <tr id="section-4"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-4">¶</a> </div> <p>My modules</p> </td> <td class="code"> <div class="highlight"><pre> <span class="p">,</span> <span class="nx">bundles</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">'./bundles'</span><span class="p">)</span>
<span class="p">,</span> <span class="nx">engine</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">'./lib/engine'</span><span class="p">)</span>
<span class="p">,</span> <span class="nx">oauth2</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">'./lib/oauth2'</span><span class="p">)</span>
</pre></div> </td> </tr> <tr id="section-5"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-5">¶</a> </div> <p>Other Dependencies</p> </td> <td class="code"> <div class="highlight"><pre> <span class="p">,</span> <span class="nx">nconf</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">'nconf'</span><span class="p">)</span>
<span class="p">,</span> <span class="nx">director</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">'director'</span><span class="p">)</span>
<span class="p">,</span> <span class="nx">_</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">'underscore'</span><span class="p">).</span><span class="nx">_</span>
<span class="p">,</span> <span class="nx">cronJob</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s2">"cron"</span><span class="p">).</span><span class="nx">CronJob</span>
<span class="p">;</span></pre></div> </td> </tr> <tr id="section-6"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-6">¶</a> </div> <p>Use nconf to grab commandline params and read config.json</p> </td> <td class="code"> <div class="highlight"><pre><span class="nx">nconf</span><span class="p">.</span><span class="nx">argv</span><span class="p">().</span><span class="nx">file</span><span class="p">({</span> <span class="nx">file</span><span class="o">:</span> <span class="s1">'config.json'</span> <span class="p">});</span></pre></div> </td> </tr> <tr id="section-7"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-7">¶</a> </div> <p>If --dev is passed use the development config section</p> </td> <td class="code"> <div class="highlight"><pre><span class="kd">var</span> <span class="nx">config</span> <span class="o">=</span> <span class="nx">nconf</span><span class="p">.</span><span class="nx">get</span><span class="p">(</span><span class="s1">'dev'</span><span class="p">)</span> <span class="o">?</span> <span class="nx">nconf</span><span class="p">.</span><span class="nx">get</span><span class="p">(</span><span class="s1">'development'</span><span class="p">)</span> <span class="o">:</span> <span class="nx">nconf</span><span class="p">.</span><span class="nx">get</span><span class="p">(</span><span class="s1">'live'</span><span class="p">);</span></pre></div> </td> </tr> <tr id="section-8"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-8">¶</a> </div> <h2>Run little-spas as a service</h2> </td> <td class="code"> <div class="highlight"><pre><span class="k">if</span> <span class="p">(</span><span class="nx">nconf</span><span class="p">.</span><span class="nx">get</span><span class="p">(</span><span class="s1">'service'</span><span class="p">))</span> <span class="p">{</span></pre></div> </td> </tr> <tr id="section-9"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-9">¶</a> </div> <p>Specify output and error log files</p> </td> <td class="code"> <div class="highlight"><pre> <span class="kd">var</span> <span class="nx">out</span> <span class="o">=</span> <span class="nx">fs</span><span class="p">.</span><span class="nx">openSync</span><span class="p">(</span><span class="s1">'./logs/spasout.log'</span><span class="p">,</span> <span class="s1">'a'</span><span class="p">),</span>
<span class="nx">err</span> <span class="o">=</span> <span class="nx">fs</span><span class="p">.</span><span class="nx">openSync</span><span class="p">(</span><span class="s1">'./logs/spaserr.log'</span><span class="p">,</span> <span class="s1">'a'</span><span class="p">);</span>
</pre></div> </td> </tr> <tr id="section-10"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-10">¶</a> </div> <p>Spawn the process</p> </td> <td class="code"> <div class="highlight"><pre> <span class="kd">var</span> <span class="nx">spasService</span> <span class="o">=</span> <span class="nx">spawn</span><span class="p">(</span><span class="s1">'node'</span><span class="p">,</span> <span class="p">[</span><span class="s1">'little-spas'</span><span class="p">,</span> <span class="nx">nconf</span><span class="p">.</span><span class="nx">get</span><span class="p">(</span><span class="s1">'dev'</span><span class="p">)</span> <span class="o">?</span> <span class="s1">'--dev'</span> <span class="o">:</span> <span class="s1">''</span><span class="p">],</span> <span class="p">{</span>
<span class="nx">detached</span><span class="o">:</span> <span class="kc">true</span><span class="p">,</span>
<span class="nx">stdio</span><span class="o">:</span> <span class="p">[</span> <span class="s1">'ignore'</span><span class="p">,</span> <span class="nx">out</span><span class="p">,</span> <span class="nx">err</span> <span class="p">]</span>
<span class="p">});</span>
<span class="nx">spasService</span><span class="p">.</span><span class="nx">unref</span><span class="p">();</span>
<span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s2">"little-spas is listening on port "</span> <span class="o">+</span> <span class="nx">config</span><span class="p">.</span><span class="nx">port</span><span class="p">);</span>
<span class="nx">process</span><span class="p">.</span><span class="nx">exit</span><span class="p">();</span>
<span class="p">}</span> <span class="k">else</span> <span class="p">{</span></pre></div> </td> </tr> <tr id="section-11"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-11">¶</a> </div> <h2>Our Routes</h2> </td> <td class="code"> <div class="highlight"><pre> <span class="kd">var</span> <span class="nx">router</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">director</span><span class="p">.</span><span class="nx">http</span><span class="p">.</span><span class="nx">Router</span><span class="p">({</span>
</pre></div> </td> </tr> <tr id="section-12"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-12">¶</a> </div> <p>This is the return route for authentication services</p> </td> <td class="code"> <div class="highlight"><pre> <span class="s1">'/auth'</span><span class="o">:</span> <span class="p">{</span>
<span class="nx">get</span><span class="o">:</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
<span class="k">if</span> <span class="p">(</span><span class="nx">_</span><span class="p">.</span><span class="nx">has</span><span class="p">(</span><span class="nx">querystring</span><span class="p">.</span><span class="nx">parse</span><span class="p">((</span><span class="nx">url</span><span class="p">.</span><span class="nx">parse</span><span class="p">(</span><span class="k">this</span><span class="p">.</span><span class="nx">req</span><span class="p">.</span><span class="nx">url</span><span class="p">).</span><span class="nx">query</span><span class="p">)),</span> <span class="s1">'code'</span><span class="p">))</span> <span class="p">{</span>
<span class="nx">oauth2</span><span class="p">.</span><span class="nx">saveCode</span> <span class="p">(</span> <span class="k">this</span><span class="p">.</span><span class="nx">res</span><span class="p">,</span> <span class="nx">querystring</span><span class="p">.</span><span class="nx">parse</span><span class="p">((</span><span class="nx">url</span><span class="p">.</span><span class="nx">parse</span><span class="p">(</span><span class="k">this</span><span class="p">.</span><span class="nx">req</span><span class="p">.</span><span class="nx">url</span><span class="p">).</span><span class="nx">query</span><span class="p">)).</span><span class="nx">state</span><span class="p">.</span><span class="nx">split</span><span class="p">(</span><span class="s1">','</span><span class="p">),</span> <span class="nx">querystring</span><span class="p">.</span><span class="nx">parse</span><span class="p">((</span><span class="nx">url</span><span class="p">.</span><span class="nx">parse</span><span class="p">(</span><span class="k">this</span><span class="p">.</span><span class="nx">req</span><span class="p">.</span><span class="nx">url</span><span class="p">).</span><span class="nx">query</span><span class="p">)).</span><span class="nx">code</span><span class="p">);</span>
<span class="p">}</span>
<span class="p">}</span>
<span class="p">},</span>
</pre></div> </td> </tr> <tr id="section-13"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-13">¶</a> </div> <p>This route needs to be removed and changed to a command line call. Anybody could revoke creds right now</p> </td> <td class="code"> <div class="highlight"><pre> <span class="s1">'/revoke/:cred'</span><span class="o">:</span> <span class="p">{</span>
<span class="nx">get</span><span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">cred</span><span class="p">)</span> <span class="p">{</span>
<span class="nx">oauth2</span><span class="p">.</span><span class="nx">revoke</span> <span class="p">(</span> <span class="k">this</span><span class="p">.</span><span class="nx">res</span><span class="p">,</span> <span class="nx">cred</span> <span class="p">);</span>
<span class="p">}</span>
<span class="p">},</span>
</pre></div> </td> </tr> <tr id="section-14"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-14">¶</a> </div> <p>A bundle is being requested</p> </td> <td class="code"> <div class="highlight"><pre> <span class="s1">'/bundle/:bid'</span><span class="o">:</span> <span class="p">{</span>
<span class="nx">get</span><span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">bid</span><span class="p">)</span> <span class="p">{</span>
<span class="nx">engine</span><span class="p">.</span><span class="nx">fulfill</span> <span class="p">(</span> <span class="k">this</span><span class="p">.</span><span class="nx">res</span><span class="p">,</span> <span class="nx">bid</span><span class="p">,</span> <span class="nx">bundles</span><span class="p">[</span><span class="nx">bid</span><span class="p">],</span> <span class="nx">querystring</span><span class="p">.</span><span class="nx">parse</span><span class="p">((</span><span class="nx">url</span><span class="p">.</span><span class="nx">parse</span><span class="p">(</span><span class="k">this</span><span class="p">.</span><span class="nx">req</span><span class="p">.</span><span class="nx">url</span><span class="p">).</span><span class="nx">query</span><span class="p">)).</span><span class="nx">callback</span> <span class="p">);</span>
<span class="p">}</span>
<span class="p">}</span>
<span class="p">});</span>
</pre></div> </td> </tr> <tr id="section-15"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-15">¶</a> </div> <h3>Schedule jobs defined in bundles</h3> </td> <td class="code"> <div class="highlight"><pre> <span class="nx">_</span><span class="p">.</span><span class="nx">each</span><span class="p">(</span><span class="nx">bundles</span><span class="p">,</span> <span class="kd">function</span> <span class="p">(</span><span class="nx">bundle</span><span class="p">,</span> <span class="nx">bid</span><span class="p">)</span> <span class="p">{</span>
<span class="nx">_</span><span class="p">.</span><span class="nx">each</span><span class="p">(</span><span class="nx">bundle</span><span class="p">,</span> <span class="kd">function</span> <span class="p">(</span><span class="nx">api</span><span class="p">,</span> <span class="nx">key</span><span class="p">)</span> <span class="p">{</span>
<span class="k">if</span> <span class="p">(</span><span class="nx">api</span><span class="p">.</span><span class="nx">schedule</span><span class="p">)</span> <span class="p">{</span>
<span class="k">new</span> <span class="nx">cronJob</span><span class="p">(</span><span class="nx">api</span><span class="p">.</span><span class="nx">schedule</span><span class="p">,</span> <span class="kd">function</span><span class="p">(){</span>
<span class="nx">engine</span><span class="p">.</span><span class="nx">refresh</span><span class="p">(</span><span class="nx">api</span><span class="p">,</span> <span class="nx">key</span><span class="p">,</span> <span class="nx">bid</span><span class="p">,</span> <span class="nx">bundle</span><span class="p">);</span>
<span class="p">},</span> <span class="kc">null</span><span class="p">,</span> <span class="kc">true</span><span class="p">);</span>
<span class="p">}</span>
<span class="p">});</span>
<span class="p">});</span>
</pre></div> </td> </tr> <tr id="section-16"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-16">¶</a> </div> <h3>Create our server</h3> </td> <td class="code"> <div class="highlight"><pre> <span class="kd">var</span> <span class="nx">server</span> <span class="o">=</span> <span class="nx">http</span><span class="p">.</span><span class="nx">createServer</span><span class="p">(</span><span class="kd">function</span> <span class="p">(</span><span class="nx">req</span><span class="p">,</span> <span class="nx">res</span><span class="p">)</span> <span class="p">{</span>
<span class="nx">router</span><span class="p">.</span><span class="nx">dispatch</span><span class="p">(</span><span class="nx">req</span><span class="p">,</span> <span class="nx">res</span><span class="p">,</span> <span class="kd">function</span> <span class="p">(</span><span class="nx">err</span><span class="p">)</span> <span class="p">{</span>
<span class="k">if</span> <span class="p">(</span><span class="nx">err</span><span class="p">)</span> <span class="p">{</span>
<span class="nx">res</span><span class="p">.</span><span class="nx">writeHead</span><span class="p">(</span><span class="mi">404</span><span class="p">);</span>
<span class="nx">res</span><span class="p">.</span><span class="nx">end</span><span class="p">();</span>
<span class="p">}</span>
<span class="p">});</span>
<span class="p">});</span>
<span class="nx">server</span><span class="p">.</span><span class="nx">listen</span><span class="p">(</span><span class="nx">config</span><span class="p">.</span><span class="nx">port</span><span class="p">);</span>
<span class="p">}</span>
</pre></div> </td> </tr> </tbody> </table> </div> </body> </html>