front-end-controller 1.0.3 → 1.0.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +1 -1
- package/src/index.js +1 -2
package/package.json
CHANGED
package/src/index.js
CHANGED
@@ -16,5 +16,4 @@
|
|
16
16
|
* FOR ANY CLAIM, DAMAGES, OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT, OR
|
17
17
|
* OTHERWISE, ARISING FROM, OUT OF, OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
18
18
|
* DEALINGS IN THE SOFTWARE.
|
19
|
-
*
|
20
|
-
*/ const WebSocket=require("ws"),crypto=require("crypto");function arrayBufferToString(e){return Buffer.from(e).toString("utf-8")}class FrontEndController{constructor(){this.server=null,this.sockets=new Map}startServer(e=5764){this.server=new WebSocket.Server({port:e}),this.server.on("connection",e=>{let r;e.send(JSON.stringify({id:"HANDSHAKE-PROTOCAL"})),e.on("message",t=>{let o=JSON.parse(arrayBufferToString(t));o.handshake&&(this.sockets.set(o.id,{socket:e,key:o.key,id:o.id}),r=o.id)}),e.on("close",()=>this.sockets.delete(r))}),console.log("Server live on port:",e)}closeServer(){if(this.server)return this.server.close(),{closed:!0}}sendData(e,r){return new Promise((t,o)=>{if(!e||!r)return o({error:!0,context:"Missing fields"});let s=this.sockets.get(e);if(!s)return{error:!0,context:"Socket not found for client"};let n=Buffer.from(JSON.stringify(r)).toString("utf8"),i="";for(let c=0;c<n.length;c++)i+=n.charCodeAt(c).toString(2).padStart(8,"0");let a=i.split(""),d=crypto.randomBytes(64).toString("hex"),l={id:`DATA-${e}`,returnID:d,payload:a};s.socket.send(JSON.stringify(l),e=>{if(e)return o({error:!0,context:"Error sending data",details:e})}),s.socket.on("message",e=>{try{let r=JSON.parse(e),s=r.data||r;t(s)}catch(n){o({error:!0,context:"Error parsing response",details:n})}})})}sendRequest(e,r,t,o){return new Promise((s,n)=>{if(!e||!r||!t||!o)return n({error:!0,context:"Missing fields"});let i=this.sockets.get(e);if(!i)return n({error:!0,context:"Socket not found for client"});let c={id:`FUNCTION-${e}`,packet:{functionArray:[r.toUpperCase(),t.toUpperCase(),o]}},a=JSON.stringify(c);i.socket.send(a,e=>{if(e)return n({error:!0,context:"Error sending data",details:e})}),i.socket.on("message",e=>{try{let r=JSON.parse(e),t=r.data||r;s(t)}catch(o){n({error:!0,context:"Error parsing response",details:o})}})})}}module.exports={FrontEndController};
|
19
|
+
*/ let StorageManager=(()=>{let e=(e,r)=>({error:!0,internal:e,context:r}),r={setItem(r,t){try{return localStorage.setItem(r,JSON.stringify(t)),{error:!1}}catch(o){return e(!0,o.message)}},getItem(r){try{let t=localStorage.getItem(r);return t?JSON.parse(t):null}catch(o){return e(!0,o.message)}},removeItem(r){try{return localStorage.removeItem(r),{error:!1}}catch(t){return e(!0,t.message)}}},t={setItem(r,t){try{return sessionStorage.setItem(r,JSON.stringify(t)),{error:!1}}catch(o){return e(!0,o.message)}},getItem(r){try{let t=sessionStorage.getItem(r);return t?JSON.parse(t):null}catch(o){return e(!0,o.message)}},removeItem(r){try{return sessionStorage.removeItem(r),{error:!1}}catch(t){return e(!0,t.message)}}},o={setCookie(r,t,o){try{let n=o?`; expires=${new Date(Date.now()+864e5*o).toUTCString()}`:"";return document.cookie=`${r}=${encodeURIComponent(t)}${n}; path=/`,{error:!1}}catch(a){return e(!0,a.message)}},getCookie(r){try{let t=document.cookie.split("; ");for(let o of t){let[n,a]=o.split("=");if(n===r)return decodeURIComponent(a)}return null}catch(i){return e(!0,i.message)}},deleteCookie(r){try{return document.cookie=`${r}=; expires=Thu, 01 Jan 1970 00:00:00 GMT; path=/`,{error:!1}}catch(t){return e(!0,t.message)}}},n={async stk(r,t,o,n={},a=1){try{let i=await new Promise((o,n)=>{let i=indexedDB.open(r,a);i.onupgradeneeded=e=>{let r=e.target.result;r.objectStoreNames.contains(t)||r.createObjectStore(t,{keyPath:"id",autoIncrement:!0})},i.onsuccess=()=>o(i.result),i.onerror=r=>n(e(!0,`Failed to open IndexedDB: ${r.target.error.message}`))}),s=await new Promise((r,a)=>{let s=i.transaction(t,"readwrite"),l=s.objectStore(t),c;switch(o){case"add":c=l.add(n);break;case"get":c=l.get(n.id);break;case"getAll":c=l.getAll();break;case"update":c=l.put(n);break;case"delete":c=l.delete(n.id);break;default:a(e(!1,`Unsupported action: ${o}`));return}c.onsuccess=()=>r({error:!1,result:c.result}),c.onerror=r=>a(e(!0,`Action failed: ${r.target.error.message}`))});return i.close(),s}catch(l){return e(!0,l.message)}}};return{LocalStorage:r,SessionStorage:t,Cookies:o,IndexedDB:n}})();function randomCode(){let e=window.crypto.randomUUID();return e}function clearAllWebStorageAndCookies(){try{localStorage.clear()}catch(e){console.error("Error clearing localStorage:",e)}try{sessionStorage.clear()}catch(r){console.error("Error clearing sessionStorage:",r)}window.indexedDB&&indexedDB.databases().then(e=>{e.forEach(e=>{indexedDB.deleteDatabase(e.name)})}).catch(e=>{console.error("Error clearing IndexedDB:",e)}),document.cookie.split(";").forEach(e=>{let r=e.split("=")[0].trim();document.cookie=`${r}=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/`}),"caches"in window&&caches.keys().then(e=>Promise.all(e.map(e=>caches.delete(e)))).catch(e=>{console.error("Error clearing cache:",e)})}let Middleware=(e,r,t,o)=>{if(Array.isArray(o)){let n=o.filter(r=>"object"==typeof r&&r.functionName&&r.functionName===e);if(0!==n.length){if(n.length>1)return{error:!0,context:"Given client functions array contains elements that have the same function name. Number of duplicates: "+n.length};let a=n[0],i=a.clientFunction;return(console.log(typeof i),"function"!=typeof i)?{error:!0,context:"Given client function is not a function"}:i(e,r,t)}}if("CLEAR-STORAGE"===e)return clearAllWebStorageAndCookies(),{error:!1,taskComplete:!0};if("REDIRECT"===e){if(!t)return{error:!0,context:"Missing function parameters"};if(t.newTab){window.open(t.link,"_blank");return}window.location=link}if("ALERT"===e)return t?"string"!=typeof t.value?(alert(JSON.stringify(t.value)),{error:!1,taskComplete:!0}):(alert(t.value),{error:!1,taskComplete:!0}):{error:!0,context:"Missing function parameters"};if("LOCAL-STORAGE"===e){if(!t||!r)return{error:!0,context:"Missing function type or parameters"};if("SET"===r){let s=StorageManager.LocalStorage.setItem(t.key,t.value);return s.error?s:{taskComplete:!0,error:!1}}if("GET"===r){let l=StorageManager.LocalStorage.getItem(t.key);return l.error?l:{taskComplete:!0,error:!1,value:l}}if("DELETE"===r){let c=StorageManager.LocalStorage.removeItem(t.key);return c.error?c:{taskComplete:!0,error:!1}}return{error:!0,context:"Given function type for LOCAL-STORAGE did not match any types available"}}if("SESSION-STORAGE"===e){if(!t||!r)return{error:!0,context:"Missing function type or parameters"};if("SET"===r){let u=StorageManager.SessionStorage.setItem(t.key,t.value);return u.error?u:{taskComplete:!0,error:!1}}if("GET"===r){let g=StorageManager.SessionStorage.getItem(t.key);return g.error?g:{taskComplete:!0,error:!1,value:g}}if("DELETE"===r){let d=StorageManager.SessionStorage.removeItem(t.key);return d.error?d:{taskComplete:!0,error:!1}}return{error:!0,context:"Given function type for SESSION-STORAGE did not match any types available"}}if("CLIENT-COOKIE"===e){if(!t||!r)return{error:!0,context:"Missing function type or parameters"};if("SET"===r){let{key:m,value:f,days:h}=t,p=StorageManager.Cookies.setCookie(m,f,h);return p.error?p:{taskComplete:!0,error:!1}}if("GET"===r){let y=StorageManager.Cookies.getCookie(t.key);return y.error?y:{taskComplete:!0,error:!1,value:y}}if("DELETE"===r){let $=StorageManager.Cookies.deleteCookie(t.key);return $.error?$:{taskComplete:!0,error:!1}}return{error:!0,context:"Given function type for CLIENT-COOKIE did not match any types available"}}if("INDEXED-DB"===e){if(!t||!r)return{error:!0,context:"Missing function type or parameters"};let{dbName:E,storeName:k,payload:C,version:S}=t;return StorageManager.IndexedDB.stk(E,k,r,C,S).then(e=>e.error?e:{taskComplete:!0,error:!1,result:e.result}).catch(e=>e)}return{error:!0,context:"Given function name did not match up with any available function"}};class FrontEnd{static instance=null;static CODE=null;static ClientFunctions=[];#a;constructor(e){if(FrontEnd.instance)throw Error("Only one instance of FrontEnd can be created.");FrontEnd.instance=this,this.CODE=randomCode(),this.disabled=!1,this.ClientFunctions=e,this.#a=[],this.dataFromServer=null}listenForData(e){"function"==typeof e?(this.#a.push(e),e(this.dataFromServer)):console.error("The callback provided is not a function")}#b(){this.#a.forEach(e=>e(this.dataFromServer))}createSocket(e="https://localhost:5764"){if(this.disabled)return;let r=e.startsWith("https://")?e.replace("https","wss"):e,t=new WebSocket(r);t.onmessage=async e=>{try{let r=JSON.parse(e.data);if(r.id===`FUNCTION-${this.CODE}`){let{packet:o}=r,[n,a,i]=o.functionArray,s=Middleware(n,a,i,this.ClientFunctions);t.send(JSON.stringify({type:`RESPONSE-${this.CODE}`,error:s.error||!1,...s}))}if("HANDSHAKE-PROTOCAL"===r.id){let l=await crypto.subtle.generateKey({name:"AES-GCM",length:256},!0,["encrypt","decrypt"]),c=await crypto.subtle.exportKey("raw",l),u=btoa(String.fromCharCode(...new Uint8Array(c)));t.send(JSON.stringify({handshake:!0,id:this.CODE,key:u}))}if(r.id===`DATA-${this.CODE}`){let g=r.payload;console.log(r);let d=g.join(""),m="";for(let f=0;f<d.length;f+=8){let h=d.slice(f,f+8);m+=String.fromCharCode(parseInt(h,2))}let p=JSON.parse(m);this.dataFromServer=p,this.#b(),t.send(JSON.stringify({taskComplete:!0,error:!1}))}}catch(y){console.error("Message handling error:",y.message)}},t.onerror=e=>{console.error("WebSocket Error:",e)},window.addEventListener("beforeunload",()=>{t.close()})}disable(e){this.disabled=e}state(){return this.disabled}}export{FrontEnd};
|