UNPKG

@gotake/gotake-sdk

Version:

SDK for interacting with GoTake blockchain contracts

270 lines (269 loc) 10.2 kB
"use strict"; 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;