@effect-app/infra 4.0.0-beta.26 → 4.0.0-beta.261
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 +1973 -0
- package/_check.sh +1 -1
- package/dist/CUPS.d.ts +30 -11
- 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 +501 -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 +111 -147
- package/dist/Emailer/Sendgrid.d.ts.map +1 -1
- package/dist/Emailer/Sendgrid.js +24 -19
- package/dist/Emailer/fake.d.ts +2 -2
- package/dist/Emailer/fake.d.ts.map +1 -1
- package/dist/Emailer/fake.js +4 -4
- package/dist/MainFiberSet.d.ts +12 -9
- package/dist/MainFiberSet.d.ts.map +1 -1
- package/dist/MainFiberSet.js +10 -6
- package/dist/QueueMaker/SQLQueue.d.ts +8 -9
- package/dist/QueueMaker/SQLQueue.d.ts.map +1 -1
- package/dist/QueueMaker/SQLQueue.js +138 -120
- package/dist/QueueMaker/errors.d.ts +5 -3
- package/dist/QueueMaker/errors.d.ts.map +1 -1
- package/dist/QueueMaker/errors.js +4 -2
- package/dist/QueueMaker/memQueue.d.ts +10 -6
- package/dist/QueueMaker/memQueue.d.ts.map +1 -1
- package/dist/QueueMaker/memQueue.js +84 -68
- package/dist/QueueMaker/sbqueue.d.ts +9 -5
- package/dist/QueueMaker/sbqueue.d.ts.map +1 -1
- package/dist/QueueMaker/sbqueue.js +60 -58
- package/dist/RequestFiberSet.d.ts +10 -7
- package/dist/RequestFiberSet.d.ts.map +1 -1
- package/dist/RequestFiberSet.js +13 -8
- package/dist/SQL/Model.d.ts +468 -0
- package/dist/SQL/Model.d.ts.map +1 -0
- package/dist/SQL/Model.js +469 -0
- package/dist/SQL.d.ts +2 -0
- package/dist/SQL.d.ts.map +1 -0
- package/dist/{adapters/SQL.js → SQL.js} +1 -1
- package/dist/ServiceBus.d.ts +61 -0
- package/dist/ServiceBus.d.ts.map +1 -0
- package/dist/ServiceBus.js +108 -0
- package/dist/Store/Cosmos/query.d.ts +15 -4
- package/dist/Store/Cosmos/query.d.ts.map +1 -1
- package/dist/Store/Cosmos/query.js +179 -41
- package/dist/Store/Cosmos.d.ts +3 -3
- package/dist/Store/Cosmos.d.ts.map +1 -1
- package/dist/Store/Cosmos.js +344 -246
- package/dist/Store/Disk.d.ts +5 -5
- package/dist/Store/Disk.d.ts.map +1 -1
- package/dist/Store/Disk.js +78 -38
- package/dist/Store/Memory.d.ts +7 -10
- package/dist/Store/Memory.d.ts.map +1 -1
- package/dist/Store/Memory.js +326 -66
- 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 +232 -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 +449 -0
- package/dist/Store/codeFilter.d.ts +5 -5
- package/dist/Store/codeFilter.d.ts.map +1 -1
- package/dist/Store/codeFilter.js +6 -3
- package/dist/Store/index.d.ts +7 -5
- package/dist/Store/index.d.ts.map +1 -1
- package/dist/Store/index.js +18 -5
- package/dist/Store/utils.d.ts +4 -3
- package/dist/Store/utils.d.ts.map +1 -1
- package/dist/Store/utils.js +5 -5
- package/dist/WorkflowEngineCosmos.d.ts +29 -0
- package/dist/WorkflowEngineCosmos.d.ts.map +1 -0
- package/dist/WorkflowEngineCosmos.js +521 -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 +2 -2
- package/dist/arbs.d.ts.map +1 -1
- package/dist/arbs.js +5 -3
- package/dist/codec.d.ts +5 -0
- package/dist/codec.d.ts.map +1 -0
- package/dist/codec.js +5 -0
- package/dist/cosmos-client.d.ts +16 -0
- package/dist/cosmos-client.d.ts.map +1 -0
- package/dist/cosmos-client.js +11 -0
- package/dist/errorReporter.d.ts +7 -5
- package/dist/errorReporter.d.ts.map +1 -1
- package/dist/errorReporter.js +23 -27
- package/dist/errors.d.ts +1 -1
- package/dist/fileUtil.d.ts +2 -2
- package/dist/fileUtil.d.ts.map +1 -1
- package/dist/fileUtil.js +2 -2
- package/dist/index.d.ts +3 -2
- 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 +3 -0
- package/dist/internal/health.d.ts.map +1 -0
- package/dist/internal/health.js +5 -0
- package/dist/layerUtils.d.ts +32 -0
- package/dist/layerUtils.d.ts.map +1 -0
- package/dist/layerUtils.js +17 -0
- package/dist/logger/jsonLogger.d.ts +2 -2
- package/dist/logger/jsonLogger.d.ts.map +1 -1
- package/dist/logger/jsonLogger.js +5 -3
- package/dist/logger/logFmtLogger.d.ts +2 -2
- package/dist/logger/logFmtLogger.d.ts.map +1 -1
- package/dist/logger/logFmtLogger.js +3 -3
- package/dist/logger/shared.d.ts +3 -3
- package/dist/logger/shared.d.ts.map +1 -1
- package/dist/logger/shared.js +5 -5
- package/dist/logger.d.ts +1 -1
- package/dist/logger.d.ts.map +1 -1
- package/dist/memQueue.d.ts +15 -0
- package/dist/memQueue.d.ts.map +1 -0
- package/dist/memQueue.js +21 -0
- package/dist/middlewares.d.ts +10 -0
- package/dist/middlewares.d.ts.map +1 -0
- package/dist/{api/middlewares.js → middlewares.js} +1 -1
- package/dist/mongo-client.d.ts +11 -0
- 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 +65 -0
- package/dist/rateLimit.d.ts +12 -4
- package/dist/rateLimit.d.ts.map +1 -1
- package/dist/rateLimit.js +7 -12
- package/dist/redis-client.d.ts +42 -0
- package/dist/redis-client.d.ts.map +1 -0
- package/dist/redis-client.js +98 -0
- package/dist/reportError.d.ts +4 -0
- package/dist/reportError.d.ts.map +1 -0
- package/dist/reportError.js +28 -0
- package/dist/routing/middleware/RouterMiddleware.d.ts +16 -0
- 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 +128 -0
- package/dist/routing/middleware.d.ts +3 -0
- 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 +4 -0
- package/dist/routing/schema/jwt.d.ts.map +1 -0
- package/dist/routing/schema/jwt.js +13 -0
- package/dist/routing/tsort.d.ts +8 -0
- package/dist/routing/tsort.d.ts.map +1 -0
- package/dist/routing/tsort.js +51 -0
- package/dist/routing/utils.d.ts +19 -0
- package/dist/routing/utils.d.ts.map +1 -0
- package/dist/routing/utils.js +45 -0
- package/dist/routing.d.ts +184 -0
- package/dist/routing.d.ts.map +1 -0
- package/dist/routing.js +236 -0
- package/dist/test.d.ts +3 -3
- package/dist/test.d.ts.map +1 -1
- package/dist/test.js +2 -2
- package/dist/util.d.ts +3 -0
- package/dist/util.d.ts.map +1 -0
- package/dist/util.js +14 -0
- package/dist/vitest.d.ts +1 -1
- package/docs/cluster-storage.md +26 -0
- package/docs/workflow-engine.md +262 -0
- package/examples/query.ts +47 -39
- package/package.json +31 -345
- package/run.sh +1 -0
- package/src/CUPS.ts +52 -13
- package/src/ClusterCosmos.ts +984 -0
- package/src/ClusterServiceBus.ts +242 -0
- package/src/{api/ContextProvider.ts → ContextProvider.ts} +19 -16
- package/src/Emailer/Sendgrid.ts +82 -59
- package/src/Emailer/fake.ts +3 -3
- package/src/MainFiberSet.ts +12 -10
- package/src/QueueMaker/SQLQueue.ts +153 -156
- package/src/QueueMaker/errors.ts +3 -1
- package/src/QueueMaker/memQueue.ts +113 -107
- package/src/QueueMaker/sbqueue.ts +78 -90
- package/src/RequestFiberSet.ts +13 -8
- package/src/{adapters/SQL → SQL}/Model.ts +42 -41
- package/src/ServiceBus.ts +219 -0
- package/src/Store/Cosmos/query.ts +216 -52
- package/src/Store/Cosmos.ts +493 -353
- package/src/Store/Disk.ts +109 -69
- package/src/Store/Memory.ts +365 -96
- package/src/Store/SQL/Pg.ts +363 -0
- package/src/Store/SQL/query.ts +603 -0
- package/src/Store/SQL.ts +735 -0
- package/src/Store/codeFilter.ts +8 -5
- package/src/Store/index.ts +21 -6
- package/src/Store/utils.ts +26 -24
- package/src/WorkflowEngineCosmos.ts +719 -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 +66 -76
- 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 +4 -2
- package/src/logger/logFmtLogger.ts +2 -2
- package/src/logger/shared.ts +5 -4
- package/src/{adapters/memQueue.ts → memQueue.ts} +5 -4
- package/src/{adapters/mongo-client.ts → mongo-client.ts} +4 -2
- package/src/otel.ts +152 -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/{api/routing → routing}/middleware/middleware.ts +62 -17
- 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 +768 -0
- package/src/test.ts +2 -2
- package/test/auth.test.ts +101 -0
- package/test/cluster-cosmos.test.ts +590 -0
- package/test/cluster-servicebus.test.ts +180 -0
- package/test/cluster-sqlite.test.ts +207 -0
- package/test/contextProvider.test.ts +15 -12
- package/test/controller.test.ts +28 -32
- package/test/cosmos-query.test.ts +159 -0
- package/test/dist/_check-agg-infer.test-d.d.ts +2 -0
- package/test/dist/_check-agg-infer.test-d.d.ts.map +1 -0
- package/test/dist/_check-agg-infer.test-d.js +19 -0
- package/test/dist/_check-proj-infer.test-d.d.ts +2 -0
- package/test/dist/_check-proj-infer.test-d.d.ts.map +1 -0
- package/test/dist/_check-proj-infer.test-d.js +16 -0
- package/test/dist/_check-tighten.test-d.d.ts +2 -0
- package/test/dist/_check-tighten.test-d.d.ts.map +1 -0
- package/test/dist/_check-tighten.test-d.js +21 -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/date-query.test.d.ts.map +1 -0
- package/test/dist/fixtures.d.ts +30 -12
- 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 +905 -40
- package/test/rawQuery.test.ts +340 -22
- package/test/repository-ext.test.ts +62 -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 +256 -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 +354 -0
- package/test/workflow-engine-sqlite.test.ts +299 -0
- package/tsconfig.examples.json +1 -1
- package/tsconfig.json +2 -1
- package/tsconfig.json.bak +2 -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/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/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 +0 -479
- package/dist/adapters/SQL/Model.d.ts.map +0 -1
- package/dist/adapters/SQL/Model.js +0 -478
- package/dist/adapters/SQL.d.ts +0 -2
- 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 +0 -10
- 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 +0 -39
- 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 +0 -5
- 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 +0 -3
- package/dist/api/internal/health.d.ts.map +0 -1
- package/dist/api/internal/health.js +0 -5
- package/dist/api/layerUtils.d.ts +0 -24
- package/dist/api/layerUtils.d.ts.map +0 -1
- package/dist/api/layerUtils.js +0 -16
- package/dist/api/middlewares.d.ts +0 -10
- package/dist/api/middlewares.d.ts.map +0 -1
- package/dist/api/reportError.d.ts +0 -4
- package/dist/api/reportError.d.ts.map +0 -1
- package/dist/api/reportError.js +0 -27
- package/dist/api/routing/middleware/RouterMiddleware.d.ts +0 -15
- 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 +0 -4
- package/dist/api/routing/middleware.d.ts.map +0 -1
- package/dist/api/routing/schema/jwt.d.ts +0 -4
- 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 +0 -8
- 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 +0 -19
- 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 +0 -3
- 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/service.ts +0 -17
- package/src/RequestContext.ts +0 -63
- package/src/Store/ContextMapContainer.ts +0 -20
- package/src/Store/service.ts +0 -184
- package/src/Store.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/api/internal/auth.ts +0 -68
- package/src/api/routing/middleware.ts +0 -6
- package/src/api/routing.ts +0 -598
- package/src/api/setupRequest.ts +0 -84
- /package/src/{adapters/SQL.ts → SQL.ts} +0 -0
- /package/src/{api/codec.ts → codec.ts} +0 -0
- /package/src/{api/internal → internal}/health.ts +0 -0
- /package/src/{api/middlewares.ts → middlewares.ts} +0 -0
- /package/src/{api/routing → routing}/tsort.ts +0 -0
- /package/src/{api/util.ts → util.ts} +0 -0
|
@@ -1,12 +1,17 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import
|
|
1
|
+
import type { NonEmptyReadonlyArray } from "effect-app/Array"
|
|
2
|
+
import * as Effect from "effect-app/Effect"
|
|
3
|
+
import { QueueMeta } from "effect-app/QueueMaker"
|
|
4
|
+
import * as S from "effect-app/Schema"
|
|
3
5
|
import type { StringId } from "effect-app/Schema"
|
|
6
|
+
import { getRequestContext, setupRequestContextWithCustomSpan } from "effect-app/setupRequest"
|
|
4
7
|
import { pretty } from "effect-app/utils"
|
|
5
|
-
import
|
|
6
|
-
import {
|
|
8
|
+
import * as Cause from "effect/Cause"
|
|
9
|
+
import { flow } from "effect/Function"
|
|
10
|
+
import * as Tracer from "effect/Tracer"
|
|
7
11
|
import { InfraLogger } from "../logger.js"
|
|
12
|
+
import { messagingSpanArgs } from "../otel.js"
|
|
13
|
+
import { Receiver, Sender } from "../ServiceBus.js"
|
|
8
14
|
import { reportNonInterruptedFailure, reportNonInterruptedFailureCause, reportQueueError } from "./errors.js"
|
|
9
|
-
import { type QueueBase, QueueMeta } from "./service.js"
|
|
10
15
|
|
|
11
16
|
export function makeServiceBusQueue<
|
|
12
17
|
Evt extends { id: StringId; _tag: string },
|
|
@@ -21,11 +26,11 @@ export function makeServiceBusQueue<
|
|
|
21
26
|
body: schema,
|
|
22
27
|
meta: QueueMeta
|
|
23
28
|
})
|
|
24
|
-
const wireSchemaJson = S.fromJsonString(wireSchema)
|
|
29
|
+
const wireSchemaJson = S.fromJsonString(S.toCodecJson(wireSchema))
|
|
25
30
|
const encodePublish = S.encodeEffect(wireSchemaJson)
|
|
26
31
|
const drainW = S.Struct({ body: drainSchema, meta: QueueMeta })
|
|
27
|
-
const drainWJson = S.fromJsonString(drainW)
|
|
28
|
-
const parseDrain = flow(S.
|
|
32
|
+
const drainWJson = S.fromJsonString(S.toCodecJson(drainW))
|
|
33
|
+
const parseDrain = flow(S.decodeUnknownEffectConcurrently(drainWJson), Effect.orDie)
|
|
29
34
|
|
|
30
35
|
return Effect.gen(function*() {
|
|
31
36
|
const sender = yield* Sender
|
|
@@ -42,96 +47,79 @@ export function makeServiceBusQueue<
|
|
|
42
47
|
handleEvent: (ks: DrainEvt) => Effect.Effect<void, DrainE, DrainR>,
|
|
43
48
|
sessionId?: string
|
|
44
49
|
) => {
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
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
|
-
}
|
|
50
|
+
const processMessage = Effect.fnUntraced(function*(messageBody: unknown) {
|
|
51
|
+
const { body, meta } = yield* parseDrain(messageBody).pipe(Effect.orDie)
|
|
52
|
+
let effect = InfraLogger
|
|
53
|
+
.logDebug(`[${receiver.name}] Processing incoming message`)
|
|
54
|
+
.pipe(
|
|
55
|
+
Effect.annotateLogs({ body: pretty(body), meta: pretty(meta) }),
|
|
56
|
+
Effect.andThen(handleEvent(body)),
|
|
57
|
+
Effect.orDie,
|
|
58
|
+
// we silenceAndReportError here, so that the error is reported, and moves into the Exit.
|
|
59
|
+
silenceAndReportError,
|
|
60
|
+
(_) => {
|
|
61
|
+
const args = messagingSpanArgs({
|
|
62
|
+
operation: "process",
|
|
63
|
+
system: "servicebus",
|
|
64
|
+
destination: receiver.name,
|
|
65
|
+
messageId: body.id,
|
|
66
|
+
conversationId: sessionId,
|
|
67
|
+
extra: { "messaging.message.type": body._tag, "messaging.message.body": body }
|
|
68
|
+
}, "consumer")
|
|
69
|
+
return setupRequestContextWithCustomSpan(
|
|
70
|
+
_,
|
|
71
|
+
meta,
|
|
72
|
+
args.name,
|
|
73
|
+
{
|
|
74
|
+
captureStackTrace: false,
|
|
75
|
+
kind: args.kind,
|
|
76
|
+
attributes: args.attributes
|
|
77
|
+
}
|
|
78
|
+
)
|
|
79
|
+
}
|
|
80
|
+
)
|
|
81
|
+
if (meta.span) {
|
|
82
|
+
effect = Effect.withParentSpan(effect, Tracer.externalSpan(meta.span))
|
|
83
|
+
}
|
|
84
|
+
// we reportError here, so that we report the error only, and keep flowing
|
|
85
|
+
const exit = yield* Effect.tapCause(effect, reportError)
|
|
86
|
+
return yield* exit
|
|
87
|
+
})
|
|
91
88
|
|
|
92
89
|
return receiver
|
|
93
90
|
.subscribe({
|
|
94
91
|
processMessage: (x) => processMessage(x.body).pipe(Effect.uninterruptible),
|
|
95
92
|
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
93
|
}, sessionId)
|
|
102
|
-
|
|
103
|
-
.pipe(
|
|
104
|
-
Effect.andThen(Effect.never)
|
|
105
|
-
)
|
|
94
|
+
.pipe(Effect.andThen(Effect.never))
|
|
106
95
|
},
|
|
107
96
|
|
|
108
|
-
publish: (
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
)
|
|
97
|
+
publish: Effect.fn(`publish ${sender.name}`, {
|
|
98
|
+
kind: "producer",
|
|
99
|
+
attributes: {
|
|
100
|
+
"messaging.system": "servicebus",
|
|
101
|
+
"messaging.operation.name": "publish",
|
|
102
|
+
"messaging.destination.name": sender.name
|
|
103
|
+
}
|
|
104
|
+
})(function*(...messages: NonEmptyReadonlyArray<Evt>) {
|
|
105
|
+
yield* Effect.annotateCurrentSpan({
|
|
106
|
+
"messaging.batch.message_count": messages.length,
|
|
107
|
+
"messaging.message.types": messages.map((_) => _._tag)
|
|
108
|
+
})
|
|
109
|
+
const requestContext = yield* getRequestContext
|
|
110
|
+
const msgs = yield* Effect.forEach(messages, (m) =>
|
|
111
|
+
encodePublish({ body: m, meta: requestContext }).pipe(
|
|
112
|
+
Effect.orDie,
|
|
113
|
+
Effect.map((body) => ({
|
|
114
|
+
body,
|
|
115
|
+
messageId: m.id, /* correllationid: requestId */
|
|
116
|
+
contentType: "application/json",
|
|
117
|
+
sessionId: "sessionId" in m ? m.sessionId as string : undefined as unknown as string // TODO: optional
|
|
118
|
+
}))
|
|
119
|
+
))
|
|
120
|
+
yield* sender.sendMessages(msgs)
|
|
121
|
+
})
|
|
134
122
|
}
|
|
135
|
-
return queue
|
|
123
|
+
return queue
|
|
136
124
|
})
|
|
137
125
|
}
|
package/src/RequestFiberSet.ts
CHANGED
|
@@ -1,7 +1,13 @@
|
|
|
1
1
|
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
2
|
-
import
|
|
3
|
-
import
|
|
2
|
+
import * as Context from "effect-app/Context"
|
|
3
|
+
import * as Effect from "effect-app/Effect"
|
|
4
|
+
import * as Layer from "effect-app/Layer"
|
|
5
|
+
import * as Option from "effect-app/Option"
|
|
6
|
+
import * as Fiber from "effect/Fiber"
|
|
7
|
+
import * as FiberSet from "effect/FiberSet"
|
|
8
|
+
import type * as Tracer from "effect/Tracer"
|
|
4
9
|
import { InfraLogger } from "./logger.js"
|
|
10
|
+
import { reportRequestError, reportUnknownRequestError } from "./reportError.js"
|
|
5
11
|
|
|
6
12
|
const getRootParentSpan = Effect.gen(function*() {
|
|
7
13
|
let span: Tracer.AnySpan | null = yield* Effect.currentSpan.pipe(
|
|
@@ -92,14 +98,13 @@ const make = Effect.gen(function*() {
|
|
|
92
98
|
* Whenever you fork a fiber for a Request, and you want to prevent dependent services to close prematurely on interruption,
|
|
93
99
|
* like the ServiceBus Sender, you should register these fibers in this FiberSet.
|
|
94
100
|
*/
|
|
95
|
-
export class RequestFiberSet extends
|
|
101
|
+
export class RequestFiberSet extends Context.Service<RequestFiberSet>()("RequestFiberSet", { make }) {
|
|
96
102
|
static readonly Live = Layer.effect(this, this.make)
|
|
97
103
|
static readonly register = <A, E, R>(self: Effect.Effect<A, E, R>) =>
|
|
98
|
-
this.
|
|
99
|
-
static readonly run = <A, E, R>(self: Effect.Effect<A, E, R>) =>
|
|
100
|
-
this.asEffect().pipe(Effect.andThen((_) => _.run(self)))
|
|
104
|
+
this.pipe(Effect.andThen((_) => _.register(self)))
|
|
105
|
+
static readonly run = <A, E, R>(self: Effect.Effect<A, E, R>) => this.pipe(Effect.andThen((_) => _.run(self)))
|
|
101
106
|
static readonly forkDaemonReport = <R, E, A>(self: Effect.Effect<A, E, R>) =>
|
|
102
|
-
this.
|
|
107
|
+
this.pipe(Effect.andThen((_) => _.forkDaemonReport(self)))
|
|
103
108
|
static readonly forkDaemonReportUnexpected = <R, E, A>(self: Effect.Effect<A, E, R>) =>
|
|
104
|
-
this.
|
|
109
|
+
this.pipe(Effect.andThen((_) => _.forkDaemonReportUnexpected(self)))
|
|
105
110
|
}
|
|
@@ -24,6 +24,7 @@ import * as VariantSchema from "effect/unstable/schema/VariantSchema"
|
|
|
24
24
|
import { SqlClient } from "effect/unstable/sql/SqlClient"
|
|
25
25
|
import * as SqlResolver from "effect/unstable/sql/SqlResolver"
|
|
26
26
|
import * as SqlSchema from "effect/unstable/sql/SqlSchema"
|
|
27
|
+
import { type DbSystem, withDbSpan } from "../otel.js"
|
|
27
28
|
|
|
28
29
|
const {
|
|
29
30
|
Class,
|
|
@@ -73,7 +74,7 @@ export {
|
|
|
73
74
|
* @since 1.0.0
|
|
74
75
|
* @category constructors
|
|
75
76
|
* @example
|
|
76
|
-
* import
|
|
77
|
+
* import * as Schema from "effect/Schema"
|
|
77
78
|
* import { Model } from "effect/unstable/schema"
|
|
78
79
|
*
|
|
79
80
|
* export const GroupId = Schema.Number.pipe(Schema.brand("GroupId"))
|
|
@@ -545,9 +546,15 @@ export const DateTimeUpdateFromNumber: DateTimeUpdateFromNumber = Field({
|
|
|
545
546
|
*/
|
|
546
547
|
export interface JsonFromString<S extends Schema.Top> extends
|
|
547
548
|
VariantSchema.Field<{
|
|
548
|
-
readonly select: Schema.fromJsonString<
|
|
549
|
-
|
|
550
|
-
|
|
549
|
+
readonly select: Schema.fromJsonString<
|
|
550
|
+
Schema.Codec<S["Type"], Schema.Json, S["DecodingServices"], S["EncodingServices"]>
|
|
551
|
+
>
|
|
552
|
+
readonly insert: Schema.fromJsonString<
|
|
553
|
+
Schema.Codec<S["Type"], Schema.Json, S["DecodingServices"], S["EncodingServices"]>
|
|
554
|
+
>
|
|
555
|
+
readonly update: Schema.fromJsonString<
|
|
556
|
+
Schema.Codec<S["Type"], Schema.Json, S["DecodingServices"], S["EncodingServices"]>
|
|
557
|
+
>
|
|
551
558
|
readonly json: S
|
|
552
559
|
readonly jsonCreate: S
|
|
553
560
|
readonly jsonUpdate: S
|
|
@@ -565,7 +572,7 @@ export interface JsonFromString<S extends Schema.Top> extends
|
|
|
565
572
|
export const JsonFromString = <S extends Schema.Top>(
|
|
566
573
|
schema: S
|
|
567
574
|
): JsonFromString<S> => {
|
|
568
|
-
const parsed = Schema.fromJsonString(schema)
|
|
575
|
+
const parsed = Schema.fromJsonString(Schema.toCodecJson(schema))
|
|
569
576
|
return Field({
|
|
570
577
|
select: parsed,
|
|
571
578
|
insert: parsed,
|
|
@@ -590,6 +597,7 @@ export const makeRepository = <
|
|
|
590
597
|
readonly spanPrefix: string
|
|
591
598
|
readonly idColumn: Id
|
|
592
599
|
readonly versionColumn?: string | undefined
|
|
600
|
+
readonly dbSystem?: DbSystem | undefined
|
|
593
601
|
}): Effect.Effect<
|
|
594
602
|
{
|
|
595
603
|
readonly insert: (
|
|
@@ -623,6 +631,15 @@ export const makeRepository = <
|
|
|
623
631
|
const idSchema = Model.fields[options.idColumn] as Schema.Top
|
|
624
632
|
const idColumn = options.idColumn as string
|
|
625
633
|
const versionColumn = options.versionColumn
|
|
634
|
+
const system: DbSystem = options.dbSystem ?? "other_sql"
|
|
635
|
+
const opSpan = (operation: string, idValue?: unknown) =>
|
|
636
|
+
withDbSpan({
|
|
637
|
+
operation,
|
|
638
|
+
system,
|
|
639
|
+
collection: options.tableName,
|
|
640
|
+
entity: options.spanPrefix,
|
|
641
|
+
...(idValue !== undefined && { extra: { "app.entity.id": idValue } })
|
|
642
|
+
})
|
|
626
643
|
|
|
627
644
|
const insertSchema = SqlSchema.findOne({
|
|
628
645
|
Request: Model.insert,
|
|
@@ -644,9 +661,7 @@ select * from ${sql(options.tableName)} where ${sql(idColumn)} = LAST_INSERT_ID(
|
|
|
644
661
|
): Effect.Effect<S["Type"], Schema.SchemaError, S["DecodingServices"] | S["insert"]["EncodingServices"]> =>
|
|
645
662
|
insertSchema(insert).pipe(
|
|
646
663
|
Effect.catchTag("NoSuchElementError", Effect.die),
|
|
647
|
-
|
|
648
|
-
captureStackTrace: false
|
|
649
|
-
})
|
|
664
|
+
opSpan("insert")
|
|
650
665
|
) as any
|
|
651
666
|
|
|
652
667
|
const insertVoidSchema = SqlSchema.void({
|
|
@@ -657,9 +672,7 @@ select * from ${sql(options.tableName)} where ${sql(idColumn)} = LAST_INSERT_ID(
|
|
|
657
672
|
insert: S["insert"]["Type"]
|
|
658
673
|
): Effect.Effect<void, Schema.SchemaError, S["insert"]["EncodingServices"]> =>
|
|
659
674
|
insertVoidSchema(insert).pipe(
|
|
660
|
-
|
|
661
|
-
captureStackTrace: false
|
|
662
|
-
})
|
|
675
|
+
opSpan("insertVoid")
|
|
663
676
|
) as any
|
|
664
677
|
|
|
665
678
|
const updateSchema = SqlSchema.findOne({
|
|
@@ -706,11 +719,7 @@ select * from ${sql(options.tableName)} where ${sql(idColumn)} = ${request[idCol
|
|
|
706
719
|
): Effect.Effect<S["Type"], Schema.SchemaError, S["DecodingServices"] | S["update"]["EncodingServices"]> =>
|
|
707
720
|
updateSchema(update).pipe(
|
|
708
721
|
Effect.catchTag("NoSuchElementError", Effect.die),
|
|
709
|
-
|
|
710
|
-
attributes: { id: (update as any)[idColumn] }
|
|
711
|
-
}, {
|
|
712
|
-
captureStackTrace: false
|
|
713
|
-
})
|
|
722
|
+
opSpan("update", (update as any)[idColumn])
|
|
714
723
|
) as any
|
|
715
724
|
|
|
716
725
|
const updateVoidSchema = SqlSchema.void({
|
|
@@ -729,11 +738,7 @@ select * from ${sql(options.tableName)} where ${sql(idColumn)} = ${request[idCol
|
|
|
729
738
|
update: S["update"]["Type"]
|
|
730
739
|
): Effect.Effect<void, Schema.SchemaError, S["update"]["EncodingServices"]> =>
|
|
731
740
|
updateVoidSchema(update).pipe(
|
|
732
|
-
|
|
733
|
-
attributes: { id: (update as any)[idColumn] }
|
|
734
|
-
}, {
|
|
735
|
-
captureStackTrace: false
|
|
736
|
-
})
|
|
741
|
+
opSpan("updateVoid", (update as any)[idColumn])
|
|
737
742
|
) as any
|
|
738
743
|
|
|
739
744
|
const findByIdSchema = SqlSchema.findOneOption({
|
|
@@ -749,9 +754,7 @@ select * from ${sql(options.tableName)} where ${sql(idColumn)} = ${request[idCol
|
|
|
749
754
|
S["DecodingServices"] | S["fields"][Id]["EncodingServices"]
|
|
750
755
|
> =>
|
|
751
756
|
findByIdSchema(id).pipe(
|
|
752
|
-
|
|
753
|
-
captureStackTrace: false
|
|
754
|
-
})
|
|
757
|
+
opSpan("findById", id)
|
|
755
758
|
) as any
|
|
756
759
|
|
|
757
760
|
const deleteSchema = SqlSchema.void({
|
|
@@ -762,11 +765,7 @@ select * from ${sql(options.tableName)} where ${sql(idColumn)} = ${request[idCol
|
|
|
762
765
|
id: S["fields"][Id]["Type"]
|
|
763
766
|
): Effect.Effect<void, Schema.SchemaError, S["fields"][Id]["EncodingServices"]> =>
|
|
764
767
|
deleteSchema(id).pipe(
|
|
765
|
-
|
|
766
|
-
attributes: { id }
|
|
767
|
-
}, {
|
|
768
|
-
captureStackTrace: false
|
|
769
|
-
})
|
|
768
|
+
opSpan("delete", id)
|
|
770
769
|
) as any
|
|
771
770
|
|
|
772
771
|
return { insert, insertVoid, update, updateVoid, findById, delete: delete_ } as const
|
|
@@ -789,6 +788,7 @@ export const makeDataLoaders = <
|
|
|
789
788
|
readonly idColumn: Id
|
|
790
789
|
readonly window: Input
|
|
791
790
|
readonly maxBatchSize?: number | undefined
|
|
791
|
+
readonly dbSystem?: DbSystem | undefined
|
|
792
792
|
}
|
|
793
793
|
): Effect.Effect<
|
|
794
794
|
{
|
|
@@ -821,6 +821,15 @@ export const makeDataLoaders = <
|
|
|
821
821
|
const idSchema = Model.fields[options.idColumn] as Schema.Top
|
|
822
822
|
const idColumn = options.idColumn as string
|
|
823
823
|
const setMaxBatchSize = options.maxBatchSize ? RequestResolver.batchN(options.maxBatchSize) : identity
|
|
824
|
+
const system: DbSystem = options.dbSystem ?? "other_sql"
|
|
825
|
+
const opSpan = (operation: string, idValue?: unknown) =>
|
|
826
|
+
withDbSpan({
|
|
827
|
+
operation,
|
|
828
|
+
system,
|
|
829
|
+
collection: options.tableName,
|
|
830
|
+
entity: options.spanPrefix,
|
|
831
|
+
...(idValue !== undefined && { extra: { "app.entity.id": idValue } })
|
|
832
|
+
})
|
|
824
833
|
|
|
825
834
|
const insertResolver = SqlResolver
|
|
826
835
|
.ordered({
|
|
@@ -854,9 +863,7 @@ select * from ${sql(options.tableName)} where ${sql(idColumn)} = LAST_INSERT_ID(
|
|
|
854
863
|
> =>
|
|
855
864
|
insertExecute(insert).pipe(
|
|
856
865
|
Effect.catchTag("ResultLengthMismatch", Effect.die),
|
|
857
|
-
|
|
858
|
-
captureStackTrace: false
|
|
859
|
-
})
|
|
866
|
+
opSpan("insert")
|
|
860
867
|
) as any
|
|
861
868
|
|
|
862
869
|
const insertVoidResolver = SqlResolver
|
|
@@ -874,9 +881,7 @@ select * from ${sql(options.tableName)} where ${sql(idColumn)} = LAST_INSERT_ID(
|
|
|
874
881
|
insert: S["insert"]["Type"]
|
|
875
882
|
): Effect.Effect<void, Schema.SchemaError, S["insert"]["EncodingServices"]> =>
|
|
876
883
|
insertVoidExecute(insert).pipe(
|
|
877
|
-
|
|
878
|
-
captureStackTrace: false
|
|
879
|
-
})
|
|
884
|
+
opSpan("insertVoid")
|
|
880
885
|
) as any
|
|
881
886
|
|
|
882
887
|
const findByIdResolver = SqlResolver
|
|
@@ -902,9 +907,7 @@ select * from ${sql(options.tableName)} where ${sql(idColumn)} = LAST_INSERT_ID(
|
|
|
902
907
|
S["DecodingServices"] | S["fields"][Id]["EncodingServices"]
|
|
903
908
|
> =>
|
|
904
909
|
findByIdExecute(id).pipe(
|
|
905
|
-
|
|
906
|
-
captureStackTrace: false
|
|
907
|
-
})
|
|
910
|
+
opSpan("findById", id)
|
|
908
911
|
) as any
|
|
909
912
|
|
|
910
913
|
const deleteResolver = SqlResolver
|
|
@@ -922,9 +925,7 @@ select * from ${sql(options.tableName)} where ${sql(idColumn)} = LAST_INSERT_ID(
|
|
|
922
925
|
id: S["fields"][Id]["Type"]
|
|
923
926
|
): Effect.Effect<void, Schema.SchemaError, S["fields"][Id]["EncodingServices"]> =>
|
|
924
927
|
deleteExecute(id).pipe(
|
|
925
|
-
|
|
926
|
-
captureStackTrace: false
|
|
927
|
-
})
|
|
928
|
+
opSpan("delete", id)
|
|
928
929
|
) as any
|
|
929
930
|
|
|
930
931
|
return { insert, insertVoid, findById, delete: delete_ } as const
|
|
@@ -0,0 +1,219 @@
|
|
|
1
|
+
/* eslint-disable @typescript-eslint/prefer-promise-reject-errors */
|
|
2
|
+
import { type OperationOptionsBase, type ProcessErrorArgs, ServiceBusClient, type ServiceBusMessage, type ServiceBusMessageBatch, type ServiceBusReceivedMessage, type ServiceBusReceiver } from "@azure/service-bus"
|
|
3
|
+
import * as Context from "effect-app/Context"
|
|
4
|
+
import * as Effect from "effect-app/Effect"
|
|
5
|
+
import * as Layer from "effect-app/Layer"
|
|
6
|
+
import * as Cause from "effect/Cause"
|
|
7
|
+
import * as Exit from "effect/Exit"
|
|
8
|
+
import * as FiberSet from "effect/FiberSet"
|
|
9
|
+
import type * as Scope from "effect/Scope"
|
|
10
|
+
import { InfraLogger } from "./logger.js"
|
|
11
|
+
|
|
12
|
+
const logged = (name: string) => <A, E, R>(self: Effect.Effect<A, E, R>) =>
|
|
13
|
+
Effect.logInfo(name).pipe(
|
|
14
|
+
Effect.andThen(self),
|
|
15
|
+
Effect.tap(Effect.logInfo(name + " done")),
|
|
16
|
+
Effect.withLogSpan(name)
|
|
17
|
+
)
|
|
18
|
+
|
|
19
|
+
function makeClient(url: string) {
|
|
20
|
+
return Effect.acquireRelease(
|
|
21
|
+
Effect.sync(() => new ServiceBusClient(url)).pipe(logged("ServiceBus.client.create")),
|
|
22
|
+
(client) => Effect.promise(() => client.close()).pipe(logged("ServiceBus.client.close"))
|
|
23
|
+
)
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
export class ServiceBusClientTag
|
|
27
|
+
extends Context.Opaque<ServiceBusClientTag, ServiceBusClient>()("@services/Client", { make: makeClient })
|
|
28
|
+
{
|
|
29
|
+
static readonly layer = (url: string) => this.toLayer(this.make(url))
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
const makeSender_ = Effect.fnUntraced(function*(queueName: string) {
|
|
33
|
+
const serviceBusClient = yield* ServiceBusClientTag
|
|
34
|
+
|
|
35
|
+
return yield* Effect.acquireRelease(
|
|
36
|
+
Effect.sync(() => serviceBusClient.createSender(queueName)).pipe(
|
|
37
|
+
logged(`ServiceBus.sender.create ${queueName}`)
|
|
38
|
+
),
|
|
39
|
+
(sender) => Effect.promise(() => sender.close()).pipe(logged(`ServiceBus.sender.close ${queueName}`))
|
|
40
|
+
)
|
|
41
|
+
})
|
|
42
|
+
|
|
43
|
+
const makeSender = Effect.fnUntraced(function*(name: string) {
|
|
44
|
+
const sender = yield* makeSender_(name)
|
|
45
|
+
const sendMessages = Effect.fnUntraced(function*(
|
|
46
|
+
messages: ServiceBusMessage | ServiceBusMessage[] | ServiceBusMessageBatch,
|
|
47
|
+
options?: Omit<OperationOptionsBase, "abortSignal">
|
|
48
|
+
) {
|
|
49
|
+
return yield* Effect.promise((abortSignal) => sender.sendMessages(messages, { ...options, abortSignal }))
|
|
50
|
+
})
|
|
51
|
+
|
|
52
|
+
return { name, sendMessages }
|
|
53
|
+
})
|
|
54
|
+
|
|
55
|
+
export class Sender extends Context.Opaque<Sender, {
|
|
56
|
+
name: string
|
|
57
|
+
sendMessages: (
|
|
58
|
+
messages: ServiceBusMessage | ServiceBusMessage[] | ServiceBusMessageBatch,
|
|
59
|
+
options?: Omit<OperationOptionsBase, "abortSignal">
|
|
60
|
+
) => Effect.Effect<void>
|
|
61
|
+
}>()("Sender", { make: makeSender }) {
|
|
62
|
+
static readonly layer = (name: string) => this.toLayer(this.make(name))
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
export const SenderTag = <Id>() => <Key extends string>(queueName: Key) => {
|
|
66
|
+
const tag = Context.Service<Id, Sender>(`ServiceBus.Sender.${queueName}`)
|
|
67
|
+
|
|
68
|
+
return Object.assign(tag, {
|
|
69
|
+
layer: Layer.effect(
|
|
70
|
+
tag,
|
|
71
|
+
Sender.make(queueName).pipe(Effect.map(Sender.of))
|
|
72
|
+
)
|
|
73
|
+
})
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
const makeReceiver = Effect.fnUntraced(function*(name: string) {
|
|
77
|
+
const serviceBusClient = yield* ServiceBusClientTag
|
|
78
|
+
|
|
79
|
+
const makeReceiver = Effect.fnUntraced(
|
|
80
|
+
function*(queueName: string, waitTillEmpty: Effect.Effect<void>, sessionId?: string) {
|
|
81
|
+
const annotate = sessionId !== undefined
|
|
82
|
+
? Effect.annotateLogs({ "messaging.session.id": sessionId })
|
|
83
|
+
: <A, E, R>(self: Effect.Effect<A, E, R>): Effect.Effect<A, E, R> => self
|
|
84
|
+
return yield* Effect.acquireRelease(
|
|
85
|
+
(sessionId
|
|
86
|
+
? Effect.promise(() => serviceBusClient.acceptSession(queueName, sessionId))
|
|
87
|
+
: Effect.sync(() => serviceBusClient.createReceiver(queueName)))
|
|
88
|
+
.pipe(logged(`ServiceBus.receiver.create ${queueName}`), annotate),
|
|
89
|
+
(r) =>
|
|
90
|
+
waitTillEmpty.pipe(
|
|
91
|
+
logged(`ServiceBus.receiver.waitTillEmpty ${queueName}`),
|
|
92
|
+
Effect.andThen(
|
|
93
|
+
Effect.promise(() => r.close()).pipe(
|
|
94
|
+
logged(`ServiceBus.receiver.close ${queueName}`)
|
|
95
|
+
)
|
|
96
|
+
),
|
|
97
|
+
logged(`ServiceBus.receiver.release ${queueName}`),
|
|
98
|
+
annotate
|
|
99
|
+
)
|
|
100
|
+
)
|
|
101
|
+
}
|
|
102
|
+
)
|
|
103
|
+
|
|
104
|
+
const make = (waitTillEmpty: Effect.Effect<void>) => makeReceiver(name, waitTillEmpty)
|
|
105
|
+
|
|
106
|
+
const makeSession = (sessionId: string, waitTillEmpty: Effect.Effect<void>) =>
|
|
107
|
+
makeReceiver(name, waitTillEmpty, sessionId)
|
|
108
|
+
|
|
109
|
+
return {
|
|
110
|
+
name,
|
|
111
|
+
make,
|
|
112
|
+
makeSession,
|
|
113
|
+
subscribe: Effect.fnUntraced(function*<RMsg, RErr>(hndlr: MessageHandlers<RMsg, RErr>, sessionId?: string) {
|
|
114
|
+
const fs = yield* FiberSet.make()
|
|
115
|
+
const fr = yield* FiberSet.runtime(fs)<RMsg | RErr>()
|
|
116
|
+
const wait = Effect
|
|
117
|
+
.gen(function*() {
|
|
118
|
+
if ((yield* FiberSet.size(fs)) > 0) {
|
|
119
|
+
yield* InfraLogger.logDebug("Waiting ServiceBusFiberSet to be empty: " + (yield* FiberSet.size(fs)))
|
|
120
|
+
}
|
|
121
|
+
while ((yield* FiberSet.size(fs)) > 0) yield* Effect.sleep("250 millis")
|
|
122
|
+
})
|
|
123
|
+
const r = yield* sessionId
|
|
124
|
+
? makeSession(
|
|
125
|
+
sessionId,
|
|
126
|
+
wait
|
|
127
|
+
)
|
|
128
|
+
: make(wait)
|
|
129
|
+
|
|
130
|
+
const runEffect = <E>(effect: Effect.Effect<void, E, RMsg | RErr>) =>
|
|
131
|
+
new Promise<void>((resolve, reject) =>
|
|
132
|
+
fr(effect)
|
|
133
|
+
.addObserver((exit) => {
|
|
134
|
+
if (Exit.isSuccess(exit)) {
|
|
135
|
+
resolve(exit.value)
|
|
136
|
+
} else {
|
|
137
|
+
// disable @typescript-eslint/prefer-promise-reject-errors
|
|
138
|
+
reject(Cause.pretty(exit.cause))
|
|
139
|
+
}
|
|
140
|
+
})
|
|
141
|
+
)
|
|
142
|
+
|
|
143
|
+
const annotate = sessionId !== undefined
|
|
144
|
+
? Effect.annotateLogs({ "messaging.session.id": sessionId })
|
|
145
|
+
: <A, E, R>(self: Effect.Effect<A, E, R>): Effect.Effect<A, E, R> => self
|
|
146
|
+
yield* Effect.acquireRelease(
|
|
147
|
+
Effect
|
|
148
|
+
.sync(() => {
|
|
149
|
+
const s = r
|
|
150
|
+
.subscribe({
|
|
151
|
+
processError: (err) =>
|
|
152
|
+
runEffect(
|
|
153
|
+
hndlr
|
|
154
|
+
.processError(err)
|
|
155
|
+
.pipe(
|
|
156
|
+
Effect.catchCause((cause) => Effect.logError("ServiceBus Error", cause)),
|
|
157
|
+
annotate
|
|
158
|
+
)
|
|
159
|
+
),
|
|
160
|
+
processMessage: (msg) => runEffect(hndlr.processMessage(msg).pipe(annotate))
|
|
161
|
+
// DO NOT CATCH ERRORS here as they should return to the queue!
|
|
162
|
+
})
|
|
163
|
+
return { close: Effect.promise(() => s.close()) }
|
|
164
|
+
})
|
|
165
|
+
.pipe(logged("ServiceBus.subscription.create"), annotate),
|
|
166
|
+
(subscription) =>
|
|
167
|
+
subscription.close.pipe(
|
|
168
|
+
logged("ServiceBus.subscription.close"),
|
|
169
|
+
annotate
|
|
170
|
+
)
|
|
171
|
+
) as Effect.Effect<void, never, Scope.Scope> // wth is going on here
|
|
172
|
+
})
|
|
173
|
+
}
|
|
174
|
+
})
|
|
175
|
+
|
|
176
|
+
export class Receiver extends Context.Opaque<Receiver, {
|
|
177
|
+
name: string
|
|
178
|
+
make: (waitTillEmpty: Effect.Effect<void>) => Effect.Effect<ServiceBusReceiver, never, Scope.Scope>
|
|
179
|
+
makeSession: (
|
|
180
|
+
sessionId: string,
|
|
181
|
+
waitTillEmpty: Effect.Effect<void>
|
|
182
|
+
) => Effect.Effect<ServiceBusReceiver, never, Scope.Scope>
|
|
183
|
+
subscribe<RMsg, RErr>(
|
|
184
|
+
hndlr: MessageHandlers<RMsg, RErr>,
|
|
185
|
+
sessionId?: string
|
|
186
|
+
): Effect.Effect<void, never, Scope.Scope | RMsg | RErr>
|
|
187
|
+
}>()("Receiver") {
|
|
188
|
+
static readonly make = makeReceiver
|
|
189
|
+
static readonly layer = (name: string) => this.toLayer(makeReceiver(name))
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
export const ReceiverTag = <Id>() => <Key extends string>(queueName: Key) => {
|
|
193
|
+
const tag = Context.Service<Id, Receiver>(`ServiceBus.Receiver.${queueName}`)
|
|
194
|
+
|
|
195
|
+
return Object.assign(tag, {
|
|
196
|
+
layer: Layer.effect(
|
|
197
|
+
tag,
|
|
198
|
+
makeReceiver(queueName).pipe(Effect.map(Receiver.of))
|
|
199
|
+
)
|
|
200
|
+
})
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
export const SenderReceiver = (queue: string, queueDrain?: string) =>
|
|
204
|
+
Layer.mergeAll(Sender.layer(queue), Receiver.layer(queueDrain ?? queue))
|
|
205
|
+
|
|
206
|
+
export interface MessageHandlers<RMsg, RErr> {
|
|
207
|
+
/**
|
|
208
|
+
* Handler that processes messages from service bus.
|
|
209
|
+
*
|
|
210
|
+
* @param message - A message received from Service Bus.
|
|
211
|
+
*/
|
|
212
|
+
processMessage(message: ServiceBusReceivedMessage): Effect.Effect<void, never, RMsg>
|
|
213
|
+
/**
|
|
214
|
+
* Handler that processes errors that occur during receiving.
|
|
215
|
+
* @param args - The error and additional context to indicate where
|
|
216
|
+
* the error originated.
|
|
217
|
+
*/
|
|
218
|
+
processError(args: ProcessErrorArgs): Effect.Effect<void, never, RErr>
|
|
219
|
+
}
|