From 01bc2e025351e92f016c22bea47e5e86fee5ca09 Mon Sep 17 00:00:00 2001 From: Kristaps Fabians Geikins Date: Fri, 25 Oct 2024 15:47:28 +0300 Subject: [PATCH] chore(server): quick js to ts #5 - remaining stragglers --- packages/server/db/{knex.js => knex.ts} | 17 ++++----- packages/server/{knexfile.js => knexfile.ts} | 35 +++++++++---------- packages/server/logging/errorLogging.js | 23 ------------ packages/server/logging/errorLogging.ts | 29 +++++++++++++++ .../server/logging/httpServerMonitoring.js | 30 ---------------- .../server/logging/httpServerMonitoring.ts | 28 +++++++++++++++ .../server/logging/{index.js => index.ts} | 21 +++++------ packages/server/tsconfig.json | 4 ++- 8 files changed, 92 insertions(+), 95 deletions(-) rename packages/server/db/{knex.js => knex.ts} (55%) rename packages/server/{knexfile.js => knexfile.ts} (86%) delete mode 100644 packages/server/logging/errorLogging.js create mode 100644 packages/server/logging/errorLogging.ts delete mode 100644 packages/server/logging/httpServerMonitoring.js create mode 100644 packages/server/logging/httpServerMonitoring.ts rename packages/server/logging/{index.js => index.ts} (65%) diff --git a/packages/server/db/knex.js b/packages/server/db/knex.ts similarity index 55% rename from packages/server/db/knex.js rename to packages/server/db/knex.ts index 2390aa9f2..95b67842f 100644 --- a/packages/server/db/knex.js +++ b/packages/server/db/knex.ts @@ -1,9 +1,9 @@ /* istanbul ignore file */ -'use strict' - const env = process.env.NODE_ENV || 'development' -const configs = require('@/knexfile.js') -const { dbStartupLogger } = require('@/logging/logging') +import configs from '@/knexfile.js' +import { dbStartupLogger } from '@/logging/logging' +import knex from 'knex' + const config = configs[env] config.log = { @@ -18,12 +18,7 @@ config.log = { dbStartupLogger.info(`Loaded knex conf for ${env}`) -/** - * Need to override type because type def file incorrectly uses ES6 - * @type {import('knex').default} - */ -const knex = require('knex') const knexInstance = knex(config) -module.exports = knexInstance -module.exports.db = knexInstance +export default knexInstance +export { knexInstance as db } diff --git a/packages/server/knexfile.js b/packages/server/knexfile.ts similarity index 86% rename from packages/server/knexfile.js rename to packages/server/knexfile.ts index 3050524d6..32de8baca 100644 --- a/packages/server/knexfile.js +++ b/packages/server/knexfile.ts @@ -1,19 +1,19 @@ +/* eslint-disable no-restricted-imports */ /* eslint-disable camelcase */ /* istanbul ignore file */ -'use strict' - -const { packageRoot } = require('./bootstrap') -const fs = require('fs') -const path = require('path') -const { +import { packageRoot } from './bootstrap' +import fs from 'fs' +import path from 'path' +import { isTestEnv, ignoreMissingMigrations, postgresMaxConnections -} = require('@/modules/shared/helpers/envHelper') -const { dbLogger: logger } = require('./logging/logging') +} from '@/modules/shared/helpers/envHelper' +import { dbLogger as logger } from './logging/logging' +import { Knex } from 'knex' -function walk(dir) { - let results = [] +function walk(dir: string) { + let results: string[] = [] const list = fs.readdirSync(dir) list.forEach(function (file) { const fullFile = path.join(dir, file) @@ -50,7 +50,7 @@ if (env.POSTGRES_USER && env.POSTGRES_PASSWORD) { env.POSTGRES_USER )}:${encodeURIComponent(env.POSTGRES_PASSWORD)}@${ env.POSTGRES_URL - }/${encodeURIComponent(env.POSTGRES_DB)}` + }/${encodeURIComponent(env.POSTGRES_DB as string)}` } else { connectionUri = env.POSTGRES_URL } @@ -77,16 +77,16 @@ const commonConfig = { directory: migrationDirs }, log: { - warn(message) { + warn(message: unknown) { logger.warn(message) }, - error(message) { + error(message: unknown) { logger.error(message) }, - deprecate(message) { + deprecate(message: unknown) { logger.info(message) }, - debug(message) { + debug(message: unknown) { logger.debug(message) } }, @@ -100,8 +100,7 @@ const commonConfig = { } } -/** @type {Object} */ -const config = { +const config: Record = { test: { ...commonConfig, connection: { @@ -129,4 +128,4 @@ const config = { } } -module.exports = config +export default config diff --git a/packages/server/logging/errorLogging.js b/packages/server/logging/errorLogging.js deleted file mode 100644 index 371a69257..000000000 --- a/packages/server/logging/errorLogging.js +++ /dev/null @@ -1,23 +0,0 @@ -/* istanbul ignore file */ -const { logger } = require('@/logging/logging') -const prometheusClient = require('prom-client') - -let metricErrorCount = null - -module.exports = { - errorLoggingMiddleware(err, req, res, next) { - if (metricErrorCount === null) { - metricErrorCount = new prometheusClient.Counter({ - name: 'speckle_server_request_errors', - help: 'Number of requests that threw exceptions', - labelNames: ['route'] - }) - } - - logger.error(err, `Error when handling ${req.originalUrl} from ${req.ip}`) - let route = 'unknown' - if (req.route && req.route.path) route = req.route.path - metricErrorCount.labels(route).inc() - next(err) - } -} diff --git a/packages/server/logging/errorLogging.ts b/packages/server/logging/errorLogging.ts new file mode 100644 index 000000000..c1574eee8 --- /dev/null +++ b/packages/server/logging/errorLogging.ts @@ -0,0 +1,29 @@ +/* istanbul ignore file */ +import { logger } from '@/logging/logging' +import type { Nullable } from '@speckle/shared' +import prometheusClient from 'prom-client' +import type express from 'express' + +// eslint-disable-next-line @typescript-eslint/no-explicit-any +let metricErrorCount: Nullable> = null + +export const errorLoggingMiddleware: express.ErrorRequestHandler = ( + err, + req, + res, + next +) => { + if (metricErrorCount === null) { + metricErrorCount = new prometheusClient.Counter({ + name: 'speckle_server_request_errors', + help: 'Number of requests that threw exceptions', + labelNames: ['route'] + }) + } + + logger.error(err, `Error when handling ${req.originalUrl} from ${req.ip}`) + let route = 'unknown' + if (req.route && req.route.path) route = req.route.path + metricErrorCount.labels(route).inc() + next(err) +} diff --git a/packages/server/logging/httpServerMonitoring.js b/packages/server/logging/httpServerMonitoring.js deleted file mode 100644 index 80504ad39..000000000 --- a/packages/server/logging/httpServerMonitoring.js +++ /dev/null @@ -1,30 +0,0 @@ -/* istanbul ignore file */ -/* eslint-disable no-unused-vars */ -'use strict' - -const prometheusClient = require('prom-client') - -let metricActiveConnections = null - -module.exports = { - monitorActiveConnections(httpServer) { - if (metricActiveConnections !== null) { - prometheusClient.register.removeSingleMetric('speckle_server_active_connections') - } - - metricActiveConnections = new prometheusClient.Gauge({ - name: 'speckle_server_active_connections', - help: 'Number of active http connections', - async collect() { - let connectionCount = await new Promise((resolve, reject) => { - httpServer.getConnections(function (error, count) { - if (error) resolve(-1) - else resolve(count) - }) - }) - if (isNaN(connectionCount)) connectionCount = -1 - this.set(connectionCount) - } - }) - } -} diff --git a/packages/server/logging/httpServerMonitoring.ts b/packages/server/logging/httpServerMonitoring.ts new file mode 100644 index 000000000..afa551b03 --- /dev/null +++ b/packages/server/logging/httpServerMonitoring.ts @@ -0,0 +1,28 @@ +/* istanbul ignore file */ +import type { Nullable } from '@speckle/shared' +import prometheusClient from 'prom-client' +import type http from 'http' + +// eslint-disable-next-line @typescript-eslint/no-explicit-any +let metricActiveConnections: Nullable> = null + +export const monitorActiveConnections = (httpServer: http.Server) => { + if (metricActiveConnections !== null) { + prometheusClient.register.removeSingleMetric('speckle_server_active_connections') + } + + metricActiveConnections = new prometheusClient.Gauge({ + name: 'speckle_server_active_connections', + help: 'Number of active http connections', + async collect() { + let connectionCount = await new Promise((resolve) => { + httpServer.getConnections(function (error, count) { + if (error) resolve(-1) + else resolve(count) + }) + }) + if (isNaN(connectionCount)) connectionCount = -1 + this.set(connectionCount) + } + }) +} diff --git a/packages/server/logging/index.js b/packages/server/logging/index.ts similarity index 65% rename from packages/server/logging/index.js rename to packages/server/logging/index.ts index 5a958ddfa..6489ae634 100644 --- a/packages/server/logging/index.js +++ b/packages/server/logging/index.ts @@ -1,20 +1,17 @@ /* istanbul ignore file */ -const prometheusClient = require('prom-client') -const promBundle = require('express-prom-bundle') +import prometheusClient from 'prom-client' +import promBundle from 'express-prom-bundle' -const { initKnexPrometheusMetrics } = require('@/logging/knexMonitoring') -const { - initHighFrequencyMonitoring -} = require('@/logging/highFrequencyMetrics/highfrequencyMonitoring') -const knex = require('@/db/knex') -const { - highFrequencyMetricsCollectionPeriodMs -} = require('@/modules/shared/helpers/envHelper') -const { startupLogger: logger } = require('@/logging/logging') +import { initKnexPrometheusMetrics } from '@/logging/knexMonitoring' +import { initHighFrequencyMonitoring } from '@/logging/highFrequencyMetrics/highfrequencyMonitoring' +import knex from '@/db/knex' +import { highFrequencyMetricsCollectionPeriodMs } from '@/modules/shared/helpers/envHelper' +import { startupLogger as logger } from '@/logging/logging' +import type express from 'express' let prometheusInitialized = false -module.exports = function (app) { +export default function (app: express.Express) { if (!prometheusInitialized) { prometheusInitialized = true prometheusClient.register.clear() diff --git a/packages/server/tsconfig.json b/packages/server/tsconfig.json index d276f16d1..254ed6bec 100644 --- a/packages/server/tsconfig.json +++ b/packages/server/tsconfig.json @@ -114,8 +114,10 @@ "test/**/*", "app.ts", "otel.ts", + "bootstrap.ts", + "knexfile.ts", "bootstrap.js", - "knexfile.js" + "knexfile.ts" ], "exclude": ["node_modules", "coverage", "reports"] }