@fougere/core 0.2.0-alpha.2 → 0.3.0-alpha.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/README.md +2 -1
- package/dist/boot/AppLifecycle.d.ts +18 -0
- package/dist/boot/AppLifecycle.d.ts.map +1 -0
- package/dist/boot/AppLifecycle.js +42 -0
- package/dist/boot/AppLifecycle.js.map +1 -0
- package/dist/boot/Emissions.d.ts +126 -0
- package/dist/boot/Emissions.d.ts.map +1 -0
- package/dist/boot/Emissions.js +233 -0
- package/dist/boot/Emissions.js.map +1 -0
- package/dist/boot/HandlerFacade.d.ts +72 -0
- package/dist/boot/HandlerFacade.d.ts.map +1 -0
- package/dist/boot/HandlerFacade.js +174 -0
- package/dist/boot/HandlerFacade.js.map +1 -0
- package/dist/boot/Lifecycle.d.ts +4 -0
- package/dist/boot/Lifecycle.d.ts.map +1 -0
- package/dist/boot/Lifecycle.js +3 -0
- package/dist/boot/Lifecycle.js.map +1 -0
- package/dist/boot/ambient-port.d.ts +38 -0
- package/dist/boot/ambient-port.d.ts.map +1 -0
- package/dist/boot/ambient-port.js +2 -0
- package/dist/boot/ambient-port.js.map +1 -0
- package/dist/boot/ambient.als.d.ts +3 -0
- package/dist/boot/ambient.als.d.ts.map +1 -0
- package/dist/boot/ambient.als.js +34 -0
- package/dist/boot/ambient.als.js.map +1 -0
- package/dist/boot/ambient.queue.d.ts +10 -0
- package/dist/boot/ambient.queue.d.ts.map +1 -0
- package/dist/boot/ambient.queue.js +60 -0
- package/dist/boot/ambient.queue.js.map +1 -0
- package/dist/boot/apply.d.ts +22 -0
- package/dist/boot/apply.d.ts.map +1 -0
- package/dist/boot/apply.js +48 -0
- package/dist/boot/apply.js.map +1 -0
- package/dist/boot/auth.d.ts +53 -0
- package/dist/boot/auth.d.ts.map +1 -0
- package/dist/boot/auth.js +2 -0
- package/dist/boot/auth.js.map +1 -0
- package/dist/{binding.d.ts → boot/binding.d.ts} +14 -17
- package/dist/boot/binding.d.ts.map +1 -0
- package/dist/{binding.js → boot/binding.js} +19 -10
- package/dist/boot/binding.js.map +1 -0
- package/dist/{boot.d.ts → boot/boot.d.ts} +25 -5
- package/dist/boot/boot.d.ts.map +1 -0
- package/dist/boot/boot.js +70 -0
- package/dist/boot/boot.js.map +1 -0
- package/dist/boot/bootstrap.d.ts.map +1 -0
- package/dist/boot/bootstrap.js +721 -0
- package/dist/boot/bootstrap.js.map +1 -0
- package/dist/boot/egress.d.ts +8 -0
- package/dist/boot/egress.d.ts.map +1 -0
- package/dist/boot/egress.js +11 -0
- package/dist/boot/egress.js.map +1 -0
- package/dist/boot/frame.d.ts +44 -0
- package/dist/boot/frame.d.ts.map +1 -0
- package/dist/boot/frame.js +181 -0
- package/dist/boot/frame.js.map +1 -0
- package/dist/boot/ownership.d.ts +42 -0
- package/dist/boot/ownership.d.ts.map +1 -0
- package/dist/boot/ownership.js +127 -0
- package/dist/boot/ownership.js.map +1 -0
- package/dist/boot/ports.d.ts +17 -0
- package/dist/boot/ports.d.ts.map +1 -0
- package/dist/boot/ports.js +57 -0
- package/dist/boot/ports.js.map +1 -0
- package/dist/{remote.d.ts → boot/remote.d.ts} +11 -3
- package/dist/boot/remote.d.ts.map +1 -0
- package/dist/{remote.js → boot/remote.js} +24 -26
- package/dist/boot/remote.js.map +1 -0
- package/dist/{seed.d.ts → boot/seed.d.ts} +13 -1
- package/dist/boot/seed.d.ts.map +1 -0
- package/dist/{seed.js → boot/seed.js} +24 -3
- package/dist/boot/seed.js.map +1 -0
- package/dist/boot/together.d.ts +26 -0
- package/dist/boot/together.d.ts.map +1 -0
- package/dist/boot/together.js +163 -0
- package/dist/boot/together.js.map +1 -0
- package/dist/boot/types.d.ts +260 -0
- package/dist/boot/types.d.ts.map +1 -0
- package/dist/boot/types.js.map +1 -0
- package/dist/builtins/config.d.ts +9 -0
- package/dist/builtins/config.d.ts.map +1 -1
- package/dist/builtins/config.js +16 -1
- package/dist/builtins/config.js.map +1 -1
- package/dist/builtins/logger.d.ts +37 -4
- package/dist/builtins/logger.d.ts.map +1 -1
- package/dist/builtins/logger.js +66 -7
- package/dist/builtins/logger.js.map +1 -1
- package/dist/config-loader.d.ts +39 -35
- package/dist/config-loader.d.ts.map +1 -1
- package/dist/config-loader.js +15 -54
- package/dist/config-loader.js.map +1 -1
- package/dist/contract/Call.d.ts +10 -0
- package/dist/contract/Call.d.ts.map +1 -0
- package/dist/contract/Call.js +15 -0
- package/dist/contract/Call.js.map +1 -0
- package/dist/contract/Invocation.d.ts +27 -0
- package/dist/contract/Invocation.d.ts.map +1 -0
- package/dist/contract/Invocation.js +59 -0
- package/dist/contract/Invocation.js.map +1 -0
- package/dist/contract/RouteAddress.d.ts +17 -0
- package/dist/contract/RouteAddress.d.ts.map +1 -0
- package/dist/contract/RouteAddress.js +38 -0
- package/dist/contract/RouteAddress.js.map +1 -0
- package/dist/contract.d.ts +25 -19
- package/dist/contract.d.ts.map +1 -1
- package/dist/contract.js +25 -10
- package/dist/contract.js.map +1 -1
- package/dist/crypto/encoding.d.ts +25 -0
- package/dist/crypto/encoding.d.ts.map +1 -0
- package/dist/crypto/encoding.js +58 -0
- package/dist/crypto/encoding.js.map +1 -0
- package/dist/crypto/node.d.ts +4 -0
- package/dist/crypto/node.d.ts.map +1 -0
- package/dist/crypto/node.js +25 -0
- package/dist/crypto/node.js.map +1 -0
- package/dist/crypto/port.d.ts +42 -0
- package/dist/crypto/port.d.ts.map +1 -0
- package/dist/crypto/port.js +19 -0
- package/dist/crypto/port.js.map +1 -0
- package/dist/crypto/webcrypto.d.ts +4 -0
- package/dist/crypto/webcrypto.d.ts.map +1 -0
- package/dist/crypto/webcrypto.js +34 -0
- package/dist/crypto/webcrypto.js.map +1 -0
- package/dist/dispatch/ArgumentResolver.d.ts +10 -0
- package/dist/dispatch/ArgumentResolver.d.ts.map +1 -0
- package/dist/dispatch/ArgumentResolver.js +12 -0
- package/dist/dispatch/ArgumentResolver.js.map +1 -0
- package/dist/dispatch/ArrayResult.d.ts +3 -0
- package/dist/dispatch/ArrayResult.d.ts.map +1 -0
- package/dist/dispatch/ArrayResult.js +11 -0
- package/dist/dispatch/ArrayResult.js.map +1 -0
- package/dist/dispatch/DispatchEvent.d.ts +18 -0
- package/dist/dispatch/DispatchEvent.d.ts.map +1 -0
- package/dist/dispatch/DispatchEvent.js +30 -0
- package/dist/dispatch/DispatchEvent.js.map +1 -0
- package/dist/dispatch/DispatchLifecycle.d.ts +9 -0
- package/dist/dispatch/DispatchLifecycle.d.ts.map +1 -0
- package/dist/dispatch/DispatchLifecycle.js +25 -0
- package/dist/dispatch/DispatchLifecycle.js.map +1 -0
- package/dist/dispatch/DispatchPort.d.ts +6 -0
- package/dist/dispatch/DispatchPort.d.ts.map +1 -0
- package/dist/dispatch/DispatchPort.js +2 -0
- package/dist/dispatch/DispatchPort.js.map +1 -0
- package/dist/dispatch/Dispatcher.d.ts +16 -0
- package/dist/dispatch/Dispatcher.d.ts.map +1 -0
- package/dist/dispatch/Dispatcher.js +44 -0
- package/dist/dispatch/Dispatcher.js.map +1 -0
- package/dist/dispatch/InFlight.d.ts +12 -0
- package/dist/dispatch/InFlight.d.ts.map +1 -0
- package/dist/dispatch/InFlight.js +46 -0
- package/dist/dispatch/InFlight.js.map +1 -0
- package/dist/dispatch/InputValidator.d.ts +7 -0
- package/dist/dispatch/InputValidator.d.ts.map +1 -0
- package/dist/dispatch/InputValidator.js +21 -0
- package/dist/dispatch/InputValidator.js.map +1 -0
- package/dist/dispatch/LocalRoutePolicy.d.ts +11 -0
- package/dist/dispatch/LocalRoutePolicy.d.ts.map +1 -0
- package/dist/dispatch/LocalRoutePolicy.js +32 -0
- package/dist/dispatch/LocalRoutePolicy.js.map +1 -0
- package/dist/dispatch/OperationExecutor.d.ts +25 -0
- package/dist/dispatch/OperationExecutor.d.ts.map +1 -0
- package/dist/dispatch/OperationExecutor.js +32 -0
- package/dist/dispatch/OperationExecutor.js.map +1 -0
- package/dist/dispatch/OperationRoute.d.ts +13 -0
- package/dist/dispatch/OperationRoute.d.ts.map +1 -0
- package/dist/dispatch/OperationRoute.js +15 -0
- package/dist/dispatch/OperationRoute.js.map +1 -0
- package/dist/dispatch/OutputProjector.d.ts +12 -0
- package/dist/dispatch/OutputProjector.d.ts.map +1 -0
- package/dist/dispatch/OutputProjector.js +30 -0
- package/dist/dispatch/OutputProjector.js.map +1 -0
- package/dist/dispatch/OutputView.d.ts +8 -0
- package/dist/dispatch/OutputView.d.ts.map +1 -0
- package/dist/dispatch/OutputView.js +10 -0
- package/dist/dispatch/OutputView.js.map +1 -0
- package/dist/dispatch/PresenterArgumentResolver.d.ts +12 -0
- package/dist/dispatch/PresenterArgumentResolver.d.ts.map +1 -0
- package/dist/dispatch/PresenterArgumentResolver.js +20 -0
- package/dist/dispatch/PresenterArgumentResolver.js.map +1 -0
- package/dist/dispatch/PresenterExecutor.d.ts +11 -0
- package/dist/dispatch/PresenterExecutor.d.ts.map +1 -0
- package/dist/dispatch/PresenterExecutor.js +56 -0
- package/dist/dispatch/PresenterExecutor.js.map +1 -0
- package/dist/dispatch/RemoteRouteResolver.d.ts +13 -0
- package/dist/dispatch/RemoteRouteResolver.d.ts.map +1 -0
- package/dist/dispatch/RemoteRouteResolver.js +18 -0
- package/dist/dispatch/RemoteRouteResolver.js.map +1 -0
- package/dist/dispatch/Route.d.ts +10 -0
- package/dist/dispatch/Route.d.ts.map +1 -0
- package/dist/dispatch/Route.js +2 -0
- package/dist/dispatch/Route.js.map +1 -0
- package/dist/dispatch/RouteNotFoundError.d.ts +10 -0
- package/dist/dispatch/RouteNotFoundError.d.ts.map +1 -0
- package/dist/dispatch/RouteNotFoundError.js +24 -0
- package/dist/dispatch/RouteNotFoundError.js.map +1 -0
- package/dist/dispatch/RoutePolicy.d.ts +8 -0
- package/dist/dispatch/RoutePolicy.d.ts.map +1 -0
- package/dist/dispatch/RoutePolicy.js +2 -0
- package/dist/dispatch/RoutePolicy.js.map +1 -0
- package/dist/dispatch/RouteRegistry.d.ts +18 -0
- package/dist/dispatch/RouteRegistry.d.ts.map +1 -0
- package/dist/dispatch/RouteRegistry.js +62 -0
- package/dist/dispatch/RouteRegistry.js.map +1 -0
- package/dist/dispatch/RouteResolver.d.ts +7 -0
- package/dist/dispatch/RouteResolver.d.ts.map +1 -0
- package/dist/dispatch/RouteResolver.js +2 -0
- package/dist/dispatch/RouteResolver.js.map +1 -0
- package/dist/dispatch/StorageGuard.d.ts +15 -0
- package/dist/dispatch/StorageGuard.d.ts.map +1 -0
- package/dist/dispatch/StorageGuard.js +63 -0
- package/dist/dispatch/StorageGuard.js.map +1 -0
- package/dist/effective-operation.d.ts +90 -0
- package/dist/effective-operation.d.ts.map +1 -0
- package/dist/effective-operation.js +450 -0
- package/dist/effective-operation.js.map +1 -0
- package/dist/emit.js +2 -2
- package/dist/emit.js.map +1 -1
- package/dist/entry/DynamicFacade.d.ts +10 -0
- package/dist/entry/DynamicFacade.d.ts.map +1 -0
- package/dist/entry/DynamicFacade.js +27 -0
- package/dist/entry/DynamicFacade.js.map +1 -0
- package/dist/entry/FacadeEntry.d.ts +11 -0
- package/dist/entry/FacadeEntry.d.ts.map +1 -0
- package/dist/entry/FacadeEntry.js +26 -0
- package/dist/entry/FacadeEntry.js.map +1 -0
- package/dist/entry/TransportEntry.d.ts +13 -0
- package/dist/entry/TransportEntry.d.ts.map +1 -0
- package/dist/entry/TransportEntry.js +24 -0
- package/dist/entry/TransportEntry.js.map +1 -0
- package/dist/frond-config.d.ts +24 -7
- package/dist/frond-config.d.ts.map +1 -1
- package/dist/frond-config.js.map +1 -1
- package/dist/graph.d.ts +1 -1
- package/dist/graph.d.ts.map +1 -1
- package/dist/graph.js +3 -2
- package/dist/graph.js.map +1 -1
- package/dist/identity-keys.d.ts +14 -0
- package/dist/identity-keys.d.ts.map +1 -0
- package/dist/identity-keys.js +37 -0
- package/dist/identity-keys.js.map +1 -0
- package/dist/identity.d.ts +58 -0
- package/dist/identity.d.ts.map +1 -0
- package/dist/identity.js +182 -0
- package/dist/identity.js.map +1 -0
- package/dist/imports.d.ts +1 -1
- package/dist/imports.d.ts.map +1 -1
- package/dist/imports.js +7 -3
- package/dist/imports.js.map +1 -1
- package/dist/index.d.ts +57 -38
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +38 -32
- package/dist/index.js.map +1 -1
- package/dist/loader.d.ts +16 -0
- package/dist/loader.d.ts.map +1 -0
- package/dist/loader.js +25 -0
- package/dist/loader.js.map +1 -0
- package/dist/node.d.ts +21 -0
- package/dist/node.d.ts.map +1 -0
- package/dist/node.js +24 -0
- package/dist/node.js.map +1 -0
- package/dist/orm.d.ts +69 -8
- package/dist/orm.d.ts.map +1 -1
- package/dist/orm.js +35 -2
- package/dist/orm.js.map +1 -1
- package/dist/prefab/collector.d.ts +29 -0
- package/dist/prefab/collector.d.ts.map +1 -0
- package/dist/prefab/collector.js +34 -0
- package/dist/prefab/collector.js.map +1 -0
- package/dist/{crud.d.ts → prefab/crud.d.ts} +7 -8
- package/dist/prefab/crud.d.ts.map +1 -0
- package/dist/{crud.js → prefab/crud.js} +39 -5
- package/dist/prefab/crud.js.map +1 -0
- package/dist/prefab/mirror.d.ts +52 -0
- package/dist/prefab/mirror.d.ts.map +1 -0
- package/dist/prefab/mirror.js +66 -0
- package/dist/prefab/mirror.js.map +1 -0
- package/dist/prefab/prefab.d.ts +15 -0
- package/dist/prefab/prefab.d.ts.map +1 -0
- package/dist/prefab/prefab.js +19 -0
- package/dist/prefab/prefab.js.map +1 -0
- package/dist/{presenter.d.ts → prefab/presenter.d.ts} +6 -17
- package/dist/prefab/presenter.d.ts.map +1 -0
- package/dist/{presenter.js → prefab/presenter.js} +5 -23
- package/dist/prefab/presenter.js.map +1 -0
- package/dist/prefab/repository.d.ts +104 -0
- package/dist/prefab/repository.d.ts.map +1 -0
- package/dist/prefab/repository.js +62 -0
- package/dist/prefab/repository.js.map +1 -0
- package/dist/scan/Fronds.d.ts +45 -0
- package/dist/scan/Fronds.d.ts.map +1 -0
- package/dist/scan/Fronds.js +66 -0
- package/dist/scan/Fronds.js.map +1 -0
- package/dist/scan/conventions.d.ts +74 -0
- package/dist/scan/conventions.d.ts.map +1 -0
- package/dist/scan/conventions.js +82 -0
- package/dist/scan/conventions.js.map +1 -0
- package/dist/scan/emit.d.ts +14 -0
- package/dist/scan/emit.d.ts.map +1 -0
- package/dist/scan/emit.js +211 -0
- package/dist/scan/emit.js.map +1 -0
- package/dist/scan/frond.d.ts +224 -0
- package/dist/scan/frond.d.ts.map +1 -0
- package/dist/scan/frond.js +2 -0
- package/dist/scan/frond.js.map +1 -0
- package/dist/{handler-parser.d.ts → scan/handler-parser.d.ts} +18 -9
- package/dist/scan/handler-parser.d.ts.map +1 -0
- package/dist/scan/handler-parser.js +625 -0
- package/dist/scan/handler-parser.js.map +1 -0
- package/dist/scan/scan-cache.d.ts +16 -0
- package/dist/scan/scan-cache.d.ts.map +1 -0
- package/dist/{scan-cache.js → scan/scan-cache.js} +27 -20
- package/dist/scan/scan-cache.js.map +1 -0
- package/dist/scan/scanner.d.ts +20 -0
- package/dist/scan/scanner.d.ts.map +1 -0
- package/dist/{scanner.js → scan/scanner.js} +185 -167
- package/dist/scan/scanner.js.map +1 -0
- package/dist/verify.d.ts +16 -3
- package/dist/verify.d.ts.map +1 -1
- package/dist/verify.js +21 -18
- package/dist/verify.js.map +1 -1
- package/dist/{call.d.ts → wire/call.d.ts} +70 -1
- package/dist/wire/call.d.ts.map +1 -0
- package/dist/{call.js → wire/call.js} +48 -75
- package/dist/wire/call.js.map +1 -0
- package/dist/{middleware.d.ts → wire/errors.d.ts} +18 -19
- package/dist/wire/errors.d.ts.map +1 -0
- package/dist/{middleware.js → wire/errors.js} +26 -14
- package/dist/wire/errors.js.map +1 -0
- package/dist/{errors.d.ts → wire/http-error.d.ts} +5 -6
- package/dist/wire/http-error.d.ts.map +1 -0
- package/dist/{errors.js → wire/http-error.js} +7 -6
- package/dist/wire/http-error.js.map +1 -0
- package/dist/wire/invocation.d.ts +4 -0
- package/dist/wire/invocation.d.ts.map +1 -0
- package/dist/wire/invocation.js +3 -0
- package/dist/wire/invocation.js.map +1 -0
- package/dist/{middleware/logger.d.ts → wire/loggerMiddleware.d.ts} +3 -3
- package/dist/wire/loggerMiddleware.d.ts.map +1 -0
- package/dist/{middleware/logger.js → wire/loggerMiddleware.js} +2 -2
- package/dist/wire/loggerMiddleware.js.map +1 -0
- package/dist/wire/middleware.d.ts +29 -0
- package/dist/wire/middleware.d.ts.map +1 -0
- package/dist/wire/middleware.js +20 -0
- package/dist/wire/middleware.js.map +1 -0
- package/dist/{operation.d.ts → wire/operation.d.ts} +39 -10
- package/dist/wire/operation.d.ts.map +1 -0
- package/dist/wire/operation.js +167 -0
- package/dist/wire/operation.js.map +1 -0
- package/package.json +24 -7
- package/dist/binding.d.ts.map +0 -1
- package/dist/binding.js.map +0 -1
- package/dist/boot.d.ts.map +0 -1
- package/dist/boot.js +0 -53
- package/dist/boot.js.map +0 -1
- package/dist/bootstrap.d.ts.map +0 -1
- package/dist/bootstrap.js +0 -879
- package/dist/bootstrap.js.map +0 -1
- package/dist/call.d.ts.map +0 -1
- package/dist/call.js.map +0 -1
- package/dist/collector.d.ts +0 -28
- package/dist/collector.d.ts.map +0 -1
- package/dist/collector.js +0 -32
- package/dist/collector.js.map +0 -1
- package/dist/crud.d.ts.map +0 -1
- package/dist/crud.js.map +0 -1
- package/dist/egress.d.ts +0 -52
- package/dist/egress.d.ts.map +0 -1
- package/dist/egress.js +0 -186
- package/dist/egress.js.map +0 -1
- package/dist/errors.d.ts.map +0 -1
- package/dist/errors.js.map +0 -1
- package/dist/handler-parser.d.ts.map +0 -1
- package/dist/handler-parser.js +0 -505
- package/dist/handler-parser.js.map +0 -1
- package/dist/invocation.d.ts +0 -20
- package/dist/invocation.d.ts.map +0 -1
- package/dist/invocation.js +0 -15
- package/dist/invocation.js.map +0 -1
- package/dist/middleware/error-handler.d.ts +0 -15
- package/dist/middleware/error-handler.d.ts.map +0 -1
- package/dist/middleware/error-handler.js +0 -29
- package/dist/middleware/error-handler.js.map +0 -1
- package/dist/middleware/logger.d.ts.map +0 -1
- package/dist/middleware/logger.js.map +0 -1
- package/dist/middleware.d.ts.map +0 -1
- package/dist/middleware.js.map +0 -1
- package/dist/mirror.d.ts +0 -93
- package/dist/mirror.d.ts.map +0 -1
- package/dist/mirror.js +0 -96
- package/dist/mirror.js.map +0 -1
- package/dist/operation.d.ts.map +0 -1
- package/dist/operation.js +0 -95
- package/dist/operation.js.map +0 -1
- package/dist/presenter.d.ts.map +0 -1
- package/dist/presenter.js.map +0 -1
- package/dist/remote.d.ts.map +0 -1
- package/dist/remote.js.map +0 -1
- package/dist/repository.d.ts +0 -55
- package/dist/repository.d.ts.map +0 -1
- package/dist/repository.js +0 -26
- package/dist/repository.js.map +0 -1
- package/dist/scan-cache.d.ts +0 -10
- package/dist/scan-cache.d.ts.map +0 -1
- package/dist/scan-cache.js.map +0 -1
- package/dist/scanner.d.ts +0 -34
- package/dist/scanner.d.ts.map +0 -1
- package/dist/scanner.js.map +0 -1
- package/dist/seed.d.ts.map +0 -1
- package/dist/seed.js.map +0 -1
- package/dist/types.d.ts +0 -421
- package/dist/types.d.ts.map +0 -1
- package/dist/types.js.map +0 -1
- /package/dist/{bootstrap.d.ts → boot/bootstrap.d.ts} +0 -0
- /package/dist/{types.js → boot/types.js} +0 -0
|
@@ -8,8 +8,9 @@
|
|
|
8
8
|
* and the answer is cached. A remote that can't be reached stays pending
|
|
9
9
|
* and is retried on the next miss instead of being cached as absent.
|
|
10
10
|
*/
|
|
11
|
-
import type { Transport } from '
|
|
12
|
-
import { type
|
|
11
|
+
import type { Transport } from '../wire/call.js';
|
|
12
|
+
import { type AppMiddleware } from '../wire/middleware.js';
|
|
13
|
+
import { type InvocationContext } from '../wire/invocation.js';
|
|
13
14
|
import { type SchemaView } from '@fougere/schema';
|
|
14
15
|
interface Route {
|
|
15
16
|
frond: string;
|
|
@@ -42,7 +43,14 @@ type Facade = Record<string, (invocation?: InvocationContext) => Promise<unknown
|
|
|
42
43
|
* lazy on purpose (the card is fetched at the first miss), and the remote is the
|
|
43
44
|
* authority on its own surface anyway. An op it does not serve comes back as its
|
|
44
45
|
* NOT_FOUND — judged where it is owned, which is the same answer a local façade gives.
|
|
46
|
+
*
|
|
47
|
+
* It runs the app's middlewares, like `HandlerFacade` does, because "the consumer can't
|
|
48
|
+
* tell it from a local facade" was false of the one thing a consumer installs: measured,
|
|
49
|
+
* `runMiddlewares` had a single caller, so a frond that moved lost every middleware on
|
|
50
|
+
* the calling side — no log, no retry, no cache — from a `remotes:` line alone.
|
|
51
|
+
* The invocation the transport sends is the one the chain leaves behind, so a middleware
|
|
52
|
+
* can still put something on the wire.
|
|
45
53
|
*/
|
|
46
|
-
export declare function createRemoteFacade(entity: string, router: RemoteRouter): Facade;
|
|
54
|
+
export declare function createRemoteFacade(entity: string, router: RemoteRouter, middlewaresFor: (address: string) => AppMiddleware[]): Facade;
|
|
47
55
|
export {};
|
|
48
56
|
//# sourceMappingURL=remote.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"remote.d.ts","sourceRoot":"","sources":["../../src/boot/remote.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,OAAO,KAAK,EAAa,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAE5D,OAAO,EAAkB,KAAK,aAAa,EAAyB,MAAM,uBAAuB,CAAC;AAClG,OAAO,EAAoB,KAAK,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAEjF,OAAO,EAAe,KAAK,UAAU,EAAyB,MAAM,iBAAiB,CAAC;AAGtF,UAAU,KAAK;IACb,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,SAAS,CAAC;IACrB;;;;;;;;OAQG;IACH,MAAM,CAAC,EAAE,UAAU,CAAC;CACrB;AAED,MAAM,WAAW,YAAY;IAC3B,KAAK,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC;CACvC;AAED,wBAAgB,kBAAkB,CAChC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAC/B,aAAa,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,SAAS,GACxC,YAAY,CAkGd;AAED,KAAK,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,UAAU,CAAC,EAAE,iBAAiB,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC;AAEnF;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,YAAY,EACpB,cAAc,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,aAAa,EAAE,GACnD,MAAM,CAYR"}
|
|
@@ -1,7 +1,9 @@
|
|
|
1
|
-
import { RPC_ENTITY } from '
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
1
|
+
import { assertIdentityCard, RPC_ENTITY } from '../wire/call.js';
|
|
2
|
+
import { runMiddlewares } from '../wire/middleware.js';
|
|
3
|
+
import { EMPTY_INVOCATION } from '../wire/invocation.js';
|
|
4
|
+
import { FougereError, ErrorCode } from '../wire/errors.js';
|
|
4
5
|
import { reconstruct } from '@fougere/schema';
|
|
6
|
+
import { DynamicFacade } from '../entry/DynamicFacade.js';
|
|
5
7
|
export function createRemoteRouter(remotes, makeTransport) {
|
|
6
8
|
const byEntity = new Map();
|
|
7
9
|
// The remotes config key is a label for the address — the identity card is
|
|
@@ -18,8 +20,10 @@ export function createRemoteRouter(remotes, makeTransport) {
|
|
|
18
20
|
const transport = transports.get(url) ?? makeTransport(url);
|
|
19
21
|
transports.set(url, transport);
|
|
20
22
|
try {
|
|
21
|
-
const
|
|
22
|
-
|
|
23
|
+
const answer = await transport({ entity: RPC_ENTITY, op: 'discover' }, EMPTY_INVOCATION);
|
|
24
|
+
// Judged below and not here: this catch means "unreachable, retry", and a
|
|
25
|
+
// refusal thrown inside it would be swallowed into another silent retry.
|
|
26
|
+
return { label, url, transport, answer };
|
|
23
27
|
}
|
|
24
28
|
catch {
|
|
25
29
|
// Unreachable — stays pending, retried on the next miss.
|
|
@@ -29,8 +33,9 @@ export function createRemoteRouter(remotes, makeTransport) {
|
|
|
29
33
|
for (const answered of cards) {
|
|
30
34
|
if (!answered)
|
|
31
35
|
continue;
|
|
32
|
-
const { label, transport,
|
|
36
|
+
const { label, url, transport, answer } = answered;
|
|
33
37
|
pending.delete(label);
|
|
38
|
+
const card = assertIdentityCard(answer, `Remote '${label}' (${url})`);
|
|
34
39
|
for (const frond of card.fronds) {
|
|
35
40
|
// Doors only. A fact is not routable — nobody calls it, it arrives — so
|
|
36
41
|
// adding one here would answer a call with a transport to a door that
|
|
@@ -94,14 +99,6 @@ export function createRemoteRouter(remotes, makeTransport) {
|
|
|
94
99
|
},
|
|
95
100
|
};
|
|
96
101
|
}
|
|
97
|
-
/**
|
|
98
|
-
* Does this name designate an operation at all? `then` is excluded so the façade is
|
|
99
|
-
* never mistaken for a thenable, and `Object.prototype`'s own names so `constructor`
|
|
100
|
-
* or `toString` cannot be called across the wire.
|
|
101
|
-
*/
|
|
102
|
-
function isOpName(prop) {
|
|
103
|
-
return typeof prop === 'string' && prop !== 'then' && !Object.hasOwn(Object.prototype, prop);
|
|
104
|
-
}
|
|
105
102
|
/**
|
|
106
103
|
* Façade-shaped stand-in — the consumer can't tell it from a local facade.
|
|
107
104
|
*
|
|
@@ -114,22 +111,23 @@ function isOpName(prop) {
|
|
|
114
111
|
* lazy on purpose (the card is fetched at the first miss), and the remote is the
|
|
115
112
|
* authority on its own surface anyway. An op it does not serve comes back as its
|
|
116
113
|
* NOT_FOUND — judged where it is owned, which is the same answer a local façade gives.
|
|
114
|
+
*
|
|
115
|
+
* It runs the app's middlewares, like `HandlerFacade` does, because "the consumer can't
|
|
116
|
+
* tell it from a local facade" was false of the one thing a consumer installs: measured,
|
|
117
|
+
* `runMiddlewares` had a single caller, so a frond that moved lost every middleware on
|
|
118
|
+
* the calling side — no log, no retry, no cache — from a `remotes:` line alone.
|
|
119
|
+
* The invocation the transport sends is the one the chain leaves behind, so a middleware
|
|
120
|
+
* can still put something on the wire.
|
|
117
121
|
*/
|
|
118
|
-
export function createRemoteFacade(entity, router) {
|
|
122
|
+
export function createRemoteFacade(entity, router, middlewaresFor) {
|
|
119
123
|
const opFn = (op) => async (invocation = EMPTY_INVOCATION) => {
|
|
120
124
|
const { frond, transport } = await router.route(entity);
|
|
121
125
|
const call = { frond, entity, op };
|
|
122
|
-
|
|
126
|
+
const ctx = {
|
|
127
|
+
entity, frond, operation: op, args: [], state: invocation.state, invocation,
|
|
128
|
+
};
|
|
129
|
+
return runMiddlewares(middlewaresFor(entity), ctx, () => transport(call, ctx.invocation ?? invocation));
|
|
123
130
|
};
|
|
124
|
-
return new
|
|
125
|
-
get: (_target, prop) => (isOpName(prop) ? opFn(prop) : undefined),
|
|
126
|
-
has: (_target, prop) => isOpName(prop),
|
|
127
|
-
getOwnPropertyDescriptor: (_target, prop) =>
|
|
128
|
-
// `configurable: true` is required: a proxy may not report a non-configurable
|
|
129
|
-
// property that the target does not actually have.
|
|
130
|
-
isOpName(prop)
|
|
131
|
-
? { value: opFn(prop), writable: false, enumerable: true, configurable: true }
|
|
132
|
-
: undefined,
|
|
133
|
-
});
|
|
131
|
+
return new DynamicFacade(opFn).operations;
|
|
134
132
|
}
|
|
135
133
|
//# sourceMappingURL=remote.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"remote.js","sourceRoot":"","sources":["../../src/boot/remote.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,6 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { FrondDescriptor, SeedEntry } from '../scan/frond.js';
|
|
2
|
+
import type { App } from './types.js';
|
|
3
|
+
import type { Extension } from './AppLifecycle.js';
|
|
2
4
|
/**
|
|
3
5
|
* Seeds in dependency order — a `ref()` target is planted before its referrer.
|
|
4
6
|
*
|
|
@@ -25,4 +27,14 @@ export declare function orderSeeds(fronds: FrondDescriptor[]): SeedEntry[];
|
|
|
25
27
|
* too many, and the second was the one running in the browser.
|
|
26
28
|
*/
|
|
27
29
|
export declare function runSeeds(app: App, seeds: SeedEntry[], report?: (message: string) => void): Promise<void>;
|
|
30
|
+
/**
|
|
31
|
+
* The framework's own ascent for rows, named — so a host can REPLACE it rather than take
|
|
32
|
+
* over the whole post-boot to get its own.
|
|
33
|
+
*
|
|
34
|
+
* That is what Nuxt's Nitro plugin had to do: a bundler needs its seed modules spelled out
|
|
35
|
+
* as static imports, so the plugin claimed everything after the boot and its copy of the
|
|
36
|
+
* loop drifted. It now declares an extension under this same name instead, and the delta
|
|
37
|
+
* is one member of a list.
|
|
38
|
+
*/
|
|
39
|
+
export declare function seeding(report?: (message: string) => void): Extension;
|
|
28
40
|
//# sourceMappingURL=seed.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"seed.d.ts","sourceRoot":"","sources":["../../src/boot/seed.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,eAAe,EAAE,SAAS,EAAe,MAAM,kBAAkB,CAAC;AAChF,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAEnD;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,UAAU,CAAC,MAAM,EAAE,eAAe,EAAE,GAAG,SAAS,EAAE,CAyCjE;AAQD;;;;;;;GAOG;AACH,wBAAsB,QAAQ,CAC5B,GAAG,EAAE,GAAG,EACR,KAAK,EAAE,SAAS,EAAE,EAClB,MAAM,GAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAe,GAC3C,OAAO,CAAC,IAAI,CAAC,CA+Bf;AA0BD;;;;;;;;GAQG;AACH,wBAAgB,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,GAAG,SAAS,CAQrE"}
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import { Role } from '@fougere/schema';
|
|
2
|
+
import { facadeKeyOf } from '../wire/call.js';
|
|
1
3
|
/**
|
|
2
4
|
* Seeds in dependency order — a `ref()` target is planted before its referrer.
|
|
3
5
|
*
|
|
@@ -20,9 +22,9 @@ export function orderSeeds(fronds) {
|
|
|
20
22
|
for (const entity of frond.entities) {
|
|
21
23
|
const targets = new Set();
|
|
22
24
|
for (const field of Object.values(entity.entityClass.getFields())) {
|
|
23
|
-
if (field.
|
|
25
|
+
if (!Role.of(field).isReference)
|
|
24
26
|
continue;
|
|
25
|
-
const target =
|
|
27
|
+
const target = Role.of(field).target.name?.toLowerCase();
|
|
26
28
|
if (target && target !== entity.name.toLowerCase())
|
|
27
29
|
targets.add(target);
|
|
28
30
|
}
|
|
@@ -93,7 +95,7 @@ export async function runSeeds(app, seeds, report = () => { }) {
|
|
|
93
95
|
function doorFor(app, entityName) {
|
|
94
96
|
let handler;
|
|
95
97
|
try {
|
|
96
|
-
handler = app.resolve(
|
|
98
|
+
handler = app.resolve(facadeKeyOf(entityName));
|
|
97
99
|
}
|
|
98
100
|
catch { }
|
|
99
101
|
if (typeof handler?.list === 'function' && typeof handler.create === 'function') {
|
|
@@ -107,4 +109,23 @@ function doorFor(app, entityName) {
|
|
|
107
109
|
return undefined;
|
|
108
110
|
return { list: () => orm.list(), write: (item) => orm.create(item) };
|
|
109
111
|
}
|
|
112
|
+
/**
|
|
113
|
+
* The framework's own ascent for rows, named — so a host can REPLACE it rather than take
|
|
114
|
+
* over the whole post-boot to get its own.
|
|
115
|
+
*
|
|
116
|
+
* That is what Nuxt's Nitro plugin had to do: a bundler needs its seed modules spelled out
|
|
117
|
+
* as static imports, so the plugin claimed everything after the boot and its copy of the
|
|
118
|
+
* loop drifted. It now declares an extension under this same name instead, and the delta
|
|
119
|
+
* is one member of a list.
|
|
120
|
+
*/
|
|
121
|
+
export function seeding(report) {
|
|
122
|
+
return {
|
|
123
|
+
name: 'seeds',
|
|
124
|
+
up: async (app) => {
|
|
125
|
+
const seeds = orderSeeds(app.fronds);
|
|
126
|
+
if (seeds.length > 0)
|
|
127
|
+
await runSeeds(app, seeds, report);
|
|
128
|
+
},
|
|
129
|
+
};
|
|
130
|
+
}
|
|
110
131
|
//# sourceMappingURL=seed.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"seed.js","sourceRoot":"","sources":["../../src/boot/seed.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { type SchemaView } from '@fougere/schema';
|
|
2
|
+
import type { Container } from '@fougere/container';
|
|
3
|
+
import { type OrmFactory } from '../orm.js';
|
|
4
|
+
import type { Logger } from '../builtins/logger.js';
|
|
5
|
+
import type { ProviderEntry } from '../scan/frond.js';
|
|
6
|
+
/** Everything the boot knows that a frame needs, gathered once for every frond. */
|
|
7
|
+
export interface FrameWorld {
|
|
8
|
+
/** Every entity of every frond, by registration key. A frame crosses fronds by design. */
|
|
9
|
+
entityByName: Map<string, SchemaView>;
|
|
10
|
+
/** Which frond holds an entity — the question `remotes:` turns into a refusal. */
|
|
11
|
+
frondOf: Map<string, string>;
|
|
12
|
+
hostedHere: (frond: string) => boolean;
|
|
13
|
+
ormFactory?: OrmFactory;
|
|
14
|
+
sourceOf?: (entityName: string) => string;
|
|
15
|
+
transacted?: <R>(source: string, fn: (ormFactory: OrmFactory) => Promise<R>) => Promise<R>;
|
|
16
|
+
log: Logger;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Register one frame per key a handler or provider of this frond asked for.
|
|
20
|
+
*
|
|
21
|
+
* Called with the frond's scope, because that is where the asking constructor resolves —
|
|
22
|
+
* while the MEMBERS are looked up app-wide, a frame crossing fronds being the ordinary case
|
|
23
|
+
* rather than the exception (the frond is not the storage boundary; `sources:` is).
|
|
24
|
+
*/
|
|
25
|
+
export declare function registerFrames(scope: Container, keys: Iterable<string>, providers: readonly ProviderEntry[], world: FrameWorld): void;
|
|
26
|
+
//# sourceMappingURL=together.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"together.d.ts","sourceRoot":"","sources":["../../src/boot/together.ts"],"names":[],"mappings":"AAUA,OAAO,EAAkC,KAAK,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAClF,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,EAAkD,KAAK,UAAU,EAAE,MAAM,WAAW,CAAC;AAC5F,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AACpD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAItD,mFAAmF;AACnF,MAAM,WAAW,UAAU;IACzB,0FAA0F;IAC1F,YAAY,EAAE,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IACtC,kFAAkF;IAClF,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7B,UAAU,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC;IACvC,UAAU,CAAC,EAAE,UAAU,CAAC;IACxB,QAAQ,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,MAAM,CAAC;IAC1C,UAAU,CAAC,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,UAAU,EAAE,UAAU,KAAK,OAAO,CAAC,CAAC,CAAC,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC;IAC3F,GAAG,EAAE,MAAM,CAAC;CACb;AAqHD;;;;;;GAMG;AACH,wBAAgB,cAAc,CAC5B,KAAK,EAAE,SAAS,EAChB,IAAI,EAAE,QAAQ,CAAC,MAAM,CAAC,EACtB,SAAS,EAAE,SAAS,aAAa,EAAE,EACnC,KAAK,EAAE,UAAU,GAChB,IAAI,CAwDN"}
|
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Building a frame — what a handler asking for `Together<[…]>` receives.
|
|
3
|
+
*
|
|
4
|
+
* The declaration names its members and nothing else; where they live, and therefore
|
|
5
|
+
* which of the two realizations they get, is read HERE and stated at boot. A frame whose
|
|
6
|
+
* members share an engine is a transaction; one whose members are split replays its own
|
|
7
|
+
* inverses (`frame.ts`). Same user code, two guarantees, and the boot says which — the
|
|
8
|
+
* one thing a gradient must never leave to assumption.
|
|
9
|
+
*/
|
|
10
|
+
import { ambient } from '#ambient';
|
|
11
|
+
import { classNameOf, registrationKeyOf } from '@fougere/schema';
|
|
12
|
+
import { membersOfTogetherKey, ormKeyOf } from '../orm.js';
|
|
13
|
+
import { guardStorage } from './egress.js';
|
|
14
|
+
import { recording, unwind } from './frame.js';
|
|
15
|
+
/**
|
|
16
|
+
* Each declared name, resolved to what it designates.
|
|
17
|
+
*
|
|
18
|
+
* A name that resolves to nothing is refused rather than skipped: `Together<[Account,
|
|
19
|
+
* Ledgre]>` is a typo whose only other symptom is a frame quietly one member short. The
|
|
20
|
+
* two lists are checked against different registries, which is exactly why the declaration
|
|
21
|
+
* separates them — nothing here has to guess what kind a name is.
|
|
22
|
+
*/
|
|
23
|
+
function resolve(names, declared, world) {
|
|
24
|
+
const entities = names.entities.map((member) => {
|
|
25
|
+
const name = registrationKeyOf(member);
|
|
26
|
+
const schema = world.entityByName.get(name);
|
|
27
|
+
if (!schema) {
|
|
28
|
+
throw new Error(`Together<[…${member}…]>: no entity named '${member}' is scanned in this app. ` +
|
|
29
|
+
`The first list names entities; a class of this frond goes in the second.`);
|
|
30
|
+
}
|
|
31
|
+
return { name, schema };
|
|
32
|
+
});
|
|
33
|
+
const providers = names.providers.map((member) => {
|
|
34
|
+
const entry = declared.find((provider) => provider.ctor.name === member);
|
|
35
|
+
if (!entry) {
|
|
36
|
+
throw new Error(`Together<[…], [… ${member} …]>: this frond declares no class named '${member}'. ` +
|
|
37
|
+
`The second list names providers to rebuild inside the frame — a service, a mirror, ` +
|
|
38
|
+
`a repository — so that what they write is covered by the unwind.`);
|
|
39
|
+
}
|
|
40
|
+
return entry;
|
|
41
|
+
});
|
|
42
|
+
return { entities, providers };
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* A member that cannot write here at all — its frond is hosted elsewhere.
|
|
46
|
+
*
|
|
47
|
+
* Refused rather than compensated: a compensated frame still writes through a local ORM,
|
|
48
|
+
* and a remote frond registers none. There is nothing to record and nothing to undo.
|
|
49
|
+
*/
|
|
50
|
+
function refuseRemote(members, world, key) {
|
|
51
|
+
for (const member of members.entities) {
|
|
52
|
+
const frond = world.frondOf.get(member.name);
|
|
53
|
+
if (frond && !world.hostedHere(frond)) {
|
|
54
|
+
throw new Error(`Together<[…]> (${key}): '${member.name}' belongs to frond '${frond}', which this ` +
|
|
55
|
+
`process declares in remotes: — it registers no storage here, so its writes cannot be ` +
|
|
56
|
+
`part of a frame. Host the frond here, or split the work and join the halves with a fact.`);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* A provider member writing an entity the frame does not name.
|
|
62
|
+
*
|
|
63
|
+
* The frame does not widen itself to cover it: doing so would pull an entity from another
|
|
64
|
+
* source into the group without anyone writing it down. Named instead, with the one-word fix.
|
|
65
|
+
*/
|
|
66
|
+
function refuseUncoveredWrites(members, key) {
|
|
67
|
+
const covered = new Set(members.entities.map((member) => member.name));
|
|
68
|
+
for (const provider of members.providers) {
|
|
69
|
+
for (const dep of provider.deps) {
|
|
70
|
+
if (!dep.endsWith('Orm'))
|
|
71
|
+
continue;
|
|
72
|
+
const entity = registrationKeyOf(dep.slice(0, -'Orm'.length));
|
|
73
|
+
if (covered.has(entity))
|
|
74
|
+
continue;
|
|
75
|
+
throw new Error(`Together<[…]> (${key}): ${provider.ctor.name} writes ${entity}, which is not in the ` +
|
|
76
|
+
`frame's entity list — its writes would escape the unwind. Add it: ` +
|
|
77
|
+
`Together<[…, ${classNameOf(entity)}], [… ${provider.ctor.name} …]>.`);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Open the block: build every member over `factory`, in a scope of their own.
|
|
83
|
+
*
|
|
84
|
+
* The scope is what makes a provider member work without a locator — its ORM keys are
|
|
85
|
+
* registered here, so the container hands it the framed ones through the ordinary
|
|
86
|
+
* constructor. It is disposed when the block ends, whichever way it ended.
|
|
87
|
+
*/
|
|
88
|
+
async function inScope(parent, members, factory, wrap, fn) {
|
|
89
|
+
const scope = parent.createScope();
|
|
90
|
+
try {
|
|
91
|
+
const orms = members.entities.map((member) => {
|
|
92
|
+
const orm = wrap(factory(member.schema, member.name), member.name, member.schema);
|
|
93
|
+
scope.registerValue(ormKeyOf(member.name), orm);
|
|
94
|
+
return orm;
|
|
95
|
+
});
|
|
96
|
+
// Providers after every ORM is in place: one may depend on another member's.
|
|
97
|
+
const built = members.providers.map((provider) => {
|
|
98
|
+
scope.register(provider.ctor.name, provider.ctor, { deps: provider.deps });
|
|
99
|
+
return scope.resolve(provider.ctor.name);
|
|
100
|
+
});
|
|
101
|
+
return await fn(orms, built);
|
|
102
|
+
}
|
|
103
|
+
finally {
|
|
104
|
+
await scope.dispose();
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Register one frame per key a handler or provider of this frond asked for.
|
|
109
|
+
*
|
|
110
|
+
* Called with the frond's scope, because that is where the asking constructor resolves —
|
|
111
|
+
* while the MEMBERS are looked up app-wide, a frame crossing fronds being the ordinary case
|
|
112
|
+
* rather than the exception (the frond is not the storage boundary; `sources:` is).
|
|
113
|
+
*/
|
|
114
|
+
export function registerFrames(scope, keys, providers, world) {
|
|
115
|
+
let registered = 0;
|
|
116
|
+
for (const key of new Set(keys)) {
|
|
117
|
+
const names = membersOfTogetherKey(key);
|
|
118
|
+
if (!names)
|
|
119
|
+
continue;
|
|
120
|
+
registered += 1;
|
|
121
|
+
if (!world.ormFactory) {
|
|
122
|
+
throw new Error(`Together<[${names.entities.join(', ')}]> needs storage, and this boot declares none.`);
|
|
123
|
+
}
|
|
124
|
+
const members = resolve(names, providers, world);
|
|
125
|
+
refuseRemote(members, world, key);
|
|
126
|
+
refuseUncoveredWrites(members, key);
|
|
127
|
+
const sources = new Set(members.entities.map((member) => world.sourceOf?.(member.name) ?? 'db'));
|
|
128
|
+
const judge = (orm, name, schema) => guardStorage(orm, schema.getFields(), name);
|
|
129
|
+
// One engine and a way into it: the engine gives the unwind AND the isolation.
|
|
130
|
+
if (world.transacted && sources.size === 1) {
|
|
131
|
+
const source = [...sources][0];
|
|
132
|
+
world.log.info(`${key} — transaction, source '${source}'`);
|
|
133
|
+
scope.registerValue(key, {
|
|
134
|
+
run: (fn) => ambient.enterFrame(key, () => world.transacted(source, (factory) => inScope(scope, members, factory, judge, fn))),
|
|
135
|
+
});
|
|
136
|
+
continue;
|
|
137
|
+
}
|
|
138
|
+
// Split, or an engine that hands out no transaction: the frame keeps the before-image
|
|
139
|
+
// of every write and replays the inverses itself. `judge` stays OUTSIDE `recording`, so
|
|
140
|
+
// a write the entity refuses never enters the journal.
|
|
141
|
+
const why = sources.size > 1
|
|
142
|
+
? members.entities.map((m) => `${m.name} in '${world.sourceOf?.(m.name) ?? 'db'}'`).join(', ')
|
|
143
|
+
: 'this storage hands out no transaction';
|
|
144
|
+
world.log.info(`${key} — compensated: ${why} — no isolation`);
|
|
145
|
+
scope.registerValue(key, {
|
|
146
|
+
run: (fn) => ambient.enterFrame(key, async () => {
|
|
147
|
+
const journal = [];
|
|
148
|
+
const record = (orm, name, schema) => judge(recording(orm, name, schema.getFields(), journal), name, schema);
|
|
149
|
+
try {
|
|
150
|
+
return await inScope(scope, members, world.ormFactory, record, fn);
|
|
151
|
+
}
|
|
152
|
+
catch (cause) {
|
|
153
|
+
return unwind(journal, cause, world.log);
|
|
154
|
+
}
|
|
155
|
+
}),
|
|
156
|
+
});
|
|
157
|
+
}
|
|
158
|
+
if (registered > 0 && ambient.degraded) {
|
|
159
|
+
world.log.warn('no async context on this runtime — frames run one at a time, and a frame opened '
|
|
160
|
+
+ 'inside another times out instead of being refused');
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
//# sourceMappingURL=together.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"together.js","sourceRoot":"","sources":["../../src/boot/together.ts"],"names":[],"mappings":"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"}
|