@zlink-systems/framework 0.20.0 → 0.22.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/.tsbuildinfo +1 -1
- package/dist/contracts/Common/ZLinkMessage.js +5 -5
- package/dist/contracts/Configuration/CodecContentType.js +5 -7
- package/dist/contracts/Configuration/DiagnosticsValidation.js +1 -6
- package/dist/contracts/Configuration/EndpointNotation.js +4 -8
- package/dist/contracts/Configuration/Registration.js +14 -11
- package/dist/contracts/Configuration/RegistrationBuilders.js +32 -25
- package/dist/contracts/Configuration/RegistrationNormalizers.js +25 -26
- package/dist/contracts/Configuration/RegistrationValidators.js +36 -38
- package/dist/contracts/Configuration/SendTimeoutValidation.js +4 -4
- package/dist/contracts/Configuration/TimerRegistrationValidator.js +7 -7
- package/dist/contracts/Handlers/JsonContract.js +23 -11
- package/dist/contracts/Spots/SpotKind.js +16 -8
- package/dist/location-store-integration.js +16 -16
- package/dist/nest-integration.js +17 -11
- package/dist/runtime/abort.js +9 -5
- package/dist/runtime/actors/actor-authority-payload-codec.js +12 -16
- package/dist/runtime/actors/actor-authority-publication.js +18 -17
- package/dist/runtime/actors/actor-client.js +83 -63
- package/dist/runtime/actors/actor-context.js +24 -18
- package/dist/runtime/actors/actor-creation.js +4 -3
- package/dist/runtime/actors/actor-handoff.js +89 -92
- package/dist/runtime/actors/actor-local-native-join.js +18 -19
- package/dist/runtime/actors/actor-mailbox.js +1 -1
- package/dist/runtime/actors/actor-message-follow-context.js +24 -21
- package/dist/runtime/actors/actor-packet-relay-wire.js +1 -3
- package/dist/runtime/actors/actor-remote-joiner.js +20 -17
- package/dist/runtime/actors/actor-remote-wire.js +6 -7
- package/dist/runtime/actors/actor-runtime-state.js +87 -81
- package/dist/runtime/actors/actor-transfer-registry.js +3 -5
- package/dist/runtime/actors/bound-session-wire.js +14 -9
- package/dist/runtime/actors/deferred-join-accepted-journal.js +158 -124
- package/dist/runtime/actors/index.js +2 -5
- package/dist/runtime/actors/post-commit-actor-binder.js +3 -6
- package/dist/runtime/actors/post-commit-actor-location.js +1 -1
- package/dist/runtime/actors/spot-actor-dispatch.js +5 -5
- package/dist/runtime/actors/transferred-actor-rollback.js +4 -4
- package/dist/runtime/admission.js +2 -6
- package/dist/runtime/application-jobs/application-ingress-record-owner.js +2 -6
- package/dist/runtime/application-jobs/receive-flow-controller.js +11 -12
- package/dist/runtime/backend/mesh-completion-table.js +1 -3
- package/dist/runtime/backend/mesh-dispatch-pump.js +12 -16
- package/dist/runtime/backend/node/node-backend-adapter-factory.js +1 -3
- package/dist/runtime/backend/node/node-backend-adapter-support.js +26 -17
- package/dist/runtime/backend/node/node-mesh-backend-adapter.js +4 -3
- package/dist/runtime/backend/node/node-raw-binding-port.js +7 -6
- package/dist/runtime/backend/node/node-raw-mesh-backend.js +116 -113
- package/dist/runtime/backend/node/node-socket-backend-adapter.js +12 -13
- package/dist/runtime/backend/runtime-message.js +3 -3
- package/dist/runtime/backend/runtime-values.d.ts +2 -2
- package/dist/runtime/backend/runtime-values.js +4 -5
- package/dist/runtime/channels/channel-clients.js +27 -24
- package/dist/runtime/channels/channel-dispatch-pipeline.js +10 -18
- package/dist/runtime/channels/channel-dispatch-services.js +7 -4
- package/dist/runtime/channels/channel-dispatchers.js +9 -9
- package/dist/runtime/channels/channel-envelope-inspection.js +16 -13
- package/dist/runtime/channels/channel-envelope.js +83 -47
- package/dist/runtime/channels/channel-outbound-operations.js +8 -8
- package/dist/runtime/channels/channel-receive-loops.js +20 -22
- package/dist/runtime/channels/channel-receive-task-tracker.js +1 -1
- package/dist/runtime/channels/channel-runtime-lifecycle.js +61 -56
- package/dist/runtime/channels/channel-runtime-manager.js +18 -9
- package/dist/runtime/channels/channel-socket-registry.js +126 -123
- package/dist/runtime/channels/channel-transports.js +43 -33
- package/dist/runtime/channels/client-server-location-runtime.js +32 -40
- package/dist/runtime/channels/client-server-service-wire.js +29 -22
- package/dist/runtime/channels/dispatch-error-reporter.js +9 -7
- package/dist/runtime/channels/fanout-location-runtime.js +34 -47
- package/dist/runtime/channels/fanout-service-wire.js +3 -5
- package/dist/runtime/channels/local-spot-route-transport.js +7 -1
- package/dist/runtime/channels/route-member-snapshot.js +3 -3
- package/dist/runtime/channels/source-spot-router.js +6 -2
- package/dist/runtime/channels/spot-route-bridge-transport.js +5 -2
- package/dist/runtime/channels/spot-route-dispatch-strategy.js +2 -2
- package/dist/runtime/channels/spot-route-target-resolver.js +6 -6
- package/dist/runtime/diagnostics/index.js +38 -10
- package/dist/runtime/diagnostics/message-flow.js +47 -39
- package/dist/runtime/diagnostics/runtime-metrics.js +18 -9
- package/dist/runtime/diagnostics/runtime-observation-queue.js +8 -10
- package/dist/runtime/diagnostics/topology-runtime-projections.js +17 -10
- package/dist/runtime/execution/index.js +7 -6
- package/dist/runtime/execution/serial-execution-queue.js +12 -18
- package/dist/runtime/execution/state-lane.js +2 -2
- package/dist/runtime/foundation/actor-join-recovery-codec.js +31 -23
- package/dist/runtime/foundation/event-loop-resources.js +4 -4
- package/dist/runtime/foundation/message-follow-suppression-registry.js +4 -4
- package/dist/runtime/foundation/raw-service-mesh-runtime.js +136 -136
- package/dist/runtime/foundation/route-mesh-connection-policy.js +4 -4
- package/dist/runtime/foundation/runtime-state-projections.js +22 -11
- package/dist/runtime/foundation/service-authority-payload-codec.js +13 -15
- package/dist/runtime/foundation/service-discovery-registry.js +35 -33
- package/dist/runtime/foundation/service-instance-activation-recovery-codec.js +20 -22
- package/dist/runtime/foundation/service-liveness-registry.js +16 -12
- package/dist/runtime/foundation/service-maintenance-runtime.js +2 -4
- package/dist/runtime/foundation/service-relocation-aggregate-committer.js +24 -24
- package/dist/runtime/foundation/service-relocation-object-owner.js +6 -6
- package/dist/runtime/foundation/service-relocation-runtime.js +137 -94
- package/dist/runtime/foundation/service-runtime-contracts.js +5 -5
- package/dist/runtime/foundation/service-stateful-registry.js +24 -23
- package/dist/runtime/foundation/service-stateful-runtime.js +416 -438
- package/dist/runtime/foundation/service-stateful-wire-codec.js +95 -98
- package/dist/runtime/foundation/service-topology-registry.js +96 -95
- package/dist/runtime/foundation/service-weighted-selection.js +6 -11
- package/dist/runtime/foundation/service-wire-binary-primitives.js +5 -6
- package/dist/runtime/foundation/service-wire-m6a-codec.js +46 -35
- package/dist/runtime/framework-errors-internal.js +7 -10
- package/dist/runtime/handlers/handler-instance-scope.js +4 -5
- package/dist/runtime/handlers/index.js +3 -1
- package/dist/runtime/host/actor-packet-relay.js +74 -70
- package/dist/runtime/host/actor-placement-coordinator.js +29 -31
- package/dist/runtime/host/actor-runtime-options-factory.js +12 -14
- package/dist/runtime/host/actor-transfer-authority-runtime.js +7 -9
- package/dist/runtime/host/actor-transfer-runtime.js +176 -153
- package/dist/runtime/host/application-job-queue.js +18 -22
- package/dist/runtime/host/bound-session-relay.js +3 -1
- package/dist/runtime/host/channel-runtime-options-factory.js +31 -14
- package/dist/runtime/host/host-capacity-status.js +8 -4
- package/dist/runtime/host/index.js +244 -227
- package/dist/runtime/host/instance-activation-authority.js +93 -96
- package/dist/runtime/host/location-runtime-owner.js +16 -14
- package/dist/runtime/host/mesh-router-resolver.js +11 -13
- package/dist/runtime/host/relocation-direct-transfer.js +10 -9
- package/dist/runtime/host/remote-actor-join-receiver.js +20 -15
- package/dist/runtime/host/remote-actor-packet-target-store.js +18 -22
- package/dist/runtime/host/remote-bound-session-relay.js +97 -73
- package/dist/runtime/host/route-mesh-runtime.js +64 -69
- package/dist/runtime/host/runtime-shutdown.js +1 -2
- package/dist/runtime/host/service-relocation-host-runtime.js +586 -511
- package/dist/runtime/host/spot-address-transport.js +69 -71
- package/dist/runtime/host/spot-runtime-options-factory.js +30 -29
- package/dist/runtime/host/stateful-authority-route-runtime.js +65 -68
- package/dist/runtime/host/user-spot-creation-coordinator.js +61 -67
- package/dist/runtime/locations/actor-location-claims.js +26 -20
- package/dist/runtime/locations/aggregate-inventory-store.js +72 -75
- package/dist/runtime/locations/authority-key-codec.js +7 -7
- package/dist/runtime/locations/auto-connect-loop.js +3 -3
- package/dist/runtime/locations/auto-connect-planner.js +25 -19
- package/dist/runtime/locations/auto-connect-reconciler.js +51 -31
- package/dist/runtime/locations/in-memory-authority-store.js +128 -118
- package/dist/runtime/locations/in-memory-location-store.js +195 -168
- package/dist/runtime/locations/in-memory-provider-location-store.js +8 -10
- package/dist/runtime/locations/key-codec.js +1 -1
- package/dist/runtime/locations/lease-tracker.js +23 -21
- package/dist/runtime/locations/lifecycle.js +4 -5
- package/dist/runtime/locations/location-store-repository.js +368 -324
- package/dist/runtime/locations/opaque-record-key.js +2 -2
- package/dist/runtime/locations/resolvers.js +73 -82
- package/dist/runtime/locations/runtime.js +68 -63
- package/dist/runtime/locations/spot-location-claims.js +39 -35
- package/dist/runtime/messaging/framework-json-v1.js +7 -7
- package/dist/runtime/messaging/packet-name.js +7 -6
- package/dist/runtime/messaging/payload-codec.js +21 -18
- package/dist/runtime/protocol/service_wire_codec.generated.d.ts +30 -2
- package/dist/runtime/protocol/service_wire_codec.generated.js +1671 -234
- package/dist/runtime/routing-id.js +3 -5
- package/dist/runtime/spots/formal-remote-actor-admission-registry.js +35 -31
- package/dist/runtime/spots/formal-remote-actor-transfer-registry.js +1 -2
- package/dist/runtime/spots/index.js +208 -219
- package/dist/runtime/spots/spot-activation-registry.js +15 -14
- package/dist/runtime/spots/spot-activation-state.js +17 -15
- package/dist/runtime/spots/spot-activation.js +33 -16
- package/dist/runtime/spots/spot-actor-admission-coordinator.js +18 -15
- package/dist/runtime/spots/spot-actor-membership.js +1 -3
- package/dist/runtime/spots/spot-actor-packet-dispatch.js +23 -20
- package/dist/runtime/spots/spot-actor-packet-drain.js +12 -10
- package/dist/runtime/spots/spot-actor-packet-relay-dispatch.js +10 -6
- package/dist/runtime/spots/spot-closing.js +3 -7
- package/dist/runtime/spots/spot-context.js +2 -2
- package/dist/runtime/spots/spot-entry-activation.js +13 -14
- package/dist/runtime/spots/spot-handle.js +6 -3
- package/dist/runtime/spots/spot-handler-registry.js +12 -12
- package/dist/runtime/spots/spot-manager-public.js +5 -6
- package/dist/runtime/spots/spot-native-actor-join-admission.js +4 -3
- package/dist/runtime/spots/spot-node-autoconnect.js +15 -18
- package/dist/runtime/spots/spot-node-runtime-manager.js +74 -85
- package/dist/runtime/spots/spot-outbound.js +10 -14
- package/dist/runtime/spots/spot-remote-codec.js +22 -26
- package/dist/runtime/spots/spot-remote-route-codec.js +5 -7
- package/dist/runtime/spots/spot-route-packet-dispatch.js +16 -14
- package/dist/runtime/spots/spot-route-replies.js +4 -6
- package/dist/runtime/spots/spot-routed-actor-admission.js +9 -7
- package/dist/runtime/spots/spot-routed-bound-session-dispatch.js +1 -2
- package/dist/runtime/spots/spot-routed-frame-dispatch.js +5 -5
- package/dist/runtime/spots/spot-routed-spot-packet-dispatch.js +14 -10
- package/dist/runtime/spots/spot-serial-executor.js +5 -8
- package/dist/runtime/spots/spot-serial-turn-executor.js +4 -6
- package/dist/runtime/spots/spot-subscription-dispatch.js +5 -5
- package/dist/runtime/spots/spot-timer.js +25 -29
- package/dist/runtime/streams/actor-session-binding-registry.js +98 -107
- package/dist/runtime/streams/actor-session-lifecycle-coordinator.js +3 -1
- package/dist/runtime/streams/bound-actor-relay-sender.js +18 -16
- package/dist/runtime/streams/bound-session-service.js +8 -9
- package/dist/runtime/streams/index.js +20 -19
- package/dist/runtime/streams/managed-stream.js +32 -30
- package/dist/runtime/streams/native-fallback-bound-session.js +21 -17
- package/dist/runtime/streams/protocol.js +29 -18
- package/dist/runtime/streams/session-actor-coordinator.js +34 -37
- package/dist/runtime/streams/session-context.js +30 -28
- package/dist/runtime/streams/session-provider.js +2 -2
- package/dist/runtime/streams/session-serial-executor.js +1 -2
- package/dist/runtime/streams/stream-frame-factory.js +11 -5
- package/dist/runtime/streams/stream-session-runtime.js +70 -66
- package/dist/runtime/workers/index.js +15 -4
- package/package.json +2 -2
- package/src/contracts/Channels/RouteCalls.ts +6 -1
- package/src/contracts/Common/ZLinkMessage.ts +5 -5
- package/src/contracts/Common/ZLinkMessageMetadata.ts +4 -3
- package/src/contracts/Configuration/Builders.ts +14 -14
- package/src/contracts/Configuration/CodecContentType.ts +8 -10
- package/src/contracts/Configuration/DiagnosticsValidation.ts +1 -6
- package/src/contracts/Configuration/EndpointNotation.ts +11 -11
- package/src/contracts/Configuration/ObjectRoles.ts +1 -3
- package/src/contracts/Configuration/Registration.ts +46 -17
- package/src/contracts/Configuration/RegistrationBuilderPolicy.ts +10 -8
- package/src/contracts/Configuration/RegistrationBuilders.ts +107 -96
- package/src/contracts/Configuration/RegistrationCodecRegistry.ts +9 -3
- package/src/contracts/Configuration/RegistrationNormalizers.ts +116 -84
- package/src/contracts/Configuration/RegistrationTypes.ts +21 -25
- package/src/contracts/Configuration/RegistrationValidators.ts +122 -73
- package/src/contracts/Configuration/RouteChannelInternalState.ts +1 -4
- package/src/contracts/Configuration/RuntimeEndpointConnections.ts +4 -1
- package/src/contracts/Configuration/SendTimeoutValidation.ts +6 -4
- package/src/contracts/Configuration/TimerRegistrationValidator.ts +8 -13
- package/src/contracts/Dispatch/ZLinkDispatchOptions.ts +1 -6
- package/src/contracts/Errors/index.ts +1 -4
- package/src/contracts/Handlers/Attributes.ts +15 -9
- package/src/contracts/Handlers/IZLinkChannelHandlers.ts +24 -4
- package/src/contracts/Handlers/JsonContract.ts +53 -19
- package/src/contracts/Locations/ActorTransfer.ts +1 -5
- package/src/contracts/Locations/Authority.ts +4 -11
- package/src/contracts/Locations/Keys.ts +6 -1
- package/src/contracts/Locations/Options.ts +3 -2
- package/src/contracts/Locations/RelocationStore.ts +1 -4
- package/src/contracts/Locations/Resolvers.ts +5 -5
- package/src/contracts/Locations/RuntimeQuery.ts +6 -2
- package/src/contracts/Locations/Stores.ts +1 -2
- package/src/contracts/Locations/index.ts +2 -8
- package/src/contracts/RouteMesh/Contracts.ts +1 -7
- package/src/contracts/RouteMesh/RuntimeTopology.ts +1 -4
- package/src/contracts/Spots/Contracts.ts +2 -8
- package/src/contracts/Spots/SpotKind.ts +16 -8
- package/src/contracts/Spots/ZLinkSpot.ts +8 -11
- package/src/contracts/Streams/IZLinkSession.ts +0 -1
- package/src/contracts/Streams/IZLinkSessionActor.ts +5 -1
- package/src/contracts/Streams/IZLinkSessionPacketHandler.ts +5 -1
- package/src/internal.ts +5 -4
- package/src/location-store-integration.ts +24 -16
- package/src/nest-integration.ts +40 -25
- package/src/runtime/abort.ts +10 -4
- package/src/runtime/actors/actor-authority-payload-codec.ts +20 -29
- package/src/runtime/actors/actor-authority-publication.ts +92 -77
- package/src/runtime/actors/actor-client.ts +162 -133
- package/src/runtime/actors/actor-context.ts +138 -130
- package/src/runtime/actors/actor-creation.ts +47 -44
- package/src/runtime/actors/actor-execution-context.ts +6 -4
- package/src/runtime/actors/actor-handoff.ts +269 -293
- package/src/runtime/actors/actor-join-deferred-scope.ts +5 -4
- package/src/runtime/actors/actor-lifecycle-snapshot.ts +5 -8
- package/src/runtime/actors/actor-local-native-join.ts +131 -159
- package/src/runtime/actors/actor-mailbox.ts +16 -19
- package/src/runtime/actors/actor-message-follow-context.ts +46 -36
- package/src/runtime/actors/actor-packet-relay-wire.ts +32 -21
- package/src/runtime/actors/actor-remote-joiner.ts +50 -54
- package/src/runtime/actors/actor-remote-wire.ts +9 -13
- package/src/runtime/actors/actor-routed-join-transport.ts +10 -2
- package/src/runtime/actors/actor-runtime-contracts.ts +2 -5
- package/src/runtime/actors/actor-runtime-state.ts +127 -124
- package/src/runtime/actors/actor-transfer-registry.ts +9 -14
- package/src/runtime/actors/actor-transport-delivery-gate.ts +4 -6
- package/src/runtime/actors/bound-session-wire.ts +37 -17
- package/src/runtime/actors/deferred-join-accepted-journal.ts +351 -320
- package/src/runtime/actors/index.ts +43 -86
- package/src/runtime/actors/post-commit-actor-binder.ts +10 -10
- package/src/runtime/actors/post-commit-actor-location.ts +30 -23
- package/src/runtime/actors/spot-actor-dispatch.ts +78 -53
- package/src/runtime/actors/transferred-actor-rollback.ts +18 -13
- package/src/runtime/admission.ts +9 -9
- package/src/runtime/application-jobs/application-ingress-record-owner.ts +5 -15
- package/src/runtime/application-jobs/application-job-queue-handler-start-gate.ts +3 -2
- package/src/runtime/application-jobs/receive-flow-controller.ts +17 -14
- package/src/runtime/backend/contracts/index.ts +73 -52
- package/src/runtime/backend/mesh-actor-session-node-adapter.ts +4 -14
- package/src/runtime/backend/mesh-completion-table.ts +6 -9
- package/src/runtime/backend/mesh-dispatch-pump.ts +38 -30
- package/src/runtime/backend/node/node-backend-adapter-factory.ts +23 -21
- package/src/runtime/backend/node/node-backend-adapter-support.ts +36 -22
- package/src/runtime/backend/node/node-dealer-channel-client-transport.ts +59 -58
- package/src/runtime/backend/node/node-event-loop-poller.ts +2 -10
- package/src/runtime/backend/node/node-mesh-backend-adapter.ts +12 -5
- package/src/runtime/backend/node/node-monitor-backend-adapter.ts +4 -3
- package/src/runtime/backend/node/node-raw-binding-port.ts +29 -29
- package/src/runtime/backend/node/node-raw-mesh-backend.ts +335 -383
- package/src/runtime/backend/node/node-socket-backend-adapter.ts +101 -54
- package/src/runtime/backend/runtime-message.ts +5 -3
- package/src/runtime/backend/runtime-values.ts +10 -7
- package/src/runtime/channels/channel-autoconnect.ts +1 -4
- package/src/runtime/channels/channel-clients.ts +93 -73
- package/src/runtime/channels/channel-dispatch-pipeline.ts +40 -42
- package/src/runtime/channels/channel-dispatch-services.ts +51 -49
- package/src/runtime/channels/channel-dispatchers.ts +152 -96
- package/src/runtime/channels/channel-envelope-inspection.ts +20 -16
- package/src/runtime/channels/channel-envelope.ts +256 -150
- package/src/runtime/channels/channel-multipart.ts +13 -5
- package/src/runtime/channels/channel-outbound-operations.ts +37 -41
- package/src/runtime/channels/channel-receive-loops.ts +102 -98
- package/src/runtime/channels/channel-receive-task-tracker.ts +1 -1
- package/src/runtime/channels/channel-runtime-lifecycle.ts +248 -190
- package/src/runtime/channels/channel-runtime-manager.ts +63 -37
- package/src/runtime/channels/channel-socket-options.ts +3 -10
- package/src/runtime/channels/channel-socket-registry.ts +331 -273
- package/src/runtime/channels/channel-transports.ts +215 -197
- package/src/runtime/channels/client-server-location-runtime.ts +116 -100
- package/src/runtime/channels/client-server-service-wire.ts +37 -36
- package/src/runtime/channels/dispatch-error-reporter.ts +11 -8
- package/src/runtime/channels/fanout-location-runtime.ts +91 -94
- package/src/runtime/channels/fanout-service-wire.ts +5 -12
- package/src/runtime/channels/handler-filter-scope.ts +1 -4
- package/src/runtime/channels/index.ts +1 -4
- package/src/runtime/channels/local-spot-route-transport.ts +20 -5
- package/src/runtime/channels/route-member-snapshot.ts +11 -5
- package/src/runtime/channels/router-socket-spot-route-transport.ts +1 -7
- package/src/runtime/channels/source-spot-router.ts +26 -22
- package/src/runtime/channels/spot-direct-envelope.ts +10 -8
- package/src/runtime/channels/spot-node-route-transport.ts +13 -16
- package/src/runtime/channels/spot-route-bridge-transport.ts +26 -9
- package/src/runtime/channels/spot-route-dispatch-strategy.ts +40 -13
- package/src/runtime/channels/spot-route-target-resolver.ts +18 -9
- package/src/runtime/codecs/index.ts +3 -2
- package/src/runtime/diagnostics/flow-context.ts +12 -3
- package/src/runtime/diagnostics/index.ts +96 -61
- package/src/runtime/diagnostics/internal-event-contracts.ts +87 -33
- package/src/runtime/diagnostics/message-flow.ts +95 -76
- package/src/runtime/diagnostics/runtime-metrics.ts +46 -24
- package/src/runtime/diagnostics/runtime-observation-queue.ts +17 -28
- package/src/runtime/diagnostics/topology-runtime-projections.ts +62 -43
- package/src/runtime/execution/index.ts +18 -26
- package/src/runtime/execution/serial-execution-queue.ts +31 -40
- package/src/runtime/execution/state-lane.ts +2 -2
- package/src/runtime/foundation/actor-join-recovery-codec.ts +69 -51
- package/src/runtime/foundation/event-loop-resources.ts +8 -4
- package/src/runtime/foundation/message-follow-suppression-registry.ts +7 -14
- package/src/runtime/foundation/operation-identity.ts +1 -2
- package/src/runtime/foundation/operation-registry.ts +8 -2
- package/src/runtime/foundation/raw-service-mesh-runtime.ts +312 -385
- package/src/runtime/foundation/route-mesh-connection-policy.ts +7 -8
- package/src/runtime/foundation/runtime-state-projections.ts +24 -23
- package/src/runtime/foundation/service-authority-payload-codec.ts +54 -57
- package/src/runtime/foundation/service-discovery-registry.ts +67 -59
- package/src/runtime/foundation/service-instance-activation-recovery-codec.ts +28 -29
- package/src/runtime/foundation/service-liveness-registry.ts +18 -13
- package/src/runtime/foundation/service-mailbox.ts +14 -14
- package/src/runtime/foundation/service-maintenance-runtime.ts +22 -21
- package/src/runtime/foundation/service-metadata-codec.ts +2 -9
- package/src/runtime/foundation/service-relocation-aggregate-committer.ts +39 -36
- package/src/runtime/foundation/service-relocation-coordinator.ts +1 -4
- package/src/runtime/foundation/service-relocation-object-owner.ts +40 -58
- package/src/runtime/foundation/service-relocation-runtime.ts +292 -216
- package/src/runtime/foundation/service-runtime-contracts.ts +8 -8
- package/src/runtime/foundation/service-session-binding-ingress-port.ts +1 -4
- package/src/runtime/foundation/service-stateful-registry.ts +69 -59
- package/src/runtime/foundation/service-stateful-runtime.ts +1174 -1112
- package/src/runtime/foundation/service-stateful-wire-codec.ts +318 -270
- package/src/runtime/foundation/service-topology-registry.ts +157 -159
- package/src/runtime/foundation/service-weighted-selection.ts +9 -15
- package/src/runtime/foundation/service-wire-binary-primitives.ts +6 -12
- package/src/runtime/foundation/service-wire-m6a-codec.ts +69 -47
- package/src/runtime/framework-errors-internal.ts +31 -30
- package/src/runtime/handlers/handler-instance-scope.ts +18 -29
- package/src/runtime/handlers/index.ts +18 -8
- package/src/runtime/host/actor-packet-relay.ts +290 -261
- package/src/runtime/host/actor-placement-coordinator.ts +165 -150
- package/src/runtime/host/actor-runtime-options-factory.ts +89 -87
- package/src/runtime/host/actor-transfer-authority-runtime.ts +46 -38
- package/src/runtime/host/actor-transfer-runtime.ts +391 -395
- package/src/runtime/host/application-job-queue.ts +32 -48
- package/src/runtime/host/bound-session-relay.ts +7 -9
- package/src/runtime/host/channel-runtime-options-factory.ts +75 -35
- package/src/runtime/host/host-capacity-status.ts +10 -9
- package/src/runtime/host/index.ts +861 -789
- package/src/runtime/host/instance-activation-authority.ts +125 -143
- package/src/runtime/host/location-runtime-owner.ts +38 -26
- package/src/runtime/host/mesh-router-resolver.ts +30 -23
- package/src/runtime/host/relocation-direct-transfer.ts +15 -15
- package/src/runtime/host/relocation-integrity-fault-gate.ts +3 -2
- package/src/runtime/host/remote-actor-join-receiver.ts +43 -34
- package/src/runtime/host/remote-actor-packet-target-store.ts +54 -52
- package/src/runtime/host/remote-bound-session-relay.ts +274 -247
- package/src/runtime/host/route-mesh-runtime-options.ts +1 -3
- package/src/runtime/host/route-mesh-runtime.ts +227 -181
- package/src/runtime/host/runtime-shutdown.ts +4 -3
- package/src/runtime/host/service-relocation-control.ts +14 -5
- package/src/runtime/host/service-relocation-host-runtime.ts +1388 -1165
- package/src/runtime/host/spot-address-transport.ts +284 -237
- package/src/runtime/host/spot-node-runtime-options-factory.ts +14 -8
- package/src/runtime/host/spot-runtime-options-factory.ts +71 -62
- package/src/runtime/host/stateful-authority-route-runtime.ts +117 -116
- package/src/runtime/host/user-spot-creation-coordinator.ts +225 -220
- package/src/runtime/locations/actor-location-claims.ts +61 -49
- package/src/runtime/locations/actor-session-route-claims.ts +1 -4
- package/src/runtime/locations/aggregate-inventory-store.ts +105 -134
- package/src/runtime/locations/authority-key-codec.ts +13 -10
- package/src/runtime/locations/auto-connect-loop.ts +14 -11
- package/src/runtime/locations/auto-connect-planner.ts +42 -31
- package/src/runtime/locations/auto-connect-reconciler.ts +106 -63
- package/src/runtime/locations/canonical-codec.ts +3 -1
- package/src/runtime/locations/creation-operation-id.ts +4 -3
- package/src/runtime/locations/domain-store-contract.ts +13 -7
- package/src/runtime/locations/in-memory-authority-store.ts +232 -199
- package/src/runtime/locations/in-memory-location-store.ts +432 -250
- package/src/runtime/locations/in-memory-provider-location-store.ts +16 -17
- package/src/runtime/locations/internal-store-contracts.ts +95 -38
- package/src/runtime/locations/key-codec.ts +3 -4
- package/src/runtime/locations/lease-tracker.ts +36 -27
- package/src/runtime/locations/lifecycle-runtime.ts +15 -3
- package/src/runtime/locations/lifecycle.ts +33 -28
- package/src/runtime/locations/location-store-repository.ts +1329 -1185
- package/src/runtime/locations/opaque-record-key.ts +4 -9
- package/src/runtime/locations/resolvers.ts +201 -178
- package/src/runtime/locations/runtime.ts +251 -159
- package/src/runtime/locations/spot-location-claims.ts +110 -112
- package/src/runtime/messaging/creation-payload-codec.ts +4 -1
- package/src/runtime/messaging/framework-json-v1.ts +34 -15
- package/src/runtime/messaging/packet-name.ts +8 -6
- package/src/runtime/messaging/payload-codec.ts +70 -50
- package/src/runtime/messaging/submission-result.ts +6 -9
- package/src/runtime/protocol/service_wire_codec.generated.ts +1376 -159
- package/src/runtime/protocol/service_wire_pilot_codec.generated.ts +1 -1
- package/src/runtime/routing-id.ts +10 -7
- package/src/runtime/spots/formal-remote-actor-admission-registry.ts +56 -62
- package/src/runtime/spots/formal-remote-actor-transfer-registry.ts +23 -20
- package/src/runtime/spots/index.ts +593 -563
- package/src/runtime/spots/spot-activation-registry.ts +38 -34
- package/src/runtime/spots/spot-activation-state.ts +43 -51
- package/src/runtime/spots/spot-activation.ts +179 -116
- package/src/runtime/spots/spot-actor-admission-coordinator.ts +110 -78
- package/src/runtime/spots/spot-actor-join-dispatch.ts +57 -41
- package/src/runtime/spots/spot-actor-lifecycle-drain.ts +5 -7
- package/src/runtime/spots/spot-actor-membership.ts +25 -27
- package/src/runtime/spots/spot-actor-packet-dispatch.ts +184 -153
- package/src/runtime/spots/spot-actor-packet-drain.ts +54 -42
- package/src/runtime/spots/spot-actor-packet-relay-dispatch.ts +37 -39
- package/src/runtime/spots/spot-closing.ts +11 -12
- package/src/runtime/spots/spot-context.ts +46 -26
- package/src/runtime/spots/spot-entry-activation.ts +84 -65
- package/src/runtime/spots/spot-handle.ts +17 -15
- package/src/runtime/spots/spot-handler-registry.ts +44 -31
- package/src/runtime/spots/spot-location-claim.ts +5 -4
- package/src/runtime/spots/spot-manager-public.ts +62 -82
- package/src/runtime/spots/spot-native-actor-join-admission.ts +20 -16
- package/src/runtime/spots/spot-node-autoconnect.ts +54 -61
- package/src/runtime/spots/spot-node-runtime-manager.ts +230 -221
- package/src/runtime/spots/spot-outbound.ts +47 -59
- package/src/runtime/spots/spot-publisher-transport.ts +5 -4
- package/src/runtime/spots/spot-remote-codec.ts +66 -65
- package/src/runtime/spots/spot-remote-route-codec.ts +61 -41
- package/src/runtime/spots/spot-route-packet-dispatch.ts +128 -95
- package/src/runtime/spots/spot-route-replies.ts +23 -24
- package/src/runtime/spots/spot-route-reply-wire.ts +3 -2
- package/src/runtime/spots/spot-routed-actor-admission.ts +37 -27
- package/src/runtime/spots/spot-routed-bound-session-dispatch.ts +11 -17
- package/src/runtime/spots/spot-routed-frame-dispatch.ts +18 -15
- package/src/runtime/spots/spot-routed-spot-packet-dispatch.ts +35 -26
- package/src/runtime/spots/spot-routing-internal.ts +1 -4
- package/src/runtime/spots/spot-runtime-ports.ts +5 -5
- package/src/runtime/spots/spot-serial-executor.ts +5 -9
- package/src/runtime/spots/spot-serial-turn-executor.ts +19 -26
- package/src/runtime/spots/spot-subscription-dispatch.ts +56 -46
- package/src/runtime/spots/spot-timer.ts +98 -91
- package/src/runtime/streams/actor-session-binding-registry.ts +277 -235
- package/src/runtime/streams/actor-session-binding-runtime-owner.ts +7 -4
- package/src/runtime/streams/actor-session-lifecycle-coordinator.ts +3 -1
- package/src/runtime/streams/bound-actor-relay-sender.ts +53 -51
- package/src/runtime/streams/bound-session-response-target.ts +29 -8
- package/src/runtime/streams/bound-session-service.ts +39 -39
- package/src/runtime/streams/index.ts +176 -100
- package/src/runtime/streams/managed-stream.ts +98 -87
- package/src/runtime/streams/native-fallback-bound-session.ts +57 -52
- package/src/runtime/streams/protocol.ts +73 -43
- package/src/runtime/streams/session-actor-coordinator.ts +97 -89
- package/src/runtime/streams/session-calls.ts +2 -8
- package/src/runtime/streams/session-context.ts +66 -48
- package/src/runtime/streams/session-provider.ts +5 -7
- package/src/runtime/streams/session-serial-executor.ts +7 -6
- package/src/runtime/streams/stream-binding-runtime-ports.ts +79 -29
- package/src/runtime/streams/stream-frame-factory.ts +55 -38
- package/src/runtime/streams/stream-session-runtime.ts +268 -210
- package/src/runtime/workers/index.ts +68 -29
|
@@ -103,11 +103,11 @@ function readZLinkMessageDeclaredType(message) {
|
|
|
103
103
|
* the runtime type requested by `ZLinkMessage.decode(type)`.
|
|
104
104
|
*/
|
|
105
105
|
function materializeZLinkMessageValue(value, type) {
|
|
106
|
-
if (type === undefined
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
106
|
+
if (type === undefined ||
|
|
107
|
+
type === Object ||
|
|
108
|
+
value === null ||
|
|
109
|
+
typeof value !== 'object' ||
|
|
110
|
+
Array.isArray(value)) {
|
|
111
111
|
return value;
|
|
112
112
|
}
|
|
113
113
|
const prototype = type.prototype;
|
|
@@ -29,9 +29,7 @@ function normalizeCodecContentType(contentType) {
|
|
|
29
29
|
}
|
|
30
30
|
if (!isTokenCharacter(code))
|
|
31
31
|
throw invalidContentType();
|
|
32
|
-
normalized += code >= 0x41 && code <= 0x5a
|
|
33
|
-
? String.fromCharCode(code + 0x20)
|
|
34
|
-
: value[index];
|
|
32
|
+
normalized += code >= 0x41 && code <= 0x5a ? String.fromCharCode(code + 0x20) : value[index];
|
|
35
33
|
}
|
|
36
34
|
if (slash === -1)
|
|
37
35
|
throw invalidContentType();
|
|
@@ -58,10 +56,10 @@ function isOuterWhitespace(code) {
|
|
|
58
56
|
return code === 0x20 || code === 0x09;
|
|
59
57
|
}
|
|
60
58
|
function isTokenCharacter(code) {
|
|
61
|
-
return (code >= 0x30 && code <= 0x39)
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
59
|
+
return ((code >= 0x30 && code <= 0x39) ||
|
|
60
|
+
(code >= 0x41 && code <= 0x5a) ||
|
|
61
|
+
(code >= 0x61 && code <= 0x7a) ||
|
|
62
|
+
mediaTypePunctuation.has(code));
|
|
65
63
|
}
|
|
66
64
|
function invalidContentType() {
|
|
67
65
|
return new ConfigurationException_1.ZLinkConfigurationException('Codec content type must be a parameter-free ASCII type/subtype.');
|
|
@@ -3,12 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.requireMessageFlowLogMode = requireMessageFlowLogMode;
|
|
4
4
|
exports.requireTraceSampleRate = requireTraceSampleRate;
|
|
5
5
|
const ConfigurationException_1 = require("./ConfigurationException");
|
|
6
|
-
const MESSAGE_FLOW_MODES = new Set([
|
|
7
|
-
'off',
|
|
8
|
-
'errors',
|
|
9
|
-
'normal',
|
|
10
|
-
'detailed'
|
|
11
|
-
]);
|
|
6
|
+
const MESSAGE_FLOW_MODES = new Set(['off', 'errors', 'normal', 'detailed']);
|
|
12
7
|
function requireMessageFlowLogMode(value) {
|
|
13
8
|
if (typeof value !== 'string' || !MESSAGE_FLOW_MODES.has(value)) {
|
|
14
9
|
throw new ConfigurationException_1.ZLinkConfigurationException("messageFlow must be one of 'off', 'errors', 'normal', or 'detailed'.");
|
|
@@ -79,9 +79,9 @@ function normalizeEndpoint(endpoint) {
|
|
|
79
79
|
const { host, port } = splitHostPort(hostPort);
|
|
80
80
|
const normalizedHost = normalizeHost(host);
|
|
81
81
|
const normalizedPort = normalizePort(port);
|
|
82
|
-
return `${scheme}://${userInfo}${normalizedHost}`
|
|
83
|
-
|
|
84
|
-
|
|
82
|
+
return (`${scheme}://${userInfo}${normalizedHost}` +
|
|
83
|
+
(normalizedPort.length > 0 ? `:${normalizedPort}` : '') +
|
|
84
|
+
normalizeSuffix(suffix));
|
|
85
85
|
}
|
|
86
86
|
function findAuthorityEnd(rest) {
|
|
87
87
|
if (rest.startsWith('[')) {
|
|
@@ -197,11 +197,7 @@ function buildAdvertisedEndpoint(boundEndpoint, advertiseHost, restrictToScheme)
|
|
|
197
197
|
if (match === null)
|
|
198
198
|
return normalized;
|
|
199
199
|
const boundHost = unbracketHost(match[2]);
|
|
200
|
-
const defaultHost = boundHost === '0.0.0.0'
|
|
201
|
-
? '127.0.0.1'
|
|
202
|
-
: boundHost === '::'
|
|
203
|
-
? '::1'
|
|
204
|
-
: undefined;
|
|
200
|
+
const defaultHost = boundHost === '0.0.0.0' ? '127.0.0.1' : boundHost === '::' ? '::1' : undefined;
|
|
205
201
|
if (defaultHost === undefined)
|
|
206
202
|
return normalized;
|
|
207
203
|
const host = defaultHost.includes(':') ? `[${defaultHost}]` : defaultHost;
|
|
@@ -82,22 +82,22 @@ function normalizeApplicationJobQueue(value) {
|
|
|
82
82
|
throw new TypeError('applicationJobQueue.profile must be a supported profile.');
|
|
83
83
|
}
|
|
84
84
|
const maxQueuedApplicationJobs = value?.maxQueuedApplicationJobs;
|
|
85
|
-
if (maxQueuedApplicationJobs !== undefined
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
85
|
+
if (maxQueuedApplicationJobs !== undefined &&
|
|
86
|
+
(typeof maxQueuedApplicationJobs !== 'bigint' ||
|
|
87
|
+
maxQueuedApplicationJobs < 1n ||
|
|
88
|
+
maxQueuedApplicationJobs > 2147483647n)) {
|
|
89
89
|
throw new TypeError('applicationJobQueue.maxQueuedApplicationJobs must be a bigint in the range 1..2147483647.');
|
|
90
90
|
}
|
|
91
91
|
const pauseThresholdPercent = value?.pauseThresholdPercent ?? 80;
|
|
92
92
|
const resumeThresholdPercent = value?.resumeThresholdPercent ?? 60;
|
|
93
|
-
if (!Number.isInteger(pauseThresholdPercent)
|
|
94
|
-
|
|
95
|
-
|
|
93
|
+
if (!Number.isInteger(pauseThresholdPercent) ||
|
|
94
|
+
pauseThresholdPercent < 1 ||
|
|
95
|
+
pauseThresholdPercent > 100) {
|
|
96
96
|
throw new TypeError('applicationJobQueue.pauseThresholdPercent must be an integer in the range 1..100.');
|
|
97
97
|
}
|
|
98
|
-
if (!Number.isInteger(resumeThresholdPercent)
|
|
99
|
-
|
|
100
|
-
|
|
98
|
+
if (!Number.isInteger(resumeThresholdPercent) ||
|
|
99
|
+
resumeThresholdPercent < 0 ||
|
|
100
|
+
resumeThresholdPercent > 99) {
|
|
101
101
|
throw new TypeError('applicationJobQueue.resumeThresholdPercent must be an integer in the range 0..99.');
|
|
102
102
|
}
|
|
103
103
|
if (resumeThresholdPercent >= pauseThresholdPercent) {
|
|
@@ -117,7 +117,10 @@ function normalizeCoreHwm(value) {
|
|
|
117
117
|
if (profile !== undefined && (!Number.isInteger(profile) || profile < 0 || profile > 3)) {
|
|
118
118
|
throw new TypeError('coreHwm.profile must be a Core Auto HWM profile value.');
|
|
119
119
|
}
|
|
120
|
-
for (const [name, bytes] of [
|
|
120
|
+
for (const [name, bytes] of [
|
|
121
|
+
['memoryLimitBytes', memoryLimitBytes],
|
|
122
|
+
['budgetBytes', budgetBytes]
|
|
123
|
+
]) {
|
|
121
124
|
if (bytes !== undefined && (typeof bytes !== 'bigint' || bytes <= 0n)) {
|
|
122
125
|
throw new TypeError(`coreHwm.${name} must be a positive bigint.`);
|
|
123
126
|
}
|
|
@@ -74,7 +74,8 @@ class ZLinkFrameworkOptionsBuilder {
|
|
|
74
74
|
return this;
|
|
75
75
|
}
|
|
76
76
|
setSessionReplacementCallbackTimeout(timeoutMs) {
|
|
77
|
-
this.options.sessionReplacementCallbackTimeoutMs =
|
|
77
|
+
this.options.sessionReplacementCallbackTimeoutMs =
|
|
78
|
+
(0, RegistrationBuilderPolicy_1.validateSessionReplacementCallbackTimeout)(timeoutMs);
|
|
78
79
|
return this;
|
|
79
80
|
}
|
|
80
81
|
configureLocations() {
|
|
@@ -239,11 +240,16 @@ class DefaultInboundDispatchOptionsBuilder {
|
|
|
239
240
|
exports.DefaultInboundDispatchOptionsBuilder = DefaultInboundDispatchOptionsBuilder;
|
|
240
241
|
function coreHwmProfileValue(value) {
|
|
241
242
|
switch (value) {
|
|
242
|
-
case Dispatch_1.ZLinkCoreHwmProfile.Compact:
|
|
243
|
-
|
|
244
|
-
case Dispatch_1.ZLinkCoreHwmProfile.
|
|
245
|
-
|
|
246
|
-
|
|
243
|
+
case Dispatch_1.ZLinkCoreHwmProfile.Compact:
|
|
244
|
+
return zlink_1.AutoHwmProfile.Compact;
|
|
245
|
+
case Dispatch_1.ZLinkCoreHwmProfile.LowLatency:
|
|
246
|
+
return zlink_1.AutoHwmProfile.LowLatency;
|
|
247
|
+
case Dispatch_1.ZLinkCoreHwmProfile.Balanced:
|
|
248
|
+
return zlink_1.AutoHwmProfile.Balanced;
|
|
249
|
+
case Dispatch_1.ZLinkCoreHwmProfile.Throughput:
|
|
250
|
+
return zlink_1.AutoHwmProfile.Throughput;
|
|
251
|
+
default:
|
|
252
|
+
throw new TypeError('coreHwmProfile must be a supported profile.');
|
|
247
253
|
}
|
|
248
254
|
}
|
|
249
255
|
class DefaultLocationOptionsBuilder {
|
|
@@ -764,7 +770,10 @@ class DefaultMeshNodeBuilder {
|
|
|
764
770
|
}
|
|
765
771
|
addRouteRequestHandler(handlerType) {
|
|
766
772
|
this.node.routeRequestHandlers ??= [];
|
|
767
|
-
this.node.routeRequestHandlers.push({
|
|
773
|
+
this.node.routeRequestHandlers.push({
|
|
774
|
+
packetName: handlerPacketName(handlerType),
|
|
775
|
+
handlerType
|
|
776
|
+
});
|
|
768
777
|
return this;
|
|
769
778
|
}
|
|
770
779
|
updateBind() {
|
|
@@ -772,9 +781,7 @@ class DefaultMeshNodeBuilder {
|
|
|
772
781
|
if (router?.port === undefined)
|
|
773
782
|
return;
|
|
774
783
|
const bindHost = router.bindHost ?? '127.0.0.1';
|
|
775
|
-
const host = bindHost.includes(':') && !bindHost.startsWith('[')
|
|
776
|
-
? `[${bindHost}]`
|
|
777
|
-
: bindHost;
|
|
784
|
+
const host = bindHost.includes(':') && !bindHost.startsWith('[') ? `[${bindHost}]` : bindHost;
|
|
778
785
|
router.bind = `tcp://${host}:${router.port}`;
|
|
779
786
|
}
|
|
780
787
|
}
|
|
@@ -885,8 +892,8 @@ class DefaultUserSpotFactoryBuilder extends DefaultFactoryBuilder {
|
|
|
885
892
|
relocationCoordinationMode: this.relocationCoordinationModeValue
|
|
886
893
|
};
|
|
887
894
|
validateUserSpotFactoryOptions(options);
|
|
888
|
-
if (options.executionMode === ObjectRoles_1.ZLinkUserSpotExecutionMode.PerActor
|
|
889
|
-
|
|
895
|
+
if (options.executionMode === ObjectRoles_1.ZLinkUserSpotExecutionMode.PerActor &&
|
|
896
|
+
relocation.kind !== 'recreate') {
|
|
890
897
|
throw new ConfigurationException_1.ZLinkConfigurationException('PerActor User Spots require RecreateOnRelocation.');
|
|
891
898
|
}
|
|
892
899
|
return { options, relocation };
|
|
@@ -1073,7 +1080,10 @@ class DefaultMeshPeerConnections {
|
|
|
1073
1080
|
const normalizedEndpoint = (0, EndpointNotation_1.normalizeEndpoint)(endpoint);
|
|
1074
1081
|
this.router.manualPeerConnections ??= [];
|
|
1075
1082
|
if (!this.router.manualPeerConnections.some((peer) => peer.endpoint === normalizedEndpoint && peer.peerRid === expectedRoutingIdOrEndpoint)) {
|
|
1076
|
-
this.router.manualPeerConnections.push({
|
|
1083
|
+
this.router.manualPeerConnections.push({
|
|
1084
|
+
peerRid: expectedRoutingIdOrEndpoint,
|
|
1085
|
+
endpoint: normalizedEndpoint
|
|
1086
|
+
});
|
|
1077
1087
|
}
|
|
1078
1088
|
}
|
|
1079
1089
|
disconnect(endpoint) {
|
|
@@ -1137,23 +1147,22 @@ function requireFactoryConfigure(configure) {
|
|
|
1137
1147
|
function validateUserSpotFactoryOptions(options) {
|
|
1138
1148
|
validateStableTypeLimit(options?.stableTypeLimit);
|
|
1139
1149
|
const executionMode = options?.executionMode;
|
|
1140
|
-
if (executionMode !== undefined
|
|
1141
|
-
|
|
1142
|
-
|
|
1150
|
+
if (executionMode !== undefined &&
|
|
1151
|
+
executionMode !== ObjectRoles_1.ZLinkUserSpotExecutionMode.SpotWide &&
|
|
1152
|
+
executionMode !== ObjectRoles_1.ZLinkUserSpotExecutionMode.PerActor) {
|
|
1143
1153
|
throw new ConfigurationException_1.ZLinkConfigurationException('User Spot executionMode is invalid.');
|
|
1144
1154
|
}
|
|
1145
|
-
if (options?.relocationCoordinationMode !== ObjectRoles_1.ZLinkSpotRelocationCoordinationMode.FrameworkManaged
|
|
1146
|
-
|
|
1155
|
+
if (options?.relocationCoordinationMode !== ObjectRoles_1.ZLinkSpotRelocationCoordinationMode.FrameworkManaged &&
|
|
1156
|
+
options?.relocationCoordinationMode !== ObjectRoles_1.ZLinkSpotRelocationCoordinationMode.ApplicationSignaled) {
|
|
1147
1157
|
throw new ConfigurationException_1.ZLinkConfigurationException('User Spot relocationCoordinationMode is invalid.');
|
|
1148
1158
|
}
|
|
1149
|
-
if (options.executionMode === ObjectRoles_1.ZLinkUserSpotExecutionMode.PerActor
|
|
1150
|
-
|
|
1159
|
+
if (options.executionMode === ObjectRoles_1.ZLinkUserSpotExecutionMode.PerActor &&
|
|
1160
|
+
options.relocationCoordinationMode === ObjectRoles_1.ZLinkSpotRelocationCoordinationMode.ApplicationSignaled) {
|
|
1151
1161
|
throw new ConfigurationException_1.ZLinkConfigurationException('ApplicationSignaled relocation coordination mode is valid only for SpotWide User Spots.');
|
|
1152
1162
|
}
|
|
1153
1163
|
}
|
|
1154
1164
|
function validateStableTypeLimit(value) {
|
|
1155
|
-
if (value !== undefined
|
|
1156
|
-
&& (!Number.isInteger(value) || value < 0 || value > 2_147_483_647)) {
|
|
1165
|
+
if (value !== undefined && (!Number.isInteger(value) || value < 0 || value > 2_147_483_647)) {
|
|
1157
1166
|
throw new ConfigurationException_1.ZLinkConfigurationException('stableTypeLimit must be an integer from 0 through 2147483647.');
|
|
1158
1167
|
}
|
|
1159
1168
|
}
|
|
@@ -1163,9 +1172,7 @@ function rejectDuplicateObjectType(registrations, stableType, meshName) {
|
|
|
1163
1172
|
}
|
|
1164
1173
|
}
|
|
1165
1174
|
function handlerPacketName(handlerType) {
|
|
1166
|
-
return (0, Attributes_1.readZLinkDecoratorMetadata)(handlerType)
|
|
1167
|
-
.find((metadata) => metadata.kind === 'packet' && metadata.packetName !== undefined)
|
|
1168
|
-
?.packetName ?? handlerType.name;
|
|
1175
|
+
return ((0, Attributes_1.readZLinkDecoratorMetadata)(handlerType).find((metadata) => metadata.kind === 'packet' && metadata.packetName !== undefined)?.packetName ?? handlerType.name);
|
|
1169
1176
|
}
|
|
1170
1177
|
function requireRegistrationName(value, label) {
|
|
1171
1178
|
if (value.trim().length === 0 || value.trim() !== value) {
|
|
@@ -42,32 +42,34 @@ function normalizeNetworkOptions(value) {
|
|
|
42
42
|
}
|
|
43
43
|
function toChannelMap(channels, network) {
|
|
44
44
|
return new Map(Object.entries(channels ?? {}).map(([name, channel]) => {
|
|
45
|
-
const server = channel.server === undefined
|
|
46
|
-
|
|
47
|
-
: normalizeListener(channel.server, network);
|
|
48
|
-
const publisher = channel.publisher === undefined
|
|
49
|
-
? undefined
|
|
50
|
-
: normalizeListener(channel.publisher, network);
|
|
45
|
+
const server = channel.server === undefined ? undefined : normalizeListener(channel.server, network);
|
|
46
|
+
const publisher = channel.publisher === undefined ? undefined : normalizeListener(channel.publisher, network);
|
|
51
47
|
// In-place: channel.client/subscriber.manualConnections can be the same
|
|
52
48
|
// array a live RuntimeEndpointConnections handle mutates, so this must
|
|
53
49
|
// not replace the array or the containing client/subscriber object.
|
|
54
50
|
normalizeEndpointList(channel.client?.manualConnections);
|
|
55
51
|
normalizeEndpointList(channel.subscriber?.manualConnections);
|
|
56
|
-
return [
|
|
52
|
+
return [
|
|
53
|
+
name,
|
|
54
|
+
{
|
|
57
55
|
...channel,
|
|
58
56
|
...(server === undefined ? {} : { server }),
|
|
59
57
|
...(publisher === undefined ? {} : { publisher }),
|
|
60
58
|
requestTimeoutMs: normalizeOptionalPositiveInteger(channel.requestTimeoutMs, `${name}.requestTimeoutMs`)
|
|
61
|
-
}
|
|
59
|
+
}
|
|
60
|
+
];
|
|
62
61
|
}));
|
|
63
62
|
}
|
|
64
63
|
function toStreamNodeMap(streamNodes, network) {
|
|
65
64
|
return new Map(Object.entries(streamNodes ?? {}).map(([name, streamNode]) => {
|
|
66
65
|
const normalized = normalizeListener(streamNode, network);
|
|
67
|
-
return [
|
|
66
|
+
return [
|
|
67
|
+
name,
|
|
68
|
+
{
|
|
68
69
|
...normalized,
|
|
69
70
|
maxMessageSize: streamNode.maxMessageSize ?? InternalDefaults_1.DEFAULT_STREAM_NODE_MAX_MESSAGE_SIZE
|
|
70
|
-
}
|
|
71
|
+
}
|
|
72
|
+
];
|
|
71
73
|
}));
|
|
72
74
|
}
|
|
73
75
|
function toRouteChannelOptions(options) {
|
|
@@ -120,14 +122,14 @@ function hasSpotNode(registration) {
|
|
|
120
122
|
return registration.spotNodes.size > 0;
|
|
121
123
|
}
|
|
122
124
|
function hasActorManager(registration) {
|
|
123
|
-
const hasObjectCapability = [...registration.spotNodes.values()].some(node => node.objectRole === 'client'
|
|
124
|
-
|
|
125
|
-
|
|
125
|
+
const hasObjectCapability = [...registration.spotNodes.values()].some((node) => node.objectRole === 'client' ||
|
|
126
|
+
node.objectRole === 'server' ||
|
|
127
|
+
(node.actorFactories instanceof Map
|
|
126
128
|
? node.actorFactories.size > 0
|
|
127
|
-
: Object.keys(node.actorFactories ?? {}).length > 0)
|
|
128
|
-
|
|
129
|
-
return hasObjectCapability &&
|
|
130
|
-
|| registration.locations.storeInstance !== undefined);
|
|
129
|
+
: Object.keys(node.actorFactories ?? {}).length > 0) ||
|
|
130
|
+
Object.keys(node.actorFactoryRegistrations ?? {}).length > 0);
|
|
131
|
+
return (hasObjectCapability &&
|
|
132
|
+
(registration.locations.useInMemoryStores || registration.locations.storeInstance !== undefined));
|
|
131
133
|
}
|
|
132
134
|
function hasSpotPublisherClient(registration) {
|
|
133
135
|
return registration.spotPublisherClients.size > 0;
|
|
@@ -179,9 +181,7 @@ function toSpotNodeMap(value, network) {
|
|
|
179
181
|
}));
|
|
180
182
|
}
|
|
181
183
|
function normalizeSpotNodeOptions(spotNode, network) {
|
|
182
|
-
const router = spotNode.router === undefined
|
|
183
|
-
? undefined
|
|
184
|
-
: normalizeListener(spotNode.router, network);
|
|
184
|
+
const router = spotNode.router === undefined ? undefined : normalizeListener(spotNode.router, network);
|
|
185
185
|
return {
|
|
186
186
|
...spotNode,
|
|
187
187
|
router: router === undefined
|
|
@@ -204,8 +204,7 @@ function normalizeSpotNodeOptions(spotNode, network) {
|
|
|
204
204
|
function normalizeListener(listener, network) {
|
|
205
205
|
const usesConfiguredEndpoint = listener.bind !== undefined && listener.port === undefined;
|
|
206
206
|
const port = listener.port ?? (usesConfiguredEndpoint ? endpointPort(listener.bind) : 0);
|
|
207
|
-
const bindHost = listener.bindHost
|
|
208
|
-
?? (usesConfiguredEndpoint ? endpointHost(listener.bind) : network.bindHost);
|
|
207
|
+
const bindHost = listener.bindHost ?? (usesConfiguredEndpoint ? endpointHost(listener.bind) : network.bindHost);
|
|
209
208
|
const bind = usesConfiguredEndpoint
|
|
210
209
|
? (0, EndpointNotation_1.normalizeEndpoint)(listener.bind)
|
|
211
210
|
: tcpEndpoint(bindHost ?? network.bindHost, port);
|
|
@@ -303,10 +302,10 @@ function normalizeStreamCompression(value) {
|
|
|
303
302
|
};
|
|
304
303
|
}
|
|
305
304
|
function isStreamCompressionCodec(value) {
|
|
306
|
-
return typeof value === 'object'
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
305
|
+
return (typeof value === 'object' &&
|
|
306
|
+
value !== null &&
|
|
307
|
+
typeof value.compress === 'function' &&
|
|
308
|
+
typeof value.decompress === 'function');
|
|
310
309
|
}
|
|
311
310
|
function normalizeLocationRegistration(value) {
|
|
312
311
|
return {
|
|
@@ -10,8 +10,7 @@ const SendTimeoutValidation_1 = require("./SendTimeoutValidation");
|
|
|
10
10
|
const FanoutTopic_1 = require("./FanoutTopic");
|
|
11
11
|
function validateFrameworkRegistration(registration, _options = {}) {
|
|
12
12
|
validateListenerNetworkIdentity('process network', registration.network.bindHost, registration.network.advertiseHost);
|
|
13
|
-
const actorCapableSpotNodes = [...registration.spotNodes.values()]
|
|
14
|
-
.filter((spotNode) => toActorFactoryCount(spotNode.actorFactories) > 0);
|
|
13
|
+
const actorCapableSpotNodes = [...registration.spotNodes.values()].filter((spotNode) => toActorFactoryCount(spotNode.actorFactories) > 0);
|
|
15
14
|
if (actorCapableSpotNodes.length > 1) {
|
|
16
15
|
throw new ConfigurationException_1.ZLinkConfigurationException('Actor factory registration is ambiguous because more than one SpotNode owns actor factories.');
|
|
17
16
|
}
|
|
@@ -26,10 +25,10 @@ function validateFrameworkRegistration(registration, _options = {}) {
|
|
|
26
25
|
}
|
|
27
26
|
function validateChannelTopologyNames(registration) {
|
|
28
27
|
const declaredChannelNames = new Set([...registration.channels]
|
|
29
|
-
.filter(([, channel]) => channel.client !== undefined
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
28
|
+
.filter(([, channel]) => channel.client !== undefined ||
|
|
29
|
+
channel.server !== undefined ||
|
|
30
|
+
channel.publisher !== undefined ||
|
|
31
|
+
channel.subscriber !== undefined)
|
|
33
32
|
.map(([channelName]) => channelName));
|
|
34
33
|
if (declaredChannelNames.size === 0)
|
|
35
34
|
return;
|
|
@@ -52,8 +51,7 @@ function toActorFactoryCount(value) {
|
|
|
52
51
|
return value instanceof Map ? value.size : Object.keys(value).length;
|
|
53
52
|
}
|
|
54
53
|
function hasLocationStores(registration) {
|
|
55
|
-
return registration.locations.useInMemoryStores
|
|
56
|
-
|| registration.locations.storeInstance !== undefined;
|
|
54
|
+
return (registration.locations.useInMemoryStores || registration.locations.storeInstance !== undefined);
|
|
57
55
|
}
|
|
58
56
|
function validateWorkerOptions(worker) {
|
|
59
57
|
if (worker === undefined) {
|
|
@@ -72,10 +70,10 @@ function validateLocationRegistration(registration) {
|
|
|
72
70
|
throw new ConfigurationException_1.ZLinkConfigurationException('In-memory location stores cannot be combined with explicit location store registrations.');
|
|
73
71
|
}
|
|
74
72
|
const store = locations.storeInstance;
|
|
75
|
-
if (store !== undefined
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
73
|
+
if (store !== undefined &&
|
|
74
|
+
(typeof store.read !== 'function' ||
|
|
75
|
+
typeof store.write !== 'function' ||
|
|
76
|
+
typeof store.scan !== 'function')) {
|
|
79
77
|
throw new ConfigurationException_1.ZLinkConfigurationException('Location Store must implement read, write, and scan.');
|
|
80
78
|
}
|
|
81
79
|
const options = { ...Locations_1.zlinkDefaultLocationOptions, ...locations.options };
|
|
@@ -90,8 +88,8 @@ function validateLocationRegistration(registration) {
|
|
|
90
88
|
throw new ConfigurationException_1.ZLinkConfigurationException(`${name} must be a finite positive number.`);
|
|
91
89
|
}
|
|
92
90
|
}
|
|
93
|
-
if (options.ownerLeaseRenewIntervalMs + options.ownerLeaseRenewTimeoutMs
|
|
94
|
-
|
|
91
|
+
if (options.ownerLeaseRenewIntervalMs + options.ownerLeaseRenewTimeoutMs >=
|
|
92
|
+
options.ownerLeaseTtlMs - options.ownerLeaseFencingMarginMs) {
|
|
95
93
|
throw new ConfigurationException_1.ZLinkConfigurationException('ownerLeaseRenewIntervalMs + ownerLeaseRenewTimeoutMs must be less than ownerLeaseTtlMs - ownerLeaseFencingMarginMs.');
|
|
96
94
|
}
|
|
97
95
|
for (const [name, value] of Object.entries({
|
|
@@ -121,9 +119,9 @@ function validateLocationRegistration(registration) {
|
|
|
121
119
|
throw new ConfigurationException_1.ZLinkConfigurationException(`${name} must be a finite non-negative number.`);
|
|
122
120
|
}
|
|
123
121
|
}
|
|
124
|
-
if (options.routeCacheMaxAgeMs > 0
|
|
125
|
-
|
|
126
|
-
|
|
122
|
+
if (options.routeCacheMaxAgeMs > 0 &&
|
|
123
|
+
options.messageFollowDurationMs > 0 &&
|
|
124
|
+
options.routeCacheMaxAgeMs > options.messageFollowDurationMs - 5000) {
|
|
127
125
|
throw new ConfigurationException_1.ZLinkConfigurationException('routeCacheMaxAgeMs must be at least 5000 ms shorter than messageFollowDurationMs.');
|
|
128
126
|
}
|
|
129
127
|
}
|
|
@@ -183,11 +181,12 @@ function validateChannelCapabilities(channels, peerLocationConfigured) {
|
|
|
183
181
|
if (channel.subscriber !== undefined && (channel.publishHandlers ?? []).length === 0) {
|
|
184
182
|
throw new ConfigurationException_1.ZLinkConfigurationException(`Channel '${channelName}' subscriber must register at least one publish handler.`);
|
|
185
183
|
}
|
|
186
|
-
if (((channel.requestHandlers ?? []).length > 0 || (channel.sendHandlers ?? []).length > 0) &&
|
|
184
|
+
if (((channel.requestHandlers ?? []).length > 0 || (channel.sendHandlers ?? []).length > 0) &&
|
|
185
|
+
channel.server === undefined) {
|
|
187
186
|
throw new ConfigurationException_1.ZLinkConfigurationException(`Channel '${channelName}' request/send handlers require a server capability.`);
|
|
188
187
|
}
|
|
189
|
-
if (channel.server !== undefined
|
|
190
|
-
|
|
188
|
+
if (channel.server !== undefined &&
|
|
189
|
+
(channel.requestHandlers ?? []).length + (channel.sendHandlers ?? []).length === 0) {
|
|
191
190
|
throw new ConfigurationException_1.ZLinkConfigurationException(`Channel '${channelName}' server must register at least one request or send handler.`);
|
|
192
191
|
}
|
|
193
192
|
validateDuplicatePacketNames(`channel '${channelName}' request handler`, channel.requestHandlers?.map((handler) => handler.packetName));
|
|
@@ -219,9 +218,9 @@ function validateSpotNodes(registration) {
|
|
|
219
218
|
(0, SendTimeoutValidation_1.requireValidSendTimeoutMs)(`SpotNode '${spotNodeName}' publisher sendTimeoutMs`, spotNode.publisherConfig?.sendTimeoutMs);
|
|
220
219
|
validateSpotNodeFactories(spotNodeName, spotNode);
|
|
221
220
|
validateSpotNodeTimers(spotNode);
|
|
222
|
-
if (spotNode.objectRole === 'client'
|
|
223
|
-
|
|
224
|
-
|
|
221
|
+
if (spotNode.objectRole === 'client' &&
|
|
222
|
+
((spotNode.routeSendHandlers?.length ?? 0) > 0 ||
|
|
223
|
+
(spotNode.routeRequestHandlers?.length ?? 0) > 0)) {
|
|
225
224
|
throw new ConfigurationException_1.ZLinkConfigurationException(`Object Client RouteMesh '${spotNodeName}' cannot register Node-direct handlers.`);
|
|
226
225
|
}
|
|
227
226
|
if (spotNode.router?.routingId !== undefined &&
|
|
@@ -234,8 +233,7 @@ function validateSpotNodes(registration) {
|
|
|
234
233
|
function validateMeshChannels(spotNodeName, meshChannels) {
|
|
235
234
|
for (const [channelName, channel] of Object.entries(meshChannels ?? {})) {
|
|
236
235
|
requireName(`RouteMesh '${spotNodeName}' channel`, channelName);
|
|
237
|
-
const handlerCount = (channel.requestHandlers?.length ?? 0)
|
|
238
|
-
+ (channel.sendHandlers?.length ?? 0);
|
|
236
|
+
const handlerCount = (channel.requestHandlers?.length ?? 0) + (channel.sendHandlers?.length ?? 0);
|
|
239
237
|
if (channel.client === true && channel.server === true) {
|
|
240
238
|
throw new ConfigurationException_1.ZLinkConfigurationException(`RouteMesh '${spotNodeName}' channel '${channelName}' must register exactly one role.`);
|
|
241
239
|
}
|
|
@@ -273,7 +271,9 @@ function validateSpotNodeCapability(capabilityName, capability) {
|
|
|
273
271
|
validateManualConnections(capabilityName, capability.manualConnections);
|
|
274
272
|
validateRouterPeerConnections(capabilityName, 'manualPeerConnections' in capability ? capability.manualPeerConnections : undefined);
|
|
275
273
|
requireEndpoint(capabilityName, capability.bind);
|
|
276
|
-
if (capability.routingId !== undefined &&
|
|
274
|
+
if (capability.routingId !== undefined &&
|
|
275
|
+
(capability.routingId.trim().length === 0 ||
|
|
276
|
+
capability.routingId.trim() !== capability.routingId)) {
|
|
277
277
|
throw new ConfigurationException_1.ZLinkConfigurationException(`${capabilityName} routingId must not be empty or padded.`);
|
|
278
278
|
}
|
|
279
279
|
}
|
|
@@ -289,9 +289,7 @@ function validateListenerNetworkIdentity(capabilityName, configuredBindHost, adv
|
|
|
289
289
|
}
|
|
290
290
|
}
|
|
291
291
|
function isWildcardHost(host) {
|
|
292
|
-
const normalized = host.startsWith('[') && host.endsWith(']')
|
|
293
|
-
? host.slice(1, -1)
|
|
294
|
-
: host;
|
|
292
|
+
const normalized = host.startsWith('[') && host.endsWith(']') ? host.slice(1, -1) : host;
|
|
295
293
|
return normalized === '0.0.0.0' || normalized === '::';
|
|
296
294
|
}
|
|
297
295
|
function validateManualConnections(capabilityName, manualConnections) {
|
|
@@ -407,10 +405,10 @@ function isRouteTransportConfigured(routeChannel) {
|
|
|
407
405
|
return isRoutePacketCapabilityConfigured(routeChannel);
|
|
408
406
|
}
|
|
409
407
|
function isRoutePacketCapabilityConfigured(routeChannel) {
|
|
410
|
-
return hasBind(routeChannel.bind)
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
408
|
+
return (hasBind(routeChannel.bind) ||
|
|
409
|
+
(0, RouteChannelInternalState_1.isRouteClientEnabled)(routeChannel) ||
|
|
410
|
+
(routeChannel.manualConnections ?? []).length > 0 ||
|
|
411
|
+
routeChannelHandlerCount(routeChannel) > 0);
|
|
414
412
|
}
|
|
415
413
|
function isAcceptedSpotRouteChannel(registration, routeChannel) {
|
|
416
414
|
if (!(0, RouteChannelInternalState_1.isRouteTransportDeclared)(routeChannel)) {
|
|
@@ -422,11 +420,11 @@ function isAcceptedSpotRouteChannel(registration, routeChannel) {
|
|
|
422
420
|
if (routeChannel.routingId !== undefined) {
|
|
423
421
|
return [...registration.spotNodes.values()].some((spotNode) => spotNode.router?.routingId === routeChannel.routingId);
|
|
424
422
|
}
|
|
425
|
-
return [...registration.spotNodes.values()].filter((spotNode) => spotNode.router !== undefined)
|
|
423
|
+
return ([...registration.spotNodes.values()].filter((spotNode) => spotNode.router !== undefined)
|
|
424
|
+
.length === 1);
|
|
426
425
|
}
|
|
427
426
|
function validateRouteMeshCapability(capabilityName, routeChannel, peerLocationConfigured = false) {
|
|
428
|
-
const clientEnabled = (0, RouteChannelInternalState_1.isRouteClientEnabled)(routeChannel)
|
|
429
|
-
|| (routeChannel.manualConnections ?? []).length > 0;
|
|
427
|
+
const clientEnabled = (0, RouteChannelInternalState_1.isRouteClientEnabled)(routeChannel) || (routeChannel.manualConnections ?? []).length > 0;
|
|
430
428
|
if (!hasBind(routeChannel.bind) && !clientEnabled) {
|
|
431
429
|
throw new ConfigurationException_1.ZLinkConfigurationException(`${capabilityName} must enable server or client capability.`);
|
|
432
430
|
}
|
|
@@ -437,9 +435,9 @@ function validateRouteMeshCapability(capabilityName, routeChannel, peerLocationC
|
|
|
437
435
|
requireRouteMeshSocketOptions(capabilityName, routeChannel);
|
|
438
436
|
}
|
|
439
437
|
function routeChannelHandlerCount(routeChannel) {
|
|
440
|
-
return (routeChannel.handlers ?? []).length +
|
|
438
|
+
return ((routeChannel.handlers ?? []).length +
|
|
441
439
|
(routeChannel.sendHandlers ?? []).length +
|
|
442
|
-
(routeChannel.requestHandlers ?? []).length;
|
|
440
|
+
(routeChannel.requestHandlers ?? []).length);
|
|
443
441
|
}
|
|
444
442
|
function hasBind(endpoint) {
|
|
445
443
|
return endpoint !== undefined && endpoint.trim().length > 0;
|
|
@@ -7,10 +7,10 @@ exports.ZLINK_MAX_SEND_TIMEOUT_MS = 2_147_483_647;
|
|
|
7
7
|
function requireValidSendTimeoutMs(label, value) {
|
|
8
8
|
if (value === undefined)
|
|
9
9
|
return;
|
|
10
|
-
if (!Number.isFinite(value)
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
10
|
+
if (!Number.isFinite(value) ||
|
|
11
|
+
!Number.isInteger(value) ||
|
|
12
|
+
value < 1 ||
|
|
13
|
+
value > exports.ZLINK_MAX_SEND_TIMEOUT_MS) {
|
|
14
14
|
throw new ConfigurationException_1.ZLinkConfigurationException(`${label} must be an integer between 1 and ${exports.ZLINK_MAX_SEND_TIMEOUT_MS} milliseconds.`);
|
|
15
15
|
}
|
|
16
16
|
}
|
|
@@ -10,15 +10,15 @@ function validateTimerRegistration(name, periodMs, options) {
|
|
|
10
10
|
if (!Number.isFinite(periodMs) || periodMs <= 0) {
|
|
11
11
|
throw new ConfigurationException_1.ZLinkConfigurationException('SPOT timer period must be greater than zero.');
|
|
12
12
|
}
|
|
13
|
-
if (options?.overrunPolicy !== undefined
|
|
14
|
-
|
|
13
|
+
if (options?.overrunPolicy !== undefined &&
|
|
14
|
+
!Object.values(Timers_1.ZLinkTimerOverrunPolicy).includes(options.overrunPolicy)) {
|
|
15
15
|
throw new ConfigurationException_1.ZLinkConfigurationException('SPOT timer overrun policy is not supported.');
|
|
16
16
|
}
|
|
17
|
-
if (options?.overrunPolicy === Timers_1.ZLinkTimerOverrunPolicy.CatchUpBounded
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
17
|
+
if (options?.overrunPolicy === Timers_1.ZLinkTimerOverrunPolicy.CatchUpBounded &&
|
|
18
|
+
(options.maxCatchUpTicks === undefined ||
|
|
19
|
+
!Number.isInteger(options.maxCatchUpTicks) ||
|
|
20
|
+
options.maxCatchUpTicks < 1 ||
|
|
21
|
+
options.maxCatchUpTicks > 2_147_483_647)) {
|
|
22
22
|
throw new ConfigurationException_1.ZLinkConfigurationException('SPOT timer MaxCatchUpTicks must be an integer from 1 through 2,147,483,647.');
|
|
23
23
|
}
|
|
24
24
|
}
|
|
@@ -53,9 +53,9 @@ function normalizeJsonSchema(schema, parents, depth) {
|
|
|
53
53
|
case 'bytes':
|
|
54
54
|
return Object.freeze({ type: normalizedSchema.type });
|
|
55
55
|
case 'enum': {
|
|
56
|
-
if (!Array.isArray(normalizedSchema.names)
|
|
57
|
-
|
|
58
|
-
|
|
56
|
+
if (!Array.isArray(normalizedSchema.names) ||
|
|
57
|
+
normalizedSchema.names.length === 0 ||
|
|
58
|
+
normalizedSchema.names.some((name) => typeof name !== 'string' || name.length === 0)) {
|
|
59
59
|
throw new TypeError('ZLink packet enum schema requires non-empty string names.');
|
|
60
60
|
}
|
|
61
61
|
if (new Set(normalizedSchema.names).size !== normalizedSchema.names.length) {
|
|
@@ -64,21 +64,33 @@ function normalizeJsonSchema(schema, parents, depth) {
|
|
|
64
64
|
return Object.freeze({ type: 'enum', names: Object.freeze([...normalizedSchema.names]) });
|
|
65
65
|
}
|
|
66
66
|
case 'nullable':
|
|
67
|
-
return Object.freeze({
|
|
67
|
+
return Object.freeze({
|
|
68
|
+
type: 'nullable',
|
|
69
|
+
value: normalizeJsonSchema(normalizedSchema.value, nextParents, depth + 1)
|
|
70
|
+
});
|
|
68
71
|
case 'array':
|
|
69
|
-
return Object.freeze({
|
|
72
|
+
return Object.freeze({
|
|
73
|
+
type: 'array',
|
|
74
|
+
items: normalizeJsonSchema(normalizedSchema.items, nextParents, depth + 1)
|
|
75
|
+
});
|
|
70
76
|
case 'record':
|
|
71
|
-
return Object.freeze({
|
|
77
|
+
return Object.freeze({
|
|
78
|
+
type: 'record',
|
|
79
|
+
values: normalizeJsonSchema(normalizedSchema.values, nextParents, depth + 1)
|
|
80
|
+
});
|
|
72
81
|
case 'object': {
|
|
73
82
|
const runtimeProperties = normalizedSchema.properties;
|
|
74
|
-
if (typeof runtimeProperties !== 'object' ||
|
|
83
|
+
if (typeof runtimeProperties !== 'object' ||
|
|
84
|
+
runtimeProperties === null ||
|
|
85
|
+
Array.isArray(runtimeProperties)) {
|
|
75
86
|
throw new TypeError('ZLink packet object schema properties must be an object.');
|
|
76
87
|
}
|
|
77
|
-
if (!Array.isArray(normalizedSchema.required)
|
|
78
|
-
|
|
88
|
+
if (!Array.isArray(normalizedSchema.required) ||
|
|
89
|
+
normalizedSchema.required.some((name) => typeof name !== 'string' || name.length === 0)) {
|
|
79
90
|
throw new TypeError('ZLink packet object schema required must contain property names.');
|
|
80
91
|
}
|
|
81
|
-
if (normalizedSchema.additionalProperties !== undefined &&
|
|
92
|
+
if (normalizedSchema.additionalProperties !== undefined &&
|
|
93
|
+
typeof normalizedSchema.additionalProperties !== 'boolean') {
|
|
82
94
|
throw new TypeError('ZLink packet object schema additionalProperties must be boolean.');
|
|
83
95
|
}
|
|
84
96
|
const properties = {};
|
|
@@ -131,7 +143,7 @@ function canonicalContract(value) {
|
|
|
131
143
|
if (typeof value !== 'object' || value === null)
|
|
132
144
|
return JSON.stringify(value);
|
|
133
145
|
return `{${Object.entries(value)
|
|
134
|
-
.sort(([left], [right]) => left < right ? -1 : left > right ? 1 : 0)
|
|
146
|
+
.sort(([left], [right]) => (left < right ? -1 : left > right ? 1 : 0))
|
|
135
147
|
.map(([key, item]) => `${JSON.stringify(key)}:${canonicalContract(item)}`)
|
|
136
148
|
.join(',')}}`;
|
|
137
149
|
}
|