@zlink-systems/framework 0.30.0 → 0.30.2
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/LICENSE +150 -68
- package/dist/.tsbuildinfo +1 -1
- package/dist/contracts/Actors/ZLinkActorClient.d.ts +2 -1
- package/dist/contracts/Channels/Calls.d.ts +2 -1
- package/dist/contracts/Common/ZLinkEncodedPayload.d.ts +6 -0
- package/dist/contracts/Common/ZLinkEncodedPayload.js +18 -3
- package/dist/contracts/Common/ZLinkMessageMetadata.js +11 -5
- package/dist/contracts/Common/encoded-payload-storage.d.ts +1 -1
- package/dist/contracts/Common/encoded-payload-storage.js +5 -2
- package/dist/contracts/Configuration/Builders.d.ts +1 -1
- package/dist/contracts/Configuration/RegistrationBuilderPolicy.d.ts +2 -1
- package/dist/contracts/Configuration/RegistrationBuilderPolicy.js +5 -1
- package/dist/contracts/Configuration/RegistrationBuilders.js +2 -2
- package/dist/contracts/Configuration/RegistrationTypes.d.ts +1 -0
- package/dist/contracts/Dispatch/ZLinkDispatchOptions.d.ts +2 -2
- package/dist/contracts/Handlers/Attributes.d.ts +5 -13
- package/dist/contracts/Handlers/Attributes.js +7 -11
- package/dist/contracts/Handlers/JsonContract.d.ts +2 -46
- package/dist/contracts/Handlers/JsonContract.js +4 -153
- package/dist/contracts/Locations/Rows.d.ts +2 -0
- package/dist/contracts/Spots/Contracts.d.ts +6 -1
- package/dist/contracts/Spots/ZLinkSpot.d.ts +3 -3
- package/dist/nest-integration.d.ts +1 -1
- package/dist/nest-integration.js +2 -1
- package/dist/runtime/abort.d.ts +5 -0
- package/dist/runtime/abort.js +10 -0
- package/dist/runtime/actors/actor-authority-publication.js +3 -2
- package/dist/runtime/actors/actor-client.d.ts +1 -2
- package/dist/runtime/actors/actor-client.js +52 -57
- package/dist/runtime/actors/actor-context.d.ts +2 -0
- package/dist/runtime/actors/actor-context.js +46 -9
- package/dist/runtime/actors/actor-handoff.d.ts +8 -4
- package/dist/runtime/actors/actor-handoff.js +219 -92
- package/dist/runtime/actors/actor-join-relocation.d.ts +3 -0
- package/dist/runtime/actors/actor-local-native-join.js +13 -12
- package/dist/runtime/actors/actor-mailbox.js +27 -1
- package/dist/runtime/actors/actor-remote-joiner.js +3 -1
- package/dist/runtime/actors/actor-remote-wire.js +15 -0
- package/dist/runtime/actors/actor-reply.d.ts +4 -0
- package/dist/runtime/actors/actor-reply.js +29 -0
- package/dist/runtime/actors/actor-routed-join-transport.d.ts +6 -2
- package/dist/runtime/actors/actor-routed-json-request.d.ts +2 -0
- package/dist/runtime/actors/actor-runtime-contracts.d.ts +2 -0
- package/dist/runtime/actors/actor-runtime-state.js +2 -20
- package/dist/runtime/actors/actor-source-transfer.d.ts +1 -17
- package/dist/runtime/actors/index.d.ts +8 -3
- package/dist/runtime/actors/index.js +55 -27
- package/dist/runtime/actors/session-disconnected-wire.d.ts +8 -0
- package/dist/runtime/actors/session-disconnected-wire.js +48 -0
- package/dist/runtime/actors/spot-actor-dispatch.js +2 -2
- package/dist/runtime/admission.d.ts +9 -1
- package/dist/runtime/admission.js +56 -23
- package/dist/runtime/application-jobs/application-ingress-record-owner.d.ts +6 -8
- package/dist/runtime/application-jobs/application-ingress-record-owner.js +39 -22
- package/dist/runtime/application-jobs/application-job-queue-scope.d.ts +15 -1
- package/dist/runtime/application-jobs/application-job-queue-scope.js +61 -20
- package/dist/runtime/application-jobs/contracts.d.ts +12 -1
- package/dist/runtime/backend/contracts/index.d.ts +37 -12
- package/dist/runtime/backend/mesh-actor-session-node-adapter.js +2 -2
- package/dist/runtime/backend/mesh-completion-table.d.ts +9 -1
- package/dist/runtime/backend/mesh-completion-table.js +154 -49
- package/dist/runtime/backend/mesh-dispatch-pump.d.ts +28 -1
- package/dist/runtime/backend/mesh-dispatch-pump.js +208 -101
- package/dist/runtime/backend/node/node-backend-adapter-support.d.ts +2 -2
- package/dist/runtime/backend/node/node-backend-adapter-support.js +16 -9
- package/dist/runtime/backend/node/node-dealer-channel-client-transport.d.ts +1 -1
- package/dist/runtime/backend/node/node-dealer-channel-client-transport.js +5 -2
- package/dist/runtime/backend/node/node-raw-binding-port.js +124 -72
- package/dist/runtime/backend/node/node-raw-mesh-backend.d.ts +46 -13
- package/dist/runtime/backend/node/node-raw-mesh-backend.js +181 -164
- package/dist/runtime/backend/node/node-socket-backend-adapter.d.ts +1 -1
- package/dist/runtime/backend/node/node-socket-backend-adapter.js +11 -11
- package/dist/runtime/backend/raw-binding-port.d.ts +2 -2
- package/dist/runtime/backend/runtime-message.d.ts +1 -0
- package/dist/runtime/backend/runtime-message.js +5 -0
- package/dist/runtime/backend/runtime-values.d.ts +1 -0
- package/dist/runtime/backend/runtime-values.js +2 -1
- package/dist/runtime/channels/channel-clients.d.ts +2 -0
- package/dist/runtime/channels/channel-clients.js +75 -23
- package/dist/runtime/channels/channel-dispatch-pipeline.d.ts +25 -5
- package/dist/runtime/channels/channel-dispatch-pipeline.js +111 -56
- package/dist/runtime/channels/channel-dispatch-services.d.ts +1 -0
- package/dist/runtime/channels/channel-dispatch-services.js +45 -0
- package/dist/runtime/channels/channel-dispatchers.d.ts +4 -3
- package/dist/runtime/channels/channel-dispatchers.js +62 -54
- package/dist/runtime/channels/channel-envelope-inspection.d.ts +1 -2
- package/dist/runtime/channels/channel-envelope-inspection.js +1 -16
- package/dist/runtime/channels/channel-envelope.d.ts +2 -0
- package/dist/runtime/channels/channel-envelope.js +146 -28
- package/dist/runtime/channels/channel-outbound-operations.d.ts +2 -2
- package/dist/runtime/channels/channel-outbound-operations.js +8 -8
- package/dist/runtime/channels/channel-runtime-lifecycle.d.ts +4 -3
- package/dist/runtime/channels/channel-runtime-lifecycle.js +19 -24
- package/dist/runtime/channels/channel-runtime-manager.d.ts +9 -8
- package/dist/runtime/channels/channel-runtime-manager.js +16 -16
- package/dist/runtime/channels/channel-transports.d.ts +18 -16
- package/dist/runtime/channels/channel-transports.js +77 -58
- package/dist/runtime/channels/client-server-location-runtime.js +5 -4
- package/dist/runtime/channels/dispatch-error-reporter.d.ts +2 -1
- package/dist/runtime/channels/dispatch-error-reporter.js +2 -1
- package/dist/runtime/channels/fanout-location-runtime.d.ts +1 -1
- package/dist/runtime/channels/fanout-location-runtime.js +3 -3
- package/dist/runtime/channels/local-spot-route-transport.d.ts +1 -1
- package/dist/runtime/channels/local-spot-route-transport.js +2 -1
- package/dist/runtime/channels/router-socket-spot-route-transport.d.ts +2 -2
- package/dist/runtime/channels/router-socket-spot-route-transport.js +4 -4
- package/dist/runtime/channels/source-spot-router.d.ts +2 -2
- package/dist/runtime/channels/source-spot-router.js +4 -4
- package/dist/runtime/channels/spot-node-route-transport.d.ts +2 -2
- package/dist/runtime/channels/spot-node-route-transport.js +4 -4
- package/dist/runtime/channels/spot-route-bridge-transport.d.ts +2 -2
- package/dist/runtime/channels/spot-route-bridge-transport.js +4 -4
- package/dist/runtime/channels/spot-route-dispatch-strategy.d.ts +5 -4
- package/dist/runtime/channels/spot-route-dispatch-strategy.js +18 -18
- package/dist/runtime/diagnostics/flow-context.js +19 -7
- package/dist/runtime/diagnostics/index.js +4 -9
- package/dist/runtime/diagnostics/message-flow.d.ts +8 -0
- package/dist/runtime/diagnostics/message-flow.js +35 -5
- package/dist/runtime/diagnostics/runtime-metrics.d.ts +2 -2
- package/dist/runtime/diagnostics/runtime-metrics.js +10 -8
- package/dist/runtime/execution/index.d.ts +4 -2
- package/dist/runtime/execution/index.js +33 -10
- package/dist/runtime/execution/serial-execution-queue.d.ts +5 -0
- package/dist/runtime/execution/serial-execution-queue.js +22 -2
- package/dist/runtime/execution/state-lane.d.ts +2 -0
- package/dist/runtime/execution/state-lane.js +5 -0
- package/dist/runtime/foundation/actor-join-recovery-codec.js +2 -2
- package/dist/runtime/foundation/durable-service-request.d.ts +14 -0
- package/dist/runtime/foundation/durable-service-request.js +98 -0
- package/dist/runtime/foundation/operation-identity.d.ts +1 -0
- package/dist/runtime/foundation/operation-identity.js +5 -1
- package/dist/runtime/foundation/operation-registry.d.ts +25 -1
- package/dist/runtime/foundation/operation-registry.js +86 -18
- package/dist/runtime/foundation/raw-service-mesh-runtime.d.ts +61 -8
- package/dist/runtime/foundation/raw-service-mesh-runtime.js +486 -266
- package/dist/runtime/foundation/service-liveness-registry.d.ts +12 -1
- package/dist/runtime/foundation/service-liveness-registry.js +38 -0
- package/dist/runtime/foundation/service-mailbox.d.ts +7 -0
- package/dist/runtime/foundation/service-maintenance-runtime.js +1 -6
- package/dist/runtime/foundation/service-relocation-object-owner.d.ts +3 -3
- package/dist/runtime/foundation/service-relocation-object-owner.js +48 -34
- package/dist/runtime/foundation/service-relocation-runtime.d.ts +2 -0
- package/dist/runtime/foundation/service-relocation-runtime.js +20 -4
- package/dist/runtime/foundation/service-runtime-contracts.d.ts +10 -1
- package/dist/runtime/foundation/service-session-binding-ingress-port.d.ts +2 -1
- package/dist/runtime/foundation/service-stateful-registry.d.ts +5 -4
- package/dist/runtime/foundation/service-stateful-registry.js +24 -26
- package/dist/runtime/foundation/service-stateful-runtime.d.ts +75 -9
- package/dist/runtime/foundation/service-stateful-runtime.js +486 -218
- package/dist/runtime/foundation/service-stateful-wire-codec.d.ts +14 -6
- package/dist/runtime/foundation/service-stateful-wire-codec.js +48 -27
- package/dist/runtime/foundation/service-topology-registry.d.ts +12 -2
- package/dist/runtime/foundation/service-topology-registry.js +61 -27
- package/dist/runtime/foundation/service-wire-binary-primitives.d.ts +6 -1
- package/dist/runtime/foundation/service-wire-binary-primitives.js +27 -11
- package/dist/runtime/foundation/service-wire-constants.generated.d.ts +1 -0
- package/dist/runtime/foundation/service-wire-constants.generated.js +1 -0
- package/dist/runtime/foundation/service-wire-m6a-codec.d.ts +13 -3
- package/dist/runtime/foundation/service-wire-m6a-codec.js +189 -78
- package/dist/runtime/handlers/handler-instance-scope.d.ts +8 -0
- package/dist/runtime/handlers/handler-instance-scope.js +54 -11
- package/dist/runtime/host/actor-packet-relay.d.ts +6 -4
- package/dist/runtime/host/actor-packet-relay.js +59 -72
- package/dist/runtime/host/actor-placement-coordinator.js +25 -8
- package/dist/runtime/host/actor-runtime-options-factory.js +2 -2
- package/dist/runtime/host/actor-transfer-runtime.d.ts +7 -31
- package/dist/runtime/host/actor-transfer-runtime.js +85 -331
- package/dist/runtime/host/application-job-queue.d.ts +40 -7
- package/dist/runtime/host/application-job-queue.js +137 -42
- package/dist/runtime/host/entry-actor-runtime.d.ts +1 -0
- package/dist/runtime/host/entry-actor-runtime.js +3 -0
- package/dist/runtime/host/index.d.ts +12 -2
- package/dist/runtime/host/index.js +300 -202
- package/dist/runtime/host/location-runtime-owner.js +2 -6
- package/dist/runtime/host/mesh-router-resolver.d.ts +4 -0
- package/dist/runtime/host/mesh-router-resolver.js +14 -6
- package/dist/runtime/host/remote-bound-session-relay.d.ts +2 -4
- package/dist/runtime/host/remote-bound-session-relay.js +73 -208
- package/dist/runtime/host/route-mesh-runtime.d.ts +2 -2
- package/dist/runtime/host/route-mesh-runtime.js +6 -4
- package/dist/runtime/host/runtime-shutdown.d.ts +1 -0
- package/dist/runtime/host/runtime-shutdown.js +3 -2
- package/dist/runtime/host/service-relocation-control.d.ts +1 -0
- package/dist/runtime/host/service-relocation-control.js +10 -4
- package/dist/runtime/host/service-relocation-host-runtime.d.ts +22 -14
- package/dist/runtime/host/service-relocation-host-runtime.js +754 -599
- package/dist/runtime/host/spot-address-transport.js +3 -2
- package/dist/runtime/host/spot-runtime-options-factory.js +16 -7
- package/dist/runtime/host/user-spot-creation-coordinator.js +33 -84
- package/dist/runtime/locations/actor-location-claims.d.ts +2 -2
- package/dist/runtime/locations/actor-location-claims.js +34 -19
- package/dist/runtime/locations/auto-connect-loop.d.ts +2 -0
- package/dist/runtime/locations/auto-connect-loop.js +22 -14
- package/dist/runtime/locations/auto-connect-reconciler.js +0 -6
- package/dist/runtime/locations/auto-connect-types.d.ts +0 -1
- package/dist/runtime/locations/descriptor-publication.d.ts +4 -0
- package/dist/runtime/locations/descriptor-publication.js +11 -0
- package/dist/runtime/locations/domain-store-contract.d.ts +1 -0
- package/dist/runtime/locations/in-memory-authority-store.d.ts +7 -1
- package/dist/runtime/locations/in-memory-authority-store.js +56 -19
- package/dist/runtime/locations/in-memory-location-store.js +1 -10
- package/dist/runtime/locations/index.d.ts +1 -0
- package/dist/runtime/locations/index.js +1 -0
- package/dist/runtime/locations/lease-tracker.js +1 -6
- package/dist/runtime/locations/lifecycle.d.ts +1 -2
- package/dist/runtime/locations/lifecycle.js +2 -5
- package/dist/runtime/locations/location-store-repository.d.ts +51 -1
- package/dist/runtime/locations/location-store-repository.js +363 -139
- package/dist/runtime/locations/relocation-blob.d.ts +18 -1
- package/dist/runtime/locations/relocation-blob.js +52 -1
- package/dist/runtime/locations/request-source-resolver.d.ts +37 -0
- package/dist/runtime/locations/request-source-resolver.js +80 -0
- package/dist/runtime/locations/resolvers.js +1 -1
- package/dist/runtime/locations/runtime.d.ts +7 -3
- package/dist/runtime/locations/runtime.js +61 -53
- package/dist/runtime/messaging/framework-json-v1.d.ts +4 -6
- package/dist/runtime/messaging/framework-json-v1.js +38 -294
- package/dist/runtime/messaging/packet-name.d.ts +1 -1
- package/dist/runtime/messaging/packet-name.js +8 -24
- package/dist/runtime/messaging/payload-codec.d.ts +7 -1
- package/dist/runtime/messaging/payload-codec.js +7 -6
- package/dist/runtime/messaging/request-result.d.ts +2 -0
- package/dist/runtime/messaging/request-result.js +57 -0
- package/dist/runtime/messaging/submission-result.d.ts +1 -0
- package/dist/runtime/messaging/submission-result.js +5 -2
- package/dist/runtime/protocol/service_wire_codec.generated.d.ts +34 -1
- package/dist/runtime/protocol/service_wire_codec.generated.js +229 -0
- package/dist/runtime/protocol/service_wire_pilot_codec.generated.d.ts +16 -1
- package/dist/runtime/protocol/service_wire_pilot_codec.generated.js +37 -8
- package/dist/runtime/spots/formal-remote-actor-admission-registry.d.ts +7 -2
- package/dist/runtime/spots/formal-remote-actor-admission-registry.js +36 -21
- package/dist/runtime/spots/index.d.ts +21 -11
- package/dist/runtime/spots/index.js +243 -178
- package/dist/runtime/spots/spot-activation-registry.d.ts +4 -2
- package/dist/runtime/spots/spot-activation-registry.js +21 -11
- package/dist/runtime/spots/spot-activation-state.d.ts +1 -1
- package/dist/runtime/spots/spot-activation-state.js +7 -7
- package/dist/runtime/spots/spot-activation.d.ts +7 -3
- package/dist/runtime/spots/spot-activation.js +140 -52
- package/dist/runtime/spots/spot-actor-admission-coordinator.d.ts +1 -0
- package/dist/runtime/spots/spot-actor-admission-coordinator.js +13 -22
- package/dist/runtime/spots/spot-actor-membership.d.ts +0 -1
- package/dist/runtime/spots/spot-actor-membership.js +0 -8
- package/dist/runtime/spots/spot-actor-packet-dispatch.js +33 -8
- package/dist/runtime/spots/spot-actor-packet-drain.js +5 -33
- package/dist/runtime/spots/spot-entry-activation.d.ts +2 -0
- package/dist/runtime/spots/spot-entry-activation.js +20 -11
- package/dist/runtime/spots/spot-handler-registry.d.ts +7 -4
- package/dist/runtime/spots/spot-handler-registry.js +24 -10
- package/dist/runtime/spots/spot-manager-internal-contracts.d.ts +2 -2
- package/dist/runtime/spots/spot-manager-public.js +2 -2
- package/dist/runtime/spots/spot-node-autoconnect.d.ts +2 -1
- package/dist/runtime/spots/spot-node-autoconnect.js +22 -42
- package/dist/runtime/spots/spot-node-runtime-manager.d.ts +19 -2
- package/dist/runtime/spots/spot-node-runtime-manager.js +115 -50
- package/dist/runtime/spots/spot-outbound.d.ts +3 -0
- package/dist/runtime/spots/spot-outbound.js +27 -18
- package/dist/runtime/spots/spot-remote-codec.js +5 -1
- package/dist/runtime/spots/spot-routed-spot-packet-dispatch.d.ts +1 -0
- package/dist/runtime/spots/spot-routed-spot-packet-dispatch.js +1 -1
- package/dist/runtime/spots/spot-runtime-ports.d.ts +1 -1
- package/dist/runtime/spots/spot-serial-executor.d.ts +10 -0
- package/dist/runtime/spots/spot-serial-executor.js +61 -8
- package/dist/runtime/spots/spot-serial-turn-executor.js +19 -2
- package/dist/runtime/spots/spot-subscription-dispatch.js +1 -4
- package/dist/runtime/spots/spot-timer.d.ts +57 -5
- package/dist/runtime/spots/spot-timer.js +288 -103
- package/dist/runtime/streams/actor-session-binding-registry.d.ts +42 -11
- package/dist/runtime/streams/actor-session-binding-registry.js +165 -48
- package/dist/runtime/streams/actor-session-binding-runtime-owner.d.ts +8 -4
- package/dist/runtime/streams/bound-actor-relay-sender.d.ts +2 -1
- package/dist/runtime/streams/bound-actor-relay-sender.js +15 -8
- package/dist/runtime/streams/bound-session-service.d.ts +1 -1
- package/dist/runtime/streams/bound-session-service.js +6 -11
- package/dist/runtime/streams/index.d.ts +3 -2
- package/dist/runtime/streams/index.js +6 -4
- package/dist/runtime/streams/managed-stream.js +3 -2
- package/dist/runtime/streams/native-fallback-bound-session.js +8 -73
- package/dist/runtime/streams/session-actor-coordinator.d.ts +2 -8
- package/dist/runtime/streams/session-actor-coordinator.js +15 -32
- package/dist/runtime/streams/stream-binding-runtime-ports.d.ts +3 -10
- package/dist/runtime/streams/stream-session-runtime.d.ts +1 -1
- package/dist/runtime/streams/stream-session-runtime.js +14 -31
- package/dist/runtime/workers/index.js +1 -1
- package/package.json +3 -3
- package/src/contracts/Actors/ZLinkActorClient.ts +2 -1
- package/src/contracts/Channels/Calls.ts +2 -1
- package/src/contracts/Common/ZLinkEncodedPayload.ts +24 -4
- package/src/contracts/Common/ZLinkMessageMetadata.ts +13 -8
- package/src/contracts/Common/encoded-payload-storage.ts +6 -3
- package/src/contracts/Configuration/Builders.ts +4 -1
- package/src/contracts/Configuration/RegistrationBuilderPolicy.ts +7 -2
- package/src/contracts/Configuration/RegistrationBuilders.ts +6 -2
- package/src/contracts/Configuration/RegistrationTypes.ts +1 -0
- package/src/contracts/Dispatch/ZLinkDispatchOptions.ts +2 -1
- package/src/contracts/Handlers/Attributes.ts +14 -21
- package/src/contracts/Handlers/JsonContract.ts +8 -216
- package/src/contracts/Locations/Rows.ts +2 -0
- package/src/contracts/Spots/Contracts.ts +10 -1
- package/src/contracts/Spots/ZLinkSpot.ts +3 -3
- package/src/nest-integration.ts +1 -0
- package/src/runtime/abort.ts +12 -0
- package/src/runtime/actors/actor-authority-publication.ts +3 -2
- package/src/runtime/actors/actor-client.ts +100 -85
- package/src/runtime/actors/actor-context.ts +49 -9
- package/src/runtime/actors/actor-handoff.ts +291 -110
- package/src/runtime/actors/actor-join-relocation.ts +3 -0
- package/src/runtime/actors/actor-local-native-join.ts +21 -26
- package/src/runtime/actors/actor-mailbox.ts +40 -2
- package/src/runtime/actors/actor-remote-joiner.ts +6 -1
- package/src/runtime/actors/actor-remote-wire.ts +17 -0
- package/src/runtime/actors/actor-reply.ts +42 -0
- package/src/runtime/actors/actor-routed-join-transport.ts +14 -4
- package/src/runtime/actors/actor-routed-json-request.ts +10 -2
- package/src/runtime/actors/actor-runtime-contracts.ts +2 -0
- package/src/runtime/actors/actor-runtime-state.ts +2 -20
- package/src/runtime/actors/actor-source-transfer.ts +1 -34
- package/src/runtime/actors/index.ts +60 -32
- package/src/runtime/actors/session-disconnected-wire.ts +66 -0
- package/src/runtime/actors/spot-actor-dispatch.ts +4 -2
- package/src/runtime/admission.ts +69 -21
- package/src/runtime/application-jobs/application-ingress-record-owner.ts +41 -25
- package/src/runtime/application-jobs/application-job-queue-scope.ts +83 -22
- package/src/runtime/application-jobs/contracts.ts +16 -1
- package/src/runtime/backend/contracts/index.ts +92 -18
- package/src/runtime/backend/mesh-actor-session-node-adapter.ts +5 -3
- package/src/runtime/backend/mesh-completion-table.ts +160 -57
- package/src/runtime/backend/mesh-dispatch-pump.ts +237 -108
- package/src/runtime/backend/node/node-backend-adapter-support.ts +17 -8
- package/src/runtime/backend/node/node-dealer-channel-client-transport.ts +12 -2
- package/src/runtime/backend/node/node-raw-binding-port.ts +148 -85
- package/src/runtime/backend/node/node-raw-mesh-backend.ts +315 -201
- package/src/runtime/backend/node/node-socket-backend-adapter.ts +26 -11
- package/src/runtime/backend/raw-binding-port.ts +7 -2
- package/src/runtime/backend/runtime-message.ts +6 -0
- package/src/runtime/backend/runtime-values.ts +1 -0
- package/src/runtime/channels/channel-clients.ts +132 -58
- package/src/runtime/channels/channel-dispatch-pipeline.ts +198 -114
- package/src/runtime/channels/channel-dispatch-services.ts +69 -1
- package/src/runtime/channels/channel-dispatchers.ts +136 -90
- package/src/runtime/channels/channel-envelope-inspection.ts +2 -16
- package/src/runtime/channels/channel-envelope.ts +225 -31
- package/src/runtime/channels/channel-outbound-operations.ts +22 -8
- package/src/runtime/channels/channel-runtime-lifecycle.ts +13 -13
- package/src/runtime/channels/channel-runtime-manager.ts +41 -17
- package/src/runtime/channels/channel-transports.ts +171 -112
- package/src/runtime/channels/client-server-location-runtime.ts +11 -10
- package/src/runtime/channels/dispatch-error-reporter.ts +4 -2
- package/src/runtime/channels/fanout-location-runtime.ts +17 -9
- package/src/runtime/channels/local-spot-route-transport.ts +3 -1
- package/src/runtime/channels/router-socket-spot-route-transport.ts +13 -4
- package/src/runtime/channels/source-spot-router.ts +8 -4
- package/src/runtime/channels/spot-node-route-transport.ts +8 -4
- package/src/runtime/channels/spot-route-bridge-transport.ts +6 -4
- package/src/runtime/channels/spot-route-dispatch-strategy.ts +47 -18
- package/src/runtime/diagnostics/flow-context.ts +20 -7
- package/src/runtime/diagnostics/index.ts +1 -7
- package/src/runtime/diagnostics/message-flow.ts +47 -9
- package/src/runtime/diagnostics/runtime-metrics.ts +12 -10
- package/src/runtime/execution/index.ts +40 -14
- package/src/runtime/execution/serial-execution-queue.ts +33 -4
- package/src/runtime/execution/state-lane.ts +7 -0
- package/src/runtime/foundation/actor-join-recovery-codec.ts +2 -2
- package/src/runtime/foundation/durable-service-request.ts +137 -0
- package/src/runtime/foundation/operation-identity.ts +5 -1
- package/src/runtime/foundation/operation-registry.ts +98 -20
- package/src/runtime/foundation/raw-service-mesh-runtime.ts +704 -336
- package/src/runtime/foundation/service-liveness-registry.ts +39 -0
- package/src/runtime/foundation/service-mailbox.ts +8 -0
- package/src/runtime/foundation/service-maintenance-runtime.ts +1 -8
- package/src/runtime/foundation/service-relocation-object-owner.ts +55 -36
- package/src/runtime/foundation/service-relocation-runtime.ts +25 -4
- package/src/runtime/foundation/service-runtime-contracts.ts +19 -2
- package/src/runtime/foundation/service-session-binding-ingress-port.ts +2 -1
- package/src/runtime/foundation/service-stateful-registry.ts +38 -35
- package/src/runtime/foundation/service-stateful-runtime.ts +732 -275
- package/src/runtime/foundation/service-stateful-wire-codec.ts +49 -16
- package/src/runtime/foundation/service-topology-registry.ts +91 -36
- package/src/runtime/foundation/service-wire-binary-primitives.ts +35 -12
- package/src/runtime/foundation/service-wire-constants.generated.ts +1 -0
- package/src/runtime/foundation/service-wire-m6a-codec.ts +231 -76
- package/src/runtime/handlers/handler-instance-scope.ts +67 -16
- package/src/runtime/host/actor-packet-relay.ts +113 -94
- package/src/runtime/host/actor-placement-coordinator.ts +31 -8
- package/src/runtime/host/actor-runtime-options-factory.ts +13 -2
- package/src/runtime/host/actor-transfer-runtime.ts +104 -430
- package/src/runtime/host/application-job-queue.ts +160 -41
- package/src/runtime/host/entry-actor-runtime.ts +4 -0
- package/src/runtime/host/index.ts +473 -271
- package/src/runtime/host/location-runtime-owner.ts +2 -6
- package/src/runtime/host/mesh-router-resolver.ts +13 -5
- package/src/runtime/host/remote-bound-session-relay.ts +88 -271
- package/src/runtime/host/route-mesh-runtime.ts +12 -6
- package/src/runtime/host/runtime-shutdown.ts +15 -4
- package/src/runtime/host/service-relocation-control.ts +11 -5
- package/src/runtime/host/service-relocation-host-runtime.ts +1092 -759
- package/src/runtime/host/spot-address-transport.ts +4 -2
- package/src/runtime/host/spot-runtime-options-factory.ts +20 -7
- package/src/runtime/host/user-spot-creation-coordinator.ts +41 -100
- package/src/runtime/locations/actor-location-claims.ts +52 -30
- package/src/runtime/locations/auto-connect-loop.ts +22 -14
- package/src/runtime/locations/auto-connect-reconciler.ts +0 -6
- package/src/runtime/locations/auto-connect-types.ts +0 -1
- package/src/runtime/locations/descriptor-publication.ts +7 -0
- package/src/runtime/locations/domain-store-contract.ts +5 -0
- package/src/runtime/locations/in-memory-authority-store.ts +85 -23
- package/src/runtime/locations/in-memory-location-store.ts +1 -12
- package/src/runtime/locations/index.ts +1 -0
- package/src/runtime/locations/lease-tracker.ts +2 -9
- package/src/runtime/locations/lifecycle.ts +8 -26
- package/src/runtime/locations/location-store-repository.ts +628 -152
- package/src/runtime/locations/relocation-blob.ts +75 -1
- package/src/runtime/locations/request-source-resolver.ts +138 -0
- package/src/runtime/locations/resolvers.ts +2 -2
- package/src/runtime/locations/runtime.ts +98 -64
- package/src/runtime/messaging/framework-json-v1.ts +5 -325
- package/src/runtime/messaging/packet-name.ts +5 -25
- package/src/runtime/messaging/payload-codec.ts +8 -11
- package/src/runtime/messaging/request-result.ts +62 -0
- package/src/runtime/messaging/submission-result.ts +5 -1
- package/src/runtime/protocol/service_wire_codec.generated.ts +218 -5
- package/src/runtime/protocol/service_wire_pilot_codec.generated.ts +16 -13
- package/src/runtime/spots/formal-remote-actor-admission-registry.ts +46 -25
- package/src/runtime/spots/index.ts +389 -283
- package/src/runtime/spots/spot-activation-registry.ts +25 -13
- package/src/runtime/spots/spot-activation-state.ts +12 -19
- package/src/runtime/spots/spot-activation.ts +198 -96
- package/src/runtime/spots/spot-actor-admission-coordinator.ts +25 -55
- package/src/runtime/spots/spot-actor-membership.ts +0 -15
- package/src/runtime/spots/spot-actor-packet-dispatch.ts +56 -11
- package/src/runtime/spots/spot-actor-packet-drain.ts +9 -52
- package/src/runtime/spots/spot-entry-activation.ts +33 -21
- package/src/runtime/spots/spot-handler-registry.ts +56 -12
- package/src/runtime/spots/spot-manager-internal-contracts.ts +2 -2
- package/src/runtime/spots/spot-manager-public.ts +2 -2
- package/src/runtime/spots/spot-node-autoconnect.ts +28 -47
- package/src/runtime/spots/spot-node-runtime-manager.ts +197 -67
- package/src/runtime/spots/spot-outbound.ts +39 -19
- package/src/runtime/spots/spot-remote-codec.ts +9 -2
- package/src/runtime/spots/spot-routed-spot-packet-dispatch.ts +2 -1
- package/src/runtime/spots/spot-runtime-ports.ts +1 -1
- package/src/runtime/spots/spot-serial-executor.ts +97 -25
- package/src/runtime/spots/spot-serial-turn-executor.ts +22 -3
- package/src/runtime/spots/spot-subscription-dispatch.ts +1 -4
- package/src/runtime/spots/spot-timer.ts +418 -158
- package/src/runtime/streams/actor-session-binding-registry.ts +236 -64
- package/src/runtime/streams/actor-session-binding-runtime-owner.ts +16 -8
- package/src/runtime/streams/bound-actor-relay-sender.ts +23 -9
- package/src/runtime/streams/bound-session-service.ts +7 -10
- package/src/runtime/streams/index.ts +12 -6
- package/src/runtime/streams/managed-stream.ts +4 -2
- package/src/runtime/streams/native-fallback-bound-session.ts +14 -103
- package/src/runtime/streams/session-actor-coordinator.ts +39 -88
- package/src/runtime/streams/stream-binding-runtime-ports.ts +3 -9
- package/src/runtime/streams/stream-session-runtime.ts +13 -34
- package/src/runtime/workers/index.ts +1 -1
|
@@ -54,9 +54,20 @@ export class ServiceLivenessConnection {
|
|
|
54
54
|
}
|
|
55
55
|
|
|
56
56
|
/** Uses monotonic milliseconds and never treats application traffic as a probe ACK. */
|
|
57
|
+
const NO_LIVENESS_WORK: ServiceLivenessTick = Object.freeze({
|
|
58
|
+
probes: Object.freeze([]) as readonly ServiceProbe[],
|
|
59
|
+
timedOutNodes: Object.freeze([]) as readonly string[]
|
|
60
|
+
});
|
|
61
|
+
|
|
57
62
|
export class ServiceLivenessRegistry {
|
|
58
63
|
private readonly peers = new Map<string, ServiceLivenessConnection>();
|
|
59
64
|
private nextProbeId = 1n;
|
|
65
|
+
/**
|
|
66
|
+
* The earliest probe or timeout among admitted peers. Received traffic only
|
|
67
|
+
* extends a peer's deadline, so this stays a lower bound between ticks.
|
|
68
|
+
*/
|
|
69
|
+
private nextDueMs = Number.POSITIVE_INFINITY;
|
|
70
|
+
private admissionActivityMs?: number;
|
|
60
71
|
|
|
61
72
|
constructor(
|
|
62
73
|
private readonly probeIntervalMs = DEFAULT_SERVICE_PROBE_INTERVAL_MS,
|
|
@@ -89,9 +100,33 @@ export class ServiceLivenessRegistry {
|
|
|
89
100
|
this.peerTimeoutMs
|
|
90
101
|
);
|
|
91
102
|
this.peers.set(nodeRoutingId, admitted);
|
|
103
|
+
this.nextDueMs = Math.min(this.nextDueMs, admitted.nextProbeMs, admitted.deadlineMs);
|
|
92
104
|
return admitted;
|
|
93
105
|
}
|
|
94
106
|
|
|
107
|
+
/** When the next tick has probe or timeout work (spec 08 §4.2 management deadline). */
|
|
108
|
+
nextDeadlineMs(): number {
|
|
109
|
+
return Math.min(this.nextDueMs, this.nextAdmissionDeadlineMs());
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
/** Pending admission shares the existing liveness management cadence (MeshNode §7.1). */
|
|
113
|
+
setAdmissionPending(pending: boolean, nowMs: number): void {
|
|
114
|
+
if (pending) this.admissionActivityMs ??= nowMs;
|
|
115
|
+
else this.admissionActivityMs = undefined;
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
private nextAdmissionDeadlineMs(): number {
|
|
119
|
+
return this.admissionActivityMs === undefined
|
|
120
|
+
? Number.POSITIVE_INFINITY
|
|
121
|
+
: this.admissionActivityMs + this.probeIntervalMs;
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
tickAdmission(nowMs: number): boolean {
|
|
125
|
+
if (nowMs < this.nextAdmissionDeadlineMs()) return false;
|
|
126
|
+
this.admissionActivityMs = nowMs;
|
|
127
|
+
return true;
|
|
128
|
+
}
|
|
129
|
+
|
|
95
130
|
recordReceived(connection: ServiceLivenessConnection, nowMs: number): void {
|
|
96
131
|
connection.recordReceived(nowMs);
|
|
97
132
|
}
|
|
@@ -127,8 +162,10 @@ export class ServiceLivenessRegistry {
|
|
|
127
162
|
}
|
|
128
163
|
|
|
129
164
|
tick(nowMs: number): ServiceLivenessTick {
|
|
165
|
+
if (nowMs < this.nextDeadlineMs()) return NO_LIVENESS_WORK;
|
|
130
166
|
const probes: ServiceProbe[] = [];
|
|
131
167
|
const timedOutNodes: string[] = [];
|
|
168
|
+
let nextDueMs = Number.POSITIVE_INFINITY;
|
|
132
169
|
for (const [nodeRoutingId, peer] of this.peers) {
|
|
133
170
|
if (peer.isExpired(nowMs)) {
|
|
134
171
|
timedOutNodes.push(nodeRoutingId);
|
|
@@ -138,7 +175,9 @@ export class ServiceLivenessRegistry {
|
|
|
138
175
|
const probeId = peer.tryGetProbe(nowMs, this.allocateProbeId);
|
|
139
176
|
if (probeId !== undefined)
|
|
140
177
|
probes.push({ nodeRoutingId, connectionId: peer.connectionId, probeId });
|
|
178
|
+
nextDueMs = Math.min(nextDueMs, peer.nextProbeMs, peer.deadlineMs);
|
|
141
179
|
}
|
|
180
|
+
this.nextDueMs = nextDueMs;
|
|
142
181
|
timedOutNodes.sort();
|
|
143
182
|
return { probes, timedOutNodes };
|
|
144
183
|
}
|
|
@@ -1,13 +1,21 @@
|
|
|
1
1
|
import type { ApplicationJobRecordLease } from '../application-jobs/application-ingress-record-owner';
|
|
2
2
|
import type { ReceiveRecord } from './service-runtime-contracts';
|
|
3
|
+
import type { RawServiceIngressRecord } from './raw-service-mesh-runtime';
|
|
3
4
|
|
|
4
5
|
export type ServiceMailboxDomain = 'application' | 'infrastructure';
|
|
5
6
|
|
|
7
|
+
export interface ServiceMailboxDispatchOwner {
|
|
8
|
+
prepareDispatch(record: ServiceMailboxRecord, signal: AbortSignal): boolean | Promise<boolean>;
|
|
9
|
+
}
|
|
10
|
+
|
|
6
11
|
export interface ServiceMailboxRecord {
|
|
12
|
+
readonly sourcePreparationOwner?: ServiceMailboxDispatchOwner;
|
|
13
|
+
readonly ingress?: RawServiceIngressRecord;
|
|
7
14
|
readonly owner: string;
|
|
8
15
|
readonly domain: ServiceMailboxDomain;
|
|
9
16
|
parts: readonly Uint8Array[];
|
|
10
17
|
readonly sourceRoutingId?: string;
|
|
18
|
+
readonly requestSource?: import('../locations/request-source-resolver').ZLinkRequestSourceFence;
|
|
11
19
|
readonly sourceRoute?: Uint8Array;
|
|
12
20
|
readonly requestSequence?: bigint;
|
|
13
21
|
readonly reply?: (parts: readonly Uint8Array[]) => void;
|
|
@@ -1,7 +1,4 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { ZLinkStateLane } from '../execution/state-lane';
|
|
3
|
-
|
|
4
|
-
const detachedStateLaneResource = new AsyncResource('zlink:service-maintenance-runtime');
|
|
1
|
+
import { startOutsideStateLane, ZLinkStateLane } from '../execution/state-lane';
|
|
5
2
|
|
|
6
3
|
export type ServiceMaintenanceKind = 'retire' | 'shutdown';
|
|
7
4
|
export type ServiceMaintenanceState =
|
|
@@ -248,7 +245,3 @@ export class ServiceMaintenanceRuntime {
|
|
|
248
245
|
for (const observer of publication.observers) observer(publication.snapshot);
|
|
249
246
|
}
|
|
250
247
|
}
|
|
251
|
-
|
|
252
|
-
function startOutsideStateLane<T>(work: () => T): T {
|
|
253
|
-
return detachedStateLaneResource.runInAsyncScope(work);
|
|
254
|
-
}
|
|
@@ -17,6 +17,7 @@ const DEFAULT_RELOCATION_CALLBACK_CONCURRENCY = 8;
|
|
|
17
17
|
|
|
18
18
|
export interface ServiceRelocationSealedWork {
|
|
19
19
|
readonly boundSessionState: Uint8Array;
|
|
20
|
+
readonly sessionBinding?: ServiceRelocationParticipant['sessionBinding'];
|
|
20
21
|
readonly queuedMessages: readonly ServiceRelocationQueuedMessage[];
|
|
21
22
|
readonly timers: readonly ServiceRelocationTimer[];
|
|
22
23
|
}
|
|
@@ -29,7 +30,7 @@ export interface ServiceRelocationCaptureUnit {
|
|
|
29
30
|
readonly authorityOwnerGeneration: bigint;
|
|
30
31
|
seal(signal?: AbortSignal): Promise<ServiceRelocationSealedWork>;
|
|
31
32
|
captureApplicationState(signal?: AbortSignal): Promise<Uint8Array>;
|
|
32
|
-
commitSeal(): Promise<void> | void;
|
|
33
|
+
commitSeal(followAuthorities: ReadonlyMap<string, ZLinkAuthoritySnapshot>): Promise<void> | void;
|
|
33
34
|
abortSeal(): Promise<void> | void;
|
|
34
35
|
/** Expired-owner terminal: pending requests fail once and dispatch stays closed. */
|
|
35
36
|
discardSeal?(reason: unknown): Promise<void> | void;
|
|
@@ -43,12 +44,14 @@ export class ServiceCapturedObjectRelocation {
|
|
|
43
44
|
private readonly units: readonly ServiceRelocationCaptureUnit[]
|
|
44
45
|
) {}
|
|
45
46
|
|
|
46
|
-
async commitSource(
|
|
47
|
+
async commitSource(
|
|
48
|
+
followAuthorities: ReadonlyMap<string, ZLinkAuthoritySnapshot>
|
|
49
|
+
): Promise<void> {
|
|
47
50
|
if (this.terminal === 'committed') return;
|
|
48
51
|
if (this.terminal !== 'open') {
|
|
49
52
|
throw new Error(`Relocation source capture was already ${this.terminal}.`);
|
|
50
53
|
}
|
|
51
|
-
for (const unit of this.units) await unit.commitSeal();
|
|
54
|
+
for (const unit of this.units) await unit.commitSeal(followAuthorities);
|
|
52
55
|
this.terminal = 'committed';
|
|
53
56
|
}
|
|
54
57
|
|
|
@@ -57,17 +60,10 @@ export class ServiceCapturedObjectRelocation {
|
|
|
57
60
|
if (this.terminal !== 'open') {
|
|
58
61
|
throw new Error(`A ${this.terminal} relocation source capture cannot be aborted.`);
|
|
59
62
|
}
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
} catch (error) {
|
|
65
|
-
failures.push(error);
|
|
66
|
-
}
|
|
67
|
-
}
|
|
68
|
-
this.terminal = 'aborted';
|
|
69
|
-
if (failures.length !== 0) {
|
|
70
|
-
throw new AggregateError(failures, 'Relocation source rollback was incomplete.');
|
|
63
|
+
try {
|
|
64
|
+
await abortSourceSeals(this.units);
|
|
65
|
+
} finally {
|
|
66
|
+
this.terminal = 'aborted';
|
|
71
67
|
}
|
|
72
68
|
}
|
|
73
69
|
|
|
@@ -166,31 +162,37 @@ export class ServiceRelocationObjectCaptureOwner {
|
|
|
166
162
|
): Promise<ServiceCapturedObjectRelocation> {
|
|
167
163
|
const captured: Array<{
|
|
168
164
|
readonly unit: ServiceRelocationCaptureUnit;
|
|
169
|
-
|
|
165
|
+
work?: ServiceRelocationSealedWork;
|
|
170
166
|
}> = [];
|
|
171
167
|
try {
|
|
172
168
|
for (const unit of units) {
|
|
173
169
|
signal?.throwIfAborted();
|
|
174
|
-
const
|
|
175
|
-
captured.push(
|
|
170
|
+
const capture: (typeof captured)[number] = { unit };
|
|
171
|
+
captured.push(capture);
|
|
172
|
+
capture.work = await unit.seal(signal);
|
|
176
173
|
}
|
|
177
174
|
const participants = await mapConcurrentOrdered(
|
|
178
175
|
captured,
|
|
179
176
|
this.maxConcurrentCallbacks,
|
|
180
|
-
async ({ unit, work }) =>
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
177
|
+
async ({ unit, work: sealedWork }) => {
|
|
178
|
+
// Application capture starts only after every seal completed.
|
|
179
|
+
const work = sealedWork!;
|
|
180
|
+
return {
|
|
181
|
+
key: unit.authorityKey,
|
|
182
|
+
objectKind: unit.objectKind,
|
|
183
|
+
stableType: unit.stableType,
|
|
184
|
+
objectGeneration: unit.objectGeneration,
|
|
185
|
+
authorityOwnerGeneration: unit.authorityOwnerGeneration,
|
|
186
|
+
applicationState: Buffer.from(await unit.captureApplicationState(signal)),
|
|
187
|
+
boundSessionState: Buffer.from(work.boundSessionState),
|
|
188
|
+
...(work.sessionBinding === undefined ? {} : { sessionBinding: work.sessionBinding }),
|
|
189
|
+
queuedMessages: work.queuedMessages.map((message) => ({
|
|
190
|
+
sequence: message.sequence,
|
|
191
|
+
payload: Buffer.from(message.payload)
|
|
192
|
+
})),
|
|
193
|
+
timers: work.timers.map((timer) => ({ ...timer }))
|
|
194
|
+
};
|
|
195
|
+
},
|
|
194
196
|
signal
|
|
195
197
|
);
|
|
196
198
|
return new ServiceCapturedObjectRelocation(
|
|
@@ -203,12 +205,33 @@ export class ServiceRelocationObjectCaptureOwner {
|
|
|
203
205
|
units
|
|
204
206
|
);
|
|
205
207
|
} catch (error) {
|
|
206
|
-
|
|
208
|
+
try {
|
|
209
|
+
await abortSourceSeals(captured.map(({ unit }) => unit));
|
|
210
|
+
} catch (rollbackError) {
|
|
211
|
+
throw new AggregateError(
|
|
212
|
+
[error, rollbackError],
|
|
213
|
+
'Relocation capture failed and source rollback was incomplete.'
|
|
214
|
+
);
|
|
215
|
+
}
|
|
207
216
|
throw error;
|
|
208
217
|
}
|
|
209
218
|
}
|
|
210
219
|
}
|
|
211
220
|
|
|
221
|
+
async function abortSourceSeals(units: readonly ServiceRelocationCaptureUnit[]): Promise<void> {
|
|
222
|
+
const failures: unknown[] = [];
|
|
223
|
+
for (const unit of [...units].reverse()) {
|
|
224
|
+
try {
|
|
225
|
+
await unit.abortSeal();
|
|
226
|
+
} catch (error) {
|
|
227
|
+
failures.push(error);
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
if (failures.length !== 0) {
|
|
231
|
+
throw new AggregateError(failures, 'Relocation source rollback was incomplete.');
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
|
|
212
235
|
export interface ServiceRelocationHiddenObject {
|
|
213
236
|
readonly authorityKey: string;
|
|
214
237
|
}
|
|
@@ -232,7 +255,6 @@ export interface ServiceRelocationTargetObjectPort<THidden extends ServiceReloca
|
|
|
232
255
|
message: ServiceRelocationQueuedMessage,
|
|
233
256
|
signal?: AbortSignal
|
|
234
257
|
): Promise<void>;
|
|
235
|
-
restoreTimer(hidden: THidden, timer: ServiceRelocationTimer, signal?: AbortSignal): Promise<void>;
|
|
236
258
|
normalize(
|
|
237
259
|
hidden: THidden,
|
|
238
260
|
authority: ZLinkAuthoritySnapshot,
|
|
@@ -331,9 +353,6 @@ export class ServiceRelocationObjectRestoreOwner<
|
|
|
331
353
|
for (const message of participant.queuedMessages) {
|
|
332
354
|
await this.target.replayQueuedMessage(hidden, message, signal);
|
|
333
355
|
}
|
|
334
|
-
for (const timer of participant.timers) {
|
|
335
|
-
await this.target.restoreTimer(hidden, timer, signal);
|
|
336
|
-
}
|
|
337
356
|
}
|
|
338
357
|
}
|
|
339
358
|
|
|
@@ -39,6 +39,7 @@ export interface ServiceRelocationParticipant {
|
|
|
39
39
|
readonly applicationStatePresent?: boolean;
|
|
40
40
|
readonly applicationState: Uint8Array;
|
|
41
41
|
readonly boundSessionState: Uint8Array;
|
|
42
|
+
readonly sessionBinding?: GeneratedRelocationEnvelopeV1['sessionBindings'][number];
|
|
42
43
|
readonly queuedMessages: readonly ServiceRelocationQueuedMessage[];
|
|
43
44
|
readonly timers: readonly ServiceRelocationTimer[];
|
|
44
45
|
}
|
|
@@ -726,6 +727,11 @@ export function encodeServiceRelocationEnvelope(
|
|
|
726
727
|
'timer due time'
|
|
727
728
|
)
|
|
728
729
|
})),
|
|
730
|
+
sessionBindings: participants.flatMap((participant, index) =>
|
|
731
|
+
participant.sessionBinding === undefined
|
|
732
|
+
? []
|
|
733
|
+
: [{ ...participant.sessionBinding, participantId: BigInt(index + 1) }]
|
|
734
|
+
),
|
|
729
735
|
pendingTimerTicks: pending.map((value) => ({
|
|
730
736
|
participantId: value.participantId,
|
|
731
737
|
order: value.order,
|
|
@@ -765,11 +771,22 @@ export function decodeServiceRelocationEnvelope(
|
|
|
765
771
|
const aggregateId = uuid(generated.relocationHigh, generated.relocationLow);
|
|
766
772
|
if (aggregateId === undefined) throw new TypeError('Invalid relocation identity.');
|
|
767
773
|
positiveBigInt(aggregateGeneration, 'aggregate generation');
|
|
774
|
+
const bindings = new Map(
|
|
775
|
+
generated.sessionBindings.map((binding) => [binding.participantId, binding])
|
|
776
|
+
);
|
|
777
|
+
for (const id of bindings.keys()) {
|
|
778
|
+
if (id > BigInt(generated.applicationStates.length))
|
|
779
|
+
throw new TypeError('Session binding participant is outside its inventory.');
|
|
780
|
+
}
|
|
768
781
|
const participants = generated.applicationStates.map((state, index) => {
|
|
769
782
|
if (state.participantId !== BigInt(index + 1)) {
|
|
770
783
|
throw new TypeError('Application state participant order is invalid.');
|
|
771
784
|
}
|
|
772
|
-
|
|
785
|
+
const binding = bindings.get(state.participantId);
|
|
786
|
+
return {
|
|
787
|
+
...wireParticipant(state.participantId, state.hasState, Buffer.from(state.payload)),
|
|
788
|
+
...(binding === undefined ? {} : { sessionBinding: binding })
|
|
789
|
+
};
|
|
773
790
|
});
|
|
774
791
|
const byId = new Map(participants.map((value) => [value.participantId!, value]));
|
|
775
792
|
for (const work of generated.savedWork) {
|
|
@@ -779,12 +796,16 @@ export function decodeServiceRelocationEnvelope(
|
|
|
779
796
|
});
|
|
780
797
|
}
|
|
781
798
|
for (const timer of generated.timerRegistrations) {
|
|
799
|
+
const dueAtUnixMs = unixMilliseconds(timer.nextScheduledAtUnixMilliseconds);
|
|
800
|
+
const intervalMs = unixMilliseconds(timer.periodMilliseconds);
|
|
782
801
|
byId.get(timer.participantId)!.timers.push({
|
|
783
802
|
timerId: timer.name,
|
|
784
803
|
handlerType: timer.handlerType,
|
|
785
|
-
|
|
786
|
-
|
|
787
|
-
|
|
804
|
+
// The wire anchors the nominal schedule by its next due time: the next
|
|
805
|
+
// nominal tick after the completed ScheduledIndex (Spot timer §1).
|
|
806
|
+
startedAtUnixMs: dueAtUnixMs - Number(timer.lastCompletedScheduledIndex + 1n) * intervalMs,
|
|
807
|
+
dueAtUnixMs,
|
|
808
|
+
intervalMs,
|
|
788
809
|
overrunPolicy: timerPolicyName(timer.overrunPolicy),
|
|
789
810
|
maxCatchUpTicks: unixMilliseconds(timer.maxCatchUpTicks),
|
|
790
811
|
stopOnUnhandledException: timer.stopOnUnhandledException,
|
|
@@ -243,12 +243,22 @@ export interface ReceiveRequirements {
|
|
|
243
243
|
}
|
|
244
244
|
|
|
245
245
|
export interface ZLinkMessageFollowOrigin {
|
|
246
|
+
readonly requestSource?: import('../locations/request-source-resolver').ZLinkRequestSourceFence;
|
|
246
247
|
readonly sourceNodeRid: RoutingId;
|
|
247
248
|
readonly originalOperation: MeshOperationId;
|
|
248
249
|
readonly originalReplyRouteId: bigint;
|
|
250
|
+
/** The canonical target accepted with the original native Actor frame. */
|
|
251
|
+
readonly target?: import('./service-stateful-wire-codec').ServiceActorRouteFence;
|
|
249
252
|
}
|
|
250
253
|
|
|
251
254
|
export interface ReceiveRecord {
|
|
255
|
+
/** Resolve record prerequisites in owner order, outside an application handler turn. */
|
|
256
|
+
readonly prepareDispatch?: (
|
|
257
|
+
this: ReceiveRecord,
|
|
258
|
+
signal: AbortSignal
|
|
259
|
+
) => boolean | Promise<boolean>;
|
|
260
|
+
readonly statefulMailboxRecord?: import('./service-mailbox').ServiceMailboxRecord;
|
|
261
|
+
readonly requestSource?: import('../locations/request-source-resolver').ZLinkRequestSourceFence;
|
|
252
262
|
readonly kind: number;
|
|
253
263
|
readonly domain: number;
|
|
254
264
|
readonly sourceNodeRid: RoutingId | null;
|
|
@@ -377,7 +387,8 @@ export interface StreamSessionService {
|
|
|
377
387
|
retiredSession: ServiceRetiredBoundSessionRouteFence,
|
|
378
388
|
actor: ServiceActorRef
|
|
379
389
|
) => void,
|
|
380
|
-
actorAuthority?: StreamSessionActorAuthorityFence
|
|
390
|
+
actorAuthority?: StreamSessionActorAuthorityFence,
|
|
391
|
+
close?: () => Promise<void>
|
|
381
392
|
): MeshOperationId;
|
|
382
393
|
unbindActor(
|
|
383
394
|
sessionRid: RoutingId,
|
|
@@ -422,7 +433,12 @@ export interface ServiceSpot {
|
|
|
422
433
|
requestToChannel(
|
|
423
434
|
channelName: string,
|
|
424
435
|
parts: MessageLike | readonly MessageLike[],
|
|
425
|
-
options?: {
|
|
436
|
+
options?: {
|
|
437
|
+
flags?: number;
|
|
438
|
+
timeoutMs?: number;
|
|
439
|
+
applicationMetadata?: Buffer;
|
|
440
|
+
onAdmitted?: () => void;
|
|
441
|
+
}
|
|
426
442
|
): MeshOperationId;
|
|
427
443
|
sendToSpot(
|
|
428
444
|
targetNodeRid: unknown,
|
|
@@ -445,6 +461,7 @@ export interface ServiceSpot {
|
|
|
445
461
|
timeoutMs?: number;
|
|
446
462
|
applicationMetadata?: Buffer;
|
|
447
463
|
routeFence?: ServiceDirectSpotRouteFence;
|
|
464
|
+
onAdmitted?: () => void;
|
|
448
465
|
entrySpot?: boolean;
|
|
449
466
|
}
|
|
450
467
|
): MeshOperationId;
|
|
@@ -1,5 +1,6 @@
|
|
|
1
|
+
import type { RoutingId } from '../../contracts';
|
|
1
2
|
export interface ServiceSessionBindingIngressPort {
|
|
2
|
-
actorSlot(actorId: string, sessionRid:
|
|
3
|
+
actorSlot(actorId: string, sessionRid: RoutingId): Promise<number | undefined>;
|
|
3
4
|
}
|
|
4
5
|
|
|
5
6
|
const ports = new WeakMap<object, ServiceSessionBindingIngressPort>();
|
|
@@ -1,4 +1,9 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import {
|
|
2
|
+
ZLINK_MAX_IDENTITY_TEXT_BYTES,
|
|
3
|
+
ZLINK_MAX_ROUTING_ID_BYTES
|
|
4
|
+
} from '../../contracts/Common/CoreTypes';
|
|
5
|
+
import { routingIdsEqual } from '../routing-id';
|
|
6
|
+
import { encodeServiceWireRoutingId } from './service-wire-binary-primitives';
|
|
2
7
|
import { OperationRegistry, type PendingOperation } from './operation-registry';
|
|
3
8
|
|
|
4
9
|
export type ServiceSpotKind = 'entry' | 'user' | 'instance';
|
|
@@ -114,7 +119,6 @@ export class ServiceStatefulRegistry {
|
|
|
114
119
|
private readonly reservationAttempts = new Map<string, bigint>();
|
|
115
120
|
private readonly turns = new Map<string, Promise<void>>();
|
|
116
121
|
private nextReservationId = 1n;
|
|
117
|
-
private nextBindingGeneration = 1n;
|
|
118
122
|
|
|
119
123
|
constructor(
|
|
120
124
|
readonly nodeRid: string,
|
|
@@ -392,47 +396,35 @@ export class ServiceStatefulRegistry {
|
|
|
392
396
|
return current;
|
|
393
397
|
}
|
|
394
398
|
|
|
395
|
-
|
|
396
|
-
actor: ServiceActorRef,
|
|
397
|
-
sessionRid: string,
|
|
398
|
-
sessionOwnerNodeRid: string,
|
|
399
|
-
sessionOwnerNodeGeneration?: bigint,
|
|
400
|
-
sessionOwnerId?: string,
|
|
401
|
-
sessionOwnerLeaseGeneration?: bigint
|
|
402
|
-
): ServiceSessionBinding {
|
|
403
|
-
const current = this.requireActorCore(actor);
|
|
404
|
-
requireText(sessionRid, 'sessionRid');
|
|
405
|
-
requireText(sessionOwnerNodeRid, 'sessionOwnerNodeRid');
|
|
406
|
-
const binding: ServiceSessionBinding = Object.freeze({
|
|
407
|
-
actor: Object.freeze({ ...current.ref }),
|
|
408
|
-
sessionRid,
|
|
409
|
-
sessionOwnerNodeRid,
|
|
410
|
-
...(sessionOwnerNodeGeneration === undefined ? {} : { sessionOwnerNodeGeneration }),
|
|
411
|
-
...(sessionOwnerId === undefined ? {} : { sessionOwnerId }),
|
|
412
|
-
...(sessionOwnerLeaseGeneration === undefined ? {} : { sessionOwnerLeaseGeneration }),
|
|
413
|
-
bindingGeneration: this.nextBindingGeneration++,
|
|
414
|
-
membershipEpoch: current.membershipEpoch
|
|
415
|
-
});
|
|
416
|
-
this.bindings.set(actorKey(actor), binding);
|
|
417
|
-
return binding;
|
|
418
|
-
}
|
|
419
|
-
|
|
420
|
-
installSessionBinding(binding: ServiceSessionBinding): void {
|
|
399
|
+
installSessionBinding(binding: ServiceSessionBinding): ServiceSessionBinding {
|
|
421
400
|
this.requireActorCore(binding.actor);
|
|
401
|
+
encodeServiceWireRoutingId(
|
|
402
|
+
binding.sessionRid,
|
|
403
|
+
'sessionRid',
|
|
404
|
+
ZLINK_MAX_ROUTING_ID_BYTES,
|
|
405
|
+
(message) => {
|
|
406
|
+
throw new RangeError(message);
|
|
407
|
+
}
|
|
408
|
+
);
|
|
409
|
+
requireText(binding.sessionOwnerNodeRid, 'sessionOwnerNodeRid');
|
|
422
410
|
requirePositive(binding.bindingGeneration, 'bindingGeneration');
|
|
423
411
|
const current = this.bindings.get(actorKey(binding.actor));
|
|
424
412
|
if (
|
|
425
413
|
current !== undefined &&
|
|
426
414
|
current.sessionOwnerNodeRid === binding.sessionOwnerNodeRid &&
|
|
427
415
|
current.sessionOwnerNodeGeneration === binding.sessionOwnerNodeGeneration &&
|
|
428
|
-
current.sessionOwnerId === binding.sessionOwnerId &&
|
|
429
|
-
current.sessionOwnerLeaseGeneration === binding.sessionOwnerLeaseGeneration &&
|
|
430
416
|
current.bindingGeneration >= binding.bindingGeneration
|
|
431
417
|
) {
|
|
418
|
+
if (
|
|
419
|
+
current.bindingGeneration === binding.bindingGeneration &&
|
|
420
|
+
current.sessionRid === binding.sessionRid
|
|
421
|
+
)
|
|
422
|
+
return current;
|
|
432
423
|
throw new ServiceStaleGenerationError('binding', binding.actor.actorId);
|
|
433
424
|
}
|
|
434
|
-
|
|
435
|
-
this.bindings.set(actorKey(binding.actor),
|
|
425
|
+
const accepted = Object.freeze({ ...binding });
|
|
426
|
+
this.bindings.set(actorKey(binding.actor), accepted);
|
|
427
|
+
return accepted;
|
|
436
428
|
}
|
|
437
429
|
|
|
438
430
|
binding(actor: ServiceActorRef): ServiceSessionBinding | undefined {
|
|
@@ -455,7 +447,8 @@ export class ServiceStatefulRegistry {
|
|
|
455
447
|
if (binding === undefined) return false;
|
|
456
448
|
if (
|
|
457
449
|
binding.bindingGeneration !== expectedBindingGeneration ||
|
|
458
|
-
(expectedSessionRid !== undefined &&
|
|
450
|
+
(expectedSessionRid !== undefined &&
|
|
451
|
+
!routingIdsEqual(binding.sessionRid, expectedSessionRid)) ||
|
|
459
452
|
(expectedSessionOwnerNodeRid !== undefined &&
|
|
460
453
|
binding.sessionOwnerNodeRid !== expectedSessionOwnerNodeRid)
|
|
461
454
|
) {
|
|
@@ -621,6 +614,8 @@ function createSpotState(
|
|
|
621
614
|
}
|
|
622
615
|
}
|
|
623
616
|
|
|
617
|
+
export const RELOCATION_REPLY_RETENTION_MS = 24 * 60 * 60 * 1_000;
|
|
618
|
+
|
|
624
619
|
export class ServiceTerminalOperationRegistry<T, Context = unknown> {
|
|
625
620
|
private readonly operations: OperationRegistry<T, Context>;
|
|
626
621
|
|
|
@@ -636,8 +631,8 @@ export class ServiceTerminalOperationRegistry<T, Context = unknown> {
|
|
|
636
631
|
return this.operations.register(timeoutMs, timeoutOwner, context);
|
|
637
632
|
}
|
|
638
633
|
|
|
639
|
-
reply(id: bigint, value: T): boolean {
|
|
640
|
-
return this.operations.complete(id, value);
|
|
634
|
+
reply(id: bigint, value: T, terminalContextRetentionMs = 0): boolean {
|
|
635
|
+
return this.operations.complete(id, value, terminalContextRetentionMs);
|
|
641
636
|
}
|
|
642
637
|
|
|
643
638
|
fail(id: bigint, error: unknown): boolean {
|
|
@@ -660,6 +655,10 @@ export class ServiceTerminalOperationRegistry<T, Context = unknown> {
|
|
|
660
655
|
return this.operations.size;
|
|
661
656
|
}
|
|
662
657
|
|
|
658
|
+
nextDeadlineMs(): number {
|
|
659
|
+
return this.operations.nextDeadlineMs();
|
|
660
|
+
}
|
|
661
|
+
|
|
663
662
|
expire(nowMs: number, turnDeadlineMs: number): number {
|
|
664
663
|
return this.operations.expire(nowMs, turnDeadlineMs);
|
|
665
664
|
}
|
|
@@ -667,6 +666,10 @@ export class ServiceTerminalOperationRegistry<T, Context = unknown> {
|
|
|
667
666
|
close(): void {
|
|
668
667
|
this.operations.close('Stateful runtime closed.');
|
|
669
668
|
}
|
|
669
|
+
|
|
670
|
+
failAll(reason: unknown): void {
|
|
671
|
+
this.operations.failAll(reason);
|
|
672
|
+
}
|
|
670
673
|
}
|
|
671
674
|
|
|
672
675
|
function actorKey(actor: ServiceActorRef): string {
|