adding web sockets (part 1) #15

Merged
bones7242 merged 6 commits from master into master 2017-05-26 10:37:42 +02:00
3 changed files with 21 additions and 191 deletions
Showing only changes of commit 3d6620d27a - Show all commits

View file

@ -1,173 +0,0 @@
// load dependencies
var path = require('path');
var axios = require('axios');
// helper function to filter an array of claims for only free, public claims
function filterForFreePublicClaims(claimsListArray){
//console.log(">> filterForFreePublicClaims, claimsListArray:", claimsListArray);
if (!claimsListArray) {
return null;
};
var freePublicClaims = claimsListArray.filter(function(claim){
return (((claim.value.stream.metadata.license.indexOf('Public Domain') != -1) || (claim.value.stream.metadata.license.indexOf('Creative Commons') != -1)) &&
(!claim.value.stream.metadata.fee || claim.value.stream.metadata.fee === 0));
});
return freePublicClaims;
}
// helper function to decide if a claim is free and public
function isFreePublicClaim(claim){
console.log(">> isFreePublicClaim, claim:", claim);
if ((claim.value.stream.metadata.license === 'Public Domain' || claim.value.stream.metadata.license === 'Creative Commons') &&
(!claim.value.stream.metadata.fee || claim.value.stream.metadata.fee.amount === 0)) {
return true;
} else {
return false;
}
}
// helper function to order a set of claims
function orderTopClaims(claimsListArray){
console.log(">> orderTopClaims, claimsListArray:");
claimsListArray.sort(function(claimA, claimB){
if (claimA.amount === claimB.amount){
return (claimA.height > claimB.height);
} else {
return (claimA.amount < claimB.amount);
}
})
return claimsListArray;
}
module.exports = {
publishClaim: function(publishObject){
axios.post('http://localhost:5279/lbryapi', publishObject)
.then(function (response) {
// receive resonse from LBRY
// if successfull, (1) delete file (2) send response to the client
console.log(">> 'publish' success...");
console.log(">> 'publish' response.data:", response.data);
console.log(" [x] Done");
// return the claim we got
//res.status(200).send(JSON.stringify({msg: "you succsessfully published!", txData: response.data}));
}).catch(function(error){
// receive response from LBRY
// if not successfull, (1) delete file and (2) send response to the client
console.log(">> 'publish' error.response.data:", error.response.data);
console.log(" [x] Done");
//res.status(500).send(JSON.stringify({msg: "your file was not published", err: error.response.data.error.message}));
})
},
serveClaimBasedOnNameOnly: function(claimName, res){
// make a call to the daemon to get the claims list
axios.post('http://localhost:5279/lbryapi', {
method: "claim_list",
params: {
name: claimName
}
}
).then(function (response) {
console.log(">> Claim_list success");
console.log(">> Number of claims:", response.data.result.claims.length)
// return early if no claims were found
if (response.data.result.claims.length === 0){
res.status(200).sendFile(path.join(__dirname, '../public', 'noClaims.html'));
return;
}
// filter the claims to return free, public claims
var freePublicClaims = filterForFreePublicClaims(response.data.result.claims);
// return early if no free, public claims were found
if (!freePublicClaims || (freePublicClaims.length === 0)){
res.status(200).sendFile(path.join(__dirname, '../public', 'noClaims.html'));
return;
}
// order the claims
var orderedPublcClaims = orderTopClaims(freePublicClaims);
// create the uri for the first (selected) claim
console.log(">> ordered free public claims", orderedPublcClaims);
var freePublicClaimUri = "lbry://" + orderedPublcClaims[0].name + "#" + orderedPublcClaims[0].claim_id;
console.log(">> your free public claim uri:", freePublicClaimUri);
// fetch the image to display
axios.post('http://localhost:5279/lbryapi', {
method: "get",
params: {
uri: freePublicClaimUri
}
}
).then(function (getResponse) {
console.log(">> 'get claim' success...");
console.log(">> response data:", getResponse.data);
console.log(">> dl path =", getResponse.data.result.download_path)
// return the claim we got
res.status(200).sendFile(getResponse.data.result.download_path);
}).catch(function(getError){
console.log(">> /c/ 'get' error:", getError.response.data);
res.status(500).send(JSON.stringify({msg: "An error occurred while fetching the free, public claim by URI.", err: getError.response.data.error.message}));
})
}).catch(function(error){
console.log(">> /c/ error:", error.response.data);
res.status(500).send(JSON.stringify({msg: "An error occurred while getting the claim list.", err: error.response.data.error.message}));
})
},
serveClaimBasedOnUri: function(uri, res){
/*
to do: need to pass the URI through a test (use 'resolve') to see if it is free and public. Right now it is jumping straight to 'get'ing and serving the asset.
*/
console.log(">> your uri:", uri);
// fetch the image to display
axios.post('http://localhost:5279/lbryapi', { // to do: abstract this code to a function that can be shared
method: "get",
params: {
uri: uri
}
}
).then(function (getResponse) {
console.log(">> 'get claim' success...");
console.log(">> response data:", getResponse.data);
console.log(">> dl path =", getResponse.data.result.download_path)
/*
to do: make sure the file has completed downloading before serving back the file
*/
// return the claim we got
res.status(200).sendFile(getResponse.data.result.download_path);
/* delete the file after a certain amount of time? */
}).catch(function(error){
console.log(">> /c/ 'get' error:", error.response.data);
res.status(500).send(JSON.stringify({msg: "an error occurred", err: error.response.data.error.message}));
})
},
serveAllClaims: function(claimName, res){
// make a call to the daemon to get the claims list
axios.post('http://localhost:5279/lbryapi', {
method: "claim_list",
params: {
name: claimName
}
}
).then(function (response) {
console.log(">> Claim_list success");
console.log(">> Number of claims:", response.data.result.claims.length)
// return early if no claims were found
if (response.data.result.claims.length === 0){
res.status(200).sendFile(path.join(__dirname, '../public', 'noClaims.html'));
return;
}
// filter the claims to return free, public claims
var freePublicClaims = filterForFreePublicClaims(response.data.result.claims);
// return early if no free, public claims were found
if (!freePublicClaims || (freePublicClaims.length === 0)){
res.status(200).sendFile(path.join(__dirname, '../public', 'noClaims.html'));
return;
}
console.log(">> Number of free public claims:", freePublicClaims.length);
// order the claims
var orderedPublicClaims = orderTopClaims(freePublicClaims);
// serve the response
res.status(200).send(orderedPublicClaims); //to do: rather than returning json, serve a page of all these claims
}).catch(function(error){
console.log(">> /c/ error:", error.response.data);
// serve the response
res.status(500).send(JSON.stringify({msg: "An error occurred while finding the claim list.", err: error.response.data.error.message}));
})
}
}

View file

@ -38,24 +38,29 @@ function orderTopClaims(claimsListArray){
} }
function getClaimWithUri(uri, resolve, reject){ function getClaimWithUri(uri, resolve, reject){
console.log(">> making get request to lbry daemon")
axios.post('http://localhost:5279/lbryapi', { axios.post('http://localhost:5279/lbryapi', {
method: "get", method: "get",
params: { uri: uri } params: { uri: uri }
} }
).then(function (getUriResponse) { ).then(function (getUriResponse) {
console.log(">> 'get claim' success..."); console.log(">> 'get claim' success...");
//check to make sure the daemon didn't just time out
if (getUriResponse.data.result.error === "Timeout"){
kauffj commented 2017-05-31 20:38:11 +02:00 (Migrated from github.com)
Review

It's a good idea to define strings that have special values as constants.

It's a good idea to define strings that have special values as constants.
reject("get request to lbry daemon timed out");
}
console.log(">> response data:", getUriResponse.data); console.log(">> response data:", getUriResponse.data);
console.log(">> dl path =", getUriResponse.data.result.download_path) console.log(">> dl path =", getUriResponse.data.result.download_path)
// resolve the promise with the download path for the claim we got // resolve the promise with the download path for the claim we got
/* note: do not resolve until the download is actually complete */ /*
note: put in a check to make sure we do not resolve until the download is actually complete
*/
resolve(getUriResponse.data.result.download_path); resolve(getUriResponse.data.result.download_path);
kauffj commented 2017-05-31 20:39:59 +02:00 (Migrated from github.com)
Review

If you find yourself accessing the same field repeatedly, like getUriResponse.data, it can be good to just dereference it.

Additionally, assuming you're writing ES6 (which is probably a good idea), you can just write:

.then(({data}) => { if (data.result.error === "Timeout") //etc. })

If you find yourself accessing the same field repeatedly, like getUriResponse.data, it can be good to just dereference it. Additionally, assuming you're writing ES6 (which is probably a good idea), you can just write: `.then(({data}) => { if (data.result.error === "Timeout") //etc. })`
}).catch(function(getUriError){ }).catch(function(getUriError){
console.log(">> 'get' error:", getUriError.response.data); console.log(">> 'get' error:", getUriError.response.data);
// reject the promise with an error message // reject the promise with an error message
reject({ reject(getUriError.response.data.error.message);
msg: "An error occurred while fetching the free, public claim by URI.", return;
err: getUriError.response.data.error.message
});
}); });
} }
@ -142,7 +147,6 @@ module.exports = {
*/ */
var deferred = new Promise(function (resolve, reject){ var deferred = new Promise(function (resolve, reject){
console.log(">> your uri:", uri); console.log(">> your uri:", uri);
// fetch the image to display // fetch the image to display
getClaimWithUri(uri, resolve, reject); getClaimWithUri(uri, resolve, reject);
}); });
@ -150,7 +154,7 @@ module.exports = {
}, },
serveAllClaims: function(claimName, res){ serveAllClaims: function(claimName, res){ // note: work in progress
// make a call to the daemon to get the claims list // make a call to the daemon to get the claims list
axios.post('http://localhost:5279/lbryapi', { axios.post('http://localhost:5279/lbryapi', {
method: "claim_list", method: "claim_list",

View file

@ -7,25 +7,24 @@
<title>Spee.ch Claim</title> <title>Spee.ch Claim</title>
</head> </head>
<body> <body>
<div id="image">
<h1>spee.ch</h1> <h1>spee.ch</h1>
<p>spee.ch is a single-serving site that reads and publishes images to and from the <a href="https://lbry.io">LBRY</a> blockchain.</p> <p>spee.ch is a single-serving site that reads and publishes images to and from the <a href="https://lbry.io">LBRY</a> blockchain.</p>
<h3>Status:</h3> <h3>Status:</h3>
<p id="status">your image is being retrieved</p> <p id="status">Your image is being retrieved</p>
<div id="image"></div> </div>
<script src="/socket.io/socket.io.js"></script> <script src="/socket.io/socket.io.js"></script>
<script> <script>
var socket = io(); var socket = io();
console.log(document.URL) var url = document.URL.substring(document.URL.indexOf('3000/') + 5);
var url = document.URL.substring(document.URL.indexOf('3000/') + 5); // get from the window? // request the claim through the socket
// request the image through the socket
socket.emit("claim-request", url); socket.emit("claim-request", url);
// listen for updates
socket.on("claim-update", function(data){ socket.on("claim-update", function(data){
console.log("data:", data); console.log("data:", data);
document.getElementById("status").innerHTML = data; document.getElementById("status").innerHTML = data;
}) })
// receive the claim through the socket
// receive the image through the socket
socket.on("claim-send", function(data){ socket.on("claim-send", function(data){
if (data.image) { if (data.image) {
var base64Image = 'data:image/jpeg;base64,' + data.buffer; var base64Image = 'data:image/jpeg;base64,' + data.buffer;