@guardcore/hono 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs ADDED
@@ -0,0 +1,225 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+
20
+ // src/index.ts
21
+ var index_exports = {};
22
+ __export(index_exports, {
23
+ BaseSecurityDecorator: () => import_core2.BaseSecurityDecorator,
24
+ BehaviorRule: () => import_core2.BehaviorRule,
25
+ HonoGuardRequest: () => HonoGuardRequest,
26
+ HonoGuardResponse: () => HonoGuardResponse,
27
+ HonoResponseFactory: () => HonoResponseFactory,
28
+ RouteConfig: () => import_core2.RouteConfig,
29
+ SecurityConfigSchema: () => import_core2.SecurityConfigSchema,
30
+ SecurityDecorator: () => import_core2.SecurityDecorator,
31
+ configureCors: () => configureCors,
32
+ createGuardMiddleware: () => createGuardMiddleware,
33
+ defaultLogger: () => import_core2.defaultLogger
34
+ });
35
+ module.exports = __toCommonJS(index_exports);
36
+
37
+ // src/middleware.ts
38
+ var import_core = require("@guardcore/core");
39
+
40
+ // src/adapters.ts
41
+ var HonoGuardRequest = class {
42
+ constructor(req, connectingIp) {
43
+ this.req = req;
44
+ this.connectingIp = connectingIp;
45
+ this._url = new URL(req.url);
46
+ }
47
+ _state = {};
48
+ _url;
49
+ get urlPath() {
50
+ return this._url.pathname;
51
+ }
52
+ get urlScheme() {
53
+ return this._url.protocol.replace(":", "");
54
+ }
55
+ get urlFull() {
56
+ return this.req.url;
57
+ }
58
+ urlReplaceScheme(scheme) {
59
+ return this.urlFull.replace(/^https?/, scheme);
60
+ }
61
+ get method() {
62
+ return this.req.method;
63
+ }
64
+ get clientHost() {
65
+ return this.connectingIp;
66
+ }
67
+ get headers() {
68
+ return Object.fromEntries(this.req.raw.headers.entries());
69
+ }
70
+ get queryParams() {
71
+ return Object.fromEntries(this._url.searchParams.entries());
72
+ }
73
+ async body() {
74
+ return new Uint8Array(await this.req.arrayBuffer());
75
+ }
76
+ get state() {
77
+ return this._state;
78
+ }
79
+ get scope() {
80
+ return {};
81
+ }
82
+ };
83
+ var HonoGuardResponse = class {
84
+ constructor(statusCode, content) {
85
+ this.statusCode = statusCode;
86
+ this._body = new TextEncoder().encode(content);
87
+ this._headers["content-type"] = "application/json";
88
+ }
89
+ _headers = {};
90
+ _body;
91
+ get headers() {
92
+ return this._headers;
93
+ }
94
+ setHeader(name, value) {
95
+ this._headers[name] = value;
96
+ }
97
+ get body() {
98
+ return this._body;
99
+ }
100
+ get bodyText() {
101
+ return this._body ? new TextDecoder().decode(this._body) : null;
102
+ }
103
+ };
104
+ var HonoResponseFactory = class {
105
+ createResponse(content, statusCode) {
106
+ return new HonoGuardResponse(statusCode, JSON.stringify({ detail: content }));
107
+ }
108
+ createRedirectResponse(url, statusCode) {
109
+ const resp = new HonoGuardResponse(statusCode, "");
110
+ resp.setHeader("location", url);
111
+ return resp;
112
+ }
113
+ };
114
+
115
+ // src/middleware.ts
116
+ function createGuardMiddleware(options) {
117
+ const resolved = import_core.SecurityConfigSchema.parse(options.config);
118
+ const logger = resolved.logger ?? import_core.defaultLogger;
119
+ const responseFactory = new HonoResponseFactory();
120
+ let initialized = false;
121
+ let components;
122
+ return async (c, next) => {
123
+ if (!initialized) {
124
+ components = await (0, import_core.initializeSecurityMiddleware)(
125
+ resolved,
126
+ logger,
127
+ responseFactory,
128
+ options.agentHandler,
129
+ options.geoIpHandler,
130
+ options.guardDecorator
131
+ );
132
+ initialized = true;
133
+ logger.info("Guard security middleware initialized");
134
+ }
135
+ const startTime = performance.now();
136
+ const connectingIp = c.env?.["remoteAddr"] ?? null;
137
+ const guardReq = new HonoGuardRequest(c.req, connectingIp);
138
+ const passthrough = await components.bypassHandler.handlePassthrough(
139
+ guardReq,
140
+ async () => createPassthroughResponse()
141
+ );
142
+ if (passthrough) return sendHonoResponse(c, passthrough);
143
+ const routeConfig = components.routeResolver.getRouteConfig(guardReq);
144
+ const bypass = await components.bypassHandler.handleSecurityBypass(
145
+ guardReq,
146
+ async () => createPassthroughResponse(),
147
+ routeConfig
148
+ );
149
+ if (bypass) return sendHonoResponse(c, bypass);
150
+ const blockResponse = await components.pipeline.execute(guardReq);
151
+ if (blockResponse) return sendHonoResponse(c, blockResponse);
152
+ if (routeConfig && routeConfig.behaviorRules.length > 0) {
153
+ const clientIp = guardReq.clientHost ?? "unknown";
154
+ await components.behavioralProcessor.processUsageRules(guardReq, clientIp, routeConfig);
155
+ }
156
+ await next();
157
+ const responseTime = (performance.now() - startTime) / 1e3;
158
+ const capturedResponse = {
159
+ statusCode: c.res.status,
160
+ headers: Object.fromEntries(c.res.headers.entries()),
161
+ setHeader(name, value) {
162
+ c.res.headers.set(name, value);
163
+ },
164
+ body: null,
165
+ bodyText: null
166
+ };
167
+ await components.errorResponseFactory.processResponse(
168
+ guardReq,
169
+ capturedResponse,
170
+ responseTime,
171
+ routeConfig ?? null,
172
+ routeConfig ? async (req, res, clientIp, rc) => {
173
+ await components.behavioralProcessor.processReturnRules(req, res, clientIp, rc);
174
+ } : void 0
175
+ );
176
+ };
177
+ }
178
+ function sendHonoResponse(c, response) {
179
+ for (const [name, value] of Object.entries(response.headers)) {
180
+ c.header(name, value);
181
+ }
182
+ if (response.headers["location"]) {
183
+ return c.redirect(response.headers["location"], response.statusCode);
184
+ }
185
+ return c.json(
186
+ { detail: response.bodyText },
187
+ response.statusCode
188
+ );
189
+ }
190
+ function createPassthroughResponse() {
191
+ return { statusCode: 200, headers: {}, setHeader() {
192
+ }, body: null, bodyText: null };
193
+ }
194
+
195
+ // src/cors.ts
196
+ var import_cors = require("hono/cors");
197
+ function configureCors(app, config) {
198
+ if (!config.enableCors) return;
199
+ app.use("*", (0, import_cors.cors)({
200
+ origin: config.corsAllowOrigins,
201
+ allowMethods: config.corsAllowMethods,
202
+ allowHeaders: config.corsAllowHeaders,
203
+ credentials: config.corsAllowCredentials,
204
+ exposeHeaders: config.corsExposeHeaders,
205
+ maxAge: config.corsMaxAge
206
+ }));
207
+ }
208
+
209
+ // src/index.ts
210
+ var import_core2 = require("@guardcore/core");
211
+ // Annotate the CommonJS export names for ESM import in node:
212
+ 0 && (module.exports = {
213
+ BaseSecurityDecorator,
214
+ BehaviorRule,
215
+ HonoGuardRequest,
216
+ HonoGuardResponse,
217
+ HonoResponseFactory,
218
+ RouteConfig,
219
+ SecurityConfigSchema,
220
+ SecurityDecorator,
221
+ configureCors,
222
+ createGuardMiddleware,
223
+ defaultLogger
224
+ });
225
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/index.ts","../src/middleware.ts","../src/adapters.ts","../src/cors.ts"],"sourcesContent":["export { createGuardMiddleware } from './middleware.js';\nexport type { GuardMiddlewareOptions } from './middleware.js';\nexport { configureCors } from './cors.js';\nexport { HonoGuardRequest, HonoGuardResponse, HonoResponseFactory } from './adapters.js';\n\nexport {\n SecurityConfigSchema,\n BaseSecurityDecorator,\n SecurityDecorator,\n RouteConfig,\n BehaviorRule,\n defaultLogger,\n} from '@guardcore/core';\n\nexport type {\n SecurityConfig,\n ResolvedSecurityConfig,\n GuardRequest,\n GuardResponse,\n Logger,\n} from '@guardcore/core';\n","import type { Context, MiddlewareHandler } from 'hono';\nimport type {\n SecurityConfig,\n GuardRequest,\n GuardResponse,\n Logger,\n AgentHandlerProtocol,\n GeoIPHandler,\n SecurityMiddlewareComponents,\n RouteConfig,\n} from '@guardcore/core';\nimport { SecurityConfigSchema, defaultLogger, initializeSecurityMiddleware } from '@guardcore/core';\nimport { HonoGuardRequest, HonoResponseFactory } from './adapters.js';\n\nexport interface GuardMiddlewareOptions {\n config: SecurityConfig;\n agentHandler?: AgentHandlerProtocol;\n geoIpHandler?: GeoIPHandler;\n guardDecorator?: unknown;\n}\n\nexport function createGuardMiddleware(options: GuardMiddlewareOptions): MiddlewareHandler {\n const resolved = SecurityConfigSchema.parse(options.config);\n const logger: Logger = resolved.logger ?? defaultLogger;\n const responseFactory = new HonoResponseFactory();\n\n let initialized = false;\n let components: SecurityMiddlewareComponents;\n\n return async (c: Context, next) => {\n if (!initialized) {\n components = await initializeSecurityMiddleware(\n resolved, logger, responseFactory,\n options.agentHandler, options.geoIpHandler, options.guardDecorator,\n );\n initialized = true;\n logger.info('Guard security middleware initialized');\n }\n\n const startTime = performance.now();\n const connectingIp = (c.env as Record<string, unknown> | undefined)?.['remoteAddr'] as string | undefined ?? null;\n const guardReq = new HonoGuardRequest(c.req, connectingIp);\n\n const passthrough = await components.bypassHandler.handlePassthrough(\n guardReq, async () => createPassthroughResponse(),\n );\n if (passthrough) return sendHonoResponse(c, passthrough);\n\n const routeConfig = components.routeResolver.getRouteConfig(guardReq);\n\n const bypass = await components.bypassHandler.handleSecurityBypass(\n guardReq, async () => createPassthroughResponse(), routeConfig,\n );\n if (bypass) return sendHonoResponse(c, bypass);\n\n const blockResponse = await components.pipeline.execute(guardReq);\n if (blockResponse) return sendHonoResponse(c, blockResponse);\n\n if (routeConfig && routeConfig.behaviorRules.length > 0) {\n const clientIp = guardReq.clientHost ?? 'unknown';\n await components.behavioralProcessor.processUsageRules(guardReq, clientIp, routeConfig);\n }\n\n await next();\n\n const responseTime = (performance.now() - startTime) / 1000;\n const capturedResponse: GuardResponse = {\n statusCode: c.res.status,\n headers: Object.fromEntries(c.res.headers.entries()),\n setHeader(name: string, value: string) { c.res.headers.set(name, value); },\n body: null,\n bodyText: null,\n };\n\n await components.errorResponseFactory.processResponse(\n guardReq, capturedResponse, responseTime, routeConfig ?? null,\n routeConfig ? async (req: GuardRequest, res: GuardResponse, clientIp: string, rc: RouteConfig) => {\n await components.behavioralProcessor.processReturnRules(req, res, clientIp, rc);\n } : undefined,\n );\n };\n}\n\nfunction sendHonoResponse(c: Context, response: GuardResponse): Response {\n for (const [name, value] of Object.entries(response.headers)) {\n c.header(name, value);\n }\n\n if (response.headers['location']) {\n return c.redirect(response.headers['location'], response.statusCode as 301 | 302);\n }\n\n return c.json(\n { detail: response.bodyText },\n response.statusCode as Parameters<typeof c.json>[1],\n );\n}\n\nfunction createPassthroughResponse(): GuardResponse {\n return { statusCode: 200, headers: {}, setHeader() {}, body: null, bodyText: null };\n}\n","import type { HonoRequest } from 'hono';\nimport type { GuardRequest, GuardRequestState, GuardResponse, GuardResponseFactory } from '@guardcore/core';\n\nexport class HonoGuardRequest implements GuardRequest {\n private _state: GuardRequestState = {};\n private _url: URL;\n\n constructor(private readonly req: HonoRequest, private readonly connectingIp: string | null) {\n this._url = new URL(req.url);\n }\n\n get urlPath(): string { return this._url.pathname; }\n get urlScheme(): string { return this._url.protocol.replace(':', ''); }\n get urlFull(): string { return this.req.url; }\n urlReplaceScheme(scheme: string): string { return this.urlFull.replace(/^https?/, scheme); }\n get method(): string { return this.req.method; }\n get clientHost(): string | null { return this.connectingIp; }\n get headers(): Readonly<Record<string, string>> { return Object.fromEntries(this.req.raw.headers.entries()); }\n get queryParams(): Readonly<Record<string, string>> { return Object.fromEntries(this._url.searchParams.entries()); }\n async body(): Promise<Uint8Array> { return new Uint8Array(await this.req.arrayBuffer()); }\n get state(): GuardRequestState { return this._state; }\n get scope(): Readonly<Record<string, unknown>> { return {}; }\n}\n\nexport class HonoGuardResponse implements GuardResponse {\n private _headers: Record<string, string> = {};\n private _body: Uint8Array | null;\n\n constructor(readonly statusCode: number, content: string) {\n this._body = new TextEncoder().encode(content);\n this._headers['content-type'] = 'application/json';\n }\n\n get headers(): Record<string, string> { return this._headers; }\n setHeader(name: string, value: string): void { this._headers[name] = value; }\n get body(): Uint8Array | null { return this._body; }\n get bodyText(): string | null { return this._body ? new TextDecoder().decode(this._body) : null; }\n}\n\nexport class HonoResponseFactory implements GuardResponseFactory {\n createResponse(content: string, statusCode: number): GuardResponse {\n return new HonoGuardResponse(statusCode, JSON.stringify({ detail: content }));\n }\n\n createRedirectResponse(url: string, statusCode: number): GuardResponse {\n const resp = new HonoGuardResponse(statusCode, '');\n resp.setHeader('location', url);\n return resp;\n }\n}\n","import type { Hono } from 'hono';\nimport { cors } from 'hono/cors';\nimport type { ResolvedSecurityConfig } from '@guardcore/core';\n\nexport function configureCors(app: Hono, config: ResolvedSecurityConfig): void {\n if (!config.enableCors) return;\n\n app.use('*', cors({\n origin: config.corsAllowOrigins,\n allowMethods: config.corsAllowMethods,\n allowHeaders: config.corsAllowHeaders,\n credentials: config.corsAllowCredentials,\n exposeHeaders: config.corsExposeHeaders,\n maxAge: config.corsMaxAge,\n }));\n}\n"],"mappings":"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","names":["import_core"]}
@@ -0,0 +1,48 @@
1
+ import { MiddlewareHandler, Hono, HonoRequest } from 'hono';
2
+ import { SecurityConfig, AgentHandlerProtocol, GeoIPHandler, ResolvedSecurityConfig, GuardRequest, GuardRequestState, GuardResponse, GuardResponseFactory } from '@guardcore/core';
3
+ export { BaseSecurityDecorator, BehaviorRule, GuardRequest, GuardResponse, Logger, ResolvedSecurityConfig, RouteConfig, SecurityConfig, SecurityConfigSchema, SecurityDecorator, defaultLogger } from '@guardcore/core';
4
+
5
+ interface GuardMiddlewareOptions {
6
+ config: SecurityConfig;
7
+ agentHandler?: AgentHandlerProtocol;
8
+ geoIpHandler?: GeoIPHandler;
9
+ guardDecorator?: unknown;
10
+ }
11
+ declare function createGuardMiddleware(options: GuardMiddlewareOptions): MiddlewareHandler;
12
+
13
+ declare function configureCors(app: Hono, config: ResolvedSecurityConfig): void;
14
+
15
+ declare class HonoGuardRequest implements GuardRequest {
16
+ private readonly req;
17
+ private readonly connectingIp;
18
+ private _state;
19
+ private _url;
20
+ constructor(req: HonoRequest, connectingIp: string | null);
21
+ get urlPath(): string;
22
+ get urlScheme(): string;
23
+ get urlFull(): string;
24
+ urlReplaceScheme(scheme: string): string;
25
+ get method(): string;
26
+ get clientHost(): string | null;
27
+ get headers(): Readonly<Record<string, string>>;
28
+ get queryParams(): Readonly<Record<string, string>>;
29
+ body(): Promise<Uint8Array>;
30
+ get state(): GuardRequestState;
31
+ get scope(): Readonly<Record<string, unknown>>;
32
+ }
33
+ declare class HonoGuardResponse implements GuardResponse {
34
+ readonly statusCode: number;
35
+ private _headers;
36
+ private _body;
37
+ constructor(statusCode: number, content: string);
38
+ get headers(): Record<string, string>;
39
+ setHeader(name: string, value: string): void;
40
+ get body(): Uint8Array | null;
41
+ get bodyText(): string | null;
42
+ }
43
+ declare class HonoResponseFactory implements GuardResponseFactory {
44
+ createResponse(content: string, statusCode: number): GuardResponse;
45
+ createRedirectResponse(url: string, statusCode: number): GuardResponse;
46
+ }
47
+
48
+ export { type GuardMiddlewareOptions, HonoGuardRequest, HonoGuardResponse, HonoResponseFactory, configureCors, createGuardMiddleware };
@@ -0,0 +1,48 @@
1
+ import { MiddlewareHandler, Hono, HonoRequest } from 'hono';
2
+ import { SecurityConfig, AgentHandlerProtocol, GeoIPHandler, ResolvedSecurityConfig, GuardRequest, GuardRequestState, GuardResponse, GuardResponseFactory } from '@guardcore/core';
3
+ export { BaseSecurityDecorator, BehaviorRule, GuardRequest, GuardResponse, Logger, ResolvedSecurityConfig, RouteConfig, SecurityConfig, SecurityConfigSchema, SecurityDecorator, defaultLogger } from '@guardcore/core';
4
+
5
+ interface GuardMiddlewareOptions {
6
+ config: SecurityConfig;
7
+ agentHandler?: AgentHandlerProtocol;
8
+ geoIpHandler?: GeoIPHandler;
9
+ guardDecorator?: unknown;
10
+ }
11
+ declare function createGuardMiddleware(options: GuardMiddlewareOptions): MiddlewareHandler;
12
+
13
+ declare function configureCors(app: Hono, config: ResolvedSecurityConfig): void;
14
+
15
+ declare class HonoGuardRequest implements GuardRequest {
16
+ private readonly req;
17
+ private readonly connectingIp;
18
+ private _state;
19
+ private _url;
20
+ constructor(req: HonoRequest, connectingIp: string | null);
21
+ get urlPath(): string;
22
+ get urlScheme(): string;
23
+ get urlFull(): string;
24
+ urlReplaceScheme(scheme: string): string;
25
+ get method(): string;
26
+ get clientHost(): string | null;
27
+ get headers(): Readonly<Record<string, string>>;
28
+ get queryParams(): Readonly<Record<string, string>>;
29
+ body(): Promise<Uint8Array>;
30
+ get state(): GuardRequestState;
31
+ get scope(): Readonly<Record<string, unknown>>;
32
+ }
33
+ declare class HonoGuardResponse implements GuardResponse {
34
+ readonly statusCode: number;
35
+ private _headers;
36
+ private _body;
37
+ constructor(statusCode: number, content: string);
38
+ get headers(): Record<string, string>;
39
+ setHeader(name: string, value: string): void;
40
+ get body(): Uint8Array | null;
41
+ get bodyText(): string | null;
42
+ }
43
+ declare class HonoResponseFactory implements GuardResponseFactory {
44
+ createResponse(content: string, statusCode: number): GuardResponse;
45
+ createRedirectResponse(url: string, statusCode: number): GuardResponse;
46
+ }
47
+
48
+ export { type GuardMiddlewareOptions, HonoGuardRequest, HonoGuardResponse, HonoResponseFactory, configureCors, createGuardMiddleware };
package/dist/index.js ADDED
@@ -0,0 +1,195 @@
1
+ // src/middleware.ts
2
+ import { SecurityConfigSchema, defaultLogger, initializeSecurityMiddleware } from "@guardcore/core";
3
+
4
+ // src/adapters.ts
5
+ var HonoGuardRequest = class {
6
+ constructor(req, connectingIp) {
7
+ this.req = req;
8
+ this.connectingIp = connectingIp;
9
+ this._url = new URL(req.url);
10
+ }
11
+ _state = {};
12
+ _url;
13
+ get urlPath() {
14
+ return this._url.pathname;
15
+ }
16
+ get urlScheme() {
17
+ return this._url.protocol.replace(":", "");
18
+ }
19
+ get urlFull() {
20
+ return this.req.url;
21
+ }
22
+ urlReplaceScheme(scheme) {
23
+ return this.urlFull.replace(/^https?/, scheme);
24
+ }
25
+ get method() {
26
+ return this.req.method;
27
+ }
28
+ get clientHost() {
29
+ return this.connectingIp;
30
+ }
31
+ get headers() {
32
+ return Object.fromEntries(this.req.raw.headers.entries());
33
+ }
34
+ get queryParams() {
35
+ return Object.fromEntries(this._url.searchParams.entries());
36
+ }
37
+ async body() {
38
+ return new Uint8Array(await this.req.arrayBuffer());
39
+ }
40
+ get state() {
41
+ return this._state;
42
+ }
43
+ get scope() {
44
+ return {};
45
+ }
46
+ };
47
+ var HonoGuardResponse = class {
48
+ constructor(statusCode, content) {
49
+ this.statusCode = statusCode;
50
+ this._body = new TextEncoder().encode(content);
51
+ this._headers["content-type"] = "application/json";
52
+ }
53
+ _headers = {};
54
+ _body;
55
+ get headers() {
56
+ return this._headers;
57
+ }
58
+ setHeader(name, value) {
59
+ this._headers[name] = value;
60
+ }
61
+ get body() {
62
+ return this._body;
63
+ }
64
+ get bodyText() {
65
+ return this._body ? new TextDecoder().decode(this._body) : null;
66
+ }
67
+ };
68
+ var HonoResponseFactory = class {
69
+ createResponse(content, statusCode) {
70
+ return new HonoGuardResponse(statusCode, JSON.stringify({ detail: content }));
71
+ }
72
+ createRedirectResponse(url, statusCode) {
73
+ const resp = new HonoGuardResponse(statusCode, "");
74
+ resp.setHeader("location", url);
75
+ return resp;
76
+ }
77
+ };
78
+
79
+ // src/middleware.ts
80
+ function createGuardMiddleware(options) {
81
+ const resolved = SecurityConfigSchema.parse(options.config);
82
+ const logger = resolved.logger ?? defaultLogger;
83
+ const responseFactory = new HonoResponseFactory();
84
+ let initialized = false;
85
+ let components;
86
+ return async (c, next) => {
87
+ if (!initialized) {
88
+ components = await initializeSecurityMiddleware(
89
+ resolved,
90
+ logger,
91
+ responseFactory,
92
+ options.agentHandler,
93
+ options.geoIpHandler,
94
+ options.guardDecorator
95
+ );
96
+ initialized = true;
97
+ logger.info("Guard security middleware initialized");
98
+ }
99
+ const startTime = performance.now();
100
+ const connectingIp = c.env?.["remoteAddr"] ?? null;
101
+ const guardReq = new HonoGuardRequest(c.req, connectingIp);
102
+ const passthrough = await components.bypassHandler.handlePassthrough(
103
+ guardReq,
104
+ async () => createPassthroughResponse()
105
+ );
106
+ if (passthrough) return sendHonoResponse(c, passthrough);
107
+ const routeConfig = components.routeResolver.getRouteConfig(guardReq);
108
+ const bypass = await components.bypassHandler.handleSecurityBypass(
109
+ guardReq,
110
+ async () => createPassthroughResponse(),
111
+ routeConfig
112
+ );
113
+ if (bypass) return sendHonoResponse(c, bypass);
114
+ const blockResponse = await components.pipeline.execute(guardReq);
115
+ if (blockResponse) return sendHonoResponse(c, blockResponse);
116
+ if (routeConfig && routeConfig.behaviorRules.length > 0) {
117
+ const clientIp = guardReq.clientHost ?? "unknown";
118
+ await components.behavioralProcessor.processUsageRules(guardReq, clientIp, routeConfig);
119
+ }
120
+ await next();
121
+ const responseTime = (performance.now() - startTime) / 1e3;
122
+ const capturedResponse = {
123
+ statusCode: c.res.status,
124
+ headers: Object.fromEntries(c.res.headers.entries()),
125
+ setHeader(name, value) {
126
+ c.res.headers.set(name, value);
127
+ },
128
+ body: null,
129
+ bodyText: null
130
+ };
131
+ await components.errorResponseFactory.processResponse(
132
+ guardReq,
133
+ capturedResponse,
134
+ responseTime,
135
+ routeConfig ?? null,
136
+ routeConfig ? async (req, res, clientIp, rc) => {
137
+ await components.behavioralProcessor.processReturnRules(req, res, clientIp, rc);
138
+ } : void 0
139
+ );
140
+ };
141
+ }
142
+ function sendHonoResponse(c, response) {
143
+ for (const [name, value] of Object.entries(response.headers)) {
144
+ c.header(name, value);
145
+ }
146
+ if (response.headers["location"]) {
147
+ return c.redirect(response.headers["location"], response.statusCode);
148
+ }
149
+ return c.json(
150
+ { detail: response.bodyText },
151
+ response.statusCode
152
+ );
153
+ }
154
+ function createPassthroughResponse() {
155
+ return { statusCode: 200, headers: {}, setHeader() {
156
+ }, body: null, bodyText: null };
157
+ }
158
+
159
+ // src/cors.ts
160
+ import { cors } from "hono/cors";
161
+ function configureCors(app, config) {
162
+ if (!config.enableCors) return;
163
+ app.use("*", cors({
164
+ origin: config.corsAllowOrigins,
165
+ allowMethods: config.corsAllowMethods,
166
+ allowHeaders: config.corsAllowHeaders,
167
+ credentials: config.corsAllowCredentials,
168
+ exposeHeaders: config.corsExposeHeaders,
169
+ maxAge: config.corsMaxAge
170
+ }));
171
+ }
172
+
173
+ // src/index.ts
174
+ import {
175
+ SecurityConfigSchema as SecurityConfigSchema2,
176
+ BaseSecurityDecorator,
177
+ SecurityDecorator,
178
+ RouteConfig,
179
+ BehaviorRule,
180
+ defaultLogger as defaultLogger2
181
+ } from "@guardcore/core";
182
+ export {
183
+ BaseSecurityDecorator,
184
+ BehaviorRule,
185
+ HonoGuardRequest,
186
+ HonoGuardResponse,
187
+ HonoResponseFactory,
188
+ RouteConfig,
189
+ SecurityConfigSchema2 as SecurityConfigSchema,
190
+ SecurityDecorator,
191
+ configureCors,
192
+ createGuardMiddleware,
193
+ defaultLogger2 as defaultLogger
194
+ };
195
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/middleware.ts","../src/adapters.ts","../src/cors.ts","../src/index.ts"],"sourcesContent":["import type { Context, MiddlewareHandler } from 'hono';\nimport type {\n SecurityConfig,\n GuardRequest,\n GuardResponse,\n Logger,\n AgentHandlerProtocol,\n GeoIPHandler,\n SecurityMiddlewareComponents,\n RouteConfig,\n} from '@guardcore/core';\nimport { SecurityConfigSchema, defaultLogger, initializeSecurityMiddleware } from '@guardcore/core';\nimport { HonoGuardRequest, HonoResponseFactory } from './adapters.js';\n\nexport interface GuardMiddlewareOptions {\n config: SecurityConfig;\n agentHandler?: AgentHandlerProtocol;\n geoIpHandler?: GeoIPHandler;\n guardDecorator?: unknown;\n}\n\nexport function createGuardMiddleware(options: GuardMiddlewareOptions): MiddlewareHandler {\n const resolved = SecurityConfigSchema.parse(options.config);\n const logger: Logger = resolved.logger ?? defaultLogger;\n const responseFactory = new HonoResponseFactory();\n\n let initialized = false;\n let components: SecurityMiddlewareComponents;\n\n return async (c: Context, next) => {\n if (!initialized) {\n components = await initializeSecurityMiddleware(\n resolved, logger, responseFactory,\n options.agentHandler, options.geoIpHandler, options.guardDecorator,\n );\n initialized = true;\n logger.info('Guard security middleware initialized');\n }\n\n const startTime = performance.now();\n const connectingIp = (c.env as Record<string, unknown> | undefined)?.['remoteAddr'] as string | undefined ?? null;\n const guardReq = new HonoGuardRequest(c.req, connectingIp);\n\n const passthrough = await components.bypassHandler.handlePassthrough(\n guardReq, async () => createPassthroughResponse(),\n );\n if (passthrough) return sendHonoResponse(c, passthrough);\n\n const routeConfig = components.routeResolver.getRouteConfig(guardReq);\n\n const bypass = await components.bypassHandler.handleSecurityBypass(\n guardReq, async () => createPassthroughResponse(), routeConfig,\n );\n if (bypass) return sendHonoResponse(c, bypass);\n\n const blockResponse = await components.pipeline.execute(guardReq);\n if (blockResponse) return sendHonoResponse(c, blockResponse);\n\n if (routeConfig && routeConfig.behaviorRules.length > 0) {\n const clientIp = guardReq.clientHost ?? 'unknown';\n await components.behavioralProcessor.processUsageRules(guardReq, clientIp, routeConfig);\n }\n\n await next();\n\n const responseTime = (performance.now() - startTime) / 1000;\n const capturedResponse: GuardResponse = {\n statusCode: c.res.status,\n headers: Object.fromEntries(c.res.headers.entries()),\n setHeader(name: string, value: string) { c.res.headers.set(name, value); },\n body: null,\n bodyText: null,\n };\n\n await components.errorResponseFactory.processResponse(\n guardReq, capturedResponse, responseTime, routeConfig ?? null,\n routeConfig ? async (req: GuardRequest, res: GuardResponse, clientIp: string, rc: RouteConfig) => {\n await components.behavioralProcessor.processReturnRules(req, res, clientIp, rc);\n } : undefined,\n );\n };\n}\n\nfunction sendHonoResponse(c: Context, response: GuardResponse): Response {\n for (const [name, value] of Object.entries(response.headers)) {\n c.header(name, value);\n }\n\n if (response.headers['location']) {\n return c.redirect(response.headers['location'], response.statusCode as 301 | 302);\n }\n\n return c.json(\n { detail: response.bodyText },\n response.statusCode as Parameters<typeof c.json>[1],\n );\n}\n\nfunction createPassthroughResponse(): GuardResponse {\n return { statusCode: 200, headers: {}, setHeader() {}, body: null, bodyText: null };\n}\n","import type { HonoRequest } from 'hono';\nimport type { GuardRequest, GuardRequestState, GuardResponse, GuardResponseFactory } from '@guardcore/core';\n\nexport class HonoGuardRequest implements GuardRequest {\n private _state: GuardRequestState = {};\n private _url: URL;\n\n constructor(private readonly req: HonoRequest, private readonly connectingIp: string | null) {\n this._url = new URL(req.url);\n }\n\n get urlPath(): string { return this._url.pathname; }\n get urlScheme(): string { return this._url.protocol.replace(':', ''); }\n get urlFull(): string { return this.req.url; }\n urlReplaceScheme(scheme: string): string { return this.urlFull.replace(/^https?/, scheme); }\n get method(): string { return this.req.method; }\n get clientHost(): string | null { return this.connectingIp; }\n get headers(): Readonly<Record<string, string>> { return Object.fromEntries(this.req.raw.headers.entries()); }\n get queryParams(): Readonly<Record<string, string>> { return Object.fromEntries(this._url.searchParams.entries()); }\n async body(): Promise<Uint8Array> { return new Uint8Array(await this.req.arrayBuffer()); }\n get state(): GuardRequestState { return this._state; }\n get scope(): Readonly<Record<string, unknown>> { return {}; }\n}\n\nexport class HonoGuardResponse implements GuardResponse {\n private _headers: Record<string, string> = {};\n private _body: Uint8Array | null;\n\n constructor(readonly statusCode: number, content: string) {\n this._body = new TextEncoder().encode(content);\n this._headers['content-type'] = 'application/json';\n }\n\n get headers(): Record<string, string> { return this._headers; }\n setHeader(name: string, value: string): void { this._headers[name] = value; }\n get body(): Uint8Array | null { return this._body; }\n get bodyText(): string | null { return this._body ? new TextDecoder().decode(this._body) : null; }\n}\n\nexport class HonoResponseFactory implements GuardResponseFactory {\n createResponse(content: string, statusCode: number): GuardResponse {\n return new HonoGuardResponse(statusCode, JSON.stringify({ detail: content }));\n }\n\n createRedirectResponse(url: string, statusCode: number): GuardResponse {\n const resp = new HonoGuardResponse(statusCode, '');\n resp.setHeader('location', url);\n return resp;\n }\n}\n","import type { Hono } from 'hono';\nimport { cors } from 'hono/cors';\nimport type { ResolvedSecurityConfig } from '@guardcore/core';\n\nexport function configureCors(app: Hono, config: ResolvedSecurityConfig): void {\n if (!config.enableCors) return;\n\n app.use('*', cors({\n origin: config.corsAllowOrigins,\n allowMethods: config.corsAllowMethods,\n allowHeaders: config.corsAllowHeaders,\n credentials: config.corsAllowCredentials,\n exposeHeaders: config.corsExposeHeaders,\n maxAge: config.corsMaxAge,\n }));\n}\n","export { createGuardMiddleware } from './middleware.js';\nexport type { GuardMiddlewareOptions } from './middleware.js';\nexport { configureCors } from './cors.js';\nexport { HonoGuardRequest, HonoGuardResponse, HonoResponseFactory } from './adapters.js';\n\nexport {\n SecurityConfigSchema,\n BaseSecurityDecorator,\n SecurityDecorator,\n RouteConfig,\n BehaviorRule,\n defaultLogger,\n} from '@guardcore/core';\n\nexport type {\n SecurityConfig,\n ResolvedSecurityConfig,\n GuardRequest,\n GuardResponse,\n Logger,\n} from '@guardcore/core';\n"],"mappings":"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","names":["SecurityConfigSchema","defaultLogger"]}
package/package.json ADDED
@@ -0,0 +1,46 @@
1
+ {
2
+ "name": "@guardcore/hono",
3
+ "version": "1.0.0",
4
+ "description": "Hono adapter for @guardcore/core security middleware (edge-safe)",
5
+ "type": "module",
6
+ "main": "./dist/index.cjs",
7
+ "module": "./dist/index.js",
8
+ "types": "./dist/index.d.ts",
9
+ "exports": {
10
+ ".": {
11
+ "types": "./dist/index.d.ts",
12
+ "import": "./dist/index.js",
13
+ "require": "./dist/index.cjs"
14
+ }
15
+ },
16
+ "files": [
17
+ "dist"
18
+ ],
19
+ "scripts": {
20
+ "build": "tsup",
21
+ "test": "vitest run",
22
+ "lint": "tsc --noEmit",
23
+ "clean": "rm -rf dist"
24
+ },
25
+ "dependencies": {
26
+ "@guardcore/core": "workspace:*"
27
+ },
28
+ "devDependencies": {
29
+ "tsup": "^8",
30
+ "vitest": "^4",
31
+ "typescript": "~5.9",
32
+ "hono": "^4"
33
+ },
34
+ "peerDependencies": {
35
+ "hono": "^4"
36
+ },
37
+ "license": "MIT",
38
+ "repository": {
39
+ "type": "git",
40
+ "url": "git+https://github.com/rennf93/guard-core-ts.git",
41
+ "directory": "packages/hono"
42
+ },
43
+ "publishConfig": {
44
+ "access": "public"
45
+ }
46
+ }