imposters 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/Program/package.json +6 -0
- package/README.md +365 -0
- package/api/AdminApi/package.json +6 -0
- package/api/ApiErrors/package.json +6 -0
- package/api/ApiSchemas/package.json +6 -0
- package/api/Conversions/package.json +6 -0
- package/api/ImpostersGroup/package.json +6 -0
- package/api/ImpostersHandlers/package.json +6 -0
- package/api/SystemGroup/package.json +6 -0
- package/api/SystemHandlers/package.json +6 -0
- package/bin/imposters +47 -0
- package/cli/Commands/package.json +6 -0
- package/cli/ConfigLoader/package.json +6 -0
- package/client/HandlerHttpClient/package.json +6 -0
- package/client/ImpostersClient/package.json +6 -0
- package/client/testing/package.json +6 -0
- package/dist/cjs/Program.js +4 -0
- package/dist/cjs/Program.js.map +1 -0
- package/dist/cjs/api/AdminApi.js +11 -0
- package/dist/cjs/api/AdminApi.js.map +1 -0
- package/dist/cjs/api/ApiErrors.js +30 -0
- package/dist/cjs/api/ApiErrors.js.map +1 -0
- package/dist/cjs/api/ApiSchemas.js +36 -0
- package/dist/cjs/api/ApiSchemas.js.map +1 -0
- package/dist/cjs/api/Conversions.js +41 -0
- package/dist/cjs/api/Conversions.js.map +1 -0
- package/dist/cjs/api/ImpostersGroup.js +37 -0
- package/dist/cjs/api/ImpostersGroup.js.map +1 -0
- package/dist/cjs/api/ImpostersHandlers.js +361 -0
- package/dist/cjs/api/ImpostersHandlers.js.map +1 -0
- package/dist/cjs/api/SystemGroup.js +12 -0
- package/dist/cjs/api/SystemGroup.js.map +1 -0
- package/dist/cjs/api/SystemHandlers.js +74 -0
- package/dist/cjs/api/SystemHandlers.js.map +1 -0
- package/dist/cjs/cli/Commands.js +104 -0
- package/dist/cjs/cli/Commands.js.map +1 -0
- package/dist/cjs/cli/ConfigLoader.js +34 -0
- package/dist/cjs/cli/ConfigLoader.js.map +1 -0
- package/dist/cjs/client/HandlerHttpClient.js +50 -0
- package/dist/cjs/client/HandlerHttpClient.js.map +1 -0
- package/dist/cjs/client/ImpostersClient.js +20 -0
- package/dist/cjs/client/ImpostersClient.js.map +1 -0
- package/dist/cjs/client/index.js +57 -0
- package/dist/cjs/client/index.js.map +1 -0
- package/dist/cjs/client/testing.js +94 -0
- package/dist/cjs/client/testing.js.map +1 -0
- package/dist/cjs/domain/imposter.js +125 -0
- package/dist/cjs/domain/imposter.js.map +1 -0
- package/dist/cjs/domain/route.js +185 -0
- package/dist/cjs/domain/route.js.map +1 -0
- package/dist/cjs/index.js +106 -0
- package/dist/cjs/index.js.map +1 -0
- package/dist/cjs/layers/ApiLayer.js +18 -0
- package/dist/cjs/layers/ApiLayer.js.map +1 -0
- package/dist/cjs/layers/MainLayer.js +27 -0
- package/dist/cjs/layers/MainLayer.js.map +1 -0
- package/dist/cjs/matching/ExpressionEvaluator.js +103 -0
- package/dist/cjs/matching/ExpressionEvaluator.js.map +1 -0
- package/dist/cjs/matching/RequestMatcher.js +145 -0
- package/dist/cjs/matching/RequestMatcher.js.map +1 -0
- package/dist/cjs/matching/ResponseGenerator.js +80 -0
- package/dist/cjs/matching/ResponseGenerator.js.map +1 -0
- package/dist/cjs/matching/TemplateEngine.js +55 -0
- package/dist/cjs/matching/TemplateEngine.js.map +1 -0
- package/dist/cjs/repositories/ImposterRepository.js +118 -0
- package/dist/cjs/repositories/ImposterRepository.js.map +1 -0
- package/dist/cjs/schemas/ConfigFileSchema.js +44 -0
- package/dist/cjs/schemas/ConfigFileSchema.js.map +1 -0
- package/dist/cjs/schemas/ImposterSchema.js +202 -0
- package/dist/cjs/schemas/ImposterSchema.js.map +1 -0
- package/dist/cjs/schemas/RequestLogSchema.js +51 -0
- package/dist/cjs/schemas/RequestLogSchema.js.map +1 -0
- package/dist/cjs/schemas/StubSchema.js +84 -0
- package/dist/cjs/schemas/StubSchema.js.map +1 -0
- package/dist/cjs/schemas/common.js +67 -0
- package/dist/cjs/schemas/common.js.map +1 -0
- package/dist/cjs/server/AdminServer.js +36 -0
- package/dist/cjs/server/AdminServer.js.map +1 -0
- package/dist/cjs/server/BunServer.js +13 -0
- package/dist/cjs/server/BunServer.js.map +1 -0
- package/dist/cjs/server/FiberManager.js +21 -0
- package/dist/cjs/server/FiberManager.js.map +1 -0
- package/dist/cjs/server/ImposterServer.js +234 -0
- package/dist/cjs/server/ImposterServer.js.map +1 -0
- package/dist/cjs/services/AppConfig.js +18 -0
- package/dist/cjs/services/AppConfig.js.map +1 -0
- package/dist/cjs/services/MetricsService.js +113 -0
- package/dist/cjs/services/MetricsService.js.map +1 -0
- package/dist/cjs/services/PortAllocator.js +50 -0
- package/dist/cjs/services/PortAllocator.js.map +1 -0
- package/dist/cjs/services/ProxyService.js +109 -0
- package/dist/cjs/services/ProxyService.js.map +1 -0
- package/dist/cjs/services/RequestLogger.js +60 -0
- package/dist/cjs/services/RequestLogger.js.map +1 -0
- package/dist/cjs/services/Uuid.js +10 -0
- package/dist/cjs/services/Uuid.js.map +1 -0
- package/dist/cjs/services/UuidLive.js +16 -0
- package/dist/cjs/services/UuidLive.js.map +1 -0
- package/dist/cjs/ui/UiRouter.js +242 -0
- package/dist/cjs/ui/UiRouter.js.map +1 -0
- package/dist/cjs/ui/admin/AdminLayout.js +36 -0
- package/dist/cjs/ui/admin/AdminLayout.js.map +1 -0
- package/dist/cjs/ui/admin/AdminUiRouter.js +155 -0
- package/dist/cjs/ui/admin/AdminUiRouter.js.map +1 -0
- package/dist/cjs/ui/admin/pages/AdminDashboard.js +55 -0
- package/dist/cjs/ui/admin/pages/AdminDashboard.js.map +1 -0
- package/dist/cjs/ui/admin/partials.js +64 -0
- package/dist/cjs/ui/admin/partials.js.map +1 -0
- package/dist/cjs/ui/html.js +42 -0
- package/dist/cjs/ui/html.js.map +1 -0
- package/dist/cjs/ui/layout.js +39 -0
- package/dist/cjs/ui/layout.js.map +1 -0
- package/dist/cjs/ui/pages/dashboard.js +51 -0
- package/dist/cjs/ui/pages/dashboard.js.map +1 -0
- package/dist/cjs/ui/pages/request-detail.js +119 -0
- package/dist/cjs/ui/pages/request-detail.js.map +1 -0
- package/dist/cjs/ui/pages/requests.js +120 -0
- package/dist/cjs/ui/pages/requests.js.map +1 -0
- package/dist/cjs/ui/pages/stubs.js +46 -0
- package/dist/cjs/ui/pages/stubs.js.map +1 -0
- package/dist/cjs/ui/partials.js +104 -0
- package/dist/cjs/ui/partials.js.map +1 -0
- package/dist/dts/Program.d.ts +2 -0
- package/dist/dts/Program.d.ts.map +1 -0
- package/dist/dts/api/AdminApi.d.ts +490 -0
- package/dist/dts/api/AdminApi.d.ts.map +1 -0
- package/dist/dts/api/ApiErrors.d.ts +26 -0
- package/dist/dts/api/ApiErrors.d.ts.map +1 -0
- package/dist/dts/api/ApiSchemas.d.ts +36 -0
- package/dist/dts/api/ApiSchemas.d.ts.map +1 -0
- package/dist/dts/api/Conversions.d.ts +7 -0
- package/dist/dts/api/Conversions.d.ts.map +1 -0
- package/dist/dts/api/ImpostersGroup.d.ts +448 -0
- package/dist/dts/api/ImpostersGroup.d.ts.map +1 -0
- package/dist/dts/api/ImpostersHandlers.d.ts +9 -0
- package/dist/dts/api/ImpostersHandlers.d.ts.map +1 -0
- package/dist/dts/api/SystemGroup.d.ts +46 -0
- package/dist/dts/api/SystemGroup.d.ts.map +1 -0
- package/dist/dts/api/SystemHandlers.d.ts +4 -0
- package/dist/dts/api/SystemHandlers.d.ts.map +1 -0
- package/dist/dts/cli/Commands.d.ts +4 -0
- package/dist/dts/cli/Commands.d.ts.map +1 -0
- package/dist/dts/cli/ConfigLoader.d.ts +13 -0
- package/dist/dts/cli/ConfigLoader.d.ts.map +1 -0
- package/dist/dts/client/HandlerHttpClient.d.ts +5 -0
- package/dist/dts/client/HandlerHttpClient.d.ts.map +1 -0
- package/dist/dts/client/ImpostersClient.d.ts +1868 -0
- package/dist/dts/client/ImpostersClient.d.ts.map +1 -0
- package/dist/dts/client/index.d.ts +6 -0
- package/dist/dts/client/index.d.ts.map +1 -0
- package/dist/dts/client/testing.d.ts +35 -0
- package/dist/dts/client/testing.d.ts.map +1 -0
- package/dist/dts/domain/imposter.d.ts +123 -0
- package/dist/dts/domain/imposter.d.ts.map +1 -0
- package/dist/dts/domain/route.d.ts +128 -0
- package/dist/dts/domain/route.d.ts.map +1 -0
- package/dist/dts/index.d.ts +60 -0
- package/dist/dts/index.d.ts.map +1 -0
- package/dist/dts/layers/ApiLayer.d.ts +3 -0
- package/dist/dts/layers/ApiLayer.d.ts.map +1 -0
- package/dist/dts/layers/MainLayer.d.ts +3 -0
- package/dist/dts/layers/MainLayer.d.ts.map +1 -0
- package/dist/dts/matching/ExpressionEvaluator.d.ts +11 -0
- package/dist/dts/matching/ExpressionEvaluator.d.ts.map +1 -0
- package/dist/dts/matching/RequestMatcher.d.ts +13 -0
- package/dist/dts/matching/RequestMatcher.d.ts.map +1 -0
- package/dist/dts/matching/ResponseGenerator.d.ts +9 -0
- package/dist/dts/matching/ResponseGenerator.d.ts.map +1 -0
- package/dist/dts/matching/TemplateEngine.d.ts +4 -0
- package/dist/dts/matching/TemplateEngine.d.ts.map +1 -0
- package/dist/dts/repositories/ImposterRepository.d.ts +33 -0
- package/dist/dts/repositories/ImposterRepository.d.ts.map +1 -0
- package/dist/dts/schemas/ConfigFileSchema.d.ts +142 -0
- package/dist/dts/schemas/ConfigFileSchema.d.ts.map +1 -0
- package/dist/dts/schemas/ImposterSchema.d.ts +368 -0
- package/dist/dts/schemas/ImposterSchema.d.ts.map +1 -0
- package/dist/dts/schemas/RequestLogSchema.d.ts +36 -0
- package/dist/dts/schemas/RequestLogSchema.d.ts.map +1 -0
- package/dist/dts/schemas/StubSchema.d.ts +112 -0
- package/dist/dts/schemas/StubSchema.d.ts.map +1 -0
- package/dist/dts/schemas/common.d.ts +56 -0
- package/dist/dts/schemas/common.d.ts.map +1 -0
- package/dist/dts/server/AdminServer.d.ts +11 -0
- package/dist/dts/server/AdminServer.d.ts.map +1 -0
- package/dist/dts/server/BunServer.d.ts +17 -0
- package/dist/dts/server/BunServer.d.ts.map +1 -0
- package/dist/dts/server/FiberManager.d.ts +12 -0
- package/dist/dts/server/FiberManager.d.ts.map +1 -0
- package/dist/dts/server/ImposterServer.d.ts +29 -0
- package/dist/dts/server/ImposterServer.d.ts.map +1 -0
- package/dist/dts/services/AppConfig.d.ts +14 -0
- package/dist/dts/services/AppConfig.d.ts.map +1 -0
- package/dist/dts/services/MetricsService.d.ts +26 -0
- package/dist/dts/services/MetricsService.d.ts.map +1 -0
- package/dist/dts/services/PortAllocator.d.ts +29 -0
- package/dist/dts/services/PortAllocator.d.ts.map +1 -0
- package/dist/dts/services/ProxyService.d.ts +24 -0
- package/dist/dts/services/ProxyService.d.ts.map +1 -0
- package/dist/dts/services/RequestLogger.d.ts +23 -0
- package/dist/dts/services/RequestLogger.d.ts.map +1 -0
- package/dist/dts/services/Uuid.d.ts +9 -0
- package/dist/dts/services/Uuid.d.ts.map +1 -0
- package/dist/dts/services/UuidLive.d.ts +4 -0
- package/dist/dts/services/UuidLive.d.ts.map +1 -0
- package/dist/dts/ui/UiRouter.d.ts +15 -0
- package/dist/dts/ui/UiRouter.d.ts.map +1 -0
- package/dist/dts/ui/admin/AdminLayout.d.ts +7 -0
- package/dist/dts/ui/admin/AdminLayout.d.ts.map +1 -0
- package/dist/dts/ui/admin/AdminUiRouter.d.ts +6 -0
- package/dist/dts/ui/admin/AdminUiRouter.d.ts.map +1 -0
- package/dist/dts/ui/admin/pages/AdminDashboard.d.ts +7 -0
- package/dist/dts/ui/admin/pages/AdminDashboard.d.ts.map +1 -0
- package/dist/dts/ui/admin/partials.d.ts +14 -0
- package/dist/dts/ui/admin/partials.d.ts.map +1 -0
- package/dist/dts/ui/html.d.ts +12 -0
- package/dist/dts/ui/html.d.ts.map +1 -0
- package/dist/dts/ui/layout.d.ts +9 -0
- package/dist/dts/ui/layout.d.ts.map +1 -0
- package/dist/dts/ui/pages/dashboard.d.ts +10 -0
- package/dist/dts/ui/pages/dashboard.d.ts.map +1 -0
- package/dist/dts/ui/pages/request-detail.d.ts +11 -0
- package/dist/dts/ui/pages/request-detail.d.ts.map +1 -0
- package/dist/dts/ui/pages/requests.d.ts +15 -0
- package/dist/dts/ui/pages/requests.d.ts.map +1 -0
- package/dist/dts/ui/pages/stubs.d.ts +8 -0
- package/dist/dts/ui/pages/stubs.d.ts.map +1 -0
- package/dist/dts/ui/partials.d.ts +13 -0
- package/dist/dts/ui/partials.d.ts.map +1 -0
- package/dist/esm/Program.js +2 -0
- package/dist/esm/Program.js.map +1 -0
- package/dist/esm/api/AdminApi.js +5 -0
- package/dist/esm/api/AdminApi.js.map +1 -0
- package/dist/esm/api/ApiErrors.js +20 -0
- package/dist/esm/api/ApiErrors.js.map +1 -0
- package/dist/esm/api/ApiSchemas.js +29 -0
- package/dist/esm/api/ApiSchemas.js.map +1 -0
- package/dist/esm/api/Conversions.js +32 -0
- package/dist/esm/api/Conversions.js.map +1 -0
- package/dist/esm/api/ImpostersGroup.js +30 -0
- package/dist/esm/api/ImpostersGroup.js.map +1 -0
- package/dist/esm/api/ImpostersHandlers.js +354 -0
- package/dist/esm/api/ImpostersHandlers.js.map +1 -0
- package/dist/esm/api/SystemGroup.js +6 -0
- package/dist/esm/api/SystemGroup.js.map +1 -0
- package/dist/esm/api/SystemHandlers.js +67 -0
- package/dist/esm/api/SystemHandlers.js.map +1 -0
- package/dist/esm/cli/Commands.js +98 -0
- package/dist/esm/cli/Commands.js.map +1 -0
- package/dist/esm/cli/ConfigLoader.js +25 -0
- package/dist/esm/cli/ConfigLoader.js.map +1 -0
- package/dist/esm/client/HandlerHttpClient.js +42 -0
- package/dist/esm/client/HandlerHttpClient.js.map +1 -0
- package/dist/esm/client/ImpostersClient.js +10 -0
- package/dist/esm/client/ImpostersClient.js.map +1 -0
- package/dist/esm/client/index.js +4 -0
- package/dist/esm/client/index.js.map +1 -0
- package/dist/esm/client/testing.js +86 -0
- package/dist/esm/client/testing.js.map +1 -0
- package/dist/esm/domain/imposter.js +103 -0
- package/dist/esm/domain/imposter.js.map +1 -0
- package/dist/esm/domain/route.js +164 -0
- package/dist/esm/domain/route.js.map +1 -0
- package/dist/esm/index.js +60 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/layers/ApiLayer.js +11 -0
- package/dist/esm/layers/ApiLayer.js.map +1 -0
- package/dist/esm/layers/MainLayer.js +20 -0
- package/dist/esm/layers/MainLayer.js.map +1 -0
- package/dist/esm/matching/ExpressionEvaluator.js +94 -0
- package/dist/esm/matching/ExpressionEvaluator.js.map +1 -0
- package/dist/esm/matching/RequestMatcher.js +135 -0
- package/dist/esm/matching/RequestMatcher.js.map +1 -0
- package/dist/esm/matching/ResponseGenerator.js +71 -0
- package/dist/esm/matching/ResponseGenerator.js.map +1 -0
- package/dist/esm/matching/TemplateEngine.js +47 -0
- package/dist/esm/matching/TemplateEngine.js.map +1 -0
- package/dist/esm/package.json +4 -0
- package/dist/esm/repositories/ImposterRepository.js +110 -0
- package/dist/esm/repositories/ImposterRepository.js.map +1 -0
- package/dist/esm/schemas/ConfigFileSchema.js +37 -0
- package/dist/esm/schemas/ConfigFileSchema.js.map +1 -0
- package/dist/esm/schemas/ImposterSchema.js +195 -0
- package/dist/esm/schemas/ImposterSchema.js.map +1 -0
- package/dist/esm/schemas/RequestLogSchema.js +44 -0
- package/dist/esm/schemas/RequestLogSchema.js.map +1 -0
- package/dist/esm/schemas/StubSchema.js +77 -0
- package/dist/esm/schemas/StubSchema.js.map +1 -0
- package/dist/esm/schemas/common.js +59 -0
- package/dist/esm/schemas/common.js.map +1 -0
- package/dist/esm/server/AdminServer.js +27 -0
- package/dist/esm/server/AdminServer.js.map +1 -0
- package/dist/esm/server/BunServer.js +6 -0
- package/dist/esm/server/BunServer.js.map +1 -0
- package/dist/esm/server/FiberManager.js +14 -0
- package/dist/esm/server/FiberManager.js.map +1 -0
- package/dist/esm/server/ImposterServer.js +225 -0
- package/dist/esm/server/ImposterServer.js.map +1 -0
- package/dist/esm/services/AppConfig.js +11 -0
- package/dist/esm/services/AppConfig.js.map +1 -0
- package/dist/esm/services/MetricsService.js +105 -0
- package/dist/esm/services/MetricsService.js.map +1 -0
- package/dist/esm/services/PortAllocator.js +41 -0
- package/dist/esm/services/PortAllocator.js.map +1 -0
- package/dist/esm/services/ProxyService.js +101 -0
- package/dist/esm/services/ProxyService.js.map +1 -0
- package/dist/esm/services/RequestLogger.js +53 -0
- package/dist/esm/services/RequestLogger.js.map +1 -0
- package/dist/esm/services/Uuid.js +3 -0
- package/dist/esm/services/Uuid.js.map +1 -0
- package/dist/esm/services/UuidLive.js +9 -0
- package/dist/esm/services/UuidLive.js.map +1 -0
- package/dist/esm/ui/UiRouter.js +235 -0
- package/dist/esm/ui/UiRouter.js.map +1 -0
- package/dist/esm/ui/admin/AdminLayout.js +29 -0
- package/dist/esm/ui/admin/AdminLayout.js.map +1 -0
- package/dist/esm/ui/admin/AdminUiRouter.js +148 -0
- package/dist/esm/ui/admin/AdminUiRouter.js.map +1 -0
- package/dist/esm/ui/admin/pages/AdminDashboard.js +48 -0
- package/dist/esm/ui/admin/pages/AdminDashboard.js.map +1 -0
- package/dist/esm/ui/admin/partials.js +54 -0
- package/dist/esm/ui/admin/partials.js.map +1 -0
- package/dist/esm/ui/html.js +32 -0
- package/dist/esm/ui/html.js.map +1 -0
- package/dist/esm/ui/layout.js +32 -0
- package/dist/esm/ui/layout.js.map +1 -0
- package/dist/esm/ui/pages/dashboard.js +44 -0
- package/dist/esm/ui/pages/dashboard.js.map +1 -0
- package/dist/esm/ui/pages/request-detail.js +112 -0
- package/dist/esm/ui/pages/request-detail.js.map +1 -0
- package/dist/esm/ui/pages/requests.js +112 -0
- package/dist/esm/ui/pages/requests.js.map +1 -0
- package/dist/esm/ui/pages/stubs.js +39 -0
- package/dist/esm/ui/pages/stubs.js.map +1 -0
- package/dist/esm/ui/partials.js +91 -0
- package/dist/esm/ui/partials.js.map +1 -0
- package/domain/imposter/package.json +6 -0
- package/domain/route/package.json +6 -0
- package/layers/ApiLayer/package.json +6 -0
- package/layers/MainLayer/package.json +6 -0
- package/matching/ExpressionEvaluator/package.json +6 -0
- package/matching/RequestMatcher/package.json +6 -0
- package/matching/ResponseGenerator/package.json +6 -0
- package/matching/TemplateEngine/package.json +6 -0
- package/package.json +435 -0
- package/repositories/ImposterRepository/package.json +6 -0
- package/schemas/ConfigFileSchema/package.json +6 -0
- package/schemas/ImposterSchema/package.json +6 -0
- package/schemas/RequestLogSchema/package.json +6 -0
- package/schemas/StubSchema/package.json +6 -0
- package/schemas/common/package.json +6 -0
- package/server/AdminServer/package.json +6 -0
- package/server/BunServer/package.json +6 -0
- package/server/FiberManager/package.json +6 -0
- package/server/ImposterServer/package.json +6 -0
- package/services/AppConfig/package.json +6 -0
- package/services/MetricsService/package.json +6 -0
- package/services/PortAllocator/package.json +6 -0
- package/services/ProxyService/package.json +6 -0
- package/services/RequestLogger/package.json +6 -0
- package/services/Uuid/package.json +6 -0
- package/services/UuidLive/package.json +6 -0
- package/src/Program.ts +1 -0
- package/src/api/AdminApi.ts +7 -0
- package/src/api/ApiErrors.ts +20 -0
- package/src/api/ApiSchemas.ts +36 -0
- package/src/api/Conversions.ts +34 -0
- package/src/api/ImpostersGroup.ts +103 -0
- package/src/api/ImpostersHandlers.ts +387 -0
- package/src/api/SystemGroup.ts +12 -0
- package/src/api/SystemHandlers.ts +76 -0
- package/src/cli/Commands.ts +119 -0
- package/src/cli/ConfigLoader.ts +41 -0
- package/src/client/HandlerHttpClient.ts +50 -0
- package/src/client/ImpostersClient.ts +21 -0
- package/src/client/index.ts +9 -0
- package/src/client/testing.ts +105 -0
- package/src/domain/imposter.ts +186 -0
- package/src/domain/route.ts +255 -0
- package/src/index.ts +153 -0
- package/src/layers/ApiLayer.ts +21 -0
- package/src/layers/MainLayer.ts +43 -0
- package/src/matching/ExpressionEvaluator.ts +102 -0
- package/src/matching/RequestMatcher.ts +162 -0
- package/src/matching/ResponseGenerator.ts +86 -0
- package/src/matching/TemplateEngine.ts +54 -0
- package/src/repositories/ImposterRepository.ts +145 -0
- package/src/schemas/ConfigFileSchema.ts +32 -0
- package/src/schemas/ImposterSchema.ts +232 -0
- package/src/schemas/RequestLogSchema.ts +38 -0
- package/src/schemas/StubSchema.ts +90 -0
- package/src/schemas/common.ts +95 -0
- package/src/server/AdminServer.ts +22 -0
- package/src/server/BunServer.ts +19 -0
- package/src/server/FiberManager.ts +25 -0
- package/src/server/ImposterServer.ts +244 -0
- package/src/services/AppConfig.ts +22 -0
- package/src/services/MetricsService.ts +157 -0
- package/src/services/PortAllocator.ts +68 -0
- package/src/services/ProxyService.ts +139 -0
- package/src/services/RequestLogger.ts +87 -0
- package/src/services/Uuid.ts +9 -0
- package/src/services/UuidLive.ts +9 -0
- package/src/types/bun.d.ts +6 -0
- package/src/ui/UiRouter.ts +278 -0
- package/src/ui/admin/AdminLayout.ts +36 -0
- package/src/ui/admin/AdminUiRouter.ts +170 -0
- package/src/ui/admin/pages/AdminDashboard.ts +54 -0
- package/src/ui/admin/partials.ts +83 -0
- package/src/ui/html.ts +37 -0
- package/src/ui/layout.ts +44 -0
- package/src/ui/pages/dashboard.ts +64 -0
- package/src/ui/pages/request-detail.ts +142 -0
- package/src/ui/pages/requests.ts +141 -0
- package/src/ui/pages/stubs.ts +52 -0
- package/src/ui/partials.ts +133 -0
- package/ui/UiRouter/package.json +6 -0
- package/ui/admin/AdminLayout/package.json +6 -0
- package/ui/admin/AdminUiRouter/package.json +6 -0
- package/ui/admin/pages/AdminDashboard/package.json +6 -0
- package/ui/admin/partials/package.json +6 -0
- package/ui/html/package.json +6 -0
- package/ui/layout/package.json +6 -0
- package/ui/pages/dashboard/package.json +6 -0
- package/ui/pages/requests/package.json +6 -0
- package/ui/pages/stubs/package.json +6 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"requests.d.ts","sourceRoot":"","sources":["../../../../src/ui/pages/requests.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAA;AAC3D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAA;AAErE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAA;AAIvC,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,MAAM,EAAE,cAAc,CAAA;IAC/B,QAAQ,CAAC,OAAO,EAAE,aAAa,CAAC,eAAe,CAAC,CAAA;CACjD;AAyED,eAAO,MAAM,YAAY,GAAI,MAAM,gBAAgB,KAAG,QAgCrD,CAAA;AAED,eAAO,MAAM,iBAAiB,GAC5B,QAAQ;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,KAC1F,QAqBF,CAAA"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { ImposterConfig } from "../../domain/imposter";
|
|
2
|
+
import type { Stub } from "../../schemas/StubSchema";
|
|
3
|
+
export interface StubsPageData {
|
|
4
|
+
readonly config: ImposterConfig;
|
|
5
|
+
readonly stubs: ReadonlyArray<Stub>;
|
|
6
|
+
}
|
|
7
|
+
export declare const stubsPage: (data: StubsPageData) => import("../html").SafeHtml;
|
|
8
|
+
//# sourceMappingURL=stubs.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stubs.d.ts","sourceRoot":"","sources":["../../../../src/ui/pages/stubs.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAA;AAC3D,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,0BAA0B,CAAA;AAKpD,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,MAAM,EAAE,cAAc,CAAA;IAC/B,QAAQ,CAAC,KAAK,EAAE,aAAa,CAAC,IAAI,CAAC,CAAA;CACpC;AA0BD,eAAO,MAAM,SAAS,GAAI,MAAM,aAAa,+BAgB5C,CAAA"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { RequestLogEntry } from "../schemas/RequestLogSchema";
|
|
2
|
+
import type { Stub } from "../schemas/StubSchema";
|
|
3
|
+
import type { SafeHtml } from "./html";
|
|
4
|
+
export declare const stubCardPartial: (stub: Stub) => SafeHtml;
|
|
5
|
+
export declare const stubListPartial: (stubs: ReadonlyArray<Stub>) => SafeHtml;
|
|
6
|
+
export declare const emptyStubMessage: () => SafeHtml;
|
|
7
|
+
export declare const errorPartial: (message: string) => SafeHtml;
|
|
8
|
+
export declare const methodBadge: (method: string) => SafeHtml;
|
|
9
|
+
export declare const statusBadge: (status: number) => SafeHtml;
|
|
10
|
+
export declare const requestTablePartial: (entries: ReadonlyArray<RequestLogEntry>, opts?: {
|
|
11
|
+
linkToDetail?: boolean;
|
|
12
|
+
}) => SafeHtml;
|
|
13
|
+
//# sourceMappingURL=partials.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"partials.d.ts","sourceRoot":"","sources":["../../../src/ui/partials.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAA;AAClE,OAAO,KAAK,EAAkB,IAAI,EAAE,MAAM,uBAAuB,CAAA;AAEjE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAA;AAiCtC,eAAO,MAAM,eAAe,GAAI,MAAM,IAAI,KAAG,QA2B5C,CAAA;AAED,eAAO,MAAM,eAAe,GAAI,OAAO,aAAa,CAAC,IAAI,CAAC,KAAG,QAQ5D,CAAA;AAED,eAAO,MAAM,gBAAgB,QAAO,QACqD,CAAA;AAEzF,eAAO,MAAM,YAAY,GAAI,SAAS,MAAM,KAAG,QACoD,CAAA;AAEnG,eAAO,MAAM,WAAW,GAAI,QAAQ,MAAM,KAAG,QAY5C,CAAA;AAED,eAAO,MAAM,WAAW,GAAI,QAAQ,MAAM,KAAG,QAO5C,CAAA;AAED,eAAO,MAAM,mBAAmB,GAC9B,SAAS,aAAa,CAAC,eAAe,CAAC,EACvC,OAAO;IAAE,YAAY,CAAC,EAAE,OAAO,CAAA;CAAE,KAChC,QAyBF,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Program.js","names":[],"sources":["../../src/Program.ts"],"sourcesContent":[null],"mappings":"AAAA,OAAO,mBAAmB","ignoreList":[]}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { HttpApi } from "@effect/platform";
|
|
2
|
+
import { ImpostersGroup } from "./ImpostersGroup";
|
|
3
|
+
import { SystemGroup } from "./SystemGroup";
|
|
4
|
+
export const AdminApi = /*#__PURE__*/HttpApi.make("admin").add(ImpostersGroup).add(SystemGroup);
|
|
5
|
+
//# sourceMappingURL=AdminApi.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AdminApi.js","names":["HttpApi","ImpostersGroup","SystemGroup","AdminApi","make","add"],"sources":["../../../src/api/AdminApi.ts"],"sourcesContent":[null],"mappings":"AAAA,SAASA,OAAO,QAAQ,kBAAkB;AAC1C,SAASC,cAAc,QAAQ,kBAAkB;AACjD,SAASC,WAAW,QAAQ,eAAe;AAE3C,OAAO,MAAMC,QAAQ,gBAAGH,OAAO,CAACI,IAAI,CAAC,OAAO,CAAC,CAC1CC,GAAG,CAACJ,cAAc,CAAC,CACnBI,GAAG,CAACH,WAAW,CAAC","ignoreList":[]}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { HttpApiSchema } from "@effect/platform";
|
|
2
|
+
import * as Schema from "effect/Schema";
|
|
3
|
+
export class ApiNotFoundError extends Schema.TaggedError()("ApiNotFoundError", {
|
|
4
|
+
message: Schema.String,
|
|
5
|
+
resourceType: Schema.String,
|
|
6
|
+
resourceId: Schema.String
|
|
7
|
+
}, HttpApiSchema.annotations({
|
|
8
|
+
status: 404
|
|
9
|
+
})) {}
|
|
10
|
+
export class ApiConflictError extends Schema.TaggedError()("ApiConflictError", {
|
|
11
|
+
message: Schema.String
|
|
12
|
+
}, HttpApiSchema.annotations({
|
|
13
|
+
status: 409
|
|
14
|
+
})) {}
|
|
15
|
+
export class ApiServiceError extends Schema.TaggedError()("ApiServiceError", {
|
|
16
|
+
message: Schema.String
|
|
17
|
+
}, HttpApiSchema.annotations({
|
|
18
|
+
status: 503
|
|
19
|
+
})) {}
|
|
20
|
+
//# sourceMappingURL=ApiErrors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ApiErrors.js","names":["HttpApiSchema","Schema","ApiNotFoundError","TaggedError","message","String","resourceType","resourceId","annotations","status","ApiConflictError","ApiServiceError"],"sources":["../../../src/api/ApiErrors.ts"],"sourcesContent":[null],"mappings":"AAAA,SAASA,aAAa,QAAQ,kBAAkB;AAChD,OAAO,KAAKC,MAAM,MAAM,eAAe;AAEvC,OAAM,MAAOC,gBAAiB,SAAQD,MAAM,CAACE,WAAW,EAAoB,CAC1E,kBAAkB,EAClB;EAAEC,OAAO,EAAEH,MAAM,CAACI,MAAM;EAAEC,YAAY,EAAEL,MAAM,CAACI,MAAM;EAAEE,UAAU,EAAEN,MAAM,CAACI;AAAM,CAAE,EAClFL,aAAa,CAACQ,WAAW,CAAC;EAAEC,MAAM,EAAE;AAAG,CAAE,CAAC,CAC3C;AAED,OAAM,MAAOC,gBAAiB,SAAQT,MAAM,CAACE,WAAW,EAAoB,CAC1E,kBAAkB,EAClB;EAAEC,OAAO,EAAEH,MAAM,CAACI;AAAM,CAAE,EAC1BL,aAAa,CAACQ,WAAW,CAAC;EAAEC,MAAM,EAAE;AAAG,CAAE,CAAC,CAC3C;AAED,OAAM,MAAOE,eAAgB,SAAQV,MAAM,CAACE,WAAW,EAAmB,CACxE,iBAAiB,EACjB;EAAEC,OAAO,EAAEH,MAAM,CAACI;AAAM,CAAE,EAC1BL,aAAa,CAACQ,WAAW,CAAC;EAAEC,MAAM,EAAE;AAAG,CAAE,CAAC,CAC3C","ignoreList":[]}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import * as Schema from "effect/Schema";
|
|
2
|
+
import { ImposterStatus, Protocol } from "../schemas/common";
|
|
3
|
+
export const PaginationUrlParams = /*#__PURE__*/Schema.Struct({
|
|
4
|
+
limit: /*#__PURE__*/Schema.optionalWith(/*#__PURE__*/Schema.NumberFromString.pipe(/*#__PURE__*/Schema.int(), /*#__PURE__*/Schema.positive()), {
|
|
5
|
+
default: () => 50
|
|
6
|
+
}),
|
|
7
|
+
offset: /*#__PURE__*/Schema.optionalWith(/*#__PURE__*/Schema.NumberFromString.pipe(/*#__PURE__*/Schema.int(), /*#__PURE__*/Schema.nonNegative()), {
|
|
8
|
+
default: () => 0
|
|
9
|
+
})
|
|
10
|
+
});
|
|
11
|
+
export const ListImpostersUrlParams = /*#__PURE__*/Schema.Struct({
|
|
12
|
+
...PaginationUrlParams.fields,
|
|
13
|
+
status: /*#__PURE__*/Schema.optional(ImposterStatus),
|
|
14
|
+
protocol: /*#__PURE__*/Schema.optional(Protocol)
|
|
15
|
+
});
|
|
16
|
+
export const DeleteImposterUrlParams = /*#__PURE__*/Schema.Struct({
|
|
17
|
+
force: /*#__PURE__*/Schema.optionalWith(Schema.BooleanFromString, {
|
|
18
|
+
default: () => false
|
|
19
|
+
})
|
|
20
|
+
});
|
|
21
|
+
export const ListRequestsUrlParams = /*#__PURE__*/Schema.Struct({
|
|
22
|
+
limit: /*#__PURE__*/Schema.optionalWith(/*#__PURE__*/Schema.NumberFromString.pipe(/*#__PURE__*/Schema.int(), /*#__PURE__*/Schema.positive()), {
|
|
23
|
+
default: () => 50
|
|
24
|
+
}),
|
|
25
|
+
method: /*#__PURE__*/Schema.optional(Schema.String),
|
|
26
|
+
path: /*#__PURE__*/Schema.optional(Schema.String),
|
|
27
|
+
status: /*#__PURE__*/Schema.optional(Schema.NumberFromString)
|
|
28
|
+
});
|
|
29
|
+
//# sourceMappingURL=ApiSchemas.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ApiSchemas.js","names":["Schema","ImposterStatus","Protocol","PaginationUrlParams","Struct","limit","optionalWith","NumberFromString","pipe","int","positive","default","offset","nonNegative","ListImpostersUrlParams","fields","status","optional","protocol","DeleteImposterUrlParams","force","BooleanFromString","ListRequestsUrlParams","method","String","path"],"sources":["../../../src/api/ApiSchemas.ts"],"sourcesContent":[null],"mappings":"AAAA,OAAO,KAAKA,MAAM,MAAM,eAAe;AACvC,SAASC,cAAc,EAAEC,QAAQ,QAAQ,mBAAmB;AAE5D,OAAO,MAAMC,mBAAmB,gBAAGH,MAAM,CAACI,MAAM,CAAC;EAC/CC,KAAK,eAAEL,MAAM,CAACM,YAAY,cACxBN,MAAM,CAACO,gBAAgB,CAACC,IAAI,cAACR,MAAM,CAACS,GAAG,EAAE,eAAET,MAAM,CAACU,QAAQ,EAAE,CAAC,EAC7D;IAAEC,OAAO,EAAEA,CAAA,KAAM;EAAE,CAAE,CACtB;EACDC,MAAM,eAAEZ,MAAM,CAACM,YAAY,cACzBN,MAAM,CAACO,gBAAgB,CAACC,IAAI,cAACR,MAAM,CAACS,GAAG,EAAE,eAAET,MAAM,CAACa,WAAW,EAAE,CAAC,EAChE;IAAEF,OAAO,EAAEA,CAAA,KAAM;EAAC,CAAE;CAEvB,CAAC;AAEF,OAAO,MAAMG,sBAAsB,gBAAGd,MAAM,CAACI,MAAM,CAAC;EAClD,GAAGD,mBAAmB,CAACY,MAAM;EAC7BC,MAAM,eAAEhB,MAAM,CAACiB,QAAQ,CAAChB,cAAc,CAAC;EACvCiB,QAAQ,eAAElB,MAAM,CAACiB,QAAQ,CAACf,QAAQ;CACnC,CAAC;AAGF,OAAO,MAAMiB,uBAAuB,gBAAGnB,MAAM,CAACI,MAAM,CAAC;EACnDgB,KAAK,eAAEpB,MAAM,CAACM,YAAY,CAACN,MAAM,CAACqB,iBAAiB,EAAE;IAAEV,OAAO,EAAEA,CAAA,KAAM;EAAK,CAAE;CAC9E,CAAC;AAGF,OAAO,MAAMW,qBAAqB,gBAAGtB,MAAM,CAACI,MAAM,CAAC;EACjDC,KAAK,eAAEL,MAAM,CAACM,YAAY,cACxBN,MAAM,CAACO,gBAAgB,CAACC,IAAI,cAACR,MAAM,CAACS,GAAG,EAAE,eAAET,MAAM,CAACU,QAAQ,EAAE,CAAC,EAC7D;IAAEC,OAAO,EAAEA,CAAA,KAAM;EAAE,CAAE,CACtB;EACDY,MAAM,eAAEvB,MAAM,CAACiB,QAAQ,CAACjB,MAAM,CAACwB,MAAM,CAAC;EACtCC,IAAI,eAAEzB,MAAM,CAACiB,QAAQ,CAACjB,MAAM,CAACwB,MAAM,CAAC;EACpCR,MAAM,eAAEhB,MAAM,CAACiB,QAAQ,CAACjB,MAAM,CAACO,gBAAgB;CAChD,CAAC","ignoreList":[]}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import * as Clock from "effect/Clock";
|
|
2
|
+
import * as DateTime from "effect/DateTime";
|
|
3
|
+
import * as Duration from "effect/Duration";
|
|
4
|
+
import * as Effect from "effect/Effect";
|
|
5
|
+
import { NonEmptyString, PortNumber, PositiveInteger } from "../schemas/common";
|
|
6
|
+
export const toImposterResponse = record => Effect.gen(function* () {
|
|
7
|
+
const config = record.config;
|
|
8
|
+
const now = yield* Clock.currentTimeMillis;
|
|
9
|
+
const uptime = Duration.millis(now - DateTime.toEpochMillis(config.createdAt));
|
|
10
|
+
return {
|
|
11
|
+
id: NonEmptyString.make(config.id),
|
|
12
|
+
name: NonEmptyString.make(config.name),
|
|
13
|
+
port: PortNumber.make(config.port),
|
|
14
|
+
protocol: "HTTP",
|
|
15
|
+
status: config.status,
|
|
16
|
+
endpointCount: record.stubs.length,
|
|
17
|
+
createdAt: config.createdAt,
|
|
18
|
+
adminUrl: NonEmptyString.make(`http://localhost:${config.port}`),
|
|
19
|
+
adminPath: NonEmptyString.make("/_admin"),
|
|
20
|
+
uptime: Duration.format(uptime),
|
|
21
|
+
...(config.proxy !== undefined ? {
|
|
22
|
+
proxy: config.proxy
|
|
23
|
+
} : {})
|
|
24
|
+
};
|
|
25
|
+
});
|
|
26
|
+
export const buildPaginationMeta = (total, limit, offset) => ({
|
|
27
|
+
total,
|
|
28
|
+
limit: PositiveInteger.make(limit),
|
|
29
|
+
offset,
|
|
30
|
+
hasMore: offset + limit < total
|
|
31
|
+
});
|
|
32
|
+
//# sourceMappingURL=Conversions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Conversions.js","names":["Clock","DateTime","Duration","Effect","NonEmptyString","PortNumber","PositiveInteger","toImposterResponse","record","gen","config","now","currentTimeMillis","uptime","millis","toEpochMillis","createdAt","id","make","name","port","protocol","status","endpointCount","stubs","length","adminUrl","adminPath","format","proxy","undefined","buildPaginationMeta","total","limit","offset","hasMore"],"sources":["../../../src/api/Conversions.ts"],"sourcesContent":[null],"mappings":"AAAA,OAAO,KAAKA,KAAK,MAAM,cAAc;AACrC,OAAO,KAAKC,QAAQ,MAAM,iBAAiB;AAC3C,OAAO,KAAKC,QAAQ,MAAM,iBAAiB;AAC3C,OAAO,KAAKC,MAAM,MAAM,eAAe;AAEvC,SAASC,cAAc,EAAuBC,UAAU,EAAEC,eAAe,QAAQ,mBAAmB;AAGpG,OAAO,MAAMC,kBAAkB,GAAIC,MAAsB,IACvDL,MAAM,CAACM,GAAG,CAAC,aAAS;EAClB,MAAMC,MAAM,GAAGF,MAAM,CAACE,MAAM;EAC5B,MAAMC,GAAG,GAAG,OAAOX,KAAK,CAACY,iBAAiB;EAC1C,MAAMC,MAAM,GAAGX,QAAQ,CAACY,MAAM,CAACH,GAAG,GAAGV,QAAQ,CAACc,aAAa,CAACL,MAAM,CAACM,SAAS,CAAC,CAAC;EAC9E,OAAO;IACLC,EAAE,EAAEb,cAAc,CAACc,IAAI,CAACR,MAAM,CAACO,EAAE,CAAC;IAClCE,IAAI,EAAEf,cAAc,CAACc,IAAI,CAACR,MAAM,CAACS,IAAI,CAAC;IACtCC,IAAI,EAAEf,UAAU,CAACa,IAAI,CAACR,MAAM,CAACU,IAAI,CAAC;IAClCC,QAAQ,EAAE,MAAe;IACzBC,MAAM,EAAEZ,MAAM,CAACY,MAAM;IACrBC,aAAa,EAAEf,MAAM,CAACgB,KAAK,CAACC,MAAM;IAClCT,SAAS,EAAEN,MAAM,CAACM,SAAS;IAC3BU,QAAQ,EAAEtB,cAAc,CAACc,IAAI,CAAC,oBAAoBR,MAAM,CAACU,IAAI,EAAE,CAAC;IAChEO,SAAS,EAAEvB,cAAc,CAACc,IAAI,CAAC,SAAS,CAAC;IACzCL,MAAM,EAAEX,QAAQ,CAAC0B,MAAM,CAACf,MAAM,CAAC;IAC/B,IAAIH,MAAM,CAACmB,KAAK,KAAKC,SAAS,GAAG;MAAED,KAAK,EAAEnB,MAAM,CAACmB;IAAK,CAAE,GAAG,EAAE;GAC9D;AACH,CAAC,CAAC;AAEJ,OAAO,MAAME,mBAAmB,GAAGA,CAACC,KAAa,EAAEC,KAAa,EAAEC,MAAc,MAAsB;EACpGF,KAAK;EACLC,KAAK,EAAE3B,eAAe,CAACY,IAAI,CAACe,KAAK,CAAC;EAClCC,MAAM;EACNC,OAAO,EAAED,MAAM,GAAGD,KAAK,GAAGD;CAC3B,CAAC","ignoreList":[]}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { HttpApiEndpoint, HttpApiGroup, HttpApiSchema } from "@effect/platform";
|
|
2
|
+
import * as Schema from "effect/Schema";
|
|
3
|
+
import { CreateImposterRequest, DeleteImposterResponse, ImposterResponse, ListImpostersResponse, Statistics, UpdateImposterRequest } from "../schemas/ImposterSchema";
|
|
4
|
+
import { RequestLogEntry } from "../schemas/RequestLogSchema";
|
|
5
|
+
import { CreateStubRequest, Stub, UpdateStubRequest } from "../schemas/StubSchema";
|
|
6
|
+
import { ApiConflictError, ApiNotFoundError, ApiServiceError } from "./ApiErrors";
|
|
7
|
+
import { DeleteImposterUrlParams, ListImpostersUrlParams, ListRequestsUrlParams } from "./ApiSchemas";
|
|
8
|
+
const createImposter = /*#__PURE__*/HttpApiEndpoint.post("createImposter", "/imposters").setPayload(CreateImposterRequest).addSuccess(ImposterResponse, {
|
|
9
|
+
status: 201
|
|
10
|
+
}).addError(ApiConflictError).addError(ApiServiceError);
|
|
11
|
+
const listImposters = /*#__PURE__*/HttpApiEndpoint.get("listImposters", "/imposters").setUrlParams(ListImpostersUrlParams).addSuccess(ListImpostersResponse);
|
|
12
|
+
const getImposter = /*#__PURE__*/HttpApiEndpoint.get("getImposter")`/imposters/${HttpApiSchema.param("id", Schema.String)}`.addSuccess(ImposterResponse).addError(ApiNotFoundError);
|
|
13
|
+
const updateImposter = /*#__PURE__*/HttpApiEndpoint.patch("updateImposter")`/imposters/${HttpApiSchema.param("id", Schema.String)}`.setPayload(UpdateImposterRequest).addSuccess(ImposterResponse).addError(ApiNotFoundError).addError(ApiConflictError).addError(ApiServiceError);
|
|
14
|
+
const deleteImposter = /*#__PURE__*/HttpApiEndpoint.del("deleteImposter")`/imposters/${HttpApiSchema.param("id", Schema.String)}`.setUrlParams(DeleteImposterUrlParams).addSuccess(DeleteImposterResponse).addError(ApiNotFoundError).addError(ApiConflictError);
|
|
15
|
+
const addStub = /*#__PURE__*/HttpApiEndpoint.post("addStub")`/imposters/${HttpApiSchema.param("imposterId", Schema.String)}/stubs`.setPayload(CreateStubRequest).addSuccess(Stub, {
|
|
16
|
+
status: 201
|
|
17
|
+
}).addError(ApiNotFoundError);
|
|
18
|
+
const listStubs = /*#__PURE__*/HttpApiEndpoint.get("listStubs")`/imposters/${HttpApiSchema.param("imposterId", Schema.String)}/stubs`.addSuccess(Schema.Array(Stub)).addError(ApiNotFoundError);
|
|
19
|
+
const updateStub = /*#__PURE__*/HttpApiEndpoint.put("updateStub")`/imposters/${HttpApiSchema.param("imposterId", Schema.String)}/stubs/${HttpApiSchema.param("stubId", Schema.String)}`.setPayload(UpdateStubRequest).addSuccess(Stub).addError(ApiNotFoundError);
|
|
20
|
+
const deleteStub = /*#__PURE__*/HttpApiEndpoint.del("deleteStub")`/imposters/${HttpApiSchema.param("imposterId", Schema.String)}/stubs/${HttpApiSchema.param("stubId", Schema.String)}`.addSuccess(Stub).addError(ApiNotFoundError);
|
|
21
|
+
const listRequests = /*#__PURE__*/HttpApiEndpoint.get("listRequests")`/imposters/${HttpApiSchema.param("id", Schema.String)}/requests`.setUrlParams(ListRequestsUrlParams).addSuccess(Schema.Array(RequestLogEntry)).addError(ApiNotFoundError);
|
|
22
|
+
const clearRequests = /*#__PURE__*/HttpApiEndpoint.del("clearRequests")`/imposters/${HttpApiSchema.param("id", Schema.String)}/requests`.addSuccess(Schema.Struct({
|
|
23
|
+
message: Schema.String
|
|
24
|
+
})).addError(ApiNotFoundError);
|
|
25
|
+
const getImposterStats = /*#__PURE__*/HttpApiEndpoint.get("getImposterStats")`/imposters/${HttpApiSchema.param("id", Schema.String)}/stats`.addSuccess(Statistics).addError(ApiNotFoundError);
|
|
26
|
+
const resetImposterStats = /*#__PURE__*/HttpApiEndpoint.del("resetImposterStats")`/imposters/${HttpApiSchema.param("id", Schema.String)}/stats`.addSuccess(Schema.Struct({
|
|
27
|
+
message: Schema.String
|
|
28
|
+
})).addError(ApiNotFoundError);
|
|
29
|
+
export const ImpostersGroup = /*#__PURE__*/HttpApiGroup.make("imposters").add(createImposter).add(listImposters).add(getImposter).add(updateImposter).add(deleteImposter).add(addStub).add(listStubs).add(updateStub).add(deleteStub).add(listRequests).add(clearRequests).add(getImposterStats).add(resetImposterStats);
|
|
30
|
+
//# sourceMappingURL=ImpostersGroup.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ImpostersGroup.js","names":["HttpApiEndpoint","HttpApiGroup","HttpApiSchema","Schema","CreateImposterRequest","DeleteImposterResponse","ImposterResponse","ListImpostersResponse","Statistics","UpdateImposterRequest","RequestLogEntry","CreateStubRequest","Stub","UpdateStubRequest","ApiConflictError","ApiNotFoundError","ApiServiceError","DeleteImposterUrlParams","ListImpostersUrlParams","ListRequestsUrlParams","createImposter","post","setPayload","addSuccess","status","addError","listImposters","get","setUrlParams","getImposter","param","String","updateImposter","patch","deleteImposter","del","addStub","listStubs","Array","updateStub","put","deleteStub","listRequests","clearRequests","Struct","message","getImposterStats","resetImposterStats","ImpostersGroup","make","add"],"sources":["../../../src/api/ImpostersGroup.ts"],"sourcesContent":[null],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,354 @@
|
|
|
1
|
+
import { HttpApiBuilder } from "@effect/platform";
|
|
2
|
+
import * as Clock from "effect/Clock";
|
|
3
|
+
import * as DateTime from "effect/DateTime";
|
|
4
|
+
import * as Effect from "effect/Effect";
|
|
5
|
+
import { ImposterConfig } from "../domain/imposter";
|
|
6
|
+
import { ImposterRepository } from "../repositories/ImposterRepository";
|
|
7
|
+
import { NonEmptyString } from "../schemas/common";
|
|
8
|
+
import { ImposterServer } from "../server/ImposterServer";
|
|
9
|
+
import { AppConfig } from "../services/AppConfig";
|
|
10
|
+
import { MetricsService } from "../services/MetricsService";
|
|
11
|
+
import { PortAllocator } from "../services/PortAllocator";
|
|
12
|
+
import { RequestLogger } from "../services/RequestLogger";
|
|
13
|
+
import { Uuid } from "../services/Uuid";
|
|
14
|
+
import { AdminApi } from "./AdminApi";
|
|
15
|
+
import { ApiConflictError, ApiNotFoundError, ApiServiceError } from "./ApiErrors";
|
|
16
|
+
import { buildPaginationMeta, toImposterResponse } from "./Conversions";
|
|
17
|
+
export const ImpostersHandlersLive = /*#__PURE__*/HttpApiBuilder.group(AdminApi, "imposters", handlers => handlers.handle("createImposter", ({
|
|
18
|
+
payload
|
|
19
|
+
}) => Effect.gen(function* () {
|
|
20
|
+
const repo = yield* ImposterRepository;
|
|
21
|
+
const uuid = yield* Uuid;
|
|
22
|
+
const allocator = yield* PortAllocator;
|
|
23
|
+
const config = yield* AppConfig;
|
|
24
|
+
const all = yield* repo.getAll;
|
|
25
|
+
if (all.length >= config.maxImposters) {
|
|
26
|
+
return yield* Effect.fail(new ApiServiceError({
|
|
27
|
+
message: `Maximum number of imposters (${config.maxImposters}) reached`
|
|
28
|
+
}));
|
|
29
|
+
}
|
|
30
|
+
const id = yield* uuid.generateShort;
|
|
31
|
+
const name = payload.name ?? NonEmptyString.make(id);
|
|
32
|
+
const port = yield* allocator.allocate(payload.port).pipe(Effect.catchTags({
|
|
33
|
+
PortAllocatorError: e => Effect.fail(new ApiConflictError({
|
|
34
|
+
message: e.reason
|
|
35
|
+
})),
|
|
36
|
+
PortExhaustedError: e => Effect.fail(new ApiServiceError({
|
|
37
|
+
message: `No available ports in range ${e.rangeMin}-${e.rangeMax}`
|
|
38
|
+
}))
|
|
39
|
+
}));
|
|
40
|
+
const imposterConfig = ImposterConfig({
|
|
41
|
+
id,
|
|
42
|
+
name,
|
|
43
|
+
port,
|
|
44
|
+
status: "stopped",
|
|
45
|
+
createdAt: DateTime.unsafeNow(),
|
|
46
|
+
...(payload.proxy !== undefined ? {
|
|
47
|
+
proxy: payload.proxy
|
|
48
|
+
} : {})
|
|
49
|
+
});
|
|
50
|
+
const record = yield* repo.create(imposterConfig);
|
|
51
|
+
return yield* toImposterResponse(record);
|
|
52
|
+
})).handle("listImposters", ({
|
|
53
|
+
urlParams
|
|
54
|
+
}) => Effect.gen(function* () {
|
|
55
|
+
const repo = yield* ImposterRepository;
|
|
56
|
+
const all = yield* repo.getAll;
|
|
57
|
+
// All imposters are HTTP in Phase 2; protocol filter is for forward compatibility
|
|
58
|
+
const filtered = all.filter(r => urlParams.status === undefined || r.config.status === urlParams.status).filter(() => urlParams.protocol === undefined || urlParams.protocol === "HTTP");
|
|
59
|
+
filtered.sort((a, b) => DateTime.toEpochMillis(a.config.createdAt) - DateTime.toEpochMillis(b.config.createdAt));
|
|
60
|
+
const total = filtered.length;
|
|
61
|
+
const paged = filtered.slice(urlParams.offset, urlParams.offset + urlParams.limit);
|
|
62
|
+
const imposters = yield* Effect.all(paged.map(toImposterResponse));
|
|
63
|
+
return {
|
|
64
|
+
imposters,
|
|
65
|
+
pagination: buildPaginationMeta(total, urlParams.limit, urlParams.offset)
|
|
66
|
+
};
|
|
67
|
+
})).handle("getImposter", ({
|
|
68
|
+
path
|
|
69
|
+
}) => Effect.gen(function* () {
|
|
70
|
+
const repo = yield* ImposterRepository;
|
|
71
|
+
const record = yield* repo.get(path.id).pipe(Effect.catchTag("ImposterNotFoundError", e => Effect.fail(new ApiNotFoundError({
|
|
72
|
+
message: "Imposter not found",
|
|
73
|
+
resourceType: "imposter",
|
|
74
|
+
resourceId: e.id
|
|
75
|
+
}))));
|
|
76
|
+
return yield* toImposterResponse(record);
|
|
77
|
+
})).handle("updateImposter", ({
|
|
78
|
+
path,
|
|
79
|
+
payload
|
|
80
|
+
}) => Effect.gen(function* () {
|
|
81
|
+
const repo = yield* ImposterRepository;
|
|
82
|
+
const allocator = yield* PortAllocator;
|
|
83
|
+
const imposterServer = yield* ImposterServer;
|
|
84
|
+
const existing = yield* repo.get(path.id).pipe(Effect.catchTag("ImposterNotFoundError", e => Effect.fail(new ApiNotFoundError({
|
|
85
|
+
message: "Imposter not found",
|
|
86
|
+
resourceType: "imposter",
|
|
87
|
+
resourceId: e.id
|
|
88
|
+
}))));
|
|
89
|
+
const wasRunning = yield* imposterServer.isRunning(path.id);
|
|
90
|
+
const wantsRunning = payload.status === "running";
|
|
91
|
+
const wantsStopped = payload.status === "stopped";
|
|
92
|
+
const portChanging = payload.port !== undefined && payload.port !== existing.config.port;
|
|
93
|
+
// If port is changing while running, stop first
|
|
94
|
+
if (portChanging && wasRunning) {
|
|
95
|
+
yield* imposterServer.stop(path.id);
|
|
96
|
+
}
|
|
97
|
+
let newPort;
|
|
98
|
+
if (portChanging) {
|
|
99
|
+
newPort = yield* allocator.allocate(payload.port).pipe(Effect.catchTags({
|
|
100
|
+
PortAllocatorError: e => Effect.fail(new ApiConflictError({
|
|
101
|
+
message: e.reason
|
|
102
|
+
})),
|
|
103
|
+
PortExhaustedError: e => Effect.fail(new ApiServiceError({
|
|
104
|
+
message: `No available ports in range ${e.rangeMin}-${e.rangeMax}`
|
|
105
|
+
}))
|
|
106
|
+
}));
|
|
107
|
+
}
|
|
108
|
+
// Compute proxy update: undefined = no change, null = remove, object = set
|
|
109
|
+
const proxyUpdate = payload.proxy === undefined ? {} : payload.proxy === null ? {
|
|
110
|
+
proxy: undefined
|
|
111
|
+
} : {
|
|
112
|
+
proxy: payload.proxy
|
|
113
|
+
};
|
|
114
|
+
yield* repo.update(path.id, r => ({
|
|
115
|
+
...r,
|
|
116
|
+
config: ImposterConfig({
|
|
117
|
+
...r.config,
|
|
118
|
+
...(payload.name !== undefined ? {
|
|
119
|
+
name: payload.name
|
|
120
|
+
} : {}),
|
|
121
|
+
...(payload.status !== undefined ? {
|
|
122
|
+
status: payload.status
|
|
123
|
+
} : {}),
|
|
124
|
+
...(newPort !== undefined ? {
|
|
125
|
+
port: newPort
|
|
126
|
+
} : {}),
|
|
127
|
+
...proxyUpdate
|
|
128
|
+
})
|
|
129
|
+
})).pipe(Effect.catchTag("ImposterNotFoundError", e => Effect.fail(new ApiNotFoundError({
|
|
130
|
+
message: "Imposter not found",
|
|
131
|
+
resourceType: "imposter",
|
|
132
|
+
resourceId: e.id
|
|
133
|
+
}))), Effect.tapError(() => newPort !== undefined ? allocator.release(newPort) : Effect.void));
|
|
134
|
+
if (newPort !== undefined) {
|
|
135
|
+
yield* allocator.release(existing.config.port);
|
|
136
|
+
}
|
|
137
|
+
// Hot-reload proxy config if it changed
|
|
138
|
+
if (payload.proxy !== undefined) {
|
|
139
|
+
yield* imposterServer.updateProxyConfig(path.id);
|
|
140
|
+
}
|
|
141
|
+
// Handle start/stop transitions
|
|
142
|
+
if (wantsRunning && !wasRunning) {
|
|
143
|
+
yield* imposterServer.start(path.id).pipe(Effect.catchTag("ImposterServerError", e => Effect.fail(new ApiServiceError({
|
|
144
|
+
message: e.reason
|
|
145
|
+
}))), Effect.catchTag("ImposterNotFoundError", e => Effect.fail(new ApiNotFoundError({
|
|
146
|
+
message: "Imposter not found",
|
|
147
|
+
resourceType: "imposter",
|
|
148
|
+
resourceId: e.id
|
|
149
|
+
}))));
|
|
150
|
+
} else if (wantsStopped && wasRunning && !portChanging) {
|
|
151
|
+
yield* imposterServer.stop(path.id);
|
|
152
|
+
} else if (portChanging && wasRunning) {
|
|
153
|
+
// Port changed while running — restart
|
|
154
|
+
yield* imposterServer.start(path.id).pipe(Effect.catchTag("ImposterServerError", e => Effect.fail(new ApiServiceError({
|
|
155
|
+
message: e.reason
|
|
156
|
+
}))), Effect.catchTag("ImposterNotFoundError", e => Effect.fail(new ApiNotFoundError({
|
|
157
|
+
message: "Imposter not found",
|
|
158
|
+
resourceType: "imposter",
|
|
159
|
+
resourceId: e.id
|
|
160
|
+
}))));
|
|
161
|
+
}
|
|
162
|
+
// Re-read to get final status
|
|
163
|
+
const final = yield* repo.get(path.id).pipe(Effect.catchTag("ImposterNotFoundError", e => Effect.fail(new ApiNotFoundError({
|
|
164
|
+
message: "Imposter not found",
|
|
165
|
+
resourceType: "imposter",
|
|
166
|
+
resourceId: e.id
|
|
167
|
+
}))));
|
|
168
|
+
return yield* toImposterResponse(final);
|
|
169
|
+
})).handle("deleteImposter", ({
|
|
170
|
+
path,
|
|
171
|
+
urlParams
|
|
172
|
+
}) => Effect.gen(function* () {
|
|
173
|
+
const repo = yield* ImposterRepository;
|
|
174
|
+
const allocator = yield* PortAllocator;
|
|
175
|
+
const imposterServer = yield* ImposterServer;
|
|
176
|
+
const metricsService = yield* MetricsService;
|
|
177
|
+
const existing = yield* repo.get(path.id).pipe(Effect.catchTag("ImposterNotFoundError", e => Effect.fail(new ApiNotFoundError({
|
|
178
|
+
message: "Imposter not found",
|
|
179
|
+
resourceType: "imposter",
|
|
180
|
+
resourceId: e.id
|
|
181
|
+
}))));
|
|
182
|
+
if (!urlParams.force && existing.config.status !== "stopped") {
|
|
183
|
+
return yield* Effect.fail(new ApiConflictError({
|
|
184
|
+
message: `Imposter is ${existing.config.status}, use force=true to delete`
|
|
185
|
+
}));
|
|
186
|
+
}
|
|
187
|
+
// Stop if running
|
|
188
|
+
const running = yield* imposterServer.isRunning(path.id);
|
|
189
|
+
if (running) {
|
|
190
|
+
yield* imposterServer.stop(path.id);
|
|
191
|
+
}
|
|
192
|
+
yield* repo.remove(path.id).pipe(Effect.catchTag("ImposterNotFoundError", e => Effect.fail(new ApiNotFoundError({
|
|
193
|
+
message: "Imposter not found",
|
|
194
|
+
resourceType: "imposter",
|
|
195
|
+
resourceId: e.id
|
|
196
|
+
}))));
|
|
197
|
+
yield* allocator.release(existing.config.port);
|
|
198
|
+
yield* metricsService.resetStats(path.id);
|
|
199
|
+
const now = yield* Effect.map(Clock.currentTimeMillis, ms => DateTime.unsafeMake(ms));
|
|
200
|
+
return {
|
|
201
|
+
message: NonEmptyString.make(`Imposter ${path.id} deleted`),
|
|
202
|
+
id: NonEmptyString.make(path.id),
|
|
203
|
+
deletedAt: now
|
|
204
|
+
};
|
|
205
|
+
})).handle("addStub", ({
|
|
206
|
+
path,
|
|
207
|
+
payload
|
|
208
|
+
}) => Effect.gen(function* () {
|
|
209
|
+
const repo = yield* ImposterRepository;
|
|
210
|
+
const uuid = yield* Uuid;
|
|
211
|
+
const imposterServer = yield* ImposterServer;
|
|
212
|
+
const id = yield* uuid.generateShort;
|
|
213
|
+
const stub = {
|
|
214
|
+
id: NonEmptyString.make(id),
|
|
215
|
+
predicates: payload.predicates,
|
|
216
|
+
responses: payload.responses,
|
|
217
|
+
responseMode: payload.responseMode
|
|
218
|
+
};
|
|
219
|
+
const result = yield* repo.addStub(path.imposterId, stub).pipe(Effect.catchTag("ImposterNotFoundError", e => Effect.fail(new ApiNotFoundError({
|
|
220
|
+
message: "Imposter not found",
|
|
221
|
+
resourceType: "imposter",
|
|
222
|
+
resourceId: e.id
|
|
223
|
+
}))));
|
|
224
|
+
// Hot-reload if running
|
|
225
|
+
const running = yield* imposterServer.isRunning(path.imposterId);
|
|
226
|
+
if (running) {
|
|
227
|
+
yield* imposterServer.updateStubs(path.imposterId);
|
|
228
|
+
}
|
|
229
|
+
return result;
|
|
230
|
+
})).handle("listStubs", ({
|
|
231
|
+
path
|
|
232
|
+
}) => Effect.gen(function* () {
|
|
233
|
+
const repo = yield* ImposterRepository;
|
|
234
|
+
return yield* repo.getStubs(path.imposterId).pipe(Effect.catchTag("ImposterNotFoundError", e => Effect.fail(new ApiNotFoundError({
|
|
235
|
+
message: "Imposter not found",
|
|
236
|
+
resourceType: "imposter",
|
|
237
|
+
resourceId: e.id
|
|
238
|
+
}))));
|
|
239
|
+
})).handle("updateStub", ({
|
|
240
|
+
path,
|
|
241
|
+
payload
|
|
242
|
+
}) => Effect.gen(function* () {
|
|
243
|
+
const repo = yield* ImposterRepository;
|
|
244
|
+
const imposterServer = yield* ImposterServer;
|
|
245
|
+
const result = yield* repo.updateStub(path.imposterId, path.stubId, s => ({
|
|
246
|
+
...s,
|
|
247
|
+
...(payload.predicates !== undefined ? {
|
|
248
|
+
predicates: payload.predicates
|
|
249
|
+
} : {}),
|
|
250
|
+
...(payload.responses !== undefined ? {
|
|
251
|
+
responses: payload.responses
|
|
252
|
+
} : {}),
|
|
253
|
+
...(payload.responseMode !== undefined ? {
|
|
254
|
+
responseMode: payload.responseMode
|
|
255
|
+
} : {})
|
|
256
|
+
})).pipe(Effect.catchTag("ImposterNotFoundError", e => Effect.fail(new ApiNotFoundError({
|
|
257
|
+
message: "Imposter not found",
|
|
258
|
+
resourceType: "imposter",
|
|
259
|
+
resourceId: e.id
|
|
260
|
+
}))), Effect.catchTag("StubNotFoundError", e => Effect.fail(new ApiNotFoundError({
|
|
261
|
+
message: "Stub not found",
|
|
262
|
+
resourceType: "stub",
|
|
263
|
+
resourceId: e.stubId
|
|
264
|
+
}))));
|
|
265
|
+
// Hot-reload if running
|
|
266
|
+
const running = yield* imposterServer.isRunning(path.imposterId);
|
|
267
|
+
if (running) {
|
|
268
|
+
yield* imposterServer.updateStubs(path.imposterId);
|
|
269
|
+
}
|
|
270
|
+
return result;
|
|
271
|
+
})).handle("deleteStub", ({
|
|
272
|
+
path
|
|
273
|
+
}) => Effect.gen(function* () {
|
|
274
|
+
const repo = yield* ImposterRepository;
|
|
275
|
+
const imposterServer = yield* ImposterServer;
|
|
276
|
+
const result = yield* repo.removeStub(path.imposterId, path.stubId).pipe(Effect.catchTag("ImposterNotFoundError", e => Effect.fail(new ApiNotFoundError({
|
|
277
|
+
message: "Imposter not found",
|
|
278
|
+
resourceType: "imposter",
|
|
279
|
+
resourceId: e.id
|
|
280
|
+
}))), Effect.catchTag("StubNotFoundError", e => Effect.fail(new ApiNotFoundError({
|
|
281
|
+
message: "Stub not found",
|
|
282
|
+
resourceType: "stub",
|
|
283
|
+
resourceId: e.stubId
|
|
284
|
+
}))));
|
|
285
|
+
// Hot-reload if running
|
|
286
|
+
const running = yield* imposterServer.isRunning(path.imposterId);
|
|
287
|
+
if (running) {
|
|
288
|
+
yield* imposterServer.updateStubs(path.imposterId);
|
|
289
|
+
}
|
|
290
|
+
return result;
|
|
291
|
+
})).handle("listRequests", ({
|
|
292
|
+
path,
|
|
293
|
+
urlParams
|
|
294
|
+
}) => Effect.gen(function* () {
|
|
295
|
+
const repo = yield* ImposterRepository;
|
|
296
|
+
const requestLogger = yield* RequestLogger;
|
|
297
|
+
yield* repo.get(path.id).pipe(Effect.catchTag("ImposterNotFoundError", e => Effect.fail(new ApiNotFoundError({
|
|
298
|
+
message: "Imposter not found",
|
|
299
|
+
resourceType: "imposter",
|
|
300
|
+
resourceId: e.id
|
|
301
|
+
}))));
|
|
302
|
+
return yield* requestLogger.getEntries(path.id, {
|
|
303
|
+
limit: urlParams.limit,
|
|
304
|
+
...(urlParams.method !== undefined ? {
|
|
305
|
+
method: urlParams.method
|
|
306
|
+
} : {}),
|
|
307
|
+
...(urlParams.path !== undefined ? {
|
|
308
|
+
path: urlParams.path
|
|
309
|
+
} : {}),
|
|
310
|
+
...(urlParams.status !== undefined ? {
|
|
311
|
+
status: urlParams.status
|
|
312
|
+
} : {})
|
|
313
|
+
});
|
|
314
|
+
})).handle("clearRequests", ({
|
|
315
|
+
path
|
|
316
|
+
}) => Effect.gen(function* () {
|
|
317
|
+
const repo = yield* ImposterRepository;
|
|
318
|
+
const requestLogger = yield* RequestLogger;
|
|
319
|
+
yield* repo.get(path.id).pipe(Effect.catchTag("ImposterNotFoundError", e => Effect.fail(new ApiNotFoundError({
|
|
320
|
+
message: "Imposter not found",
|
|
321
|
+
resourceType: "imposter",
|
|
322
|
+
resourceId: e.id
|
|
323
|
+
}))));
|
|
324
|
+
yield* requestLogger.clear(path.id);
|
|
325
|
+
return {
|
|
326
|
+
message: `Request log cleared for imposter ${path.id}`
|
|
327
|
+
};
|
|
328
|
+
})).handle("getImposterStats", ({
|
|
329
|
+
path
|
|
330
|
+
}) => Effect.gen(function* () {
|
|
331
|
+
const repo = yield* ImposterRepository;
|
|
332
|
+
const metricsService = yield* MetricsService;
|
|
333
|
+
yield* repo.get(path.id).pipe(Effect.catchTag("ImposterNotFoundError", e => Effect.fail(new ApiNotFoundError({
|
|
334
|
+
message: "Imposter not found",
|
|
335
|
+
resourceType: "imposter",
|
|
336
|
+
resourceId: e.id
|
|
337
|
+
}))));
|
|
338
|
+
return yield* metricsService.getStats(path.id);
|
|
339
|
+
})).handle("resetImposterStats", ({
|
|
340
|
+
path
|
|
341
|
+
}) => Effect.gen(function* () {
|
|
342
|
+
const repo = yield* ImposterRepository;
|
|
343
|
+
const metricsService = yield* MetricsService;
|
|
344
|
+
yield* repo.get(path.id).pipe(Effect.catchTag("ImposterNotFoundError", e => Effect.fail(new ApiNotFoundError({
|
|
345
|
+
message: "Imposter not found",
|
|
346
|
+
resourceType: "imposter",
|
|
347
|
+
resourceId: e.id
|
|
348
|
+
}))));
|
|
349
|
+
yield* metricsService.resetStats(path.id);
|
|
350
|
+
return {
|
|
351
|
+
message: `Statistics reset for imposter ${path.id}`
|
|
352
|
+
};
|
|
353
|
+
})));
|
|
354
|
+
//# sourceMappingURL=ImpostersHandlers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ImpostersHandlers.js","names":["HttpApiBuilder","Clock","DateTime","Effect","ImposterConfig","ImposterRepository","NonEmptyString","ImposterServer","AppConfig","MetricsService","PortAllocator","RequestLogger","Uuid","AdminApi","ApiConflictError","ApiNotFoundError","ApiServiceError","buildPaginationMeta","toImposterResponse","ImpostersHandlersLive","group","handlers","handle","payload","gen","repo","uuid","allocator","config","all","getAll","length","maxImposters","fail","message","id","generateShort","name","make","port","allocate","pipe","catchTags","PortAllocatorError","e","reason","PortExhaustedError","rangeMin","rangeMax","imposterConfig","status","createdAt","unsafeNow","proxy","undefined","record","create","urlParams","filtered","filter","r","protocol","sort","a","b","toEpochMillis","total","paged","slice","offset","limit","imposters","map","pagination","path","get","catchTag","resourceType","resourceId","imposterServer","existing","wasRunning","isRunning","wantsRunning","wantsStopped","portChanging","stop","newPort","proxyUpdate","update","tapError","release","void","updateProxyConfig","start","final","metricsService","force","running","remove","resetStats","now","currentTimeMillis","ms","unsafeMake","deletedAt","stub","predicates","responses","responseMode","result","addStub","imposterId","updateStubs","getStubs","updateStub","stubId","s","removeStub","requestLogger","getEntries","method","clear","getStats"],"sources":["../../../src/api/ImpostersHandlers.ts"],"sourcesContent":[null],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { HttpApiEndpoint, HttpApiGroup } from "@effect/platform";
|
|
2
|
+
import { HealthResponse, ServerInfoResponse } from "../schemas/ImposterSchema";
|
|
3
|
+
export const SystemGroup = /*#__PURE__*/HttpApiGroup.make("system", {
|
|
4
|
+
topLevel: true
|
|
5
|
+
}).add(HttpApiEndpoint.get("healthCheck", "/health").addSuccess(HealthResponse)).add(/*#__PURE__*/HttpApiEndpoint.get("serverInfo", "/info").addSuccess(ServerInfoResponse));
|
|
6
|
+
//# sourceMappingURL=SystemGroup.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SystemGroup.js","names":["HttpApiEndpoint","HttpApiGroup","HealthResponse","ServerInfoResponse","SystemGroup","make","topLevel","add","get","addSuccess"],"sources":["../../../src/api/SystemGroup.ts"],"sourcesContent":[null],"mappings":"AAAA,SAASA,eAAe,EAAEC,YAAY,QAAQ,kBAAkB;AAChE,SAASC,cAAc,EAAEC,kBAAkB,QAAQ,2BAA2B;AAE9E,OAAO,MAAMC,WAAW,gBAAGH,YAAY,CAACI,IAAI,CAAC,QAAQ,EAAE;EAAEC,QAAQ,EAAE;AAAI,CAAE,CAAC,CACvEC,GAAG,CACFP,eAAe,CAACQ,GAAG,CAAC,aAAa,EAAE,SAAS,CAAC,CAC1CC,UAAU,CAACP,cAAc,CAAC,CAC9B,CACAK,GAAG,cACFP,eAAe,CAACQ,GAAG,CAAC,YAAY,EAAE,OAAO,CAAC,CACvCC,UAAU,CAACN,kBAAkB,CAAC,CAClC","ignoreList":[]}
|