@bett3r-dev/pv3 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/adapters/cache/index.d.ts +2 -0
- package/build/adapters/cache/index.d.ts.map +1 -0
- package/build/adapters/cache/index.js +18 -0
- package/build/adapters/cache/index.js.map +1 -0
- package/build/adapters/cache/memory/__tests__/memoryCache.test.d.ts +1 -0
- package/build/adapters/cache/memory/__tests__/memoryCache.test.d.ts.map +1 -0
- package/build/adapters/cache/memory/__tests__/memoryCache.test.js +6 -0
- package/build/adapters/cache/memory/__tests__/memoryCache.test.js.map +1 -0
- package/build/adapters/cache/memory/index.d.ts +3 -0
- package/build/adapters/cache/memory/index.d.ts.map +1 -0
- package/build/adapters/cache/memory/index.js +119 -0
- package/build/adapters/cache/memory/index.js.map +1 -0
- package/build/adapters/configuration/__tests__/dotEnv.test.d.ts +2 -0
- package/build/adapters/configuration/__tests__/dotEnv.test.d.ts.map +1 -0
- package/build/adapters/configuration/__tests__/dotEnv.test.js +43 -0
- package/build/adapters/configuration/__tests__/dotEnv.test.js.map +1 -0
- package/build/adapters/configuration/dotEnv.d.ts +3 -0
- package/build/adapters/configuration/dotEnv.d.ts.map +1 -0
- package/build/adapters/configuration/dotEnv.js +35 -0
- package/build/adapters/configuration/dotEnv.js.map +1 -0
- package/build/adapters/configuration/index.d.ts +2 -0
- package/build/adapters/configuration/index.d.ts.map +1 -0
- package/build/adapters/configuration/index.js +18 -0
- package/build/adapters/configuration/index.js.map +1 -0
- package/build/adapters/database/index.d.ts +2 -0
- package/build/adapters/database/index.d.ts.map +1 -0
- package/build/adapters/database/index.js +18 -0
- package/build/adapters/database/index.js.map +1 -0
- package/build/adapters/database/memory/__tests__/memoryDb.test.d.ts +1 -0
- package/build/adapters/database/memory/__tests__/memoryDb.test.d.ts.map +1 -0
- package/build/adapters/database/memory/__tests__/memoryDb.test.js +36 -0
- package/build/adapters/database/memory/__tests__/memoryDb.test.js.map +1 -0
- package/build/adapters/database/memory/index.d.ts +3 -0
- package/build/adapters/database/memory/index.d.ts.map +1 -0
- package/build/adapters/database/memory/index.js +241 -0
- package/build/adapters/database/memory/index.js.map +1 -0
- package/build/adapters/endpoints/addAuthUser/index.d.ts +8 -0
- package/build/adapters/endpoints/addAuthUser/index.d.ts.map +1 -0
- package/build/adapters/endpoints/addAuthUser/index.js +57 -0
- package/build/adapters/endpoints/addAuthUser/index.js.map +1 -0
- package/build/adapters/endpoints/endpointValidation/index.d.ts +4 -0
- package/build/adapters/endpoints/endpointValidation/index.d.ts.map +1 -0
- package/build/adapters/endpoints/endpointValidation/index.js +27 -0
- package/build/adapters/endpoints/endpointValidation/index.js.map +1 -0
- package/build/adapters/endpoints/index.d.ts +4 -0
- package/build/adapters/endpoints/index.d.ts.map +1 -0
- package/build/adapters/endpoints/index.js +21 -0
- package/build/adapters/endpoints/index.js.map +1 -0
- package/build/adapters/endpoints/localAuthorization/index.d.ts +1 -0
- package/build/adapters/endpoints/localAuthorization/index.d.ts.map +1 -0
- package/build/adapters/endpoints/localAuthorization/index.js +68 -0
- package/build/adapters/endpoints/localAuthorization/index.js.map +1 -0
- package/build/adapters/endpoints/tcpConsumer/index.d.ts +3 -0
- package/build/adapters/endpoints/tcpConsumer/index.d.ts.map +1 -0
- package/build/adapters/endpoints/tcpConsumer/index.js +64 -0
- package/build/adapters/endpoints/tcpConsumer/index.js.map +1 -0
- package/build/adapters/endpoints/userSession/index.d.ts +8 -0
- package/build/adapters/endpoints/userSession/index.d.ts.map +1 -0
- package/build/adapters/endpoints/userSession/index.js +43 -0
- package/build/adapters/endpoints/userSession/index.js.map +1 -0
- package/build/adapters/eventstore/database.d.ts +3 -0
- package/build/adapters/eventstore/database.d.ts.map +1 -0
- package/build/adapters/eventstore/database.js +156 -0
- package/build/adapters/eventstore/database.js.map +1 -0
- package/build/adapters/eventstore/index.d.ts +2 -0
- package/build/adapters/eventstore/index.d.ts.map +1 -0
- package/build/adapters/eventstore/index.js +18 -0
- package/build/adapters/eventstore/index.js.map +1 -0
- package/build/adapters/infrastructure/index.d.ts +2 -0
- package/build/adapters/infrastructure/index.d.ts.map +1 -0
- package/build/adapters/infrastructure/index.js +18 -0
- package/build/adapters/infrastructure/index.js.map +1 -0
- package/build/adapters/infrastructure/local/index.d.ts +4 -0
- package/build/adapters/infrastructure/local/index.d.ts.map +1 -0
- package/build/adapters/infrastructure/local/index.js +37 -0
- package/build/adapters/infrastructure/local/index.js.map +1 -0
- package/build/adapters/logger/console.d.ts +3 -0
- package/build/adapters/logger/console.d.ts.map +1 -0
- package/build/adapters/logger/console.js +38 -0
- package/build/adapters/logger/console.js.map +1 -0
- package/build/adapters/logger/index.d.ts +2 -0
- package/build/adapters/logger/index.d.ts.map +1 -0
- package/build/adapters/logger/index.js +18 -0
- package/build/adapters/logger/index.js.map +1 -0
- package/build/index.d.ts +23 -0
- package/build/index.d.ts.map +1 -0
- package/build/index.js +39 -0
- package/build/index.js.map +1 -0
- package/build/libraries/modules/fs.d.ts +12 -0
- package/build/libraries/modules/fs.d.ts.map +1 -0
- package/build/libraries/modules/fs.js +103 -0
- package/build/libraries/modules/fs.js.map +1 -0
- package/build/libraries/modules/index.d.ts +2 -0
- package/build/libraries/modules/index.d.ts.map +1 -0
- package/build/libraries/modules/index.js +18 -0
- package/build/libraries/modules/index.js.map +1 -0
- package/build/libraries/openApi/index.d.ts +2 -0
- package/build/libraries/openApi/index.d.ts.map +1 -0
- package/build/libraries/openApi/index.js +18 -0
- package/build/libraries/openApi/index.js.map +1 -0
- package/build/libraries/openApi/pruneUnusedRef.d.ts +3 -0
- package/build/libraries/openApi/pruneUnusedRef.d.ts.map +1 -0
- package/build/libraries/openApi/pruneUnusedRef.js +30 -0
- package/build/libraries/openApi/pruneUnusedRef.js.map +1 -0
- package/build/libraries/tcp/index.d.ts +8 -0
- package/build/libraries/tcp/index.d.ts.map +1 -0
- package/build/libraries/tcp/index.js +108 -0
- package/build/libraries/tcp/index.js.map +1 -0
- package/build/libraries/tcp/types.d.ts +45 -0
- package/build/libraries/tcp/types.d.ts.map +1 -0
- package/build/libraries/tcp/types.js +3 -0
- package/build/libraries/tcp/types.js.map +1 -0
- package/build/libraries/validation/__tests__/validation.test.d.ts +2 -0
- package/build/libraries/validation/__tests__/validation.test.d.ts.map +1 -0
- package/build/libraries/validation/__tests__/validation.test.js +53 -0
- package/build/libraries/validation/__tests__/validation.test.js.map +1 -0
- package/build/libraries/validation/index.d.ts +8 -0
- package/build/libraries/validation/index.d.ts.map +1 -0
- package/build/libraries/validation/index.js +51 -0
- package/build/libraries/validation/index.js.map +1 -0
- package/build/ports/authentication/index.d.ts +12 -0
- package/build/ports/authentication/index.d.ts.map +1 -0
- package/build/ports/authentication/index.js +23 -0
- package/build/ports/authentication/index.js.map +1 -0
- package/build/ports/base.d.ts +7 -0
- package/build/ports/base.d.ts.map +1 -0
- package/build/ports/base.js +25 -0
- package/build/ports/base.js.map +1 -0
- package/build/ports/cache/index.d.ts +3 -0
- package/build/ports/cache/index.d.ts.map +1 -0
- package/build/ports/cache/index.js +19 -0
- package/build/ports/cache/index.js.map +1 -0
- package/build/ports/configuration/__tests__/configurationPort.test.d.ts +2 -0
- package/build/ports/configuration/__tests__/configurationPort.test.d.ts.map +1 -0
- package/build/ports/configuration/__tests__/configurationPort.test.js +51 -0
- package/build/ports/configuration/__tests__/configurationPort.test.js.map +1 -0
- package/build/ports/configuration/args.d.ts +57 -0
- package/build/ports/configuration/args.d.ts.map +1 -0
- package/build/ports/configuration/args.js +44 -0
- package/build/ports/configuration/args.js.map +1 -0
- package/build/ports/configuration/common.d.ts +2 -0
- package/build/ports/configuration/common.d.ts.map +1 -0
- package/build/ports/configuration/common.js +19 -0
- package/build/ports/configuration/common.js.map +1 -0
- package/build/ports/configuration/index.d.ts +10 -0
- package/build/ports/configuration/index.d.ts.map +1 -0
- package/build/ports/configuration/index.js +96 -0
- package/build/ports/configuration/index.js.map +1 -0
- package/build/ports/configuration/localConfig.d.ts +3 -0
- package/build/ports/configuration/localConfig.d.ts.map +1 -0
- package/build/ports/configuration/localConfig.js +108 -0
- package/build/ports/configuration/localConfig.js.map +1 -0
- package/build/ports/database/index.d.ts +4 -0
- package/build/ports/database/index.d.ts.map +1 -0
- package/build/ports/database/index.js +27 -0
- package/build/ports/database/index.js.map +1 -0
- package/build/ports/endpoints/__tests__/endpointsCall.test.d.ts +2 -0
- package/build/ports/endpoints/__tests__/endpointsCall.test.d.ts.map +1 -0
- package/build/ports/endpoints/__tests__/endpointsCall.test.js +21 -0
- package/build/ports/endpoints/__tests__/endpointsCall.test.js.map +1 -0
- package/build/ports/endpoints/__tests__/test-client-library/base.d.ts +77 -0
- package/build/ports/endpoints/__tests__/test-client-library/base.d.ts.map +1 -0
- package/build/ports/endpoints/__tests__/test-client-library/base.js +91 -0
- package/build/ports/endpoints/__tests__/test-client-library/base.js.map +1 -0
- package/build/ports/endpoints/__tests__/test-client-library/index.d.ts +29 -0
- package/build/ports/endpoints/__tests__/test-client-library/index.d.ts.map +1 -0
- package/build/ports/endpoints/__tests__/test-client-library/index.js +43 -0
- package/build/ports/endpoints/__tests__/test-client-library/index.js.map +1 -0
- package/build/ports/endpoints/__tests__/test-client-library/services/service.d.ts +106 -0
- package/build/ports/endpoints/__tests__/test-client-library/services/service.d.ts.map +1 -0
- package/build/ports/endpoints/__tests__/test-client-library/services/service.js +62 -0
- package/build/ports/endpoints/__tests__/test-client-library/services/service.js.map +1 -0
- package/build/ports/endpoints/__tests__/utils.test.d.ts +1 -0
- package/build/ports/endpoints/__tests__/utils.test.d.ts.map +1 -0
- package/build/ports/endpoints/__tests__/utils.test.js +53 -0
- package/build/ports/endpoints/__tests__/utils.test.js.map +1 -0
- package/build/ports/endpoints/index.d.ts +29 -0
- package/build/ports/endpoints/index.d.ts.map +1 -0
- package/build/ports/endpoints/index.js +263 -0
- package/build/ports/endpoints/index.js.map +1 -0
- package/build/ports/endpoints/openApi.d.ts +16 -0
- package/build/ports/endpoints/openApi.d.ts.map +1 -0
- package/build/ports/endpoints/openApi.js +187 -0
- package/build/ports/endpoints/openApi.js.map +1 -0
- package/build/ports/endpoints/utils.d.ts +17 -0
- package/build/ports/endpoints/utils.d.ts.map +1 -0
- package/build/ports/endpoints/utils.js +31 -0
- package/build/ports/endpoints/utils.js.map +1 -0
- package/build/ports/eventsourcing/__tests__/eventhandlers.test.d.ts +2 -0
- package/build/ports/eventsourcing/__tests__/eventhandlers.test.d.ts.map +1 -0
- package/build/ports/eventsourcing/__tests__/eventhandlers.test.js +35 -0
- package/build/ports/eventsourcing/__tests__/eventhandlers.test.js.map +1 -0
- package/build/ports/eventsourcing/__tests__/invariants.test.d.ts +2 -0
- package/build/ports/eventsourcing/__tests__/invariants.test.d.ts.map +1 -0
- package/build/ports/eventsourcing/__tests__/invariants.test.js +210 -0
- package/build/ports/eventsourcing/__tests__/invariants.test.js.map +1 -0
- package/build/ports/eventsourcing/commandHandlers/index.d.ts +25 -0
- package/build/ports/eventsourcing/commandHandlers/index.d.ts.map +1 -0
- package/build/ports/eventsourcing/commandHandlers/index.js +392 -0
- package/build/ports/eventsourcing/commandHandlers/index.js.map +1 -0
- package/build/ports/eventsourcing/commandTemplates/index.d.ts +3 -0
- package/build/ports/eventsourcing/commandTemplates/index.d.ts.map +1 -0
- package/build/ports/eventsourcing/commandTemplates/index.js +19 -0
- package/build/ports/eventsourcing/commandTemplates/index.js.map +1 -0
- package/build/ports/eventsourcing/commandTemplates/multiStream.d.ts +4 -0
- package/build/ports/eventsourcing/commandTemplates/multiStream.d.ts.map +1 -0
- package/build/ports/eventsourcing/commandTemplates/multiStream.js +73 -0
- package/build/ports/eventsourcing/commandTemplates/multiStream.js.map +1 -0
- package/build/ports/eventsourcing/commandTemplates/snapshot.d.ts +9 -0
- package/build/ports/eventsourcing/commandTemplates/snapshot.d.ts.map +1 -0
- package/build/ports/eventsourcing/commandTemplates/snapshot.js +39 -0
- package/build/ports/eventsourcing/commandTemplates/snapshot.js.map +1 -0
- package/build/ports/eventsourcing/eventHandlers/index.d.ts +33 -0
- package/build/ports/eventsourcing/eventHandlers/index.d.ts.map +1 -0
- package/build/ports/eventsourcing/eventHandlers/index.js +276 -0
- package/build/ports/eventsourcing/eventHandlers/index.js.map +1 -0
- package/build/ports/eventsourcing/index.d.ts +9 -0
- package/build/ports/eventsourcing/index.d.ts.map +1 -0
- package/build/ports/eventsourcing/index.js +101 -0
- package/build/ports/eventsourcing/index.js.map +1 -0
- package/build/ports/eventsourcing/invariants/combinators.d.ts +4 -0
- package/build/ports/eventsourcing/invariants/combinators.d.ts.map +1 -0
- package/build/ports/eventsourcing/invariants/combinators.js +20 -0
- package/build/ports/eventsourcing/invariants/combinators.js.map +1 -0
- package/build/ports/eventsourcing/invariants/common.d.ts +10 -0
- package/build/ports/eventsourcing/invariants/common.d.ts.map +1 -0
- package/build/ports/eventsourcing/invariants/common.js +37 -0
- package/build/ports/eventsourcing/invariants/common.js.map +1 -0
- package/build/ports/eventsourcing/invariants/comparisons.d.ts +19 -0
- package/build/ports/eventsourcing/invariants/comparisons.d.ts.map +1 -0
- package/build/ports/eventsourcing/invariants/comparisons.js +83 -0
- package/build/ports/eventsourcing/invariants/comparisons.js.map +1 -0
- package/build/ports/eventsourcing/invariants/index.d.ts +5 -0
- package/build/ports/eventsourcing/invariants/index.d.ts.map +1 -0
- package/build/ports/eventsourcing/invariants/index.js +21 -0
- package/build/ports/eventsourcing/invariants/index.js.map +1 -0
- package/build/ports/eventsourcing/invariants/stateExistance.d.ts +4 -0
- package/build/ports/eventsourcing/invariants/stateExistance.d.ts.map +1 -0
- package/build/ports/eventsourcing/invariants/stateExistance.js +33 -0
- package/build/ports/eventsourcing/invariants/stateExistance.js.map +1 -0
- package/build/ports/eventsourcing/subscriptions/index.d.ts +2 -0
- package/build/ports/eventsourcing/subscriptions/index.d.ts.map +1 -0
- package/build/ports/eventsourcing/subscriptions/index.js +18 -0
- package/build/ports/eventsourcing/subscriptions/index.js.map +1 -0
- package/build/ports/eventsourcing/subscriptions/sseSubscriptions.d.ts +3 -0
- package/build/ports/eventsourcing/subscriptions/sseSubscriptions.d.ts.map +1 -0
- package/build/ports/eventsourcing/subscriptions/sseSubscriptions.js +81 -0
- package/build/ports/eventsourcing/subscriptions/sseSubscriptions.js.map +1 -0
- package/build/ports/eventsourcing/utils/aggregateBuilder.d.ts +4 -0
- package/build/ports/eventsourcing/utils/aggregateBuilder.d.ts.map +1 -0
- package/build/ports/eventsourcing/utils/aggregateBuilder.js +45 -0
- package/build/ports/eventsourcing/utils/aggregateBuilder.js.map +1 -0
- package/build/ports/eventsourcing/utils/commandBuilder.d.ts +3 -0
- package/build/ports/eventsourcing/utils/commandBuilder.d.ts.map +1 -0
- package/build/ports/eventsourcing/utils/commandBuilder.js +102 -0
- package/build/ports/eventsourcing/utils/commandBuilder.js.map +1 -0
- package/build/ports/eventsourcing/utils/eventHandlerBuilder.d.ts +3 -0
- package/build/ports/eventsourcing/utils/eventHandlerBuilder.d.ts.map +1 -0
- package/build/ports/eventsourcing/utils/eventHandlerBuilder.js +19 -0
- package/build/ports/eventsourcing/utils/eventHandlerBuilder.js.map +1 -0
- package/build/ports/eventsourcing/utils/externalSystemBuilder.d.ts +4 -0
- package/build/ports/eventsourcing/utils/externalSystemBuilder.d.ts.map +1 -0
- package/build/ports/eventsourcing/utils/externalSystemBuilder.js +34 -0
- package/build/ports/eventsourcing/utils/externalSystemBuilder.js.map +1 -0
- package/build/ports/eventsourcing/utils/index.d.ts +13 -0
- package/build/ports/eventsourcing/utils/index.d.ts.map +1 -0
- package/build/ports/eventsourcing/utils/index.js +45 -0
- package/build/ports/eventsourcing/utils/index.js.map +1 -0
- package/build/ports/eventsourcing/utils/policyBuilder.d.ts +3 -0
- package/build/ports/eventsourcing/utils/policyBuilder.d.ts.map +1 -0
- package/build/ports/eventsourcing/utils/policyBuilder.js +29 -0
- package/build/ports/eventsourcing/utils/policyBuilder.js.map +1 -0
- package/build/ports/eventsourcing/utils/readmodelBuilder.d.ts +5 -0
- package/build/ports/eventsourcing/utils/readmodelBuilder.d.ts.map +1 -0
- package/build/ports/eventsourcing/utils/readmodelBuilder.js +45 -0
- package/build/ports/eventsourcing/utils/readmodelBuilder.js.map +1 -0
- package/build/ports/eventstore/index.d.ts +3 -0
- package/build/ports/eventstore/index.d.ts.map +1 -0
- package/build/ports/eventstore/index.js +13 -0
- package/build/ports/eventstore/index.js.map +1 -0
- package/build/ports/infrastructure/__tests__/fixture/index.d.ts +3 -0
- package/build/ports/infrastructure/__tests__/fixture/index.d.ts.map +1 -0
- package/build/ports/infrastructure/__tests__/fixture/index.js +19 -0
- package/build/ports/infrastructure/__tests__/fixture/index.js.map +1 -0
- package/build/ports/infrastructure/__tests__/fixture/infrastructureServices.d.ts +19 -0
- package/build/ports/infrastructure/__tests__/fixture/infrastructureServices.d.ts.map +1 -0
- package/build/ports/infrastructure/__tests__/fixture/infrastructureServices.js +76 -0
- package/build/ports/infrastructure/__tests__/fixture/infrastructureServices.js.map +1 -0
- package/build/ports/infrastructure/__tests__/fixture/structureState.d.ts +177 -0
- package/build/ports/infrastructure/__tests__/fixture/structureState.d.ts.map +1 -0
- package/build/ports/infrastructure/__tests__/fixture/structureState.js +258 -0
- package/build/ports/infrastructure/__tests__/fixture/structureState.js.map +1 -0
- package/build/ports/infrastructure/__tests__/infrastructure.test.d.ts +2 -0
- package/build/ports/infrastructure/__tests__/infrastructure.test.d.ts.map +1 -0
- package/build/ports/infrastructure/__tests__/infrastructure.test.js +11 -0
- package/build/ports/infrastructure/__tests__/infrastructure.test.js.map +1 -0
- package/build/ports/infrastructure/index.d.ts +53 -0
- package/build/ports/infrastructure/index.d.ts.map +1 -0
- package/build/ports/infrastructure/index.js +149 -0
- package/build/ports/infrastructure/index.js.map +1 -0
- package/build/ports/infrastructure/utils.d.ts +14 -0
- package/build/ports/infrastructure/utils.d.ts.map +1 -0
- package/build/ports/infrastructure/utils.js +126 -0
- package/build/ports/infrastructure/utils.js.map +1 -0
- package/build/ports/logger/index.d.ts +3 -0
- package/build/ports/logger/index.d.ts.map +1 -0
- package/build/ports/logger/index.js +32 -0
- package/build/ports/logger/index.js.map +1 -0
- package/build/utils/index.d.ts +35 -0
- package/build/utils/index.d.ts.map +1 -0
- package/build/utils/index.js +190 -0
- package/build/utils/index.js.map +1 -0
- package/package.json +28 -0
- package/src/adapters/cache/index.ts +1 -0
- package/src/adapters/cache/memory/__tests__/memoryCache.test.ts +6 -0
- package/src/adapters/cache/memory/index.ts +142 -0
- package/src/adapters/configuration/__tests__/.env +4 -0
- package/src/adapters/configuration/__tests__/dotEnv.test.ts +38 -0
- package/src/adapters/configuration/dotEnv.ts +33 -0
- package/src/adapters/configuration/index.ts +1 -0
- package/src/adapters/database/index.ts +1 -0
- package/src/adapters/database/memory/__tests__/memoryDb.test.ts +37 -0
- package/src/adapters/database/memory/index.ts +279 -0
- package/src/adapters/endpoints/addAuthUser/index.ts +55 -0
- package/src/adapters/endpoints/endpointValidation/index.ts +26 -0
- package/src/adapters/endpoints/index.ts +4 -0
- package/src/adapters/endpoints/localAuthorization/index.ts +75 -0
- package/src/adapters/endpoints/tcpConsumer/index.ts +69 -0
- package/src/adapters/endpoints/userSession/index.ts +40 -0
- package/src/adapters/eventstore/database.ts +178 -0
- package/src/adapters/eventstore/index.ts +1 -0
- package/src/adapters/infrastructure/index.ts +1 -0
- package/src/adapters/infrastructure/local/index.ts +40 -0
- package/src/adapters/logger/console.ts +42 -0
- package/src/adapters/logger/index.ts +1 -0
- package/src/index.ts +25 -0
- package/src/libraries/modules/fs.ts +88 -0
- package/src/libraries/modules/index.ts +1 -0
- package/src/libraries/openApi/index.ts +1 -0
- package/src/libraries/openApi/pruneUnusedRef.ts +35 -0
- package/src/libraries/tcp/index.ts +98 -0
- package/src/libraries/tcp/types.ts +43 -0
- package/src/libraries/validation/__tests__/validation.test.ts +25 -0
- package/src/libraries/validation/index.ts +48 -0
- package/src/ports/authentication/index.ts +25 -0
- package/src/ports/base.ts +20 -0
- package/src/ports/cache/index.ts +17 -0
- package/src/ports/configuration/__tests__/configurationPort.test.ts +47 -0
- package/src/ports/configuration/args.ts +39 -0
- package/src/ports/configuration/common.ts +12 -0
- package/src/ports/configuration/index.ts +110 -0
- package/src/ports/configuration/localConfig.ts +117 -0
- package/src/ports/database/index.ts +25 -0
- package/src/ports/endpoints/__tests__/endpointsCall.test.ts +20 -0
- package/src/ports/endpoints/__tests__/test-client-library/base.ts +167 -0
- package/src/ports/endpoints/__tests__/test-client-library/index.ts +23 -0
- package/src/ports/endpoints/__tests__/test-client-library/services/service.ts +181 -0
- package/src/ports/endpoints/__tests__/utils.test.ts +54 -0
- package/src/ports/endpoints/index.ts +272 -0
- package/src/ports/endpoints/openApi.ts +191 -0
- package/src/ports/endpoints/utils.ts +31 -0
- package/src/ports/eventsourcing/__tests__/eventhandlers.test.ts +30 -0
- package/src/ports/eventsourcing/__tests__/invariants.test.ts +213 -0
- package/src/ports/eventsourcing/commandHandlers/index.ts +625 -0
- package/src/ports/eventsourcing/commandTemplates/index.ts +2 -0
- package/src/ports/eventsourcing/commandTemplates/multiStream.ts +70 -0
- package/src/ports/eventsourcing/commandTemplates/snapshot.ts +43 -0
- package/src/ports/eventsourcing/eventHandlers/index.ts +429 -0
- package/src/ports/eventsourcing/index.ts +98 -0
- package/src/ports/eventsourcing/invariants/combinators.ts +25 -0
- package/src/ports/eventsourcing/invariants/common.ts +42 -0
- package/src/ports/eventsourcing/invariants/comparisons.ts +90 -0
- package/src/ports/eventsourcing/invariants/index.ts +4 -0
- package/src/ports/eventsourcing/invariants/stateExistance.ts +34 -0
- package/src/ports/eventsourcing/subscriptions/index.ts +1 -0
- package/src/ports/eventsourcing/subscriptions/sseSubscriptions.ts +103 -0
- package/src/ports/eventsourcing/utils/aggregateBuilder.ts +49 -0
- package/src/ports/eventsourcing/utils/commandBuilder.ts +113 -0
- package/src/ports/eventsourcing/utils/eventHandlerBuilder.ts +22 -0
- package/src/ports/eventsourcing/utils/externalSystemBuilder.ts +42 -0
- package/src/ports/eventsourcing/utils/index.ts +25 -0
- package/src/ports/eventsourcing/utils/policyBuilder.ts +31 -0
- package/src/ports/eventsourcing/utils/readmodelBuilder.ts +52 -0
- package/src/ports/eventstore/index.ts +11 -0
- package/src/ports/infrastructure/__tests__/fixture/index.ts +2 -0
- package/src/ports/infrastructure/__tests__/fixture/infrastructureServices.ts +72 -0
- package/src/ports/infrastructure/__tests__/fixture/structureState.ts +254 -0
- package/src/ports/infrastructure/__tests__/infrastructure.test.ts +11 -0
- package/src/ports/infrastructure/index.ts +162 -0
- package/src/ports/infrastructure/utils.ts +130 -0
- package/src/ports/logger/index.ts +34 -0
- package/src/utils/index.ts +186 -0
- package/tsconfig.json +19 -0
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
import { noop, safePromise } from '@bett3r-dev/bett3r-utils';
|
|
2
|
+
import S from '@bett3r-dev/jsonschema-definer';
|
|
3
|
+
import { CommandHandlerState, DatabaseOps, EndpointsPort, InvariantParams, InvariantType, ReadmodelInvariantComparison, filterOpMap } from '@bett3r-dev/pv3-types';
|
|
4
|
+
import { equals, path } from 'ramda';
|
|
5
|
+
import { createInvariant } from '.';
|
|
6
|
+
|
|
7
|
+
const compareCheck = ( val1:any, val2:any, op: DatabaseOps ) => {
|
|
8
|
+
return filterOpMap[op]( val1, val2 );
|
|
9
|
+
};
|
|
10
|
+
|
|
11
|
+
export const comparePaths = ( params: InvariantParams & { path1: string | (( state:CommandHandlerState ) => any ) ; path2?: string | (( data:CommandHandlerState ) => any ), op: DatabaseOps }): InvariantType => {
|
|
12
|
+
const { path1, path2, op } = params;
|
|
13
|
+
return createInvariant(
|
|
14
|
+
async ( handlerState: CommandHandlerState ) => {
|
|
15
|
+
const path1Value = typeof path1 === 'string' ? path( path1.split( '.' ), handlerState ) : path1( handlerState );
|
|
16
|
+
const path2Value = path2 && ( typeof path2 === 'string' ? path( path2.split( '.' ), handlerState ) : path2( handlerState ));
|
|
17
|
+
return safePromise( equals( true ), compareCheck( path1Value, path2Value, op )).then( noop ) ;
|
|
18
|
+
}, {
|
|
19
|
+
name: 'Invariant Error',
|
|
20
|
+
description: `Comparison failed on paths for operation ${op}`,
|
|
21
|
+
details: { path1, path2 },
|
|
22
|
+
type: 'BadRequestError',
|
|
23
|
+
schema: S.shape({
|
|
24
|
+
path1: S.string(),
|
|
25
|
+
path2: S.string(),
|
|
26
|
+
})
|
|
27
|
+
}
|
|
28
|
+
);
|
|
29
|
+
};
|
|
30
|
+
|
|
31
|
+
export const compareWithValue = ( params: InvariantParams & { path: string; value: any, op: DatabaseOps }): InvariantType => {
|
|
32
|
+
const { path: path1, value, op } = params;
|
|
33
|
+
return createInvariant(
|
|
34
|
+
async ( handlerState: CommandHandlerState ) => {
|
|
35
|
+
const path1Value = path( path1.split( '.' ), handlerState );
|
|
36
|
+
return safePromise( equals( true ), compareCheck( path1Value, value, op )).then( noop ) ;
|
|
37
|
+
}, {
|
|
38
|
+
name: 'Invariant Error',
|
|
39
|
+
description: `Comparison failed with value ${value} for operation ${op}`,
|
|
40
|
+
details: { path: path1 },
|
|
41
|
+
type: 'BadRequestError',
|
|
42
|
+
schema: S.shape({
|
|
43
|
+
path: S.string()
|
|
44
|
+
})
|
|
45
|
+
}
|
|
46
|
+
);
|
|
47
|
+
};
|
|
48
|
+
|
|
49
|
+
const checkReadmodelFilter = ( pathValue: any, readmodelValue:any, filter: ReadmodelInvariantComparison ) => {
|
|
50
|
+
if ( filter.OR ) {
|
|
51
|
+
return filter.OR.some(( _filter ) => checkReadmodelFilter( pathValue, readmodelValue, _filter ));
|
|
52
|
+
}
|
|
53
|
+
else if ( filter.AND ) {
|
|
54
|
+
return filter.AND.every(( _filter ) => checkReadmodelFilter( pathValue, readmodelValue, _filter ));
|
|
55
|
+
}
|
|
56
|
+
return compareCheck( pathValue, readmodelValue, filter.op! );
|
|
57
|
+
};
|
|
58
|
+
|
|
59
|
+
export const compareWithReadmodel = ( params: InvariantParams & {
|
|
60
|
+
endpoints: EndpointsPort;
|
|
61
|
+
readmodelBaseUrl: string;
|
|
62
|
+
comparisons: ReadmodelInvariantComparison[];
|
|
63
|
+
url: ( handlerState: CommandHandlerState ) => string;
|
|
64
|
+
}
|
|
65
|
+
): InvariantType => {
|
|
66
|
+
const { endpoints, readmodelBaseUrl, comparisons, url } = params;
|
|
67
|
+
return createInvariant(
|
|
68
|
+
async ( handlerState: CommandHandlerState ) => {
|
|
69
|
+
const requestPath = `${readmodelBaseUrl}${url( handlerState )}`;
|
|
70
|
+
return endpoints.get( requestPath ).then(( response: any[]) => {
|
|
71
|
+
if ( !response || !response.length || !comparisons.every(( comparison ) => {
|
|
72
|
+
const dataValue = path(( comparison.path as string ).split( '.' ), handlerState );
|
|
73
|
+
return checkReadmodelFilter( dataValue, path(( comparison.readmodelPath as string ).split( '.' ), response[0]), comparison );
|
|
74
|
+
}))
|
|
75
|
+
return Promise.reject({
|
|
76
|
+
details: { readmodelUrl: requestPath },
|
|
77
|
+
description: `Comparison failed with readmodel ${requestPath}`
|
|
78
|
+
});
|
|
79
|
+
return Promise.resolve();
|
|
80
|
+
});
|
|
81
|
+
}, {
|
|
82
|
+
name: 'Invariant Error',
|
|
83
|
+
description: 'Invariant Validation Failed',
|
|
84
|
+
type: 'BadRequestError',
|
|
85
|
+
schema: S.shape({
|
|
86
|
+
readmodelUrl: S.string(),
|
|
87
|
+
})
|
|
88
|
+
}
|
|
89
|
+
);
|
|
90
|
+
};
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { InvariantParams, InvariantType } from '@bett3r-dev/pv3-types';
|
|
2
|
+
import { createInvariant } from '.';
|
|
3
|
+
|
|
4
|
+
export const stateExists = ( params?: InvariantParams ): InvariantType => {
|
|
5
|
+
return createInvariant(
|
|
6
|
+
async ( handlerState ) => {
|
|
7
|
+
return handlerState.state
|
|
8
|
+
? Promise.resolve()
|
|
9
|
+
: Promise.reject({
|
|
10
|
+
description: `Expected State in aggregate ${handlerState.commandHandler.name}`,
|
|
11
|
+
details: { requested: handlerState.stream }
|
|
12
|
+
});
|
|
13
|
+
},{
|
|
14
|
+
name: params?.errorName || `State Does Not Exists`,
|
|
15
|
+
type: params?.errorType || 'BadRequestError'
|
|
16
|
+
}
|
|
17
|
+
);
|
|
18
|
+
};
|
|
19
|
+
|
|
20
|
+
export const stateNotExists = ( params?: InvariantParams ): InvariantType => {
|
|
21
|
+
return createInvariant(
|
|
22
|
+
async ( handlerState ) => {
|
|
23
|
+
return !handlerState.state
|
|
24
|
+
? Promise.resolve()
|
|
25
|
+
: Promise.reject({
|
|
26
|
+
description: `Unexpected State in aggregate ${handlerState.commandHandler.name}`,
|
|
27
|
+
details: { requested: handlerState.stream },
|
|
28
|
+
});
|
|
29
|
+
},{
|
|
30
|
+
name: params?.errorName || `Unexpected State`,
|
|
31
|
+
type: params?.errorType || 'BadRequestError'
|
|
32
|
+
}
|
|
33
|
+
);
|
|
34
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './sseSubscriptions';
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
import { ensureArray } from '@bett3r-dev/bett3r-utils';
|
|
2
|
+
import { CollectionQueryParams, DatabaseChange, Document, filterOpMap, LoggerType, ReadmodelChange, ReadModelSubscription, ReadModelSubscriptionCloseEmitterEvents, ReadmodelSubscriptionManagerType, RequestObject, ResponseObject, TypedEventEmitter } from '@bett3r-dev/pv3-types';
|
|
3
|
+
import { randomUUID } from 'crypto';
|
|
4
|
+
|
|
5
|
+
export const SSESubscriptions = (): ReadmodelSubscriptionManagerType => {
|
|
6
|
+
const subscriptions: Record<string, ReadModelSubscription> = {};
|
|
7
|
+
const readModelSubscriptionCloseEmitter = new TypedEventEmitter<ReadModelSubscriptionCloseEmitterEvents>();
|
|
8
|
+
|
|
9
|
+
const send = ( logger:LoggerType, id: string, change:DatabaseChange,collection: string, res: ResponseObject, data: string ): void => {
|
|
10
|
+
logger.log( 'Sending SSE event in subscription', id, 'for', change.changeType, collection, change.data.id || change.previous.id );
|
|
11
|
+
res.raw.write( `data: ${data}\n\n` );
|
|
12
|
+
};
|
|
13
|
+
|
|
14
|
+
const subscriptionIncludes = ( s: ReadModelSubscription, data: any ) => {
|
|
15
|
+
return (
|
|
16
|
+
!s.filter ||
|
|
17
|
+
s.filter.every(( filter ) =>
|
|
18
|
+
filterOpMap[filter.op as string]( data[filter.field as string], filter.value )
|
|
19
|
+
)
|
|
20
|
+
);
|
|
21
|
+
};
|
|
22
|
+
|
|
23
|
+
const notifySubscriptions = ( logger: LoggerType, collection: string ) => <T>( change: DatabaseChange, subscriptionId?: string ) => {
|
|
24
|
+
if ( !change.data ) return;
|
|
25
|
+
setImmediate(() => {
|
|
26
|
+
const message = JSON.stringify({
|
|
27
|
+
type: change.changeType,
|
|
28
|
+
data: change.data,
|
|
29
|
+
} as ReadmodelChange<any> );
|
|
30
|
+
// if ( subscriptionId ){
|
|
31
|
+
|
|
32
|
+
// }
|
|
33
|
+
Object.values( subscriptions ).forEach(( s ) => {
|
|
34
|
+
if (( change.changeType === 'delete' && subscriptionIncludes( s, change.previous ))
|
|
35
|
+
|| ([ 'insert', 'update' ].includes( change.changeType ) && subscriptionIncludes( s, change.data ))
|
|
36
|
+
|| ( change.changeType === 'update' && subscriptionIncludes( s, change.previous ))
|
|
37
|
+
){
|
|
38
|
+
send( logger, s.id, change, collection, s.res, message );
|
|
39
|
+
}
|
|
40
|
+
});
|
|
41
|
+
});
|
|
42
|
+
};
|
|
43
|
+
|
|
44
|
+
const initSubscription = (
|
|
45
|
+
req: RequestObject,
|
|
46
|
+
res: ResponseObject,
|
|
47
|
+
id: string
|
|
48
|
+
): void => {
|
|
49
|
+
const headers = {
|
|
50
|
+
'Content-Type': 'text/event-stream',
|
|
51
|
+
'Connection': 'keep-alive',
|
|
52
|
+
'Cache-Control': 'no-cache',
|
|
53
|
+
'X-Accel-Buffering': 'no'
|
|
54
|
+
};
|
|
55
|
+
|
|
56
|
+
// FIXME: Como puedo detectar que el request viene de nginx?
|
|
57
|
+
if ( !req.headers['asdf']){
|
|
58
|
+
headers['Access-Control-Allow-Origin'] = '*';
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
res.raw.writeHead( 200, headers );
|
|
62
|
+
res.raw.write( `data: Connected\n\n` );
|
|
63
|
+
req.raw.on( 'close', () => {
|
|
64
|
+
readModelSubscriptionCloseEmitter.emit( 'close', id );
|
|
65
|
+
delete subscriptions[id];
|
|
66
|
+
});
|
|
67
|
+
};
|
|
68
|
+
|
|
69
|
+
const createSubscription = <Model extends Document = any>(
|
|
70
|
+
res: ResponseObject,
|
|
71
|
+
conditions: CollectionQueryParams<Model>
|
|
72
|
+
): string => {
|
|
73
|
+
const id = randomUUID();
|
|
74
|
+
const newSubscription: ReadModelSubscription = {
|
|
75
|
+
id: id,
|
|
76
|
+
res,
|
|
77
|
+
filter: conditions.filter || []
|
|
78
|
+
};
|
|
79
|
+
subscriptions[id] = newSubscription;
|
|
80
|
+
return id;
|
|
81
|
+
};
|
|
82
|
+
|
|
83
|
+
const startSubscription = <Model extends Document>(
|
|
84
|
+
projectionParams: CollectionQueryParams<Model>,
|
|
85
|
+
req: RequestObject,
|
|
86
|
+
res: ResponseObject
|
|
87
|
+
) => {
|
|
88
|
+
if ( ensureArray( req?.headers?.accept ).includes( 'text/event-stream' )){
|
|
89
|
+
const id = createSubscription( res, projectionParams );
|
|
90
|
+
initSubscription( req, res, id );
|
|
91
|
+
return id;
|
|
92
|
+
}
|
|
93
|
+
};
|
|
94
|
+
|
|
95
|
+
return {
|
|
96
|
+
type: 'SSE',
|
|
97
|
+
startSubscription,
|
|
98
|
+
notifySubscriptions,
|
|
99
|
+
readModelSubscriptionCloseEmitter,
|
|
100
|
+
send
|
|
101
|
+
};
|
|
102
|
+
};
|
|
103
|
+
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { BaseSchema } from '@bett3r-dev/jsonschema-definer';
|
|
2
|
+
import { Aggregate, AggregateBuilderType, Command, DatabasePort, EventFactory, EventReducers } from '@bett3r-dev/pv3-types';
|
|
3
|
+
import { ExternalSystemBuilder } from './externalSystemBuilder';
|
|
4
|
+
|
|
5
|
+
export const AggregateBuilder = <Model, EVENTS extends Record<string, EventFactory>>( schema: BaseSchema<Model>, events: EVENTS, aggregate = {} as Aggregate ): AggregateBuilderType<Model, EVENTS> => {
|
|
6
|
+
const { system, ...builder } = ExternalSystemBuilder( events, schema, aggregate );
|
|
7
|
+
aggregate = system as Aggregate;
|
|
8
|
+
aggregate.schema = schema;
|
|
9
|
+
aggregate.initialValue = () => undefined;
|
|
10
|
+
|
|
11
|
+
const notEventsourced = ( database: DatabasePort, collection: string ) =>{
|
|
12
|
+
aggregate.isEventsourced = false;
|
|
13
|
+
aggregate.outboxDatabase = database;
|
|
14
|
+
aggregate.outboxCollection = collection;
|
|
15
|
+
return _builder;
|
|
16
|
+
};
|
|
17
|
+
|
|
18
|
+
const withCommandTemplate = ( command: Command ) => {
|
|
19
|
+
builder.withCommandTemplate( command );
|
|
20
|
+
return _builder;
|
|
21
|
+
};
|
|
22
|
+
|
|
23
|
+
const initialValue = ( init: () => ( Partial<Model> | null | undefined )) => {
|
|
24
|
+
aggregate.initialValue = init;
|
|
25
|
+
return {
|
|
26
|
+
withEventReducers: withEventReducers( events ),
|
|
27
|
+
withCommands: _builder.withCommands
|
|
28
|
+
};
|
|
29
|
+
};
|
|
30
|
+
|
|
31
|
+
const withEventReducers = <Events extends Record<string, EventFactory>>( events: Events ) => ( eventReducers: EventReducers<Events, Model> ) => {
|
|
32
|
+
aggregate.eventReducers = eventReducers;
|
|
33
|
+
return {
|
|
34
|
+
withCommands: _builder.withCommands
|
|
35
|
+
};
|
|
36
|
+
};
|
|
37
|
+
|
|
38
|
+
const _builder = {
|
|
39
|
+
...builder,
|
|
40
|
+
notEventsourced,
|
|
41
|
+
withCommandTemplate,
|
|
42
|
+
withEventReducers: withEventReducers( events ),
|
|
43
|
+
withCommands: builder.withCommands,
|
|
44
|
+
initialValue,
|
|
45
|
+
system: aggregate
|
|
46
|
+
};
|
|
47
|
+
|
|
48
|
+
return _builder;
|
|
49
|
+
};
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
import { BaseSchema } from '@bett3r-dev/jsonschema-definer';
|
|
2
|
+
import { Command, CommandBuilderType, CommandCommitFunction, CommandErrorHandlerFunction, CommandFormatFunction, CommandHandlerFunction, CommandLoadFunction, EventFactory, InvariantType } from '@bett3r-dev/pv3-types';
|
|
3
|
+
|
|
4
|
+
export const CommandBuilder = ( systemLevelInit?: Omit<Command, 'handler' | 'events' | 'schema'> ): CommandBuilderType => <Model, EVENTS extends Record<string, EventFactory>>( init?: Omit<Command, 'handler' | 'events' | 'schema'> ) => {
|
|
5
|
+
const command = {
|
|
6
|
+
...systemLevelInit,
|
|
7
|
+
...init
|
|
8
|
+
} as Command;
|
|
9
|
+
|
|
10
|
+
const withDescription = ( description: string ) => {
|
|
11
|
+
command.description = description;
|
|
12
|
+
return builder;
|
|
13
|
+
};
|
|
14
|
+
|
|
15
|
+
const allowingActors = ( actors: string[]) => {
|
|
16
|
+
command.actors = actors;
|
|
17
|
+
return builder;
|
|
18
|
+
};
|
|
19
|
+
|
|
20
|
+
const withDataPropertyId = ( dataPath: string ) => {
|
|
21
|
+
command.dataPropertyId = dataPath;
|
|
22
|
+
return builder;
|
|
23
|
+
};
|
|
24
|
+
|
|
25
|
+
const withSchema = <Payload>( schema: BaseSchema<Payload> ) => {
|
|
26
|
+
command.schema = schema;
|
|
27
|
+
return {
|
|
28
|
+
withInvariant: withInvariant( schema ),
|
|
29
|
+
produces: produces( schema ),
|
|
30
|
+
withResultFormatFunction: withResultFormatFunction( schema ),
|
|
31
|
+
withLoadFunction: withLoadFunction( schema ),
|
|
32
|
+
withCommitFunction: withCommitFunction( schema ),
|
|
33
|
+
};
|
|
34
|
+
};
|
|
35
|
+
|
|
36
|
+
const withInvariant = <Payload>( schema: BaseSchema<Payload> ) => ( invariant: InvariantType<Model, Payload> ) => {
|
|
37
|
+
command.events = [ ...( command.events || []), ...( invariant.events || []) ];
|
|
38
|
+
command.invariants = [ ...( command.invariants || []), invariant ];
|
|
39
|
+
return {
|
|
40
|
+
withInvariant: withInvariant( schema ),
|
|
41
|
+
produces: produces( schema ),
|
|
42
|
+
withLoadFunction: withLoadFunction( schema ),
|
|
43
|
+
withCommitFunction: withCommitFunction( schema ),
|
|
44
|
+
withResultFormatFunction: withResultFormatFunction( schema ),
|
|
45
|
+
};
|
|
46
|
+
};
|
|
47
|
+
|
|
48
|
+
const withLoadFunction = <Payload>( schema: BaseSchema<Payload> ) =>( loadFunction: CommandLoadFunction<Model,Payload> ) => {
|
|
49
|
+
command.load = loadFunction;
|
|
50
|
+
return {
|
|
51
|
+
withLoadFunction: withLoadFunction( schema ),
|
|
52
|
+
withCommitFunction: withCommitFunction( schema ),
|
|
53
|
+
withResultFormatFunction: withResultFormatFunction( schema ),
|
|
54
|
+
produces: produces( schema ),
|
|
55
|
+
withInvariant: withInvariant( schema ),
|
|
56
|
+
};
|
|
57
|
+
};
|
|
58
|
+
|
|
59
|
+
const withCommitFunction = <Payload>( schema: BaseSchema<Payload> ) => ( commitFunction: CommandCommitFunction<Model, Payload> ) => {
|
|
60
|
+
command.commit = commitFunction;
|
|
61
|
+
return {
|
|
62
|
+
withLoadFunction: withLoadFunction( schema ),
|
|
63
|
+
withCommitFunction: withCommitFunction( schema ),
|
|
64
|
+
withResultFormatFunction: withResultFormatFunction( schema ),
|
|
65
|
+
produces: produces( schema ),
|
|
66
|
+
withInvariant: withInvariant( schema ),
|
|
67
|
+
};
|
|
68
|
+
};
|
|
69
|
+
|
|
70
|
+
const withResultFormatFunction = <Payload>( schema: BaseSchema<Payload> ) => ( resultFormatFunction: CommandFormatFunction<Model, Payload> ) => {
|
|
71
|
+
command.format = resultFormatFunction;
|
|
72
|
+
return {
|
|
73
|
+
withLoadFunction: withLoadFunction( schema ),
|
|
74
|
+
withCommitFunction: withCommitFunction( schema ),
|
|
75
|
+
withResultFormatFunction: withResultFormatFunction( schema ),
|
|
76
|
+
produces: produces( schema ),
|
|
77
|
+
withInvariant: withInvariant( schema ),
|
|
78
|
+
};
|
|
79
|
+
};
|
|
80
|
+
|
|
81
|
+
const produces = <Payload>( schema: BaseSchema<Payload> ) => <EVENT extends keyof EVENTS>( events: EVENT[]) => {
|
|
82
|
+
command.events = [ ...( command.events || []), ...events ];
|
|
83
|
+
return {
|
|
84
|
+
withHandler: withHandler( events )( schema ),
|
|
85
|
+
withErrorHandler: withErrorHandler( events )( schema ),
|
|
86
|
+
build: () => command as Command<EVENTS, EVENT, Model, Payload>
|
|
87
|
+
};
|
|
88
|
+
};
|
|
89
|
+
|
|
90
|
+
const withHandler = <EVENT extends keyof EVENTS>( events: EVENT[]) => <CommandPayload>( schema: BaseSchema<CommandPayload> ) => <USER>( handler: CommandHandlerFunction<Model, CommandPayload, EVENTS, EVENT, USER> ) => {
|
|
91
|
+
( command as Command<EVENTS, EVENT, Model, CommandPayload> ).handler = handler;
|
|
92
|
+
return {
|
|
93
|
+
withErrorHandler: withErrorHandler( events )( schema ),
|
|
94
|
+
build: () => command as Command<EVENTS, EVENT, Model, CommandPayload>
|
|
95
|
+
};
|
|
96
|
+
};
|
|
97
|
+
|
|
98
|
+
const withErrorHandler = <EVENT extends keyof EVENTS>( events: EVENT[]) => <Payload>( schema: BaseSchema<Payload> ) => ( onErrorHandler: CommandErrorHandlerFunction<Payload> ) => {
|
|
99
|
+
command.onErrorHandler = onErrorHandler;
|
|
100
|
+
return {
|
|
101
|
+
build: () => command as Command<EVENTS, any, Model, Payload>
|
|
102
|
+
};
|
|
103
|
+
};
|
|
104
|
+
|
|
105
|
+
const builder = {
|
|
106
|
+
withSchema,
|
|
107
|
+
withDataPropertyId,
|
|
108
|
+
allowingActors,
|
|
109
|
+
withDescription,
|
|
110
|
+
};
|
|
111
|
+
|
|
112
|
+
return builder;
|
|
113
|
+
};
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { ObjectSchema } from '@bett3r-dev/jsonschema-definer';
|
|
2
|
+
import { AppErrorInstance, CommittedEvent, Document, EventFactory, EventHandler, EventHandlerBuilderType, GetMessageType, Policy, ReadModel } from '@bett3r-dev/pv3-types';
|
|
3
|
+
|
|
4
|
+
export const eventHandlerBuilder = <EVENTS extends Record<string, EventFactory>, T extends Policy | ReadModel>( eventHandler = {} as EventHandler<EVENTS> ): EventHandlerBuilderType<EVENTS, T> => {
|
|
5
|
+
const withErrorHandlers = ( errorHandlers: {
|
|
6
|
+
[Name in keyof EVENTS]?: ( error: AppErrorInstance, event: CommittedEvent<GetMessageType<EVENTS[Name]>> ) => Promise<unknown>
|
|
7
|
+
}) => {
|
|
8
|
+
eventHandler.errorHandlers = errorHandlers;
|
|
9
|
+
return { build };
|
|
10
|
+
};
|
|
11
|
+
|
|
12
|
+
const build = () => eventHandler as T extends Policy ? Policy<T['commandHandler'], EVENTS> : T extends ReadModel ? ReadModel<T['schema'] extends ObjectSchema<infer MODEL extends Document> ? MODEL: Document, EVENTS> : any;
|
|
13
|
+
// const build = () => eventHandler;
|
|
14
|
+
|
|
15
|
+
const builder: EventHandlerBuilderType<EVENTS, T> = {
|
|
16
|
+
eventHandler,
|
|
17
|
+
withErrorHandlers,
|
|
18
|
+
build
|
|
19
|
+
};
|
|
20
|
+
|
|
21
|
+
return builder;
|
|
22
|
+
};
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { BaseSchema } from '@bett3r-dev/jsonschema-definer';
|
|
2
|
+
import { Builder, Command, CommandBuilderType, EventFactory, ExternalSystemBuilderType, System } from '@bett3r-dev/pv3-types';
|
|
3
|
+
import { createEvent } from '../../../utils';
|
|
4
|
+
import { CommandBuilder } from './commandBuilder';
|
|
5
|
+
import { getStackTrace } from '.';
|
|
6
|
+
|
|
7
|
+
export const ExternalSystemBuilder = <Model, EVENTS extends Record<string, EventFactory>>( events: EVENTS, schema?: BaseSchema<Model>, system = {} as System ): ExternalSystemBuilderType<Model, EVENTS> => {
|
|
8
|
+
const isAggregate = !!schema;
|
|
9
|
+
const name = system.name || getStackTrace();
|
|
10
|
+
system = { ...system, name, events, isAggregate, isStreamable: isAggregate || system.isStreamable } as System;
|
|
11
|
+
system.isEventsourced = true;
|
|
12
|
+
|
|
13
|
+
const withCommandTemplate = ( command: Command ) => {
|
|
14
|
+
system.templateCommand = command;
|
|
15
|
+
return builder;
|
|
16
|
+
};
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* This is the last function that builds the aggregate, the last function you'll call
|
|
20
|
+
*/
|
|
21
|
+
const withCommands = <
|
|
22
|
+
EVENT extends keyof EVENTS,
|
|
23
|
+
Commands extends Record<string, Command<EVENTS, EVENT, Model> | Builder<Command<EVENTS, EVENT, Model>>>
|
|
24
|
+
> ( commands: ( params: {
|
|
25
|
+
commandBuilder: CommandBuilderType<Model, EVENTS>,
|
|
26
|
+
createEvent: ReturnType<typeof createEvent< System< any, EVENTS >>>,
|
|
27
|
+
}) => Commands ): System<Commands, EVENTS> => {
|
|
28
|
+
system.commands = commands({
|
|
29
|
+
commandBuilder: CommandBuilder( system.templateCommand ),
|
|
30
|
+
createEvent: createEvent<System<any, EVENTS>>( system ),
|
|
31
|
+
});
|
|
32
|
+
return system;
|
|
33
|
+
};
|
|
34
|
+
|
|
35
|
+
const builder = {
|
|
36
|
+
system,
|
|
37
|
+
withCommandTemplate,
|
|
38
|
+
withCommands
|
|
39
|
+
};
|
|
40
|
+
|
|
41
|
+
return builder;
|
|
42
|
+
};
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import path from 'path';
|
|
2
|
+
import { curry } from 'ramda';
|
|
3
|
+
|
|
4
|
+
export * from './aggregateBuilder';
|
|
5
|
+
export * from './commandBuilder';
|
|
6
|
+
export * from './externalSystemBuilder';
|
|
7
|
+
export * from './policyBuilder';
|
|
8
|
+
export * from './readmodelBuilder';
|
|
9
|
+
|
|
10
|
+
export const formatStream = curry(( aggreateOrSystem:string, id: string ) => `${aggreateOrSystem}${id ? `-${ id}` : ''}` );
|
|
11
|
+
export const getIdFromStream = ( stream: string ) => stream.slice( stream.indexOf( '-' ) + 1 );
|
|
12
|
+
export const extractIdFromEventStream = ( event: {stream: string}) => getIdFromStream( event.stream );
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
export const getStackTrace = () => {
|
|
16
|
+
const e = Error( 'ReadModelBuilder' );
|
|
17
|
+
const line = e.stack?.split( '\n' ).find(( l ) => /\.(readmodel|aggregate|system|externalSystem|policy)\.(t|j)s:/.test( l ));
|
|
18
|
+
const file = line?.match( /[\/\\].+?\.(j|t)s/g )?.[0];
|
|
19
|
+
if ( !file ){
|
|
20
|
+
// FIXME: que deberiamos hacer con esto?
|
|
21
|
+
throw Error( 'Artifact Found!!!!!!!!!!!!!!!!!' );
|
|
22
|
+
}
|
|
23
|
+
const f = path.basename( file );
|
|
24
|
+
return f.replace( /\..+$/, '' );
|
|
25
|
+
};
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { CommandInstance, CommittedEvent, EventFactory, GetMessageType, Policy, PolicyBuilderType, System, createCommand } from '@bett3r-dev/pv3-types';
|
|
2
|
+
import { eventHandlerBuilder } from './eventHandlerBuilder';
|
|
3
|
+
import { getStackTrace } from '.';
|
|
4
|
+
|
|
5
|
+
export const PolicyBuilder = <EVENTS extends Record<string, EventFactory>, CommandHandler extends System>( events: EVENTS, commandHandler?: CommandHandler, policy = {} as Policy ): PolicyBuilderType<CommandHandler, EVENTS> => {
|
|
6
|
+
const { eventHandler, ...builder } = eventHandlerBuilder<EVENTS, Policy<CommandHandler, EVENTS>>( policy );
|
|
7
|
+
policy = eventHandler as Policy<CommandHandler, EVENTS>;
|
|
8
|
+
policy.name = getStackTrace();
|
|
9
|
+
policy.events = events;
|
|
10
|
+
policy.commandHandler = commandHandler;
|
|
11
|
+
|
|
12
|
+
const withEventHandlers = ( handlers: ( params: {createCommand: ReturnType<typeof createCommand<CommandHandler>>}) => {
|
|
13
|
+
[Name in keyof EVENTS]: ( event: CommittedEvent<GetMessageType<EVENTS[Name]>> ) => Promise<CommandInstance|void>
|
|
14
|
+
}) => {
|
|
15
|
+
policy.eventHandlers = handlers({
|
|
16
|
+
createCommand: createCommand<CommandHandler>( commandHandler as CommandHandler )
|
|
17
|
+
});
|
|
18
|
+
return _builder;
|
|
19
|
+
};
|
|
20
|
+
|
|
21
|
+
const build = () => policy as Policy<CommandHandler, EVENTS>;
|
|
22
|
+
|
|
23
|
+
const _builder = {
|
|
24
|
+
...builder,
|
|
25
|
+
withEventHandlers,
|
|
26
|
+
eventHandler: policy,
|
|
27
|
+
build
|
|
28
|
+
};
|
|
29
|
+
|
|
30
|
+
return _builder;
|
|
31
|
+
};
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { ObjectSchema } from '@bett3r-dev/jsonschema-definer';
|
|
2
|
+
import { Collection, CommittedEvent, DatabasePort, Document, EventFactory, EventProjectors, Query, ReadModel, ReadModelDefaultParams, ReadModelDefaultQuery, ReadmodelBuilderType } from '@bett3r-dev/pv3-types';
|
|
3
|
+
import { path, pick } from 'ramda';
|
|
4
|
+
import { eventHandlerBuilder } from './eventHandlerBuilder';
|
|
5
|
+
import { getStackTrace } from '.';
|
|
6
|
+
import { pascalCase } from 'change-case';
|
|
7
|
+
|
|
8
|
+
export const mergeReducer = <Model extends Document>( collection: Collection<Model>, idPathOrFunction: string | (( event: CommittedEvent ) => string | number ), includeId = true ) => async ( event: CommittedEvent ) => {
|
|
9
|
+
const id = typeof idPathOrFunction === 'string' ? path( idPathOrFunction.split( '.' ), event ) : idPathOrFunction( event );
|
|
10
|
+
return collection.upsert( id as string, { ...( includeId ? { id } : {}), ...event.data, lastEvent: pick([ 'id', 'name', 'version' ], event ) });
|
|
11
|
+
};
|
|
12
|
+
|
|
13
|
+
export const ReadModelBuilder = <Model extends Document, EVENTS extends Record<string, EventFactory>>( schema: ObjectSchema<Model>, events: EVENTS, readmodel = {} as ReadModel<Model, EVENTS> ): ReadmodelBuilderType<Model, EVENTS> => {
|
|
14
|
+
// ApplicationsReadModel
|
|
15
|
+
// applications-readmodel
|
|
16
|
+
readmodel.name = readmodel.name || pascalCase( `${getStackTrace()}ReadModel` );
|
|
17
|
+
const { eventHandler, ...builder } = eventHandlerBuilder<EVENTS, ReadModel>( readmodel );
|
|
18
|
+
readmodel = eventHandler as ReadModel<Model, EVENTS>;
|
|
19
|
+
readmodel.isReadModel = true;
|
|
20
|
+
readmodel.schema = schema;
|
|
21
|
+
readmodel.events = events;
|
|
22
|
+
|
|
23
|
+
const withDatabase = ( database: DatabasePort, collection?:string ) => {
|
|
24
|
+
readmodel.database = database;
|
|
25
|
+
readmodel.collection = collection || readmodel.name;
|
|
26
|
+
return _builder;
|
|
27
|
+
};
|
|
28
|
+
|
|
29
|
+
const withProjector = ( eventProjectors?: ( params: {database: DatabasePort, collection:string}) => EventProjectors<EVENTS> ) => {
|
|
30
|
+
readmodel.eventProjectors = eventProjectors ? eventProjectors({ database: readmodel.database!, collection: readmodel.collection! }) : {} as EventProjectors<EVENTS>;
|
|
31
|
+
return _builder;
|
|
32
|
+
};
|
|
33
|
+
|
|
34
|
+
const withQuery = <PARAMS extends Record<string, any>=ReadModelDefaultParams, QUERY extends Record<string, any>=ReadModelDefaultQuery>( query?: Query<Model, PARAMS, QUERY> /* | QueryFactory */ ) => {
|
|
35
|
+
readmodel.queries ||= [];
|
|
36
|
+
readmodel.queries.push( query || {});
|
|
37
|
+
return _builder;
|
|
38
|
+
};
|
|
39
|
+
|
|
40
|
+
const build = () => readmodel as ReadModel<Model, EVENTS>;
|
|
41
|
+
|
|
42
|
+
const _builder = {
|
|
43
|
+
...builder,
|
|
44
|
+
withDatabase,
|
|
45
|
+
withProjector,
|
|
46
|
+
withQuery,
|
|
47
|
+
eventHandler: readmodel,
|
|
48
|
+
build
|
|
49
|
+
};
|
|
50
|
+
|
|
51
|
+
return _builder;
|
|
52
|
+
};
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { createPort } from '../base';
|
|
2
|
+
import { EventStoreAdapter, EventStorePort } from '@bett3r-dev/pv3-types';
|
|
3
|
+
|
|
4
|
+
export const EventStore = ( adapter: EventStoreAdapter ): EventStorePort => {
|
|
5
|
+
const eventstorePort = {
|
|
6
|
+
...createPort( adapter ),
|
|
7
|
+
_adapter: adapter
|
|
8
|
+
};
|
|
9
|
+
|
|
10
|
+
return eventstorePort;
|
|
11
|
+
};
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
export const infrastructureServices = [
|
|
2
|
+
{
|
|
3
|
+
service: 'service0',
|
|
4
|
+
port: 2013,
|
|
5
|
+
instances: [
|
|
6
|
+
{
|
|
7
|
+
timeRunning: 1.848,
|
|
8
|
+
host: '10.0.0.23',
|
|
9
|
+
},
|
|
10
|
+
{
|
|
11
|
+
timeRunning: 1.811,
|
|
12
|
+
host: '10.0.0.24',
|
|
13
|
+
},
|
|
14
|
+
],
|
|
15
|
+
consumes: {
|
|
16
|
+
OperationCountByColorReadModel: [
|
|
17
|
+
'DividedBy_17',
|
|
18
|
+
'MultipliedBy_18',
|
|
19
|
+
'MultipliedBy_2',
|
|
20
|
+
'MultipliedBy_5',
|
|
21
|
+
'Subtracted_50',
|
|
22
|
+
'Added_20',
|
|
23
|
+
'Added_7',
|
|
24
|
+
'Added_3',
|
|
25
|
+
'DividedBy_3',
|
|
26
|
+
],
|
|
27
|
+
TotalByColorReadModel: [
|
|
28
|
+
'MultipliedBy_18',
|
|
29
|
+
'DividedBy_17',
|
|
30
|
+
'MultipliedBy_5',
|
|
31
|
+
'MultipliedBy_2',
|
|
32
|
+
'Subtracted_50',
|
|
33
|
+
'Added_20',
|
|
34
|
+
'Added_7',
|
|
35
|
+
'Added_3',
|
|
36
|
+
'DividedBy_3',
|
|
37
|
+
],
|
|
38
|
+
},
|
|
39
|
+
produces: {
|
|
40
|
+
ArithmeticOperationsAggregate: [
|
|
41
|
+
'DividedBy_17',
|
|
42
|
+
'Added_20',
|
|
43
|
+
'MultipliedBy_5',
|
|
44
|
+
'Added_3',
|
|
45
|
+
'Added_7',
|
|
46
|
+
'MultipliedBy_2',
|
|
47
|
+
'Subtracted_50',
|
|
48
|
+
'DividedBy_3',
|
|
49
|
+
'MultipliedBy_18',
|
|
50
|
+
],
|
|
51
|
+
},
|
|
52
|
+
isBroker: true,
|
|
53
|
+
isService: true,
|
|
54
|
+
endpoints: [
|
|
55
|
+
'GET:/arithmetic-operations-aggregate/{id}',
|
|
56
|
+
'GET:/arithmetic-operations-aggregate/{id}/stream',
|
|
57
|
+
'POST:/arithmetic-operations-aggregate/{id}/divide-by-17',
|
|
58
|
+
'POST:/arithmetic-operations-aggregate/{id}/add-20',
|
|
59
|
+
'POST:/arithmetic-operations-aggregate/{id}/multiply-by-5',
|
|
60
|
+
'POST:/arithmetic-operations-aggregate/{id}/add-3',
|
|
61
|
+
'POST:/arithmetic-operations-aggregate/{id}/add-7',
|
|
62
|
+
'POST:/arithmetic-operations-aggregate/{id}/multiply-by-2',
|
|
63
|
+
'POST:/arithmetic-operations-aggregate/{id}/subtract-50',
|
|
64
|
+
'POST:/arithmetic-operations-aggregate/{id}/divide-by-3',
|
|
65
|
+
'POST:/arithmetic-operations-aggregate/{id}/multiply-by-18',
|
|
66
|
+
'POST:/operation-count-by-color-read-model',
|
|
67
|
+
'GET:/operation-count-by-color-read-model/{id}?',
|
|
68
|
+
'POST:/total-by-color-read-model',
|
|
69
|
+
'GET:/total-by-color-read-model/{id}?',
|
|
70
|
+
],
|
|
71
|
+
},
|
|
72
|
+
];
|