@justscale/core 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/README.md +261 -0
- package/bin/just.js +34 -0
- package/dist/app.d.ts +56 -0
- package/dist/app.d.ts.map +1 -0
- package/dist/app.js +182 -0
- package/dist/app.js.map +1 -0
- package/dist/builder/build-context.d.ts +8 -0
- package/dist/builder/build-context.d.ts.map +1 -0
- package/dist/builder/build-context.js +4 -0
- package/dist/builder/build-context.js.map +1 -0
- package/dist/builder/builder.d.ts +60 -0
- package/dist/builder/builder.d.ts.map +1 -0
- package/dist/builder/builder.js +72 -0
- package/dist/builder/builder.js.map +1 -0
- package/dist/builder/create-builder.d.ts +36 -0
- package/dist/builder/create-builder.d.ts.map +1 -0
- package/dist/builder/create-builder.js +66 -0
- package/dist/builder/create-builder.js.map +1 -0
- package/dist/builder/execute.d.ts +37 -0
- package/dist/builder/execute.d.ts.map +1 -0
- package/dist/builder/execute.js +62 -0
- package/dist/builder/execute.js.map +1 -0
- package/dist/builder/feature-builder.d.ts +147 -0
- package/dist/builder/feature-builder.d.ts.map +1 -0
- package/dist/builder/feature-builder.js +138 -0
- package/dist/builder/feature-builder.js.map +1 -0
- package/dist/builder/index.d.ts +35 -0
- package/dist/builder/index.d.ts.map +1 -0
- package/dist/builder/index.js +37 -0
- package/dist/builder/index.js.map +1 -0
- package/dist/builder/plugin.d.ts +90 -0
- package/dist/builder/plugin.d.ts.map +1 -0
- package/dist/builder/plugin.js +101 -0
- package/dist/builder/plugin.js.map +1 -0
- package/dist/builder/plugins/query.d.ts +31 -0
- package/dist/builder/plugins/query.d.ts.map +1 -0
- package/dist/builder/plugins/query.js +42 -0
- package/dist/builder/plugins/query.js.map +1 -0
- package/dist/builder/plugins/validation.d.ts +12 -0
- package/dist/builder/plugins/validation.d.ts.map +1 -0
- package/dist/builder/plugins/validation.js +12 -0
- package/dist/builder/plugins/validation.js.map +1 -0
- package/dist/builder/sort.d.ts +27 -0
- package/dist/builder/sort.d.ts.map +1 -0
- package/dist/builder/sort.js +210 -0
- package/dist/builder/sort.js.map +1 -0
- package/dist/builder/stop.d.ts +24 -0
- package/dist/builder/stop.d.ts.map +1 -0
- package/dist/builder/stop.js +27 -0
- package/dist/builder/stop.js.map +1 -0
- package/dist/builder/test/permits-type-spike.d.ts +8 -0
- package/dist/builder/test/permits-type-spike.d.ts.map +1 -0
- package/dist/builder/test/permits-type-spike.js +117 -0
- package/dist/builder/test/permits-type-spike.js.map +1 -0
- package/dist/builder/types.d.ts +678 -0
- package/dist/builder/types.d.ts.map +1 -0
- package/dist/builder/types.js +98 -0
- package/dist/builder/types.js.map +1 -0
- package/dist/builder/validation.d.ts +101 -0
- package/dist/builder/validation.d.ts.map +1 -0
- package/dist/builder/validation.js +335 -0
- package/dist/builder/validation.js.map +1 -0
- package/dist/cli/adapter.d.ts +23 -0
- package/dist/cli/adapter.d.ts.map +1 -0
- package/dist/cli/adapter.js +26 -0
- package/dist/cli/adapter.js.map +1 -0
- package/dist/cli/args.d.ts +150 -0
- package/dist/cli/args.d.ts.map +1 -0
- package/dist/cli/args.js +172 -0
- package/dist/cli/args.js.map +1 -0
- package/dist/cli/assemble.d.ts +20 -0
- package/dist/cli/assemble.d.ts.map +1 -0
- package/dist/cli/assemble.js +55 -0
- package/dist/cli/assemble.js.map +1 -0
- package/dist/cli/bin/main.d.ts +26 -0
- package/dist/cli/bin/main.d.ts.map +1 -0
- package/dist/cli/bin/main.js +475 -0
- package/dist/cli/bin/main.js.map +1 -0
- package/dist/cli/build/migrations-plugin.d.ts +21 -0
- package/dist/cli/build/migrations-plugin.d.ts.map +1 -0
- package/dist/cli/build/migrations-plugin.js +41 -0
- package/dist/cli/build/migrations-plugin.js.map +1 -0
- package/dist/cli/build/process-plugin.d.ts +29 -0
- package/dist/cli/build/process-plugin.d.ts.map +1 -0
- package/dist/cli/build/process-plugin.js +66 -0
- package/dist/cli/build/process-plugin.js.map +1 -0
- package/dist/cli/builder/create-cli-builder.d.ts +42 -0
- package/dist/cli/builder/create-cli-builder.d.ts.map +1 -0
- package/dist/cli/builder/create-cli-builder.js +104 -0
- package/dist/cli/builder/create-cli-builder.js.map +1 -0
- package/dist/cli/builder/index.d.ts +8 -0
- package/dist/cli/builder/index.d.ts.map +1 -0
- package/dist/cli/builder/index.js +7 -0
- package/dist/cli/builder/index.js.map +1 -0
- package/dist/cli/builder/types.d.ts +113 -0
- package/dist/cli/builder/types.d.ts.map +1 -0
- package/dist/cli/builder/types.js +7 -0
- package/dist/cli/builder/types.js.map +1 -0
- package/dist/cli/cluster.d.ts +8 -0
- package/dist/cli/cluster.d.ts.map +1 -0
- package/dist/cli/cluster.js +145 -0
- package/dist/cli/cluster.js.map +1 -0
- package/dist/cli/current-app.d.ts +36 -0
- package/dist/cli/current-app.d.ts.map +1 -0
- package/dist/cli/current-app.js +21 -0
- package/dist/cli/current-app.js.map +1 -0
- package/dist/cli/define-app.d.ts +35 -0
- package/dist/cli/define-app.d.ts.map +1 -0
- package/dist/cli/define-app.js +79 -0
- package/dist/cli/define-app.js.map +1 -0
- package/dist/cli/define-main.d.ts +33 -0
- package/dist/cli/define-main.d.ts.map +1 -0
- package/dist/cli/define-main.js +67 -0
- package/dist/cli/define-main.js.map +1 -0
- package/dist/cli/define-project.d.ts +93 -0
- package/dist/cli/define-project.d.ts.map +1 -0
- package/dist/cli/define-project.js +85 -0
- package/dist/cli/define-project.js.map +1 -0
- package/dist/cli/dev-server.d.ts +20 -0
- package/dist/cli/dev-server.d.ts.map +1 -0
- package/dist/cli/dev-server.js +131 -0
- package/dist/cli/dev-server.js.map +1 -0
- package/dist/cli/discovery.d.ts +29 -0
- package/dist/cli/discovery.d.ts.map +1 -0
- package/dist/cli/discovery.js +142 -0
- package/dist/cli/discovery.js.map +1 -0
- package/dist/cli/factory.d.ts +43 -0
- package/dist/cli/factory.d.ts.map +1 -0
- package/dist/cli/factory.js +52 -0
- package/dist/cli/factory.js.map +1 -0
- package/dist/cli/generators/ai.d.ts +3 -0
- package/dist/cli/generators/ai.d.ts.map +1 -0
- package/dist/cli/generators/ai.js +65 -0
- package/dist/cli/generators/ai.js.map +1 -0
- package/dist/cli/generators/ci.d.ts +5 -0
- package/dist/cli/generators/ci.d.ts.map +1 -0
- package/dist/cli/generators/ci.js +102 -0
- package/dist/cli/generators/ci.js.map +1 -0
- package/dist/cli/generators/detect.d.ts +15 -0
- package/dist/cli/generators/detect.d.ts.map +1 -0
- package/dist/cli/generators/detect.js +75 -0
- package/dist/cli/generators/detect.js.map +1 -0
- package/dist/cli/generators/ide.d.ts +3 -0
- package/dist/cli/generators/ide.d.ts.map +1 -0
- package/dist/cli/generators/ide.js +179 -0
- package/dist/cli/generators/ide.js.map +1 -0
- package/dist/cli/generators/index.d.ts +5 -0
- package/dist/cli/generators/index.d.ts.map +1 -0
- package/dist/cli/generators/index.js +5 -0
- package/dist/cli/generators/index.js.map +1 -0
- package/dist/cli/index.d.ts +81 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +88 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/io.d.ts +131 -0
- package/dist/cli/io.d.ts.map +1 -0
- package/dist/cli/io.js +373 -0
- package/dist/cli/io.js.map +1 -0
- package/dist/cli/mcp/server.d.ts +23 -0
- package/dist/cli/mcp/server.d.ts.map +1 -0
- package/dist/cli/mcp/server.js +148 -0
- package/dist/cli/mcp/server.js.map +1 -0
- package/dist/cli/parser.d.ts +106 -0
- package/dist/cli/parser.d.ts.map +1 -0
- package/dist/cli/parser.js +520 -0
- package/dist/cli/parser.js.map +1 -0
- package/dist/cli/runner.d.ts +75 -0
- package/dist/cli/runner.d.ts.map +1 -0
- package/dist/cli/runner.js +422 -0
- package/dist/cli/runner.js.map +1 -0
- package/dist/cli/service.d.ts +61 -0
- package/dist/cli/service.d.ts.map +1 -0
- package/dist/cli/service.js +95 -0
- package/dist/cli/service.js.map +1 -0
- package/dist/cli/types.d.ts +47 -0
- package/dist/cli/types.d.ts.map +1 -0
- package/dist/cli/types.js +20 -0
- package/dist/cli/types.js.map +1 -0
- package/dist/cli/wizard.d.ts +11 -0
- package/dist/cli/wizard.d.ts.map +1 -0
- package/dist/cli/wizard.js +2 -0
- package/dist/cli/wizard.js.map +1 -0
- package/dist/cli/workspace-controller.d.ts +36 -0
- package/dist/cli/workspace-controller.d.ts.map +1 -0
- package/dist/cli/workspace-controller.js +896 -0
- package/dist/cli/workspace-controller.js.map +1 -0
- package/dist/cluster/client.d.ts +101 -0
- package/dist/cluster/client.d.ts.map +1 -0
- package/dist/cluster/client.js +256 -0
- package/dist/cluster/client.js.map +1 -0
- package/dist/cluster/cluster.d.ts +82 -0
- package/dist/cluster/cluster.d.ts.map +1 -0
- package/dist/cluster/cluster.js +27 -0
- package/dist/cluster/cluster.js.map +1 -0
- package/dist/cluster/coordinator/cluster-node.model.d.ts +14 -0
- package/dist/cluster/coordinator/cluster-node.model.d.ts.map +1 -0
- package/dist/cluster/coordinator/cluster-node.model.js +15 -0
- package/dist/cluster/coordinator/cluster-node.model.js.map +1 -0
- package/dist/cluster/coordinator/cluster-signals.d.ts +45 -0
- package/dist/cluster/coordinator/cluster-signals.d.ts.map +1 -0
- package/dist/cluster/coordinator/cluster-signals.js +24 -0
- package/dist/cluster/coordinator/cluster-signals.js.map +1 -0
- package/dist/cluster/coordinator/coordinator.process.d.ts +21 -0
- package/dist/cluster/coordinator/coordinator.process.d.ts.map +1 -0
- package/dist/cluster/coordinator/coordinator.process.js +221 -0
- package/dist/cluster/coordinator/coordinator.process.js.map +1 -0
- package/dist/cluster/coordinator/index.d.ts +13 -0
- package/dist/cluster/coordinator/index.d.ts.map +1 -0
- package/dist/cluster/coordinator/index.js +13 -0
- package/dist/cluster/coordinator/index.js.map +1 -0
- package/dist/cluster/coordinator/node-lifecycle.d.ts +31 -0
- package/dist/cluster/coordinator/node-lifecycle.d.ts.map +1 -0
- package/dist/cluster/coordinator/node-lifecycle.js +178 -0
- package/dist/cluster/coordinator/node-lifecycle.js.map +1 -0
- package/dist/cluster/index.d.ts +45 -0
- package/dist/cluster/index.d.ts.map +1 -0
- package/dist/cluster/index.js +57 -0
- package/dist/cluster/index.js.map +1 -0
- package/dist/cluster/protocol.d.ts +204 -0
- package/dist/cluster/protocol.d.ts.map +1 -0
- package/dist/cluster/protocol.js +274 -0
- package/dist/cluster/protocol.js.map +1 -0
- package/dist/cluster/scheduled-task/builder.d.ts +24 -0
- package/dist/cluster/scheduled-task/builder.d.ts.map +1 -0
- package/dist/cluster/scheduled-task/builder.js +63 -0
- package/dist/cluster/scheduled-task/builder.js.map +1 -0
- package/dist/cluster/scheduled-task/factory.d.ts +76 -0
- package/dist/cluster/scheduled-task/factory.d.ts.map +1 -0
- package/dist/cluster/scheduled-task/factory.js +64 -0
- package/dist/cluster/scheduled-task/factory.js.map +1 -0
- package/dist/cluster/scheduled-task/index.d.ts +43 -0
- package/dist/cluster/scheduled-task/index.d.ts.map +1 -0
- package/dist/cluster/scheduled-task/index.js +45 -0
- package/dist/cluster/scheduled-task/index.js.map +1 -0
- package/dist/cluster/scheduled-task/transport.d.ts +12 -0
- package/dist/cluster/scheduled-task/transport.d.ts.map +1 -0
- package/dist/cluster/scheduled-task/transport.js +146 -0
- package/dist/cluster/scheduled-task/transport.js.map +1 -0
- package/dist/cluster/scheduled-task/types.d.ts +89 -0
- package/dist/cluster/scheduled-task/types.d.ts.map +1 -0
- package/dist/cluster/scheduled-task/types.js +7 -0
- package/dist/cluster/scheduled-task/types.js.map +1 -0
- package/dist/cluster/server.d.ts +87 -0
- package/dist/cluster/server.d.ts.map +1 -0
- package/dist/cluster/server.js +290 -0
- package/dist/cluster/server.js.map +1 -0
- package/dist/cluster/transport.d.ts +86 -0
- package/dist/cluster/transport.d.ts.map +1 -0
- package/dist/cluster/transport.js +138 -0
- package/dist/cluster/transport.js.map +1 -0
- package/dist/core/container-hooks.d.ts +22 -0
- package/dist/core/container-hooks.d.ts.map +1 -0
- package/dist/core/container-hooks.js +29 -0
- package/dist/core/container-hooks.js.map +1 -0
- package/dist/core/container-reflection.d.ts +71 -0
- package/dist/core/container-reflection.d.ts.map +1 -0
- package/dist/core/container-reflection.js +60 -0
- package/dist/core/container-reflection.js.map +1 -0
- package/dist/core/context.d.ts +146 -0
- package/dist/core/context.d.ts.map +1 -0
- package/dist/core/context.js +155 -0
- package/dist/core/context.js.map +1 -0
- package/dist/core/contribution.d.ts +152 -0
- package/dist/core/contribution.d.ts.map +1 -0
- package/dist/core/contribution.js +213 -0
- package/dist/core/contribution.js.map +1 -0
- package/dist/core/controller.contextual.d.ts +193 -0
- package/dist/core/controller.contextual.d.ts.map +1 -0
- package/dist/core/controller.contextual.js +459 -0
- package/dist/core/controller.contextual.js.map +1 -0
- package/dist/core/controller.d.ts +510 -0
- package/dist/core/controller.d.ts.map +1 -0
- package/dist/core/controller.js +411 -0
- package/dist/core/controller.js.map +1 -0
- package/dist/core/controller.procedure.d.ts +147 -0
- package/dist/core/controller.procedure.d.ts.map +1 -0
- package/dist/core/controller.procedure.js +115 -0
- package/dist/core/controller.procedure.js.map +1 -0
- package/dist/core/disposable.d.ts +126 -0
- package/dist/core/disposable.d.ts.map +1 -0
- package/dist/core/disposable.js +179 -0
- package/dist/core/disposable.js.map +1 -0
- package/dist/core/hmr.d.ts +83 -0
- package/dist/core/hmr.d.ts.map +1 -0
- package/dist/core/hmr.js +211 -0
- package/dist/core/hmr.js.map +1 -0
- package/dist/core/index.d.ts +17 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +25 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/internal/routes.d.ts +26 -0
- package/dist/core/internal/routes.d.ts.map +1 -0
- package/dist/core/internal/routes.js +48 -0
- package/dist/core/internal/routes.js.map +1 -0
- package/dist/core/lifecycle-impl.d.ts +45 -0
- package/dist/core/lifecycle-impl.d.ts.map +1 -0
- package/dist/core/lifecycle-impl.js +102 -0
- package/dist/core/lifecycle-impl.js.map +1 -0
- package/dist/core/lifecycle.d.ts +86 -0
- package/dist/core/lifecycle.d.ts.map +1 -0
- package/dist/core/lifecycle.js +38 -0
- package/dist/core/lifecycle.js.map +1 -0
- package/dist/core/logger.d.ts +282 -0
- package/dist/core/logger.d.ts.map +1 -0
- package/dist/core/logger.js +368 -0
- package/dist/core/logger.js.map +1 -0
- package/dist/core/middleware.d.ts +108 -0
- package/dist/core/middleware.d.ts.map +1 -0
- package/dist/core/middleware.js +60 -0
- package/dist/core/middleware.js.map +1 -0
- package/dist/core/openapi-methods.d.ts +61 -0
- package/dist/core/openapi-methods.d.ts.map +1 -0
- package/dist/core/openapi-methods.js +53 -0
- package/dist/core/openapi-methods.js.map +1 -0
- package/dist/core/plugin.d.ts +209 -0
- package/dist/core/plugin.d.ts.map +1 -0
- package/dist/core/plugin.js +36 -0
- package/dist/core/plugin.js.map +1 -0
- package/dist/core/scope-bridge.d.ts +19 -0
- package/dist/core/scope-bridge.d.ts.map +1 -0
- package/dist/core/scope-bridge.js +34 -0
- package/dist/core/scope-bridge.js.map +1 -0
- package/dist/core/service.d.ts +429 -0
- package/dist/core/service.d.ts.map +1 -0
- package/dist/core/service.js +875 -0
- package/dist/core/service.js.map +1 -0
- package/dist/features/channel/backend.d.ts +98 -0
- package/dist/features/channel/backend.d.ts.map +1 -0
- package/dist/features/channel/backend.js +75 -0
- package/dist/features/channel/backend.js.map +1 -0
- package/dist/features/channel/channel.d.ts +18 -0
- package/dist/features/channel/channel.d.ts.map +1 -0
- package/dist/features/channel/channel.js +219 -0
- package/dist/features/channel/channel.js.map +1 -0
- package/dist/features/channel/channels.d.ts +87 -0
- package/dist/features/channel/channels.d.ts.map +1 -0
- package/dist/features/channel/channels.js +252 -0
- package/dist/features/channel/channels.js.map +1 -0
- package/dist/features/channel/feature.d.ts +40 -0
- package/dist/features/channel/feature.d.ts.map +1 -0
- package/dist/features/channel/feature.js +44 -0
- package/dist/features/channel/feature.js.map +1 -0
- package/dist/features/channel/index.d.ts +41 -0
- package/dist/features/channel/index.d.ts.map +1 -0
- package/dist/features/channel/index.js +41 -0
- package/dist/features/channel/index.js.map +1 -0
- package/dist/features/channel/types.d.ts +165 -0
- package/dist/features/channel/types.d.ts.map +1 -0
- package/dist/features/channel/types.js +10 -0
- package/dist/features/channel/types.js.map +1 -0
- package/dist/features/config/cli/config-controller.d.ts +77 -0
- package/dist/features/config/cli/config-controller.d.ts.map +1 -0
- package/dist/features/config/cli/config-controller.js +209 -0
- package/dist/features/config/cli/config-controller.js.map +1 -0
- package/dist/features/config/cli/index.d.ts +9 -0
- package/dist/features/config/cli/index.d.ts.map +1 -0
- package/dist/features/config/cli/index.js +9 -0
- package/dist/features/config/cli/index.js.map +1 -0
- package/dist/features/config/cli/profile-controller.d.ts +87 -0
- package/dist/features/config/cli/profile-controller.d.ts.map +1 -0
- package/dist/features/config/cli/profile-controller.js +223 -0
- package/dist/features/config/cli/profile-controller.js.map +1 -0
- package/dist/features/config/cli/utils.d.ts +14 -0
- package/dist/features/config/cli/utils.d.ts.map +1 -0
- package/dist/features/config/cli/utils.js +29 -0
- package/dist/features/config/cli/utils.js.map +1 -0
- package/dist/features/config/config-of.d.ts +36 -0
- package/dist/features/config/config-of.d.ts.map +1 -0
- package/dist/features/config/config-of.js +36 -0
- package/dist/features/config/config-of.js.map +1 -0
- package/dist/features/config/config-service.d.ts +54 -0
- package/dist/features/config/config-service.d.ts.map +1 -0
- package/dist/features/config/config-service.js +184 -0
- package/dist/features/config/config-service.js.map +1 -0
- package/dist/features/config/create-config.d.ts +21 -0
- package/dist/features/config/create-config.d.ts.map +1 -0
- package/dist/features/config/create-config.js +16 -0
- package/dist/features/config/create-config.js.map +1 -0
- package/dist/features/config/define-config-partial.d.ts +13 -0
- package/dist/features/config/define-config-partial.d.ts.map +1 -0
- package/dist/features/config/define-config-partial.js +19 -0
- package/dist/features/config/define-config-partial.js.map +1 -0
- package/dist/features/config/env-service.d.ts +54 -0
- package/dist/features/config/env-service.d.ts.map +1 -0
- package/dist/features/config/env-service.js +115 -0
- package/dist/features/config/env-service.js.map +1 -0
- package/dist/features/config/file-watcher.d.ts +13 -0
- package/dist/features/config/file-watcher.d.ts.map +1 -0
- package/dist/features/config/file-watcher.js +98 -0
- package/dist/features/config/file-watcher.js.map +1 -0
- package/dist/features/config/index.d.ts +21 -0
- package/dist/features/config/index.d.ts.map +1 -0
- package/dist/features/config/index.js +24 -0
- package/dist/features/config/index.js.map +1 -0
- package/dist/features/config/profile-service.d.ts +59 -0
- package/dist/features/config/profile-service.d.ts.map +1 -0
- package/dist/features/config/profile-service.js +114 -0
- package/dist/features/config/profile-service.js.map +1 -0
- package/dist/features/config/types.d.ts +38 -0
- package/dist/features/config/types.d.ts.map +1 -0
- package/dist/features/config/types.js +17 -0
- package/dist/features/config/types.js.map +1 -0
- package/dist/features/contract/contract.d.ts +264 -0
- package/dist/features/contract/contract.d.ts.map +1 -0
- package/dist/features/contract/contract.js +183 -0
- package/dist/features/contract/contract.js.map +1 -0
- package/dist/features/contract/index.d.ts +2 -0
- package/dist/features/contract/index.d.ts.map +1 -0
- package/dist/features/contract/index.js +2 -0
- package/dist/features/contract/index.js.map +1 -0
- package/dist/features/env/contribute.d.ts +70 -0
- package/dist/features/env/contribute.d.ts.map +1 -0
- package/dist/features/env/contribute.js +195 -0
- package/dist/features/env/contribute.js.map +1 -0
- package/dist/features/environment/create-environment.d.ts +58 -0
- package/dist/features/environment/create-environment.d.ts.map +1 -0
- package/dist/features/environment/create-environment.js +22 -0
- package/dist/features/environment/create-environment.js.map +1 -0
- package/dist/features/environment/index.d.ts +12 -0
- package/dist/features/environment/index.d.ts.map +1 -0
- package/dist/features/environment/index.js +10 -0
- package/dist/features/environment/index.js.map +1 -0
- package/dist/features/environment/load.d.ts +59 -0
- package/dist/features/environment/load.d.ts.map +1 -0
- package/dist/features/environment/load.js +117 -0
- package/dist/features/environment/load.js.map +1 -0
- package/dist/features/environment/types.d.ts +165 -0
- package/dist/features/environment/types.d.ts.map +1 -0
- package/dist/features/environment/types.js +18 -0
- package/dist/features/environment/types.js.map +1 -0
- package/dist/features/feature-flags/create-feature-flag-provider.d.ts +21 -0
- package/dist/features/feature-flags/create-feature-flag-provider.d.ts.map +1 -0
- package/dist/features/feature-flags/create-feature-flag-provider.js +16 -0
- package/dist/features/feature-flags/create-feature-flag-provider.js.map +1 -0
- package/dist/features/feature-flags/define-feature-flag-partial.d.ts +20 -0
- package/dist/features/feature-flags/define-feature-flag-partial.d.ts.map +1 -0
- package/dist/features/feature-flags/define-feature-flag-partial.js +26 -0
- package/dist/features/feature-flags/define-feature-flag-partial.js.map +1 -0
- package/dist/features/feature-flags/feature-flag-of.d.ts +16 -0
- package/dist/features/feature-flags/feature-flag-of.d.ts.map +1 -0
- package/dist/features/feature-flags/feature-flag-of.js +16 -0
- package/dist/features/feature-flags/feature-flag-of.js.map +1 -0
- package/dist/features/feature-flags/feature-flag-service.d.ts +22 -0
- package/dist/features/feature-flags/feature-flag-service.d.ts.map +1 -0
- package/dist/features/feature-flags/feature-flag-service.js +112 -0
- package/dist/features/feature-flags/feature-flag-service.js.map +1 -0
- package/dist/features/feature-flags/index.d.ts +15 -0
- package/dist/features/feature-flags/index.d.ts.map +1 -0
- package/dist/features/feature-flags/index.js +12 -0
- package/dist/features/feature-flags/index.js.map +1 -0
- package/dist/features/feature-flags/types.d.ts +30 -0
- package/dist/features/feature-flags/types.d.ts.map +1 -0
- package/dist/features/feature-flags/types.js +8 -0
- package/dist/features/feature-flags/types.js.map +1 -0
- package/dist/features/index.d.ts +6 -0
- package/dist/features/index.d.ts.map +1 -0
- package/dist/features/index.js +7 -0
- package/dist/features/index.js.map +1 -0
- package/dist/features/lock/index.d.ts +4 -0
- package/dist/features/lock/index.d.ts.map +1 -0
- package/dist/features/lock/index.js +4 -0
- package/dist/features/lock/index.js.map +1 -0
- package/dist/features/lock/lock-service.d.ts +74 -0
- package/dist/features/lock/lock-service.d.ts.map +1 -0
- package/dist/features/lock/lock-service.js +210 -0
- package/dist/features/lock/lock-service.js.map +1 -0
- package/dist/features/lock/memory.d.ts +60 -0
- package/dist/features/lock/memory.d.ts.map +1 -0
- package/dist/features/lock/memory.js +194 -0
- package/dist/features/lock/memory.js.map +1 -0
- package/dist/features/lock/types.d.ts +151 -0
- package/dist/features/lock/types.d.ts.map +1 -0
- package/dist/features/lock/types.js +17 -0
- package/dist/features/lock/types.js.map +1 -0
- package/dist/features/memory/index.d.ts +18 -0
- package/dist/features/memory/index.d.ts.map +1 -0
- package/dist/features/memory/index.js +18 -0
- package/dist/features/memory/index.js.map +1 -0
- package/dist/features/memory/lock-feature.d.ts +21 -0
- package/dist/features/memory/lock-feature.d.ts.map +1 -0
- package/dist/features/memory/lock-feature.js +24 -0
- package/dist/features/memory/lock-feature.js.map +1 -0
- package/dist/features/secrets/create-secret-provider.d.ts +31 -0
- package/dist/features/secrets/create-secret-provider.d.ts.map +1 -0
- package/dist/features/secrets/create-secret-provider.js +26 -0
- package/dist/features/secrets/create-secret-provider.js.map +1 -0
- package/dist/features/secrets/define-secret-partial.d.ts +16 -0
- package/dist/features/secrets/define-secret-partial.d.ts.map +1 -0
- package/dist/features/secrets/define-secret-partial.js +26 -0
- package/dist/features/secrets/define-secret-partial.js.map +1 -0
- package/dist/features/secrets/index.d.ts +17 -0
- package/dist/features/secrets/index.d.ts.map +1 -0
- package/dist/features/secrets/index.js +14 -0
- package/dist/features/secrets/index.js.map +1 -0
- package/dist/features/secrets/secret-of.d.ts +19 -0
- package/dist/features/secrets/secret-of.d.ts.map +1 -0
- package/dist/features/secrets/secret-of.js +21 -0
- package/dist/features/secrets/secret-of.js.map +1 -0
- package/dist/features/secrets/secret-service.d.ts +21 -0
- package/dist/features/secrets/secret-service.d.ts.map +1 -0
- package/dist/features/secrets/secret-service.js +28 -0
- package/dist/features/secrets/secret-service.js.map +1 -0
- package/dist/features/secrets/types.d.ts +30 -0
- package/dist/features/secrets/types.d.ts.map +1 -0
- package/dist/features/secrets/types.js +8 -0
- package/dist/features/secrets/types.js.map +1 -0
- package/dist/features/vault/env-var-vault.d.ts +24 -0
- package/dist/features/vault/env-var-vault.d.ts.map +1 -0
- package/dist/features/vault/env-var-vault.js +43 -0
- package/dist/features/vault/env-var-vault.js.map +1 -0
- package/dist/features/vault/hardcoded-vault.d.ts +34 -0
- package/dist/features/vault/hardcoded-vault.d.ts.map +1 -0
- package/dist/features/vault/hardcoded-vault.js +46 -0
- package/dist/features/vault/hardcoded-vault.js.map +1 -0
- package/dist/features/vault/hashicorp-vault.d.ts +32 -0
- package/dist/features/vault/hashicorp-vault.d.ts.map +1 -0
- package/dist/features/vault/hashicorp-vault.js +69 -0
- package/dist/features/vault/hashicorp-vault.js.map +1 -0
- package/dist/features/vault/index.d.ts +13 -0
- package/dist/features/vault/index.d.ts.map +1 -0
- package/dist/features/vault/index.js +12 -0
- package/dist/features/vault/index.js.map +1 -0
- package/dist/features/vault/kubernetes-vault.d.ts +27 -0
- package/dist/features/vault/kubernetes-vault.d.ts.map +1 -0
- package/dist/features/vault/kubernetes-vault.js +51 -0
- package/dist/features/vault/kubernetes-vault.js.map +1 -0
- package/dist/features/vault/types.d.ts +41 -0
- package/dist/features/vault/types.d.ts.map +1 -0
- package/dist/features/vault/types.js +21 -0
- package/dist/features/vault/types.js.map +1 -0
- package/dist/index.d.ts +78 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +48 -0
- package/dist/index.js.map +1 -0
- package/dist/justscale.d.ts +63 -0
- package/dist/justscale.d.ts.map +1 -0
- package/dist/justscale.js +501 -0
- package/dist/justscale.js.map +1 -0
- package/dist/kernel/adapter.d.ts +9 -0
- package/dist/kernel/adapter.d.ts.map +1 -0
- package/dist/kernel/adapter.js +2 -0
- package/dist/kernel/adapter.js.map +1 -0
- package/dist/kernel/kernel.d.ts +15 -0
- package/dist/kernel/kernel.d.ts.map +1 -0
- package/dist/kernel/kernel.js +134 -0
- package/dist/kernel/kernel.js.map +1 -0
- package/dist/models/access.d.ts +26 -0
- package/dist/models/access.d.ts.map +1 -0
- package/dist/models/access.js +126 -0
- package/dist/models/access.js.map +1 -0
- package/dist/models/apply-types-config.d.ts +52 -0
- package/dist/models/apply-types-config.d.ts.map +1 -0
- package/dist/models/apply-types-config.js +47 -0
- package/dist/models/apply-types-config.js.map +1 -0
- package/dist/models/define-model.d.ts +249 -0
- package/dist/models/define-model.d.ts.map +1 -0
- package/dist/models/define-model.js +388 -0
- package/dist/models/define-model.js.map +1 -0
- package/dist/models/field.d.ts +309 -0
- package/dist/models/field.d.ts.map +1 -0
- package/dist/models/field.js +312 -0
- package/dist/models/field.js.map +1 -0
- package/dist/models/in-memory/condition-evaluator.d.ts +53 -0
- package/dist/models/in-memory/condition-evaluator.d.ts.map +1 -0
- package/dist/models/in-memory/condition-evaluator.js +593 -0
- package/dist/models/in-memory/condition-evaluator.js.map +1 -0
- package/dist/models/in-memory/in-memory-model.d.ts +89 -0
- package/dist/models/in-memory/in-memory-model.d.ts.map +1 -0
- package/dist/models/in-memory/in-memory-model.js +101 -0
- package/dist/models/in-memory/in-memory-model.js.map +1 -0
- package/dist/models/in-memory/in-memory-repository.d.ts +208 -0
- package/dist/models/in-memory/in-memory-repository.d.ts.map +1 -0
- package/dist/models/in-memory/in-memory-repository.js +618 -0
- package/dist/models/in-memory/in-memory-repository.js.map +1 -0
- package/dist/models/in-memory/in-memory-scheduled-task.repository.d.ts +92 -0
- package/dist/models/in-memory/in-memory-scheduled-task.repository.d.ts.map +1 -0
- package/dist/models/in-memory/in-memory-scheduled-task.repository.js +395 -0
- package/dist/models/in-memory/in-memory-scheduled-task.repository.js.map +1 -0
- package/dist/models/in-memory/index.d.ts +35 -0
- package/dist/models/in-memory/index.d.ts.map +1 -0
- package/dist/models/in-memory/index.js +36 -0
- package/dist/models/in-memory/index.js.map +1 -0
- package/dist/models/index.d.ts +52 -0
- package/dist/models/index.d.ts.map +1 -0
- package/dist/models/index.js +86 -0
- package/dist/models/index.js.map +1 -0
- package/dist/models/model-name-registry.d.ts +16 -0
- package/dist/models/model-name-registry.d.ts.map +1 -0
- package/dist/models/model-name-registry.js +19 -0
- package/dist/models/model-name-registry.js.map +1 -0
- package/dist/models/model.d.ts +15 -0
- package/dist/models/model.d.ts.map +1 -0
- package/dist/models/model.js +114 -0
- package/dist/models/model.js.map +1 -0
- package/dist/models/model.repository.d.ts +318 -0
- package/dist/models/model.repository.d.ts.map +1 -0
- package/dist/models/model.repository.js +146 -0
- package/dist/models/model.repository.js.map +1 -0
- package/dist/models/observable.d.ts +15 -0
- package/dist/models/observable.d.ts.map +1 -0
- package/dist/models/observable.js +64 -0
- package/dist/models/observable.js.map +1 -0
- package/dist/models/proxy.d.ts +5 -0
- package/dist/models/proxy.d.ts.map +1 -0
- package/dist/models/proxy.js +407 -0
- package/dist/models/proxy.js.map +1 -0
- package/dist/models/query.d.ts +574 -0
- package/dist/models/query.d.ts.map +1 -0
- package/dist/models/query.js +701 -0
- package/dist/models/query.js.map +1 -0
- package/dist/models/reference/reference.d.ts +229 -0
- package/dist/models/reference/reference.d.ts.map +1 -0
- package/dist/models/reference/reference.js +331 -0
- package/dist/models/reference/reference.js.map +1 -0
- package/dist/models/reference/transient-ref.d.ts +123 -0
- package/dist/models/reference/transient-ref.d.ts.map +1 -0
- package/dist/models/reference/transient-ref.js +152 -0
- package/dist/models/reference/transient-ref.js.map +1 -0
- package/dist/models/repository.d.ts +53 -0
- package/dist/models/repository.d.ts.map +1 -0
- package/dist/models/repository.js +37 -0
- package/dist/models/repository.js.map +1 -0
- package/dist/models/scheduled-task/index.d.ts +13 -0
- package/dist/models/scheduled-task/index.d.ts.map +1 -0
- package/dist/models/scheduled-task/index.js +12 -0
- package/dist/models/scheduled-task/index.js.map +1 -0
- package/dist/models/scheduled-task/scheduled-task.d.ts +73 -0
- package/dist/models/scheduled-task/scheduled-task.d.ts.map +1 -0
- package/dist/models/scheduled-task/scheduled-task.js +95 -0
- package/dist/models/scheduled-task/scheduled-task.js.map +1 -0
- package/dist/models/scheduled-task/scheduled-task.repository.d.ts +150 -0
- package/dist/models/scheduled-task/scheduled-task.repository.d.ts.map +1 -0
- package/dist/models/scheduled-task/scheduled-task.repository.js +40 -0
- package/dist/models/scheduled-task/scheduled-task.repository.js.map +1 -0
- package/dist/models/stream.d.ts +139 -0
- package/dist/models/stream.d.ts.map +1 -0
- package/dist/models/stream.js +153 -0
- package/dist/models/stream.js.map +1 -0
- package/dist/models/symbols.d.ts +73 -0
- package/dist/models/symbols.d.ts.map +1 -0
- package/dist/models/symbols.js +97 -0
- package/dist/models/symbols.js.map +1 -0
- package/dist/models/types.d.ts +291 -0
- package/dist/models/types.d.ts.map +1 -0
- package/dist/models/types.js +50 -0
- package/dist/models/types.js.map +1 -0
- package/dist/models/watch.d.ts +27 -0
- package/dist/models/watch.d.ts.map +1 -0
- package/dist/models/watch.js +124 -0
- package/dist/models/watch.js.map +1 -0
- package/dist/models/zod-ref.d.ts +46 -0
- package/dist/models/zod-ref.d.ts.map +1 -0
- package/dist/models/zod-ref.js +31 -0
- package/dist/models/zod-ref.js.map +1 -0
- package/dist/process/builtin-serializers.d.ts +19 -0
- package/dist/process/builtin-serializers.d.ts.map +1 -0
- package/dist/process/builtin-serializers.js +213 -0
- package/dist/process/builtin-serializers.js.map +1 -0
- package/dist/process/cluster-plugin.d.ts +129 -0
- package/dist/process/cluster-plugin.d.ts.map +1 -0
- package/dist/process/cluster-plugin.js +175 -0
- package/dist/process/cluster-plugin.js.map +1 -0
- package/dist/process/createProcess.d.ts +67 -0
- package/dist/process/createProcess.d.ts.map +1 -0
- package/dist/process/createProcess.js +111 -0
- package/dist/process/createProcess.js.map +1 -0
- package/dist/process/define-signals.d.ts +113 -0
- package/dist/process/define-signals.d.ts.map +1 -0
- package/dist/process/define-signals.js +222 -0
- package/dist/process/define-signals.js.map +1 -0
- package/dist/process/delay-controller.d.ts +35 -0
- package/dist/process/delay-controller.d.ts.map +1 -0
- package/dist/process/delay-controller.js +55 -0
- package/dist/process/delay-controller.js.map +1 -0
- package/dist/process/index.d.ts +38 -0
- package/dist/process/index.d.ts.map +1 -0
- package/dist/process/index.js +47 -0
- package/dist/process/index.js.map +1 -0
- package/dist/process/primitives.d.ts +393 -0
- package/dist/process/primitives.d.ts.map +1 -0
- package/dist/process/primitives.js +325 -0
- package/dist/process/primitives.js.map +1 -0
- package/dist/process/serialization.d.ts +58 -0
- package/dist/process/serialization.d.ts.map +1 -0
- package/dist/process/serialization.js +220 -0
- package/dist/process/serialization.js.map +1 -0
- package/dist/process/stream-utils.d.ts +123 -0
- package/dist/process/stream-utils.d.ts.map +1 -0
- package/dist/process/stream-utils.js +247 -0
- package/dist/process/stream-utils.js.map +1 -0
- package/dist/process/testing/clock.d.ts +115 -0
- package/dist/process/testing/clock.d.ts.map +1 -0
- package/dist/process/testing/clock.js +166 -0
- package/dist/process/testing/clock.js.map +1 -0
- package/dist/process/testing/index.d.ts +9 -0
- package/dist/process/testing/index.d.ts.map +1 -0
- package/dist/process/testing/index.js +9 -0
- package/dist/process/testing/index.js.map +1 -0
- package/dist/process/testing.d.ts +50 -0
- package/dist/process/testing.d.ts.map +1 -0
- package/dist/process/testing.js +59 -0
- package/dist/process/testing.js.map +1 -0
- package/dist/process/types.d.ts +540 -0
- package/dist/process/types.d.ts.map +1 -0
- package/dist/process/types.js +21 -0
- package/dist/process/types.js.map +1 -0
- package/dist/queue/index.d.ts +2 -0
- package/dist/queue/index.d.ts.map +1 -0
- package/dist/queue/index.js +2 -0
- package/dist/queue/index.js.map +1 -0
- package/dist/queue/queue.d.ts +34 -0
- package/dist/queue/queue.d.ts.map +1 -0
- package/dist/queue/queue.js +108 -0
- package/dist/queue/queue.js.map +1 -0
- package/dist/runtime/process/compiled.d.ts +56 -0
- package/dist/runtime/process/compiled.d.ts.map +1 -0
- package/dist/runtime/process/compiled.js +221 -0
- package/dist/runtime/process/compiled.js.map +1 -0
- package/dist/runtime/process/executor.d.ts +279 -0
- package/dist/runtime/process/executor.d.ts.map +1 -0
- package/dist/runtime/process/executor.js +1941 -0
- package/dist/runtime/process/executor.js.map +1 -0
- package/dist/runtime/process/factory.d.ts +72 -0
- package/dist/runtime/process/factory.d.ts.map +1 -0
- package/dist/runtime/process/factory.js +78 -0
- package/dist/runtime/process/factory.js.map +1 -0
- package/dist/runtime/process/freeze.d.ts +5 -0
- package/dist/runtime/process/freeze.d.ts.map +1 -0
- package/dist/runtime/process/freeze.js +94 -0
- package/dist/runtime/process/freeze.js.map +1 -0
- package/dist/runtime/process/scheduled-task-timer.d.ts +52 -0
- package/dist/runtime/process/scheduled-task-timer.d.ts.map +1 -0
- package/dist/runtime/process/scheduled-task-timer.js +104 -0
- package/dist/runtime/process/scheduled-task-timer.js.map +1 -0
- package/dist/runtime/process/signal-bus.d.ts +186 -0
- package/dist/runtime/process/signal-bus.d.ts.map +1 -0
- package/dist/runtime/process/signal-bus.js +256 -0
- package/dist/runtime/process/signal-bus.js.map +1 -0
- package/dist/runtime/process/state-serializer.d.ts +30 -0
- package/dist/runtime/process/state-serializer.d.ts.map +1 -0
- package/dist/runtime/process/state-serializer.js +244 -0
- package/dist/runtime/process/state-serializer.js.map +1 -0
- package/dist/runtime/process/storage.d.ts +96 -0
- package/dist/runtime/process/storage.d.ts.map +1 -0
- package/dist/runtime/process/storage.js +165 -0
- package/dist/runtime/process/storage.js.map +1 -0
- package/dist/runtime/process/timer-scheduler.d.ts +115 -0
- package/dist/runtime/process/timer-scheduler.d.ts.map +1 -0
- package/dist/runtime/process/timer-scheduler.js +192 -0
- package/dist/runtime/process/timer-scheduler.js.map +1 -0
- package/dist/runtime/process/trace.d.ts +17 -0
- package/dist/runtime/process/trace.d.ts.map +1 -0
- package/dist/runtime/process/trace.js +26 -0
- package/dist/runtime/process/trace.js.map +1 -0
- package/dist/runtime/protobuf/encoding/index.d.ts +26 -0
- package/dist/runtime/protobuf/encoding/index.d.ts.map +1 -0
- package/dist/runtime/protobuf/encoding/index.js +30 -0
- package/dist/runtime/protobuf/encoding/index.js.map +1 -0
- package/dist/runtime/protobuf/encoding/reader.d.ts +182 -0
- package/dist/runtime/protobuf/encoding/reader.d.ts.map +1 -0
- package/dist/runtime/protobuf/encoding/reader.js +353 -0
- package/dist/runtime/protobuf/encoding/reader.js.map +1 -0
- package/dist/runtime/protobuf/encoding/varint.d.ts +67 -0
- package/dist/runtime/protobuf/encoding/varint.d.ts.map +1 -0
- package/dist/runtime/protobuf/encoding/varint.js +117 -0
- package/dist/runtime/protobuf/encoding/varint.js.map +1 -0
- package/dist/runtime/protobuf/encoding/wire-types.d.ts +62 -0
- package/dist/runtime/protobuf/encoding/wire-types.d.ts.map +1 -0
- package/dist/runtime/protobuf/encoding/wire-types.js +103 -0
- package/dist/runtime/protobuf/encoding/wire-types.js.map +1 -0
- package/dist/runtime/protobuf/encoding/writer.d.ts +147 -0
- package/dist/runtime/protobuf/encoding/writer.d.ts.map +1 -0
- package/dist/runtime/protobuf/encoding/writer.js +214 -0
- package/dist/runtime/protobuf/encoding/writer.js.map +1 -0
- package/dist/runtime/protobuf/index.d.ts +3 -0
- package/dist/runtime/protobuf/index.d.ts.map +1 -0
- package/dist/runtime/protobuf/index.js +3 -0
- package/dist/runtime/protobuf/index.js.map +1 -0
- package/dist/runtime/protobuf/serialized.d.ts +48 -0
- package/dist/runtime/protobuf/serialized.d.ts.map +1 -0
- package/dist/runtime/protobuf/serialized.js +517 -0
- package/dist/runtime/protobuf/serialized.js.map +1 -0
- package/package.json +209 -0
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Distributed lock service with pluggable backend (Redis, Postgres, in-memory, etc.)
|
|
3
|
+
*/
|
|
4
|
+
import { Logger } from '../../core/index.js';
|
|
5
|
+
import type { LockProvider, LockService } from './types.js';
|
|
6
|
+
declare const AbstractLockProvider_base: import("../../core/service.js").AbstractClass<LockProvider>;
|
|
7
|
+
export declare abstract class AbstractLockProvider extends AbstractLockProvider_base {
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Run a function with lock tracking enabled.
|
|
11
|
+
* Any locks acquired inside will be tracked and checked for double-lock.
|
|
12
|
+
*/
|
|
13
|
+
export declare function runWithLockTracking<T>(fn: () => T): T;
|
|
14
|
+
/**
|
|
15
|
+
* Get the set of currently held lock keys in this async context.
|
|
16
|
+
* Returns undefined if lock tracking is not active.
|
|
17
|
+
*/
|
|
18
|
+
export declare function getHeldLocks(): ReadonlySet<string> | undefined;
|
|
19
|
+
/**
|
|
20
|
+
* Internal: register that a lock key was acquired in this async context.
|
|
21
|
+
* Used by Repository.lock() implementations to participate in
|
|
22
|
+
* `runWithLockTracking` re-entry detection. No-op outside a tracking
|
|
23
|
+
* context. Not part of the public API.
|
|
24
|
+
*
|
|
25
|
+
* @internal
|
|
26
|
+
*/
|
|
27
|
+
export declare function _registerHeldLock(key: string): void;
|
|
28
|
+
/**
|
|
29
|
+
* Internal: clear a held-lock entry on release. Mirror of
|
|
30
|
+
* `_registerHeldLock`. No-op outside a tracking context.
|
|
31
|
+
*
|
|
32
|
+
* @internal
|
|
33
|
+
*/
|
|
34
|
+
export declare function _unregisterHeldLock(key: string): void;
|
|
35
|
+
export declare class LockAcquisitionError extends Error {
|
|
36
|
+
constructor(message: string);
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Thrown when code tries to acquire a lock already held in the same async context.
|
|
40
|
+
*/
|
|
41
|
+
export declare class DoubleLockError extends Error {
|
|
42
|
+
readonly lockKey: string;
|
|
43
|
+
constructor(key: string);
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Thrown when a mutator (`Repository.update`, `delete`, `save`) is called
|
|
47
|
+
* with a `Lock<T>` whose `__active` is false — i.e. the lock has already
|
|
48
|
+
* been released via `Symbol.dispose` / `Symbol.asyncDispose`.
|
|
49
|
+
*
|
|
50
|
+
* This is the use-after-dispose guard: storing a `Locked<T>` in an outer
|
|
51
|
+
* scope and using it after the `using` block exits is a footgun the
|
|
52
|
+
* type system doesn't catch (the `__active` field can't be narrowed
|
|
53
|
+
* statically), so it surfaces at runtime here.
|
|
54
|
+
*/
|
|
55
|
+
export declare class LockReleasedError extends Error {
|
|
56
|
+
readonly lockKey: string | undefined;
|
|
57
|
+
constructor(key?: string);
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Thrown when a lock key is empty or whitespace-only. Empty keys would
|
|
61
|
+
* collide every locked resource into one global bucket, so they are
|
|
62
|
+
* rejected at the API boundary.
|
|
63
|
+
*/
|
|
64
|
+
export declare class InvalidLockKeyError extends Error {
|
|
65
|
+
constructor(key: string);
|
|
66
|
+
}
|
|
67
|
+
declare const LockServiceDef_base: import("../../core/service.js").Service<LockService<unknown>, {
|
|
68
|
+
readonly provider: typeof AbstractLockProvider;
|
|
69
|
+
readonly logger: typeof Logger;
|
|
70
|
+
}>;
|
|
71
|
+
export declare class LockServiceDef extends LockServiceDef_base {
|
|
72
|
+
}
|
|
73
|
+
export {};
|
|
74
|
+
//# sourceMappingURL=lock-service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lock-service.d.ts","sourceRoot":"","sources":["../../../src/features/lock/lock-service.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAiC,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAC5E,OAAO,KAAK,EAIV,YAAY,EACZ,WAAW,EACZ,MAAM,YAAY,CAAC;;AAKpB,8BAAsB,oBAAqB,SAAQ,yBAAoD;CAAG;AAe1G;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,CAAC,GAAG,CAAC,CAErD;AAED;;;GAGG;AACH,wBAAgB,YAAY,IAAI,WAAW,CAAC,MAAM,CAAC,GAAG,SAAS,CAE9D;AAED;;;;;;;GAOG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAEnD;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAErD;AAsHD,qBAAa,oBAAqB,SAAQ,KAAK;gBACjC,OAAO,EAAE,MAAM;CAI5B;AAED;;GAEG;AACH,qBAAa,eAAgB,SAAQ,KAAK;IACxC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;gBACb,GAAG,EAAE,MAAM;CAKxB;AAED;;;;;;;;;GASG;AACH,qBAAa,iBAAkB,SAAQ,KAAK;IAC1C,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,CAAC;gBACzB,GAAG,CAAC,EAAE,MAAM;CASzB;AAED;;;;GAIG;AACH,qBAAa,mBAAoB,SAAQ,KAAK;gBAChC,GAAG,EAAE,MAAM;CAQxB;;;;;AAED,qBAAa,cAAe,SAAQ,mBAOlC;CAAG"}
|
|
@@ -0,0 +1,210 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Distributed lock service with pluggable backend (Redis, Postgres, in-memory, etc.)
|
|
3
|
+
*/
|
|
4
|
+
import { AsyncLocalStorage } from 'node:async_hooks';
|
|
5
|
+
import { defineAbstract, defineService, Logger } from '../../core/index.js';
|
|
6
|
+
const DEFAULT_TTL = 30_000;
|
|
7
|
+
const DEFAULT_TIMEOUT = 5_000;
|
|
8
|
+
export class AbstractLockProvider extends defineAbstract('AbstractLockProvider') {
|
|
9
|
+
}
|
|
10
|
+
function generateInstanceId() {
|
|
11
|
+
return `${process.pid}-${Date.now()}-${Math.random().toString(36).slice(2, 9)}`;
|
|
12
|
+
}
|
|
13
|
+
function deriveLockKey(obj) {
|
|
14
|
+
const typeName = obj?.constructor?.name ?? 'Object';
|
|
15
|
+
const id = obj?.id ?? 'unknown';
|
|
16
|
+
return `lock:${typeName}:${String(id)}`;
|
|
17
|
+
}
|
|
18
|
+
const heldLocks = new AsyncLocalStorage();
|
|
19
|
+
/**
|
|
20
|
+
* Run a function with lock tracking enabled.
|
|
21
|
+
* Any locks acquired inside will be tracked and checked for double-lock.
|
|
22
|
+
*/
|
|
23
|
+
export function runWithLockTracking(fn) {
|
|
24
|
+
return heldLocks.run(new Set(), fn);
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Get the set of currently held lock keys in this async context.
|
|
28
|
+
* Returns undefined if lock tracking is not active.
|
|
29
|
+
*/
|
|
30
|
+
export function getHeldLocks() {
|
|
31
|
+
return heldLocks.getStore();
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Internal: register that a lock key was acquired in this async context.
|
|
35
|
+
* Used by Repository.lock() implementations to participate in
|
|
36
|
+
* `runWithLockTracking` re-entry detection. No-op outside a tracking
|
|
37
|
+
* context. Not part of the public API.
|
|
38
|
+
*
|
|
39
|
+
* @internal
|
|
40
|
+
*/
|
|
41
|
+
export function _registerHeldLock(key) {
|
|
42
|
+
heldLocks.getStore()?.add(key);
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Internal: clear a held-lock entry on release. Mirror of
|
|
46
|
+
* `_registerHeldLock`. No-op outside a tracking context.
|
|
47
|
+
*
|
|
48
|
+
* @internal
|
|
49
|
+
*/
|
|
50
|
+
export function _unregisterHeldLock(key) {
|
|
51
|
+
heldLocks.getStore()?.delete(key);
|
|
52
|
+
}
|
|
53
|
+
class LockServiceImpl {
|
|
54
|
+
provider;
|
|
55
|
+
logger;
|
|
56
|
+
instanceId = generateInstanceId();
|
|
57
|
+
constructor(provider, logger) {
|
|
58
|
+
this.provider = provider;
|
|
59
|
+
this.logger = logger;
|
|
60
|
+
}
|
|
61
|
+
async acquire(objOrPromise, options) {
|
|
62
|
+
// Await if promise
|
|
63
|
+
const obj = await objOrPromise;
|
|
64
|
+
// Handle null case
|
|
65
|
+
if (obj === null) {
|
|
66
|
+
return null;
|
|
67
|
+
}
|
|
68
|
+
const ttl = options?.ttl ?? DEFAULT_TTL;
|
|
69
|
+
const opts = {
|
|
70
|
+
ttl,
|
|
71
|
+
timeout: options?.timeout ?? DEFAULT_TIMEOUT,
|
|
72
|
+
key: options?.key ?? deriveLockKey(obj),
|
|
73
|
+
heartbeat: options?.heartbeat ?? false,
|
|
74
|
+
heartbeatInterval: options?.heartbeatInterval ?? Math.floor(ttl / 3),
|
|
75
|
+
};
|
|
76
|
+
if (opts.key.trim() === '') {
|
|
77
|
+
throw new InvalidLockKeyError(opts.key);
|
|
78
|
+
}
|
|
79
|
+
// Double-lock detection: throw if this key is already held in this async context
|
|
80
|
+
const held = heldLocks.getStore();
|
|
81
|
+
if (held?.has(opts.key)) {
|
|
82
|
+
throw new DoubleLockError(opts.key);
|
|
83
|
+
}
|
|
84
|
+
const metadata = await this.provider.acquire(opts.key, opts, this.instanceId);
|
|
85
|
+
// Track the held lock
|
|
86
|
+
held?.add(opts.key);
|
|
87
|
+
this.logger.debug('Lock acquired', {
|
|
88
|
+
key: opts.key,
|
|
89
|
+
instanceId: this.instanceId,
|
|
90
|
+
ttl: opts.ttl,
|
|
91
|
+
});
|
|
92
|
+
return this.createLockedObject(obj, metadata, opts.key);
|
|
93
|
+
}
|
|
94
|
+
createLockedObject(obj, metadata, key) {
|
|
95
|
+
const provider = this.provider;
|
|
96
|
+
const instanceId = this.instanceId;
|
|
97
|
+
const logger = this.logger;
|
|
98
|
+
let active = true;
|
|
99
|
+
const locked = Object.create(obj, {
|
|
100
|
+
__lock: {
|
|
101
|
+
value: metadata,
|
|
102
|
+
writable: false,
|
|
103
|
+
enumerable: false,
|
|
104
|
+
configurable: false,
|
|
105
|
+
},
|
|
106
|
+
__active: {
|
|
107
|
+
get: () => active,
|
|
108
|
+
enumerable: false,
|
|
109
|
+
configurable: false,
|
|
110
|
+
},
|
|
111
|
+
[Symbol.dispose]: {
|
|
112
|
+
value: function () {
|
|
113
|
+
if (!active)
|
|
114
|
+
return;
|
|
115
|
+
active = false;
|
|
116
|
+
heldLocks.getStore()?.delete(key);
|
|
117
|
+
provider.release(key, instanceId).catch((err) => {
|
|
118
|
+
logger.warn('Lock release failed, will expire via TTL', {
|
|
119
|
+
key,
|
|
120
|
+
error: err instanceof Error ? err.message : String(err),
|
|
121
|
+
});
|
|
122
|
+
});
|
|
123
|
+
},
|
|
124
|
+
writable: false,
|
|
125
|
+
enumerable: false,
|
|
126
|
+
configurable: false,
|
|
127
|
+
},
|
|
128
|
+
[Symbol.asyncDispose]: {
|
|
129
|
+
value: async function () {
|
|
130
|
+
if (!active)
|
|
131
|
+
return;
|
|
132
|
+
active = false;
|
|
133
|
+
heldLocks.getStore()?.delete(key);
|
|
134
|
+
try {
|
|
135
|
+
await provider.release(key, instanceId);
|
|
136
|
+
}
|
|
137
|
+
catch (err) {
|
|
138
|
+
logger.warn('Lock release failed, will expire via TTL', {
|
|
139
|
+
key,
|
|
140
|
+
error: err instanceof Error ? err.message : String(err),
|
|
141
|
+
});
|
|
142
|
+
}
|
|
143
|
+
},
|
|
144
|
+
writable: false,
|
|
145
|
+
enumerable: false,
|
|
146
|
+
configurable: false,
|
|
147
|
+
},
|
|
148
|
+
});
|
|
149
|
+
return locked;
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
export class LockAcquisitionError extends Error {
|
|
153
|
+
constructor(message) {
|
|
154
|
+
super(message);
|
|
155
|
+
this.name = 'LockAcquisitionError';
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* Thrown when code tries to acquire a lock already held in the same async context.
|
|
160
|
+
*/
|
|
161
|
+
export class DoubleLockError extends Error {
|
|
162
|
+
lockKey;
|
|
163
|
+
constructor(key) {
|
|
164
|
+
super(`Cannot acquire lock "${key}" - already held in this async context. Release the existing lock before acquiring a new one.`);
|
|
165
|
+
this.name = 'DoubleLockError';
|
|
166
|
+
this.lockKey = key;
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
/**
|
|
170
|
+
* Thrown when a mutator (`Repository.update`, `delete`, `save`) is called
|
|
171
|
+
* with a `Lock<T>` whose `__active` is false — i.e. the lock has already
|
|
172
|
+
* been released via `Symbol.dispose` / `Symbol.asyncDispose`.
|
|
173
|
+
*
|
|
174
|
+
* This is the use-after-dispose guard: storing a `Locked<T>` in an outer
|
|
175
|
+
* scope and using it after the `using` block exits is a footgun the
|
|
176
|
+
* type system doesn't catch (the `__active` field can't be narrowed
|
|
177
|
+
* statically), so it surfaces at runtime here.
|
|
178
|
+
*/
|
|
179
|
+
export class LockReleasedError extends Error {
|
|
180
|
+
lockKey;
|
|
181
|
+
constructor(key) {
|
|
182
|
+
super(key
|
|
183
|
+
? `Lock "${key}" was used after release. Acquire a fresh lock before mutating.`
|
|
184
|
+
: 'Lock was used after release. Acquire a fresh lock before mutating.');
|
|
185
|
+
this.name = 'LockReleasedError';
|
|
186
|
+
this.lockKey = key;
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
/**
|
|
190
|
+
* Thrown when a lock key is empty or whitespace-only. Empty keys would
|
|
191
|
+
* collide every locked resource into one global bucket, so they are
|
|
192
|
+
* rejected at the API boundary.
|
|
193
|
+
*/
|
|
194
|
+
export class InvalidLockKeyError extends Error {
|
|
195
|
+
constructor(key) {
|
|
196
|
+
super(`Lock key must be a non-empty string; received ${JSON.stringify(key)}. ` +
|
|
197
|
+
'Empty keys would collide every locked resource into one bucket. ' +
|
|
198
|
+
'Omit \'key\' to derive it from the locked object, or pass a meaningful identifier.');
|
|
199
|
+
this.name = 'InvalidLockKeyError';
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
export class LockServiceDef extends defineService({
|
|
203
|
+
inject: {
|
|
204
|
+
provider: AbstractLockProvider,
|
|
205
|
+
logger: Logger,
|
|
206
|
+
},
|
|
207
|
+
factory: ({ provider, logger }) => new LockServiceImpl(provider, logger),
|
|
208
|
+
}) {
|
|
209
|
+
}
|
|
210
|
+
//# sourceMappingURL=lock-service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lock-service.js","sourceRoot":"","sources":["../../../src/features/lock/lock-service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* In-Memory Lock Provider
|
|
3
|
+
*
|
|
4
|
+
* A simple Map-based lock provider that works within a single process.
|
|
5
|
+
* Suitable for:
|
|
6
|
+
* - Single-instance applications
|
|
7
|
+
* - Development and testing
|
|
8
|
+
* - Applications that don't need distributed locking
|
|
9
|
+
*
|
|
10
|
+
* For distributed locking across multiple instances, use Redis or Postgres adapters.
|
|
11
|
+
*/
|
|
12
|
+
import type { LockProvider } from './types.js';
|
|
13
|
+
/** Return type for createInMemoryLockProvider */
|
|
14
|
+
export type InMemoryLockProviderInstance = LockProvider & {
|
|
15
|
+
/** Clear all locks - useful for test cleanup */
|
|
16
|
+
clear(): void;
|
|
17
|
+
/** Check if a key is locked - useful for debugging */
|
|
18
|
+
isLocked(key: string): boolean;
|
|
19
|
+
/** Get the instance ID that holds a lock */
|
|
20
|
+
getLockedBy(key: string): string | null;
|
|
21
|
+
/** Get the number of active locks */
|
|
22
|
+
readonly size: number;
|
|
23
|
+
};
|
|
24
|
+
/**
|
|
25
|
+
* Create an in-memory lock provider instance.
|
|
26
|
+
*
|
|
27
|
+
* Use this function for testing or when you need a direct instance.
|
|
28
|
+
* For DI, use `InMemoryLockProvider` service instead.
|
|
29
|
+
*
|
|
30
|
+
* @example
|
|
31
|
+
* ```typescript
|
|
32
|
+
* // Direct instantiation for testing
|
|
33
|
+
* const locks = createInMemoryLockProvider()
|
|
34
|
+
* await locks.acquire('key', options, instanceId)
|
|
35
|
+
* locks.clear()
|
|
36
|
+
* ```
|
|
37
|
+
*/
|
|
38
|
+
export declare function createInMemoryLockProvider(): InMemoryLockProviderInstance;
|
|
39
|
+
declare const InMemoryLockProvider_base: import("../../core/service.js").Service<InMemoryLockProviderInstance, {}>;
|
|
40
|
+
/**
|
|
41
|
+
* In-memory lock provider service for DI.
|
|
42
|
+
*
|
|
43
|
+
* @example
|
|
44
|
+
* ```typescript
|
|
45
|
+
* import { InMemoryLockProvider } from '@justscale/core';
|
|
46
|
+
*
|
|
47
|
+
* // For DI - auto-provides AbstractLockProvider
|
|
48
|
+
* JustScale()
|
|
49
|
+
* .add(InMemoryLockProvider)
|
|
50
|
+
* .add(LockServiceDef)
|
|
51
|
+
* .build()
|
|
52
|
+
*
|
|
53
|
+
* // For testing - use createInMemoryLockProvider() instead
|
|
54
|
+
* const locks = createInMemoryLockProvider()
|
|
55
|
+
* ```
|
|
56
|
+
*/
|
|
57
|
+
export declare class InMemoryLockProvider extends InMemoryLockProvider_base {
|
|
58
|
+
}
|
|
59
|
+
export {};
|
|
60
|
+
//# sourceMappingURL=memory.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory.d.ts","sourceRoot":"","sources":["../../../src/features/lock/memory.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAIH,OAAO,KAAK,EAA6B,YAAY,EAAE,MAAM,YAAY,CAAC;AAY1E,iDAAiD;AACjD,MAAM,MAAM,4BAA4B,GAAG,YAAY,GAAG;IACxD,gDAAgD;IAChD,KAAK,IAAI,IAAI,CAAA;IACb,sDAAsD;IACtD,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;IAC9B,4CAA4C;IAC5C,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAA;IACvC,qCAAqC;IACrC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CACtB,CAAC;AAEF;;;;;;;;;;;;;GAaG;AACH,wBAAgB,0BAA0B,IAAI,4BAA4B,CA6KzE;;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,qBAAa,oBAAqB,SAAQ,yBAIxC;CAAG"}
|
|
@@ -0,0 +1,194 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* In-Memory Lock Provider
|
|
3
|
+
*
|
|
4
|
+
* A simple Map-based lock provider that works within a single process.
|
|
5
|
+
* Suitable for:
|
|
6
|
+
* - Single-instance applications
|
|
7
|
+
* - Development and testing
|
|
8
|
+
* - Applications that don't need distributed locking
|
|
9
|
+
*
|
|
10
|
+
* For distributed locking across multiple instances, use Redis or Postgres adapters.
|
|
11
|
+
*/
|
|
12
|
+
import { defineService } from '../../core/service.js';
|
|
13
|
+
import { AbstractLockProvider } from './lock-service.js';
|
|
14
|
+
/**
|
|
15
|
+
* Create an in-memory lock provider instance.
|
|
16
|
+
*
|
|
17
|
+
* Use this function for testing or when you need a direct instance.
|
|
18
|
+
* For DI, use `InMemoryLockProvider` service instead.
|
|
19
|
+
*
|
|
20
|
+
* @example
|
|
21
|
+
* ```typescript
|
|
22
|
+
* // Direct instantiation for testing
|
|
23
|
+
* const locks = createInMemoryLockProvider()
|
|
24
|
+
* await locks.acquire('key', options, instanceId)
|
|
25
|
+
* locks.clear()
|
|
26
|
+
* ```
|
|
27
|
+
*/
|
|
28
|
+
export function createInMemoryLockProvider() {
|
|
29
|
+
const locks = new Map();
|
|
30
|
+
const waiters = new Map();
|
|
31
|
+
function waitForRelease(key) {
|
|
32
|
+
return new Promise((resolve) => {
|
|
33
|
+
let waitersForKey = waiters.get(key);
|
|
34
|
+
if (!waitersForKey) {
|
|
35
|
+
waitersForKey = new Set();
|
|
36
|
+
waiters.set(key, waitersForKey);
|
|
37
|
+
}
|
|
38
|
+
waitersForKey.add({ resolve });
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
function notifyWaiters(key) {
|
|
42
|
+
const waitersForKey = waiters.get(key);
|
|
43
|
+
if (!waitersForKey || waitersForKey.size === 0)
|
|
44
|
+
return;
|
|
45
|
+
// Convert to array and shuffle for randomness
|
|
46
|
+
const waitersArray = Array.from(waitersForKey);
|
|
47
|
+
shuffleArray(waitersArray);
|
|
48
|
+
// Notify all (they'll race)
|
|
49
|
+
for (const waiter of waitersArray) {
|
|
50
|
+
waiter.resolve();
|
|
51
|
+
}
|
|
52
|
+
// Clear waiters
|
|
53
|
+
waiters.delete(key);
|
|
54
|
+
}
|
|
55
|
+
function shuffleArray(array) {
|
|
56
|
+
for (let i = array.length - 1; i > 0; i--) {
|
|
57
|
+
const j = Math.floor(Math.random() * (i + 1));
|
|
58
|
+
[array[i], array[j]] = [array[j], array[i]];
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
return {
|
|
62
|
+
async acquire(key, options, instanceId) {
|
|
63
|
+
// Keep trying until we get the lock
|
|
64
|
+
while (true) {
|
|
65
|
+
const existing = locks.get(key);
|
|
66
|
+
// Check if lock exists and is still valid
|
|
67
|
+
if (existing) {
|
|
68
|
+
if (existing.metadata.expiresAt >= new Date()) {
|
|
69
|
+
// Lock is held - wait for release notification
|
|
70
|
+
await waitForRelease(key);
|
|
71
|
+
// After being notified, loop and try again (race with other waiters)
|
|
72
|
+
continue;
|
|
73
|
+
}
|
|
74
|
+
// Lock expired, clean it up
|
|
75
|
+
clearTimeout(existing.timer);
|
|
76
|
+
locks.delete(key);
|
|
77
|
+
// Notify waiters that lock is available
|
|
78
|
+
notifyWaiters(key);
|
|
79
|
+
}
|
|
80
|
+
// Try to acquire the lock (race condition possible with other waiters)
|
|
81
|
+
// Use synchronous check-and-set to avoid race
|
|
82
|
+
const nowCheck = locks.get(key);
|
|
83
|
+
if (nowCheck && nowCheck.metadata.expiresAt >= new Date()) {
|
|
84
|
+
// Someone else got it first, wait again
|
|
85
|
+
continue;
|
|
86
|
+
}
|
|
87
|
+
// Acquire the lock
|
|
88
|
+
const now = new Date();
|
|
89
|
+
const metadata = {
|
|
90
|
+
lockedAt: now,
|
|
91
|
+
expiresAt: new Date(now.getTime() + options.ttl),
|
|
92
|
+
lockedBy: instanceId,
|
|
93
|
+
};
|
|
94
|
+
// Set up auto-expiration
|
|
95
|
+
const timer = setTimeout(() => {
|
|
96
|
+
const entry = locks.get(key);
|
|
97
|
+
if (entry && entry.instanceId === instanceId) {
|
|
98
|
+
locks.delete(key);
|
|
99
|
+
// Notify waiters on expiration
|
|
100
|
+
notifyWaiters(key);
|
|
101
|
+
}
|
|
102
|
+
}, options.ttl);
|
|
103
|
+
locks.set(key, { metadata, instanceId, timer });
|
|
104
|
+
return metadata;
|
|
105
|
+
}
|
|
106
|
+
},
|
|
107
|
+
async release(key, instanceId) {
|
|
108
|
+
const entry = locks.get(key);
|
|
109
|
+
if (entry && entry.instanceId === instanceId) {
|
|
110
|
+
clearTimeout(entry.timer);
|
|
111
|
+
locks.delete(key);
|
|
112
|
+
// Notify waiters that lock is available
|
|
113
|
+
notifyWaiters(key);
|
|
114
|
+
}
|
|
115
|
+
// Silently ignore if lock doesn't exist or is owned by someone else
|
|
116
|
+
},
|
|
117
|
+
async extend(key, instanceId, ttl) {
|
|
118
|
+
const entry = locks.get(key);
|
|
119
|
+
if (!entry || entry.instanceId !== instanceId) {
|
|
120
|
+
return false;
|
|
121
|
+
}
|
|
122
|
+
// Clear old timer
|
|
123
|
+
clearTimeout(entry.timer);
|
|
124
|
+
// Update expiration
|
|
125
|
+
const now = new Date();
|
|
126
|
+
entry.metadata = {
|
|
127
|
+
...entry.metadata,
|
|
128
|
+
expiresAt: new Date(now.getTime() + ttl),
|
|
129
|
+
};
|
|
130
|
+
// Set new timer
|
|
131
|
+
entry.timer = setTimeout(() => {
|
|
132
|
+
const current = locks.get(key);
|
|
133
|
+
if (current && current.instanceId === instanceId) {
|
|
134
|
+
locks.delete(key);
|
|
135
|
+
notifyWaiters(key);
|
|
136
|
+
}
|
|
137
|
+
}, ttl);
|
|
138
|
+
return true;
|
|
139
|
+
},
|
|
140
|
+
clear() {
|
|
141
|
+
// Get keys before clearing for notifying waiters
|
|
142
|
+
const keys = Array.from(locks.keys());
|
|
143
|
+
for (const entry of locks.values()) {
|
|
144
|
+
clearTimeout(entry.timer);
|
|
145
|
+
}
|
|
146
|
+
locks.clear();
|
|
147
|
+
// Notify all waiters
|
|
148
|
+
for (const key of keys) {
|
|
149
|
+
notifyWaiters(key);
|
|
150
|
+
}
|
|
151
|
+
},
|
|
152
|
+
async close() {
|
|
153
|
+
this.clear();
|
|
154
|
+
},
|
|
155
|
+
isLocked(key) {
|
|
156
|
+
const entry = locks.get(key);
|
|
157
|
+
return entry !== undefined && entry.metadata.expiresAt >= new Date();
|
|
158
|
+
},
|
|
159
|
+
getLockedBy(key) {
|
|
160
|
+
const entry = locks.get(key);
|
|
161
|
+
if (entry && entry.metadata.expiresAt >= new Date()) {
|
|
162
|
+
return entry.instanceId;
|
|
163
|
+
}
|
|
164
|
+
return null;
|
|
165
|
+
},
|
|
166
|
+
get size() {
|
|
167
|
+
return locks.size;
|
|
168
|
+
},
|
|
169
|
+
};
|
|
170
|
+
}
|
|
171
|
+
/**
|
|
172
|
+
* In-memory lock provider service for DI.
|
|
173
|
+
*
|
|
174
|
+
* @example
|
|
175
|
+
* ```typescript
|
|
176
|
+
* import { InMemoryLockProvider } from '@justscale/core';
|
|
177
|
+
*
|
|
178
|
+
* // For DI - auto-provides AbstractLockProvider
|
|
179
|
+
* JustScale()
|
|
180
|
+
* .add(InMemoryLockProvider)
|
|
181
|
+
* .add(LockServiceDef)
|
|
182
|
+
* .build()
|
|
183
|
+
*
|
|
184
|
+
* // For testing - use createInMemoryLockProvider() instead
|
|
185
|
+
* const locks = createInMemoryLockProvider()
|
|
186
|
+
* ```
|
|
187
|
+
*/
|
|
188
|
+
export class InMemoryLockProvider extends defineService({
|
|
189
|
+
inject: {},
|
|
190
|
+
provides: [AbstractLockProvider],
|
|
191
|
+
factory: createInMemoryLockProvider,
|
|
192
|
+
}) {
|
|
193
|
+
}
|
|
194
|
+
//# sourceMappingURL=memory.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory.js","sourceRoot":"","sources":["../../../src/features/lock/memory.ts"],"names":[],"mappings":"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"}
|