@expressots/adapter-express 3.0.0 → 4.0.0-preview.3
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/LICENSE.md +21 -21
- package/README.md +61 -118
- package/lib/CHANGELOG.md +36 -5
- package/lib/README.md +61 -118
- package/lib/cjs/adapter-express/application-express.base.js +3 -1
- package/lib/cjs/adapter-express/application-express.js +1405 -85
- package/lib/cjs/adapter-express/express-utils/conditional-middleware.js +102 -0
- package/lib/cjs/adapter-express/express-utils/constants.js +17 -0
- package/lib/cjs/adapter-express/express-utils/content-negotiation-decorators.js +129 -0
- package/lib/cjs/adapter-express/express-utils/decorators.js +225 -59
- package/lib/cjs/adapter-express/express-utils/exception-filter-decorators.js +11 -0
- package/lib/cjs/adapter-express/express-utils/guard-context-factory.js +84 -0
- package/lib/cjs/adapter-express/express-utils/guard-middleware.js +115 -0
- package/lib/cjs/adapter-express/express-utils/guard-utils.js +18 -0
- package/lib/cjs/adapter-express/express-utils/http-context-store.js +15 -0
- package/lib/cjs/adapter-express/express-utils/http-status-middleware.js +37 -2
- package/lib/cjs/adapter-express/express-utils/index.js +67 -1
- package/lib/cjs/adapter-express/express-utils/interceptor-middleware.js +132 -0
- package/lib/cjs/adapter-express/express-utils/inversify-express-server.js +827 -64
- package/lib/cjs/adapter-express/express-utils/lazy-module-middleware.js +241 -0
- package/lib/cjs/adapter-express/express-utils/middleware-composition.js +95 -0
- package/lib/cjs/adapter-express/express-utils/path-pattern-compat.js +129 -0
- package/lib/cjs/adapter-express/express-utils/permission-preloader.middleware.js +48 -0
- package/lib/cjs/adapter-express/express-utils/route-constraints.js +104 -0
- package/lib/cjs/adapter-express/express-utils/scope-extractor.interface.js +2 -0
- package/lib/cjs/adapter-express/express-utils/scope-extractor.js +66 -0
- package/lib/cjs/adapter-express/express-utils/setup-authorization.js +71 -0
- package/lib/cjs/adapter-express/express-utils/setup-event-system.js +113 -0
- package/lib/cjs/adapter-express/express-utils/setup-interceptors.js +103 -0
- package/lib/cjs/adapter-express/express-utils/setup-lazy-loading.js +228 -0
- package/lib/cjs/adapter-express/express-utils/utils.js +30 -12
- package/lib/cjs/adapter-express/express-utils/validation-decorators.js +205 -0
- package/lib/cjs/adapter-express/express-utils/validation-service.js +252 -0
- package/lib/cjs/adapter-express/index.js +7 -5
- package/lib/cjs/adapter-express/micro-api/application-express-micro-route.js +31 -1
- package/lib/cjs/adapter-express/micro-api/application-express-micro.js +8 -38
- package/lib/cjs/adapter-express/micro-api/gateway/circuit-breaker.js +174 -0
- package/lib/cjs/adapter-express/micro-api/gateway/index.js +11 -0
- package/lib/cjs/adapter-express/micro-api/gateway/service-proxy.js +214 -0
- package/lib/cjs/adapter-express/micro-api/index.js +27 -3
- package/lib/cjs/adapter-express/micro-api/micro.js +272 -0
- package/lib/cjs/adapter-express/micro-api/queue/index.js +8 -0
- package/lib/cjs/adapter-express/micro-api/queue/queue.interface.js +2 -0
- package/lib/cjs/adapter-express/micro-api/queue/rabbitmq-consumer.js +255 -0
- package/lib/cjs/adapter-express/micro-api/serverless/aws-lambda.adapter.js +183 -0
- package/lib/cjs/adapter-express/micro-api/serverless/cloudflare.adapter.js +158 -0
- package/lib/cjs/adapter-express/micro-api/serverless/index.js +12 -0
- package/lib/cjs/adapter-express/micro-api/serverless/vercel.adapter.js +102 -0
- package/lib/cjs/adapter-express/micro-api/service-mesh/index.js +10 -0
- package/lib/cjs/adapter-express/micro-api/service-mesh/service-client.js +194 -0
- package/lib/cjs/adapter-express/micro-api/service-mesh/service-discovery.js +261 -0
- package/lib/cjs/adapter-express/middleware/index.js +21 -0
- package/lib/cjs/adapter-express/middleware/request-logging.middleware.js +244 -0
- package/lib/cjs/adapter-express/render/engine.js +15 -15
- package/lib/cjs/adapter-express/render/index.js +5 -0
- package/lib/cjs/adapter-express/studio/index.js +10 -0
- package/lib/cjs/adapter-express/studio/studio-integration.js +267 -0
- package/lib/cjs/index.js +1 -1
- package/lib/cjs/types/adapter-express/application-express.base.d.ts +20 -7
- package/lib/cjs/types/adapter-express/application-express.d.ts +316 -33
- package/lib/cjs/types/adapter-express/express-utils/base-middleware.d.ts +2 -2
- package/lib/cjs/types/adapter-express/express-utils/conditional-middleware.d.ts +97 -0
- package/lib/cjs/types/adapter-express/express-utils/constants.d.ts +13 -0
- package/lib/cjs/types/adapter-express/express-utils/content-negotiation-decorators.d.ts +94 -0
- package/lib/cjs/types/adapter-express/express-utils/decorators.d.ts +54 -6
- package/lib/cjs/types/adapter-express/express-utils/exception-filter-decorators.d.ts +6 -0
- package/lib/cjs/types/adapter-express/express-utils/guard-context-factory.d.ts +17 -0
- package/lib/cjs/types/adapter-express/express-utils/guard-middleware.d.ts +22 -0
- package/lib/cjs/types/adapter-express/express-utils/guard-utils.d.ts +11 -0
- package/lib/cjs/types/adapter-express/express-utils/http-context-store.d.ts +20 -0
- package/lib/cjs/types/adapter-express/express-utils/httpResponseMessage.d.ts +1 -1
- package/lib/cjs/types/adapter-express/express-utils/index.d.ts +30 -2
- package/lib/cjs/types/adapter-express/express-utils/interceptor-middleware.d.ts +40 -0
- package/lib/cjs/types/adapter-express/express-utils/interfaces.d.ts +42 -5
- package/lib/cjs/types/adapter-express/express-utils/inversify-express-server.d.ts +114 -2
- package/lib/cjs/types/adapter-express/express-utils/lazy-module-middleware.d.ts +122 -0
- package/lib/cjs/types/adapter-express/express-utils/middleware-composition.d.ts +85 -0
- package/lib/cjs/types/adapter-express/express-utils/path-pattern-compat.d.ts +66 -0
- package/lib/cjs/types/adapter-express/express-utils/permission-preloader.middleware.d.ts +10 -0
- package/lib/cjs/types/adapter-express/express-utils/route-constraints.d.ts +98 -0
- package/lib/cjs/types/adapter-express/express-utils/scope-extractor.d.ts +21 -0
- package/lib/cjs/types/adapter-express/express-utils/scope-extractor.interface.d.ts +12 -0
- package/lib/cjs/types/adapter-express/express-utils/setup-authorization.d.ts +34 -0
- package/lib/cjs/types/adapter-express/express-utils/setup-event-system.d.ts +118 -0
- package/lib/cjs/types/adapter-express/express-utils/setup-interceptors.d.ts +115 -0
- package/lib/cjs/types/adapter-express/express-utils/setup-lazy-loading.d.ts +123 -0
- package/lib/cjs/types/adapter-express/express-utils/utils.d.ts +17 -2
- package/lib/cjs/types/adapter-express/express-utils/validation-decorators.d.ts +145 -0
- package/lib/cjs/types/adapter-express/express-utils/validation-service.d.ts +88 -0
- package/lib/cjs/types/adapter-express/index.d.ts +6 -4
- package/lib/cjs/types/adapter-express/micro-api/application-express-micro-route.d.ts +25 -14
- package/lib/cjs/types/adapter-express/micro-api/application-express-micro.d.ts +3 -10
- package/lib/cjs/types/adapter-express/micro-api/gateway/circuit-breaker.d.ts +111 -0
- package/lib/cjs/types/adapter-express/micro-api/gateway/index.d.ts +5 -0
- package/lib/cjs/types/adapter-express/micro-api/gateway/service-proxy.d.ts +83 -0
- package/lib/cjs/types/adapter-express/micro-api/index.d.ts +7 -1
- package/lib/cjs/types/adapter-express/micro-api/micro.d.ts +83 -0
- package/lib/cjs/types/adapter-express/micro-api/queue/index.d.ts +5 -0
- package/lib/cjs/types/adapter-express/micro-api/queue/queue.interface.d.ts +60 -0
- package/lib/cjs/types/adapter-express/micro-api/queue/rabbitmq-consumer.d.ts +86 -0
- package/lib/cjs/types/adapter-express/micro-api/serverless/aws-lambda.adapter.d.ts +77 -0
- package/lib/cjs/types/adapter-express/micro-api/serverless/cloudflare.adapter.d.ts +64 -0
- package/lib/cjs/types/adapter-express/micro-api/serverless/index.d.ts +6 -0
- package/lib/cjs/types/adapter-express/micro-api/serverless/vercel.adapter.d.ts +56 -0
- package/lib/cjs/types/adapter-express/micro-api/service-mesh/index.d.ts +5 -0
- package/lib/cjs/types/adapter-express/micro-api/service-mesh/service-client.d.ts +122 -0
- package/lib/cjs/types/adapter-express/micro-api/service-mesh/service-discovery.d.ts +150 -0
- package/lib/cjs/types/adapter-express/middleware/index.d.ts +5 -0
- package/lib/cjs/types/adapter-express/middleware/request-logging.middleware.d.ts +65 -0
- package/lib/cjs/types/adapter-express/render/index.d.ts +1 -0
- package/lib/cjs/types/adapter-express/studio/index.d.ts +1 -0
- package/lib/cjs/types/adapter-express/studio/studio-integration.d.ts +170 -0
- package/lib/cjs/types/index.d.ts +1 -1
- package/lib/esm/adapter-express/application-express.base.js +24 -0
- package/lib/esm/adapter-express/application-express.js +1656 -0
- package/lib/esm/adapter-express/application-express.types.js +1 -0
- package/lib/esm/adapter-express/express-utils/base-middleware.js +19 -0
- package/lib/esm/adapter-express/express-utils/conditional-middleware.js +96 -0
- package/lib/esm/adapter-express/express-utils/constants.js +63 -0
- package/lib/esm/adapter-express/express-utils/content/httpContent.js +6 -0
- package/lib/esm/adapter-express/express-utils/content-negotiation-decorators.js +120 -0
- package/lib/esm/adapter-express/express-utils/decorators.js +604 -0
- package/lib/esm/adapter-express/express-utils/exception-filter-decorators.js +6 -0
- package/lib/esm/adapter-express/express-utils/guard-context-factory.js +83 -0
- package/lib/esm/adapter-express/express-utils/guard-middleware.js +115 -0
- package/lib/esm/adapter-express/express-utils/guard-utils.js +14 -0
- package/lib/esm/adapter-express/express-utils/http-context-store.js +10 -0
- package/lib/esm/adapter-express/express-utils/http-status-middleware.js +116 -0
- package/lib/esm/adapter-express/express-utils/httpResponseMessage.js +29 -0
- package/lib/esm/adapter-express/express-utils/index.js +24 -0
- package/lib/esm/adapter-express/express-utils/interceptor-middleware.js +130 -0
- package/lib/esm/adapter-express/express-utils/interfaces.js +1 -0
- package/lib/esm/adapter-express/express-utils/inversify-express-server.js +1047 -0
- package/lib/esm/adapter-express/express-utils/lazy-module-middleware.js +236 -0
- package/lib/esm/adapter-express/express-utils/middleware-composition.js +89 -0
- package/lib/esm/adapter-express/express-utils/path-pattern-compat.js +125 -0
- package/lib/esm/adapter-express/express-utils/permission-preloader.middleware.js +45 -0
- package/lib/esm/adapter-express/express-utils/resolver-multer.js +30 -0
- package/lib/esm/adapter-express/express-utils/route-constraints.js +100 -0
- package/lib/esm/adapter-express/express-utils/scope-extractor.interface.js +1 -0
- package/lib/esm/adapter-express/express-utils/scope-extractor.js +63 -0
- package/lib/esm/adapter-express/express-utils/setup-authorization.js +68 -0
- package/lib/esm/adapter-express/express-utils/setup-event-system.js +110 -0
- package/lib/esm/adapter-express/express-utils/setup-interceptors.js +100 -0
- package/lib/esm/adapter-express/express-utils/setup-lazy-loading.js +225 -0
- package/lib/esm/adapter-express/express-utils/utils.js +68 -0
- package/lib/esm/adapter-express/express-utils/validation-decorators.js +199 -0
- package/lib/esm/adapter-express/express-utils/validation-service.js +251 -0
- package/lib/esm/adapter-express/index.js +7 -0
- package/lib/esm/adapter-express/micro-api/application-express-micro-container.js +48 -0
- package/lib/esm/adapter-express/micro-api/application-express-micro-route.js +128 -0
- package/lib/esm/adapter-express/micro-api/application-express-micro.js +157 -0
- package/lib/esm/adapter-express/micro-api/gateway/circuit-breaker.js +174 -0
- package/lib/esm/adapter-express/micro-api/gateway/index.js +5 -0
- package/lib/esm/adapter-express/micro-api/gateway/service-proxy.js +210 -0
- package/lib/esm/adapter-express/micro-api/index.js +10 -0
- package/lib/esm/adapter-express/micro-api/micro.js +266 -0
- package/lib/esm/adapter-express/micro-api/queue/index.js +4 -0
- package/lib/esm/adapter-express/micro-api/queue/queue.interface.js +1 -0
- package/lib/esm/adapter-express/micro-api/queue/rabbitmq-consumer.js +229 -0
- package/lib/esm/adapter-express/micro-api/serverless/aws-lambda.adapter.js +180 -0
- package/lib/esm/adapter-express/micro-api/serverless/cloudflare.adapter.js +155 -0
- package/lib/esm/adapter-express/micro-api/serverless/index.js +6 -0
- package/lib/esm/adapter-express/micro-api/serverless/vercel.adapter.js +99 -0
- package/lib/esm/adapter-express/micro-api/service-mesh/index.js +5 -0
- package/lib/esm/adapter-express/micro-api/service-mesh/service-client.js +191 -0
- package/lib/esm/adapter-express/micro-api/service-mesh/service-discovery.js +259 -0
- package/lib/esm/adapter-express/middleware/index.js +5 -0
- package/lib/esm/adapter-express/middleware/request-logging.middleware.js +239 -0
- package/lib/esm/adapter-express/render/constants.js +37 -0
- package/lib/esm/adapter-express/render/engine.js +51 -0
- package/lib/esm/adapter-express/render/index.js +1 -0
- package/lib/esm/adapter-express/render/resolve-render.js +30 -0
- package/lib/esm/adapter-express/studio/index.js +1 -0
- package/lib/esm/adapter-express/studio/studio-integration.js +236 -0
- package/lib/esm/index.mjs +1 -0
- package/lib/esm/package.json +3 -0
- package/lib/esm/types/adapter-express/application-express.base.d.ts +77 -0
- package/lib/esm/types/adapter-express/application-express.d.ts +453 -0
- package/lib/esm/types/adapter-express/application-express.types.d.ts +23 -0
- package/lib/esm/types/adapter-express/express-utils/base-middleware.d.ts +8 -0
- package/lib/esm/types/adapter-express/express-utils/conditional-middleware.d.ts +97 -0
- package/lib/esm/types/adapter-express/express-utils/constants.d.ts +57 -0
- package/lib/esm/types/adapter-express/express-utils/content/httpContent.d.ts +6 -0
- package/lib/esm/types/adapter-express/express-utils/content-negotiation-decorators.d.ts +94 -0
- package/lib/esm/types/adapter-express/express-utils/decorators.d.ts +257 -0
- package/lib/esm/types/adapter-express/express-utils/exception-filter-decorators.d.ts +6 -0
- package/lib/esm/types/adapter-express/express-utils/guard-context-factory.d.ts +17 -0
- package/lib/esm/types/adapter-express/express-utils/guard-middleware.d.ts +22 -0
- package/lib/esm/types/adapter-express/express-utils/guard-utils.d.ts +11 -0
- package/lib/esm/types/adapter-express/express-utils/http-context-store.d.ts +20 -0
- package/lib/esm/types/adapter-express/express-utils/http-status-middleware.d.ts +26 -0
- package/lib/esm/types/adapter-express/express-utils/httpResponseMessage.d.ts +14 -0
- package/lib/esm/types/adapter-express/express-utils/index.d.ts +30 -0
- package/lib/esm/types/adapter-express/express-utils/interceptor-middleware.d.ts +40 -0
- package/lib/esm/types/adapter-express/express-utils/interfaces.d.ts +115 -0
- package/lib/esm/types/adapter-express/express-utils/inversify-express-server.d.ts +172 -0
- package/lib/esm/types/adapter-express/express-utils/lazy-module-middleware.d.ts +122 -0
- package/lib/esm/types/adapter-express/express-utils/middleware-composition.d.ts +85 -0
- package/lib/esm/types/adapter-express/express-utils/path-pattern-compat.d.ts +66 -0
- package/lib/esm/types/adapter-express/express-utils/permission-preloader.middleware.d.ts +10 -0
- package/lib/esm/types/adapter-express/express-utils/resolver-multer.d.ts +7 -0
- package/lib/esm/types/adapter-express/express-utils/route-constraints.d.ts +98 -0
- package/lib/esm/types/adapter-express/express-utils/scope-extractor.d.ts +21 -0
- package/lib/esm/types/adapter-express/express-utils/scope-extractor.interface.d.ts +12 -0
- package/lib/esm/types/adapter-express/express-utils/setup-authorization.d.ts +34 -0
- package/lib/esm/types/adapter-express/express-utils/setup-event-system.d.ts +118 -0
- package/lib/esm/types/adapter-express/express-utils/setup-interceptors.d.ts +115 -0
- package/lib/esm/types/adapter-express/express-utils/setup-lazy-loading.d.ts +123 -0
- package/lib/esm/types/adapter-express/express-utils/utils.d.ts +24 -0
- package/lib/esm/types/adapter-express/express-utils/validation-decorators.d.ts +145 -0
- package/lib/esm/types/adapter-express/express-utils/validation-service.d.ts +88 -0
- package/lib/esm/types/adapter-express/index.d.ts +7 -0
- package/lib/esm/types/adapter-express/micro-api/application-express-micro-container.d.ts +47 -0
- package/lib/esm/types/adapter-express/micro-api/application-express-micro-route.d.ts +104 -0
- package/lib/esm/types/adapter-express/micro-api/application-express-micro.d.ts +72 -0
- package/lib/esm/types/adapter-express/micro-api/gateway/circuit-breaker.d.ts +111 -0
- package/lib/esm/types/adapter-express/micro-api/gateway/index.d.ts +5 -0
- package/lib/esm/types/adapter-express/micro-api/gateway/service-proxy.d.ts +83 -0
- package/lib/esm/types/adapter-express/micro-api/index.d.ts +7 -0
- package/lib/esm/types/adapter-express/micro-api/micro.d.ts +83 -0
- package/lib/esm/types/adapter-express/micro-api/queue/index.d.ts +5 -0
- package/lib/esm/types/adapter-express/micro-api/queue/queue.interface.d.ts +60 -0
- package/lib/esm/types/adapter-express/micro-api/queue/rabbitmq-consumer.d.ts +86 -0
- package/lib/esm/types/adapter-express/micro-api/serverless/aws-lambda.adapter.d.ts +77 -0
- package/lib/esm/types/adapter-express/micro-api/serverless/cloudflare.adapter.d.ts +64 -0
- package/lib/esm/types/adapter-express/micro-api/serverless/index.d.ts +6 -0
- package/lib/esm/types/adapter-express/micro-api/serverless/vercel.adapter.d.ts +56 -0
- package/lib/esm/types/adapter-express/micro-api/service-mesh/index.d.ts +5 -0
- package/lib/esm/types/adapter-express/micro-api/service-mesh/service-client.d.ts +122 -0
- package/lib/esm/types/adapter-express/micro-api/service-mesh/service-discovery.d.ts +150 -0
- package/lib/esm/types/adapter-express/middleware/index.d.ts +5 -0
- package/lib/esm/types/adapter-express/middleware/request-logging.middleware.d.ts +65 -0
- package/lib/esm/types/adapter-express/render/constants.d.ts +26 -0
- package/lib/esm/types/adapter-express/render/engine.d.ts +20 -0
- package/lib/esm/types/adapter-express/render/index.d.ts +5 -0
- package/lib/esm/types/adapter-express/render/resolve-render.d.ts +7 -0
- package/lib/esm/types/adapter-express/studio/index.d.ts +1 -0
- package/lib/esm/types/adapter-express/studio/studio-integration.d.ts +170 -0
- package/lib/esm/types/index.d.ts +1 -0
- package/lib/package.json +170 -146
- package/package.json +170 -146
- package/lib/cjs/di/di.interfaces.js +0 -10
- package/lib/cjs/types/di/di.interfaces.d.ts +0 -289
|
@@ -0,0 +1,267 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Studio Integration - Auto-detects and integrates ExpressoTS Studio Agent
|
|
4
|
+
*
|
|
5
|
+
* This module provides automatic integration with @expressots/studio-agent
|
|
6
|
+
* when it's installed in the project. It enables request recording, tracing,
|
|
7
|
+
* and real-time monitoring without requiring manual setup.
|
|
8
|
+
*/
|
|
9
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
12
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
13
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
14
|
+
}
|
|
15
|
+
Object.defineProperty(o, k2, desc);
|
|
16
|
+
}) : (function(o, m, k, k2) {
|
|
17
|
+
if (k2 === undefined) k2 = k;
|
|
18
|
+
o[k2] = m[k];
|
|
19
|
+
}));
|
|
20
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
21
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
22
|
+
}) : function(o, v) {
|
|
23
|
+
o["default"] = v;
|
|
24
|
+
});
|
|
25
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
26
|
+
if (mod && mod.__esModule) return mod;
|
|
27
|
+
var result = {};
|
|
28
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
29
|
+
__setModuleDefault(result, mod);
|
|
30
|
+
return result;
|
|
31
|
+
};
|
|
32
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
33
|
+
exports.initializeStudio = initializeStudio;
|
|
34
|
+
exports.reportStudioRuntimeInfo = reportStudioRuntimeInfo;
|
|
35
|
+
exports.rescanStudioRoutes = rescanStudioRoutes;
|
|
36
|
+
exports.stopStudio = stopStudio;
|
|
37
|
+
exports.isStudioEnabled = isStudioEnabled;
|
|
38
|
+
exports.getStudioAgent = getStudioAgent;
|
|
39
|
+
const core_1 = require("@expressots/core");
|
|
40
|
+
// Lazy logger accessor so `new Logger()` only fires the first time we
|
|
41
|
+
// actually emit a Studio message. Routing through Logger means the
|
|
42
|
+
// framework's log-level configuration (e.g. `LOG_LEVEL=WARN`) silences
|
|
43
|
+
// the "listening" line as expected, instead of `console.log` always
|
|
44
|
+
// printing it. Lazy construction also keeps consumers that mock
|
|
45
|
+
// `@expressots/core` (test environments) from blowing up at module
|
|
46
|
+
// load when their Logger mock omits `.withContext`.
|
|
47
|
+
let _studioLogger = null;
|
|
48
|
+
function logger() {
|
|
49
|
+
if (!_studioLogger) {
|
|
50
|
+
_studioLogger = new core_1.Logger().withContext("studio");
|
|
51
|
+
}
|
|
52
|
+
return _studioLogger;
|
|
53
|
+
}
|
|
54
|
+
let studioAgent = null;
|
|
55
|
+
let studioEnabled = false;
|
|
56
|
+
/**
|
|
57
|
+
* Check if `@expressots/studio-agent` is installed and importable from the
|
|
58
|
+
* current process. Uses a dynamic `import()` rather than `require.resolve`
|
|
59
|
+
* because the latter is unavailable in pure-ESM consumers — adapter-express
|
|
60
|
+
* is published as a dual CJS/ESM build and this helper is exercised by both
|
|
61
|
+
* targets.
|
|
62
|
+
*
|
|
63
|
+
* The result is cached on first hit (success) so we avoid paying for the
|
|
64
|
+
* import twice. On failure we always retry, since the user may install the
|
|
65
|
+
* package mid-session in `expressots dev` workflows.
|
|
66
|
+
*/
|
|
67
|
+
let _studioAgentModule = null;
|
|
68
|
+
async function isStudioAgentInstalled() {
|
|
69
|
+
const debug = process.env.EXPRESSOTS_STUDIO_DEBUG === "true";
|
|
70
|
+
if (_studioAgentModule !== null)
|
|
71
|
+
return true;
|
|
72
|
+
try {
|
|
73
|
+
// Dynamic import works for both CJS (returns module.exports) and ESM
|
|
74
|
+
// (returns the ESM namespace). If the package isn't installed, Node
|
|
75
|
+
// throws ERR_MODULE_NOT_FOUND / MODULE_NOT_FOUND, which we treat as
|
|
76
|
+
// "agent not present" — adapter-express continues without Studio.
|
|
77
|
+
_studioAgentModule = await Promise.resolve().then(() => __importStar(require("@expressots/studio-agent")));
|
|
78
|
+
if (debug)
|
|
79
|
+
console.log("[Studio] Loaded studio-agent successfully");
|
|
80
|
+
return true;
|
|
81
|
+
}
|
|
82
|
+
catch (error) {
|
|
83
|
+
if (debug)
|
|
84
|
+
console.log("[Studio] Cannot load studio-agent:", error instanceof Error ? error.message : error);
|
|
85
|
+
return false;
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Initialize the Studio Agent if available
|
|
90
|
+
*/
|
|
91
|
+
async function initializeStudio(app, config = {}, appContainer) {
|
|
92
|
+
const debug = process.env.EXPRESSOTS_STUDIO_DEBUG === "true";
|
|
93
|
+
// Check if explicitly disabled
|
|
94
|
+
if (config.enabled === false || process.env.EXPRESSOTS_STUDIO === "false") {
|
|
95
|
+
if (debug)
|
|
96
|
+
console.log("[Studio] Disabled via config or env");
|
|
97
|
+
return false;
|
|
98
|
+
}
|
|
99
|
+
// Only enable in development by default
|
|
100
|
+
const isDev = process.env.NODE_ENV === "development" || !process.env.NODE_ENV;
|
|
101
|
+
if (!isDev && config.enabled !== true) {
|
|
102
|
+
if (debug)
|
|
103
|
+
console.log("[Studio] Not in development mode, skipping");
|
|
104
|
+
return false;
|
|
105
|
+
}
|
|
106
|
+
// Check if studio-agent is installed
|
|
107
|
+
const installed = await isStudioAgentInstalled();
|
|
108
|
+
if (debug)
|
|
109
|
+
console.log("[Studio] studio-agent installed:", installed);
|
|
110
|
+
if (!installed) {
|
|
111
|
+
return false;
|
|
112
|
+
}
|
|
113
|
+
// Defensive: if a previous agent instance from this same process is still
|
|
114
|
+
// around (e.g. App.init() called twice without a stop in between) shut it
|
|
115
|
+
// down first so we don't leak the WebSocket port.
|
|
116
|
+
if (studioAgent) {
|
|
117
|
+
try {
|
|
118
|
+
await studioAgent.stop();
|
|
119
|
+
}
|
|
120
|
+
catch {
|
|
121
|
+
// best-effort cleanup
|
|
122
|
+
}
|
|
123
|
+
studioAgent = null;
|
|
124
|
+
studioEnabled = false;
|
|
125
|
+
}
|
|
126
|
+
try {
|
|
127
|
+
if (debug)
|
|
128
|
+
console.log("[Studio] Attempting dynamic import...");
|
|
129
|
+
// Dynamic import for ESM module
|
|
130
|
+
const studioAgentModule = await Promise.resolve().then(() => __importStar(require("@expressots/studio-agent")));
|
|
131
|
+
if (debug)
|
|
132
|
+
console.log("[Studio] Import successful, keys:", Object.keys(studioAgentModule));
|
|
133
|
+
// studio-agent ships only named exports; cast through `any` so the
|
|
134
|
+
// ESM build does not reject the legacy `default.StudioAgent`
|
|
135
|
+
// fallback (kept for older preview tarballs).
|
|
136
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
137
|
+
const studioAgentModuleAny = studioAgentModule;
|
|
138
|
+
const StudioAgent = studioAgentModuleAny.StudioAgent || studioAgentModuleAny.default?.StudioAgent;
|
|
139
|
+
if (!StudioAgent) {
|
|
140
|
+
logger().warn("Studio Agent module found but StudioAgent class not exported");
|
|
141
|
+
if (debug)
|
|
142
|
+
logger().debug(`Module contents: ${Object.keys(studioAgentModule).join(", ")}`);
|
|
143
|
+
return false;
|
|
144
|
+
}
|
|
145
|
+
if (debug)
|
|
146
|
+
console.log("[Studio] StudioAgent class found, initializing...");
|
|
147
|
+
const agentOptions = {
|
|
148
|
+
port: config.port ?? parseInt(process.env.EXPRESSOTS_STUDIO_PORT ?? "3334", 10),
|
|
149
|
+
dbPath: config.dbPath ?? process.env.EXPRESSOTS_STUDIO_DB ?? ".studio/studio.db",
|
|
150
|
+
serviceName: config.serviceName ?? "expressots-app",
|
|
151
|
+
enableRecording: true,
|
|
152
|
+
enableProfiling: true,
|
|
153
|
+
expressApp: app, // Pass Express app for runtime route scanning
|
|
154
|
+
appContainer, // Pass AppContainer so the agent can build a DI snapshot
|
|
155
|
+
appPort: config.appPort,
|
|
156
|
+
globalPrefix: config.globalPrefix,
|
|
157
|
+
};
|
|
158
|
+
studioAgent = new StudioAgent(agentOptions);
|
|
159
|
+
// Add the middleware BEFORE other routes to capture all requests
|
|
160
|
+
const middleware = studioAgent.createMiddleware();
|
|
161
|
+
app.use(middleware);
|
|
162
|
+
// Start the agent (this also scans routes)
|
|
163
|
+
await studioAgent.start();
|
|
164
|
+
studioEnabled = true;
|
|
165
|
+
logger().info(`Studio Agent listening on ws://localhost:${agentOptions.port}`);
|
|
166
|
+
return true;
|
|
167
|
+
}
|
|
168
|
+
catch (error) {
|
|
169
|
+
// Best-effort cleanup so a half-initialised agent doesn't hold the
|
|
170
|
+
// WebSocket port across a retry.
|
|
171
|
+
if (studioAgent) {
|
|
172
|
+
try {
|
|
173
|
+
await studioAgent.stop();
|
|
174
|
+
}
|
|
175
|
+
catch {
|
|
176
|
+
// ignore
|
|
177
|
+
}
|
|
178
|
+
studioAgent = null;
|
|
179
|
+
}
|
|
180
|
+
studioEnabled = false;
|
|
181
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
182
|
+
const errorCode = error && typeof error === "object" && "code" in error
|
|
183
|
+
? error.code
|
|
184
|
+
: undefined;
|
|
185
|
+
// Expected when @expressots/studio-agent isn't installed — silent.
|
|
186
|
+
if (errorMessage.includes("Cannot find module") ||
|
|
187
|
+
errorMessage.includes("ERR_MODULE_NOT_FOUND")) {
|
|
188
|
+
return false;
|
|
189
|
+
}
|
|
190
|
+
// Friendlier message for the most common failure mode: hot-reload
|
|
191
|
+
// race left the port in TIME_WAIT.
|
|
192
|
+
if (errorCode === "EADDRINUSE") {
|
|
193
|
+
logger().warn(`Studio Agent could not bind its WebSocket port ` +
|
|
194
|
+
`(${errorMessage}). The host app will continue without Studio. ` +
|
|
195
|
+
`If this happened during hot-reload, the next restart should recover.`);
|
|
196
|
+
return false;
|
|
197
|
+
}
|
|
198
|
+
logger().warn(`Failed to initialize Studio Agent: ${errorMessage}`);
|
|
199
|
+
return false;
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
/**
|
|
203
|
+
* Push runtime details to the agent that the host only knows after the
|
|
204
|
+
* HTTP server has started — most importantly the actual listening port
|
|
205
|
+
* and total boot time. No-ops when:
|
|
206
|
+
* - the agent isn't running, or
|
|
207
|
+
* - the installed agent is from an older preview without
|
|
208
|
+
* `updateRuntimeInfo()` (we feature-detect to stay forward-compatible).
|
|
209
|
+
*/
|
|
210
|
+
function reportStudioRuntimeInfo(patch) {
|
|
211
|
+
if (!studioAgent)
|
|
212
|
+
return;
|
|
213
|
+
if (typeof studioAgent.updateRuntimeInfo !== "function")
|
|
214
|
+
return;
|
|
215
|
+
try {
|
|
216
|
+
studioAgent.updateRuntimeInfo(patch);
|
|
217
|
+
}
|
|
218
|
+
catch {
|
|
219
|
+
// Best-effort — never break the host on a status-page update.
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
/**
|
|
223
|
+
* Re-trigger the Studio Agent's route discovery. Used by the host
|
|
224
|
+
* after `app.listen()` so that the agent's runtime route scanner sees
|
|
225
|
+
* the fully-populated Express `_router` stack (controllers are bound
|
|
226
|
+
* by `InversifyExpressServer.build()` AFTER `initializeStudio()` runs,
|
|
227
|
+
* so the agent's first scan only catches static-source routes).
|
|
228
|
+
*
|
|
229
|
+
* No-ops when:
|
|
230
|
+
* - Studio isn't enabled, or
|
|
231
|
+
* - the installed agent is too old to expose `scanRoutes()`.
|
|
232
|
+
*/
|
|
233
|
+
async function rescanStudioRoutes() {
|
|
234
|
+
if (!studioAgent)
|
|
235
|
+
return;
|
|
236
|
+
if (typeof studioAgent.scanRoutes !== "function")
|
|
237
|
+
return;
|
|
238
|
+
try {
|
|
239
|
+
await studioAgent.scanRoutes();
|
|
240
|
+
}
|
|
241
|
+
catch (error) {
|
|
242
|
+
// Best-effort — never break the host on a Studio rescan.
|
|
243
|
+
logger().warn(`Studio route rescan failed: ${error instanceof Error ? error.message : String(error)}`);
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
/**
|
|
247
|
+
* Stop the Studio Agent
|
|
248
|
+
*/
|
|
249
|
+
async function stopStudio() {
|
|
250
|
+
if (studioAgent) {
|
|
251
|
+
await studioAgent.stop();
|
|
252
|
+
studioAgent = null;
|
|
253
|
+
studioEnabled = false;
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
/**
|
|
257
|
+
* Check if Studio is enabled
|
|
258
|
+
*/
|
|
259
|
+
function isStudioEnabled() {
|
|
260
|
+
return studioEnabled;
|
|
261
|
+
}
|
|
262
|
+
/**
|
|
263
|
+
* Get the Studio Agent instance
|
|
264
|
+
*/
|
|
265
|
+
function getStudioAgent() {
|
|
266
|
+
return studioAgent;
|
|
267
|
+
}
|
package/lib/cjs/index.js
CHANGED
|
@@ -14,4 +14,4 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
|
14
14
|
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
15
|
};
|
|
16
16
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
-
__exportStar(require("./adapter-express"), exports);
|
|
17
|
+
__exportStar(require("./adapter-express/index.js"), exports);
|
|
@@ -12,7 +12,9 @@
|
|
|
12
12
|
* class Application extends ApplicationBase {
|
|
13
13
|
* protected configureServices() { //... }
|
|
14
14
|
* protected postServerInitialization() { //... }
|
|
15
|
-
* protected serverShutdown() {
|
|
15
|
+
* protected serverShutdown(signal) {
|
|
16
|
+
* console.log(`Shutting down due to ${signal}`);
|
|
17
|
+
* }
|
|
16
18
|
* }
|
|
17
19
|
*
|
|
18
20
|
* @export
|
|
@@ -21,15 +23,18 @@
|
|
|
21
23
|
export declare abstract class ApplicationBase {
|
|
22
24
|
/**
|
|
23
25
|
* Implement this method to set up global configurations for the server.
|
|
24
|
-
* This method is called before any other
|
|
25
|
-
* Use this method to configure global settings
|
|
26
|
-
*
|
|
26
|
+
* This method is called synchronously in the constructor before any other
|
|
27
|
+
* server initialization methods. Use this method to configure global settings
|
|
28
|
+
* that apply to the entire server application.
|
|
29
|
+
*
|
|
30
|
+
* Note: This method is synchronous and called during object construction.
|
|
31
|
+
* For asynchronous initialization, use `configureServices()` instead.
|
|
27
32
|
*
|
|
28
33
|
* @abstract
|
|
29
|
-
* @returns {void
|
|
34
|
+
* @returns {void}
|
|
30
35
|
* @public API
|
|
31
36
|
*/
|
|
32
|
-
protected abstract globalConfiguration(): void
|
|
37
|
+
protected abstract globalConfiguration(): void;
|
|
33
38
|
/**
|
|
34
39
|
* Implement this method to set up required services or configurations before
|
|
35
40
|
* the server starts. This is essential for initializing dependencies or settings
|
|
@@ -56,9 +61,17 @@ export declare abstract class ApplicationBase {
|
|
|
56
61
|
* cleanup procedures to ensure a graceful server shutdown. Supports asynchronous
|
|
57
62
|
* cleanup with a Promise.
|
|
58
63
|
*
|
|
64
|
+
* The signal parameter indicates what triggered the shutdown:
|
|
65
|
+
* - SIGTERM: Graceful termination (e.g., Kubernetes pod shutdown)
|
|
66
|
+
* - SIGINT: User interrupt (e.g., Ctrl+C)
|
|
67
|
+
* - SIGHUP: Terminal hangup
|
|
68
|
+
* - SIGQUIT: Quit with core dump
|
|
69
|
+
* - SIGBREAK: Windows break signal
|
|
70
|
+
*
|
|
59
71
|
* @abstract
|
|
72
|
+
* @param signal - The signal that triggered the shutdown (optional for backward compatibility)
|
|
60
73
|
* @returns {void | Promise<void>}
|
|
61
74
|
* @public API
|
|
62
75
|
*/
|
|
63
|
-
protected abstract serverShutdown(): void | Promise<void>;
|
|
76
|
+
protected abstract serverShutdown(signal?: NodeJS.Signals): void | Promise<void>;
|
|
64
77
|
}
|