traverson
Version:
Hypermedia API/HATEOAS client for Node.js and the browser
144 lines (132 loc) • 4.16 kB
JavaScript
;
var minilog = require('minilog')
, log = minilog('traverson')
, abortTraversal = require('./abort_traversal')
, applyTransforms = require('./transforms/apply_transforms')
, httpRequests = require('./http_requests')
, isContinuation = require('./is_continuation')
, walker = require('./walker');
var checkHttpStatus = require('./transforms/check_http_status')
, continuationToDoc =
require('./transforms/continuation_to_doc')
, continuationToResponse =
require('./transforms/continuation_to_response')
, convertEmbeddedDocToResponse =
require('./transforms/convert_embedded_doc_to_response')
, extractDoc = require('./transforms/extract_doc')
, extractResponse = require('./transforms/extract_response')
, extractUrl = require('./transforms/extract_url')
, fetchLastResource = require('./transforms/fetch_last_resource')
, executeLastHttpRequest = require('./transforms/execute_last_http_request')
, executeLastHttpRequestForConvertResponse =
require('./transforms/execute_last_http_request_for_convert_response')
, parse = require('./transforms/parse')
, parseLinkHeader = require('./transforms/parse_link_header');
/**
* Starts the link traversal process and end it with an HTTP get.
*/
exports.get = function(t, callback) {
t.lastMethodName = 'GET';
var transformsAfterLastStep;
if (t.convertResponseToObject) {
transformsAfterLastStep = [
continuationToDoc,
fetchLastResource,
checkHttpStatus,
parse,
parseLinkHeader,
extractDoc,
];
} else {
transformsAfterLastStep = [
continuationToResponse,
fetchLastResource,
convertEmbeddedDocToResponse,
extractResponse,
];
}
walker.walk(t, transformsAfterLastStep, callback);
return createTraversalHandle(t);
};
/**
* Special variant of get() that does not execute the last request but instead
* yields the last URL to the callback.
*/
exports.getUrl = function(t, callback) {
walker.walk(t, [ extractUrl ], callback);
return createTraversalHandle(t);
};
/**
* Starts the link traversal process and sends an HTTP POST request with the
* given body to the last URL. Passes the HTTP response of the POST request to
* the callback.
*/
exports.post = function(t, callback) {
t.lastMethodName = 'POST';
walkAndExecute(t,
t.requestModuleInstance,
t.requestModuleInstance.post,
callback);
return createTraversalHandle(t);
};
/**
* Starts the link traversal process and sends an HTTP PUT request with the
* given body to the last URL. Passes the HTTP response of the PUT request to
* the callback.
*/
exports.put = function(t, callback) {
t.lastMethodName = 'PUT';
walkAndExecute(t,
t.requestModuleInstance,
t.requestModuleInstance.put,
callback);
return createTraversalHandle(t);
};
/**
* Starts the link traversal process and sends an HTTP PATCH request with the
* given body to the last URL. Passes the HTTP response of the PATCH request to
* the callback.
*/
exports.patch = function(t, callback) {
t.lastMethodName = 'PATCH';
walkAndExecute(t,
t.requestModuleInstance,
t.requestModuleInstance.patch,
callback);
return createTraversalHandle(t);
};
/**
* Starts the link traversal process and sends an HTTP DELETE request to the
* last URL. Passes the HTTP response of the DELETE request to the callback.
*/
exports.delete = function(t, callback) {
t.lastMethodName = 'DELETE';
walkAndExecute(t,
t.requestModuleInstance,
t.requestModuleInstance.del,
callback);
return createTraversalHandle(t);
};
function walkAndExecute(t, request, method, callback) {
var transformsAfterLastStep;
if (t.convertResponseToObject) {
transformsAfterLastStep = [
executeLastHttpRequestForConvertResponse,
checkHttpStatus,
parse,
parseLinkHeader,
extractDoc,
];
} else {
transformsAfterLastStep = [
executeLastHttpRequest,
];
}
t.lastMethod = method;
walker.walk(t, transformsAfterLastStep, callback);
}
function createTraversalHandle(t) {
return {
abort: t.abortTraversal
};
}