diff --git a/rest/rest-tests.ts b/rest/rest-tests.ts
index e5ca243d6..be3887246 100644
--- a/rest/rest-tests.ts
+++ b/rest/rest-tests.ts
@@ -1,5 +1,6 @@
///
+import when = require('when');
import rest = require('rest');
import defaultRequest = require('rest/interceptor/defaultRequest');
@@ -17,6 +18,7 @@ import jsonp = require('rest/interceptor/jsonp');
import xdomain = require('rest/interceptor/ie/xdomain');
import xhr = require('rest/interceptor/ie/xhr');
+import interceptor = require('rest/interceptor');
import registry = require('rest/mime/registry');
rest('/').then(function(response) {
@@ -52,18 +54,53 @@ registry.register('application/vnd.com.example', {
}
});
+var noop = interceptor({
+ init: (config: any) => {
+ return config;
+ },
+ request: (request: rest.Request, config: any, meta: rest.Meta) => {
+ return request;
+ },
+ response: (response: rest.Response, config: any, meta: rest.Meta) => {
+ return response;
+ },
+ success: (response: rest.Response, config: any, meta: rest.Meta) => {
+ return response;
+ },
+ error: (response: rest.Response, config: any, meta: rest.Meta) => {
+ return response;
+ }
+});
+
+var fail = interceptor({
+ success: (response: rest.Response) => when.reject(response),
+});
+
+var succeed = interceptor({
+ error: (response: rest.Response) => when(response),
+});
+
+var defaulted = interceptor({
+ init: (config: any) => {
+ config.prop = config.prop || 'default-value';
+ return config;
+ },
+});
+
client = rest
- .wrap(defaultRequest)
- .wrap(hateoas)
- .wrap(location)
- .wrap(mime)
- .wrap(pathPrefix)
- .wrap(basicAuth)
- .wrap(oAuth)
- .wrap(csrf)
- .wrap(errorCode)
- .wrap(retry)
- .wrap(timeout)
- .wrap(jsonp)
- .wrap(xdomain)
- .wrap(xhr);
+ .wrap(defaultRequest)
+ .wrap(hateoas)
+ .wrap(location)
+ .wrap(mime)
+ .wrap(pathPrefix)
+ .wrap(basicAuth)
+ .wrap(oAuth)
+ .wrap(csrf)
+ .wrap(errorCode)
+ .wrap(retry)
+ .wrap(timeout)
+ .wrap(jsonp)
+ .wrap(xdomain)
+ .wrap(xhr)
+ .wrap(noop)
+ .wrap(fail);
diff --git a/rest/rest.d.ts b/rest/rest.d.ts
index e3b6fed3a..37ecc4675 100644
--- a/rest/rest.d.ts
+++ b/rest/rest.d.ts
@@ -59,9 +59,42 @@ declare module "rest" {
skip(): Client;
wrap(interceptor: Interceptor, config?: any): Client;
}
+
+ export interface Meta {
+ client: Client;
+ arguments: any;
+ }
}
}
+declare module "rest/interceptor" {
+ import when = require("when");
+ import rest = require("rest");
+
+ // TODO: These two configs should be merged to use union output types.
+
+ interface Config {
+ init?: (config: any) => any;
+ request?: (request: rest.Request, config: any, meta: rest.Meta) => rest.Request;
+ response?: (response: rest.Response, config: any, meta: rest.Meta) => rest.Response;
+ success?: (response: rest.Response, config: any, meta: rest.Meta) => rest.Response;
+ error?: (response: rest.Response, config: any, meta: rest.Meta) => rest.Response;
+ }
+
+ interface PromiseConfig {
+ init?: (config: any) => any;
+ request?: (request: rest.Request, config: any, meta: rest.Meta) => when.Promise;
+ response?: (response: rest.Response, config: any, meta: rest.Meta) => when.Promise;
+ success?: (response: rest.Response, config: any, meta: rest.Meta) => when.Promise;
+ error?: (response: rest.Response, config: any, meta: rest.Meta) => when.Promise;
+ }
+
+ function interceptor(config: Config): rest.Interceptor;
+ function interceptor(config: PromiseConfig): rest.Interceptor;
+
+ export = interceptor;
+}
+
declare module "rest/interceptor/defaultRequest" {
import rest = require("rest");