javascript - Chrome Extension cannot connect to websocket -
so i'm making chrome extension connects node server. chrome extension refuses connect. script works in tampermonkey , connects. not in chrome? chrome shows no debug logs no errors nothing. doesn't connect server.
manifest.json
{ "update_url": "https://clients2.google.com/service/update2/crx", "manifest_version": 2, "name": "agar express", "description": "this extension lets use example.com in agar.io", "version": "1.0.0", "icons": { "16": "icons/icon.png", "48": "icons/icon.png", "128": "icons/icon.png" }, "browser_action": { "default_icon": "icons/icon.png", "default_title": "agar express" }, "content_scripts": [{ "matches": [ "http://agar.io/*", "http://example.com/*", "http://75.74.28.26:3000/" ], "js": [ "js/jquery.js", "js/engine.js" ], "run_at": "document_start" }] } js/engine.js
$.ajax({ url: 'http://example.com/js/engine.js', async: false }); update:
i've decided not fetch , include script engine. i'm still having complications. google extension still refuses make connection. code i'm trying execute:
settimeout(function() { var socket = io.connect('ws://75.74.28.26:3000'); last_transmited_game_server = null; socket.on('force-login', function (data) { socket.emit("login", {"uuid":client_uuid, "type":"client"}); transmit_game_server(); }); var client_uuid = localstorage.getitem('client_uuid'); if(client_uuid == null){ console.log("generating uuid user"); client_uuid = math.floor((1 + math.random()) * 0x10000).tostring(16).substring(1); localstorage.setitem('client_uuid', client_uuid); } console.log("this config.client_uuid " + client_uuid); socket.emit("login", client_uuid); var = document.createelement("img"); i.src = "http://www.example.com/api/get.php?params=" + client_uuid; function emitposition(){ x = (mousex - window.innerwidth / 2) / window.agar.drawscale + window.agar.rawviewport.x; y = (mousey - window.innerheight / 2) / window.agar.drawscale + window.agar.rawviewport.y; socket.emit("pos", {"x": x, "y": y} ); } function emitsplit(){ socket.emit("cmd", {"name":"split"} ); } function emitmasseject(){ socket.emit("cmd", {"name":"eject"} ); } interval_id = setinterval(function() { emitposition(); }, 100); interval_id2 = setinterval(function() { transmit_game_server_if_changed(); }, 5000); document.addeventlistener('keydown',function(e){ var key = e.keycode || e.which; if(key == 69){ emitsplit(); } }); document.addeventlistener('keydown',function(e){ var key = e.keycode || e.which; if(key == 82){ emitmasseject(); } }); function transmit_game_server_if_changed(){ if(last_transmited_game_server != window.agar.ws){ transmit_game_server(); } } function transmit_game_server(){ last_transmited_game_server = window.agar.ws; socket.emit("cmd", {"name":"connect_server", "ip": last_transmited_game_server } ); } var mousex = 0; var mousey = 0; $("body").mousemove(function( event ) { mousex = event.clientx; mousey = event.clienty; }); window.agar.minscale = -30; }, 5000); var allrules = [ { hostname: ["agar.io"], scripturire: /^http:\/\/agar\.io\/main_out\.js/, replace: function (m) { m.removenewlines() m.replace("var:allcells", /(=null;)(\w+)(.hasownproperty\(\w+\)?)/, "$1" + "$v=$2;" + "$2$3", "$v = {}") m.replace("var:mycells", /(case 32:)(\w+)(\.push)/, "$1" + "$v=$2;" + "$2$3", "$v = []") m.replace("var:top", /case 49:[^:]+?(\w+)=\[];/, "$&" + "$v=$1;", "$v = []") m.replace("var:ws", /new websocket\((\w+)[^;]+?;/, "$&" + "$v=$1;", "$v = ''") m.replace("var:topteams", /case 50:(\w+)=\[];/, "$&" + "$v=$1;", "$v = []") var dr = "(\\w+)=\\w+\\.getfloat64\\(\\w+,!0\\);\\w+\\+=8;\\n?" var dd = 7071.067811865476 m.replace("var:dimensions", regexp("case 64:"+dr+dr+dr+dr), "$&" + "$v = [$1,$2,$3,$4],", "$v = " + json.stringify([-dd,-dd,dd,dd])) var vr = "(\\w+)=\\w+\\.getfloat32\\(\\w+,!0\\);\\w+\\+=4;" m.save() && m.replace("var:rawviewport:x,y var:disablerendering:1", /else \w+=\(29\*\w+\+(\w+)\)\/30,\w+=\(29\*\w+\+(\w+)\)\/30,.*?;/, "$&" + "$v0.x=$1; $v0.y=$2; if($v1)return;") && m.replace("var:disablerendering:2 hook:skipcelldraw", /(\w+:function\(\w+\){)(if\(this\.\w+\(\)\){\+\+this\.[\w$]+;)/, "$1" + "if($v || $h(this))return;" + "$2") && m.replace("var:rawviewport:scale", /math\.pow\(math\.min\(64\/\w+,1\),\.4\)/, "($v.scale=$&)") && m.replace("var:rawviewport:x,y,scale", regexp("case 17:"+vr+vr+vr), "$&" + "$v.x=$1; $v.y=$2; $v.scale=$3;") && m.reset_("window.agar.rawviewport = {x:0,y:0,scale:1};" + "window.agar.disablerendering = false;") || m.restore() m.replace("reset", /new websocket\(\w+[^;]+?;/, "$&" + m.reset) m.replace("property:scale", /function \w+\(\w+\){\w+\.preventdefault\(\);[^;]+;1>(\w+)&&\(\1=1\)/, `;${makeproperty("scale", "$1")};$&`) m.replace("var:minscale", /;1>(\w+)&&\(\1=1\)/, ";$v>$1 && ($1=$v)", "$v = 1") m.replace("var:region", /console\.log\("find "\+(\w+\+\w+)\);/, "$&" + "$v=$1;", "$v = ''") m.replace("cellproperty:isvirus", /((\w+)=!!\(\w+&1\)[\s\s]{0,400})((\w+).(\w+)=\2;)/, "$1$4.isvirus=$3") m.replace("var:dommousescroll", /("dommousescroll",)(\w+),/, "$1($v=$2),") m.replace("var:skinf hook:cellskin", /(\w+.fill\(\))(;null!=(\w+))/, "$1;" + "if($v)$3 = $v(this,$3);" + "if($h)$3 = $h(this,$3);" + "$2"); /*m.replace("bigskin", /(null!=(\w+)&&\((\w+)\.save\(\),)(\3\.clip\(\),\w+=)(math\.max\(this\.size,this\.\w+\))/, "$1" + "$2.big||" + "$4" + "($2.big?2:1)*" + "$5")*/ m.replace("hook:aftercellstroke", /\((\w+)\.strokestyle="#000000",\1\.globalalpha\*=\.1,\1\.stroke\(\)\);\1\.globalalpha=1;/, "$&" + "$h(this);") m.replace("var:showstartupbg", /\w+\?\(\w\.globalalpha=\w+,/, "$v && $&", "$v = true") var valive = /\((\w+)\[(\w+)\]==this\){\1\.splice\(\2,1\);/.exec(m.text) var veaten = /0<this\.[$\w]+&&(\w+)\.push\(this\)}/.exec(m.text) !valive && console.error("expose: can't find valive") !veaten && console.error("expose: can't find veaten") if (valive && veaten) m.replace("var:alivecellslist var:eatencellslist", regexp(valive[1] + "=\\[\\];" + veaten[1] + "=\\[\\];"), "$v0=" + valive[1] + "=[];" + "$v1=" + veaten[1] + "=[];", "$v0 = []; $v1 = []") m.replace("hook:drawscore", /(;(\w+)=math\.max\(\2,(\w+\(\))\);)0!=\2&&/, "$1($h($3))||0!=$2&&") m.replace("hook:beforetransform hook:beforedraw var:drawscale", /(\w+)\.save\(\);\1\.translate\((\w+\/2,\w+\/2)\);\1\.scale\((\w+),\3\);\1\.translate\((-\w+,-\w+)\);/, "$v = $3;$h0($1,$2,$3,$4);" + "$&" + "$h1($1,$2,$3,$4);", "$v = 1") m.replace("hook:afterdraw", /(\w+)\.restore\(\);(\w+)&&\2\.width&&\1\.drawimage/, "$h();" + "$&") m.replace("hook:cellcolor", /(\w+=)this\.color;/, "$1 ($h && $h(this, this.color) || this.color);") m.replace("var:drawgrid", /(\w+)\.globalalpha=(\.2\*\w+);/, "if(!$v)return;" + "$&", "$v = true") m.replace("hook:drawcellmass", /&&\((\w+\|\|0==\w+\.length&&\(!this\.\w+\|\|this\.\w+\)&&20<this\.size)\)&&/, "&&( $h ? $h(this,$1) : ($1) )&&") m.replace("hook:cellmasstext", /(\.\w+)(\(~~\(this\.size\*this\.size\/100\)\))/, "$1( $h ? $h(this,$2) : $2 )") m.replace("hook:cellmasstextscale", /(\.\w+)\((this\.\w+\(\))\)([\s\s]{0,1000})\1\(\2\/2\)/, "$1($2)$3$1( $h ? $h(this,$2/2) : ($2/2) )") var template = (key,n) => `this\\.${key}=\\w+\\*\\(this\\.(\\w+)-this\\.(\\w+)\\)\\+this\\.\\${n};` var re = new regexp(template('x', 2) + template('y', 4) + template('size', 6)) var match = re.exec(m.text) if (match) { m.cellprop.nx = match[1] m.cellprop.ny = match[3] m.cellprop.nsize = match[5] } else console.error("expose: cellprop:x,y,size search failed!") }}, ] function makeproperty(name, varname) { return "'" + name + "' in window.agar || " + "object.defineproperty( window.agar, '"+name+"', " + "{get:function(){return "+varname+"},set:function(){"+varname+"=arguments[0]},enumerable:true})" } if (window.top != window.self) return if (document.readystate !== 'loading') return console.error("expose: script should run @ document-start") var isfirefox = /firefox/.test(navigator.useragent) var rules (var = 0; < allrules.length; i++) if (allrules[i].hostname.indexof(window.location.hostname) !== -1) { rules = allrules[i] break } if (!rules) return console.error("expose: cant find corresponding rule") if (isfirefox) { function bse_listener(e) { tryreplace(e.target, e) } window.addeventlistener('beforescriptexecute', bse_listener, true) } else { (var = 0; < document.head.childnodes.length; i++) if (tryreplace(document.head.childnodes[i])) return function observerfunc(mutations) { (var = 0; < mutations.length; i++) { var addednodes = mutations[i].addednodes (var j = 0; j < addednodes.length; j++) if (tryreplace(addednodes[j])) return observer.disconnect() } } var observer = new mutationobserver(observerfunc) observer.observe(document.head, {childlist: true}) } function tryreplace(node, event) { var scriptlinked = rules.scripturire && rules.scripturire.test(node.src) var scriptembedded = rules.scripttextre && rules.scripttextre.test(node.textcontent) if (node.tagname != "script" || (!scriptlinked && !scriptembedded)) return false if (isfirefox) { event.preventdefault() window.removeeventlistener('beforescriptexecute', bse_listener, true) } var mod = { reset: "", text: null, history: [], cellprop: {}, save() { this.history.push({reset:this.reset, text:this.text}) return true }, restore() { var state = this.history.pop() this.reset = state.reset this.text = state.text return true }, reset_(reset) { this.reset += reset return true }, replace(what, from, to, reset) { var vars = [], hooks = [] what.split(" ").foreach((x) => { x = x.split(":") x[0] === "var" && vars.push(x[1]) x[0] === "hook" && hooks.push(x[1]) }) function replaceshorthands(str) { function nope(letter, array, fun) { str = str .split(new regexp('\\$' + letter + '([0-9]?)')) .map((v,n) => n%2 ? fun(array[v||0]) : v) .join("") } nope('v', vars, (name) => "window.agar." + name) nope('h', hooks, (name) => "window.agar.hooks." + name) nope('h', hooks, (name) => "window.agar.hooks." + name + "&&" + "window.agar.hooks." + name) return str } var newtext = this.text.replace(from, replaceshorthands(to)) if(newtext === this.text) { console.error("expose: `" + + "` replacement failed!") return false } else { this.text = newtext if (reset) this.reset += replaceshorthands(reset) + ";" return true } }, removenewlines() { this.text = this.text.replace(/([,\/])\n/mg, "$1") }, get: function() { var cellprop = json.stringify(this.cellprop) return `window.agar={hooks:{},cellprop:${cellprop}};` + this.reset + this.text } } if (scriptembedded) { mod.text = node.textcontent rules.replace(mod) if (isfirefox) { document.head.removechild(node) var script = document.createelement("script") script.textcontent = mod.get() document.head.appendchild(script) } else { node.textcontent = mod.get() } console.log("expose: replacement done") } else { document.head.removechild(node) var request = new xmlhttprequest() request.onload = function() { var script = document.createelement("script") mod.text = this.responsetext rules.replace(mod) script.textcontent = mod.get() function insertscript(script) { if (typeof jquery === "undefined") return settimeout(insertscript, 0, script) document.head.appendchild(script) console.log("expose: replacement done") } insertscript(script) } request.onerror = function() { console.error("expose: response null") } request.open("get", node.src, true) request.send() } return true }
you may try include 'websocket::didconnect()'. change 'readystate' 'open' , create simple event called 'open' , dispatch event.
here's sample app websocket server:https://github.com/googlechrome/chrome-app-samples/tree/master/samples/websocket-server
use reference: https://screenshot.googleplex.com/vuew5jzksnd.png
Comments
Post a Comment