@uptimizr/collector-server 0.8.0 → 1.0.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.
- package/README.md +10 -2
- package/dist/mssqlStore.d.ts +22 -0
- package/dist/mssqlStore.d.ts.map +1 -0
- package/dist/mssqlStore.js +120 -0
- package/dist/mssqlStore.js.map +1 -0
- package/dist/postgresStore.d.ts +20 -0
- package/dist/postgresStore.d.ts.map +1 -0
- package/dist/postgresStore.js +116 -0
- package/dist/postgresStore.js.map +1 -0
- package/dist/serve.d.ts +8 -0
- package/dist/serve.d.ts.map +1 -1
- package/dist/serve.js +14 -0
- package/dist/serve.js.map +1 -1
- package/package.json +6 -4
package/README.md
CHANGED
|
@@ -185,14 +185,22 @@ The storage backend is chosen with `COLLECTOR_STORE`:
|
|
|
185
185
|
instance per file; back up by copying the file.
|
|
186
186
|
- `memory` — a dependency-free in-memory store for local dev / E2E only (seed its
|
|
187
187
|
project/key via `COLLECTOR_MEMORY_PROJECT_ID` / `COLLECTOR_MEMORY_API_KEY`).
|
|
188
|
+
- `postgres` — a **single-tenant Postgres store** (`@uptimizr/db-postgres`): events **and**
|
|
189
|
+
metadata in one Postgres database (`POSTGRES_URL` / `DATABASE_URL`, optional `POSTGRES_SCHEMA`,
|
|
190
|
+
`POSTGRES_POOL_MAX`). Multi-writer; identical analytics results (parity suite).
|
|
191
|
+
- `mssql` — a **single-tenant Microsoft SQL Server store** (`@uptimizr/db-mssql`): events **and**
|
|
192
|
+
metadata in one SQL Server / Azure SQL database (`MSSQL_URL`, or `MSSQL_SERVER` / `MSSQL_PORT` /
|
|
193
|
+
`MSSQL_DATABASE` / `MSSQL_USER` / `MSSQL_PASSWORD`), created on first boot. Multi-writer;
|
|
194
|
+
identical analytics results (parity suite); SQL Server 2022+ / Azure SQL.
|
|
188
195
|
- `clickhouse` — a **single-tenant ClickHouse store** for the scale tier: events **and**
|
|
189
196
|
metadata (projects, API keys, scene representations) live in one ClickHouse database
|
|
190
197
|
(`CLICKHOUSE_URL` / `CLICKHOUSE_DATABASE` / `CLICKHOUSE_USER` / `CLICKHOUSE_PASSWORD`), created
|
|
191
198
|
on first boot. Use it for concurrent writers / horizontal scale and high-volume ingestion. The
|
|
192
199
|
full analytics surface returns results identical to DuckDB (cross-engine parity suite).
|
|
193
200
|
|
|
194
|
-
For multi-writer / horizontal scale, choose the `clickhouse` store; spin
|
|
195
|
-
with `infra/docker` (`pnpm stack:up`). The default DuckDB store needs no external
|
|
201
|
+
For multi-writer / horizontal scale, choose the `postgres`, `mssql` or `clickhouse` store; spin
|
|
202
|
+
up local servers with `infra/docker` (`pnpm stack:up`). The default DuckDB store needs no external
|
|
203
|
+
service.
|
|
196
204
|
|
|
197
205
|
## Develop
|
|
198
206
|
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { CollectorStore } from "./store.js";
|
|
2
|
+
/**
|
|
3
|
+
* Optional single-tenant Microsoft SQL Server store (ADR 0020, #85): the
|
|
4
|
+
* relational, multi-writer path for self-hosters standardized on SQL Server /
|
|
5
|
+
* Azure SQL who have outgrown DuckDB's single read-write process. It carries
|
|
6
|
+
* the **full** analytics surface — no stubbed aggregates — by rendering the same
|
|
7
|
+
* dialect-agnostic builders with {@link mssqlDialect} (vectors as JSON, ASOF
|
|
8
|
+
* joins emulated via `CROSS`/`OUTER APPLY`, daily rollups recomputed at query
|
|
9
|
+
* time) and executing them over a pooled `mssql` (tedious) connection. Events
|
|
10
|
+
* live in the wide `events` table (plus the dedicated `node_samples`); metadata
|
|
11
|
+
* (projects, API keys, scene registry) is re-homed into the same database.
|
|
12
|
+
*
|
|
13
|
+
* The database is created on first boot when the login may (`CREATE ANY
|
|
14
|
+
* DATABASE`), and the schema is migrated on creation (migrations are
|
|
15
|
+
* idempotent, forward-only and serialized behind an application lock, so
|
|
16
|
+
* several collector instances can boot against one database). Connection
|
|
17
|
+
* settings come from `readDbSettings().mssql` (`MSSQL_URL`, or `MSSQL_SERVER` /
|
|
18
|
+
* `MSSQL_PORT` / `MSSQL_DATABASE` / `MSSQL_USER` / `MSSQL_PASSWORD` with
|
|
19
|
+
* `MSSQL_ENCRYPT` / `MSSQL_TRUST_SERVER_CERTIFICATE`, plus `MSSQL_POOL_MAX`).
|
|
20
|
+
*/
|
|
21
|
+
export declare function createMssqlStore(): Promise<CollectorStore>;
|
|
22
|
+
//# sourceMappingURL=mssqlStore.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mssqlStore.d.ts","sourceRoot":"","sources":["../src/mssqlStore.ts"],"names":[],"mappings":"AAqJA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAEjD;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,cAAc,CAAC,CAwLhE"}
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
import { buildCameraDirectionHeatmap, buildViewCoverageHistogram, buildCameraDistance, buildCameraPositionHeatmap, buildClickGazeRay, buildDeadClicks, buildRageClicks, buildHoverDwell, buildCompileStalls, buildArPlacementTimeToPlace, buildArPlacementAttempts, buildArPlacementSurfaces, buildResourceSummary, buildCapabilityChanges, buildCameraGestures, buildDistinctScenes, buildEventTypeCounts, buildFlowHeatmap, buildFunnel, buildSceneRetention, buildLoadBounceFunnel, buildVariantLeaderboard, buildListSessions, buildNavigationStats, buildBacktrackRatio, buildXrRotationRate, buildXrSourceUsage, buildXrAbandonment, buildXrLocomotionComfort, buildTrackingQuality, buildInteractionsBySource, buildMeshDwell, buildMeshBlindSpots, buildMeshInteractionKinds, buildReachability, buildPerfSummary, buildPerfDistribution, buildFpsHistogram, buildFrameTimePercentiles, buildJankRate, buildPerfChurn, buildPerfByDevice, buildPerfByScene, buildResourcePercentiles, buildStabilityCounts, buildGraphicsDiagnosticCounts, buildErrorHeatmap, buildBoundaryHeatmap, buildBoundaryHeatmapStats, buildBoundaryContacts, buildRenderingTechnology, buildPointerHeatmap, buildMeshUvHeatmap, buildSceneCoverage, buildPerfHeatmap, buildSessionTrajectory, buildAggregateTrajectories, buildRenderScaleTruth, buildTimeseries, buildTopMeshes, buildTopMeshesBySource, buildTopMeshesTrend, buildTopInputActions, buildWorldHeatmap, buildWorldHeatmapStats, buildGazeHeatmap, buildGazeHeatmapStats, mssqlDialect, readDbSettings, } from "@uptimizr/db";
|
|
2
|
+
import { createMssqlClient, ensureMssqlDatabase, migrateMssql, resolveMssqlConfig, runMssqlQuery, insertEvents as msInsertEvents, getSessionEvents as msGetSessionEvents, streamSessionEvents as msStreamSessionEvents, getSessionMeta as msGetSessionMeta, getProject as msGetProject, resolveApiKey as msResolveApiKey, upsertSceneProxy as msUpsertSceneProxy, getSceneRepresentation as msGetSceneRepresentation, listSceneRepresentations as msListSceneRepresentations, } from "@uptimizr/db-mssql";
|
|
3
|
+
/**
|
|
4
|
+
* Optional single-tenant Microsoft SQL Server store (ADR 0020, #85): the
|
|
5
|
+
* relational, multi-writer path for self-hosters standardized on SQL Server /
|
|
6
|
+
* Azure SQL who have outgrown DuckDB's single read-write process. It carries
|
|
7
|
+
* the **full** analytics surface — no stubbed aggregates — by rendering the same
|
|
8
|
+
* dialect-agnostic builders with {@link mssqlDialect} (vectors as JSON, ASOF
|
|
9
|
+
* joins emulated via `CROSS`/`OUTER APPLY`, daily rollups recomputed at query
|
|
10
|
+
* time) and executing them over a pooled `mssql` (tedious) connection. Events
|
|
11
|
+
* live in the wide `events` table (plus the dedicated `node_samples`); metadata
|
|
12
|
+
* (projects, API keys, scene registry) is re-homed into the same database.
|
|
13
|
+
*
|
|
14
|
+
* The database is created on first boot when the login may (`CREATE ANY
|
|
15
|
+
* DATABASE`), and the schema is migrated on creation (migrations are
|
|
16
|
+
* idempotent, forward-only and serialized behind an application lock, so
|
|
17
|
+
* several collector instances can boot against one database). Connection
|
|
18
|
+
* settings come from `readDbSettings().mssql` (`MSSQL_URL`, or `MSSQL_SERVER` /
|
|
19
|
+
* `MSSQL_PORT` / `MSSQL_DATABASE` / `MSSQL_USER` / `MSSQL_PASSWORD` with
|
|
20
|
+
* `MSSQL_ENCRYPT` / `MSSQL_TRUST_SERVER_CERTIFICATE`, plus `MSSQL_POOL_MAX`).
|
|
21
|
+
*/
|
|
22
|
+
export async function createMssqlStore() {
|
|
23
|
+
const settings = readDbSettings().mssql;
|
|
24
|
+
const database = resolveMssqlConfig(settings).database ?? settings.database;
|
|
25
|
+
await ensureMssqlDatabase(settings, database);
|
|
26
|
+
const msc = createMssqlClient(settings);
|
|
27
|
+
await migrateMssql(msc);
|
|
28
|
+
const d = mssqlDialect;
|
|
29
|
+
return {
|
|
30
|
+
resolveApiKey: (key) => msResolveApiKey(msc, key),
|
|
31
|
+
projectExists: async (projectId) => (await msGetProject(msc, projectId)) !== null,
|
|
32
|
+
insertEvents: (events) => msInsertEvents(msc, [...events]),
|
|
33
|
+
listSessions: (projectId, opts = {}) => runMssqlQuery(msc, buildListSessions(projectId, opts, d)),
|
|
34
|
+
pointerHeatmap: (projectId, opts = {}) => runMssqlQuery(msc, buildPointerHeatmap(projectId, opts, d)),
|
|
35
|
+
meshUvHeatmap: (projectId, opts = {}) => runMssqlQuery(msc, buildMeshUvHeatmap(projectId, opts, d)),
|
|
36
|
+
worldHeatmap: (projectId, opts = {}) => runMssqlQuery(msc, buildWorldHeatmap(projectId, opts, d)),
|
|
37
|
+
worldHeatmapStats: async (projectId, opts = {}) => {
|
|
38
|
+
const rows = await runMssqlQuery(msc, buildWorldHeatmapStats(projectId, opts, d));
|
|
39
|
+
return rows[0] ?? { cells: 0, hits: 0 };
|
|
40
|
+
},
|
|
41
|
+
gazeHeatmap: (projectId, opts = {}) => runMssqlQuery(msc, buildGazeHeatmap(projectId, opts, d)),
|
|
42
|
+
gazeHeatmapStats: async (projectId, opts = {}) => {
|
|
43
|
+
const rows = await runMssqlQuery(msc, buildGazeHeatmapStats(projectId, opts, d));
|
|
44
|
+
return rows[0] ?? { cells: 0, hits: 0 };
|
|
45
|
+
},
|
|
46
|
+
cameraHeatmap: (projectId, opts = {}) => runMssqlQuery(msc, buildCameraDirectionHeatmap(projectId, opts, d)),
|
|
47
|
+
viewCoverageHistogram: (projectId, opts = {}) => runMssqlQuery(msc, buildViewCoverageHistogram(projectId, opts, d)),
|
|
48
|
+
cameraPositionHeatmap: (projectId, opts = {}) => runMssqlQuery(msc, buildCameraPositionHeatmap(projectId, opts, d)),
|
|
49
|
+
sessionTrajectory: (projectId, sessionId, opts = {}) => runMssqlQuery(msc, buildSessionTrajectory(projectId, { ...opts, session: sessionId }, d)),
|
|
50
|
+
aggregateTrajectories: (projectId, opts = {}) => runMssqlQuery(msc, buildAggregateTrajectories(projectId, opts, d)),
|
|
51
|
+
clickGazeRays: (projectId, opts = {}) => runMssqlQuery(msc, buildClickGazeRay(projectId, opts, d)),
|
|
52
|
+
flowHeatmap: (projectId, opts = {}) => runMssqlQuery(msc, buildFlowHeatmap(projectId, opts, d)),
|
|
53
|
+
topMeshes: (projectId, opts = {}) => runMssqlQuery(msc, buildTopMeshes(projectId, opts, d)),
|
|
54
|
+
topMeshesBySource: (projectId, opts = {}) => runMssqlQuery(msc, buildTopMeshesBySource(projectId, opts, d)),
|
|
55
|
+
topMeshesTrend: (projectId, opts = {}) => runMssqlQuery(msc, buildTopMeshesTrend(projectId, opts, d)),
|
|
56
|
+
meshDwell: (projectId, opts = {}) => runMssqlQuery(msc, buildMeshDwell(projectId, opts, d)),
|
|
57
|
+
meshBlindSpots: (projectId, opts = {}) => runMssqlQuery(msc, buildMeshBlindSpots(projectId, opts, d)),
|
|
58
|
+
meshInteractionKinds: (projectId, opts = {}) => runMssqlQuery(msc, buildMeshInteractionKinds(projectId, opts, d)),
|
|
59
|
+
reachability: (projectId, opts = {}) => runMssqlQuery(msc, buildReachability(projectId, opts, d)),
|
|
60
|
+
deadClicks: (projectId, opts = {}) => runMssqlQuery(msc, buildDeadClicks(projectId, opts, d)),
|
|
61
|
+
rageClicks: (projectId, opts = {}) => runMssqlQuery(msc, buildRageClicks(projectId, opts, d)),
|
|
62
|
+
hoverDwell: (projectId, opts = {}) => runMssqlQuery(msc, buildHoverDwell(projectId, opts, d)),
|
|
63
|
+
compileStalls: (projectId, opts = {}) => runMssqlQuery(msc, buildCompileStalls(projectId, opts, d)),
|
|
64
|
+
arPlacementTimeToPlace: (projectId, opts = {}) => runMssqlQuery(msc, buildArPlacementTimeToPlace(projectId, opts, d)),
|
|
65
|
+
arPlacementAttempts: (projectId, opts = {}) => runMssqlQuery(msc, buildArPlacementAttempts(projectId, opts, d)),
|
|
66
|
+
arPlacementSurfaces: (projectId, opts = {}) => runMssqlQuery(msc, buildArPlacementSurfaces(projectId, opts, d)),
|
|
67
|
+
resourceSummary: (projectId, opts = {}) => runMssqlQuery(msc, buildResourceSummary(projectId, opts, d)),
|
|
68
|
+
capabilityChanges: (projectId, opts = {}) => runMssqlQuery(msc, buildCapabilityChanges(projectId, opts, d)),
|
|
69
|
+
cameraGestures: (projectId, opts = {}) => runMssqlQuery(msc, buildCameraGestures(projectId, opts, d)),
|
|
70
|
+
perfSummary: (projectId, opts = {}) => runMssqlQuery(msc, buildPerfSummary(projectId, opts, d)),
|
|
71
|
+
renderScaleTruth: (projectId, opts = {}) => runMssqlQuery(msc, buildRenderScaleTruth(projectId, opts, d)),
|
|
72
|
+
perfDistribution: (projectId, opts = {}) => runMssqlQuery(msc, buildPerfDistribution(projectId, opts, d)),
|
|
73
|
+
fpsHistogram: (projectId, opts = {}) => runMssqlQuery(msc, buildFpsHistogram(projectId, opts, d)),
|
|
74
|
+
frameTimePercentiles: (projectId, opts = {}) => runMssqlQuery(msc, buildFrameTimePercentiles(projectId, opts, d)),
|
|
75
|
+
jankRate: (projectId, opts = {}) => runMssqlQuery(msc, buildJankRate(projectId, opts, d)),
|
|
76
|
+
perfChurn: (projectId, opts = {}) => runMssqlQuery(msc, buildPerfChurn(projectId, opts, d)),
|
|
77
|
+
perfByDevice: (projectId, opts = {}) => runMssqlQuery(msc, buildPerfByDevice(projectId, opts, d)),
|
|
78
|
+
perfByScene: (projectId, opts = {}) => runMssqlQuery(msc, buildPerfByScene(projectId, opts, d)),
|
|
79
|
+
resourcePercentiles: (projectId, opts = {}) => runMssqlQuery(msc, buildResourcePercentiles(projectId, opts, d)),
|
|
80
|
+
stabilityCounts: (projectId, opts = {}) => runMssqlQuery(msc, buildStabilityCounts(projectId, opts, d)),
|
|
81
|
+
graphicsDiagnosticCounts: (projectId, opts = {}) => runMssqlQuery(msc, buildGraphicsDiagnosticCounts(projectId, opts, d)),
|
|
82
|
+
errorHeatmap: (projectId, opts = {}) => runMssqlQuery(msc, buildErrorHeatmap(projectId, opts, d)),
|
|
83
|
+
boundaryHeatmap: (projectId, opts = {}) => runMssqlQuery(msc, buildBoundaryHeatmap(projectId, opts, d)),
|
|
84
|
+
boundaryHeatmapStats: async (projectId, opts = {}) => {
|
|
85
|
+
const rows = await runMssqlQuery(msc, buildBoundaryHeatmapStats(projectId, opts, d));
|
|
86
|
+
return rows[0] ?? { cells: 0, hits: 0 };
|
|
87
|
+
},
|
|
88
|
+
renderingTechnology: (projectId, opts = {}) => runMssqlQuery(msc, buildRenderingTechnology(projectId, opts, d)),
|
|
89
|
+
sceneCoverage: (projectId, opts = {}) => runMssqlQuery(msc, buildSceneCoverage(projectId, opts, d)),
|
|
90
|
+
perfHeatmap: (projectId, opts = {}) => runMssqlQuery(msc, buildPerfHeatmap(projectId, opts, d)),
|
|
91
|
+
cameraDistance: (projectId, opts = {}) => runMssqlQuery(msc, buildCameraDistance(projectId, opts, d)),
|
|
92
|
+
navigationStats: (projectId, opts = {}) => runMssqlQuery(msc, buildNavigationStats(projectId, opts, d)),
|
|
93
|
+
backtrackRatio: (projectId, opts = {}) => runMssqlQuery(msc, buildBacktrackRatio(projectId, opts, d)),
|
|
94
|
+
xrRotationRate: (projectId, opts = {}) => runMssqlQuery(msc, buildXrRotationRate(projectId, opts, d)),
|
|
95
|
+
xrSourceUsage: (projectId, opts = {}) => runMssqlQuery(msc, buildXrSourceUsage(projectId, opts, d)),
|
|
96
|
+
xrAbandonment: (projectId, opts = {}) => runMssqlQuery(msc, buildXrAbandonment(projectId, opts, d)),
|
|
97
|
+
xrLocomotion: (projectId, opts = {}) => runMssqlQuery(msc, buildXrLocomotionComfort(projectId, opts, d)),
|
|
98
|
+
boundaryContacts: (projectId, opts = {}) => runMssqlQuery(msc, buildBoundaryContacts(projectId, opts, d)),
|
|
99
|
+
trackingQuality: (projectId, opts = {}) => runMssqlQuery(msc, buildTrackingQuality(projectId, opts, d)),
|
|
100
|
+
interactionsBySource: (projectId, opts = {}) => runMssqlQuery(msc, buildInteractionsBySource(projectId, opts, d)),
|
|
101
|
+
topInputActions: (projectId, opts = {}) => runMssqlQuery(msc, buildTopInputActions(projectId, opts, d)),
|
|
102
|
+
scenes: (projectId, opts = {}) => runMssqlQuery(msc, buildDistinctScenes(projectId, opts, d)),
|
|
103
|
+
timeseries: (projectId, opts = {}) => runMssqlQuery(msc, buildTimeseries(projectId, opts, d)),
|
|
104
|
+
eventTypeCounts: (projectId, opts = {}) => runMssqlQuery(msc, buildEventTypeCounts(projectId, opts, d)),
|
|
105
|
+
funnel: (projectId, opts) => runMssqlQuery(msc, buildFunnel(projectId, opts, d)),
|
|
106
|
+
sceneRetention: (projectId, opts) => runMssqlQuery(msc, buildSceneRetention(projectId, opts, d)),
|
|
107
|
+
loadBounceFunnel: (projectId, opts = {}) => runMssqlQuery(msc, buildLoadBounceFunnel(projectId, opts, d)),
|
|
108
|
+
variantLeaderboard: (projectId, opts) => runMssqlQuery(msc, buildVariantLeaderboard(projectId, opts, d)),
|
|
109
|
+
getSessionEvents: (projectId, sessionId) => msGetSessionEvents(msc, projectId, sessionId),
|
|
110
|
+
streamSessionEvents: (projectId, sessionId) => msStreamSessionEvents(msc, projectId, sessionId),
|
|
111
|
+
getSessionMeta: (projectId, sessionId) => msGetSessionMeta(msc, projectId, sessionId),
|
|
112
|
+
putSceneProxy: (projectId, proxy, label) => msUpsertSceneProxy(msc, projectId, proxy, label),
|
|
113
|
+
getSceneRepresentation: (projectId, sceneId) => msGetSceneRepresentation(msc, projectId, sceneId),
|
|
114
|
+
listSceneRepresentations: (projectId) => msListSceneRepresentations(msc, projectId),
|
|
115
|
+
async close() {
|
|
116
|
+
await msc.close();
|
|
117
|
+
},
|
|
118
|
+
};
|
|
119
|
+
}
|
|
120
|
+
//# sourceMappingURL=mssqlStore.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mssqlStore.js","sourceRoot":"","sources":["../src/mssqlStore.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { CollectorStore } from "./store.js";
|
|
2
|
+
/**
|
|
3
|
+
* Optional single-tenant Postgres store (ADR 0020, #84): the relational,
|
|
4
|
+
* multi-writer path for self-hosters who already run Postgres and have
|
|
5
|
+
* outgrown DuckDB's single read-write process. It carries the **full** analytics
|
|
6
|
+
* surface — no stubbed aggregates — by rendering the same dialect-agnostic
|
|
7
|
+
* builders with {@link postgresDialect} (ASOF joins emulated via `LATERAL`,
|
|
8
|
+
* daily rollups recomputed at query time) and executing them over a pooled
|
|
9
|
+
* `pg` connection. Events live in the wide `events` table (plus the dedicated
|
|
10
|
+
* `node_samples`); metadata (projects, API keys, scene registry) is re-homed
|
|
11
|
+
* into the same database.
|
|
12
|
+
*
|
|
13
|
+
* The schema is migrated on creation (migrations are idempotent, forward-only
|
|
14
|
+
* and serialized behind an advisory lock, so several collector instances can
|
|
15
|
+
* boot against one database). Connection settings come from
|
|
16
|
+
* `readDbSettings().postgres` (`POSTGRES_URL` / `DATABASE_URL`, `POSTGRES_SCHEMA`,
|
|
17
|
+
* `POSTGRES_POOL_MAX`).
|
|
18
|
+
*/
|
|
19
|
+
export declare function createPostgresStore(): Promise<CollectorStore>;
|
|
20
|
+
//# sourceMappingURL=postgresStore.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"postgresStore.d.ts","sourceRoot":"","sources":["../src/postgresStore.ts"],"names":[],"mappings":"AAmJA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAEjD;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAsB,mBAAmB,IAAI,OAAO,CAAC,cAAc,CAAC,CAyLnE"}
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
import { buildCameraDirectionHeatmap, buildViewCoverageHistogram, buildCameraDistance, buildCameraPositionHeatmap, buildClickGazeRay, buildDeadClicks, buildRageClicks, buildHoverDwell, buildCompileStalls, buildArPlacementTimeToPlace, buildArPlacementAttempts, buildArPlacementSurfaces, buildResourceSummary, buildCapabilityChanges, buildCameraGestures, buildDistinctScenes, buildEventTypeCounts, buildFlowHeatmap, buildFunnel, buildSceneRetention, buildLoadBounceFunnel, buildVariantLeaderboard, buildListSessions, buildNavigationStats, buildBacktrackRatio, buildXrRotationRate, buildXrSourceUsage, buildXrAbandonment, buildXrLocomotionComfort, buildTrackingQuality, buildInteractionsBySource, buildMeshDwell, buildMeshBlindSpots, buildMeshInteractionKinds, buildReachability, buildPerfSummary, buildPerfDistribution, buildFpsHistogram, buildFrameTimePercentiles, buildJankRate, buildPerfChurn, buildPerfByDevice, buildPerfByScene, buildResourcePercentiles, buildStabilityCounts, buildGraphicsDiagnosticCounts, buildErrorHeatmap, buildBoundaryHeatmap, buildBoundaryHeatmapStats, buildBoundaryContacts, buildRenderingTechnology, buildPointerHeatmap, buildMeshUvHeatmap, buildSceneCoverage, buildPerfHeatmap, buildSessionTrajectory, buildAggregateTrajectories, buildRenderScaleTruth, buildTimeseries, buildTopMeshes, buildTopMeshesBySource, buildTopMeshesTrend, buildTopInputActions, buildWorldHeatmap, buildWorldHeatmapStats, buildGazeHeatmap, buildGazeHeatmapStats, postgresDialect, readDbSettings, } from "@uptimizr/db";
|
|
2
|
+
import { createPostgresClient, migratePostgres, runPostgresQuery, insertEvents as pgInsertEvents, getSessionEvents as pgGetSessionEvents, streamSessionEvents as pgStreamSessionEvents, getSessionMeta as pgGetSessionMeta, getProject as pgGetProject, resolveApiKey as pgResolveApiKey, upsertSceneProxy as pgUpsertSceneProxy, getSceneRepresentation as pgGetSceneRepresentation, listSceneRepresentations as pgListSceneRepresentations, } from "@uptimizr/db-postgres";
|
|
3
|
+
/**
|
|
4
|
+
* Optional single-tenant Postgres store (ADR 0020, #84): the relational,
|
|
5
|
+
* multi-writer path for self-hosters who already run Postgres and have
|
|
6
|
+
* outgrown DuckDB's single read-write process. It carries the **full** analytics
|
|
7
|
+
* surface — no stubbed aggregates — by rendering the same dialect-agnostic
|
|
8
|
+
* builders with {@link postgresDialect} (ASOF joins emulated via `LATERAL`,
|
|
9
|
+
* daily rollups recomputed at query time) and executing them over a pooled
|
|
10
|
+
* `pg` connection. Events live in the wide `events` table (plus the dedicated
|
|
11
|
+
* `node_samples`); metadata (projects, API keys, scene registry) is re-homed
|
|
12
|
+
* into the same database.
|
|
13
|
+
*
|
|
14
|
+
* The schema is migrated on creation (migrations are idempotent, forward-only
|
|
15
|
+
* and serialized behind an advisory lock, so several collector instances can
|
|
16
|
+
* boot against one database). Connection settings come from
|
|
17
|
+
* `readDbSettings().postgres` (`POSTGRES_URL` / `DATABASE_URL`, `POSTGRES_SCHEMA`,
|
|
18
|
+
* `POSTGRES_POOL_MAX`).
|
|
19
|
+
*/
|
|
20
|
+
export async function createPostgresStore() {
|
|
21
|
+
const settings = readDbSettings().postgres;
|
|
22
|
+
const pgc = createPostgresClient(settings);
|
|
23
|
+
await migratePostgres(pgc, settings);
|
|
24
|
+
const d = postgresDialect;
|
|
25
|
+
return {
|
|
26
|
+
resolveApiKey: (key) => pgResolveApiKey(pgc, key),
|
|
27
|
+
projectExists: async (projectId) => (await pgGetProject(pgc, projectId)) !== null,
|
|
28
|
+
insertEvents: (events) => pgInsertEvents(pgc, [...events]),
|
|
29
|
+
listSessions: (projectId, opts = {}) => runPostgresQuery(pgc, buildListSessions(projectId, opts, d)),
|
|
30
|
+
pointerHeatmap: (projectId, opts = {}) => runPostgresQuery(pgc, buildPointerHeatmap(projectId, opts, d)),
|
|
31
|
+
meshUvHeatmap: (projectId, opts = {}) => runPostgresQuery(pgc, buildMeshUvHeatmap(projectId, opts, d)),
|
|
32
|
+
worldHeatmap: (projectId, opts = {}) => runPostgresQuery(pgc, buildWorldHeatmap(projectId, opts, d)),
|
|
33
|
+
worldHeatmapStats: async (projectId, opts = {}) => {
|
|
34
|
+
const rows = await runPostgresQuery(pgc, buildWorldHeatmapStats(projectId, opts, d));
|
|
35
|
+
return rows[0] ?? { cells: 0, hits: 0 };
|
|
36
|
+
},
|
|
37
|
+
gazeHeatmap: (projectId, opts = {}) => runPostgresQuery(pgc, buildGazeHeatmap(projectId, opts, d)),
|
|
38
|
+
gazeHeatmapStats: async (projectId, opts = {}) => {
|
|
39
|
+
const rows = await runPostgresQuery(pgc, buildGazeHeatmapStats(projectId, opts, d));
|
|
40
|
+
return rows[0] ?? { cells: 0, hits: 0 };
|
|
41
|
+
},
|
|
42
|
+
cameraHeatmap: (projectId, opts = {}) => runPostgresQuery(pgc, buildCameraDirectionHeatmap(projectId, opts, d)),
|
|
43
|
+
viewCoverageHistogram: (projectId, opts = {}) => runPostgresQuery(pgc, buildViewCoverageHistogram(projectId, opts, d)),
|
|
44
|
+
cameraPositionHeatmap: (projectId, opts = {}) => runPostgresQuery(pgc, buildCameraPositionHeatmap(projectId, opts, d)),
|
|
45
|
+
sessionTrajectory: (projectId, sessionId, opts = {}) => runPostgresQuery(pgc, buildSessionTrajectory(projectId, { ...opts, session: sessionId }, d)),
|
|
46
|
+
aggregateTrajectories: (projectId, opts = {}) => runPostgresQuery(pgc, buildAggregateTrajectories(projectId, opts, d)),
|
|
47
|
+
clickGazeRays: (projectId, opts = {}) => runPostgresQuery(pgc, buildClickGazeRay(projectId, opts, d)),
|
|
48
|
+
flowHeatmap: (projectId, opts = {}) => runPostgresQuery(pgc, buildFlowHeatmap(projectId, opts, d)),
|
|
49
|
+
topMeshes: (projectId, opts = {}) => runPostgresQuery(pgc, buildTopMeshes(projectId, opts, d)),
|
|
50
|
+
topMeshesBySource: (projectId, opts = {}) => runPostgresQuery(pgc, buildTopMeshesBySource(projectId, opts, d)),
|
|
51
|
+
topMeshesTrend: (projectId, opts = {}) => runPostgresQuery(pgc, buildTopMeshesTrend(projectId, opts, d)),
|
|
52
|
+
meshDwell: (projectId, opts = {}) => runPostgresQuery(pgc, buildMeshDwell(projectId, opts, d)),
|
|
53
|
+
meshBlindSpots: (projectId, opts = {}) => runPostgresQuery(pgc, buildMeshBlindSpots(projectId, opts, d)),
|
|
54
|
+
meshInteractionKinds: (projectId, opts = {}) => runPostgresQuery(pgc, buildMeshInteractionKinds(projectId, opts, d)),
|
|
55
|
+
reachability: (projectId, opts = {}) => runPostgresQuery(pgc, buildReachability(projectId, opts, d)),
|
|
56
|
+
deadClicks: (projectId, opts = {}) => runPostgresQuery(pgc, buildDeadClicks(projectId, opts, d)),
|
|
57
|
+
rageClicks: (projectId, opts = {}) => runPostgresQuery(pgc, buildRageClicks(projectId, opts, d)),
|
|
58
|
+
hoverDwell: (projectId, opts = {}) => runPostgresQuery(pgc, buildHoverDwell(projectId, opts, d)),
|
|
59
|
+
compileStalls: (projectId, opts = {}) => runPostgresQuery(pgc, buildCompileStalls(projectId, opts, d)),
|
|
60
|
+
arPlacementTimeToPlace: (projectId, opts = {}) => runPostgresQuery(pgc, buildArPlacementTimeToPlace(projectId, opts, d)),
|
|
61
|
+
arPlacementAttempts: (projectId, opts = {}) => runPostgresQuery(pgc, buildArPlacementAttempts(projectId, opts, d)),
|
|
62
|
+
arPlacementSurfaces: (projectId, opts = {}) => runPostgresQuery(pgc, buildArPlacementSurfaces(projectId, opts, d)),
|
|
63
|
+
resourceSummary: (projectId, opts = {}) => runPostgresQuery(pgc, buildResourceSummary(projectId, opts, d)),
|
|
64
|
+
capabilityChanges: (projectId, opts = {}) => runPostgresQuery(pgc, buildCapabilityChanges(projectId, opts, d)),
|
|
65
|
+
cameraGestures: (projectId, opts = {}) => runPostgresQuery(pgc, buildCameraGestures(projectId, opts, d)),
|
|
66
|
+
perfSummary: (projectId, opts = {}) => runPostgresQuery(pgc, buildPerfSummary(projectId, opts, d)),
|
|
67
|
+
renderScaleTruth: (projectId, opts = {}) => runPostgresQuery(pgc, buildRenderScaleTruth(projectId, opts, d)),
|
|
68
|
+
perfDistribution: (projectId, opts = {}) => runPostgresQuery(pgc, buildPerfDistribution(projectId, opts, d)),
|
|
69
|
+
fpsHistogram: (projectId, opts = {}) => runPostgresQuery(pgc, buildFpsHistogram(projectId, opts, d)),
|
|
70
|
+
frameTimePercentiles: (projectId, opts = {}) => runPostgresQuery(pgc, buildFrameTimePercentiles(projectId, opts, d)),
|
|
71
|
+
jankRate: (projectId, opts = {}) => runPostgresQuery(pgc, buildJankRate(projectId, opts, d)),
|
|
72
|
+
perfChurn: (projectId, opts = {}) => runPostgresQuery(pgc, buildPerfChurn(projectId, opts, d)),
|
|
73
|
+
perfByDevice: (projectId, opts = {}) => runPostgresQuery(pgc, buildPerfByDevice(projectId, opts, d)),
|
|
74
|
+
perfByScene: (projectId, opts = {}) => runPostgresQuery(pgc, buildPerfByScene(projectId, opts, d)),
|
|
75
|
+
resourcePercentiles: (projectId, opts = {}) => runPostgresQuery(pgc, buildResourcePercentiles(projectId, opts, d)),
|
|
76
|
+
stabilityCounts: (projectId, opts = {}) => runPostgresQuery(pgc, buildStabilityCounts(projectId, opts, d)),
|
|
77
|
+
graphicsDiagnosticCounts: (projectId, opts = {}) => runPostgresQuery(pgc, buildGraphicsDiagnosticCounts(projectId, opts, d)),
|
|
78
|
+
errorHeatmap: (projectId, opts = {}) => runPostgresQuery(pgc, buildErrorHeatmap(projectId, opts, d)),
|
|
79
|
+
boundaryHeatmap: (projectId, opts = {}) => runPostgresQuery(pgc, buildBoundaryHeatmap(projectId, opts, d)),
|
|
80
|
+
boundaryHeatmapStats: async (projectId, opts = {}) => {
|
|
81
|
+
const rows = await runPostgresQuery(pgc, buildBoundaryHeatmapStats(projectId, opts, d));
|
|
82
|
+
return rows[0] ?? { cells: 0, hits: 0 };
|
|
83
|
+
},
|
|
84
|
+
renderingTechnology: (projectId, opts = {}) => runPostgresQuery(pgc, buildRenderingTechnology(projectId, opts, d)),
|
|
85
|
+
sceneCoverage: (projectId, opts = {}) => runPostgresQuery(pgc, buildSceneCoverage(projectId, opts, d)),
|
|
86
|
+
perfHeatmap: (projectId, opts = {}) => runPostgresQuery(pgc, buildPerfHeatmap(projectId, opts, d)),
|
|
87
|
+
cameraDistance: (projectId, opts = {}) => runPostgresQuery(pgc, buildCameraDistance(projectId, opts, d)),
|
|
88
|
+
navigationStats: (projectId, opts = {}) => runPostgresQuery(pgc, buildNavigationStats(projectId, opts, d)),
|
|
89
|
+
backtrackRatio: (projectId, opts = {}) => runPostgresQuery(pgc, buildBacktrackRatio(projectId, opts, d)),
|
|
90
|
+
xrRotationRate: (projectId, opts = {}) => runPostgresQuery(pgc, buildXrRotationRate(projectId, opts, d)),
|
|
91
|
+
xrSourceUsage: (projectId, opts = {}) => runPostgresQuery(pgc, buildXrSourceUsage(projectId, opts, d)),
|
|
92
|
+
xrAbandonment: (projectId, opts = {}) => runPostgresQuery(pgc, buildXrAbandonment(projectId, opts, d)),
|
|
93
|
+
xrLocomotion: (projectId, opts = {}) => runPostgresQuery(pgc, buildXrLocomotionComfort(projectId, opts, d)),
|
|
94
|
+
boundaryContacts: (projectId, opts = {}) => runPostgresQuery(pgc, buildBoundaryContacts(projectId, opts, d)),
|
|
95
|
+
trackingQuality: (projectId, opts = {}) => runPostgresQuery(pgc, buildTrackingQuality(projectId, opts, d)),
|
|
96
|
+
interactionsBySource: (projectId, opts = {}) => runPostgresQuery(pgc, buildInteractionsBySource(projectId, opts, d)),
|
|
97
|
+
topInputActions: (projectId, opts = {}) => runPostgresQuery(pgc, buildTopInputActions(projectId, opts, d)),
|
|
98
|
+
scenes: (projectId, opts = {}) => runPostgresQuery(pgc, buildDistinctScenes(projectId, opts, d)),
|
|
99
|
+
timeseries: (projectId, opts = {}) => runPostgresQuery(pgc, buildTimeseries(projectId, opts, d)),
|
|
100
|
+
eventTypeCounts: (projectId, opts = {}) => runPostgresQuery(pgc, buildEventTypeCounts(projectId, opts, d)),
|
|
101
|
+
funnel: (projectId, opts) => runPostgresQuery(pgc, buildFunnel(projectId, opts, d)),
|
|
102
|
+
sceneRetention: (projectId, opts) => runPostgresQuery(pgc, buildSceneRetention(projectId, opts, d)),
|
|
103
|
+
loadBounceFunnel: (projectId, opts = {}) => runPostgresQuery(pgc, buildLoadBounceFunnel(projectId, opts, d)),
|
|
104
|
+
variantLeaderboard: (projectId, opts) => runPostgresQuery(pgc, buildVariantLeaderboard(projectId, opts, d)),
|
|
105
|
+
getSessionEvents: (projectId, sessionId) => pgGetSessionEvents(pgc, projectId, sessionId),
|
|
106
|
+
streamSessionEvents: (projectId, sessionId) => pgStreamSessionEvents(pgc, projectId, sessionId),
|
|
107
|
+
getSessionMeta: (projectId, sessionId) => pgGetSessionMeta(pgc, projectId, sessionId),
|
|
108
|
+
putSceneProxy: (projectId, proxy, label) => pgUpsertSceneProxy(pgc, projectId, proxy, label),
|
|
109
|
+
getSceneRepresentation: (projectId, sceneId) => pgGetSceneRepresentation(pgc, projectId, sceneId),
|
|
110
|
+
listSceneRepresentations: (projectId) => pgListSceneRepresentations(pgc, projectId),
|
|
111
|
+
async close() {
|
|
112
|
+
await pgc.close();
|
|
113
|
+
},
|
|
114
|
+
};
|
|
115
|
+
}
|
|
116
|
+
//# sourceMappingURL=postgresStore.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"postgresStore.js","sourceRoot":"","sources":["../src/postgresStore.ts"],"names":[],"mappings":"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"}
|
package/dist/serve.d.ts
CHANGED
|
@@ -4,6 +4,14 @@ import type { CollectorStore } from "./store.js";
|
|
|
4
4
|
* - `duckdb` (default) — the OSS single-file DuckDB store (events + metadata in
|
|
5
5
|
* one file, full analytics, zero external services; ADR 0020). Path from
|
|
6
6
|
* `DUCKDB_PATH`.
|
|
7
|
+
* - `postgres` — the optional single-tenant Postgres store (multi-writer
|
|
8
|
+
* relational backend for shops that already run Postgres; ADR 0020, #84).
|
|
9
|
+
* Connection from `POSTGRES_URL` (or `DATABASE_URL`) plus the optional
|
|
10
|
+
* `POSTGRES_SCHEMA` / `POSTGRES_POOL_MAX`. Requires a reachable Postgres.
|
|
11
|
+
* - `mssql` — the optional single-tenant Microsoft SQL Server store (for shops
|
|
12
|
+
* standardized on SQL Server / Azure SQL; ADR 0020, #85). Connection from
|
|
13
|
+
* `MSSQL_URL` or `MSSQL_SERVER` / `MSSQL_PORT` / `MSSQL_DATABASE` /
|
|
14
|
+
* `MSSQL_USER` / `MSSQL_PASSWORD`. Requires a reachable SQL Server 2022+.
|
|
7
15
|
* - `clickhouse` — the optional single-tenant ClickHouse store for scale
|
|
8
16
|
* (concurrent, high-volume ingestion; ADR 0020). Connection from the
|
|
9
17
|
* `CLICKHOUSE_*` env vars. Requires a reachable ClickHouse server.
|
package/dist/serve.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"serve.d.ts","sourceRoot":"","sources":["../src/serve.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"serve.d.ts","sourceRoot":"","sources":["../src/serve.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAEjD;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,WAAW,CAAC,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,OAAO,CAAC,cAAc,CAAC,CAmBzF;AAED;;;;GAIG;AACH,wBAAsB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAqB3C"}
|
package/dist/serve.js
CHANGED
|
@@ -3,11 +3,21 @@ import { loadConfig } from "./config.js";
|
|
|
3
3
|
import { createClickhouseStore } from "./clickhouseStore.js";
|
|
4
4
|
import { createDuckdbStore } from "./duckdbStore.js";
|
|
5
5
|
import { createMemoryStore } from "./memoryStore.js";
|
|
6
|
+
import { createMssqlStore } from "./mssqlStore.js";
|
|
7
|
+
import { createPostgresStore } from "./postgresStore.js";
|
|
6
8
|
/**
|
|
7
9
|
* Select the storage backend (`COLLECTOR_STORE`):
|
|
8
10
|
* - `duckdb` (default) — the OSS single-file DuckDB store (events + metadata in
|
|
9
11
|
* one file, full analytics, zero external services; ADR 0020). Path from
|
|
10
12
|
* `DUCKDB_PATH`.
|
|
13
|
+
* - `postgres` — the optional single-tenant Postgres store (multi-writer
|
|
14
|
+
* relational backend for shops that already run Postgres; ADR 0020, #84).
|
|
15
|
+
* Connection from `POSTGRES_URL` (or `DATABASE_URL`) plus the optional
|
|
16
|
+
* `POSTGRES_SCHEMA` / `POSTGRES_POOL_MAX`. Requires a reachable Postgres.
|
|
17
|
+
* - `mssql` — the optional single-tenant Microsoft SQL Server store (for shops
|
|
18
|
+
* standardized on SQL Server / Azure SQL; ADR 0020, #85). Connection from
|
|
19
|
+
* `MSSQL_URL` or `MSSQL_SERVER` / `MSSQL_PORT` / `MSSQL_DATABASE` /
|
|
20
|
+
* `MSSQL_USER` / `MSSQL_PASSWORD`. Requires a reachable SQL Server 2022+.
|
|
11
21
|
* - `clickhouse` — the optional single-tenant ClickHouse store for scale
|
|
12
22
|
* (concurrent, high-volume ingestion; ADR 0020). Connection from the
|
|
13
23
|
* `CLICKHOUSE_*` env vars. Requires a reachable ClickHouse server.
|
|
@@ -22,6 +32,10 @@ export function createStore(env = process.env) {
|
|
|
22
32
|
projectId: env.COLLECTOR_MEMORY_PROJECT_ID ?? "demo",
|
|
23
33
|
apiKey: env.COLLECTOR_MEMORY_API_KEY ?? "utk_memory_dev",
|
|
24
34
|
}));
|
|
35
|
+
case "postgres":
|
|
36
|
+
return createPostgresStore();
|
|
37
|
+
case "mssql":
|
|
38
|
+
return createMssqlStore();
|
|
25
39
|
case "clickhouse":
|
|
26
40
|
return createClickhouseStore();
|
|
27
41
|
case "duckdb":
|
package/dist/serve.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"serve.js","sourceRoot":"","sources":["../src/serve.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AACpC,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"serve.js","sourceRoot":"","sources":["../src/serve.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AACpC,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAGzD;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,UAAU,WAAW,CAAC,MAAyB,OAAO,CAAC,GAAG;IAC9D,QAAQ,GAAG,CAAC,eAAe,EAAE,CAAC;QAC5B,KAAK,QAAQ;YACX,OAAO,OAAO,CAAC,OAAO,CACpB,iBAAiB,CAAC;gBAChB,SAAS,EAAE,GAAG,CAAC,2BAA2B,IAAI,MAAM;gBACpD,MAAM,EAAE,GAAG,CAAC,wBAAwB,IAAI,gBAAgB;aACzD,CAAC,CACH,CAAC;QACJ,KAAK,UAAU;YACb,OAAO,mBAAmB,EAAE,CAAC;QAC/B,KAAK,OAAO;YACV,OAAO,gBAAgB,EAAE,CAAC;QAC5B,KAAK,YAAY;YACf,OAAO,qBAAqB,EAAE,CAAC;QACjC,KAAK,QAAQ,CAAC;QACd;YACE,OAAO,iBAAiB,EAAE,CAAC;IAC/B,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,KAAK;IACzB,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;IAC5B,MAAM,KAAK,GAAG,MAAM,WAAW,EAAE,CAAC;IAClC,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;IAE5D,IAAI,CAAC,MAAM,CAAC,0BAA0B,EAAE,CAAC;QACvC,GAAG,CAAC,GAAG,CAAC,IAAI,CACV,yFAAyF;YACvF,qFAAqF,CACxF,CAAC;IACJ,CAAC;IAED,MAAM,KAAK,GAAG,KAAK,IAAI,EAAE;QACvB,MAAM,GAAG,CAAC,KAAK,EAAE,CAAC;QAClB,MAAM,KAAK,CAAC,KAAK,EAAE,CAAC;QACpB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC;IACF,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;IAC5B,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;IAE7B,MAAM,GAAG,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;AAC7D,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@uptimizr/collector-server",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "1.0.0",
|
|
4
4
|
"description": "Uptimizr ingestion + query API (Fastify). Self-hostable collector for the OSS data-collector.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"uptimizr",
|
|
@@ -45,9 +45,11 @@
|
|
|
45
45
|
"fastify": "^5.12.1",
|
|
46
46
|
"fastify-type-provider-zod": "^7.0.0",
|
|
47
47
|
"zod": "^4.5.4",
|
|
48
|
-
"@uptimizr/db
|
|
49
|
-
"@uptimizr/
|
|
50
|
-
"@uptimizr/db": "0.
|
|
48
|
+
"@uptimizr/db": "1.0.0",
|
|
49
|
+
"@uptimizr/db-clickhouse": "1.0.0",
|
|
50
|
+
"@uptimizr/db-mssql": "1.0.0",
|
|
51
|
+
"@uptimizr/schema": "1.0.0",
|
|
52
|
+
"@uptimizr/db-postgres": "1.0.0"
|
|
51
53
|
},
|
|
52
54
|
"devDependencies": {
|
|
53
55
|
"@types/node": "^26.4.0",
|