UNPKG

traverson

Version:

Hypermedia API/HATEOAS client for Node.js and the browser

144 lines (132 loc) 4.16 kB
'use strict'; 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 }; }