@zlink-systems/framework 0.21.0 → 0.23.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/dist/.tsbuildinfo +1 -1
- package/dist/contracts/Common/ZLinkMessage.js +5 -5
- package/dist/contracts/Configuration/CodecContentType.js +5 -7
- package/dist/contracts/Configuration/DiagnosticsValidation.js +1 -6
- package/dist/contracts/Configuration/EndpointNotation.js +4 -8
- package/dist/contracts/Configuration/Registration.js +14 -11
- package/dist/contracts/Configuration/RegistrationBuilders.js +32 -25
- package/dist/contracts/Configuration/RegistrationNormalizers.js +25 -26
- package/dist/contracts/Configuration/RegistrationValidators.js +36 -38
- package/dist/contracts/Configuration/SendTimeoutValidation.js +4 -4
- package/dist/contracts/Configuration/TimerRegistrationValidator.js +7 -7
- package/dist/contracts/Dispatch/ZLinkDispatchOptions.d.ts +1 -0
- package/dist/contracts/Handlers/JsonContract.js +23 -11
- package/dist/contracts/Spots/SpotKind.js +16 -8
- package/dist/contracts/Streams/IZLinkSession.d.ts +2 -1
- package/dist/location-store-integration.js +16 -16
- package/dist/nest-integration.js +17 -11
- package/dist/runtime/abort.js +9 -5
- package/dist/runtime/actors/actor-authority-payload-codec.js +12 -16
- package/dist/runtime/actors/actor-authority-publication.js +18 -17
- package/dist/runtime/actors/actor-client.js +83 -63
- package/dist/runtime/actors/actor-context.js +28 -22
- package/dist/runtime/actors/actor-creation.js +4 -3
- package/dist/runtime/actors/actor-handoff.js +89 -92
- package/dist/runtime/actors/actor-join-deferred-scope.d.ts +0 -1
- package/dist/runtime/actors/actor-join-deferred-scope.js +0 -18
- package/dist/runtime/actors/actor-local-native-join.js +18 -19
- package/dist/runtime/actors/actor-mailbox.js +1 -1
- package/dist/runtime/actors/actor-message-follow-context.js +24 -21
- package/dist/runtime/actors/actor-packet-relay-wire.js +1 -3
- package/dist/runtime/actors/actor-remote-joiner.js +20 -17
- package/dist/runtime/actors/actor-remote-wire.js +6 -7
- package/dist/runtime/actors/actor-runtime-state.js +87 -81
- package/dist/runtime/actors/actor-transfer-registry.js +3 -5
- package/dist/runtime/actors/bound-session-wire.js +14 -9
- package/dist/runtime/actors/deferred-join-accepted-journal.js +160 -130
- package/dist/runtime/actors/index.js +2 -5
- package/dist/runtime/actors/post-commit-actor-binder.js +3 -6
- package/dist/runtime/actors/post-commit-actor-location.js +1 -1
- package/dist/runtime/actors/spot-actor-dispatch.js +5 -5
- package/dist/runtime/actors/transferred-actor-rollback.js +4 -4
- package/dist/runtime/admission.js +2 -6
- package/dist/runtime/application-jobs/application-ingress-record-owner.js +2 -6
- package/dist/runtime/application-jobs/receive-flow-controller.js +11 -12
- package/dist/runtime/backend/contracts/index.d.ts +1 -0
- package/dist/runtime/backend/mesh-completion-table.js +1 -3
- package/dist/runtime/backend/mesh-dispatch-pump.js +12 -16
- package/dist/runtime/backend/node/node-backend-adapter-factory.js +1 -3
- package/dist/runtime/backend/node/node-backend-adapter-support.js +26 -17
- package/dist/runtime/backend/node/node-mesh-backend-adapter.js +4 -3
- package/dist/runtime/backend/node/node-raw-binding-port.js +7 -6
- package/dist/runtime/backend/node/node-raw-mesh-backend.d.ts +3 -0
- package/dist/runtime/backend/node/node-raw-mesh-backend.js +134 -118
- package/dist/runtime/backend/node/node-socket-backend-adapter.js +12 -13
- package/dist/runtime/backend/runtime-message.js +3 -3
- package/dist/runtime/backend/runtime-values.d.ts +2 -2
- package/dist/runtime/backend/runtime-values.js +4 -5
- package/dist/runtime/channels/channel-clients.js +27 -24
- package/dist/runtime/channels/channel-dispatch-pipeline.js +12 -20
- package/dist/runtime/channels/channel-dispatch-services.js +7 -4
- package/dist/runtime/channels/channel-dispatchers.js +9 -9
- package/dist/runtime/channels/channel-envelope-inspection.js +16 -13
- package/dist/runtime/channels/channel-envelope.js +83 -47
- package/dist/runtime/channels/channel-outbound-operations.js +8 -8
- package/dist/runtime/channels/channel-receive-loops.js +20 -22
- package/dist/runtime/channels/channel-receive-task-tracker.js +1 -1
- package/dist/runtime/channels/channel-runtime-lifecycle.js +61 -56
- package/dist/runtime/channels/channel-runtime-manager.js +18 -9
- package/dist/runtime/channels/channel-socket-registry.js +126 -123
- package/dist/runtime/channels/channel-transports.js +46 -42
- package/dist/runtime/channels/client-server-location-runtime.js +32 -40
- package/dist/runtime/channels/client-server-service-wire.js +29 -22
- package/dist/runtime/channels/dispatch-error-reporter.d.ts +1 -0
- package/dist/runtime/channels/dispatch-error-reporter.js +9 -39
- package/dist/runtime/channels/fanout-location-runtime.js +34 -47
- package/dist/runtime/channels/fanout-service-wire.js +3 -5
- package/dist/runtime/channels/local-spot-route-transport.js +7 -1
- package/dist/runtime/channels/route-member-snapshot.js +3 -3
- package/dist/runtime/channels/source-spot-router.js +6 -2
- package/dist/runtime/channels/spot-route-bridge-transport.js +5 -2
- package/dist/runtime/channels/spot-route-dispatch-strategy.js +2 -2
- package/dist/runtime/channels/spot-route-target-resolver.js +6 -6
- package/dist/runtime/diagnostics/dispatch-error-details.d.ts +6 -0
- package/dist/runtime/diagnostics/dispatch-error-details.js +55 -0
- package/dist/runtime/diagnostics/flow-context.d.ts +2 -1
- package/dist/runtime/diagnostics/flow-context.js +2 -2
- package/dist/runtime/diagnostics/index.js +38 -10
- package/dist/runtime/diagnostics/message-flow.js +58 -42
- package/dist/runtime/diagnostics/runtime-metrics.js +18 -9
- package/dist/runtime/diagnostics/runtime-observation-queue.js +8 -10
- package/dist/runtime/diagnostics/topology-runtime-projections.js +17 -10
- package/dist/runtime/execution/index.js +7 -6
- package/dist/runtime/execution/serial-execution-queue.js +12 -18
- package/dist/runtime/execution/state-lane.js +2 -2
- package/dist/runtime/foundation/actor-join-recovery-codec.js +31 -27
- package/dist/runtime/foundation/event-loop-resources.js +4 -4
- package/dist/runtime/foundation/message-follow-suppression-registry.js +4 -4
- package/dist/runtime/foundation/raw-service-mesh-runtime.d.ts +4 -2
- package/dist/runtime/foundation/raw-service-mesh-runtime.js +169 -144
- package/dist/runtime/foundation/route-mesh-connection-policy.js +4 -4
- package/dist/runtime/foundation/runtime-state-projections.js +22 -11
- package/dist/runtime/foundation/service-authority-payload-codec.js +13 -15
- package/dist/runtime/foundation/service-discovery-registry.js +35 -33
- package/dist/runtime/foundation/service-instance-activation-recovery-codec.js +20 -22
- package/dist/runtime/foundation/service-liveness-registry.js +16 -12
- package/dist/runtime/foundation/service-maintenance-runtime.js +2 -4
- package/dist/runtime/foundation/service-relocation-aggregate-committer.js +24 -24
- package/dist/runtime/foundation/service-relocation-object-owner.js +6 -6
- package/dist/runtime/foundation/service-relocation-runtime.js +137 -94
- package/dist/runtime/foundation/service-runtime-contracts.js +5 -5
- package/dist/runtime/foundation/service-session-binding-ingress-port.d.ts +1 -0
- package/dist/runtime/foundation/service-stateful-registry.js +24 -23
- package/dist/runtime/foundation/service-stateful-runtime.d.ts +4 -0
- package/dist/runtime/foundation/service-stateful-runtime.js +461 -439
- package/dist/runtime/foundation/service-stateful-wire-codec.js +95 -98
- package/dist/runtime/foundation/service-topology-registry.d.ts +1 -0
- package/dist/runtime/foundation/service-topology-registry.js +105 -96
- package/dist/runtime/foundation/service-weighted-selection.js +6 -11
- package/dist/runtime/foundation/service-wire-binary-primitives.js +5 -6
- package/dist/runtime/foundation/service-wire-m6a-codec.js +46 -35
- package/dist/runtime/framework-errors-internal.js +7 -10
- package/dist/runtime/handlers/handler-instance-scope.js +4 -5
- package/dist/runtime/handlers/index.js +3 -1
- package/dist/runtime/host/actor-packet-relay.js +74 -70
- package/dist/runtime/host/actor-placement-coordinator.js +29 -31
- package/dist/runtime/host/actor-runtime-options-factory.js +12 -14
- package/dist/runtime/host/actor-transfer-authority-runtime.js +7 -9
- package/dist/runtime/host/actor-transfer-runtime.js +176 -153
- package/dist/runtime/host/application-job-queue.js +18 -22
- package/dist/runtime/host/bound-session-relay.js +3 -1
- package/dist/runtime/host/channel-runtime-options-factory.js +31 -14
- package/dist/runtime/host/host-capacity-status.js +8 -4
- package/dist/runtime/host/index.js +245 -228
- package/dist/runtime/host/instance-activation-authority.js +93 -96
- package/dist/runtime/host/location-runtime-owner.js +16 -14
- package/dist/runtime/host/mesh-router-resolver.js +11 -13
- package/dist/runtime/host/relocation-direct-transfer.js +10 -9
- package/dist/runtime/host/remote-actor-join-receiver.js +20 -15
- package/dist/runtime/host/remote-actor-packet-target-store.js +18 -22
- package/dist/runtime/host/remote-bound-session-relay.js +97 -73
- package/dist/runtime/host/route-mesh-runtime.js +64 -69
- package/dist/runtime/host/runtime-shutdown.js +1 -2
- package/dist/runtime/host/service-relocation-host-runtime.js +586 -511
- package/dist/runtime/host/spot-address-transport.js +69 -71
- package/dist/runtime/host/spot-runtime-options-factory.js +30 -29
- package/dist/runtime/host/stateful-authority-route-runtime.js +65 -68
- package/dist/runtime/host/user-spot-creation-coordinator.js +61 -67
- package/dist/runtime/locations/actor-location-claims.js +26 -20
- package/dist/runtime/locations/aggregate-inventory-store.js +72 -75
- package/dist/runtime/locations/authority-key-codec.js +7 -7
- package/dist/runtime/locations/auto-connect-loop.js +3 -3
- package/dist/runtime/locations/auto-connect-planner.js +25 -19
- package/dist/runtime/locations/auto-connect-reconciler.js +51 -31
- package/dist/runtime/locations/in-memory-authority-store.js +128 -118
- package/dist/runtime/locations/in-memory-location-store.js +195 -168
- package/dist/runtime/locations/in-memory-provider-location-store.js +8 -10
- package/dist/runtime/locations/key-codec.js +1 -1
- package/dist/runtime/locations/lease-tracker.js +23 -21
- package/dist/runtime/locations/lifecycle.js +4 -5
- package/dist/runtime/locations/location-store-repository.js +368 -324
- package/dist/runtime/locations/opaque-record-key.js +2 -2
- package/dist/runtime/locations/resolvers.js +73 -82
- package/dist/runtime/locations/runtime.js +68 -63
- package/dist/runtime/locations/spot-location-claims.js +39 -35
- package/dist/runtime/messaging/framework-json-v1.js +7 -7
- package/dist/runtime/messaging/packet-name.js +7 -6
- package/dist/runtime/messaging/payload-codec.js +21 -18
- package/dist/runtime/protocol/service_wire_codec.generated.d.ts +30 -2
- package/dist/runtime/protocol/service_wire_codec.generated.js +1671 -234
- package/dist/runtime/protocol/service_wire_pilot_codec.generated.js +20 -18
- package/dist/runtime/routing-id.js +3 -5
- package/dist/runtime/spots/formal-remote-actor-admission-registry.js +35 -31
- package/dist/runtime/spots/formal-remote-actor-transfer-registry.js +1 -2
- package/dist/runtime/spots/index.js +209 -220
- package/dist/runtime/spots/spot-activation-registry.js +15 -14
- package/dist/runtime/spots/spot-activation-state.js +17 -15
- package/dist/runtime/spots/spot-activation.js +33 -16
- package/dist/runtime/spots/spot-actor-admission-coordinator.js +18 -15
- package/dist/runtime/spots/spot-actor-membership.js +1 -3
- package/dist/runtime/spots/spot-actor-packet-dispatch.d.ts +2 -1
- package/dist/runtime/spots/spot-actor-packet-dispatch.js +29 -21
- package/dist/runtime/spots/spot-actor-packet-drain.js +14 -10
- package/dist/runtime/spots/spot-actor-packet-relay-dispatch.js +10 -6
- package/dist/runtime/spots/spot-closing.js +3 -7
- package/dist/runtime/spots/spot-context.js +2 -2
- package/dist/runtime/spots/spot-entry-activation.js +13 -14
- package/dist/runtime/spots/spot-handle.js +6 -3
- package/dist/runtime/spots/spot-handler-registry.js +12 -12
- package/dist/runtime/spots/spot-manager-public.js +5 -6
- package/dist/runtime/spots/spot-native-actor-join-admission.js +4 -3
- package/dist/runtime/spots/spot-node-autoconnect.js +15 -18
- package/dist/runtime/spots/spot-node-runtime-manager.js +79 -86
- package/dist/runtime/spots/spot-outbound.js +10 -14
- package/dist/runtime/spots/spot-remote-codec.js +22 -26
- package/dist/runtime/spots/spot-remote-route-codec.js +5 -7
- package/dist/runtime/spots/spot-route-packet-dispatch.js +17 -15
- package/dist/runtime/spots/spot-route-replies.js +4 -6
- package/dist/runtime/spots/spot-routed-actor-admission.js +9 -7
- package/dist/runtime/spots/spot-routed-bound-session-dispatch.js +2 -3
- package/dist/runtime/spots/spot-routed-frame-dispatch.js +5 -5
- package/dist/runtime/spots/spot-routed-spot-packet-dispatch.js +14 -10
- package/dist/runtime/spots/spot-serial-executor.js +5 -8
- package/dist/runtime/spots/spot-serial-turn-executor.js +4 -6
- package/dist/runtime/spots/spot-subscription-dispatch.js +6 -6
- package/dist/runtime/spots/spot-timer.js +26 -30
- package/dist/runtime/streams/actor-session-binding-registry.d.ts +21 -8
- package/dist/runtime/streams/actor-session-binding-registry.js +168 -148
- package/dist/runtime/streams/actor-session-binding-runtime-owner.d.ts +1 -0
- package/dist/runtime/streams/actor-session-lifecycle-coordinator.js +3 -1
- package/dist/runtime/streams/bound-actor-relay-sender.js +20 -17
- package/dist/runtime/streams/bound-session-response-target.js +8 -1
- package/dist/runtime/streams/bound-session-service.d.ts +1 -0
- package/dist/runtime/streams/bound-session-service.js +14 -12
- package/dist/runtime/streams/index.js +28 -20
- package/dist/runtime/streams/managed-stream.d.ts +3 -0
- package/dist/runtime/streams/managed-stream.js +52 -31
- package/dist/runtime/streams/native-fallback-bound-session.js +21 -17
- package/dist/runtime/streams/protocol.d.ts +5 -1
- package/dist/runtime/streams/protocol.js +68 -20
- package/dist/runtime/streams/session-actor-coordinator.js +37 -41
- package/dist/runtime/streams/session-context.d.ts +9 -2
- package/dist/runtime/streams/session-context.js +50 -32
- package/dist/runtime/streams/session-local-actors.d.ts +3 -1
- package/dist/runtime/streams/session-local-actors.js +17 -2
- package/dist/runtime/streams/session-provider.js +2 -2
- package/dist/runtime/streams/session-serial-executor.js +1 -2
- package/dist/runtime/streams/stream-frame-factory.d.ts +1 -1
- package/dist/runtime/streams/stream-frame-factory.js +14 -7
- package/dist/runtime/streams/stream-session-runtime.js +112 -78
- package/dist/runtime/workers/index.js +15 -4
- package/package.json +3 -3
- package/src/contracts/Channels/RouteCalls.ts +6 -1
- package/src/contracts/Common/ZLinkMessage.ts +5 -5
- package/src/contracts/Common/ZLinkMessageMetadata.ts +4 -3
- package/src/contracts/Configuration/Builders.ts +14 -14
- package/src/contracts/Configuration/CodecContentType.ts +8 -10
- package/src/contracts/Configuration/DiagnosticsValidation.ts +1 -6
- package/src/contracts/Configuration/EndpointNotation.ts +11 -11
- package/src/contracts/Configuration/ObjectRoles.ts +1 -3
- package/src/contracts/Configuration/Registration.ts +46 -17
- package/src/contracts/Configuration/RegistrationBuilderPolicy.ts +10 -8
- package/src/contracts/Configuration/RegistrationBuilders.ts +107 -96
- package/src/contracts/Configuration/RegistrationCodecRegistry.ts +9 -3
- package/src/contracts/Configuration/RegistrationNormalizers.ts +116 -84
- package/src/contracts/Configuration/RegistrationTypes.ts +21 -25
- package/src/contracts/Configuration/RegistrationValidators.ts +122 -73
- package/src/contracts/Configuration/RouteChannelInternalState.ts +1 -4
- package/src/contracts/Configuration/RuntimeEndpointConnections.ts +4 -1
- package/src/contracts/Configuration/SendTimeoutValidation.ts +6 -4
- package/src/contracts/Configuration/TimerRegistrationValidator.ts +8 -13
- package/src/contracts/Dispatch/ZLinkDispatchOptions.ts +2 -6
- package/src/contracts/Errors/index.ts +1 -4
- package/src/contracts/Handlers/Attributes.ts +15 -9
- package/src/contracts/Handlers/IZLinkChannelHandlers.ts +24 -4
- package/src/contracts/Handlers/JsonContract.ts +53 -19
- package/src/contracts/Locations/ActorTransfer.ts +1 -5
- package/src/contracts/Locations/Authority.ts +4 -11
- package/src/contracts/Locations/Keys.ts +6 -1
- package/src/contracts/Locations/Options.ts +3 -2
- package/src/contracts/Locations/RelocationStore.ts +1 -4
- package/src/contracts/Locations/Resolvers.ts +5 -5
- package/src/contracts/Locations/RuntimeQuery.ts +6 -2
- package/src/contracts/Locations/Stores.ts +1 -2
- package/src/contracts/Locations/index.ts +2 -8
- package/src/contracts/RouteMesh/Contracts.ts +1 -7
- package/src/contracts/RouteMesh/RuntimeTopology.ts +1 -4
- package/src/contracts/Spots/Contracts.ts +2 -8
- package/src/contracts/Spots/SpotKind.ts +16 -8
- package/src/contracts/Spots/ZLinkSpot.ts +8 -11
- package/src/contracts/Streams/IZLinkSession.ts +2 -2
- package/src/contracts/Streams/IZLinkSessionActor.ts +5 -1
- package/src/contracts/Streams/IZLinkSessionPacketHandler.ts +5 -1
- package/src/internal.ts +5 -4
- package/src/location-store-integration.ts +24 -16
- package/src/nest-integration.ts +40 -25
- package/src/runtime/abort.ts +10 -4
- package/src/runtime/actors/actor-authority-payload-codec.ts +20 -29
- package/src/runtime/actors/actor-authority-publication.ts +92 -77
- package/src/runtime/actors/actor-client.ts +162 -133
- package/src/runtime/actors/actor-context.ts +142 -134
- package/src/runtime/actors/actor-creation.ts +47 -44
- package/src/runtime/actors/actor-execution-context.ts +6 -4
- package/src/runtime/actors/actor-handoff.ts +269 -293
- package/src/runtime/actors/actor-join-deferred-scope.ts +1 -32
- package/src/runtime/actors/actor-lifecycle-snapshot.ts +5 -8
- package/src/runtime/actors/actor-local-native-join.ts +131 -159
- package/src/runtime/actors/actor-mailbox.ts +16 -19
- package/src/runtime/actors/actor-message-follow-context.ts +46 -36
- package/src/runtime/actors/actor-packet-relay-wire.ts +32 -21
- package/src/runtime/actors/actor-remote-joiner.ts +50 -54
- package/src/runtime/actors/actor-remote-wire.ts +9 -13
- package/src/runtime/actors/actor-routed-join-transport.ts +10 -2
- package/src/runtime/actors/actor-runtime-contracts.ts +2 -5
- package/src/runtime/actors/actor-runtime-state.ts +127 -124
- package/src/runtime/actors/actor-transfer-registry.ts +9 -14
- package/src/runtime/actors/actor-transport-delivery-gate.ts +4 -6
- package/src/runtime/actors/bound-session-wire.ts +37 -17
- package/src/runtime/actors/deferred-join-accepted-journal.ts +353 -326
- package/src/runtime/actors/index.ts +43 -86
- package/src/runtime/actors/post-commit-actor-binder.ts +10 -10
- package/src/runtime/actors/post-commit-actor-location.ts +30 -23
- package/src/runtime/actors/spot-actor-dispatch.ts +78 -53
- package/src/runtime/actors/transferred-actor-rollback.ts +18 -13
- package/src/runtime/admission.ts +9 -9
- package/src/runtime/application-jobs/application-ingress-record-owner.ts +5 -15
- package/src/runtime/application-jobs/application-job-queue-handler-start-gate.ts +3 -2
- package/src/runtime/application-jobs/receive-flow-controller.ts +17 -14
- package/src/runtime/backend/contracts/index.ts +77 -52
- package/src/runtime/backend/mesh-actor-session-node-adapter.ts +4 -14
- package/src/runtime/backend/mesh-completion-table.ts +6 -9
- package/src/runtime/backend/mesh-dispatch-pump.ts +38 -30
- package/src/runtime/backend/node/node-backend-adapter-factory.ts +23 -21
- package/src/runtime/backend/node/node-backend-adapter-support.ts +36 -22
- package/src/runtime/backend/node/node-dealer-channel-client-transport.ts +59 -58
- package/src/runtime/backend/node/node-event-loop-poller.ts +2 -10
- package/src/runtime/backend/node/node-mesh-backend-adapter.ts +12 -5
- package/src/runtime/backend/node/node-monitor-backend-adapter.ts +4 -3
- package/src/runtime/backend/node/node-raw-binding-port.ts +29 -29
- package/src/runtime/backend/node/node-raw-mesh-backend.ts +370 -390
- package/src/runtime/backend/node/node-socket-backend-adapter.ts +101 -54
- package/src/runtime/backend/runtime-message.ts +5 -3
- package/src/runtime/backend/runtime-values.ts +10 -7
- package/src/runtime/channels/channel-autoconnect.ts +1 -4
- package/src/runtime/channels/channel-clients.ts +93 -73
- package/src/runtime/channels/channel-dispatch-pipeline.ts +44 -44
- package/src/runtime/channels/channel-dispatch-services.ts +51 -49
- package/src/runtime/channels/channel-dispatchers.ts +152 -96
- package/src/runtime/channels/channel-envelope-inspection.ts +20 -16
- package/src/runtime/channels/channel-envelope.ts +256 -150
- package/src/runtime/channels/channel-multipart.ts +13 -5
- package/src/runtime/channels/channel-outbound-operations.ts +37 -41
- package/src/runtime/channels/channel-receive-loops.ts +102 -98
- package/src/runtime/channels/channel-receive-task-tracker.ts +1 -1
- package/src/runtime/channels/channel-runtime-lifecycle.ts +248 -190
- package/src/runtime/channels/channel-runtime-manager.ts +63 -37
- package/src/runtime/channels/channel-socket-options.ts +3 -10
- package/src/runtime/channels/channel-socket-registry.ts +331 -273
- package/src/runtime/channels/channel-transports.ts +218 -206
- package/src/runtime/channels/client-server-location-runtime.ts +116 -100
- package/src/runtime/channels/client-server-service-wire.ts +37 -36
- package/src/runtime/channels/dispatch-error-reporter.ts +12 -47
- package/src/runtime/channels/fanout-location-runtime.ts +91 -94
- package/src/runtime/channels/fanout-service-wire.ts +5 -12
- package/src/runtime/channels/handler-filter-scope.ts +1 -4
- package/src/runtime/channels/index.ts +1 -4
- package/src/runtime/channels/local-spot-route-transport.ts +20 -5
- package/src/runtime/channels/route-member-snapshot.ts +11 -5
- package/src/runtime/channels/router-socket-spot-route-transport.ts +1 -7
- package/src/runtime/channels/source-spot-router.ts +26 -22
- package/src/runtime/channels/spot-direct-envelope.ts +10 -8
- package/src/runtime/channels/spot-node-route-transport.ts +13 -16
- package/src/runtime/channels/spot-route-bridge-transport.ts +26 -9
- package/src/runtime/channels/spot-route-dispatch-strategy.ts +40 -13
- package/src/runtime/channels/spot-route-target-resolver.ts +18 -9
- package/src/runtime/codecs/index.ts +3 -2
- package/src/runtime/diagnostics/dispatch-error-details.ts +62 -0
- package/src/runtime/diagnostics/flow-context.ts +18 -7
- package/src/runtime/diagnostics/index.ts +96 -61
- package/src/runtime/diagnostics/internal-event-contracts.ts +87 -33
- package/src/runtime/diagnostics/message-flow.ts +107 -79
- package/src/runtime/diagnostics/runtime-metrics.ts +46 -24
- package/src/runtime/diagnostics/runtime-observation-queue.ts +17 -28
- package/src/runtime/diagnostics/topology-runtime-projections.ts +62 -43
- package/src/runtime/execution/index.ts +18 -26
- package/src/runtime/execution/serial-execution-queue.ts +31 -40
- package/src/runtime/execution/state-lane.ts +2 -2
- package/src/runtime/foundation/actor-join-recovery-codec.ts +69 -55
- package/src/runtime/foundation/event-loop-resources.ts +8 -4
- package/src/runtime/foundation/message-follow-suppression-registry.ts +7 -14
- package/src/runtime/foundation/operation-identity.ts +1 -2
- package/src/runtime/foundation/operation-registry.ts +8 -2
- package/src/runtime/foundation/raw-service-mesh-runtime.ts +364 -396
- package/src/runtime/foundation/route-mesh-connection-policy.ts +7 -8
- package/src/runtime/foundation/runtime-state-projections.ts +24 -23
- package/src/runtime/foundation/service-authority-payload-codec.ts +54 -57
- package/src/runtime/foundation/service-discovery-registry.ts +67 -59
- package/src/runtime/foundation/service-instance-activation-recovery-codec.ts +28 -29
- package/src/runtime/foundation/service-liveness-registry.ts +18 -13
- package/src/runtime/foundation/service-mailbox.ts +14 -14
- package/src/runtime/foundation/service-maintenance-runtime.ts +22 -21
- package/src/runtime/foundation/service-metadata-codec.ts +2 -9
- package/src/runtime/foundation/service-relocation-aggregate-committer.ts +39 -36
- package/src/runtime/foundation/service-relocation-coordinator.ts +1 -4
- package/src/runtime/foundation/service-relocation-object-owner.ts +40 -58
- package/src/runtime/foundation/service-relocation-runtime.ts +292 -216
- package/src/runtime/foundation/service-runtime-contracts.ts +8 -8
- package/src/runtime/foundation/service-session-binding-ingress-port.ts +2 -4
- package/src/runtime/foundation/service-stateful-registry.ts +69 -59
- package/src/runtime/foundation/service-stateful-runtime.ts +1233 -1112
- package/src/runtime/foundation/service-stateful-wire-codec.ts +318 -270
- package/src/runtime/foundation/service-topology-registry.ts +170 -159
- package/src/runtime/foundation/service-weighted-selection.ts +9 -15
- package/src/runtime/foundation/service-wire-binary-primitives.ts +6 -12
- package/src/runtime/foundation/service-wire-m6a-codec.ts +69 -47
- package/src/runtime/framework-errors-internal.ts +31 -30
- package/src/runtime/handlers/handler-instance-scope.ts +18 -29
- package/src/runtime/handlers/index.ts +18 -8
- package/src/runtime/host/actor-packet-relay.ts +290 -261
- package/src/runtime/host/actor-placement-coordinator.ts +165 -150
- package/src/runtime/host/actor-runtime-options-factory.ts +89 -87
- package/src/runtime/host/actor-transfer-authority-runtime.ts +46 -38
- package/src/runtime/host/actor-transfer-runtime.ts +391 -395
- package/src/runtime/host/application-job-queue.ts +32 -48
- package/src/runtime/host/bound-session-relay.ts +7 -9
- package/src/runtime/host/channel-runtime-options-factory.ts +75 -35
- package/src/runtime/host/host-capacity-status.ts +10 -9
- package/src/runtime/host/index.ts +861 -789
- package/src/runtime/host/instance-activation-authority.ts +125 -143
- package/src/runtime/host/location-runtime-owner.ts +38 -26
- package/src/runtime/host/mesh-router-resolver.ts +30 -23
- package/src/runtime/host/relocation-direct-transfer.ts +15 -15
- package/src/runtime/host/relocation-integrity-fault-gate.ts +3 -2
- package/src/runtime/host/remote-actor-join-receiver.ts +43 -34
- package/src/runtime/host/remote-actor-packet-target-store.ts +54 -52
- package/src/runtime/host/remote-bound-session-relay.ts +274 -247
- package/src/runtime/host/route-mesh-runtime-options.ts +1 -3
- package/src/runtime/host/route-mesh-runtime.ts +227 -181
- package/src/runtime/host/runtime-shutdown.ts +4 -3
- package/src/runtime/host/service-relocation-control.ts +14 -5
- package/src/runtime/host/service-relocation-host-runtime.ts +1388 -1165
- package/src/runtime/host/spot-address-transport.ts +284 -237
- package/src/runtime/host/spot-node-runtime-options-factory.ts +14 -8
- package/src/runtime/host/spot-runtime-options-factory.ts +71 -62
- package/src/runtime/host/stateful-authority-route-runtime.ts +117 -116
- package/src/runtime/host/user-spot-creation-coordinator.ts +225 -220
- package/src/runtime/locations/actor-location-claims.ts +61 -49
- package/src/runtime/locations/actor-session-route-claims.ts +1 -4
- package/src/runtime/locations/aggregate-inventory-store.ts +105 -134
- package/src/runtime/locations/authority-key-codec.ts +13 -10
- package/src/runtime/locations/auto-connect-loop.ts +14 -11
- package/src/runtime/locations/auto-connect-planner.ts +42 -31
- package/src/runtime/locations/auto-connect-reconciler.ts +106 -63
- package/src/runtime/locations/canonical-codec.ts +3 -1
- package/src/runtime/locations/creation-operation-id.ts +4 -3
- package/src/runtime/locations/domain-store-contract.ts +13 -7
- package/src/runtime/locations/in-memory-authority-store.ts +232 -199
- package/src/runtime/locations/in-memory-location-store.ts +432 -250
- package/src/runtime/locations/in-memory-provider-location-store.ts +16 -17
- package/src/runtime/locations/internal-store-contracts.ts +95 -38
- package/src/runtime/locations/key-codec.ts +3 -4
- package/src/runtime/locations/lease-tracker.ts +36 -27
- package/src/runtime/locations/lifecycle-runtime.ts +15 -3
- package/src/runtime/locations/lifecycle.ts +33 -28
- package/src/runtime/locations/location-store-repository.ts +1329 -1185
- package/src/runtime/locations/opaque-record-key.ts +4 -9
- package/src/runtime/locations/resolvers.ts +201 -178
- package/src/runtime/locations/runtime.ts +251 -159
- package/src/runtime/locations/spot-location-claims.ts +110 -112
- package/src/runtime/messaging/creation-payload-codec.ts +4 -1
- package/src/runtime/messaging/framework-json-v1.ts +34 -15
- package/src/runtime/messaging/packet-name.ts +8 -6
- package/src/runtime/messaging/payload-codec.ts +70 -50
- package/src/runtime/messaging/submission-result.ts +6 -9
- package/src/runtime/protocol/service_wire_codec.generated.ts +1376 -159
- package/src/runtime/protocol/service_wire_pilot_codec.generated.ts +19 -18
- package/src/runtime/routing-id.ts +10 -7
- package/src/runtime/spots/formal-remote-actor-admission-registry.ts +56 -62
- package/src/runtime/spots/formal-remote-actor-transfer-registry.ts +23 -20
- package/src/runtime/spots/index.ts +595 -564
- package/src/runtime/spots/spot-activation-registry.ts +38 -34
- package/src/runtime/spots/spot-activation-state.ts +43 -51
- package/src/runtime/spots/spot-activation.ts +179 -116
- package/src/runtime/spots/spot-actor-admission-coordinator.ts +110 -78
- package/src/runtime/spots/spot-actor-join-dispatch.ts +57 -41
- package/src/runtime/spots/spot-actor-lifecycle-drain.ts +5 -7
- package/src/runtime/spots/spot-actor-membership.ts +25 -27
- package/src/runtime/spots/spot-actor-packet-dispatch.ts +196 -148
- package/src/runtime/spots/spot-actor-packet-drain.ts +56 -42
- package/src/runtime/spots/spot-actor-packet-relay-dispatch.ts +37 -39
- package/src/runtime/spots/spot-closing.ts +11 -12
- package/src/runtime/spots/spot-context.ts +46 -26
- package/src/runtime/spots/spot-entry-activation.ts +84 -65
- package/src/runtime/spots/spot-handle.ts +17 -15
- package/src/runtime/spots/spot-handler-registry.ts +44 -31
- package/src/runtime/spots/spot-location-claim.ts +5 -4
- package/src/runtime/spots/spot-manager-public.ts +62 -82
- package/src/runtime/spots/spot-native-actor-join-admission.ts +20 -16
- package/src/runtime/spots/spot-node-autoconnect.ts +54 -61
- package/src/runtime/spots/spot-node-runtime-manager.ts +235 -222
- package/src/runtime/spots/spot-outbound.ts +47 -59
- package/src/runtime/spots/spot-publisher-transport.ts +5 -4
- package/src/runtime/spots/spot-remote-codec.ts +66 -65
- package/src/runtime/spots/spot-remote-route-codec.ts +61 -41
- package/src/runtime/spots/spot-route-packet-dispatch.ts +129 -95
- package/src/runtime/spots/spot-route-replies.ts +23 -24
- package/src/runtime/spots/spot-route-reply-wire.ts +3 -2
- package/src/runtime/spots/spot-routed-actor-admission.ts +37 -27
- package/src/runtime/spots/spot-routed-bound-session-dispatch.ts +13 -18
- package/src/runtime/spots/spot-routed-frame-dispatch.ts +18 -15
- package/src/runtime/spots/spot-routed-spot-packet-dispatch.ts +35 -26
- package/src/runtime/spots/spot-routing-internal.ts +1 -4
- package/src/runtime/spots/spot-runtime-ports.ts +5 -5
- package/src/runtime/spots/spot-serial-executor.ts +5 -9
- package/src/runtime/spots/spot-serial-turn-executor.ts +19 -26
- package/src/runtime/spots/spot-subscription-dispatch.ts +58 -47
- package/src/runtime/spots/spot-timer.ts +103 -91
- package/src/runtime/streams/actor-session-binding-registry.ts +421 -292
- package/src/runtime/streams/actor-session-binding-runtime-owner.ts +8 -4
- package/src/runtime/streams/actor-session-lifecycle-coordinator.ts +3 -1
- package/src/runtime/streams/bound-actor-relay-sender.ts +60 -50
- package/src/runtime/streams/bound-session-response-target.ts +39 -9
- package/src/runtime/streams/bound-session-service.ts +52 -42
- package/src/runtime/streams/index.ts +183 -100
- package/src/runtime/streams/managed-stream.ts +123 -90
- package/src/runtime/streams/native-fallback-bound-session.ts +57 -52
- package/src/runtime/streams/protocol.ts +115 -46
- package/src/runtime/streams/session-actor-coordinator.ts +109 -93
- package/src/runtime/streams/session-calls.ts +2 -8
- package/src/runtime/streams/session-context.ts +96 -51
- package/src/runtime/streams/session-local-actors.ts +19 -3
- package/src/runtime/streams/session-provider.ts +5 -7
- package/src/runtime/streams/session-serial-executor.ts +7 -6
- package/src/runtime/streams/stream-binding-runtime-ports.ts +79 -29
- package/src/runtime/streams/stream-frame-factory.ts +59 -40
- package/src/runtime/streams/stream-session-runtime.ts +317 -214
- package/src/runtime/workers/index.ts +68 -29
|
@@ -27,14 +27,11 @@ class ServiceRelocationAuthorityPayloadCodec {
|
|
|
27
27
|
return encodeAuthorityEnvelope(Buffer.from(currentPayload), publication);
|
|
28
28
|
}
|
|
29
29
|
read(payload) {
|
|
30
|
-
return decodeCanonicalAuthorityPublication(payload)
|
|
31
|
-
?? decodeAuthorityEnvelope(payload)?.publication;
|
|
30
|
+
return (decodeCanonicalAuthorityPublication(payload) ?? decodeAuthorityEnvelope(payload)?.publication);
|
|
32
31
|
}
|
|
33
32
|
clear(currentPayload, expectedReference) {
|
|
34
33
|
const canonical = decodeCanonicalAuthorityLayout(currentPayload);
|
|
35
|
-
const canonicalPublication = canonical === undefined
|
|
36
|
-
? undefined
|
|
37
|
-
: decodeCanonicalRelocationSlot(canonical.slot);
|
|
34
|
+
const canonicalPublication = canonical === undefined ? undefined : decodeCanonicalRelocationSlot(canonical.slot);
|
|
38
35
|
if (canonical !== undefined && canonicalPublication?.reference !== undefined) {
|
|
39
36
|
if (canonicalPublication.reference !== requireText(expectedReference, 'relocation reference')) {
|
|
40
37
|
throw new TypeError('Location authority relocation reference changed.');
|
|
@@ -42,8 +39,8 @@ class ServiceRelocationAuthorityPayloadCodec {
|
|
|
42
39
|
return replaceCanonicalRelocationSlot(canonical, Buffer.alloc(0));
|
|
43
40
|
}
|
|
44
41
|
const current = decodeAuthorityEnvelope(currentPayload);
|
|
45
|
-
if (current === undefined
|
|
46
|
-
|
|
42
|
+
if (current === undefined ||
|
|
43
|
+
current.publication.reference !== requireText(expectedReference, 'relocation reference')) {
|
|
47
44
|
throw new TypeError('Location authority relocation reference changed.');
|
|
48
45
|
}
|
|
49
46
|
return Buffer.from(current.base);
|
|
@@ -224,25 +221,25 @@ function decodeCanonicalRelocationSlot(payload, rootAggregateGeneration) {
|
|
|
224
221
|
const phase = reader.u8();
|
|
225
222
|
const applicationVersion = reader.i64();
|
|
226
223
|
const sourceCleanupState = reader.u8();
|
|
227
|
-
if (!reader.done
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
224
|
+
if (!reader.done ||
|
|
225
|
+
aggregateGeneration > 0x7ffffffffffffffen ||
|
|
226
|
+
(aggregateGeneration === 0n && phase !== 1) ||
|
|
227
|
+
(rootAggregateGeneration !== undefined && aggregateGeneration !== rootAggregateGeneration) ||
|
|
228
|
+
targetAttemptGeneration > 0x7fffffffffffffffn ||
|
|
229
|
+
sourceNodeGeneration === 0n ||
|
|
230
|
+
sourceNodeGeneration > 0x7fffffffffffffffn ||
|
|
231
|
+
sourceOwnerLeaseGeneration === 0n ||
|
|
232
|
+
sourceOwnerLeaseGeneration > 0x7fffffffffffffffn ||
|
|
233
|
+
targetNodeGeneration > 0x7fffffffffffffffn ||
|
|
234
|
+
targetOwnerLeaseGeneration > 0x7fffffffffffffffn ||
|
|
235
|
+
coordinatorLeaseGeneration === 0n ||
|
|
236
|
+
coordinatorLeaseGeneration > 0x7fffffffffffffffn ||
|
|
237
|
+
coordinatorNodeGeneration === 0n ||
|
|
238
|
+
coordinatorNodeGeneration > 0x7fffffffffffffffn ||
|
|
239
|
+
phase < 1 ||
|
|
240
|
+
phase > 9 ||
|
|
241
|
+
applicationVersion < 0n ||
|
|
242
|
+
sourceCleanupState > 2)
|
|
246
243
|
return undefined;
|
|
247
244
|
return {
|
|
248
245
|
aggregateId,
|
|
@@ -294,23 +291,33 @@ function encodeCanonicalRelocationSlot(value) {
|
|
|
294
291
|
if (!Number.isInteger(value.phase) || value.phase < 1 || value.phase > 9) {
|
|
295
292
|
throw new TypeError('Canonical relocation phase is invalid.');
|
|
296
293
|
}
|
|
297
|
-
if (!Number.isInteger(value.sourceCleanupState)
|
|
298
|
-
|
|
299
|
-
|
|
294
|
+
if (!Number.isInteger(value.sourceCleanupState) ||
|
|
295
|
+
value.sourceCleanupState < 0 ||
|
|
296
|
+
value.sourceCleanupState > 2) {
|
|
300
297
|
throw new TypeError('Canonical source cleanup state is invalid.');
|
|
301
298
|
}
|
|
302
299
|
return Buffer.concat([
|
|
303
|
-
canonicalU64(id.high),
|
|
304
|
-
canonicalU64(
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
canonicalText8(value.
|
|
300
|
+
canonicalU64(id.high),
|
|
301
|
+
canonicalU64(id.low),
|
|
302
|
+
canonicalU64(aggregateGeneration),
|
|
303
|
+
canonicalU64(targetAttemptGeneration),
|
|
304
|
+
canonicalText16(value.reference),
|
|
305
|
+
canonicalU32(value.checksumCrc32c),
|
|
306
|
+
canonicalText8(value.sourceNodeRid),
|
|
307
|
+
canonicalU64(sourceNodeGeneration),
|
|
308
|
+
canonicalText8(value.sourceOwnerId),
|
|
309
|
+
canonicalU64(sourceOwnerLeaseGeneration),
|
|
310
|
+
canonicalOptionalText8(value.targetNodeRid),
|
|
311
|
+
canonicalU64(targetNodeGeneration),
|
|
312
|
+
canonicalOptionalText8(value.targetOwnerId),
|
|
313
|
+
canonicalU64(targetOwnerLeaseGeneration),
|
|
314
|
+
canonicalText8(value.coordinatorOwnerId),
|
|
315
|
+
canonicalU64(coordinatorLeaseGeneration),
|
|
316
|
+
canonicalText8(value.coordinatorNodeRid),
|
|
317
|
+
canonicalU64(coordinatorNodeGeneration),
|
|
312
318
|
canonicalOptionalText8(value.coordinatorExpectedStoreVersion),
|
|
313
|
-
Buffer.of(value.phase),
|
|
319
|
+
Buffer.of(value.phase),
|
|
320
|
+
canonicalI64(value.applicationVersion),
|
|
314
321
|
Buffer.of(value.sourceCleanupState)
|
|
315
322
|
]);
|
|
316
323
|
}
|
|
@@ -356,8 +363,11 @@ function replaceCanonicalRelocationSlot(layout, slot) {
|
|
|
356
363
|
layout.body.subarray(layout.slotEnd)
|
|
357
364
|
]);
|
|
358
365
|
const envelope = Buffer.concat([
|
|
359
|
-
Buffer.from('ZLAU'),
|
|
360
|
-
|
|
366
|
+
Buffer.from('ZLAU'),
|
|
367
|
+
Buffer.of(1),
|
|
368
|
+
canonicalU16(layout.flags),
|
|
369
|
+
canonicalU32(body.byteLength),
|
|
370
|
+
body
|
|
361
371
|
]);
|
|
362
372
|
const result = Buffer.concat([envelope, canonicalU32(crc32c(envelope))]);
|
|
363
373
|
if (result.byteLength > 1024 * 1024) {
|
|
@@ -380,9 +390,9 @@ function encodeServiceRelocationEnvelope(envelope, applicationVersion) {
|
|
|
380
390
|
const aggregate = relocationId(canonicalUuid(envelope.aggregateId, 'aggregate id'));
|
|
381
391
|
const encodedApplicationVersion = nonNegativeBigInt(applicationVersion, 'application version');
|
|
382
392
|
const participants = canonicalParticipants(envelope.participants);
|
|
383
|
-
const root = participants.find(value => value.rootSpotId !== undefined)
|
|
384
|
-
|
|
385
|
-
|
|
393
|
+
const root = participants.find((value) => value.rootSpotId !== undefined) ??
|
|
394
|
+
participants.find((value) => value.objectKind !== 'actor') ??
|
|
395
|
+
participants[0];
|
|
386
396
|
const rootObjectKind = root.rootObjectKind ?? root.objectKind;
|
|
387
397
|
if (rootObjectKind === 'actor' && participants.length !== 1) {
|
|
388
398
|
throw new TypeError('Standalone Actor relocation requires one participant.');
|
|
@@ -398,23 +408,29 @@ function encodeServiceRelocationEnvelope(envelope, applicationVersion) {
|
|
|
398
408
|
payload: Buffer.from(participant.applicationState)
|
|
399
409
|
};
|
|
400
410
|
});
|
|
401
|
-
const saved = participants
|
|
411
|
+
const saved = participants
|
|
412
|
+
.flatMap((participant, index) => participant.queuedMessages.map((message) => ({
|
|
402
413
|
participantId: BigInt(index + 1),
|
|
403
414
|
order: positiveBigInt(message.sequence, 'queue sequence'),
|
|
404
415
|
frozenRecord: Buffer.from(message.payload)
|
|
405
|
-
})))
|
|
406
|
-
|
|
407
|
-
|
|
416
|
+
})))
|
|
417
|
+
.sort(compareParticipantOrder);
|
|
418
|
+
if (saved.some((value, index) => index > 0 && compareParticipantOrder(saved[index - 1], value) === 0)) {
|
|
408
419
|
throw new TypeError('Relocation queue sequences must be unique per participant.');
|
|
409
420
|
}
|
|
410
|
-
const timers = participants
|
|
411
|
-
|
|
412
|
-
|
|
421
|
+
const timers = participants
|
|
422
|
+
.flatMap((participant, index) => participant.timers.map((timer) => ({
|
|
423
|
+
participantId: BigInt(index + 1),
|
|
424
|
+
timer
|
|
425
|
+
})))
|
|
426
|
+
.sort((a, b) => a.participantId === b.participantId
|
|
413
427
|
? Buffer.compare(Buffer.from(a.timer.timerId), Buffer.from(b.timer.timerId))
|
|
414
|
-
: a.participantId < b.participantId
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
428
|
+
: a.participantId < b.participantId
|
|
429
|
+
? -1
|
|
430
|
+
: 1);
|
|
431
|
+
if (timers.some((value, index) => index > 0 &&
|
|
432
|
+
timers[index - 1].participantId === value.participantId &&
|
|
433
|
+
timers[index - 1].timer.timerId === value.timer.timerId)) {
|
|
418
434
|
throw new TypeError('Relocation timer ids must be unique per participant.');
|
|
419
435
|
}
|
|
420
436
|
const nextOrder = new Map();
|
|
@@ -423,7 +439,8 @@ function encodeServiceRelocationEnvelope(envelope, applicationVersion) {
|
|
|
423
439
|
if (value.order > current)
|
|
424
440
|
nextOrder.set(value.participantId, value.order);
|
|
425
441
|
}
|
|
426
|
-
const pending = timers
|
|
442
|
+
const pending = timers
|
|
443
|
+
.flatMap(({ participantId, timer }) => timer.pendingTicks.map((tick) => {
|
|
427
444
|
const current = nextOrder.get(participantId) ?? 0n;
|
|
428
445
|
const order = tick.order === undefined
|
|
429
446
|
? current + 1n
|
|
@@ -431,7 +448,8 @@ function encodeServiceRelocationEnvelope(envelope, applicationVersion) {
|
|
|
431
448
|
if (order > current)
|
|
432
449
|
nextOrder.set(participantId, order);
|
|
433
450
|
return { participantId, order, timerName: timer.timerId, tick };
|
|
434
|
-
}))
|
|
451
|
+
}))
|
|
452
|
+
.sort(compareParticipantOrder);
|
|
435
453
|
return Buffer.from((0, service_wire_pilot_codec_generated_1.encodeRelocationEnvelopeV1)({
|
|
436
454
|
relocationHigh: aggregate.high,
|
|
437
455
|
relocationLow: aggregate.low,
|
|
@@ -451,7 +469,7 @@ function encodeServiceRelocationEnvelope(envelope, applicationVersion) {
|
|
|
451
469
|
lastCompletedScheduledIndex: nonNegativeBigInt(timer.lastScheduledIndex, 'timer scheduled index'),
|
|
452
470
|
nextScheduledAtUnixMilliseconds: nonNegativeUnixMilliseconds(timer.dueAtUnixMs, 'timer due time')
|
|
453
471
|
})),
|
|
454
|
-
pendingTimerTicks: pending.map(value => ({
|
|
472
|
+
pendingTimerTicks: pending.map((value) => ({
|
|
455
473
|
participantId: value.participantId,
|
|
456
474
|
order: value.order,
|
|
457
475
|
timerName: value.timerName,
|
|
@@ -487,7 +505,7 @@ function decodeServiceRelocationEnvelope(payload, aggregateGeneration) {
|
|
|
487
505
|
}
|
|
488
506
|
return wireParticipant(state.participantId, state.hasState, Buffer.from(state.payload));
|
|
489
507
|
});
|
|
490
|
-
const byId = new Map(participants.map(value => [value.participantId, value]));
|
|
508
|
+
const byId = new Map(participants.map((value) => [value.participantId, value]));
|
|
491
509
|
for (const work of generated.savedWork) {
|
|
492
510
|
byId.get(work.participantId).queuedMessages.push({
|
|
493
511
|
sequence: work.order,
|
|
@@ -510,7 +528,9 @@ function decodeServiceRelocationEnvelope(payload, aggregateGeneration) {
|
|
|
510
528
|
});
|
|
511
529
|
}
|
|
512
530
|
for (const tick of generated.pendingTimerTicks) {
|
|
513
|
-
const timer = byId
|
|
531
|
+
const timer = byId
|
|
532
|
+
.get(tick.participantId)
|
|
533
|
+
.timers.find((value) => value.timerId === tick.timerName);
|
|
514
534
|
timer.pendingTicks.push({
|
|
515
535
|
order: tick.order,
|
|
516
536
|
deliveryIndex: tick.deliveryIndex,
|
|
@@ -525,9 +545,7 @@ function decodeServiceRelocationEnvelope(payload, aggregateGeneration) {
|
|
|
525
545
|
aggregateId,
|
|
526
546
|
aggregateGeneration,
|
|
527
547
|
applicationVersion: generated.applicationVersion,
|
|
528
|
-
participants: participants.map(value => value === rootParticipant
|
|
529
|
-
? { ...value, ...rootProjection }
|
|
530
|
-
: value),
|
|
548
|
+
participants: participants.map((value) => value === rootParticipant ? { ...value, ...rootProjection } : value),
|
|
531
549
|
memberships: []
|
|
532
550
|
};
|
|
533
551
|
}
|
|
@@ -585,7 +603,7 @@ function canonicalParticipants(values) {
|
|
|
585
603
|
if (values.length === 0)
|
|
586
604
|
throw new TypeError('Relocation participant count is outside its bound.');
|
|
587
605
|
const participants = [...values].sort((a, b) => Buffer.compare(Buffer.from(a.key), Buffer.from(b.key)));
|
|
588
|
-
if (new Set(participants.map(value => value.key)).size !== participants.length) {
|
|
606
|
+
if (new Set(participants.map((value) => value.key)).size !== participants.length) {
|
|
589
607
|
throw new TypeError('Relocation participants must have unique keys.');
|
|
590
608
|
}
|
|
591
609
|
return participants;
|
|
@@ -596,7 +614,9 @@ function authorityGlobalId(key) {
|
|
|
596
614
|
}
|
|
597
615
|
catch {
|
|
598
616
|
const marker = key.indexOf(':');
|
|
599
|
-
return marker < 0
|
|
617
|
+
return marker < 0
|
|
618
|
+
? requireText(key, 'participant key')
|
|
619
|
+
: requireText(key.slice(marker + 1), 'participant key');
|
|
600
620
|
}
|
|
601
621
|
}
|
|
602
622
|
function relocationId(value) {
|
|
@@ -611,8 +631,14 @@ function uuid(high, low) {
|
|
|
611
631
|
}
|
|
612
632
|
function compareParticipantOrder(a, b) {
|
|
613
633
|
return a.participantId === b.participantId
|
|
614
|
-
? a.order < b.order
|
|
615
|
-
|
|
634
|
+
? a.order < b.order
|
|
635
|
+
? -1
|
|
636
|
+
: a.order > b.order
|
|
637
|
+
? 1
|
|
638
|
+
: 0
|
|
639
|
+
: a.participantId < b.participantId
|
|
640
|
+
? -1
|
|
641
|
+
: 1;
|
|
616
642
|
}
|
|
617
643
|
function timerPolicy(value) {
|
|
618
644
|
if (value === 'skipLateTicks')
|
|
@@ -665,21 +691,25 @@ function objectKind(value) {
|
|
|
665
691
|
return value;
|
|
666
692
|
}
|
|
667
693
|
function inventoryDigest(participants, memberships = []) {
|
|
668
|
-
const identities = participants
|
|
694
|
+
const identities = participants
|
|
695
|
+
.map((participant) => ({
|
|
669
696
|
key: requireText(participant.key, 'participant key'),
|
|
670
697
|
objectKind: objectKind(participant.objectKind),
|
|
671
698
|
stableType: requireText(participant.stableType, 'participant stable type'),
|
|
672
699
|
objectGeneration: positiveBigInt(participant.objectGeneration, 'object generation').toString(),
|
|
673
700
|
authorityOwnerGeneration: positiveBigInt(participant.authorityOwnerGeneration, 'authority owner generation').toString()
|
|
674
|
-
}))
|
|
701
|
+
}))
|
|
702
|
+
.sort((left, right) => left.key.localeCompare(right.key));
|
|
675
703
|
if (new Set(identities.map(({ key }) => key)).size !== identities.length) {
|
|
676
704
|
throw new TypeError('Relocation participants must have unique keys.');
|
|
677
705
|
}
|
|
678
706
|
const canonicalMemberships = encodeMemberships(memberships, participants);
|
|
679
|
-
return (0, node_crypto_1.createHash)('sha256')
|
|
707
|
+
return (0, node_crypto_1.createHash)('sha256')
|
|
708
|
+
.update(JSON.stringify({
|
|
680
709
|
participants: identities,
|
|
681
710
|
memberships: canonicalMemberships
|
|
682
|
-
}), 'utf8')
|
|
711
|
+
}), 'utf8')
|
|
712
|
+
.digest('hex');
|
|
683
713
|
}
|
|
684
714
|
function encodeAuthorityEnvelope(base, publication) {
|
|
685
715
|
const checksum = safeInteger(publication.checksumCrc32c, 'relocation checksum');
|
|
@@ -691,8 +721,8 @@ function encodeAuthorityEnvelope(base, publication) {
|
|
|
691
721
|
}
|
|
692
722
|
const aggregateGeneration = positiveBigInt(publication.aggregateGeneration, 'aggregate generation');
|
|
693
723
|
const targetOwnerLeaseGeneration = positiveBigInt(publication.targetOwnerLeaseGeneration, 'target owner lease generation');
|
|
694
|
-
if (aggregateGeneration > 0x7fffffffffffffffn
|
|
695
|
-
|
|
724
|
+
if (aggregateGeneration > 0x7fffffffffffffffn ||
|
|
725
|
+
targetOwnerLeaseGeneration > 0x7fffffffffffffffn) {
|
|
696
726
|
throw new TypeError('Relocation publication generations must fit signed 64-bit storage.');
|
|
697
727
|
}
|
|
698
728
|
const payload = Buffer.concat([
|
|
@@ -727,11 +757,11 @@ function decodeAuthorityEnvelope(payload) {
|
|
|
727
757
|
const targetOwnerId = requireText(reader.text16(), 'target owner id');
|
|
728
758
|
const targetOwnerLeaseGeneration = reader.i64();
|
|
729
759
|
const base = reader.bytes32();
|
|
730
|
-
if (!reader.done
|
|
731
|
-
|
|
732
|
-
|
|
733
|
-
|
|
734
|
-
|
|
760
|
+
if (!reader.done ||
|
|
761
|
+
aggregateGeneration === 0n ||
|
|
762
|
+
aggregateGeneration > 0x7fffffffffffffffn ||
|
|
763
|
+
inventoryDigestBytes.byteLength !== 32 ||
|
|
764
|
+
targetOwnerLeaseGeneration <= 0n) {
|
|
735
765
|
return undefined;
|
|
736
766
|
}
|
|
737
767
|
return {
|
|
@@ -753,15 +783,17 @@ function decodeAuthorityEnvelope(payload) {
|
|
|
753
783
|
}
|
|
754
784
|
function encodeMemberships(memberships, participants) {
|
|
755
785
|
validateMemberships(memberships, participants);
|
|
756
|
-
return memberships
|
|
786
|
+
return memberships
|
|
787
|
+
.map((membership) => ({
|
|
757
788
|
actorKey: requireText(membership.actorKey, 'membership actor key'),
|
|
758
789
|
spotKey: requireText(membership.spotKey, 'membership spot key'),
|
|
759
790
|
spotObjectGeneration: positiveBigInt(membership.spotObjectGeneration, 'membership Spot generation').toString(),
|
|
760
791
|
membershipEpoch: positiveBigInt(membership.membershipEpoch, 'membership epoch').toString()
|
|
761
|
-
}))
|
|
792
|
+
}))
|
|
793
|
+
.sort((left, right) => left.actorKey.localeCompare(right.actorKey));
|
|
762
794
|
}
|
|
763
795
|
function validateMemberships(memberships, participants) {
|
|
764
|
-
const byKey = new Map(participants.map(participant => [participant.key, participant]));
|
|
796
|
+
const byKey = new Map(participants.map((participant) => [participant.key, participant]));
|
|
765
797
|
const actorKeys = new Set();
|
|
766
798
|
for (const membership of memberships) {
|
|
767
799
|
const actorKey = requireText(membership.actorKey, 'membership actor key');
|
|
@@ -774,9 +806,10 @@ function validateMemberships(memberships, participants) {
|
|
|
774
806
|
throw new TypeError('Relocation membership must reference an Actor participant.');
|
|
775
807
|
}
|
|
776
808
|
const spot = byKey.get(requireText(membership.spotKey, 'membership spot key'));
|
|
777
|
-
if (spot !== undefined
|
|
778
|
-
|
|
779
|
-
|
|
809
|
+
if (spot !== undefined &&
|
|
810
|
+
(spot.objectKind !== 'user_spot' ||
|
|
811
|
+
spot.objectGeneration !==
|
|
812
|
+
positiveBigInt(membership.spotObjectGeneration, 'membership Spot generation'))) {
|
|
780
813
|
throw new TypeError('Relocation membership Spot fence does not match its participant.');
|
|
781
814
|
}
|
|
782
815
|
positiveBigInt(membership.membershipEpoch, 'membership epoch');
|
|
@@ -804,8 +837,8 @@ function requireText(value, label) {
|
|
|
804
837
|
}
|
|
805
838
|
function canonicalUuid(value, label) {
|
|
806
839
|
const text = requireText(value, label);
|
|
807
|
-
if (!/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/u.test(text)
|
|
808
|
-
|
|
840
|
+
if (!/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/u.test(text) ||
|
|
841
|
+
/^0{8}-0{4}-0{4}-0{4}-0{12}$/u.test(text)) {
|
|
809
842
|
throw new TypeError(`${label} must be a lowercase non-zero 128-bit identity.`);
|
|
810
843
|
}
|
|
811
844
|
return text;
|
|
@@ -849,9 +882,14 @@ function i64le(value) {
|
|
|
849
882
|
function dotnetGuidBytes(value) {
|
|
850
883
|
const canonical = Buffer.from(value.replaceAll('-', ''), 'hex');
|
|
851
884
|
return Buffer.from([
|
|
852
|
-
canonical[3],
|
|
853
|
-
canonical[
|
|
854
|
-
canonical[
|
|
885
|
+
canonical[3],
|
|
886
|
+
canonical[2],
|
|
887
|
+
canonical[1],
|
|
888
|
+
canonical[0],
|
|
889
|
+
canonical[5],
|
|
890
|
+
canonical[4],
|
|
891
|
+
canonical[7],
|
|
892
|
+
canonical[6],
|
|
855
893
|
...canonical.subarray(8)
|
|
856
894
|
]);
|
|
857
895
|
}
|
|
@@ -860,13 +898,18 @@ function canonicalUuidFromDotnetBytes(value) {
|
|
|
860
898
|
if (bytes.byteLength !== 16)
|
|
861
899
|
throw new TypeError('Relocation aggregate id is invalid.');
|
|
862
900
|
const canonical = Buffer.from([
|
|
863
|
-
bytes[3],
|
|
864
|
-
bytes[
|
|
865
|
-
bytes[
|
|
901
|
+
bytes[3],
|
|
902
|
+
bytes[2],
|
|
903
|
+
bytes[1],
|
|
904
|
+
bytes[0],
|
|
905
|
+
bytes[5],
|
|
906
|
+
bytes[4],
|
|
907
|
+
bytes[7],
|
|
908
|
+
bytes[6],
|
|
866
909
|
...bytes.subarray(8)
|
|
867
910
|
]).toString('hex');
|
|
868
|
-
return `${canonical.slice(0, 8)}-${canonical.slice(8, 12)}-${canonical.slice(12, 16)}`
|
|
869
|
-
|
|
911
|
+
return (`${canonical.slice(0, 8)}-${canonical.slice(8, 12)}-${canonical.slice(12, 16)}` +
|
|
912
|
+
`-${canonical.slice(16, 20)}-${canonical.slice(20)}`);
|
|
870
913
|
}
|
|
871
914
|
class CanonicalReader {
|
|
872
915
|
bytes;
|
|
@@ -43,11 +43,11 @@ exports.OperationKind = Object.freeze({
|
|
|
43
43
|
UserSpotClose: 14
|
|
44
44
|
});
|
|
45
45
|
function operationRequiresReply(operationKind) {
|
|
46
|
-
return operationKind === exports.OperationKind.NodeRequest
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
46
|
+
return (operationKind === exports.OperationKind.NodeRequest ||
|
|
47
|
+
operationKind === exports.OperationKind.ChannelRequest ||
|
|
48
|
+
operationKind === exports.OperationKind.SpotRequest ||
|
|
49
|
+
operationKind === exports.OperationKind.ActorRequest ||
|
|
50
|
+
operationKind === exports.OperationKind.InstanceSpotRequest);
|
|
51
51
|
}
|
|
52
52
|
exports.ActorLifecycleKind = Object.freeze({
|
|
53
53
|
Created: 1,
|
|
@@ -16,6 +16,7 @@ export interface ServiceSessionBindingAdmissionClaim {
|
|
|
16
16
|
}
|
|
17
17
|
export type ServiceSessionBindingAdmissionResult = 'passThrough' | 'retained' | 'rejected';
|
|
18
18
|
export interface ServiceSessionBindingIngressPort {
|
|
19
|
+
actorSlot(actorId: string, sessionRid: string): Promise<number | undefined>;
|
|
19
20
|
retainOutbound(claim: ServiceSessionBindingAdmissionClaim, delivery: ServiceSessionBindingRetainedDelivery): Promise<ServiceSessionBindingAdmissionResult>;
|
|
20
21
|
clearOutbound(actorId: string, error: unknown): Promise<void>;
|
|
21
22
|
}
|
|
@@ -83,10 +83,10 @@ class ServiceStatefulRegistry {
|
|
|
83
83
|
requirePositive(ref.generation, 'spot.generation');
|
|
84
84
|
requireText(stableType, 'stableType');
|
|
85
85
|
requirePositive(authorityOwnerGeneration, 'authorityOwnerGeneration');
|
|
86
|
-
if (kind === 'entry'
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
86
|
+
if (kind === 'entry' &&
|
|
87
|
+
(ref.spotId !== this.nodeRid ||
|
|
88
|
+
ref.generation !== this.nodeGeneration ||
|
|
89
|
+
stableType !== 'entry')) {
|
|
90
90
|
throw new TypeError('Entry Spot identity is fixed by the owning node lifecycle.');
|
|
91
91
|
}
|
|
92
92
|
const current = this.spots.get(ref.spotId);
|
|
@@ -108,7 +108,9 @@ class ServiceStatefulRegistry {
|
|
|
108
108
|
}
|
|
109
109
|
requireSpotCore(ref) {
|
|
110
110
|
const current = this.spots.get(ref.spotId);
|
|
111
|
-
if (current === undefined ||
|
|
111
|
+
if (current === undefined ||
|
|
112
|
+
current.ref.generation !== ref.generation ||
|
|
113
|
+
current.state !== 'ready') {
|
|
112
114
|
throw new ServiceStaleGenerationError('spot', ref.spotId);
|
|
113
115
|
}
|
|
114
116
|
return current;
|
|
@@ -118,8 +120,7 @@ class ServiceStatefulRegistry {
|
|
|
118
120
|
if (current.kind === 'entry')
|
|
119
121
|
return false;
|
|
120
122
|
for (const actor of this.actors.values()) {
|
|
121
|
-
if (actor.spot.spotId === ref.spotId
|
|
122
|
-
&& actor.spot.generation === ref.generation) {
|
|
123
|
+
if (actor.spot.spotId === ref.spotId && actor.spot.generation === ref.generation) {
|
|
123
124
|
return false;
|
|
124
125
|
}
|
|
125
126
|
}
|
|
@@ -193,9 +194,9 @@ class ServiceStatefulRegistry {
|
|
|
193
194
|
}
|
|
194
195
|
requireActorCore(ref) {
|
|
195
196
|
const current = this.actors.get(ref.actorId);
|
|
196
|
-
if (current === undefined
|
|
197
|
-
|
|
198
|
-
|
|
197
|
+
if (current === undefined ||
|
|
198
|
+
current.ref.generation !== ref.generation ||
|
|
199
|
+
current.ref.nodeRid !== ref.nodeRid) {
|
|
199
200
|
throw new ServiceStaleGenerationError('actor', ref.actorId);
|
|
200
201
|
}
|
|
201
202
|
return current;
|
|
@@ -256,12 +257,12 @@ class ServiceStatefulRegistry {
|
|
|
256
257
|
this.requireActorCore(binding.actor);
|
|
257
258
|
requirePositive(binding.bindingGeneration, 'bindingGeneration');
|
|
258
259
|
const current = this.bindings.get(actorKey(binding.actor));
|
|
259
|
-
if (current !== undefined
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
260
|
+
if (current !== undefined &&
|
|
261
|
+
current.sessionOwnerNodeRid === binding.sessionOwnerNodeRid &&
|
|
262
|
+
current.sessionOwnerNodeGeneration === binding.sessionOwnerNodeGeneration &&
|
|
263
|
+
current.sessionOwnerId === binding.sessionOwnerId &&
|
|
264
|
+
current.sessionOwnerLeaseGeneration === binding.sessionOwnerLeaseGeneration &&
|
|
265
|
+
current.bindingGeneration >= binding.bindingGeneration) {
|
|
265
266
|
throw new ServiceStaleGenerationError('binding', binding.actor.actorId);
|
|
266
267
|
}
|
|
267
268
|
this.nextBindingGeneration = max(this.nextBindingGeneration, binding.bindingGeneration + 1n);
|
|
@@ -279,10 +280,10 @@ class ServiceStatefulRegistry {
|
|
|
279
280
|
const binding = this.bindings.get(key);
|
|
280
281
|
if (binding === undefined)
|
|
281
282
|
return false;
|
|
282
|
-
if (binding.bindingGeneration !== expectedBindingGeneration
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
283
|
+
if (binding.bindingGeneration !== expectedBindingGeneration ||
|
|
284
|
+
(expectedSessionRid !== undefined && binding.sessionRid !== expectedSessionRid) ||
|
|
285
|
+
(expectedSessionOwnerNodeRid !== undefined &&
|
|
286
|
+
binding.sessionOwnerNodeRid !== expectedSessionOwnerNodeRid)) {
|
|
286
287
|
throw new ServiceStaleGenerationError('binding', actor.actorId);
|
|
287
288
|
}
|
|
288
289
|
this.bindings.delete(key);
|
|
@@ -324,8 +325,8 @@ class ServiceStatefulRegistry {
|
|
|
324
325
|
: { kind: 'typeMismatch' };
|
|
325
326
|
}
|
|
326
327
|
const assigned = this.spotTypes.get(key);
|
|
327
|
-
if (assigned !== undefined
|
|
328
|
-
|
|
328
|
+
if (assigned !== undefined &&
|
|
329
|
+
(assigned.kind !== expectedKind || assigned.stableType !== stableType)) {
|
|
329
330
|
return { kind: 'typeMismatch' };
|
|
330
331
|
}
|
|
331
332
|
}
|
|
@@ -376,7 +377,7 @@ class ServiceStatefulRegistry {
|
|
|
376
377
|
requireText(owner, 'owner');
|
|
377
378
|
const previous = this.turns.get(owner) ?? Promise.resolve();
|
|
378
379
|
let release;
|
|
379
|
-
const barrier = new Promise(resolve => {
|
|
380
|
+
const barrier = new Promise((resolve) => {
|
|
380
381
|
release = resolve;
|
|
381
382
|
});
|
|
382
383
|
const tail = previous.then(() => barrier);
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type { ZLinkDispatchErrorReporter } from '../channels/dispatch-error-reporter';
|
|
1
2
|
import type { RawServiceMeshRuntime } from './raw-service-mesh-runtime';
|
|
2
3
|
import { type ReceiveKindData, type StreamSessionActorAuthorityFence } from './service-runtime-contracts';
|
|
3
4
|
import type { ServiceMailboxRecord } from './service-mailbox';
|
|
@@ -221,6 +222,8 @@ export declare class ServiceStatefulRuntime {
|
|
|
221
222
|
private userSpotOperationHandler?;
|
|
222
223
|
private messageFollowHandler?;
|
|
223
224
|
private mailboxDropHandler?;
|
|
225
|
+
private dispatchErrors?;
|
|
226
|
+
private dispatchErrorMeshName?;
|
|
224
227
|
private readonly admittedUserSpotOperations;
|
|
225
228
|
private readonly pendingInstanceActivations;
|
|
226
229
|
private closed;
|
|
@@ -229,6 +232,7 @@ export declare class ServiceStatefulRuntime {
|
|
|
229
232
|
readonly kind: 'spot_multicast' | 'actor_control' | 'actor_binding';
|
|
230
233
|
readonly owner: string;
|
|
231
234
|
}) => void): void;
|
|
235
|
+
setDispatchErrorReporter(reporter: ZLinkDispatchErrorReporter, meshName: string): void;
|
|
232
236
|
createSpot(routingId?: string, kind?: 'user' | 'instance', stableType?: "user" | "instance"): ServiceSpotState;
|
|
233
237
|
restoreUserSpotAuthority(spotId: string, stableType: string, generation: bigint, authorityOwnerGeneration: bigint): ServiceSpotState;
|
|
234
238
|
restoreSpotAuthority(spotId: string, objectKind: 'user_spot' | 'instance_spot', stableType: string, generation: bigint, authorityOwnerGeneration: bigint): ServiceSpotState;
|