@c9up/ream 0.1.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 +21 -0
- package/README.md +70 -0
- package/dist/Application.d.ts +71 -0
- package/dist/Application.d.ts.map +1 -0
- package/dist/Application.js +151 -0
- package/dist/Application.js.map +1 -0
- package/dist/Codemods.d.ts +16 -0
- package/dist/Codemods.d.ts.map +1 -0
- package/dist/Codemods.js +277 -0
- package/dist/Codemods.js.map +1 -0
- package/dist/ConfigLoader.d.ts +29 -0
- package/dist/ConfigLoader.d.ts.map +1 -0
- package/dist/ConfigLoader.js +43 -0
- package/dist/ConfigLoader.js.map +1 -0
- package/dist/ErrorBoundary.d.ts +51 -0
- package/dist/ErrorBoundary.d.ts.map +1 -0
- package/dist/ErrorBoundary.js +122 -0
- package/dist/ErrorBoundary.js.map +1 -0
- package/dist/GracefulShutdown.d.ts +28 -0
- package/dist/GracefulShutdown.d.ts.map +1 -0
- package/dist/GracefulShutdown.js +55 -0
- package/dist/GracefulShutdown.js.map +1 -0
- package/dist/HealthCheck.d.ts +42 -0
- package/dist/HealthCheck.d.ts.map +1 -0
- package/dist/HealthCheck.js +65 -0
- package/dist/HealthCheck.js.map +1 -0
- package/dist/HotReload.d.ts +28 -0
- package/dist/HotReload.d.ts.map +1 -0
- package/dist/HotReload.js +60 -0
- package/dist/HotReload.js.map +1 -0
- package/dist/HttpKernel.d.ts +62 -0
- package/dist/HttpKernel.d.ts.map +1 -0
- package/dist/HttpKernel.js +210 -0
- package/dist/HttpKernel.js.map +1 -0
- package/dist/Ignitor.d.ts +195 -0
- package/dist/Ignitor.d.ts.map +1 -0
- package/dist/Ignitor.js +505 -0
- package/dist/Ignitor.js.map +1 -0
- package/dist/Provider.d.ts +54 -0
- package/dist/Provider.d.ts.map +1 -0
- package/dist/Provider.js +37 -0
- package/dist/Provider.js.map +1 -0
- package/dist/bodyparser/BodyParserMiddleware.d.ts +38 -0
- package/dist/bodyparser/BodyParserMiddleware.d.ts.map +1 -0
- package/dist/bodyparser/BodyParserMiddleware.js +143 -0
- package/dist/bodyparser/BodyParserMiddleware.js.map +1 -0
- package/dist/bodyparser/MultipartFile.d.ts +77 -0
- package/dist/bodyparser/MultipartFile.d.ts.map +1 -0
- package/dist/bodyparser/MultipartFile.js +138 -0
- package/dist/bodyparser/MultipartFile.js.map +1 -0
- package/dist/bodyparser/parseSize.d.ts +6 -0
- package/dist/bodyparser/parseSize.d.ts.map +1 -0
- package/dist/bodyparser/parseSize.js +21 -0
- package/dist/bodyparser/parseSize.js.map +1 -0
- package/dist/bootstrap/hyper-server.d.ts +27 -0
- package/dist/bootstrap/hyper-server.d.ts.map +1 -0
- package/dist/bootstrap/hyper-server.js +63 -0
- package/dist/bootstrap/hyper-server.js.map +1 -0
- package/dist/console/CommandRunner.d.ts +18 -0
- package/dist/console/CommandRunner.d.ts.map +1 -0
- package/dist/console/CommandRunner.js +65 -0
- package/dist/console/CommandRunner.js.map +1 -0
- package/dist/container/Container.d.ts +60 -0
- package/dist/container/Container.d.ts.map +1 -0
- package/dist/container/Container.js +329 -0
- package/dist/container/Container.js.map +1 -0
- package/dist/container/types.d.ts +25 -0
- package/dist/container/types.d.ts.map +1 -0
- package/dist/container/types.js +6 -0
- package/dist/container/types.js.map +1 -0
- package/dist/decorators/Lazy.d.ts +19 -0
- package/dist/decorators/Lazy.d.ts.map +1 -0
- package/dist/decorators/Lazy.js +53 -0
- package/dist/decorators/Lazy.js.map +1 -0
- package/dist/decorators/Service.d.ts +48 -0
- package/dist/decorators/Service.d.ts.map +1 -0
- package/dist/decorators/Service.js +70 -0
- package/dist/decorators/Service.js.map +1 -0
- package/dist/errors/FuzzyMatcher.d.ts +41 -0
- package/dist/errors/FuzzyMatcher.d.ts.map +1 -0
- package/dist/errors/FuzzyMatcher.js +81 -0
- package/dist/errors/FuzzyMatcher.js.map +1 -0
- package/dist/errors/ModuleErrors.d.ts +41 -0
- package/dist/errors/ModuleErrors.d.ts.map +1 -0
- package/dist/errors/ModuleErrors.js +65 -0
- package/dist/errors/ModuleErrors.js.map +1 -0
- package/dist/errors/PipelineStageError.d.ts +31 -0
- package/dist/errors/PipelineStageError.d.ts.map +1 -0
- package/dist/errors/PipelineStageError.js +77 -0
- package/dist/errors/PipelineStageError.js.map +1 -0
- package/dist/errors/ReamError.d.ts +50 -0
- package/dist/errors/ReamError.d.ts.map +1 -0
- package/dist/errors/ReamError.js +108 -0
- package/dist/errors/ReamError.js.map +1 -0
- package/dist/events/Emitter.d.ts +124 -0
- package/dist/events/Emitter.d.ts.map +1 -0
- package/dist/events/Emitter.js +271 -0
- package/dist/events/Emitter.js.map +1 -0
- package/dist/events/EventsProvider.d.ts +28 -0
- package/dist/events/EventsProvider.d.ts.map +1 -0
- package/dist/events/EventsProvider.js +36 -0
- package/dist/events/EventsProvider.js.map +1 -0
- package/dist/events/config.d.ts +8 -0
- package/dist/events/config.d.ts.map +1 -0
- package/dist/events/config.js +4 -0
- package/dist/events/config.js.map +1 -0
- package/dist/events/configure.d.ts +10 -0
- package/dist/events/configure.d.ts.map +1 -0
- package/dist/events/configure.js +11 -0
- package/dist/events/configure.js.map +1 -0
- package/dist/events/helix/helpers.d.ts +62 -0
- package/dist/events/helix/helpers.d.ts.map +1 -0
- package/dist/events/helix/helpers.js +187 -0
- package/dist/events/helix/helpers.js.map +1 -0
- package/dist/events/index.d.ts +17 -0
- package/dist/events/index.d.ts.map +1 -0
- package/dist/events/index.js +15 -0
- package/dist/events/index.js.map +1 -0
- package/dist/events/native.d.ts +21 -0
- package/dist/events/native.d.ts.map +1 -0
- package/dist/events/native.js +17 -0
- package/dist/events/native.js.map +1 -0
- package/dist/events/services/main.d.ts +18 -0
- package/dist/events/services/main.d.ts.map +1 -0
- package/dist/events/services/main.js +31 -0
- package/dist/events/services/main.js.map +1 -0
- package/dist/events/testing/FakeBus.d.ts +66 -0
- package/dist/events/testing/FakeBus.d.ts.map +1 -0
- package/dist/events/testing/FakeBus.js +356 -0
- package/dist/events/testing/FakeBus.js.map +1 -0
- package/dist/graphql/GraphQLEngine.d.ts +69 -0
- package/dist/graphql/GraphQLEngine.d.ts.map +1 -0
- package/dist/graphql/GraphQLEngine.js +309 -0
- package/dist/graphql/GraphQLEngine.js.map +1 -0
- package/dist/graphql/GraphQLProvider.d.ts +32 -0
- package/dist/graphql/GraphQLProvider.d.ts.map +1 -0
- package/dist/graphql/GraphQLProvider.js +49 -0
- package/dist/graphql/GraphQLProvider.js.map +1 -0
- package/dist/helpers/base64.d.ts +40 -0
- package/dist/helpers/base64.d.ts.map +1 -0
- package/dist/helpers/base64.js +70 -0
- package/dist/helpers/base64.js.map +1 -0
- package/dist/helpers/index.d.ts +7 -0
- package/dist/helpers/index.d.ts.map +1 -0
- package/dist/helpers/index.js +5 -0
- package/dist/helpers/index.js.map +1 -0
- package/dist/helpers/is.d.ts +101 -0
- package/dist/helpers/is.d.ts.map +1 -0
- package/dist/helpers/is.js +151 -0
- package/dist/helpers/is.js.map +1 -0
- package/dist/helpers/napi-loader.d.ts +46 -0
- package/dist/helpers/napi-loader.d.ts.map +1 -0
- package/dist/helpers/napi-loader.js +69 -0
- package/dist/helpers/napi-loader.js.map +1 -0
- package/dist/helpers/safeEqual.d.ts +9 -0
- package/dist/helpers/safeEqual.d.ts.map +1 -0
- package/dist/helpers/safeEqual.js +16 -0
- package/dist/helpers/safeEqual.js.map +1 -0
- package/dist/helpers/string.d.ts +161 -0
- package/dist/helpers/string.d.ts.map +1 -0
- package/dist/helpers/string.js +429 -0
- package/dist/helpers/string.js.map +1 -0
- package/dist/helpers/types.d.ts +83 -0
- package/dist/helpers/types.d.ts.map +1 -0
- package/dist/helpers/types.js +6 -0
- package/dist/helpers/types.js.map +1 -0
- package/dist/http/Exception.d.ts +103 -0
- package/dist/http/Exception.d.ts.map +1 -0
- package/dist/http/Exception.js +228 -0
- package/dist/http/Exception.js.map +1 -0
- package/dist/http/HttpContext.d.ts +69 -0
- package/dist/http/HttpContext.d.ts.map +1 -0
- package/dist/http/HttpContext.js +55 -0
- package/dist/http/HttpContext.js.map +1 -0
- package/dist/http/RedirectBuilder.d.ts +31 -0
- package/dist/http/RedirectBuilder.d.ts.map +1 -0
- package/dist/http/RedirectBuilder.js +75 -0
- package/dist/http/RedirectBuilder.js.map +1 -0
- package/dist/http/Request.d.ts +160 -0
- package/dist/http/Request.d.ts.map +1 -0
- package/dist/http/Request.js +484 -0
- package/dist/http/Request.js.map +1 -0
- package/dist/http/Response.d.ts +114 -0
- package/dist/http/Response.d.ts.map +1 -0
- package/dist/http/Response.js +303 -0
- package/dist/http/Response.js.map +1 -0
- package/dist/http/SseStream.d.ts +89 -0
- package/dist/http/SseStream.d.ts.map +1 -0
- package/dist/http/SseStream.js +228 -0
- package/dist/http/SseStream.js.map +1 -0
- package/dist/http/urlDecode.d.ts +8 -0
- package/dist/http/urlDecode.d.ts.map +1 -0
- package/dist/http/urlDecode.js +18 -0
- package/dist/http/urlDecode.js.map +1 -0
- package/dist/index.d.ts +92 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +67 -0
- package/dist/index.js.map +1 -0
- package/dist/middleware/Pipeline.d.ts +36 -0
- package/dist/middleware/Pipeline.d.ts.map +1 -0
- package/dist/middleware/Pipeline.js +104 -0
- package/dist/middleware/Pipeline.js.map +1 -0
- package/dist/openapi/OpenApiGenerator.d.ts +58 -0
- package/dist/openapi/OpenApiGenerator.d.ts.map +1 -0
- package/dist/openapi/OpenApiGenerator.js +192 -0
- package/dist/openapi/OpenApiGenerator.js.map +1 -0
- package/dist/openapi/OpenApiMiddleware.d.ts +24 -0
- package/dist/openapi/OpenApiMiddleware.d.ts.map +1 -0
- package/dist/openapi/OpenApiMiddleware.js +78 -0
- package/dist/openapi/OpenApiMiddleware.js.map +1 -0
- package/dist/openapi/OpenApiProvider.d.ts +36 -0
- package/dist/openapi/OpenApiProvider.d.ts.map +1 -0
- package/dist/openapi/OpenApiProvider.js +42 -0
- package/dist/openapi/OpenApiProvider.js.map +1 -0
- package/dist/resources/ApiResource.d.ts +45 -0
- package/dist/resources/ApiResource.d.ts.map +1 -0
- package/dist/resources/ApiResource.js +58 -0
- package/dist/resources/ApiResource.js.map +1 -0
- package/dist/router/Router.d.ts +205 -0
- package/dist/router/Router.d.ts.map +1 -0
- package/dist/router/Router.js +552 -0
- package/dist/router/Router.js.map +1 -0
- package/dist/rpc/RpcProvider.d.ts +34 -0
- package/dist/rpc/RpcProvider.d.ts.map +1 -0
- package/dist/rpc/RpcProvider.js +37 -0
- package/dist/rpc/RpcProvider.js.map +1 -0
- package/dist/rpc/RpcRouter.d.ts +61 -0
- package/dist/rpc/RpcRouter.d.ts.map +1 -0
- package/dist/rpc/RpcRouter.js +187 -0
- package/dist/rpc/RpcRouter.js.map +1 -0
- package/dist/scheduler/Schedule.d.ts +53 -0
- package/dist/scheduler/Schedule.d.ts.map +1 -0
- package/dist/scheduler/Schedule.js +76 -0
- package/dist/scheduler/Schedule.js.map +1 -0
- package/dist/scheduler/ScheduleProvider.d.ts +56 -0
- package/dist/scheduler/ScheduleProvider.d.ts.map +1 -0
- package/dist/scheduler/ScheduleProvider.js +145 -0
- package/dist/scheduler/ScheduleProvider.js.map +1 -0
- package/dist/scheduler/Scheduler.d.ts +209 -0
- package/dist/scheduler/Scheduler.d.ts.map +1 -0
- package/dist/scheduler/Scheduler.js +432 -0
- package/dist/scheduler/Scheduler.js.map +1 -0
- package/dist/scheduler/index.d.ts +14 -0
- package/dist/scheduler/index.d.ts.map +1 -0
- package/dist/scheduler/index.js +6 -0
- package/dist/scheduler/index.js.map +1 -0
- package/dist/scheduler/locks/LockBackend.d.ts +37 -0
- package/dist/scheduler/locks/LockBackend.d.ts.map +1 -0
- package/dist/scheduler/locks/LockBackend.js +13 -0
- package/dist/scheduler/locks/LockBackend.js.map +1 -0
- package/dist/scheduler/locks/MemoryLockBackend.d.ts +39 -0
- package/dist/scheduler/locks/MemoryLockBackend.d.ts.map +1 -0
- package/dist/scheduler/locks/MemoryLockBackend.js +71 -0
- package/dist/scheduler/locks/MemoryLockBackend.js.map +1 -0
- package/dist/scheduler/observability/ErrorReporter.d.ts +15 -0
- package/dist/scheduler/observability/ErrorReporter.d.ts.map +1 -0
- package/dist/scheduler/observability/ErrorReporter.js +13 -0
- package/dist/scheduler/observability/ErrorReporter.js.map +1 -0
- package/dist/scheduler/observability/ScheduleEvent.d.ts +57 -0
- package/dist/scheduler/observability/ScheduleEvent.d.ts.map +1 -0
- package/dist/scheduler/observability/ScheduleEvent.js +12 -0
- package/dist/scheduler/observability/ScheduleEvent.js.map +1 -0
- package/dist/scheduler/observability/ScheduleEventSink.d.ts +20 -0
- package/dist/scheduler/observability/ScheduleEventSink.d.ts.map +1 -0
- package/dist/scheduler/observability/ScheduleEventSink.js +17 -0
- package/dist/scheduler/observability/ScheduleEventSink.js.map +1 -0
- package/dist/scheduler/observability/StatsTracker.d.ts +50 -0
- package/dist/scheduler/observability/StatsTracker.d.ts.map +1 -0
- package/dist/scheduler/observability/StatsTracker.js +96 -0
- package/dist/scheduler/observability/StatsTracker.js.map +1 -0
- package/dist/security/CookieSigner.d.ts +13 -0
- package/dist/security/CookieSigner.d.ts.map +1 -0
- package/dist/security/CookieSigner.js +51 -0
- package/dist/security/CookieSigner.js.map +1 -0
- package/dist/security/SignedUrl.d.ts +17 -0
- package/dist/security/SignedUrl.d.ts.map +1 -0
- package/dist/security/SignedUrl.js +63 -0
- package/dist/security/SignedUrl.js.map +1 -0
- package/dist/security/crypto.d.ts +25 -0
- package/dist/security/crypto.d.ts.map +1 -0
- package/dist/security/crypto.js +82 -0
- package/dist/security/crypto.js.map +1 -0
- package/dist/server/HyperServer.d.ts +64 -0
- package/dist/server/HyperServer.d.ts.map +1 -0
- package/dist/server/HyperServer.js +54 -0
- package/dist/server/HyperServer.js.map +1 -0
- package/dist/server/Server.d.ts +68 -0
- package/dist/server/Server.d.ts.map +1 -0
- package/dist/server/Server.js +113 -0
- package/dist/server/Server.js.map +1 -0
- package/dist/services/app.d.ts +14 -0
- package/dist/services/app.d.ts.map +1 -0
- package/dist/services/app.js +27 -0
- package/dist/services/app.js.map +1 -0
- package/dist/services/router.d.ts +21 -0
- package/dist/services/router.d.ts.map +1 -0
- package/dist/services/router.js +36 -0
- package/dist/services/router.js.map +1 -0
- package/dist/services/server.d.ts +16 -0
- package/dist/services/server.d.ts.map +1 -0
- package/dist/services/server.js +32 -0
- package/dist/services/server.js.map +1 -0
- package/dist/session/Session.d.ts +88 -0
- package/dist/session/Session.d.ts.map +1 -0
- package/dist/session/Session.js +186 -0
- package/dist/session/Session.js.map +1 -0
- package/dist/session/SessionMiddleware.d.ts +16 -0
- package/dist/session/SessionMiddleware.d.ts.map +1 -0
- package/dist/session/SessionMiddleware.js +132 -0
- package/dist/session/SessionMiddleware.js.map +1 -0
- package/dist/session/drivers/CookieDriver.d.ts +17 -0
- package/dist/session/drivers/CookieDriver.d.ts.map +1 -0
- package/dist/session/drivers/CookieDriver.js +42 -0
- package/dist/session/drivers/CookieDriver.js.map +1 -0
- package/dist/session/drivers/MemoryDriver.d.ts +9 -0
- package/dist/session/drivers/MemoryDriver.d.ts.map +1 -0
- package/dist/session/drivers/MemoryDriver.js +24 -0
- package/dist/session/drivers/MemoryDriver.js.map +1 -0
- package/dist/storage/S3Driver.d.ts +27 -0
- package/dist/storage/S3Driver.d.ts.map +1 -0
- package/dist/storage/S3Driver.js +135 -0
- package/dist/storage/S3Driver.js.map +1 -0
- package/dist/storage/StaticMiddleware.d.ts +27 -0
- package/dist/storage/StaticMiddleware.d.ts.map +1 -0
- package/dist/storage/StaticMiddleware.js +153 -0
- package/dist/storage/StaticMiddleware.js.map +1 -0
- package/dist/storage/StaticProvider.d.ts +26 -0
- package/dist/storage/StaticProvider.d.ts.map +1 -0
- package/dist/storage/StaticProvider.js +31 -0
- package/dist/storage/StaticProvider.js.map +1 -0
- package/dist/storage/StorageManager.d.ts +31 -0
- package/dist/storage/StorageManager.d.ts.map +1 -0
- package/dist/storage/StorageManager.js +120 -0
- package/dist/storage/StorageManager.js.map +1 -0
- package/dist/testing/RequestBuilder.d.ts +67 -0
- package/dist/testing/RequestBuilder.d.ts.map +1 -0
- package/dist/testing/RequestBuilder.js +202 -0
- package/dist/testing/RequestBuilder.js.map +1 -0
- package/dist/testing/TestClient.d.ts +96 -0
- package/dist/testing/TestClient.d.ts.map +1 -0
- package/dist/testing/TestClient.js +263 -0
- package/dist/testing/TestClient.js.map +1 -0
- package/dist/types/helpers.d.ts +47 -0
- package/dist/types/helpers.d.ts.map +1 -0
- package/dist/types/helpers.js +5 -0
- package/dist/types/helpers.js.map +1 -0
- package/events.darwin-arm64.node +0 -0
- package/events.darwin-x64.node +0 -0
- package/events.linux-arm64-gnu.node +0 -0
- package/events.linux-x64-gnu.node +0 -0
- package/events.win32-x64-msvc.node +0 -0
- package/index.darwin-arm64.node +0 -0
- package/index.darwin-x64.node +0 -0
- package/index.linux-arm64-gnu.node +0 -0
- package/index.linux-x64-gnu.node +0 -0
- package/index.win32-x64-msvc.node +0 -0
- package/package.json +106 -0
- package/scheduler.darwin-arm64.node +0 -0
- package/scheduler.darwin-x64.node +0 -0
- package/scheduler.linux-arm64-gnu.node +0 -0
- package/scheduler.linux-x64-gnu.node +0 -0
- package/scheduler.win32-x64-msvc.node +0 -0
- package/scripts/copy-napi.mjs +113 -0
- package/src/Application.ts +177 -0
- package/src/Codemods.ts +343 -0
- package/src/ConfigLoader.ts +49 -0
- package/src/ErrorBoundary.ts +157 -0
- package/src/GracefulShutdown.ts +80 -0
- package/src/HealthCheck.ts +96 -0
- package/src/HotReload.ts +78 -0
- package/src/HttpKernel.ts +305 -0
- package/src/Ignitor.ts +656 -0
- package/src/Provider.ts +74 -0
- package/src/bodyparser/BodyParserMiddleware.ts +183 -0
- package/src/bodyparser/MultipartFile.ts +181 -0
- package/src/bodyparser/parseSize.ts +19 -0
- package/src/bootstrap/hyper-server.ts +78 -0
- package/src/console/CommandRunner.ts +82 -0
- package/src/container/Container.ts +383 -0
- package/src/container/types.ts +30 -0
- package/src/decorators/Lazy.ts +57 -0
- package/src/decorators/Service.ts +85 -0
- package/src/errors/FuzzyMatcher.ts +93 -0
- package/src/errors/ModuleErrors.ts +73 -0
- package/src/errors/PipelineStageError.ts +97 -0
- package/src/errors/ReamError.ts +138 -0
- package/src/events/Emitter.ts +333 -0
- package/src/events/EventsProvider.ts +58 -0
- package/src/events/config.ts +10 -0
- package/src/events/configure.ts +19 -0
- package/src/events/helix/helpers.ts +260 -0
- package/src/events/index.ts +22 -0
- package/src/events/native.ts +37 -0
- package/src/events/services/main.ts +39 -0
- package/src/events/testing/FakeBus.ts +420 -0
- package/src/graphql/GraphQLEngine.ts +421 -0
- package/src/graphql/GraphQLProvider.ts +59 -0
- package/src/helpers/base64.ts +72 -0
- package/src/helpers/index.ts +6 -0
- package/src/helpers/is.ts +162 -0
- package/src/helpers/napi-loader.ts +106 -0
- package/src/helpers/safeEqual.ts +15 -0
- package/src/helpers/string.ts +469 -0
- package/src/helpers/types.ts +100 -0
- package/src/http/Exception.ts +272 -0
- package/src/http/HttpContext.ts +108 -0
- package/src/http/RedirectBuilder.ts +89 -0
- package/src/http/Request.ts +540 -0
- package/src/http/Response.ts +351 -0
- package/src/http/SseStream.ts +250 -0
- package/src/http/urlDecode.ts +18 -0
- package/src/index.ts +263 -0
- package/src/middleware/Pipeline.ts +136 -0
- package/src/openapi/OpenApiGenerator.ts +254 -0
- package/src/openapi/OpenApiMiddleware.ts +101 -0
- package/src/openapi/OpenApiProvider.ts +67 -0
- package/src/resources/ApiResource.ts +79 -0
- package/src/router/Router.ts +733 -0
- package/src/rpc/RpcProvider.ts +54 -0
- package/src/rpc/RpcRouter.ts +243 -0
- package/src/scheduler/Schedule.ts +96 -0
- package/src/scheduler/ScheduleProvider.ts +177 -0
- package/src/scheduler/Scheduler.ts +601 -0
- package/src/scheduler/index.ts +24 -0
- package/src/scheduler/locks/LockBackend.ts +38 -0
- package/src/scheduler/locks/MemoryLockBackend.ts +85 -0
- package/src/scheduler/observability/ErrorReporter.ts +13 -0
- package/src/scheduler/observability/ScheduleEvent.ts +61 -0
- package/src/scheduler/observability/ScheduleEventSink.ts +21 -0
- package/src/scheduler/observability/StatsTracker.ts +134 -0
- package/src/security/CookieSigner.ts +54 -0
- package/src/security/SignedUrl.ts +71 -0
- package/src/security/crypto.ts +98 -0
- package/src/server/HyperServer.ts +121 -0
- package/src/server/Server.ts +147 -0
- package/src/services/app.ts +34 -0
- package/src/services/router.ts +44 -0
- package/src/services/server.ts +40 -0
- package/src/session/Session.ts +231 -0
- package/src/session/SessionMiddleware.ts +153 -0
- package/src/session/drivers/CookieDriver.ts +48 -0
- package/src/session/drivers/MemoryDriver.ts +29 -0
- package/src/storage/S3Driver.ts +171 -0
- package/src/storage/StaticMiddleware.ts +182 -0
- package/src/storage/StaticProvider.ts +40 -0
- package/src/storage/StorageManager.ts +142 -0
- package/src/testing/RequestBuilder.ts +275 -0
- package/src/testing/TestClient.ts +344 -0
- package/src/types/helpers.ts +52 -0
- package/swcrc.app.json +17 -0
- package/tsconfig.app.json +21 -0
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export type { LockBackend } from './locks/LockBackend.js';
|
|
2
|
+
export { MemoryLockBackend } from './locks/MemoryLockBackend.js';
|
|
3
|
+
export type { ErrorReporter } from './observability/ErrorReporter.js';
|
|
4
|
+
export type { ScheduleEvent, ScheduleTaskCompletedEvent, ScheduleTaskFailedEvent, ScheduleTaskSkippedEvent, ScheduleTaskStartedEvent, } from './observability/ScheduleEvent.js';
|
|
5
|
+
export type { ScheduleEventSink } from './observability/ScheduleEventSink.js';
|
|
6
|
+
export type { TaskStats } from './observability/StatsTracker.js';
|
|
7
|
+
export { StatsTracker } from './observability/StatsTracker.js';
|
|
8
|
+
export type { ScheduleMetadata } from './Schedule.js';
|
|
9
|
+
export { getScheduleMetadata, SCHEDULE_METADATA_KEY, Schedule } from './Schedule.js';
|
|
10
|
+
export type { ScheduleProviderOptions } from './ScheduleProvider.js';
|
|
11
|
+
export { ScheduleProvider } from './ScheduleProvider.js';
|
|
12
|
+
export type { RunTaskOutcome, ScheduleInvocation, SchedulerOptions, TaskInfo, } from './Scheduler.js';
|
|
13
|
+
export { Scheduler } from './Scheduler.js';
|
|
14
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/scheduler/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAA;AACzD,OAAO,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAA;AAChE,YAAY,EAAE,aAAa,EAAE,MAAM,kCAAkC,CAAA;AACrE,YAAY,EACV,aAAa,EACb,0BAA0B,EAC1B,uBAAuB,EACvB,wBAAwB,EACxB,wBAAwB,GACzB,MAAM,kCAAkC,CAAA;AACzC,YAAY,EAAE,iBAAiB,EAAE,MAAM,sCAAsC,CAAA;AAC7E,YAAY,EAAE,SAAS,EAAE,MAAM,iCAAiC,CAAA;AAChE,OAAO,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAA;AAC9D,YAAY,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAA;AACrD,OAAO,EAAE,mBAAmB,EAAE,qBAAqB,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AACpF,YAAY,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAA;AACpE,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAA;AACxD,YAAY,EACV,cAAc,EACd,kBAAkB,EAClB,gBAAgB,EAChB,QAAQ,GACT,MAAM,gBAAgB,CAAA;AACvB,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAA"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export { MemoryLockBackend } from './locks/MemoryLockBackend.js';
|
|
2
|
+
export { StatsTracker } from './observability/StatsTracker.js';
|
|
3
|
+
export { getScheduleMetadata, SCHEDULE_METADATA_KEY, Schedule } from './Schedule.js';
|
|
4
|
+
export { ScheduleProvider } from './ScheduleProvider.js';
|
|
5
|
+
export { Scheduler } from './Scheduler.js';
|
|
6
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/scheduler/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAA;AAWhE,OAAO,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAA;AAE9D,OAAO,EAAE,mBAAmB,EAAE,qBAAqB,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AAEpF,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAA;AAOxD,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAA"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pluggable distributed-lock interface for the scheduler.
|
|
3
|
+
*
|
|
4
|
+
* The scheduler consults a `LockBackend` immediately before firing a
|
|
5
|
+
* registered task so that in multi-instance deployments only one
|
|
6
|
+
* instance runs a given task on each tick. Redis, database
|
|
7
|
+
* advisory-lock, and other backends live in user-land — this module
|
|
8
|
+
* ships only the interface and a single-process `MemoryLockBackend`.
|
|
9
|
+
*
|
|
10
|
+
* @implements Story 28.3
|
|
11
|
+
*/
|
|
12
|
+
export interface LockBackend {
|
|
13
|
+
/**
|
|
14
|
+
* Attempt to acquire an exclusive lock on `name` for up to `ttlMs`
|
|
15
|
+
* wall-clock milliseconds.
|
|
16
|
+
*
|
|
17
|
+
* Returns `true` when the caller now owns the lock, `false` when it
|
|
18
|
+
* is held by someone else. Implementations must treat an entry
|
|
19
|
+
* whose TTL has elapsed as free — expired locks auto-recover
|
|
20
|
+
* without manual cleanup, which is essential for crash tolerance.
|
|
21
|
+
*
|
|
22
|
+
* Implementations should be safe to call concurrently; the memory
|
|
23
|
+
* backend serializes access through a synchronous `Map` under the
|
|
24
|
+
* hood, remote backends typically rely on their server's atomic
|
|
25
|
+
* compare-and-set primitive.
|
|
26
|
+
*/
|
|
27
|
+
acquire(name: string, ttlMs: number): Promise<boolean>;
|
|
28
|
+
/**
|
|
29
|
+
* Release the lock on `name`. Idempotent — releasing an unknown or
|
|
30
|
+
* already-released lock must not throw. The scheduler calls this
|
|
31
|
+
* in a `finally` block immediately after the task completes so the
|
|
32
|
+
* next tick on any instance can re-acquire without waiting for the
|
|
33
|
+
* TTL.
|
|
34
|
+
*/
|
|
35
|
+
release(name: string): Promise<void>;
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=LockBackend.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LockBackend.d.ts","sourceRoot":"","sources":["../../../src/scheduler/locks/LockBackend.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,MAAM,WAAW,WAAW;IAC1B;;;;;;;;;;;;;OAaG;IACH,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;IAEtD;;;;;;OAMG;IACH,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;CACrC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pluggable distributed-lock interface for the scheduler.
|
|
3
|
+
*
|
|
4
|
+
* The scheduler consults a `LockBackend` immediately before firing a
|
|
5
|
+
* registered task so that in multi-instance deployments only one
|
|
6
|
+
* instance runs a given task on each tick. Redis, database
|
|
7
|
+
* advisory-lock, and other backends live in user-land — this module
|
|
8
|
+
* ships only the interface and a single-process `MemoryLockBackend`.
|
|
9
|
+
*
|
|
10
|
+
* @implements Story 28.3
|
|
11
|
+
*/
|
|
12
|
+
export {};
|
|
13
|
+
//# sourceMappingURL=LockBackend.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LockBackend.js","sourceRoot":"","sources":["../../../src/scheduler/locks/LockBackend.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Default single-process lock backend backed by a `Map`.
|
|
3
|
+
*
|
|
4
|
+
* Correct for apps that run in a single Node.js process. For
|
|
5
|
+
* horizontally-scaled deployments, implement `LockBackend` against a
|
|
6
|
+
* shared store (Redis `SET NX PX`, Postgres advisory locks, etc.) —
|
|
7
|
+
* those drivers live in user-land per the project's "agnostic per
|
|
8
|
+
* package" rule.
|
|
9
|
+
*
|
|
10
|
+
* Expiry is evaluated **lazily** at `acquire` time — no background
|
|
11
|
+
* timer, no `setInterval`. This preserves Story 28.1's
|
|
12
|
+
* Rust-ticker-only philosophy: the only timers in the scheduler live
|
|
13
|
+
* in the Rust Tokio runtime.
|
|
14
|
+
*
|
|
15
|
+
* An opportunistic sweep runs at most once per `acquire` call to
|
|
16
|
+
* cap unbounded growth: when the map exceeds `SWEEP_THRESHOLD`
|
|
17
|
+
* entries, expired entries are pruned in O(N) without blocking
|
|
18
|
+
* the normal path.
|
|
19
|
+
*
|
|
20
|
+
* @implements Story 28.3
|
|
21
|
+
*/
|
|
22
|
+
import type { LockBackend } from './LockBackend.js';
|
|
23
|
+
export declare class MemoryLockBackend implements LockBackend {
|
|
24
|
+
#private;
|
|
25
|
+
acquire(name: string, ttlMs: number): Promise<boolean>;
|
|
26
|
+
release(name: string): Promise<void>;
|
|
27
|
+
/**
|
|
28
|
+
* @internal Test-only helper: force an entry into the map with an
|
|
29
|
+
* arbitrary expiry. Used to simulate a crashed holder whose lock
|
|
30
|
+
* has already expired without advancing `Date.now()`. Not part of
|
|
31
|
+
* the public {@link LockBackend} contract — never call from
|
|
32
|
+
* production code.
|
|
33
|
+
*/
|
|
34
|
+
__setExpiryForTesting(name: string, expiryMs: number): void;
|
|
35
|
+
/** @internal Test-only helper — return the current map size. */
|
|
36
|
+
__sizeForTesting(): number;
|
|
37
|
+
}
|
|
38
|
+
export default MemoryLockBackend;
|
|
39
|
+
//# sourceMappingURL=MemoryLockBackend.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MemoryLockBackend.d.ts","sourceRoot":"","sources":["../../../src/scheduler/locks/MemoryLockBackend.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAGH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAgBnD,qBAAa,iBAAkB,YAAW,WAAW;;IAG7C,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAqBtD,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAI1C;;;;;;OAMG;IACH,qBAAqB,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI;IAI3D,gEAAgE;IAChE,gBAAgB,IAAI,MAAM;CAG3B;AAED,eAAe,iBAAiB,CAAA"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Default single-process lock backend backed by a `Map`.
|
|
3
|
+
*
|
|
4
|
+
* Correct for apps that run in a single Node.js process. For
|
|
5
|
+
* horizontally-scaled deployments, implement `LockBackend` against a
|
|
6
|
+
* shared store (Redis `SET NX PX`, Postgres advisory locks, etc.) —
|
|
7
|
+
* those drivers live in user-land per the project's "agnostic per
|
|
8
|
+
* package" rule.
|
|
9
|
+
*
|
|
10
|
+
* Expiry is evaluated **lazily** at `acquire` time — no background
|
|
11
|
+
* timer, no `setInterval`. This preserves Story 28.1's
|
|
12
|
+
* Rust-ticker-only philosophy: the only timers in the scheduler live
|
|
13
|
+
* in the Rust Tokio runtime.
|
|
14
|
+
*
|
|
15
|
+
* An opportunistic sweep runs at most once per `acquire` call to
|
|
16
|
+
* cap unbounded growth: when the map exceeds `SWEEP_THRESHOLD`
|
|
17
|
+
* entries, expired entries are pruned in O(N) without blocking
|
|
18
|
+
* the normal path.
|
|
19
|
+
*
|
|
20
|
+
* @implements Story 28.3
|
|
21
|
+
*/
|
|
22
|
+
import { ReamError } from '../../errors/ReamError.js';
|
|
23
|
+
const SWEEP_THRESHOLD = 256;
|
|
24
|
+
function assertValidTtl(ttlMs) {
|
|
25
|
+
if (!Number.isFinite(ttlMs) || ttlMs <= 0) {
|
|
26
|
+
throw new ReamError('SCHEDULE_INVALID_LOCK_TTL', `Lock TTL must be a finite positive number, got ${ttlMs}`, {
|
|
27
|
+
hint: 'Use a millisecond value greater than zero (typical range 1_000 – 600_000).',
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
export class MemoryLockBackend {
|
|
32
|
+
#locks = new Map();
|
|
33
|
+
async acquire(name, ttlMs) {
|
|
34
|
+
assertValidTtl(ttlMs);
|
|
35
|
+
const now = Date.now();
|
|
36
|
+
// Opportunistic sweep: when the map grows past the threshold,
|
|
37
|
+
// drop expired entries. Bounded by the current map size, runs at
|
|
38
|
+
// most once per acquire, never schedules async work.
|
|
39
|
+
if (this.#locks.size >= SWEEP_THRESHOLD) {
|
|
40
|
+
for (const [key, expiry] of this.#locks) {
|
|
41
|
+
if (expiry <= now)
|
|
42
|
+
this.#locks.delete(key);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
const existing = this.#locks.get(name);
|
|
46
|
+
if (existing !== undefined && existing > now) {
|
|
47
|
+
return false;
|
|
48
|
+
}
|
|
49
|
+
this.#locks.set(name, now + ttlMs);
|
|
50
|
+
return true;
|
|
51
|
+
}
|
|
52
|
+
async release(name) {
|
|
53
|
+
this.#locks.delete(name);
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* @internal Test-only helper: force an entry into the map with an
|
|
57
|
+
* arbitrary expiry. Used to simulate a crashed holder whose lock
|
|
58
|
+
* has already expired without advancing `Date.now()`. Not part of
|
|
59
|
+
* the public {@link LockBackend} contract — never call from
|
|
60
|
+
* production code.
|
|
61
|
+
*/
|
|
62
|
+
__setExpiryForTesting(name, expiryMs) {
|
|
63
|
+
this.#locks.set(name, expiryMs);
|
|
64
|
+
}
|
|
65
|
+
/** @internal Test-only helper — return the current map size. */
|
|
66
|
+
__sizeForTesting() {
|
|
67
|
+
return this.#locks.size;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
export default MemoryLockBackend;
|
|
71
|
+
//# sourceMappingURL=MemoryLockBackend.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MemoryLockBackend.js","sourceRoot":"","sources":["../../../src/scheduler/locks/MemoryLockBackend.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAA;AAGrD,MAAM,eAAe,GAAG,GAAG,CAAA;AAE3B,SAAS,cAAc,CAAC,KAAa;IACnC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,IAAI,CAAC,EAAE,CAAC;QAC1C,MAAM,IAAI,SAAS,CACjB,2BAA2B,EAC3B,kDAAkD,KAAK,EAAE,EACzD;YACE,IAAI,EAAE,4EAA4E;SACnF,CACF,CAAA;IACH,CAAC;AACH,CAAC;AAED,MAAM,OAAO,iBAAiB;IAC5B,MAAM,GAAG,IAAI,GAAG,EAAkB,CAAA;IAElC,KAAK,CAAC,OAAO,CAAC,IAAY,EAAE,KAAa;QACvC,cAAc,CAAC,KAAK,CAAC,CAAA;QACrB,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAA;QAEtB,8DAA8D;QAC9D,iEAAiE;QACjE,qDAAqD;QACrD,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,IAAI,eAAe,EAAE,CAAC;YACxC,KAAK,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;gBACxC,IAAI,MAAM,IAAI,GAAG;oBAAE,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;YAC5C,CAAC;QACH,CAAC;QAED,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;QACtC,IAAI,QAAQ,KAAK,SAAS,IAAI,QAAQ,GAAG,GAAG,EAAE,CAAC;YAC7C,OAAO,KAAK,CAAA;QACd,CAAC;QACD,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,GAAG,KAAK,CAAC,CAAA;QAClC,OAAO,IAAI,CAAA;IACb,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,IAAY;QACxB,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;IAC1B,CAAC;IAED;;;;;;OAMG;IACH,qBAAqB,CAAC,IAAY,EAAE,QAAgB;QAClD,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAA;IACjC,CAAC;IAED,gEAAgE;IAChE,gBAAgB;QACd,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI,CAAA;IACzB,CAAC;CACF;AAED,eAAe,iBAAiB,CAAA"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Callback invoked when a scheduled task throws. Typically bridges
|
|
3
|
+
* to `ErrorBoundary.serviceError` — but the scheduler does not
|
|
4
|
+
* import `ErrorBoundary` directly; the user wires the adapter
|
|
5
|
+
* per the "agnostic per package" rule.
|
|
6
|
+
*
|
|
7
|
+
* The scheduler wraps the call in its own `try/catch`, so an
|
|
8
|
+
* `ErrorReporter` that itself throws cannot crash the Rust ticker.
|
|
9
|
+
*
|
|
10
|
+
* @implements Story 28.4
|
|
11
|
+
*/
|
|
12
|
+
export type ErrorReporter = (err: unknown, context: {
|
|
13
|
+
taskName: string;
|
|
14
|
+
}) => void;
|
|
15
|
+
//# sourceMappingURL=ErrorReporter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ErrorReporter.d.ts","sourceRoot":"","sources":["../../../src/scheduler/observability/ErrorReporter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,MAAM,MAAM,aAAa,GAAG,CAAC,GAAG,EAAE,OAAO,EAAE,OAAO,EAAE;IAAE,QAAQ,EAAE,MAAM,CAAA;CAAE,KAAK,IAAI,CAAA"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Callback invoked when a scheduled task throws. Typically bridges
|
|
3
|
+
* to `ErrorBoundary.serviceError` — but the scheduler does not
|
|
4
|
+
* import `ErrorBoundary` directly; the user wires the adapter
|
|
5
|
+
* per the "agnostic per package" rule.
|
|
6
|
+
*
|
|
7
|
+
* The scheduler wraps the call in its own `try/catch`, so an
|
|
8
|
+
* `ErrorReporter` that itself throws cannot crash the Rust ticker.
|
|
9
|
+
*
|
|
10
|
+
* @implements Story 28.4
|
|
11
|
+
*/
|
|
12
|
+
export {};
|
|
13
|
+
//# sourceMappingURL=ErrorReporter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ErrorReporter.js","sourceRoot":"","sources":["../../../src/scheduler/observability/ErrorReporter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Discriminated union of events emitted by the scheduler's task
|
|
3
|
+
* invocation wrapper.
|
|
4
|
+
*
|
|
5
|
+
* All payloads are JSON-serializable so downstream sinks (the event bus,
|
|
6
|
+
* structured logs, metrics backends) can forward them without
|
|
7
|
+
* touching live `Error` instances.
|
|
8
|
+
*
|
|
9
|
+
* @implements Story 28.4
|
|
10
|
+
*/
|
|
11
|
+
export interface ScheduleTaskStartedEvent {
|
|
12
|
+
type: 'schedule.task.started';
|
|
13
|
+
taskName: string;
|
|
14
|
+
/** ms-epoch instant the Rust ticker chose for this fire. */
|
|
15
|
+
scheduledForMs: number;
|
|
16
|
+
/** ms-epoch at which the JS wrapper began running the user callback. */
|
|
17
|
+
startedAtMs: number;
|
|
18
|
+
}
|
|
19
|
+
export interface ScheduleTaskCompletedEvent {
|
|
20
|
+
type: 'schedule.task.completed';
|
|
21
|
+
taskName: string;
|
|
22
|
+
/** Wall-clock milliseconds spent running the callback. */
|
|
23
|
+
durationMs: number;
|
|
24
|
+
}
|
|
25
|
+
export interface ScheduleTaskFailedEvent {
|
|
26
|
+
type: 'schedule.task.failed';
|
|
27
|
+
taskName: string;
|
|
28
|
+
/** Plain-object projection of the thrown error (no live `Error`). */
|
|
29
|
+
error: {
|
|
30
|
+
name: string;
|
|
31
|
+
message: string;
|
|
32
|
+
stack?: string;
|
|
33
|
+
};
|
|
34
|
+
/** Wall-clock milliseconds until the throw. */
|
|
35
|
+
durationMs: number;
|
|
36
|
+
}
|
|
37
|
+
export interface ScheduleTaskSkippedEvent {
|
|
38
|
+
type: 'schedule.task.skipped';
|
|
39
|
+
taskName: string;
|
|
40
|
+
/** Reason this tick did not execute the task body.
|
|
41
|
+
* - `'locked'` — distributed-lock backend reported the slot as
|
|
42
|
+
* already held by another instance.
|
|
43
|
+
* - `'acquire-failed'` — the lock backend itself threw/rejected
|
|
44
|
+
* (e.g. Redis connection drop); the scheduler treats the tick
|
|
45
|
+
* as skipped for observability rather than silently dropping.
|
|
46
|
+
* - `'already-running'` — an in-process invocation of the same
|
|
47
|
+
* task is already in flight (ticker + concurrent `runTaskNow`,
|
|
48
|
+
* or two simultaneous `runTaskNow` calls). The duplicate is
|
|
49
|
+
* dropped to prevent double-execution of non-idempotent tasks.
|
|
50
|
+
*
|
|
51
|
+
* Left open for future reasons (e.g. `'paused'`). Consumers that
|
|
52
|
+
* branch on `reason` should handle unknown values defensively
|
|
53
|
+
* (log + treat as skip) so adding a new variant is non-breaking. */
|
|
54
|
+
reason: 'locked' | 'acquire-failed' | 'already-running';
|
|
55
|
+
}
|
|
56
|
+
export type ScheduleEvent = ScheduleTaskStartedEvent | ScheduleTaskCompletedEvent | ScheduleTaskFailedEvent | ScheduleTaskSkippedEvent;
|
|
57
|
+
//# sourceMappingURL=ScheduleEvent.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ScheduleEvent.d.ts","sourceRoot":"","sources":["../../../src/scheduler/observability/ScheduleEvent.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,MAAM,WAAW,wBAAwB;IACvC,IAAI,EAAE,uBAAuB,CAAA;IAC7B,QAAQ,EAAE,MAAM,CAAA;IAChB,4DAA4D;IAC5D,cAAc,EAAE,MAAM,CAAA;IACtB,wEAAwE;IACxE,WAAW,EAAE,MAAM,CAAA;CACpB;AAED,MAAM,WAAW,0BAA0B;IACzC,IAAI,EAAE,yBAAyB,CAAA;IAC/B,QAAQ,EAAE,MAAM,CAAA;IAChB,0DAA0D;IAC1D,UAAU,EAAE,MAAM,CAAA;CACnB;AAED,MAAM,WAAW,uBAAuB;IACtC,IAAI,EAAE,sBAAsB,CAAA;IAC5B,QAAQ,EAAE,MAAM,CAAA;IAChB,qEAAqE;IACrE,KAAK,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAA;IACxD,+CAA+C;IAC/C,UAAU,EAAE,MAAM,CAAA;CACnB;AAED,MAAM,WAAW,wBAAwB;IACvC,IAAI,EAAE,uBAAuB,CAAA;IAC7B,QAAQ,EAAE,MAAM,CAAA;IAChB;;;;;;;;;;;;;yEAaqE;IACrE,MAAM,EAAE,QAAQ,GAAG,gBAAgB,GAAG,iBAAiB,CAAA;CACxD;AAED,MAAM,MAAM,aAAa,GACrB,wBAAwB,GACxB,0BAA0B,GAC1B,uBAAuB,GACvB,wBAAwB,CAAA"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Discriminated union of events emitted by the scheduler's task
|
|
3
|
+
* invocation wrapper.
|
|
4
|
+
*
|
|
5
|
+
* All payloads are JSON-serializable so downstream sinks (the event bus,
|
|
6
|
+
* structured logs, metrics backends) can forward them without
|
|
7
|
+
* touching live `Error` instances.
|
|
8
|
+
*
|
|
9
|
+
* @implements Story 28.4
|
|
10
|
+
*/
|
|
11
|
+
export {};
|
|
12
|
+
//# sourceMappingURL=ScheduleEvent.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ScheduleEvent.js","sourceRoot":"","sources":["../../../src/scheduler/observability/ScheduleEvent.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Destination for scheduler task-invocation events.
|
|
3
|
+
*
|
|
4
|
+
* This interface is intentionally minimal so users can adapt to any
|
|
5
|
+
* event bus (the bus, a raw `EventEmitter`, a structured logger). The
|
|
6
|
+
* scheduler does NOT import the event bus directly — writing the
|
|
7
|
+
* bridge is the user's responsibility per the project's "agnostic
|
|
8
|
+
* per package" rule.
|
|
9
|
+
*
|
|
10
|
+
* The scheduler treats `emit` as fire-and-forget: it does not await
|
|
11
|
+
* the return value, and any sync throw is caught at the call site so
|
|
12
|
+
* a buggy adapter cannot crash the Rust ticker.
|
|
13
|
+
*
|
|
14
|
+
* @implements Story 28.4
|
|
15
|
+
*/
|
|
16
|
+
import type { ScheduleEvent } from './ScheduleEvent.js';
|
|
17
|
+
export interface ScheduleEventSink {
|
|
18
|
+
emit(event: ScheduleEvent): void | Promise<void>;
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=ScheduleEventSink.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ScheduleEventSink.d.ts","sourceRoot":"","sources":["../../../src/scheduler/observability/ScheduleEventSink.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA;AAEvD,MAAM,WAAW,iBAAiB;IAChC,IAAI,CAAC,KAAK,EAAE,aAAa,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;CACjD"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Destination for scheduler task-invocation events.
|
|
3
|
+
*
|
|
4
|
+
* This interface is intentionally minimal so users can adapt to any
|
|
5
|
+
* event bus (the bus, a raw `EventEmitter`, a structured logger). The
|
|
6
|
+
* scheduler does NOT import the event bus directly — writing the
|
|
7
|
+
* bridge is the user's responsibility per the project's "agnostic
|
|
8
|
+
* per package" rule.
|
|
9
|
+
*
|
|
10
|
+
* The scheduler treats `emit` as fire-and-forget: it does not await
|
|
11
|
+
* the return value, and any sync throw is caught at the call site so
|
|
12
|
+
* a buggy adapter cannot crash the Rust ticker.
|
|
13
|
+
*
|
|
14
|
+
* @implements Story 28.4
|
|
15
|
+
*/
|
|
16
|
+
export {};
|
|
17
|
+
//# sourceMappingURL=ScheduleEventSink.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ScheduleEventSink.js","sourceRoot":"","sources":["../../../src/scheduler/observability/ScheduleEventSink.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Per-task run statistics. Populated by the scheduler's invocation
|
|
3
|
+
* wrapper and surfaced via `Scheduler.getStats(taskName)`.
|
|
4
|
+
*
|
|
5
|
+
* `nextRunMs` is NOT tracked here — it is read live from the Rust
|
|
6
|
+
* NAPI layer every time `Scheduler.getStats` is called. This tracker
|
|
7
|
+
* only owns counters that accumulate over time.
|
|
8
|
+
*
|
|
9
|
+
* @implements Story 28.4
|
|
10
|
+
*/
|
|
11
|
+
export interface TaskStats {
|
|
12
|
+
/** ms-epoch of the most recent fire that the wrapper STARTED (lock-skipped fires do not update this). `null` if never started. */
|
|
13
|
+
lastRunMs: number | null;
|
|
14
|
+
/** ms-epoch of the next scheduled fire as reported by the Rust core. `null` when the task is unknown or the core returns null. */
|
|
15
|
+
nextRunMs: number | null;
|
|
16
|
+
/** Total terminal invocations: completed + failed + skipped. */
|
|
17
|
+
runCount: number;
|
|
18
|
+
/** Completed (callback resolved without throwing). */
|
|
19
|
+
successCount: number;
|
|
20
|
+
/** Failed (callback threw / rejected). */
|
|
21
|
+
errorCount: number;
|
|
22
|
+
/** Skipped (lock backend reported the task already held by another instance). */
|
|
23
|
+
skippedCount: number;
|
|
24
|
+
/**
|
|
25
|
+
* Rolling average wall-clock duration over completed + failed
|
|
26
|
+
* runs (skipped runs have no duration and are excluded). `0`
|
|
27
|
+
* until at least one duration has been recorded.
|
|
28
|
+
*/
|
|
29
|
+
avgDurationMs: number;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* O(1) in-memory counter map — one entry per task name seen. Never
|
|
33
|
+
* grows beyond the number of distinct task names the scheduler has
|
|
34
|
+
* seen; no per-run history retained.
|
|
35
|
+
*/
|
|
36
|
+
export declare class StatsTracker {
|
|
37
|
+
#private;
|
|
38
|
+
recordStarted(name: string, startedAtMs: number): void;
|
|
39
|
+
recordCompleted(name: string, durationMs: number): void;
|
|
40
|
+
recordFailed(name: string, durationMs: number): void;
|
|
41
|
+
recordSkipped(name: string): void;
|
|
42
|
+
/**
|
|
43
|
+
* Return a defensive snapshot. Unknown tasks yield a zeroed
|
|
44
|
+
* snapshot with `null` timestamps. `nextRunMs` is always `null`
|
|
45
|
+
* here — the caller (`Scheduler.getStats`) overlays the live
|
|
46
|
+
* value from the NAPI layer.
|
|
47
|
+
*/
|
|
48
|
+
get(name: string): TaskStats;
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=StatsTracker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"StatsTracker.d.ts","sourceRoot":"","sources":["../../../src/scheduler/observability/StatsTracker.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,MAAM,WAAW,SAAS;IACxB,kIAAkI;IAClI,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;IACxB,kIAAkI;IAClI,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;IACxB,gEAAgE;IAChE,QAAQ,EAAE,MAAM,CAAA;IAChB,sDAAsD;IACtD,YAAY,EAAE,MAAM,CAAA;IACpB,0CAA0C;IAC1C,UAAU,EAAE,MAAM,CAAA;IAClB,iFAAiF;IACjF,YAAY,EAAE,MAAM,CAAA;IACpB;;;;OAIG;IACH,aAAa,EAAE,MAAM,CAAA;CACtB;AAwBD;;;;GAIG;AACH,qBAAa,YAAY;;IAYvB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,IAAI;IAItD,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,IAAI;IAavD,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,IAAI;IAUpD,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAMjC;;;;;OAKG;IACH,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS;CAuB7B"}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Per-task run statistics. Populated by the scheduler's invocation
|
|
3
|
+
* wrapper and surfaced via `Scheduler.getStats(taskName)`.
|
|
4
|
+
*
|
|
5
|
+
* `nextRunMs` is NOT tracked here — it is read live from the Rust
|
|
6
|
+
* NAPI layer every time `Scheduler.getStats` is called. This tracker
|
|
7
|
+
* only owns counters that accumulate over time.
|
|
8
|
+
*
|
|
9
|
+
* @implements Story 28.4
|
|
10
|
+
*/
|
|
11
|
+
function zeroInternal() {
|
|
12
|
+
return {
|
|
13
|
+
lastRunMs: null,
|
|
14
|
+
runCount: 0,
|
|
15
|
+
successCount: 0,
|
|
16
|
+
errorCount: 0,
|
|
17
|
+
skippedCount: 0,
|
|
18
|
+
totalDurationMs: 0,
|
|
19
|
+
durationRunCount: 0,
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* O(1) in-memory counter map — one entry per task name seen. Never
|
|
24
|
+
* grows beyond the number of distinct task names the scheduler has
|
|
25
|
+
* seen; no per-run history retained.
|
|
26
|
+
*/
|
|
27
|
+
export class StatsTracker {
|
|
28
|
+
#stats = new Map();
|
|
29
|
+
#ensure(name) {
|
|
30
|
+
let s = this.#stats.get(name);
|
|
31
|
+
if (!s) {
|
|
32
|
+
s = zeroInternal();
|
|
33
|
+
this.#stats.set(name, s);
|
|
34
|
+
}
|
|
35
|
+
return s;
|
|
36
|
+
}
|
|
37
|
+
recordStarted(name, startedAtMs) {
|
|
38
|
+
this.#ensure(name).lastRunMs = startedAtMs;
|
|
39
|
+
}
|
|
40
|
+
recordCompleted(name, durationMs) {
|
|
41
|
+
const s = this.#ensure(name);
|
|
42
|
+
s.runCount++;
|
|
43
|
+
s.successCount++;
|
|
44
|
+
// Guard against non-finite durations — a caller bug passing NaN or
|
|
45
|
+
// Infinity would permanently poison the rolling average. Still
|
|
46
|
+
// count the run; only skip the duration accumulation.
|
|
47
|
+
if (Number.isFinite(durationMs)) {
|
|
48
|
+
s.totalDurationMs += durationMs;
|
|
49
|
+
s.durationRunCount++;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
recordFailed(name, durationMs) {
|
|
53
|
+
const s = this.#ensure(name);
|
|
54
|
+
s.runCount++;
|
|
55
|
+
s.errorCount++;
|
|
56
|
+
if (Number.isFinite(durationMs)) {
|
|
57
|
+
s.totalDurationMs += durationMs;
|
|
58
|
+
s.durationRunCount++;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
recordSkipped(name) {
|
|
62
|
+
const s = this.#ensure(name);
|
|
63
|
+
s.runCount++;
|
|
64
|
+
s.skippedCount++;
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Return a defensive snapshot. Unknown tasks yield a zeroed
|
|
68
|
+
* snapshot with `null` timestamps. `nextRunMs` is always `null`
|
|
69
|
+
* here — the caller (`Scheduler.getStats`) overlays the live
|
|
70
|
+
* value from the NAPI layer.
|
|
71
|
+
*/
|
|
72
|
+
get(name) {
|
|
73
|
+
const s = this.#stats.get(name);
|
|
74
|
+
if (!s) {
|
|
75
|
+
return {
|
|
76
|
+
lastRunMs: null,
|
|
77
|
+
nextRunMs: null,
|
|
78
|
+
runCount: 0,
|
|
79
|
+
successCount: 0,
|
|
80
|
+
errorCount: 0,
|
|
81
|
+
skippedCount: 0,
|
|
82
|
+
avgDurationMs: 0,
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
return {
|
|
86
|
+
lastRunMs: s.lastRunMs,
|
|
87
|
+
nextRunMs: null,
|
|
88
|
+
runCount: s.runCount,
|
|
89
|
+
successCount: s.successCount,
|
|
90
|
+
errorCount: s.errorCount,
|
|
91
|
+
skippedCount: s.skippedCount,
|
|
92
|
+
avgDurationMs: s.durationRunCount > 0 ? s.totalDurationMs / s.durationRunCount : 0,
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
//# sourceMappingURL=StatsTracker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"StatsTracker.js","sourceRoot":"","sources":["../../../src/scheduler/observability/StatsTracker.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cookie signing and encryption.
|
|
3
|
+
* Uses Rust NAPI via crypto facade when available.
|
|
4
|
+
*/
|
|
5
|
+
export declare class CookieSigner {
|
|
6
|
+
#private;
|
|
7
|
+
constructor(secret: string);
|
|
8
|
+
sign(value: string): string;
|
|
9
|
+
unsign(signed: string): string | null;
|
|
10
|
+
encrypt(value: string): string;
|
|
11
|
+
decrypt(encrypted: string): string | null;
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=CookieSigner.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CookieSigner.d.ts","sourceRoot":"","sources":["../../src/security/CookieSigner.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,qBAAa,YAAY;;gBAIX,MAAM,EAAE,MAAM;IAM1B,IAAI,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM;IAK3B,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAQrC,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM;IAQ9B,OAAO,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;CAc1C"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cookie signing and encryption.
|
|
3
|
+
* Uses Rust NAPI via crypto facade when available.
|
|
4
|
+
*/
|
|
5
|
+
import { createCipheriv, createDecipheriv, createHmac, randomBytes } from 'node:crypto';
|
|
6
|
+
import { hmacSign, hmacVerify } from './crypto.js';
|
|
7
|
+
export class CookieSigner {
|
|
8
|
+
#secret;
|
|
9
|
+
#keyBuffer;
|
|
10
|
+
constructor(secret) {
|
|
11
|
+
this.#secret = secret;
|
|
12
|
+
// Derive a 32-byte key for AES-256-GCM via HKDF-like derivation
|
|
13
|
+
this.#keyBuffer = Buffer.from(createHmac('sha256', secret).update('cookie-key').digest());
|
|
14
|
+
}
|
|
15
|
+
sign(value) {
|
|
16
|
+
const sig = hmacSign(value, this.#secret);
|
|
17
|
+
return `${value}.${sig}`;
|
|
18
|
+
}
|
|
19
|
+
unsign(signed) {
|
|
20
|
+
const lastDot = signed.lastIndexOf('.');
|
|
21
|
+
if (lastDot === -1)
|
|
22
|
+
return null;
|
|
23
|
+
const value = signed.slice(0, lastDot);
|
|
24
|
+
const sig = signed.slice(lastDot + 1);
|
|
25
|
+
return hmacVerify(value, sig, this.#secret) ? value : null;
|
|
26
|
+
}
|
|
27
|
+
encrypt(value) {
|
|
28
|
+
const iv = randomBytes(12);
|
|
29
|
+
const cipher = createCipheriv('aes-256-gcm', this.#keyBuffer, iv);
|
|
30
|
+
const encrypted = Buffer.concat([cipher.update(value, 'utf8'), cipher.final()]);
|
|
31
|
+
const tag = cipher.getAuthTag();
|
|
32
|
+
return `${iv.toString('base64url')}.${encrypted.toString('base64url')}.${tag.toString('base64url')}`;
|
|
33
|
+
}
|
|
34
|
+
decrypt(encrypted) {
|
|
35
|
+
const parts = encrypted.split('.');
|
|
36
|
+
if (parts.length !== 3)
|
|
37
|
+
return null;
|
|
38
|
+
try {
|
|
39
|
+
const iv = Buffer.from(parts[0], 'base64url');
|
|
40
|
+
const data = Buffer.from(parts[1], 'base64url');
|
|
41
|
+
const tag = Buffer.from(parts[2], 'base64url');
|
|
42
|
+
const decipher = createDecipheriv('aes-256-gcm', this.#keyBuffer, iv);
|
|
43
|
+
decipher.setAuthTag(tag);
|
|
44
|
+
return Buffer.concat([decipher.update(data), decipher.final()]).toString('utf8');
|
|
45
|
+
}
|
|
46
|
+
catch {
|
|
47
|
+
return null;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=CookieSigner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CookieSigner.js","sourceRoot":"","sources":["../../src/security/CookieSigner.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Signed URLs — HMAC-SHA256 with expiration.
|
|
3
|
+
* Uses Rust NAPI via crypto facade when available.
|
|
4
|
+
*/
|
|
5
|
+
export interface SignedUrlConfig {
|
|
6
|
+
secret: string;
|
|
7
|
+
}
|
|
8
|
+
export declare class SignedUrl {
|
|
9
|
+
#private;
|
|
10
|
+
constructor(config: SignedUrlConfig);
|
|
11
|
+
make(path: string, options?: {
|
|
12
|
+
expiresIn?: string | number;
|
|
13
|
+
purpose?: string;
|
|
14
|
+
}): string;
|
|
15
|
+
verify(urlString: string, purpose?: string): boolean;
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=SignedUrl.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SignedUrl.d.ts","sourceRoot":"","sources":["../../src/security/SignedUrl.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,MAAM,CAAA;CACf;AAED,qBAAa,SAAS;;gBAGR,MAAM,EAAE,eAAe;IAInC,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,MAAM;IAqBvF,MAAM,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO;CAYrD"}
|