From efd289b1edcad6254b17488a4a0a07c9ba4619c4 Mon Sep 17 00:00:00 2001 From: Jeremy Kauffman Date: Wed, 14 Jun 2017 11:21:16 -0400 Subject: [PATCH 01/10] increase wait time for daemon to launch --- ui/js/lbry.js | 750 +++++++++++++++++++++++++------------------------- 1 file changed, 375 insertions(+), 375 deletions(-) diff --git a/ui/js/lbry.js b/ui/js/lbry.js index e242bf538..a04ad50f8 100644 --- a/ui/js/lbry.js +++ b/ui/js/lbry.js @@ -1,25 +1,25 @@ -import lbryio from './lbryio.js'; -import lighthouse from './lighthouse.js'; -import jsonrpc from './jsonrpc.js'; -import lbryuri from './lbryuri.js'; -import { getLocal, getSession, setSession, setLocal } from './utils.js'; +import lbryio from "./lbryio.js"; +import lighthouse from "./lighthouse.js"; +import jsonrpc from "./jsonrpc.js"; +import lbryuri from "./lbryuri.js"; +import { getLocal, getSession, setSession, setLocal } from "./utils.js"; -const { remote, ipcRenderer } = require('electron'); -const menu = remote.require('./menu/main-menu'); +const { remote, ipcRenderer } = require("electron"); +const menu = remote.require("./menu/main-menu"); let lbry = { - isConnected: false, - daemonConnectionString: 'http://localhost:5279/lbryapi', - pendingPublishTimeout: 20 * 60 * 1000, - defaultClientSettings: { - showNsfw: false, - showUnavailable: true, - debug: false, - useCustomLighthouseServers: false, - customLighthouseServers: [], - showDeveloperMenu: false, - language: 'en' - } + isConnected: false, + daemonConnectionString: "http://localhost:5279/lbryapi", + pendingPublishTimeout: 20 * 60 * 1000, + defaultClientSettings: { + showNsfw: false, + showUnavailable: true, + debug: false, + useCustomLighthouseServers: false, + customLighthouseServers: [], + showDeveloperMenu: false, + language: "en", + }, }; /** @@ -27,24 +27,24 @@ let lbry = { * needed to make a dummy claim or file info object. */ function savePendingPublish({ name, channel_name }) { - let uri; - if (channel_name) { - uri = lbryuri.build({ name: channel_name, path: name }, false); - } else { - uri = lbryuri.build({ name: name }, false); - } - const pendingPublishes = getLocal('pendingPublishes') || []; - const newPendingPublish = { - name, - channel_name, - claim_id: 'pending_claim_' + uri, - txid: 'pending_' + uri, - nout: 0, - outpoint: 'pending_' + uri + ':0', - time: Date.now() - }; - setLocal('pendingPublishes', [...pendingPublishes, newPendingPublish]); - return newPendingPublish; + let uri; + if (channel_name) { + uri = lbryuri.build({ name: channel_name, path: name }, false); + } else { + uri = lbryuri.build({ name: name }, false); + } + const pendingPublishes = getLocal("pendingPublishes") || []; + const newPendingPublish = { + name, + channel_name, + claim_id: "pending_claim_" + uri, + txid: "pending_" + uri, + nout: 0, + outpoint: "pending_" + uri + ":0", + time: Date.now(), + }; + setLocal("pendingPublishes", [...pendingPublishes, newPendingPublish]); + return newPendingPublish; } /** @@ -52,18 +52,18 @@ function savePendingPublish({ name, channel_name }) { * A channel name may also be provided along with name. */ function removePendingPublishIfNeeded({ name, channel_name, outpoint }) { - function pubMatches(pub) { - return ( - pub.outpoint === outpoint || - (pub.name === name && - (!channel_name || pub.channel_name === channel_name)) - ); - } + function pubMatches(pub) { + return ( + pub.outpoint === outpoint || + (pub.name === name && + (!channel_name || pub.channel_name === channel_name)) + ); + } - setLocal( - 'pendingPublishes', - lbry.getPendingPublishes().filter(pub => !pubMatches(pub)) - ); + setLocal( + "pendingPublishes", + lbry.getPendingPublishes().filter(pub => !pubMatches(pub)) + ); } /** @@ -71,12 +71,12 @@ function removePendingPublishIfNeeded({ name, channel_name, outpoint }) { * removes them from the list. */ lbry.getPendingPublishes = function() { - const pendingPublishes = getLocal('pendingPublishes') || []; - const newPendingPublishes = pendingPublishes.filter( - pub => Date.now() - pub.time <= lbry.pendingPublishTimeout - ); - setLocal('pendingPublishes', newPendingPublishes); - return newPendingPublishes; + const pendingPublishes = getLocal("pendingPublishes") || []; + const newPendingPublishes = pendingPublishes.filter( + pub => Date.now() - pub.time <= lbry.pendingPublishTimeout + ); + setLocal("pendingPublishes", newPendingPublishes); + return newPendingPublishes; }; /** @@ -84,97 +84,97 @@ lbry.getPendingPublishes = function() { * provided along withe the name. If no pending publish is found, returns null. */ function getPendingPublish({ name, channel_name, outpoint }) { - const pendingPublishes = lbry.getPendingPublishes(); - return ( - pendingPublishes.find( - pub => - pub.outpoint === outpoint || - (pub.name === name && - (!channel_name || pub.channel_name === channel_name)) - ) || null - ); + const pendingPublishes = lbry.getPendingPublishes(); + return ( + pendingPublishes.find( + pub => + pub.outpoint === outpoint || + (pub.name === name && + (!channel_name || pub.channel_name === channel_name)) + ) || null + ); } function pendingPublishToDummyClaim({ - channel_name, - name, - outpoint, - claim_id, - txid, - nout + channel_name, + name, + outpoint, + claim_id, + txid, + nout, }) { - return { name, outpoint, claim_id, txid, nout, channel_name }; + return { name, outpoint, claim_id, txid, nout, channel_name }; } function pendingPublishToDummyFileInfo({ name, outpoint, claim_id }) { - return { name, outpoint, claim_id, metadata: null }; + return { name, outpoint, claim_id, metadata: null }; } lbry.call = function( - method, - params, - callback, - errorCallback, - connectFailedCallback + method, + params, + callback, + errorCallback, + connectFailedCallback ) { - return jsonrpc.call( - lbry.daemonConnectionString, - method, - params, - callback, - errorCallback, - connectFailedCallback - ); + return jsonrpc.call( + lbry.daemonConnectionString, + method, + params, + callback, + errorCallback, + connectFailedCallback + ); }; //core lbry._connectPromise = null; lbry.connect = function() { - if (lbry._connectPromise === null) { - lbry._connectPromise = new Promise((resolve, reject) => { - let tryNum = 0; + if (lbry._connectPromise === null) { + lbry._connectPromise = new Promise((resolve, reject) => { + let tryNum = 0; - function checkDaemonStartedFailed() { - if (tryNum <= 100) { - // Move # of tries into constant or config option - setTimeout(() => { - tryNum++; - checkDaemonStarted(); - }, tryNum < 50 ? 400 : 1000); - } else { - reject(new Error('Unable to connect to LBRY')); - } - } + function checkDaemonStartedFailed() { + if (tryNum <= 200) { + // Move # of tries into constant or config option + setTimeout(() => { + tryNum++; + checkDaemonStarted(); + }, tryNum < 50 ? 400 : 1000); + } else { + reject(new Error("Unable to connect to LBRY")); + } + } - // Check every half second to see if the daemon is accepting connections - function checkDaemonStarted() { - lbry.call( - 'status', - {}, - resolve, - checkDaemonStartedFailed, - checkDaemonStartedFailed - ); - } + // Check every half second to see if the daemon is accepting connections + function checkDaemonStarted() { + lbry.call( + "status", + {}, + resolve, + checkDaemonStartedFailed, + checkDaemonStartedFailed + ); + } - checkDaemonStarted(); - }); - } + checkDaemonStarted(); + }); + } - return lbry._connectPromise; + return lbry._connectPromise; }; lbry.checkAddressIsMine = function(address, callback) { - lbry.call('wallet_is_address_mine', { address: address }, callback); + lbry.call("wallet_is_address_mine", { address: address }, callback); }; lbry.sendToAddress = function(amount, address, callback, errorCallback) { - lbry.call( - 'send_amount_to_address', - { amount: amount, address: address }, - callback, - errorCallback - ); + lbry.call( + "send_amount_to_address", + { amount: amount, address: address }, + callback, + errorCallback + ); }; /** @@ -189,46 +189,46 @@ lbry.sendToAddress = function(amount, address, callback, errorCallback) { */ lbry.costPromiseCache = {}; lbry.getCostInfo = function(uri) { - if (lbry.costPromiseCache[uri] === undefined) { - lbry.costPromiseCache[uri] = new Promise((resolve, reject) => { - const COST_INFO_CACHE_KEY = 'cost_info_cache'; - let costInfoCache = getSession(COST_INFO_CACHE_KEY, {}); + if (lbry.costPromiseCache[uri] === undefined) { + lbry.costPromiseCache[uri] = new Promise((resolve, reject) => { + const COST_INFO_CACHE_KEY = "cost_info_cache"; + let costInfoCache = getSession(COST_INFO_CACHE_KEY, {}); - function cacheAndResolve(cost, includesData) { - costInfoCache[uri] = { cost, includesData }; - setSession(COST_INFO_CACHE_KEY, costInfoCache); - resolve({ cost, includesData }); - } + function cacheAndResolve(cost, includesData) { + costInfoCache[uri] = { cost, includesData }; + setSession(COST_INFO_CACHE_KEY, costInfoCache); + resolve({ cost, includesData }); + } - if (!uri) { - return reject(new Error(`URI required.`)); - } + if (!uri) { + return reject(new Error(`URI required.`)); + } - if (costInfoCache[uri] && costInfoCache[uri].cost) { - return resolve(costInfoCache[uri]); - } + if (costInfoCache[uri] && costInfoCache[uri].cost) { + return resolve(costInfoCache[uri]); + } - function getCost(uri, size) { - lbry - .stream_cost_estimate({ uri, ...(size !== null ? { size } : {}) }) - .then(cost => { - cacheAndResolve(cost, size !== null); - }, reject); - } + function getCost(uri, size) { + lbry + .stream_cost_estimate({ uri, ...(size !== null ? { size } : {}) }) + .then(cost => { + cacheAndResolve(cost, size !== null); + }, reject); + } - const uriObj = lbryuri.parse(uri); - const name = uriObj.path || uriObj.name; + const uriObj = lbryuri.parse(uri); + const name = uriObj.path || uriObj.name; - lighthouse.get_size_for_name(name).then(size => { - if (size) { - getCost(name, size); - } else { - getCost(name, null); - } - }); - }); - } - return lbry.costPromiseCache[uri]; + lighthouse.get_size_for_name(name).then(size => { + if (size) { + getCost(name, size); + } else { + getCost(name, null); + } + }); + }); + } + return lbry.costPromiseCache[uri]; }; /** @@ -239,143 +239,143 @@ lbry.getCostInfo = function(uri) { * publish can appear in the UI immediately. */ lbry.publish = function( - params, - fileListedCallback, - publishedCallback, - errorCallback + params, + fileListedCallback, + publishedCallback, + errorCallback ) { - lbry.call( - 'publish', - params, - result => { - if (returnedPending) { - return; - } + lbry.call( + "publish", + params, + result => { + if (returnedPending) { + return; + } - clearTimeout(returnPendingTimeout); - publishedCallback(result); - }, - err => { - if (returnedPending) { - return; - } + clearTimeout(returnPendingTimeout); + publishedCallback(result); + }, + err => { + if (returnedPending) { + return; + } - clearTimeout(returnPendingTimeout); - errorCallback(err); - } - ); + clearTimeout(returnPendingTimeout); + errorCallback(err); + } + ); - let returnedPending = false; - // Give a short grace period in case publish() returns right away or (more likely) gives an error - const returnPendingTimeout = setTimeout(() => { - returnedPending = true; + let returnedPending = false; + // Give a short grace period in case publish() returns right away or (more likely) gives an error + const returnPendingTimeout = setTimeout(() => { + returnedPending = true; - if (publishedCallback) { - savePendingPublish({ - name: params.name, - channel_name: params.channel_name - }); - publishedCallback(true); - } + if (publishedCallback) { + savePendingPublish({ + name: params.name, + channel_name: params.channel_name, + }); + publishedCallback(true); + } - if (fileListedCallback) { - const { name, channel_name } = params; - savePendingPublish({ - name: params.name, - channel_name: params.channel_name - }); - fileListedCallback(true); - } - }, 2000); + if (fileListedCallback) { + const { name, channel_name } = params; + savePendingPublish({ + name: params.name, + channel_name: params.channel_name, + }); + fileListedCallback(true); + } + }, 2000); }; lbry.getClientSettings = function() { - var outSettings = {}; - for (let setting of Object.keys(lbry.defaultClientSettings)) { - var localStorageVal = localStorage.getItem('setting_' + setting); - outSettings[setting] = localStorageVal === null - ? lbry.defaultClientSettings[setting] - : JSON.parse(localStorageVal); - } - return outSettings; + var outSettings = {}; + for (let setting of Object.keys(lbry.defaultClientSettings)) { + var localStorageVal = localStorage.getItem("setting_" + setting); + outSettings[setting] = localStorageVal === null + ? lbry.defaultClientSettings[setting] + : JSON.parse(localStorageVal); + } + return outSettings; }; lbry.getClientSetting = function(setting) { - var localStorageVal = localStorage.getItem('setting_' + setting); - if (setting == 'showDeveloperMenu') { - return true; - } - return localStorageVal === null - ? lbry.defaultClientSettings[setting] - : JSON.parse(localStorageVal); + var localStorageVal = localStorage.getItem("setting_" + setting); + if (setting == "showDeveloperMenu") { + return true; + } + return localStorageVal === null + ? lbry.defaultClientSettings[setting] + : JSON.parse(localStorageVal); }; lbry.setClientSettings = function(settings) { - for (let setting of Object.keys(settings)) { - lbry.setClientSetting(setting, settings[setting]); - } + for (let setting of Object.keys(settings)) { + lbry.setClientSetting(setting, settings[setting]); + } }; lbry.setClientSetting = function(setting, value) { - return localStorage.setItem('setting_' + setting, JSON.stringify(value)); + return localStorage.setItem("setting_" + setting, JSON.stringify(value)); }; lbry.getSessionInfo = function(callback) { - lbry.call('status', { session_status: true }, callback); + lbry.call("status", { session_status: true }, callback); }; lbry.reportBug = function(message, callback) { - lbry.call( - 'report_bug', - { - message: message - }, - callback - ); + lbry.call( + "report_bug", + { + message: message, + }, + callback + ); }; //utilities lbry.formatCredits = function(amount, precision) { - return amount.toFixed(precision || 1).replace(/\.?0+$/, ''); + return amount.toFixed(precision || 1).replace(/\.?0+$/, ""); }; lbry.formatName = function(name) { - // Converts LBRY name to standard format (all lower case, no special characters, spaces replaced by dashes) - name = name.replace('/s+/g', '-'); - name = name.toLowerCase().replace(/[^a-z0-9\-]/g, ''); - return name; + // Converts LBRY name to standard format (all lower case, no special characters, spaces replaced by dashes) + name = name.replace("/s+/g", "-"); + name = name.toLowerCase().replace(/[^a-z0-9\-]/g, ""); + return name; }; lbry.imagePath = function(file) { - return 'img/' + file; + return "img/" + file; }; lbry.getMediaType = function(contentType, fileName) { - if (contentType) { - return /^[^/]+/.exec(contentType)[0]; - } else if (fileName) { - var dotIndex = fileName.lastIndexOf('.'); - if (dotIndex == -1) { - return 'unknown'; - } + if (contentType) { + return /^[^/]+/.exec(contentType)[0]; + } else if (fileName) { + var dotIndex = fileName.lastIndexOf("."); + if (dotIndex == -1) { + return "unknown"; + } - var ext = fileName.substr(dotIndex + 1); - if (/^mp4|mov|m4v|flv|f4v$/i.test(ext)) { - return 'video'; - } else if (/^mp3|m4a|aac|wav|flac|ogg$/i.test(ext)) { - return 'audio'; - } else if (/^html|htm|pdf|odf|doc|docx|md|markdown|txt$/i.test(ext)) { - return 'document'; - } else { - return 'unknown'; - } - } else { - return 'unknown'; - } + var ext = fileName.substr(dotIndex + 1); + if (/^mp4|mov|m4v|flv|f4v$/i.test(ext)) { + return "video"; + } else if (/^mp3|m4a|aac|wav|flac|ogg$/i.test(ext)) { + return "audio"; + } else if (/^html|htm|pdf|odf|doc|docx|md|markdown|txt$/i.test(ext)) { + return "document"; + } else { + return "unknown"; + } + } else { + return "unknown"; + } }; lbry.stop = function(callback) { - lbry.call('stop', {}, callback); + lbry.call("stop", {}, callback); }; lbry._subscribeIdCount = 0; @@ -384,57 +384,57 @@ lbry._balanceSubscribeInterval = 5000; lbry._balanceUpdateInterval = null; lbry._updateBalanceSubscribers = function() { - lbry.wallet_balance().then(function(balance) { - for (let callback of Object.values(lbry._balanceSubscribeCallbacks)) { - callback(balance); - } - }); + lbry.wallet_balance().then(function(balance) { + for (let callback of Object.values(lbry._balanceSubscribeCallbacks)) { + callback(balance); + } + }); - if ( - !lbry._balanceUpdateInterval && - Object.keys(lbry._balanceSubscribeCallbacks).length - ) { - lbry._balanceUpdateInterval = setInterval(() => { - lbry._updateBalanceSubscribers(); - }, lbry._balanceSubscribeInterval); - } + if ( + !lbry._balanceUpdateInterval && + Object.keys(lbry._balanceSubscribeCallbacks).length + ) { + lbry._balanceUpdateInterval = setInterval(() => { + lbry._updateBalanceSubscribers(); + }, lbry._balanceSubscribeInterval); + } }; lbry.balanceSubscribe = function(callback) { - const subscribeId = ++lbry._subscribeIdCount; - lbry._balanceSubscribeCallbacks[subscribeId] = callback; - lbry._updateBalanceSubscribers(); - return subscribeId; + const subscribeId = ++lbry._subscribeIdCount; + lbry._balanceSubscribeCallbacks[subscribeId] = callback; + lbry._updateBalanceSubscribers(); + return subscribeId; }; lbry.balanceUnsubscribe = function(subscribeId) { - delete lbry._balanceSubscribeCallbacks[subscribeId]; - if ( - lbry._balanceUpdateInterval && - !Object.keys(lbry._balanceSubscribeCallbacks).length - ) { - clearInterval(lbry._balanceUpdateInterval); - } + delete lbry._balanceSubscribeCallbacks[subscribeId]; + if ( + lbry._balanceUpdateInterval && + !Object.keys(lbry._balanceSubscribeCallbacks).length + ) { + clearInterval(lbry._balanceUpdateInterval); + } }; lbry.showMenuIfNeeded = function() { - const showingMenu = sessionStorage.getItem('menuShown') || null; - const chosenMenu = lbry.getClientSetting('showDeveloperMenu') - ? 'developer' - : 'normal'; - if (chosenMenu != showingMenu) { - menu.showMenubar(chosenMenu == 'developer'); - } - sessionStorage.setItem('menuShown', chosenMenu); + const showingMenu = sessionStorage.getItem("menuShown") || null; + const chosenMenu = lbry.getClientSetting("showDeveloperMenu") + ? "developer" + : "normal"; + if (chosenMenu != showingMenu) { + menu.showMenubar(chosenMenu == "developer"); + } + sessionStorage.setItem("menuShown", chosenMenu); }; lbry.getAppVersionInfo = function() { - return new Promise((resolve, reject) => { - ipcRenderer.once('version-info-received', (event, versionInfo) => { - resolve(versionInfo); - }); - ipcRenderer.send('version-info-requested'); - }); + return new Promise((resolve, reject) => { + ipcRenderer.once("version-info-received", (event, versionInfo) => { + resolve(versionInfo); + }); + ipcRenderer.send("version-info-requested"); + }); }; /** @@ -447,117 +447,117 @@ lbry.getAppVersionInfo = function() { * (If a real publish with the same name is found, the pending publish will be ignored and removed.) */ lbry.file_list = function(params = {}) { - return new Promise((resolve, reject) => { - const { name, channel_name, outpoint } = params; + return new Promise((resolve, reject) => { + const { name, channel_name, outpoint } = params; - /** + /** * If we're searching by outpoint, check first to see if there's a matching pending publish. * Pending publishes use their own faux outpoints that are always unique, so we don't need * to check if there's a real file. */ - if (outpoint) { - const pendingPublish = getPendingPublish({ outpoint }); - if (pendingPublish) { - resolve([pendingPublishToDummyFileInfo(pendingPublish)]); - return; - } - } + if (outpoint) { + const pendingPublish = getPendingPublish({ outpoint }); + if (pendingPublish) { + resolve([pendingPublishToDummyFileInfo(pendingPublish)]); + return; + } + } - lbry.call( - 'file_list', - params, - fileInfos => { - removePendingPublishIfNeeded({ name, channel_name, outpoint }); + lbry.call( + "file_list", + params, + fileInfos => { + removePendingPublishIfNeeded({ name, channel_name, outpoint }); - const dummyFileInfos = lbry - .getPendingPublishes() - .map(pendingPublishToDummyFileInfo); - resolve([...fileInfos, ...dummyFileInfos]); - }, - reject, - reject - ); - }); + const dummyFileInfos = lbry + .getPendingPublishes() + .map(pendingPublishToDummyFileInfo); + resolve([...fileInfos, ...dummyFileInfos]); + }, + reject, + reject + ); + }); }; lbry.claim_list_mine = function(params = {}) { - return new Promise((resolve, reject) => { - lbry.call( - 'claim_list_mine', - params, - claims => { - for (let { name, channel_name, txid, nout } of claims) { - removePendingPublishIfNeeded({ - name, - channel_name, - outpoint: txid + ':' + nout - }); - } + return new Promise((resolve, reject) => { + lbry.call( + "claim_list_mine", + params, + claims => { + for (let { name, channel_name, txid, nout } of claims) { + removePendingPublishIfNeeded({ + name, + channel_name, + outpoint: txid + ":" + nout, + }); + } - const dummyClaims = lbry - .getPendingPublishes() - .map(pendingPublishToDummyClaim); - resolve([...claims, ...dummyClaims]); - }, - reject, - reject - ); - }); + const dummyClaims = lbry + .getPendingPublishes() + .map(pendingPublishToDummyClaim); + resolve([...claims, ...dummyClaims]); + }, + reject, + reject + ); + }); }; -const claimCacheKey = 'resolve_claim_cache'; +const claimCacheKey = "resolve_claim_cache"; lbry._claimCache = getSession(claimCacheKey, {}); lbry._resolveXhrs = {}; lbry.resolve = function(params = {}) { - return new Promise((resolve, reject) => { - if (!params.uri) { - throw __('Resolve has hacked cache on top of it that requires a URI'); - } - if (params.uri && lbry._claimCache[params.uri] !== undefined) { - resolve(lbry._claimCache[params.uri]); - } else { - lbry._resolveXhrs[params.uri] = lbry.call( - 'resolve', - params, - function(data) { - if (data !== undefined) { - lbry._claimCache[params.uri] = data; - } - setSession(claimCacheKey, lbry._claimCache); - resolve(data); - }, - reject - ); - } - }); + return new Promise((resolve, reject) => { + if (!params.uri) { + throw __("Resolve has hacked cache on top of it that requires a URI"); + } + if (params.uri && lbry._claimCache[params.uri] !== undefined) { + resolve(lbry._claimCache[params.uri]); + } else { + lbry._resolveXhrs[params.uri] = lbry.call( + "resolve", + params, + function(data) { + if (data !== undefined) { + lbry._claimCache[params.uri] = data; + } + setSession(claimCacheKey, lbry._claimCache); + resolve(data); + }, + reject + ); + } + }); }; lbry.cancelResolve = function(params = {}) { - const xhr = lbry._resolveXhrs[params.uri]; - if (xhr && xhr.readyState > 0 && xhr.readyState < 4) { - xhr.abort(); - } + const xhr = lbry._resolveXhrs[params.uri]; + if (xhr && xhr.readyState > 0 && xhr.readyState < 4) { + xhr.abort(); + } }; lbry = new Proxy(lbry, { - get: function(target, name) { - if (name in target) { - return target[name]; - } + get: function(target, name) { + if (name in target) { + return target[name]; + } - return function(params = {}) { - return new Promise((resolve, reject) => { - jsonrpc.call( - lbry.daemonConnectionString, - name, - params, - resolve, - reject, - reject - ); - }); - }; - } + return function(params = {}) { + return new Promise((resolve, reject) => { + jsonrpc.call( + lbry.daemonConnectionString, + name, + params, + resolve, + reject, + reject + ); + }); + }; + }, }); export default lbry; From 4c8d649830b980cd5676969e9864999c8ef0d376 Mon Sep 17 00:00:00 2001 From: Jeremy Kauffman Date: Wed, 14 Jun 2017 17:49:23 -0400 Subject: [PATCH 02/10] updates required for lbry daemon 0.12 --- build/DAEMON_URL | 2 +- ui/js/actions/content.js | 11 +++++------ ui/js/lbry.js | 2 +- 3 files changed, 7 insertions(+), 8 deletions(-) diff --git a/build/DAEMON_URL b/build/DAEMON_URL index 5544239f9..35868e36f 100644 --- a/build/DAEMON_URL +++ b/build/DAEMON_URL @@ -1 +1 @@ -https://github.com/lbryio/lbry/releases/download/v0.11.0/lbrynet-daemon-v0.11.0-OSNAME.zip +https://github.com/lbryio/lbry/releases/download/v0.12.2rc2/lbrynet-daemon-v0.12.2rc2-OSNAME.zip diff --git a/ui/js/actions/content.js b/ui/js/actions/content.js index ca174b261..0daeeadaf 100644 --- a/ui/js/actions/content.js +++ b/ui/js/actions/content.js @@ -246,23 +246,22 @@ export function doPurchaseUri(uri, purchaseModalName) { }; } -export function doFetchClaimsByChannel(uri) { +export function doFetchClaimsByChannel(uri, page = 1) { return function(dispatch, getState) { dispatch({ type: types.FETCH_CHANNEL_CLAIMS_STARTED, data: { uri }, }); - lbry.resolve({ uri }).then(resolutionInfo => { - const { claims_in_channel } = resolutionInfo - ? resolutionInfo - : { claims_in_channel: [] }; + lbry.claim_list_by_channel({ uri, page }).then(result => { + const claimResult = result[uri], + claims = claimResult ? claimResult.claims_in_channel : []; dispatch({ type: types.FETCH_CHANNEL_CLAIMS_COMPLETED, data: { uri, - claims: claims_in_channel, + claims: claims, }, }); }); diff --git a/ui/js/lbry.js b/ui/js/lbry.js index a04ad50f8..55b6b022c 100644 --- a/ui/js/lbry.js +++ b/ui/js/lbry.js @@ -524,7 +524,7 @@ lbry.resolve = function(params = {}) { lbry._claimCache[params.uri] = data; } setSession(claimCacheKey, lbry._claimCache); - resolve(data); + resolve(data && data[params.uri] ? data[params.uri] : {}); }, reject ); From ce6284219c4c1af1a176e2bba5012d308dcdb46f Mon Sep 17 00:00:00 2001 From: Jeremy Kauffman Date: Wed, 14 Jun 2017 17:50:29 -0400 Subject: [PATCH 03/10] =?UTF-8?q?Bump=20version:=200.12.0=20=E2=86=92=200.?= =?UTF-8?q?12.1rc1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .bumpversion.cfg | 2 +- app/package.json | 2 +- ui/package.json | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.bumpversion.cfg b/.bumpversion.cfg index d37da8f5b..605bc91ea 100644 --- a/.bumpversion.cfg +++ b/.bumpversion.cfg @@ -1,5 +1,5 @@ [bumpversion] -current_version = 0.12.0 +current_version = 0.12.1rc1 commit = True tag = True parse = (?P\d+)\.(?P\d+)\.(?P\d+)((?P[a-z]+)(?P\d+))? diff --git a/app/package.json b/app/package.json index 95261b0c2..ebc915725 100644 --- a/app/package.json +++ b/app/package.json @@ -1,6 +1,6 @@ { "name": "LBRY", - "version": "0.12.0", + "version": "0.12.1rc1", "main": "main.js", "description": "LBRY is a fully decentralized, open-source protocol facilitating the discovery, access, and (sometimes) purchase of data.", "author": { diff --git a/ui/package.json b/ui/package.json index 59595bc03..668ec265a 100644 --- a/ui/package.json +++ b/ui/package.json @@ -1,6 +1,6 @@ { "name": "lbry-web-ui", - "version": "0.12.0", + "version": "0.12.1rc1", "description": "LBRY UI", "scripts": { "test": "echo \"Error: no test specified\" && exit 1", From c6603a4e809424b2315e590560f09fe5daea741b Mon Sep 17 00:00:00 2001 From: Jeremy Kauffman Date: Wed, 14 Jun 2017 18:01:04 -0400 Subject: [PATCH 04/10] daemon v0.13 support --- CHANGELOG.md | 4 ++-- build/DAEMON_URL | 2 +- ui/js/actions/file_info.js | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0866dc356..bd4340c1b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,8 +12,8 @@ Web UI version numbers should always match the corresponding version of LBRY App * ### Changed - * - * + * Upgraded to lbry daemon 0.13, including updating API signatures + * Channels resolve much faster ### Fixed * Fix help menu force reloading whole app diff --git a/build/DAEMON_URL b/build/DAEMON_URL index 35868e36f..3df4e528f 100644 --- a/build/DAEMON_URL +++ b/build/DAEMON_URL @@ -1 +1 @@ -https://github.com/lbryio/lbry/releases/download/v0.12.2rc2/lbrynet-daemon-v0.12.2rc2-OSNAME.zip +https://github.com/lbryio/lbry/releases/download/v0.13.1rc1/lbrynet-daemon-v0.13.1rc1-OSNAME.zip diff --git a/ui/js/actions/file_info.js b/ui/js/actions/file_info.js index d379db625..f200c40fc 100644 --- a/ui/js/actions/file_info.js +++ b/ui/js/actions/file_info.js @@ -89,7 +89,7 @@ export function doDeleteFile(outpoint, deleteFromComputer) { lbry.file_delete({ outpoint: outpoint, - delete_target_file: deleteFromComputer, + delete_from_download_dir: deleteFromComputer, }); dispatch(doCloseModal()); From a6b8ae2ce4f6832ae93a658b8355d3ea08895874 Mon Sep 17 00:00:00 2001 From: Jeremy Kauffman Date: Wed, 14 Jun 2017 18:01:22 -0400 Subject: [PATCH 05/10] =?UTF-8?q?Bump=20version:=200.12.1rc1=20=E2=86=92?= =?UTF-8?q?=200.12.2rc1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .bumpversion.cfg | 2 +- app/package.json | 2 +- ui/package.json | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.bumpversion.cfg b/.bumpversion.cfg index 605bc91ea..2e4f2ab1b 100644 --- a/.bumpversion.cfg +++ b/.bumpversion.cfg @@ -1,5 +1,5 @@ [bumpversion] -current_version = 0.12.1rc1 +current_version = 0.12.2rc1 commit = True tag = True parse = (?P\d+)\.(?P\d+)\.(?P\d+)((?P[a-z]+)(?P\d+))? diff --git a/app/package.json b/app/package.json index ebc915725..38d6b6a58 100644 --- a/app/package.json +++ b/app/package.json @@ -1,6 +1,6 @@ { "name": "LBRY", - "version": "0.12.1rc1", + "version": "0.12.2rc1", "main": "main.js", "description": "LBRY is a fully decentralized, open-source protocol facilitating the discovery, access, and (sometimes) purchase of data.", "author": { diff --git a/ui/package.json b/ui/package.json index 668ec265a..64f312203 100644 --- a/ui/package.json +++ b/ui/package.json @@ -1,6 +1,6 @@ { "name": "lbry-web-ui", - "version": "0.12.1rc1", + "version": "0.12.2rc1", "description": "LBRY UI", "scripts": { "test": "echo \"Error: no test specified\" && exit 1", From 4b095c3ea68063b73fcab93833d17a1a639c5c23 Mon Sep 17 00:00:00 2001 From: Jeremy Kauffman Date: Wed, 14 Jun 2017 20:21:31 -0400 Subject: [PATCH 06/10] kill lbry.call --- ui/js/actions/wallet.js | 16 +++---- ui/js/lbry.js | 92 ++++++++----------------------------- ui/js/page/help/view.jsx | 4 +- ui/js/page/publish/view.jsx | 2 +- ui/js/page/report.js | 2 +- 5 files changed, 31 insertions(+), 85 deletions(-) diff --git a/ui/js/actions/wallet.js b/ui/js/actions/wallet.js index def93cf68..17c4be201 100644 --- a/ui/js/actions/wallet.js +++ b/ui/js/actions/wallet.js @@ -22,7 +22,7 @@ export function doFetchTransactions() { type: types.FETCH_TRANSACTIONS_STARTED, }); - lbry.call("transaction_list", {}, results => { + lbry.transaction_list().then(results => { dispatch({ type: types.FETCH_TRANSACTIONS_COMPLETED, data: { @@ -55,7 +55,7 @@ export function doCheckAddressIsMine(address) { type: types.CHECK_ADDRESS_IS_MINE_STARTED, }); - lbry.checkAddressIsMine(address, isMine => { + lbry.wallet_is_address_mine({ address }).then(isMine => { if (!isMine) dispatch(doGetNewAddress()); dispatch({ @@ -103,12 +103,12 @@ export function doSendDraftTransaction() { dispatch(doOpenModal("transactionFailed")); }; - lbry.sendToAddress( - draftTx.amount, - draftTx.address, - successCallback, - errorCallback - ); + lbry + .send_amount_to_address({ + amount: draftTx.amount, + address: draftTx.address, + }) + .then(successCallback, errorCallback); }; } diff --git a/ui/js/lbry.js b/ui/js/lbry.js index 55b6b022c..a2c7affde 100644 --- a/ui/js/lbry.js +++ b/ui/js/lbry.js @@ -22,6 +22,17 @@ let lbry = { }, }; +function apiCall(method, params, resolve, reject) { + return jsonrpc.call( + lbry.daemonConnectionString, + method, + params, + resolve, + reject, + reject + ); +} + /** * Records a publish attempt in local storage. Returns a dictionary with all the data needed to * needed to make a dummy claim or file info object. @@ -110,23 +121,6 @@ function pendingPublishToDummyFileInfo({ name, outpoint, claim_id }) { return { name, outpoint, claim_id, metadata: null }; } -lbry.call = function( - method, - params, - callback, - errorCallback, - connectFailedCallback -) { - return jsonrpc.call( - lbry.daemonConnectionString, - method, - params, - callback, - errorCallback, - connectFailedCallback - ); -}; - //core lbry._connectPromise = null; lbry.connect = function() { @@ -148,13 +142,7 @@ lbry.connect = function() { // Check every half second to see if the daemon is accepting connections function checkDaemonStarted() { - lbry.call( - "status", - {}, - resolve, - checkDaemonStartedFailed, - checkDaemonStartedFailed - ); + lbry.status().then(resolve).catch(checkDaemonStartedFailed); } checkDaemonStarted(); @@ -164,19 +152,6 @@ lbry.connect = function() { return lbry._connectPromise; }; -lbry.checkAddressIsMine = function(address, callback) { - lbry.call("wallet_is_address_mine", { address: address }, callback); -}; - -lbry.sendToAddress = function(amount, address, callback, errorCallback) { - lbry.call( - "send_amount_to_address", - { amount: amount, address: address }, - callback, - errorCallback - ); -}; - /** * Takes a LBRY URI; will first try and calculate a total cost using * Lighthouse. If Lighthouse can't be reached, it just retrives the @@ -238,15 +213,13 @@ lbry.getCostInfo = function(uri) { * This currently includes a work-around to cache the file in local storage so that the pending * publish can appear in the UI immediately. */ -lbry.publish = function( +lbry.publishDeprecated = function( params, fileListedCallback, publishedCallback, errorCallback ) { - lbry.call( - "publish", - params, + lbry.publish(params).then( result => { if (returnedPending) { return; @@ -320,20 +293,6 @@ lbry.setClientSetting = function(setting, value) { return localStorage.setItem("setting_" + setting, JSON.stringify(value)); }; -lbry.getSessionInfo = function(callback) { - lbry.call("status", { session_status: true }, callback); -}; - -lbry.reportBug = function(message, callback) { - lbry.call( - "report_bug", - { - message: message, - }, - callback - ); -}; - //utilities lbry.formatCredits = function(amount, precision) { return amount.toFixed(precision || 1).replace(/\.?0+$/, ""); @@ -374,10 +333,6 @@ lbry.getMediaType = function(contentType, fileName) { } }; -lbry.stop = function(callback) { - lbry.call("stop", {}, callback); -}; - lbry._subscribeIdCount = 0; lbry._balanceSubscribeCallbacks = {}; lbry._balanceSubscribeInterval = 5000; @@ -463,7 +418,7 @@ lbry.file_list = function(params = {}) { } } - lbry.call( + apiCall( "file_list", params, fileInfos => { @@ -474,7 +429,6 @@ lbry.file_list = function(params = {}) { .map(pendingPublishToDummyFileInfo); resolve([...fileInfos, ...dummyFileInfos]); }, - reject, reject ); }); @@ -482,7 +436,7 @@ lbry.file_list = function(params = {}) { lbry.claim_list_mine = function(params = {}) { return new Promise((resolve, reject) => { - lbry.call( + apiCall( "claim_list_mine", params, claims => { @@ -499,7 +453,6 @@ lbry.claim_list_mine = function(params = {}) { .map(pendingPublishToDummyClaim); resolve([...claims, ...dummyClaims]); }, - reject, reject ); }); @@ -516,10 +469,10 @@ lbry.resolve = function(params = {}) { if (params.uri && lbry._claimCache[params.uri] !== undefined) { resolve(lbry._claimCache[params.uri]); } else { - lbry._resolveXhrs[params.uri] = lbry.call( + lbry._resolveXhrs[params.uri] = apiCall( "resolve", params, - function(data) { + data => { if (data !== undefined) { lbry._claimCache[params.uri] = data; } @@ -547,14 +500,7 @@ lbry = new Proxy(lbry, { return function(params = {}) { return new Promise((resolve, reject) => { - jsonrpc.call( - lbry.daemonConnectionString, - name, - params, - resolve, - reject, - reject - ); + apiCall(name, params, resolve, reject); }); }; }, diff --git a/ui/js/page/help/view.jsx b/ui/js/page/help/view.jsx index d8d957fc4..b8a59a619 100644 --- a/ui/js/page/help/view.jsx +++ b/ui/js/page/help/view.jsx @@ -26,12 +26,12 @@ class HelpPage extends React.PureComponent { upgradeAvailable: upgradeAvailable, }); }); - lbry.call("version", {}, info => { + lbry.version().then(info => { this.setState({ versionInfo: info, }); }); - lbry.getSessionInfo(info => { + lbry.status({ session_status: true }).then(info => { this.setState({ lbryId: info.lbry_id, }); diff --git a/ui/js/page/publish/view.jsx b/ui/js/page/publish/view.jsx index 5d8fd1916..2628e01e8 100644 --- a/ui/js/page/publish/view.jsx +++ b/ui/js/page/publish/view.jsx @@ -134,7 +134,7 @@ class PublishPage extends React.PureComponent { publishArgs.file_path = this.refs.file.getValue(); } - lbry.publish( + lbry.publishDeprecated( publishArgs, message => { this.handlePublishStarted(); diff --git a/ui/js/page/report.js b/ui/js/page/report.js index a81592ad7..72f237210 100644 --- a/ui/js/page/report.js +++ b/ui/js/page/report.js @@ -19,7 +19,7 @@ class ReportPage extends React.PureComponent { this.setState({ submitting: true, }); - lbry.reportBug(this._messageArea.value, () => { + lbry.report_bug({ message: this._messageArea.value }).then(() => { this.setState({ submitting: false, modal: "submitted", From 521b368cb03b86331526f5cd354d808575a1c856 Mon Sep 17 00:00:00 2001 From: Jeremy Kauffman Date: Wed, 14 Jun 2017 20:37:42 -0400 Subject: [PATCH 07/10] fix error reporting --- ui/js/page/report.js | 42 +++++++++++++++++++++--------------------- 1 file changed, 21 insertions(+), 21 deletions(-) diff --git a/ui/js/page/report.js b/ui/js/page/report.js index 72f237210..c24d367d9 100644 --- a/ui/js/page/report.js +++ b/ui/js/page/report.js @@ -1,37 +1,45 @@ import React from "react"; import Link from "component/link"; import { FormRow } from "component/form"; -import Modal from "../component/modal.js"; +import { doShowSnackBar } from "actions/app"; import lbry from "../lbry.js"; -class ReportPage extends React.PureComponent { +class ReportPage extends React.Component { constructor(props) { super(props); this.state = { submitting: false, - modal: null, + message: "", }; } submitMessage() { - if (this._messageArea.value) { + const message = this.state.message; + if (message) { this.setState({ submitting: true, }); - lbry.report_bug({ message: this._messageArea.value }).then(() => { + lbry.report_bug({ message }).then(() => { this.setState({ submitting: false, - modal: "submitted", }); + + // Display global notice + const action = doShowSnackBar({ + message: __("Message received! Thanks for helping."), + isError: false, + }); + window.app.store.dispatch(action); }); - this._messageArea.value = ""; + + this.setState({ message: "" }); } } - closeModal() { + onMessageChange(event) { this.setState({ - modal: null, + message: event.target.value, }); } @@ -49,9 +57,12 @@ class ReportPage extends React.PureComponent {
(this._messageArea = t)} rows="10" name="message" + value={this.state.message} + onChange={event => { + this.onMessageChange(event); + }} placeholder={__("Description of your issue")} />
@@ -83,17 +94,6 @@ class ReportPage extends React.PureComponent { />. - { - this.closeModal(event); - }} - > - {__( - "Your bug report has been submitted! Thank you for your feedback." - )} - ); } From e9ece65d68a4d7671cdd795cbaf35aecf67c6f5e Mon Sep 17 00:00:00 2001 From: Jeremy Kauffman Date: Wed, 14 Jun 2017 20:38:14 -0400 Subject: [PATCH 08/10] =?UTF-8?q?Bump=20version:=200.12.2rc1=20=E2=86=92?= =?UTF-8?q?=200.12.2rc2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .bumpversion.cfg | 2 +- app/package.json | 2 +- ui/package.json | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.bumpversion.cfg b/.bumpversion.cfg index 2e4f2ab1b..7e94950bc 100644 --- a/.bumpversion.cfg +++ b/.bumpversion.cfg @@ -1,5 +1,5 @@ [bumpversion] -current_version = 0.12.2rc1 +current_version = 0.12.2rc2 commit = True tag = True parse = (?P\d+)\.(?P\d+)\.(?P\d+)((?P[a-z]+)(?P\d+))? diff --git a/app/package.json b/app/package.json index 38d6b6a58..898fc36e6 100644 --- a/app/package.json +++ b/app/package.json @@ -1,6 +1,6 @@ { "name": "LBRY", - "version": "0.12.2rc1", + "version": "0.12.2rc2", "main": "main.js", "description": "LBRY is a fully decentralized, open-source protocol facilitating the discovery, access, and (sometimes) purchase of data.", "author": { diff --git a/ui/package.json b/ui/package.json index 64f312203..4d90824e2 100644 --- a/ui/package.json +++ b/ui/package.json @@ -1,6 +1,6 @@ { "name": "lbry-web-ui", - "version": "0.12.2rc1", + "version": "0.12.2rc2", "description": "LBRY UI", "scripts": { "test": "echo \"Error: no test specified\" && exit 1", From 0798f60c7037123f7f64763cda6238970b0a3390 Mon Sep 17 00:00:00 2001 From: Sean Yesmunt Date: Wed, 14 Jun 2017 21:03:20 -0700 Subject: [PATCH 09/10] allow user to create new directory when choosing download directory --- ui/js/component/file-selector.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/ui/js/component/file-selector.js b/ui/js/component/file-selector.js index 879ea2665..b0298424f 100644 --- a/ui/js/component/file-selector.js +++ b/ui/js/component/file-selector.js @@ -21,7 +21,9 @@ class FileSelector extends React.PureComponent { handleButtonClick() { remote.dialog.showOpenDialog( { - properties: [this.props.type == "file" ? "openFile" : "openDirectory"], + properties: this.props.type == "file" + ? ["openFile"] + : ["openDirectory", "createDirectory"], }, paths => { if (!paths) { From 1063d2fc9dc5a25d2db247ac338aa5d9072ed881 Mon Sep 17 00:00:00 2001 From: 6ea86b96 <6ea86b96@gmail.com> Date: Thu, 15 Jun 2017 11:26:26 +0700 Subject: [PATCH 10/10] Always refresh claims/file info on downloaded/published pages --- ui/js/actions/file_info.js | 13 +- ui/js/component/fileList/view.jsx | 2 +- ui/js/component/fileTile/view.jsx | 8 +- ui/js/lbry.js | 742 ++++++++++++------------- ui/js/page/fileListDownloaded/view.jsx | 2 +- ui/js/page/fileListPublished/view.jsx | 2 +- 6 files changed, 376 insertions(+), 393 deletions(-) diff --git a/ui/js/actions/file_info.js b/ui/js/actions/file_info.js index d379db625..53dfb13a5 100644 --- a/ui/js/actions/file_info.js +++ b/ui/js/actions/file_info.js @@ -98,16 +98,9 @@ export function doDeleteFile(outpoint, deleteFromComputer) { export function doFetchFileInfosAndPublishedClaims() { return function(dispatch, getState) { - const state = getState(), - isClaimListMinePending = selectClaimListMineIsPending(state), - isFileInfoListPending = selectFileListIsPending(state); + const state = getState(); - if (isClaimListMinePending === undefined) { - dispatch(doFetchClaimListMine()); - } - - if (isFileInfoListPending === undefined) { - dispatch(doFileList()); - } + dispatch(doFetchClaimListMine()); + dispatch(doFileList()); }; } diff --git a/ui/js/component/fileList/view.jsx b/ui/js/component/fileList/view.jsx index 664ae97d3..4e35ec948 100644 --- a/ui/js/component/fileList/view.jsx +++ b/ui/js/component/fileList/view.jsx @@ -82,7 +82,7 @@ class FileList extends React.PureComponent { }); return (
- {fetching && } + {fetching && } {__("Sort by")} {" "} diff --git a/ui/js/component/fileTile/view.jsx b/ui/js/component/fileTile/view.jsx index 27511defd..d19ce0137 100644 --- a/ui/js/component/fileTile/view.jsx +++ b/ui/js/component/fileTile/view.jsx @@ -19,14 +19,14 @@ class FileTile extends React.PureComponent { } componentDidMount() { - this.resolve(this.props); + const { isResolvingUri, claim, uri, resolveUri } = this.props; + + if (!isResolvingUri && !claim && uri) resolveUri(uri); } componentWillReceiveProps(nextProps) { - this.resolve(nextProps); - } + const { isResolvingUri, claim, uri, resolveUri } = this.props; - resolve({ isResolvingUri, claim, uri, resolveUri }) { if (!isResolvingUri && claim === undefined && uri) resolveUri(uri); } diff --git a/ui/js/lbry.js b/ui/js/lbry.js index e242bf538..cadd33582 100644 --- a/ui/js/lbry.js +++ b/ui/js/lbry.js @@ -1,25 +1,25 @@ -import lbryio from './lbryio.js'; -import lighthouse from './lighthouse.js'; -import jsonrpc from './jsonrpc.js'; -import lbryuri from './lbryuri.js'; -import { getLocal, getSession, setSession, setLocal } from './utils.js'; +import lbryio from "./lbryio.js"; +import lighthouse from "./lighthouse.js"; +import jsonrpc from "./jsonrpc.js"; +import lbryuri from "./lbryuri.js"; +import { getLocal, getSession, setSession, setLocal } from "./utils.js"; -const { remote, ipcRenderer } = require('electron'); -const menu = remote.require('./menu/main-menu'); +const { remote, ipcRenderer } = require("electron"); +const menu = remote.require("./menu/main-menu"); let lbry = { - isConnected: false, - daemonConnectionString: 'http://localhost:5279/lbryapi', - pendingPublishTimeout: 20 * 60 * 1000, - defaultClientSettings: { - showNsfw: false, - showUnavailable: true, - debug: false, - useCustomLighthouseServers: false, - customLighthouseServers: [], - showDeveloperMenu: false, - language: 'en' - } + isConnected: false, + daemonConnectionString: "http://localhost:5279/lbryapi", + pendingPublishTimeout: 20 * 60 * 1000, + defaultClientSettings: { + showNsfw: false, + showUnavailable: true, + debug: false, + useCustomLighthouseServers: false, + customLighthouseServers: [], + showDeveloperMenu: false, + language: "en", + }, }; /** @@ -27,24 +27,24 @@ let lbry = { * needed to make a dummy claim or file info object. */ function savePendingPublish({ name, channel_name }) { - let uri; - if (channel_name) { - uri = lbryuri.build({ name: channel_name, path: name }, false); - } else { - uri = lbryuri.build({ name: name }, false); - } - const pendingPublishes = getLocal('pendingPublishes') || []; - const newPendingPublish = { - name, - channel_name, - claim_id: 'pending_claim_' + uri, - txid: 'pending_' + uri, - nout: 0, - outpoint: 'pending_' + uri + ':0', - time: Date.now() - }; - setLocal('pendingPublishes', [...pendingPublishes, newPendingPublish]); - return newPendingPublish; + let uri; + if (channel_name) { + uri = lbryuri.build({ name: channel_name, path: name }, false); + } else { + uri = lbryuri.build({ name: name }, false); + } + const pendingPublishes = getLocal("pendingPublishes") || []; + const newPendingPublish = { + name, + channel_name, + claim_id: "pending_claim_" + uri, + txid: "pending_" + uri, + nout: 0, + outpoint: "pending_" + uri + ":0", + time: Date.now(), + }; + setLocal("pendingPublishes", [...pendingPublishes, newPendingPublish]); + return newPendingPublish; } /** @@ -52,18 +52,18 @@ function savePendingPublish({ name, channel_name }) { * A channel name may also be provided along with name. */ function removePendingPublishIfNeeded({ name, channel_name, outpoint }) { - function pubMatches(pub) { - return ( - pub.outpoint === outpoint || - (pub.name === name && - (!channel_name || pub.channel_name === channel_name)) - ); - } + function pubMatches(pub) { + return ( + pub.outpoint === outpoint || + (pub.name === name && + (!channel_name || pub.channel_name === channel_name)) + ); + } - setLocal( - 'pendingPublishes', - lbry.getPendingPublishes().filter(pub => !pubMatches(pub)) - ); + setLocal( + "pendingPublishes", + lbry.getPendingPublishes().filter(pub => !pubMatches(pub)) + ); } /** @@ -71,12 +71,12 @@ function removePendingPublishIfNeeded({ name, channel_name, outpoint }) { * removes them from the list. */ lbry.getPendingPublishes = function() { - const pendingPublishes = getLocal('pendingPublishes') || []; - const newPendingPublishes = pendingPublishes.filter( - pub => Date.now() - pub.time <= lbry.pendingPublishTimeout - ); - setLocal('pendingPublishes', newPendingPublishes); - return newPendingPublishes; + const pendingPublishes = getLocal("pendingPublishes") || []; + const newPendingPublishes = pendingPublishes.filter( + pub => Date.now() - pub.time <= lbry.pendingPublishTimeout + ); + setLocal("pendingPublishes", newPendingPublishes); + return newPendingPublishes; }; /** @@ -84,97 +84,97 @@ lbry.getPendingPublishes = function() { * provided along withe the name. If no pending publish is found, returns null. */ function getPendingPublish({ name, channel_name, outpoint }) { - const pendingPublishes = lbry.getPendingPublishes(); - return ( - pendingPublishes.find( - pub => - pub.outpoint === outpoint || - (pub.name === name && - (!channel_name || pub.channel_name === channel_name)) - ) || null - ); + const pendingPublishes = lbry.getPendingPublishes(); + return ( + pendingPublishes.find( + pub => + pub.outpoint === outpoint || + (pub.name === name && + (!channel_name || pub.channel_name === channel_name)) + ) || null + ); } function pendingPublishToDummyClaim({ - channel_name, - name, - outpoint, - claim_id, - txid, - nout + channel_name, + name, + outpoint, + claim_id, + txid, + nout, }) { - return { name, outpoint, claim_id, txid, nout, channel_name }; + return { name, outpoint, claim_id, txid, nout, channel_name }; } function pendingPublishToDummyFileInfo({ name, outpoint, claim_id }) { - return { name, outpoint, claim_id, metadata: null }; + return { name, outpoint, claim_id, metadata: null }; } lbry.call = function( - method, - params, - callback, - errorCallback, - connectFailedCallback + method, + params, + callback, + errorCallback, + connectFailedCallback ) { - return jsonrpc.call( - lbry.daemonConnectionString, - method, - params, - callback, - errorCallback, - connectFailedCallback - ); + return jsonrpc.call( + lbry.daemonConnectionString, + method, + params, + callback, + errorCallback, + connectFailedCallback + ); }; //core lbry._connectPromise = null; lbry.connect = function() { - if (lbry._connectPromise === null) { - lbry._connectPromise = new Promise((resolve, reject) => { - let tryNum = 0; + if (lbry._connectPromise === null) { + lbry._connectPromise = new Promise((resolve, reject) => { + let tryNum = 0; - function checkDaemonStartedFailed() { - if (tryNum <= 100) { - // Move # of tries into constant or config option - setTimeout(() => { - tryNum++; - checkDaemonStarted(); - }, tryNum < 50 ? 400 : 1000); - } else { - reject(new Error('Unable to connect to LBRY')); - } - } + function checkDaemonStartedFailed() { + if (tryNum <= 100) { + // Move # of tries into constant or config option + setTimeout(() => { + tryNum++; + checkDaemonStarted(); + }, tryNum < 50 ? 400 : 1000); + } else { + reject(new Error("Unable to connect to LBRY")); + } + } - // Check every half second to see if the daemon is accepting connections - function checkDaemonStarted() { - lbry.call( - 'status', - {}, - resolve, - checkDaemonStartedFailed, - checkDaemonStartedFailed - ); - } + // Check every half second to see if the daemon is accepting connections + function checkDaemonStarted() { + lbry.call( + "status", + {}, + resolve, + checkDaemonStartedFailed, + checkDaemonStartedFailed + ); + } - checkDaemonStarted(); - }); - } + checkDaemonStarted(); + }); + } - return lbry._connectPromise; + return lbry._connectPromise; }; lbry.checkAddressIsMine = function(address, callback) { - lbry.call('wallet_is_address_mine', { address: address }, callback); + lbry.call("wallet_is_address_mine", { address: address }, callback); }; lbry.sendToAddress = function(amount, address, callback, errorCallback) { - lbry.call( - 'send_amount_to_address', - { amount: amount, address: address }, - callback, - errorCallback - ); + lbry.call( + "send_amount_to_address", + { amount: amount, address: address }, + callback, + errorCallback + ); }; /** @@ -189,46 +189,46 @@ lbry.sendToAddress = function(amount, address, callback, errorCallback) { */ lbry.costPromiseCache = {}; lbry.getCostInfo = function(uri) { - if (lbry.costPromiseCache[uri] === undefined) { - lbry.costPromiseCache[uri] = new Promise((resolve, reject) => { - const COST_INFO_CACHE_KEY = 'cost_info_cache'; - let costInfoCache = getSession(COST_INFO_CACHE_KEY, {}); + if (lbry.costPromiseCache[uri] === undefined) { + lbry.costPromiseCache[uri] = new Promise((resolve, reject) => { + const COST_INFO_CACHE_KEY = "cost_info_cache"; + let costInfoCache = getSession(COST_INFO_CACHE_KEY, {}); - function cacheAndResolve(cost, includesData) { - costInfoCache[uri] = { cost, includesData }; - setSession(COST_INFO_CACHE_KEY, costInfoCache); - resolve({ cost, includesData }); - } + function cacheAndResolve(cost, includesData) { + costInfoCache[uri] = { cost, includesData }; + setSession(COST_INFO_CACHE_KEY, costInfoCache); + resolve({ cost, includesData }); + } - if (!uri) { - return reject(new Error(`URI required.`)); - } + if (!uri) { + return reject(new Error(`URI required.`)); + } - if (costInfoCache[uri] && costInfoCache[uri].cost) { - return resolve(costInfoCache[uri]); - } + if (costInfoCache[uri] && costInfoCache[uri].cost) { + return resolve(costInfoCache[uri]); + } - function getCost(uri, size) { - lbry - .stream_cost_estimate({ uri, ...(size !== null ? { size } : {}) }) - .then(cost => { - cacheAndResolve(cost, size !== null); - }, reject); - } + function getCost(uri, size) { + lbry + .stream_cost_estimate({ uri, ...(size !== null ? { size } : {}) }) + .then(cost => { + cacheAndResolve(cost, size !== null); + }, reject); + } - const uriObj = lbryuri.parse(uri); - const name = uriObj.path || uriObj.name; + const uriObj = lbryuri.parse(uri); + const name = uriObj.path || uriObj.name; - lighthouse.get_size_for_name(name).then(size => { - if (size) { - getCost(name, size); - } else { - getCost(name, null); - } - }); - }); - } - return lbry.costPromiseCache[uri]; + lighthouse.get_size_for_name(name).then(size => { + if (size) { + getCost(name, size); + } else { + getCost(name, null); + } + }); + }); + } + return lbry.costPromiseCache[uri]; }; /** @@ -239,143 +239,143 @@ lbry.getCostInfo = function(uri) { * publish can appear in the UI immediately. */ lbry.publish = function( - params, - fileListedCallback, - publishedCallback, - errorCallback + params, + fileListedCallback, + publishedCallback, + errorCallback ) { - lbry.call( - 'publish', - params, - result => { - if (returnedPending) { - return; - } + lbry.call( + "publish", + params, + result => { + if (returnedPending) { + return; + } - clearTimeout(returnPendingTimeout); - publishedCallback(result); - }, - err => { - if (returnedPending) { - return; - } + clearTimeout(returnPendingTimeout); + publishedCallback(result); + }, + err => { + if (returnedPending) { + return; + } - clearTimeout(returnPendingTimeout); - errorCallback(err); - } - ); + clearTimeout(returnPendingTimeout); + errorCallback(err); + } + ); - let returnedPending = false; - // Give a short grace period in case publish() returns right away or (more likely) gives an error - const returnPendingTimeout = setTimeout(() => { - returnedPending = true; + let returnedPending = false; + // Give a short grace period in case publish() returns right away or (more likely) gives an error + const returnPendingTimeout = setTimeout(() => { + returnedPending = true; - if (publishedCallback) { - savePendingPublish({ - name: params.name, - channel_name: params.channel_name - }); - publishedCallback(true); - } + if (publishedCallback) { + savePendingPublish({ + name: params.name, + channel_name: params.channel_name, + }); + publishedCallback(true); + } - if (fileListedCallback) { - const { name, channel_name } = params; - savePendingPublish({ - name: params.name, - channel_name: params.channel_name - }); - fileListedCallback(true); - } - }, 2000); + if (fileListedCallback) { + const { name, channel_name } = params; + savePendingPublish({ + name: params.name, + channel_name: params.channel_name, + }); + fileListedCallback(true); + } + }, 2000); }; lbry.getClientSettings = function() { - var outSettings = {}; - for (let setting of Object.keys(lbry.defaultClientSettings)) { - var localStorageVal = localStorage.getItem('setting_' + setting); - outSettings[setting] = localStorageVal === null - ? lbry.defaultClientSettings[setting] - : JSON.parse(localStorageVal); - } - return outSettings; + var outSettings = {}; + for (let setting of Object.keys(lbry.defaultClientSettings)) { + var localStorageVal = localStorage.getItem("setting_" + setting); + outSettings[setting] = localStorageVal === null + ? lbry.defaultClientSettings[setting] + : JSON.parse(localStorageVal); + } + return outSettings; }; lbry.getClientSetting = function(setting) { - var localStorageVal = localStorage.getItem('setting_' + setting); - if (setting == 'showDeveloperMenu') { - return true; - } - return localStorageVal === null - ? lbry.defaultClientSettings[setting] - : JSON.parse(localStorageVal); + var localStorageVal = localStorage.getItem("setting_" + setting); + if (setting == "showDeveloperMenu") { + return true; + } + return localStorageVal === null + ? lbry.defaultClientSettings[setting] + : JSON.parse(localStorageVal); }; lbry.setClientSettings = function(settings) { - for (let setting of Object.keys(settings)) { - lbry.setClientSetting(setting, settings[setting]); - } + for (let setting of Object.keys(settings)) { + lbry.setClientSetting(setting, settings[setting]); + } }; lbry.setClientSetting = function(setting, value) { - return localStorage.setItem('setting_' + setting, JSON.stringify(value)); + return localStorage.setItem("setting_" + setting, JSON.stringify(value)); }; lbry.getSessionInfo = function(callback) { - lbry.call('status', { session_status: true }, callback); + lbry.call("status", { session_status: true }, callback); }; lbry.reportBug = function(message, callback) { - lbry.call( - 'report_bug', - { - message: message - }, - callback - ); + lbry.call( + "report_bug", + { + message: message, + }, + callback + ); }; //utilities lbry.formatCredits = function(amount, precision) { - return amount.toFixed(precision || 1).replace(/\.?0+$/, ''); + return amount.toFixed(precision || 1).replace(/\.?0+$/, ""); }; lbry.formatName = function(name) { - // Converts LBRY name to standard format (all lower case, no special characters, spaces replaced by dashes) - name = name.replace('/s+/g', '-'); - name = name.toLowerCase().replace(/[^a-z0-9\-]/g, ''); - return name; + // Converts LBRY name to standard format (all lower case, no special characters, spaces replaced by dashes) + name = name.replace("/s+/g", "-"); + name = name.toLowerCase().replace(/[^a-z0-9\-]/g, ""); + return name; }; lbry.imagePath = function(file) { - return 'img/' + file; + return "img/" + file; }; lbry.getMediaType = function(contentType, fileName) { - if (contentType) { - return /^[^/]+/.exec(contentType)[0]; - } else if (fileName) { - var dotIndex = fileName.lastIndexOf('.'); - if (dotIndex == -1) { - return 'unknown'; - } + if (contentType) { + return /^[^/]+/.exec(contentType)[0]; + } else if (fileName) { + var dotIndex = fileName.lastIndexOf("."); + if (dotIndex == -1) { + return "unknown"; + } - var ext = fileName.substr(dotIndex + 1); - if (/^mp4|mov|m4v|flv|f4v$/i.test(ext)) { - return 'video'; - } else if (/^mp3|m4a|aac|wav|flac|ogg$/i.test(ext)) { - return 'audio'; - } else if (/^html|htm|pdf|odf|doc|docx|md|markdown|txt$/i.test(ext)) { - return 'document'; - } else { - return 'unknown'; - } - } else { - return 'unknown'; - } + var ext = fileName.substr(dotIndex + 1); + if (/^mp4|mov|m4v|flv|f4v$/i.test(ext)) { + return "video"; + } else if (/^mp3|m4a|aac|wav|flac|ogg$/i.test(ext)) { + return "audio"; + } else if (/^html|htm|pdf|odf|doc|docx|md|markdown|txt$/i.test(ext)) { + return "document"; + } else { + return "unknown"; + } + } else { + return "unknown"; + } }; lbry.stop = function(callback) { - lbry.call('stop', {}, callback); + lbry.call("stop", {}, callback); }; lbry._subscribeIdCount = 0; @@ -384,57 +384,57 @@ lbry._balanceSubscribeInterval = 5000; lbry._balanceUpdateInterval = null; lbry._updateBalanceSubscribers = function() { - lbry.wallet_balance().then(function(balance) { - for (let callback of Object.values(lbry._balanceSubscribeCallbacks)) { - callback(balance); - } - }); + lbry.wallet_balance().then(function(balance) { + for (let callback of Object.values(lbry._balanceSubscribeCallbacks)) { + callback(balance); + } + }); - if ( - !lbry._balanceUpdateInterval && - Object.keys(lbry._balanceSubscribeCallbacks).length - ) { - lbry._balanceUpdateInterval = setInterval(() => { - lbry._updateBalanceSubscribers(); - }, lbry._balanceSubscribeInterval); - } + if ( + !lbry._balanceUpdateInterval && + Object.keys(lbry._balanceSubscribeCallbacks).length + ) { + lbry._balanceUpdateInterval = setInterval(() => { + lbry._updateBalanceSubscribers(); + }, lbry._balanceSubscribeInterval); + } }; lbry.balanceSubscribe = function(callback) { - const subscribeId = ++lbry._subscribeIdCount; - lbry._balanceSubscribeCallbacks[subscribeId] = callback; - lbry._updateBalanceSubscribers(); - return subscribeId; + const subscribeId = ++lbry._subscribeIdCount; + lbry._balanceSubscribeCallbacks[subscribeId] = callback; + lbry._updateBalanceSubscribers(); + return subscribeId; }; lbry.balanceUnsubscribe = function(subscribeId) { - delete lbry._balanceSubscribeCallbacks[subscribeId]; - if ( - lbry._balanceUpdateInterval && - !Object.keys(lbry._balanceSubscribeCallbacks).length - ) { - clearInterval(lbry._balanceUpdateInterval); - } + delete lbry._balanceSubscribeCallbacks[subscribeId]; + if ( + lbry._balanceUpdateInterval && + !Object.keys(lbry._balanceSubscribeCallbacks).length + ) { + clearInterval(lbry._balanceUpdateInterval); + } }; lbry.showMenuIfNeeded = function() { - const showingMenu = sessionStorage.getItem('menuShown') || null; - const chosenMenu = lbry.getClientSetting('showDeveloperMenu') - ? 'developer' - : 'normal'; - if (chosenMenu != showingMenu) { - menu.showMenubar(chosenMenu == 'developer'); - } - sessionStorage.setItem('menuShown', chosenMenu); + const showingMenu = sessionStorage.getItem("menuShown") || null; + const chosenMenu = lbry.getClientSetting("showDeveloperMenu") + ? "developer" + : "normal"; + if (chosenMenu != showingMenu) { + menu.showMenubar(chosenMenu == "developer"); + } + sessionStorage.setItem("menuShown", chosenMenu); }; lbry.getAppVersionInfo = function() { - return new Promise((resolve, reject) => { - ipcRenderer.once('version-info-received', (event, versionInfo) => { - resolve(versionInfo); - }); - ipcRenderer.send('version-info-requested'); - }); + return new Promise((resolve, reject) => { + ipcRenderer.once("version-info-received", (event, versionInfo) => { + resolve(versionInfo); + }); + ipcRenderer.send("version-info-requested"); + }); }; /** @@ -447,117 +447,107 @@ lbry.getAppVersionInfo = function() { * (If a real publish with the same name is found, the pending publish will be ignored and removed.) */ lbry.file_list = function(params = {}) { - return new Promise((resolve, reject) => { - const { name, channel_name, outpoint } = params; + return new Promise((resolve, reject) => { + const { name, channel_name, outpoint } = params; - /** + /** * If we're searching by outpoint, check first to see if there's a matching pending publish. * Pending publishes use their own faux outpoints that are always unique, so we don't need * to check if there's a real file. */ - if (outpoint) { - const pendingPublish = getPendingPublish({ outpoint }); - if (pendingPublish) { - resolve([pendingPublishToDummyFileInfo(pendingPublish)]); - return; - } - } + if (outpoint) { + const pendingPublish = getPendingPublish({ outpoint }); + if (pendingPublish) { + resolve([pendingPublishToDummyFileInfo(pendingPublish)]); + return; + } + } - lbry.call( - 'file_list', - params, - fileInfos => { - removePendingPublishIfNeeded({ name, channel_name, outpoint }); + lbry.call( + "file_list", + params, + fileInfos => { + removePendingPublishIfNeeded({ name, channel_name, outpoint }); - const dummyFileInfos = lbry - .getPendingPublishes() - .map(pendingPublishToDummyFileInfo); - resolve([...fileInfos, ...dummyFileInfos]); - }, - reject, - reject - ); - }); + const dummyFileInfos = lbry + .getPendingPublishes() + .map(pendingPublishToDummyFileInfo); + resolve([...fileInfos, ...dummyFileInfos]); + }, + reject, + reject + ); + }); }; lbry.claim_list_mine = function(params = {}) { - return new Promise((resolve, reject) => { - lbry.call( - 'claim_list_mine', - params, - claims => { - for (let { name, channel_name, txid, nout } of claims) { - removePendingPublishIfNeeded({ - name, - channel_name, - outpoint: txid + ':' + nout - }); - } + return new Promise((resolve, reject) => { + lbry.call( + "claim_list_mine", + params, + claims => { + for (let { name, channel_name, txid, nout } of claims) { + removePendingPublishIfNeeded({ + name, + channel_name, + outpoint: txid + ":" + nout, + }); + } - const dummyClaims = lbry - .getPendingPublishes() - .map(pendingPublishToDummyClaim); - resolve([...claims, ...dummyClaims]); - }, - reject, - reject - ); - }); + const dummyClaims = lbry + .getPendingPublishes() + .map(pendingPublishToDummyClaim); + resolve([...claims, ...dummyClaims]); + }, + reject, + reject + ); + }); }; -const claimCacheKey = 'resolve_claim_cache'; -lbry._claimCache = getSession(claimCacheKey, {}); lbry._resolveXhrs = {}; lbry.resolve = function(params = {}) { - return new Promise((resolve, reject) => { - if (!params.uri) { - throw __('Resolve has hacked cache on top of it that requires a URI'); - } - if (params.uri && lbry._claimCache[params.uri] !== undefined) { - resolve(lbry._claimCache[params.uri]); - } else { - lbry._resolveXhrs[params.uri] = lbry.call( - 'resolve', - params, - function(data) { - if (data !== undefined) { - lbry._claimCache[params.uri] = data; - } - setSession(claimCacheKey, lbry._claimCache); - resolve(data); - }, - reject - ); - } - }); + return new Promise((resolve, reject) => { + if (!params.uri) { + throw __("Resolve has hacked cache on top of it that requires a URI"); + } + lbry._resolveXhrs[params.uri] = lbry.call( + "resolve", + params, + function(data) { + resolve(data); + }, + reject + ); + }); }; lbry.cancelResolve = function(params = {}) { - const xhr = lbry._resolveXhrs[params.uri]; - if (xhr && xhr.readyState > 0 && xhr.readyState < 4) { - xhr.abort(); - } + const xhr = lbry._resolveXhrs[params.uri]; + if (xhr && xhr.readyState > 0 && xhr.readyState < 4) { + xhr.abort(); + } }; lbry = new Proxy(lbry, { - get: function(target, name) { - if (name in target) { - return target[name]; - } + get: function(target, name) { + if (name in target) { + return target[name]; + } - return function(params = {}) { - return new Promise((resolve, reject) => { - jsonrpc.call( - lbry.daemonConnectionString, - name, - params, - resolve, - reject, - reject - ); - }); - }; - } + return function(params = {}) { + return new Promise((resolve, reject) => { + jsonrpc.call( + lbry.daemonConnectionString, + name, + params, + resolve, + reject, + reject + ); + }); + }; + }, }); export default lbry; diff --git a/ui/js/page/fileListDownloaded/view.jsx b/ui/js/page/fileListDownloaded/view.jsx index 518a5c2f2..77f1091db 100644 --- a/ui/js/page/fileListDownloaded/view.jsx +++ b/ui/js/page/fileListDownloaded/view.jsx @@ -12,7 +12,7 @@ import SubHeader from "component/subHeader"; class FileListDownloaded extends React.PureComponent { componentWillMount() { - this.props.fetchFileInfosDownloaded(); + if (!this.props.isPending) this.props.fetchFileInfosDownloaded(); } render() { diff --git a/ui/js/page/fileListPublished/view.jsx b/ui/js/page/fileListPublished/view.jsx index 90c7aad47..3af905a51 100644 --- a/ui/js/page/fileListPublished/view.jsx +++ b/ui/js/page/fileListPublished/view.jsx @@ -12,7 +12,7 @@ import SubHeader from "component/subHeader"; class FileListPublished extends React.PureComponent { componentWillMount() { - this.props.fetchFileListPublished(); + if (!this.props.isPending) this.props.fetchFileListPublished(); } componentDidUpdate() {