UNPKG

2.01 kBJavaScriptView Raw
1/*
2 * Copyright 2012-2015 the original author or authors
3 * @license MIT, see LICENSE.txt for details
4 *
5 * @author Jeremy Grelle
6 * @author Scott Andrews
7 */
8
9(function (define) {
10 'use strict';
11
12 define(function (require) {
13
14 var interceptor, when;
15
16 interceptor = require('../interceptor');
17 when = require('when');
18
19 /**
20 * Cancels a request if it takes longer then the timeout value.
21 *
22 * @param {Client} [client] client to wrap
23 * @param {number} [config.timeout=0] duration in milliseconds before canceling the request. Non-positive values disable the timeout
24 * @param {boolean} [config.transient=false] if true, timed out requests will not be marked as canceled so that it may be retried
25 *
26 * @returns {Client}
27 */
28 return interceptor({
29 init: function (config) {
30 config.timeout = config.timeout || 0;
31 config.transient = !!config.transient;
32 return config;
33 },
34 request: function (request, config) {
35 var timeout, abortTrigger, transient;
36 timeout = 'timeout' in request ? request.timeout : config.timeout;
37 transient = 'transient' in request ? request.transient : config.transient;
38 if (timeout <= 0) {
39 return request;
40 }
41 abortTrigger = when.defer();
42 this.timeout = setTimeout(function () {
43 abortTrigger.reject({ request: request, error: 'timeout' });
44 if (request.cancel) {
45 request.cancel();
46 if (transient) {
47 // unmark request as canceled for future requests
48 request.canceled = false;
49 }
50 }
51 else if (!transient) {
52 request.canceled = true;
53 }
54 }, timeout);
55 return new interceptor.ComplexRequest({ request: request, abort: abortTrigger.promise });
56 },
57 response: function (response) {
58 if (this.timeout) {
59 clearTimeout(this.timeout);
60 delete this.timeout;
61 }
62 return response;
63 }
64 });
65
66 });
67
68}(
69 typeof define === 'function' && define.amd ? define : function (factory) { module.exports = factory(require); }
70 // Boilerplate for AMD and Node
71));