@effect-app/infra 4.0.0-beta.98 → 4.0.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/CHANGELOG.md +2891 -0
- package/_check.sh +1 -1
- package/dist/CUPS.d.ts +28 -9
- package/dist/CUPS.d.ts.map +1 -1
- package/dist/CUPS.js +35 -14
- package/dist/ClusterCosmos.d.ts +67 -0
- package/dist/ClusterCosmos.d.ts.map +1 -0
- package/dist/ClusterCosmos.js +588 -0
- package/dist/ClusterServiceBus.d.ts +67 -0
- package/dist/ClusterServiceBus.d.ts.map +1 -0
- package/dist/ClusterServiceBus.js +84 -0
- package/dist/{api/ContextProvider.d.ts → ContextProvider.d.ts} +7 -4
- 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 +11 -7
- package/dist/MainFiberSet.d.ts.map +1 -1
- package/dist/MainFiberSet.js +22 -6
- package/dist/QueueMaker/errors.d.ts +3 -1
- package/dist/QueueMaker/errors.d.ts.map +1 -1
- package/dist/QueueMaker/errors.js +4 -2
- package/dist/{adapters/SQL → SQL}/Model.d.ts +34 -45
- 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 +16 -4
- package/dist/Store/Cosmos/query.d.ts.map +1 -1
- package/dist/Store/Cosmos/query.js +238 -42
- package/dist/Store/Cosmos.d.ts +2 -2
- package/dist/Store/Cosmos.d.ts.map +1 -1
- package/dist/Store/Cosmos.js +394 -319
- package/dist/Store/Disk.d.ts +4 -4
- package/dist/Store/Disk.d.ts.map +1 -1
- package/dist/Store/Disk.js +91 -39
- package/dist/Store/Memory.d.ts +7 -10
- package/dist/Store/Memory.d.ts.map +1 -1
- package/dist/Store/Memory.js +348 -78
- package/dist/Store/SQL/Pg.d.ts +2 -2
- package/dist/Store/SQL/Pg.d.ts.map +1 -1
- package/dist/Store/SQL/Pg.js +229 -154
- package/dist/Store/SQL/query.d.ts +19 -3
- package/dist/Store/SQL/query.d.ts.map +1 -1
- package/dist/Store/SQL/query.js +306 -12
- package/dist/Store/SQL.d.ts +22 -5
- package/dist/Store/SQL.d.ts.map +1 -1
- package/dist/Store/SQL.js +369 -98
- package/dist/Store/codeFilter.d.ts +4 -4
- package/dist/Store/codeFilter.d.ts.map +1 -1
- package/dist/Store/codeFilter.js +71 -22
- package/dist/Store/index.d.ts +6 -4
- package/dist/Store/index.d.ts.map +1 -1
- package/dist/Store/index.js +9 -6
- package/dist/Store/jsonDocument.d.ts +67 -0
- package/dist/Store/jsonDocument.d.ts.map +1 -0
- package/dist/Store/jsonDocument.js +107 -0
- package/dist/Store/utils.d.ts +21 -2
- package/dist/Store/utils.d.ts.map +1 -1
- package/dist/Store/utils.js +253 -10
- package/dist/WorkflowEngineCosmos.d.ts +30 -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 +6 -3
- package/dist/arbs.d.ts.map +1 -1
- package/dist/arbs.js +20 -4
- package/dist/codec.d.ts.map +1 -0
- package/dist/codec.js +5 -0
- package/dist/cosmos-client.d.ts +40 -0
- package/dist/cosmos-client.d.ts.map +1 -0
- package/dist/cosmos-client.js +41 -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/{api/internal → internal}/health.d.ts +1 -1
- 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} +10 -2
- 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 +6 -6
- 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} +2 -1
- 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} +4 -1
- 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 +2 -1
- package/dist/routing/middleware/RouterMiddleware.d.ts.map +1 -0
- package/dist/{api/routing → routing}/middleware/RouterMiddleware.js +1 -1
- package/dist/{api/routing → routing}/middleware/middleware.d.ts +11 -6
- 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 +12 -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 +5 -5
- 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 +23 -19
- package/package.json +36 -364
- package/src/CUPS.ts +53 -14
- package/src/ClusterCosmos.ts +1170 -0
- package/src/ClusterServiceBus.ts +244 -0
- package/src/{api/ContextProvider.ts → ContextProvider.ts} +10 -7
- package/src/Emailer/Sendgrid.ts +83 -60
- package/src/Emailer/fake.ts +4 -4
- package/src/MainFiberSet.ts +31 -12
- package/src/QueueMaker/errors.ts +3 -1
- package/src/{adapters/SQL → SQL}/Model.ts +48 -47
- package/src/SQL.ts +1 -0
- package/src/Store/Cosmos/query.ts +275 -55
- package/src/Store/Cosmos.ts +597 -515
- package/src/Store/Disk.ts +145 -71
- package/src/Store/Memory.ts +420 -115
- package/src/Store/SQL/Pg.ts +352 -268
- package/src/Store/SQL/query.ts +366 -20
- package/src/Store/SQL.ts +742 -293
- package/src/Store/codeFilter.ts +78 -28
- package/src/Store/index.ts +18 -13
- package/src/Store/jsonDocument.ts +143 -0
- package/src/Store/utils.ts +307 -30
- package/src/WorkflowEngineCosmos.ts +749 -0
- package/src/WorkflowEngineSqlite.ts +813 -0
- package/src/arbs.ts +25 -5
- package/src/cosmos-client.ts +72 -0
- 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 +18 -9
- package/src/{api/layerUtils.ts → layerUtils.ts} +7 -3
- package/src/logger/jsonLogger.ts +5 -3
- package/src/logger/logFmtLogger.ts +3 -3
- package/src/logger/shared.ts +6 -5
- package/src/middlewares.ts +10 -0
- package/src/{adapters/mongo-client.ts → mongo-client.ts} +3 -1
- package/src/otel.ts +177 -0
- package/src/rateLimit.ts +35 -24
- package/src/{adapters/redis-client.ts → redis-client.ts} +6 -2
- package/src/{api/reportError.ts → reportError.ts} +3 -2
- package/src/{api/routing → routing}/middleware/RouterMiddleware.ts +2 -1
- package/src/{api/routing → routing}/middleware/middleware.ts +75 -50
- package/src/routing/middleware.ts +4 -0
- package/src/{api/routing → routing}/schema/jwt.ts +2 -2
- package/src/{api/routing → routing}/utils.ts +2 -1
- package/src/routing.ts +823 -0
- package/src/test.ts +6 -6
- package/src/vitest.ts +1 -1
- package/test/arbs-magnitude.test.ts +33 -0
- package/test/arbs.test.ts +41 -0
- package/test/auth.test.ts +101 -0
- package/test/cluster-cosmos.test.ts +634 -0
- package/test/cluster-servicebus.test.ts +180 -0
- package/test/cluster-sqlite.test.ts +207 -0
- package/test/contextProvider.test.ts +11 -8
- package/test/controller.test.ts +23 -28
- package/test/cosmos-container-throughput.test.ts +80 -0
- package/test/cosmos-query.test.ts +368 -0
- package/test/dist/arbs-magnitude.test.d.ts.map +1 -0
- package/test/dist/arbs.test.d.ts.map +1 -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-container-throughput.test.d.ts.map +1 -0
- package/test/dist/cosmos-query.test.d.ts.map +1 -0
- package/test/dist/fixtures.d.ts +17 -9
- package/test/dist/fixtures.d.ts.map +1 -1
- package/test/dist/fixtures.js +8 -3
- package/test/dist/json-lower.test.d.ts.map +1 -0
- 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/repository-legacy-document.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/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 +7 -2
- package/test/json-lower.test.ts +129 -0
- package/test/layerUtils.test.ts +2 -2
- package/test/query.test.ts +1232 -42
- package/test/rawQuery.test.ts +432 -7
- package/test/repository-ext.test.ts +456 -0
- package/test/repository-legacy-document.test.ts +394 -0
- package/test/requires.test.ts +7 -3
- package/test/router-generator.test.ts +187 -0
- package/test/routing-interruptibility.test.ts +66 -0
- package/test/rpc-context-map-streaming.test.ts +265 -0
- package/test/rpc-e2e-invalidation.test.ts +421 -0
- package/test/rpc-multi-middleware.test.ts +17 -11
- package/test/rpc-stream-fullstack.test.ts +307 -0
- package/test/sql-store.test.ts +1202 -47
- package/test/validateSample.test.ts +70 -42
- 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 -1
- 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 -320
- 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 -43
- 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 -14
- package/dist/QueueMaker/SQLQueue.d.ts.map +0 -1
- package/dist/QueueMaker/SQLQueue.js +0 -132
- 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 -68
- 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 -25
- package/dist/Store/ContextMapContainer.d.ts.map +0 -1
- package/dist/Store/ContextMapContainer.js +0 -77
- package/dist/Store/service.d.ts +0 -111
- package/dist/Store/service.d.ts.map +0 -1
- package/dist/Store/service.js +0 -79
- 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 +0 -14
- 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.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.map +0 -1
- package/dist/api/routing/middleware/middleware.js +0 -130
- 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 -134
- package/dist/api/routing.d.ts.map +0 -1
- package/dist/api/routing.js +0 -167
- package/dist/api/setupRequest.d.ts +0 -15
- package/dist/api/setupRequest.d.ts.map +0 -1
- package/dist/api/setupRequest.js +0 -49
- 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 -580
- 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 -190
- 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 -116
- package/src/Store/index.test.ts.bak +0 -112
- package/src/Store/service.ts +0 -193
- package/src/Store.ts +0 -1
- package/src/adapters/SQL.ts +0 -1
- package/src/adapters/ServiceBus.ts +0 -209
- package/src/adapters/cosmos-client.ts +0 -16
- 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.ts +0 -6
- package/src/api/routing.ts +0 -598
- package/src/api/setupRequest.ts +0 -104
- package/test/dist/date-query.test.d.ts.map +0 -1
- 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/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(S.toCodecJson(wireSchema))
|
|
29
|
-
const encodePublish = S.encodeEffect(wireSchemaJson)
|
|
30
|
-
const drainW = S.Struct({ body: drainSchema, meta: QueueMeta })
|
|
31
|
-
const drainWJson = S.fromJsonString(S.toCodecJson(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(S.toCodecJson(wireSchema))
|
|
25
|
-
const encodePublish = S.encodeEffect(wireSchemaJson)
|
|
26
|
-
const drainW = S.Struct({ body: drainSchema, meta: QueueMeta })
|
|
27
|
-
const drainWJson = S.fromJsonString(S.toCodecJson(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 { Context, S } from "effect-app"
|
|
2
|
-
import { UserProfileId } from "effect-app/ids"
|
|
3
|
-
import { NonEmptyString255 } from "effect-app/Schema"
|
|
4
|
-
|
|
5
|
-
export const Locale = S.Literals(["en", "de"])
|
|
6
|
-
export type Locale = typeof Locale.Type
|
|
7
|
-
|
|
8
|
-
export class LocaleRef extends Context.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 = Context.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 { Context, Effect, Fiber, FiberSet, Layer, Option, 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 Context.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,116 +0,0 @@
|
|
|
1
|
-
import { Context, Data, Effect, type Exit, Layer, RequestResolver } from "effect-app"
|
|
2
|
-
import type { NonEmptyArray } from "effect/Array"
|
|
3
|
-
import { dual } from "effect/Function"
|
|
4
|
-
import * as MutableHashMap from "effect/MutableHashMap"
|
|
5
|
-
import type * as Request from "effect/Request"
|
|
6
|
-
import { ContextMap } from "./service.js"
|
|
7
|
-
|
|
8
|
-
// TODO: we have to create a new contextmap on every request.
|
|
9
|
-
// we want to share one map during startup
|
|
10
|
-
// but we want to make sure we don't re-use the startup map after startup
|
|
11
|
-
// we can call another start after startup. but it would be even better if we could Die on accessing rootmap
|
|
12
|
-
// we could also make the ContextMap optional, and when missing, issue a warning instead?
|
|
13
|
-
|
|
14
|
-
export class ContextMapContainer extends Context.Reference("ContextMapContainer", {
|
|
15
|
-
defaultValue: (): ContextMap | "root" => "root"
|
|
16
|
-
}) {
|
|
17
|
-
static readonly layer = Layer.effect(this, ContextMap.make.pipe(Effect.map(ContextMap.of)))
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
export class ContextMapNotStartedError extends Data.TaggedError("ContextMapNotStartedError") {}
|
|
21
|
-
|
|
22
|
-
export const getContextMap = ContextMapContainer.asEffect().pipe(
|
|
23
|
-
Effect.filterOrFail((_) => _ !== "root", () => new ContextMapNotStartedError())
|
|
24
|
-
)
|
|
25
|
-
|
|
26
|
-
export const withRequestResolverCache: {
|
|
27
|
-
<A extends Request.Request<any, any>>(options: {
|
|
28
|
-
readonly capacity: number
|
|
29
|
-
readonly strategy?: "lru" | "fifo" | undefined
|
|
30
|
-
}): (self: RequestResolver.RequestResolver<A>) => RequestResolver.RequestResolver<A>
|
|
31
|
-
<A extends Request.Request<any, any>>(
|
|
32
|
-
self: RequestResolver.RequestResolver<A>,
|
|
33
|
-
options: {
|
|
34
|
-
readonly capacity: number
|
|
35
|
-
readonly strategy?: "lru" | "fifo" | undefined
|
|
36
|
-
}
|
|
37
|
-
): RequestResolver.RequestResolver<A>
|
|
38
|
-
} = dual(2, <A extends Request.Request<any, any>>(
|
|
39
|
-
self: RequestResolver.RequestResolver<A>,
|
|
40
|
-
options: {
|
|
41
|
-
readonly capacity: number
|
|
42
|
-
readonly strategy?: "lru" | "fifo" | undefined
|
|
43
|
-
}
|
|
44
|
-
): RequestResolver.RequestResolver<A> => {
|
|
45
|
-
const cacheKey = Symbol()
|
|
46
|
-
const strategy = options.strategy ?? "lru"
|
|
47
|
-
type CacheEntry = {
|
|
48
|
-
readonly entry: Request.Entry<A>
|
|
49
|
-
exit: Exit.Exit<Request.Success<A>, Request.Error<A>> | undefined
|
|
50
|
-
}
|
|
51
|
-
// eslint-disable-next-line @typescript-eslint/no-unsafe-argument
|
|
52
|
-
return RequestResolver.makeWith({
|
|
53
|
-
...(self as any),
|
|
54
|
-
runAll(
|
|
55
|
-
entries: NonEmptyArray<Request.Entry<A>>,
|
|
56
|
-
key: unknown
|
|
57
|
-
) {
|
|
58
|
-
return Effect.flatMap(
|
|
59
|
-
getContextMap.pipe(Effect.orDie),
|
|
60
|
-
(contextMap) => {
|
|
61
|
-
const cache = contextMap.getOrCreateStore<MutableHashMap.MutableHashMap<A, CacheEntry>>(
|
|
62
|
-
cacheKey,
|
|
63
|
-
() => MutableHashMap.empty()
|
|
64
|
-
)
|
|
65
|
-
|
|
66
|
-
const uncached: Array<Request.Entry<A>> = []
|
|
67
|
-
for (const entry of entries) {
|
|
68
|
-
const ocached = MutableHashMap.get(cache, entry.request)
|
|
69
|
-
if (ocached._tag === "None") {
|
|
70
|
-
const cached: CacheEntry = { entry, exit: undefined }
|
|
71
|
-
MutableHashMap.set(cache, entry.request, cached)
|
|
72
|
-
const prevComplete = entry.completeUnsafe.bind(entry)
|
|
73
|
-
entry.completeUnsafe = (exit) => {
|
|
74
|
-
cached.exit = exit
|
|
75
|
-
prevComplete(exit)
|
|
76
|
-
}
|
|
77
|
-
uncached.push(entry)
|
|
78
|
-
} else {
|
|
79
|
-
const cached = ocached.value
|
|
80
|
-
if (cached.exit) {
|
|
81
|
-
if (strategy === "lru") {
|
|
82
|
-
MutableHashMap.remove(cache, cached.entry.request)
|
|
83
|
-
MutableHashMap.set(cache, cached.entry.request, cached)
|
|
84
|
-
}
|
|
85
|
-
entry.completeUnsafe(cached.exit as any)
|
|
86
|
-
} else {
|
|
87
|
-
cached.entry.uninterruptible = true
|
|
88
|
-
const prevComplete = cached.entry.completeUnsafe.bind(cached.entry)
|
|
89
|
-
cached.entry.completeUnsafe = (exit) => {
|
|
90
|
-
prevComplete(exit)
|
|
91
|
-
entry.completeUnsafe(exit)
|
|
92
|
-
}
|
|
93
|
-
}
|
|
94
|
-
}
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
if (uncached.length === 0) return Effect.void
|
|
98
|
-
|
|
99
|
-
return Effect.onExit(
|
|
100
|
-
(self as any).runAll(uncached, key),
|
|
101
|
-
() => {
|
|
102
|
-
let toRemove = MutableHashMap.size(cache) - options.capacity
|
|
103
|
-
if (toRemove <= 0) return Effect.void
|
|
104
|
-
for (const k of MutableHashMap.keys(cache)) {
|
|
105
|
-
MutableHashMap.remove(cache, k)
|
|
106
|
-
toRemove--
|
|
107
|
-
if (toRemove <= 0) break
|
|
108
|
-
}
|
|
109
|
-
return Effect.void
|
|
110
|
-
}
|
|
111
|
-
)
|
|
112
|
-
}
|
|
113
|
-
)
|
|
114
|
-
}
|
|
115
|
-
})
|
|
116
|
-
})
|
|
@@ -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
|
-
})
|