@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
|
@@ -22,14 +22,25 @@ export declare class ServiceLivenessConnection {
|
|
|
22
22
|
tryGetProbe(nowMs: number, allocateProbeId: () => bigint): bigint | undefined;
|
|
23
23
|
acknowledge(probeId: bigint, nowMs: number): boolean;
|
|
24
24
|
}
|
|
25
|
-
/** Uses monotonic milliseconds and never treats application traffic as a probe ACK. */
|
|
26
25
|
export declare class ServiceLivenessRegistry {
|
|
27
26
|
private readonly probeIntervalMs;
|
|
28
27
|
private readonly peerTimeoutMs;
|
|
29
28
|
private readonly peers;
|
|
30
29
|
private nextProbeId;
|
|
30
|
+
/**
|
|
31
|
+
* The earliest probe or timeout among admitted peers. Received traffic only
|
|
32
|
+
* extends a peer's deadline, so this stays a lower bound between ticks.
|
|
33
|
+
*/
|
|
34
|
+
private nextDueMs;
|
|
35
|
+
private admissionActivityMs?;
|
|
31
36
|
constructor(probeIntervalMs?: number, peerTimeoutMs?: number);
|
|
32
37
|
admit(nodeRoutingId: string, connectionId: string | bigint, nowMs: number): ServiceLivenessConnection;
|
|
38
|
+
/** When the next tick has probe or timeout work (spec 08 §4.2 management deadline). */
|
|
39
|
+
nextDeadlineMs(): number;
|
|
40
|
+
/** Pending admission shares the existing liveness management cadence (MeshNode §7.1). */
|
|
41
|
+
setAdmissionPending(pending: boolean, nowMs: number): void;
|
|
42
|
+
private nextAdmissionDeadlineMs;
|
|
43
|
+
tickAdmission(nowMs: number): boolean;
|
|
33
44
|
recordReceived(connection: ServiceLivenessConnection, nowMs: number): void;
|
|
34
45
|
disconnect(nodeRoutingId: string, connectionId: string | bigint): boolean;
|
|
35
46
|
acknowledge(nodeRoutingId: string, connectionId: string | bigint, probeId: bigint, nowMs: number): boolean;
|
|
@@ -43,11 +43,21 @@ class ServiceLivenessConnection {
|
|
|
43
43
|
}
|
|
44
44
|
exports.ServiceLivenessConnection = ServiceLivenessConnection;
|
|
45
45
|
/** Uses monotonic milliseconds and never treats application traffic as a probe ACK. */
|
|
46
|
+
const NO_LIVENESS_WORK = Object.freeze({
|
|
47
|
+
probes: Object.freeze([]),
|
|
48
|
+
timedOutNodes: Object.freeze([])
|
|
49
|
+
});
|
|
46
50
|
class ServiceLivenessRegistry {
|
|
47
51
|
probeIntervalMs;
|
|
48
52
|
peerTimeoutMs;
|
|
49
53
|
peers = new Map();
|
|
50
54
|
nextProbeId = 1n;
|
|
55
|
+
/**
|
|
56
|
+
* The earliest probe or timeout among admitted peers. Received traffic only
|
|
57
|
+
* extends a peer's deadline, so this stays a lower bound between ticks.
|
|
58
|
+
*/
|
|
59
|
+
nextDueMs = Number.POSITIVE_INFINITY;
|
|
60
|
+
admissionActivityMs;
|
|
51
61
|
constructor(probeIntervalMs = exports.DEFAULT_SERVICE_PROBE_INTERVAL_MS, peerTimeoutMs = exports.DEFAULT_SERVICE_PEER_TIMEOUT_MS) {
|
|
52
62
|
this.probeIntervalMs = probeIntervalMs;
|
|
53
63
|
this.peerTimeoutMs = peerTimeoutMs;
|
|
@@ -69,8 +79,31 @@ class ServiceLivenessRegistry {
|
|
|
69
79
|
return current;
|
|
70
80
|
const admitted = new ServiceLivenessConnection(connectionId, nowMs, this.probeIntervalMs, this.peerTimeoutMs);
|
|
71
81
|
this.peers.set(nodeRoutingId, admitted);
|
|
82
|
+
this.nextDueMs = Math.min(this.nextDueMs, admitted.nextProbeMs, admitted.deadlineMs);
|
|
72
83
|
return admitted;
|
|
73
84
|
}
|
|
85
|
+
/** When the next tick has probe or timeout work (spec 08 §4.2 management deadline). */
|
|
86
|
+
nextDeadlineMs() {
|
|
87
|
+
return Math.min(this.nextDueMs, this.nextAdmissionDeadlineMs());
|
|
88
|
+
}
|
|
89
|
+
/** Pending admission shares the existing liveness management cadence (MeshNode §7.1). */
|
|
90
|
+
setAdmissionPending(pending, nowMs) {
|
|
91
|
+
if (pending)
|
|
92
|
+
this.admissionActivityMs ??= nowMs;
|
|
93
|
+
else
|
|
94
|
+
this.admissionActivityMs = undefined;
|
|
95
|
+
}
|
|
96
|
+
nextAdmissionDeadlineMs() {
|
|
97
|
+
return this.admissionActivityMs === undefined
|
|
98
|
+
? Number.POSITIVE_INFINITY
|
|
99
|
+
: this.admissionActivityMs + this.probeIntervalMs;
|
|
100
|
+
}
|
|
101
|
+
tickAdmission(nowMs) {
|
|
102
|
+
if (nowMs < this.nextAdmissionDeadlineMs())
|
|
103
|
+
return false;
|
|
104
|
+
this.admissionActivityMs = nowMs;
|
|
105
|
+
return true;
|
|
106
|
+
}
|
|
74
107
|
recordReceived(connection, nowMs) {
|
|
75
108
|
connection.recordReceived(nowMs);
|
|
76
109
|
}
|
|
@@ -95,8 +128,11 @@ class ServiceLivenessRegistry {
|
|
|
95
128
|
return { nodeRoutingId, connectionId, probeId };
|
|
96
129
|
}
|
|
97
130
|
tick(nowMs) {
|
|
131
|
+
if (nowMs < this.nextDeadlineMs())
|
|
132
|
+
return NO_LIVENESS_WORK;
|
|
98
133
|
const probes = [];
|
|
99
134
|
const timedOutNodes = [];
|
|
135
|
+
let nextDueMs = Number.POSITIVE_INFINITY;
|
|
100
136
|
for (const [nodeRoutingId, peer] of this.peers) {
|
|
101
137
|
if (peer.isExpired(nowMs)) {
|
|
102
138
|
timedOutNodes.push(nodeRoutingId);
|
|
@@ -106,7 +142,9 @@ class ServiceLivenessRegistry {
|
|
|
106
142
|
const probeId = peer.tryGetProbe(nowMs, this.allocateProbeId);
|
|
107
143
|
if (probeId !== undefined)
|
|
108
144
|
probes.push({ nodeRoutingId, connectionId: peer.connectionId, probeId });
|
|
145
|
+
nextDueMs = Math.min(nextDueMs, peer.nextProbeMs, peer.deadlineMs);
|
|
109
146
|
}
|
|
147
|
+
this.nextDueMs = nextDueMs;
|
|
110
148
|
timedOutNodes.sort();
|
|
111
149
|
return { probes, timedOutNodes };
|
|
112
150
|
}
|
|
@@ -1,11 +1,18 @@
|
|
|
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
|
export type ServiceMailboxDomain = 'application' | 'infrastructure';
|
|
5
|
+
export interface ServiceMailboxDispatchOwner {
|
|
6
|
+
prepareDispatch(record: ServiceMailboxRecord, signal: AbortSignal): boolean | Promise<boolean>;
|
|
7
|
+
}
|
|
4
8
|
export interface ServiceMailboxRecord {
|
|
9
|
+
readonly sourcePreparationOwner?: ServiceMailboxDispatchOwner;
|
|
10
|
+
readonly ingress?: RawServiceIngressRecord;
|
|
5
11
|
readonly owner: string;
|
|
6
12
|
readonly domain: ServiceMailboxDomain;
|
|
7
13
|
parts: readonly Uint8Array[];
|
|
8
14
|
readonly sourceRoutingId?: string;
|
|
15
|
+
readonly requestSource?: import('../locations/request-source-resolver').ZLinkRequestSourceFence;
|
|
9
16
|
readonly sourceRoute?: Uint8Array;
|
|
10
17
|
readonly requestSequence?: bigint;
|
|
11
18
|
readonly reply?: (parts: readonly Uint8Array[]) => void;
|
|
@@ -1,9 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.ServiceMaintenanceRuntime = void 0;
|
|
4
|
-
const node_async_hooks_1 = require("node:async_hooks");
|
|
5
4
|
const state_lane_1 = require("../execution/state-lane");
|
|
6
|
-
const detachedStateLaneResource = new node_async_hooks_1.AsyncResource('zlink:service-maintenance-runtime');
|
|
7
5
|
/** Owns first-intent-wins maintenance admission and terminal observation. */
|
|
8
6
|
class ServiceMaintenanceRuntime {
|
|
9
7
|
options;
|
|
@@ -156,7 +154,7 @@ class ServiceMaintenanceRuntime {
|
|
|
156
154
|
continue;
|
|
157
155
|
admitted = true;
|
|
158
156
|
let running;
|
|
159
|
-
running = startOutsideStateLane(() => unit
|
|
157
|
+
running = (0, state_lane_1.startOutsideStateLane)(() => unit
|
|
160
158
|
.relocate(signal)
|
|
161
159
|
.catch((error) => {
|
|
162
160
|
failures.push(error);
|
|
@@ -206,6 +204,3 @@ class ServiceMaintenanceRuntime {
|
|
|
206
204
|
}
|
|
207
205
|
}
|
|
208
206
|
exports.ServiceMaintenanceRuntime = ServiceMaintenanceRuntime;
|
|
209
|
-
function startOutsideStateLane(work) {
|
|
210
|
-
return detachedStateLaneResource.runInAsyncScope(work);
|
|
211
|
-
}
|
|
@@ -3,6 +3,7 @@ import type { ServiceRelocationRestoreOwner, ServiceRelocationStaging } from './
|
|
|
3
3
|
import type { ServiceRelocationEnvelope, ServiceRelocationMembership, ServiceRelocationParticipant, ServiceRelocationQueuedMessage, ServiceRelocationTimer } from './service-relocation-runtime';
|
|
4
4
|
export interface ServiceRelocationSealedWork {
|
|
5
5
|
readonly boundSessionState: Uint8Array;
|
|
6
|
+
readonly sessionBinding?: ServiceRelocationParticipant['sessionBinding'];
|
|
6
7
|
readonly queuedMessages: readonly ServiceRelocationQueuedMessage[];
|
|
7
8
|
readonly timers: readonly ServiceRelocationTimer[];
|
|
8
9
|
}
|
|
@@ -14,7 +15,7 @@ export interface ServiceRelocationCaptureUnit {
|
|
|
14
15
|
readonly authorityOwnerGeneration: bigint;
|
|
15
16
|
seal(signal?: AbortSignal): Promise<ServiceRelocationSealedWork>;
|
|
16
17
|
captureApplicationState(signal?: AbortSignal): Promise<Uint8Array>;
|
|
17
|
-
commitSeal(): Promise<void> | void;
|
|
18
|
+
commitSeal(followAuthorities: ReadonlyMap<string, ZLinkAuthoritySnapshot>): Promise<void> | void;
|
|
18
19
|
abortSeal(): Promise<void> | void;
|
|
19
20
|
/** Expired-owner terminal: pending requests fail once and dispatch stays closed. */
|
|
20
21
|
discardSeal?(reason: unknown): Promise<void> | void;
|
|
@@ -24,7 +25,7 @@ export declare class ServiceCapturedObjectRelocation {
|
|
|
24
25
|
private readonly units;
|
|
25
26
|
private terminal;
|
|
26
27
|
constructor(envelope: ServiceRelocationEnvelope, units: readonly ServiceRelocationCaptureUnit[]);
|
|
27
|
-
commitSource(): Promise<void>;
|
|
28
|
+
commitSource(followAuthorities: ReadonlyMap<string, ZLinkAuthoritySnapshot>): Promise<void>;
|
|
28
29
|
abortSource(): Promise<void>;
|
|
29
30
|
/**
|
|
30
31
|
* The source owner lease ended before the authority settled (spec 28 §4.4):
|
|
@@ -52,7 +53,6 @@ export interface ServiceRelocationTargetObjectPort<THidden extends ServiceReloca
|
|
|
52
53
|
publish(hidden: THidden, authority: ZLinkAuthoritySnapshot, signal?: AbortSignal): Promise<void>;
|
|
53
54
|
restoreBoundSession(hidden: THidden, payload: Uint8Array, signal?: AbortSignal): Promise<void>;
|
|
54
55
|
replayQueuedMessage(hidden: THidden, message: ServiceRelocationQueuedMessage, signal?: AbortSignal): Promise<void>;
|
|
55
|
-
restoreTimer(hidden: THidden, timer: ServiceRelocationTimer, signal?: AbortSignal): Promise<void>;
|
|
56
56
|
normalize(hidden: THidden, authority: ZLinkAuthoritySnapshot, signal?: AbortSignal): Promise<void>;
|
|
57
57
|
openAdmission(hidden: THidden, signal?: AbortSignal): Promise<void>;
|
|
58
58
|
abort(hidden: THidden): Promise<void> | void;
|
|
@@ -10,14 +10,14 @@ class ServiceCapturedObjectRelocation {
|
|
|
10
10
|
this.envelope = envelope;
|
|
11
11
|
this.units = units;
|
|
12
12
|
}
|
|
13
|
-
async commitSource() {
|
|
13
|
+
async commitSource(followAuthorities) {
|
|
14
14
|
if (this.terminal === 'committed')
|
|
15
15
|
return;
|
|
16
16
|
if (this.terminal !== 'open') {
|
|
17
17
|
throw new Error(`Relocation source capture was already ${this.terminal}.`);
|
|
18
18
|
}
|
|
19
19
|
for (const unit of this.units)
|
|
20
|
-
await unit.commitSeal();
|
|
20
|
+
await unit.commitSeal(followAuthorities);
|
|
21
21
|
this.terminal = 'committed';
|
|
22
22
|
}
|
|
23
23
|
async abortSource() {
|
|
@@ -26,18 +26,11 @@ class ServiceCapturedObjectRelocation {
|
|
|
26
26
|
if (this.terminal !== 'open') {
|
|
27
27
|
throw new Error(`A ${this.terminal} relocation source capture cannot be aborted.`);
|
|
28
28
|
}
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
try {
|
|
32
|
-
await unit.abortSeal();
|
|
33
|
-
}
|
|
34
|
-
catch (error) {
|
|
35
|
-
failures.push(error);
|
|
36
|
-
}
|
|
29
|
+
try {
|
|
30
|
+
await abortSourceSeals(this.units);
|
|
37
31
|
}
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
throw new AggregateError(failures, 'Relocation source rollback was incomplete.');
|
|
32
|
+
finally {
|
|
33
|
+
this.terminal = 'aborted';
|
|
41
34
|
}
|
|
42
35
|
}
|
|
43
36
|
/**
|
|
@@ -91,23 +84,29 @@ class ServiceRelocationObjectCaptureOwner {
|
|
|
91
84
|
try {
|
|
92
85
|
for (const unit of units) {
|
|
93
86
|
signal?.throwIfAborted();
|
|
94
|
-
const
|
|
95
|
-
captured.push(
|
|
87
|
+
const capture = { unit };
|
|
88
|
+
captured.push(capture);
|
|
89
|
+
capture.work = await unit.seal(signal);
|
|
96
90
|
}
|
|
97
|
-
const participants = await mapConcurrentOrdered(captured, this.maxConcurrentCallbacks, async ({ unit, work }) =>
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
91
|
+
const participants = await mapConcurrentOrdered(captured, this.maxConcurrentCallbacks, async ({ unit, work: sealedWork }) => {
|
|
92
|
+
// Application capture starts only after every seal completed.
|
|
93
|
+
const work = sealedWork;
|
|
94
|
+
return {
|
|
95
|
+
key: unit.authorityKey,
|
|
96
|
+
objectKind: unit.objectKind,
|
|
97
|
+
stableType: unit.stableType,
|
|
98
|
+
objectGeneration: unit.objectGeneration,
|
|
99
|
+
authorityOwnerGeneration: unit.authorityOwnerGeneration,
|
|
100
|
+
applicationState: Buffer.from(await unit.captureApplicationState(signal)),
|
|
101
|
+
boundSessionState: Buffer.from(work.boundSessionState),
|
|
102
|
+
...(work.sessionBinding === undefined ? {} : { sessionBinding: work.sessionBinding }),
|
|
103
|
+
queuedMessages: work.queuedMessages.map((message) => ({
|
|
104
|
+
sequence: message.sequence,
|
|
105
|
+
payload: Buffer.from(message.payload)
|
|
106
|
+
})),
|
|
107
|
+
timers: work.timers.map((timer) => ({ ...timer }))
|
|
108
|
+
};
|
|
109
|
+
}, signal);
|
|
111
110
|
return new ServiceCapturedObjectRelocation({
|
|
112
111
|
aggregateId,
|
|
113
112
|
aggregateGeneration,
|
|
@@ -116,13 +115,31 @@ class ServiceRelocationObjectCaptureOwner {
|
|
|
116
115
|
}, units);
|
|
117
116
|
}
|
|
118
117
|
catch (error) {
|
|
119
|
-
|
|
120
|
-
await
|
|
118
|
+
try {
|
|
119
|
+
await abortSourceSeals(captured.map(({ unit }) => unit));
|
|
120
|
+
}
|
|
121
|
+
catch (rollbackError) {
|
|
122
|
+
throw new AggregateError([error, rollbackError], 'Relocation capture failed and source rollback was incomplete.');
|
|
123
|
+
}
|
|
121
124
|
throw error;
|
|
122
125
|
}
|
|
123
126
|
}
|
|
124
127
|
}
|
|
125
128
|
exports.ServiceRelocationObjectCaptureOwner = ServiceRelocationObjectCaptureOwner;
|
|
129
|
+
async function abortSourceSeals(units) {
|
|
130
|
+
const failures = [];
|
|
131
|
+
for (const unit of [...units].reverse()) {
|
|
132
|
+
try {
|
|
133
|
+
await unit.abortSeal();
|
|
134
|
+
}
|
|
135
|
+
catch (error) {
|
|
136
|
+
failures.push(error);
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
if (failures.length !== 0) {
|
|
140
|
+
throw new AggregateError(failures, 'Relocation source rollback was incomplete.');
|
|
141
|
+
}
|
|
142
|
+
}
|
|
126
143
|
/** Restores an exact User Spot aggregate or standalone Actor into hidden objects. */
|
|
127
144
|
class ServiceRelocationObjectRestoreOwner {
|
|
128
145
|
target;
|
|
@@ -182,9 +199,6 @@ class ServiceRelocationObjectRestoreOwner {
|
|
|
182
199
|
for (const message of participant.queuedMessages) {
|
|
183
200
|
await this.target.replayQueuedMessage(hidden, message, signal);
|
|
184
201
|
}
|
|
185
|
-
for (const timer of participant.timers) {
|
|
186
|
-
await this.target.restoreTimer(hidden, timer, signal);
|
|
187
|
-
}
|
|
188
202
|
}
|
|
189
203
|
}
|
|
190
204
|
/** Appends one post-capture relay to the already restored temporary queue. */
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { ZLinkPlacementObjectKind } from '../locations/internal-location-contracts';
|
|
2
|
+
import { type RelocationEnvelopeV1 as GeneratedRelocationEnvelopeV1 } from '../protocol/service_wire_pilot_codec.generated';
|
|
2
3
|
export interface ServiceRelocationParticipant {
|
|
3
4
|
/** Wire-local participant ordinal; identity is projected from Location Store. */
|
|
4
5
|
readonly participantId?: bigint;
|
|
@@ -17,6 +18,7 @@ export interface ServiceRelocationParticipant {
|
|
|
17
18
|
readonly applicationStatePresent?: boolean;
|
|
18
19
|
readonly applicationState: Uint8Array;
|
|
19
20
|
readonly boundSessionState: Uint8Array;
|
|
21
|
+
readonly sessionBinding?: GeneratedRelocationEnvelopeV1['sessionBindings'][number];
|
|
20
22
|
readonly queuedMessages: readonly ServiceRelocationQueuedMessage[];
|
|
21
23
|
readonly timers: readonly ServiceRelocationTimer[];
|
|
22
24
|
}
|
|
@@ -480,6 +480,9 @@ function encodeServiceRelocationEnvelope(envelope, applicationVersion) {
|
|
|
480
480
|
lastCompletedScheduledIndex: nonNegativeBigInt(timer.lastScheduledIndex, 'timer scheduled index'),
|
|
481
481
|
nextScheduledAtUnixMilliseconds: nonNegativeUnixMilliseconds(timer.dueAtUnixMs, 'timer due time')
|
|
482
482
|
})),
|
|
483
|
+
sessionBindings: participants.flatMap((participant, index) => participant.sessionBinding === undefined
|
|
484
|
+
? []
|
|
485
|
+
: [{ ...participant.sessionBinding, participantId: BigInt(index + 1) }]),
|
|
483
486
|
pendingTimerTicks: pending.map((value) => ({
|
|
484
487
|
participantId: value.participantId,
|
|
485
488
|
order: value.order,
|
|
@@ -510,11 +513,20 @@ function decodeServiceRelocationEnvelope(payload, aggregateGeneration) {
|
|
|
510
513
|
if (aggregateId === undefined)
|
|
511
514
|
throw new TypeError('Invalid relocation identity.');
|
|
512
515
|
positiveBigInt(aggregateGeneration, 'aggregate generation');
|
|
516
|
+
const bindings = new Map(generated.sessionBindings.map((binding) => [binding.participantId, binding]));
|
|
517
|
+
for (const id of bindings.keys()) {
|
|
518
|
+
if (id > BigInt(generated.applicationStates.length))
|
|
519
|
+
throw new TypeError('Session binding participant is outside its inventory.');
|
|
520
|
+
}
|
|
513
521
|
const participants = generated.applicationStates.map((state, index) => {
|
|
514
522
|
if (state.participantId !== BigInt(index + 1)) {
|
|
515
523
|
throw new TypeError('Application state participant order is invalid.');
|
|
516
524
|
}
|
|
517
|
-
|
|
525
|
+
const binding = bindings.get(state.participantId);
|
|
526
|
+
return {
|
|
527
|
+
...wireParticipant(state.participantId, state.hasState, Buffer.from(state.payload)),
|
|
528
|
+
...(binding === undefined ? {} : { sessionBinding: binding })
|
|
529
|
+
};
|
|
518
530
|
});
|
|
519
531
|
const byId = new Map(participants.map((value) => [value.participantId, value]));
|
|
520
532
|
for (const work of generated.savedWork) {
|
|
@@ -524,12 +536,16 @@ function decodeServiceRelocationEnvelope(payload, aggregateGeneration) {
|
|
|
524
536
|
});
|
|
525
537
|
}
|
|
526
538
|
for (const timer of generated.timerRegistrations) {
|
|
539
|
+
const dueAtUnixMs = unixMilliseconds(timer.nextScheduledAtUnixMilliseconds);
|
|
540
|
+
const intervalMs = unixMilliseconds(timer.periodMilliseconds);
|
|
527
541
|
byId.get(timer.participantId).timers.push({
|
|
528
542
|
timerId: timer.name,
|
|
529
543
|
handlerType: timer.handlerType,
|
|
530
|
-
|
|
531
|
-
|
|
532
|
-
|
|
544
|
+
// The wire anchors the nominal schedule by its next due time: the next
|
|
545
|
+
// nominal tick after the completed ScheduledIndex (Spot timer §1).
|
|
546
|
+
startedAtUnixMs: dueAtUnixMs - Number(timer.lastCompletedScheduledIndex + 1n) * intervalMs,
|
|
547
|
+
dueAtUnixMs,
|
|
548
|
+
intervalMs,
|
|
533
549
|
overrunPolicy: timerPolicyName(timer.overrunPolicy),
|
|
534
550
|
maxCatchUpTicks: unixMilliseconds(timer.maxCatchUpTicks),
|
|
535
551
|
stopOnUnhandledException: timer.stopOnUnhandledException,
|
|
@@ -205,11 +205,18 @@ export interface ReceiveRequirements {
|
|
|
205
205
|
readonly byteCount: number;
|
|
206
206
|
}
|
|
207
207
|
export interface ZLinkMessageFollowOrigin {
|
|
208
|
+
readonly requestSource?: import('../locations/request-source-resolver').ZLinkRequestSourceFence;
|
|
208
209
|
readonly sourceNodeRid: RoutingId;
|
|
209
210
|
readonly originalOperation: MeshOperationId;
|
|
210
211
|
readonly originalReplyRouteId: bigint;
|
|
212
|
+
/** The canonical target accepted with the original native Actor frame. */
|
|
213
|
+
readonly target?: import('./service-stateful-wire-codec').ServiceActorRouteFence;
|
|
211
214
|
}
|
|
212
215
|
export interface ReceiveRecord {
|
|
216
|
+
/** Resolve record prerequisites in owner order, outside an application handler turn. */
|
|
217
|
+
readonly prepareDispatch?: (this: ReceiveRecord, signal: AbortSignal) => boolean | Promise<boolean>;
|
|
218
|
+
readonly statefulMailboxRecord?: import('./service-mailbox').ServiceMailboxRecord;
|
|
219
|
+
readonly requestSource?: import('../locations/request-source-resolver').ZLinkRequestSourceFence;
|
|
213
220
|
readonly kind: number;
|
|
214
221
|
readonly domain: number;
|
|
215
222
|
readonly sourceNodeRid: RoutingId | null;
|
|
@@ -314,7 +321,7 @@ export interface StreamSessionService {
|
|
|
314
321
|
close(): void;
|
|
315
322
|
status(): StreamSessionStatus;
|
|
316
323
|
lookupActor(targetNodeRid: RoutingId, actorId: string, timeoutMs?: number): MeshOperationId;
|
|
317
|
-
bindActor(sessionRid: RoutingId, actor: ServiceActorRef, timeoutMs?: number, onBindingReplaced?: (actorId: string, retiredSession: ServiceRetiredBoundSessionRouteFence, actor: ServiceActorRef) => void, actorAuthority?: StreamSessionActorAuthorityFence): MeshOperationId;
|
|
324
|
+
bindActor(sessionRid: RoutingId, actor: ServiceActorRef, timeoutMs?: number, onBindingReplaced?: (actorId: string, retiredSession: ServiceRetiredBoundSessionRouteFence, actor: ServiceActorRef) => void, actorAuthority?: StreamSessionActorAuthorityFence, close?: () => Promise<void>): MeshOperationId;
|
|
318
325
|
unbindActor(sessionRid: RoutingId, actor: ServiceActorRef, expectedBindingGeneration: bigint, timeoutMs?: number): MeshOperationId;
|
|
319
326
|
bindings(sessionRid: RoutingId): ReadonlyArray<ServiceStreamSessionBinding>;
|
|
320
327
|
sendToActor(sessionRid: RoutingId, actor: ServiceActorRef, parts: MessageLike | readonly MessageLike[], options?: {
|
|
@@ -343,6 +350,7 @@ export interface ServiceSpot {
|
|
|
343
350
|
flags?: number;
|
|
344
351
|
timeoutMs?: number;
|
|
345
352
|
applicationMetadata?: Buffer;
|
|
353
|
+
onAdmitted?: () => void;
|
|
346
354
|
}): MeshOperationId;
|
|
347
355
|
sendToSpot(targetNodeRid: unknown, targetSpotId: unknown, targetSpotGeneration: bigint, parts: MessageLike | readonly MessageLike[], options?: {
|
|
348
356
|
flags?: number;
|
|
@@ -354,6 +362,7 @@ export interface ServiceSpot {
|
|
|
354
362
|
timeoutMs?: number;
|
|
355
363
|
applicationMetadata?: Buffer;
|
|
356
364
|
routeFence?: ServiceDirectSpotRouteFence;
|
|
365
|
+
onAdmitted?: () => void;
|
|
357
366
|
entrySpot?: boolean;
|
|
358
367
|
}): MeshOperationId;
|
|
359
368
|
publish(channelName: string, topic: string, parts: MessageLike | readonly MessageLike[], options?: {
|
|
@@ -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
|
export declare function registerServiceSessionBindingIngressPort(service: object, port: ServiceSessionBindingIngressPort): void;
|
|
5
6
|
export declare function serviceSessionBindingIngressPortIfRegistered(service: object): ServiceSessionBindingIngressPort | undefined;
|
|
@@ -95,7 +95,6 @@ export declare class ServiceStatefulRegistry {
|
|
|
95
95
|
private readonly reservationAttempts;
|
|
96
96
|
private readonly turns;
|
|
97
97
|
private nextReservationId;
|
|
98
|
-
private nextBindingGeneration;
|
|
99
98
|
constructor(nodeRid: string, nodeGeneration: bigint);
|
|
100
99
|
createEntrySpot(spotId?: string): ServiceSpotState;
|
|
101
100
|
private createEntrySpotCore;
|
|
@@ -117,8 +116,7 @@ export declare class ServiceStatefulRegistry {
|
|
|
117
116
|
private joinActorCore;
|
|
118
117
|
leaveActor(actor: ServiceActorRef, expectedMembershipEpoch: bigint): ServiceMembershipTransition;
|
|
119
118
|
destroyActor(actor: ServiceActorRef): ServiceActorState;
|
|
120
|
-
|
|
121
|
-
installSessionBinding(binding: ServiceSessionBinding): void;
|
|
119
|
+
installSessionBinding(binding: ServiceSessionBinding): ServiceSessionBinding;
|
|
122
120
|
binding(actor: ServiceActorRef): ServiceSessionBinding | undefined;
|
|
123
121
|
private bindingCore;
|
|
124
122
|
unbindSession(actor: ServiceActorRef, expectedBindingGeneration: bigint, expectedSessionRid?: string, expectedSessionOwnerNodeRid?: string): boolean;
|
|
@@ -129,17 +127,20 @@ export declare class ServiceStatefulRegistry {
|
|
|
129
127
|
runTurn<T>(owner: string, work: () => T | Promise<T>): Promise<T>;
|
|
130
128
|
private updateBindingMembership;
|
|
131
129
|
}
|
|
130
|
+
export declare const RELOCATION_REPLY_RETENTION_MS: number;
|
|
132
131
|
export declare class ServiceTerminalOperationRegistry<T, Context = unknown> {
|
|
133
132
|
private readonly operations;
|
|
134
133
|
constructor(operations?: OperationRegistry<T, Context>);
|
|
135
134
|
register(timeoutMs: number, timeoutOwner?: 'registry' | 'sender', context?: Context): PendingOperation<T>;
|
|
136
|
-
reply(id: bigint, value: T): boolean;
|
|
135
|
+
reply(id: bigint, value: T, terminalContextRetentionMs?: number): boolean;
|
|
137
136
|
fail(id: bigint, error: unknown): boolean;
|
|
138
137
|
cancel(id: bigint): boolean;
|
|
139
138
|
isPending(id: bigint): boolean;
|
|
140
139
|
context(id: bigint): Context | undefined;
|
|
141
140
|
get size(): number;
|
|
141
|
+
nextDeadlineMs(): number;
|
|
142
142
|
expire(nowMs: number, turnDeadlineMs: number): number;
|
|
143
143
|
close(): void;
|
|
144
|
+
failAll(reason: unknown): void;
|
|
144
145
|
}
|
|
145
146
|
export {};
|
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.ServiceTerminalOperationRegistry = exports.ServiceStatefulRegistry = exports.ServiceStaleGenerationError = void 0;
|
|
3
|
+
exports.ServiceTerminalOperationRegistry = exports.RELOCATION_REPLY_RETENTION_MS = exports.ServiceStatefulRegistry = exports.ServiceStaleGenerationError = void 0;
|
|
4
4
|
const CoreTypes_1 = require("../../contracts/Common/CoreTypes");
|
|
5
|
+
const routing_id_1 = require("../routing-id");
|
|
6
|
+
const service_wire_binary_primitives_1 = require("./service-wire-binary-primitives");
|
|
5
7
|
const operation_registry_1 = require("./operation-registry");
|
|
6
8
|
class ServiceStaleGenerationError extends Error {
|
|
7
9
|
objectKind;
|
|
@@ -33,7 +35,6 @@ class ServiceStatefulRegistry {
|
|
|
33
35
|
reservationAttempts = new Map();
|
|
34
36
|
turns = new Map();
|
|
35
37
|
nextReservationId = 1n;
|
|
36
|
-
nextBindingGeneration = 1n;
|
|
37
38
|
constructor(nodeRid, nodeGeneration) {
|
|
38
39
|
this.nodeRid = nodeRid;
|
|
39
40
|
this.nodeGeneration = nodeGeneration;
|
|
@@ -238,37 +239,26 @@ class ServiceStatefulRegistry {
|
|
|
238
239
|
this.bindings.delete(actorKey(actor));
|
|
239
240
|
return current;
|
|
240
241
|
}
|
|
241
|
-
bindSession(actor, sessionRid, sessionOwnerNodeRid, sessionOwnerNodeGeneration, sessionOwnerId, sessionOwnerLeaseGeneration) {
|
|
242
|
-
const current = this.requireActorCore(actor);
|
|
243
|
-
requireText(sessionRid, 'sessionRid');
|
|
244
|
-
requireText(sessionOwnerNodeRid, 'sessionOwnerNodeRid');
|
|
245
|
-
const binding = Object.freeze({
|
|
246
|
-
actor: Object.freeze({ ...current.ref }),
|
|
247
|
-
sessionRid,
|
|
248
|
-
sessionOwnerNodeRid,
|
|
249
|
-
...(sessionOwnerNodeGeneration === undefined ? {} : { sessionOwnerNodeGeneration }),
|
|
250
|
-
...(sessionOwnerId === undefined ? {} : { sessionOwnerId }),
|
|
251
|
-
...(sessionOwnerLeaseGeneration === undefined ? {} : { sessionOwnerLeaseGeneration }),
|
|
252
|
-
bindingGeneration: this.nextBindingGeneration++,
|
|
253
|
-
membershipEpoch: current.membershipEpoch
|
|
254
|
-
});
|
|
255
|
-
this.bindings.set(actorKey(actor), binding);
|
|
256
|
-
return binding;
|
|
257
|
-
}
|
|
258
242
|
installSessionBinding(binding) {
|
|
259
243
|
this.requireActorCore(binding.actor);
|
|
244
|
+
(0, service_wire_binary_primitives_1.encodeServiceWireRoutingId)(binding.sessionRid, 'sessionRid', CoreTypes_1.ZLINK_MAX_ROUTING_ID_BYTES, (message) => {
|
|
245
|
+
throw new RangeError(message);
|
|
246
|
+
});
|
|
247
|
+
requireText(binding.sessionOwnerNodeRid, 'sessionOwnerNodeRid');
|
|
260
248
|
requirePositive(binding.bindingGeneration, 'bindingGeneration');
|
|
261
249
|
const current = this.bindings.get(actorKey(binding.actor));
|
|
262
250
|
if (current !== undefined &&
|
|
263
251
|
current.sessionOwnerNodeRid === binding.sessionOwnerNodeRid &&
|
|
264
252
|
current.sessionOwnerNodeGeneration === binding.sessionOwnerNodeGeneration &&
|
|
265
|
-
current.sessionOwnerId === binding.sessionOwnerId &&
|
|
266
|
-
current.sessionOwnerLeaseGeneration === binding.sessionOwnerLeaseGeneration &&
|
|
267
253
|
current.bindingGeneration >= binding.bindingGeneration) {
|
|
254
|
+
if (current.bindingGeneration === binding.bindingGeneration &&
|
|
255
|
+
current.sessionRid === binding.sessionRid)
|
|
256
|
+
return current;
|
|
268
257
|
throw new ServiceStaleGenerationError('binding', binding.actor.actorId);
|
|
269
258
|
}
|
|
270
|
-
|
|
271
|
-
this.bindings.set(actorKey(binding.actor),
|
|
259
|
+
const accepted = Object.freeze({ ...binding });
|
|
260
|
+
this.bindings.set(actorKey(binding.actor), accepted);
|
|
261
|
+
return accepted;
|
|
272
262
|
}
|
|
273
263
|
binding(actor) {
|
|
274
264
|
return this.bindingCore(actor);
|
|
@@ -283,7 +273,8 @@ class ServiceStatefulRegistry {
|
|
|
283
273
|
if (binding === undefined)
|
|
284
274
|
return false;
|
|
285
275
|
if (binding.bindingGeneration !== expectedBindingGeneration ||
|
|
286
|
-
(expectedSessionRid !== undefined &&
|
|
276
|
+
(expectedSessionRid !== undefined &&
|
|
277
|
+
!(0, routing_id_1.routingIdsEqual)(binding.sessionRid, expectedSessionRid)) ||
|
|
287
278
|
(expectedSessionOwnerNodeRid !== undefined &&
|
|
288
279
|
binding.sessionOwnerNodeRid !== expectedSessionOwnerNodeRid)) {
|
|
289
280
|
throw new ServiceStaleGenerationError('binding', actor.actorId);
|
|
@@ -425,6 +416,7 @@ function createSpotState(ref, kind, stableType, authorityOwnerGeneration) {
|
|
|
425
416
|
return Object.freeze({ ...base, kind, stableType });
|
|
426
417
|
}
|
|
427
418
|
}
|
|
419
|
+
exports.RELOCATION_REPLY_RETENTION_MS = 24 * 60 * 60 * 1_000;
|
|
428
420
|
class ServiceTerminalOperationRegistry {
|
|
429
421
|
operations;
|
|
430
422
|
constructor(operations = new operation_registry_1.OperationRegistry()) {
|
|
@@ -433,8 +425,8 @@ class ServiceTerminalOperationRegistry {
|
|
|
433
425
|
register(timeoutMs, timeoutOwner = 'registry', context) {
|
|
434
426
|
return this.operations.register(timeoutMs, timeoutOwner, context);
|
|
435
427
|
}
|
|
436
|
-
reply(id, value) {
|
|
437
|
-
return this.operations.complete(id, value);
|
|
428
|
+
reply(id, value, terminalContextRetentionMs = 0) {
|
|
429
|
+
return this.operations.complete(id, value, terminalContextRetentionMs);
|
|
438
430
|
}
|
|
439
431
|
fail(id, error) {
|
|
440
432
|
return this.operations.fail(id, error);
|
|
@@ -451,12 +443,18 @@ class ServiceTerminalOperationRegistry {
|
|
|
451
443
|
get size() {
|
|
452
444
|
return this.operations.size;
|
|
453
445
|
}
|
|
446
|
+
nextDeadlineMs() {
|
|
447
|
+
return this.operations.nextDeadlineMs();
|
|
448
|
+
}
|
|
454
449
|
expire(nowMs, turnDeadlineMs) {
|
|
455
450
|
return this.operations.expire(nowMs, turnDeadlineMs);
|
|
456
451
|
}
|
|
457
452
|
close() {
|
|
458
453
|
this.operations.close('Stateful runtime closed.');
|
|
459
454
|
}
|
|
455
|
+
failAll(reason) {
|
|
456
|
+
this.operations.failAll(reason);
|
|
457
|
+
}
|
|
460
458
|
}
|
|
461
459
|
exports.ServiceTerminalOperationRegistry = ServiceTerminalOperationRegistry;
|
|
462
460
|
function actorKey(actor) {
|