@effect-app/infra 4.0.0-beta.31 → 4.0.0-beta.310
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/CHANGELOG.md +2361 -0
- package/_check.sh +1 -1
- package/dist/CUPS.d.ts +29 -10
- package/dist/CUPS.d.ts.map +1 -1
- package/dist/CUPS.js +35 -14
- package/dist/ClusterCosmos.d.ts +64 -0
- package/dist/ClusterCosmos.d.ts.map +1 -0
- package/dist/ClusterCosmos.js +547 -0
- package/dist/ClusterServiceBus.d.ts +67 -0
- package/dist/ClusterServiceBus.d.ts.map +1 -0
- package/dist/ClusterServiceBus.js +82 -0
- package/dist/ContextProvider.d.ts +34 -0
- package/dist/ContextProvider.d.ts.map +1 -0
- package/dist/ContextProvider.js +40 -0
- package/dist/Emailer/Sendgrid.d.ts +110 -146
- package/dist/Emailer/Sendgrid.d.ts.map +1 -1
- package/dist/Emailer/Sendgrid.js +24 -19
- package/dist/Emailer/fake.d.ts +1 -1
- package/dist/Emailer/fake.d.ts.map +1 -1
- package/dist/Emailer/fake.js +4 -4
- package/dist/MainFiberSet.d.ts +12 -8
- package/dist/MainFiberSet.d.ts.map +1 -1
- package/dist/MainFiberSet.js +23 -7
- package/dist/QueueMaker/errors.d.ts +4 -2
- package/dist/QueueMaker/errors.d.ts.map +1 -1
- package/dist/QueueMaker/errors.js +4 -2
- package/dist/{adapters/SQL → SQL}/Model.d.ts +31 -42
- package/dist/SQL/Model.d.ts.map +1 -0
- package/dist/SQL/Model.js +469 -0
- package/dist/SQL.d.ts.map +1 -0
- package/dist/{adapters/SQL.js → SQL.js} +1 -1
- package/dist/Store/Cosmos/query.d.ts +14 -3
- package/dist/Store/Cosmos/query.d.ts.map +1 -1
- package/dist/Store/Cosmos/query.js +179 -41
- package/dist/Store/Cosmos.d.ts +2 -2
- package/dist/Store/Cosmos.d.ts.map +1 -1
- package/dist/Store/Cosmos.js +385 -254
- package/dist/Store/Disk.d.ts +4 -4
- package/dist/Store/Disk.d.ts.map +1 -1
- package/dist/Store/Disk.js +79 -39
- package/dist/Store/Memory.d.ts +5 -9
- package/dist/Store/Memory.d.ts.map +1 -1
- package/dist/Store/Memory.js +324 -67
- package/dist/Store/SQL/Pg.d.ts +4 -0
- package/dist/Store/SQL/Pg.d.ts.map +1 -0
- package/dist/Store/SQL/Pg.js +253 -0
- package/dist/Store/SQL/query.d.ts +49 -0
- package/dist/Store/SQL/query.d.ts.map +1 -0
- package/dist/Store/SQL/query.js +527 -0
- package/dist/Store/SQL.d.ts +21 -0
- package/dist/Store/SQL.d.ts.map +1 -0
- package/dist/Store/SQL.js +472 -0
- package/dist/Store/codeFilter.d.ts +4 -4
- package/dist/Store/codeFilter.d.ts.map +1 -1
- package/dist/Store/codeFilter.js +6 -4
- package/dist/Store/index.d.ts +6 -4
- package/dist/Store/index.d.ts.map +1 -1
- package/dist/Store/index.js +18 -5
- package/dist/Store/utils.d.ts +5 -2
- package/dist/Store/utils.d.ts.map +1 -1
- package/dist/Store/utils.js +9 -5
- package/dist/WorkflowEngineCosmos.d.ts +29 -0
- package/dist/WorkflowEngineCosmos.d.ts.map +1 -0
- package/dist/WorkflowEngineCosmos.js +542 -0
- package/dist/WorkflowEngineSqlite.d.ts +24 -0
- package/dist/WorkflowEngineSqlite.d.ts.map +1 -0
- package/dist/WorkflowEngineSqlite.js +550 -0
- package/dist/arbs.d.ts +1 -1
- package/dist/arbs.d.ts.map +1 -1
- package/dist/arbs.js +5 -3
- package/dist/codec.d.ts.map +1 -0
- package/dist/codec.js +5 -0
- package/dist/{adapters/cosmos-client.d.ts → cosmos-client.d.ts} +4 -2
- package/dist/cosmos-client.d.ts.map +1 -0
- package/dist/cosmos-client.js +11 -0
- package/dist/errorReporter.d.ts +6 -4
- package/dist/errorReporter.d.ts.map +1 -1
- package/dist/errorReporter.js +23 -27
- package/dist/fileUtil.d.ts +1 -1
- package/dist/fileUtil.d.ts.map +1 -1
- package/dist/fileUtil.js +2 -2
- package/dist/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -2
- package/dist/internal/RequestContextMiddleware.d.ts +5 -0
- package/dist/internal/RequestContextMiddleware.d.ts.map +1 -0
- package/dist/internal/RequestContextMiddleware.js +45 -0
- package/dist/internal/auth.d.ts +53 -0
- package/dist/internal/auth.d.ts.map +1 -0
- package/dist/internal/auth.js +180 -0
- package/dist/internal/events.d.ts +11 -0
- package/dist/internal/events.d.ts.map +1 -0
- package/dist/internal/events.js +49 -0
- package/dist/internal/health.d.ts.map +1 -0
- package/dist/internal/health.js +5 -0
- package/dist/{api/layerUtils.d.ts → layerUtils.d.ts} +14 -6
- package/dist/layerUtils.d.ts.map +1 -0
- package/dist/layerUtils.js +17 -0
- package/dist/logger/jsonLogger.d.ts +1 -1
- package/dist/logger/jsonLogger.d.ts.map +1 -1
- package/dist/logger/jsonLogger.js +5 -3
- package/dist/logger/logFmtLogger.d.ts +1 -1
- package/dist/logger/logFmtLogger.d.ts.map +1 -1
- package/dist/logger/logFmtLogger.js +3 -3
- package/dist/logger/shared.d.ts +2 -2
- package/dist/logger/shared.d.ts.map +1 -1
- package/dist/logger/shared.js +5 -5
- package/dist/logger.d.ts.map +1 -1
- package/dist/middlewares.d.ts.map +1 -0
- package/dist/{api/middlewares.js → middlewares.js} +1 -1
- package/dist/{adapters/mongo-client.d.ts → mongo-client.d.ts} +3 -2
- package/dist/mongo-client.d.ts.map +1 -0
- package/dist/mongo-client.js +15 -0
- package/dist/otel.d.ts +75 -0
- package/dist/otel.d.ts.map +1 -0
- package/dist/otel.js +84 -0
- package/dist/rateLimit.d.ts +11 -3
- package/dist/rateLimit.d.ts.map +1 -1
- package/dist/rateLimit.js +7 -12
- package/dist/{adapters/redis-client.d.ts → redis-client.d.ts} +5 -2
- package/dist/redis-client.d.ts.map +1 -0
- package/dist/redis-client.js +98 -0
- package/dist/{api/reportError.d.ts → reportError.d.ts} +1 -1
- package/dist/reportError.d.ts.map +1 -0
- package/dist/reportError.js +28 -0
- package/dist/{api/routing → routing}/middleware/RouterMiddleware.d.ts +4 -3
- package/dist/routing/middleware/RouterMiddleware.d.ts.map +1 -0
- package/dist/{api/routing → routing}/middleware/RouterMiddleware.js +1 -1
- package/dist/routing/middleware/middleware.d.ts +48 -0
- package/dist/routing/middleware/middleware.d.ts.map +1 -0
- package/dist/routing/middleware/middleware.js +152 -0
- package/dist/{api/routing → routing}/middleware.d.ts +0 -1
- package/dist/routing/middleware.d.ts.map +1 -0
- package/dist/{api/routing → routing}/middleware.js +1 -2
- package/dist/routing/schema/jwt.d.ts.map +1 -0
- package/dist/routing/schema/jwt.js +13 -0
- package/dist/routing/tsort.d.ts.map +1 -0
- package/dist/routing/tsort.js +51 -0
- package/dist/{api/routing → routing}/utils.d.ts +3 -3
- package/dist/routing/utils.d.ts.map +1 -0
- package/dist/routing/utils.js +45 -0
- package/dist/routing.d.ts +182 -0
- package/dist/routing.d.ts.map +1 -0
- package/dist/routing.js +256 -0
- package/dist/test.d.ts +2 -2
- package/dist/test.d.ts.map +1 -1
- package/dist/test.js +2 -2
- package/dist/util.d.ts.map +1 -0
- package/dist/util.js +14 -0
- package/docs/cluster-storage.md +26 -0
- package/docs/workflow-engine.md +262 -0
- package/examples/query.ts +47 -39
- package/package.json +38 -352
- package/src/CUPS.ts +53 -14
- package/src/ClusterCosmos.ts +1118 -0
- package/src/ClusterServiceBus.ts +242 -0
- package/src/{api/ContextProvider.ts → ContextProvider.ts} +20 -17
- package/src/Emailer/Sendgrid.ts +83 -60
- package/src/Emailer/fake.ts +4 -4
- package/src/MainFiberSet.ts +32 -13
- package/src/QueueMaker/errors.ts +3 -1
- package/src/{adapters/SQL → SQL}/Model.ts +42 -41
- package/src/SQL.ts +1 -0
- package/src/Store/Cosmos/query.ts +218 -54
- package/src/Store/Cosmos.ts +529 -365
- package/src/Store/Disk.ts +112 -70
- package/src/Store/Memory.ts +365 -99
- package/src/Store/SQL/Pg.ts +389 -0
- package/src/Store/SQL/query.ts +603 -0
- package/src/Store/SQL.ts +766 -0
- package/src/Store/codeFilter.ts +8 -6
- package/src/Store/index.ts +25 -10
- package/src/Store/utils.ts +32 -25
- package/src/WorkflowEngineCosmos.ts +749 -0
- package/src/WorkflowEngineSqlite.ts +813 -0
- package/src/arbs.ts +5 -3
- package/src/{adapters/cosmos-client.ts → cosmos-client.ts} +5 -3
- package/src/errorReporter.ts +68 -78
- package/src/fileUtil.ts +1 -1
- package/src/index.ts +2 -1
- package/src/{api/internal → internal}/RequestContextMiddleware.ts +23 -6
- package/src/internal/auth.ts +272 -0
- package/src/{api/internal → internal}/events.ts +22 -13
- package/src/{api/layerUtils.ts → layerUtils.ts} +14 -10
- package/src/logger/jsonLogger.ts +5 -3
- package/src/logger/logFmtLogger.ts +3 -3
- package/src/logger/shared.ts +5 -4
- package/src/middlewares.ts +10 -0
- package/src/{adapters/mongo-client.ts → mongo-client.ts} +4 -2
- package/src/otel.ts +177 -0
- package/src/rateLimit.ts +34 -23
- package/src/{adapters/redis-client.ts → redis-client.ts} +7 -3
- package/src/{api/reportError.ts → reportError.ts} +3 -2
- package/src/{api/routing → routing}/middleware/RouterMiddleware.ts +5 -4
- package/src/routing/middleware/middleware.ts +196 -0
- package/src/routing/middleware.ts +4 -0
- package/src/{api/routing → routing}/schema/jwt.ts +2 -1
- package/src/{api/routing → routing}/utils.ts +2 -1
- package/src/routing.ts +823 -0
- package/src/test.ts +4 -4
- package/src/vitest.ts +1 -1
- package/test/auth.test.ts +101 -0
- package/test/cluster-cosmos.test.ts +612 -0
- package/test/cluster-servicebus.test.ts +180 -0
- package/test/cluster-sqlite.test.ts +205 -0
- package/test/contextProvider.test.ts +15 -12
- package/test/controller.test.ts +28 -32
- package/test/cosmos-query.test.ts +228 -0
- package/test/dist/auth.test.d.ts.map +1 -0
- package/test/dist/cluster-cosmos.test.d.ts.map +1 -0
- package/test/dist/cluster-servicebus.test.d.ts.map +1 -0
- package/test/dist/cluster-sqlite.test.d.ts.map +1 -0
- package/test/dist/contextProvider.test.d.ts.map +1 -1
- package/test/dist/controller.test.d.ts.map +1 -1
- package/test/dist/cosmos-query.test.d.ts.map +1 -0
- package/test/dist/fixtures.d.ts +29 -11
- package/test/dist/fixtures.d.ts.map +1 -1
- package/test/dist/fixtures.js +17 -10
- package/test/dist/query.test.d.ts.map +1 -1
- package/test/dist/rawQuery.test.d.ts.map +1 -1
- package/test/dist/repository-ext.test.d.ts.map +1 -0
- package/test/dist/requires.test.d.ts.map +1 -1
- package/test/dist/router-generator.test.d.ts.map +1 -0
- package/test/dist/routing-interruptibility.test.d.ts.map +1 -0
- package/test/dist/rpc-context-map-streaming.test.d.ts.map +1 -0
- package/test/dist/rpc-e2e-invalidation.test.d.ts.map +1 -0
- package/test/dist/rpc-multi-middleware.test.d.ts.map +1 -1
- package/test/dist/rpc-stream-fullstack.test.d.ts.map +1 -0
- package/test/dist/sql-store.test.d.ts.map +1 -0
- package/test/dist/workflow-engine-cosmos.test.d.ts.map +1 -0
- package/test/dist/workflow-engine-sqlite.test.d.ts.map +1 -0
- package/test/fixtures.ts +16 -9
- package/test/layerUtils.test.ts +2 -2
- package/test/query.test.ts +1130 -41
- package/test/rawQuery.test.ts +340 -22
- package/test/repository-ext.test.ts +426 -0
- package/test/requires.test.ts +10 -5
- package/test/router-generator.test.ts +187 -0
- package/test/routing-interruptibility.test.ts +66 -0
- package/test/rpc-context-map-streaming.test.ts +262 -0
- package/test/rpc-e2e-invalidation.test.ts +418 -0
- package/test/rpc-multi-middleware.test.ts +85 -10
- package/test/rpc-stream-fullstack.test.ts +304 -0
- package/test/sql-store.test.ts +1711 -0
- package/test/validateSample.test.ts +26 -14
- package/test/workflow-engine-cosmos.test.ts +345 -0
- package/test/workflow-engine-sqlite.test.ts +297 -0
- package/tsconfig.examples.json +1 -1
- package/tsconfig.json +9 -2
- package/tsconfig.src.json +35 -35
- package/tsconfig.test.json +2 -2
- package/dist/Emailer/service.d.ts +0 -55
- package/dist/Emailer/service.d.ts.map +0 -1
- package/dist/Emailer/service.js +0 -6
- package/dist/Emailer.d.ts +0 -2
- package/dist/Emailer.d.ts.map +0 -1
- package/dist/Emailer.js +0 -2
- package/dist/Model/Repository/ext.d.ts +0 -41
- package/dist/Model/Repository/ext.d.ts.map +0 -1
- package/dist/Model/Repository/ext.js +0 -65
- package/dist/Model/Repository/internal/internal.d.ts +0 -59
- package/dist/Model/Repository/internal/internal.d.ts.map +0 -1
- package/dist/Model/Repository/internal/internal.js +0 -316
- package/dist/Model/Repository/legacy.d.ts +0 -19
- package/dist/Model/Repository/legacy.d.ts.map +0 -1
- package/dist/Model/Repository/legacy.js +0 -2
- package/dist/Model/Repository/makeRepo.d.ts +0 -49
- package/dist/Model/Repository/makeRepo.d.ts.map +0 -1
- package/dist/Model/Repository/makeRepo.js +0 -24
- package/dist/Model/Repository/service.d.ts +0 -89
- package/dist/Model/Repository/service.d.ts.map +0 -1
- package/dist/Model/Repository/service.js +0 -2
- package/dist/Model/Repository/validation.d.ts +0 -42
- package/dist/Model/Repository/validation.d.ts.map +0 -1
- package/dist/Model/Repository/validation.js +0 -32
- package/dist/Model/Repository.d.ts +0 -6
- package/dist/Model/Repository.d.ts.map +0 -1
- package/dist/Model/Repository.js +0 -6
- package/dist/Model/dsl.d.ts +0 -32
- package/dist/Model/dsl.d.ts.map +0 -1
- package/dist/Model/dsl.js +0 -44
- package/dist/Model/filter/filterApi.d.ts +0 -30
- package/dist/Model/filter/filterApi.d.ts.map +0 -1
- package/dist/Model/filter/filterApi.js +0 -2
- package/dist/Model/filter/types/errors.d.ts +0 -29
- package/dist/Model/filter/types/errors.d.ts.map +0 -1
- package/dist/Model/filter/types/errors.js +0 -2
- package/dist/Model/filter/types/fields.d.ts +0 -15
- package/dist/Model/filter/types/fields.d.ts.map +0 -1
- package/dist/Model/filter/types/fields.js +0 -2
- package/dist/Model/filter/types/path/common.d.ts +0 -316
- package/dist/Model/filter/types/path/common.d.ts.map +0 -1
- package/dist/Model/filter/types/path/common.js +0 -2
- package/dist/Model/filter/types/path/eager.d.ts +0 -95
- package/dist/Model/filter/types/path/eager.d.ts.map +0 -1
- package/dist/Model/filter/types/path/eager.js +0 -31
- package/dist/Model/filter/types/path/index.d.ts +0 -4
- package/dist/Model/filter/types/path/index.d.ts.map +0 -1
- package/dist/Model/filter/types/path/index.js +0 -3
- package/dist/Model/filter/types/utils.d.ts +0 -79
- package/dist/Model/filter/types/utils.d.ts.map +0 -1
- package/dist/Model/filter/types/utils.js +0 -2
- package/dist/Model/filter/types/validator.d.ts +0 -30
- package/dist/Model/filter/types/validator.d.ts.map +0 -1
- package/dist/Model/filter/types/validator.js +0 -2
- package/dist/Model/filter/types.d.ts +0 -5
- package/dist/Model/filter/types.d.ts.map +0 -1
- package/dist/Model/filter/types.js +0 -7
- package/dist/Model/query/dsl.d.ts +0 -248
- package/dist/Model/query/dsl.d.ts.map +0 -1
- package/dist/Model/query/dsl.js +0 -104
- package/dist/Model/query/new-kid-interpreter.d.ts +0 -28
- package/dist/Model/query/new-kid-interpreter.d.ts.map +0 -1
- package/dist/Model/query/new-kid-interpreter.js +0 -165
- package/dist/Model/query.d.ts +0 -15
- package/dist/Model/query.d.ts.map +0 -1
- package/dist/Model/query.js +0 -3
- package/dist/Model.d.ts +0 -4
- package/dist/Model.d.ts.map +0 -1
- package/dist/Model.js +0 -4
- package/dist/Operations.d.ts +0 -55
- package/dist/Operations.d.ts.map +0 -1
- package/dist/Operations.js +0 -102
- package/dist/OperationsRepo.d.ts +0 -41
- package/dist/OperationsRepo.d.ts.map +0 -1
- package/dist/OperationsRepo.js +0 -14
- package/dist/QueueMaker/SQLQueue.d.ts +0 -16
- package/dist/QueueMaker/SQLQueue.d.ts.map +0 -1
- package/dist/QueueMaker/SQLQueue.js +0 -130
- package/dist/QueueMaker/memQueue.d.ts +0 -11
- package/dist/QueueMaker/memQueue.d.ts.map +0 -1
- package/dist/QueueMaker/memQueue.js +0 -76
- package/dist/QueueMaker/sbqueue.d.ts +0 -12
- package/dist/QueueMaker/sbqueue.d.ts.map +0 -1
- package/dist/QueueMaker/sbqueue.js +0 -91
- package/dist/QueueMaker/service.d.ts +0 -11
- package/dist/QueueMaker/service.d.ts.map +0 -1
- package/dist/QueueMaker/service.js +0 -4
- package/dist/RequestContext.d.ts +0 -63
- package/dist/RequestContext.d.ts.map +0 -1
- package/dist/RequestContext.js +0 -49
- package/dist/RequestFiberSet.d.ts +0 -36
- package/dist/RequestFiberSet.d.ts.map +0 -1
- package/dist/RequestFiberSet.js +0 -78
- package/dist/Store/ContextMapContainer.d.ts +0 -14
- package/dist/Store/ContextMapContainer.d.ts.map +0 -1
- package/dist/Store/ContextMapContainer.js +0 -16
- package/dist/Store/service.d.ts +0 -108
- package/dist/Store/service.d.ts.map +0 -1
- package/dist/Store/service.js +0 -71
- package/dist/Store.d.ts +0 -2
- package/dist/Store.d.ts.map +0 -1
- package/dist/Store.js +0 -2
- package/dist/adapters/SQL/Model.d.ts.map +0 -1
- package/dist/adapters/SQL/Model.js +0 -478
- package/dist/adapters/SQL.d.ts.map +0 -1
- package/dist/adapters/ServiceBus.d.ts +0 -58
- package/dist/adapters/ServiceBus.d.ts.map +0 -1
- package/dist/adapters/ServiceBus.js +0 -99
- package/dist/adapters/cosmos-client.d.ts.map +0 -1
- package/dist/adapters/cosmos-client.js +0 -9
- package/dist/adapters/index.d.ts +0 -2
- package/dist/adapters/index.d.ts.map +0 -1
- package/dist/adapters/index.js +0 -2
- package/dist/adapters/logger.d.ts +0 -9
- package/dist/adapters/logger.d.ts.map +0 -1
- package/dist/adapters/logger.js +0 -3
- package/dist/adapters/memQueue.d.ts +0 -13
- package/dist/adapters/memQueue.d.ts.map +0 -1
- package/dist/adapters/memQueue.js +0 -20
- package/dist/adapters/mongo-client.d.ts.map +0 -1
- package/dist/adapters/mongo-client.js +0 -13
- package/dist/adapters/redis-client.d.ts.map +0 -1
- package/dist/adapters/redis-client.js +0 -94
- package/dist/api/ContextProvider.d.ts +0 -31
- package/dist/api/ContextProvider.d.ts.map +0 -1
- package/dist/api/ContextProvider.js +0 -38
- package/dist/api/codec.d.ts.map +0 -1
- package/dist/api/codec.js +0 -5
- package/dist/api/internal/RequestContextMiddleware.d.ts +0 -5
- package/dist/api/internal/RequestContextMiddleware.d.ts.map +0 -1
- package/dist/api/internal/RequestContextMiddleware.js +0 -35
- package/dist/api/internal/auth.d.ts +0 -15
- package/dist/api/internal/auth.d.ts.map +0 -1
- package/dist/api/internal/auth.js +0 -47
- package/dist/api/internal/events.d.ts +0 -9
- package/dist/api/internal/events.d.ts.map +0 -1
- package/dist/api/internal/events.js +0 -42
- package/dist/api/internal/health.d.ts.map +0 -1
- package/dist/api/internal/health.js +0 -5
- package/dist/api/layerUtils.d.ts.map +0 -1
- package/dist/api/layerUtils.js +0 -16
- package/dist/api/middlewares.d.ts.map +0 -1
- package/dist/api/reportError.d.ts.map +0 -1
- package/dist/api/reportError.js +0 -27
- package/dist/api/routing/middleware/RouterMiddleware.d.ts.map +0 -1
- package/dist/api/routing/middleware/middleware.d.ts +0 -9
- package/dist/api/routing/middleware/middleware.d.ts.map +0 -1
- package/dist/api/routing/middleware/middleware.js +0 -92
- package/dist/api/routing/middleware.d.ts.map +0 -1
- package/dist/api/routing/schema/jwt.d.ts.map +0 -1
- package/dist/api/routing/schema/jwt.js +0 -12
- package/dist/api/routing/tsort.d.ts.map +0 -1
- package/dist/api/routing/tsort.js +0 -51
- package/dist/api/routing/utils.d.ts.map +0 -1
- package/dist/api/routing/utils.js +0 -44
- package/dist/api/routing.d.ts +0 -138
- package/dist/api/routing.d.ts.map +0 -1
- package/dist/api/routing.js +0 -166
- package/dist/api/setupRequest.d.ts +0 -12
- package/dist/api/setupRequest.d.ts.map +0 -1
- package/dist/api/setupRequest.js +0 -44
- package/dist/api/util.d.ts.map +0 -1
- package/dist/api/util.js +0 -14
- package/eslint.config.mjs +0 -24
- package/src/Emailer/service.ts +0 -52
- package/src/Emailer.ts +0 -1
- package/src/Model/Repository/ext.ts +0 -283
- package/src/Model/Repository/internal/internal.ts +0 -577
- package/src/Model/Repository/legacy.ts +0 -27
- package/src/Model/Repository/makeRepo.ts +0 -139
- package/src/Model/Repository/service.ts +0 -627
- package/src/Model/Repository/validation.ts +0 -31
- package/src/Model/Repository.ts +0 -5
- package/src/Model/dsl.ts +0 -128
- package/src/Model/filter/filterApi.ts +0 -60
- package/src/Model/filter/types/errors.ts +0 -47
- package/src/Model/filter/types/fields.ts +0 -50
- package/src/Model/filter/types/path/common.ts +0 -404
- package/src/Model/filter/types/path/eager.ts +0 -298
- package/src/Model/filter/types/path/index.ts +0 -4
- package/src/Model/filter/types/utils.ts +0 -128
- package/src/Model/filter/types/validator.ts +0 -46
- package/src/Model/filter/types.ts +0 -6
- package/src/Model/query/dsl.ts +0 -2110
- package/src/Model/query/new-kid-interpreter.ts +0 -210
- package/src/Model/query.ts +0 -13
- package/src/Model.ts +0 -3
- package/src/Operations.ts +0 -235
- package/src/OperationsRepo.ts +0 -16
- package/src/QueueMaker/SQLQueue.ts +0 -189
- package/src/QueueMaker/memQueue.ts +0 -130
- package/src/QueueMaker/sbqueue.ts +0 -137
- package/src/QueueMaker/service.ts +0 -17
- package/src/RequestContext.ts +0 -63
- package/src/RequestFiberSet.ts +0 -105
- package/src/Store/ContextMapContainer.ts +0 -20
- package/src/Store/index.test.ts.bak +0 -112
- package/src/Store/service.ts +0 -184
- package/src/Store.ts +0 -1
- package/src/adapters/SQL.ts +0 -1
- package/src/adapters/ServiceBus.ts +0 -209
- package/src/adapters/index.ts +0 -0
- package/src/adapters/logger.ts +0 -3
- package/src/adapters/memQueue.ts +0 -21
- package/src/api/internal/auth.ts +0 -68
- package/src/api/middlewares.ts +0 -10
- package/src/api/routing/middleware/middleware.ts +0 -128
- package/src/api/routing/middleware.ts +0 -6
- package/src/api/routing.ts +0 -598
- package/src/api/setupRequest.ts +0 -84
- package/tsconfig.json.bak +0 -12
- /package/dist/{adapters/SQL.d.ts → SQL.d.ts} +0 -0
- /package/dist/{api/codec.d.ts → codec.d.ts} +0 -0
- /package/dist/{api/internal → internal}/health.d.ts +0 -0
- /package/dist/{api/middlewares.d.ts → middlewares.d.ts} +0 -0
- /package/dist/{api/routing → routing}/schema/jwt.d.ts +0 -0
- /package/dist/{api/routing → routing}/tsort.d.ts +0 -0
- /package/dist/{api/util.d.ts → util.d.ts} +0 -0
- /package/src/{api/codec.ts → codec.ts} +0 -0
- /package/src/{api/internal → internal}/health.ts +0 -0
- /package/src/{api/routing → routing}/tsort.ts +0 -0
- /package/src/{api/util.ts → util.ts} +0 -0
|
@@ -1,130 +0,0 @@
|
|
|
1
|
-
import { Cause, Tracer } from "effect"
|
|
2
|
-
import { Effect, Fiber, flow, type NonEmptyReadonlyArray, S } from "effect-app"
|
|
3
|
-
import { pretty } from "effect-app/utils"
|
|
4
|
-
import * as Q from "effect/Queue"
|
|
5
|
-
import { MemQueue } from "../adapters/memQueue.js"
|
|
6
|
-
import { getRequestContext, setupRequestContextWithCustomSpan } from "../api/setupRequest.js"
|
|
7
|
-
import { InfraLogger } from "../logger.js"
|
|
8
|
-
import { reportNonInterruptedFailure, reportNonInterruptedFailureCause } from "./errors.js"
|
|
9
|
-
import { type QueueBase, QueueMeta } from "./service.js"
|
|
10
|
-
|
|
11
|
-
export function makeMemQueue<
|
|
12
|
-
Evt extends { id: S.StringId; _tag: string },
|
|
13
|
-
DrainEvt extends { id: S.StringId; _tag: string },
|
|
14
|
-
EvtE,
|
|
15
|
-
DrainEvtE
|
|
16
|
-
>(
|
|
17
|
-
queueName: string,
|
|
18
|
-
queueDrainName: string,
|
|
19
|
-
schema: S.Codec<Evt, EvtE>,
|
|
20
|
-
drainSchema: S.Codec<DrainEvt, DrainEvtE>
|
|
21
|
-
) {
|
|
22
|
-
return Effect.gen(function*() {
|
|
23
|
-
const mem = yield* MemQueue
|
|
24
|
-
const q = yield* mem.getOrCreateQueue(queueName)
|
|
25
|
-
const qDrain = yield* mem.getOrCreateQueue(queueDrainName)
|
|
26
|
-
|
|
27
|
-
const wireSchema = S.Struct({ body: schema, meta: QueueMeta })
|
|
28
|
-
const wireSchemaJson = S.fromJsonString(wireSchema)
|
|
29
|
-
const encodePublish = S.encodeEffect(wireSchemaJson)
|
|
30
|
-
const drainW = S.Struct({ body: drainSchema, meta: QueueMeta })
|
|
31
|
-
const drainWJson = S.fromJsonString(drainW)
|
|
32
|
-
|
|
33
|
-
const parseDrain = flow(S.decodeUnknownEffect(drainWJson), Effect.orDie)
|
|
34
|
-
|
|
35
|
-
const queue = {
|
|
36
|
-
publish: (...messages: NonEmptyReadonlyArray<Evt>) =>
|
|
37
|
-
getRequestContext
|
|
38
|
-
.pipe(
|
|
39
|
-
Effect.flatMap((requestContext) =>
|
|
40
|
-
Effect
|
|
41
|
-
.forEach(messages, (m) =>
|
|
42
|
-
// we JSON encode, because that is what the wire also does, and it reveals holes in e.g unknown encoders (Date->String)
|
|
43
|
-
encodePublish({ body: m, meta: requestContext }).pipe(
|
|
44
|
-
Effect.orDie,
|
|
45
|
-
// .tap((msg) => info("Publishing Mem Message: " + utils.inspect(msg)))
|
|
46
|
-
Effect.flatMap((_) => Q.offer(q, _))
|
|
47
|
-
), { discard: true })
|
|
48
|
-
),
|
|
49
|
-
Effect.withSpan("queue.publish: " + queueName, {
|
|
50
|
-
kind: "producer",
|
|
51
|
-
attributes: { "message_tags": messages.map((_) => _._tag) }
|
|
52
|
-
}, { captureStackTrace: false })
|
|
53
|
-
),
|
|
54
|
-
drain: <DrainE, DrainR>(
|
|
55
|
-
handleEvent: (ks: DrainEvt) => Effect.Effect<void, DrainE, DrainR>,
|
|
56
|
-
sessionId?: string
|
|
57
|
-
) => {
|
|
58
|
-
const silenceAndReportError = reportNonInterruptedFailure({ name: "MemQueue.drain." + queueDrainName })
|
|
59
|
-
const reportError = reportNonInterruptedFailureCause({ name: "MemQueue.drain." + queueDrainName })
|
|
60
|
-
const processMessage = (msg: string) =>
|
|
61
|
-
// we JSON parse, because that is what the wire also does, and it reveals holes in e.g unknown encoders (Date->String)
|
|
62
|
-
parseDrain(msg).pipe(
|
|
63
|
-
Effect.orDie,
|
|
64
|
-
Effect
|
|
65
|
-
.flatMap(({ body, meta }) => {
|
|
66
|
-
let effect = InfraLogger
|
|
67
|
-
.logDebug(`[${queueDrainName}] Processing incoming message`)
|
|
68
|
-
.pipe(
|
|
69
|
-
Effect.annotateLogs({ body: pretty(body), meta: pretty(meta) }),
|
|
70
|
-
Effect.andThen(handleEvent(body)),
|
|
71
|
-
silenceAndReportError,
|
|
72
|
-
(_) =>
|
|
73
|
-
setupRequestContextWithCustomSpan(
|
|
74
|
-
_,
|
|
75
|
-
meta,
|
|
76
|
-
`queue.drain: ${queueDrainName}.${body._tag}`,
|
|
77
|
-
{
|
|
78
|
-
captureStackTrace: false,
|
|
79
|
-
kind: "consumer",
|
|
80
|
-
attributes: {
|
|
81
|
-
"queue.name": queueDrainName,
|
|
82
|
-
"queue.sessionId": sessionId,
|
|
83
|
-
"queue.input": body
|
|
84
|
-
}
|
|
85
|
-
}
|
|
86
|
-
)
|
|
87
|
-
)
|
|
88
|
-
if (meta.span) {
|
|
89
|
-
effect = Effect.withParentSpan(effect, Tracer.externalSpan(meta.span))
|
|
90
|
-
}
|
|
91
|
-
return effect
|
|
92
|
-
})
|
|
93
|
-
)
|
|
94
|
-
return Q
|
|
95
|
-
.take(qDrain)
|
|
96
|
-
.pipe(
|
|
97
|
-
Effect
|
|
98
|
-
.flatMap((x) =>
|
|
99
|
-
processMessage(x).pipe(
|
|
100
|
-
Effect.uninterruptible,
|
|
101
|
-
Effect.forkChild,
|
|
102
|
-
Effect.flatMap(Fiber.join),
|
|
103
|
-
// normally a failed item would be returned to the queue and retried up to X times.
|
|
104
|
-
Effect.flatMap((_) =>
|
|
105
|
-
_._tag === "Failure" && !Cause.hasInterruptsOnly(_.cause)
|
|
106
|
-
? Q.offer(qDrain, x).pipe(
|
|
107
|
-
// TODO: retry count tracking and max retries.
|
|
108
|
-
Effect.delay("5 seconds"),
|
|
109
|
-
Effect.tapCause(reportError),
|
|
110
|
-
Effect.forkDetach
|
|
111
|
-
)
|
|
112
|
-
: Effect.void
|
|
113
|
-
)
|
|
114
|
-
)
|
|
115
|
-
),
|
|
116
|
-
silenceAndReportError,
|
|
117
|
-
Effect.withSpan(`queue.drain: ${queueDrainName}`, {
|
|
118
|
-
attributes: {
|
|
119
|
-
"queue.type": "mem",
|
|
120
|
-
"queue.name": queueDrainName,
|
|
121
|
-
"queue.sessionId": sessionId
|
|
122
|
-
}
|
|
123
|
-
}),
|
|
124
|
-
Effect.forever
|
|
125
|
-
)
|
|
126
|
-
}
|
|
127
|
-
}
|
|
128
|
-
return queue as QueueBase<Evt, DrainEvt>
|
|
129
|
-
})
|
|
130
|
-
}
|
|
@@ -1,137 +0,0 @@
|
|
|
1
|
-
import { Tracer } from "effect"
|
|
2
|
-
import { Cause, Effect, flow, type NonEmptyReadonlyArray, S } from "effect-app"
|
|
3
|
-
import type { StringId } from "effect-app/Schema"
|
|
4
|
-
import { pretty } from "effect-app/utils"
|
|
5
|
-
import { Receiver, Sender } from "../adapters/ServiceBus.js"
|
|
6
|
-
import { getRequestContext, setupRequestContextWithCustomSpan } from "../api/setupRequest.js"
|
|
7
|
-
import { InfraLogger } from "../logger.js"
|
|
8
|
-
import { reportNonInterruptedFailure, reportNonInterruptedFailureCause, reportQueueError } from "./errors.js"
|
|
9
|
-
import { type QueueBase, QueueMeta } from "./service.js"
|
|
10
|
-
|
|
11
|
-
export function makeServiceBusQueue<
|
|
12
|
-
Evt extends { id: StringId; _tag: string },
|
|
13
|
-
DrainEvt extends { id: StringId; _tag: string },
|
|
14
|
-
EvtE,
|
|
15
|
-
DrainEvtE
|
|
16
|
-
>(
|
|
17
|
-
schema: S.Codec<Evt, EvtE>,
|
|
18
|
-
drainSchema: S.Codec<DrainEvt, DrainEvtE>
|
|
19
|
-
) {
|
|
20
|
-
const wireSchema = S.Struct({
|
|
21
|
-
body: schema,
|
|
22
|
-
meta: QueueMeta
|
|
23
|
-
})
|
|
24
|
-
const wireSchemaJson = S.fromJsonString(wireSchema)
|
|
25
|
-
const encodePublish = S.encodeEffect(wireSchemaJson)
|
|
26
|
-
const drainW = S.Struct({ body: drainSchema, meta: QueueMeta })
|
|
27
|
-
const drainWJson = S.fromJsonString(drainW)
|
|
28
|
-
const parseDrain = flow(S.decodeUnknownEffect(drainWJson), Effect.orDie)
|
|
29
|
-
|
|
30
|
-
return Effect.gen(function*() {
|
|
31
|
-
const sender = yield* Sender
|
|
32
|
-
const receiver = yield* Receiver
|
|
33
|
-
const silenceAndReportError = reportNonInterruptedFailure({ name: receiver.name })
|
|
34
|
-
const reportError = reportNonInterruptedFailureCause({ name: receiver.name })
|
|
35
|
-
|
|
36
|
-
// TODO: or do async?
|
|
37
|
-
// This will make sure that the host receives the error (MainFiberSet.join), who will then interrupt everything and commence a shutdown and restart of app
|
|
38
|
-
// const deferred = yield* Deferred.make<never, ServiceBusError | Error>()
|
|
39
|
-
|
|
40
|
-
const queue = {
|
|
41
|
-
drain: <DrainE, DrainR>(
|
|
42
|
-
handleEvent: (ks: DrainEvt) => Effect.Effect<void, DrainE, DrainR>,
|
|
43
|
-
sessionId?: string
|
|
44
|
-
) => {
|
|
45
|
-
function processMessage(messageBody: unknown) {
|
|
46
|
-
return parseDrain(messageBody).pipe(
|
|
47
|
-
Effect.orDie,
|
|
48
|
-
Effect
|
|
49
|
-
.flatMap(({ body, meta }) => {
|
|
50
|
-
let effect = InfraLogger
|
|
51
|
-
.logDebug(`[${receiver.name}] Processing incoming message`)
|
|
52
|
-
.pipe(
|
|
53
|
-
Effect.annotateLogs({
|
|
54
|
-
body: pretty(body),
|
|
55
|
-
meta: pretty(meta)
|
|
56
|
-
}),
|
|
57
|
-
Effect.andThen(handleEvent(body)),
|
|
58
|
-
Effect.orDie
|
|
59
|
-
)
|
|
60
|
-
// we silenceAndReportError here, so that the error is reported, and moves into the Exit.
|
|
61
|
-
.pipe(
|
|
62
|
-
silenceAndReportError,
|
|
63
|
-
(_) =>
|
|
64
|
-
setupRequestContextWithCustomSpan(
|
|
65
|
-
_,
|
|
66
|
-
meta,
|
|
67
|
-
`queue.drain: ${receiver.name}${sessionId ? `#${sessionId}` : ""}.${body._tag}`,
|
|
68
|
-
{
|
|
69
|
-
captureStackTrace: false,
|
|
70
|
-
kind: "consumer",
|
|
71
|
-
attributes: {
|
|
72
|
-
"queue.name": receiver.name,
|
|
73
|
-
"queue.sessionId": sessionId,
|
|
74
|
-
"queue.input": body
|
|
75
|
-
}
|
|
76
|
-
}
|
|
77
|
-
)
|
|
78
|
-
)
|
|
79
|
-
if (meta.span) {
|
|
80
|
-
effect = Effect.withParentSpan(effect, Tracer.externalSpan(meta.span))
|
|
81
|
-
}
|
|
82
|
-
return effect
|
|
83
|
-
}),
|
|
84
|
-
Effect
|
|
85
|
-
// we reportError here, so that we report the error only, and keep flowing
|
|
86
|
-
.tapCause(reportError),
|
|
87
|
-
// we still need to flatten the Exit.
|
|
88
|
-
Effect.flatMap((_) => _)
|
|
89
|
-
)
|
|
90
|
-
}
|
|
91
|
-
|
|
92
|
-
return receiver
|
|
93
|
-
.subscribe({
|
|
94
|
-
processMessage: (x) => processMessage(x.body).pipe(Effect.uninterruptible),
|
|
95
|
-
processError: (err) => reportQueueError(Cause.fail(err.error))
|
|
96
|
-
// Deferred.completeWith(
|
|
97
|
-
// deferred,
|
|
98
|
-
// reportFatalQueueError(Cause.fail(err.error))
|
|
99
|
-
// .pipe(Effect.andThen(Effect.fail(err.error)))
|
|
100
|
-
// )
|
|
101
|
-
}, sessionId)
|
|
102
|
-
// .pipe(Effect.andThen(Deferred.await(deferred).pipe(Effect.orDie))),
|
|
103
|
-
.pipe(
|
|
104
|
-
Effect.andThen(Effect.never)
|
|
105
|
-
)
|
|
106
|
-
},
|
|
107
|
-
|
|
108
|
-
publish: (...messages: NonEmptyReadonlyArray<Evt>) =>
|
|
109
|
-
getRequestContext
|
|
110
|
-
.pipe(
|
|
111
|
-
Effect.flatMap((requestContext) =>
|
|
112
|
-
Effect
|
|
113
|
-
.forEach(messages, (m) =>
|
|
114
|
-
encodePublish({
|
|
115
|
-
body: m,
|
|
116
|
-
meta: requestContext
|
|
117
|
-
})
|
|
118
|
-
.pipe(
|
|
119
|
-
Effect.orDie,
|
|
120
|
-
Effect.map((body) => ({
|
|
121
|
-
body,
|
|
122
|
-
messageId: m.id, /* correllationid: requestId */
|
|
123
|
-
contentType: "application/json",
|
|
124
|
-
sessionId: "sessionId" in m ? m.sessionId as string : undefined as unknown as string // TODO: optional
|
|
125
|
-
}))
|
|
126
|
-
))
|
|
127
|
-
.pipe(Effect.flatMap((msgs) => sender.sendMessages(msgs)))
|
|
128
|
-
),
|
|
129
|
-
Effect.withSpan("queue.publish: " + sender.name, {
|
|
130
|
-
kind: "producer",
|
|
131
|
-
attributes: { "message_tags": messages.map((_) => _._tag) }
|
|
132
|
-
}, { captureStackTrace: false })
|
|
133
|
-
)
|
|
134
|
-
}
|
|
135
|
-
return queue as QueueBase<Evt, DrainEvt>
|
|
136
|
-
})
|
|
137
|
-
}
|
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
import type { Effect, NonEmptyReadonlyArray, Scope } from "effect-app"
|
|
2
|
-
import { RequestContext } from "../RequestContext.js"
|
|
3
|
-
|
|
4
|
-
export interface QueueBase<Evt, DrainEvt> {
|
|
5
|
-
drain: <DrainE, DrainR>(
|
|
6
|
-
makeHandleEvent: (ks: DrainEvt) => Effect.Effect<void, DrainE, DrainR>,
|
|
7
|
-
sessionId?: string
|
|
8
|
-
) => Effect.Effect<never, never, Scope.Scope | DrainR>
|
|
9
|
-
publish: (
|
|
10
|
-
...messages: NonEmptyReadonlyArray<Evt>
|
|
11
|
-
) => Effect.Effect<void>
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
export interface QueueMakerOps {}
|
|
15
|
-
export const QueueMaker: QueueMakerOps = {}
|
|
16
|
-
|
|
17
|
-
export const QueueMeta = RequestContext
|
package/src/RequestContext.ts
DELETED
|
@@ -1,63 +0,0 @@
|
|
|
1
|
-
import { S, ServiceMap } from "effect-app"
|
|
2
|
-
import { UserProfileId } from "effect-app/ids"
|
|
3
|
-
import { NonEmptyString255 } from "effect-app/Schema"
|
|
4
|
-
|
|
5
|
-
export const Locale = S.Literal("en", "de")
|
|
6
|
-
export type Locale = typeof Locale.Type
|
|
7
|
-
|
|
8
|
-
export class LocaleRef extends ServiceMap.Reference("Locale", { defaultValue: (): Locale => "en" }) {}
|
|
9
|
-
|
|
10
|
-
export class RequestContext extends S.ExtendedClass<
|
|
11
|
-
RequestContext,
|
|
12
|
-
RequestContext.Encoded
|
|
13
|
-
>("RequestContext")({
|
|
14
|
-
span: S.Struct({
|
|
15
|
-
traceId: S.String,
|
|
16
|
-
spanId: S.String,
|
|
17
|
-
sampled: S.Boolean
|
|
18
|
-
}),
|
|
19
|
-
name: NonEmptyString255,
|
|
20
|
-
locale: Locale,
|
|
21
|
-
sourceId: S.optional(NonEmptyString255), // TODO?
|
|
22
|
-
namespace: NonEmptyString255,
|
|
23
|
-
/** @deprecated */
|
|
24
|
-
userProfile: S.optional(S.Struct({ sub: UserProfileId })) //
|
|
25
|
-
}) {
|
|
26
|
-
// static Tag = ServiceMap.Tag<RequestContext>()
|
|
27
|
-
|
|
28
|
-
static toMonitoring(this: void, self: RequestContext) {
|
|
29
|
-
return {
|
|
30
|
-
operationName: self.name,
|
|
31
|
-
locale: self.locale
|
|
32
|
-
}
|
|
33
|
-
}
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
export const spanAttributes = (ctx: Pick<RequestContext, "locale" | "namespace"> & Partial<RequestContext>) => ({
|
|
37
|
-
"request.name": ctx.name,
|
|
38
|
-
"request.locale": ctx.locale,
|
|
39
|
-
"request.namespace": ctx.namespace,
|
|
40
|
-
...ctx.sourceId ? { "request.source.id": ctx.sourceId } : {},
|
|
41
|
-
...(ctx.userProfile?.sub
|
|
42
|
-
? {
|
|
43
|
-
"request.user.sub": ctx
|
|
44
|
-
.userProfile
|
|
45
|
-
.sub,
|
|
46
|
-
"request.user.roles": "roles" in ctx
|
|
47
|
-
.userProfile
|
|
48
|
-
? ctx.userProfile.roles
|
|
49
|
-
: undefined
|
|
50
|
-
}
|
|
51
|
-
: {})
|
|
52
|
-
})
|
|
53
|
-
|
|
54
|
-
// codegen:start {preset: model}
|
|
55
|
-
//
|
|
56
|
-
/* eslint-disable */
|
|
57
|
-
export namespace RequestContext {
|
|
58
|
-
export interface Encoded extends S.Struct.Encoded<typeof RequestContext["fields"]> {}
|
|
59
|
-
}
|
|
60
|
-
/* eslint-enable */
|
|
61
|
-
//
|
|
62
|
-
// codegen:end
|
|
63
|
-
//
|
package/src/RequestFiberSet.ts
DELETED
|
@@ -1,105 +0,0 @@
|
|
|
1
|
-
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
2
|
-
import { Effect, Fiber, FiberSet, Layer, Option, ServiceMap, type Tracer } from "effect-app"
|
|
3
|
-
import { reportRequestError, reportUnknownRequestError } from "./api/reportError.js"
|
|
4
|
-
import { InfraLogger } from "./logger.js"
|
|
5
|
-
|
|
6
|
-
const getRootParentSpan = Effect.gen(function*() {
|
|
7
|
-
let span: Tracer.AnySpan | null = yield* Effect.currentSpan.pipe(
|
|
8
|
-
Effect.catchTag("NoSuchElementError", () => Effect.succeed(null))
|
|
9
|
-
)
|
|
10
|
-
if (!span) return span
|
|
11
|
-
while (span._tag === "Span" && Option.isSome(span.parent)) {
|
|
12
|
-
span = span.parent.value
|
|
13
|
-
}
|
|
14
|
-
return span
|
|
15
|
-
})
|
|
16
|
-
|
|
17
|
-
export const setRootParentSpan = <A, E, R>(self: Effect.Effect<A, E, R>) =>
|
|
18
|
-
getRootParentSpan.pipe(Effect.andThen((span) => span ? Effect.withParentSpan(self, span) : self))
|
|
19
|
-
|
|
20
|
-
const make = Effect.gen(function*() {
|
|
21
|
-
const set = yield* FiberSet.make<any, any>()
|
|
22
|
-
const add = (...fibers: Fiber.Fiber<any, any>[]) =>
|
|
23
|
-
Effect.sync(() => fibers.forEach((_) => FiberSet.addUnsafe(set, _)))
|
|
24
|
-
const addAll = (fibers: readonly Fiber.Fiber<any, any>[]) =>
|
|
25
|
-
Effect.sync(() => fibers.forEach((_) => FiberSet.addUnsafe(set, _)))
|
|
26
|
-
const join = FiberSet.size(set).pipe(
|
|
27
|
-
Effect.andThen((count) => InfraLogger.logInfo(`Joining ${count} current fibers on the RequestFiberSet`)),
|
|
28
|
-
Effect.andThen(FiberSet.join(set))
|
|
29
|
-
)
|
|
30
|
-
const run = FiberSet.run(set)
|
|
31
|
-
const register = <A, E, R>(self: Effect.Effect<A, E, R>) =>
|
|
32
|
-
self.pipe(Effect.forkChild, Effect.tap(add), Effect.andThen(Fiber.join))
|
|
33
|
-
|
|
34
|
-
// const waitUntilEmpty = Effect.gen(function*() {
|
|
35
|
-
// const currentSize = yield* FiberSet.size(set)
|
|
36
|
-
// if (currentSize === 0) {
|
|
37
|
-
// return
|
|
38
|
-
// }
|
|
39
|
-
// yield* Effect.logInfo("Waiting RequestFiberSet to be empty: " + currentSize)
|
|
40
|
-
// while ((yield* FiberSet.size(set)) > 0) yield* Effect.sleep("250 millis")
|
|
41
|
-
// yield* Effect.logDebug("RequestFiberSet is empty")
|
|
42
|
-
// })
|
|
43
|
-
// TODO: loop and interrupt all fibers in the set continuously?
|
|
44
|
-
const interrupt = Fiber.interruptAll(set)
|
|
45
|
-
|
|
46
|
-
/**
|
|
47
|
-
* Forks the effect into a new fiber attached to the RequestFiberSet scope. Because the
|
|
48
|
-
* new fiber isn't attached to the parent, when the fiber executing the
|
|
49
|
-
* returned effect terminates, the forked fiber will continue running.
|
|
50
|
-
* The fiber will be interrupted when the RequestFiberSet scope is closed.
|
|
51
|
-
*
|
|
52
|
-
* Reports errors.
|
|
53
|
-
*/
|
|
54
|
-
function forkDaemonReport<R, E, A>(self: Effect.Effect<A, E, R>) {
|
|
55
|
-
return self.pipe(
|
|
56
|
-
reportRequestError,
|
|
57
|
-
Effect.uninterruptible,
|
|
58
|
-
run
|
|
59
|
-
)
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
/**
|
|
63
|
-
* Forks the effect into a new fiber attached to the RequestFiberSet scope. Because the
|
|
64
|
-
* new fiber isn't attached to the parent, when the fiber executing the
|
|
65
|
-
* returned effect terminates, the forked fiber will continue running.
|
|
66
|
-
* The fiber will be interrupted when the RequestFiberSet scope is closed.
|
|
67
|
-
*
|
|
68
|
-
* Reports unexpected errors.
|
|
69
|
-
*/
|
|
70
|
-
function forkDaemonReportUnexpected<R, E, A>(self: Effect.Effect<A, E, R>) {
|
|
71
|
-
return self
|
|
72
|
-
.pipe(
|
|
73
|
-
reportUnknownRequestError,
|
|
74
|
-
Effect.uninterruptible,
|
|
75
|
-
run
|
|
76
|
-
)
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
return {
|
|
80
|
-
interrupt,
|
|
81
|
-
join,
|
|
82
|
-
run,
|
|
83
|
-
add,
|
|
84
|
-
addAll,
|
|
85
|
-
register,
|
|
86
|
-
forkDaemonReport,
|
|
87
|
-
forkDaemonReportUnexpected
|
|
88
|
-
}
|
|
89
|
-
})
|
|
90
|
-
|
|
91
|
-
/**
|
|
92
|
-
* Whenever you fork a fiber for a Request, and you want to prevent dependent services to close prematurely on interruption,
|
|
93
|
-
* like the ServiceBus Sender, you should register these fibers in this FiberSet.
|
|
94
|
-
*/
|
|
95
|
-
export class RequestFiberSet extends ServiceMap.Service<RequestFiberSet>()("RequestFiberSet", { make }) {
|
|
96
|
-
static readonly Live = Layer.effect(this, this.make)
|
|
97
|
-
static readonly register = <A, E, R>(self: Effect.Effect<A, E, R>) =>
|
|
98
|
-
this.asEffect().pipe(Effect.andThen((_) => _.register(self)))
|
|
99
|
-
static readonly run = <A, E, R>(self: Effect.Effect<A, E, R>) =>
|
|
100
|
-
this.asEffect().pipe(Effect.andThen((_) => _.run(self)))
|
|
101
|
-
static readonly forkDaemonReport = <R, E, A>(self: Effect.Effect<A, E, R>) =>
|
|
102
|
-
this.asEffect().pipe(Effect.andThen((_) => _.forkDaemonReport(self)))
|
|
103
|
-
static readonly forkDaemonReportUnexpected = <R, E, A>(self: Effect.Effect<A, E, R>) =>
|
|
104
|
-
this.asEffect().pipe(Effect.andThen((_) => _.forkDaemonReportUnexpected(self)))
|
|
105
|
-
}
|
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
import { Data, Effect, Layer, ServiceMap } from "effect-app"
|
|
2
|
-
import { ContextMap } from "./service.js"
|
|
3
|
-
|
|
4
|
-
// TODO: we have to create a new contextmap on every request.
|
|
5
|
-
// we want to share one map during startup
|
|
6
|
-
// but we want to make sure we don't re-use the startup map after startup
|
|
7
|
-
// we can call another start after startup. but it would be even better if we could Die on accessing rootmap
|
|
8
|
-
// we could also make the ContextMap optional, and when missing, issue a warning instead?
|
|
9
|
-
|
|
10
|
-
export class ContextMapContainer extends ServiceMap.Reference("ContextMapContainer", {
|
|
11
|
-
defaultValue: (): ContextMap | "root" => "root"
|
|
12
|
-
}) {
|
|
13
|
-
static readonly layer = Layer.effect(this, ContextMap.make.pipe(Effect.map(ContextMap.of)))
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
export class ContextMapNotStartedError extends Data.TaggedError("ContextMapNotStartedError") {}
|
|
17
|
-
|
|
18
|
-
export const getContextMap = ContextMapContainer.asEffect().pipe(
|
|
19
|
-
Effect.filterOrFail((_) => _ !== "root", () => new ContextMapNotStartedError())
|
|
20
|
-
)
|
|
@@ -1,112 +0,0 @@
|
|
|
1
|
-
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
2
|
-
import * as Test from "@effect-ts/jest/Test"
|
|
3
|
-
import { describe, expect } from "@jest/globals"
|
|
4
|
-
|
|
5
|
-
import { OptimisticConcurrencyException } from "../../errors.js"
|
|
6
|
-
|
|
7
|
-
import { makeMemoryStore } from "./Memory.js"
|
|
8
|
-
|
|
9
|
-
const { it } = Test.runtime()
|
|
10
|
-
|
|
11
|
-
describe("Optimistic Concurrency", () => {
|
|
12
|
-
describe("set", () => {
|
|
13
|
-
it("works", () =>
|
|
14
|
-
Effect.gen(function*($) {
|
|
15
|
-
const existing = new Map<
|
|
16
|
-
string,
|
|
17
|
-
{ _etag?: string | undefined; id: string; a: string }
|
|
18
|
-
>()
|
|
19
|
-
const { make } = makeMemoryStore()
|
|
20
|
-
const store = yield* $(make("test", Effect.sync(() => existing)))
|
|
21
|
-
|
|
22
|
-
const result1 = yield* $(store.set({ id: "1", a: "string", _etag: undefined }))
|
|
23
|
-
const result2_1 = yield* $(
|
|
24
|
-
store.set({ id: "2", a: "string", _etag: undefined })
|
|
25
|
-
)
|
|
26
|
-
const result2 = yield* $(store.set({ ...result1, a: "another-string" }))
|
|
27
|
-
const result3 = yield* $(store.set({ ...result2, a: "another-string2" }))
|
|
28
|
-
const failResult = yield* $(
|
|
29
|
-
store.set({ ...result1, a: "another-string3" }).result
|
|
30
|
-
)
|
|
31
|
-
expect(result1._etag).toBeTruthy()
|
|
32
|
-
expect(result2_1._etag).toBeTruthy()
|
|
33
|
-
expect(result2._etag).toBeTruthy()
|
|
34
|
-
expect(result3._etag).toBeTruthy()
|
|
35
|
-
|
|
36
|
-
expect(result2._etag).not.toEqual(result1._etag)
|
|
37
|
-
expect(result3._etag).not.toEqual(result2._etag)
|
|
38
|
-
|
|
39
|
-
expect(Exit.untraced(failResult)).toEqual(
|
|
40
|
-
Exit.fail(new OptimisticConcurrencyException("test", "1"))
|
|
41
|
-
)
|
|
42
|
-
console.log({ result1, result2 })
|
|
43
|
-
}))
|
|
44
|
-
})
|
|
45
|
-
|
|
46
|
-
describe("bulkSet", () => {
|
|
47
|
-
it("works", () =>
|
|
48
|
-
Effect.gen(function*($) {
|
|
49
|
-
const existing = new Map<
|
|
50
|
-
string,
|
|
51
|
-
{ _etag?: string | undefined; id: string; a: string }
|
|
52
|
-
>()
|
|
53
|
-
const { make } = makeMemoryStore()
|
|
54
|
-
const store = yield* $(make("test", Effect.sync(() => existing)))
|
|
55
|
-
|
|
56
|
-
const [result1] = yield* $(
|
|
57
|
-
store.bulkSet([{ id: "1", a: "string", _etag: undefined }])
|
|
58
|
-
)
|
|
59
|
-
const [result2_1] = yield* $(
|
|
60
|
-
store.bulkSet([{ id: "2", a: "string", _etag: undefined }])
|
|
61
|
-
)
|
|
62
|
-
const [result2] = yield* $(store.bulkSet([{ ...result1, a: "another-string" }]))
|
|
63
|
-
const [result3] = yield* $(
|
|
64
|
-
store.bulkSet([{ ...result2, a: "another-string2" }])
|
|
65
|
-
)
|
|
66
|
-
const failResult = yield* $(
|
|
67
|
-
store.bulkSet([{ ...result1, a: "another-string3" }]).result
|
|
68
|
-
)
|
|
69
|
-
expect(result1._etag).toBeTruthy()
|
|
70
|
-
expect(result2_1._etag).toBeTruthy()
|
|
71
|
-
expect(result2._etag).toBeTruthy()
|
|
72
|
-
expect(result3._etag).toBeTruthy()
|
|
73
|
-
|
|
74
|
-
expect(result2._etag).not.toEqual(result1._etag)
|
|
75
|
-
expect(result3._etag).not.toEqual(result2._etag)
|
|
76
|
-
|
|
77
|
-
expect(Exit.untraced(failResult)).toEqual(
|
|
78
|
-
Exit.fail(new OptimisticConcurrencyException("test", "1"))
|
|
79
|
-
)
|
|
80
|
-
console.log({ result1, result2 })
|
|
81
|
-
}))
|
|
82
|
-
})
|
|
83
|
-
|
|
84
|
-
describe("batchSet", () => {
|
|
85
|
-
it("works", () =>
|
|
86
|
-
Effect.gen(function*($) {
|
|
87
|
-
const existing = new Map<
|
|
88
|
-
string,
|
|
89
|
-
{ _etag?: string | undefined; id: string; a: string }
|
|
90
|
-
>()
|
|
91
|
-
const { make } = makeMemoryStore()
|
|
92
|
-
const store = yield* $(make("test", Effect.sync(() => existing)))
|
|
93
|
-
|
|
94
|
-
const item1 = { id: "1", a: "string", _etag: undefined }
|
|
95
|
-
const item2 = { id: "2", a: "string", _etag: undefined }
|
|
96
|
-
|
|
97
|
-
yield* $(store.batchSet([item1, item2]))
|
|
98
|
-
|
|
99
|
-
const [result1, result2] = yield* $(
|
|
100
|
-
Effect.collectAll([store.find("1"), store.find("2")])
|
|
101
|
-
)
|
|
102
|
-
const failResult = yield* $(
|
|
103
|
-
store.batchSet([{ id: "1", a: "another-string3", _etag: "abc" }]).result
|
|
104
|
-
)
|
|
105
|
-
expect(result1).toEqual(Option.some({ ...item1, _etag: expect.any(String) }))
|
|
106
|
-
expect(result2).toEqual(Option.some({ ...item2, _etag: expect.any(String) }))
|
|
107
|
-
expect(Exit.untraced(failResult)).toEqual(
|
|
108
|
-
Exit.fail(new OptimisticConcurrencyException("test", "1"))
|
|
109
|
-
)
|
|
110
|
-
}))
|
|
111
|
-
})
|
|
112
|
-
})
|