@relkit/inspector-api 0.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.
Files changed (91) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +5 -0
  3. package/dist/actions-dispatch.d.ts +4 -0
  4. package/dist/actions-dispatch.d.ts.map +1 -0
  5. package/dist/actions-dispatch.js +80 -0
  6. package/dist/actions-dispatch.js.map +1 -0
  7. package/dist/actions-errors.d.ts +7 -0
  8. package/dist/actions-errors.d.ts.map +1 -0
  9. package/dist/actions-errors.js +13 -0
  10. package/dist/actions-errors.js.map +1 -0
  11. package/dist/actions-projection.d.ts +7 -0
  12. package/dist/actions-projection.d.ts.map +1 -0
  13. package/dist/actions-projection.js +79 -0
  14. package/dist/actions-projection.js.map +1 -0
  15. package/dist/actions-runtime.d.ts +15 -0
  16. package/dist/actions-runtime.d.ts.map +1 -0
  17. package/dist/actions-runtime.js +96 -0
  18. package/dist/actions-runtime.js.map +1 -0
  19. package/dist/actions-utils.d.ts +17 -0
  20. package/dist/actions-utils.d.ts.map +1 -0
  21. package/dist/actions-utils.js +103 -0
  22. package/dist/actions-utils.js.map +1 -0
  23. package/dist/actions.d.ts +107 -0
  24. package/dist/actions.d.ts.map +1 -0
  25. package/dist/actions.js +56 -0
  26. package/dist/actions.js.map +1 -0
  27. package/dist/diagnostics.d.ts +4 -0
  28. package/dist/diagnostics.d.ts.map +1 -0
  29. package/dist/diagnostics.js +73 -0
  30. package/dist/diagnostics.js.map +1 -0
  31. package/dist/environment.d.ts +5 -0
  32. package/dist/environment.d.ts.map +1 -0
  33. package/dist/environment.js +61 -0
  34. package/dist/environment.js.map +1 -0
  35. package/dist/events-runtime.d.ts +6 -0
  36. package/dist/events-runtime.d.ts.map +1 -0
  37. package/dist/events-runtime.js +181 -0
  38. package/dist/events-runtime.js.map +1 -0
  39. package/dist/generation-types.d.ts +22 -0
  40. package/dist/generation-types.d.ts.map +1 -0
  41. package/dist/generation-types.js +2 -0
  42. package/dist/generation-types.js.map +1 -0
  43. package/dist/generation.d.ts +3 -0
  44. package/dist/generation.d.ts.map +1 -0
  45. package/dist/generation.js +87 -0
  46. package/dist/generation.js.map +1 -0
  47. package/dist/graph-utils.d.ts +6 -0
  48. package/dist/graph-utils.d.ts.map +1 -0
  49. package/dist/graph-utils.js +60 -0
  50. package/dist/graph-utils.js.map +1 -0
  51. package/dist/graph.d.ts +14 -0
  52. package/dist/graph.d.ts.map +1 -0
  53. package/dist/graph.js +120 -0
  54. package/dist/graph.js.map +1 -0
  55. package/dist/index.d.ts +11 -0
  56. package/dist/index.d.ts.map +1 -0
  57. package/dist/index.js +11 -0
  58. package/dist/index.js.map +1 -0
  59. package/dist/observability-utils.d.ts +4 -0
  60. package/dist/observability-utils.d.ts.map +1 -0
  61. package/dist/observability-utils.js +150 -0
  62. package/dist/observability-utils.js.map +1 -0
  63. package/dist/observability.d.ts +23 -0
  64. package/dist/observability.d.ts.map +1 -0
  65. package/dist/observability.js +126 -0
  66. package/dist/observability.js.map +1 -0
  67. package/dist/resource-explorer.d.ts +54 -0
  68. package/dist/resource-explorer.d.ts.map +1 -0
  69. package/dist/resource-explorer.js +119 -0
  70. package/dist/resource-explorer.js.map +1 -0
  71. package/dist/resource-routes.d.ts +6 -0
  72. package/dist/resource-routes.d.ts.map +1 -0
  73. package/dist/resource-routes.js +10 -0
  74. package/dist/resource-routes.js.map +1 -0
  75. package/dist/router-utils.d.ts +26 -0
  76. package/dist/router-utils.d.ts.map +1 -0
  77. package/dist/router-utils.js +129 -0
  78. package/dist/router-utils.js.map +1 -0
  79. package/dist/router.d.ts +23 -0
  80. package/dist/router.d.ts.map +1 -0
  81. package/dist/router.js +94 -0
  82. package/dist/router.js.map +1 -0
  83. package/dist/runtime.d.ts +13 -0
  84. package/dist/runtime.d.ts.map +1 -0
  85. package/dist/runtime.js +158 -0
  86. package/dist/runtime.js.map +1 -0
  87. package/dist/shared.d.ts +74 -0
  88. package/dist/shared.d.ts.map +1 -0
  89. package/dist/shared.js +120 -0
  90. package/dist/shared.js.map +1 -0
  91. package/package.json +41 -0
@@ -0,0 +1,60 @@
1
+ import { deepFreeze } from "@relkit/contracts";
2
+ import { isRecord, pick, safeJson, safeSource } from "./shared.js";
3
+ const GRAPH_FIELDS = `
4
+ environment providerBindings observability defaults name type requiredIn hasDefault sensitive
5
+ description input output errors dependencies timeoutMs concurrency generated triggerType
6
+ targetFunctionId config method path request responses middleware transforms selector expansion
7
+ delivery profile retry schedule idempotency version payload sensitiveFields visibility maxObjectBytes
8
+ allowedContentTypes key value defaultTtlMs maxTtlMs sideEffect approval model toolIds limits
9
+ generatedFunction capabilities capability adapter ownership configuration
10
+ title tags members order ownerId ownerKind phase
11
+ `
12
+ .trim()
13
+ .split(/\s+/);
14
+ export function projectNode(value) {
15
+ if (!isRecord(value) || typeof value.kind !== "string" || typeof value.id !== "string")
16
+ return undefined;
17
+ const result = { kind: value.kind, id: value.id };
18
+ const source = safeSource(value.source);
19
+ if (source !== undefined)
20
+ result.source = source;
21
+ for (const key of GRAPH_FIELDS) {
22
+ if (value[key] === undefined)
23
+ continue;
24
+ const field = safeJson({ value: value[key] });
25
+ if (isRecord(field) && field.value !== undefined)
26
+ result[key] = field.value;
27
+ }
28
+ const projected = safeJson(result);
29
+ if (!isRecord(projected) || !isRecord(value.config))
30
+ return projected;
31
+ const request = safeConfigRequest(value.config.request);
32
+ if (request === undefined || !isRecord(projected.config))
33
+ return projected;
34
+ return deepFreeze({ ...projected, config: { ...projected.config, request } });
35
+ }
36
+ function safeConfigRequest(value) {
37
+ const field = safeJson({ value });
38
+ return isRecord(field) && field.value !== undefined ? field.value : undefined;
39
+ }
40
+ export function projectDescriptors(value) {
41
+ return toItems(value).flatMap((item) => {
42
+ const projected = projectNode(item);
43
+ return projected === undefined ? [] : [projected];
44
+ });
45
+ }
46
+ export function projectObservedEdges(value) {
47
+ return toItems(value).flatMap((edge) => {
48
+ if (!isRecord(edge) || typeof edge.from !== "string" || typeof edge.to !== "string")
49
+ return [];
50
+ return [safeJson(pick(edge, ["relationship", "kind", "from", "to"]))];
51
+ });
52
+ }
53
+ export function toItems(value) {
54
+ if (Array.isArray(value))
55
+ return value;
56
+ if (isRecord(value) && Array.isArray(value.items))
57
+ return value.items;
58
+ return value === undefined || value === null ? [] : [value];
59
+ }
60
+ //# sourceMappingURL=graph-utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"graph-utils.js","sourceRoot":"","sources":["../src/graph-utils.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import { type JsonValue } from "@relkit/contracts";
2
+ import { type ResolvedActiveGeneration } from "./shared.js";
3
+ export declare const GRAPH_COLLECTIONS: readonly ["descriptors", "routes", "middlewares", "functions", "jobs", "events", "buckets", "cache", "tools", "agents", "services", "providers"];
4
+ export type GraphCollection = (typeof GRAPH_COLLECTIONS)[number];
5
+ export declare class InspectorGraphError extends Error {
6
+ readonly code: "RELKIT_INSPECTOR_GRAPH_UNAVAILABLE" | "RELKIT_INSPECTOR_NOT_FOUND";
7
+ readonly status: 404 | 503;
8
+ constructor(code: "RELKIT_INSPECTOR_GRAPH_UNAVAILABLE" | "RELKIT_INSPECTOR_NOT_FOUND", status: 404 | 503);
9
+ }
10
+ export declare function graphSnapshot(generation: ResolvedActiveGeneration): Promise<JsonValue>;
11
+ export declare function graphList(generation: ResolvedActiveGeneration, collection: GraphCollection, request: Request): Promise<JsonValue>;
12
+ export declare function graphDetail(generation: ResolvedActiveGeneration, collection: GraphCollection, id: string): JsonValue;
13
+ export declare function sourceDetail(generation: ResolvedActiveGeneration, id: string): JsonValue;
14
+ //# sourceMappingURL=graph.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"graph.d.ts","sourceRoot":"","sources":["../src/graph.ts"],"names":[],"mappings":"AAAA,OAAO,EAAiB,KAAK,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAClE,OAAO,EAML,KAAK,wBAAwB,EAC9B,MAAM,aAAa,CAAC;AAGrB,eAAO,MAAM,iBAAiB,kJAanB,CAAC;AACZ,MAAM,MAAM,eAAe,GAAG,CAAC,OAAO,iBAAiB,CAAC,CAAC,MAAM,CAAC,CAAC;AAEjE,qBAAa,mBAAoB,SAAQ,KAAK;IAE1C,QAAQ,CAAC,IAAI,EAAE,oCAAoC,GAAG,4BAA4B;IAClF,QAAQ,CAAC,MAAM,EAAE,GAAG,GAAG,GAAG;gBADjB,IAAI,EAAE,oCAAoC,GAAG,4BAA4B,EACzE,MAAM,EAAE,GAAG,GAAG,GAAG;CAK7B;AAED,wBAAsB,aAAa,CAAC,UAAU,EAAE,wBAAwB,GAAG,OAAO,CAAC,SAAS,CAAC,CAU5F;AAED,wBAAsB,SAAS,CAC7B,UAAU,EAAE,wBAAwB,EACpC,UAAU,EAAE,eAAe,EAC3B,OAAO,EAAE,OAAO,GACf,OAAO,CAAC,SAAS,CAAC,CAOpB;AAED,wBAAgB,WAAW,CACzB,UAAU,EAAE,wBAAwB,EACpC,UAAU,EAAE,eAAe,EAC3B,EAAE,EAAE,MAAM,GACT,SAAS,CAmBX;AAED,wBAAgB,YAAY,CAAC,UAAU,EAAE,wBAAwB,EAAE,EAAE,EAAE,MAAM,GAAG,SAAS,CAOxF"}
package/dist/graph.js ADDED
@@ -0,0 +1,120 @@
1
+ import { GRAPH_VERSION } from "@relkit/contracts";
2
+ import { identity, isRecord, page, pick, safeJson, } from "./shared.js";
3
+ import { projectDescriptors, projectNode, projectObservedEdges } from "./graph-utils.js";
4
+ export const GRAPH_COLLECTIONS = Object.freeze([
5
+ "descriptors",
6
+ "routes",
7
+ "middlewares",
8
+ "functions",
9
+ "jobs",
10
+ "events",
11
+ "buckets",
12
+ "cache",
13
+ "tools",
14
+ "agents",
15
+ "services",
16
+ "providers",
17
+ ]);
18
+ export class InspectorGraphError extends Error {
19
+ code;
20
+ status;
21
+ constructor(code, status) {
22
+ super(code);
23
+ this.code = code;
24
+ this.status = status;
25
+ this.name = "InspectorGraphError";
26
+ }
27
+ }
28
+ export async function graphSnapshot(generation) {
29
+ const data = graphData(generation.graph);
30
+ if (data === undefined)
31
+ throw new InspectorGraphError("RELKIT_INSPECTOR_GRAPH_UNAVAILABLE", 503);
32
+ const observedEdges = projectObservedEdges(generation.observedEdges);
33
+ return {
34
+ ...identity(generation),
35
+ graph: { ...data, ...(observedEdges.length === 0 ? {} : { observedEdges }) },
36
+ ...data,
37
+ ...(observedEdges.length === 0 ? {} : { observedEdges }),
38
+ };
39
+ }
40
+ export async function graphList(generation, collection, request) {
41
+ const items = collection === "descriptors" && generation.descriptors !== undefined
42
+ ? projectDescriptors(generation.descriptors)
43
+ : graphItems(generation.graph, collection);
44
+ if (items === undefined)
45
+ throw new InspectorGraphError("RELKIT_INSPECTOR_GRAPH_UNAVAILABLE", 503);
46
+ return { ...identity(generation), ...page(items, request) };
47
+ }
48
+ export function graphDetail(generation, collection, id) {
49
+ const items = collection === "descriptors" && generation.descriptors !== undefined
50
+ ? projectDescriptors(generation.descriptors)
51
+ : graphItems(generation.graph, collection);
52
+ const item = items?.find((value) => isRecord(value) && value.id === id);
53
+ if (item === undefined)
54
+ throw new InspectorGraphError("RELKIT_INSPECTOR_NOT_FOUND", 404);
55
+ const data = graphData(generation.graph);
56
+ const declaredEdges = data?.edges.filter((edge) => edgeTouches(edge, id));
57
+ const observedEdges = projectObservedEdges(generation.observedEdges).filter((edge) => edgeTouches(edge, id));
58
+ return {
59
+ ...identity(generation),
60
+ descriptor: item,
61
+ node: item,
62
+ ...(declaredEdges === undefined ? {} : { declaredEdges }),
63
+ ...(observedEdges.length === 0 ? {} : { observedEdges }),
64
+ };
65
+ }
66
+ export function sourceDetail(generation, id) {
67
+ const node = graphItems(generation.graph, "descriptors")?.find((value) => isRecord(value) && value.id === id);
68
+ if (!isRecord(node) || node.source === undefined)
69
+ throw new InspectorGraphError("RELKIT_INSPECTOR_NOT_FOUND", 404);
70
+ return { ...identity(generation), id, source: node.source };
71
+ }
72
+ function graphData(value) {
73
+ if (!isRecord(value) || !Array.isArray(value.nodes) || !Array.isArray(value.edges))
74
+ return undefined;
75
+ const nodes = value.nodes.flatMap((node) => {
76
+ const projected = projectNode(node);
77
+ return projected === undefined ? [] : [projected];
78
+ });
79
+ const edges = value.edges.flatMap((edge) => {
80
+ if (!isRecord(edge) ||
81
+ typeof edge.kind !== "string" ||
82
+ typeof edge.from !== "string" ||
83
+ typeof edge.to !== "string")
84
+ return [];
85
+ return [
86
+ safeJson(pick(edge, ["kind", "from", "to", "role", "member", "order", "match", "phase"])),
87
+ ];
88
+ });
89
+ return {
90
+ contractVersion: typeof value.contractVersion === "number" && Number.isSafeInteger(value.contractVersion)
91
+ ? value.contractVersion
92
+ : GRAPH_VERSION,
93
+ ...(typeof value.appId === "string" ? { appId: value.appId } : {}),
94
+ nodes,
95
+ edges,
96
+ };
97
+ }
98
+ function graphItems(value, collection) {
99
+ const data = graphData(value);
100
+ if (data === undefined)
101
+ return undefined;
102
+ if (collection === "descriptors")
103
+ return data.nodes;
104
+ return data.nodes.filter((node) => belongs(node, collection));
105
+ }
106
+ function belongs(node, collection) {
107
+ if (!isRecord(node))
108
+ return false;
109
+ if (collection === "routes")
110
+ return node.kind === "trigger" && isRecord(node.config) && node.config.method !== undefined;
111
+ if (collection === "env")
112
+ return node.kind === "env";
113
+ if (collection === "providers")
114
+ return node.kind === "provider";
115
+ return node.kind === (collection === "cache" ? "cache" : collection.slice(0, -1));
116
+ }
117
+ function edgeTouches(edge, id) {
118
+ return isRecord(edge) && (edge.from === id || edge.to === id);
119
+ }
120
+ //# sourceMappingURL=graph.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"graph.js","sourceRoot":"","sources":["../src/graph.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ export * from "./observability.js";
2
+ export * from "./shared.js";
3
+ export * from "./generation-types.js";
4
+ export * from "./router.js";
5
+ export * from "./graph.js";
6
+ export * from "./runtime.js";
7
+ export * from "./events-runtime.js";
8
+ export * from "./actions.js";
9
+ export * from "./resource-explorer.js";
10
+ export { installInspectorEndpoints as installInspectorApi, installInspectorEndpoints as installInspectorRouter, } from "./router.js";
11
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,oBAAoB,CAAC;AACnC,cAAc,aAAa,CAAC;AAC5B,cAAc,uBAAuB,CAAC;AACtC,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC;AAC3B,cAAc,cAAc,CAAC;AAC7B,cAAc,qBAAqB,CAAC;AACpC,cAAc,cAAc,CAAC;AAC7B,cAAc,wBAAwB,CAAC;AACvC,OAAO,EACL,yBAAyB,IAAI,mBAAmB,EAChD,yBAAyB,IAAI,sBAAsB,GACpD,MAAM,aAAa,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,11 @@
1
+ export * from "./observability.js";
2
+ export * from "./shared.js";
3
+ export * from "./generation-types.js";
4
+ export * from "./router.js";
5
+ export * from "./graph.js";
6
+ export * from "./runtime.js";
7
+ export * from "./events-runtime.js";
8
+ export * from "./actions.js";
9
+ export * from "./resource-explorer.js";
10
+ export { installInspectorEndpoints as installInspectorApi, installInspectorEndpoints as installInspectorRouter, } from "./router.js";
11
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,oBAAoB,CAAC;AACnC,cAAc,aAAa,CAAC;AAC5B,cAAc,uBAAuB,CAAC;AACtC,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC;AAC3B,cAAc,cAAc,CAAC;AAC7B,cAAc,qBAAqB,CAAC;AACpC,cAAc,cAAc,CAAC;AAC7B,cAAc,wBAAwB,CAAC;AACvC,OAAO,EACL,yBAAyB,IAAI,mBAAmB,EAChD,yBAAyB,IAAI,sBAAsB,GACpD,MAAM,aAAa,CAAC"}
@@ -0,0 +1,4 @@
1
+ import { type ObservabilityQueryRequest, type ObservabilityStream } from "@relkit/observability";
2
+ export declare function readObservabilityQuery(request: Request): ObservabilityQueryRequest;
3
+ export declare function streamResponse(stream: ObservabilityStream, request: Request, apiVersion: number): Response;
4
+ //# sourceMappingURL=observability-utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"observability-utils.d.ts","sourceRoot":"","sources":["../src/observability-utils.ts"],"names":[],"mappings":"AACA,OAAO,EAKL,KAAK,yBAAyB,EAC9B,KAAK,mBAAmB,EAKzB,MAAM,uBAAuB,CAAC;AAE/B,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,OAAO,GAAG,yBAAyB,CAgClF;AA2CD,wBAAgB,cAAc,CAC5B,MAAM,EAAE,mBAAmB,EAC3B,OAAO,EAAE,OAAO,EAChB,UAAU,EAAE,MAAM,GACjB,QAAQ,CAwDV"}
@@ -0,0 +1,150 @@
1
+ import { canonicalJson } from "@relkit/contracts";
2
+ import { MAX_OBSERVABILITY_QUERY_LIMIT, ObservabilityQueryError, OBSERVABILITY_STREAM_EVENT_TYPES, ObservabilityStreamError, } from "@relkit/observability";
3
+ export function readObservabilityQuery(request) {
4
+ const params = new URL(request.url).searchParams;
5
+ const value = {};
6
+ for (const name of [
7
+ "from",
8
+ "to",
9
+ "severity",
10
+ "routeId",
11
+ "functionId",
12
+ "outcome",
13
+ "requestId",
14
+ "traceId",
15
+ "serviceId",
16
+ "generationId",
17
+ "graphHash",
18
+ ]) {
19
+ const item = params.get(name);
20
+ if (item !== null) {
21
+ if (item.length === 0)
22
+ throw queryError(`${name} is invalid`);
23
+ value[name] = item;
24
+ }
25
+ }
26
+ const cursor = params.get("cursor");
27
+ if (cursor !== null)
28
+ value.cursor = String(integer(cursor, "cursor"));
29
+ const limit = params.get("limit");
30
+ if (limit !== null)
31
+ value.limit = Math.min(integer(limit, "limit"), MAX_OBSERVABILITY_QUERY_LIMIT);
32
+ const protocol = params.get("protocol");
33
+ if (protocol !== null)
34
+ value.protocol = protocol;
35
+ const version = params.get("version");
36
+ if (version !== null)
37
+ value.version = integer(version, "version");
38
+ return value;
39
+ }
40
+ function readStreamOptions(request) {
41
+ const params = new URL(request.url).searchParams;
42
+ const cursor = params.get("cursor");
43
+ const afterCursor = params.get("afterCursor");
44
+ const lastEventId = request.headers.get("last-event-id") || undefined;
45
+ const effectiveCursor = cursor ?? lastEventId;
46
+ if (cursor !== null && lastEventId !== undefined && cursor !== lastEventId)
47
+ throw streamError("cursor and Last-Event-ID disagree");
48
+ if (effectiveCursor !== undefined)
49
+ integer(effectiveCursor, "cursor");
50
+ if (afterCursor !== null)
51
+ integer(afterCursor, "afterCursor");
52
+ const type = params.get("type");
53
+ if (type !== null && !OBSERVABILITY_STREAM_EVENT_TYPES.includes(type))
54
+ throw streamError("stream event type is invalid");
55
+ const overflow = params.get("overflow");
56
+ const backpressure = params.get("backpressure");
57
+ if (overflow !== null && backpressure !== null && overflow !== backpressure)
58
+ throw streamError("overflow and backpressure disagree");
59
+ const queueSize = params.get("queueSize");
60
+ const result = {};
61
+ if (effectiveCursor !== undefined)
62
+ result.cursor = effectiveCursor;
63
+ if (afterCursor !== null)
64
+ result.afterCursor = afterCursor;
65
+ if (queueSize !== null)
66
+ result.queueSize = integer(queueSize, "queueSize");
67
+ if (overflow !== null)
68
+ result.overflow = overflow;
69
+ if (backpressure !== null)
70
+ result.backpressure = backpressure;
71
+ if (type !== null)
72
+ result.type = type;
73
+ return result;
74
+ }
75
+ export function streamResponse(stream, request, apiVersion) {
76
+ const input = readStreamOptions(request);
77
+ const type = input.type;
78
+ const subscriptionOptions = {
79
+ ...(input.cursor === undefined ? {} : { cursor: input.cursor }),
80
+ ...(input.afterCursor === undefined ? {} : { afterCursor: input.afterCursor }),
81
+ ...(input.queueSize === undefined ? {} : { queueSize: input.queueSize }),
82
+ ...(input.overflow === undefined ? {} : { overflow: input.overflow }),
83
+ ...(input.backpressure === undefined ? {} : { backpressure: input.backpressure }),
84
+ };
85
+ const subscription = stream.subscribe(subscriptionOptions);
86
+ let closed = false;
87
+ let connected = false;
88
+ const encoder = new TextEncoder();
89
+ const close = () => {
90
+ if (closed)
91
+ return;
92
+ closed = true;
93
+ subscription.close();
94
+ request.signal.removeEventListener("abort", close);
95
+ };
96
+ request.signal.addEventListener("abort", close, { once: true });
97
+ const body = new ReadableStream({
98
+ async pull(controller) {
99
+ try {
100
+ if (!connected) {
101
+ connected = true;
102
+ controller.enqueue(encoder.encode(": connected\n\n"));
103
+ return;
104
+ }
105
+ while (!closed) {
106
+ const result = await subscription.next();
107
+ if (closed)
108
+ return;
109
+ if (result.done) {
110
+ close();
111
+ controller.close();
112
+ return;
113
+ }
114
+ if (type !== undefined && result.value.type !== type)
115
+ continue;
116
+ controller.enqueue(encoder.encode(eventFrame(result.value)));
117
+ return;
118
+ }
119
+ }
120
+ catch {
121
+ close();
122
+ controller.close();
123
+ }
124
+ },
125
+ cancel: close,
126
+ });
127
+ return new Response(body, {
128
+ headers: {
129
+ "cache-control": "no-cache, no-store",
130
+ connection: "keep-alive",
131
+ "content-type": "text/event-stream; charset=utf-8",
132
+ "x-relkit-api-version": String(apiVersion),
133
+ },
134
+ });
135
+ }
136
+ function eventFrame(event) {
137
+ return `id: ${event.cursor}\nevent: ${event.type}\ndata: ${canonicalJson(event)}\n\n`;
138
+ }
139
+ function integer(value, name) {
140
+ if (!/^\d+$/.test(value) || !Number.isSafeInteger(Number(value)))
141
+ throw queryError(`${name} is invalid`);
142
+ return Number(value);
143
+ }
144
+ function queryError(message) {
145
+ return new ObservabilityQueryError("RELKIT_OBSERVABILITY_QUERY_INVALID", `Observability query ${message}`);
146
+ }
147
+ function streamError(message) {
148
+ return new ObservabilityStreamError("RELKIT_OBSERVABILITY_STREAM_INVALID", message);
149
+ }
150
+ //# sourceMappingURL=observability-utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"observability-utils.js","sourceRoot":"","sources":["../src/observability-utils.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ import { type MaybePromise } from "@relkit/contracts";
2
+ import { type ObservabilityQuery, type ObservabilityStream } from "@relkit/observability";
3
+ import type { Hono } from "hono";
4
+ export { readObservabilityQuery } from "./observability-utils.js";
5
+ export declare const INSPECTOR_API_PROTOCOL: "relkit.inspector";
6
+ export declare const INSPECTOR_API_VERSION: 1;
7
+ export declare const OBSERVABILITY_ENDPOINT_PATHS: readonly ["/_relkit/v1/requests", "/_relkit/v1/requests/:requestId", "/_relkit/v1/logs", "/_relkit/v1/traces", "/_relkit/v1/traces/:traceId", "/_relkit/v1/stream"];
8
+ export type ObservabilityEndpointMode = "development" | "test" | "production";
9
+ export interface ObservabilityEndpointOptions {
10
+ readonly query: ObservabilityQuery;
11
+ readonly stream: ObservabilityStream;
12
+ readonly mode?: ObservabilityEndpointMode;
13
+ readonly environment?: ObservabilityEndpointMode;
14
+ readonly enabled?: boolean;
15
+ readonly bearerToken?: string;
16
+ readonly authorize?: (request: Request) => MaybePromise<boolean>;
17
+ }
18
+ export declare class ObservabilityEndpointConfigurationError extends TypeError {
19
+ constructor(message: string);
20
+ }
21
+ /** Installs the bounded, versioned observability query and SSE endpoints. */
22
+ export declare function installObservabilityEndpoints(app: Hono, options: ObservabilityEndpointOptions): void;
23
+ //# sourceMappingURL=observability.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"observability.d.ts","sourceRoot":"","sources":["../src/observability.ts"],"names":[],"mappings":"AAAA,OAAO,EAKL,KAAK,YAAY,EAClB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAGL,KAAK,kBAAkB,EACvB,KAAK,mBAAmB,EACzB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,KAAK,EAAW,IAAI,EAAE,MAAM,MAAM,CAAC;AAI1C,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAElE,eAAO,MAAM,sBAAsB,EAAG,kBAA2B,CAAC;AAClE,eAAO,MAAM,qBAAqB,GAAc,CAAC;AACjD,eAAO,MAAM,4BAA4B,qKAO9B,CAAC;AAEZ,MAAM,MAAM,yBAAyB,GAAG,aAAa,GAAG,MAAM,GAAG,YAAY,CAAC;AAE9E,MAAM,WAAW,4BAA4B;IAC3C,QAAQ,CAAC,KAAK,EAAE,kBAAkB,CAAC;IACnC,QAAQ,CAAC,MAAM,EAAE,mBAAmB,CAAC;IACrC,QAAQ,CAAC,IAAI,CAAC,EAAE,yBAAyB,CAAC;IAC1C,QAAQ,CAAC,WAAW,CAAC,EAAE,yBAAyB,CAAC;IACjD,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,YAAY,CAAC,OAAO,CAAC,CAAC;CAClE;AAED,qBAAa,uCAAwC,SAAQ,SAAS;gBACxD,OAAO,EAAE,MAAM;CAI5B;AAED,6EAA6E;AAC7E,wBAAgB,6BAA6B,CAC3C,GAAG,EAAE,IAAI,EACT,OAAO,EAAE,4BAA4B,GACpC,IAAI,CAiEN"}
@@ -0,0 +1,126 @@
1
+ import { API_BASE_PATH, API_VERSION, canonicalJson, } from "@relkit/contracts";
2
+ import { ObservabilityQueryError, ObservabilityStreamError, } from "@relkit/observability";
3
+ import { readObservabilityQuery, streamResponse } from "./observability-utils.js";
4
+ import { InspectorEndpointError, negotiateHeaders } from "./router-utils.js";
5
+ export { readObservabilityQuery } from "./observability-utils.js";
6
+ export const INSPECTOR_API_PROTOCOL = "relkit.inspector";
7
+ export const INSPECTOR_API_VERSION = API_VERSION;
8
+ export const OBSERVABILITY_ENDPOINT_PATHS = Object.freeze([
9
+ `${API_BASE_PATH}/requests`,
10
+ `${API_BASE_PATH}/requests/:requestId`,
11
+ `${API_BASE_PATH}/logs`,
12
+ `${API_BASE_PATH}/traces`,
13
+ `${API_BASE_PATH}/traces/:traceId`,
14
+ `${API_BASE_PATH}/stream`,
15
+ ]);
16
+ export class ObservabilityEndpointConfigurationError extends TypeError {
17
+ constructor(message) {
18
+ super(message);
19
+ this.name = "ObservabilityEndpointConfigurationError";
20
+ }
21
+ }
22
+ /** Installs the bounded, versioned observability query and SSE endpoints. */
23
+ export function installObservabilityEndpoints(app, options) {
24
+ const mode = options.environment ?? options.mode ?? "development";
25
+ const enabled = options.enabled ?? mode !== "production";
26
+ validateConfiguration(mode, enabled, options);
27
+ if (!enabled)
28
+ return;
29
+ const guard = (handler) => async (context) => {
30
+ if (!(await authorized(context.req.raw, options)))
31
+ return errorResponse("RELKIT_OBSERVABILITY_UNAUTHORIZED", 401, {
32
+ "www-authenticate": "Bearer",
33
+ });
34
+ try {
35
+ negotiateHeaders(context.req.raw);
36
+ return await handler(context);
37
+ }
38
+ catch (error) {
39
+ return safeErrorResponse(error);
40
+ }
41
+ };
42
+ app.get(`${API_BASE_PATH}/requests`, guard(async (context) => jsonResponse(await options.query.requests(readObservabilityQuery(context.req.raw)))));
43
+ app.get(`${API_BASE_PATH}/requests/:requestId`, guard(async (context) => {
44
+ const requestId = context.req.param("requestId");
45
+ if (requestId === undefined)
46
+ throw new EndpointError("RELKIT_OBSERVABILITY_NOT_FOUND", 404);
47
+ const request = await options.query.request(requestId);
48
+ if (request === undefined)
49
+ throw new EndpointError("RELKIT_OBSERVABILITY_NOT_FOUND", 404);
50
+ return jsonResponse(request);
51
+ }));
52
+ app.get(`${API_BASE_PATH}/logs`, guard(async (context) => jsonResponse(await options.query.logs(readObservabilityQuery(context.req.raw)))));
53
+ app.get(`${API_BASE_PATH}/traces`, guard(async (context) => jsonResponse(await options.query.traces(readObservabilityQuery(context.req.raw)))));
54
+ app.get(`${API_BASE_PATH}/traces/:traceId`, guard(async (context) => {
55
+ const traceId = context.req.param("traceId");
56
+ if (traceId === undefined)
57
+ throw new EndpointError("RELKIT_OBSERVABILITY_NOT_FOUND", 404);
58
+ const trace = await options.query.trace(traceId);
59
+ if (trace === undefined)
60
+ throw new EndpointError("RELKIT_OBSERVABILITY_NOT_FOUND", 404);
61
+ return jsonResponse(trace);
62
+ }));
63
+ app.get(`${API_BASE_PATH}/stream`, guard(async (context) => streamResponse(options.stream, context.req.raw, INSPECTOR_API_VERSION)));
64
+ }
65
+ function validateConfiguration(mode, enabled, options) {
66
+ if (!(mode === "development" || mode === "test" || mode === "production"))
67
+ throw new ObservabilityEndpointConfigurationError("mode is invalid");
68
+ if (mode === "production" &&
69
+ enabled &&
70
+ options.bearerToken === undefined &&
71
+ options.authorize === undefined)
72
+ throw new ObservabilityEndpointConfigurationError("Production observability endpoints require bearerToken or authorize protection.");
73
+ if (options.bearerToken !== undefined && options.bearerToken.trim().length === 0)
74
+ throw new ObservabilityEndpointConfigurationError("bearerToken must not be empty");
75
+ }
76
+ async function authorized(request, options) {
77
+ if (options.authorize !== undefined) {
78
+ try {
79
+ if (await options.authorize(request))
80
+ return true;
81
+ }
82
+ catch {
83
+ return false;
84
+ }
85
+ if (options.bearerToken === undefined)
86
+ return false;
87
+ }
88
+ return options.bearerToken === undefined
89
+ ? true
90
+ : request.headers.get("authorization") === `Bearer ${options.bearerToken}`;
91
+ }
92
+ function jsonResponse(value, status = 200, headers = {}) {
93
+ return new Response(canonicalJson(value), {
94
+ status,
95
+ headers: {
96
+ "cache-control": "no-store",
97
+ "content-type": "application/json; charset=utf-8",
98
+ "x-relkit-api-version": String(INSPECTOR_API_VERSION),
99
+ ...headers,
100
+ },
101
+ });
102
+ }
103
+ function errorResponse(code, status, headers = {}) {
104
+ return jsonResponse({ protocol: INSPECTOR_API_PROTOCOL, version: INSPECTOR_API_VERSION, error: code }, status, headers);
105
+ }
106
+ function safeErrorResponse(error) {
107
+ if (error instanceof EndpointError)
108
+ return errorResponse(error.code, error.status);
109
+ if (error instanceof InspectorEndpointError)
110
+ return errorResponse(error.code, error.status);
111
+ if (error instanceof ObservabilityQueryError)
112
+ return errorResponse(error.code, 400);
113
+ if (error instanceof ObservabilityStreamError)
114
+ return errorResponse(error.code, 400);
115
+ return errorResponse("RELKIT_OBSERVABILITY_INTERNAL", 500);
116
+ }
117
+ class EndpointError extends Error {
118
+ code;
119
+ status;
120
+ constructor(code, status) {
121
+ super(code);
122
+ this.code = code;
123
+ this.status = status;
124
+ }
125
+ }
126
+ //# sourceMappingURL=observability.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"observability.js","sourceRoot":"","sources":["../src/observability.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,54 @@
1
+ import type { JsonValue, MaybePromise } from "@relkit/contracts";
2
+ import { type ResolvedActiveGeneration } from "./shared.js";
3
+ export interface InspectorBucketExplorer {
4
+ readonly supports: (bucketId: string) => MaybePromise<boolean>;
5
+ readonly list: (request: {
6
+ readonly bucketId: string;
7
+ readonly prefix?: string;
8
+ readonly cursor?: string;
9
+ readonly limit: number;
10
+ readonly signal: AbortSignal;
11
+ }) => MaybePromise<{
12
+ readonly items: readonly unknown[];
13
+ readonly nextCursor?: string;
14
+ }>;
15
+ readonly preview: (request: {
16
+ readonly bucketId: string;
17
+ readonly key: string;
18
+ readonly offset: number;
19
+ readonly limit: number;
20
+ readonly signal: AbortSignal;
21
+ }) => MaybePromise<{
22
+ readonly bytes: Uint8Array;
23
+ readonly metadata?: unknown;
24
+ readonly totalBytes?: number;
25
+ } | undefined>;
26
+ }
27
+ export interface InspectorCacheExplorer {
28
+ readonly supports: (cacheId: string) => MaybePromise<boolean>;
29
+ readonly scan: (request: {
30
+ readonly cacheId: string;
31
+ readonly search?: string;
32
+ readonly cursor?: string;
33
+ readonly limit: number;
34
+ readonly signal: AbortSignal;
35
+ }) => MaybePromise<{
36
+ readonly items: readonly unknown[];
37
+ readonly nextCursor?: string;
38
+ }>;
39
+ readonly value: (request: {
40
+ readonly cacheId: string;
41
+ readonly key: string;
42
+ readonly limit: number;
43
+ readonly signal: AbortSignal;
44
+ }) => MaybePromise<unknown | undefined>;
45
+ }
46
+ export interface InspectorResourceExplorers {
47
+ readonly buckets?: InspectorBucketExplorer;
48
+ readonly cache?: InspectorCacheExplorer;
49
+ }
50
+ export declare function bucketObjects(generation: ResolvedActiveGeneration, bucketId: string, request: Request): Promise<JsonValue>;
51
+ export declare function bucketPreview(generation: ResolvedActiveGeneration, bucketId: string, request: Request, maximumBytes: number): Promise<JsonValue>;
52
+ export declare function cacheKeys(generation: ResolvedActiveGeneration, cacheId: string, request: Request): Promise<JsonValue>;
53
+ export declare function cacheValue(generation: ResolvedActiveGeneration, cacheId: string, request: Request, maximumBytes: number): Promise<JsonValue>;
54
+ //# sourceMappingURL=resource-explorer.d.ts.map