@relkit/runtime-hono 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 (123) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +5 -0
  3. package/dist/api-docs.d.ts +21 -0
  4. package/dist/api-docs.d.ts.map +1 -0
  5. package/dist/api-docs.js +91 -0
  6. package/dist/api-docs.js.map +1 -0
  7. package/dist/auth.d.ts +18 -0
  8. package/dist/auth.d.ts.map +1 -0
  9. package/dist/auth.js +52 -0
  10. package/dist/auth.js.map +1 -0
  11. package/dist/client-contract.d.ts +8 -0
  12. package/dist/client-contract.d.ts.map +1 -0
  13. package/dist/client-contract.js +10 -0
  14. package/dist/client-contract.js.map +1 -0
  15. package/dist/create-app.d.ts +22 -0
  16. package/dist/create-app.d.ts.map +1 -0
  17. package/dist/create-app.js +76 -0
  18. package/dist/create-app.js.map +1 -0
  19. package/dist/index.d.ts +15 -0
  20. package/dist/index.d.ts.map +1 -0
  21. package/dist/index.js +15 -0
  22. package/dist/index.js.map +1 -0
  23. package/dist/internal-endpoints-utils.d.ts +16 -0
  24. package/dist/internal-endpoints-utils.d.ts.map +1 -0
  25. package/dist/internal-endpoints-utils.js +154 -0
  26. package/dist/internal-endpoints-utils.js.map +1 -0
  27. package/dist/internal-endpoints.d.ts +58 -0
  28. package/dist/internal-endpoints.d.ts.map +1 -0
  29. package/dist/internal-endpoints.js +106 -0
  30. package/dist/internal-endpoints.js.map +1 -0
  31. package/dist/materialize-routes-utils.d.ts +8 -0
  32. package/dist/materialize-routes-utils.d.ts.map +1 -0
  33. package/dist/materialize-routes-utils.js +82 -0
  34. package/dist/materialize-routes-utils.js.map +1 -0
  35. package/dist/materialize-routes.d.ts +90 -0
  36. package/dist/materialize-routes.d.ts.map +1 -0
  37. package/dist/materialize-routes.js +86 -0
  38. package/dist/materialize-routes.js.map +1 -0
  39. package/dist/mcp.d.ts +7 -0
  40. package/dist/mcp.d.ts.map +1 -0
  41. package/dist/mcp.js +81 -0
  42. package/dist/mcp.js.map +1 -0
  43. package/dist/middleware-limits.d.ts +4 -0
  44. package/dist/middleware-limits.d.ts.map +1 -0
  45. package/dist/middleware-limits.js +53 -0
  46. package/dist/middleware-limits.js.map +1 -0
  47. package/dist/middleware-utils.d.ts +57 -0
  48. package/dist/middleware-utils.d.ts.map +1 -0
  49. package/dist/middleware-utils.js +90 -0
  50. package/dist/middleware-utils.js.map +1 -0
  51. package/dist/middleware.d.ts +17 -0
  52. package/dist/middleware.d.ts.map +1 -0
  53. package/dist/middleware.js +106 -0
  54. package/dist/middleware.js.map +1 -0
  55. package/dist/rate-limit-store.d.ts +17 -0
  56. package/dist/rate-limit-store.d.ts.map +1 -0
  57. package/dist/rate-limit-store.js +77 -0
  58. package/dist/rate-limit-store.js.map +1 -0
  59. package/dist/rate-limit-telemetry.d.ts +8 -0
  60. package/dist/rate-limit-telemetry.d.ts.map +1 -0
  61. package/dist/rate-limit-telemetry.js +57 -0
  62. package/dist/rate-limit-telemetry.js.map +1 -0
  63. package/dist/rate-limit.d.ts +12 -0
  64. package/dist/rate-limit.d.ts.map +1 -0
  65. package/dist/rate-limit.js +126 -0
  66. package/dist/rate-limit.js.map +1 -0
  67. package/dist/request-context.d.ts +4 -0
  68. package/dist/request-context.d.ts.map +1 -0
  69. package/dist/request-context.js +65 -0
  70. package/dist/request-context.js.map +1 -0
  71. package/dist/request-mapping-body.d.ts +27 -0
  72. package/dist/request-mapping-body.d.ts.map +1 -0
  73. package/dist/request-mapping-body.js +101 -0
  74. package/dist/request-mapping-body.js.map +1 -0
  75. package/dist/request-mapping-fields.d.ts +16 -0
  76. package/dist/request-mapping-fields.d.ts.map +1 -0
  77. package/dist/request-mapping-fields.js +63 -0
  78. package/dist/request-mapping-fields.js.map +1 -0
  79. package/dist/request-mapping-object.d.ts +14 -0
  80. package/dist/request-mapping-object.d.ts.map +1 -0
  81. package/dist/request-mapping-object.js +26 -0
  82. package/dist/request-mapping-object.js.map +1 -0
  83. package/dist/request-mapping-sources.d.ts +7 -0
  84. package/dist/request-mapping-sources.d.ts.map +1 -0
  85. package/dist/request-mapping-sources.js +60 -0
  86. package/dist/request-mapping-sources.js.map +1 -0
  87. package/dist/request-mapping-transform.d.ts +3 -0
  88. package/dist/request-mapping-transform.d.ts.map +1 -0
  89. package/dist/request-mapping-transform.js +55 -0
  90. package/dist/request-mapping-transform.js.map +1 -0
  91. package/dist/request-mapping.d.ts +33 -0
  92. package/dist/request-mapping.d.ts.map +1 -0
  93. package/dist/request-mapping.js +111 -0
  94. package/dist/request-mapping.js.map +1 -0
  95. package/dist/request-record-middleware.d.ts +6 -0
  96. package/dist/request-record-middleware.d.ts.map +1 -0
  97. package/dist/request-record-middleware.js +58 -0
  98. package/dist/request-record-middleware.js.map +1 -0
  99. package/dist/request-record-utils.d.ts +11 -0
  100. package/dist/request-record-utils.d.ts.map +1 -0
  101. package/dist/request-record-utils.js +71 -0
  102. package/dist/request-record-utils.js.map +1 -0
  103. package/dist/response-mapping-utils.d.ts +19 -0
  104. package/dist/response-mapping-utils.d.ts.map +1 -0
  105. package/dist/response-mapping-utils.js +72 -0
  106. package/dist/response-mapping-utils.js.map +1 -0
  107. package/dist/response-mapping.d.ts +18 -0
  108. package/dist/response-mapping.d.ts.map +1 -0
  109. package/dist/response-mapping.js +100 -0
  110. package/dist/response-mapping.js.map +1 -0
  111. package/dist/route-middleware.d.ts +4 -0
  112. package/dist/route-middleware.d.ts.map +1 -0
  113. package/dist/route-middleware.js +62 -0
  114. package/dist/route-middleware.js.map +1 -0
  115. package/dist/rpc.d.ts +4 -0
  116. package/dist/rpc.d.ts.map +1 -0
  117. package/dist/rpc.js +163 -0
  118. package/dist/rpc.js.map +1 -0
  119. package/dist/static-files.d.ts +6 -0
  120. package/dist/static-files.d.ts.map +1 -0
  121. package/dist/static-files.js +100 -0
  122. package/dist/static-files.js.map +1 -0
  123. package/package.json +55 -0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 rel-kit
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,5 @@
1
+ # @relkit/runtime-hono
2
+
3
+ Unsupported internal Hono runtime for RELKIT; use @relkit/app.
4
+
5
+ See [@relkit/app](https://github.com/rel-kit/relkit) for supported application APIs.
@@ -0,0 +1,21 @@
1
+ import { type JsonValue } from "@relkit/contracts";
2
+ import type { RegistrationPlan } from "@relkit/graph";
3
+ import { type OpenApiDocument } from "@relkit/openapi";
4
+ import type { Hono } from "hono";
5
+ import type { InternalEndpointMode, InternalEndpointOptions } from "./internal-endpoints.js";
6
+ export declare const OPENAPI_PATH: "/_relkit/v1/openapi.json";
7
+ export declare const API_REFERENCE_PATH: "/_relkit/v1/api-reference";
8
+ export interface ApiDocsOptions {
9
+ readonly mode?: InternalEndpointMode;
10
+ readonly enabled?: boolean;
11
+ readonly enabledInProduction?: boolean;
12
+ readonly bearerToken?: string;
13
+ readonly authorize?: InternalEndpointOptions["authorize"];
14
+ readonly document?: OpenApiDocument | JsonValue;
15
+ }
16
+ export declare class ApiDocsConfigurationError extends TypeError {
17
+ constructor(message: string);
18
+ }
19
+ /** Installs the active OpenAPI document and the sole bundled Scalar reference UI. */
20
+ export declare function installApiDocs(app: Hono, plan: RegistrationPlan, options?: ApiDocsOptions): void;
21
+ //# sourceMappingURL=api-docs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api-docs.d.ts","sourceRoot":"","sources":["../src/api-docs.ts"],"names":[],"mappings":"AACA,OAAO,EAKL,KAAK,SAAS,EACf,MAAM,mBAAmB,CAAC;AAC3B,OAAO,KAAK,EAAoB,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACxE,OAAO,EAAmB,KAAK,eAAe,EAAE,MAAM,iBAAiB,CAAC;AACxE,OAAO,KAAK,EAAW,IAAI,EAAQ,MAAM,MAAM,CAAC;AAEhD,OAAO,KAAK,EAAE,oBAAoB,EAAE,uBAAuB,EAAE,MAAM,yBAAyB,CAAC;AAE7F,eAAO,MAAM,YAAY,4BAA2C,CAAC;AACrE,eAAO,MAAM,kBAAkB,6BAA4C,CAAC;AAE5E,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,IAAI,CAAC,EAAE,oBAAoB,CAAC;IACrC,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,mBAAmB,CAAC,EAAE,OAAO,CAAC;IACvC,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,SAAS,CAAC,EAAE,uBAAuB,CAAC,WAAW,CAAC,CAAC;IAC1D,QAAQ,CAAC,QAAQ,CAAC,EAAE,eAAe,GAAG,SAAS,CAAC;CACjD;AAED,qBAAa,yBAA0B,SAAQ,SAAS;gBAC1C,OAAO,EAAE,MAAM;CAI5B;AAED,qFAAqF;AACrF,wBAAgB,cAAc,CAC5B,GAAG,EAAE,IAAI,EACT,IAAI,EAAE,gBAAgB,EACtB,OAAO,GAAE,cAAmB,GAC3B,IAAI,CAiDN"}
@@ -0,0 +1,91 @@
1
+ import { Scalar } from "@scalar/hono-api-reference";
2
+ import { API_BASE_PATH, API_VERSION, CONTRACT_VERSION, canonicalJson, } from "@relkit/contracts";
3
+ import { generateOpenApi } from "@relkit/openapi";
4
+ import { isAuthorized, jsonResponse } from "./internal-endpoints-utils.js";
5
+ export const OPENAPI_PATH = `${API_BASE_PATH}/openapi.json`;
6
+ export const API_REFERENCE_PATH = `${API_BASE_PATH}/api-reference`;
7
+ export class ApiDocsConfigurationError extends TypeError {
8
+ constructor(message) {
9
+ super(message);
10
+ this.name = "ApiDocsConfigurationError";
11
+ }
12
+ }
13
+ /** Installs the active OpenAPI document and the sole bundled Scalar reference UI. */
14
+ export function installApiDocs(app, plan, options = {}) {
15
+ const mode = options.mode ?? "development";
16
+ const enabled = mode === "production" ? options.enabledInProduction === true : options.enabled !== false;
17
+ validate(mode, enabled, options);
18
+ if (!enabled)
19
+ return;
20
+ const document = options.document ?? documentFrom(plan);
21
+ const auth = authorization(options);
22
+ const embed = mode === "production" || auth.bearerToken !== undefined || auth.authorize !== undefined;
23
+ const reference = Scalar({
24
+ ...(embed ? { content: canonicalJson(document) } : { url: "./openapi.json" }),
25
+ pageTitle: "RELKIT API Reference",
26
+ });
27
+ const protect = (handler) => async (context, next) => {
28
+ if (!(await isAuthorized(context.req.raw, auth))) {
29
+ return jsonResponse({ error: "internal-endpoint-protected" }, 401, {
30
+ "www-authenticate": "Bearer",
31
+ });
32
+ }
33
+ return handler(context, next);
34
+ };
35
+ app.get(OPENAPI_PATH, protect(async () => new Response(canonicalJson(document), {
36
+ headers: responseHeaders("application/json"),
37
+ })));
38
+ app.get(API_REFERENCE_PATH, protect(async (context, next) => {
39
+ const response = await reference(context, next);
40
+ if (!(response instanceof Response))
41
+ return response;
42
+ return new Response(response.body, {
43
+ status: response.status,
44
+ statusText: response.statusText,
45
+ headers: {
46
+ ...Object.fromEntries(response.headers),
47
+ ...responseHeaders("text/html; charset=UTF-8"),
48
+ },
49
+ });
50
+ }));
51
+ }
52
+ function documentFrom(plan) {
53
+ const functions = new Set(plan.functions.map(({ id }) => id));
54
+ return generateOpenApi({
55
+ contractVersion: CONTRACT_VERSION,
56
+ nodes: [
57
+ ...plan.functions,
58
+ ...plan.httpTriggers.filter(({ targetFunctionId }) => functions.has(targetFunctionId)),
59
+ ...(plan.services ?? []),
60
+ ],
61
+ edges: [],
62
+ });
63
+ }
64
+ function authorization(options) {
65
+ return {
66
+ ...(options.bearerToken === undefined ? {} : { bearerToken: options.bearerToken }),
67
+ ...(options.authorize === undefined ? {} : { authorize: options.authorize }),
68
+ };
69
+ }
70
+ function validate(mode, enabled, options) {
71
+ if (!(mode === "development" || mode === "test" || mode === "production")) {
72
+ throw new ApiDocsConfigurationError("mode must be development, test, or production.");
73
+ }
74
+ if (mode === "production" &&
75
+ enabled &&
76
+ options.bearerToken === undefined &&
77
+ options.authorize === undefined) {
78
+ throw new ApiDocsConfigurationError("Production API docs require existing internal-endpoint authorization.");
79
+ }
80
+ if (options.bearerToken !== undefined && options.bearerToken.trim() === "") {
81
+ throw new ApiDocsConfigurationError("bearerToken must not be empty.");
82
+ }
83
+ }
84
+ function responseHeaders(contentType) {
85
+ return {
86
+ "cache-control": "no-store",
87
+ "content-type": contentType,
88
+ "x-relkit-api-version": String(API_VERSION),
89
+ };
90
+ }
91
+ //# sourceMappingURL=api-docs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api-docs.js","sourceRoot":"","sources":["../src/api-docs.ts"],"names":[],"mappings":"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"}
package/dist/auth.d.ts ADDED
@@ -0,0 +1,18 @@
1
+ import type { Hono } from "hono";
2
+ export interface HttpAuthInvocation {
3
+ readonly getSession: () => Promise<unknown | null>;
4
+ }
5
+ export interface HttpAuthRuntime {
6
+ readonly protected: readonly string[];
7
+ readonly publicPaths: readonly string[];
8
+ readonly contextFor: (request: Request) => HttpAuthInvocation;
9
+ readonly protects: (path: string) => boolean;
10
+ }
11
+ export interface CreateHttpAuthRuntimeOptions {
12
+ readonly protected: readonly string[];
13
+ readonly publicPaths: readonly string[];
14
+ readonly getSession: (headers: Headers) => Promise<unknown | null>;
15
+ }
16
+ export declare function createHttpAuthRuntime(options: CreateHttpAuthRuntimeOptions): HttpAuthRuntime;
17
+ export declare function registerAuthMiddleware(app: Hono, auth: HttpAuthRuntime | undefined): void;
18
+ //# sourceMappingURL=auth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAEjC,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,UAAU,EAAE,MAAM,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC,CAAC;CACpD;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,SAAS,EAAE,SAAS,MAAM,EAAE,CAAC;IACtC,QAAQ,CAAC,WAAW,EAAE,SAAS,MAAM,EAAE,CAAC;IACxC,QAAQ,CAAC,UAAU,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,kBAAkB,CAAC;IAC9D,QAAQ,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC;CAC9C;AAED,MAAM,WAAW,4BAA4B;IAC3C,QAAQ,CAAC,SAAS,EAAE,SAAS,MAAM,EAAE,CAAC;IACtC,QAAQ,CAAC,WAAW,EAAE,SAAS,MAAM,EAAE,CAAC;IACxC,QAAQ,CAAC,UAAU,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC,CAAC;CACpE;AAED,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,4BAA4B,GAAG,eAAe,CAkB5F;AAED,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,eAAe,GAAG,SAAS,GAAG,IAAI,CAoBzF"}
package/dist/auth.js ADDED
@@ -0,0 +1,52 @@
1
+ export function createHttpAuthRuntime(options) {
2
+ const contexts = new WeakMap();
3
+ return Object.freeze({
4
+ protected: Object.freeze([...options.protected]),
5
+ publicPaths: Object.freeze([...options.publicPaths]),
6
+ contextFor(request) {
7
+ const existing = contexts.get(request);
8
+ if (existing !== undefined)
9
+ return existing;
10
+ const headers = new Headers(request.headers);
11
+ let session;
12
+ const context = Object.freeze({
13
+ getSession: () => (session ??= Promise.resolve(options.getSession(headers))),
14
+ });
15
+ contexts.set(request, context);
16
+ return context;
17
+ },
18
+ protects: (path) => options.protected.some((pattern) => matches(pattern, path)),
19
+ });
20
+ }
21
+ export function registerAuthMiddleware(app, auth) {
22
+ if (auth === undefined)
23
+ return;
24
+ app.use("*", async (context, next) => {
25
+ const path = context.req.path;
26
+ if (auth.publicPaths.some((pattern) => matches(pattern, path)) ||
27
+ !auth.protected.some((pattern) => matches(pattern, path))) {
28
+ await next();
29
+ return;
30
+ }
31
+ const session = await auth.contextFor(context.req.raw).getSession();
32
+ if (session === null) {
33
+ return context.json({ error: { id: "UNAUTHORIZED", message: "Authentication required" } }, 401);
34
+ }
35
+ await next();
36
+ });
37
+ }
38
+ function matches(pattern, path) {
39
+ if (pattern.endsWith("/*")) {
40
+ return path === pattern.slice(0, -2) || path.startsWith(pattern.slice(0, -1));
41
+ }
42
+ const wildcard = pattern.indexOf("*");
43
+ if (wildcard >= 0) {
44
+ const base = pattern.slice(0, wildcard).replace(/\/$/, "");
45
+ return (pattern.endsWith("?") && path === base) || path.startsWith(`${base}/`);
46
+ }
47
+ const parameter = pattern.indexOf("/:");
48
+ if (parameter >= 0)
49
+ return path.startsWith(`${pattern.slice(0, parameter)}/`);
50
+ return path === pattern;
51
+ }
52
+ //# sourceMappingURL=auth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.js","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import type { Hono } from "hono";
2
+ export declare const CLIENT_CONTRACT_PATH = "/_relkit/v1/client-contract.json";
3
+ export interface ClientContractEndpointOptions {
4
+ readonly enabled?: boolean;
5
+ readonly document?: unknown;
6
+ }
7
+ export declare function installClientContractEndpoint(app: Hono, options?: ClientContractEndpointOptions): void;
8
+ //# sourceMappingURL=client-contract.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client-contract.d.ts","sourceRoot":"","sources":["../src/client-contract.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAEjC,eAAO,MAAM,oBAAoB,qCAAqC,CAAC;AAEvE,MAAM,WAAW,6BAA6B;IAC5C,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;CAC7B;AAED,wBAAgB,6BAA6B,CAC3C,GAAG,EAAE,IAAI,EACT,OAAO,GAAE,6BAAkC,GAC1C,IAAI,CAQN"}
@@ -0,0 +1,10 @@
1
+ export const CLIENT_CONTRACT_PATH = "/_relkit/v1/client-contract.json";
2
+ export function installClientContractEndpoint(app, options = {}) {
3
+ if (options.enabled === false)
4
+ return;
5
+ app.get(CLIENT_CONTRACT_PATH, (context) => context.json(options.document ?? {}, 200, {
6
+ "cache-control": "no-store",
7
+ "x-content-type-options": "nosniff",
8
+ }));
9
+ }
10
+ //# sourceMappingURL=client-contract.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client-contract.js","sourceRoot":"","sources":["../src/client-contract.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,oBAAoB,GAAG,kCAAkC,CAAC;AAOvE,MAAM,UAAU,6BAA6B,CAC3C,GAAS,EACT,UAAyC,EAAE;IAE3C,IAAI,OAAO,CAAC,OAAO,KAAK,KAAK;QAAE,OAAO;IACtC,GAAG,CAAC,GAAG,CAAC,oBAAoB,EAAE,CAAC,OAAO,EAAE,EAAE,CACxC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,IAAI,EAAE,EAAE,GAAG,EAAE;QACxC,eAAe,EAAE,UAAU;QAC3B,wBAAwB,EAAE,SAAS;KACpC,CAAC,CACH,CAAC;AACJ,CAAC"}
@@ -0,0 +1,22 @@
1
+ import { Hono } from "hono";
2
+ import type { MiddlewareHandler } from "hono";
3
+ import { type RouteMaterializationOptions } from "./materialize-routes.js";
4
+ import { FRAMEWORK_MIDDLEWARE_ORDER, type FrameworkMiddleware, type HttpMiddlewareOptions } from "./middleware.js";
5
+ import { type InternalEndpointOptions } from "./internal-endpoints.js";
6
+ import { type ApiDocsOptions } from "./api-docs.js";
7
+ import { type ClientContractEndpointOptions } from "./client-contract.js";
8
+ import type { McpOptions } from "./mcp.js";
9
+ export type FrameworkMiddlewareInput = Partial<Record<(typeof FRAMEWORK_MIDDLEWARE_ORDER)[number], MiddlewareHandler>> | readonly FrameworkMiddleware[];
10
+ export interface CreateAppOptions extends RouteMaterializationOptions {
11
+ readonly frameworkMiddleware?: FrameworkMiddlewareInput;
12
+ readonly middleware?: HttpMiddlewareOptions;
13
+ readonly internalEndpoints?: InternalEndpointOptions;
14
+ readonly apiDocs?: ApiDocsOptions;
15
+ readonly clientContract?: ClientContractEndpointOptions;
16
+ readonly mcp?: McpOptions;
17
+ }
18
+ /** Creates the HTTP application from the already verified registration plan. */
19
+ export declare function createApp(options: CreateAppOptions): Hono;
20
+ /** Installs supplied framework middleware in the fixed v3 order. */
21
+ export declare function installFrameworkMiddleware(app: Hono, input: FrameworkMiddlewareInput | undefined): void;
22
+ //# sourceMappingURL=create-app.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-app.d.ts","sourceRoot":"","sources":["../src/create-app.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,MAAM,CAAC;AAC9C,OAAO,EAGL,KAAK,2BAA2B,EACjC,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAEL,0BAA0B,EAC1B,KAAK,mBAAmB,EACxB,KAAK,qBAAqB,EAC3B,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAGL,KAAK,uBAAuB,EAC7B,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAkB,KAAK,cAAc,EAAE,MAAM,eAAe,CAAC;AACpE,OAAO,EAEL,KAAK,6BAA6B,EACnC,MAAM,sBAAsB,CAAC;AAC9B,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAE3C,MAAM,MAAM,wBAAwB,GAChC,OAAO,CAAC,MAAM,CAAC,CAAC,OAAO,0BAA0B,CAAC,CAAC,MAAM,CAAC,EAAE,iBAAiB,CAAC,CAAC,GAC/E,SAAS,mBAAmB,EAAE,CAAC;AAEnC,MAAM,WAAW,gBAAiB,SAAQ,2BAA2B;IACnE,QAAQ,CAAC,mBAAmB,CAAC,EAAE,wBAAwB,CAAC;IACxD,QAAQ,CAAC,UAAU,CAAC,EAAE,qBAAqB,CAAC;IAC5C,QAAQ,CAAC,iBAAiB,CAAC,EAAE,uBAAuB,CAAC;IACrD,QAAQ,CAAC,OAAO,CAAC,EAAE,cAAc,CAAC;IAClC,QAAQ,CAAC,cAAc,CAAC,EAAE,6BAA6B,CAAC;IACxD,QAAQ,CAAC,GAAG,CAAC,EAAE,UAAU,CAAC;CAC3B;AAED,gFAAgF;AAChF,wBAAgB,SAAS,CAAC,OAAO,EAAE,gBAAgB,GAAG,IAAI,CA4BzD;AAqBD,oEAAoE;AACpE,wBAAgB,0BAA0B,CACxC,GAAG,EAAE,IAAI,EACT,KAAK,EAAE,wBAAwB,GAAG,SAAS,GAC1C,IAAI,CAON"}
@@ -0,0 +1,76 @@
1
+ import { Hono } from "hono";
2
+ import { assertHttpManifest, materializeRoutes, } from "./materialize-routes.js";
3
+ import { createFrameworkMiddleware, FRAMEWORK_MIDDLEWARE_ORDER, } from "./middleware.js";
4
+ import { graphSnapshot, installInternalEndpoints, } from "./internal-endpoints.js";
5
+ import { installApiDocs } from "./api-docs.js";
6
+ import { installClientContractEndpoint, } from "./client-contract.js";
7
+ /** Creates the HTTP application from the already verified registration plan. */
8
+ export function createApp(options) {
9
+ assertHttpManifest(options);
10
+ const app = new Hono();
11
+ const middlewareOptions = {
12
+ ...(options.middleware ?? {}),
13
+ graphHash: options.plan.graphHash,
14
+ ...(options.generationId === undefined ? {} : { generationId: options.generationId }),
15
+ ...(options.observability === undefined ? {} : { observability: options.observability }),
16
+ };
17
+ installFrameworkMiddleware(app, options.frameworkMiddleware ?? createFrameworkMiddleware(middlewareOptions));
18
+ installInternalEndpoints(app, {
19
+ graph: graphSnapshot(options.plan),
20
+ ...(options.internalEndpoints ?? {}),
21
+ });
22
+ installApiDocs(app, options.plan, apiDocsOptions(options));
23
+ installClientContractEndpoint(app, options.clientContract);
24
+ const requestMapping = options.middleware?.maxBodyBytes === undefined
25
+ ? options.requestMapping
26
+ : { maxBodyBytes: options.middleware.maxBodyBytes, ...(options.requestMapping ?? {}) };
27
+ materializeRoutes(app, {
28
+ ...options,
29
+ ...(requestMapping === undefined ? {} : { requestMapping }),
30
+ });
31
+ return app;
32
+ }
33
+ function apiDocsOptions(options) {
34
+ const docs = options.apiDocs ?? {};
35
+ const internal = options.internalEndpoints ?? {};
36
+ return {
37
+ ...docs,
38
+ mode: docs.mode ?? internal.environment ?? internal.mode ?? "development",
39
+ ...(docs.bearerToken !== undefined
40
+ ? { bearerToken: docs.bearerToken }
41
+ : internal.bearerToken === undefined
42
+ ? {}
43
+ : { bearerToken: internal.bearerToken }),
44
+ ...(docs.authorize !== undefined
45
+ ? { authorize: docs.authorize }
46
+ : internal.authorize === undefined
47
+ ? {}
48
+ : { authorize: internal.authorize }),
49
+ };
50
+ }
51
+ /** Installs supplied framework middleware in the fixed v3 order. */
52
+ export function installFrameworkMiddleware(app, input) {
53
+ if (input === undefined)
54
+ return;
55
+ const middleware = normalizeFrameworkMiddleware(input);
56
+ for (const name of FRAMEWORK_MIDDLEWARE_ORDER) {
57
+ const handler = middleware.get(name);
58
+ if (handler !== undefined)
59
+ app.use("*", handler);
60
+ }
61
+ }
62
+ function normalizeFrameworkMiddleware(input) {
63
+ const result = new Map();
64
+ const entries = Array.isArray(input)
65
+ ? input.map((item) => [item.name, item.handler])
66
+ : Object.entries(input);
67
+ for (const [name, handler] of entries) {
68
+ if (!FRAMEWORK_MIDDLEWARE_ORDER.includes(name))
69
+ throw new TypeError(`Unknown framework middleware "${String(name)}".`);
70
+ if (result.has(name))
71
+ throw new TypeError(`Duplicate framework middleware "${name}".`);
72
+ result.set(name, handler);
73
+ }
74
+ return result;
75
+ }
76
+ //# sourceMappingURL=create-app.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-app.js","sourceRoot":"","sources":["../src/create-app.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ export * from "./create-app.js";
2
+ export * from "./api-docs.js";
3
+ export * from "./materialize-routes.js";
4
+ export * from "./middleware.js";
5
+ export * from "./request-mapping.js";
6
+ export * from "./response-mapping.js";
7
+ export * from "./internal-endpoints.js";
8
+ export * from "./rate-limit.js";
9
+ export * from "./rate-limit-store.js";
10
+ export * from "./auth.js";
11
+ export * from "./rpc.js";
12
+ export * from "./mcp.js";
13
+ export * from "./static-files.js";
14
+ export * from "./client-contract.js";
15
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAC;AAChC,cAAc,eAAe,CAAC;AAC9B,cAAc,yBAAyB,CAAC;AACxC,cAAc,iBAAiB,CAAC;AAChC,cAAc,sBAAsB,CAAC;AACrC,cAAc,uBAAuB,CAAC;AACtC,cAAc,yBAAyB,CAAC;AACxC,cAAc,iBAAiB,CAAC;AAChC,cAAc,uBAAuB,CAAC;AACtC,cAAc,WAAW,CAAC;AAC1B,cAAc,UAAU,CAAC;AACzB,cAAc,UAAU,CAAC;AACzB,cAAc,mBAAmB,CAAC;AAClC,cAAc,sBAAsB,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,15 @@
1
+ export * from "./create-app.js";
2
+ export * from "./api-docs.js";
3
+ export * from "./materialize-routes.js";
4
+ export * from "./middleware.js";
5
+ export * from "./request-mapping.js";
6
+ export * from "./response-mapping.js";
7
+ export * from "./internal-endpoints.js";
8
+ export * from "./rate-limit.js";
9
+ export * from "./rate-limit-store.js";
10
+ export * from "./auth.js";
11
+ export * from "./rpc.js";
12
+ export * from "./mcp.js";
13
+ export * from "./static-files.js";
14
+ export * from "./client-contract.js";
15
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAC;AAChC,cAAc,eAAe,CAAC;AAC9B,cAAc,yBAAyB,CAAC;AACxC,cAAc,iBAAiB,CAAC;AAChC,cAAc,sBAAsB,CAAC;AACrC,cAAc,uBAAuB,CAAC;AACtC,cAAc,yBAAyB,CAAC;AACxC,cAAc,iBAAiB,CAAC;AAChC,cAAc,uBAAuB,CAAC;AACtC,cAAc,WAAW,CAAC;AAC1B,cAAc,UAAU,CAAC;AACzB,cAAc,UAAU,CAAC;AACzB,cAAc,mBAAmB,CAAC;AAClC,cAAc,sBAAsB,CAAC"}
@@ -0,0 +1,16 @@
1
+ import { type JsonValue } from "@relkit/contracts";
2
+ import type { Context } from "hono";
3
+ import { type InternalEndpointOptions, type InternalPage, type InternalQuery, type QuerySource, type ValueSource } from "./internal-endpoints.js";
4
+ export declare class InternalQueryError extends TypeError {
5
+ constructor();
6
+ }
7
+ export declare function isInvalidQueryError(value: unknown): value is InternalQueryError;
8
+ export declare function isAuthorized(request: Request, options: InternalEndpointOptions): Promise<boolean>;
9
+ export declare function listResponse(source: QuerySource | undefined, context: Context): Promise<Response>;
10
+ export declare function readQuery(request: Request): InternalQuery;
11
+ export declare function resolveValue<T>(source: ValueSource<T>): Promise<T>;
12
+ export declare function resolveQuery(source: QuerySource | NonNullable<InternalEndpointOptions["stream"]>, query: InternalQuery): Promise<unknown>;
13
+ export declare function toPage(value: JsonValue | InternalPage): InternalPage;
14
+ export declare function streamBody(value: unknown): string;
15
+ export declare function jsonResponse(value: JsonValue, status?: number, headers?: Record<string, string>): Response;
16
+ //# sourceMappingURL=internal-endpoints-utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"internal-endpoints-utils.d.ts","sourceRoot":"","sources":["../src/internal-endpoints-utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAA8B,KAAK,SAAS,EAAqB,MAAM,mBAAmB,CAAC;AAClG,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AACpC,OAAO,EAGL,KAAK,uBAAuB,EAC5B,KAAK,YAAY,EACjB,KAAK,aAAa,EAElB,KAAK,WAAW,EAChB,KAAK,WAAW,EACjB,MAAM,yBAAyB,CAAC;AAEjC,qBAAa,kBAAmB,SAAQ,SAAS;;CAKhD;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,kBAAkB,CAE/E;AAED,wBAAsB,YAAY,CAChC,OAAO,EAAE,OAAO,EAChB,OAAO,EAAE,uBAAuB,GAC/B,OAAO,CAAC,OAAO,CAAC,CAYlB;AAED,wBAAsB,YAAY,CAChC,MAAM,EAAE,WAAW,GAAG,SAAS,EAC/B,OAAO,EAAE,OAAO,GACf,OAAO,CAAC,QAAQ,CAAC,CAQnB;AAED,wBAAgB,SAAS,CAAC,OAAO,EAAE,OAAO,GAAG,aAAa,CAqBzD;AAED,wBAAsB,YAAY,CAAC,CAAC,EAAE,MAAM,EAAE,WAAW,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAExE;AAED,wBAAsB,YAAY,CAChC,MAAM,EAAE,WAAW,GAAG,WAAW,CAAC,uBAAuB,CAAC,QAAQ,CAAC,CAAC,EACpE,KAAK,EAAE,aAAa,GACnB,OAAO,CAAC,OAAO,CAAC,CAIlB;AAED,wBAAgB,MAAM,CAAC,KAAK,EAAE,SAAS,GAAG,YAAY,GAAG,YAAY,CASpE;AAkDD,wBAAgB,UAAU,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CASjD;AAED,wBAAgB,YAAY,CAC1B,KAAK,EAAE,SAAS,EAChB,MAAM,SAAM,EACZ,OAAO,GAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAM,GACnC,QAAQ,CAaV"}
@@ -0,0 +1,154 @@
1
+ import { canonicalJson, isJsonValue } from "@relkit/contracts";
2
+ import { INTERNAL_ENDPOINT_PROTOCOL, INTERNAL_ENDPOINT_VERSION, } from "./internal-endpoints.js";
3
+ export class InternalQueryError extends TypeError {
4
+ constructor() {
5
+ super("Invalid internal endpoint query.");
6
+ this.name = "InternalQueryError";
7
+ }
8
+ }
9
+ export function isInvalidQueryError(value) {
10
+ return value instanceof InternalQueryError;
11
+ }
12
+ export async function isAuthorized(request, options) {
13
+ if (options.authorize !== undefined) {
14
+ try {
15
+ if (await options.authorize(request))
16
+ return true;
17
+ }
18
+ catch {
19
+ return false;
20
+ }
21
+ if (options.bearerToken === undefined)
22
+ return false;
23
+ }
24
+ return options.bearerToken === undefined
25
+ ? true
26
+ : request.headers.get("authorization") === `Bearer ${options.bearerToken}`;
27
+ }
28
+ export async function listResponse(source, context) {
29
+ const query = readQuery(context.req.raw);
30
+ const value = source === undefined ? [] : await resolveQuery(source, query);
31
+ const page = queryPage(toPage(value), query);
32
+ return jsonResponse({
33
+ items: page.items,
34
+ ...(page.nextCursor === undefined ? {} : { nextCursor: page.nextCursor }),
35
+ });
36
+ }
37
+ export function readQuery(request) {
38
+ const url = new URL(request.url);
39
+ const rawLimit = url.searchParams.get("limit");
40
+ const parsedLimit = rawLimit === null ? 50 : Number(rawLimit);
41
+ if (!Number.isSafeInteger(parsedLimit) || parsedLimit < 1)
42
+ throw new InternalQueryError();
43
+ const query = { limit: Math.min(parsedLimit, 100) };
44
+ for (const name of [
45
+ "cursor",
46
+ "from",
47
+ "to",
48
+ "severity",
49
+ "routeId",
50
+ "functionId",
51
+ "outcome",
52
+ "requestId",
53
+ "traceId",
54
+ ]) {
55
+ const value = url.searchParams.get(name);
56
+ if (value !== null && value.length > 0)
57
+ query[name] = value;
58
+ }
59
+ return query;
60
+ }
61
+ export async function resolveValue(source) {
62
+ return typeof source === "function" ? await source() : source;
63
+ }
64
+ export async function resolveQuery(source, query) {
65
+ return typeof source === "function"
66
+ ? await source(query)
67
+ : source;
68
+ }
69
+ export function toPage(value) {
70
+ if (Array.isArray(value))
71
+ return { items: value };
72
+ if (isRecord(value) && Array.isArray(value.items)) {
73
+ return {
74
+ items: value.items,
75
+ ...(typeof value.nextCursor === "string" ? { nextCursor: value.nextCursor } : {}),
76
+ };
77
+ }
78
+ return { items: [value] };
79
+ }
80
+ function queryPage(page, query) {
81
+ const from = query.from === undefined ? undefined : Date.parse(query.from);
82
+ const to = query.to === undefined ? undefined : Date.parse(query.to);
83
+ if ((from !== undefined && !Number.isFinite(from)) || (to !== undefined && !Number.isFinite(to)))
84
+ throw new InternalQueryError();
85
+ if (from !== undefined && to !== undefined && from > to)
86
+ throw new InternalQueryError();
87
+ const filtered = page.items.filter((item) => matchesQuery(item, query, from, to));
88
+ const start = page.nextCursor === undefined ? cursorOffset(query.cursor) : 0;
89
+ const items = filtered.slice(start, start + query.limit);
90
+ const next = start + items.length < filtered.length ? String(start + items.length) : undefined;
91
+ const nextCursor = next ?? page.nextCursor;
92
+ return { items, ...(nextCursor === undefined ? {} : { nextCursor }) };
93
+ }
94
+ function matchesQuery(item, query, from, to) {
95
+ if (!isRecord(item))
96
+ return Object.keys(query).every((key) => key === "limit" || key === "cursor");
97
+ const timestamp = [item.timestamp, item.startedAt, item.occurredAt, item.completedAt].find((value) => typeof value === "string");
98
+ const time = typeof timestamp === "string" ? Date.parse(timestamp) : Number.NaN;
99
+ return (exact(item, query.routeId, "routeId") &&
100
+ exact(item, query.functionId, "functionId") &&
101
+ exact(item, query.outcome, "outcome") &&
102
+ exact(item, query.traceId, "traceId") &&
103
+ (query.requestId === undefined ||
104
+ item.requestId === query.requestId ||
105
+ item.correlationId === query.requestId) &&
106
+ (query.severity === undefined ||
107
+ item.level === query.severity ||
108
+ item.severity === query.severity) &&
109
+ (from === undefined || (Number.isFinite(time) && time >= from)) &&
110
+ (to === undefined || (Number.isFinite(time) && time <= to)));
111
+ }
112
+ function exact(item, value, key) {
113
+ return value === undefined || item[key] === value;
114
+ }
115
+ function cursorOffset(value) {
116
+ if (value === undefined)
117
+ return 0;
118
+ const offset = Number(value);
119
+ if (!Number.isSafeInteger(offset) || offset < 0)
120
+ throw new InternalQueryError();
121
+ return offset;
122
+ }
123
+ export function streamBody(value) {
124
+ if (!Array.isArray(value))
125
+ return "";
126
+ return value
127
+ .filter(isStreamEvent)
128
+ .map((event) => `id: ${event.cursor}\nevent: ${event.type}\ndata: ${canonicalJson({ protocol: INTERNAL_ENDPOINT_PROTOCOL, version: INTERNAL_ENDPOINT_VERSION, ...event })}\n\n`)
129
+ .join("");
130
+ }
131
+ export function jsonResponse(value, status = 200, headers = {}) {
132
+ const payload = isRecord(value)
133
+ ? { ...value, protocol: INTERNAL_ENDPOINT_PROTOCOL, version: INTERNAL_ENDPOINT_VERSION }
134
+ : { data: value, protocol: INTERNAL_ENDPOINT_PROTOCOL, version: INTERNAL_ENDPOINT_VERSION };
135
+ return new Response(canonicalJson(payload), {
136
+ status,
137
+ headers: {
138
+ "cache-control": "no-store",
139
+ "content-type": "application/json",
140
+ "x-relkit-api-version": String(INTERNAL_ENDPOINT_VERSION),
141
+ ...headers,
142
+ },
143
+ });
144
+ }
145
+ function isStreamEvent(value) {
146
+ return (isRecord(value) &&
147
+ typeof value.cursor === "string" &&
148
+ typeof value.type === "string" &&
149
+ isJsonValue(value.data));
150
+ }
151
+ function isRecord(value) {
152
+ return value !== null && typeof value === "object" && !Array.isArray(value);
153
+ }
154
+ //# sourceMappingURL=internal-endpoints-utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"internal-endpoints-utils.js","sourceRoot":"","sources":["../src/internal-endpoints-utils.ts"],"names":[],"mappings":"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"}