@sap-cloud-sdk/odata-common
Version:
SAP Cloud SDK for JavaScript common functions of OData client generator and OpenAPI clint generator.
115 lines • 4.96 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.serializeChangeSet = serializeChangeSet;
exports.serializeRequest = serializeRequest;
exports.serializeBatchRequest = serializeBatchRequest;
const util_1 = require("@sap-cloud-sdk/util");
const voca_1 = __importDefault(require("voca"));
const request_1 = require("../../request");
const batch_change_set_1 = require("./batch-change-set");
/**
* Serialize change set to string.
* @param changeSet - Change set containing a collection of write operations.
* @param options - Request serialization options.
* @returns The serialized string representation of a change set.
* @internal
*/
function serializeChangeSet(changeSet, options = {}) {
if (changeSet.requests.length) {
return [
`Content-Type: multipart/mixed; boundary=${changeSet.boundary}`,
'',
`--${changeSet.boundary}`,
changeSet.requests
.map(request => serializeRequest(request, options))
.join(`${util_1.unixEOL}--${changeSet.boundary}${util_1.unixEOL}`),
`--${changeSet.boundary}--`
].join(util_1.unixEOL);
}
}
/**
* Serialize a multipart request to string.
* @param request - One of {@link GetAllRequestBuilder | getAll}, {@link GetByKeyRequestBuilder | getByKey}, {@link CreateRequestBuilder | create}, {@link UpdateRequestBuilder | update} or {@link DeleteRequestBuilder | delete} request builder.
* @param options - Request serialization options.
* @returns The serialized string representation of a multipart request, including the multipart headers.
* @internal
*/
function serializeRequest(request, options = {}) {
const odataRequest = new request_1.ODataRequest(request.requestConfig, options.destination);
const headers = {
...odataRequest.defaultHeaders(),
...odataRequest.eTagHeaders(),
...odataRequest.customHeaders()
};
const requestHeaders = Object.entries(headers).map(([key, value]) => `${voca_1.default.titleCase(key)}: ${value}`);
const method = request.requestConfig.method.toUpperCase();
return [
'Content-Type: application/http',
'Content-Transfer-Encoding: binary',
...(method !== 'GET' && isRequestBuilderWithBatchReference(request)
? [`Content-Id: ${request.getBatchReference().id}`]
: []),
'',
`${method} ${getUrl(odataRequest, options.subRequestPathType)} HTTP/1.1`,
...(requestHeaders.length ? requestHeaders : ['']),
'',
...getPayload(request),
''
].join(util_1.unixEOL);
}
function isRequestBuilderWithBatchReference(request) {
return !!request.getBatchReference;
}
function getUrl(request, subRequestPathType) {
switch (subRequestPathType) {
case 'absolute':
return request.url();
case 'relativeToEntity':
return `/${request.relativeUrl(false)}`;
case 'noPath':
return `${request.relativeUrl(false)}`;
default:
return `/${request.relativeUrl()}`;
}
}
function getPayload(request) {
return request.requestConfig.method !== 'get'
? [JSON.stringify(request.requestConfig.payload)]
: [];
}
function validateOptions(options) {
// This should never happen. Can only occur if requestBuilder.build() was called, which will be removed.
if (options.subRequestPathType === 'absolute' && !options.destination?.url) {
throw new Error("Cannot serialize batch request. Invalid destination provided for sub request path type 'absolute'");
}
}
/**
* Serialize a batch request to string. This is used for the batch request payload when executing the request.
* @param request - Batch request to serialize.
* @param options - Request serialization options.
* @returns String representation of the batch request.
* @internal
*/
function serializeBatchRequest(request, options = {}) {
validateOptions(options);
const serializedSubRequests = request.requests
.map(subRequest => subRequest instanceof batch_change_set_1.BatchChangeSet
? serializeChangeSet(subRequest, options)
: serializeRequest(subRequest, options))
.filter(validRequest => !!validRequest)
.join(`${util_1.unixEOL}--${request.requestConfig.boundary}${util_1.unixEOL}`);
const serializedBatchRequest = serializedSubRequests
? [
`--${request.requestConfig.boundary}`,
serializedSubRequests,
`--${request.requestConfig.boundary}--`,
''
].join(util_1.unixEOL)
: serializedSubRequests;
// The batch standard expects CRLF line endings for batch requests
return serializedBatchRequest.replace(/\n/g, '\r\n');
}
//# sourceMappingURL=batch-request-serializer.js.map