debug-adapter-for-office-addins
Advanced tools
Comparing version 1.0.9 to 1.0.10
@@ -8,4 +8,2 @@ "use strict"; | ||
var edgeAdapter = require("../../lib/Addon.node"); | ||
// const binding_path = binary.find(path.resolve(path.join(__dirname,'../../../package.json'))); | ||
// var edgeAdapter = require(binding_path); | ||
var http = require("http"); | ||
@@ -15,2 +13,3 @@ var fs = require("fs"); | ||
var ws_1 = require("ws"); | ||
var defaults_1 = require("./../defaults"); | ||
var EdgeAdapter; | ||
@@ -30,16 +29,22 @@ (function (EdgeAdapter) { | ||
var _this = this; | ||
this._serverPort = serverPort; | ||
this._chromeToolsPort = chromeToolsPort; | ||
edgeAdapter.initialize(__dirname, function (id, msg) { return _this.onEdgeMessage(id, msg); }, function (msg) { return _this.onLogMessage(msg); }); | ||
edgeAdapter.setSecurityACLs(__dirname + "\\..\\..\\lib\\"); | ||
if (chromeToolsPort > 0) { | ||
edgeAdapter.serveChromeDevTools(chromeToolsPort); | ||
try { | ||
this._serverPort = serverPort; | ||
this._chromeToolsPort = chromeToolsPort; | ||
edgeAdapter.initialize(__dirname, function (id, msg) { return _this.onEdgeMessage(id, msg); }, function (msg) { return _this.onLogMessage(msg); }); | ||
edgeAdapter.setSecurityACLs(__dirname + "\\..\\..\\lib\\"); | ||
if (chromeToolsPort > 0) { | ||
edgeAdapter.serveChromeDevTools(chromeToolsPort); | ||
} | ||
if (url) { | ||
edgeAdapter.openEdge(url); | ||
} | ||
this._httpServer = http.createServer(function (req, res) { return _this.onServerRequest(req, res); }); | ||
this._webSocketServer = new ws_1.Server({ server: this._httpServer }); | ||
this._webSocketServer.on('connection', function (client, message) { return _this.onWSSConnection(client, message); }); | ||
this._httpServer.listen(serverPort, "0.0.0.0"); | ||
defaults_1.usageDataObject.sendUsageDataSuccessEvent("run"); | ||
} | ||
if (url) { | ||
edgeAdapter.openEdge(url); | ||
catch (err) { | ||
defaults_1.usageDataObject.sendUsageDataException("run", err); | ||
} | ||
this._httpServer = http.createServer(function (req, res) { return _this.onServerRequest(req, res); }); | ||
this._webSocketServer = new ws_1.Server({ server: this._httpServer }); | ||
this._webSocketServer.on('connection', function (client, message) { return _this.onWSSConnection(client, message); }); | ||
this._httpServer.listen(serverPort, "0.0.0.0"); | ||
}; | ||
@@ -106,19 +111,24 @@ Service.prototype.onServerRequest = function (request, response) { | ||
var _this = this; | ||
var initialChromeTabs = this.getEdgeJson(host); | ||
var retries = 200; // Retry for 30 seconds. | ||
if (edgeAdapter.openEdge(param)) { | ||
var getNewTab_1 = function () { | ||
var actualChromeTabs = _this.getEdgeJson(host); | ||
var newTabInfo = _this.getNewTabInfo(initialChromeTabs, actualChromeTabs, param); | ||
if (!newTabInfo && retries > 0) { | ||
retries--; | ||
return setTimeout(getNewTab_1, 150); | ||
} | ||
response.write(JSON.stringify(newTabInfo)); | ||
try { | ||
var initialChromeTabs_1 = this.getEdgeJson(host); | ||
var retries_1 = 200; // Retry for 30 seconds. | ||
if (edgeAdapter.openEdge(param)) { | ||
var getNewTab_1 = function () { | ||
var actualChromeTabs = _this.getEdgeJson(host); | ||
var newTabInfo = _this.getNewTabInfo(initialChromeTabs_1, actualChromeTabs, param); | ||
if (!newTabInfo && retries_1 > 0) { | ||
retries_1--; | ||
return setTimeout(getNewTab_1, 150); | ||
} | ||
response.write(JSON.stringify(newTabInfo)); | ||
response.end(); | ||
}; | ||
return getNewTab_1(); | ||
} | ||
else { | ||
response.end(); | ||
}; | ||
return getNewTab_1(); | ||
} | ||
} | ||
else { | ||
response.end(); | ||
catch (err) { | ||
defaults_1.usageDataObject.sendUsageDataException("createNewTab", err); | ||
} | ||
@@ -142,89 +152,96 @@ }; | ||
var _this = this; | ||
// Normalize request url | ||
if (!message) { | ||
return; | ||
} | ||
var url = message.url.trim().toUpperCase(); | ||
if (url.lastIndexOf('/') == url.length - 1) { | ||
url = url.substr(0, url.length - 1); | ||
} | ||
var guid = url; | ||
var index = guid.lastIndexOf('/'); | ||
if (index != -1) { | ||
guid = guid.substr(index + 1); | ||
} | ||
var succeeded = false; | ||
var instanceId = null; | ||
var networkInstanceId = null; | ||
if (this._guidToIdMap.has(guid)) { | ||
var id = this._guidToIdMap.get(guid); | ||
instanceId = this._idToEdgeMap.get(id); | ||
if (!instanceId) { | ||
// New connection | ||
instanceId = edgeAdapter.connectTo(id); | ||
if (instanceId) { | ||
this.injectAdapterFiles(instanceId); | ||
this._idToEdgeMap.set(id, instanceId); | ||
this._edgeToWSMap.set(instanceId, [ws]); | ||
succeeded = true; | ||
} | ||
try { | ||
// Normalize request url | ||
if (!message) { | ||
return; | ||
} | ||
else { | ||
// Already connected | ||
var sockets = this._edgeToWSMap.get(instanceId); | ||
sockets.push(ws); | ||
this._edgeToWSMap.set(instanceId, sockets); | ||
succeeded = true; | ||
var url = message.url.trim().toUpperCase(); | ||
if (url.lastIndexOf('/') == url.length - 1) { | ||
url = url.substr(0, url.length - 1); | ||
} | ||
networkInstanceId = this._idToNetWorkProxyMap.get(id); | ||
if (!networkInstanceId) { | ||
networkInstanceId = edgeAdapter.createNetworkProxyFor(id); | ||
if (networkInstanceId) { | ||
this._idToNetWorkProxyMap.set(id, networkInstanceId); | ||
this._idToNetWorkProxyMap.set(networkInstanceId, id); | ||
} | ||
var guid = url; | ||
var index = guid.lastIndexOf('/'); | ||
if (index != -1) { | ||
guid = guid.substr(index + 1); | ||
} | ||
} | ||
if (succeeded && networkInstanceId) { | ||
// Forward messages to the proxy | ||
ws.on('message', function (msg) { | ||
if (typeof msg === "string" && msg.search("Debugger.setBreakpointByUrl") !== -1) { | ||
var obj = JSON.parse(msg); | ||
var urlCheck = obj["params"]["url"]; | ||
var urlRegex = obj["params"]["urlRegex"]; | ||
if (!urlCheck && urlRegex) { | ||
obj["params"]["url"] = _this.convertUrlRegex(obj["params"]["urlRegex"]); | ||
delete obj["params"]["urlRegex"]; | ||
msg = JSON.stringify(obj); | ||
var succeeded = false; | ||
var instanceId_1 = null; | ||
var networkInstanceId_1 = null; | ||
if (this._guidToIdMap.has(guid)) { | ||
var id = this._guidToIdMap.get(guid); | ||
instanceId_1 = this._idToEdgeMap.get(id); | ||
if (!instanceId_1) { | ||
// New connection | ||
instanceId_1 = edgeAdapter.connectTo(id); | ||
if (instanceId_1) { | ||
this.injectAdapterFiles(instanceId_1); | ||
this._idToEdgeMap.set(id, instanceId_1); | ||
this._edgeToWSMap.set(instanceId_1, [ws]); | ||
succeeded = true; | ||
} | ||
} | ||
if (_this._diagLogging) { | ||
console.log("Client:", instanceId, msg); | ||
} | ||
if (_this.isMessageForNetworkProxy(msg)) { | ||
edgeAdapter.forwardTo(networkInstanceId.toString(), msg.toString()); | ||
} | ||
else { | ||
edgeAdapter.forwardTo(instanceId.toString(), msg.toString()); | ||
// Already connected | ||
var sockets = this._edgeToWSMap.get(instanceId_1); | ||
sockets.push(ws); | ||
this._edgeToWSMap.set(instanceId_1, sockets); | ||
succeeded = true; | ||
} | ||
}); | ||
var removeSocket_1 = function (instanceId) { | ||
var sockets = _this._edgeToWSMap.get(instanceId); | ||
var index = sockets.indexOf(ws); | ||
if (index > -1) { | ||
sockets.splice(index, 1); | ||
networkInstanceId_1 = this._idToNetWorkProxyMap.get(id); | ||
if (!networkInstanceId_1) { | ||
networkInstanceId_1 = edgeAdapter.createNetworkProxyFor(id); | ||
if (networkInstanceId_1) { | ||
this._idToNetWorkProxyMap.set(id, networkInstanceId_1); | ||
this._idToNetWorkProxyMap.set(networkInstanceId_1, id); | ||
} | ||
} | ||
_this._edgeToWSMap.set(instanceId, sockets); | ||
}; | ||
// Remove socket on close or error | ||
ws.on('close', function () { | ||
removeSocket_1(instanceId); | ||
}); | ||
ws.on('error', function () { | ||
removeSocket_1(instanceId); | ||
}); | ||
} | ||
if (succeeded && networkInstanceId_1) { | ||
// Forward messages to the proxy | ||
ws.on('message', function (msg) { | ||
if (typeof msg === "string" && msg.search("Debugger.setBreakpointByUrl") !== -1) { | ||
var obj = JSON.parse(msg); | ||
var urlCheck = obj["params"]["url"]; | ||
var urlRegex = obj["params"]["urlRegex"]; | ||
if (!urlCheck && urlRegex) { | ||
obj["params"]["url"] = _this.convertUrlRegex(obj["params"]["urlRegex"]); | ||
delete obj["params"]["urlRegex"]; | ||
msg = JSON.stringify(obj); | ||
} | ||
} | ||
if (_this._diagLogging) { | ||
console.log("Client:", instanceId_1, msg); | ||
} | ||
if (_this.isMessageForNetworkProxy(msg)) { | ||
edgeAdapter.forwardTo(networkInstanceId_1.toString(), msg.toString()); | ||
} | ||
else { | ||
edgeAdapter.forwardTo(instanceId_1.toString(), msg.toString()); | ||
} | ||
}); | ||
var removeSocket_1 = function (instanceId) { | ||
var sockets = _this._edgeToWSMap.get(instanceId); | ||
var index = sockets.indexOf(ws); | ||
if (index > -1) { | ||
sockets.splice(index, 1); | ||
} | ||
_this._edgeToWSMap.set(instanceId, sockets); | ||
}; | ||
// Remove socket on close or error | ||
ws.on('close', function () { | ||
removeSocket_1(instanceId_1); | ||
}); | ||
ws.on('error', function () { | ||
removeSocket_1(instanceId_1); | ||
}); | ||
defaults_1.usageDataObject.sendUsageDataSuccessEvent("onWSSConnection"); | ||
} | ||
else { | ||
// No matching Edge instance | ||
defaults_1.usageDataObject.sendUsageDataEvent({ "onWSSConnection": "No matching Edge Instances found" }); | ||
ws.close(); | ||
} | ||
} | ||
else { | ||
// No matching Edge instance | ||
ws.close(); | ||
catch (err) { | ||
defaults_1.usageDataObject.sendUsageDataException("onWSSConnection", err); | ||
} | ||
@@ -290,42 +307,52 @@ }; | ||
]; | ||
for (var i = 0; i < files.length; i++) { | ||
var script = fs.readFileSync(__dirname + '/../chromeProtocol/' + files[i].filename, 'utf8'); | ||
this.log("Injecting '" + files[i].engine + ":" + files[i].filename + "'"); | ||
edgeAdapter.injectScriptTo(instanceId, files[i].engine, files[i].filename, script); | ||
try { | ||
for (var i = 0; i < files.length; i++) { | ||
var script = fs.readFileSync(__dirname + '/../chromeProtocol/' + files[i].filename, 'utf8'); | ||
this.log("Injecting '" + files[i].engine + ":" + files[i].filename + "'"); | ||
edgeAdapter.injectScriptTo(instanceId, files[i].engine, files[i].filename, script); | ||
} | ||
} | ||
catch (err) { | ||
defaults_1.usageDataObject.sendUsageDataException("injectAdapterFiles", err); | ||
} | ||
}; | ||
Service.prototype.getEdgeJson = function (host) { | ||
var chromeInstances = []; | ||
var map = new Map(); | ||
var instances = edgeAdapter.getEdgeInstances(); | ||
if (this._diagLogging) { | ||
console.log("Edge Instances:", instances); | ||
} | ||
for (var i = 0; i < instances.length; i++) { | ||
// Get or generate a new guid | ||
var guid = null; | ||
if (!this._guidToIdMap.has(instances[i].id)) { | ||
guid = this.createGuid(); | ||
try { | ||
var chromeInstances = []; | ||
var map = new Map(); | ||
var instances = edgeAdapter.getEdgeInstances(); | ||
if (this._diagLogging) { | ||
console.log("Edge Instances:", instances); | ||
} | ||
else { | ||
guid = this._guidToIdMap.get(instances[i].id); | ||
for (var i = 0; i < instances.length; i++) { | ||
// Get or generate a new guid | ||
var guid = null; | ||
if (!this._guidToIdMap.has(instances[i].id)) { | ||
guid = this.createGuid(); | ||
} | ||
else { | ||
guid = this._guidToIdMap.get(instances[i].id); | ||
} | ||
map.set(guid, instances[i].id); | ||
map.set(instances[i].id, guid); | ||
var websocket = "ws://" + host + "/devtools/page/" + guid; | ||
var devtools = "chrome-devtools://devtools/bundled/inspector.html?ws=" + websocket.substr(5); | ||
// Generate the json description of this instance | ||
chromeInstances.push({ | ||
description: instances[i].processName, | ||
devtoolsFrontendUrl: devtools, | ||
id: guid, | ||
title: instances[i].title, | ||
type: "page", | ||
url: instances[i].url, | ||
webSocketDebuggerUrl: websocket | ||
}); | ||
} | ||
map.set(guid, instances[i].id); | ||
map.set(instances[i].id, guid); | ||
var websocket = "ws://" + host + "/devtools/page/" + guid; | ||
var devtools = "chrome-devtools://devtools/bundled/inspector.html?ws=" + websocket.substr(5); | ||
// Generate the json description of this instance | ||
chromeInstances.push({ | ||
description: instances[i].processName, | ||
devtoolsFrontendUrl: devtools, | ||
id: guid, | ||
title: instances[i].title, | ||
type: "page", | ||
url: instances[i].url, | ||
webSocketDebuggerUrl: websocket | ||
}); | ||
// Reset the map to the new instances | ||
this._guidToIdMap = map; | ||
return chromeInstances; | ||
} | ||
// Reset the map to the new instances | ||
this._guidToIdMap = map; | ||
return chromeInstances; | ||
catch (err) { | ||
defaults_1.usageDataObject.sendUsageDataException("getEdgeJson", err); | ||
} | ||
}; | ||
@@ -344,52 +371,73 @@ Service.prototype.getEdgeVersionJson = function () { | ||
Service.prototype.getChromeProtocol = function () { | ||
var script = fs.readFileSync(__dirname + '/../chromeProtocol/protocol.json', 'utf8'); | ||
return script; | ||
try { | ||
var script = fs.readFileSync(__dirname + '/../chromeProtocol/protocol.json', 'utf8'); | ||
return script; | ||
} | ||
catch (err) { | ||
defaults_1.usageDataObject.sendUsageDataException("getChromeProtocol", err); | ||
} | ||
}; | ||
Service.prototype.createGuid = function () { | ||
var g = crypto.createHash('md5').update(Math.random().toString()).digest('hex').toUpperCase(); | ||
return g.substring(0, 8) + "-" + g.substring(9, 13) + "-" + g.substring(13, 17) + "-" + g.substring(17, 21) + "-" + g.substring(21, 31); | ||
try { | ||
var g = crypto.createHash('md5').update(Math.random().toString()).digest('hex').toUpperCase(); | ||
return g.substring(0, 8) + "-" + g.substring(9, 13) + "-" + g.substring(13, 17) + "-" + g.substring(17, 21) + "-" + g.substring(21, 31); | ||
} | ||
catch (err) { | ||
defaults_1.usageDataObject.sendUsageDataException("createGuid", err); | ||
} | ||
}; | ||
Service.prototype.extractParametersFromUrl = function (url) { | ||
var parameters; | ||
var closeUrl = '/json/close'; | ||
if (url.indexOf('/json/new') != -1) { | ||
var urlSegements = url.split('?'); | ||
if (urlSegements.length > 1) { | ||
url = urlSegements[0]; | ||
parameters = urlSegements[1]; | ||
try { | ||
var parameters = void 0; | ||
var closeUrl = '/json/close'; | ||
if (url.indexOf('/json/new') != -1) { | ||
var urlSegements = url.split('?'); | ||
if (urlSegements.length > 1) { | ||
url = urlSegements[0]; | ||
parameters = urlSegements[1]; | ||
} | ||
} | ||
else if (url.indexOf(closeUrl) != -1) { | ||
parameters = url.replace(closeUrl + "/", ''); | ||
url = url.slice(0, closeUrl.length); | ||
} | ||
return { url: url, paramChain: parameters }; | ||
} | ||
else if (url.indexOf(closeUrl) != -1) { | ||
parameters = url.replace(closeUrl + "/", ''); | ||
url = url.slice(0, closeUrl.length); | ||
catch (err) { | ||
defaults_1.usageDataObject.sendUsageDataException("extractParametersFromUrl", err); | ||
} | ||
return { url: url, paramChain: parameters }; | ||
}; | ||
Service.prototype.closeEdgeInstance = function (guid) { | ||
var edgeResult = false; | ||
var networkProxyResult = false; | ||
var id = this._guidToIdMap.get(guid.toLocaleUpperCase()); | ||
if (id) { | ||
edgeResult = edgeAdapter.closeEdge(id); | ||
var networkInstanceId = this._idToNetWorkProxyMap.get(id); | ||
if (networkInstanceId) { | ||
networkProxyResult = edgeAdapter.closeNetworkProxyInstance(networkInstanceId); | ||
} | ||
// tab is closed, clean all the mappings and close connections | ||
var instanceId = this._idToEdgeMap.get(id); | ||
var sockets = this._edgeToWSMap.get(instanceId); | ||
if (sockets) { | ||
for (var i = 0; i < sockets.length; i++) { | ||
sockets[i].removeAllListeners(); | ||
sockets[i].close(); | ||
try { | ||
var edgeResult = false; | ||
var networkProxyResult = false; | ||
var id = this._guidToIdMap.get(guid.toLocaleUpperCase()); | ||
if (id) { | ||
edgeResult = edgeAdapter.closeEdge(id); | ||
var networkInstanceId = this._idToNetWorkProxyMap.get(id); | ||
if (networkInstanceId) { | ||
networkProxyResult = edgeAdapter.closeNetworkProxyInstance(networkInstanceId); | ||
} | ||
// tab is closed, clean all the mappings and close connections | ||
var instanceId = this._idToEdgeMap.get(id); | ||
var sockets = this._edgeToWSMap.get(instanceId); | ||
if (sockets) { | ||
for (var i = 0; i < sockets.length; i++) { | ||
sockets[i].removeAllListeners(); | ||
sockets[i].close(); | ||
} | ||
} | ||
this._edgeToWSMap.delete(instanceId); | ||
this._guidToIdMap.delete(guid.toLocaleUpperCase()); | ||
this._guidToIdMap.delete(id); | ||
this._idToNetWorkProxyMap.delete(id); | ||
this._idToNetWorkProxyMap.delete(networkInstanceId); | ||
this._idToEdgeMap.delete(id); | ||
} | ||
this._edgeToWSMap.delete(instanceId); | ||
this._guidToIdMap.delete(guid.toLocaleUpperCase()); | ||
this._guidToIdMap.delete(id); | ||
this._idToNetWorkProxyMap.delete(id); | ||
this._idToNetWorkProxyMap.delete(networkInstanceId); | ||
this._idToEdgeMap.delete(id); | ||
edgeResult && networkProxyResult ? defaults_1.usageDataObject.sendUsageDataSuccessEvent("closeEdgeInstance") : defaults_1.usageDataObject.sendUsageDataEvent({ "closeEdgeInstance": "failed" }); | ||
return edgeResult && networkProxyResult; | ||
} | ||
return edgeResult && networkProxyResult; | ||
catch (err) { | ||
defaults_1.usageDataObject.sendUsageDataException("closeEdgeInstance", err); | ||
} | ||
}; | ||
@@ -396,0 +444,0 @@ return Service; |
{ | ||
"name": "debug-adapter-for-office-addins", | ||
"version": "1.0.9", | ||
"version": "1.0.10", | ||
"description": "Debug Adapter for Office Add-ins", | ||
@@ -25,2 +25,3 @@ "main": "out/src/edgeAdapter.js", | ||
"bufferutil": "4.0.1", | ||
"office-addin-usage-data": "^1.1.3", | ||
"regedit": "^3.0.3", | ||
@@ -32,2 +33,3 @@ "utf-8-validate": "^5.0.2", | ||
"devDependencies": { | ||
"@types/mocha": "^7.0.2", | ||
"@types/node": "^8.0.32", | ||
@@ -42,2 +44,3 @@ "@types/ws": "^7.2.2", | ||
"gulp-util": "^3.0.8", | ||
"mocha": "^7.1.1", | ||
"node-addon-api": "^2.0.0", | ||
@@ -48,2 +51,4 @@ "node-gyp": "^6.1.0", | ||
"rimraf": "^3.0.2", | ||
"sync-request": "6.1.0", | ||
"ts-node": "^8.9.0", | ||
"tslint": "^5.7.0", | ||
@@ -74,2 +79,3 @@ "typescript": "2.5.3", | ||
"lint": "tslint /src/**/*.ts", | ||
"test": "mocha -r ts-node/register test/*.ts", | ||
"watch:ts": "tsc --watch" | ||
@@ -76,0 +82,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
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
38
7893
22528306
6
21
+ Addedapplicationinsights@1.8.10(transitive)
+ Addedasync-hook-jl@1.7.6(transitive)
+ Addedasync-listener@0.6.10(transitive)
+ Addedcls-hooked@4.2.2(transitive)
+ Addedcommander@6.2.1(transitive)
+ Addedcontinuation-local-storage@3.2.1(transitive)
+ Addeddiagnostic-channel@0.3.1(transitive)
+ Addeddiagnostic-channel-publishers@0.4.4(transitive)
+ Addedemitter-listener@1.1.2(transitive)
+ Addedoffice-addin-usage-data@1.6.14(transitive)
+ Addedreadline-sync@1.4.10(transitive)
+ Addedsemver@5.7.2(transitive)
+ Addedshimmer@1.2.1(transitive)
+ Addedstack-chain@1.3.7(transitive)
+ Addeduuid@8.3.2(transitive)