UNPKG

edichain

Version:

Provides a basic integration for ipfs (storage/distribution) and ethereum blockchain (validation/authorization) based EDIfact message exchange.

129 lines (109 loc) 3.95 kB
/** Simple file based EDI style message exchange using EDIchain Will use the following folder structure: out\ = Place EDI Messages as text files in here (required Recipient in UNB segment) sent\ = Messages sent and documented in blockchain (filename will be Transaction ID_IPFS-Hash in\edi = Received EDI Messages (text files) in\meta = Meta files corresponding to EDI Messages. */ require("./edichain.js"); var forge = require('node-forge'); var fs = require("fs"); var sendSempahore=false; sendFile = function(fname,recipient) { if(!sendSempahore) { sendSempahore=true; var data = fs.readFileSync("out/"+fname).toString(); var msg = { filename:fname, data:forge.util.encode64(data) }; edichain.sendData(recipient,JSON.stringify(msg),function(tx,hash) { if(fs.existsSync("out/"+fname)) { fs.renameSync("out/"+fname,"sent/"+tx+"_"+hash+".edi"); } sendSempahore=false; }); } } checkOutbox = function() { if(!fs.existsSync("out")) fs.mkdirSync("out"); if(!fs.existsSync("sent")) fs.mkdirSync("sent"); var files = fs.readdirSync("out"); if(files.length==0) return; for(var i=0;((i<10)&&(i<files.length));i++) { if((files[i].indexOf(".")>2)&&(!sendSempahore)) { var data = fs.readFileSync("out/"+files[i]).toString(); // try to determine "to" from data var recipient="unknown"; if(files[i].indexOf(".edi")>0) { // determine recipient from EDIFACT var segSplit=data.substr(4,1); var unb_start=data.indexOf("UNB"+segSplit); for(var j=0;j<3;j++) { unb_start=data.indexOf(segSplit,unb_start+1); } var recipient_end=data.indexOf(segSplit,unb_start+1); recipient=data.substr(unb_start+1,recipient_end-unb_start-1); } else { // determine recipient from filename recipient=files[i].substring(0,files[i].indexOf(".")); } if(!sendSempahore) { sendFile(files[i],recipient); console.log("Outbox:",recipient); } } } } edichain.storeMessage=function(message) { // Need to overwrite in case something goes wrong with message decryption. if(!message.data) {} else if(message.data.length>0) { var m = {}; var json = message.data.substr(0,message.data.lastIndexOf("}")+1); try { m = JSON.parse(json); } catch(e) {console.log(e);} if(m.filename) { fs.writeFileSync("in/edi/"+message.addr+"_"+m.filename,forge.util.decode64(m.data)); } else { console.log(m); fs.writeFileSync("in/edi/"+message.addr+".edi",forge.util.decode64(m.data)); } } var m=message; // m.data=""; fs.writeFileSync("in/meta/"+message.addr+".json",JSON.stringify(m)); //} } edichain.storeHash = function(hash,data) { if(!fs.existsSync("hash")) fs.mkdirSync("hash"); fs.writeFileSync("hash/"+hash+".json",data); } var old_inbox_length=0; checkInbox = function() { if(!fs.existsSync("in")) fs.mkdirSync("in"); if(!fs.existsSync("in/meta")) fs.mkdirSync("in/meta"); if(!fs.existsSync("in/edi")) fs.mkdirSync("in/edi"); while(edichain.config.lastMsgCnt<edichain.updateInbox()) { console.log("Recieving more messages...",edichain.config.lastMsgCnt); } } var interval_semaphore=false; var interval = function() { if(interval_semaphore) return; interval_semaphore=true; try { checkOutbox(); } catch(e) {console.log(e);} try { checkInbox(); } catch(e) {console.log(e);} interval_semaphore=false; } var cb = function() { //edichain.decryptMessageHash('QmUSgwepqBUKJFt2KHmLVFrPo5Ba4HDRK9Le7wRh7MY1Ne',new edichain.message(),this); edichain.config.lastMsgCnt=9; checkOutbox(); try { checkInbox(); } catch(e) {console.log(e);} setInterval(function() {interval();},20000); } var echain = new edichain.bootstrap({bootstrap_callback:cb,ipfsPeer:'/ip4/62.75.241.218/tcp/4001/ipfs/QmSPtbb8VUVs1k5spJfDhrUc1mzdsC5FKGZpx1FSfhjmze'});