@asenajs/hono-adapter 1.3.0 → 1.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -2
- package/dist/lib/HonoAdapter.d.ts +41 -4
- package/dist/lib/HonoAdapter.js +169 -54
- package/dist/lib/HonoAdapter.js.map +1 -1
- package/dist/lib/HonoContextWrapper.d.ts +16 -3
- package/dist/lib/HonoContextWrapper.js +77 -2
- package/dist/lib/HonoContextWrapper.js.map +1 -1
- package/dist/lib/HonoWebsocketAdapter.d.ts +2 -16
- package/dist/lib/HonoWebsocketAdapter.js +25 -53
- package/dist/lib/HonoWebsocketAdapter.js.map +1 -1
- package/dist/lib/defaults/ValidationService.d.ts +4 -4
- package/dist/lib/middlewares/CorsMiddleware.d.ts +1 -1
- package/dist/lib/middlewares/CorsMiddleware.js +5 -6
- package/dist/lib/middlewares/CorsMiddleware.js.map +1 -1
- package/dist/lib/middlewares/RateLimiterMiddleware.d.ts +1 -1
- package/dist/lib/middlewares/RateLimiterMiddleware.js +11 -9
- package/dist/lib/middlewares/RateLimiterMiddleware.js.map +1 -1
- package/dist/lib/types/HonoAdapterOptions.d.ts +27 -0
- package/dist/lib/types/HonoAdapterOptions.js +2 -0
- package/dist/lib/types/HonoAdapterOptions.js.map +1 -0
- package/dist/lib/types/SendPingStrategy.d.ts +4 -0
- package/dist/lib/types/SendPingStrategy.js +2 -0
- package/dist/lib/types/SendPingStrategy.js.map +1 -0
- package/dist/lib/types/index.d.ts +2 -0
- package/dist/lib/types/index.js +2 -0
- package/dist/lib/types/index.js.map +1 -1
- package/dist/lib/utils/createHonoAdapter.d.ts +2 -1
- package/dist/lib/utils/createHonoAdapter.js +9 -1
- package/dist/lib/utils/createHonoAdapter.js.map +1 -1
- package/dist/lib/utils/middlewareParser.d.ts +5 -1
- package/dist/lib/utils/middlewareParser.js +19 -4
- package/dist/lib/utils/middlewareParser.js.map +1 -1
- package/dist/lib/utils/routePriority.d.ts +40 -0
- package/dist/lib/utils/routePriority.js +75 -0
- package/dist/lib/utils/routePriority.js.map +1 -0
- package/dist/test/utils/testHelpers.d.ts +61 -0
- package/dist/test/utils/testHelpers.js +109 -0
- package/dist/test/utils/testHelpers.js.map +1 -0
- package/package.json +21 -15
|
@@ -1,8 +1,12 @@
|
|
|
1
1
|
import { deleteCookie, getCookie, getSignedCookie, setCookie, setSignedCookie } from 'hono/cookie'; // add delete cookie
|
|
2
|
+
import { stream as honoStream, streamSSE as honoStreamSSE, streamText as honoStreamText } from 'hono/streaming';
|
|
2
3
|
export class HonoContextWrapper {
|
|
3
4
|
_context;
|
|
4
|
-
|
|
5
|
+
_server;
|
|
6
|
+
_requestIp;
|
|
7
|
+
constructor(context, server) {
|
|
5
8
|
this._context = context;
|
|
9
|
+
this._server = server;
|
|
6
10
|
}
|
|
7
11
|
get req() {
|
|
8
12
|
return this._context.req;
|
|
@@ -37,6 +41,14 @@ export class HonoContextWrapper {
|
|
|
37
41
|
async getQueryAll(query) {
|
|
38
42
|
return this._context.req.queries(query);
|
|
39
43
|
}
|
|
44
|
+
getAllQueries() {
|
|
45
|
+
const queries = this._context.req.queries();
|
|
46
|
+
const result = {};
|
|
47
|
+
for (const [key, values] of Object.entries(queries)) {
|
|
48
|
+
result[key] = values.length === 1 ? values[0] : values;
|
|
49
|
+
}
|
|
50
|
+
return result;
|
|
51
|
+
}
|
|
40
52
|
send(data, statusOrOptions) {
|
|
41
53
|
const { headers = {}, status = 200 } = typeof statusOrOptions === 'number' ? { status: statusOrOptions } : statusOrOptions || {};
|
|
42
54
|
if (headers !== undefined) {
|
|
@@ -45,7 +57,7 @@ export class HonoContextWrapper {
|
|
|
45
57
|
});
|
|
46
58
|
}
|
|
47
59
|
if (typeof data === 'string') {
|
|
48
|
-
return this._context.text(data);
|
|
60
|
+
return this._context.text(data, status);
|
|
49
61
|
}
|
|
50
62
|
return this._context.json(data, status, headers);
|
|
51
63
|
}
|
|
@@ -68,6 +80,21 @@ export class HonoContextWrapper {
|
|
|
68
80
|
};
|
|
69
81
|
deleteCookie(this._context, name, extraOptions);
|
|
70
82
|
}
|
|
83
|
+
getRequestIp() {
|
|
84
|
+
if (this._requestIp === undefined) {
|
|
85
|
+
if (this._server) {
|
|
86
|
+
const addr = this._server.requestIP(this._context.req.raw);
|
|
87
|
+
this._requestIp = addr?.address ?? null;
|
|
88
|
+
}
|
|
89
|
+
else {
|
|
90
|
+
this._requestIp = null;
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
return this._requestIp;
|
|
94
|
+
}
|
|
95
|
+
setResponseHeader(key, value) {
|
|
96
|
+
this._context.res.headers.append(key, value);
|
|
97
|
+
}
|
|
71
98
|
redirect(url) {
|
|
72
99
|
return this._context.redirect(url);
|
|
73
100
|
}
|
|
@@ -93,6 +120,54 @@ export class HonoContextWrapper {
|
|
|
93
120
|
});
|
|
94
121
|
return this._context.html(data, status, headers);
|
|
95
122
|
}
|
|
123
|
+
stream(cb, onError) {
|
|
124
|
+
return honoStream(this._context, async (honoStream) => {
|
|
125
|
+
await cb(this.wrapStreamingApi(honoStream));
|
|
126
|
+
}, onError
|
|
127
|
+
? async (e, honoStream) => {
|
|
128
|
+
await onError(e, this.wrapStreamingApi(honoStream));
|
|
129
|
+
}
|
|
130
|
+
: undefined);
|
|
131
|
+
}
|
|
132
|
+
streamSSE(cb, onError) {
|
|
133
|
+
return honoStreamSSE(this._context, async (honoStream) => {
|
|
134
|
+
await cb(this.wrapSSEStreamingApi(honoStream));
|
|
135
|
+
}, onError
|
|
136
|
+
? async (e, honoStream) => {
|
|
137
|
+
await onError(e, this.wrapSSEStreamingApi(honoStream));
|
|
138
|
+
}
|
|
139
|
+
: undefined);
|
|
140
|
+
}
|
|
141
|
+
streamText(cb, onError) {
|
|
142
|
+
return honoStreamText(this._context, async (honoStream) => {
|
|
143
|
+
await cb(this.wrapStreamingApi(honoStream));
|
|
144
|
+
}, onError
|
|
145
|
+
? async (e, honoStream) => {
|
|
146
|
+
await onError(e, this.wrapStreamingApi(honoStream));
|
|
147
|
+
}
|
|
148
|
+
: undefined);
|
|
149
|
+
}
|
|
150
|
+
wrapStreamingApi(honoStream) {
|
|
151
|
+
return {
|
|
152
|
+
write: (input) => honoStream.write(input).then(() => { }),
|
|
153
|
+
writeln: (input) => honoStream.writeln(input).then(() => { }),
|
|
154
|
+
close: () => honoStream.close(),
|
|
155
|
+
pipe: (body) => honoStream.pipe(body),
|
|
156
|
+
onAbort: (listener) => honoStream.onAbort(listener),
|
|
157
|
+
get aborted() {
|
|
158
|
+
return honoStream.aborted;
|
|
159
|
+
},
|
|
160
|
+
get closed() {
|
|
161
|
+
return honoStream.closed;
|
|
162
|
+
},
|
|
163
|
+
};
|
|
164
|
+
}
|
|
165
|
+
wrapSSEStreamingApi(honoStream) {
|
|
166
|
+
return {
|
|
167
|
+
...this.wrapStreamingApi(honoStream),
|
|
168
|
+
writeSSE: (message) => honoStream.writeSSE(message),
|
|
169
|
+
};
|
|
170
|
+
}
|
|
96
171
|
get context() {
|
|
97
172
|
return this._context;
|
|
98
173
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"HonoContextWrapper.js","sourceRoot":"","sources":["../../lib/HonoContextWrapper.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"HonoContextWrapper.js","sourceRoot":"","sources":["../../lib/HonoContextWrapper.ts"],"names":[],"mappings":"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"}
|
|
@@ -7,7 +7,6 @@ export declare class HonoWebsocketAdapter extends AsenaWebsocketAdapter {
|
|
|
7
7
|
name: string;
|
|
8
8
|
private activeConnections;
|
|
9
9
|
private connectionLimits;
|
|
10
|
-
private heartbeatIntervals;
|
|
11
10
|
constructor(logger: ServerLogger);
|
|
12
11
|
/**
|
|
13
12
|
* Sets maximum connections allowed per namespace
|
|
@@ -32,20 +31,7 @@ export declare class HonoWebsocketAdapter extends AsenaWebsocketAdapter {
|
|
|
32
31
|
* All WebSocket services share the same wrapper instance for efficiency
|
|
33
32
|
* @param server - Bun Server instance
|
|
34
33
|
*/
|
|
35
|
-
startWebsocket(server: Server<WebSocketData>): void
|
|
36
|
-
prepareWebSocket(options?: WSOptions
|
|
37
|
-
heartbeatInterval?: number;
|
|
38
|
-
}): void;
|
|
39
|
-
/**
|
|
40
|
-
* Starts heartbeat for a connection
|
|
41
|
-
* @param ws - WebSocket connection
|
|
42
|
-
* @param intervalMs - Heartbeat interval in milliseconds (default: 30000)
|
|
43
|
-
*/
|
|
44
|
-
private startHeartbeat;
|
|
45
|
-
/**
|
|
46
|
-
* Stops heartbeat for a connection
|
|
47
|
-
* @param connectionId - Connection ID
|
|
48
|
-
*/
|
|
49
|
-
private stopHeartbeat;
|
|
34
|
+
startWebsocket(server: Server<WebSocketData>): Promise<void>;
|
|
35
|
+
prepareWebSocket(options?: WSOptions): void;
|
|
50
36
|
private createHandler;
|
|
51
37
|
}
|
|
@@ -1,10 +1,9 @@
|
|
|
1
1
|
import { AsenaWebsocketAdapter } from '@asenajs/asena/adapter';
|
|
2
|
-
import { AsenaSocket, AsenaWebSocketServer, } from '@asenajs/asena/web-socket';
|
|
2
|
+
import { AsenaSocket, AsenaWebSocketServer, BunLocalTransport, } from '@asenajs/asena/web-socket';
|
|
3
3
|
export class HonoWebsocketAdapter extends AsenaWebsocketAdapter {
|
|
4
4
|
name = 'HonoWebsocketAdapter';
|
|
5
5
|
activeConnections = new Map(); // namespace -> Set of connection IDs
|
|
6
6
|
connectionLimits = new Map(); // namespace -> max connections
|
|
7
|
-
heartbeatIntervals = new Map(); // connection ID -> interval (Bun native Timer)
|
|
8
7
|
constructor(logger) {
|
|
9
8
|
super(logger);
|
|
10
9
|
}
|
|
@@ -35,10 +34,7 @@ export class HonoWebsocketAdapter extends AsenaWebsocketAdapter {
|
|
|
35
34
|
async shutdown(_timeoutMs = 5000) {
|
|
36
35
|
this.logger.info('Starting WebSocket graceful shutdown...');
|
|
37
36
|
// Stop all heartbeats
|
|
38
|
-
|
|
39
|
-
clearInterval(interval);
|
|
40
|
-
}
|
|
41
|
-
this.heartbeatIntervals.clear();
|
|
37
|
+
this.clearAllHeartbeats();
|
|
42
38
|
// Clear connection tracking
|
|
43
39
|
this.activeConnections.clear();
|
|
44
40
|
this.logger.info('WebSocket shutdown complete');
|
|
@@ -52,7 +48,7 @@ export class HonoWebsocketAdapter extends AsenaWebsocketAdapter {
|
|
|
52
48
|
throw new Error('WebSocket namespace is required');
|
|
53
49
|
}
|
|
54
50
|
// Validate namespace format (alphanumeric, hyphens, underscores, slashes)
|
|
55
|
-
if (
|
|
51
|
+
if (!/^[a-zA-Z0-9\-_/]+$/.exec(namespace)) {
|
|
56
52
|
throw new Error(`Invalid WebSocket namespace format: "${namespace}". Only alphanumeric characters, hyphens, underscores, and slashes are allowed.`);
|
|
57
53
|
}
|
|
58
54
|
// Initialize websockets map if needed
|
|
@@ -70,12 +66,15 @@ export class HonoWebsocketAdapter extends AsenaWebsocketAdapter {
|
|
|
70
66
|
* All WebSocket services share the same wrapper instance for efficiency
|
|
71
67
|
* @param server - Bun Server instance
|
|
72
68
|
*/
|
|
73
|
-
startWebsocket(server) {
|
|
69
|
+
async startWebsocket(server) {
|
|
74
70
|
if (!this.websockets || this.websockets.size < 1) {
|
|
75
71
|
return;
|
|
76
72
|
}
|
|
73
|
+
// Initialize transport (default: BunLocalTransport)
|
|
74
|
+
const transport = this._transport ?? new BunLocalTransport();
|
|
75
|
+
await transport.init?.(server);
|
|
77
76
|
// Create a single shared wrapper for all WebSocket services
|
|
78
|
-
const sharedServer = new AsenaWebSocketServer(
|
|
77
|
+
const sharedServer = new AsenaWebSocketServer(transport);
|
|
79
78
|
// Assign the shared wrapper to all services
|
|
80
79
|
for (const websocket of this.websockets.values()) {
|
|
81
80
|
websocket.server = sharedServer;
|
|
@@ -85,8 +84,17 @@ export class HonoWebsocketAdapter extends AsenaWebsocketAdapter {
|
|
|
85
84
|
if (this.websockets?.size < 1) {
|
|
86
85
|
return;
|
|
87
86
|
}
|
|
88
|
-
const
|
|
87
|
+
const strategy = options?.sendPingStrategy ?? 'adapter';
|
|
88
|
+
// Heartbeat is only used in adapter strategy
|
|
89
|
+
const heartbeatInterval = strategy === 'adapter' ? options?.heartbeatInterval : undefined;
|
|
90
|
+
// Separate strategy/heartbeat fields from WSOptions to avoid conflicts
|
|
91
|
+
const { sendPings: _sendPings, sendPingStrategy: _strategy, heartbeatInterval: _hbInterval, ...restOptions } = options ?? {};
|
|
89
92
|
this.websocket = {
|
|
93
|
+
// Strategy controls sendPings:
|
|
94
|
+
// 'adapter' → false (Bun native disabled, adapter handles keepalive)
|
|
95
|
+
// 'native' → true (Bun native handles ping/pong)
|
|
96
|
+
// See: https://github.com/oven-sh/bun/issues/26554
|
|
97
|
+
sendPings: strategy === 'native',
|
|
90
98
|
open: (ws) => {
|
|
91
99
|
const namespace = ws.data.path;
|
|
92
100
|
// Check connection limit
|
|
@@ -102,7 +110,7 @@ export class HonoWebsocketAdapter extends AsenaWebsocketAdapter {
|
|
|
102
110
|
this.activeConnections.set(namespace, new Set());
|
|
103
111
|
}
|
|
104
112
|
this.activeConnections.get(namespace).add(ws.data.id);
|
|
105
|
-
// Start heartbeat if enabled
|
|
113
|
+
// Start heartbeat if enabled (adapter strategy only)
|
|
106
114
|
if (heartbeatInterval) {
|
|
107
115
|
this.startHeartbeat(ws, heartbeatInterval);
|
|
108
116
|
}
|
|
@@ -125,49 +133,13 @@ export class HonoWebsocketAdapter extends AsenaWebsocketAdapter {
|
|
|
125
133
|
drain: this.createHandler('onDrain'),
|
|
126
134
|
ping: this.createHandler('onPing'),
|
|
127
135
|
pong: this.createHandler('onPong'),
|
|
128
|
-
...
|
|
136
|
+
...restOptions,
|
|
129
137
|
};
|
|
130
138
|
}
|
|
131
|
-
/**
|
|
132
|
-
* Starts heartbeat for a connection
|
|
133
|
-
* @param ws - WebSocket connection
|
|
134
|
-
* @param intervalMs - Heartbeat interval in milliseconds (default: 30000)
|
|
135
|
-
*/
|
|
136
|
-
startHeartbeat(ws, intervalMs = 30000) {
|
|
137
|
-
const interval = setInterval(() => {
|
|
138
|
-
if (ws.readyState === WebSocket.OPEN) {
|
|
139
|
-
try {
|
|
140
|
-
ws.ping();
|
|
141
|
-
}
|
|
142
|
-
catch (error) {
|
|
143
|
-
this.logger.error(`Heartbeat ping failed for connection ${ws.data.id}:`, error);
|
|
144
|
-
this.stopHeartbeat(ws.data.id);
|
|
145
|
-
if (ws.readyState === WebSocket.OPEN) {
|
|
146
|
-
ws.close(1011, 'Heartbeat failed');
|
|
147
|
-
}
|
|
148
|
-
}
|
|
149
|
-
}
|
|
150
|
-
else {
|
|
151
|
-
this.stopHeartbeat(ws.data.id);
|
|
152
|
-
}
|
|
153
|
-
}, intervalMs);
|
|
154
|
-
this.heartbeatIntervals.set(ws.data.id, interval);
|
|
155
|
-
}
|
|
156
|
-
/**
|
|
157
|
-
* Stops heartbeat for a connection
|
|
158
|
-
* @param connectionId - Connection ID
|
|
159
|
-
*/
|
|
160
|
-
stopHeartbeat(connectionId) {
|
|
161
|
-
const interval = this.heartbeatIntervals.get(connectionId);
|
|
162
|
-
if (interval) {
|
|
163
|
-
clearInterval(interval);
|
|
164
|
-
this.heartbeatIntervals.delete(connectionId);
|
|
165
|
-
}
|
|
166
|
-
}
|
|
167
139
|
createHandler(type) {
|
|
168
140
|
return async (ws, ...args) => {
|
|
169
|
-
const
|
|
170
|
-
if (!
|
|
141
|
+
const asenaWebSocketService = this.websockets.get(ws.data.path);
|
|
142
|
+
if (!asenaWebSocketService) {
|
|
171
143
|
this.logger.error(`WebSocket handler not found for path: ${ws.data.path}`);
|
|
172
144
|
// Close connection with error code if handler not found
|
|
173
145
|
if (ws.readyState === WebSocket.OPEN || ws.readyState === WebSocket.CONNECTING) {
|
|
@@ -175,14 +147,14 @@ export class HonoWebsocketAdapter extends AsenaWebsocketAdapter {
|
|
|
175
147
|
}
|
|
176
148
|
return;
|
|
177
149
|
}
|
|
178
|
-
let handler =
|
|
150
|
+
let handler = asenaWebSocketService[type];
|
|
179
151
|
if (!handler) {
|
|
180
152
|
// Not all handlers are required, so this is not an error
|
|
181
153
|
return;
|
|
182
154
|
}
|
|
183
|
-
handler = handler.bind(
|
|
155
|
+
handler = handler.bind(asenaWebSocketService);
|
|
184
156
|
try {
|
|
185
|
-
await handler(new AsenaSocket(ws,
|
|
157
|
+
await handler(new AsenaSocket(ws, asenaWebSocketService.namespace, this._transport), ...args);
|
|
186
158
|
}
|
|
187
159
|
catch (error) {
|
|
188
160
|
this.logger.error(`WebSocket ${type} handler error for path ${ws.data.path}:`, {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"HonoWebsocketAdapter.js","sourceRoot":"","sources":["../../lib/HonoWebsocketAdapter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAC;AAG/D,OAAO,EACL,WAAW,EACX,oBAAoB,
|
|
1
|
+
{"version":3,"file":"HonoWebsocketAdapter.js","sourceRoot":"","sources":["../../lib/HonoWebsocketAdapter.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import type { z } from 'zod';
|
|
2
2
|
import type { Hook } from '@hono/zod-validator';
|
|
3
3
|
import type { AsenaValidationService } from '@asenajs/asena/middleware';
|
|
4
|
-
export type ValidationSchema = z.ZodType<any,
|
|
5
|
-
export interface ValidationSchemaWithHook {
|
|
6
|
-
schema:
|
|
7
|
-
hook?: Hook<
|
|
4
|
+
export type ValidationSchema = z.ZodType<any, any, any>;
|
|
5
|
+
export interface ValidationSchemaWithHook<T extends z.ZodType = z.ZodType> {
|
|
6
|
+
schema: T;
|
|
7
|
+
hook?: Hook<z.input<T>, any, any>;
|
|
8
8
|
}
|
|
9
9
|
export declare abstract class ValidationService implements AsenaValidationService<ValidationSchema | ValidationSchemaWithHook> {
|
|
10
10
|
}
|
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
*
|
|
12
12
|
* @example
|
|
13
13
|
* ```typescript
|
|
14
|
-
* import { Middleware } from '@asenajs/asena/
|
|
14
|
+
* import { Middleware } from '@asenajs/asena/decorators';
|
|
15
15
|
* import { CorsMiddleware } from '@asenajs/hono-adapter';
|
|
16
16
|
*
|
|
17
17
|
* @Middleware()
|
|
@@ -107,14 +107,13 @@ export class CorsMiddleware extends MiddlewareService {
|
|
|
107
107
|
// Origin not allowed → block request
|
|
108
108
|
return new Response('CORS: Origin not allowed', { status: 403 });
|
|
109
109
|
}
|
|
110
|
-
// Set CORS headers
|
|
111
|
-
|
|
112
|
-
honoContext.header('Access-Control-Allow-Origin', allowedOrigin);
|
|
110
|
+
// Set CORS headers via AsenaContext abstraction
|
|
111
|
+
context.setResponseHeader('Access-Control-Allow-Origin', allowedOrigin);
|
|
113
112
|
if (this.credentials) {
|
|
114
|
-
|
|
113
|
+
context.setResponseHeader('Access-Control-Allow-Credentials', 'true');
|
|
115
114
|
}
|
|
116
115
|
if (this.exposedHeaders) {
|
|
117
|
-
|
|
116
|
+
context.setResponseHeader('Access-Control-Expose-Headers', this.exposedHeaders);
|
|
118
117
|
}
|
|
119
118
|
// Handle preflight OPTIONS request
|
|
120
119
|
if (context.req.method === 'OPTIONS') {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CorsMiddleware.js","sourceRoot":"","sources":["../../../lib/middlewares/CorsMiddleware.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AAEH,OAAO,EAAgB,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAqD9D;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,OAAO,cAAe,SAAQ,iBAAiB;
|
|
1
|
+
{"version":3,"file":"CorsMiddleware.js","sourceRoot":"","sources":["../../../lib/middlewares/CorsMiddleware.ts"],"names":[],"mappings":"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"}
|
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
*
|
|
13
13
|
* **Usage in Asena Application:**
|
|
14
14
|
* ```typescript
|
|
15
|
-
* import { Middleware } from '@asenajs/asena/
|
|
15
|
+
* import { Middleware } from '@asenajs/asena/decorators';
|
|
16
16
|
* import { RateLimiterMiddleware } from '@asenajs/hono-adapter';
|
|
17
17
|
*
|
|
18
18
|
* // Create custom rate limiter for your needs
|
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
*
|
|
13
13
|
* **Usage in Asena Application:**
|
|
14
14
|
* ```typescript
|
|
15
|
-
* import { Middleware } from '@asenajs/asena/
|
|
15
|
+
* import { Middleware } from '@asenajs/asena/decorators';
|
|
16
16
|
* import { RateLimiterMiddleware } from '@asenajs/hono-adapter';
|
|
17
17
|
*
|
|
18
18
|
* // Create custom rate limiter for your needs
|
|
@@ -162,7 +162,7 @@ export class RateLimiterMiddleware extends MiddlewareService {
|
|
|
162
162
|
// Pre-process and store configuration
|
|
163
163
|
this.capacity = options.capacity ?? 100;
|
|
164
164
|
this.refillRate = options.refillRate ?? 10;
|
|
165
|
-
this.keyGenerator = options.keyGenerator ?? this.defaultKeyGenerator;
|
|
165
|
+
this.keyGenerator = options.keyGenerator ?? this.defaultKeyGenerator.bind(this);
|
|
166
166
|
this.message = options.message ?? 'Rate limit exceeded. Please try again later.';
|
|
167
167
|
this.statusCode = options.statusCode ?? 429;
|
|
168
168
|
this.cost = options.cost ?? 1;
|
|
@@ -191,7 +191,7 @@ export class RateLimiterMiddleware extends MiddlewareService {
|
|
|
191
191
|
*/
|
|
192
192
|
async handle(context, next) {
|
|
193
193
|
// Check skip predicate
|
|
194
|
-
if (this.skip
|
|
194
|
+
if (this.skip?.(context)) {
|
|
195
195
|
return await next();
|
|
196
196
|
}
|
|
197
197
|
// Generate client key
|
|
@@ -230,11 +230,10 @@ export class RateLimiterMiddleware extends MiddlewareService {
|
|
|
230
230
|
}
|
|
231
231
|
// Consume tokens
|
|
232
232
|
bucket.tokens -= requestCost;
|
|
233
|
-
// Set rate limit headers
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
honoContext.header('X-RateLimit-Reset', String(Math.floor(bucket.lastRefill / 1000 + 60)));
|
|
233
|
+
// Set rate limit headers via AsenaContext abstraction
|
|
234
|
+
context.setResponseHeader('X-RateLimit-Limit', String(Math.floor(this.refillRate * 60)));
|
|
235
|
+
context.setResponseHeader('X-RateLimit-Remaining', String(Math.floor(bucket.tokens)));
|
|
236
|
+
context.setResponseHeader('X-RateLimit-Reset', String(Math.floor(bucket.lastRefill / 1000 + 60)));
|
|
238
237
|
// Continue to next middleware/handler
|
|
239
238
|
return await next();
|
|
240
239
|
}
|
|
@@ -270,7 +269,10 @@ export class RateLimiterMiddleware extends MiddlewareService {
|
|
|
270
269
|
* @returns Client identifier
|
|
271
270
|
*/
|
|
272
271
|
defaultKeyGenerator(context) {
|
|
273
|
-
|
|
272
|
+
const req = context.req;
|
|
273
|
+
const forwarded = typeof req.header === 'function' ? req.header('x-forwarded-for') : context.headers?.['x-forwarded-for'];
|
|
274
|
+
const cfIp = typeof req.header === 'function' ? req.header('cf-connecting-ip') : context.headers?.['cf-connecting-ip'];
|
|
275
|
+
return forwarded || cfIp || context.getRequestIp?.() || 'unknown';
|
|
274
276
|
}
|
|
275
277
|
/**
|
|
276
278
|
* Setup automatic cleanup of inactive buckets
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RateLimiterMiddleware.js","sourceRoot":"","sources":["../../../lib/middlewares/RateLimiterMiddleware.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+CG;AAEH,OAAO,EAAgB,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAoI9D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6CG;AACH,MAAM,OAAO,qBAAsB,SAAQ,iBAAiB;
|
|
1
|
+
{"version":3,"file":"RateLimiterMiddleware.js","sourceRoot":"","sources":["../../../lib/middlewares/RateLimiterMiddleware.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import type { Hono } from 'hono';
|
|
2
|
+
import type { ServerLogger } from '@asenajs/asena/logger';
|
|
3
|
+
import type { HonoWebsocketAdapter } from '../HonoWebsocketAdapter';
|
|
4
|
+
export interface HonoAdapterOptions {
|
|
5
|
+
/**
|
|
6
|
+
* Logger instance for the adapter
|
|
7
|
+
*/
|
|
8
|
+
logger: ServerLogger;
|
|
9
|
+
/**
|
|
10
|
+
* Optional pre-configured Hono app instance.
|
|
11
|
+
* Use this to add custom middleware or configure Hono before Asena takes over.
|
|
12
|
+
*/
|
|
13
|
+
app?: Hono<any, any, any>;
|
|
14
|
+
/**
|
|
15
|
+
* Optional custom WebSocket adapter.
|
|
16
|
+
* Defaults to HonoWebsocketAdapter if not provided.
|
|
17
|
+
*/
|
|
18
|
+
websocketAdapter?: HonoWebsocketAdapter;
|
|
19
|
+
/**
|
|
20
|
+
* Hono strict mode for route matching.
|
|
21
|
+
* When false, `/health` and `/health/` match the same route.
|
|
22
|
+
* Default: true (Hono default)
|
|
23
|
+
*
|
|
24
|
+
* @see https://hono.dev/docs/api/hono#strict-mode
|
|
25
|
+
*/
|
|
26
|
+
strict?: boolean;
|
|
27
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"HonoAdapterOptions.js","sourceRoot":"","sources":["../../../lib/types/HonoAdapterOptions.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SendPingStrategy.js","sourceRoot":"","sources":["../../../lib/types/SendPingStrategy.ts"],"names":[],"mappings":""}
|
package/dist/lib/types/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../lib/types/index.ts"],"names":[],"mappings":"AAAA,cAAc,eAAe,CAAC;AAC9B,cAAc,qBAAqB,CAAC;AACpC,cAAc,qBAAqB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../lib/types/index.ts"],"names":[],"mappings":"AAAA,cAAc,eAAe,CAAC;AAC9B,cAAc,qBAAqB,CAAC;AACpC,cAAc,qBAAqB,CAAC;AACpC,cAAc,sBAAsB,CAAC;AACrC,cAAc,oBAAoB,CAAC"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
1
|
import { HonoAdapter } from '../../index';
|
|
2
2
|
import type { ServerLogger } from '@asenajs/asena/logger';
|
|
3
|
-
|
|
3
|
+
import type { HonoAdapterOptions } from '../types/HonoAdapterOptions';
|
|
4
|
+
export declare const createHonoAdapter: (loggerOrOptions?: ServerLogger | Partial<HonoAdapterOptions>) => [HonoAdapter, ServerLogger];
|
|
@@ -1,5 +1,13 @@
|
|
|
1
1
|
import { HonoAdapter } from '../../index';
|
|
2
|
-
export const createHonoAdapter = (
|
|
2
|
+
export const createHonoAdapter = (loggerOrOptions) => {
|
|
3
|
+
if (loggerOrOptions && typeof loggerOrOptions === 'object' && 'logger' in loggerOrOptions) {
|
|
4
|
+
const logger = loggerOrOptions.logger;
|
|
5
|
+
return [
|
|
6
|
+
new HonoAdapter(loggerOrOptions),
|
|
7
|
+
logger,
|
|
8
|
+
];
|
|
9
|
+
}
|
|
10
|
+
const logger = loggerOrOptions;
|
|
3
11
|
return [new HonoAdapter(logger), logger];
|
|
4
12
|
};
|
|
5
13
|
//# sourceMappingURL=createHonoAdapter.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"createHonoAdapter.js","sourceRoot":"","sources":["../../../lib/utils/createHonoAdapter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"createHonoAdapter.js","sourceRoot":"","sources":["../../../lib/utils/createHonoAdapter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAI1C,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAC/B,eAA4D,EAC/B,EAAE;IAC/B,IAAI,eAAe,IAAI,OAAO,eAAe,KAAK,QAAQ,IAAI,QAAQ,IAAI,eAAe,EAAE,CAAC;QAC1F,MAAM,MAAM,GAAG,eAAe,CAAC,MAAM,CAAC;QAEtC,OAAO;YACL,IAAI,WAAW,CAAC,eAAqC,CAAC;YACtD,MAAM;SACP,CAAC;IACJ,CAAC;IAED,MAAM,MAAM,GAAG,eAA+B,CAAC;IAE/C,OAAO,CAAC,IAAI,WAAW,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,CAAC;AAC3C,CAAC,CAAC"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type { Server } from 'bun';
|
|
1
2
|
import type { MiddlewareHandler } from 'hono';
|
|
2
3
|
import type { Context as HonoAdapterContext } from '../defaults';
|
|
3
4
|
import type { BaseMiddleware } from '@asenajs/asena/adapter';
|
|
@@ -6,5 +7,8 @@ import type { BaseMiddleware } from '@asenajs/asena/adapter';
|
|
|
6
7
|
* - Reuses context wrappers when possible
|
|
7
8
|
* - Handles middleware return values (false stops pipeline)
|
|
8
9
|
* - Adds error handling
|
|
10
|
+
*
|
|
11
|
+
* @param middlewares - Asena middlewares to convert
|
|
12
|
+
* @param getServer - Lazy server getter (server available at request time, not registration time)
|
|
9
13
|
*/
|
|
10
|
-
export declare const middlewareParser: (middlewares: BaseMiddleware<HonoAdapterContext>[]) => MiddlewareHandler[];
|
|
14
|
+
export declare const middlewareParser: (middlewares: BaseMiddleware<HonoAdapterContext>[], getServer?: () => Server<never> | undefined) => MiddlewareHandler[];
|