metaapi.cloud-sdk
Version:
SDK for MetaApi, a professional cloud forex API which includes MetaTrader REST API and MetaTrader websocket API. Supports both MetaTrader 5 (MT5) and MetaTrader 4 (MT4). CopyFactory copy trading API included. (https://metaapi.cloud)
174 lines (173 loc) • 15.9 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
function _export(target, all) {
for(var name in all)Object.defineProperty(target, name, {
enumerable: true,
get: all[name]
});
}
_export(exports, {
ApiError: function() {
return ApiError;
},
ConflictError: function() {
return ConflictError;
},
ForbiddenError: function() {
return ForbiddenError;
},
InternalError: function() {
return InternalError;
},
NotFoundError: function() {
return NotFoundError;
},
TooManyRequestsError: function() {
return TooManyRequestsError;
},
UnauthorizedError: function() {
return UnauthorizedError;
},
ValidationError: function() {
return ValidationError;
}
});
function _define_property(obj, key, value) {
if (key in obj) {
Object.defineProperty(obj, key, {
value: value,
enumerable: true,
configurable: true,
writable: true
});
} else {
obj[key] = value;
}
return obj;
}
/**
* Base class for API errors. Contains indication of HTTP status.
*/ const isNode = typeof process !== "undefined" && process.release && process.release.name === "node";
let ApiError = class ApiError extends Error {
/**
* Sets error code, used for i18n
* @param {string} code error code for i18n
*/ set code(code) {
this._code = code;
}
/**
* Returns error code used for i18n
* @return {string} error code
*/ get code() {
return this._code;
}
/**
* Set message arguments for i18n
* @param {Array<Object>} args arguments for i18n
*/ set arguments(args) {
this._args = args;
}
/**
* Returns message arguments for i18n
* @return {Array<Object>} message arguments for i18n
*/ get arguments() {
return this._args;
}
/**
* ApiError constructor
* @param clazz error function
* @param message error message
* @param status HTTP status
* @param url API request URL
*/ constructor(clazz, message, status, url){
super(url ? message + ". Request URL: " + url : message);
/** HTTP status code */ _define_property(this, "status", void 0);
/** API request URL */ _define_property(this, "url", void 0);
_define_property(this, "_code", void 0);
_define_property(this, "_args", void 0);
this.name = "ApiError";
this.status = status;
this.url = url;
if (isNode && Error.captureStackTrace) {
Error.captureStackTrace(this, clazz);
}
}
};
let NotFoundError = class NotFoundError extends ApiError {
/**
* Represents NotFoundError.
* @param {string} message error message
* @param {string} url API request URL
*/ constructor(message, url){
super(NotFoundError, message, 404, url);
this.name = "NotFoundError";
}
};
let ForbiddenError = class ForbiddenError extends ApiError {
/**
* Constructs forbidden error.
* @param {string} message error message
* @param {string} url API request URL
*/ constructor(message, url){
super(ForbiddenError, message, 403, url);
this.name = "ForbiddenError";
}
};
let UnauthorizedError = class UnauthorizedError extends ApiError {
/**
* Constructs unauthorized error.
* @param {string} message error message
* @param {string} url API request URL
*/ constructor(message, url){
super(UnauthorizedError, message, 401, url);
this.name = "UnauthorizedError";
}
};
let ValidationError = class ValidationError extends ApiError {
/**
* Constructs validation error.
* @param {string} message error message
* @param {Object} details error data
* @param {string} url API request URL
*/ constructor(message, details, url){
super(ValidationError, message, 400, url);
/** Validation error details */ _define_property(this, "details", void 0);
this.name = "ValidationError";
this.details = details;
}
};
let InternalError = class InternalError extends ApiError {
/**
* Constructs unexpected error.
* @param {string} message error message
* @param {string} url API request URL
*/ constructor(message, url){
super(InternalError, message, 500, url);
this.name = "InternalError";
}
};
let ConflictError = class ConflictError extends ApiError {
/**
* Constructs conflict error.
* @param {string} message error message
* @param {string} url API request URL
*/ constructor(message, url){
super(ConflictError, message, 409, url);
this.name = "ConflictError";
}
};
let TooManyRequestsError = class TooManyRequestsError extends ApiError {
/**
* Constructs too many requests error.
* @param {string} message error message
* @param {TooManyRequestsErrorMetadata} metadata error metadata
*/ constructor(message, metadata, url){
super(TooManyRequestsError, message, 429, url);
/** error metadata */ _define_property(this, "metadata", void 0);
this.name = "TooManyRequestsError";
this.metadata = metadata;
}
};
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIjxhbm9uPiJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG5cbi8qKlxuICogQmFzZSBjbGFzcyBmb3IgQVBJIGVycm9ycy4gQ29udGFpbnMgaW5kaWNhdGlvbiBvZiBIVFRQIHN0YXR1cy5cbiAqL1xuXG5jb25zdCBpc05vZGUgPSB0eXBlb2YgcHJvY2VzcyAhPT0gJ3VuZGVmaW5lZCcgJiYgcHJvY2Vzcy5yZWxlYXNlICYmIHByb2Nlc3MucmVsZWFzZS5uYW1lID09PSAnbm9kZSc7XG5cbi8qKlxuICogQmFzZSBjbGFzcyBmb3IgQVBJIGVycm9ycy4gQ29udGFpbnMgaW5kaWNhdGlvbiBvZiBIVFRQIHN0YXR1cy5cbiAqL1xuZXhwb3J0IGNsYXNzIEFwaUVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICBcbiAgLyoqIEhUVFAgc3RhdHVzIGNvZGUgKi9cbiAgcHVibGljIHN0YXR1czogbnVtYmVyO1xuICAvKiogQVBJIHJlcXVlc3QgVVJMICovXG4gIHB1YmxpYyB1cmw6IHN0cmluZztcbiAgcHJpdmF0ZSBfY29kZTogYW55O1xuICBwcml2YXRlIF9hcmdzOiBhbnk7XG5cbiAgLyoqXG4gICAqIEFwaUVycm9yIGNvbnN0cnVjdG9yXG4gICAqIEBwYXJhbSBjbGF6eiBlcnJvciBmdW5jdGlvblxuICAgKiBAcGFyYW0gbWVzc2FnZSBlcnJvciBtZXNzYWdlXG4gICAqIEBwYXJhbSBzdGF0dXMgSFRUUCBzdGF0dXNcbiAgICogQHBhcmFtIHVybCBBUEkgcmVxdWVzdCBVUkxcbiAgICovXG4gIGNvbnN0cnVjdG9yKGNsYXp6OiBGdW5jdGlvbiwgbWVzc2FnZTogc3RyaW5nLCBzdGF0dXM6IG51bWJlciwgdXJsPzogc3RyaW5nKSB7XG4gICAgc3VwZXIodXJsID8gbWVzc2FnZSArICcuIFJlcXVlc3QgVVJMOiAnICsgdXJsIDogbWVzc2FnZSk7XG4gICAgdGhpcy5uYW1lID0gJ0FwaUVycm9yJztcbiAgICB0aGlzLnN0YXR1cyA9IHN0YXR1cztcbiAgICB0aGlzLnVybCA9IHVybDtcblxuICAgIGlmIChpc05vZGUgJiYgRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UpIHtcbiAgICAgIEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKHRoaXMsIGNsYXp6KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2V0cyBlcnJvciBjb2RlLCB1c2VkIGZvciBpMThuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjb2RlIGVycm9yIGNvZGUgZm9yIGkxOG5cbiAgICovXG4gIHNldCBjb2RlKGNvZGU6IHN0cmluZykge1xuICAgIHRoaXMuX2NvZGUgPSBjb2RlO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgZXJyb3IgY29kZSB1c2VkIGZvciBpMThuXG4gICAqIEByZXR1cm4ge3N0cmluZ30gZXJyb3IgY29kZVxuICAgKi9cbiAgZ2V0IGNvZGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fY29kZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgbWVzc2FnZSBhcmd1bWVudHMgZm9yIGkxOG5cbiAgICogQHBhcmFtIHtBcnJheTxPYmplY3Q+fSBhcmdzIGFyZ3VtZW50cyBmb3IgaTE4blxuICAgKi9cbiAgc2V0IGFyZ3VtZW50cyhhcmdzOiBBcnJheTxPYmplY3Q+KSB7XG4gICAgdGhpcy5fYXJncyA9IGFyZ3M7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBtZXNzYWdlIGFyZ3VtZW50cyBmb3IgaTE4blxuICAgKiBAcmV0dXJuIHtBcnJheTxPYmplY3Q+fSBtZXNzYWdlIGFyZ3VtZW50cyBmb3IgaTE4blxuICAgKi9cbiAgZ2V0IGFyZ3VtZW50cygpOiBBcnJheTxPYmplY3Q+IHtcbiAgICByZXR1cm4gdGhpcy5fYXJncztcbiAgfVxufVxuXG4vKipcbiAqIFRocm93aW5nIHRoaXMgZXJyb3IgcmVzdWx0cyBpbiA0MDQgKE5vdCBGb3VuZCkgSFRUUCByZXNwb25zZSBjb2RlLlxuICovXG5leHBvcnQgY2xhc3MgTm90Rm91bmRFcnJvciBleHRlbmRzIEFwaUVycm9yIHtcblxuICAvKipcbiAgICogUmVwcmVzZW50cyBOb3RGb3VuZEVycm9yLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbWVzc2FnZSBlcnJvciBtZXNzYWdlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB1cmwgQVBJIHJlcXVlc3QgVVJMXG4gICAqL1xuICBjb25zdHJ1Y3RvcihtZXNzYWdlOiBzdHJpbmcsIHVybD86IHN0cmluZykge1xuICAgIHN1cGVyKE5vdEZvdW5kRXJyb3IsIG1lc3NhZ2UsIDQwNCwgdXJsKTtcbiAgICB0aGlzLm5hbWUgPSAnTm90Rm91bmRFcnJvcic7XG4gIH1cbn1cblxuLyoqXG4gKiBUaHJvd2luZyB0aGlzIGVycm9yIHJlc3VsdHMgaW4gNDAzIChGb3JiaWRkZW4pIEhUVFAgcmVzcG9uc2UgY29kZS5cbiAqL1xuZXhwb3J0IGNsYXNzIEZvcmJpZGRlbkVycm9yIGV4dGVuZHMgQXBpRXJyb3Ige1xuXG4gIC8qKlxuICAgKiBDb25zdHJ1Y3RzIGZvcmJpZGRlbiBlcnJvci5cbiAgICogQHBhcmFtIHtzdHJpbmd9IG1lc3NhZ2UgZXJyb3IgbWVzc2FnZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gdXJsIEFQSSByZXF1ZXN0IFVSTFxuICAgKi9cbiAgY29uc3RydWN0b3IobWVzc2FnZTogc3RyaW5nLCB1cmw/OiBzdHJpbmcpIHtcbiAgICBzdXBlcihGb3JiaWRkZW5FcnJvciwgbWVzc2FnZSwgNDAzLCB1cmwpO1xuICAgIHRoaXMubmFtZSA9ICdGb3JiaWRkZW5FcnJvcic7XG4gIH1cbn1cblxuLyoqXG4gKiBUaHJvd2luZyB0aGlzIGVycm9yIHJlc3VsdHMgaW4gNDAxIChVbmF1dGhvcml6ZWQpIEhUVFAgcmVzcG9uc2UgY29kZS5cbiAqL1xuZXhwb3J0IGNsYXNzIFVuYXV0aG9yaXplZEVycm9yIGV4dGVuZHMgQXBpRXJyb3Ige1xuXG4gIC8qKlxuICAgKiBDb25zdHJ1Y3RzIHVuYXV0aG9yaXplZCBlcnJvci5cbiAgICogQHBhcmFtIHtzdHJpbmd9IG1lc3NhZ2UgZXJyb3IgbWVzc2FnZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gdXJsIEFQSSByZXF1ZXN0IFVSTFxuICAgKi9cbiAgY29uc3RydWN0b3IobWVzc2FnZTogc3RyaW5nLCB1cmw/OiBzdHJpbmcpIHtcbiAgICBzdXBlcihVbmF1dGhvcml6ZWRFcnJvciwgbWVzc2FnZSwgNDAxLCB1cmwpO1xuICAgIHRoaXMubmFtZSA9ICdVbmF1dGhvcml6ZWRFcnJvcic7XG4gIH1cbn1cblxuLyoqXG4gKiBSZXByZXNlbnRzIHZhbGlkYXRpb24gZXJyb3IuIFRocm93aW5nIHRoaXMgZXJyb3IgcmVzdWx0cyBpbiA0MDAgKEJhZCBSZXF1ZXN0KSBIVFRQIHJlc3BvbnNlIGNvZGUuXG4gKi9cbmV4cG9ydCBjbGFzcyBWYWxpZGF0aW9uRXJyb3IgZXh0ZW5kcyBBcGlFcnJvciB7XG4gIFxuICAvKiogVmFsaWRhdGlvbiBlcnJvciBkZXRhaWxzICovXG4gIHB1YmxpYyBkZXRhaWxzOiBvYmplY3Q7XG5cbiAgLyoqXG4gICAqIENvbnN0cnVjdHMgdmFsaWRhdGlvbiBlcnJvci5cbiAgICogQHBhcmFtIHtzdHJpbmd9IG1lc3NhZ2UgZXJyb3IgbWVzc2FnZVxuICAgKiBAcGFyYW0ge09iamVjdH0gZGV0YWlscyBlcnJvciBkYXRhXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB1cmwgQVBJIHJlcXVlc3QgVVJMXG4gICAqL1xuICBjb25zdHJ1Y3RvcihtZXNzYWdlOiBzdHJpbmcsIGRldGFpbHM/OiBPYmplY3QsIHVybD86IHN0cmluZykge1xuICAgIHN1cGVyKFZhbGlkYXRpb25FcnJvciwgbWVzc2FnZSwgNDAwLCB1cmwpO1xuICAgIHRoaXMubmFtZSA9ICdWYWxpZGF0aW9uRXJyb3InO1xuICAgIHRoaXMuZGV0YWlscyA9IGRldGFpbHM7XG4gIH1cbn1cblxuLyoqXG4gKiBSZXByZXNlbnRzIHVuZXhwZWN0ZWQgZXJyb3IuIFRocm93aW5nIHRoaXMgZXJyb3IgcmVzdWx0cyBpbiA1MDAgKEludGVybmFsIEVycm9yKSBIVFRQIHJlc3BvbnNlIGNvZGUuXG4gKi9cbmV4cG9ydCBjbGFzcyBJbnRlcm5hbEVycm9yIGV4dGVuZHMgQXBpRXJyb3Ige1xuXG4gIC8qKlxuICAgKiBDb25zdHJ1Y3RzIHVuZXhwZWN0ZWQgZXJyb3IuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBtZXNzYWdlIGVycm9yIG1lc3NhZ2VcbiAgICogQHBhcmFtIHtzdHJpbmd9IHVybCBBUEkgcmVxdWVzdCBVUkxcbiAgICovXG4gIGNvbnN0cnVjdG9yKG1lc3NhZ2U6IHN0cmluZywgdXJsPzogc3RyaW5nKSB7XG4gICAgc3VwZXIoSW50ZXJuYWxFcnJvciwgbWVzc2FnZSwgNTAwLCB1cmwpO1xuICAgIHRoaXMubmFtZSA9ICdJbnRlcm5hbEVycm9yJztcbiAgfVxufVxuXG4vKipcbiAqIFJlcHJlc2VudHMgY29uZmxpY3QgZXJyb3IuIFRocm93aW5nIHRoaXMgZXJyb3IgcmVzdWx0cyBpbiA0MDkgKENvbmZsaWN0KSBIVFRQIHJlc3BvbnNlIGNvZGUuXG4gKi9cbmV4cG9ydCBjbGFzcyBDb25mbGljdEVycm9yIGV4dGVuZHMgQXBpRXJyb3Ige1xuICAvKipcbiAgICogQ29uc3RydWN0cyBjb25mbGljdCBlcnJvci5cbiAgICogQHBhcmFtIHtzdHJpbmd9IG1lc3NhZ2UgZXJyb3IgbWVzc2FnZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gdXJsIEFQSSByZXF1ZXN0IFVSTFxuICAgKi9cbiAgY29uc3RydWN0b3IobWVzc2FnZTogc3RyaW5nLCB1cmw/OiBzdHJpbmcpIHtcbiAgICBzdXBlcihDb25mbGljdEVycm9yLCBtZXNzYWdlLCA0MDksIHVybCk7XG4gICAgdGhpcy5uYW1lID0gJ0NvbmZsaWN0RXJyb3InO1xuICB9XG59XG5cbi8qKlxuICogbWV0YWRhdGEgZm9yIHRvbyBtYW55IHJlcXVlc3RzIGVycm9yXG4gKi9cbmV4cG9ydCB0eXBlIFRvb01hbnlSZXF1ZXN0c0Vycm9yTWV0YWRhdGEgPSB7XG4gIC8qKiB0aHJvdHRsaW5nIHBlcmlvZCBpbiBtaW51dGVzICovXG4gIHBlcmlvZEluTWludXRlcz86IG51bWJlcixcbiAgLyoqIGF2YWlsYWJsZSByZXF1ZXN0cyBmb3IgcGVyaW9kSW5NaW51dGVzICovXG4gIHJlcXVlc3RzUGVyUGVyaW9kQWxsb3dlZD86IG51bWJlcixcbiAgLyoqIHJlY29tbWVuZGVkIGRhdGUgdG8gcmV0cnkgcmVxdWVzdCAqL1xuICByZWNvbW1lbmRlZFJldHJ5VGltZTogRGF0ZSB8IHN0cmluZyxcbiAgLyoqIGVycm9yIHR5cGUgKi9cbiAgdHlwZT86IHN0cmluZ1xufVxuXG4vKipcbiAqIFJlcHJlc2VudHMgdG9vIG1hbnkgcmVxdWVzdHMgZXJyb3IuIFRocm93aW5nIHRoaXMgZXJyb3IgcmVzdWx0cyBpbiA0MjkgKFRvbyBNYW55IFJlcXVlc3RzKSBIVFRQIHJlc3BvbnNlIGNvZGUuXG4gKi9cbmV4cG9ydCBjbGFzcyBUb29NYW55UmVxdWVzdHNFcnJvciBleHRlbmRzIEFwaUVycm9yIHtcbiAgXG4gIC8qKiBlcnJvciBtZXRhZGF0YSAqL1xuICBwdWJsaWMgbWV0YWRhdGE6IFRvb01hbnlSZXF1ZXN0c0Vycm9yTWV0YWRhdGE7XG5cbiAgLyoqXG4gICAqIENvbnN0cnVjdHMgdG9vIG1hbnkgcmVxdWVzdHMgZXJyb3IuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBtZXNzYWdlIGVycm9yIG1lc3NhZ2VcbiAgICogQHBhcmFtIHtUb29NYW55UmVxdWVzdHNFcnJvck1ldGFkYXRhfSBtZXRhZGF0YSBlcnJvciBtZXRhZGF0YVxuICAgKi9cbiAgY29uc3RydWN0b3IobWVzc2FnZTogc3RyaW5nLCBtZXRhZGF0YTogVG9vTWFueVJlcXVlc3RzRXJyb3JNZXRhZGF0YSwgdXJsPzogc3RyaW5nKSB7XG4gICAgc3VwZXIoVG9vTWFueVJlcXVlc3RzRXJyb3IsIG1lc3NhZ2UsIDQyOSwgdXJsKTtcbiAgICB0aGlzLm5hbWUgPSAnVG9vTWFueVJlcXVlc3RzRXJyb3InO1xuICAgIHRoaXMubWV0YWRhdGEgPSBtZXRhZGF0YTtcbiAgfVxufVxuIl0sIm5hbWVzIjpbIkFwaUVycm9yIiwiQ29uZmxpY3RFcnJvciIsIkZvcmJpZGRlbkVycm9yIiwiSW50ZXJuYWxFcnJvciIsIk5vdEZvdW5kRXJyb3IiLCJUb29NYW55UmVxdWVzdHNFcnJvciIsIlVuYXV0aG9yaXplZEVycm9yIiwiVmFsaWRhdGlvbkVycm9yIiwiaXNOb2RlIiwicHJvY2VzcyIsInJlbGVhc2UiLCJuYW1lIiwiRXJyb3IiLCJjb2RlIiwiX2NvZGUiLCJhcmd1bWVudHMiLCJhcmdzIiwiX2FyZ3MiLCJjb25zdHJ1Y3RvciIsImNsYXp6IiwibWVzc2FnZSIsInN0YXR1cyIsInVybCIsImNhcHR1cmVTdGFja1RyYWNlIiwiZGV0YWlscyIsIm1ldGFkYXRhIl0sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7SUFXYUEsUUFBUTtlQUFSQTs7SUFvSkFDLGFBQWE7ZUFBYkE7O0lBckVBQyxjQUFjO2VBQWRBOztJQXFEQUMsYUFBYTtlQUFiQTs7SUFyRUFDLGFBQWE7ZUFBYkE7O0lBa0hBQyxvQkFBb0I7ZUFBcEJBOztJQWxGQUMsaUJBQWlCO2VBQWpCQTs7SUFnQkFDLGVBQWU7ZUFBZkE7Ozs7Ozs7Ozs7Ozs7Ozs7QUF4SGI7O0NBRUMsR0FFRCxNQUFNQyxTQUFTLE9BQU9DLFlBQVksZUFBZUEsUUFBUUMsT0FBTyxJQUFJRCxRQUFRQyxPQUFPLENBQUNDLElBQUksS0FBSztBQUt0RixJQUFBLEFBQU1YLFdBQU4sTUFBTUEsaUJBQWlCWTtJQTJCNUI7OztHQUdDLEdBQ0QsSUFBSUMsS0FBS0EsSUFBWSxFQUFFO1FBQ3JCLElBQUksQ0FBQ0MsS0FBSyxHQUFHRDtJQUNmO0lBRUE7OztHQUdDLEdBQ0QsSUFBSUEsT0FBZTtRQUNqQixPQUFPLElBQUksQ0FBQ0MsS0FBSztJQUNuQjtJQUVBOzs7R0FHQyxHQUNELElBQUlDLFVBQVVDLElBQW1CLEVBQUU7UUFDakMsSUFBSSxDQUFDQyxLQUFLLEdBQUdEO0lBQ2Y7SUFFQTs7O0dBR0MsR0FDRCxJQUFJRCxZQUEyQjtRQUM3QixPQUFPLElBQUksQ0FBQ0UsS0FB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