UNPKG

leopard-tie-client

Version:

Extended TIE Client that accepts additional custom request headers

77 lines (66 loc) 2.86 kB
import http from './utils/http'; import prune from './utils/prune'; import TeneoResponse from './utils/teneo-response'; import { isNode } from 'browser-or-node'; const readClientOrigin = () => { if (typeof document === 'undefined' || !document.location) return; return document.location.origin; }; const getHeaders = (currentSessionId, inputData) => { const headers = currentSessionId && isNode ? { Cookie: `JSESSIONID=${currentSessionId}` } : {}; return 'headers' in inputData ? Object.assign(inputData.headers, headers) : headers; }; const getParameters = prune(['viewtype', 'userinput', 'text', 'clientOrigin', 'headers']); const formatEngineUrl = url => (url.endsWith('/') ? url : `${url}/`); const appendSessionId = (url, sessionId) => (sessionId ? `${url};jsessionid=${sessionId}` : url); const requestBody = body => { const clientOrigin = readClientOrigin(); const jspViewNames = { viewtype: 'tieapi' }; const parameters = clientOrigin ? Object.assign(jspViewNames, { clientOrigin }) : jspViewNames; return Object.assign(parameters, body); }; function close(teneoEngineUrl, sessionId, timeoutSeconds = 20) { const endSessionUrl = appendSessionId(`${formatEngineUrl(teneoEngineUrl)}endsession`, sessionId); const headers = sessionId && isNode ? { Cookie: `JSESSIONID=${sessionId}` } : {}; return http.post(endSessionUrl, requestBody(), headers, timeoutSeconds); // returns a promise } const verifyInputData = inputData => { const validDataType = x => ['string', 'number', 'bool', 'object'].includes(typeof x); const keys = Object.keys(inputData); if (!(typeof inputData === 'object' && keys.includes('text'))) { throw new TypeError( `sendInput input data must be an object with atleast a 'text' property: ${JSON.stringify(inputData)}` ); } if (!keys.every(key => validDataType(inputData[key]))) { throw new TypeError( `sendInput input data object can only contain values of type string, number or bool ${JSON.stringify(inputData)}` ); } }; function sendInput(teneoEngineUrl, currentSessionId, inputData, timeoutSeconds = 20) { verifyInputData(inputData); const headers = getHeaders(currentSessionId, inputData); const parameters = getParameters(inputData); const body = requestBody(Object.assign({ userinput: inputData.text }, parameters)); const url = appendSessionId(formatEngineUrl(teneoEngineUrl), currentSessionId); return http.post(url, body, headers, timeoutSeconds); // returns a promise } function wrap(teneoResp) { return new TeneoResponse(teneoResp); } export default { wrap, close, sendInput, init: teneoEngineUrl => ({ close: close.bind(null, teneoEngineUrl), sendInput: sendInput.bind(null, teneoEngineUrl), wrap }) };