@automata-network/pom-socket
Advanced tools
Comparing version 0.0.11 to 0.0.12
@@ -1,2 +0,2 @@ | ||
"use strict";var e,t=require("socket.io-client"),s=require("./encryption.js"),n=require("ecdh");exports.SocketStatus=void 0,(e=exports.SocketStatus||(exports.SocketStatus={}))[e.Disconnected=1]="Disconnected",e[e.Connecting=2]="Connecting",e[e.Connected=3]="Connected";const c=new Error("shared secret is not exist"),o=new Error("socket is not connected"),i=new Error("socket connect to server failed"),r=new Error("session is expired"),a=new Error("message salt is missing"),h=new Error("message type is unknown");var d;!function(e){e.KeyExchange="key-exchange",e.EncryptedMessage="encrypted-message"}(d||(d={}));class u{aesKey;manualReconnectionCount=0;connectedEventReceived=!1;connectedEventListener;keyExchangeEventListener;listeners={};ecdh;socket;constructor(e,n){this.ecdh=s.generateECDHKeys(),this.socket=t.io(e,{...n||{},autoConnect:!1,reconnection:!0,reconnectionAttempts:60,reconnectionDelay:5e3})}getSocketStatus(){return this.socket.connected&&this.aesKey&&this.connectedEventReceived?exports.SocketStatus.Connected:this.socket.disconnected?exports.SocketStatus.Disconnected:exports.SocketStatus.Connecting}connect(){let e,t;const n="object"==typeof this.socket.auth&&!!this.socket.auth.sessionID,c=s.createRandomString(32),o=e=>{try{const t=k({message:e});t.type===d.KeyExchange&&(this.generateAESKey(t.data,c),this.socket.off("data",o),this.keyExchangeEventListener&&this.keyExchangeEventListener.resolve())}catch(e){this.keyExchangeEventListener&&this.keyExchangeEventListener.reject(e),this.socket.off("data",o)}},i=()=>{this.connectedEventReceived=!0,this.connectedEventListener&&(this.connectedEventListener.resolve(),this.connectedEventListener=void 0),this.socket.off("connected",i)};return new Promise(((s,a)=>{const h=()=>{n?E({dhSharedPublicNumber:this.ecdh.publicKey.buffer.toString("hex"),sessionId:this.socket.auth.sessionID,hkdfSalt:c}):e?E({dhSharedPublicNumber:this.ecdh?.publicKey.buffer.toString("hex"),sessionId:e,hkdfSalt:c}):t=!0,this.socket.off("connect",h)},d=s=>{t?E({dhSharedPublicNumber:this.ecdh.publicKey.buffer.toString("hex"),sessionId:s,hkdfSalt:c}):e=s,this.socket.off("setupSession",d)},u=e=>{"io server disconnect"===e?k(r):this.manualReconnectionCount<3?(this.manualReconnectionCount+=1,this.connect().then((e=>{E(e)})).catch((e=>{k(e)}))):(this.manualReconnectionCount=0,k(new Error(e))),this.socket.off("disconnect",d)},f=e=>{"invalid session or expired!"===e.message?k(r):k(e),this.socket.off("connect_error",f)},k=e=>{this.socket.off("connect",h),this.socket.off("setupSession",d),this.socket.off("disconnect",u),this.socket.off("connect_error",f),a(e)},E=e=>{this.socket.off("connect",h),this.socket.off("setupSession",d),this.socket.off("disconnect",u),this.socket.off("connect_error",f),s(e)};this.socket.on("connect",h),this.socket.on("disconnect",u),this.socket.on("connect_error",f),n||this.socket.on("setupSession",d),this.socket.on("connected",i),this.socket.on("data",o),this.socket.connect()}))}generateAESKey(e,t){const c=n.PublicKey.fromBuffer(s.defaultCurve,Buffer.from(e,"hex")),o=this.ecdh.privateKey.deriveSharedSecret(c);this.aesKey=s.generateAESKey(new Uint8Array(o),t)}async waitForConnectedEvent(){return this.connectedEventReceived?Promise.resolve():new Promise(((e,t)=>{this.connectedEventListener={resolve:e,reject:t}}))}async waitForKeyExchangeEvent(){return this.aesKey?Promise.resolve():new Promise(((e,t)=>{this.keyExchangeEventListener={resolve:e,reject:t}}))}emitSharedPublicKey(){const e=E({type:d.KeyExchange,data:this.ecdh.publicKey.buffer.toString("hex")});this.socket.emit("data",e)}disconnect(){this.connectedEventReceived=!1,this.aesKey=void 0,this.ecdh=s.generateECDHKeys(),this.socket.disconnect()}onDisconnect(e){const t=t=>{"io client disconnect"===t||"io server disconnect"===t?e():(this.socket.once("connect",(()=>{s.countdownTimer&&clearTimeout(s.countdownTimer)})),s.countdownTimer=setTimeout((()=>{e()}),3e5))},s={handler:t,cb:e,countdownTimer:void 0};this.listeners.disconnect=this.listeners.disconnect||[],this.listeners.disconnect.push(s),this.socket.on("disconnect",t)}offDisconnect(e){const t=this.listeners.disconnect;if(!t||0===t.length)return;const s=t.findIndex((t=>t.cb===e));if(-1!==s){const e=t[s];this.socket.off("disconnect",e.handler),e.countdownTimer&&clearTimeout(e.countdownTimer),t.splice(s,1)}}on(e){const t=t=>{f({message:t,key:this.aesKey,cb:e})};this.listeners.data=this.listeners.data||[],this.listeners.data.push({handler:t,cb:e}),this.socket.on("data",t)}off(e){const t=this.listeners.data;if(!t||0===t.length)return;const s=t.findIndex((t=>t.cb===e));-1!==s&&(this.socket.off("data",t[s].handler),t.splice(s,1))}once(e){const t=t=>{f({message:t,key:this.aesKey,cb:e}),this.off(e)};this.listeners.data=this.listeners.data||[],this.listeners.data.push({handler:t,cb:e}),this.socket.on("data",t)}send(e){if(!this.aesKey)throw c;if(this.getSocketStatus()!==exports.SocketStatus.Connected)throw o;this.socket.emit("data",E({type:d.EncryptedMessage,data:e,key:this.aesKey}))}}function f(e){const{message:t,key:s,cb:n}=e;try{const e=k({message:t,key:s});n.success(e.data)}catch(e){n.error(e)}}function k(e){const{message:t,key:n}=e,o=JSON.parse(t),i=o.t;switch(i){case d.KeyExchange:return{type:i,data:o.d};case d.EncryptedMessage:if(!o.s)throw a;if(!n)throw c;return{type:i,data:s.decryptMessage(o.d,n,o.s).decryptedMessage};default:throw h}}function E(e){const{type:t,data:n,key:o}=e,i={t:t,d:n};switch(t){case d.KeyExchange:break;case d.EncryptedMessage:if(!o)throw c;const e=s.encryptMessage(n,o);i.d=e.encryptedMessage,i.s=e.iv;break;default:throw h}return JSON.stringify(i)}exports.createRandomString=s.createRandomString,exports.ERR_MESSAGE_SALT_IS_MISSING=a,exports.ERR_MESSAGE_TYPE_IS_UNKNOWN=h,exports.ERR_SESSION_IS_EXPIRED=r,exports.ERR_SHARED_SECRET_NOT_EXIST=c,exports.ERR_SOCKET_CONNECT_TO_SERVER_FAILED=i,exports.ERR_SOCKET_IS_NOT_CONNECTED=o,exports.POMSocket=u,exports.getSocket=function(e,t){return new u(e,t)}; | ||
"use strict";var e,t=require("socket.io-client"),s=require("./encryption.js"),n=require("ecdh");exports.SocketStatus=void 0,(e=exports.SocketStatus||(exports.SocketStatus={}))[e.Disconnected=1]="Disconnected",e[e.Connecting=2]="Connecting",e[e.Connected=3]="Connected";const c=new Error("shared secret is not exist"),o=new Error("socket is not connected"),i=new Error("socket connect to server failed"),r=new Error("session is expired"),a=new Error("message salt is missing"),h=new Error("message type is unknown");var d;!function(e){e.KeyExchange="key-exchange",e.EncryptedMessage="encrypted-message"}(d||(d={}));class u{aesKey;manualReconnectionCount=0;connectedEventReceived=!1;connectedEventListener;keyExchangeEventListener;listeners={};ecdh;socket;constructor(e,n){this.ecdh=s.generateECDHKeys(),this.socket=t.io(e,{...n||{},autoConnect:!1,reconnection:!0,reconnectionAttempts:60,reconnectionDelay:5e3})}getSocketStatus(){return this.socket.connected&&this.aesKey&&this.connectedEventReceived?exports.SocketStatus.Connected:this.socket.disconnected?exports.SocketStatus.Disconnected:exports.SocketStatus.Connecting}connect(){let e,t;const n="object"==typeof this.socket.auth&&!!this.socket.auth.sessionID,c=s.createRandomString(32),o=e=>{try{const t=k({message:e});t.type===d.KeyExchange&&(this.generateAESKey(t.data,c),this.socket.off("data",o),this.keyExchangeEventListener&&this.keyExchangeEventListener.resolve())}catch(e){this.keyExchangeEventListener&&this.keyExchangeEventListener.reject(e),this.socket.off("data",o)}},i=()=>{this.connectedEventReceived=!0,this.connectedEventListener&&(this.connectedEventListener.resolve(),this.connectedEventListener=void 0),this.socket.off("connected",i)};return new Promise(((s,a)=>{const h=()=>{n?E({dhSharedPublicNumber:this.ecdh.publicKey.buffer.toString("hex"),sessionId:this.socket.auth.sessionID,hkdfSalt:c}):e?E({dhSharedPublicNumber:this.ecdh?.publicKey.buffer.toString("hex"),sessionId:e,hkdfSalt:c}):t=!0,this.socket.off("connect",h)},d=s=>{t?E({dhSharedPublicNumber:this.ecdh.publicKey.buffer.toString("hex"),sessionId:s,hkdfSalt:c}):e=s,this.socket.off("setupSession",d)},u=e=>{"io server disconnect"===e?k(r):this.manualReconnectionCount<3?(this.manualReconnectionCount+=1,this.connect().then((e=>{E(e)})).catch((e=>{k(e)}))):(this.manualReconnectionCount=0,k(new Error(e))),this.socket.off("disconnect",d)},f=e=>{"invalid session or expired!"===e.message?k(r):k(e),this.socket.off("connect_error",f)},k=e=>{this.socket.off("connect",h),this.socket.off("setupSession",d),this.socket.off("disconnect",u),this.socket.off("connect_error",f),a(e)},E=e=>{this.socket.off("connect",h),this.socket.off("setupSession",d),this.socket.off("disconnect",u),this.socket.off("connect_error",f),s(e)};this.socket.on("connect",h),this.socket.on("disconnect",u),this.socket.on("connect_error",f),n||this.socket.on("setupSession",d),this.socket.on("connected",i),this.socket.on("data",o),this.socket.connect()}))}generateAESKey(e,t){console.log("sharedPublicNumber1",e);const c=n.PublicKey.fromBuffer(s.defaultCurve,Buffer.from(e,"hex"));console.log("sharedPublicNumber2",c);const o=this.ecdh.privateKey.deriveSharedSecret(c);console.log("sharedPublicNumber3",o),this.aesKey=s.generateAESKey(new Uint8Array(o),t),console.log("sharedPublicNumber4",this.aesKey)}async waitForConnectedEvent(){return this.connectedEventReceived?Promise.resolve():new Promise(((e,t)=>{this.connectedEventListener={resolve:e,reject:t}}))}async waitForKeyExchangeEvent(){return this.aesKey?Promise.resolve():new Promise(((e,t)=>{this.keyExchangeEventListener={resolve:e,reject:t}}))}emitSharedPublicKey(){const e=E({type:d.KeyExchange,data:this.ecdh.publicKey.buffer.toString("hex")});this.socket.emit("data",e)}disconnect(){this.connectedEventReceived=!1,this.aesKey=void 0,this.ecdh=s.generateECDHKeys(),this.socket.disconnect()}onDisconnect(e){const t=t=>{"io client disconnect"===t||"io server disconnect"===t?e():(this.socket.once("connect",(()=>{s.countdownTimer&&clearTimeout(s.countdownTimer)})),s.countdownTimer=setTimeout((()=>{e()}),3e5))},s={handler:t,cb:e,countdownTimer:void 0};this.listeners.disconnect=this.listeners.disconnect||[],this.listeners.disconnect.push(s),this.socket.on("disconnect",t)}offDisconnect(e){const t=this.listeners.disconnect;if(!t||0===t.length)return;const s=t.findIndex((t=>t.cb===e));if(-1!==s){const e=t[s];this.socket.off("disconnect",e.handler),e.countdownTimer&&clearTimeout(e.countdownTimer),t.splice(s,1)}}on(e){const t=t=>{f({message:t,key:this.aesKey,cb:e})};this.listeners.data=this.listeners.data||[],this.listeners.data.push({handler:t,cb:e}),this.socket.on("data",t)}off(e){const t=this.listeners.data;if(!t||0===t.length)return;const s=t.findIndex((t=>t.cb===e));-1!==s&&(this.socket.off("data",t[s].handler),t.splice(s,1))}once(e){const t=t=>{f({message:t,key:this.aesKey,cb:e}),this.off(e)};this.listeners.data=this.listeners.data||[],this.listeners.data.push({handler:t,cb:e}),this.socket.on("data",t)}send(e){if(!this.aesKey)throw c;if(this.getSocketStatus()!==exports.SocketStatus.Connected)throw o;this.socket.emit("data",E({type:d.EncryptedMessage,data:e,key:this.aesKey}))}}function f(e){const{message:t,key:s,cb:n}=e;try{const e=k({message:t,key:s});n.success(e.data)}catch(e){n.error(e)}}function k(e){const{message:t,key:n}=e,o=JSON.parse(t),i=o.t;switch(i){case d.KeyExchange:return{type:i,data:o.d};case d.EncryptedMessage:if(!o.s)throw a;if(!n)throw c;return{type:i,data:s.decryptMessage(o.d,n,o.s).decryptedMessage};default:throw h}}function E(e){const{type:t,data:n,key:o}=e,i={t:t,d:n};switch(t){case d.KeyExchange:break;case d.EncryptedMessage:if(!o)throw c;const e=s.encryptMessage(n,o);i.d=e.encryptedMessage,i.s=e.iv;break;default:throw h}return JSON.stringify(i)}exports.createRandomString=s.createRandomString,exports.ERR_MESSAGE_SALT_IS_MISSING=a,exports.ERR_MESSAGE_TYPE_IS_UNKNOWN=h,exports.ERR_SESSION_IS_EXPIRED=r,exports.ERR_SHARED_SECRET_NOT_EXIST=c,exports.ERR_SOCKET_CONNECT_TO_SERVER_FAILED=i,exports.ERR_SOCKET_IS_NOT_CONNECTED=o,exports.POMSocket=u,exports.getSocket=function(e,t){return new u(e,t)}; | ||
//# sourceMappingURL=index.js.map |
{ | ||
"name": "@automata-network/pom-socket", | ||
"version": "0.0.11", | ||
"version": "0.0.12", | ||
"description": "A socket clinet for automata's Proof Of Machinehood", | ||
@@ -5,0 +5,0 @@ "main": "dist/index.js", |
@@ -247,2 +247,3 @@ import {ManagerOptions, Socket, SocketOptions, io} from 'socket.io-client'; | ||
generateAESKey(sharedPublicNumber: string, hkdfSalt: string) { | ||
console.log('sharedPublicNumber1', sharedPublicNumber); | ||
const pubkey = ecdh.PublicKey.fromBuffer( | ||
@@ -252,5 +253,9 @@ defaultCurve, | ||
); | ||
console.log('sharedPublicNumber2', pubkey); | ||
const sharedSecret = this.ecdh.privateKey.deriveSharedSecret(pubkey); | ||
console.log('sharedPublicNumber3', sharedSecret); | ||
this.aesKey = generateAESKey(new Uint8Array(sharedSecret), hkdfSalt); | ||
console.log('sharedPublicNumber4', this.aesKey); | ||
} | ||
@@ -257,0 +262,0 @@ |
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
52679
631