diff --git a/spikes/leak/.gitignore b/spikes/leak/.gitignore new file mode 100644 index 00000000..c21b0ba0 --- /dev/null +++ b/spikes/leak/.gitignore @@ -0,0 +1,4 @@ +/node_modules +coverage +.nyc_output +npm-debug.log diff --git a/spikes/leak/package.json b/spikes/leak/package.json new file mode 100644 index 00000000..c85aabf3 --- /dev/null +++ b/spikes/leak/package.json @@ -0,0 +1,13 @@ +{ + "name": "leak-spike", + "version": "1.0.0", + "private": true, + "license": "private", + "main": "src/index.js", + "dependencies": { + "clone": "^2.0.0", + "hapi": "^15.2.0", + "pretty-hrtime": "^1.0.3", + "require-dir": "^0.3.1" + } +} diff --git a/spikes/leak/readme.md b/spikes/leak/readme.md new file mode 100644 index 00000000..3e581cc2 --- /dev/null +++ b/spikes/leak/readme.md @@ -0,0 +1,2 @@ +GET /mem +GET /cpu diff --git a/spikes/leak/src/index.js b/spikes/leak/src/index.js new file mode 100644 index 00000000..4c49dea2 --- /dev/null +++ b/spikes/leak/src/index.js @@ -0,0 +1,27 @@ +const requireDir = require('require-dir'); +const plugins = require('./plugins'); +const routes = requireDir('./routes'); +const Hapi = require('hapi'); + +const server = new Hapi.Server(); + +server.connection({ + host: 'localhost', + port: 8000 +}); + +server.register(plugins, (err) => { + if (err) { + throw err; + } + + Object.keys(routes).forEach((name) => { + routes[name](server); + }); + + server.start((err) => { + server.connections.forEach((conn) => { + console.log(`started at: ${conn.info.uri}`); + }); + }); +}); diff --git a/spikes/leak/src/plugins.js b/spikes/leak/src/plugins.js new file mode 100644 index 00000000..e0a30c5d --- /dev/null +++ b/spikes/leak/src/plugins.js @@ -0,0 +1 @@ +module.exports = []; diff --git a/spikes/leak/src/routes/leak.js b/spikes/leak/src/routes/leak.js new file mode 100644 index 00000000..fb5ced9c --- /dev/null +++ b/spikes/leak/src/routes/leak.js @@ -0,0 +1,57 @@ +const prettyHrtime = require('pretty-hrtime'); +const clone = require('clone'); + +// leak example from https://auth0.com/blog/four-types-of-leaks-in-your-javascript-code-and-how-to-get-rid-of-them/ +let theLeak = null; +const anotherLeak = []; + +const fibonacci = (num) => { + if (num <= 1) return 1; + + return fibonacci(num - 1) + fibonacci(num - 2); +}; + +module.exports = (server) => { + server.route({ + method: 'GET', + path: '/mem', + config: { + handler: (req, reply) => { + const start = process.hrtime(); + + const originalLeak = theLeak; + + const unused = () => { + // referencig something that is going to be replaced + if (originalLeak) { + console.log("hi"); + } + }; + + theLeak = { + longStr: new Array(1000000).join('*') + }; + + anotherLeak.push(anotherLeak.length); + + const end = process.hrtime(start); + reply(prettyHrtime(end)); + } + } + }); + + server.route({ + method: 'GET', + path: '/cpu', + config: { + handler: (req, reply) => { + const start = process.hrtime(); + + fibonacci(40); + + const end = process.hrtime(start); + reply(prettyHrtime(end)); + } + } + }); +}; \ No newline at end of file diff --git a/spikes/leak/src/routes/version.js b/spikes/leak/src/routes/version.js new file mode 100644 index 00000000..987747cb --- /dev/null +++ b/spikes/leak/src/routes/version.js @@ -0,0 +1,18 @@ +const Pkg = require('../../package.json'); + +const internals = { + response: { + version: Pkg.version + } +}; + +module.exports = (server) => { + server.route({ + method: 'GET', + path: '/ops/version', + config: { + description: 'Returns the version of the server', + handler: (request, reply) => reply(internals.response) + } + }); +};