SenShaMart/app/p2p-server.js
2022-11-22 13:30:19 +11:00

124 lines
No EOL
5.2 KiB
JavaScript

const Websocket = require('ws');
const P2P_PORT = process.env.P2P_PORT || 5001;
const peers = process.env.PEERS ? process.env.PEERS.split(',') : [];
const MESSAGE_TYPES = {
chain: 'CHAIN',
cointransaction: 'COINTRANSACTION',
clear_payment_transactions: 'CLEAR_Payment_TRANSACTIONS',
clear_meta_transactions: 'CLEAR_META_TRANSACTIONS',
clear_Comp_transactions: 'CLEAR_COMP_TRANSACTIONS',
clear_Integration_transactions: 'CLEAR_Integration_TRANSACTIONS',
metaDataTransaction: 'METADATATRANSACTION',};
class P2pServer {
constructor(blockchain, transactionPool) {
this.blockchain = blockchain;
this.transactionPool = transactionPool;
this.sockets = [];}
listen() {
const server = new Websocket.Server({ port: P2P_PORT });
server.on('connection', socket => this.connectSocket(socket));
this.connectToPeers();
console.log(`Listening for peer-to-peer connections on: ${P2P_PORT}`);}
connectToPeers() {
peers.forEach(peer => {
const socket = new Websocket(peer);
socket.on('open', () => this.connectSocket(socket)); });}
connectSocket(socket) {
this.sockets.push(socket);
console.log('Socket connected');
this.messageHandler(socket);
this.sendChain(socket);}
messageHandler(socket) {
socket.on('message', message => {
const data = JSON.parse(message);
switch(data.type) {
case MESSAGE_TYPES.chain:
this.blockchain.replaceChain(data.chain);
break;
case MESSAGE_TYPES.paymenttransaction:
this.transactionPool.updateOrAddPaymentTransaction(
data.Paymenttransaction);
break;
case MESSAGE_TYPES.metaDataTransaction:
this.transactionPool.updateOrAddMetaDataTransaction(
data.metaDataTransaction);
break;
case MESSAGE_TYPES.CompTransaction:
this.transactionPool.updateOrAddCompTransaction(
data.CompTransaction);
break;
case MESSAGE_TYPES.IntegrationTransaction:
this.transactionPool.updateOrAddIntegrationTransaction(
data.IntegrationTransaction);
break;
case MESSAGE_TYPES.clear_Payment_transactions:
this.transactionPool.clearPayment(this.blockchain.chain[this.
blockchain.chain.length-1].data[0].length-1);
break;
case MESSAGE_TYPES.clear_meta_transactions:
this.transactionPool.clearMeta(this.blockchain.chain[this.
blockchain.chain.length-1].data[1].length);
break;
case MESSAGE_TYPES.clear_comp_transactions:
this.transactionPool.clearMeta(this.blockchain.chain[this.
blockchain.chain.length-1].data[1].length);
break;
case MESSAGE_TYPES.clear_intgration_transactions:
this.transactionPool.clearMeta(this.blockchain.chain[this.
blockchain.chain.length-1].data[1].length);
break;}});}
sendChain(socket) {
socket.send(JSON.stringify({
type: MESSAGE_TYPES.chain,
chain: this.blockchain.chain}));}
ClearedPayments (socket){
socket.send(JSON.stringify({
type: MESSAGE_TYPES.clear_payment_transactions,})); }
ClearedMeta (socket){
socket.send(JSON.stringify({
type: MESSAGE_TYPES.clear_meta_transactions,}));}
ClearedComp (socket){
socket.send(JSON.stringify({
type: MESSAGE_TYPES.clear_comp_transactions,}));}
ClearedIntegration (socket){
socket.send(JSON.stringify({
type: MESSAGE_TYPES.clear_integration_transactions,}));}
sendPaymentTransaction(socket, paymenttransaction) {
socket.send(JSON.stringify({
type: MESSAGE_TYPES.paymenttransaction,
paymenttransaction}));}
sendMetaDataTransaction(socket, metaDataTransaction) {
socket.send(JSON.stringify({
type: MESSAGE_TYPES.metaDataTransaction,
metaDataTransaction}));}
sendIntegrationTransaction(socket, integrationTransaction) {
socket.send(JSON.stringify({
type: MESSAGE_TYPES.integrationTransaction,
integrationTransaction}));}
sendCompTransaction(socket, compTransaction) {
socket.send(JSON.stringify({
type: MESSAGE_TYPES.compTransaction,
compTransaction}));}
syncChains() {
this.sockets.forEach(socket => this.sendChain(socket));}
broadcastPaymentTransaction(paymenttransaction) {
this.sockets.forEach(socket => this.sendPaymentTransaction(socket,
paymenttransaction));}
broadcastMetaDataTransaction(metaDataTransaction) {
this.sockets.forEach(socket => this.sendMetaDataTransaction(socket,
metaDataTransaction));}
broadcastCompTransaction(compTransaction) {
this.sockets.forEach(socket => this.sendCompTransaction(socket,
CompTransaction));}
broadcastIntegrationTransaction(integrationTransaction) {
this.sockets.forEach(socket => this.sendIntegrationTransaction(socket,
integrationTransaction));}
broadcastClearPaymentTransactions() {
this.sockets.forEach(socket => this.ClearedCoins(socket));}
broadcastClearMetadataTransactions() {
this.sockets.forEach(socket => this.ClearedMeta(socket));}
broadcastClearCompTransactions() {
this.sockets.forEach(socket => this.ClearedComp(socket));}
broadcastClearIntegrationTransactions() {
this.sockets.forEach(socket => this.ClearedIntegration(socket));}}
module.exports = P2pServer ;