@azure/cosmos
Version:
Microsoft Azure Cosmos DB Service Node.js SDK for NOSQL API
148 lines (147 loc) • 6.14 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);
var BulkResponse_exports = {};
__export(BulkResponse_exports, {
BulkResponse: () => BulkResponse
});
module.exports = __toCommonJS(BulkResponse_exports);
var import_constants = require("../common/constants.js");
var import_statusCodes = require("../common/statusCodes.js");
var import__ = require("../index.js");
var import_batch = require("../utils/batch.js");
class BulkResponse {
statusCode;
subStatusCode;
headers;
operations;
results = [];
diagnostics;
constructor(statusCode, subStatusCode, headers, operations) {
this.statusCode = statusCode;
this.subStatusCode = subStatusCode;
this.headers = headers;
this.operations = operations;
}
/**
* Generate empty response object
*/
static createEmptyResponse(operations, statusCode, subStatusCode, headers) {
const bulkResponse = new BulkResponse(statusCode, subStatusCode, headers, operations);
bulkResponse.createAndPopulateResults(operations, 0, new import__.ErrorResponse());
return bulkResponse;
}
/**
* static method to create BulkResponse from Response object
*/
static fromResponseMessage(responseMessage, operations) {
let bulkResponse = this.populateFromResponse(responseMessage, operations);
if (!bulkResponse.results || bulkResponse.results.length !== operations.length) {
if ((0, import_batch.isSuccessStatusCode)(responseMessage.code)) {
bulkResponse = new BulkResponse(
import_statusCodes.StatusCodes.InternalServerError,
import_statusCodes.SubStatusCodes.Unknown,
responseMessage.headers,
operations
);
}
let retryAfterMilliseconds = 0;
if (responseMessage.code === import_statusCodes.StatusCodes.TooManyRequests) {
const retryAfter = responseMessage.headers?.[import_constants.Constants.HttpHeaders.RetryAfterInMs];
retryAfterMilliseconds = !retryAfter || isNaN(Number(retryAfter)) ? 0 : Number(retryAfter);
}
bulkResponse.createAndPopulateResults(
operations,
retryAfterMilliseconds,
responseMessage
);
}
return bulkResponse;
}
static populateFromResponse(responseMessage, operations) {
const results = [];
if (responseMessage.result) {
for (let i = 0; i < operations.length; i++) {
const itemResponse = responseMessage.result[i];
if ((0, import_batch.isSuccessStatusCode)(itemResponse?.statusCode)) {
const result = {
statusCode: itemResponse?.statusCode,
eTag: itemResponse?.eTag,
activityId: responseMessage.headers?.[import_constants.Constants.HttpHeaders.ActivityId],
sessionToken: responseMessage.headers?.[import_constants.Constants.HttpHeaders.SessionToken],
requestCharge: itemResponse?.requestCharge,
resourceBody: itemResponse?.resourceBody,
// diagnostics will be filled in Batcher dispatch to capture the complete diagnostics(e.g. decryption)
diagnostics: null,
headers: responseMessage.headers
};
results.push(result);
} else {
const error = new import__.ErrorResponse();
error.code = itemResponse?.statusCode;
error.substatus = itemResponse?.subStatusCode;
error.message = itemResponse?.message;
error.requestCharge = itemResponse?.requestCharge;
error.body = itemResponse?.resourceBody;
error.headers = responseMessage.headers;
error.activityId = responseMessage.headers?.[import_constants.Constants.HttpHeaders.ActivityId];
error.retryAfterInMs = itemResponse?.retryAfterMilliseconds;
error.diagnostics = responseMessage.diagnostics;
results.push(error);
}
}
}
let statusCode = responseMessage.code;
let subStatusCode = responseMessage.substatus;
if (responseMessage.code === import_statusCodes.StatusCodes.MultiStatus) {
for (const result of results) {
if (result instanceof import__.ErrorResponse && result.statusCode !== import_statusCodes.StatusCodes.FailedDependency && result.statusCode >= import_statusCodes.StatusCodes.BadRequest) {
statusCode = typeof result.code === "number" ? result.code : Number(result.code);
subStatusCode = result.substatus;
break;
}
}
}
const bulkResponse = new BulkResponse(
statusCode,
subStatusCode,
responseMessage.headers,
operations
);
bulkResponse.results = results;
return bulkResponse;
}
createAndPopulateResults(operations, retryAfterInMs, error) {
this.results = operations.map(() => {
const errorResponse = new import__.ErrorResponse();
errorResponse.message = error.message;
errorResponse.code = this.statusCode;
errorResponse.substatus = this.subStatusCode;
errorResponse.retryAfterInMs = retryAfterInMs;
errorResponse.activityId = this.headers?.[import_constants.Constants.HttpHeaders.ActivityId];
errorResponse.body = error.body;
errorResponse.diagnostics = error.diagnostics;
errorResponse.headers = this.headers;
errorResponse.requestCharge = error.requestCharge;
return errorResponse;
});
}
}
// Annotate the CommonJS export names for ESM import in node:
0 && (module.exports = {
BulkResponse
});