@effect-app/infra 4.0.0-beta.31 → 4.0.0-beta.310
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +2361 -0
- package/_check.sh +1 -1
- package/dist/CUPS.d.ts +29 -10
- package/dist/CUPS.d.ts.map +1 -1
- package/dist/CUPS.js +35 -14
- package/dist/ClusterCosmos.d.ts +64 -0
- package/dist/ClusterCosmos.d.ts.map +1 -0
- package/dist/ClusterCosmos.js +547 -0
- package/dist/ClusterServiceBus.d.ts +67 -0
- package/dist/ClusterServiceBus.d.ts.map +1 -0
- package/dist/ClusterServiceBus.js +82 -0
- package/dist/ContextProvider.d.ts +34 -0
- package/dist/ContextProvider.d.ts.map +1 -0
- package/dist/ContextProvider.js +40 -0
- package/dist/Emailer/Sendgrid.d.ts +110 -146
- package/dist/Emailer/Sendgrid.d.ts.map +1 -1
- package/dist/Emailer/Sendgrid.js +24 -19
- package/dist/Emailer/fake.d.ts +1 -1
- package/dist/Emailer/fake.d.ts.map +1 -1
- package/dist/Emailer/fake.js +4 -4
- package/dist/MainFiberSet.d.ts +12 -8
- package/dist/MainFiberSet.d.ts.map +1 -1
- package/dist/MainFiberSet.js +23 -7
- package/dist/QueueMaker/errors.d.ts +4 -2
- package/dist/QueueMaker/errors.d.ts.map +1 -1
- package/dist/QueueMaker/errors.js +4 -2
- package/dist/{adapters/SQL → SQL}/Model.d.ts +31 -42
- package/dist/SQL/Model.d.ts.map +1 -0
- package/dist/SQL/Model.js +469 -0
- package/dist/SQL.d.ts.map +1 -0
- package/dist/{adapters/SQL.js → SQL.js} +1 -1
- package/dist/Store/Cosmos/query.d.ts +14 -3
- package/dist/Store/Cosmos/query.d.ts.map +1 -1
- package/dist/Store/Cosmos/query.js +179 -41
- package/dist/Store/Cosmos.d.ts +2 -2
- package/dist/Store/Cosmos.d.ts.map +1 -1
- package/dist/Store/Cosmos.js +385 -254
- package/dist/Store/Disk.d.ts +4 -4
- package/dist/Store/Disk.d.ts.map +1 -1
- package/dist/Store/Disk.js +79 -39
- package/dist/Store/Memory.d.ts +5 -9
- package/dist/Store/Memory.d.ts.map +1 -1
- package/dist/Store/Memory.js +324 -67
- package/dist/Store/SQL/Pg.d.ts +4 -0
- package/dist/Store/SQL/Pg.d.ts.map +1 -0
- package/dist/Store/SQL/Pg.js +253 -0
- package/dist/Store/SQL/query.d.ts +49 -0
- package/dist/Store/SQL/query.d.ts.map +1 -0
- package/dist/Store/SQL/query.js +527 -0
- package/dist/Store/SQL.d.ts +21 -0
- package/dist/Store/SQL.d.ts.map +1 -0
- package/dist/Store/SQL.js +472 -0
- package/dist/Store/codeFilter.d.ts +4 -4
- package/dist/Store/codeFilter.d.ts.map +1 -1
- package/dist/Store/codeFilter.js +6 -4
- package/dist/Store/index.d.ts +6 -4
- package/dist/Store/index.d.ts.map +1 -1
- package/dist/Store/index.js +18 -5
- package/dist/Store/utils.d.ts +5 -2
- package/dist/Store/utils.d.ts.map +1 -1
- package/dist/Store/utils.js +9 -5
- package/dist/WorkflowEngineCosmos.d.ts +29 -0
- package/dist/WorkflowEngineCosmos.d.ts.map +1 -0
- package/dist/WorkflowEngineCosmos.js +542 -0
- package/dist/WorkflowEngineSqlite.d.ts +24 -0
- package/dist/WorkflowEngineSqlite.d.ts.map +1 -0
- package/dist/WorkflowEngineSqlite.js +550 -0
- package/dist/arbs.d.ts +1 -1
- package/dist/arbs.d.ts.map +1 -1
- package/dist/arbs.js +5 -3
- package/dist/codec.d.ts.map +1 -0
- package/dist/codec.js +5 -0
- package/dist/{adapters/cosmos-client.d.ts → cosmos-client.d.ts} +4 -2
- package/dist/cosmos-client.d.ts.map +1 -0
- package/dist/cosmos-client.js +11 -0
- package/dist/errorReporter.d.ts +6 -4
- package/dist/errorReporter.d.ts.map +1 -1
- package/dist/errorReporter.js +23 -27
- package/dist/fileUtil.d.ts +1 -1
- package/dist/fileUtil.d.ts.map +1 -1
- package/dist/fileUtil.js +2 -2
- package/dist/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -2
- package/dist/internal/RequestContextMiddleware.d.ts +5 -0
- package/dist/internal/RequestContextMiddleware.d.ts.map +1 -0
- package/dist/internal/RequestContextMiddleware.js +45 -0
- package/dist/internal/auth.d.ts +53 -0
- package/dist/internal/auth.d.ts.map +1 -0
- package/dist/internal/auth.js +180 -0
- package/dist/internal/events.d.ts +11 -0
- package/dist/internal/events.d.ts.map +1 -0
- package/dist/internal/events.js +49 -0
- package/dist/internal/health.d.ts.map +1 -0
- package/dist/internal/health.js +5 -0
- package/dist/{api/layerUtils.d.ts → layerUtils.d.ts} +14 -6
- package/dist/layerUtils.d.ts.map +1 -0
- package/dist/layerUtils.js +17 -0
- package/dist/logger/jsonLogger.d.ts +1 -1
- package/dist/logger/jsonLogger.d.ts.map +1 -1
- package/dist/logger/jsonLogger.js +5 -3
- package/dist/logger/logFmtLogger.d.ts +1 -1
- package/dist/logger/logFmtLogger.d.ts.map +1 -1
- package/dist/logger/logFmtLogger.js +3 -3
- package/dist/logger/shared.d.ts +2 -2
- package/dist/logger/shared.d.ts.map +1 -1
- package/dist/logger/shared.js +5 -5
- package/dist/logger.d.ts.map +1 -1
- package/dist/middlewares.d.ts.map +1 -0
- package/dist/{api/middlewares.js → middlewares.js} +1 -1
- package/dist/{adapters/mongo-client.d.ts → mongo-client.d.ts} +3 -2
- package/dist/mongo-client.d.ts.map +1 -0
- package/dist/mongo-client.js +15 -0
- package/dist/otel.d.ts +75 -0
- package/dist/otel.d.ts.map +1 -0
- package/dist/otel.js +84 -0
- package/dist/rateLimit.d.ts +11 -3
- package/dist/rateLimit.d.ts.map +1 -1
- package/dist/rateLimit.js +7 -12
- package/dist/{adapters/redis-client.d.ts → redis-client.d.ts} +5 -2
- package/dist/redis-client.d.ts.map +1 -0
- package/dist/redis-client.js +98 -0
- package/dist/{api/reportError.d.ts → reportError.d.ts} +1 -1
- package/dist/reportError.d.ts.map +1 -0
- package/dist/reportError.js +28 -0
- package/dist/{api/routing → routing}/middleware/RouterMiddleware.d.ts +4 -3
- package/dist/routing/middleware/RouterMiddleware.d.ts.map +1 -0
- package/dist/{api/routing → routing}/middleware/RouterMiddleware.js +1 -1
- package/dist/routing/middleware/middleware.d.ts +48 -0
- package/dist/routing/middleware/middleware.d.ts.map +1 -0
- package/dist/routing/middleware/middleware.js +152 -0
- package/dist/{api/routing → routing}/middleware.d.ts +0 -1
- package/dist/routing/middleware.d.ts.map +1 -0
- package/dist/{api/routing → routing}/middleware.js +1 -2
- package/dist/routing/schema/jwt.d.ts.map +1 -0
- package/dist/routing/schema/jwt.js +13 -0
- package/dist/routing/tsort.d.ts.map +1 -0
- package/dist/routing/tsort.js +51 -0
- package/dist/{api/routing → routing}/utils.d.ts +3 -3
- package/dist/routing/utils.d.ts.map +1 -0
- package/dist/routing/utils.js +45 -0
- package/dist/routing.d.ts +182 -0
- package/dist/routing.d.ts.map +1 -0
- package/dist/routing.js +256 -0
- package/dist/test.d.ts +2 -2
- package/dist/test.d.ts.map +1 -1
- package/dist/test.js +2 -2
- package/dist/util.d.ts.map +1 -0
- package/dist/util.js +14 -0
- package/docs/cluster-storage.md +26 -0
- package/docs/workflow-engine.md +262 -0
- package/examples/query.ts +47 -39
- package/package.json +38 -352
- package/src/CUPS.ts +53 -14
- package/src/ClusterCosmos.ts +1118 -0
- package/src/ClusterServiceBus.ts +242 -0
- package/src/{api/ContextProvider.ts → ContextProvider.ts} +20 -17
- package/src/Emailer/Sendgrid.ts +83 -60
- package/src/Emailer/fake.ts +4 -4
- package/src/MainFiberSet.ts +32 -13
- package/src/QueueMaker/errors.ts +3 -1
- package/src/{adapters/SQL → SQL}/Model.ts +42 -41
- package/src/SQL.ts +1 -0
- package/src/Store/Cosmos/query.ts +218 -54
- package/src/Store/Cosmos.ts +529 -365
- package/src/Store/Disk.ts +112 -70
- package/src/Store/Memory.ts +365 -99
- package/src/Store/SQL/Pg.ts +389 -0
- package/src/Store/SQL/query.ts +603 -0
- package/src/Store/SQL.ts +766 -0
- package/src/Store/codeFilter.ts +8 -6
- package/src/Store/index.ts +25 -10
- package/src/Store/utils.ts +32 -25
- package/src/WorkflowEngineCosmos.ts +749 -0
- package/src/WorkflowEngineSqlite.ts +813 -0
- package/src/arbs.ts +5 -3
- package/src/{adapters/cosmos-client.ts → cosmos-client.ts} +5 -3
- package/src/errorReporter.ts +68 -78
- package/src/fileUtil.ts +1 -1
- package/src/index.ts +2 -1
- package/src/{api/internal → internal}/RequestContextMiddleware.ts +23 -6
- package/src/internal/auth.ts +272 -0
- package/src/{api/internal → internal}/events.ts +22 -13
- package/src/{api/layerUtils.ts → layerUtils.ts} +14 -10
- package/src/logger/jsonLogger.ts +5 -3
- package/src/logger/logFmtLogger.ts +3 -3
- package/src/logger/shared.ts +5 -4
- package/src/middlewares.ts +10 -0
- package/src/{adapters/mongo-client.ts → mongo-client.ts} +4 -2
- package/src/otel.ts +177 -0
- package/src/rateLimit.ts +34 -23
- package/src/{adapters/redis-client.ts → redis-client.ts} +7 -3
- package/src/{api/reportError.ts → reportError.ts} +3 -2
- package/src/{api/routing → routing}/middleware/RouterMiddleware.ts +5 -4
- package/src/routing/middleware/middleware.ts +196 -0
- package/src/routing/middleware.ts +4 -0
- package/src/{api/routing → routing}/schema/jwt.ts +2 -1
- package/src/{api/routing → routing}/utils.ts +2 -1
- package/src/routing.ts +823 -0
- package/src/test.ts +4 -4
- package/src/vitest.ts +1 -1
- package/test/auth.test.ts +101 -0
- package/test/cluster-cosmos.test.ts +612 -0
- package/test/cluster-servicebus.test.ts +180 -0
- package/test/cluster-sqlite.test.ts +205 -0
- package/test/contextProvider.test.ts +15 -12
- package/test/controller.test.ts +28 -32
- package/test/cosmos-query.test.ts +228 -0
- package/test/dist/auth.test.d.ts.map +1 -0
- package/test/dist/cluster-cosmos.test.d.ts.map +1 -0
- package/test/dist/cluster-servicebus.test.d.ts.map +1 -0
- package/test/dist/cluster-sqlite.test.d.ts.map +1 -0
- package/test/dist/contextProvider.test.d.ts.map +1 -1
- package/test/dist/controller.test.d.ts.map +1 -1
- package/test/dist/cosmos-query.test.d.ts.map +1 -0
- package/test/dist/fixtures.d.ts +29 -11
- package/test/dist/fixtures.d.ts.map +1 -1
- package/test/dist/fixtures.js +17 -10
- package/test/dist/query.test.d.ts.map +1 -1
- package/test/dist/rawQuery.test.d.ts.map +1 -1
- package/test/dist/repository-ext.test.d.ts.map +1 -0
- package/test/dist/requires.test.d.ts.map +1 -1
- package/test/dist/router-generator.test.d.ts.map +1 -0
- package/test/dist/routing-interruptibility.test.d.ts.map +1 -0
- package/test/dist/rpc-context-map-streaming.test.d.ts.map +1 -0
- package/test/dist/rpc-e2e-invalidation.test.d.ts.map +1 -0
- package/test/dist/rpc-multi-middleware.test.d.ts.map +1 -1
- package/test/dist/rpc-stream-fullstack.test.d.ts.map +1 -0
- package/test/dist/sql-store.test.d.ts.map +1 -0
- package/test/dist/workflow-engine-cosmos.test.d.ts.map +1 -0
- package/test/dist/workflow-engine-sqlite.test.d.ts.map +1 -0
- package/test/fixtures.ts +16 -9
- package/test/layerUtils.test.ts +2 -2
- package/test/query.test.ts +1130 -41
- package/test/rawQuery.test.ts +340 -22
- package/test/repository-ext.test.ts +426 -0
- package/test/requires.test.ts +10 -5
- package/test/router-generator.test.ts +187 -0
- package/test/routing-interruptibility.test.ts +66 -0
- package/test/rpc-context-map-streaming.test.ts +262 -0
- package/test/rpc-e2e-invalidation.test.ts +418 -0
- package/test/rpc-multi-middleware.test.ts +85 -10
- package/test/rpc-stream-fullstack.test.ts +304 -0
- package/test/sql-store.test.ts +1711 -0
- package/test/validateSample.test.ts +26 -14
- package/test/workflow-engine-cosmos.test.ts +345 -0
- package/test/workflow-engine-sqlite.test.ts +297 -0
- package/tsconfig.examples.json +1 -1
- package/tsconfig.json +9 -2
- package/tsconfig.src.json +35 -35
- package/tsconfig.test.json +2 -2
- package/dist/Emailer/service.d.ts +0 -55
- package/dist/Emailer/service.d.ts.map +0 -1
- package/dist/Emailer/service.js +0 -6
- package/dist/Emailer.d.ts +0 -2
- package/dist/Emailer.d.ts.map +0 -1
- package/dist/Emailer.js +0 -2
- package/dist/Model/Repository/ext.d.ts +0 -41
- package/dist/Model/Repository/ext.d.ts.map +0 -1
- package/dist/Model/Repository/ext.js +0 -65
- package/dist/Model/Repository/internal/internal.d.ts +0 -59
- package/dist/Model/Repository/internal/internal.d.ts.map +0 -1
- package/dist/Model/Repository/internal/internal.js +0 -316
- package/dist/Model/Repository/legacy.d.ts +0 -19
- package/dist/Model/Repository/legacy.d.ts.map +0 -1
- package/dist/Model/Repository/legacy.js +0 -2
- package/dist/Model/Repository/makeRepo.d.ts +0 -49
- package/dist/Model/Repository/makeRepo.d.ts.map +0 -1
- package/dist/Model/Repository/makeRepo.js +0 -24
- package/dist/Model/Repository/service.d.ts +0 -89
- package/dist/Model/Repository/service.d.ts.map +0 -1
- package/dist/Model/Repository/service.js +0 -2
- package/dist/Model/Repository/validation.d.ts +0 -42
- package/dist/Model/Repository/validation.d.ts.map +0 -1
- package/dist/Model/Repository/validation.js +0 -32
- package/dist/Model/Repository.d.ts +0 -6
- package/dist/Model/Repository.d.ts.map +0 -1
- package/dist/Model/Repository.js +0 -6
- package/dist/Model/dsl.d.ts +0 -32
- package/dist/Model/dsl.d.ts.map +0 -1
- package/dist/Model/dsl.js +0 -44
- package/dist/Model/filter/filterApi.d.ts +0 -30
- package/dist/Model/filter/filterApi.d.ts.map +0 -1
- package/dist/Model/filter/filterApi.js +0 -2
- package/dist/Model/filter/types/errors.d.ts +0 -29
- package/dist/Model/filter/types/errors.d.ts.map +0 -1
- package/dist/Model/filter/types/errors.js +0 -2
- package/dist/Model/filter/types/fields.d.ts +0 -15
- package/dist/Model/filter/types/fields.d.ts.map +0 -1
- package/dist/Model/filter/types/fields.js +0 -2
- package/dist/Model/filter/types/path/common.d.ts +0 -316
- package/dist/Model/filter/types/path/common.d.ts.map +0 -1
- package/dist/Model/filter/types/path/common.js +0 -2
- package/dist/Model/filter/types/path/eager.d.ts +0 -95
- package/dist/Model/filter/types/path/eager.d.ts.map +0 -1
- package/dist/Model/filter/types/path/eager.js +0 -31
- package/dist/Model/filter/types/path/index.d.ts +0 -4
- package/dist/Model/filter/types/path/index.d.ts.map +0 -1
- package/dist/Model/filter/types/path/index.js +0 -3
- package/dist/Model/filter/types/utils.d.ts +0 -79
- package/dist/Model/filter/types/utils.d.ts.map +0 -1
- package/dist/Model/filter/types/utils.js +0 -2
- package/dist/Model/filter/types/validator.d.ts +0 -30
- package/dist/Model/filter/types/validator.d.ts.map +0 -1
- package/dist/Model/filter/types/validator.js +0 -2
- package/dist/Model/filter/types.d.ts +0 -5
- package/dist/Model/filter/types.d.ts.map +0 -1
- package/dist/Model/filter/types.js +0 -7
- package/dist/Model/query/dsl.d.ts +0 -248
- package/dist/Model/query/dsl.d.ts.map +0 -1
- package/dist/Model/query/dsl.js +0 -104
- package/dist/Model/query/new-kid-interpreter.d.ts +0 -28
- package/dist/Model/query/new-kid-interpreter.d.ts.map +0 -1
- package/dist/Model/query/new-kid-interpreter.js +0 -165
- package/dist/Model/query.d.ts +0 -15
- package/dist/Model/query.d.ts.map +0 -1
- package/dist/Model/query.js +0 -3
- package/dist/Model.d.ts +0 -4
- package/dist/Model.d.ts.map +0 -1
- package/dist/Model.js +0 -4
- package/dist/Operations.d.ts +0 -55
- package/dist/Operations.d.ts.map +0 -1
- package/dist/Operations.js +0 -102
- package/dist/OperationsRepo.d.ts +0 -41
- package/dist/OperationsRepo.d.ts.map +0 -1
- package/dist/OperationsRepo.js +0 -14
- package/dist/QueueMaker/SQLQueue.d.ts +0 -16
- package/dist/QueueMaker/SQLQueue.d.ts.map +0 -1
- package/dist/QueueMaker/SQLQueue.js +0 -130
- package/dist/QueueMaker/memQueue.d.ts +0 -11
- package/dist/QueueMaker/memQueue.d.ts.map +0 -1
- package/dist/QueueMaker/memQueue.js +0 -76
- package/dist/QueueMaker/sbqueue.d.ts +0 -12
- package/dist/QueueMaker/sbqueue.d.ts.map +0 -1
- package/dist/QueueMaker/sbqueue.js +0 -91
- package/dist/QueueMaker/service.d.ts +0 -11
- package/dist/QueueMaker/service.d.ts.map +0 -1
- package/dist/QueueMaker/service.js +0 -4
- package/dist/RequestContext.d.ts +0 -63
- package/dist/RequestContext.d.ts.map +0 -1
- package/dist/RequestContext.js +0 -49
- package/dist/RequestFiberSet.d.ts +0 -36
- package/dist/RequestFiberSet.d.ts.map +0 -1
- package/dist/RequestFiberSet.js +0 -78
- package/dist/Store/ContextMapContainer.d.ts +0 -14
- package/dist/Store/ContextMapContainer.d.ts.map +0 -1
- package/dist/Store/ContextMapContainer.js +0 -16
- package/dist/Store/service.d.ts +0 -108
- package/dist/Store/service.d.ts.map +0 -1
- package/dist/Store/service.js +0 -71
- package/dist/Store.d.ts +0 -2
- package/dist/Store.d.ts.map +0 -1
- package/dist/Store.js +0 -2
- package/dist/adapters/SQL/Model.d.ts.map +0 -1
- package/dist/adapters/SQL/Model.js +0 -478
- package/dist/adapters/SQL.d.ts.map +0 -1
- package/dist/adapters/ServiceBus.d.ts +0 -58
- package/dist/adapters/ServiceBus.d.ts.map +0 -1
- package/dist/adapters/ServiceBus.js +0 -99
- package/dist/adapters/cosmos-client.d.ts.map +0 -1
- package/dist/adapters/cosmos-client.js +0 -9
- package/dist/adapters/index.d.ts +0 -2
- package/dist/adapters/index.d.ts.map +0 -1
- package/dist/adapters/index.js +0 -2
- package/dist/adapters/logger.d.ts +0 -9
- package/dist/adapters/logger.d.ts.map +0 -1
- package/dist/adapters/logger.js +0 -3
- package/dist/adapters/memQueue.d.ts +0 -13
- package/dist/adapters/memQueue.d.ts.map +0 -1
- package/dist/adapters/memQueue.js +0 -20
- package/dist/adapters/mongo-client.d.ts.map +0 -1
- package/dist/adapters/mongo-client.js +0 -13
- package/dist/adapters/redis-client.d.ts.map +0 -1
- package/dist/adapters/redis-client.js +0 -94
- package/dist/api/ContextProvider.d.ts +0 -31
- package/dist/api/ContextProvider.d.ts.map +0 -1
- package/dist/api/ContextProvider.js +0 -38
- package/dist/api/codec.d.ts.map +0 -1
- package/dist/api/codec.js +0 -5
- package/dist/api/internal/RequestContextMiddleware.d.ts +0 -5
- package/dist/api/internal/RequestContextMiddleware.d.ts.map +0 -1
- package/dist/api/internal/RequestContextMiddleware.js +0 -35
- package/dist/api/internal/auth.d.ts +0 -15
- package/dist/api/internal/auth.d.ts.map +0 -1
- package/dist/api/internal/auth.js +0 -47
- package/dist/api/internal/events.d.ts +0 -9
- package/dist/api/internal/events.d.ts.map +0 -1
- package/dist/api/internal/events.js +0 -42
- package/dist/api/internal/health.d.ts.map +0 -1
- package/dist/api/internal/health.js +0 -5
- package/dist/api/layerUtils.d.ts.map +0 -1
- package/dist/api/layerUtils.js +0 -16
- package/dist/api/middlewares.d.ts.map +0 -1
- package/dist/api/reportError.d.ts.map +0 -1
- package/dist/api/reportError.js +0 -27
- package/dist/api/routing/middleware/RouterMiddleware.d.ts.map +0 -1
- package/dist/api/routing/middleware/middleware.d.ts +0 -9
- package/dist/api/routing/middleware/middleware.d.ts.map +0 -1
- package/dist/api/routing/middleware/middleware.js +0 -92
- package/dist/api/routing/middleware.d.ts.map +0 -1
- package/dist/api/routing/schema/jwt.d.ts.map +0 -1
- package/dist/api/routing/schema/jwt.js +0 -12
- package/dist/api/routing/tsort.d.ts.map +0 -1
- package/dist/api/routing/tsort.js +0 -51
- package/dist/api/routing/utils.d.ts.map +0 -1
- package/dist/api/routing/utils.js +0 -44
- package/dist/api/routing.d.ts +0 -138
- package/dist/api/routing.d.ts.map +0 -1
- package/dist/api/routing.js +0 -166
- package/dist/api/setupRequest.d.ts +0 -12
- package/dist/api/setupRequest.d.ts.map +0 -1
- package/dist/api/setupRequest.js +0 -44
- package/dist/api/util.d.ts.map +0 -1
- package/dist/api/util.js +0 -14
- package/eslint.config.mjs +0 -24
- package/src/Emailer/service.ts +0 -52
- package/src/Emailer.ts +0 -1
- package/src/Model/Repository/ext.ts +0 -283
- package/src/Model/Repository/internal/internal.ts +0 -577
- package/src/Model/Repository/legacy.ts +0 -27
- package/src/Model/Repository/makeRepo.ts +0 -139
- package/src/Model/Repository/service.ts +0 -627
- package/src/Model/Repository/validation.ts +0 -31
- package/src/Model/Repository.ts +0 -5
- package/src/Model/dsl.ts +0 -128
- package/src/Model/filter/filterApi.ts +0 -60
- package/src/Model/filter/types/errors.ts +0 -47
- package/src/Model/filter/types/fields.ts +0 -50
- package/src/Model/filter/types/path/common.ts +0 -404
- package/src/Model/filter/types/path/eager.ts +0 -298
- package/src/Model/filter/types/path/index.ts +0 -4
- package/src/Model/filter/types/utils.ts +0 -128
- package/src/Model/filter/types/validator.ts +0 -46
- package/src/Model/filter/types.ts +0 -6
- package/src/Model/query/dsl.ts +0 -2110
- package/src/Model/query/new-kid-interpreter.ts +0 -210
- package/src/Model/query.ts +0 -13
- package/src/Model.ts +0 -3
- package/src/Operations.ts +0 -235
- package/src/OperationsRepo.ts +0 -16
- package/src/QueueMaker/SQLQueue.ts +0 -189
- package/src/QueueMaker/memQueue.ts +0 -130
- package/src/QueueMaker/sbqueue.ts +0 -137
- package/src/QueueMaker/service.ts +0 -17
- package/src/RequestContext.ts +0 -63
- package/src/RequestFiberSet.ts +0 -105
- package/src/Store/ContextMapContainer.ts +0 -20
- package/src/Store/index.test.ts.bak +0 -112
- package/src/Store/service.ts +0 -184
- package/src/Store.ts +0 -1
- package/src/adapters/SQL.ts +0 -1
- package/src/adapters/ServiceBus.ts +0 -209
- package/src/adapters/index.ts +0 -0
- package/src/adapters/logger.ts +0 -3
- package/src/adapters/memQueue.ts +0 -21
- package/src/api/internal/auth.ts +0 -68
- package/src/api/middlewares.ts +0 -10
- package/src/api/routing/middleware/middleware.ts +0 -128
- package/src/api/routing/middleware.ts +0 -6
- package/src/api/routing.ts +0 -598
- package/src/api/setupRequest.ts +0 -84
- package/tsconfig.json.bak +0 -12
- /package/dist/{adapters/SQL.d.ts → SQL.d.ts} +0 -0
- /package/dist/{api/codec.d.ts → codec.d.ts} +0 -0
- /package/dist/{api/internal → internal}/health.d.ts +0 -0
- /package/dist/{api/middlewares.d.ts → middlewares.d.ts} +0 -0
- /package/dist/{api/routing → routing}/schema/jwt.d.ts +0 -0
- /package/dist/{api/routing → routing}/tsort.d.ts +0 -0
- /package/dist/{api/util.d.ts → util.d.ts} +0 -0
- /package/src/{api/codec.ts → codec.ts} +0 -0
- /package/src/{api/internal → internal}/health.ts +0 -0
- /package/src/{api/routing → routing}/tsort.ts +0 -0
- /package/src/{api/util.ts → util.ts} +0 -0
package/src/Store/service.ts
DELETED
|
@@ -1,184 +0,0 @@
|
|
|
1
|
-
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
2
|
-
import type { UniqueKey } from "@azure/cosmos"
|
|
3
|
-
import { Effect, type NonEmptyReadonlyArray, type Option, type Redacted, ServiceMap } from "effect-app"
|
|
4
|
-
import type { OptimisticConcurrencyException } from "../errors.js"
|
|
5
|
-
import type { FilterResult } from "../Model/filter/filterApi.js"
|
|
6
|
-
import type { FieldValues } from "../Model/filter/types.js"
|
|
7
|
-
import type { FieldPath } from "../Model/filter/types/path/index.js"
|
|
8
|
-
import { type RawQuery } from "../Model/query.js"
|
|
9
|
-
|
|
10
|
-
export interface StoreConfig<E> {
|
|
11
|
-
partitionValue: (e?: E) => string
|
|
12
|
-
/**
|
|
13
|
-
* Primarily used for testing, creating namespaces in the database to separate data e.g to run multiple tests in isolation within the same database
|
|
14
|
-
* currently only supported in disk/memory. CosmosDB is TODO.
|
|
15
|
-
*/
|
|
16
|
-
allowNamespace?: (namespace: string) => boolean
|
|
17
|
-
/**
|
|
18
|
-
* just in time migrations, supported by the database driver, supporting queries, for simple default values
|
|
19
|
-
*/
|
|
20
|
-
defaultValues?: Partial<E>
|
|
21
|
-
|
|
22
|
-
/**
|
|
23
|
-
* How many items can be processed in one batch at a time.
|
|
24
|
-
* Defaults to 100 for CosmosDB.
|
|
25
|
-
*/
|
|
26
|
-
maxBulkSize?: number
|
|
27
|
-
|
|
28
|
-
/**
|
|
29
|
-
* Unique indexes, mainly for CosmosDB
|
|
30
|
-
*/
|
|
31
|
-
uniqueKeys?: UniqueKey[]
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
export type SupportedValues = string | boolean | number | null
|
|
35
|
-
export type SupportedValues2 = string | boolean | number
|
|
36
|
-
|
|
37
|
-
// default is eq
|
|
38
|
-
export type Where =
|
|
39
|
-
| { key: string; t?: "eq" | "not-eq"; value: SupportedValues }
|
|
40
|
-
| { key: string; t: "gt" | "lt" | "gte" | "lte"; value: SupportedValues2 }
|
|
41
|
-
| {
|
|
42
|
-
key: string
|
|
43
|
-
t: "contains" | "starts-with" | "ends-with" | "not-contains" | "not-starts-with" | "not-ends-with"
|
|
44
|
-
value: string
|
|
45
|
-
}
|
|
46
|
-
| { key: string; t: "includes" | "not-includes"; value: string }
|
|
47
|
-
| {
|
|
48
|
-
key: string
|
|
49
|
-
t: "in" | "not-in"
|
|
50
|
-
value: readonly (SupportedValues)[]
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
export type Filter = readonly FilterResult[]
|
|
54
|
-
|
|
55
|
-
export interface O<TFieldValues extends FieldValues> {
|
|
56
|
-
key: FieldPath<TFieldValues>
|
|
57
|
-
direction: "ASC" | "DESC"
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
export interface FilterArgs<Encoded extends FieldValues, U extends keyof Encoded = never> {
|
|
61
|
-
t: Encoded
|
|
62
|
-
filter?: Filter | undefined
|
|
63
|
-
select?: NonEmptyReadonlyArray<U | { key: string; subKeys: readonly string[] }> | undefined
|
|
64
|
-
order?: NonEmptyReadonlyArray<O<NoInfer<Encoded>>>
|
|
65
|
-
limit?: number | undefined
|
|
66
|
-
skip?: number | undefined
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
export type FilterFunc<Encoded extends FieldValues> = <U extends keyof Encoded = never>(
|
|
70
|
-
args: FilterArgs<Encoded, U>
|
|
71
|
-
) => Effect.Effect<(U extends undefined ? Encoded : Pick<Encoded, U>)[]>
|
|
72
|
-
|
|
73
|
-
export interface Store<
|
|
74
|
-
IdKey extends keyof Encoded,
|
|
75
|
-
Encoded extends FieldValues,
|
|
76
|
-
PM extends PersistenceModelType<Encoded> = PersistenceModelType<Encoded>
|
|
77
|
-
> {
|
|
78
|
-
all: Effect.Effect<PM[]>
|
|
79
|
-
filter: FilterFunc<Encoded>
|
|
80
|
-
find: (id: Encoded[IdKey]) => Effect.Effect<Option.Option<PM>>
|
|
81
|
-
set: (e: PM) => Effect.Effect<PM, OptimisticConcurrencyException>
|
|
82
|
-
batchSet: (
|
|
83
|
-
items: NonEmptyReadonlyArray<PM>
|
|
84
|
-
) => Effect.Effect<NonEmptyReadonlyArray<PM>, OptimisticConcurrencyException>
|
|
85
|
-
bulkSet: (
|
|
86
|
-
items: NonEmptyReadonlyArray<PM>
|
|
87
|
-
) => Effect.Effect<NonEmptyReadonlyArray<PM>, OptimisticConcurrencyException>
|
|
88
|
-
batchRemove: (ids: NonEmptyReadonlyArray<Encoded[IdKey]>, partitionKey?: string) => Effect.Effect<void>
|
|
89
|
-
queryRaw: <Out>(query: RawQuery<Encoded, Out>) => Effect.Effect<readonly Out[]>
|
|
90
|
-
}
|
|
91
|
-
|
|
92
|
-
export class StoreMaker extends ServiceMap.Opaque<StoreMaker, {
|
|
93
|
-
make: <IdKey extends keyof Encoded, Encoded extends FieldValues, R = never, E = never>(
|
|
94
|
-
name: string,
|
|
95
|
-
idKey: IdKey,
|
|
96
|
-
seed?: Effect.Effect<Iterable<Encoded>, E, R>,
|
|
97
|
-
config?: StoreConfig<Encoded>
|
|
98
|
-
) => Effect.Effect<Store<IdKey, Encoded>, E, R>
|
|
99
|
-
}>()("effect-app/StoreMaker") {
|
|
100
|
-
}
|
|
101
|
-
|
|
102
|
-
export const makeContextMap = () => {
|
|
103
|
-
const etags = new Map<string, string>()
|
|
104
|
-
const getEtag = (id: string) => etags.get(id)
|
|
105
|
-
const setEtag = (id: string, eTag: string | undefined) => {
|
|
106
|
-
if (eTag === undefined) {
|
|
107
|
-
etags.delete(id)
|
|
108
|
-
} else {
|
|
109
|
-
etags.set(id, eTag)
|
|
110
|
-
}
|
|
111
|
-
}
|
|
112
|
-
|
|
113
|
-
// const parsedCache = new Map<
|
|
114
|
-
// Parser<any, any, any>,
|
|
115
|
-
// Map<unknown, These.These<unknown, unknown>>
|
|
116
|
-
// >()
|
|
117
|
-
|
|
118
|
-
// const parserCache = new Map<
|
|
119
|
-
// Parser<any, any, any>,
|
|
120
|
-
// (i: any) => These.These<any, any>
|
|
121
|
-
// >()
|
|
122
|
-
|
|
123
|
-
// const setAndReturn = <I, E, A>(
|
|
124
|
-
// p: Parser<I, E, A>,
|
|
125
|
-
// np: (i: I) => These.These<E, A>
|
|
126
|
-
// ) => {
|
|
127
|
-
// parserCache.set(p, np)
|
|
128
|
-
// return np
|
|
129
|
-
// }
|
|
130
|
-
|
|
131
|
-
// const parserEnv: ParserEnv = {
|
|
132
|
-
// // TODO: lax: true would turn off refinement checks, may help on large payloads
|
|
133
|
-
// // but of course removes confirming of validation rules (which may be okay for a database owned by the app, as we write safely)
|
|
134
|
-
// lax: false,
|
|
135
|
-
// cache: {
|
|
136
|
-
// getOrSetParser: (p) => parserCache.get(p) ?? setAndReturn(p, (i) => parserEnv.cache!.getOrSet(i, p)),
|
|
137
|
-
// getOrSetParsers: (parsers) => {
|
|
138
|
-
// return Object.entries(parsers).reduce((prev, [k, v]) => {
|
|
139
|
-
// prev[k] = parserEnv.cache!.getOrSetParser(v)
|
|
140
|
-
// return prev
|
|
141
|
-
// }, {} as any)
|
|
142
|
-
// },
|
|
143
|
-
// getOrSet: (i, parse): any => {
|
|
144
|
-
// const c = parsedCache.get(parse)
|
|
145
|
-
// if (c) {
|
|
146
|
-
// const f = c.get(i)
|
|
147
|
-
// if (f) {
|
|
148
|
-
// // console.log("$$$ cache hit", i)
|
|
149
|
-
// return f
|
|
150
|
-
// } else {
|
|
151
|
-
// const nf = parse(i, parserEnv)
|
|
152
|
-
// c.set(i, nf)
|
|
153
|
-
// return nf
|
|
154
|
-
// }
|
|
155
|
-
// } else {
|
|
156
|
-
// const nf = parse(i, parserEnv)
|
|
157
|
-
// parsedCache.set(parse, new Map([[i, nf]]))
|
|
158
|
-
// return nf
|
|
159
|
-
// }
|
|
160
|
-
// }
|
|
161
|
-
// }
|
|
162
|
-
// }
|
|
163
|
-
|
|
164
|
-
return {
|
|
165
|
-
get: getEtag,
|
|
166
|
-
set: setEtag
|
|
167
|
-
// parserEnv
|
|
168
|
-
}
|
|
169
|
-
}
|
|
170
|
-
|
|
171
|
-
const makeMap = Effect.sync(() => makeContextMap())
|
|
172
|
-
|
|
173
|
-
export class ContextMap extends ServiceMap.Opaque<ContextMap>()("effect-app/ContextMap", { make: makeMap }) {
|
|
174
|
-
}
|
|
175
|
-
|
|
176
|
-
export type PersistenceModelType<Encoded extends object> = Encoded & {
|
|
177
|
-
_etag?: string | undefined
|
|
178
|
-
}
|
|
179
|
-
|
|
180
|
-
export interface StorageConfig {
|
|
181
|
-
url: Redacted.Redacted<string>
|
|
182
|
-
prefix: string
|
|
183
|
-
dbName: string
|
|
184
|
-
}
|
package/src/Store.ts
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export * from "./Store/service.js"
|
package/src/adapters/SQL.ts
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export * as SQLModel from "./SQL/Model.js"
|
|
@@ -1,209 +0,0 @@
|
|
|
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 { Cause, Effect, Exit, FiberSet, Layer, type Scope, ServiceMap } from "effect-app"
|
|
4
|
-
import { InfraLogger } from "../logger.js"
|
|
5
|
-
|
|
6
|
-
const withSpanAndLog = (name: string) => <A, E, R>(self: Effect.Effect<A, E, R>) =>
|
|
7
|
-
Effect.logInfo(name).pipe(
|
|
8
|
-
Effect.andThen(self),
|
|
9
|
-
Effect.tap(Effect.logInfo(name + " done")),
|
|
10
|
-
Effect.withLogSpan(name),
|
|
11
|
-
Effect.withSpan(name)
|
|
12
|
-
)
|
|
13
|
-
|
|
14
|
-
function makeClient(url: string) {
|
|
15
|
-
return Effect.acquireRelease(
|
|
16
|
-
Effect.sync(() => new ServiceBusClient(url)).pipe(withSpanAndLog("ServiceBus.client.create")),
|
|
17
|
-
(client) => Effect.promise(() => client.close()).pipe(withSpanAndLog("ServiceBus.client.close"))
|
|
18
|
-
)
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
export class ServiceBusClientTag
|
|
22
|
-
extends ServiceMap.Opaque<ServiceBusClientTag, ServiceBusClient>()("@services/Client", { make: makeClient })
|
|
23
|
-
{
|
|
24
|
-
static readonly layer = (url: string) => this.toLayer(this.make(url))
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
function makeSender_(queueName: string) {
|
|
28
|
-
return Effect.gen(function*() {
|
|
29
|
-
const serviceBusClient = yield* ServiceBusClientTag
|
|
30
|
-
|
|
31
|
-
return yield* Effect.acquireRelease(
|
|
32
|
-
Effect.sync(() => serviceBusClient.createSender(queueName)).pipe(
|
|
33
|
-
withSpanAndLog(`ServiceBus.sender.create ${queueName}`)
|
|
34
|
-
),
|
|
35
|
-
(sender) => Effect.promise(() => sender.close()).pipe(withSpanAndLog(`ServiceBus.sender.close ${queueName}`))
|
|
36
|
-
)
|
|
37
|
-
})
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
const makeSender = (name: string) =>
|
|
41
|
-
Effect.gen(function*() {
|
|
42
|
-
const sender = yield* makeSender_(name)
|
|
43
|
-
const sendMessages = Effect.fnUntraced(function*(
|
|
44
|
-
messages: ServiceBusMessage | ServiceBusMessage[] | ServiceBusMessageBatch,
|
|
45
|
-
options?: Omit<OperationOptionsBase, "abortSignal">
|
|
46
|
-
) {
|
|
47
|
-
return yield* Effect.promise((abortSignal) => sender.sendMessages(messages, { ...options, abortSignal }))
|
|
48
|
-
})
|
|
49
|
-
|
|
50
|
-
return { name, sendMessages }
|
|
51
|
-
})
|
|
52
|
-
|
|
53
|
-
export class Sender extends ServiceMap.Opaque<Sender, {
|
|
54
|
-
name: string
|
|
55
|
-
sendMessages: (
|
|
56
|
-
messages: ServiceBusMessage | ServiceBusMessage[] | ServiceBusMessageBatch,
|
|
57
|
-
options?: Omit<OperationOptionsBase, "abortSignal">
|
|
58
|
-
) => Effect.Effect<void, never, never>
|
|
59
|
-
}>()("Sender", { make: makeSender }) {
|
|
60
|
-
static readonly layer = (name: string) => this.toLayer(this.make(name))
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
export const SenderTag = <Id>() => <Key extends string>(queueName: Key) => {
|
|
64
|
-
const tag = ServiceMap.Service<Id, Sender>(`ServiceBus.Sender.${queueName}`)
|
|
65
|
-
|
|
66
|
-
return Object.assign(tag, {
|
|
67
|
-
layer: Layer.effect(
|
|
68
|
-
tag,
|
|
69
|
-
Sender.make(queueName).pipe(Effect.map(Sender.of))
|
|
70
|
-
)
|
|
71
|
-
})
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
const makeReceiver = (name: string) =>
|
|
75
|
-
Effect.gen(function*() {
|
|
76
|
-
const serviceBusClient = yield* ServiceBusClientTag
|
|
77
|
-
|
|
78
|
-
const makeReceiver = Effect.fnUntraced(
|
|
79
|
-
function*(queueName: string, waitTillEmpty: Effect.Effect<void>, sessionId?: string) {
|
|
80
|
-
return yield* Effect.acquireRelease(
|
|
81
|
-
(sessionId
|
|
82
|
-
? Effect.promise(() => serviceBusClient.acceptSession(queueName, sessionId))
|
|
83
|
-
: Effect.sync(() => serviceBusClient.createReceiver(queueName)))
|
|
84
|
-
.pipe(withSpanAndLog(`ServiceBus.receiver.create ${queueName}.${sessionId}`)),
|
|
85
|
-
(r) =>
|
|
86
|
-
waitTillEmpty.pipe(
|
|
87
|
-
withSpanAndLog(`ServiceBus.receiver.waitTillEmpty ${queueName}.${sessionId}`),
|
|
88
|
-
Effect.andThen(
|
|
89
|
-
Effect.promise(() => r.close()).pipe(
|
|
90
|
-
withSpanAndLog(`ServiceBus.receiver.close ${queueName}.${sessionId}`)
|
|
91
|
-
)
|
|
92
|
-
),
|
|
93
|
-
withSpanAndLog(`ServiceBus.receiver.release ${queueName}.${sessionId}`)
|
|
94
|
-
)
|
|
95
|
-
)
|
|
96
|
-
}
|
|
97
|
-
)
|
|
98
|
-
|
|
99
|
-
const make = (waitTillEmpty: Effect.Effect<void>) => makeReceiver(name, waitTillEmpty)
|
|
100
|
-
|
|
101
|
-
const makeSession = (sessionId: string, waitTillEmpty: Effect.Effect<void>) =>
|
|
102
|
-
makeReceiver(name, waitTillEmpty, sessionId)
|
|
103
|
-
|
|
104
|
-
return {
|
|
105
|
-
name,
|
|
106
|
-
make,
|
|
107
|
-
makeSession,
|
|
108
|
-
subscribe: Effect.fnUntraced(function*<RMsg, RErr>(hndlr: MessageHandlers<RMsg, RErr>, sessionId?: string) {
|
|
109
|
-
const fs = yield* FiberSet.make()
|
|
110
|
-
const fr = yield* FiberSet.runtime(fs)<RMsg | RErr>()
|
|
111
|
-
const wait = Effect
|
|
112
|
-
.gen(function*() {
|
|
113
|
-
if ((yield* FiberSet.size(fs)) > 0) {
|
|
114
|
-
yield* InfraLogger.logDebug("Waiting ServiceBusFiberSet to be empty: " + (yield* FiberSet.size(fs)))
|
|
115
|
-
}
|
|
116
|
-
while ((yield* FiberSet.size(fs)) > 0) yield* Effect.sleep("250 millis")
|
|
117
|
-
})
|
|
118
|
-
const r = yield* sessionId
|
|
119
|
-
? makeSession(
|
|
120
|
-
sessionId,
|
|
121
|
-
wait
|
|
122
|
-
)
|
|
123
|
-
: make(wait)
|
|
124
|
-
|
|
125
|
-
const runEffect = <E>(effect: Effect.Effect<void, E, RMsg | RErr>) =>
|
|
126
|
-
new Promise<void>((resolve, reject) =>
|
|
127
|
-
fr(effect)
|
|
128
|
-
.addObserver((exit) => {
|
|
129
|
-
if (Exit.isSuccess(exit)) {
|
|
130
|
-
resolve(exit.value)
|
|
131
|
-
} else {
|
|
132
|
-
// disable @typescript-eslint/prefer-promise-reject-errors
|
|
133
|
-
reject(Cause.pretty(exit.cause))
|
|
134
|
-
}
|
|
135
|
-
})
|
|
136
|
-
)
|
|
137
|
-
|
|
138
|
-
yield* Effect.acquireRelease(
|
|
139
|
-
Effect
|
|
140
|
-
.sync(() => {
|
|
141
|
-
const s = r
|
|
142
|
-
.subscribe({
|
|
143
|
-
processError: (err) =>
|
|
144
|
-
runEffect(
|
|
145
|
-
hndlr
|
|
146
|
-
.processError(err)
|
|
147
|
-
.pipe(
|
|
148
|
-
Effect.catchCause((cause) => Effect.logError(`ServiceBus Error ${sessionId}`, cause))
|
|
149
|
-
)
|
|
150
|
-
),
|
|
151
|
-
processMessage: (msg) => runEffect(hndlr.processMessage(msg))
|
|
152
|
-
// DO NOT CATCH ERRORS here as they should return to the queue!
|
|
153
|
-
})
|
|
154
|
-
return { close: Effect.promise(() => s.close()) }
|
|
155
|
-
})
|
|
156
|
-
.pipe(withSpanAndLog(`ServiceBus.subscription.create ${sessionId}`)),
|
|
157
|
-
(subscription) =>
|
|
158
|
-
subscription.close.pipe(
|
|
159
|
-
withSpanAndLog(`ServiceBus.subscription.close ${sessionId}`)
|
|
160
|
-
)
|
|
161
|
-
) as Effect.Effect<void, never, Scope.Scope> // wth is going on here
|
|
162
|
-
})
|
|
163
|
-
}
|
|
164
|
-
})
|
|
165
|
-
|
|
166
|
-
export class Receiver extends ServiceMap.Opaque<Receiver, {
|
|
167
|
-
name: string
|
|
168
|
-
make: (waitTillEmpty: Effect.Effect<void>) => Effect.Effect<ServiceBusReceiver, never, Scope.Scope>
|
|
169
|
-
makeSession: (
|
|
170
|
-
sessionId: string,
|
|
171
|
-
waitTillEmpty: Effect.Effect<void>
|
|
172
|
-
) => Effect.Effect<ServiceBusReceiver, never, Scope.Scope>
|
|
173
|
-
subscribe<RMsg, RErr>(
|
|
174
|
-
hndlr: MessageHandlers<RMsg, RErr>,
|
|
175
|
-
sessionId?: string
|
|
176
|
-
): Effect.Effect<void, never, Scope.Scope | RMsg | RErr>
|
|
177
|
-
}>()("Receiver") {
|
|
178
|
-
static readonly make = makeReceiver
|
|
179
|
-
static readonly layer = (name: string) => this.toLayer(makeReceiver(name))
|
|
180
|
-
}
|
|
181
|
-
|
|
182
|
-
export const ReceiverTag = <Id>() => <Key extends string>(queueName: Key) => {
|
|
183
|
-
const tag = ServiceMap.Service<Id, Receiver>(`ServiceBus.Receiver.${queueName}`)
|
|
184
|
-
|
|
185
|
-
return Object.assign(tag, {
|
|
186
|
-
layer: Layer.effect(
|
|
187
|
-
tag,
|
|
188
|
-
makeReceiver(queueName).pipe(Effect.map(Receiver.of))
|
|
189
|
-
)
|
|
190
|
-
})
|
|
191
|
-
}
|
|
192
|
-
|
|
193
|
-
export const SenderReceiver = (queue: string, queueDrain?: string) =>
|
|
194
|
-
Layer.mergeAll(Sender.layer(queue), Receiver.layer(queueDrain ?? queue))
|
|
195
|
-
|
|
196
|
-
export interface MessageHandlers<RMsg, RErr> {
|
|
197
|
-
/**
|
|
198
|
-
* Handler that processes messages from service bus.
|
|
199
|
-
*
|
|
200
|
-
* @param message - A message received from Service Bus.
|
|
201
|
-
*/
|
|
202
|
-
processMessage(message: ServiceBusReceivedMessage): Effect.Effect<void, never, RMsg>
|
|
203
|
-
/**
|
|
204
|
-
* Handler that processes errors that occur during receiving.
|
|
205
|
-
* @param args - The error and additional context to indicate where
|
|
206
|
-
* the error originated.
|
|
207
|
-
*/
|
|
208
|
-
processError(args: ProcessErrorArgs): Effect.Effect<void, never, RErr>
|
|
209
|
-
}
|
package/src/adapters/index.ts
DELETED
|
File without changes
|
package/src/adapters/logger.ts
DELETED
package/src/adapters/memQueue.ts
DELETED
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
import { Effect, type Queue, ServiceMap } from "effect-app"
|
|
2
|
-
import * as Q from "effect/Queue"
|
|
3
|
-
|
|
4
|
-
const make = Effect
|
|
5
|
-
.gen(function*() {
|
|
6
|
-
const store = yield* Effect.sync(() => new Map<string, Queue.Queue<string>>())
|
|
7
|
-
|
|
8
|
-
return {
|
|
9
|
-
getOrCreateQueue: Effect.fnUntraced(function*(k: string) {
|
|
10
|
-
const q = store.get(k)
|
|
11
|
-
if (q) return q
|
|
12
|
-
const newQ = yield* Q.unbounded<string>()
|
|
13
|
-
store.set(k, newQ)
|
|
14
|
-
return newQ
|
|
15
|
-
})
|
|
16
|
-
}
|
|
17
|
-
})
|
|
18
|
-
|
|
19
|
-
export class MemQueue extends ServiceMap.Opaque<MemQueue>()("effect-app/MemQueue", { make }) {
|
|
20
|
-
static readonly Live = this.toLayer(this.make)
|
|
21
|
-
}
|
package/src/api/internal/auth.ts
DELETED
|
@@ -1,68 +0,0 @@
|
|
|
1
|
-
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
2
|
-
/* eslint-disable unused-imports/no-unused-vars */
|
|
3
|
-
import { Data, Effect } from "effect-app"
|
|
4
|
-
import { HttpHeaders, HttpMiddleware, HttpServerRequest, HttpServerResponse } from "effect-app/http"
|
|
5
|
-
import { auth, InsufficientScopeError, InvalidRequestError, InvalidTokenError, UnauthorizedError } from "express-oauth2-jwt-bearer"
|
|
6
|
-
|
|
7
|
-
// // Authorization middleware. When used, the Access Token must
|
|
8
|
-
// // exist and be verified against the Auth0 JSON Web Key Set.
|
|
9
|
-
|
|
10
|
-
// type Errors = InsufficientScopeError | InvalidRequestError | InvalidTokenError | UnauthorizedError
|
|
11
|
-
type Config = Parameters<typeof auth>[0]
|
|
12
|
-
export const checkJWTI = (config: Config) => {
|
|
13
|
-
const mw = auth(config)
|
|
14
|
-
return Effect.fnUntraced(function*(headers: HttpHeaders.Headers) {
|
|
15
|
-
return yield* Effect.callback<
|
|
16
|
-
void,
|
|
17
|
-
InsufficientScopeError | InvalidRequestError | InvalidTokenError | UnauthorizedError
|
|
18
|
-
>(
|
|
19
|
-
(resume) => {
|
|
20
|
-
const next = (err?: unknown) => {
|
|
21
|
-
if (!err) return resume(Effect.void)
|
|
22
|
-
if (
|
|
23
|
-
err instanceof InsufficientScopeError
|
|
24
|
-
|| err instanceof InvalidRequestError
|
|
25
|
-
|| err instanceof InvalidTokenError
|
|
26
|
-
|| err instanceof UnauthorizedError
|
|
27
|
-
) {
|
|
28
|
-
return resume(Effect.fail(err))
|
|
29
|
-
}
|
|
30
|
-
return resume(Effect.die(err))
|
|
31
|
-
}
|
|
32
|
-
const r = { headers, query: {}, body: {}, is: () => false, method: "POST" } // is("urlencoded")
|
|
33
|
-
try {
|
|
34
|
-
mw(r as any, {} as any, next)
|
|
35
|
-
} catch (e) {
|
|
36
|
-
return resume(Effect.die(e))
|
|
37
|
-
}
|
|
38
|
-
}
|
|
39
|
-
)
|
|
40
|
-
})
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
export const checkJwt = (config: Config) => {
|
|
44
|
-
const check = checkJWTI(config)
|
|
45
|
-
return HttpMiddleware.make((app) =>
|
|
46
|
-
Effect.gen(function*() {
|
|
47
|
-
const req = yield* HttpServerRequest.HttpServerRequest
|
|
48
|
-
const response = yield* check(req.headers).pipe(Effect.catch((e) =>
|
|
49
|
-
HttpServerResponse.json({ message: e.message }, {
|
|
50
|
-
status: e.status,
|
|
51
|
-
headers: HttpHeaders.fromInput(e.headers)
|
|
52
|
-
})
|
|
53
|
-
))
|
|
54
|
-
if (response) {
|
|
55
|
-
return response
|
|
56
|
-
}
|
|
57
|
-
return yield* app
|
|
58
|
-
})
|
|
59
|
-
)
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
export class JWTError extends Data.TaggedClass("JWTError")<{
|
|
63
|
-
error:
|
|
64
|
-
| InsufficientScopeError
|
|
65
|
-
| InvalidRequestError
|
|
66
|
-
| InvalidTokenError
|
|
67
|
-
| UnauthorizedError
|
|
68
|
-
}> {}
|
package/src/api/middlewares.ts
DELETED
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Mechanism for extendning behaviour of all handlers on the server.
|
|
3
|
-
*
|
|
4
|
-
* @since 1.0.0
|
|
5
|
-
*/
|
|
6
|
-
|
|
7
|
-
export * from "./internal/auth.js"
|
|
8
|
-
export * from "./internal/events.js"
|
|
9
|
-
export * from "./internal/health.js"
|
|
10
|
-
export * from "./internal/RequestContextMiddleware.js"
|
|
@@ -1,128 +0,0 @@
|
|
|
1
|
-
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
2
|
-
import { Cause, Config, Effect, Layer, Schema } from "effect"
|
|
3
|
-
import { ConfigureInterruptibilityMiddleware, DevMode, DevModeMiddleware, LoggerMiddleware, RequestCacheMiddleware } from "effect-app/middleware"
|
|
4
|
-
import { pretty } from "effect-app/utils"
|
|
5
|
-
import { logError, reportError } from "../../../errorReporter.js"
|
|
6
|
-
import { InfraLogger } from "../../../logger.js"
|
|
7
|
-
import { determineMethod, isCommand } from "../utils.js"
|
|
8
|
-
|
|
9
|
-
const logRequestError = logError("Request")
|
|
10
|
-
const reportRequestError = reportError("Request")
|
|
11
|
-
|
|
12
|
-
// TODO: do we need this as middleware or just as layer?
|
|
13
|
-
export const DevModeLive = Layer.effect(
|
|
14
|
-
DevMode,
|
|
15
|
-
Effect.gen(function*() {
|
|
16
|
-
const env = yield* Config.string("env").pipe(Config.withDefault("local-dev"))
|
|
17
|
-
return env !== "prod"
|
|
18
|
-
})
|
|
19
|
-
)
|
|
20
|
-
|
|
21
|
-
export const RequestCacheMiddlewareLive = Layer.succeed(
|
|
22
|
-
RequestCacheMiddleware,
|
|
23
|
-
(effect) => effect
|
|
24
|
-
)
|
|
25
|
-
|
|
26
|
-
const isOptimisticConcurrencyException = (input: unknown) =>
|
|
27
|
-
typeof input === "object" && input !== null && "_tag" in input && input._tag === "OptimisticConcurrencyException"
|
|
28
|
-
|
|
29
|
-
export const ConfigureInterruptibilityMiddlewareLive = Layer.effect(
|
|
30
|
-
ConfigureInterruptibilityMiddleware,
|
|
31
|
-
Effect.gen(function*() {
|
|
32
|
-
const cache = new Map()
|
|
33
|
-
const getCached = (key: string, schema: Schema.Top) => {
|
|
34
|
-
const existing = cache.get(key)
|
|
35
|
-
if (existing) return existing
|
|
36
|
-
const n = determineMethod(key, schema)
|
|
37
|
-
cache.set(key, n)
|
|
38
|
-
return n
|
|
39
|
-
}
|
|
40
|
-
return (effect, { rpc }) => {
|
|
41
|
-
const method = getCached(rpc._tag, rpc.payloadSchema)
|
|
42
|
-
|
|
43
|
-
effect = isCommand(method)
|
|
44
|
-
? Effect.retry(Effect.uninterruptible(effect), { times: 1, while: isOptimisticConcurrencyException })
|
|
45
|
-
: Effect.interruptible(effect)
|
|
46
|
-
|
|
47
|
-
return effect
|
|
48
|
-
}
|
|
49
|
-
})
|
|
50
|
-
)
|
|
51
|
-
|
|
52
|
-
export const LoggerMiddlewareLive = Layer
|
|
53
|
-
.effect(
|
|
54
|
-
LoggerMiddleware,
|
|
55
|
-
Effect.gen(function*() {
|
|
56
|
-
const devMode = yield* DevMode
|
|
57
|
-
return (effect, { headers, payload, rpc }) =>
|
|
58
|
-
Effect
|
|
59
|
-
.annotateCurrentSpan({
|
|
60
|
-
"request.name": rpc._tag,
|
|
61
|
-
"requestInput": typeof payload === "object" && payload !== null
|
|
62
|
-
? Object.entries(payload).reduce((prev, [key, value]: [string, unknown]) => {
|
|
63
|
-
prev[key] = key === "password"
|
|
64
|
-
? "<redacted>"
|
|
65
|
-
: typeof value === "string" || typeof value === "number" || typeof value === "boolean"
|
|
66
|
-
? typeof value === "string" && value.length > 256
|
|
67
|
-
? (value.substring(0, 253) + "...")
|
|
68
|
-
: value
|
|
69
|
-
: Array.isArray(value)
|
|
70
|
-
? `Array[${value.length}]`
|
|
71
|
-
: value === null || value === undefined
|
|
72
|
-
? `${value}`
|
|
73
|
-
: typeof value === "object" && value
|
|
74
|
-
? `Object[${Object.keys(value).length}]`
|
|
75
|
-
: typeof value
|
|
76
|
-
return prev
|
|
77
|
-
}, {} as Record<string, string | number | boolean>)
|
|
78
|
-
: payload
|
|
79
|
-
})
|
|
80
|
-
.pipe(
|
|
81
|
-
Effect.andThen(effect),
|
|
82
|
-
// TODO: support SchemaError if the error channel of the request allows it.. but who would want that?
|
|
83
|
-
Effect.catch((_) => Schema.isSchemaError(_) ? Effect.die(_) : Effect.fail(_)),
|
|
84
|
-
Effect.tapCause((cause) => Cause.hasFails(cause) ? logRequestError(cause) : Effect.void),
|
|
85
|
-
Effect.tapCauseIf(Cause.hasDies, (cause) =>
|
|
86
|
-
Effect
|
|
87
|
-
.all([
|
|
88
|
-
reportRequestError(cause, {
|
|
89
|
-
action: rpc._tag
|
|
90
|
-
}),
|
|
91
|
-
InfraLogger
|
|
92
|
-
.logError("Finished request", cause)
|
|
93
|
-
.pipe(Effect.annotateLogs({
|
|
94
|
-
action: rpc._tag,
|
|
95
|
-
req: pretty(payload),
|
|
96
|
-
headers: pretty(headers)
|
|
97
|
-
// resHeaders: pretty(
|
|
98
|
-
// Object
|
|
99
|
-
// .entries(headers)
|
|
100
|
-
// .reduce((prev, [key, value]) => {
|
|
101
|
-
// prev[key] = value && typeof value === "string" ? snipString(value) : value
|
|
102
|
-
// return prev
|
|
103
|
-
// }, {} as Record<string, any>)
|
|
104
|
-
// )
|
|
105
|
-
}))
|
|
106
|
-
])),
|
|
107
|
-
devMode ? (_) => _ : Effect.catchDefect(() => Effect.die("Internal Server Error"))
|
|
108
|
-
)
|
|
109
|
-
})
|
|
110
|
-
)
|
|
111
|
-
.pipe(Layer.provide(DevModeLive))
|
|
112
|
-
|
|
113
|
-
export const DevModeMiddlewareLive = Layer
|
|
114
|
-
.effect(
|
|
115
|
-
DevModeMiddleware,
|
|
116
|
-
Effect.gen(function*() {
|
|
117
|
-
const devMode = yield* DevMode
|
|
118
|
-
return (effect) => Effect.provideService(effect, DevMode, devMode)
|
|
119
|
-
})
|
|
120
|
-
)
|
|
121
|
-
.pipe(Layer.provide(DevModeLive))
|
|
122
|
-
|
|
123
|
-
export const DefaultGenericMiddlewaresLive = Layer.mergeAll(
|
|
124
|
-
RequestCacheMiddlewareLive,
|
|
125
|
-
ConfigureInterruptibilityMiddlewareLive,
|
|
126
|
-
LoggerMiddlewareLive,
|
|
127
|
-
DevModeMiddlewareLive
|
|
128
|
-
)
|