@kopai/app 0.5.0 → 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,18 @@
1
+ <!doctype html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="utf-8" />
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
6
+ <title>Kopai</title>
7
+ <link
8
+ rel="icon"
9
+ type="image/svg+xml"
10
+ href="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 32 32' fill='none'%3E%3Crect width='32' height='32' rx='4' fill='%230a0a0a'/%3E%3Ctext x='3' y='22' font-family='ui-monospace,monospace' font-size='16' font-weight='400' fill='%23fafafa'%3Ek%3E%3C/text%3E%3C/svg%3E"
11
+ />
12
+ <script type="module" crossorigin src="/assets/index-oJZ3KchX.js"></script>
13
+ <link rel="stylesheet" crossorigin href="/assets/index-C5X3Abtu.css">
14
+ </head>
15
+ <body>
16
+ <div id="root"></div>
17
+ </body>
18
+ </html>
@@ -0,0 +1,14 @@
1
+ {
2
+ "base": "/",
3
+ "root": "/home/runner/work/kopai-mono/kopai-mono/packages/app/src/client",
4
+ "build": {
5
+ "assetsDir": "assets",
6
+ "outDir": "/home/runner/work/kopai-mono/kopai-mono/packages/app/dist/client/client"
7
+ },
8
+ "fastify": {
9
+ "outDirs": {
10
+ "client": "/home/runner/work/kopai-mono/kopai-mono/packages/app/dist/client/client"
11
+ },
12
+ "entryPaths": {}
13
+ }
14
+ }
@@ -13,6 +13,9 @@ let _kopai_api = require("@kopai/api");
13
13
  require("@kopai/core");
14
14
  let _kopai_collector = require("@kopai/collector");
15
15
  let _kopai_sqlite_datasource = require("@kopai/sqlite-datasource");
16
+ let node_path = require("node:path");
17
+ let _fastify_vite = require("@fastify/vite");
18
+ _fastify_vite = require_config.__toESM(_fastify_vite);
16
19
 
17
20
  //#region src/routes/index.ts
18
21
  const apiRoutes = async function(fastify, opts) {
@@ -30,6 +33,7 @@ const otelCollectorRoutes = async function(fastify, opts) {
30
33
  const apiServer = (0, fastify.default)({ logger: true });
31
34
  apiServer.setValidatorCompiler(fastify_type_provider_zod.validatorCompiler);
32
35
  apiServer.setSerializerCompiler(fastify_type_provider_zod.serializerCompiler);
36
+ const uiRoutes = ["/", "/*"];
33
37
  apiServer.register(_fastify_swagger.default, {
34
38
  openapi: {
35
39
  info: {
@@ -39,14 +43,24 @@ apiServer.register(_fastify_swagger.default, {
39
43
  },
40
44
  servers: []
41
45
  },
42
- transform: fastify_type_provider_zod.jsonSchemaTransform,
46
+ transform: ({ schema, url, ...rest }) => {
47
+ if (uiRoutes.includes(url)) return {
48
+ schema: { hide: true },
49
+ url
50
+ };
51
+ return (0, fastify_type_provider_zod.jsonSchemaTransform)({
52
+ schema,
53
+ url,
54
+ ...rest
55
+ });
56
+ },
43
57
  transformObject: fastify_type_provider_zod.jsonSchemaTransformObject
44
58
  });
45
59
  apiServer.register(_fastify_swagger_ui.default, {
46
60
  routePrefix: "/documentation",
47
61
  logo: {
48
62
  type: "image/svg+xml",
49
- content: Buffer.from("PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAxMjAgNDAiIGZpbGw9Im5vbmUiPjx0ZXh0IHg9IjAiIHk9IjI4IiBmb250LWZhbWlseT0iU3BhY2UgR3JvdGVzaywgc3lzdGVtLXVpLCBzYW5zLXNlcmlmIiBmb250LXNpemU9IjI0IiBmb250LXdlaWdodD0iNzAwIiBmaWxsPSIjZmFmYWZhIj5Lb3BhaTwvdGV4dD48L3N2Zz4K", "base64"),
63
+ content: Buffer.from("PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAxNjAgNDAiIGZpbGw9Im5vbmUiPjx0ZXh0IHg9IjAiIHk9IjI4IiBmb250LWZhbWlseT0idWktbW9ub3NwYWNlLCBtb25vc3BhY2UiIGZvbnQtc2l6ZT0iMjAiIGZvbnQtd2VpZ2h0PSI0MDAiIGZpbGw9IiNmYWZhZmEiPnwtLWsmZ3Q7IGtvcGFpPC90ZXh0Pjwvc3ZnPg==", "base64"),
50
64
  href: "/documentation",
51
65
  target: "_blank"
52
66
  },
@@ -55,13 +69,24 @@ apiServer.register(_fastify_swagger_ui.default, {
55
69
  rel: "icon",
56
70
  sizes: "32x32",
57
71
  type: "image/svg+xml",
58
- content: Buffer.from("PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAzMiAzMiIgZmlsbD0ibm9uZSI+PHJlY3Qgd2lkdGg9IjMyIiBoZWlnaHQ9IjMyIiByeD0iNCIgZmlsbD0iIzBhMGEwYSIvPjx0ZXh0IHg9IjQiIHk9IjIzIiBmb250LWZhbWlseT0ic3lzdGVtLXVpLCBzYW5zLXNlcmlmIiBmb250LXNpemU9IjE4IiBmb250LXdlaWdodD0iNzAwIiBmaWxsPSIjZmFmYWZhIj5LPC90ZXh0Pjwvc3ZnPgo=", "base64")
72
+ content: Buffer.from("PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAzMiAzMiIgZmlsbD0ibm9uZSI+PHJlY3Qgd2lkdGg9IjMyIiBoZWlnaHQ9IjMyIiByeD0iNCIgZmlsbD0iIzBhMGEwYSIvPjx0ZXh0IHg9IjMiIHk9IjIyIiBmb250LWZhbWlseT0idWktbW9ub3NwYWNlLCBtb25vc3BhY2UiIGZvbnQtc2l6ZT0iMTYiIGZvbnQtd2VpZ2h0PSI0MDAiIGZpbGw9IiNmYWZhZmEiPmsmZ3Q7PC90ZXh0Pjwvc3ZnPg==", "base64")
59
73
  }] }
60
74
  });
61
75
  const sqliteDatabase = (0, _kopai_sqlite_datasource.initializeDatabase)(require_config.env.SQLITE_DB_FILE_PATH);
62
76
  const telemetryDatasource = (0, _kopai_sqlite_datasource.createOptimizedDatasource)(sqliteDatabase);
63
77
  apiServer.after(() => {
64
78
  apiServer.register(apiRoutes, { readTelemetryDatasource: telemetryDatasource });
79
+ apiServer.register(async (fastify$2) => {
80
+ await fastify$2.register(_fastify_vite.default, {
81
+ root: (0, node_path.resolve)(__dirname, ".."),
82
+ distDir: (0, node_path.resolve)(__dirname, "..", "dist", "client"),
83
+ dev: false,
84
+ spa: true
85
+ });
86
+ fastify$2.get("/", (_req, reply) => reply.html());
87
+ fastify$2.get("/*", (_req, reply) => reply.html());
88
+ await fastify$2.vite.ready();
89
+ });
65
90
  });
66
91
  const collectorServer = (0, fastify.default)({ logger: true });
67
92
  collectorServer.setValidatorCompiler(fastify_type_provider_zod.validatorCompiler);
@@ -70,7 +95,7 @@ collectorServer.after(() => {
70
95
  collectorServer.register(otelCollectorRoutes, { telemetryDatasource });
71
96
  });
72
97
  async function run() {
73
- console.log(`@kopai/app v${require_cli.version}`);
98
+ console.log(`|--k> kopai\nv${require_cli.version}`);
74
99
  await apiServer.ready();
75
100
  const host = require_config.env.HOST || "localhost";
76
101
  const port = require_config.env.PORT;
@@ -9,6 +9,8 @@ import { signalsRoutes } from "@kopai/api";
9
9
  import "@kopai/core";
10
10
  import { collectorRoutes } from "@kopai/collector";
11
11
  import { createOptimizedDatasource, initializeDatabase } from "@kopai/sqlite-datasource";
12
+ import { resolve } from "node:path";
13
+ import FastifyVite from "@fastify/vite";
12
14
 
13
15
  //#region src/routes/index.ts
14
16
  const apiRoutes = async function(fastify, opts) {
@@ -26,6 +28,7 @@ const otelCollectorRoutes = async function(fastify, opts) {
26
28
  const apiServer = fastify({ logger: true });
27
29
  apiServer.setValidatorCompiler(validatorCompiler);
28
30
  apiServer.setSerializerCompiler(serializerCompiler);
31
+ const uiRoutes = ["/", "/*"];
29
32
  apiServer.register(fastifySwagger, {
30
33
  openapi: {
31
34
  info: {
@@ -35,14 +38,24 @@ apiServer.register(fastifySwagger, {
35
38
  },
36
39
  servers: []
37
40
  },
38
- transform: jsonSchemaTransform,
41
+ transform: ({ schema, url, ...rest }) => {
42
+ if (uiRoutes.includes(url)) return {
43
+ schema: { hide: true },
44
+ url
45
+ };
46
+ return jsonSchemaTransform({
47
+ schema,
48
+ url,
49
+ ...rest
50
+ });
51
+ },
39
52
  transformObject: jsonSchemaTransformObject
40
53
  });
41
54
  apiServer.register(fastifySwaggerUI, {
42
55
  routePrefix: "/documentation",
43
56
  logo: {
44
57
  type: "image/svg+xml",
45
- content: Buffer.from("PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAxMjAgNDAiIGZpbGw9Im5vbmUiPjx0ZXh0IHg9IjAiIHk9IjI4IiBmb250LWZhbWlseT0iU3BhY2UgR3JvdGVzaywgc3lzdGVtLXVpLCBzYW5zLXNlcmlmIiBmb250LXNpemU9IjI0IiBmb250LXdlaWdodD0iNzAwIiBmaWxsPSIjZmFmYWZhIj5Lb3BhaTwvdGV4dD48L3N2Zz4K", "base64"),
58
+ content: Buffer.from("PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAxNjAgNDAiIGZpbGw9Im5vbmUiPjx0ZXh0IHg9IjAiIHk9IjI4IiBmb250LWZhbWlseT0idWktbW9ub3NwYWNlLCBtb25vc3BhY2UiIGZvbnQtc2l6ZT0iMjAiIGZvbnQtd2VpZ2h0PSI0MDAiIGZpbGw9IiNmYWZhZmEiPnwtLWsmZ3Q7IGtvcGFpPC90ZXh0Pjwvc3ZnPg==", "base64"),
46
59
  href: "/documentation",
47
60
  target: "_blank"
48
61
  },
@@ -51,13 +64,24 @@ apiServer.register(fastifySwaggerUI, {
51
64
  rel: "icon",
52
65
  sizes: "32x32",
53
66
  type: "image/svg+xml",
54
- content: Buffer.from("PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAzMiAzMiIgZmlsbD0ibm9uZSI+PHJlY3Qgd2lkdGg9IjMyIiBoZWlnaHQ9IjMyIiByeD0iNCIgZmlsbD0iIzBhMGEwYSIvPjx0ZXh0IHg9IjQiIHk9IjIzIiBmb250LWZhbWlseT0ic3lzdGVtLXVpLCBzYW5zLXNlcmlmIiBmb250LXNpemU9IjE4IiBmb250LXdlaWdodD0iNzAwIiBmaWxsPSIjZmFmYWZhIj5LPC90ZXh0Pjwvc3ZnPgo=", "base64")
67
+ content: Buffer.from("PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAzMiAzMiIgZmlsbD0ibm9uZSI+PHJlY3Qgd2lkdGg9IjMyIiBoZWlnaHQ9IjMyIiByeD0iNCIgZmlsbD0iIzBhMGEwYSIvPjx0ZXh0IHg9IjMiIHk9IjIyIiBmb250LWZhbWlseT0idWktbW9ub3NwYWNlLCBtb25vc3BhY2UiIGZvbnQtc2l6ZT0iMTYiIGZvbnQtd2VpZ2h0PSI0MDAiIGZpbGw9IiNmYWZhZmEiPmsmZ3Q7PC90ZXh0Pjwvc3ZnPg==", "base64")
55
68
  }] }
56
69
  });
57
70
  const sqliteDatabase = initializeDatabase(env.SQLITE_DB_FILE_PATH);
58
71
  const telemetryDatasource = createOptimizedDatasource(sqliteDatabase);
59
72
  apiServer.after(() => {
60
73
  apiServer.register(apiRoutes, { readTelemetryDatasource: telemetryDatasource });
74
+ apiServer.register(async (fastify) => {
75
+ await fastify.register(FastifyVite, {
76
+ root: resolve(import.meta.dirname, ".."),
77
+ distDir: resolve(import.meta.dirname, "..", "dist", "client"),
78
+ dev: false,
79
+ spa: true
80
+ });
81
+ fastify.get("/", (_req, reply) => reply.html());
82
+ fastify.get("/*", (_req, reply) => reply.html());
83
+ await fastify.vite.ready();
84
+ });
61
85
  });
62
86
  const collectorServer = fastify({ logger: true });
63
87
  collectorServer.setValidatorCompiler(validatorCompiler);
@@ -66,7 +90,7 @@ collectorServer.after(() => {
66
90
  collectorServer.register(otelCollectorRoutes, { telemetryDatasource });
67
91
  });
68
92
  async function run() {
69
- console.log(`@kopai/app v${version}`);
93
+ console.log(`|--k> kopai\nv${version}`);
70
94
  await apiServer.ready();
71
95
  const host = env.HOST || "localhost";
72
96
  const port = env.PORT;
@@ -114,4 +138,4 @@ closeWithGrace(async ({ signal, err }) => {
114
138
 
115
139
  //#endregion
116
140
  export { };
117
- //# sourceMappingURL=server-2JXtBWDI.mjs.map
141
+ //# sourceMappingURL=server-DyiECISu.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server-DyiECISu.mjs","names":[],"sources":["../src/routes/index.ts","../src/collector/index.ts","../src/server.ts"],"sourcesContent":["import type { FastifyPluginAsyncZod } from \"fastify-type-provider-zod\";\nimport { signalsRoutes } from \"@kopai/api\";\nimport { type datasource } from \"@kopai/core\";\n\nexport const apiRoutes: FastifyPluginAsyncZod<{\n readTelemetryDatasource: datasource.ReadTelemetryDatasource;\n}> = async function (fastify, opts) {\n fastify.register(signalsRoutes, {\n readTelemetryDatasource: opts.readTelemetryDatasource,\n });\n};\n","import type { FastifyPluginAsyncZod } from \"fastify-type-provider-zod\";\nimport { collectorRoutes } from \"@kopai/collector\";\nimport type { datasource } from \"@kopai/core\";\n\nexport const otelCollectorRoutes: FastifyPluginAsyncZod<{\n telemetryDatasource: datasource.WriteTelemetryDatasource;\n}> = async function (fastify, opts) {\n fastify.register(collectorRoutes, opts);\n};\n","import fastify from \"fastify\";\nimport {\n jsonSchemaTransformObject,\n jsonSchemaTransform,\n serializerCompiler,\n validatorCompiler,\n} from \"fastify-type-provider-zod\";\nimport fastifySwagger from \"@fastify/swagger\";\nimport fastifySwaggerUI from \"@fastify/swagger-ui\";\nimport closeWithGrace from \"close-with-grace\";\n\nimport { env } from \"./config.js\";\nimport { version } from \"./version.js\";\nimport { apiRoutes } from \"./routes/index.js\";\nimport { otelCollectorRoutes } from \"./collector/index.js\";\nimport {\n initializeDatabase,\n createOptimizedDatasource,\n} from \"@kopai/sqlite-datasource\";\nimport { resolve } from \"node:path\";\nimport FastifyVite from \"@fastify/vite\";\n\nconst apiServer = fastify({\n logger: true,\n});\n\n// Add schema validator and serializer\napiServer.setValidatorCompiler(validatorCompiler);\napiServer.setSerializerCompiler(serializerCompiler);\n\nconst uiRoutes = [\"/\", \"/*\"];\napiServer.register(fastifySwagger, {\n openapi: {\n info: {\n title: \"Kopai App\",\n description: \"Kopai App documentation\",\n version,\n },\n servers: [],\n },\n transform: ({ schema, url, ...rest }) => {\n if (uiRoutes.includes(url)) return { schema: { hide: true }, url };\n return jsonSchemaTransform({ schema, url, ...rest });\n },\n transformObject: jsonSchemaTransformObject,\n});\n\napiServer.register(fastifySwaggerUI, {\n routePrefix: \"/documentation\",\n logo: {\n type: \"image/svg+xml\",\n content: Buffer.from(\n \"PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAxNjAgNDAiIGZpbGw9Im5vbmUiPjx0ZXh0IHg9IjAiIHk9IjI4IiBmb250LWZhbWlseT0idWktbW9ub3NwYWNlLCBtb25vc3BhY2UiIGZvbnQtc2l6ZT0iMjAiIGZvbnQtd2VpZ2h0PSI0MDAiIGZpbGw9IiNmYWZhZmEiPnwtLWsmZ3Q7IGtvcGFpPC90ZXh0Pjwvc3ZnPg==\",\n \"base64\"\n ),\n href: \"/documentation\",\n target: \"_blank\",\n },\n theme: {\n favicon: [\n {\n filename: \"favicon.svg\",\n rel: \"icon\",\n sizes: \"32x32\",\n type: \"image/svg+xml\",\n content: Buffer.from(\n \"PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAzMiAzMiIgZmlsbD0ibm9uZSI+PHJlY3Qgd2lkdGg9IjMyIiBoZWlnaHQ9IjMyIiByeD0iNCIgZmlsbD0iIzBhMGEwYSIvPjx0ZXh0IHg9IjMiIHk9IjIyIiBmb250LWZhbWlseT0idWktbW9ub3NwYWNlLCBtb25vc3BhY2UiIGZvbnQtc2l6ZT0iMTYiIGZvbnQtd2VpZ2h0PSI0MDAiIGZpbGw9IiNmYWZhZmEiPmsmZ3Q7PC90ZXh0Pjwvc3ZnPg==\",\n \"base64\"\n ),\n },\n ],\n },\n});\n\nconst sqliteDatabase = initializeDatabase(env.SQLITE_DB_FILE_PATH);\nconst telemetryDatasource = createOptimizedDatasource(sqliteDatabase);\n\napiServer.after(() => {\n apiServer.register(apiRoutes, {\n readTelemetryDatasource: telemetryDatasource,\n });\n apiServer.register(async (fastify) => {\n await fastify.register(FastifyVite, {\n root: resolve(import.meta.dirname, \"..\"),\n distDir: resolve(import.meta.dirname, \"..\", \"dist\", \"client\"),\n dev: false,\n spa: true,\n });\n fastify.get(\"/\", (_req, reply) => reply.html());\n fastify.get(\"/*\", (_req, reply) => reply.html());\n await fastify.vite.ready();\n });\n});\n\nconst collectorServer = fastify({\n logger: true,\n});\n\ncollectorServer.setValidatorCompiler(validatorCompiler);\ncollectorServer.setSerializerCompiler(serializerCompiler);\n\ncollectorServer.after(() => {\n collectorServer.register(otelCollectorRoutes, {\n telemetryDatasource,\n });\n});\n\nasync function run() {\n console.log(`|--k> kopai\\nv${version}`);\n\n await apiServer.ready();\n\n const host = env.HOST || \"localhost\";\n const port = env.PORT;\n const STANDARD_OTEL_HTTP_COLLECTOR_PORT = 4318;\n\n apiServer.listen(\n {\n port,\n host,\n listenTextResolver(address) {\n return `API server listening at ${address}`;\n },\n },\n (err, address) => {\n if (err) {\n console.error(err);\n process.exit(1);\n }\n apiServer.log.info(\n `API server documentation available at ${address}/documentation`\n );\n }\n );\n\n await collectorServer.ready();\n\n collectorServer.listen(\n {\n port: STANDARD_OTEL_HTTP_COLLECTOR_PORT,\n host,\n listenTextResolver(address) {\n return `OTEL collector server listening at ${address}:${STANDARD_OTEL_HTTP_COLLECTOR_PORT}`;\n },\n },\n (err) => {\n if (err) {\n console.error(err);\n process.exit(1);\n }\n }\n );\n}\n\nrun();\n\ncloseWithGrace(async ({ signal, err }) => {\n if (err) {\n collectorServer.log.fatal(\n { err },\n \"Closing OTEL collector server with error\"\n );\n apiServer.log.fatal({ err }, \"Closing API server with error\");\n } else {\n collectorServer.log.info(\n `Received signal ${signal}, closing OTEL collector server`\n );\n apiServer.log.info(`Received signal ${signal}, closing API server`);\n }\n\n await collectorServer.close();\n sqliteDatabase?.close();\n await apiServer.close();\n});\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kopai/app",
3
- "version": "0.5.0",
3
+ "version": "0.6.0",
4
4
  "description": "Local OpenTelemetry backend for testing instrumentation - no Docker, no config, just npx",
5
5
  "keywords": [
6
6
  "opentelemetry",
@@ -47,6 +47,7 @@
47
47
  "dist"
48
48
  ],
49
49
  "dependencies": {
50
+ "@fastify/vite": "^8.1.0",
50
51
  "@fastify/swagger": "^9.7.0",
51
52
  "@fastify/swagger-ui": "^5.2.5",
52
53
  "close-with-grace": "^2.4.0",
@@ -55,16 +56,27 @@
55
56
  "zod": "^4.3.6",
56
57
  "@kopai/api": "0.2.3",
57
58
  "@kopai/collector": "0.4.0",
58
- "@kopai/sqlite-datasource": "0.5.0",
59
- "@kopai/core": "0.5.0"
59
+ "@kopai/core": "0.5.0",
60
+ "@kopai/sqlite-datasource": "0.6.0",
61
+ "@kopai/ui": "0.1.0"
60
62
  },
61
63
  "devDependencies": {
64
+ "@types/react": "^19.2.10",
65
+ "@types/react-dom": "^19.1.0",
66
+ "@vitejs/plugin-react": "^4.5.2",
67
+ "autoprefixer": "^10.4.20",
68
+ "postcss": "^8.5.3",
69
+ "react": "^19.2.4",
70
+ "react-dom": "^19.2.4",
71
+ "tailwindcss": "^3.4.17",
62
72
  "tsdown": "^0.20.3",
63
73
  "typescript": "^5.9.3",
74
+ "vite": "^6.3.5",
64
75
  "@kopai/tsconfig": "0.2.0"
65
76
  },
66
77
  "scripts": {
67
- "build": "tsdown",
78
+ "build": "tsdown && vite build",
79
+ "build:client": "vite build",
68
80
  "dev": "node --env-file-if-exists=.env ./dist/cli.mjs start",
69
81
  "lint": "eslint src",
70
82
  "type-check": "tsc --noEmit",
@@ -1 +0,0 @@
1
- {"version":3,"file":"server-2JXtBWDI.mjs","names":[],"sources":["../src/routes/index.ts","../src/collector/index.ts","../src/server.ts"],"sourcesContent":["import type { FastifyPluginAsyncZod } from \"fastify-type-provider-zod\";\nimport { signalsRoutes } from \"@kopai/api\";\nimport { type datasource } from \"@kopai/core\";\n\nexport const apiRoutes: FastifyPluginAsyncZod<{\n readTelemetryDatasource: datasource.ReadTelemetryDatasource;\n}> = async function (fastify, opts) {\n fastify.register(signalsRoutes, {\n readTelemetryDatasource: opts.readTelemetryDatasource,\n });\n};\n","import type { FastifyPluginAsyncZod } from \"fastify-type-provider-zod\";\nimport { collectorRoutes } from \"@kopai/collector\";\nimport type { datasource } from \"@kopai/core\";\n\nexport const otelCollectorRoutes: FastifyPluginAsyncZod<{\n telemetryDatasource: datasource.WriteTelemetryDatasource;\n}> = async function (fastify, opts) {\n fastify.register(collectorRoutes, opts);\n};\n","import fastify from \"fastify\";\nimport {\n jsonSchemaTransformObject,\n jsonSchemaTransform,\n serializerCompiler,\n validatorCompiler,\n} from \"fastify-type-provider-zod\";\nimport fastifySwagger from \"@fastify/swagger\";\nimport fastifySwaggerUI from \"@fastify/swagger-ui\";\nimport closeWithGrace from \"close-with-grace\";\n\nimport { env } from \"./config.js\";\nimport { version } from \"./version.js\";\nimport { apiRoutes } from \"./routes/index.js\";\nimport { otelCollectorRoutes } from \"./collector/index.js\";\nimport {\n initializeDatabase,\n createOptimizedDatasource,\n} from \"@kopai/sqlite-datasource\";\n\nconst apiServer = fastify({\n logger: true,\n});\n\n// Add schema validator and serializer\napiServer.setValidatorCompiler(validatorCompiler);\napiServer.setSerializerCompiler(serializerCompiler);\n\napiServer.register(fastifySwagger, {\n openapi: {\n info: {\n title: \"Kopai App\",\n description: \"Kopai App documentation\",\n version,\n },\n servers: [],\n },\n transform: jsonSchemaTransform,\n transformObject: jsonSchemaTransformObject,\n});\n\napiServer.register(fastifySwaggerUI, {\n routePrefix: \"/documentation\",\n logo: {\n type: \"image/svg+xml\",\n content: Buffer.from(\n \"PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAxMjAgNDAiIGZpbGw9Im5vbmUiPjx0ZXh0IHg9IjAiIHk9IjI4IiBmb250LWZhbWlseT0iU3BhY2UgR3JvdGVzaywgc3lzdGVtLXVpLCBzYW5zLXNlcmlmIiBmb250LXNpemU9IjI0IiBmb250LXdlaWdodD0iNzAwIiBmaWxsPSIjZmFmYWZhIj5Lb3BhaTwvdGV4dD48L3N2Zz4K\",\n \"base64\"\n ),\n href: \"/documentation\",\n target: \"_blank\",\n },\n theme: {\n favicon: [\n {\n filename: \"favicon.svg\",\n rel: \"icon\",\n sizes: \"32x32\",\n type: \"image/svg+xml\",\n content: Buffer.from(\n \"PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAzMiAzMiIgZmlsbD0ibm9uZSI+PHJlY3Qgd2lkdGg9IjMyIiBoZWlnaHQ9IjMyIiByeD0iNCIgZmlsbD0iIzBhMGEwYSIvPjx0ZXh0IHg9IjQiIHk9IjIzIiBmb250LWZhbWlseT0ic3lzdGVtLXVpLCBzYW5zLXNlcmlmIiBmb250LXNpemU9IjE4IiBmb250LXdlaWdodD0iNzAwIiBmaWxsPSIjZmFmYWZhIj5LPC90ZXh0Pjwvc3ZnPgo=\",\n \"base64\"\n ),\n },\n ],\n },\n});\n\nconst sqliteDatabase = initializeDatabase(env.SQLITE_DB_FILE_PATH);\nconst telemetryDatasource = createOptimizedDatasource(sqliteDatabase);\n\napiServer.after(() => {\n apiServer.register(apiRoutes, {\n readTelemetryDatasource: telemetryDatasource,\n });\n});\n\nconst collectorServer = fastify({\n logger: true,\n});\n\ncollectorServer.setValidatorCompiler(validatorCompiler);\ncollectorServer.setSerializerCompiler(serializerCompiler);\n\ncollectorServer.after(() => {\n collectorServer.register(otelCollectorRoutes, {\n telemetryDatasource,\n });\n});\n\nasync function run() {\n console.log(`@kopai/app v${version}`);\n\n await apiServer.ready();\n\n const host = env.HOST || \"localhost\";\n const port = env.PORT;\n const STANDARD_OTEL_HTTP_COLLECTOR_PORT = 4318;\n\n apiServer.listen(\n {\n port,\n host,\n listenTextResolver(address) {\n return `API server listening at ${address}`;\n },\n },\n (err, address) => {\n if (err) {\n console.error(err);\n process.exit(1);\n }\n apiServer.log.info(\n `API server documentation available at ${address}/documentation`\n );\n }\n );\n\n await collectorServer.ready();\n\n collectorServer.listen(\n {\n port: STANDARD_OTEL_HTTP_COLLECTOR_PORT,\n host,\n listenTextResolver(address) {\n return `OTEL collector server listening at ${address}:${STANDARD_OTEL_HTTP_COLLECTOR_PORT}`;\n },\n },\n (err) => {\n if (err) {\n console.error(err);\n process.exit(1);\n }\n }\n );\n}\n\nrun();\n\ncloseWithGrace(async ({ signal, err }) => {\n if (err) {\n collectorServer.log.fatal(\n { err },\n \"Closing OTEL collector server with error\"\n );\n apiServer.log.fatal({ err }, \"Closing API server with error\");\n } else {\n collectorServer.log.info(\n `Received signal ${signal}, closing OTEL collector server`\n );\n apiServer.log.info(`Received signal ${signal}, closing API server`);\n }\n\n await collectorServer.close();\n sqliteDatabase?.close();\n await apiServer.close();\n});\n"],"mappings":";;;;;;;;;;;;;AAIA,MAAa,YAER,eAAgB,SAAS,MAAM;AAClC,SAAQ,SAAS,eAAe,EAC9B,yBAAyB,KAAK,yBAC/B,CAAC;;;;;ACLJ,MAAa,sBAER,eAAgB,SAAS,MAAM;AAClC,SAAQ,SAAS,iBAAiB,KAAK;;;;;ACazC,MAAM,YAAY,QAAQ,EACxB,QAAQ,MACT,CAAC;AAGF,UAAU,qBAAqB,kBAAkB;AACjD,UAAU,sBAAsB,mBAAmB;AAEnD,UAAU,SAAS,gBAAgB;CACjC,SAAS;EACP,MAAM;GACJ,OAAO;GACP,aAAa;GACb;GACD;EACD,SAAS,EAAE;EACZ;CACD,WAAW;CACX,iBAAiB;CAClB,CAAC;AAEF,UAAU,SAAS,kBAAkB;CACnC,aAAa;CACb,MAAM;EACJ,MAAM;EACN,SAAS,OAAO,KACd,4RACA,SACD;EACD,MAAM;EACN,QAAQ;EACT;CACD,OAAO,EACL,SAAS,CACP;EACE,UAAU;EACV,KAAK;EACL,OAAO;EACP,MAAM;EACN,SAAS,OAAO,KACd,wUACA,SACD;EACF,CACF,EACF;CACF,CAAC;AAEF,MAAM,iBAAiB,mBAAmB,IAAI,oBAAoB;AAClE,MAAM,sBAAsB,0BAA0B,eAAe;AAErE,UAAU,YAAY;AACpB,WAAU,SAAS,WAAW,EAC5B,yBAAyB,qBAC1B,CAAC;EACF;AAEF,MAAM,kBAAkB,QAAQ,EAC9B,QAAQ,MACT,CAAC;AAEF,gBAAgB,qBAAqB,kBAAkB;AACvD,gBAAgB,sBAAsB,mBAAmB;AAEzD,gBAAgB,YAAY;AAC1B,iBAAgB,SAAS,qBAAqB,EAC5C,qBACD,CAAC;EACF;AAEF,eAAe,MAAM;AACnB,SAAQ,IAAI,eAAe,UAAU;AAErC,OAAM,UAAU,OAAO;CAEvB,MAAM,OAAO,IAAI,QAAQ;CACzB,MAAM,OAAO,IAAI;CACjB,MAAM,oCAAoC;AAE1C,WAAU,OACR;EACE;EACA;EACA,mBAAmB,SAAS;AAC1B,UAAO,2BAA2B;;EAErC,GACA,KAAK,YAAY;AAChB,MAAI,KAAK;AACP,WAAQ,MAAM,IAAI;AAClB,WAAQ,KAAK,EAAE;;AAEjB,YAAU,IAAI,KACZ,yCAAyC,QAAQ,gBAClD;GAEJ;AAED,OAAM,gBAAgB,OAAO;AAE7B,iBAAgB,OACd;EACE,MAAM;EACN;EACA,mBAAmB,SAAS;AAC1B,UAAO,sCAAsC,QAAQ,GAAG;;EAE3D,GACA,QAAQ;AACP,MAAI,KAAK;AACP,WAAQ,MAAM,IAAI;AAClB,WAAQ,KAAK,EAAE;;GAGpB;;AAGH,KAAK;AAEL,eAAe,OAAO,EAAE,QAAQ,UAAU;AACxC,KAAI,KAAK;AACP,kBAAgB,IAAI,MAClB,EAAE,KAAK,EACP,2CACD;AACD,YAAU,IAAI,MAAM,EAAE,KAAK,EAAE,gCAAgC;QACxD;AACL,kBAAgB,IAAI,KAClB,mBAAmB,OAAO,iCAC3B;AACD,YAAU,IAAI,KAAK,mBAAmB,OAAO,sBAAsB;;AAGrE,OAAM,gBAAgB,OAAO;AAC7B,iBAAgB,OAAO;AACvB,OAAM,UAAU,OAAO;EACvB"}