@gotake/gotake-sdk
Version:
SDK for interacting with GoTake blockchain contracts
270 lines (269 loc) • 10.2 kB
JavaScript
;
var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
if (ar || !(i in from)) {
if (!ar) ar = Array.prototype.slice.call(from, 0, i);
ar[i] = from[i];
}
}
return to.concat(ar || Array.prototype.slice.call(from));
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.ContentUtils = void 0;
var ethers_1 = require("ethers");
/**
* Utility functions for content management
*/
var ContentUtils = /** @class */ (function () {
function ContentUtils() {
}
/**
* Validate content ID
* @param contentId Content ID to validate
* @returns True if content ID is valid
*/
ContentUtils.isValidContentId = function (contentId) {
return Number.isInteger(contentId) && contentId > 0;
};
/**
* Format price for display
* @param price Price in wei/smallest unit
* @param decimals Token decimals (default 18 for ETH)
* @param maxDecimals Maximum decimal places to show
* @returns Formatted price string
*/
ContentUtils.formatPrice = function (price, decimals, maxDecimals) {
if (decimals === void 0) { decimals = 18; }
if (maxDecimals === void 0) { maxDecimals = 6; }
var ethers = require('ethers');
var formatted = ethers.utils.formatUnits(price, decimals);
var num = parseFloat(formatted);
if (num === 0)
return '0';
if (num < 0.000001)
return '< 0.000001';
// Round to maxDecimals
return num.toFixed(Math.min(maxDecimals, decimals)).replace(/\.?0+$/, '');
};
/**
* Parse price from string
* @param priceString Price string
* @param decimals Token decimals (default 18 for ETH)
* @returns Price in BigNumber
*/
ContentUtils.parsePrice = function (priceString, decimals) {
if (decimals === void 0) { decimals = 18; }
var ethers = require('ethers');
return ethers.utils.parseUnits(priceString.toString(), decimals);
};
/**
* Calculate remaining time in seconds
* @param validUntil Valid until timestamp
* @returns Remaining seconds (0 if expired)
*/
ContentUtils.getRemainingTime = function (validUntil) {
var now = Math.floor(Date.now() / 1000);
var remaining = validUntil.toNumber() - now;
return Math.max(0, remaining);
};
/**
* Format time duration for display
* @param seconds Duration in seconds
* @returns Formatted duration string
*/
ContentUtils.formatDuration = function (seconds) {
if (seconds <= 0)
return 'Expired';
var days = Math.floor(seconds / 86400);
var hours = Math.floor((seconds % 86400) / 3600);
var minutes = Math.floor((seconds % 3600) / 60);
var remainingSeconds = seconds % 60;
if (days > 0) {
return "".concat(days, "d ").concat(hours, "h ").concat(minutes, "m");
}
else if (hours > 0) {
return "".concat(hours, "h ").concat(minutes, "m");
}
else if (minutes > 0) {
return "".concat(minutes, "m ").concat(remainingSeconds, "s");
}
else {
return "".concat(remainingSeconds, "s");
}
};
/**
* Check if permission is still valid
* @param permission View permission object
* @returns True if permission is valid and not expired
*/
ContentUtils.isPermissionValid = function (permission) {
if (!permission.isValid)
return false;
if (permission.remainingViews.lte(0))
return false;
// Since validUntil is no longer available, we rely on the isValid flag
return permission.isValid;
};
/**
* Get permission status description
* @param permission View permission object
* @returns Status description string
*/
ContentUtils.getPermissionStatus = function (permission) {
if (!permission.isValid)
return 'Invalid';
if (permission.remainingViews.lte(0))
return 'No views remaining';
// Since validUntil is no longer available, we consider all valid permissions as not time-expired
var remainingTime = 86400; // Default to 24 hours for display purposes
if (remainingTime <= 0)
return 'Expired';
var views = permission.remainingViews.toNumber();
var timeStr = this.formatDuration(remainingTime);
return "".concat(views, " view").concat(views !== 1 ? 's' : '', " remaining, ").concat(timeStr, " left");
};
/**
* Calculate expiry timestamp
* @param durationSeconds Duration in seconds
* @returns Expiry timestamp
*/
ContentUtils.calculateExpiry = function (durationSeconds) {
var now = Math.floor(Date.now() / 1000);
return ethers_1.BigNumber.from(now + durationSeconds);
};
/**
* Validate content configuration
* @param config Content configuration
* @returns Validation result with errors if any
*/
ContentUtils.validateContentConfig = function (config) {
var errors = [];
if (!this.isValidContentId(config.contentId)) {
errors.push('Content ID must be a positive integer');
}
if (config.nativePrice.lt(0)) {
errors.push('Native price cannot be negative');
}
if (config.defaultViewCount <= 0) {
errors.push('Default view count must be positive');
}
if (config.viewDuration <= 0) {
errors.push('View duration must be positive');
}
return {
isValid: errors.length === 0,
errors: errors
};
};
/**
* Compare two content configurations
* @param config1 First configuration
* @param config2 Second configuration
* @returns Object showing differences
*/
ContentUtils.compareConfigs = function (config1, config2) {
var changes = {};
if (!config1.nativePrice.eq(config2.nativePrice)) {
changes.nativePrice = {
old: config1.nativePrice.toString(),
new: config2.nativePrice.toString()
};
}
if (config1.defaultViewCount !== config2.defaultViewCount) {
changes.defaultViewCount = {
old: config1.defaultViewCount,
new: config2.defaultViewCount
};
}
if (config1.viewDuration !== config2.viewDuration) {
changes.viewDuration = {
old: config1.viewDuration,
new: config2.viewDuration
};
}
if (config1.isActive !== config2.isActive) {
changes.isActive = {
old: config1.isActive,
new: config2.isActive
};
}
return {
hasChanges: Object.keys(changes).length > 0,
changes: changes
};
};
/**
* Generate content summary for display
* @param config Content configuration
* @returns Human-readable summary
*/
ContentUtils.generateContentSummary = function (config) {
var price = this.formatPrice(config.nativePrice);
var duration = this.formatDuration(config.viewDuration);
var status = config.isActive ? 'Active' : 'Inactive';
return "Content ".concat(config.contentId, ": ").concat(price, " ETH, ").concat(config.defaultViewCount, " views, ").concat(duration, " validity - ").concat(status);
};
/**
* Sort content configurations by various criteria
* @param configs Array of content configurations
* @param sortBy Sort criteria
* @param ascending Sort order
* @returns Sorted configurations
*/
ContentUtils.sortConfigs = function (configs, sortBy, ascending) {
if (ascending === void 0) { ascending = true; }
var sorted = __spreadArray([], configs, true).sort(function (a, b) {
var comparison = 0;
switch (sortBy) {
case 'contentId':
comparison = a.contentId - b.contentId;
break;
case 'nativePrice':
comparison = a.nativePrice.gt(b.nativePrice) ? 1 : a.nativePrice.lt(b.nativePrice) ? -1 : 0;
break;
case 'defaultViewCount':
comparison = a.defaultViewCount - b.defaultViewCount;
break;
case 'viewDuration':
comparison = a.viewDuration - b.viewDuration;
break;
case 'isActive':
comparison = Number(b.isActive) - Number(a.isActive); // Active first by default
break;
}
return ascending ? comparison : -comparison;
});
return sorted;
};
/**
* Filter content configurations by criteria
* @param configs Array of content configurations
* @param filters Filter criteria
* @returns Filtered configurations
*/
ContentUtils.filterConfigs = function (configs, filters) {
return configs.filter(function (config) {
if (filters.isActive !== undefined && config.isActive !== filters.isActive) {
return false;
}
if (filters.minPrice && config.nativePrice.lt(filters.minPrice)) {
return false;
}
if (filters.maxPrice && config.nativePrice.gt(filters.maxPrice)) {
return false;
}
if (filters.minViewCount && config.defaultViewCount < filters.minViewCount) {
return false;
}
if (filters.maxViewCount && config.defaultViewCount > filters.maxViewCount) {
return false;
}
if (filters.contentIds && !filters.contentIds.includes(config.contentId)) {
return false;
}
return true;
});
};
return ContentUtils;
}());
exports.ContentUtils = ContentUtils;