From 13cc53e4ae6b8bc256cea40435c1518aa9f1b98b Mon Sep 17 00:00:00 2001 From: "Umang G. Patel" <23169768+robonetphy@users.noreply.github.com> Date: Tue, 26 Jul 2022 09:56:20 +0530 Subject: [PATCH] Feat/hawk integration (#210) * update environment variable * add: hawk nodejs and javascript catcher * fontend hawk integration * backend hawk integration * update the env file and config files * support for client, backend error tracking token * client side error tracking refactor * new version of hawk.nodejs catcher added --- .env.sample | 8 +++- package.json | 2 + src/backend/app.ts | 39 +++++++++++---- src/backend/views/layout.twig | 3 +- src/frontend/js/app.js | 4 ++ yarn.lock | 90 ++++++++++++++++++++++++++++++++++- 6 files changed, 134 insertions(+), 12 deletions(-) diff --git a/.env.sample b/.env.sample index 9d188e7..02d34b5 100644 --- a/.env.sample +++ b/.env.sample @@ -1,2 +1,8 @@ # codex-docs password. -PASSWORD= \ No newline at end of file +PASSWORD= + +# Backend errors tracking Integraton Token +HAWK_TOKEN_BACKEND= + +# Client errors tracking Integraton Token +HAWK_TOKEN_CLIENT= diff --git a/package.json b/package.json index d3d10df..382231c 100644 --- a/package.json +++ b/package.json @@ -17,6 +17,8 @@ "editor-upgrade": "yarn add -D @editorjs/{editorjs,header,code,delimiter,list,link,image,table,inline-code,marker,warning,checklist,raw}@latest" }, "dependencies": { + "@hawk.so/javascript": "^3.0.1", + "@hawk.so/nodejs": "^3.1.2", "config": "^3.3.6", "cookie-parser": "^1.4.5", "csurf": "^1.11.0", diff --git a/src/backend/app.ts b/src/backend/app.ts index 413e56e..6bbbbcb 100644 --- a/src/backend/app.ts +++ b/src/backend/app.ts @@ -1,4 +1,4 @@ -import express, { Request, Response } from 'express'; +import express, { NextFunction, Request, Response } from 'express'; import path from 'path'; import cookieParser from 'cookie-parser'; import morgan from 'morgan'; @@ -7,18 +7,30 @@ import routes from './routes'; import HttpException from './exceptions/httpException'; import * as dotenv from 'dotenv'; import config from 'config'; +import HawkCatcher from '@hawk.so/nodejs'; import os from 'os'; import appConfig from 'config'; import { downloadFavicon, FaviconData } from './utils/downloadFavicon'; + dotenv.config(); const app = express(); const localConfig = rcParser.getConfiguration(); +// Initialize the backend error tracking catcher. +if (process.env.HAWK_TOKEN_BACKEND) { + HawkCatcher.init(process.env.HAWK_TOKEN_BACKEND); +} + // Get url to upload favicon from config const favicon: string = appConfig.get('favicon'); app.locals.config = localConfig; +// Set client error tracking token as app local. +if (process.env.HAWK_TOKEN_CLIENT) { + app.locals.config.hawkClientToken = process.env.HAWK_TOKEN_CLIENT; +} + // view engine setup app.set('views', path.join(__dirname, './', 'views')); app.set('view engine', 'twig'); @@ -55,15 +67,24 @@ app.use('/favicon', express.static(downloadedFaviconFolder)); app.use('/', routes); -// error handler -app.use(function (err: HttpException, req: Request, res: Response) { - // set locals, only providing error in development - res.locals.message = err.message; - res.locals.error = req.app.get('env') === 'development' ? err : {}; - // render the error page - res.status(err.status || 500); - res.render('error'); +// global error handler +app.use(function (err: unknown, req: Request, res: Response, next: NextFunction) { + // send any type of error to hawk server. + if (process.env.HAWK_TOKEN_BACKEND && err instanceof Error) { + HawkCatcher.send(err); + } + // only send Http based exception to client. + if (err instanceof HttpException) { + // set locals, only providing error in development + res.locals.message = err.message; + res.locals.error = req.app.get('env') === 'development' ? err : {}; + // render the error page + res.status(err.status || 500); + res.render('error'); + } + next(err); }); + export default app; diff --git a/src/backend/views/layout.twig b/src/backend/views/layout.twig index fdaf8f9..3b3387e 100644 --- a/src/backend/views/layout.twig +++ b/src/backend/views/layout.twig @@ -11,7 +11,8 @@ diff --git a/src/frontend/js/app.js b/src/frontend/js/app.js index 1cfdbd9..1bd665e 100644 --- a/src/frontend/js/app.js +++ b/src/frontend/js/app.js @@ -17,6 +17,7 @@ import Writing from './modules/writing'; import Page from './modules/page'; import Extensions from './modules/extensions'; import Sidebar from './modules/sidebar'; +import HawkCatcher from '@hawk.so/javascript'; /** * Main app class @@ -30,6 +31,9 @@ class Docs { this.page = new Page(); this.extensions = new Extensions(); this.sidebar = new Sidebar(); + if (window.config.hawkClientToken) { + this.hawk = new HawkCatcher(window.config.hawkClientToken); + } document.addEventListener('DOMContentLoaded', (event) => { this.docReady(); diff --git a/yarn.lock b/yarn.lock index 7a19298..7750c44 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1020,6 +1020,30 @@ minimatch "^3.0.4" strip-json-comments "^3.1.1" +"@hawk.so/javascript@^3.0.1": + version "3.0.1" + resolved "https://registry.yarnpkg.com/@hawk.so/javascript/-/javascript-3.0.1.tgz#364a646dce1448a805ec1b475a729b731820a8c8" + integrity sha512-c8YzhxDzginwzavhW9uwYT8FkYl8beUbr5bpuzcTTX+KKR1ryntogBIaYvTSbdr/ZMP9aS6yJQ9vKglJON3f/Q== + dependencies: + "@hawk.so/types" "^0.1.13" + error-stack-parser "^2.0.6" + +"@hawk.so/nodejs@^3.1.2": + version "3.1.2" + resolved "https://registry.yarnpkg.com/@hawk.so/nodejs/-/nodejs-3.1.2.tgz#b06229f0c8a0d8676412329511f9f2b01e492211" + integrity sha512-FqZtJDEc3G/VdirsEEfA4BodA3OGXCSy2188aPSeaLkLWswaKAnkaJNTGHQL59dtOeSbvipMJVgtoqihHkpGBQ== + dependencies: + "@hawk.so/types" "^0.1.15" + axios "^0.21.1" + stack-trace "^0.0.10" + +"@hawk.so/types@^0.1.13", "@hawk.so/types@^0.1.15": + version "0.1.18" + resolved "https://registry.yarnpkg.com/@hawk.so/types/-/types-0.1.18.tgz#746537634756825f066182737429d11ea124d5c5" + integrity sha512-SvECLGmLb5t90OSpk3n8DCjJsUoyjrq/Z6Ioil80tVkbMXRdGjaHZpn/0w1gBqtgNWBfW2cSbsQPqmyDj1NsqQ== + dependencies: + "@types/mongodb" "^3.5.34" + "@humanwhocodes/config-array@^0.5.0": version "0.5.0" resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.5.0.tgz#1407967d4c6eecd7388f83acf1eaf4d0c6e58ef9" @@ -1195,6 +1219,13 @@ "@types/connect" "*" "@types/node" "*" +"@types/bson@*": + version "4.2.0" + resolved "https://registry.yarnpkg.com/@types/bson/-/bson-4.2.0.tgz#a2f71e933ff54b2c3bf267b67fa221e295a33337" + integrity sha512-ELCPqAdroMdcuxqwMgUpifQyRoTpyYCNr1V9xKyF40VsBobsj+BbWNRvwGchMgBPGqkw655ypkjj2MEF5ywVwg== + dependencies: + bson "*" + "@types/cacheable-request@^6.0.1": version "6.0.2" resolved "https://registry.yarnpkg.com/@types/cacheable-request/-/cacheable-request-6.0.2.tgz#c324da0197de0a98a2312156536ae262429ff6b9" @@ -1364,6 +1395,14 @@ resolved "https://registry.yarnpkg.com/@types/mocha/-/mocha-9.1.0.tgz#baf17ab2cca3fcce2d322ebc30454bff487efad5" integrity sha512-QCWHkbMv4Y5U9oW10Uxbr45qMMSzl4OzijsozynUAgx3kEHUdXB00udx2dWDQ7f2TU2a2uuiFaRZjCe3unPpeg== +"@types/mongodb@^3.5.34": + version "3.6.20" + resolved "https://registry.yarnpkg.com/@types/mongodb/-/mongodb-3.6.20.tgz#b7c5c580644f6364002b649af1c06c3c0454e1d2" + integrity sha512-WcdpPJCakFzcWWD9juKoZbRtQxKIMYF/JIAM4JrNHrMcnJL6/a2NWjXxW7fo9hxboxxkg+icff8d7+WIEvKgYQ== + dependencies: + "@types/bson" "*" + "@types/node" "*" + "@types/morgan@^1.9.3": version "1.9.3" resolved "https://registry.yarnpkg.com/@types/morgan/-/morgan-1.9.3.tgz#ae04180dff02c437312bc0cfb1e2960086b2f540" @@ -1904,6 +1943,13 @@ autoprefixer@^10.4.2: picocolors "^1.0.0" postcss-value-parser "^4.2.0" +axios@^0.21.1: + version "0.21.4" + resolved "https://registry.yarnpkg.com/axios/-/axios-0.21.4.tgz#c67b90dc0568e5c1cf2b0b858c43ba28e2eda575" + integrity sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg== + dependencies: + follow-redirects "^1.14.0" + babel-eslint@^10.0.1: version "10.1.0" resolved "https://registry.yarnpkg.com/babel-eslint/-/babel-eslint-10.1.0.tgz#6968e568a910b78fb3779cdd8b6ac2f479943232" @@ -1975,6 +2021,11 @@ balanced-match@^1.0.0: resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== +base64-js@^1.3.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" + integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== + basic-auth@~2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/basic-auth/-/basic-auth-2.0.1.tgz#b998279bf47ce38344b4f3cf916d4679bbf51e3a" @@ -2046,6 +2097,13 @@ browserslist@^4.0.0, browserslist@^4.14.5, browserslist@^4.16.6, browserslist@^4 node-releases "^2.0.2" picocolors "^1.0.0" +bson@*: + version "4.6.4" + resolved "https://registry.yarnpkg.com/bson/-/bson-4.6.4.tgz#e66d4a334f1ab230dfcfb9ec4ea9091476dd372e" + integrity sha512-TdQ3FzguAu5HKPPlr0kYQCyrYUYh8tFM+CMTpxjNzVzxeiJY00Rtuj3LXLHSgiGvmaWlZ8PE+4KyM2thqE38pQ== + dependencies: + buffer "^5.6.0" + buffer-equal-constant-time@1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz#f8e71132f7ffe6e01a5c9697a4c6f3e48d5cc819" @@ -2056,6 +2114,14 @@ buffer-from@^1.0.0, buffer-from@^1.1.0: resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== +buffer@^5.6.0: + version "5.7.1" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" + integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== + dependencies: + base64-js "^1.3.1" + ieee754 "^1.1.13" + busboy@^0.2.11: version "0.2.14" resolved "https://registry.yarnpkg.com/busboy/-/busboy-0.2.14.tgz#6c2a622efcf47c57bbbe1e2a9c37ad36c7925453" @@ -2892,6 +2958,13 @@ error-ex@^1.2.0, error-ex@^1.3.1: dependencies: is-arrayish "^0.2.1" +error-stack-parser@^2.0.6: + version "2.1.4" + resolved "https://registry.yarnpkg.com/error-stack-parser/-/error-stack-parser-2.1.4.tgz#229cb01cdbfa84440bfa91876285b94680188286" + integrity sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ== + dependencies: + stackframe "^1.3.4" + es-abstract@^1.19.1, es-abstract@^1.19.2: version "1.19.2" resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.19.2.tgz#8f7b696d8f15b167ae3640b4060670f3d054143f" @@ -3426,6 +3499,11 @@ flatten@^1.0.2: resolved "https://registry.yarnpkg.com/flatten/-/flatten-1.0.3.tgz#c1283ac9f27b368abc1e36d1ff7b04501a30356b" integrity sha512-dVsPA/UwQ8+2uoFe5GHtiBMu48dWLTdsuEd7CKGlZlD78r1TTWBvDuFaFGKCo/ZfEr95Uk56vZoX86OsHkUeIg== +follow-redirects@^1.14.0: + version "1.15.1" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.1.tgz#0ca6a452306c9b276e4d3127483e29575e207ad5" + integrity sha512-yLAMQs+k0b2m7cVxpS1VKJVvoz7SS9Td1zss3XRwXj+ZDH00RJgnuLx7E44wx02kQLrdM3aOOy+FpzS7+8OizA== + foreachasync@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/foreachasync/-/foreachasync-3.0.0.tgz#5502987dc8714be3392097f32e0071c9dee07cf6" @@ -3783,7 +3861,7 @@ icss-utils@^5.0.0, icss-utils@^5.1.0: resolved "https://registry.yarnpkg.com/icss-utils/-/icss-utils-5.1.0.tgz#c6be6858abd013d768e98366ae47e25d5887b1ae" integrity sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA== -ieee754@^1.2.1: +ieee754@^1.1.13, ieee754@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== @@ -6194,6 +6272,16 @@ stable@^0.1.8: resolved "https://registry.yarnpkg.com/stable/-/stable-0.1.8.tgz#836eb3c8382fe2936feaf544631017ce7d47a3cf" integrity sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w== +stack-trace@^0.0.10: + version "0.0.10" + resolved "https://registry.yarnpkg.com/stack-trace/-/stack-trace-0.0.10.tgz#547c70b347e8d32b4e108ea1a2a159e5fdde19c0" + integrity sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg== + +stackframe@^1.3.4: + version "1.3.4" + resolved "https://registry.yarnpkg.com/stackframe/-/stackframe-1.3.4.tgz#b881a004c8c149a5e8efef37d51b16e412943310" + integrity sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw== + statuses@2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.1.tgz#55cb000ccf1d48728bd23c685a063998cf1a1b63"