glasswork 0.6.1 → 0.7.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 +37 -9
- package/dist/core/bootstrap.d.ts.map +1 -1
- package/dist/core/bootstrap.js +36 -6
- package/dist/core/bootstrap.js.map +1 -1
- package/dist/core/types.d.ts +103 -23
- package/dist/core/types.d.ts.map +1 -1
- package/dist/http/route-helpers.d.ts +102 -44
- package/dist/http/route-helpers.d.ts.map +1 -1
- package/dist/http/route-helpers.js +127 -126
- package/dist/http/route-helpers.js.map +1 -1
- package/dist/index.d.ts +4 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/middleware/rate-limit.d.ts.map +1 -1
- package/dist/middleware/rate-limit.js +47 -13
- package/dist/middleware/rate-limit.js.map +1 -1
- package/dist/openapi/defaults.d.ts.map +1 -1
- package/dist/openapi/defaults.js +5 -3
- package/dist/openapi/defaults.js.map +1 -1
- package/dist/openapi/openapi-processors.d.ts +51 -0
- package/dist/openapi/openapi-processors.d.ts.map +1 -0
- package/dist/openapi/openapi-processors.js +166 -0
- package/dist/openapi/openapi-processors.js.map +1 -0
- package/dist/openapi/openapi.d.ts +36 -3
- package/dist/openapi/openapi.d.ts.map +1 -1
- package/dist/openapi/openapi.js +27 -39
- package/dist/openapi/openapi.js.map +1 -1
- package/dist/utils/serialize-prisma-types.d.ts +63 -30
- package/dist/utils/serialize-prisma-types.d.ts.map +1 -1
- package/dist/utils/serialize-prisma-types.js +37 -8
- package/dist/utils/serialize-prisma-types.js.map +1 -1
- package/package.json +10 -3
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { describeRoute as honoDescribeRoute, resolver, validator, } from 'hono-openapi';
|
|
2
2
|
import { safeParseAsync } from 'valibot';
|
|
3
|
+
import { applyProcessors } from '../openapi/openapi-processors.js';
|
|
3
4
|
import { getClientIp } from '../utils/get-client-ip.js';
|
|
4
5
|
import { createLogger } from '../utils/logger.js';
|
|
5
6
|
import { defaultConfig as defaultSerializationConfig, serializePrismaTypes, } from '../utils/serialize-prisma-types.js';
|
|
@@ -8,49 +9,26 @@ import { defaultConfig as defaultSerializationConfig, serializePrismaTypes, } fr
|
|
|
8
9
|
*/
|
|
9
10
|
const logger = createLogger('Routes');
|
|
10
11
|
/**
|
|
11
|
-
*
|
|
12
|
-
*
|
|
12
|
+
* Storage for OpenAPI context per Hono app instance.
|
|
13
|
+
* Uses WeakMap to avoid memory leaks and support multiple app instances.
|
|
13
14
|
*/
|
|
14
|
-
|
|
15
|
+
const openAPIContextMap = new WeakMap();
|
|
15
16
|
/**
|
|
16
|
-
*
|
|
17
|
-
*
|
|
18
|
-
* Used when building route security (public: false routes).
|
|
19
|
-
*/
|
|
20
|
-
let globalSecuritySchemes = [];
|
|
21
|
-
/**
|
|
22
|
-
* Set the global OpenAPI response hooks.
|
|
23
|
-
* This is called during bootstrap and makes hooks available to route definitions.
|
|
24
|
-
*
|
|
25
|
-
* @internal
|
|
26
|
-
*/
|
|
27
|
-
export function setGlobalResponseHooks(hooks) {
|
|
28
|
-
globalResponseHooks = hooks;
|
|
29
|
-
}
|
|
30
|
-
/**
|
|
31
|
-
* Get the current global OpenAPI response hooks.
|
|
32
|
-
*
|
|
33
|
-
* @internal
|
|
34
|
-
*/
|
|
35
|
-
export function getGlobalResponseHooks() {
|
|
36
|
-
return globalResponseHooks;
|
|
37
|
-
}
|
|
38
|
-
/**
|
|
39
|
-
* Set the global OpenAPI security schemes.
|
|
40
|
-
* This is called during bootstrap and makes security schemes available to route definitions.
|
|
17
|
+
* Set the OpenAPI context for a Hono app instance.
|
|
18
|
+
* This is called during bootstrap and makes processors/schemes available to route definitions.
|
|
41
19
|
*
|
|
42
20
|
* @internal
|
|
43
21
|
*/
|
|
44
|
-
export function
|
|
45
|
-
|
|
22
|
+
export function setOpenAPIContext(app, context) {
|
|
23
|
+
openAPIContextMap.set(app, context);
|
|
46
24
|
}
|
|
47
25
|
/**
|
|
48
|
-
* Get the
|
|
26
|
+
* Get the OpenAPI context for a Hono app instance.
|
|
49
27
|
*
|
|
50
28
|
* @internal
|
|
51
29
|
*/
|
|
52
|
-
export function
|
|
53
|
-
return
|
|
30
|
+
export function getOpenAPIContext(app) {
|
|
31
|
+
return openAPIContextMap.get(app) ?? { processors: [], securitySchemes: [] };
|
|
54
32
|
}
|
|
55
33
|
/**
|
|
56
34
|
* HTTP status codes with descriptions
|
|
@@ -74,7 +52,10 @@ const STATUS_DESCRIPTIONS = {
|
|
|
74
52
|
500: 'Internal Server Error',
|
|
75
53
|
};
|
|
76
54
|
/**
|
|
77
|
-
* Create routes with typed service injection.
|
|
55
|
+
* Create routes with typed service injection and pre-bound route function.
|
|
56
|
+
*
|
|
57
|
+
* The `route` function passed to your factory is pre-bound to the router's
|
|
58
|
+
* OpenAPI context, so you don't need to pass the router to every route call.
|
|
78
59
|
*
|
|
79
60
|
* @template TServices - The shape of services required by these routes
|
|
80
61
|
*
|
|
@@ -85,15 +66,54 @@ const STATUS_DESCRIPTIONS = {
|
|
|
85
66
|
* userService: UserService;
|
|
86
67
|
* }
|
|
87
68
|
*
|
|
88
|
-
* export const authRoutes = createRoutes<AuthRoutesServices>((router, services) => {
|
|
69
|
+
* export const authRoutes = createRoutes<AuthRoutesServices>((router, services, route) => {
|
|
89
70
|
* // services.authService is typed as AuthService!
|
|
90
|
-
* //
|
|
91
|
-
* router.post('/login', ...
|
|
71
|
+
* // route is pre-bound to this router's OpenAPI context
|
|
72
|
+
* router.post('/login', ...route({
|
|
73
|
+
* body: LoginDto,
|
|
74
|
+
* responses: { 200: SessionDto },
|
|
75
|
+
* handler: async ({ body }) => {
|
|
76
|
+
* return services.authService.login(body);
|
|
77
|
+
* }
|
|
78
|
+
* }));
|
|
92
79
|
* });
|
|
93
80
|
* ```
|
|
94
81
|
*/
|
|
95
82
|
export function createRoutes(factory) {
|
|
96
|
-
return
|
|
83
|
+
return (router, services) => {
|
|
84
|
+
// Create a bound route function for this router
|
|
85
|
+
const boundRoute = (config) => route(router, config);
|
|
86
|
+
factory(router, services, boundRoute);
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Detect if a query schema includes pagination fields (page, pageSize).
|
|
91
|
+
* Used to auto-detect pagination for OpenAPI documentation.
|
|
92
|
+
*/
|
|
93
|
+
function hasPaginationFields(schema) {
|
|
94
|
+
if (!schema)
|
|
95
|
+
return false;
|
|
96
|
+
// Check if schema has page or pageSize entries
|
|
97
|
+
// This works for Valibot object schemas
|
|
98
|
+
const schemaAny = schema;
|
|
99
|
+
if (schemaAny.entries) {
|
|
100
|
+
return 'page' in schemaAny.entries || 'pageSize' in schemaAny.entries;
|
|
101
|
+
}
|
|
102
|
+
return false;
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Create a validation middleware for request validation.
|
|
106
|
+
* Returns 422 Unprocessable Entity on validation failure (instead of Hono's default 400).
|
|
107
|
+
*
|
|
108
|
+
* @param type - The validation target ('json' for body, 'query', or 'param')
|
|
109
|
+
* @param schema - The Valibot schema to validate against
|
|
110
|
+
*/
|
|
111
|
+
function createValidationMiddleware(type, schema) {
|
|
112
|
+
return validator(type, schema, (result, c) => {
|
|
113
|
+
if (!result.success) {
|
|
114
|
+
return c.json({ error: 'Validation failed', issues: result.error }, 422);
|
|
115
|
+
}
|
|
116
|
+
});
|
|
97
117
|
}
|
|
98
118
|
/**
|
|
99
119
|
* Create a route handler with validation and OpenAPI metadata.
|
|
@@ -111,20 +131,23 @@ export function createRoutes(factory) {
|
|
|
111
131
|
* - If multiple 2xx schemas are defined, each is tried in order (200, 201)
|
|
112
132
|
* - The first schema that successfully validates determines the status code
|
|
113
133
|
*
|
|
134
|
+
* @param router - The Hono router instance (needed for OpenAPI context)
|
|
135
|
+
* @param config - Route configuration
|
|
136
|
+
*
|
|
114
137
|
* @example
|
|
115
138
|
* ```typescript
|
|
116
139
|
* // Single response type
|
|
117
|
-
* route({
|
|
140
|
+
* router.post('/session', ...route(router, {
|
|
118
141
|
* body: StartSessionDto,
|
|
119
142
|
* responses: { 200: StartSessionResponseDto },
|
|
120
143
|
* handler: async ({ body }) => {
|
|
121
144
|
* // body is typed as InferOutput<typeof StartSessionDto>
|
|
122
145
|
* return { email: body.email }; // Must match StartSessionResponseDto
|
|
123
146
|
* }
|
|
124
|
-
* })
|
|
147
|
+
* }))
|
|
125
148
|
*
|
|
126
149
|
* // Union response type (multiple 2xx responses with automatic status)
|
|
127
|
-
* route({
|
|
150
|
+
* router.post('/login', ...route(router, {
|
|
128
151
|
* body: LoginDto,
|
|
129
152
|
* responses: {
|
|
130
153
|
* 200: MfaRequiredDto, // Returns 200 if data matches this
|
|
@@ -136,49 +159,46 @@ export function createRoutes(factory) {
|
|
|
136
159
|
* if (needsMfa) return { mfaRequired: true, methods: ['totp'] }; // 200
|
|
137
160
|
* return { sessionId: '123', token: 'abc' }; // 201
|
|
138
161
|
* }
|
|
139
|
-
* })
|
|
162
|
+
* }))
|
|
140
163
|
*
|
|
141
|
-
* //
|
|
142
|
-
* route({
|
|
143
|
-
*
|
|
144
|
-
*
|
|
145
|
-
*
|
|
146
|
-
*
|
|
147
|
-
*
|
|
148
|
-
*
|
|
149
|
-
*
|
|
150
|
-
*
|
|
164
|
+
* // With pagination (auto-detected from ListQuerySchema)
|
|
165
|
+
* router.get('/users', ...route(router, {
|
|
166
|
+
* query: ListQuerySchema, // Contains page, pageSize - pagination headers auto-added
|
|
167
|
+
* responses: { 200: UsersResponseDto },
|
|
168
|
+
* handler: async ({ query }) => { ... }
|
|
169
|
+
* }))
|
|
170
|
+
*
|
|
171
|
+
* // With custom response headers
|
|
172
|
+
* router.get('/data', ...route(router, {
|
|
173
|
+
* openapi: {
|
|
174
|
+
* responseHeaders: ['Api-Version', 'Server-Timing']
|
|
175
|
+
* },
|
|
176
|
+
* responses: { 200: DataDto },
|
|
177
|
+
* handler: async () => { ... }
|
|
178
|
+
* }))
|
|
151
179
|
* ```
|
|
152
180
|
*/
|
|
153
|
-
export function route(config) {
|
|
181
|
+
export function route(router, config) {
|
|
154
182
|
const middlewares = [];
|
|
183
|
+
// Get OpenAPI context from the router
|
|
184
|
+
const openAPIContext = getOpenAPIContext(router);
|
|
185
|
+
// Detect pagination from query schema
|
|
186
|
+
const hasPagination = hasPaginationFields(config.query);
|
|
155
187
|
// Add OpenAPI metadata
|
|
156
|
-
middlewares.push(buildOpenAPIMiddleware(config));
|
|
188
|
+
middlewares.push(buildOpenAPIMiddleware(config, openAPIContext, hasPagination));
|
|
157
189
|
// Add custom middleware (e.g., auth) before validation
|
|
158
190
|
if (config.middleware) {
|
|
159
191
|
middlewares.push(...config.middleware);
|
|
160
192
|
}
|
|
161
|
-
// Add validation middleware
|
|
193
|
+
// Add validation middleware (returns 422 instead of Hono's default 400)
|
|
162
194
|
if (config.body) {
|
|
163
|
-
middlewares.push(
|
|
164
|
-
if (!result.success) {
|
|
165
|
-
return c.json({ error: 'Validation failed', issues: result.error }, 422);
|
|
166
|
-
}
|
|
167
|
-
}));
|
|
195
|
+
middlewares.push(createValidationMiddleware('json', config.body));
|
|
168
196
|
}
|
|
169
197
|
if (config.query) {
|
|
170
|
-
middlewares.push(
|
|
171
|
-
if (!result.success) {
|
|
172
|
-
return c.json({ error: 'Validation failed', issues: result.error }, 422);
|
|
173
|
-
}
|
|
174
|
-
}));
|
|
198
|
+
middlewares.push(createValidationMiddleware('query', config.query));
|
|
175
199
|
}
|
|
176
200
|
if (config.params) {
|
|
177
|
-
middlewares.push(
|
|
178
|
-
if (!result.success) {
|
|
179
|
-
return c.json({ error: 'Validation failed', issues: result.error }, 422);
|
|
180
|
-
}
|
|
181
|
-
}));
|
|
201
|
+
middlewares.push(createValidationMiddleware('param', config.params));
|
|
182
202
|
}
|
|
183
203
|
// Add handler wrapper
|
|
184
204
|
middlewares.push(async (c) => {
|
|
@@ -300,13 +320,15 @@ async function parseResponse(data, responses) {
|
|
|
300
320
|
'This would throw an error in production.');
|
|
301
321
|
return { data };
|
|
302
322
|
}
|
|
303
|
-
function buildOpenAPIMiddleware(config) {
|
|
304
|
-
const responses = buildOpenAPIResponses(config);
|
|
305
|
-
// Build security requirement based on
|
|
323
|
+
function buildOpenAPIMiddleware(config, openAPIContext, hasPagination) {
|
|
324
|
+
const responses = buildOpenAPIResponses(config, openAPIContext, hasPagination);
|
|
325
|
+
// Build security requirement based on security schemes from context
|
|
306
326
|
// Public routes have no security, authenticated routes use all available schemes
|
|
307
327
|
const security = config.public
|
|
308
328
|
? []
|
|
309
|
-
:
|
|
329
|
+
: openAPIContext.securitySchemes.map((scheme) => ({ [scheme]: [] }));
|
|
330
|
+
// Extract responseHeaders from openapi config to avoid passing it to hono-openapi
|
|
331
|
+
const { responseHeaders: _responseHeaders, ...restOpenapi } = config.openapi ?? {};
|
|
310
332
|
const openApiConfig = {
|
|
311
333
|
operationId: config.operationId || config.summary,
|
|
312
334
|
tags: config.tags,
|
|
@@ -314,53 +336,30 @@ function buildOpenAPIMiddleware(config) {
|
|
|
314
336
|
description: config.description,
|
|
315
337
|
responses: responses,
|
|
316
338
|
security,
|
|
317
|
-
...
|
|
318
|
-
...config.openapi,
|
|
339
|
+
...restOpenapi,
|
|
319
340
|
};
|
|
320
341
|
return honoDescribeRoute(openApiConfig);
|
|
321
342
|
}
|
|
322
|
-
|
|
323
|
-
* Build pagination parameters for OpenAPI spec
|
|
324
|
-
*/
|
|
325
|
-
function buildPaginationParameters() {
|
|
326
|
-
return [
|
|
327
|
-
{
|
|
328
|
-
name: 'page',
|
|
329
|
-
in: 'query',
|
|
330
|
-
required: false,
|
|
331
|
-
schema: {
|
|
332
|
-
type: 'integer',
|
|
333
|
-
format: 'int32',
|
|
334
|
-
minimum: 1,
|
|
335
|
-
maximum: 2147483647, // Max int32
|
|
336
|
-
default: 1,
|
|
337
|
-
},
|
|
338
|
-
description: 'Page number',
|
|
339
|
-
},
|
|
340
|
-
{
|
|
341
|
-
name: 'limit',
|
|
342
|
-
in: 'query',
|
|
343
|
-
required: false,
|
|
344
|
-
schema: {
|
|
345
|
-
type: 'integer',
|
|
346
|
-
format: 'int32',
|
|
347
|
-
minimum: 1,
|
|
348
|
-
maximum: 100,
|
|
349
|
-
default: 50,
|
|
350
|
-
},
|
|
351
|
-
description: 'Number of items per page',
|
|
352
|
-
},
|
|
353
|
-
];
|
|
354
|
-
}
|
|
355
|
-
function buildOpenAPIResponses(config) {
|
|
343
|
+
function buildOpenAPIResponses(config, openAPIContext, hasPagination) {
|
|
356
344
|
const responses = {};
|
|
357
345
|
// Add default error responses
|
|
346
|
+
// Include 422 when body, query, or params validation is configured
|
|
347
|
+
const hasValidation = !!(config.body || config.query || config.params);
|
|
358
348
|
const defaultResponses = config.public
|
|
359
|
-
? {
|
|
360
|
-
|
|
349
|
+
? {
|
|
350
|
+
400: undefined,
|
|
351
|
+
...(hasValidation && { 422: undefined }),
|
|
352
|
+
429: undefined,
|
|
353
|
+
500: undefined,
|
|
354
|
+
}
|
|
355
|
+
: {
|
|
356
|
+
400: undefined,
|
|
357
|
+
401: undefined,
|
|
358
|
+
...(hasValidation && { 422: undefined }),
|
|
359
|
+
429: undefined,
|
|
360
|
+
500: undefined,
|
|
361
|
+
};
|
|
361
362
|
const allResponses = { ...defaultResponses, ...(config.responses || {}) };
|
|
362
|
-
// Get global hooks
|
|
363
|
-
const hooks = getGlobalResponseHooks();
|
|
364
363
|
for (const [statusCode, schema] of Object.entries(allResponses)) {
|
|
365
364
|
const code = Number(statusCode);
|
|
366
365
|
const description = STATUS_DESCRIPTIONS[code] || 'Response';
|
|
@@ -393,18 +392,20 @@ function buildOpenAPIResponses(config) {
|
|
|
393
392
|
}
|
|
394
393
|
: {}),
|
|
395
394
|
};
|
|
396
|
-
//
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
}
|
|
407
|
-
}
|
|
395
|
+
// Build processor context
|
|
396
|
+
const processorContext = {
|
|
397
|
+
statusCode,
|
|
398
|
+
hasPagination,
|
|
399
|
+
routeConfig: {
|
|
400
|
+
...config,
|
|
401
|
+
public: config.public,
|
|
402
|
+
tags: config.tags,
|
|
403
|
+
summary: config.summary,
|
|
404
|
+
openapi: config.openapi,
|
|
405
|
+
},
|
|
406
|
+
};
|
|
407
|
+
// Apply processors to build up headers
|
|
408
|
+
response = applyProcessors(response, processorContext, openAPIContext.processors);
|
|
408
409
|
responses[statusCode] = response;
|
|
409
410
|
}
|
|
410
411
|
return responses;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"route-helpers.js","sourceRoot":"","sources":["../../src/http/route-helpers.ts"],"names":[],"mappings":"AAEA,OAAO,EAEL,aAAa,IAAI,iBAAiB,EAClC,QAAQ,EACR,SAAS,GACV,MAAM,cAAc,CAAC;AAEtB,OAAO,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"route-helpers.js","sourceRoot":"","sources":["../../src/http/route-helpers.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -12,18 +12,18 @@ export type { OpenAPIV3 } from 'openapi-types';
|
|
|
12
12
|
export { type Config, type ConfigOptions, type ConfigProvider, ConfigValidationException, createConfig, type DotenvProviderOptions, dotenvProvider, type EnvProviderOptions, envProvider, objectProvider, parseArray, parseBoolean, parseJson, type SsmProviderOptions, ssmProvider, toCamelCase, toSnakeCase, validateConfig, } from './config/index.js';
|
|
13
13
|
export { bootstrap } from './core/bootstrap.js';
|
|
14
14
|
export { defineModule } from './core/module.js';
|
|
15
|
-
export type { BootstrapOptions, BootstrapResult, Constructor, Environment, LoggerOptions, MiddlewareOptions, ModuleConfig, OpenAPIDocumentation, OpenAPIOptions,
|
|
15
|
+
export type { BootstrapOptions, BootstrapResult, Constructor, Environment, LoggerOptions, MiddlewareOptions, ModuleConfig, OpenAPIDocumentation, OpenAPIOptions, OpenAPIProcessorContext, OpenAPIResponseObject, OpenAPIResponseProcessor, ProviderConfig, RateLimitOptions, RateLimitStorage, RouteConfigExtensions, ServiceScope, } from './core/types.js';
|
|
16
16
|
export { createErrorHandler, defaultErrorHandler } from './http/error-handler.js';
|
|
17
17
|
export { type ErrorResponse, ErrorResponseDto, type ValidationErrorResponse, ValidationErrorResponseDto, type ValidationIssue, ValidationIssueDto, } from './http/error-response.dto.js';
|
|
18
18
|
export { BadGatewayException, BadRequestException, ConflictException, DomainException, ForbiddenException, GatewayTimeoutException, GoneException, InternalServerErrorException, LockedException, MethodNotAllowedException, NotFoundException, NotImplementedException, PayloadTooLargeException, PreconditionFailedException, RequestTimeoutException, ServiceUnavailableException, TooManyRequestsException, UnauthorizedException, UnprocessableEntityException, UnsupportedMediaTypeException, ValidationException, } from './http/errors.js';
|
|
19
|
-
export type { RouteConfig, RouteContext, RouteFactory, ValibotSchema, } from './http/route-helpers.js';
|
|
19
|
+
export type { BoundRouteFunction, RouteConfig, RouteContext, RouteFactory, RouteOpenAPIOptions, ValibotSchema, } from './http/route-helpers.js';
|
|
20
20
|
export { createRoutes, route } from './http/route-helpers.js';
|
|
21
21
|
export { createCaslScope, withCaslScope } from './list-query/casl.js';
|
|
22
22
|
export type { AggregationConfig, AggregationResult, AggregationType, FieldPath, FilterOperator, ParsedFilter, ParsedQueryParams, ParsedSort, PrismaAggregationParams, PrismaListParams, RawQueryParams, SchemaValidationConfig, SearchFieldInput, SortDirection, ValidatedListParams, } from './list-query/index.js';
|
|
23
23
|
export { booleanFilterSchema, createFilterSchema, createListQuery, createSortSchema, dateFilterSchema, enumFilterSchema, type ListQueryBuilder, type ListQueryConfig, ListQuerySchema, numberFilterSchema, type PaginatedResult, relationFilterSchema, sortDirectionSchema, stringFilterSchema, } from './list-query/index.js';
|
|
24
24
|
export { createRateLimitMiddleware } from './middleware/rate-limit.js';
|
|
25
25
|
export { defaultOpenAPIComponents } from './openapi/defaults.js';
|
|
26
|
-
export {
|
|
26
|
+
export { applyProcessors, createBuiltinProcessors, createCorsHeadersProcessor, createRateLimitHeadersProcessor, paginationHeadersProcessor, responseHeadersProcessor, } from './openapi/openapi-processors.js';
|
|
27
27
|
export { configureOpenAPI } from './openapi/openapi.js';
|
|
28
28
|
export { deepMerge } from './utils/deep-merge.js';
|
|
29
29
|
export { isDevelopment, isLambda, isProduction, isTest } from './utils/environment.js';
|
|
@@ -32,6 +32,6 @@ export type { Logger } from './utils/logger.js';
|
|
|
32
32
|
export { createLogger, createPlainLogger, defaultLogger } from './utils/logger.js';
|
|
33
33
|
export { omit } from './utils/omit.js';
|
|
34
34
|
export { pick } from './utils/pick.js';
|
|
35
|
-
export type { AcceptPrismaTypes, SerializationConfig, SerializedTypes, TypeTransformer, } from './utils/serialize-prisma-types.js';
|
|
35
|
+
export type { AcceptPrismaTypes, PrismaDecimalLike, SerializationConfig, SerializedTypes, TypeTransformer, } from './utils/serialize-prisma-types.js';
|
|
36
36
|
export { defaultConfig, serializePrismaTypes } from './utils/serialize-prisma-types.js';
|
|
37
37
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,YAAY,EAAE,eAAe,EAAE,MAAM,QAAQ,CAAC;AAC9C,YAAY,EAAE,YAAY,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC/C,YAAY,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAG/C,OAAO,EACL,KAAK,MAAM,EACX,KAAK,aAAa,EAClB,KAAK,cAAc,EACnB,yBAAyB,EACzB,YAAY,EACZ,KAAK,qBAAqB,EAC1B,cAAc,EACd,KAAK,kBAAkB,EACvB,WAAW,EACX,cAAc,EACd,UAAU,EACV,YAAY,EACZ,SAAS,EACT,KAAK,kBAAkB,EACvB,WAAW,EACX,WAAW,EACX,WAAW,EACX,cAAc,GACf,MAAM,mBAAmB,CAAC;AAG3B,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAChD,YAAY,EACV,gBAAgB,EAChB,eAAe,EACf,WAAW,EACX,WAAW,EACX,aAAa,EACb,iBAAiB,EACjB,YAAY,EACZ,oBAAoB,EACpB,cAAc,EACd,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -24,7 +24,7 @@ export { booleanFilterSchema, createFilterSchema, createListQuery, createSortSch
|
|
|
24
24
|
export { createRateLimitMiddleware } from './middleware/rate-limit.js';
|
|
25
25
|
// OpenAPI
|
|
26
26
|
export { defaultOpenAPIComponents } from './openapi/defaults.js';
|
|
27
|
-
export {
|
|
27
|
+
export { applyProcessors, createBuiltinProcessors, createCorsHeadersProcessor, createRateLimitHeadersProcessor, paginationHeadersProcessor, responseHeadersProcessor, } from './openapi/openapi-processors.js';
|
|
28
28
|
export { configureOpenAPI } from './openapi/openapi.js';
|
|
29
29
|
// Utilities
|
|
30
30
|
export { deepMerge } from './utils/deep-merge.js';
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAOH,gBAAgB;AAChB,OAAO,EAIL,yBAAyB,EACzB,YAAY,EAEZ,cAAc,EAEd,WAAW,EACX,cAAc,EACd,UAAU,EACV,YAAY,EACZ,SAAS,EAET,WAAW,EACX,WAAW,EACX,WAAW,EACX,cAAc,GACf,MAAM,mBAAmB,CAAC;AAE3B,iBAAiB;AACjB,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAOH,gBAAgB;AAChB,OAAO,EAIL,yBAAyB,EACzB,YAAY,EAEZ,cAAc,EAEd,WAAW,EACX,cAAc,EACd,UAAU,EACV,YAAY,EACZ,SAAS,EAET,WAAW,EACX,WAAW,EACX,WAAW,EACX,cAAc,GACf,MAAM,mBAAmB,CAAC;AAE3B,iBAAiB;AACjB,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAqBhD,eAAe;AACf,OAAO,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAClF,OAAO,EAEL,gBAAgB,EAEhB,0BAA0B,EAE1B,kBAAkB,GACnB,MAAM,8BAA8B,CAAC;AACtC,OAAO,EACL,mBAAmB,EACnB,mBAAmB,EACnB,iBAAiB,EACjB,eAAe,EACf,kBAAkB,EAClB,uBAAuB,EACvB,aAAa,EACb,4BAA4B,EAC5B,eAAe,EACf,yBAAyB,EACzB,iBAAiB,EACjB,uBAAuB,EACvB,wBAAwB,EACxB,2BAA2B,EAC3B,uBAAuB,EACvB,2BAA2B,EAC3B,wBAAwB,EACxB,qBAAqB,EACrB,4BAA4B,EAC5B,6BAA6B,EAC7B,mBAAmB,GACpB,MAAM,kBAAkB,CAAC;AAS1B,OAAO,EAAE,YAAY,EAAE,KAAK,EAAE,MAAM,yBAAyB,CAAC;AAC9D,4BAA4B;AAC5B,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAkBtE,mDAAmD;AACnD,OAAO,EACL,mBAAmB,EACnB,kBAAkB,EAClB,eAAe,EACf,gBAAgB,EAChB,gBAAgB,EAChB,gBAAgB,EAGhB,eAAe,EACf,kBAAkB,EAElB,oBAAoB,EACpB,mBAAmB,EACnB,kBAAkB,GACnB,MAAM,uBAAuB,CAAC;AAC/B,aAAa;AACb,OAAO,EAAE,yBAAyB,EAAE,MAAM,4BAA4B,CAAC;AACvE,UAAU;AACV,OAAO,EAAE,wBAAwB,EAAE,MAAM,uBAAuB,CAAC;AACjE,OAAO,EACL,eAAe,EACf,uBAAuB,EACvB,0BAA0B,EAC1B,+BAA+B,EAC/B,0BAA0B,EAC1B,wBAAwB,GACzB,MAAM,iCAAiC,CAAC;AACzC,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAExD,YAAY;AACZ,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAClD,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AACvF,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAEvD,OAAO,EAAE,YAAY,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AACnF,OAAO,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAC;AACvC,OAAO,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAC;AAQvC,OAAO,EAAE,aAAa,EAAE,oBAAoB,EAAE,MAAM,mCAAmC,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rate-limit.d.ts","sourceRoot":"","sources":["../../src/middleware/rate-limit.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,MAAM,CAAC;AAC9C,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"rate-limit.d.ts","sourceRoot":"","sources":["../../src/middleware/rate-limit.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,MAAM,CAAC;AAC9C,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAwLzD;;GAEG;AACH,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,gBAAgB,GAAG,iBAAiB,CAuDtF"}
|
|
@@ -1,11 +1,17 @@
|
|
|
1
1
|
import { getClientIp } from '../utils/get-client-ip.js';
|
|
2
2
|
import { createLogger } from '../utils/logger.js';
|
|
3
3
|
const logger = createLogger('Glasswork:RateLimit', true);
|
|
4
|
+
/** Default cleanup interval for memory store (1 minute) */
|
|
5
|
+
const DEFAULT_CLEANUP_INTERVAL_MS = 60_000;
|
|
4
6
|
/**
|
|
5
|
-
* In-memory rate limiter storage
|
|
7
|
+
* In-memory rate limiter storage.
|
|
8
|
+
*
|
|
9
|
+
* Includes automatic cleanup of expired entries to prevent memory leaks.
|
|
10
|
+
* Call `stopCleanup()` when shutting down to clear the interval timer.
|
|
6
11
|
*/
|
|
7
12
|
class MemoryStore {
|
|
8
13
|
store = new Map();
|
|
14
|
+
cleanupTimer = null;
|
|
9
15
|
async get(key) {
|
|
10
16
|
const item = this.store.get(key);
|
|
11
17
|
if (!item) {
|
|
@@ -26,9 +32,14 @@ class MemoryStore {
|
|
|
26
32
|
item.count += 1;
|
|
27
33
|
}
|
|
28
34
|
}
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
35
|
+
/**
|
|
36
|
+
* Start periodic cleanup of expired entries.
|
|
37
|
+
* @param intervalMs - Cleanup interval in milliseconds (default: 60000)
|
|
38
|
+
*/
|
|
39
|
+
startCleanup(intervalMs = DEFAULT_CLEANUP_INTERVAL_MS) {
|
|
40
|
+
// Clear any existing timer to prevent duplicates
|
|
41
|
+
this.stopCleanup();
|
|
42
|
+
this.cleanupTimer = setInterval(() => {
|
|
32
43
|
const now = Date.now();
|
|
33
44
|
for (const [key, item] of this.store.entries()) {
|
|
34
45
|
if (item.windowEnd < now) {
|
|
@@ -37,27 +48,48 @@ class MemoryStore {
|
|
|
37
48
|
}
|
|
38
49
|
}, intervalMs);
|
|
39
50
|
}
|
|
51
|
+
/**
|
|
52
|
+
* Stop the cleanup timer.
|
|
53
|
+
* Should be called when shutting down to prevent memory leaks in serverless environments.
|
|
54
|
+
*/
|
|
55
|
+
stopCleanup() {
|
|
56
|
+
if (this.cleanupTimer) {
|
|
57
|
+
clearInterval(this.cleanupTimer);
|
|
58
|
+
this.cleanupTimer = null;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
40
61
|
}
|
|
41
62
|
/**
|
|
42
|
-
* DynamoDB rate limiter storage
|
|
63
|
+
* DynamoDB rate limiter storage.
|
|
64
|
+
*
|
|
65
|
+
* NOTE: This store "fails open" on errors - if DynamoDB is unavailable,
|
|
66
|
+
* requests will be allowed through without rate limiting. This is intentional
|
|
67
|
+
* to prevent DynamoDB issues from blocking all traffic, but means rate limiting
|
|
68
|
+
* is not guaranteed during outages. Monitor DynamoDB errors in your logs.
|
|
43
69
|
*/
|
|
44
70
|
class DynamoDBStore {
|
|
45
|
-
|
|
71
|
+
clientPromise;
|
|
46
72
|
tableName;
|
|
47
73
|
constructor(tableName, region) {
|
|
48
74
|
this.tableName = tableName;
|
|
49
|
-
//
|
|
50
|
-
this.initClient(region);
|
|
75
|
+
// Initialize client lazily - Promise is stored and awaited on first use
|
|
76
|
+
this.clientPromise = this.initClient(region);
|
|
51
77
|
}
|
|
52
78
|
async initClient(region) {
|
|
53
79
|
const { DynamoDBClient } = await import('@aws-sdk/client-dynamodb');
|
|
54
80
|
const { DynamoDBDocumentClient } = await import('@aws-sdk/lib-dynamodb');
|
|
55
81
|
const dynamoClient = new DynamoDBClient(region ? { region } : {});
|
|
56
|
-
|
|
82
|
+
return DynamoDBDocumentClient.from(dynamoClient);
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Get the initialized DynamoDB client, waiting for initialization if needed.
|
|
86
|
+
*/
|
|
87
|
+
async getClient() {
|
|
88
|
+
return this.clientPromise;
|
|
57
89
|
}
|
|
58
90
|
async get(key) {
|
|
59
91
|
const { GetCommand } = await import('@aws-sdk/lib-dynamodb');
|
|
60
|
-
const client = this.
|
|
92
|
+
const client = await this.getClient();
|
|
61
93
|
try {
|
|
62
94
|
// @ts-expect-error - client type is complex
|
|
63
95
|
const { Item } = await client.send(new GetCommand({
|
|
@@ -72,13 +104,15 @@ class DynamoDBStore {
|
|
|
72
104
|
windowEnd: Item.windowEnd,
|
|
73
105
|
};
|
|
74
106
|
}
|
|
75
|
-
catch {
|
|
107
|
+
catch (error) {
|
|
108
|
+
// Log error but fail open to prevent DynamoDB issues from blocking traffic
|
|
109
|
+
logger.error('DynamoDB rate limit get failed:', error);
|
|
76
110
|
return null;
|
|
77
111
|
}
|
|
78
112
|
}
|
|
79
113
|
async set(key, value) {
|
|
80
114
|
const { PutCommand } = await import('@aws-sdk/lib-dynamodb');
|
|
81
|
-
const client = this.
|
|
115
|
+
const client = await this.getClient();
|
|
82
116
|
const expiresAt = Math.floor(value.windowEnd / 1000);
|
|
83
117
|
try {
|
|
84
118
|
// @ts-expect-error - client type is complex
|
|
@@ -98,7 +132,7 @@ class DynamoDBStore {
|
|
|
98
132
|
}
|
|
99
133
|
async increment(key) {
|
|
100
134
|
const { UpdateCommand } = await import('@aws-sdk/lib-dynamodb');
|
|
101
|
-
const client = this.
|
|
135
|
+
const client = await this.getClient();
|
|
102
136
|
try {
|
|
103
137
|
// @ts-expect-error - client type is complex
|
|
104
138
|
await client.send(new UpdateCommand({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rate-limit.js","sourceRoot":"","sources":["../../src/middleware/rate-limit.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AACxD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAElD,MAAM,MAAM,GAAG,YAAY,CAAC,qBAAqB,EAAE,IAAI,CAAC,CAAC;AAEzD
|
|
1
|
+
{"version":3,"file":"rate-limit.js","sourceRoot":"","sources":["../../src/middleware/rate-limit.ts"],"names":[],"mappings":"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"}
|