amberflo-metering-typescript
Version:
Amberflo metering client for TypeScript
97 lines • 3.82 kB
JavaScript
;
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.IngestApiClient = void 0;
const axios_retry_1 = require("axios-retry");
const baseClient_1 = __importDefault(require("../baseClient"));
const constants_1 = require("../model/constants");
class IngestApiClient extends baseClient_1.default {
/**
* Initialize a new `IngestApiClient`
* `debug`: Whether to issue debug level logs or not.
* `retry`: Whether to retry on 429, 5xx, or network errors, or retry configuration (see https://github.com/softonic/axios-retry).
*/
constructor(apiKey, debug = false, retry = {}) {
super(apiKey, debug, 'IngestApiClient', toRetryOptions(retry));
this.path = '/ingest';
this.axiosInstance.defaults.baseURL = constants_1.ingestBaseUrl;
}
logResponse(response, requestId) {
if (response.status < 200 || response.status >= 300) {
this.logError('request failed:', requestId, response.status, response.data);
}
else {
this.logDebug('request completed:', requestId, response.status, response.data);
}
}
post(payload, requestId, done) {
this.logDebug('about to post meters:', requestId);
return this.axiosInstance
.post(this.path, payload)
.then((response) => {
this.logResponse(response, requestId);
if (done) {
done();
}
})
.catch((error) => {
this.logError('request failed:', requestId, error);
if (done) {
done();
}
});
}
postSync(payload, requestId) {
return __awaiter(this, void 0, void 0, function* () {
this.logDebug('about to post meters:', requestId);
try {
const response = yield this.axiosInstance.post(this.path, payload);
this.logResponse(response, requestId);
return response;
}
catch (error) {
this.logError('request failed:', requestId, error);
}
});
}
}
exports.IngestApiClient = IngestApiClient;
const defaultRetryOptions = {
retries: 6,
retryDelay,
retryCondition,
};
function toRetryOptions(retry) {
if (!retry)
return false;
if (retry === true) {
return defaultRetryOptions;
}
return Object.assign(Object.assign({}, defaultRetryOptions), retry);
}
const retryDelays = [2, 6, 12, 20, 40, 80];
function retryDelay(retryNumber = 0) {
const delay = retryNumber >= retryDelays.length
? 80
: retryDelays[retryNumber];
return delay * Math.random(); // full jitter
}
function retryCondition(error) {
var _a;
const status = (_a = error.response) === null || _a === void 0 ? void 0 : _a.status;
return status
? (status === 429 || status >= 500)
: (0, axios_retry_1.isNetworkError)(error);
}
//# sourceMappingURL=ingestApiClient.js.map