oip-js
Version:
The core module of OIP written in Javascript!
561 lines (465 loc) • 16.9 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
var _axios = require('axios');
var _axios2 = _interopRequireDefault(_axios);
var _qs = require('qs');
var _qs2 = _interopRequireDefault(_qs);
var _ipfs = require('ipfs');
var _ipfs2 = _interopRequireDefault(_ipfs);
var _ipfsApi = require('ipfs-api');
var _ipfsApi2 = _interopRequireDefault(_ipfsApi);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }
var NetworkFunction = function NetworkFunction() {
var settings = this.settings;
var util = this.util;
var Network = {};
Network.OIPdAPI = _axios2.default.create({
baseURL: settings.OIPdURL
});
Network.backupOIPdAPI = _axios2.default.create({
baseURL: settings.backupOIPdURL
});
Network.resultsPerPage = 100;
Network.cachedArtifacts = [];
Network.cachedPublishers = [];
Network.cachedPromoters = [];
Network.cachedRetailers = [];
Network.artifactsLastUpdate = 0; // timestamp of last ajax call to the artifacts endpoint.
Network.publishersLastUpdate = 0; // timestamp of last ajax call to the artifacts endpoint.
Network.promotersLastUpdate = 0; // timestamp of last ajax call to the artifacts endpoint.
Network.retailersLastUpdate = 0; // timestamp of last ajax call to the artifacts endpoint.
Network.artifactsUpdateTimelimit = 5 * 60 * 1000; // Five minutes
Network.publishersUpdateTimelimit = 5 * 60 * 1000; // Five minutes
Network.promotersUpdateTimelimit = 30 * 60 * 1000; // Thirty minutes
Network.retailersUpdateTimelimit = 5 * 60 * 60 * 1000; // Five hours
Network.cachedOIPdInfo = {};
Network.oipdInfoLastUpdate = 0; // timestamp of last ajax call to the info endpoint
Network.oipdInfoUpdateTimelimit = 5 * 60 * 1000; // Five minutes
Network.cachedBTCPriceObj = {};
Network.cachedFLOPriceObj = {};
Network.cachedLTCPriceObj = {};
Network.btcpriceLastUpdate = 0;
Network.flopriceLastUpdate = 0;
Network.ltcpriceLastUpdate = 0;
Network.btcpriceUpdateTimelimit = 5 * 60 * 1000; // Five minutes
Network.flopriceUpdateTimelimit = 5 * 60 * 1000; // Five minutes
Network.ltcpriceUpdateTimelimit = 5 * 60 * 1000; // Five minutes
// Initiate all instances
try {
if (settings.runIPFSJS) Network.ipfs = new _ipfs2.default(settings.ipfsConfig);else Network.ipfs = "not-supported";
} catch (e) {
Network.ipfs = "not-supported";
}
try {
if (settings.runIPFSAPIUpload) Network.ipfsUploadAPI = (0, _ipfsApi2.default)(settings.ipfsAPIConfig.uploadNode);else Network.ipfsUploadAPI = "not-supported";
} catch (e) {
Network.ipfsUploadAPI = "not-supported";
}
try {
if (settings.runIPFSAPICluster) Network.ipfsClusterAPI = (0, _ipfsApi2.default)(settings.ipfsAPIConfig.clusterNode);else Network.ipfsClusterAPI = "not-supported";
} catch (e) {
Network.ipfsClusterAPI = "not-supported";
}
Network.OIPdRequest = function (type, url, options, onSuccess, onError) {
if (type === "get") {
var runBackupServer = function runBackupServer(err) {
if (settings.debug) {
console.log("Initial request failed! Requesting with BACKUP OIPdAPI URL!!! " + url);
console.error(err);
}
Network.backupOIPdAPI.get(url).then(onSuccess).catch(onError);
};
Network.OIPdAPI.get(url).then(function (response) {
if (!response.status === 200) {
runBackupServer();
} else {
onSuccess(response);
}
}).catch(runBackupServer);
} else if (type === "post") {
Network.OIPdAPI.post(url, options).then(onSuccess).catch(function () {
if (settings.debug) {
console.log("Initial request failed! Requesting with BACKUP OIPdAPI URL!!! " + url);
}
Network.backupOIPdAPI.post(url, options).then(onSuccess).catch(onError);
});
}
};
Network.getLatestOIPdInfo = function (onSuccess, onError) {
if (Date.now() - Network.oipdInfoLastUpdate > Network.oipdInfoUpdateTimelimit) {
var builtURL = "/info";
var onResponse = function onResponse(results) {
Network.cachedOIPdInfo = results.data;
Network.oipdInfoLastUpdate = Date.now();
onSuccess(Network.cachedOIPdInfo);
};
Network.OIPdRequest("get", builtURL, {}, onResponse, onError);
} else {
onSuccess(Network.cachedOIPdInfo);
}
};
Network.searchOIPd = function (options, onSuccess, onError) {
var defaultOptions = {
"protocol": "media",
"search-on": "*",
"search-like": true
};
if (!options.protocol) options.protocol = defaultOptions.protocol;
if (!options["search-on"]) options["search-on"] = defaultOptions["search-on"];
if (!options["search-like"]) {
if (options.protocol === "publisher" && options["search-on"] === "address") options["search-like"] = false;else options["search-like"] = defaultOptions["search-like"];
}
var builtURL = "/search";
var onResponse = function onResponse(results) {
if (results && results.data && results.data.status === "success" && results.data.response) onSuccess([].concat(_toConsumableArray(results.data.response)));else onError(results);
};
Network.OIPdRequest("post", builtURL, options, onResponse, onError);
};
Network.getArtifactFromOIPd = function (id, onSuccess, onError) {
var builtURL = "/artifact/get?id=" + id;
var onResponse = function onResponse(result) {
onSuccess(result.data);
};
Network.OIPdRequest("get", builtURL, {}, onResponse, onError);
};
Network.getArtifactsFromOIPd = function (page, onSuccess, onError) {
var numResults = Network.resultsPerPage;
if (page && isNaN(page) && page !== "*") {
onError = onSuccess;
onSuccess = page;
page = 1;
} else if (page === "*") {
numResults = "*";
page = 1;
}
var type = settings.indexFilters.type || "*";
var subtype = settings.indexFilters.subtype || "*";
var builtURL = "/artifact/get/type?t=" + type + "&st=" + subtype + "&results=" + numResults + "&page=" + page;
if (settings.indexFilters.publisher) {
builtURL += "&pub=" + settings.indexFilters.publisher;
}
var onResponse = function onResponse(response) {
onSuccess(response.data.results, page, response.data);
};
Network.OIPdRequest("get", builtURL, {}, onResponse, onError);
};
Network.getPublishersFromOIPd = function (onSuccess, onError) {
if (Date.now() - Network.publishersLastUpdate > Network.publishersUpdateTimelimit) {
var builtURL = "/publisher/get/all";
var onResponse = function onResponse(results) {
Network.cachedPublishers = results.data;
Network.publishersLastUpdate = Date.now();
onSuccess(Network.cachedPublishers);
};
Network.OIPdRequest("get", builtURL, {}, onResponse, onError);
} else {
onSuccess(Network.cachedPublishers);
}
};
Network.getPromotersFromOIPd = function (onSuccess, onError) {
if (Date.now() - Network.promotersLastUpdate > Network.promotersUpdateTimelimit) {
var builtURL = "/promoter/get/all";
var onResponse = function onResponse(results) {
Network.cachedPromoters = results.data;
Network.promotersLastUpdate = Date.now();
onSuccess(Network.cachedPromoters);
};
Network.OIPdRequest("get", builtURL, {}, onResponse, onError);
} else {
onSuccess(Network.cachedPromoters);
}
};
Network.getRetailersFromOIPd = function (onSuccess, onError) {
if (Date.now() - Network.retailersLastUpdate > Network.retailersUpdateTimelimit) {
var builtURL = "/retailer/get/all";
var onResponse = function onResponse(results) {
Network.cachedRetailers = results.data;
Network.retailersLastUpdate = Date.now();
onSuccess(Network.cachedRetailers);
};
Network.OIPdRequest("get", builtURL, {}, onResponse, onError);
} else {
onSuccess(Network.cachedRetailers);
}
};
Network.getLatestBTCPrice = function (onSuccess, onError) {
if (Network.btcpriceLastUpdate < Date.now() - Network.btcpriceUpdateTimelimit || Network.cachedBTCPriceObj === {}) {
_axios2.default.get(settings.btcTickerURL).then(function (result) {
if (result.status === 200) {
Network.cachedBTCPriceObj = result.data;
Network.btcpriceLastUpdate = Date.now();
onSuccess(Network.cachedBTCPriceObj["USD"].last);
}
}).catch(function (error) {
onError(error);
});
} else {
onSuccess(Network.cachedBTCPriceObj["USD"].last);
}
};
Network.getLatestFLOPrice = function (onSuccess, onError) {
if (Network.flopriceLastUpdate < Date.now() - Network.flopriceUpdateTimelimit || Network.cachedFLOPriceObj === {}) {
_axios2.default.get(settings.floTickerURL).then(function (result) {
if (result.status === 200) {
Network.cachedFLOPriceObj = result.data;
Network.flopriceLastUpdate = Date.now();
onSuccess(Network.cachedFLOPriceObj["USD"]);
}
}).catch(function (error) {
onError(error);
});
} else {
onSuccess(Network.cachedFLOPriceObj["USD"]);
}
};
Network.getLatestLTCPrice = function (onSuccess, onError) {
if (Network.ltcpriceLastUpdate < Date.now() - Network.ltcpriceUpdateTimelimit || Network.cachedLTCPriceObj === {}) {
_axios2.default.get(settings.ltcTickerURL).then(function (result) {
if (result.status === 200) {
Network.cachedLTCPriceObj = result.data;
Network.ltcpriceLastUpdate = Date.now();
onSuccess(Network.cachedLTCPriceObj[0]["price_usd"]);
}
}).catch(function (error) {
onError(error);
});
} else {
onSuccess(Network.cachedLTCPriceObj[0]["price_usd"]);
}
};
Network.getIPFS = function (callback) {
Network.ipfs.on('ready', function () {
callback(Network.ipfs);
});
};
Network.getThumbnailFromIPFS = function (hash, onData, onEnd) {
var returned = false;
var cancelRequest = false;
var cancelRequestFunc = function cancelRequestFunc() {
returned = true;
cancelRequest = true;
};
// Require a hash to be passed
if (!hash || hash === "") {
returned = true;
return cancelRequestFunc;
}
if (!onEnd) {
onEnd = function onEnd() {};
}
try {
Network.ipfs.files.catReadableStream(hash, function (err, file) {
if (err) {
returned = true;
return cancelRequestFunc;
}
var stream = file;
if (cancelRequest) {
try {
stream.destroy();
} catch (e) {}
return;
}
var chunks = [];
var lastdata = 0;
if (stream) {
stream.on('data', function (chunk) {
// If the request was aborted, ABORT ABORT ABORT!
if (cancelRequest) {
return;
}
chunks.push(chunk);
// Note, this might cause tons of lag depending on how many ongoing IPFS requests we have.
if (Date.now() - lastdata > 1000) {
lastdata = Date.now();
util.chunksToFileURL(chunks, function (data) {
onData(data, hash);
returned = true;
});
}
});
stream.on('end', function () {
if (cancelRequest) return;
util.chunksToFileURL(chunks, function (data) {
onData(data, hash);
});
});
}
});
} catch (e) {
if (cancelRequest) return cancelRequestFunc;
onData(util.buildIPFSURL(hash), hash);
returned = true;
}
setTimeout(function () {
if (cancelRequest) return cancelRequestFunc;
if (!returned) {
onData(util.buildIPFSURL(hash), hash);
}
}, 2 * 1000);
return cancelRequestFunc;
};
Network.getFileFromIPFS = function (hash, onComplete) {
// Require a hash to be passed
if (!hash || hash === "") return;
var returned = false;
try {
Network.ipfs.files.cat(hash, function (err, file) {
if (err) {
returned = true;
return;
}
var stream = file;
var chunks = [];
if (stream) {
stream.on('data', function (chunk) {
chunks.push(chunk);
});
stream.on('end', function () {
util.chunksToFileURL(chunks, function (data) {
onComplete(data, hash);
returned = true;
});
});
}
});
} catch (e) {}
setTimeout(function () {
if (!returned) {
onComplete(util.buildIPFSURL(hash), hash);
}
}, 2 * 1000);
};
Network.ipfsAPIAdd = function (data, options, callback) {
if (!options) {
options = {};
}
options.qs = { w: null, pin: true };
Network.ipfsUploadAPI.files.add(data, options, function (error, success) {
if (error) {
callback(error, success);
} else {
var folderHash = success[success.length - 1].hash;
// try {
// Network.ipfsAPIPin(folderHash, function(pinError, pinSuccess){
// callback(pinError, folderHash, success, pinSuccess);
// })
// } catch (e) {
// callback(error, folderHash, success, "Pin Signalled Error, may have succeeded successfully anyways.")
// }
callback(error, folderHash, success);
}
});
};
Network.ipfsAPIPin = function (hash, callback) {
var options = {
mode: "no-cors",
recursive: true
};
Network.ipfsClusterAPI.pin.add(hash, options, callback);
};
Network.getCommentsFromISSO = function (uri, callback) {
_axios2.default.get(settings.issoURL + "?uri=" + encodeURIComponent(uri) + "&plain=1").then(function (results) {
callback(results);
}).catch(function (error) {
// If there is an error, it is likely because the artifact has no comments, just return an empty array.
callback([]);
});
};
Network.postCommentToISSO = function (uri, comment, callback) {
var instance = _axios2.default.create();
instance.post(settings.issoURL + "new?uri=" + encodeURIComponent(uri) + "&plain=1", JSON.stringify({ title: "", text: comment }), { headers: { "Content-Type": "application/json" }, transformRequest: [function (data, headers) {
delete headers.common.Authorization;
return data;
}]
}).then(function (results) {
callback(results);
}).catch(function (error) {
// If there is an error, it is likely because the artifact has no comments, just return an empty array.
callback({ error: true });
});
};
Network.likeISSOComment = function (id, callback) {
_axios2.default.post(settings.issoURL + "id/" + id + "/like", {}).then(function (results) {
callback(results);
}).catch(function (error) {
// If there is an error, it is likely because the artifact has no comments, just return an empty array.
callback({ error: true });
});
};
Network.dislikeISSOComment = function (id, callback) {
_axios2.default.post(settings.issoURL + "id/" + id + "/dislike", {}).then(function (results) {
callback(results);
}).catch(function (error) {
// If there is an error, it is likely because the artifact has no comments, just return an empty array.
callback({ error: true });
});
};
Network.getTXFromFlosight = function (txid, onSuccess, onError) {
_axios2.default.get(settings.flosightURL + "/tx/" + txid).then(function (res) {
onSuccess(res.data);
}).catch(onError);
};
Network.searchFloData = function (options, onSuccess, onError) {
if (typeof options === "string") {
options = {
search: options
};
}
if (!options.page) options.page = 0;
if (!options["results-per-page"]) options["results-per-page"] = 100;
Network.OIPdRequest("post", '/searchTxComment', options, function (res) {
onSuccess(res.data);
}, onError);
};
Network.tryOneTimeFaucet = function (address, recaptcha, onSuccess, onError) {
Network.tryFaucet("one_time", address, recaptcha, onSuccess, onError);
};
Network.tryDailyFaucet = function (address, recaptcha, onSuccess, onError) {
Network.tryFaucet("interval", address, recaptcha, onSuccess, onError);
};
Network.tryFaucet = function (type, address, recaptcha, onSuccess, onError) {
var data = {
"currency_code": "FLO",
"depositAddress": address,
"recaptcha2": recaptcha,
"type": type
};
_axios2.default.post(settings.faucetURL + "/request", _qs2.default.stringify(data)).then(function (response) {
var res = response.data;
if (res.success) {
var txinfo = res.info;
Network.postRawTransactionToFlorinsight(txinfo.hex, function (success) {
onSuccess(txinfo);
}, function (err) {
onError(err, response);
});
} else {
onError(res, response);
}
}).catch(function (error) {
console.error(error);
});
};
Network.postRawTransactionToFlorinsight = function (rawtx, onSuccess, onError) {
_axios2.default.post(settings.postFlorinsightTxURL, { "rawtx": rawtx }).then(onSuccess).catch(onError);
};
Network.checkDailyFaucet = function (flo_address, onSuccess, onError) {
var data = {
"currency_code": "FLO",
"depositAddress": flo_address
};
_axios2.default.post(settings.faucetURL + "/check", _qs2.default.stringify(data)).then(function (response) {
var res = response.data;
onSuccess(res);
}).catch(function (error) {
console.error(error);
});
};
this.Network = Network;
return this.Network;
};
exports.default = NetworkFunction;