@abyss-project/monitor 1.0.71 → 1.0.73
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/.eslintrc.js +33 -33
- package/README.md +33 -2
- package/dist/__tests__/header-pattern.test.d.ts +1 -0
- package/dist/__tests__/header-pattern.test.js +63 -0
- package/dist/__tests__/header-pattern.test.js.map +1 -0
- package/dist/__tests__/identifier-resolver.test.d.ts +1 -0
- package/dist/__tests__/identifier-resolver.test.js +50 -0
- package/dist/__tests__/identifier-resolver.test.js.map +1 -0
- package/dist/__tests__/logger-endpoint-headers.test.d.ts +1 -0
- package/dist/__tests__/logger-endpoint-headers.test.js +23 -0
- package/dist/__tests__/logger-endpoint-headers.test.js.map +1 -0
- package/dist/__tests__/parse-window.test.d.ts +1 -0
- package/dist/__tests__/parse-window.test.js +19 -0
- package/dist/__tests__/parse-window.test.js.map +1 -0
- package/dist/__tests__/rate-limit.decorator.test.d.ts +1 -0
- package/dist/__tests__/rate-limit.decorator.test.js +106 -0
- package/dist/__tests__/rate-limit.decorator.test.js.map +1 -0
- package/dist/__tests__/rate-limit.middleware.test.d.ts +1 -0
- package/dist/__tests__/rate-limit.middleware.test.js +174 -0
- package/dist/__tests__/rate-limit.middleware.test.js.map +1 -0
- package/dist/__tests__/token-bucket.store.test.d.ts +1 -0
- package/dist/__tests__/token-bucket.store.test.js +99 -0
- package/dist/__tests__/token-bucket.store.test.js.map +1 -0
- package/dist/api/application-cron-task.admin.api.js +1 -0
- package/dist/api/application-cron-task.admin.api.js.map +1 -0
- package/dist/api/application-cron-task.api.js +1 -0
- package/dist/api/application-cron-task.api.js.map +1 -0
- package/dist/api/application-event.admin.api.js +1 -0
- package/dist/api/application-event.admin.api.js.map +1 -0
- package/dist/api/application-event.api.js +1 -0
- package/dist/api/application-event.api.js.map +1 -0
- package/dist/api/application-log.admin.api.js +1 -0
- package/dist/api/application-log.admin.api.js.map +1 -0
- package/dist/api/application-log.api.js +1 -0
- package/dist/api/application-log.api.js.map +1 -0
- package/dist/api/application-sentinel.admin.api.js +1 -0
- package/dist/api/application-sentinel.admin.api.js.map +1 -0
- package/dist/api/application-sentinel.api.js +1 -0
- package/dist/api/application-sentinel.api.js.map +1 -0
- package/dist/api/application-stats.admin.api.js +1 -0
- package/dist/api/application-stats.admin.api.js.map +1 -0
- package/dist/api/application-stats.api.js +1 -0
- package/dist/api/application-stats.api.js.map +1 -0
- package/dist/api/application-webhook-history.admin.api.js +1 -0
- package/dist/api/application-webhook-history.admin.api.js.map +1 -0
- package/dist/api/application-webhook-history.api.js +1 -0
- package/dist/api/application-webhook-history.api.js.map +1 -0
- package/dist/api/application-webhook.admin.api.js +1 -0
- package/dist/api/application-webhook.admin.api.js.map +1 -0
- package/dist/api/application-webhook.api.js +1 -0
- package/dist/api/application-webhook.api.js.map +1 -0
- package/dist/api/application.admin.api.js +1 -0
- package/dist/api/application.admin.api.js.map +1 -0
- package/dist/api/application.api.js +1 -0
- package/dist/api/application.api.js.map +1 -0
- package/dist/api/hourly-metrics.api.js +1 -0
- package/dist/api/hourly-metrics.api.js.map +1 -0
- package/dist/api/index.js +1 -0
- package/dist/api/index.js.map +1 -0
- package/dist/api/infrastructure.admin.api.js +1 -0
- package/dist/api/infrastructure.admin.api.js.map +1 -0
- package/dist/api/metrics.api.js +1 -0
- package/dist/api/metrics.api.js.map +1 -0
- package/dist/api/monitor.api.js +1 -0
- package/dist/api/monitor.api.js.map +1 -0
- package/dist/api/report.admin.api.js +1 -0
- package/dist/api/report.admin.api.js.map +1 -0
- package/dist/frameworks/express/decorators.js +6 -6
- package/dist/frameworks/express/decorators.js.map +1 -0
- package/dist/frameworks/express/index.js +5 -5
- package/dist/frameworks/express/index.js.map +1 -0
- package/dist/frameworks/express/metadata.js +1 -0
- package/dist/frameworks/express/metadata.js.map +1 -0
- package/dist/frameworks/index.js +1 -0
- package/dist/frameworks/index.js.map +1 -0
- package/dist/index.d.ts +3 -2
- package/dist/index.js +8 -8
- package/dist/index.js.map +1 -0
- package/dist/middlewares/context.middleware.js +5 -4
- package/dist/middlewares/context.middleware.js.map +1 -0
- package/dist/middlewares/index.d.ts +1 -0
- package/dist/middlewares/index.js +2 -0
- package/dist/middlewares/index.js.map +1 -0
- package/dist/middlewares/logger-endpoint.middleware.d.ts +2 -2
- package/dist/middlewares/logger-endpoint.middleware.js +17 -8
- package/dist/middlewares/logger-endpoint.middleware.js.map +1 -0
- package/dist/middlewares/logger-setup.middleware.js +1 -0
- package/dist/middlewares/logger-setup.middleware.js.map +1 -0
- package/dist/middlewares/rate-limit/identifier-resolver.d.ts +18 -0
- package/dist/middlewares/rate-limit/identifier-resolver.js +25 -0
- package/dist/middlewares/rate-limit/identifier-resolver.js.map +1 -0
- package/dist/middlewares/rate-limit/index.d.ts +10 -0
- package/dist/middlewares/rate-limit/index.js +17 -0
- package/dist/middlewares/rate-limit/index.js.map +1 -0
- package/dist/middlewares/rate-limit/parse-window.d.ts +2 -0
- package/dist/middlewares/rate-limit/parse-window.js +14 -0
- package/dist/middlewares/rate-limit/parse-window.js.map +1 -0
- package/dist/middlewares/rate-limit/rate-limit.decorator.d.ts +11 -0
- package/dist/middlewares/rate-limit/rate-limit.decorator.js +59 -0
- package/dist/middlewares/rate-limit/rate-limit.decorator.js.map +1 -0
- package/dist/middlewares/rate-limit/rate-limit.lua.d.ts +1 -0
- package/dist/middlewares/rate-limit/rate-limit.lua.js +77 -0
- package/dist/middlewares/rate-limit/rate-limit.lua.js.map +1 -0
- package/dist/middlewares/rate-limit/rate-limit.middleware.d.ts +4 -0
- package/dist/middlewares/rate-limit/rate-limit.middleware.js +186 -0
- package/dist/middlewares/rate-limit/rate-limit.middleware.js.map +1 -0
- package/dist/middlewares/rate-limit/token-bucket.store.d.ts +39 -0
- package/dist/middlewares/rate-limit/token-bucket.store.js +67 -0
- package/dist/middlewares/rate-limit/token-bucket.store.js.map +1 -0
- package/dist/middlewares/request-tracker.middleware.js +1 -0
- package/dist/middlewares/request-tracker.middleware.js.map +1 -0
- package/dist/models/index.js +1 -0
- package/dist/models/index.js.map +1 -0
- package/dist/models/logger.model.d.ts +2 -0
- package/dist/models/logger.model.js +10 -10
- package/dist/models/logger.model.js.map +1 -0
- package/dist/models/stats-publisher.model.js +17 -20
- package/dist/models/stats-publisher.model.js.map +1 -0
- package/dist/types/enum/api-error.enum.js +1 -0
- package/dist/types/enum/api-error.enum.js.map +1 -0
- package/dist/types/enum/api-method.enum.js +1 -0
- package/dist/types/enum/api-method.enum.js.map +1 -0
- package/dist/types/enum/application-alert-type.enum.js +1 -0
- package/dist/types/enum/application-alert-type.enum.js.map +1 -0
- package/dist/types/enum/application-sentinel-type.enum.js +1 -0
- package/dist/types/enum/application-sentinel-type.enum.js.map +1 -0
- package/dist/types/enum/application-stats-type.enum.js +1 -0
- package/dist/types/enum/application-stats-type.enum.js.map +1 -0
- package/dist/types/enum/application-webhook-scope.enum.js +1 -0
- package/dist/types/enum/application-webhook-scope.enum.js.map +1 -0
- package/dist/types/enum/index.js +1 -0
- package/dist/types/enum/index.js.map +1 -0
- package/dist/types/enum/log-level.enum.js +1 -0
- package/dist/types/enum/log-level.enum.js.map +1 -0
- package/dist/types/enum/log-scenario.enum.js +1 -0
- package/dist/types/enum/log-scenario.enum.js.map +1 -0
- package/dist/types/graceful-shutdown.types.js +1 -0
- package/dist/types/graceful-shutdown.types.js.map +1 -0
- package/dist/types/index.js +1 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/interface/api/index.js +1 -0
- package/dist/types/interface/api/index.js.map +1 -0
- package/dist/types/interface/api/requests/application-cron-task.admin.request.js +1 -0
- package/dist/types/interface/api/requests/application-cron-task.admin.request.js.map +1 -0
- package/dist/types/interface/api/requests/application-cron-task.request.js +1 -0
- package/dist/types/interface/api/requests/application-cron-task.request.js.map +1 -0
- package/dist/types/interface/api/requests/application-event.admin.request.js +1 -0
- package/dist/types/interface/api/requests/application-event.admin.request.js.map +1 -0
- package/dist/types/interface/api/requests/application-event.request.js +1 -0
- package/dist/types/interface/api/requests/application-event.request.js.map +1 -0
- package/dist/types/interface/api/requests/application-log.admin.request.js +1 -0
- package/dist/types/interface/api/requests/application-log.admin.request.js.map +1 -0
- package/dist/types/interface/api/requests/application-log.request.d.ts +2 -0
- package/dist/types/interface/api/requests/application-log.request.js +1 -0
- package/dist/types/interface/api/requests/application-log.request.js.map +1 -0
- package/dist/types/interface/api/requests/application-sentinel.admin.request.js +1 -0
- package/dist/types/interface/api/requests/application-sentinel.admin.request.js.map +1 -0
- package/dist/types/interface/api/requests/application-sentinel.request.js +1 -0
- package/dist/types/interface/api/requests/application-sentinel.request.js.map +1 -0
- package/dist/types/interface/api/requests/application-stats.admin.request.js +1 -0
- package/dist/types/interface/api/requests/application-stats.admin.request.js.map +1 -0
- package/dist/types/interface/api/requests/application-stats.request.js +1 -0
- package/dist/types/interface/api/requests/application-stats.request.js.map +1 -0
- package/dist/types/interface/api/requests/application-webhook-history.admin.request.js +1 -0
- package/dist/types/interface/api/requests/application-webhook-history.admin.request.js.map +1 -0
- package/dist/types/interface/api/requests/application-webhook-history.request.js +1 -0
- package/dist/types/interface/api/requests/application-webhook-history.request.js.map +1 -0
- package/dist/types/interface/api/requests/application-webhook.admin.request.js +1 -0
- package/dist/types/interface/api/requests/application-webhook.admin.request.js.map +1 -0
- package/dist/types/interface/api/requests/application-webhook.request.js +1 -0
- package/dist/types/interface/api/requests/application-webhook.request.js.map +1 -0
- package/dist/types/interface/api/requests/application.admin.request.js +1 -0
- package/dist/types/interface/api/requests/application.admin.request.js.map +1 -0
- package/dist/types/interface/api/requests/application.request.js +1 -0
- package/dist/types/interface/api/requests/application.request.js.map +1 -0
- package/dist/types/interface/api/requests/hourly-metrics.request.js +1 -0
- package/dist/types/interface/api/requests/hourly-metrics.request.js.map +1 -0
- package/dist/types/interface/api/requests/infrastructure.admin.request.js +1 -0
- package/dist/types/interface/api/requests/infrastructure.admin.request.js.map +1 -0
- package/dist/types/interface/api/requests/metrics.admin.request.js +1 -0
- package/dist/types/interface/api/requests/metrics.admin.request.js.map +1 -0
- package/dist/types/interface/api/requests/metrics.request.js +1 -0
- package/dist/types/interface/api/requests/metrics.request.js.map +1 -0
- package/dist/types/interface/api/requests/report.admin.request.js +1 -0
- package/dist/types/interface/api/requests/report.admin.request.js.map +1 -0
- package/dist/types/interface/api/responses/application-cron-task.admin.response.js +1 -0
- package/dist/types/interface/api/responses/application-cron-task.admin.response.js.map +1 -0
- package/dist/types/interface/api/responses/application-cron-task.response.js +1 -0
- package/dist/types/interface/api/responses/application-cron-task.response.js.map +1 -0
- package/dist/types/interface/api/responses/application-event.admin.response.js +1 -0
- package/dist/types/interface/api/responses/application-event.admin.response.js.map +1 -0
- package/dist/types/interface/api/responses/application-event.response.js +1 -0
- package/dist/types/interface/api/responses/application-event.response.js.map +1 -0
- package/dist/types/interface/api/responses/application-log.admin.response.js +1 -0
- package/dist/types/interface/api/responses/application-log.admin.response.js.map +1 -0
- package/dist/types/interface/api/responses/application-log.response.js +1 -0
- package/dist/types/interface/api/responses/application-log.response.js.map +1 -0
- package/dist/types/interface/api/responses/application-sentinel.admin.response.js +1 -0
- package/dist/types/interface/api/responses/application-sentinel.admin.response.js.map +1 -0
- package/dist/types/interface/api/responses/application-sentinel.response.js +1 -0
- package/dist/types/interface/api/responses/application-sentinel.response.js.map +1 -0
- package/dist/types/interface/api/responses/application-stats.admin.response.js +1 -0
- package/dist/types/interface/api/responses/application-stats.admin.response.js.map +1 -0
- package/dist/types/interface/api/responses/application-stats.response.js +1 -0
- package/dist/types/interface/api/responses/application-stats.response.js.map +1 -0
- package/dist/types/interface/api/responses/application-webhook-history.admin.response.js +1 -0
- package/dist/types/interface/api/responses/application-webhook-history.admin.response.js.map +1 -0
- package/dist/types/interface/api/responses/application-webhook-history.response.js +1 -0
- package/dist/types/interface/api/responses/application-webhook-history.response.js.map +1 -0
- package/dist/types/interface/api/responses/application-webhook.admin.response.js +1 -0
- package/dist/types/interface/api/responses/application-webhook.admin.response.js.map +1 -0
- package/dist/types/interface/api/responses/application-webhook.response.js +1 -0
- package/dist/types/interface/api/responses/application-webhook.response.js.map +1 -0
- package/dist/types/interface/api/responses/application.admin.response.js +1 -0
- package/dist/types/interface/api/responses/application.admin.response.js.map +1 -0
- package/dist/types/interface/api/responses/application.response.js +1 -0
- package/dist/types/interface/api/responses/application.response.js.map +1 -0
- package/dist/types/interface/api/responses/hourly-metrics.response.js +1 -0
- package/dist/types/interface/api/responses/hourly-metrics.response.js.map +1 -0
- package/dist/types/interface/api/responses/infrastructure.admin.response.js +1 -0
- package/dist/types/interface/api/responses/infrastructure.admin.response.js.map +1 -0
- package/dist/types/interface/api/responses/metrics.admin.response.js +1 -0
- package/dist/types/interface/api/responses/metrics.admin.response.js.map +1 -0
- package/dist/types/interface/api/responses/metrics.response.js +1 -0
- package/dist/types/interface/api/responses/metrics.response.js.map +1 -0
- package/dist/types/interface/api/responses/monitor.response.js +1 -0
- package/dist/types/interface/api/responses/monitor.response.js.map +1 -0
- package/dist/types/interface/api/responses/report.admin.response.js +1 -0
- package/dist/types/interface/api/responses/report.admin.response.js.map +1 -0
- package/dist/types/interface/api/type-message/api-error.js +1 -0
- package/dist/types/interface/api/type-message/api-error.js.map +1 -0
- package/dist/types/interface/api/type-message/base-order.js +1 -0
- package/dist/types/interface/api/type-message/base-order.js.map +1 -0
- package/dist/types/interface/api/type-message/base-paginate.js +1 -0
- package/dist/types/interface/api/type-message/base-paginate.js.map +1 -0
- package/dist/types/interface/api/type-message/response.js +1 -0
- package/dist/types/interface/api/type-message/response.js.map +1 -0
- package/dist/types/interface/dto/application-sentinel-configuration.dto.js +1 -0
- package/dist/types/interface/dto/application-sentinel-configuration.dto.js.map +1 -0
- package/dist/types/interface/dto/index.js +1 -0
- package/dist/types/interface/dto/index.js.map +1 -0
- package/dist/types/interface/dto/webhook.dto.js +1 -0
- package/dist/types/interface/dto/webhook.dto.js.map +1 -0
- package/dist/types/interface/header-capture.d.ts +4 -0
- package/dist/types/interface/header-capture.js +3 -0
- package/dist/types/interface/header-capture.js.map +1 -0
- package/dist/types/interface/index.d.ts +2 -0
- package/dist/types/interface/index.js +3 -0
- package/dist/types/interface/index.js.map +1 -0
- package/dist/types/interface/models/application-cron-task-history.model.js +1 -0
- package/dist/types/interface/models/application-cron-task-history.model.js.map +1 -0
- package/dist/types/interface/models/application-cron-task.model.js +1 -0
- package/dist/types/interface/models/application-cron-task.model.js.map +1 -0
- package/dist/types/interface/models/application-event.model.js +1 -0
- package/dist/types/interface/models/application-event.model.js.map +1 -0
- package/dist/types/interface/models/application-hourly-metrics.model.js +1 -0
- package/dist/types/interface/models/application-hourly-metrics.model.js.map +1 -0
- package/dist/types/interface/models/application-lifetime-metrics.model.js +1 -0
- package/dist/types/interface/models/application-lifetime-metrics.model.js.map +1 -0
- package/dist/types/interface/models/application-log-endpoint.model.d.ts +2 -0
- package/dist/types/interface/models/application-log-endpoint.model.js +1 -0
- package/dist/types/interface/models/application-log-endpoint.model.js.map +1 -0
- package/dist/types/interface/models/application-log.model.js +1 -0
- package/dist/types/interface/models/application-log.model.js.map +1 -0
- package/dist/types/interface/models/application-sentinel-history.model.js +1 -0
- package/dist/types/interface/models/application-sentinel-history.model.js.map +1 -0
- package/dist/types/interface/models/application-sentinel.model.js +1 -0
- package/dist/types/interface/models/application-sentinel.model.js.map +1 -0
- package/dist/types/interface/models/application-stats.model.js +1 -0
- package/dist/types/interface/models/application-stats.model.js.map +1 -0
- package/dist/types/interface/models/application-webhook-history.model.js +1 -0
- package/dist/types/interface/models/application-webhook-history.model.js.map +1 -0
- package/dist/types/interface/models/application-webhook.model.js +1 -0
- package/dist/types/interface/models/application-webhook.model.js.map +1 -0
- package/dist/types/interface/models/application.model.js +1 -0
- package/dist/types/interface/models/application.model.js.map +1 -0
- package/dist/types/interface/models/partition-optimization-history.model.js +1 -0
- package/dist/types/interface/models/partition-optimization-history.model.js.map +1 -0
- package/dist/types/interface/rate-limit.d.ts +47 -0
- package/dist/types/interface/rate-limit.js +10 -0
- package/dist/types/interface/rate-limit.js.map +1 -0
- package/dist/utils/alert.utils.js +4 -7
- package/dist/utils/alert.utils.js.map +1 -0
- package/dist/utils/discord-webhook-log-formatter.utils.d.ts +1 -1
- package/dist/utils/discord-webhook-log-formatter.utils.js +2 -1
- package/dist/utils/discord-webhook-log-formatter.utils.js.map +1 -0
- package/dist/utils/error.utils.js +1 -0
- package/dist/utils/error.utils.js.map +1 -0
- package/dist/utils/graceful-shutdown.utils.js +2 -1
- package/dist/utils/graceful-shutdown.utils.js.map +1 -0
- package/dist/utils/header-pattern.d.ts +5 -0
- package/dist/utils/header-pattern.js +56 -0
- package/dist/utils/header-pattern.js.map +1 -0
- package/dist/utils/import.utils.js +1 -0
- package/dist/utils/import.utils.js.map +1 -0
- package/dist/utils/index.d.ts +2 -0
- package/dist/utils/index.js +3 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/json.utils.js +1 -0
- package/dist/utils/json.utils.js.map +1 -0
- package/dist/utils/killable-route.utils.js +1 -0
- package/dist/utils/killable-route.utils.js.map +1 -0
- package/dist/utils/node-require.d.ts +1 -0
- package/dist/utils/node-require.js +9 -0
- package/dist/utils/node-require.js.map +1 -0
- package/dist/utils/non-blocking-promise.utils.js +2 -1
- package/dist/utils/non-blocking-promise.utils.js.map +1 -0
- package/dist/utils/request-tracker.utils.js +5 -4
- package/dist/utils/request-tracker.utils.js.map +1 -0
- package/dist/utils/string.utils.js +1 -0
- package/dist/utils/string.utils.js.map +1 -0
- package/jest.config.ts +14 -0
- package/package.json +78 -64
- package/tsconfig.json +35 -105
- package/dist/types/enum/time-period.enum.d.ts +0 -0
- package/dist/types/enum/time-period.enum.js +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -7,7 +7,7 @@ if (typeof window === 'undefined') {
|
|
|
7
7
|
asyncHooks = require('async_hooks');
|
|
8
8
|
}
|
|
9
9
|
const store = new Map();
|
|
10
|
-
const asyncHook = asyncHooks
|
|
10
|
+
const asyncHook = asyncHooks?.createHook({
|
|
11
11
|
init: (asyncId, _, triggerAsyncId) => {
|
|
12
12
|
const existingEntry = store.get(triggerAsyncId);
|
|
13
13
|
if (existingEntry) {
|
|
@@ -20,7 +20,7 @@ const asyncHook = asyncHooks === null || asyncHooks === void 0 ? void 0 : asyncH
|
|
|
20
20
|
}
|
|
21
21
|
},
|
|
22
22
|
});
|
|
23
|
-
asyncHook
|
|
23
|
+
asyncHook?.enable();
|
|
24
24
|
const contextMiddleware = (req, res, next) => {
|
|
25
25
|
const data = { headers: req.headers };
|
|
26
26
|
(0, exports.createRequestContext)(data);
|
|
@@ -29,11 +29,12 @@ const contextMiddleware = (req, res, next) => {
|
|
|
29
29
|
exports.contextMiddleware = contextMiddleware;
|
|
30
30
|
const createRequestContext = (data, requestId = (0, uuid_1.v4)()) => {
|
|
31
31
|
const requestInfo = { requestId, data };
|
|
32
|
-
store.set(asyncHooks
|
|
32
|
+
store.set(asyncHooks?.executionAsyncId(), requestInfo);
|
|
33
33
|
return requestInfo;
|
|
34
34
|
};
|
|
35
35
|
exports.createRequestContext = createRequestContext;
|
|
36
36
|
const getRequestContext = () => {
|
|
37
|
-
return store.get(asyncHooks
|
|
37
|
+
return store.get(asyncHooks?.executionAsyncId());
|
|
38
38
|
};
|
|
39
39
|
exports.getRequestContext = getRequestContext;
|
|
40
|
+
//# sourceMappingURL=context.middleware.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context.middleware.js","sourceRoot":"","sources":["../../src/middlewares/context.middleware.ts"],"names":[],"mappings":";;;AACA,+BAAoC;AAGpC,IAAI,UAAe,CAAC;AACpB,IAAI,OAAO,MAAM,KAAK,WAAW,EAAE,CAAC;IAClC,UAAU,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC;AACtC,CAAC;AAOD,MAAM,KAAK,GAAG,IAAI,GAAG,EAAsB,CAAC;AAE5C,MAAM,SAAS,GAAG,UAAU,EAAE,UAAU,CAAC;IACvC,IAAI,EAAE,CAAC,OAAe,EAAE,CAAM,EAAE,cAAsB,EAAE,EAAE;QACxD,MAAM,aAAa,GAAG,KAAK,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;QAChD,IAAI,aAAa,EAAE,CAAC;YAClB,KAAK,CAAC,GAAG,CAAC,OAAO,EAAE,aAAa,CAAC,CAAC;QACpC,CAAC;IACH,CAAC;IACD,OAAO,EAAE,CAAC,OAAe,EAAE,EAAE;QAC3B,IAAI,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;YACvB,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QACxB,CAAC;IACH,CAAC;CACF,CAAC,CAAC;AAEH,SAAS,EAAE,MAAM,EAAE,CAAC;AAEb,MAAM,iBAAiB,GAAG,CAAC,GAAY,EAAE,GAAuB,EAAE,IAAkB,EAAE,EAAE;IAC7F,MAAM,IAAI,GAAG,EAAE,OAAO,EAAE,GAAG,CAAC,OAAO,EAAE,CAAC;IACtC,IAAA,4BAAoB,EAAC,IAAI,CAAC,CAAC;IAC3B,IAAI,EAAE,CAAC;AACT,CAAC,CAAC;AAJW,QAAA,iBAAiB,qBAI5B;AAEK,MAAM,oBAAoB,GAAG,CAAC,IAA6B,EAAE,SAAS,GAAG,IAAA,SAAM,GAAE,EAAE,EAAE;IAC1F,MAAM,WAAW,GAAG,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;IACxC,KAAK,CAAC,GAAG,CAAC,UAAU,EAAE,gBAAgB,EAAE,EAAE,WAAW,CAAC,CAAC;IACvD,OAAO,WAAW,CAAC;AACrB,CAAC,CAAC;AAJW,QAAA,oBAAoB,wBAI/B;AAEK,MAAM,iBAAiB,GAAG,GAAe,EAAE;IAChD,OAAO,KAAK,CAAC,GAAG,CAAC,UAAU,EAAE,gBAAgB,EAAE,CAAe,CAAC;AACjE,CAAC,CAAC;AAFW,QAAA,iBAAiB,qBAE5B"}
|
|
@@ -18,3 +18,5 @@ __exportStar(require("./context.middleware"), exports);
|
|
|
18
18
|
__exportStar(require("./logger-endpoint.middleware"), exports);
|
|
19
19
|
__exportStar(require("./logger-setup.middleware"), exports);
|
|
20
20
|
__exportStar(require("./request-tracker.middleware"), exports);
|
|
21
|
+
__exportStar(require("./rate-limit"), exports);
|
|
22
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/middlewares/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,uDAAqC;AACrC,+DAA6C;AAC7C,4DAA0C;AAC1C,+DAA6C;AAC7C,+CAA6B"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { Request, Response, NextFunction } from 'express-serve-static-core';
|
|
2
2
|
import { Logger } from '../models';
|
|
3
|
-
import { IMonitorLocals } from '../types';
|
|
3
|
+
import { IMonitorLocals, MonitorLoggerHeaderConfig } from '../types';
|
|
4
4
|
export declare const CONTROLLER_FILE_ENDS_WITH: string;
|
|
5
|
-
export declare const loggerEndpointMiddleware: (logger: Logger, req: Request, res: Response<unknown, IMonitorLocals>, next: NextFunction, callback?: ((req: Request, res: Response<unknown, IMonitorLocals>, next: NextFunction) => Promise<void>) | undefined) => Promise<void>;
|
|
5
|
+
export declare const loggerEndpointMiddleware: (logger: Logger, req: Request, res: Response<unknown, IMonitorLocals>, next: NextFunction, callback?: ((req: Request, res: Response<unknown, IMonitorLocals>, next: NextFunction) => Promise<void>) | undefined, options?: MonitorLoggerHeaderConfig) => Promise<void>;
|
|
@@ -1,23 +1,27 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
-
};
|
|
5
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
3
|
exports.loggerEndpointMiddleware = exports.CONTROLLER_FILE_ENDS_WITH = void 0;
|
|
7
4
|
const lodash_1 = require("lodash");
|
|
8
5
|
const context_middleware_1 = require("./context.middleware");
|
|
9
6
|
const types_1 = require("../types");
|
|
10
|
-
const net_1 = __importDefault(require("net"));
|
|
11
7
|
const import_utils_1 = require("../utils/import.utils");
|
|
8
|
+
const header_pattern_1 = require("../utils/header-pattern");
|
|
9
|
+
const node_require_1 = require("../utils/node-require");
|
|
10
|
+
let netModule;
|
|
11
|
+
const getNet = () => {
|
|
12
|
+
if (!netModule) {
|
|
13
|
+
netModule = (0, node_require_1.nodeRequire)('net');
|
|
14
|
+
}
|
|
15
|
+
return netModule;
|
|
16
|
+
};
|
|
12
17
|
exports.CONTROLLER_FILE_ENDS_WITH = `.controller${(0, import_utils_1.extensionFileToImport)()}`;
|
|
13
|
-
const loggerEndpointMiddleware = async (logger, req, res, next, callback) => {
|
|
18
|
+
const loggerEndpointMiddleware = async (logger, req, res, next, callback, options) => {
|
|
14
19
|
res.locals.timer = {
|
|
15
20
|
start: new Date(),
|
|
16
21
|
startTime: process.hrtime(),
|
|
17
22
|
};
|
|
18
23
|
const requestId = (0, context_middleware_1.getRequestContext)().requestId;
|
|
19
24
|
res.on('close', async () => {
|
|
20
|
-
var _a;
|
|
21
25
|
try {
|
|
22
26
|
res.locals.timer.durationToClose = getDurationInMilliseconds(res.locals.timer.startTime);
|
|
23
27
|
if (!res.locals.shouldNotPublishLog) {
|
|
@@ -37,14 +41,16 @@ const loggerEndpointMiddleware = async (logger, req, res, next, callback) => {
|
|
|
37
41
|
if (req.ip) {
|
|
38
42
|
ips.push(req.ip);
|
|
39
43
|
}
|
|
44
|
+
const requestHeaders = (0, header_pattern_1.filterCapturedHeaders)(req.headers, options?.captureRequestHeaders);
|
|
45
|
+
const responseHeaders = (0, header_pattern_1.filterCapturedHeaders)(res.getHeaders(), options?.captureResponseHeaders);
|
|
40
46
|
await logger.log('', {
|
|
41
47
|
requestId,
|
|
42
48
|
context: 'API',
|
|
43
49
|
applicationLogEndpoint: {
|
|
44
50
|
responseHttpCode: res.statusCode,
|
|
45
51
|
responseTime: Math.round(res.locals.timer.durationToClose),
|
|
46
|
-
ip: (0, lodash_1.uniq)(ips).filter(
|
|
47
|
-
endpoint: res.locals.path ||
|
|
52
|
+
ip: (0, lodash_1.uniq)(ips).filter(getNet().isIP),
|
|
53
|
+
endpoint: res.locals.path || req.route?.path || req.path,
|
|
48
54
|
controller: res.locals.controller || 'Unknown Controller',
|
|
49
55
|
method: types_1.APIMethod[req.method.toUpperCase()],
|
|
50
56
|
requestParams: req.params,
|
|
@@ -59,6 +65,8 @@ const loggerEndpointMiddleware = async (logger, req, res, next, callback) => {
|
|
|
59
65
|
: res.locals.responseBody
|
|
60
66
|
? JSON.parse(JSON.stringify(res.locals.responseBody))
|
|
61
67
|
: null,
|
|
68
|
+
requestHeaders,
|
|
69
|
+
responseHeaders,
|
|
62
70
|
},
|
|
63
71
|
});
|
|
64
72
|
}
|
|
@@ -84,3 +92,4 @@ const getDurationInMilliseconds = (start) => {
|
|
|
84
92
|
const diff = process.hrtime(start);
|
|
85
93
|
return (diff[0] * NS_PER_SEC + diff[1]) / NS_TO_MS;
|
|
86
94
|
};
|
|
95
|
+
//# sourceMappingURL=logger-endpoint.middleware.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger-endpoint.middleware.js","sourceRoot":"","sources":["../../src/middlewares/logger-endpoint.middleware.ts"],"names":[],"mappings":";;;AACA,mCAA8B;AAE9B,6DAAyD;AACzD,oCAAgF;AAChF,wDAA8D;AAC9D,4DAAgE;AAChE,wDAAoD;AAEpD,IAAI,SAA2C,CAAC;AAChD,MAAM,MAAM,GAAG,GAAyB,EAAE;IACxC,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,SAAS,GAAG,IAAA,0BAAW,EAAuB,KAAK,CAAC,CAAC;IACvD,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC,CAAC;AAEW,QAAA,yBAAyB,GAAG,cAAc,IAAA,oCAAqB,GAAE,EAAE,CAAC;AAE1E,MAAM,wBAAwB,GAAG,KAAK,EAC3C,MAAc,EACd,GAAY,EACZ,GAAsC,EACtC,IAAkB,EAClB,QAIkB,EAClB,OAAmC,EACpB,EAAE;IACjB,GAAG,CAAC,MAAM,CAAC,KAAK,GAAG;QACjB,KAAK,EAAE,IAAI,IAAI,EAAE;QACjB,SAAS,EAAE,OAAO,CAAC,MAAM,EAAE;KAC5B,CAAC;IAEF,MAAM,SAAS,GAAG,IAAA,sCAAiB,GAAE,CAAC,SAAS,CAAC;IAEhD,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,KAAK,IAAI,EAAE;QACzB,IAAI,CAAC;YACH,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,eAAe,GAAG,yBAAyB,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;YAEzF,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,mBAAmB,EAAE,CAAC;gBAEpC,MAAM,GAAG,GAAa,EAAE,CAAC;gBAGzB,MAAM,YAAY,GAAG,GAAG,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC;gBACpD,IAAI,YAAY,EAAE,CAAC;oBACjB,IAAI,KAAK,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE,CAAC;wBAChC,GAAG,CAAC,IAAI,CAAC,GAAG,YAAY,CAAC,CAAC;oBAC5B,CAAC;yBAAM,CAAC;wBACN,GAAG,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;oBACzB,CAAC;gBACH,CAAC;gBAGD,IAAI,GAAG,CAAC,MAAM,CAAC,aAAa,EAAE,CAAC;oBAC7B,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;gBACrC,CAAC;gBACD,IAAI,GAAG,CAAC,EAAE,EAAE,CAAC;oBACX,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;gBACnB,CAAC;gBAED,MAAM,cAAc,GAAG,IAAA,sCAAqB,EAC1C,GAAG,CAAC,OAAwD,EAC5D,OAAO,EAAE,qBAAqB,CAC/B,CAAC;gBACF,MAAM,eAAe,GAAG,IAAA,sCAAqB,EAC3C,GAAG,CAAC,UAAU,EAAmD,EACjE,OAAO,EAAE,sBAAsB,CAChC,CAAC;gBAEF,MAAM,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE;oBACnB,SAAS;oBACT,OAAO,EAAE,KAAK;oBACd,sBAAsB,EAAE;wBACtB,gBAAgB,EAAE,GAAG,CAAC,UAAU;wBAChC,YAAY,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,eAAe,CAAC;wBAC1D,EAAE,EAAE,IAAA,aAAI,EAAC,GAAG,CAAC,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC;wBACnC,QAAQ,EAAE,GAAG,CAAC,MAAM,CAAC,IAAI,IAAI,GAAG,CAAC,KAAK,EAAE,IAAI,IAAI,GAAG,CAAC,IAAI;wBACxD,UAAU,EAAE,GAAG,CAAC,MAAM,CAAC,UAAU,IAAI,oBAAoB;wBACzD,MAAM,EAAE,iBAAS,CAAC,GAAG,CAAC,MAAM,CAAC,WAAW,EAA4B,CAAC;wBACrE,aAAa,EAAE,GAAG,CAAC,MAAM;wBACzB,YAAY,EAAE,GAAG,CAAC,KAA+B;wBACjD,WAAW,EAAE,GAAG,CAAC,MAAM,CAAC,wBAAwB;4BAC9C,CAAC,CAAC,IAAI;4BACN,CAAC,CAAC,GAAG,CAAC,IAAI;gCACV,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;gCACtC,CAAC,CAAC,IAAI;wBACR,YAAY,EAAE,GAAG,CAAC,MAAM,CAAC,yBAAyB;4BAChD,CAAC,CAAC,IAAI;4BACN,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,YAAY;gCACzB,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;gCACrD,CAAC,CAAC,IAAI;wBACR,cAAc;wBACd,eAAe;qBAChB;iBACF,CAAC,CAAC;YACL,CAAC;YAED,IAAI,CAAC;gBACH,IAAI,QAAQ,EAAE,CAAC;oBACb,MAAM,QAAQ,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC;gBACjC,CAAC;YACH,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,MAAM,KAAK,CAAC;YACd,CAAC;QACH,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QACtB,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,IAAI,EAAE,CAAC;AACT,CAAC,CAAC;AA/FW,QAAA,wBAAwB,4BA+FnC;AAEF,MAAM,yBAAyB,GAAG,CAAC,KAAuB,EAAU,EAAE;IACpE,MAAM,UAAU,GAAG,GAAG,CAAC;IACvB,MAAM,QAAQ,GAAG,GAAG,CAAC;IACrB,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAEnC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,UAAU,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC;AACrD,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger-setup.middleware.js","sourceRoot":"","sources":["../../src/middlewares/logger-setup.middleware.ts"],"names":[],"mappings":";;;AAEO,MAAM,qBAAqB,GAAG,KAAK,EACxC,GAAY,EACZ,GAAkE,EAClE,IAAkB,EACH,EAAE;IACjB,MAAM,YAAY,GAAG,GAAG,CAAC,IAAI,CAAC;IAC9B,MAAM,YAAY,GAAG,GAAG,CAAC,IAAI,CAAC;IAE9B,GAAG,CAAC,IAAI,GAAG,UAAU,GAAG,IAAS;QAC/B,OAAO,YAAY,CAAC,KAAK,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IACvC,CAAC,CAAC;IAEF,GAAG,CAAC,IAAI,GAAG,UACT,GAAG,IAAS;QAEZ,GAAG,CAAC,MAAM,CAAC,YAAY,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QAClC,OAAO,YAAY,CAAC,KAAK,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IACvC,CAAC,CAAC;IACF,IAAI,EAAE,CAAC;AACT,CAAC,CAAC;AAnBW,QAAA,qBAAqB,yBAmBhC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { Request, Response } from 'express-serve-static-core';
|
|
2
|
+
export type ResolvedIdentifier = {
|
|
3
|
+
kind: 'admin';
|
|
4
|
+
} | {
|
|
5
|
+
kind: 'apikey';
|
|
6
|
+
apiKeyId: string;
|
|
7
|
+
} | {
|
|
8
|
+
kind: 'userOrg';
|
|
9
|
+
userId: string;
|
|
10
|
+
orgId: string;
|
|
11
|
+
} | {
|
|
12
|
+
kind: 'user';
|
|
13
|
+
userId: string;
|
|
14
|
+
} | {
|
|
15
|
+
kind: 'ip';
|
|
16
|
+
ip: string;
|
|
17
|
+
};
|
|
18
|
+
export declare function resolveIdentifiers(req: Request, res: Response): ResolvedIdentifier;
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.resolveIdentifiers = void 0;
|
|
4
|
+
const node_require_1 = require("../../utils/node-require");
|
|
5
|
+
function hashApiKey(value) {
|
|
6
|
+
const { createHash } = (0, node_require_1.nodeRequire)('crypto');
|
|
7
|
+
return createHash('sha256').update(value).digest('hex').slice(0, 16);
|
|
8
|
+
}
|
|
9
|
+
function resolveIdentifiers(req, res) {
|
|
10
|
+
const locals = (res.locals ?? {});
|
|
11
|
+
if (locals.isAdmin)
|
|
12
|
+
return { kind: 'admin' };
|
|
13
|
+
const apiKey = req.header?.('x-api-key');
|
|
14
|
+
if (apiKey)
|
|
15
|
+
return { kind: 'apikey', apiKeyId: hashApiKey(apiKey) };
|
|
16
|
+
if (locals.currentUser?.id) {
|
|
17
|
+
if (locals.organization?.id) {
|
|
18
|
+
return { kind: 'userOrg', userId: locals.currentUser.id, orgId: locals.organization.id };
|
|
19
|
+
}
|
|
20
|
+
return { kind: 'user', userId: locals.currentUser.id };
|
|
21
|
+
}
|
|
22
|
+
return { kind: 'ip', ip: req.ip ?? '0.0.0.0' };
|
|
23
|
+
}
|
|
24
|
+
exports.resolveIdentifiers = resolveIdentifiers;
|
|
25
|
+
//# sourceMappingURL=identifier-resolver.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"identifier-resolver.js","sourceRoot":"","sources":["../../../src/middlewares/rate-limit/identifier-resolver.ts"],"names":[],"mappings":";;;AACA,2DAAuD;AAavD,SAAS,UAAU,CAAC,KAAa;IAI/B,MAAM,EAAE,UAAU,EAAE,GAAG,IAAA,0BAAW,EAA0B,QAAQ,CAAC,CAAC;IACtE,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;AACvE,CAAC;AAED,SAAgB,kBAAkB,CAAC,GAAY,EAAE,GAAa;IAC5D,MAAM,MAAM,GAAG,CAAC,GAAG,CAAC,MAAM,IAAI,EAAE,CAI/B,CAAC;IAEF,IAAI,MAAM,CAAC,OAAO;QAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;IAE7C,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC,WAAW,CAAC,CAAC;IACzC,IAAI,MAAM;QAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;IAEpE,IAAI,MAAM,CAAC,WAAW,EAAE,EAAE,EAAE,CAAC;QAC3B,IAAI,MAAM,CAAC,YAAY,EAAE,EAAE,EAAE,CAAC;YAC5B,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,CAAC,WAAW,CAAC,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,YAAY,CAAC,EAAE,EAAE,CAAC;QAC3F,CAAC;QACD,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,WAAW,CAAC,EAAE,EAAE,CAAC;IACzD,CAAC;IAED,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,GAAG,CAAC,EAAE,IAAI,SAAS,EAAE,CAAC;AACjD,CAAC;AApBD,gDAoBC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export { createRateLimitMiddleware } from './rate-limit.middleware';
|
|
2
|
+
export { RateLimit, readRateLimitOptions } from './rate-limit.decorator';
|
|
3
|
+
export { buildRateLimitRouteRegistry } from './rate-limit.decorator';
|
|
4
|
+
export type { RateLimitRouteRegistryEntry } from './rate-limit.decorator';
|
|
5
|
+
export { TokenBucketStore } from './token-bucket.store';
|
|
6
|
+
export type { ConsumeArgs, ConsumeDualArgs, SingleResult, DualResult } from './token-bucket.store';
|
|
7
|
+
export { resolveIdentifiers } from './identifier-resolver';
|
|
8
|
+
export type { ResolvedIdentifier } from './identifier-resolver';
|
|
9
|
+
export { parseWindow } from './parse-window';
|
|
10
|
+
export type { RateLimitWindow } from './parse-window';
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.parseWindow = exports.resolveIdentifiers = exports.TokenBucketStore = exports.buildRateLimitRouteRegistry = exports.readRateLimitOptions = exports.RateLimit = exports.createRateLimitMiddleware = void 0;
|
|
4
|
+
var rate_limit_middleware_1 = require("./rate-limit.middleware");
|
|
5
|
+
Object.defineProperty(exports, "createRateLimitMiddleware", { enumerable: true, get: function () { return rate_limit_middleware_1.createRateLimitMiddleware; } });
|
|
6
|
+
var rate_limit_decorator_1 = require("./rate-limit.decorator");
|
|
7
|
+
Object.defineProperty(exports, "RateLimit", { enumerable: true, get: function () { return rate_limit_decorator_1.RateLimit; } });
|
|
8
|
+
Object.defineProperty(exports, "readRateLimitOptions", { enumerable: true, get: function () { return rate_limit_decorator_1.readRateLimitOptions; } });
|
|
9
|
+
var rate_limit_decorator_2 = require("./rate-limit.decorator");
|
|
10
|
+
Object.defineProperty(exports, "buildRateLimitRouteRegistry", { enumerable: true, get: function () { return rate_limit_decorator_2.buildRateLimitRouteRegistry; } });
|
|
11
|
+
var token_bucket_store_1 = require("./token-bucket.store");
|
|
12
|
+
Object.defineProperty(exports, "TokenBucketStore", { enumerable: true, get: function () { return token_bucket_store_1.TokenBucketStore; } });
|
|
13
|
+
var identifier_resolver_1 = require("./identifier-resolver");
|
|
14
|
+
Object.defineProperty(exports, "resolveIdentifiers", { enumerable: true, get: function () { return identifier_resolver_1.resolveIdentifiers; } });
|
|
15
|
+
var parse_window_1 = require("./parse-window");
|
|
16
|
+
Object.defineProperty(exports, "parseWindow", { enumerable: true, get: function () { return parse_window_1.parseWindow; } });
|
|
17
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/middlewares/rate-limit/index.ts"],"names":[],"mappings":";;;AAAA,iEAAoE;AAA3D,kIAAA,yBAAyB,OAAA;AAClC,+DAAyE;AAAhE,iHAAA,SAAS,OAAA;AAAE,4HAAA,oBAAoB,OAAA;AACxC,+DAAqE;AAA5D,mIAAA,2BAA2B,OAAA;AAEpC,2DAAwD;AAA/C,sHAAA,gBAAgB,OAAA;AAEzB,6DAA2D;AAAlD,yHAAA,kBAAkB,OAAA;AAE3B,+CAA6C;AAApC,2GAAA,WAAW,OAAA"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.parseWindow = void 0;
|
|
4
|
+
const PATTERN = /^([1-9]\d*)(s|m|h)$/;
|
|
5
|
+
const MULTIPLIERS = { s: 1, m: 60, h: 3600 };
|
|
6
|
+
function parseWindow(input) {
|
|
7
|
+
const match = PATTERN.exec(input);
|
|
8
|
+
if (!match)
|
|
9
|
+
throw new Error(`invalid window: ${input}`);
|
|
10
|
+
const [, value, unit] = match;
|
|
11
|
+
return Number(value) * MULTIPLIERS[unit];
|
|
12
|
+
}
|
|
13
|
+
exports.parseWindow = parseWindow;
|
|
14
|
+
//# sourceMappingURL=parse-window.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parse-window.js","sourceRoot":"","sources":["../../../src/middlewares/rate-limit/parse-window.ts"],"names":[],"mappings":";;;AAAA,MAAM,OAAO,GAAG,qBAAqB,CAAC;AACtC,MAAM,WAAW,GAAoC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC;AAI9E,SAAgB,WAAW,CAAC,KAAa;IACvC,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAClC,IAAI,CAAC,KAAK;QAAE,MAAM,IAAI,KAAK,CAAC,mBAAmB,KAAK,EAAE,CAAC,CAAC;IACxD,MAAM,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,GAAG,KAAK,CAAC;IAC9B,OAAO,MAAM,CAAC,KAAK,CAAC,GAAG,WAAW,CAAC,IAAuB,CAAC,CAAC;AAC9D,CAAC;AALD,kCAKC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import 'reflect-metadata';
|
|
2
|
+
import type { RateLimitDecoratorOptions } from '../../types/interface/rate-limit';
|
|
3
|
+
export declare const RATE_LIMIT_WATERMARK: unique symbol;
|
|
4
|
+
export declare function RateLimit(options: RateLimitDecoratorOptions): MethodDecorator;
|
|
5
|
+
export declare function readRateLimitOptions(target: object, propertyKey: string | symbol): RateLimitDecoratorOptions | undefined;
|
|
6
|
+
export interface RateLimitRouteRegistryEntry {
|
|
7
|
+
method: string;
|
|
8
|
+
path: string;
|
|
9
|
+
options: RateLimitDecoratorOptions;
|
|
10
|
+
}
|
|
11
|
+
export declare function buildRateLimitRouteRegistry(controllers: ReadonlyArray<new (...args: any[]) => unknown>, controllerPrefix: string): RateLimitRouteRegistryEntry[];
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.buildRateLimitRouteRegistry = exports.readRateLimitOptions = exports.RateLimit = exports.RATE_LIMIT_WATERMARK = void 0;
|
|
4
|
+
require("reflect-metadata");
|
|
5
|
+
const metadata_1 = require("../../frameworks/express/metadata");
|
|
6
|
+
const types_1 = require("../../types");
|
|
7
|
+
exports.RATE_LIMIT_WATERMARK = Symbol('abyss:rate-limit');
|
|
8
|
+
function RateLimit(options) {
|
|
9
|
+
return function (target, propertyKey) {
|
|
10
|
+
Reflect.defineMetadata(exports.RATE_LIMIT_WATERMARK, options, target, propertyKey);
|
|
11
|
+
};
|
|
12
|
+
}
|
|
13
|
+
exports.RateLimit = RateLimit;
|
|
14
|
+
function readRateLimitOptions(target, propertyKey) {
|
|
15
|
+
return Reflect.getMetadata(exports.RATE_LIMIT_WATERMARK, target, propertyKey);
|
|
16
|
+
}
|
|
17
|
+
exports.readRateLimitOptions = readRateLimitOptions;
|
|
18
|
+
const HTTP_VERB_BY_API_METHOD = {
|
|
19
|
+
[types_1.APIMethod.GET]: 'GET',
|
|
20
|
+
[types_1.APIMethod.POST]: 'POST',
|
|
21
|
+
[types_1.APIMethod.PUT]: 'PUT',
|
|
22
|
+
[types_1.APIMethod.DELETE]: 'DELETE',
|
|
23
|
+
[types_1.APIMethod.PATCH]: 'PATCH',
|
|
24
|
+
};
|
|
25
|
+
function buildRateLimitRouteRegistry(controllers, controllerPrefix) {
|
|
26
|
+
const out = [];
|
|
27
|
+
for (const ControllerClass of controllers) {
|
|
28
|
+
const isController = Reflect.getMetadata(metadata_1.CONTROLLER_WATERMARK, ControllerClass) === true;
|
|
29
|
+
if (!isController)
|
|
30
|
+
continue;
|
|
31
|
+
const controllerBasePath = Reflect.getMetadata(metadata_1.PATH_WATERMARK, ControllerClass) ?? '';
|
|
32
|
+
const proto = ControllerClass.prototype;
|
|
33
|
+
for (const key of Object.getOwnPropertyNames(proto)) {
|
|
34
|
+
if (key === 'constructor')
|
|
35
|
+
continue;
|
|
36
|
+
const isRoute = Reflect.getMetadata(metadata_1.ROUTE_WATERMARK, proto, key) === true;
|
|
37
|
+
if (!isRoute)
|
|
38
|
+
continue;
|
|
39
|
+
const opts = readRateLimitOptions(proto, key);
|
|
40
|
+
if (!opts)
|
|
41
|
+
continue;
|
|
42
|
+
const apiMethod = Reflect.getMetadata(metadata_1.METHOD_WATERMARK, proto, key);
|
|
43
|
+
if (apiMethod === undefined)
|
|
44
|
+
continue;
|
|
45
|
+
const subPath = Reflect.getMetadata(metadata_1.PATH_WATERMARK, proto, key) ?? '';
|
|
46
|
+
const segments = [controllerPrefix, controllerBasePath, subPath]
|
|
47
|
+
.map((part) => part.replace(/^\/+|\/+$/g, ''))
|
|
48
|
+
.filter((part) => part.length > 0);
|
|
49
|
+
out.push({
|
|
50
|
+
method: HTTP_VERB_BY_API_METHOD[apiMethod],
|
|
51
|
+
path: '/' + segments.join('/'),
|
|
52
|
+
options: opts,
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
return out;
|
|
57
|
+
}
|
|
58
|
+
exports.buildRateLimitRouteRegistry = buildRateLimitRouteRegistry;
|
|
59
|
+
//# sourceMappingURL=rate-limit.decorator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rate-limit.decorator.js","sourceRoot":"","sources":["../../../src/middlewares/rate-limit/rate-limit.decorator.ts"],"names":[],"mappings":";;;AAAA,4BAA0B;AAE1B,gEAK2C;AAC3C,uCAAwC;AAE3B,QAAA,oBAAoB,GAAG,MAAM,CAAC,kBAAkB,CAAC,CAAC;AAE/D,SAAgB,SAAS,CAAC,OAAkC;IAC1D,OAAO,UAAU,MAAM,EAAE,WAAW;QAClC,OAAO,CAAC,cAAc,CAAC,4BAAoB,EAAE,OAAO,EAAE,MAAM,EAAE,WAAW,CAAC,CAAC;IAC7E,CAAC,CAAC;AACJ,CAAC;AAJD,8BAIC;AAED,SAAgB,oBAAoB,CAClC,MAAc,EACd,WAA4B;IAE5B,OAAO,OAAO,CAAC,WAAW,CAAC,4BAAoB,EAAE,MAAM,EAAE,WAAW,CAAC,CAAC;AACxE,CAAC;AALD,oDAKC;AAED,MAAM,uBAAuB,GAA8B;IACzD,CAAC,iBAAS,CAAC,GAAG,CAAC,EAAE,KAAK;IACtB,CAAC,iBAAS,CAAC,IAAI,CAAC,EAAE,MAAM;IACxB,CAAC,iBAAS,CAAC,GAAG,CAAC,EAAE,KAAK;IACtB,CAAC,iBAAS,CAAC,MAAM,CAAC,EAAE,QAAQ;IAC5B,CAAC,iBAAS,CAAC,KAAK,CAAC,EAAE,OAAO;CAC3B,CAAC;AAQF,SAAgB,2BAA2B,CAEzC,WAA2D,EAC3D,gBAAwB;IAExB,MAAM,GAAG,GAAkC,EAAE,CAAC;IAE9C,KAAK,MAAM,eAAe,IAAI,WAAW,EAAE,CAAC;QAC1C,MAAM,YAAY,GAAG,OAAO,CAAC,WAAW,CAAC,+BAAoB,EAAE,eAAe,CAAC,KAAK,IAAI,CAAC;QACzF,IAAI,CAAC,YAAY;YAAE,SAAS;QAE5B,MAAM,kBAAkB,GACrB,OAAO,CAAC,WAAW,CAAC,yBAAc,EAAE,eAAe,CAAwB,IAAI,EAAE,CAAC;QACrF,MAAM,KAAK,GAAI,eAAyC,CAAC,SAAS,CAAC;QAEnE,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,mBAAmB,CAAC,KAAK,CAAC,EAAE,CAAC;YACpD,IAAI,GAAG,KAAK,aAAa;gBAAE,SAAS;YACpC,MAAM,OAAO,GAAG,OAAO,CAAC,WAAW,CAAC,0BAAe,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,IAAI,CAAC;YAC1E,IAAI,CAAC,OAAO;gBAAE,SAAS;YAEvB,MAAM,IAAI,GAAG,oBAAoB,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;YAC9C,IAAI,CAAC,IAAI;gBAAE,SAAS;YAEpB,MAAM,SAAS,GAAG,OAAO,CAAC,WAAW,CAAC,2BAAgB,EAAE,KAAK,EAAE,GAAG,CAA0B,CAAC;YAC7F,IAAI,SAAS,KAAK,SAAS;gBAAE,SAAS;YAEtC,MAAM,OAAO,GAAI,OAAO,CAAC,WAAW,CAAC,yBAAc,EAAE,KAAK,EAAE,GAAG,CAAwB,IAAI,EAAE,CAAC;YAC9F,MAAM,QAAQ,GAAG,CAAC,gBAAgB,EAAE,kBAAkB,EAAE,OAAO,CAAC;iBAC7D,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC;iBAC7C,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;YAErC,GAAG,CAAC,IAAI,CAAC;gBACP,MAAM,EAAE,uBAAuB,CAAC,SAAS,CAAC;gBAC1C,IAAI,EAAE,GAAG,GAAG,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC;gBAC9B,OAAO,EAAE,IAAI;aACd,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,OAAO,GAAG,CAAC;AACb,CAAC;AAxCD,kEAwCC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const RATE_LIMIT_LUA = "\nlocal function load_bucket(key, capacity, refill, now)\n local data = redis.call('HMGET', key, 'tokens', 'ts')\n local tokens = tonumber(data[1])\n local ts = tonumber(data[2])\n if tokens == nil then tokens = capacity end\n if ts == nil then ts = now end\n local elapsed = (now - ts) / 1000.0\n if elapsed < 0 then elapsed = 0 end\n tokens = math.min(capacity, tokens + elapsed * refill)\n return tokens\nend\n\nlocal function save_bucket(key, tokens, capacity, refill, now)\n redis.call('HSET', key, 'tokens', tokens, 'ts', now)\n local ttl = math.ceil(capacity / refill) * 2\n redis.call('EXPIRE', key, ttl)\nend\n\nlocal function reset_sec(tokens, capacity, refill, cost)\n if tokens >= cost then return 0 end\n return math.ceil((cost - tokens) / refill)\nend\n\nlocal primary_cap = tonumber(ARGV[1])\nlocal primary_rate = tonumber(ARGV[2])\nlocal secondary_cap = tonumber(ARGV[3])\nlocal secondary_rate = tonumber(ARGV[4])\nlocal now = tonumber(ARGV[5])\nlocal cost = tonumber(ARGV[6])\n\nlocal primary_tokens = load_bucket(KEYS[1], primary_cap, primary_rate, now)\nlocal secondary_tokens = 0\nlocal has_secondary = KEYS[2] ~= nil and KEYS[2] ~= ''\nif has_secondary then\n secondary_tokens = load_bucket(KEYS[2], secondary_cap, secondary_rate, now)\nend\n\nlocal allowed = 1\nif primary_tokens < cost then allowed = 0 end\nif has_secondary and secondary_tokens < cost then allowed = 0 end\n\nif allowed == 1 then\n primary_tokens = primary_tokens - cost\n save_bucket(KEYS[1], primary_tokens, primary_cap, primary_rate, now)\n if has_secondary then\n secondary_tokens = secondary_tokens - cost\n save_bucket(KEYS[2], secondary_tokens, secondary_cap, secondary_rate, now)\n end\nelse\n -- Refresh ts so refill math stays correct on next call without consuming tokens.\n save_bucket(KEYS[1], primary_tokens, primary_cap, primary_rate, now)\n if has_secondary then\n save_bucket(KEYS[2], secondary_tokens, secondary_cap, secondary_rate, now)\n end\nend\n\nlocal primary_reset = reset_sec(primary_tokens, primary_cap, primary_rate, cost)\nlocal secondary_reset = 0\nif has_secondary then\n secondary_reset = reset_sec(secondary_tokens, secondary_cap, secondary_rate, cost)\nend\n\nreturn {\n allowed,\n math.floor(primary_tokens),\n primary_cap,\n primary_reset,\n math.floor(secondary_tokens),\n secondary_cap,\n secondary_reset,\n}\n";
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.RATE_LIMIT_LUA = void 0;
|
|
4
|
+
exports.RATE_LIMIT_LUA = `
|
|
5
|
+
local function load_bucket(key, capacity, refill, now)
|
|
6
|
+
local data = redis.call('HMGET', key, 'tokens', 'ts')
|
|
7
|
+
local tokens = tonumber(data[1])
|
|
8
|
+
local ts = tonumber(data[2])
|
|
9
|
+
if tokens == nil then tokens = capacity end
|
|
10
|
+
if ts == nil then ts = now end
|
|
11
|
+
local elapsed = (now - ts) / 1000.0
|
|
12
|
+
if elapsed < 0 then elapsed = 0 end
|
|
13
|
+
tokens = math.min(capacity, tokens + elapsed * refill)
|
|
14
|
+
return tokens
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
local function save_bucket(key, tokens, capacity, refill, now)
|
|
18
|
+
redis.call('HSET', key, 'tokens', tokens, 'ts', now)
|
|
19
|
+
local ttl = math.ceil(capacity / refill) * 2
|
|
20
|
+
redis.call('EXPIRE', key, ttl)
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
local function reset_sec(tokens, capacity, refill, cost)
|
|
24
|
+
if tokens >= cost then return 0 end
|
|
25
|
+
return math.ceil((cost - tokens) / refill)
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
local primary_cap = tonumber(ARGV[1])
|
|
29
|
+
local primary_rate = tonumber(ARGV[2])
|
|
30
|
+
local secondary_cap = tonumber(ARGV[3])
|
|
31
|
+
local secondary_rate = tonumber(ARGV[4])
|
|
32
|
+
local now = tonumber(ARGV[5])
|
|
33
|
+
local cost = tonumber(ARGV[6])
|
|
34
|
+
|
|
35
|
+
local primary_tokens = load_bucket(KEYS[1], primary_cap, primary_rate, now)
|
|
36
|
+
local secondary_tokens = 0
|
|
37
|
+
local has_secondary = KEYS[2] ~= nil and KEYS[2] ~= ''
|
|
38
|
+
if has_secondary then
|
|
39
|
+
secondary_tokens = load_bucket(KEYS[2], secondary_cap, secondary_rate, now)
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
local allowed = 1
|
|
43
|
+
if primary_tokens < cost then allowed = 0 end
|
|
44
|
+
if has_secondary and secondary_tokens < cost then allowed = 0 end
|
|
45
|
+
|
|
46
|
+
if allowed == 1 then
|
|
47
|
+
primary_tokens = primary_tokens - cost
|
|
48
|
+
save_bucket(KEYS[1], primary_tokens, primary_cap, primary_rate, now)
|
|
49
|
+
if has_secondary then
|
|
50
|
+
secondary_tokens = secondary_tokens - cost
|
|
51
|
+
save_bucket(KEYS[2], secondary_tokens, secondary_cap, secondary_rate, now)
|
|
52
|
+
end
|
|
53
|
+
else
|
|
54
|
+
-- Refresh ts so refill math stays correct on next call without consuming tokens.
|
|
55
|
+
save_bucket(KEYS[1], primary_tokens, primary_cap, primary_rate, now)
|
|
56
|
+
if has_secondary then
|
|
57
|
+
save_bucket(KEYS[2], secondary_tokens, secondary_cap, secondary_rate, now)
|
|
58
|
+
end
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
local primary_reset = reset_sec(primary_tokens, primary_cap, primary_rate, cost)
|
|
62
|
+
local secondary_reset = 0
|
|
63
|
+
if has_secondary then
|
|
64
|
+
secondary_reset = reset_sec(secondary_tokens, secondary_cap, secondary_rate, cost)
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
return {
|
|
68
|
+
allowed,
|
|
69
|
+
math.floor(primary_tokens),
|
|
70
|
+
primary_cap,
|
|
71
|
+
primary_reset,
|
|
72
|
+
math.floor(secondary_tokens),
|
|
73
|
+
secondary_cap,
|
|
74
|
+
secondary_reset,
|
|
75
|
+
}
|
|
76
|
+
`;
|
|
77
|
+
//# sourceMappingURL=rate-limit.lua.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rate-limit.lua.js","sourceRoot":"","sources":["../../../src/middlewares/rate-limit/rate-limit.lua.ts"],"names":[],"mappings":";;;AAca,QAAA,cAAc,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAwE7B,CAAC"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { Request, Response, NextFunction } from 'express-serve-static-core';
|
|
2
|
+
import type { TokenBucketStore } from './token-bucket.store';
|
|
3
|
+
import type { RateLimitMiddlewareOptions } from '../../types/interface/rate-limit';
|
|
4
|
+
export declare function createRateLimitMiddleware(options: RateLimitMiddlewareOptions, store: TokenBucketStore): (req: Request, res: Response, next: NextFunction) => Promise<void>;
|
|
@@ -0,0 +1,186 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.createRateLimitMiddleware = void 0;
|
|
4
|
+
const identifier_resolver_1 = require("./identifier-resolver");
|
|
5
|
+
const parse_window_1 = require("./parse-window");
|
|
6
|
+
function buildKey(prefix, scope, id) {
|
|
7
|
+
return `rl:${prefix}:${scope}:${id}`;
|
|
8
|
+
}
|
|
9
|
+
function applyOverride(base, override) {
|
|
10
|
+
return {
|
|
11
|
+
max: override?.max ?? base.max,
|
|
12
|
+
windowSec: (0, parse_window_1.parseWindow)(override?.window ?? base.window),
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
function buildBuckets(identifier, config, override) {
|
|
16
|
+
switch (identifier.kind) {
|
|
17
|
+
case 'admin':
|
|
18
|
+
return {};
|
|
19
|
+
case 'apikey': {
|
|
20
|
+
const eff = applyOverride(config.apikey, override);
|
|
21
|
+
return {
|
|
22
|
+
primary: {
|
|
23
|
+
scope: 'apikey',
|
|
24
|
+
key: buildKey(config.redisPrefix, 'apikey', identifier.apiKeyId),
|
|
25
|
+
max: eff.max,
|
|
26
|
+
windowSec: eff.windowSec,
|
|
27
|
+
},
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
case 'userOrg': {
|
|
31
|
+
const userEff = applyOverride(config.user, override?.scope === 'user' ? override : undefined);
|
|
32
|
+
const orgEff = applyOverride(config.org, override?.scope === 'org' ? override : undefined);
|
|
33
|
+
return {
|
|
34
|
+
primary: {
|
|
35
|
+
scope: 'user',
|
|
36
|
+
key: buildKey(config.redisPrefix, 'user', identifier.userId),
|
|
37
|
+
max: userEff.max,
|
|
38
|
+
windowSec: userEff.windowSec,
|
|
39
|
+
},
|
|
40
|
+
secondary: {
|
|
41
|
+
scope: 'org',
|
|
42
|
+
key: buildKey(config.redisPrefix, 'org', identifier.orgId),
|
|
43
|
+
max: orgEff.max,
|
|
44
|
+
windowSec: orgEff.windowSec,
|
|
45
|
+
},
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
case 'user': {
|
|
49
|
+
const eff = applyOverride(config.user, override);
|
|
50
|
+
return {
|
|
51
|
+
primary: {
|
|
52
|
+
scope: 'user',
|
|
53
|
+
key: buildKey(config.redisPrefix, 'user', identifier.userId),
|
|
54
|
+
max: eff.max,
|
|
55
|
+
windowSec: eff.windowSec,
|
|
56
|
+
},
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
case 'ip': {
|
|
60
|
+
const eff = applyOverride(config.ip, override);
|
|
61
|
+
return {
|
|
62
|
+
primary: {
|
|
63
|
+
scope: 'ip',
|
|
64
|
+
key: buildKey(config.redisPrefix, 'ip', identifier.ip),
|
|
65
|
+
max: eff.max,
|
|
66
|
+
windowSec: eff.windowSec,
|
|
67
|
+
},
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
function setSuccessHeaders(res, bucket, remaining, resetSec) {
|
|
73
|
+
res.setHeader('RateLimit-Limit', bucket.max);
|
|
74
|
+
res.setHeader('RateLimit-Remaining', remaining);
|
|
75
|
+
res.setHeader('RateLimit-Reset', resetSec);
|
|
76
|
+
res.setHeader('RateLimit-Policy', `${bucket.max};w=${bucket.windowSec}`);
|
|
77
|
+
}
|
|
78
|
+
function createRateLimitMiddleware(options, store) {
|
|
79
|
+
const { config, logger, onExceeded } = options;
|
|
80
|
+
const routeOverrideLookup = new Map();
|
|
81
|
+
for (const entry of options.routeRegistry ?? []) {
|
|
82
|
+
routeOverrideLookup.set(`${entry.method}:${entry.path}`, entry.options);
|
|
83
|
+
}
|
|
84
|
+
return async function rateLimitMiddleware(req, res, next) {
|
|
85
|
+
if (!config.enabled) {
|
|
86
|
+
next();
|
|
87
|
+
return;
|
|
88
|
+
}
|
|
89
|
+
const identifier = (0, identifier_resolver_1.resolveIdentifiers)(req, res);
|
|
90
|
+
if (identifier.kind === 'admin') {
|
|
91
|
+
next();
|
|
92
|
+
return;
|
|
93
|
+
}
|
|
94
|
+
const override = routeOverrideLookup.get(`${req.method}:${req.path}`);
|
|
95
|
+
const cost = override?.cost ?? 1;
|
|
96
|
+
let effectiveIdentifier = identifier;
|
|
97
|
+
if (override?.scope === 'ip') {
|
|
98
|
+
effectiveIdentifier = { kind: 'ip', ip: req.ip ?? '0.0.0.0' };
|
|
99
|
+
}
|
|
100
|
+
const buckets = buildBuckets(effectiveIdentifier, config, override);
|
|
101
|
+
if (!buckets.primary) {
|
|
102
|
+
next();
|
|
103
|
+
return;
|
|
104
|
+
}
|
|
105
|
+
const refill = (b) => b.max / b.windowSec;
|
|
106
|
+
if (buckets.secondary) {
|
|
107
|
+
const result = await store.consumeDual({
|
|
108
|
+
primary: {
|
|
109
|
+
key: buckets.primary.key,
|
|
110
|
+
capacity: buckets.primary.max,
|
|
111
|
+
refillPerSec: refill(buckets.primary),
|
|
112
|
+
cost,
|
|
113
|
+
},
|
|
114
|
+
secondary: {
|
|
115
|
+
key: buckets.secondary.key,
|
|
116
|
+
capacity: buckets.secondary.max,
|
|
117
|
+
refillPerSec: refill(buckets.secondary),
|
|
118
|
+
cost,
|
|
119
|
+
},
|
|
120
|
+
});
|
|
121
|
+
const tighter = result.primaryRemaining <= result.secondaryRemaining ? buckets.primary : buckets.secondary;
|
|
122
|
+
const tighterRemaining = tighter === buckets.primary ? result.primaryRemaining : result.secondaryRemaining;
|
|
123
|
+
const tighterReset = tighter === buckets.primary ? result.primaryResetSeconds : result.secondaryResetSeconds;
|
|
124
|
+
if (!result.allowed) {
|
|
125
|
+
await emitExceeded(req, tighter, tighterReset, logger, onExceeded);
|
|
126
|
+
respond429(res, tighter, tighterReset);
|
|
127
|
+
return;
|
|
128
|
+
}
|
|
129
|
+
setSuccessHeaders(res, tighter, tighterRemaining, tighterReset);
|
|
130
|
+
next();
|
|
131
|
+
return;
|
|
132
|
+
}
|
|
133
|
+
const single = await store.consume({
|
|
134
|
+
key: buckets.primary.key,
|
|
135
|
+
capacity: buckets.primary.max,
|
|
136
|
+
refillPerSec: refill(buckets.primary),
|
|
137
|
+
cost,
|
|
138
|
+
});
|
|
139
|
+
if (!single.allowed) {
|
|
140
|
+
await emitExceeded(req, buckets.primary, single.resetSeconds, logger, onExceeded);
|
|
141
|
+
respond429(res, buckets.primary, single.resetSeconds);
|
|
142
|
+
return;
|
|
143
|
+
}
|
|
144
|
+
setSuccessHeaders(res, buckets.primary, single.remaining, single.resetSeconds);
|
|
145
|
+
next();
|
|
146
|
+
};
|
|
147
|
+
}
|
|
148
|
+
exports.createRateLimitMiddleware = createRateLimitMiddleware;
|
|
149
|
+
function respond429(res, bucket, resetSec) {
|
|
150
|
+
res.setHeader('RateLimit-Limit', bucket.max);
|
|
151
|
+
res.setHeader('RateLimit-Remaining', 0);
|
|
152
|
+
res.setHeader('RateLimit-Reset', resetSec);
|
|
153
|
+
res.setHeader('RateLimit-Policy', `${bucket.max};w=${bucket.windowSec}`);
|
|
154
|
+
res.setHeader('Retry-After', resetSec);
|
|
155
|
+
res.status(429).json({
|
|
156
|
+
error: {
|
|
157
|
+
code: 'RATE_LIMIT_EXCEEDED',
|
|
158
|
+
message: `Rate limit exceeded for scope '${bucket.scope}'. Retry in ${resetSec}s.`,
|
|
159
|
+
scope: bucket.scope,
|
|
160
|
+
limit: bucket.max,
|
|
161
|
+
window: bucket.windowSec,
|
|
162
|
+
retryAfter: resetSec,
|
|
163
|
+
},
|
|
164
|
+
});
|
|
165
|
+
}
|
|
166
|
+
async function emitExceeded(req, bucket, resetSec, logger, onExceeded) {
|
|
167
|
+
const info = {
|
|
168
|
+
scope: bucket.scope,
|
|
169
|
+
identifier: bucket.key,
|
|
170
|
+
limit: bucket.max,
|
|
171
|
+
windowSeconds: bucket.windowSec,
|
|
172
|
+
retryAfterSeconds: resetSec,
|
|
173
|
+
endpoint: req.path,
|
|
174
|
+
method: req.method,
|
|
175
|
+
ip: req.ip ?? '',
|
|
176
|
+
};
|
|
177
|
+
if (logger && typeof logger.warn === 'function') {
|
|
178
|
+
await logger.warn('rate_limit_exceeded', {
|
|
179
|
+
context: 'rate-limit',
|
|
180
|
+
data: info,
|
|
181
|
+
});
|
|
182
|
+
}
|
|
183
|
+
if (onExceeded)
|
|
184
|
+
await onExceeded(info);
|
|
185
|
+
}
|
|
186
|
+
//# sourceMappingURL=rate-limit.middleware.js.map
|