sabre-legacy-client
Version:
Sabre Legacy Node.js SDK
893 lines (833 loc) • 32.7 kB
JavaScript
;
var __defProp = Object.defineProperty;
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
var __getOwnPropNames = Object.getOwnPropertyNames;
var __hasOwnProp = Object.prototype.hasOwnProperty;
var __export = (target, all) => {
for (var name in all)
__defProp(target, name, { get: all[name], enumerable: true });
};
var __copyProps = (to, from, except, desc) => {
if (from && typeof from === "object" || typeof from === "function") {
for (let key of __getOwnPropNames(from))
if (!__hasOwnProp.call(to, key) && key !== except)
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
}
return to;
};
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
// src/index.ts
var index_exports = {};
__export(index_exports, {
ErrorInResponse: () => ErrorInResponse,
FaultError: () => FaultError,
SabreLegacy: () => Sabre
});
module.exports = __toCommonJS(index_exports);
// src/common/utils/get-sub-string.ts
function getSubString(strSearch, strBegin, strEnd, withEnd) {
let strSub = "";
const intBegin = strSearch.indexOf(strBegin);
if (intBegin !== -1) {
const startIndex = withEnd ? intBegin : intBegin + strBegin.length;
const endIndex = strSearch.indexOf(strEnd, startIndex);
if (endIndex !== -1) strSub = strSearch.substring(startIndex, endIndex + (withEnd ? strEnd.length : 0));
}
return strSub;
}
// package.json
var version = "0.1.10";
// src/config.ts
var defaultBaseUrl = "https://webservices.platform.sabre.com";
var defaultUserAgent = `sabre-client-node:${version}`;
var defaultConversationId = `sabre.client.node:${version}`;
var defaultDomain = "AA";
var baseUrl = typeof process !== "undefined" && process.env ? process.env.SABRE_SOAP_URL || defaultBaseUrl : defaultBaseUrl;
var userAgent = typeof process !== "undefined" && process.env ? process.env.SABRE_USER_AGENT || defaultUserAgent : defaultUserAgent;
var domain = typeof process !== "undefined" && process.env ? process.env.SABRE_DOMAIN || defaultDomain : defaultDomain;
var conversationId = typeof process !== "undefined" && process.env ? process.env.SABRE_CONVERSATION_ID || defaultConversationId : defaultConversationId;
// src/common/helpers/binary-security-token.helper.ts
function binarySecurityToken(token) {
return `<BinarySecurityToken EncodingType="Base64Binary" valueType="String">${token}</BinarySecurityToken>`;
}
// src/common/helpers/message-header.helper.ts
function messageHeader(payload) {
const {
from = "Agency",
to = "SWS",
conversationId: conversationId2 = "2021.01.DevStudio",
action
} = payload;
return `<MessageHeader xmlns="http://www.ebxml.org/namespaces/messageHeader"><From><PartyId>${from}</PartyId></From><To><PartyId>${to}</PartyId></To><ConversationId>${conversationId2}</ConversationId><Action>${action}</Action></MessageHeader>`;
}
// src/common/helpers/security.helper.ts
function security(authorization) {
return `<Security xmlns="http://schemas.xmlsoap.org/ws/2002/12/secext">${authorization}</Security>`;
}
// src/common/helpers/header.helper.ts
function header(payload) {
const { action, conversationId: conversationId2, authorization } = payload;
const binarySecurity = binarySecurityToken(authorization);
return messageHeader({ action, conversationId: conversationId2 }) + security(binarySecurity);
}
// src/common/helpers/soap-env.helper.ts
function soapEnv(payload) {
const { header: header2, body } = payload;
return `<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"><SOAP-ENV:Header>${header2}</SOAP-ENV:Header><SOAP-ENV:Body>${body}</SOAP-ENV:Body></SOAP-ENV:Envelope>`;
}
// src/common/helpers/request.helper.ts
function request(payload) {
const { action, conversationId: conversationId2, authorization, body } = payload;
return soapEnv({
header: header({ action, conversationId: conversationId2, authorization }),
body
});
}
// src/authentication/requests/ping.request.ts
function pingRequest(payload) {
const body = '<OTA_PingRQ Version="1.0.0" xmlns="http://www.opentravel.org/OTA/2003/05"/>';
return request({ body, action: "OTA_PingRQ" /* PING */, ...payload });
}
// src/authentication/helpers/username-token.helper.ts
function usernameToken(options2) {
const { username, password, pcc, domain: domain2 } = options2;
return `<UsernameToken><Username>${username}</Username><Password>${password}</Password><Organization>${pcc}</Organization><Domain>${domain2}</Domain></UsernameToken>`;
}
// src/authentication/requests/session-create.request.ts
function sessionCreateRequest(payload) {
const { conversationId: conversationId2, authorization } = payload;
const message = messageHeader({
action: "SessionCreateRQ" /* SESSION_CREATE */,
conversationId: conversationId2,
to: "Sabre_API"
});
const header2 = message + security(usernameToken(authorization));
const body = '<SessionCreateRQ returnContextID="true" Version="1.0.0" xmlns="http://www.opentravel.org/OTA/2002/11"/>';
return soapEnv({ header: header2, body });
}
// src/authentication/requests/session-close.request.ts
function sessionCloseRequest(payload) {
const body = '<SessionCloseRQ Version="1.0.0" xmlns="http://www.opentravel.org/OTA/2002/11"/>';
return request({ body, action: "SessionCloseRQ" /* SESSION_CLOSE */, ...payload });
}
// src/authentication/requests/token-create.request.ts
function tokenCreateRequest(payload) {
const { conversationId: conversationId2, authorization } = payload;
const message = messageHeader({
action: "TokenCreateRQ" /* TOKEN_CREATE */,
conversationId: conversationId2,
to: "Sabre_API"
});
const header2 = message + security(usernameToken(authorization));
const body = '<TokenCreateRQ Version="1.0.0" xmlns="http://webservices.sabre.com"/>';
return soapEnv({ header: header2, body });
}
// src/authentication/authentication..ts
var Authentication = class {
constructor(sabre) {
this.sabre = sabre;
}
/**
* See https://developer.sabre.com/docs/soap_apis/session_management/create_session
* @returns string
*/
async sessionCreate() {
this.sabre.setAction("SessionCreateRQ" /* SESSION_CREATE */);
const xml = await this.sabre.auth(sessionCreateRequest);
return xml;
}
/**
* See https://developer.sabre.com/docs/soap_apis/session_management/close_session
* @returns string
*/
async sessionClose() {
this.sabre.setAction("SessionCloseRQ" /* SESSION_CLOSE */);
const xml = await this.sabre.post(sessionCloseRequest);
return xml;
}
/**
* See https://developer.sabre.com/docs/soap_apis/session_management/refresh_session
* @returns string
*/
async ping() {
this.sabre.setAction("OTA_PingRQ" /* PING */);
const xml = await this.sabre.post(pingRequest);
return xml;
}
/**
* See https://developer.sabre.com/docs/soap_apis/session_management/create_access_token
* @returns string
*/
async tokenCreate() {
this.sabre.setAction("TokenCreateRQ" /* TOKEN_CREATE */);
const xml = await this.sabre.auth(tokenCreateRequest);
return xml;
}
};
// src/currency/helpers/get-month-name-sabre.helper.ts
var ListMonth = /* @__PURE__ */ ((ListMonth2) => {
ListMonth2[ListMonth2["JAN"] = 1] = "JAN";
ListMonth2[ListMonth2["FEB"] = 2] = "FEB";
ListMonth2[ListMonth2["MAR"] = 3] = "MAR";
ListMonth2[ListMonth2["APR"] = 4] = "APR";
ListMonth2[ListMonth2["MAY"] = 5] = "MAY";
ListMonth2[ListMonth2["JUN"] = 6] = "JUN";
ListMonth2[ListMonth2["JUL"] = 7] = "JUL";
ListMonth2[ListMonth2["AUG"] = 8] = "AUG";
ListMonth2[ListMonth2["SEP"] = 9] = "SEP";
ListMonth2[ListMonth2["OCT"] = 10] = "OCT";
ListMonth2[ListMonth2["NOV"] = 11] = "NOV";
ListMonth2[ListMonth2["DEC"] = 12] = "DEC";
return ListMonth2;
})(ListMonth || {});
var getMonthName = (month) => ListMonth[month];
var formatMonth = (month) => String(ListMonth[month]).padStart(2, "0");
// src/queue/common/utils/find-queue-line.ts
function findQueueLine(text) {
if (!text) throw new Error("Missing text.");
const LINE_REGEX = /(\w{4})\.(\w{4})\*(A{1}[A-Z0-9]{2})\s(\d{4})\/(\d{2}[A-Z]{3}\d{2})\s([A-Z0-9]{6})/g;
const found = LINE_REGEX.exec(text);
if (!found) throw new Error("Queue line not found");
const [_, workPcc, homePcc, agent, time, date, bookingId] = found;
return { workPcc, homePcc, agent, dateTime: `20${date.slice(5)}-${formatMonth(date.slice(2, 5))}-${date.slice(0, 2)}T${time.slice(0, 2)}:${time.slice(2)}`, bookingId };
}
// src/common/config/xml-parser.config.ts
var import_fast_xml_parser = require("fast-xml-parser");
var options = {
textNodeName: "content",
attributeNamePrefix: "",
removeNSPrefix: true,
ignoreAttributes: [/^xmlns:/, /^eb:/, /^soap-env:/, /^xmlns/, /^Version/],
transformTagName: (tagName) => tagName[0].toLowerCase() + tagName.slice(1),
transformAttributeName: (attributeName) => attributeName[0].toLowerCase() + attributeName.slice(1)
};
var parseXML = (() => {
const parser = new import_fast_xml_parser.XMLParser(options);
return (xml) => parser.parse(xml);
})();
// src/queue/common/utils/parse-xml-to-queue-access.ts
function parseXMLToQueueAccess(body) {
const { queueAccessRS } = parseXML(body);
return queueAccessRS;
}
// src/queue/common/utils/parse-xml-to-queue-count.ts
function parseXMLToQueueCount(body) {
const { queueCountRS } = parseXML(body);
return queueCountRS;
}
// src/queue/common/utils/parse-xml-to-queue-place.ts
function parseXMLToQueuePlace(body) {
return parseXML(body).queuePlaceRS;
}
// src/queue/common/utils/parse-paragraph-to-warnings.ts
function parseParagraphToWarnings(payload) {
const LIMIT_NOTIFICATIONS = 5;
const WARNING_REGEX = /\d{3}\s{2}.+/g;
return payload.text.slice(0, LIMIT_NOTIFICATIONS).filter((text) => text.match(WARNING_REGEX)).map((warningInLine) => {
const [code, message] = warningInLine.split(" ");
return { code, message };
});
}
// src/queue/common/utils/parse-warnings-to-notifications.ts
function parseWarningsToNotifications(payload) {
return payload.warnings.map((warning) => ({ queue: payload.queue, warning }));
}
// src/queue/common/utils/parse-access-rs-to-access.ts
function parseAccessResponseToAccess(context, accessResponse) {
if (!accessResponse.line?.uniqueID?.iD) {
throw new Error(accessResponse.applicationResults.error?.systemSpecificResults?.message || "Unknown error");
}
const { queueNumber: queue } = context;
const { paragraph, line } = accessResponse;
const warnings = parseParagraphToWarnings(paragraph);
const notifications = parseWarningsToNotifications({ queue, warnings });
return {
dateTime: line.dateTime,
agent: line.pOS.source.agentSine,
pcc: line.pOS.source.pseudoCityCode,
bookingId: line.uniqueID.iD,
notifications,
paragraph,
queue
};
}
// src/queue/common/utils/parse-place-rs-to-access.ts
function parsePlaceResponseToAccess(context, placeResponse) {
if (!placeResponse.text) {
throw new Error(placeResponse.applicationResults.error?.systemSpecificResults?.message || "Unknown error");
}
const { queueNumber: queue } = context;
const warnings = parseParagraphToWarnings(placeResponse);
const notifications = parseWarningsToNotifications({ queue, warnings });
const { dateTime, agent, homePcc, bookingId } = findQueueLine(placeResponse.text.pop());
return {
dateTime,
agent,
pcc: homePcc,
bookingId,
notifications,
paragraph: placeResponse,
queue
};
}
// src/queue/common/utils/parse-xml-to-queue-access-list.ts
function parseXMLToQueueAccessList(body) {
const { queueAccessRS } = parseXML(body);
return queueAccessRS;
}
// src/queue/common/utils/get-queue-booking-info.ts
function getQueueBookingInfo(text) {
if (!text) throw new Error("Missing text.");
const BOOKING_INFO_REGEX = /(\d+)\s+([A-Z0-9]{6})\s+(\w{3,})[\s|\/]+(\w{3,})\s+(\d{2}[A-Z]{3}\d{2})\s+(\d{4})\s+[1](.+)/g;
const found = BOOKING_INFO_REGEX.exec(text);
if (!found) throw new Error("Queue booking info not found");
const [_, num, bookingId, pcc, agent, date, time, name] = found;
return { num, bookingId, placeBy: `${pcc} ${agent}`, date: `20${date.slice(5)}-${formatMonth(date.slice(2, 5))}-${date.slice(0, 2)}T${time.slice(0, 2)}:${time.slice(2)}`, name };
}
// src/queue/common/utils/parse-access-list-rs-to-list.ts
function parseAccessListResponseToList(context, accessListResponse) {
if (!accessListResponse.applicationResults?.success) {
throw new Error(accessListResponse.applicationResults.error?.systemSpecificResults?.message || "Unknown error");
}
const { queueNumber: queue } = context;
const { paragraph, line } = accessListResponse;
return {
lines: line ? line.map((qall) => ({
index: qall.number,
dateTime: qall.dateTime,
passengerName: qall.passengerName,
agent: qall.pOS.source.agentSine,
pcc: qall.pOS.source.pseudoCityCode,
bookingId: qall.uniqueID.iD
})) : void 0,
list: paragraph.text.slice(2, -1).map((text) => getQueueBookingInfo(text)),
paragraph,
queue
};
}
// src/queue/common/helpers/queue-access.helper.ts
function queueAccess(queueInfo) {
return `<QueueAccessRQ ReturnHostCommand="false" Version="2.1.0" xmlns="http://webservices.sabre.com/sabreXML/2011/10">${queueInfo}</QueueAccessRQ>`;
}
// src/queue/common/utils/parse-identifier-options-to-queue-identifier.ts
function parseIdentifierOptionsToQueueIdentifier(payload) {
return {
QueueIdentifier: {
"$Number": payload.number,
"$PrefatoryInstructionCode": payload.code,
"$PseudoCityCode": payload.pcc,
List: payload.ind ? {
"$Ind": payload.ind,
"$PrimaryPassenger": payload.primaryPassenger
} : void 0
}
};
}
// src/queue/common/utils/builder-queue-identifier.ts
function builderQueueIdentifier(payload) {
const QueueIdentifierObj = parseIdentifierOptionsToQueueIdentifier(payload);
const { XMLBuilder } = require("fast-xml-parser");
const options2 = {
ignoreAttributes: false,
attributeNamePrefix: "$",
suppressBooleanAttributes: false,
suppressEmptyNode: true
};
const builder = new XMLBuilder(options2);
return builder.build(QueueIdentifierObj);
}
// src/queue/common/requests/access-list.request.ts
function accessListRequest(options2) {
const { pcc, number, authorization, conversationId: conversationId2, primaryPassenger } = options2;
const queueInfo = builderQueueIdentifier({ pcc, number, ind: true, primaryPassenger });
const body = queueAccess(queueInfo);
return request({
body,
authorization,
conversationId: conversationId2,
action: "QueueAccessLLSRQ" /* QUEUE_ACCESS */
});
}
// src/queue/common/requests/access.request.ts
function accessRequest(options2) {
const { pcc, number, authorization, conversationId: conversationId2 } = options2;
const queueInfo = builderQueueIdentifier({ pcc, number });
const body = queueAccess(queueInfo);
return request({
body,
authorization,
conversationId: conversationId2,
action: "QueueAccessLLSRQ" /* QUEUE_ACCESS */
});
}
// src/queue/common/helpers/queue-count.helper.ts
function queueCount(queueInfo) {
return `<QueueCountRQ xmlns="http://webservices.sabre.com/sabreXML/2011/10" ReturnHostCommand="false" Version="2.2.1"><QueueInfo>${queueInfo}</QueueInfo></QueueCountRQ>`;
}
// src/queue/common/requests/count.request.ts
function countRequest(options2) {
const { authorization, conversationId: conversationId2, pcc } = options2;
const queueInfo = builderQueueIdentifier({ pcc });
const body = queueCount(queueInfo);
return request({
body,
authorization,
conversationId: conversationId2,
action: "QueueCountLLSRQ" /* QUEUE_COUNT */
});
}
// src/queue/common/helpers/navigation-action.helper.ts
function navigationAction(action) {
const queueInfo = `<Navigation Action="${action}"/>`;
const body = queueAccess(queueInfo);
return body;
}
// src/queue/common/requests/exit.request.ts
function exitRequest(options2) {
const { authorization, conversationId: conversationId2 } = options2;
const body = navigationAction("QXI" /* EXIT */);
return request({ authorization, conversationId: conversationId2, body, action: "QueueAccessLLSRQ" /* QUEUE_ACCESS */ });
}
// src/queue/common/requests/ignore.request.ts
function ignoreRequest(options2) {
const { authorization, conversationId: conversationId2 } = options2;
const body = navigationAction("I" /* IGNORE */);
return request({ authorization, conversationId: conversationId2, body, action: "QueueAccessLLSRQ" /* QUEUE_ACCESS */ });
}
// src/queue/common/helpers/queue-place.helper.ts
function queuePlace(queueInfo) {
return `<QueuePlaceRQ ReturnHostCommand="false" Version="2.0.4" xmlns="http://webservices.sabre.com/sabreXML/2011/10"><QueueInfo>${queueInfo}</QueueInfo></QueuePlaceRQ>`;
}
// src/queue/common/requests/place.request.ts
function placeRequest(options2) {
const { number, pcc, authorization, conversationId: conversationId2 } = options2;
const queueInfo = builderQueueIdentifier({ number, code: "11", pcc });
const body = queuePlace(queueInfo);
return request({ body, authorization, conversationId: conversationId2, action: "QueuePlaceLLSRQ" /* QUEUE_PLACE */ });
}
// src/queue/common/requests/remove.request.ts
function removeRequest(options2) {
const { authorization, conversationId: conversationId2 } = options2;
const body = navigationAction("I" /* IGNORE */);
return request({ authorization, conversationId: conversationId2, body, action: "QueueAccessLLSRQ" /* QUEUE_ACCESS */ });
}
// src/queue/queue.ts
var Queue = class {
constructor(sabre) {
this.sabre = sabre;
}
meta = {
queue: ""
};
/**
* List Queues
*
* See https://developer.sabre.com/docs/soap_apis/management/queue/Get_Queue_Count
* @param pcc string
* @returns QueueCountResponse
*/
async count(pcc) {
if (!pcc) {
if (typeof process !== "undefined" && process.env) {
pcc = process.env.SABRE_ORGANIZATION;
}
}
if (!pcc) throw new Error('Missing pcc. Set it in count("PCC")');
this.sabre.setAction("QueueCountLLSRQ" /* QUEUE_COUNT */);
const xml = await this.sabre.post((opts) => countRequest({
pcc,
...opts
}));
return parseXMLToQueueCount(xml);
}
/**
* Access queue
*
* See https://developer.sabre.com/docs/soap_apis/management/queue/Access_Queue
* @param payload QueueAccessOptions
* @returns QueueAccessResponse
*/
async access(payload) {
if (!payload.pcc) {
if (typeof process !== "undefined" && process.env) {
payload.pcc = process.env.SABRE_ORGANIZATION;
}
}
if (!payload.pcc) throw new Error("Missing pcc. Set it in access({ pcc, number })");
const { number, pcc } = payload;
this.sabre.setAction("QueueAccessLLSRS" /* QUEUE_ACCESS */);
const xml = await this.sabre.post((opts) => accessRequest({
number,
pcc,
...opts
}));
this.meta.queue = number;
const queueAccess2 = parseXMLToQueueAccess(xml);
return parseAccessResponseToAccess({ queueNumber: this.meta.queue }, queueAccess2);
}
/**
* Get PNR list from queue (Stateless)
*
* See https://developer.sabre.com/docs/soap_apis/management/queue/Access_Queue
* @param payload QueueAccessListOptions
* @returns QueueAccessListResponse
*/
async accessList(payload) {
if (!payload.pcc) {
if (typeof process !== "undefined" && process.env) {
payload.pcc = process.env.SABRE_ORGANIZATION;
}
}
if (!payload.pcc) throw new Error("Missing pcc. Set it in access({ pcc, number })");
const { number, pcc, primaryPassenger } = payload;
this.sabre.setAction("QueueAccessLLSRS" /* QUEUE_ACCESS */);
const xml = await this.sabre.post((opts) => accessListRequest({
number,
pcc,
primaryPassenger,
...opts
}));
const queueAccessList = parseXMLToQueueAccessList(xml);
return parseAccessListResponseToList({ queueNumber: number }, queueAccessList);
}
/**
* Ignore PNR & Next
*
* See https://developer.sabre.com/docs/soap_apis/management/queue/Access_Queue
* @returns QueueIgnoreResponse
*/
async ignore() {
this.sabre.setAction("QueueAccessLLSRS" /* QUEUE_ACCESS */);
const xml = await this.sabre.post(ignoreRequest);
const queueAccess2 = parseXMLToQueueAccess(xml);
return parseAccessResponseToAccess({ queueNumber: this.meta.queue }, queueAccess2);
}
/**
* Remove PNR & Next
*
* See https://developer.sabre.com/docs/soap_apis/management/queue/Access_Queue
* @returns QueueRemoveResponse
*/
async remove() {
this.sabre.setAction("QueueAccessLLSRS" /* QUEUE_ACCESS */);
const xml = await this.sabre.post(removeRequest);
const queueAccess2 = parseXMLToQueueAccess(xml);
return parseAccessResponseToAccess({ queueNumber: this.meta.queue }, queueAccess2);
}
/**
* Ignore PNR & Exit
*
* See https://developer.sabre.com/docs/soap_apis/management/queue/Access_Queue
* @returns QueueExitResponse
*/
async exit() {
this.sabre.setAction("QueueAccessLLSRS" /* QUEUE_ACCESS */);
const xml = await this.sabre.post(exitRequest);
const queueAccess2 = parseXMLToQueueAccess(xml);
if (queueAccess2.applicationResults.error) {
throw new Error(queueAccess2.applicationResults.error?.systemSpecificResults?.message);
}
return {
paragraph: queueAccess2.paragraph
};
}
/**
* Queue Place "Stateful Single Queue"
*
* See https://developer.sabre.com/docs/soap_apis/management/queue/Place_Queue_Message
* @param payload QueuePlaceOptions
* @returns QueuePlaceResponse
*/
async place(payload) {
if (!payload.pcc) {
if (typeof process !== "undefined" && process.env) {
payload.pcc = process.env.SABRE_ORGANIZATION;
}
}
if (!payload.pcc) throw new Error("Missing pcc. Set it in place({ pcc, number })");
const { number, pcc } = payload;
this.sabre.setAction("QueuePlaceLLSRQ" /* QUEUE_PLACE */);
const xml = await this.sabre.post((opts) => placeRequest({
number,
pcc,
...opts
}));
const queuePlace2 = parseXMLToQueuePlace(xml);
return parsePlaceResponseToAccess({ queueNumber: this.meta.queue }, queuePlace2);
}
};
// src/daily-sales/common/requests/report.request.ts
function reportRequest(options2) {
const { pcc, date, authorization, conversationId: conversationId2 } = options2;
const body = `<DailySalesReportRQ ReturnHostCommand="false" Version="2.0.0" xmlns="http://webservices.sabre.com/sabreXML/2011/10"><SalesReport PseudoCityCode="${pcc}" StartDate="${date}"/></DailySalesReportRQ>`;
return request({
body,
action: "DailySalesReportLLSRQ" /* DAILY_SALES_REPORT */,
authorization,
conversationId: conversationId2
});
}
// src/daily-sales/common/utils/parse-summary-options-to-selection-criteria.ts
function parseSummaryOptionsToSelectionCriteria(payload) {
return {
PseudoCityCode: payload.pcc,
ReportDate: payload.date,
DocumentNumber: payload.documentNumber,
SettlementType: payload.settlementType,
DocumentType: payload.documentType,
Airline: payload.airline?.code || payload.airline?.number ? {
AirlineCode: payload.airline.code,
AirlineNumber: payload.airline.number
} : void 0
};
}
// src/daily-sales/common/utils/parse-summary-options-to-xml.ts
function parseSummaryOptionsToXML(payload) {
const SelectionCriteria = parseSummaryOptionsToSelectionCriteria(payload);
const { XMLBuilder } = require("fast-xml-parser");
const builder = new XMLBuilder();
return builder.build({ SelectionCriteria });
}
// src/daily-sales/common/requests/summary.request.ts
function summaryRequest(options2) {
const { authorization, conversationId: conversationId2, ...summaryOptions } = options2;
const selectionCriteria = parseSummaryOptionsToXML(summaryOptions);
const body = `<DailySalesSummaryRQ version="1.2.2" xmlns="http://www.sabre.com/ns/Ticketing/AsrServices/1.0"><Header/>${selectionCriteria}</DailySalesSummaryRQ>`;
return request({
body,
action: "TKT_TravelAgencyReportsRQ" /* AGENCY_REPORT */,
authorization,
conversationId: conversationId2
});
}
// src/daily-sales/common/utils/parse-xml-to-daily-sales-summary.ts
function parseXMLToDailySalesSummary(payload) {
return parseXML(payload).dailySalesSummaryRS;
}
// src/daily-sales/common/utils/parse-xml-to-daily-sales-report.ts
function parseXMLToDailySalesReport(payload) {
return parseXML(payload).dailySalesReportRS;
}
// src/daily-sales/daily-sales.ts
var DailySales = class {
constructor(sabre) {
this.sabre = sabre;
}
/**
* See https://developer.sabre.com/docs/soap_apis/air/fulfill/Get_Sales_Reports
* @param payload ReportOptions
* @returns DailySalesReportRS
*/
async report(payload) {
if (!payload.pcc) {
if (typeof process !== "undefined" && process.env) {
payload.pcc = process.env.SABRE_ORGANIZATION;
}
}
if (!payload.pcc) throw new Error("Missing pcc. Set it in report({ pcc, number })");
const { pcc, date } = payload;
this.sabre.setAction("DailySalesReportLLSRQ" /* DAILY_SALES_REPORT */);
const xml = await this.sabre.post((headersPayload) => reportRequest({ pcc, date, ...headersPayload }));
return parseXMLToDailySalesReport(xml);
}
/**
* See https://developer.sabre.com/docs/soap_apis/air/fulfill/display_audit_trail
* @param payload
* @returns DailySalesSummaryRS
*/
async summary(payload) {
if (!payload.pcc) {
if (typeof process !== "undefined" && process.env) {
payload.pcc = process.env.SABRE_ORGANIZATION;
}
}
if (!payload.pcc) throw new Error("Missing pcc. Set it in summary({ pcc, ... })");
const { pcc } = payload;
this.sabre.setAction("DailySalesReportLLSRQ" /* DAILY_SALES_REPORT */);
const xml = await this.sabre.post((headersPayload) => summaryRequest({ pcc, ...payload, ...headersPayload }));
return parseXMLToDailySalesSummary(xml);
}
};
// src/common/utils/fault-error.ts
var FaultError = class extends Error {
constructor(message) {
super(message);
this.name = "FaultError";
}
};
// src/common/utils/error-in-response.ts
var ErrorInResponse = class extends Error {
constructor(message) {
super(message);
this.name = "ErrorInResponse";
}
};
// src/common/utils/parse-xml-to-sabre-command.ts
function parseXMLToSabreCommand(payload) {
return parseXML(payload).sabreCommandLLSRS;
}
// src/common/helpers/sabre-command.helper.ts
function sabreCommand(command) {
return `<SabreCommandLLSRQ xmlns="http://webservices.sabre.com/sabreXML/2011/10" ReturnHostCommand="true" Version="2.0.0"><Request Output="SCREEN"><HostCommand>${command}</HostCommand></Request></SabreCommandLLSRQ>`;
}
// src/currency/helpers/format-date-sabre.helper.ts
function formatDateSabre(date) {
const dateSplit = date.split("-");
const monthNumber = parseInt(dateSplit[1]);
const numberValid = monthNumber >= 1 && monthNumber <= 12;
if (!numberValid) {
throw new Error("Month is not valid:" + monthNumber);
}
const month = monthNumber;
const year = dateSplit[0].slice(2, 4);
return dateSplit[2] + getMonthName(month) + year;
}
// src/currency/helpers/format-currency-command.helper.ts
function formatCurrencyCommand(options2) {
const { from, to, date } = options2;
const dateFormatted = formatDateSabre(date);
const command = `DC\xA5${from}1/${to}/${dateFormatted}`;
return command;
}
// src/currency/requests/currency.request.ts
function currencyRequest(options2) {
const { authorization, conversationId: conversationId2 } = options2;
const body = sabreCommand(formatCurrencyCommand(options2));
return request({
body,
authorization,
conversationId: conversationId2,
action: "SabreCommandLLSRQ" /* SABRE_COMMAND */
});
}
// src/currency/currency.ts
var Currency = class {
constructor(sabre) {
this.sabre = sabre;
}
/**
* See https://developer.sabre.com/docs/soap_apis/management/utility/Send_Sabre_Command
* Sabre equivalent command -> DC¥USD1/MXN/19MAR25
*/
async conversion(payload) {
this.sabre.setAction("SabreCommandLLSRQ" /* SABRE_COMMAND */);
const { from, to, date } = payload;
const xml = await this.sabre.post((headersPayload) => currencyRequest({ from, to, date, ...headersPayload }));
return parseXMLToSabreCommand(xml);
}
};
// src/sabre.ts
var Sabre = class {
constructor(options2 = {}) {
this.options = options2;
const processEnv = typeof process !== "undefined" && process.env;
if (!this.options.username && processEnv)
this.options.username = processEnv.SABRE_USERNAME;
if (!this.options.password && processEnv)
this.options.password = processEnv.SABRE_PASSWORD;
if (!this.options.organization && processEnv)
this.options.organization = processEnv.SABRE_ORGANIZATION;
if (!this.options.username || !this.options.password || !this.options.organization) {
throw new Error(`Missing SabreLegacy authorization. Pass it to the constructor new SabreLegacy({
username: '773400',
password: 'PASSWORD_GOES_HERE',
organization: '7TZA', // pcc
});})`);
}
this.headers = new Headers({
"User-Agent": userAgent,
"Content-Type": 'text/xml; charset="utf-8"',
"Content-Encoding": "deflate"
});
this.headersRequest = {
conversationId,
authorization: ""
};
}
headers;
headersRequest;
lastReq = {};
authentication = new Authentication(this);
queue = new Queue(this);
dailySales = new DailySales(this);
currency = new Currency(this);
setAction(action) {
this.headers.set("SOAPAction", action);
}
setAuthorization(token) {
this.headersRequest.authorization = token;
this.headers.set("Authorization", `Bearer ${token}`);
}
getAuthorization() {
return this.headersRequest.authorization;
}
getLastRequest() {
return this.lastReq;
}
async fetchRequest(options2 = {}) {
this.lastReq = options2;
try {
const response = await fetch(baseUrl, options2);
const xml = await response.text();
if (!response.ok) {
const fault = getSubString(xml, "<faultstring>", "</faultstring>", false);
throw new FaultError(fault);
}
const body = getSubString(xml, "<soap-env:Body>", "</soap-env:Body>", false);
const error = getSubString(body, "<stl:Error>", "</stl:Error>", false);
if (error) {
const message = getSubString(error, "<stl:Message>", "</stl:Message>", false);
throw new ErrorInResponse(message);
}
const action = this.headers.get("SOAPAction");
if (action === "SessionCreateRQ" /* SESSION_CREATE */ || action === "TokenCreateRQ" /* TOKEN_CREATE */) {
const token = getSubString(xml, '<wsse:BinarySecurityToken valueType="String" EncodingType="wsse:Base64Binary">', "</wsse:BinarySecurityToken>", false);
this.setAuthorization(token);
} else if (action === "SessionCloseRQ" /* SESSION_CLOSE */) {
this.headersRequest.authorization = "";
this.headers.delete("Authorization");
}
return body;
} catch (error) {
if (error instanceof FaultError || error instanceof ErrorInResponse) {
throw error;
}
throw error instanceof Error ? error : new Error("Unknown error");
}
}
async post(handlerRequest, options2 = {}) {
if (!this.headersRequest.authorization) throw new Error('Missing authorization. Set it in setAuthorization("TOKEN")');
const requestOptions = {
method: "POST",
headers: this.headers,
body: handlerRequest(this.headersRequest),
...options2
};
return this.fetchRequest(requestOptions);
}
async auth(handlerRequest, options2 = {}) {
if (!this.options.username || !this.options.password || !this.options.organization)
throw new Error('Missing authorization. Pass it to the constructor `new LegacySabre("USERNAME", "PASSWORD", "ORGANIZATION")');
const requestOptions = {
method: "POST",
headers: this.headers,
body: handlerRequest({
conversationId,
authorization: {
username: this.options.username,
password: this.options.password,
pcc: this.options.organization,
domain
}
}),
...options2
};
return this.fetchRequest(requestOptions);
}
};
// Annotate the CommonJS export names for ESM import in node:
0 && (module.exports = {
ErrorInResponse,
FaultError,
SabreLegacy
});