mindee
Version:
Mindee Client Library for Node.js
244 lines (243 loc) • 10.9 kB
JavaScript
var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
};
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
var _Endpoint_instances, _Endpoint_predictReqPost, _Endpoint_predictAsyncReqPost, _Endpoint_documentQueueReqGet, _Endpoint_documentGetReq, _Endpoint_documentFeedbackPutReq;
Object.defineProperty(exports, "__esModule", { value: true });
exports.Endpoint = void 0;
const url_1 = require("url");
const form_data_1 = __importDefault(require("form-data"));
const input_1 = require("../input");
const error_1 = require("./error");
const baseEndpoint_1 = require("./baseEndpoint");
const responseValidation_1 = require("./responseValidation");
/**
* Endpoint for a product (OTS or Custom).
*/
class Endpoint extends baseEndpoint_1.BaseEndpoint {
constructor(urlName, owner, version, settings) {
super(settings, `/v1/products/${owner}/${urlName}/v${version}`);
_Endpoint_instances.add(this);
this.owner = owner;
this.urlName = urlName;
this.version = version;
}
/**
* Changes the url to a workflow ID.
* @param workflowId
*/
useWorkflowId(workflowId) {
this.urlRoot = `/v1/workflows/${workflowId}`;
}
/**
* Sends a document to the API and parses out the result.
* Throws an error if the server's response contains one.
* @param {PredictParams} params parameters relating to prediction options.
* @category Synchronous
* @returns a `Promise` containing parsing results.
*/
async predict(params) {
await params.inputDoc.init();
if (params.pageOptions !== undefined) {
await baseEndpoint_1.BaseEndpoint.cutDocPages(params.inputDoc, params.pageOptions);
}
const response = await __classPrivateFieldGet(this, _Endpoint_instances, "m", _Endpoint_predictReqPost).call(this, params.inputDoc, params.includeWords, params.fullText, params.cropper);
if (!(0, responseValidation_1.isValidSyncResponse)(response)) {
(0, error_1.handleError)(this.urlName, response, this.extractStatusMessage(response));
}
return response;
}
/**
* Enqueues a prediction to the API.
* Throws an error if the server's response contains one.
* @param {PredictParams} params parameters relating to prediction options.
* @category Asynchronous
* @returns a `Promise` containing queue data.
*/
async predictAsync(params) {
await params.inputDoc.init();
if (params.pageOptions !== undefined) {
await baseEndpoint_1.BaseEndpoint.cutDocPages(params.inputDoc, params.pageOptions);
}
const response = await __classPrivateFieldGet(this, _Endpoint_instances, "m", _Endpoint_predictAsyncReqPost).call(this, params.inputDoc, params.includeWords, params.fullText, params.cropper, params.rag, params.workflowId);
if (!(0, responseValidation_1.isValidAsyncResponse)(response)) {
(0, error_1.handleError)(this.urlName, response, this.extractStatusMessage(response));
}
return response;
}
extractStatusMessage(response) {
if (response.messageObj?.statusMessage !== undefined && response.messageObj?.statusMessage !== null) {
return response.messageObj?.statusMessage;
}
const errorDetail = response.data?.api_request?.error?.detail;
if (errorDetail) {
return JSON.stringify(errorDetail);
}
const errorMessage = response.data?.api_request?.error?.message;
if (errorMessage) {
return JSON.stringify(errorMessage);
}
return undefined;
}
/**
* Requests the results of a queued document from the API.
* Throws an error if the server's response contains one.
* @param queueId The document's ID in the queue.
* @category Asynchronous
* @returns a `Promise` containing the parsed result.
*/
async getQueuedDocument(queueId) {
const queueResponse = await __classPrivateFieldGet(this, _Endpoint_instances, "m", _Endpoint_documentQueueReqGet).call(this, queueId);
const queueStatusCode = queueResponse.messageObj.statusCode;
if (!(0, responseValidation_1.isValidAsyncResponse)(queueResponse)) {
(0, error_1.handleError)(this.urlName, queueResponse, this.extractStatusMessage(queueResponse));
}
if (queueStatusCode === 302 &&
queueResponse.messageObj.headers.location !== undefined) {
const docId = queueResponse.messageObj.headers.location.split("/").pop();
if (docId !== undefined) {
return await __classPrivateFieldGet(this, _Endpoint_instances, "m", _Endpoint_documentGetReq).call(this, docId);
}
}
return queueResponse;
}
/**
* Send a feedback
* @param {string} documentId
*/
async getDocument(documentId) {
const response = await __classPrivateFieldGet(this, _Endpoint_instances, "m", _Endpoint_documentGetReq).call(this, documentId);
if (!(0, responseValidation_1.isValidAsyncResponse)(response)) {
(0, error_1.handleError)("document", response, this.extractStatusMessage(response));
}
return response;
}
/**
* Send a feedback
* @param {string} documentId - ID of the document to send feedback to.
* @param {StringDict} feedback - Feedback object to send.
*/
async sendFeedback(documentId, feedback) {
const response = await __classPrivateFieldGet(this, _Endpoint_instances, "m", _Endpoint_documentFeedbackPutReq).call(this, documentId, feedback);
if (!(0, responseValidation_1.isValidSyncResponse)(response)) {
(0, error_1.handleError)("feedback", response, this.extractStatusMessage(response));
}
return response;
}
/**
* Send a file to a prediction API.
* @param input
* @param predictUrl
* @param includeWords
* @param fullText
* @param cropper
* @param rag
* @param workflowId
*/
sendFileForPrediction(input, predictUrl, includeWords = false, fullText = false, cropper = false, rag = false, workflowId = undefined) {
return new Promise((resolve, reject) => {
const searchParams = new url_1.URLSearchParams();
if (cropper) {
searchParams.append("cropper", "true");
}
if (rag) {
searchParams.append("rag", "true");
}
if (fullText) {
searchParams.append("full_text_ocr", "true");
}
const form = new form_data_1.default();
if (input instanceof input_1.LocalInputSource && input.fileObject instanceof Buffer) {
form.append("document", input.fileObject, {
filename: input.filename,
});
}
else {
form.append("document", input.fileObject);
}
if (includeWords) {
form.append("include_mvision", "true");
}
const headers = { ...this.settings.baseHeaders, ...form.getHeaders() };
let path;
if (workflowId === undefined) {
path = `${this.urlRoot}/${predictUrl}`;
}
else {
path = `/v1/workflows/${workflowId}/predict_async`;
}
if (searchParams.toString().length > 0) {
path += `?${searchParams}`;
}
const options = {
method: "POST",
headers: headers,
hostname: this.settings.hostname,
path: path,
timeout: this.settings.timeout,
};
const req = baseEndpoint_1.BaseEndpoint.readResponse(options, resolve, reject);
form.pipe(req);
// potential ECONNRESET if we don't end the request.
req.end();
});
}
}
exports.Endpoint = Endpoint;
_Endpoint_instances = new WeakSet(), _Endpoint_predictReqPost = function _Endpoint_predictReqPost(input, includeWords = false, fullText = false, cropper = false) {
return this.sendFileForPrediction(input, "predict", includeWords, fullText, cropper);
}, _Endpoint_predictAsyncReqPost = function _Endpoint_predictAsyncReqPost(
/**
* Make a request to POST a document for async prediction.
* @param input
* @param includeWords
* @param fullText
* @param cropper
* @param rag
* @param workflowId
*/
input, includeWords = false, fullText = false, cropper = false, rag = false, workflowId = undefined) {
return this.sendFileForPrediction(input, "predict_async", includeWords, fullText, cropper, rag, workflowId);
}, _Endpoint_documentQueueReqGet = function _Endpoint_documentQueueReqGet(queueId) {
return new Promise((resolve, reject) => {
const options = {
method: "GET",
headers: this.settings.baseHeaders,
hostname: this.settings.hostname,
path: `${this.urlRoot}/documents/queue/${queueId}`,
};
const req = baseEndpoint_1.BaseEndpoint.readResponse(options, resolve, reject);
// potential ECONNRESET if we don't end the request.
req.end();
});
}, _Endpoint_documentGetReq = function _Endpoint_documentGetReq(documentId) {
return new Promise((resolve, reject) => {
const options = {
method: "GET",
headers: this.settings.baseHeaders,
hostname: this.settings.hostname,
path: `${this.urlRoot}/documents/${documentId}`,
};
const req = baseEndpoint_1.BaseEndpoint.readResponse(options, resolve, reject);
// potential ECONNRESET if we don't end the request.
req.end();
});
}, _Endpoint_documentFeedbackPutReq = function _Endpoint_documentFeedbackPutReq(documentId, feedback) {
return new Promise((resolve, reject) => {
const options = {
method: "PUT",
headers: this.settings.baseHeaders,
hostname: this.settings.hostname,
path: `/v1/documents/${documentId}/feedback`,
};
const req = baseEndpoint_1.BaseEndpoint.readResponse(options, resolve, reject);
req.write(JSON.stringify(feedback));
// potential ECONNRESET if we don't end the request.
req.end();
});
};
;