src/cm/media/js/lib/yui/yui3-3.15.0/build/io-nodejs/io-nodejs.js
author gibus
Mon, 10 Mar 2014 15:19:48 +0100
changeset 602 e16a97fb364a
permissions -rw-r--r--
Use YUI 3.15
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
602
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
     1
YUI.add('io-nodejs', function (Y, NAME) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
     2
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
     3
/*global Y: false, Buffer: false, clearInterval: false, clearTimeout: false, console: false, exports: false, global: false, module: false, process: false, querystring: false, require: false, setInterval: false, setTimeout: false, __filename: false, __dirname: false */
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
     4
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
     5
    * Node.js override for IO, methods are mixed into `Y.IO`
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
     6
    * @module io-nodejs
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
     7
    * @main io-nodejs
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
     8
    */
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
     9
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    10
    * Passthru to the NodeJS <a href="https://github.com/mikeal/request">request</a> module.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    11
    * This method is return of `require('request')` so you can use it inside NodeJS without
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    12
    * the IO abstraction.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    13
    * @method request
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    14
    * @static
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    15
    * @for IO
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    16
    */
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    17
    if (!Y.IO.request) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    18
        // Default Request's cookie jar to `false`. This way cookies will not be
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    19
        // maintained across requests.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    20
        Y.IO.request = require('request').defaults({jar: false});
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    21
    }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    22
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    23
    var codes = require('http').STATUS_CODES;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    24
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    25
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    26
    Flatten headers object
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    27
    @method flatten
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    28
    @protected
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    29
    @for IO
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    30
    @param {Object} o The headers object
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    31
    @return {String} The flattened headers object
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    32
    */
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    33
    var flatten = function(o) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    34
        var str = [];
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    35
        Object.keys(o).forEach(function(name) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    36
            str.push(name + ': ' + o[name]);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    37
        });
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    38
        return str.join('\n');
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    39
    };
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    40
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    41
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    42
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    43
    NodeJS IO transport, uses the NodeJS <a href="https://github.com/mikeal/request">request</a>
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    44
    module under the hood to perform all network IO.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    45
    @method transports.nodejs
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    46
    @for IO
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    47
    @static
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    48
    @return {Object} This object contains only a `send` method that accepts a
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    49
    `transaction object`, `uri` and the `config object`.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    50
    @example
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    51
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    52
        Y.io('https://somedomain.com/url', {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    53
            method: 'PUT',
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    54
            data: '?foo=bar',
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    55
            //Extra request module config options.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    56
            request: {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    57
                maxRedirects: 100,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    58
                strictSSL: true,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    59
                multipart: [
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    60
                    {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    61
                        'content-type': 'application/json',
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    62
                        body: JSON.stringify({
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    63
                            foo: 'bar',
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    64
                            _attachments: {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    65
                                'message.txt': {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    66
                                    follows: true,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    67
                                    length: 18,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    68
                                    'content_type': 'text/plain'
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    69
                                }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    70
                            }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    71
                        })
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    72
                    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    73
                    {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    74
                        body: 'I am an attachment'
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    75
                    }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    76
                ]
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    77
            },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    78
            on: {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    79
                success: function(id, e) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    80
                }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    81
            }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    82
        });
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    83
    */
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    84
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    85
    Y.IO.transports.nodejs = function() {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    86
        return {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    87
            send: function (transaction, uri, config) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    88
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    89
                config.notify('start', transaction, config);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    90
                config.method = config.method || 'GET';
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    91
                config.method = config.method.toUpperCase();
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    92
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    93
                var rconf = {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    94
                    method: config.method,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    95
                    uri: uri
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    96
                };
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    97
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    98
                if (config.data) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    99
                    if (Y.Lang.isString(config.data)) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   100
                        rconf.body = config.data;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   101
                    }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   102
                    if (rconf.body && rconf.method === 'GET') {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   103
                        rconf.uri += (rconf.uri.indexOf('?') > -1 ? '&' : '?') + rconf.body;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   104
                        rconf.body = '';
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   105
                    }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   106
                }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   107
                if (config.headers) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   108
                    rconf.headers = config.headers;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   109
                }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   110
                if (config.timeout) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   111
                    rconf.timeout = config.timeout;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   112
                }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   113
                if (config.request) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   114
                    Y.mix(rconf, config.request);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   115
                }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   116
                Y.IO.request(rconf, function(err, data) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   117
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   118
                    if (err) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   119
                        transaction.c = err;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   120
                        config.notify(((err.code === 'ETIMEDOUT') ? 'timeout' : 'failure'), transaction, config);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   121
                        return;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   122
                    }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   123
                    if (data) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   124
                        transaction.c = {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   125
                            status: data.statusCode,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   126
                            statusCode: data.statusCode,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   127
                            statusText: codes[data.statusCode],
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   128
                            headers: data.headers,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   129
                            responseText: data.body || '',
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   130
                            responseXML: null,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   131
                            getResponseHeader: function(name) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   132
                                return this.headers[name];
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   133
                            },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   134
                            getAllResponseHeaders: function() {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   135
                                return flatten(this.headers);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   136
                            }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   137
                        };
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   138
                    }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   139
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   140
                    config.notify('complete', transaction, config);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   141
                    config.notify(((data && (data.statusCode >= 200 && data.statusCode <= 299)) ? 'success' : 'failure'), transaction, config);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   142
                });
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   143
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   144
                var ret = {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   145
                    io: transaction
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   146
                };
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   147
                return ret;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   148
            }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   149
        };
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   150
    };
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   151
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   152
    Y.IO.defaultTransport('nodejs');
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   153
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   154
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   155
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   156
}, '@VERSION@', {"requires": ["io-base"]});