feat: add basic telemetry api

This commit is contained in:
moonrailgun 2023-09-17 14:41:40 +08:00
parent d5acf872a9
commit 440947c9a8
5 changed files with 97 additions and 0 deletions

View File

@ -37,6 +37,7 @@
"maxmind": "^4.3.11",
"morgan": "^1.10.0",
"nanoid": "^3.3.6",
"openbadge": "^1.0.4",
"passport": "^0.6.0",
"passport-jwt": "^4.0.1",
"react": "^18.2.0",

View File

@ -73,6 +73,9 @@ dependencies:
nanoid:
specifier: ^3.3.6
version: 3.3.6
openbadge:
specifier: ^1.0.4
version: 1.0.4
passport:
specifier: ^0.6.0
version: 0.6.0
@ -3827,6 +3830,10 @@ packages:
resolution: {integrity: sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==}
dev: false
/lodash@3.10.1:
resolution: {integrity: sha512-9mDDwqVIma6OZX79ZlDACZl8sBm0TEnkf99zV3iMA4GzkIT/9hiqP5mY0HoT1iNLCrKc/R1HByV+yJfRWVJryQ==}
dev: false
/lodash@4.17.21:
resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==}
dev: false
@ -4199,6 +4206,20 @@ packages:
dependencies:
wrappy: 1.0.2
/openbadge@1.0.4:
resolution: {integrity: sha512-A/yslJpnCgQPPo8sYYDTymAiDfuZI9AzpwuOQdbc0ZIbTcL4BsuVQm2BV63jEiDVatlz4kcFX8Y36hloEuFhGA==}
dependencies:
lodash: 3.10.1
opentype.js: 0.6.9
dev: false
/opentype.js@0.6.9:
resolution: {integrity: sha512-H8TkPyysd95WFQcgBpOoyZA0y6rf5b7iC5Y4ABwHi7ZMc0dqdgwOIeKMh7+rU2SG492Y+6eqJ4uOxLTBVkixjw==}
hasBin: true
dependencies:
tiny-inflate: 1.0.3
dev: false
/parseurl@1.3.3:
resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==}
engines: {node: '>= 0.8'}
@ -5716,6 +5737,10 @@ packages:
resolution: {integrity: sha512-Eet/eeMhkO6TX8mnUteS9zgPbUMQa4I6Kkp5ORiBD5476/m+PIRiumP5tmh5ioJpH7k51Kehawy2UDfsnxxY8Q==}
dev: false
/tiny-inflate@1.0.3:
resolution: {integrity: sha512-pkY1fj1cKHb2seWDy0B16HeWyczlJA9/WW3u3c4z/NiWDsO3DOU5D7nhTLE9CF0yXv/QZFY7sEJmj24dK+Rrqw==}
dev: false
/tiny-lru@11.0.1:
resolution: {integrity: sha512-iNgFugVuQgBKrqeO/mpiTTgmBsTP0WL6yeuLfLs/Ctf0pI/ixGqIRm8sDCwMcXGe9WWvt2sGXI5mNqZbValmJg==}
engines: {node: '>=12'}

View File

@ -9,6 +9,7 @@ import morgan from 'morgan';
import { userRouter } from './router/user';
import { websiteRouter } from './router/website';
import { workspaceRouter } from './router/workspace';
import { telemetryRouter } from './router/telemetry';
const port = Number(process.env.PORT || 12345);
@ -25,6 +26,7 @@ app.disable('x-powered-by');
app.use('/api/user', userRouter);
app.use('/api/website', websiteRouter);
app.use('/api/workspace', workspaceRouter);
app.use('/api/telemetry', telemetryRouter);
app.use((err: any, req: any, res: any, next: any) => {
console.error(err);

View File

@ -0,0 +1,37 @@
import { Router } from 'express';
import { numify } from '../utils/common';
const openBadge = require('openbadge');
export const telemetryRouter = Router();
telemetryRouter.get('/blank.gif', async (req, res) => {
const buffer = Buffer.from(
'R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7',
'base64'
);
res.header('Content-Type', 'image/gif').send(buffer);
});
telemetryRouter.get('/badge.svg', async (req, res) => {
const title = req.query.title || 'visitor';
const num = numify(11123243);
const svg = await new Promise((resolve, reject) => {
openBadge(
{
text: [title, num],
},
(err: any, badgeSvg: string) => {
if (err) {
reject(err);
} else {
resolve(badgeSvg);
}
}
);
});
res.header('Content-Type', 'image/svg+xml').send(svg);
});

View File

@ -218,3 +218,35 @@ export function getMinimumUnit(startDate: Date, endDate: Date) {
return 'year';
}
/**
* fork from https://github.com/mcnaveen/numify/blob/main/src/index.ts
*/
export function numify(num: number): string {
num = Number(num.toString().replace(/[^0-9.]/g, ''));
if (num < 1000) {
return String(num);
}
let si = [
{ v: 1e3, s: 'k' },
{ v: 1e6, s: 'M' },
{ v: 1e9, s: 'B' },
{ v: 1e12, s: 'T' },
{ v: 1e15, s: 'P' },
{ v: 1e18, s: 'E' },
];
let index;
for (index = si.length - 1; index > 0; index--) {
if (num >= si[index].v) {
break;
}
}
const result: string = (
(num / si[index].v).toFixed(2).replace(/\.0+$|(\.[0-9]*[1-9])0+$/, '$1') +
si[index].s
).toString();
return result;
}