@hashgraphonline/standards-sdk
Version:
The Hashgraph Online Standards SDK provides a complete implementation of the Hashgraph Consensus Standards (HCS), giving developers all the tools needed to build applications on Hedera.
164 lines (163 loc) • 4.63 kB
JavaScript
import { Logger } from "./standards-sdk.es22.js";
class ProgressReporter {
constructor(options = {}) {
this.module = options.module || "Progress";
this.callback = options.callback;
this.logger = options.logger || new Logger({
level: "info",
module: "ProgressReporter"
});
this.logProgress = options.logProgress ?? true;
this.minPercent = options.minPercent ?? 0;
this.maxPercent = options.maxPercent ?? 100;
this.lastReportedPercent = -1;
this.lastReportedTime = 0;
this.throttleMs = 100;
}
static getInstance(options = {}) {
if (!ProgressReporter.instance) {
ProgressReporter.instance = new ProgressReporter(options);
} else {
if (options.callback) {
ProgressReporter.instance.setCallback(options.callback);
}
if (options.module) {
ProgressReporter.instance.setModule(options.module);
}
if (options.logger) {
ProgressReporter.instance.setLogger(options.logger);
}
if (options.minPercent !== void 0) {
ProgressReporter.instance.setMinPercent(options.minPercent);
}
if (options.maxPercent !== void 0) {
ProgressReporter.instance.setMaxPercent(options.maxPercent);
}
}
return ProgressReporter.instance;
}
setCallback(callback) {
this.callback = callback;
}
setModule(module) {
this.module = module;
}
setLogger(logger) {
this.logger = logger;
}
setMinPercent(minPercent) {
this.minPercent = minPercent;
}
setMaxPercent(maxPercent) {
this.maxPercent = maxPercent;
}
createSubProgress(options) {
const subReporter = new ProgressReporter({
module: this.module,
logger: this.logger,
logProgress: this.logProgress,
minPercent: options.minPercent,
maxPercent: options.maxPercent
});
const logPrefix = options.logPrefix || "";
subReporter.setCallback((data) => {
const scaledPercent = this.scalePercent(
data.progressPercent,
options.minPercent,
options.maxPercent
);
let formattedMessage = data.message;
if (logPrefix && !formattedMessage.startsWith(logPrefix)) {
formattedMessage = `${logPrefix}: ${formattedMessage}`;
}
this.report({
stage: data.stage,
message: formattedMessage,
progressPercent: scaledPercent,
details: data.details
});
});
return subReporter;
}
report(data) {
const rawPercent = data.progressPercent;
const percent = Math.max(0, Math.min(100, rawPercent));
const scaledPercent = this.scalePercent(percent, 0, 100);
const now = Date.now();
if (scaledPercent === this.lastReportedPercent && now - this.lastReportedTime < this.throttleMs && data.stage !== "completed" && data.stage !== "failed") {
return;
}
this.lastReportedPercent = scaledPercent;
this.lastReportedTime = now;
const progressData = {
...data,
progressPercent: scaledPercent
};
if (this.logProgress) {
this.logger.debug(
`[${this.module}] [${data.stage.toUpperCase()}] ${data.message} (${scaledPercent.toFixed(1)}%)`,
data.details
);
}
if (this.callback) {
try {
this.callback(progressData);
} catch (err) {
this.logger.warn(`Error in progress callback: ${err}`);
}
}
}
scalePercent(percent, sourceMin, sourceMax) {
const range = this.maxPercent - this.minPercent;
const sourceRange = sourceMax - sourceMin;
const scaleFactor = range / sourceRange;
return this.minPercent + (percent - sourceMin) * scaleFactor;
}
preparing(message, percent, details) {
this.report({
stage: "preparing",
message,
progressPercent: percent,
details
});
}
submitting(message, percent, details) {
this.report({
stage: "submitting",
message,
progressPercent: percent,
details
});
}
confirming(message, percent, details) {
this.report({
stage: "confirming",
message,
progressPercent: percent,
details
});
}
verifying(message, percent, details) {
this.report({
stage: "verifying",
message,
progressPercent: percent,
details
});
}
completed(message, details) {
this.report({ stage: "completed", message, progressPercent: 100, details });
}
failed(message, details) {
this.report({
stage: "failed",
message,
progressPercent: this.lastReportedPercent,
details
});
}
}
export {
ProgressReporter
};
//# sourceMappingURL=standards-sdk.es24.js.map