@wizeworks/lens-hub 0.3.0-alpha.3 → 0.3.0-alpha.5
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/dist/alerts/api.d.ts +5 -0
- package/dist/alerts/api.d.ts.map +1 -0
- package/dist/alerts/api.js +87 -0
- package/dist/alerts/api.js.map +1 -0
- package/dist/alerts/deliver.d.ts +54 -0
- package/dist/alerts/deliver.d.ts.map +1 -0
- package/dist/alerts/deliver.js +66 -0
- package/dist/alerts/deliver.js.map +1 -0
- package/dist/alerts/evaluate.d.ts +16 -0
- package/dist/alerts/evaluate.d.ts.map +1 -0
- package/dist/alerts/evaluate.js +76 -0
- package/dist/alerts/evaluate.js.map +1 -0
- package/dist/alerts/loop.d.ts +10 -0
- package/dist/alerts/loop.d.ts.map +1 -0
- package/dist/alerts/loop.js +27 -0
- package/dist/alerts/loop.js.map +1 -0
- package/dist/alerts/store.d.ts +32 -0
- package/dist/alerts/store.d.ts.map +1 -0
- package/dist/alerts/store.js +38 -0
- package/dist/alerts/store.js.map +1 -0
- package/dist/alerts/target.d.ts +3 -0
- package/dist/alerts/target.d.ts.map +1 -0
- package/dist/alerts/target.js +23 -0
- package/dist/alerts/target.js.map +1 -0
- package/dist/api.d.ts +5 -0
- package/dist/api.d.ts.map +1 -1
- package/dist/api.js +38 -4
- package/dist/api.js.map +1 -1
- package/dist/body.d.ts +2 -2
- package/dist/body.d.ts.map +1 -1
- package/dist/body.js +4 -4
- package/dist/body.js.map +1 -1
- package/dist/cli-args.d.ts +1 -1
- package/dist/cli-args.d.ts.map +1 -1
- package/dist/cli-args.js +32 -1
- package/dist/cli-args.js.map +1 -1
- package/dist/data.js +1 -1
- package/dist/data.js.map +1 -1
- package/dist/hub.d.ts.map +1 -1
- package/dist/hub.js +15 -3
- package/dist/hub.js.map +1 -1
- package/dist/infra-read.d.ts +11 -0
- package/dist/infra-read.d.ts.map +1 -0
- package/dist/infra-read.js +30 -0
- package/dist/infra-read.js.map +1 -0
- package/dist/ingest.d.ts.map +1 -1
- package/dist/ingest.js +14 -3
- package/dist/ingest.js.map +1 -1
- package/dist/issues.d.ts +10 -0
- package/dist/issues.d.ts.map +1 -0
- package/dist/issues.js +34 -0
- package/dist/issues.js.map +1 -0
- package/dist/kit.d.ts +6 -0
- package/dist/kit.d.ts.map +1 -1
- package/dist/kit.js +4 -0
- package/dist/kit.js.map +1 -1
- package/dist/list-search.d.ts +10 -0
- package/dist/list-search.d.ts.map +1 -0
- package/dist/list-search.js +13 -0
- package/dist/list-search.js.map +1 -0
- package/dist/mcp.d.ts +3 -2
- package/dist/mcp.d.ts.map +1 -1
- package/dist/mcp.js +57 -11
- package/dist/mcp.js.map +1 -1
- package/dist/metrics-read.js +1 -1
- package/dist/metrics-read.js.map +1 -1
- package/dist/models-api.d.ts +11 -1
- package/dist/models-api.d.ts.map +1 -1
- package/dist/models-api.js +41 -15
- package/dist/models-api.js.map +1 -1
- package/dist/options.d.ts +23 -2
- package/dist/options.d.ts.map +1 -1
- package/dist/options.js +10 -1
- package/dist/options.js.map +1 -1
- package/dist/otlp/db-params.d.ts +7 -0
- package/dist/otlp/db-params.d.ts.map +1 -0
- package/dist/otlp/db-params.js +74 -0
- package/dist/otlp/db-params.js.map +1 -0
- package/dist/otlp/logs.d.ts +1 -1
- package/dist/otlp/logs.d.ts.map +1 -1
- package/dist/otlp/logs.js +8 -7
- package/dist/otlp/logs.js.map +1 -1
- package/dist/otlp/metrics.d.ts +3 -3
- package/dist/otlp/metrics.d.ts.map +1 -1
- package/dist/otlp/metrics.js +7 -6
- package/dist/otlp/metrics.js.map +1 -1
- package/dist/otlp/nested.d.ts +4 -0
- package/dist/otlp/nested.d.ts.map +1 -0
- package/dist/otlp/nested.js +19 -0
- package/dist/otlp/nested.js.map +1 -0
- package/dist/otlp/semconv.d.ts +17 -0
- package/dist/otlp/semconv.d.ts.map +1 -0
- package/dist/otlp/semconv.js +68 -0
- package/dist/otlp/semconv.js.map +1 -0
- package/dist/otlp/spans.d.ts +3 -3
- package/dist/otlp/spans.d.ts.map +1 -1
- package/dist/otlp/spans.js +15 -7
- package/dist/otlp/spans.js.map +1 -1
- package/dist/otlp/values.d.ts +5 -10
- package/dist/otlp/values.d.ts.map +1 -1
- package/dist/otlp/values.js +32 -24
- package/dist/otlp/values.js.map +1 -1
- package/dist/saved.d.ts +7 -0
- package/dist/saved.d.ts.map +1 -0
- package/dist/saved.js +49 -0
- package/dist/saved.js.map +1 -0
- package/dist/scale-exec.d.ts +2 -2
- package/dist/scale-exec.d.ts.map +1 -1
- package/dist/scale-exec.js +4 -4
- package/dist/scale-exec.js.map +1 -1
- package/dist/schema-saved.d.ts +15 -0
- package/dist/schema-saved.d.ts.map +1 -0
- package/dist/schema-saved.js +43 -0
- package/dist/schema-saved.js.map +1 -0
- package/dist/schema-scale.d.ts.map +1 -1
- package/dist/schema-scale.js +11 -1
- package/dist/schema-scale.js.map +1 -1
- package/dist/schema.d.ts +2 -2
- package/dist/schema.d.ts.map +1 -1
- package/dist/schema.js +20 -1
- package/dist/schema.js.map +1 -1
- package/dist/search-api.d.ts +1 -1
- package/dist/search-api.d.ts.map +1 -1
- package/dist/search-api.js +7 -5
- package/dist/search-api.js.map +1 -1
- package/dist/settings-prune.d.ts +12 -0
- package/dist/settings-prune.d.ts.map +1 -0
- package/dist/settings-prune.js +15 -0
- package/dist/settings-prune.js.map +1 -0
- package/dist/settings.d.ts +27 -0
- package/dist/settings.d.ts.map +1 -0
- package/dist/settings.js +64 -0
- package/dist/settings.js.map +1 -0
- package/dist/settle.d.ts +3 -3
- package/dist/settle.d.ts.map +1 -1
- package/dist/settle.js +12 -6
- package/dist/settle.js.map +1 -1
- package/dist/slos.d.ts +14 -0
- package/dist/slos.d.ts.map +1 -0
- package/dist/slos.js +73 -0
- package/dist/slos.js.map +1 -0
- package/dist/sourcemaps-api.d.ts +15 -0
- package/dist/sourcemaps-api.d.ts.map +1 -0
- package/dist/sourcemaps-api.js +55 -0
- package/dist/sourcemaps-api.js.map +1 -0
- package/dist/sourcemaps.d.ts +10 -0
- package/dist/sourcemaps.d.ts.map +1 -0
- package/dist/sourcemaps.js +41 -0
- package/dist/sourcemaps.js.map +1 -0
- package/dist/store-read.d.ts +2 -0
- package/dist/store-read.d.ts.map +1 -1
- package/dist/store-read.js +3 -1
- package/dist/store-read.js.map +1 -1
- package/dist/store.d.ts +13 -3
- package/dist/store.d.ts.map +1 -1
- package/dist/store.js +35 -10
- package/dist/store.js.map +1 -1
- package/dist/tags-api.d.ts +5 -0
- package/dist/tags-api.d.ts.map +1 -0
- package/dist/tags-api.js +94 -0
- package/dist/tags-api.js.map +1 -0
- package/dist/tags.d.ts +11 -0
- package/dist/tags.d.ts.map +1 -0
- package/dist/tags.js +31 -0
- package/dist/tags.js.map +1 -0
- package/dist/uptime/api.d.ts +5 -0
- package/dist/uptime/api.d.ts.map +1 -0
- package/dist/uptime/api.js +78 -0
- package/dist/uptime/api.js.map +1 -0
- package/dist/uptime/cert.d.ts +5 -0
- package/dist/uptime/cert.d.ts.map +1 -0
- package/dist/uptime/cert.js +26 -0
- package/dist/uptime/cert.js.map +1 -0
- package/dist/uptime/guard.d.ts +13 -0
- package/dist/uptime/guard.d.ts.map +1 -0
- package/dist/uptime/guard.js +38 -0
- package/dist/uptime/guard.js.map +1 -0
- package/dist/uptime/run.d.ts +11 -0
- package/dist/uptime/run.d.ts.map +1 -0
- package/dist/uptime/run.js +96 -0
- package/dist/uptime/run.js.map +1 -0
- package/dist/uptime/schedule.d.ts +15 -0
- package/dist/uptime/schedule.d.ts.map +1 -0
- package/dist/uptime/schedule.js +26 -0
- package/dist/uptime/schedule.js.map +1 -0
- package/dist/uptime/store.d.ts +25 -0
- package/dist/uptime/store.d.ts.map +1 -0
- package/dist/uptime/store.js +80 -0
- package/dist/uptime/store.js.map +1 -0
- package/package.json +4 -4
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sourcemaps-api.d.ts","sourceRoot":"","sources":["../src/sourcemaps-api.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AACjE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,EAA8B,KAAK,SAAS,EAA0E,MAAM,sBAAsB,CAAC;AAC1J,OAAO,EAA4B,KAAK,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAI3F,6FAA6F;AAC7F,MAAM,MAAM,OAAO,GAAG,CAAC,OAAO,EAAE,MAAM,KAAK,SAAS,CAAC;AAErD,iDAAiD;AACjD,wBAAgB,OAAO,CAAC,EAAE,EAAE,YAAY,EAAE,OAAO,EAAE,gBAAgB,GAAG,KAAK,GAAG,SAAS,GAAG,OAAO,CAOhG;AAID,kGAAkG;AAClG,wBAAsB,eAAe,CAAC,EAAE,EAAE,YAAY,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,eAAe,EAAE,GAAG,EAAE,cAAc,EAAE,GAAG,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,CAYvI;AAED,+EAA+E;AAC/E,wBAAgB,QAAQ,CAAC,EAAE,EAAE,YAAY,EAAE,GAAG,EAAE,cAAc,EAAE,GAAG,EAAE,GAAG,GAAG,IAAI,CAE9E;AASD,2FAA2F;AAC3F,wBAAsB,WAAW,CAAC,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE,YAAY,EAAE,GAAG,EAAE,eAAe,EAAE,GAAG,EAAE,cAAc,EAAE,GAAG,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,CASrI"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { answerResolve, checkUpload, MAX_SOURCEMAP_BYTES, normalizeRelease, parseSourceMap, resolveTargetOf } from "@wizeworks/lens-core";
|
|
2
|
+
import { localMapLoader, sendJson } from "@wizeworks/lens-node/kit";
|
|
3
|
+
import { parseJson, readBody } from "./body.js";
|
|
4
|
+
import { listSourceMaps, saveSourceMap, uploadedMapLoader } from "./sourcemaps.js";
|
|
5
|
+
/** One loader per project, made on first use. */
|
|
6
|
+
export function hubMaps(db, options) {
|
|
7
|
+
const byProject = new Map();
|
|
8
|
+
return (project) => {
|
|
9
|
+
let load = byProject.get(project);
|
|
10
|
+
if (!load)
|
|
11
|
+
byProject.set(project, (load = localMapLoader(options, [uploadedMapLoader(db, project)]) ?? uploadedMapLoader(db, project)));
|
|
12
|
+
return load;
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
const projectOf = (url) => url.searchParams.get("project")?.slice(0, 100) ?? "";
|
|
16
|
+
/** `POST api/sourcemaps?release=&file=[&project=]`: one map, body the map JSON (gzip allowed). */
|
|
17
|
+
export async function uploadSourceMap(db, now, req, res, url) {
|
|
18
|
+
const q = checkUpload(url.searchParams);
|
|
19
|
+
if (typeof q === "string")
|
|
20
|
+
return sendJson(res, 400, { error: q });
|
|
21
|
+
let text;
|
|
22
|
+
try {
|
|
23
|
+
text = (await readBody(req, MAX_SOURCEMAP_BYTES)).toString("utf8");
|
|
24
|
+
}
|
|
25
|
+
catch {
|
|
26
|
+
return sendJson(res, 413, { error: "The map is too large (64 MB at most)." });
|
|
27
|
+
}
|
|
28
|
+
if (!parseSourceMap(text))
|
|
29
|
+
return sendJson(res, 400, { error: "The body is not a source map (version 3)." });
|
|
30
|
+
saveSourceMap(db, projectOf(url), q.release, q.file, text, now);
|
|
31
|
+
sendJson(res, 201, { release: q.release, file: q.file, bytes: Buffer.byteLength(text) });
|
|
32
|
+
}
|
|
33
|
+
/** `GET api/sourcemaps[?release=&project=]`: the stored maps, newest first. */
|
|
34
|
+
export function listMaps(db, res, url) {
|
|
35
|
+
sendJson(res, 200, { maps: listSourceMaps(db, projectOf(url), normalizeRelease(url.searchParams.get("release")) ?? undefined) });
|
|
36
|
+
}
|
|
37
|
+
/** The project whose maps a resolve call reads: the one its trace was sent to (so "All projects" works), else `?project=`. */
|
|
38
|
+
function resolveProject(db, body, url) {
|
|
39
|
+
const target = resolveTargetOf(body);
|
|
40
|
+
const row = target && db.prepare("SELECT project FROM traces WHERE trace_id = ?").get(target.traceId);
|
|
41
|
+
return row ? row.project : projectOf(url);
|
|
42
|
+
}
|
|
43
|
+
/** `POST api/sourcemaps/resolve[?project=]` with `{stack, release, traceId?, spanId?}`. */
|
|
44
|
+
export async function resolveMaps(maps, db, req, res, url) {
|
|
45
|
+
let body;
|
|
46
|
+
try {
|
|
47
|
+
body = parseJson(await readBody(req));
|
|
48
|
+
}
|
|
49
|
+
catch {
|
|
50
|
+
return sendJson(res, 400, { error: "invalid body" });
|
|
51
|
+
}
|
|
52
|
+
const answer = await answerResolve(body, maps(resolveProject(db, body, url)));
|
|
53
|
+
sendJson(res, answer.status, answer.body);
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=sourcemaps-api.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sourcemaps-api.js","sourceRoot":"","sources":["../src/sourcemaps-api.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { DatabaseSync } from "node:sqlite";
|
|
2
|
+
import { type MapLoader, type SourceMapEntry } from "@wizeworks/lens-core";
|
|
3
|
+
export declare const SOURCEMAPS_SCHEMA = "\nCREATE TABLE IF NOT EXISTS sourcemaps (\n project TEXT NOT NULL, release TEXT NOT NULL, file TEXT NOT NULL, map BLOB NOT NULL, bytes INTEGER NOT NULL,\n uploaded_ms REAL NOT NULL, PRIMARY KEY (project, release, file)\n);\nCREATE INDEX IF NOT EXISTS ix_sourcemaps_release ON sourcemaps(project, uploaded_ms);\n";
|
|
4
|
+
/** Save one map (replacing the same release and file), then drop the oldest releases past the kept count. */
|
|
5
|
+
export declare function saveSourceMap(db: DatabaseSync, project: string, release: string, file: string, map: string, now: number): void;
|
|
6
|
+
/** The maps of a project, newest first; only one release when given. */
|
|
7
|
+
export declare function listSourceMaps(db: DatabaseSync, project: string, release?: string): SourceMapEntry[];
|
|
8
|
+
/** Uploaded maps for one project (and maps uploaded with no project). Needs the release the browser sent. */
|
|
9
|
+
export declare function uploadedMapLoader(db: DatabaseSync, project: string): MapLoader;
|
|
10
|
+
//# sourceMappingURL=sourcemaps.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sourcemaps.d.ts","sourceRoot":"","sources":["../src/sourcemaps.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAEhD,OAAO,EAEL,KAAK,SAAS,EAKd,KAAK,cAAc,EACpB,MAAM,sBAAsB,CAAC;AAG9B,eAAO,MAAM,iBAAiB,8TAM7B,CAAC;AAEF,6GAA6G;AAC7G,wBAAgB,aAAa,CAAC,EAAE,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI,CAa9H;AAED,wEAAwE;AACxE,wBAAgB,cAAc,CAAC,EAAE,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,cAAc,EAAE,CAGpG;AAWD,6GAA6G;AAC7G,wBAAgB,iBAAiB,CAAC,EAAE,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,GAAG,SAAS,CAO9E"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { gunzipSync, gzipSync } from "node:zlib";
|
|
2
|
+
import { cachedLoader, mapFileCandidates, MAX_SOURCEMAP_BYTES, parseSourceMap, SOURCEMAP_RELEASES_KEPT, } from "@wizeworks/lens-core";
|
|
3
|
+
// Uploaded source maps, per project ("" without one), release, and generated file. Maps are kept gzipped.
|
|
4
|
+
export const SOURCEMAPS_SCHEMA = `
|
|
5
|
+
CREATE TABLE IF NOT EXISTS sourcemaps (
|
|
6
|
+
project TEXT NOT NULL, release TEXT NOT NULL, file TEXT NOT NULL, map BLOB NOT NULL, bytes INTEGER NOT NULL,
|
|
7
|
+
uploaded_ms REAL NOT NULL, PRIMARY KEY (project, release, file)
|
|
8
|
+
);
|
|
9
|
+
CREATE INDEX IF NOT EXISTS ix_sourcemaps_release ON sourcemaps(project, uploaded_ms);
|
|
10
|
+
`;
|
|
11
|
+
/** Save one map (replacing the same release and file), then drop the oldest releases past the kept count. */
|
|
12
|
+
export function saveSourceMap(db, project, release, file, map, now) {
|
|
13
|
+
db.prepare("INSERT OR REPLACE INTO sourcemaps (project, release, file, map, bytes, uploaded_ms) VALUES (?, ?, ?, ?, ?, ?)").run(project, release, file, gzipSync(map), Buffer.byteLength(map), now);
|
|
14
|
+
db.prepare(`DELETE FROM sourcemaps WHERE project = ? AND release NOT IN (
|
|
15
|
+
SELECT release FROM sourcemaps WHERE project = ? GROUP BY release ORDER BY max(uploaded_ms) DESC, max(rowid) DESC LIMIT ?)`).run(project, project, SOURCEMAP_RELEASES_KEPT);
|
|
16
|
+
}
|
|
17
|
+
/** The maps of a project, newest first; only one release when given. */
|
|
18
|
+
export function listSourceMaps(db, project, release) {
|
|
19
|
+
const sql = `SELECT release, file, bytes, uploaded_ms AS uploadedMs FROM sourcemaps WHERE project = ?${release ? " AND release = ?" : ""} ORDER BY uploaded_ms DESC LIMIT 1000`;
|
|
20
|
+
return db.prepare(sql).all(...(release ? [project, release] : [project]));
|
|
21
|
+
}
|
|
22
|
+
function readMap(db, project, release, url) {
|
|
23
|
+
const files = mapFileCandidates(url);
|
|
24
|
+
if (files.length === 0)
|
|
25
|
+
return null;
|
|
26
|
+
const sql = `SELECT map FROM sourcemaps WHERE project IN (?, '') AND release = ? AND file IN (${files.map(() => "?").join(", ")})
|
|
27
|
+
ORDER BY project DESC, length(file) DESC LIMIT 1`;
|
|
28
|
+
const row = db.prepare(sql).get(project, release, ...files);
|
|
29
|
+
return row ? gunzipSync(row.map, { maxOutputLength: MAX_SOURCEMAP_BYTES }).toString("utf8") : null;
|
|
30
|
+
}
|
|
31
|
+
/** Uploaded maps for one project (and maps uploaded with no project). Needs the release the browser sent. */
|
|
32
|
+
export function uploadedMapLoader(db, project) {
|
|
33
|
+
const load = async (url, release) => {
|
|
34
|
+
if (!release)
|
|
35
|
+
return null;
|
|
36
|
+
const text = readMap(db, project, release, url);
|
|
37
|
+
return text ? parseSourceMap(text) : null;
|
|
38
|
+
};
|
|
39
|
+
return cachedLoader(load, { max: 20, missMs: 5000 });
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=sourcemaps.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sourcemaps.js","sourceRoot":"","sources":["../src/sourcemaps.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AACjD,OAAO,EACL,YAAY,EAEZ,iBAAiB,EACjB,mBAAmB,EACnB,cAAc,EACd,uBAAuB,GAExB,MAAM,sBAAsB,CAAC;AAE9B,0GAA0G;AAC1G,MAAM,CAAC,MAAM,iBAAiB,GAAG;;;;;;CAMhC,CAAC;AAEF,6GAA6G;AAC7G,MAAM,UAAU,aAAa,CAAC,EAAgB,EAAE,OAAe,EAAE,OAAe,EAAE,IAAY,EAAE,GAAW,EAAE,GAAW;IACtH,EAAE,CAAC,OAAO,CAAC,+GAA+G,CAAC,CAAC,GAAG,CAC7H,OAAO,EACP,OAAO,EACP,IAAI,EACJ,QAAQ,CAAC,GAAG,CAAC,EACb,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,EACtB,GAAG,CACJ,CAAC;IACF,EAAE,CAAC,OAAO,CACR;iIAC6H,CAC9H,CAAC,GAAG,CAAC,OAAO,EAAE,OAAO,EAAE,uBAAuB,CAAC,CAAC;AACnD,CAAC;AAED,wEAAwE;AACxE,MAAM,UAAU,cAAc,CAAC,EAAgB,EAAE,OAAe,EAAE,OAAgB;IAChF,MAAM,GAAG,GAAG,2FAA2F,OAAO,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,EAAE,uCAAuC,CAAC;IAChL,OAAO,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAgC,CAAC;AAC3G,CAAC;AAED,SAAS,OAAO,CAAC,EAAgB,EAAE,OAAe,EAAE,OAAe,EAAE,GAAW;IAC9E,MAAM,KAAK,GAAG,iBAAiB,CAAC,GAAG,CAAC,CAAC;IACrC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IACpC,MAAM,GAAG,GAAG,oFAAoF,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;qDAC5E,CAAC;IACpD,MAAM,GAAG,GAAG,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,OAAO,EAAE,OAAO,EAAE,GAAG,KAAK,CAAoC,CAAC;IAC/F,OAAO,GAAG,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,eAAe,EAAE,mBAAmB,EAAE,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AACrG,CAAC;AAED,6GAA6G;AAC7G,MAAM,UAAU,iBAAiB,CAAC,EAAgB,EAAE,OAAe;IACjE,MAAM,IAAI,GAAc,KAAK,EAAE,GAAG,EAAE,OAAO,EAAE,EAAE;QAC7C,IAAI,CAAC,OAAO;YAAE,OAAO,IAAI,CAAC;QAC1B,MAAM,IAAI,GAAG,OAAO,CAAC,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,CAAC,CAAC;QAChD,OAAO,IAAI,CAAC,CAAC,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAC5C,CAAC,CAAC;IACF,OAAO,YAAY,CAAC,IAAI,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;AACvD,CAAC"}
|
package/dist/store-read.d.ts
CHANGED
|
@@ -9,6 +9,8 @@ export interface TraceQuery {
|
|
|
9
9
|
project?: string;
|
|
10
10
|
/** Only traces with a browser span from this tab. */
|
|
11
11
|
session?: string;
|
|
12
|
+
/** Leave out loose batches (lines outside a request), which are not traces to list. */
|
|
13
|
+
noLoose?: boolean;
|
|
12
14
|
limit: number;
|
|
13
15
|
}
|
|
14
16
|
/** Trace ids that match, newest first. */
|
package/dist/store-read.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"store-read.d.ts","sourceRoot":"","sources":["../src/store-read.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAiB,MAAM,aAAa,CAAC;AAC/D,OAAO,
|
|
1
|
+
{"version":3,"file":"store-read.d.ts","sourceRoot":"","sources":["../src/store-read.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAiB,MAAM,aAAa,CAAC;AAC/D,OAAO,EAAiE,KAAK,UAAU,EAA6B,KAAK,KAAK,EAAE,MAAM,sBAAsB,CAAC;AAE7J,MAAM,WAAW,UAAU;IACzB,4EAA4E;IAC5E,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,kEAAkE;IAClE,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,qDAAqD;IACrD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,uFAAuF;IACvF,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;CACf;AAID,0CAA0C;AAC1C,wBAAgB,YAAY,CAAC,EAAE,EAAE,YAAY,EAAE,CAAC,EAAE,UAAU,GAAG,MAAM,EAAE,CAYtE;AAgBD,gGAAgG;AAChG,wBAAgB,UAAU,CAAC,EAAE,EAAE,YAAY,EAAE,GAAG,EAAE,SAAS,MAAM,EAAE,EAAE,UAAU,GAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAoB,GAAG,KAAK,EAAE,CAUpI;AAED,wBAAgB,cAAc,CAAC,EAAE,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,GAAG,KAAK,GAAG,SAAS,CAG/H;AASD,sDAAsD;AACtD,wBAAgB,YAAY,CAAC,EAAE,EAAE,YAAY,EAAE,GAAG,EAAE,MAAM,GAAG,UAAU,EAAE,CASxE;AAED,sEAAsE;AACtE,wBAAgB,UAAU,CAAC,EAAE,EAAE,YAAY,EAAE,KAAK,EAAE,KAAK,GAAG,SAAS,GAAG,MAAM,EAAE,CAI/E;AAED,wBAAgB,SAAS,CAAC,EAAE,EAAE,YAAY,GAAG;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAG7E"}
|
package/dist/store-read.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { buildTrace, HUB_ONLINE_MS } from "@wizeworks/lens-core";
|
|
1
|
+
import { buildTrace, HUB_ONLINE_MS, LOOSE_TRACE_PREFIX } from "@wizeworks/lens-core";
|
|
2
2
|
const CHUNK = 400;
|
|
3
3
|
/** Trace ids that match, newest first. */
|
|
4
4
|
export function findTraceIds(db, q) {
|
|
@@ -15,6 +15,8 @@ export function findTraceIds(db, q) {
|
|
|
15
15
|
add("project = ?", q.project);
|
|
16
16
|
if (q.session)
|
|
17
17
|
add("trace_id IN (SELECT trace_id FROM spans WHERE session = ?)", q.session);
|
|
18
|
+
if (q.noLoose)
|
|
19
|
+
add("substr(trace_id, 1, 16) <> ?", LOOSE_TRACE_PREFIX);
|
|
18
20
|
const sql = `SELECT trace_id FROM traces ${where.length ? `WHERE ${where.join(" AND ")}` : ""} ORDER BY start_ms DESC LIMIT ?`;
|
|
19
21
|
return db.prepare(sql).all(...args, q.limit).map((r) => r.trace_id);
|
|
20
22
|
}
|
package/dist/store-read.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"store-read.js","sourceRoot":"","sources":["../src/store-read.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,aAAa,EAA0E,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"store-read.js","sourceRoot":"","sources":["../src/store-read.ts"],"names":[],"mappings":"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"}
|
package/dist/store.d.ts
CHANGED
|
@@ -9,12 +9,18 @@ export interface HubStoreOptions {
|
|
|
9
9
|
maxAgeMs?: number;
|
|
10
10
|
/** Most metric points kept. Default 2,000,000. */
|
|
11
11
|
maxMetricPoints?: number;
|
|
12
|
+
/** Oldest log line kept, in ms. Default: `maxAgeMs`. Lines outside a request go at this age; lines in a request go with their trace when that is sooner. */
|
|
13
|
+
logMaxAgeMs?: number;
|
|
14
|
+
/** Thresholds and redacted keys for projects that set none. */
|
|
15
|
+
slowQueryMs?: number;
|
|
16
|
+
nPlusOneThreshold?: number;
|
|
17
|
+
redactKeys?: readonly string[];
|
|
12
18
|
now?: () => number;
|
|
13
19
|
}
|
|
14
20
|
/** What one write holds. Spans and logs are already checked and redacted. */
|
|
15
21
|
export interface HubWrite {
|
|
16
22
|
sender: HubSender;
|
|
17
|
-
via: "addon" | "otlp";
|
|
23
|
+
via: "addon" | "otlp" | "uptime";
|
|
18
24
|
spans: readonly Span[];
|
|
19
25
|
logs: readonly HubLog[];
|
|
20
26
|
remotes: readonly HubRemote[];
|
|
@@ -28,14 +34,18 @@ export declare class HubStore {
|
|
|
28
34
|
readonly maxTraces: number;
|
|
29
35
|
readonly maxAgeMs: number;
|
|
30
36
|
readonly maxMetricPoints: number;
|
|
37
|
+
readonly logMaxAgeMs: number;
|
|
38
|
+
readonly slowQueryMs: number;
|
|
39
|
+
readonly nPlusOneThreshold: number;
|
|
40
|
+
readonly redactKeys: readonly string[];
|
|
31
41
|
readonly path: string;
|
|
32
42
|
readonly now: () => number;
|
|
33
43
|
/** Goes up whenever stats change (settle or prune), for cache keys. */
|
|
34
44
|
settleGen: number;
|
|
35
45
|
constructor(o: HubStoreOptions);
|
|
36
|
-
/** Save one batch in one transaction. */
|
|
46
|
+
/** Save one batch in one transaction, with the project's extra keys hidden too. */
|
|
37
47
|
write(w: HubWrite): void;
|
|
38
|
-
/** Drop traces past the age or count limit, and services not seen for as long. Returns traces dropped. */
|
|
48
|
+
/** Drop traces past the age or count limit, log lines past the log age, and services not seen for as long. Returns traces dropped. */
|
|
39
49
|
prune(): number;
|
|
40
50
|
close(): void;
|
|
41
51
|
}
|
package/dist/store.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../src/store.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,
|
|
1
|
+
{"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../src/store.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAkF,KAAK,MAAM,EAAgC,KAAK,SAAS,EAAE,KAAK,SAAS,EAAU,KAAK,WAAW,EAAe,KAAK,IAAI,EAAE,MAAM,sBAAsB,CAAC;AAQnP,MAAM,WAAW,eAAe;IAC9B,kCAAkC;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,uCAAuC;IACvC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,mEAAmE;IACnE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,kDAAkD;IAClD,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,4JAA4J;IAC5J,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,+DAA+D;IAC/D,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,UAAU,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC/B,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;CACpB;AAED,6EAA6E;AAC7E,MAAM,WAAW,QAAQ;IACvB,MAAM,EAAE,SAAS,CAAC;IAClB,GAAG,EAAE,OAAO,GAAG,MAAM,GAAG,QAAQ,CAAC;IACjC,KAAK,EAAE,SAAS,IAAI,EAAE,CAAC;IACvB,IAAI,EAAE,SAAS,MAAM,EAAE,CAAC;IACxB,OAAO,EAAE,SAAS,SAAS,EAAE,CAAC;IAC9B,8EAA8E;IAC9E,OAAO,CAAC,EAAE,SAAS,WAAW,EAAE,CAAC;CAClC;AASD,wGAAwG;AACxG,qBAAa,QAAQ;;IACnB,QAAQ,CAAC,EAAE,EAAE,YAAY,CAAC;IAC1B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAC;IACnC,QAAQ,CAAC,UAAU,EAAE,SAAS,MAAM,EAAE,CAAC;IACvC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,GAAG,EAAE,MAAM,MAAM,CAAC;IAE3B,uEAAuE;IACvE,SAAS,SAAK;IAEd,YAAY,CAAC,EAAE,eAAe,EAe7B;IAED,mFAAmF;IACnF,KAAK,CAAC,CAAC,EAAE,QAAQ,GAAG,IAAI,CAUvB;IAwCD,sIAAsI;IACtI,KAAK,IAAI,MAAM,CAsBd;IAUD,KAAK,IAAI,IAAI,CAMZ;CACF"}
|
package/dist/store.js
CHANGED
|
@@ -2,11 +2,13 @@ import { createHash } from "node:crypto";
|
|
|
2
2
|
import { mkdirSync } from "node:fs";
|
|
3
3
|
import { dirname } from "node:path";
|
|
4
4
|
import { DatabaseSync } from "node:sqlite";
|
|
5
|
-
import { ATTR_BROWSER_SESSION, logKey, seriesKeyOf } from "@wizeworks/lens-core";
|
|
5
|
+
import { ATTR_BROWSER_SESSION, DEFAULT_REDACT_KEYS, FACT_N_PLUS_ONE, FACT_SLOW_QUERY_MS, INFRA_SERVICE, redactSignals, logKey, seriesKeyOf } from "@wizeworks/lens-core";
|
|
6
6
|
import { prepareHubStatements } from "./schema.js";
|
|
7
7
|
import { upgradeHubSchema } from "./schema-scale.js";
|
|
8
8
|
import { pruneStats } from "./settle.js";
|
|
9
9
|
import { pruneMetricRollups, writeMetricRollups } from "./metrics-write.js";
|
|
10
|
+
import { projectSettings } from "./settings.js";
|
|
11
|
+
import { pruneProjectRows, shorterKeeps } from "./settings-prune.js";
|
|
10
12
|
const DAY_MS = 24 * 60 * 60_000;
|
|
11
13
|
const hashKey = (text) => createHash("sha1").update(text).digest("hex");
|
|
12
14
|
const sessionOf = (s) => {
|
|
@@ -19,6 +21,10 @@ export class HubStore {
|
|
|
19
21
|
maxTraces;
|
|
20
22
|
maxAgeMs;
|
|
21
23
|
maxMetricPoints;
|
|
24
|
+
logMaxAgeMs;
|
|
25
|
+
slowQueryMs;
|
|
26
|
+
nPlusOneThreshold;
|
|
27
|
+
redactKeys;
|
|
22
28
|
path;
|
|
23
29
|
now;
|
|
24
30
|
#stmts;
|
|
@@ -29,6 +35,10 @@ export class HubStore {
|
|
|
29
35
|
this.maxTraces = Math.max(1, o.maxTraces ?? 50_000);
|
|
30
36
|
this.maxAgeMs = Math.max(60_000, o.maxAgeMs ?? 7 * DAY_MS);
|
|
31
37
|
this.maxMetricPoints = Math.max(1, o.maxMetricPoints ?? 2_000_000);
|
|
38
|
+
this.logMaxAgeMs = Math.max(60_000, o.logMaxAgeMs ?? this.maxAgeMs);
|
|
39
|
+
this.slowQueryMs = o.slowQueryMs ?? FACT_SLOW_QUERY_MS;
|
|
40
|
+
this.nPlusOneThreshold = o.nPlusOneThreshold ?? FACT_N_PLUS_ONE;
|
|
41
|
+
this.redactKeys = o.redactKeys ?? DEFAULT_REDACT_KEYS;
|
|
32
42
|
this.now = o.now ?? Date.now;
|
|
33
43
|
if (o.path !== ":memory:")
|
|
34
44
|
mkdirSync(dirname(o.path), { recursive: true });
|
|
@@ -37,11 +47,12 @@ export class HubStore {
|
|
|
37
47
|
upgradeHubSchema(this.db);
|
|
38
48
|
this.#stmts = prepareHubStatements(this.db);
|
|
39
49
|
}
|
|
40
|
-
/** Save one batch in one transaction. */
|
|
50
|
+
/** Save one batch in one transaction, with the project's extra keys hidden too. */
|
|
41
51
|
write(w) {
|
|
52
|
+
const own = projectSettings(this.db, w.sender.project ?? "").redactKeys;
|
|
42
53
|
this.db.exec("BEGIN");
|
|
43
54
|
try {
|
|
44
|
-
this.#writeAll(w);
|
|
55
|
+
this.#writeAll(redactSignals(w, own));
|
|
45
56
|
this.db.exec("COMMIT");
|
|
46
57
|
}
|
|
47
58
|
catch (err) {
|
|
@@ -54,7 +65,9 @@ export class HubStore {
|
|
|
54
65
|
const env = w.sender.environment ?? "";
|
|
55
66
|
const project = w.sender.project ?? "";
|
|
56
67
|
const st = this.#stmts;
|
|
57
|
-
|
|
68
|
+
// The collector's host and Kubernetes receivers are not a service.
|
|
69
|
+
if (w.sender.service !== INFRA_SERVICE)
|
|
70
|
+
this.#touchService(w.sender, w.via, now);
|
|
58
71
|
for (const s of w.spans) {
|
|
59
72
|
st.upsertTrace.run(s.traceId, s.startMs, s.startMs + s.durationMs, now, env, project);
|
|
60
73
|
st.upsertSpan.run(s.traceId, s.spanId, s.service, s.startMs, s.durationMs, sessionOf(s), JSON.stringify(s));
|
|
@@ -73,13 +86,22 @@ export class HubStore {
|
|
|
73
86
|
const s = sender;
|
|
74
87
|
this.#stmts.upsertService.run(s.project ?? "", s.service, s.environment ?? "", s.host ?? "", via, JSON.stringify(sender), now, now);
|
|
75
88
|
}
|
|
76
|
-
/**
|
|
89
|
+
/** Traces past the age or count limit, loose batches (lines outside a request) past the log age, and traces of projects that keep less. */
|
|
90
|
+
#doomed(cutoff, logCutoff, shorter) {
|
|
91
|
+
const loose = "substr(trace_id, 1, 16) = '0000000000000000'";
|
|
92
|
+
const own = shorter.map(() => " UNION SELECT trace_id FROM traces WHERE project = ? AND start_ms < ?").join("");
|
|
93
|
+
return this.db
|
|
94
|
+
.prepare(`SELECT trace_id, project, env, contrib FROM traces WHERE trace_id IN (SELECT trace_id FROM traces WHERE start_ms < ? AND NOT ${loose}
|
|
95
|
+
UNION SELECT trace_id FROM traces WHERE start_ms < ? AND ${loose}${own}
|
|
96
|
+
UNION SELECT trace_id FROM (SELECT trace_id FROM traces WHERE NOT ${loose} ORDER BY start_ms DESC LIMIT -1 OFFSET ?))`)
|
|
97
|
+
.all(cutoff, logCutoff, ...shorter.flatMap((x) => [x.project, this.now() - x.keepMs]), this.maxTraces);
|
|
98
|
+
}
|
|
99
|
+
/** Drop traces past the age or count limit, log lines past the log age, and services not seen for as long. Returns traces dropped. */
|
|
77
100
|
prune() {
|
|
78
101
|
const cutoff = this.now() - this.maxAgeMs;
|
|
79
|
-
const
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
.all(cutoff, this.maxTraces);
|
|
102
|
+
const logCutoff = this.now() - this.logMaxAgeMs;
|
|
103
|
+
const shorter = shorterKeeps(this);
|
|
104
|
+
const doomed = this.#doomed(cutoff, logCutoff, shorter);
|
|
83
105
|
this.db.exec("BEGIN");
|
|
84
106
|
try {
|
|
85
107
|
pruneStats(this, doomed);
|
|
@@ -88,8 +110,11 @@ export class HubStore {
|
|
|
88
110
|
for (const r of doomed)
|
|
89
111
|
del.run(r.trace_id);
|
|
90
112
|
}
|
|
91
|
-
this.db.prepare("DELETE FROM
|
|
113
|
+
this.db.prepare("DELETE FROM logs WHERE time_ms < ?").run(logCutoff);
|
|
114
|
+
this.db.prepare("DELETE FROM services WHERE last_seen < ?").run(Math.min(cutoff, logCutoff));
|
|
92
115
|
this.#pruneMetrics(cutoff);
|
|
116
|
+
for (const s of shorter)
|
|
117
|
+
pruneProjectRows(this.db, s.project, this.now(), s.keepMs);
|
|
93
118
|
this.db.exec("COMMIT");
|
|
94
119
|
}
|
|
95
120
|
catch (err) {
|
package/dist/store.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"store.js","sourceRoot":"","sources":["../src/store.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACpC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,oBAAoB,
|
|
1
|
+
{"version":3,"file":"store.js","sourceRoot":"","sources":["../src/store.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { IncomingMessage, ServerResponse } from "node:http";
|
|
2
|
+
import type { ApiContext } from "./api.js";
|
|
3
|
+
/** `api/tags`, `api/tags/match`, and `api/tags/{id}`. False when `sub` is not a tags path. */
|
|
4
|
+
export declare function handleTags(c: ApiContext, sub: string, req: IncomingMessage, res: ServerResponse, url: URL): Promise<boolean>;
|
|
5
|
+
//# sourceMappingURL=tags-api.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tags-api.d.ts","sourceRoot":"","sources":["../src/tags-api.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAGjE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AA6E3C,8FAA8F;AAC9F,wBAAsB,UAAU,CAAC,CAAC,EAAE,UAAU,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,eAAe,EAAE,GAAG,EAAE,cAAc,EAAE,GAAG,EAAE,GAAG,GAAG,OAAO,CAAC,OAAO,CAAC,CAIlI"}
|
package/dist/tags-api.js
ADDED
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
import { activeTags, BUILT_IN_PREFIX, checkTagInput, matchTags, searchSql, SQLITE_DIALECT, TAG_LIMITS, tagMatchRequestOf } from "@wizeworks/lens-core";
|
|
2
|
+
import { sendJson } from "@wizeworks/lens-node/kit";
|
|
3
|
+
import { parseJson, readBody } from "./body.js";
|
|
4
|
+
import { sqliteRunner } from "./scale-exec.js";
|
|
5
|
+
import { createTag, deleteTag, hubTags, setBuiltIn, updateTag } from "./tags.js";
|
|
6
|
+
// The hub's tags API (docs/TAGS-PLAN.md). Changes come only from the hub's own pages (or a tool with no Origin), never another site.
|
|
7
|
+
/** True when a browser sent this from the hub's own origin, or no browser sent it. */
|
|
8
|
+
function sameOrigin(req) {
|
|
9
|
+
const origin = req.headers.origin;
|
|
10
|
+
if (!origin)
|
|
11
|
+
return true;
|
|
12
|
+
try {
|
|
13
|
+
return new URL(origin).host === req.headers.host;
|
|
14
|
+
}
|
|
15
|
+
catch {
|
|
16
|
+
return false;
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
async function bodyOf(req) {
|
|
20
|
+
try {
|
|
21
|
+
const b = parseJson(await readBody(req));
|
|
22
|
+
return b && typeof b === "object" ? b : {};
|
|
23
|
+
}
|
|
24
|
+
catch {
|
|
25
|
+
return {};
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
async function create(c, req, res) {
|
|
29
|
+
const db = c.data.store.db;
|
|
30
|
+
const own = hubTags(db).filter((t) => !t.builtIn);
|
|
31
|
+
if (own.length >= TAG_LIMITS.rules)
|
|
32
|
+
return sendJson(res, 400, { error: `The hub holds up to ${TAG_LIMITS.rules} tags. Delete one first.` });
|
|
33
|
+
const r = checkTagInput(await bodyOf(req), own.map((t) => t.name));
|
|
34
|
+
if (!r.ok)
|
|
35
|
+
return sendJson(res, 400, r);
|
|
36
|
+
sendJson(res, 201, createTag(db, r.input, c.o.now()));
|
|
37
|
+
}
|
|
38
|
+
/** A rule takes name, color, and query (what is left out stays); a built-in takes only `enabled`. */
|
|
39
|
+
async function change(c, id, req, res) {
|
|
40
|
+
const db = c.data.store.db;
|
|
41
|
+
const body = await bodyOf(req);
|
|
42
|
+
if (id.startsWith(BUILT_IN_PREFIX)) {
|
|
43
|
+
if (typeof body.enabled !== "boolean")
|
|
44
|
+
return sendJson(res, 400, { error: "A built-in tag can only be turned on or off: send { enabled }." });
|
|
45
|
+
return setBuiltIn(db, id, body.enabled) ? sendJson(res, 200, hubTags(db).find((t) => t.id === id)) : sendJson(res, 404, { error: "Tag not found." });
|
|
46
|
+
}
|
|
47
|
+
const tags = hubTags(db);
|
|
48
|
+
const current = tags.find((t) => t.id === id && !t.builtIn);
|
|
49
|
+
if (!current)
|
|
50
|
+
return sendJson(res, 404, { error: "Tag not found." });
|
|
51
|
+
const r = checkTagInput({ ...current, ...body }, tags.filter((t) => !t.builtIn && t.id !== id).map((t) => t.name));
|
|
52
|
+
if (!r.ok)
|
|
53
|
+
return sendJson(res, 400, r);
|
|
54
|
+
updateTag(db, id, r.input, c.o.now());
|
|
55
|
+
sendJson(res, 200, { ...current, ...r.input });
|
|
56
|
+
}
|
|
57
|
+
async function match(c, req, res, p) {
|
|
58
|
+
const r = tagMatchRequestOf(await bodyOf(req));
|
|
59
|
+
if (!r.ok)
|
|
60
|
+
return sendJson(res, 400, r);
|
|
61
|
+
const src = { d: SQLITE_DIALECT, run: sqliteRunner(c.data.store.db), scope: { project: p.get("project") || undefined } };
|
|
62
|
+
sendJson(res, 200, { matches: await matchTags((q) => searchSql(src, q), r.kind, r.items, activeTags(hubTags(c.data.store.db)), p.get("env") || undefined) });
|
|
63
|
+
}
|
|
64
|
+
function remove(c, id, res) {
|
|
65
|
+
if (deleteTag(c.data.store.db, id))
|
|
66
|
+
sendJson(res, 200, { ok: true });
|
|
67
|
+
else
|
|
68
|
+
sendJson(res, 404, { error: "Tag not found." });
|
|
69
|
+
}
|
|
70
|
+
async function routeTags(c, sub, req, res, url) {
|
|
71
|
+
const method = req.method ?? "GET";
|
|
72
|
+
if (sub === "api/tags" && method === "GET")
|
|
73
|
+
return sendJson(res, 200, { tags: hubTags(c.data.store.db), editable: true, max: TAG_LIMITS.rules });
|
|
74
|
+
if (sub === "api/tags/match" && method === "POST")
|
|
75
|
+
return match(c, req, res, url.searchParams);
|
|
76
|
+
if (!sameOrigin(req))
|
|
77
|
+
return sendJson(res, 403, { error: "Change tags from the hub's own dashboard." });
|
|
78
|
+
const id = decodeURIComponent(sub.slice("api/tags/".length));
|
|
79
|
+
if (sub === "api/tags" && method === "POST")
|
|
80
|
+
return create(c, req, res);
|
|
81
|
+
if (id && method === "PATCH")
|
|
82
|
+
return change(c, id, req, res);
|
|
83
|
+
if (id && method === "DELETE")
|
|
84
|
+
return remove(c, id, res);
|
|
85
|
+
sendJson(res, 405, { error: "method not allowed" });
|
|
86
|
+
}
|
|
87
|
+
/** `api/tags`, `api/tags/match`, and `api/tags/{id}`. False when `sub` is not a tags path. */
|
|
88
|
+
export async function handleTags(c, sub, req, res, url) {
|
|
89
|
+
if (sub !== "api/tags" && !sub.startsWith("api/tags/"))
|
|
90
|
+
return false;
|
|
91
|
+
await routeTags(c, sub, req, res, url);
|
|
92
|
+
return true;
|
|
93
|
+
}
|
|
94
|
+
//# sourceMappingURL=tags-api.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tags-api.js","sourceRoot":"","sources":["../src/tags-api.ts"],"names":[],"mappings":"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"}
|
package/dist/tags.d.ts
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { DatabaseSync } from "node:sqlite";
|
|
2
|
+
import { type TagInput, type TagRule } from "@wizeworks/lens-core";
|
|
3
|
+
/** Built-ins first (minus those turned off), then the hub's rules by name. */
|
|
4
|
+
export declare function hubTags(db: DatabaseSync): TagRule[];
|
|
5
|
+
export declare function createTag(db: DatabaseSync, input: TagInput, now: number): TagRule;
|
|
6
|
+
/** Change a rule; false when there is none with this id. */
|
|
7
|
+
export declare function updateTag(db: DatabaseSync, id: string, input: TagInput, now: number): boolean;
|
|
8
|
+
export declare function deleteTag(db: DatabaseSync, id: string): boolean;
|
|
9
|
+
/** Turn a built-in on or off; false when `id` is not a built-in. */
|
|
10
|
+
export declare function setBuiltIn(db: DatabaseSync, id: string, enabled: boolean): boolean;
|
|
11
|
+
//# sourceMappingURL=tags.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tags.d.ts","sourceRoot":"","sources":["../src/tags.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,EAAiD,KAAK,QAAQ,EAAE,KAAK,OAAO,EAAW,MAAM,sBAAsB,CAAC;AAa3H,8EAA8E;AAC9E,wBAAgB,OAAO,CAAC,EAAE,EAAE,YAAY,GAAG,OAAO,EAAE,CAInD;AAED,wBAAgB,SAAS,CAAC,EAAE,EAAE,YAAY,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAIjF;AAED,4DAA4D;AAC5D,wBAAgB,SAAS,CAAC,EAAE,EAAE,YAAY,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAG7F;AAED,wBAAgB,SAAS,CAAC,EAAE,EAAE,YAAY,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAE/D;AAED,oEAAoE;AACpE,wBAAgB,UAAU,CAAC,EAAE,EAAE,YAAY,EAAE,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAKlF"}
|
package/dist/tags.js
ADDED
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { randomUUID } from "node:crypto";
|
|
2
|
+
import { BUILT_IN_PREFIX, isBuiltInName, tagList } from "@wizeworks/lens-core";
|
|
3
|
+
const ruleOf = (r) => ({ id: r.id, name: r.name, color: r.color, query: r.query, builtIn: false, enabled: true });
|
|
4
|
+
/** Built-ins first (minus those turned off), then the hub's rules by name. */
|
|
5
|
+
export function hubTags(db) {
|
|
6
|
+
const rules = db.prepare("SELECT id, name, color, query FROM tag_rules").all().map(ruleOf);
|
|
7
|
+
const off = db.prepare("SELECT name FROM tag_builtins WHERE enabled = 0").all();
|
|
8
|
+
return tagList(rules, new Set(off.map((r) => r.name)));
|
|
9
|
+
}
|
|
10
|
+
export function createTag(db, input, now) {
|
|
11
|
+
const id = randomUUID();
|
|
12
|
+
db.prepare("INSERT INTO tag_rules (id, name, color, query, created_ms, updated_ms) VALUES (?, ?, ?, ?, ?, ?)").run(id, input.name, input.color, input.query, now, now);
|
|
13
|
+
return { id, ...input, builtIn: false, enabled: true };
|
|
14
|
+
}
|
|
15
|
+
/** Change a rule; false when there is none with this id. */
|
|
16
|
+
export function updateTag(db, id, input, now) {
|
|
17
|
+
const r = db.prepare("UPDATE tag_rules SET name = ?, color = ?, query = ?, updated_ms = ? WHERE id = ?").run(input.name, input.color, input.query, now, id);
|
|
18
|
+
return Number(r.changes) > 0;
|
|
19
|
+
}
|
|
20
|
+
export function deleteTag(db, id) {
|
|
21
|
+
return Number(db.prepare("DELETE FROM tag_rules WHERE id = ?").run(id).changes) > 0;
|
|
22
|
+
}
|
|
23
|
+
/** Turn a built-in on or off; false when `id` is not a built-in. */
|
|
24
|
+
export function setBuiltIn(db, id, enabled) {
|
|
25
|
+
const name = id.startsWith(BUILT_IN_PREFIX) ? id.slice(BUILT_IN_PREFIX.length) : "";
|
|
26
|
+
if (!isBuiltInName(name))
|
|
27
|
+
return false;
|
|
28
|
+
db.prepare("INSERT INTO tag_builtins (name, enabled) VALUES (?, ?) ON CONFLICT(name) DO UPDATE SET enabled = excluded.enabled").run(name, enabled ? 1 : 0);
|
|
29
|
+
return true;
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=tags.js.map
|
package/dist/tags.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tags.js","sourceRoot":"","sources":["../src/tags.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,OAAO,EAAE,eAAe,EAAE,aAAa,EAA8C,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAW3H,MAAM,MAAM,GAAG,CAAC,CAAU,EAAW,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,KAAiB,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;AAEhJ,8EAA8E;AAC9E,MAAM,UAAU,OAAO,CAAC,EAAgB;IACtC,MAAM,KAAK,GAAI,EAAE,CAAC,OAAO,CAAC,8CAA8C,CAAC,CAAC,GAAG,EAA2B,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IACrH,MAAM,GAAG,GAAG,EAAE,CAAC,OAAO,CAAC,iDAAiD,CAAC,CAAC,GAAG,EAAwB,CAAC;IACtG,OAAO,OAAO,CAAC,KAAK,EAAE,IAAI,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AACzD,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,EAAgB,EAAE,KAAe,EAAE,GAAW;IACtE,MAAM,EAAE,GAAG,UAAU,EAAE,CAAC;IACxB,EAAE,CAAC,OAAO,CAAC,kGAAkG,CAAC,CAAC,GAAG,CAAC,EAAE,EAAE,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;IACvK,OAAO,EAAE,EAAE,EAAE,GAAG,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;AACzD,CAAC;AAED,4DAA4D;AAC5D,MAAM,UAAU,SAAS,CAAC,EAAgB,EAAE,EAAU,EAAE,KAAe,EAAE,GAAW;IAClF,MAAM,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,kFAAkF,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE,CAAC,CAAC;IAC5J,OAAO,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;AAC/B,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,EAAgB,EAAE,EAAU;IACpD,OAAO,MAAM,CAAC,EAAE,CAAC,OAAO,CAAC,oCAAoC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;AACtF,CAAC;AAED,oEAAoE;AACpE,MAAM,UAAU,UAAU,CAAC,EAAgB,EAAE,EAAU,EAAE,OAAgB;IACvE,MAAM,IAAI,GAAG,EAAE,CAAC,UAAU,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACpF,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC;QAAE,OAAO,KAAK,CAAC;IACvC,EAAE,CAAC,OAAO,CAAC,mHAAmH,CAAC,CAAC,GAAG,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC3J,OAAO,IAAI,CAAC;AACd,CAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { IncomingMessage, ServerResponse } from "node:http";
|
|
2
|
+
import type { ApiContext } from "../api.js";
|
|
3
|
+
/** `api/uptime` and `api/uptime/<id>`: list, add, change, remove, and run a check now. */
|
|
4
|
+
export declare function handleUptime(c: ApiContext, sub: string, req: IncomingMessage, res: ServerResponse, url: URL): Promise<void>;
|
|
5
|
+
//# sourceMappingURL=api.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../src/uptime/api.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAGjE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAuD5C,0FAA0F;AAC1F,wBAAsB,YAAY,CAAC,CAAC,EAAE,UAAU,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,eAAe,EAAE,GAAG,EAAE,cAAc,EAAE,GAAG,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,CAajI"}
|