mojax
Version:
extendable ajax request module
221 lines (166 loc) • 8.5 kB
Markdown
# Getting started
**mojax** is a modular AJAX utility. It's built to be extended via middleware, allowing you to customize your ajax tool to your needs.
1. add mojax as a dependency to your project: `npm install mojax --save`
2. require mojax in your code: `var mojax = require("mojax");`
3. create the mojax instance you'll be using to make your HTTP requests: `var r = mojax.createRequester();`
From there you can add middleware, with the `use()` method, or make HTTP requests with the `req()` method.
## How mojax uses middleware
Middleware are used to manipulate the request parameters **before** the actual HTTP request is started.
When you add middleware to a **requester** (`requester.use()`), the middleware function gets added to an internal queue.
Every time you make a request, the request parameters you have provided are piped through each middleware.
Each middleware **must return the request parameters object** for the next middleware to be called. Not returning the request parameters object
(i.e. returning `null` or `undefined`) is how you can cancel a request.
The mojax request method respects the following flow:
1. make a request: `req(params);`
2. your request parameters are *piped* through each middleware
3. the middleware transform your request parameters
4. the final (*transformed*) request parameters are used to send the HTTP request
5. the HTTP request triggers callbacks, based on its progress
### Creating middleware
Middleware is just a function that is provided an `object` argument. It is expected to manipulate the object, and return it.
The code below adds a timeout value of `5000 ms` to every request sent with `r.req()`:
```js
// creating my requester
var r = mojax.createRequester();
// my middleware
function addTimeout(params) {
// add timeout to all requests
params.timeout = 5000;
return params;
}
// adding the middle ware to my requester
r.use(addTimeout);
```
--------
## Modules
<dl>
<dt><a href="#module_mojax">mojax</a></dt>
<dd><p>mojax module</p>
</dd>
</dl>
## Functions
<dl>
<dt><a href="#chainAddons">chainAddons(addons, params)</a> ⇒ <code>object</code> | <code>undefined</code> ℗</dt>
<dd></dd>
<dt><a href="#finalizeParams">finalizeParams(c)</a> ℗</dt>
<dd></dd>
<dt><a href="#mapCallbacks">mapCallbacks(v)</a> ⇒ <code>Array.<function()></code> | <code>array</code> ℗</dt>
<dd></dd>
<dt><a href="#parseResponse">parseResponse(xhr)</a> ⇒ <code>object</code> | <code>string</code> ℗</dt>
<dd></dd>
<dt><a href="#parseXML">parseXML(data)</a> ⇒ <code>xml</code> ℗</dt>
<dd></dd>
<dt><a href="#responseListener">responseListener(xhr, c)</a> ℗</dt>
<dd></dd>
<dt><a href="#xhrFactory">xhrFactory(c)</a> ⇒ <code>object</code> | <code>undefined</code> ℗</dt>
<dd></dd>
</dl>
## Typedefs
<dl>
<dt><a href="#requester">requester</a> : <code>object</code></dt>
<dd></dd>
</dl>
<a name="module_mojax"></a>
## mojax
mojax module
<a name="module_mojax.createRequester"></a>
### mojax.createRequester() ⇒ <code>[requester](#requester)</code>
**Kind**: static method of <code>[mojax](#module_mojax)</code>
**Summary**: creates a requester instance, which can be extended with middleware/addons,
and from which HTTP requests can be dispatched
**Access:** public
<a name="chainAddons"></a>
## chainAddons(addons, params) ⇒ <code>object</code> | <code>undefined</code> ℗
**Kind**: global function
**Summary**: simplified middleware pipe
**Access:** private
| Param | Type | Description |
| --- | --- | --- |
| addons | <code>Array.<function()></code> | array of middleware used by the requester object |
| params | <code>object</code> | configuration object of the request being made |
<a name="finalizeParams"></a>
## finalizeParams(c) ℗
**Kind**: global function
**Summary**: enforces required properties of the request configuration object.
**Access:** private
| Param | Type | Description |
| --- | --- | --- |
| c | <code>object</code> | request configuration object |
<a name="mapCallbacks"></a>
## mapCallbacks(v) ⇒ <code>Array.<function()></code> | <code>array</code> ℗
**Kind**: global function
**Summary**: Maps a function to an array containing the function, otherwise returns an empty array.
**Returns**: <code>Array.<function()></code> | <code>array</code> - - array of functions or empty array
**Access:** private
| Param | Type | Description |
| --- | --- | --- |
| v | <code>function</code> | <code>Array.<function()></code> | <code>undefined</code> | initial value to map to an array |
<a name="parseResponse"></a>
## parseResponse(xhr) ⇒ <code>object</code> | <code>string</code> ℗
**Kind**: global function
**Summary**: parses the response data based on provided responseType
**Access:** private
| Param | Type | Description |
| --- | --- | --- |
| xhr | <code>object</code> | XMLHttpRequest object |
<a name="parseXML"></a>
## parseXML(data) ⇒ <code>xml</code> ℗
**Kind**: global function
**Summary**: Parses XML string content
**Access:** private
**Author:** jQuery
**License**: https://github.com/jquery/jquery/blob/master/LICENSE.txt
**Copyright**: jQuery foundation
| Param | Type | Description |
| --- | --- | --- |
| data | <code>string</code> | content |
<a name="responseListener"></a>
## responseListener(xhr, c) ℗
**Kind**: global function
**Summary**: triggers provided listeners based on state of XMLHttpRequest.
**Access:** private
| Param | Type | Description |
| --- | --- | --- |
| xhr | <code>object</code> | XMLHttpRequest instance of the request |
| c | <code>object</code> | configuration object |
<a name="xhrFactory"></a>
## xhrFactory(c) ⇒ <code>object</code> | <code>undefined</code> ℗
**Kind**: global function
**Summary**: creates a XMLHttpRequest instance, builds it according to the provided params, executes the XMLHttpRequest
**Returns**: <code>object</code> | <code>undefined</code> - XMLHttpRequest instance
**Access:** private
| Param | Type | Description |
| --- | --- | --- |
| c | <code>object</code> | request configuration hash |
<a name="requester"></a>
## requester : <code>object</code>
**Kind**: global typedef
**Summary**: environment/interface used to add middleware and make HTTP requests
* [requester](#requester) : <code>object</code>
* [.use(fn)](#requester+use) ⇒ <code>object</code>
* [.req(params)](#requester+req)
<a name="requester+use"></a>
### requester.use(fn) ⇒ <code>object</code>
**Kind**: instance method of <code>[requester](#requester)</code>
**Summary**: adds a middleware function to the requester pipeline
**Returns**: <code>object</code> - this
| Param | Type | Description |
| --- | --- | --- |
| fn | <code>function</code> | middleware function to add to the requester's request pipeline |
<a name="requester+req"></a>
### requester.req(params)
**Kind**: instance method of <code>[requester](#requester)</code>
**Summary**: starts an async HTTP request, passing the configuration object through the middleware pipeline, and finally sending the request
| Param | Type | Default | Description |
| --- | --- | --- | --- |
| params | <code>object</code> | | configuration object used for the request |
| params.url | <code>string</code> | | URL used as the HTTP request target |
| params.method | <code>string</code> | | GET, POST, PUT, DELETE |
| [params.responseType] | <code>string</code> | <code>"text"</code> | json, text, xml, text/xml, text/html, arraybuffer, blob |
| [params.headers] | <code>object</code> | <code>{X-Requested-With:XMLHttpRequest}</code> | request headers |
| [params.data] | <code>string</code> | | data to send on POST or PUT request |
| [params.onSuccess] | <code>function</code> | <code>Array.<function()></code> | | callbacks triggered on successful request completion |
| [params.onFailure] | <code>function</code> | <code>Array.<function()></code> | | callbacks triggered on failed request completion |
| [params.onHeaders] | <code>function</code> | <code>Array.<function()></code> | | callbacks triggered when response headers are received from server |
| [params.onOpen] | <code>function</code> | <code>Array.<function()></code> | | callbacks triggered when request is opened |
| [params.timeout] | <code>number</code> | | sets the timeout value of the underlying XMLHttpRequest object (if supported) |