@zlink-systems/framework 0.30.3 → 0.32.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/Actors/ZLinkActor.d.ts +2 -0
- package/dist/contracts/Actors/ZLinkSessionBindingIdentity.d.ts +6 -0
- package/dist/contracts/Actors/ZLinkSessionBindingIdentity.js +2 -0
- package/dist/contracts/Actors/index.d.ts +1 -0
- package/dist/contracts/Actors/index.js +1 -0
- package/dist/contracts/Common/CoreTypes.d.ts +1 -0
- package/dist/contracts/Common/HandlerMessageType.d.ts +8 -0
- package/dist/contracts/Common/HandlerMessageType.js +41 -0
- package/dist/contracts/Common/ZLinkEncodedPayload.d.ts +1 -1
- package/dist/contracts/Common/ZLinkEncodedPayload.js +12 -20
- package/dist/contracts/Common/ZLinkMessage.js +11 -7
- package/dist/contracts/Common/encoded-payload-storage.d.ts +0 -2
- package/dist/contracts/Common/encoded-payload-storage.js +4 -16
- package/dist/contracts/Common/index.d.ts +1 -1
- package/dist/contracts/Common/payload-slab.d.ts +4 -0
- package/dist/contracts/Common/payload-slab.js +30 -0
- package/dist/contracts/Configuration/RegistrationBuilders.js +15 -9
- package/dist/contracts/Configuration/RegistrationTypes.d.ts +19 -0
- package/dist/contracts/Handlers/Contexts.d.ts +1 -0
- package/dist/contracts/Locations/Authority.d.ts +2 -0
- package/dist/internal.d.ts +9 -0
- package/dist/internal.js +23 -1
- package/dist/nest-integration.d.ts +1 -0
- package/dist/nest-integration.js +3 -1
- package/dist/runtime/actors/actor-client.d.ts +6 -2
- package/dist/runtime/actors/actor-client.js +120 -82
- package/dist/runtime/actors/actor-context.js +16 -5
- package/dist/runtime/actors/actor-execution-context.js +2 -2
- package/dist/runtime/actors/actor-handoff.d.ts +12 -1
- package/dist/runtime/actors/actor-handoff.js +79 -34
- package/dist/runtime/actors/actor-join-deferred-scope.js +6 -6
- package/dist/runtime/actors/actor-local-native-join.d.ts +2 -2
- package/dist/runtime/actors/actor-local-native-join.js +19 -17
- package/dist/runtime/actors/actor-mailbox.d.ts +1 -1
- package/dist/runtime/actors/actor-remote-joiner.d.ts +2 -2
- package/dist/runtime/actors/actor-remote-joiner.js +4 -4
- package/dist/runtime/actors/actor-routed-join-transport.d.ts +9 -3
- package/dist/runtime/actors/actor-routed-json-request.d.ts +3 -0
- package/dist/runtime/actors/actor-runtime-contracts.d.ts +2 -2
- package/dist/runtime/actors/actor-runtime-state.d.ts +1 -1
- package/dist/runtime/actors/spot-actor-dispatch.d.ts +9 -5
- package/dist/runtime/actors/spot-actor-dispatch.js +60 -38
- package/dist/runtime/admission.d.ts +6 -4
- package/dist/runtime/admission.js +21 -10
- package/dist/runtime/application-jobs/application-ingress-record-owner.d.ts +1 -0
- package/dist/runtime/application-jobs/application-ingress-record-owner.js +3 -0
- package/dist/runtime/backend/contracts/index.d.ts +26 -10
- package/dist/runtime/backend/mesh-completion-table.d.ts +7 -1
- package/dist/runtime/backend/mesh-completion-table.js +84 -20
- package/dist/runtime/backend/mesh-dispatch-pump.d.ts +19 -6
- package/dist/runtime/backend/mesh-dispatch-pump.js +246 -147
- package/dist/runtime/backend/node/node-backend-adapter-support.d.ts +3 -2
- package/dist/runtime/backend/node/node-backend-adapter-support.js +27 -19
- package/dist/runtime/backend/node/node-dealer-channel-client-transport.d.ts +5 -2
- package/dist/runtime/backend/node/node-dealer-channel-client-transport.js +70 -13
- package/dist/runtime/backend/node/node-event-loop-poller.d.ts +2 -2
- package/dist/runtime/backend/node/node-event-loop-poller.js +4 -3
- package/dist/runtime/backend/node/node-mesh-backend-adapter.js +5 -1
- package/dist/runtime/backend/node/node-raw-binding-port.d.ts +7 -2
- package/dist/runtime/backend/node/node-raw-binding-port.js +99 -63
- package/dist/runtime/backend/node/node-raw-mesh-backend.d.ts +34 -16
- package/dist/runtime/backend/node/node-raw-mesh-backend.js +210 -106
- package/dist/runtime/backend/node/node-socket-backend-adapter.js +20 -6
- package/dist/runtime/backend/raw-binding-port.d.ts +6 -3
- package/dist/runtime/channels/channel-clients.js +3 -3
- package/dist/runtime/channels/channel-dispatch-pipeline.d.ts +11 -7
- package/dist/runtime/channels/channel-dispatch-pipeline.js +40 -22
- package/dist/runtime/channels/channel-dispatch-services.d.ts +3 -1
- package/dist/runtime/channels/channel-dispatch-services.js +7 -6
- package/dist/runtime/channels/channel-dispatchers.d.ts +13 -6
- package/dist/runtime/channels/channel-dispatchers.js +57 -36
- package/dist/runtime/channels/channel-envelope.d.ts +2 -2
- package/dist/runtime/channels/channel-envelope.js +609 -83
- package/dist/runtime/channels/channel-multipart.d.ts +1 -0
- package/dist/runtime/channels/channel-multipart.js +10 -6
- package/dist/runtime/channels/channel-outbound-operations.d.ts +6 -9
- package/dist/runtime/channels/channel-outbound-operations.js +107 -105
- package/dist/runtime/channels/channel-receive-loops.d.ts +9 -7
- package/dist/runtime/channels/channel-receive-loops.js +126 -90
- package/dist/runtime/channels/channel-runtime-lifecycle.d.ts +23 -6
- package/dist/runtime/channels/channel-runtime-lifecycle.js +47 -38
- package/dist/runtime/channels/channel-runtime-manager.d.ts +13 -6
- package/dist/runtime/channels/channel-runtime-manager.js +32 -14
- package/dist/runtime/channels/channel-socket-registry.d.ts +28 -4
- package/dist/runtime/channels/channel-socket-registry.js +9 -1
- package/dist/runtime/channels/channel-transports.d.ts +23 -16
- package/dist/runtime/channels/channel-transports.js +139 -119
- package/dist/runtime/channels/dispatch-error-reporter.d.ts +4 -4
- package/dist/runtime/channels/dispatch-error-reporter.js +5 -5
- package/dist/runtime/channels/fanout-location-runtime.d.ts +1 -1
- package/dist/runtime/channels/local-spot-route-transport.d.ts +5 -2
- package/dist/runtime/channels/local-spot-route-transport.js +15 -18
- package/dist/runtime/channels/router-socket-spot-route-transport.d.ts +6 -3
- package/dist/runtime/channels/router-socket-spot-route-transport.js +33 -19
- package/dist/runtime/channels/source-spot-router.d.ts +6 -3
- package/dist/runtime/channels/source-spot-router.js +34 -23
- package/dist/runtime/channels/spot-node-route-transport.d.ts +6 -3
- package/dist/runtime/channels/spot-node-route-transport.js +23 -17
- package/dist/runtime/channels/spot-route-bridge-transport.d.ts +6 -3
- package/dist/runtime/channels/spot-route-bridge-transport.js +38 -24
- package/dist/runtime/channels/spot-route-dispatch-strategy.d.ts +8 -4
- package/dist/runtime/channels/spot-route-dispatch-strategy.js +36 -23
- package/dist/runtime/diagnostics/dispatch-error-details.js +9 -3
- package/dist/runtime/diagnostics/message-flow-bootstrap.d.ts +1 -0
- package/dist/runtime/diagnostics/message-flow-bootstrap.js +8 -0
- package/dist/runtime/diagnostics/message-flow-delivery.d.ts +47 -0
- package/dist/runtime/diagnostics/message-flow-delivery.js +149 -0
- package/dist/runtime/diagnostics/message-flow-record.d.ts +50 -0
- package/dist/runtime/diagnostics/message-flow-record.js +228 -0
- package/dist/runtime/diagnostics/message-flow-worker.d.ts +1 -0
- package/dist/runtime/diagnostics/message-flow-worker.js +118 -0
- package/dist/runtime/diagnostics/message-flow.d.ts +7 -19
- package/dist/runtime/diagnostics/message-flow.js +42 -290
- package/dist/runtime/diagnostics/runtime-metrics.d.ts +4 -3
- package/dist/runtime/diagnostics/runtime-metrics.js +8 -4
- package/dist/runtime/execution/index.d.ts +1 -0
- package/dist/runtime/execution/index.js +6 -3
- package/dist/runtime/execution/serial-execution-queue.d.ts +26 -13
- package/dist/runtime/execution/serial-execution-queue.js +75 -71
- package/dist/runtime/foundation/durable-service-request.d.ts +12 -3
- package/dist/runtime/foundation/durable-service-request.js +158 -73
- package/dist/runtime/foundation/operation-registry.d.ts +33 -3
- package/dist/runtime/foundation/operation-registry.js +272 -33
- package/dist/runtime/foundation/raw-service-mesh-runtime.d.ts +62 -23
- package/dist/runtime/foundation/raw-service-mesh-runtime.js +373 -194
- package/dist/runtime/foundation/request-runtime.d.ts +17 -0
- package/dist/runtime/foundation/request-runtime.js +163 -0
- package/dist/runtime/foundation/service-discovery-registry.d.ts +4 -0
- package/dist/runtime/foundation/service-discovery-registry.js +6 -0
- package/dist/runtime/foundation/service-liveness-registry.d.ts +1 -1
- package/dist/runtime/foundation/service-mailbox.d.ts +4 -2
- package/dist/runtime/foundation/service-mailbox.js +4 -1
- package/dist/runtime/foundation/service-relocation-object-owner.d.ts +2 -2
- package/dist/runtime/foundation/service-relocation-object-owner.js +12 -5
- package/dist/runtime/foundation/service-runtime-contracts.d.ts +7 -2
- package/dist/runtime/foundation/service-stateful-registry.d.ts +6 -2
- package/dist/runtime/foundation/service-stateful-registry.js +38 -17
- package/dist/runtime/foundation/service-stateful-runtime.d.ts +91 -26
- package/dist/runtime/foundation/service-stateful-runtime.js +245 -120
- package/dist/runtime/foundation/service-stateful-wire-codec.d.ts +3 -0
- package/dist/runtime/foundation/service-stateful-wire-codec.js +15 -0
- package/dist/runtime/foundation/service-topology-registry.d.ts +2 -0
- package/dist/runtime/foundation/service-topology-registry.js +13 -3
- package/dist/runtime/foundation/service-wire-constants.generated.d.ts +1 -0
- package/dist/runtime/foundation/service-wire-constants.generated.js +12 -0
- package/dist/runtime/foundation/service-wire-m6a-codec.d.ts +5 -1
- package/dist/runtime/foundation/service-wire-m6a-codec.js +50 -15
- package/dist/runtime/host/actor-packet-relay.d.ts +5 -6
- package/dist/runtime/host/actor-packet-relay.js +58 -57
- package/dist/runtime/host/actor-placement-coordinator.d.ts +1 -1
- package/dist/runtime/host/actor-runtime-options-factory.d.ts +2 -0
- package/dist/runtime/host/actor-runtime-options-factory.js +3 -2
- package/dist/runtime/host/actor-transfer-runtime.d.ts +3 -3
- package/dist/runtime/host/application-job-queue.d.ts +7 -5
- package/dist/runtime/host/application-job-queue.js +33 -21
- package/dist/runtime/host/bound-session-relay.js +0 -1
- package/dist/runtime/host/channel-runtime-options-factory.d.ts +2 -0
- package/dist/runtime/host/channel-runtime-options-factory.js +1 -0
- package/dist/runtime/host/entry-actor-runtime.d.ts +5 -2
- package/dist/runtime/host/entry-actor-runtime.js +2 -2
- package/dist/runtime/host/index.d.ts +106 -37
- package/dist/runtime/host/index.js +303 -151
- package/dist/runtime/host/location-runtime-owner.d.ts +2 -2
- package/dist/runtime/host/location-runtime-owner.js +1 -1
- package/dist/runtime/host/service-relocation-host-runtime.d.ts +195 -45
- package/dist/runtime/host/service-relocation-host-runtime.js +257 -144
- package/dist/runtime/host/spot-address-transport.d.ts +3 -0
- package/dist/runtime/host/spot-address-transport.js +73 -76
- package/dist/runtime/host/spot-runtime-options-factory.js +2 -0
- package/dist/runtime/host/user-spot-creation-coordinator.d.ts +3 -1
- package/dist/runtime/host/user-spot-creation-coordinator.js +49 -21
- package/dist/runtime/internal-observation.d.ts +1 -0
- package/dist/runtime/internal-observation.js +5 -0
- package/dist/runtime/locations/actor-location-claims.d.ts +1 -1
- package/dist/runtime/locations/actor-location-claims.js +15 -6
- package/dist/runtime/locations/auto-connect-loop.d.ts +0 -1
- package/dist/runtime/locations/auto-connect-loop.js +25 -19
- package/dist/runtime/locations/auto-connect-planner.js +2 -5
- package/dist/runtime/locations/auto-connect-reconciler.d.ts +1 -0
- package/dist/runtime/locations/auto-connect-reconciler.js +35 -23
- package/dist/runtime/locations/in-memory-authority-store.d.ts +1 -0
- package/dist/runtime/locations/in-memory-authority-store.js +15 -5
- package/dist/runtime/locations/in-memory-location-store.d.ts +0 -2
- package/dist/runtime/locations/in-memory-location-store.js +1 -38
- package/dist/runtime/locations/lifecycle.d.ts +1 -1
- package/dist/runtime/locations/lifecycle.js +2 -2
- package/dist/runtime/locations/location-store-repository.d.ts +0 -1
- package/dist/runtime/locations/location-store-repository.js +163 -246
- package/dist/runtime/locations/resolvers.d.ts +8 -1
- package/dist/runtime/locations/resolvers.js +16 -2
- package/dist/runtime/locations/runtime.d.ts +3 -3
- package/dist/runtime/locations/runtime.js +12 -16
- package/dist/runtime/messaging/creation-payload-codec.js +8 -7
- package/dist/runtime/messaging/framework-json-v1.d.ts +1 -1
- package/dist/runtime/messaging/framework-json-v1.js +6 -2
- package/dist/runtime/messaging/payload-codec.js +21 -35
- package/dist/runtime/messaging/request-deadline.d.ts +4 -2
- package/dist/runtime/messaging/request-deadline.js +40 -25
- package/dist/runtime/messaging/request-result.d.ts +14 -1
- package/dist/runtime/messaging/request-result.js +74 -13
- package/dist/runtime/protocol/service_wire_codec.generated.d.ts +4 -0
- package/dist/runtime/protocol/service_wire_codec.generated.js +17 -7
- package/dist/runtime/spots/index.d.ts +28 -7
- package/dist/runtime/spots/index.js +31 -6
- package/dist/runtime/spots/spot-activation-registry.d.ts +3 -2
- package/dist/runtime/spots/spot-activation-registry.js +13 -8
- package/dist/runtime/spots/spot-activation-state.d.ts +2 -0
- package/dist/runtime/spots/spot-activation-state.js +1 -0
- package/dist/runtime/spots/spot-actor-admission-coordinator.d.ts +9 -4
- package/dist/runtime/spots/spot-actor-admission-coordinator.js +33 -12
- package/dist/runtime/spots/spot-actor-ingress-admission.d.ts +40 -0
- package/dist/runtime/spots/spot-actor-ingress-admission.js +78 -0
- package/dist/runtime/spots/spot-actor-membership.js +3 -3
- package/dist/runtime/spots/spot-actor-packet-dispatch.d.ts +16 -43
- package/dist/runtime/spots/spot-actor-packet-dispatch.js +56 -113
- package/dist/runtime/spots/spot-actor-packet-drain.d.ts +1 -0
- package/dist/runtime/spots/spot-actor-packet-drain.js +12 -5
- package/dist/runtime/spots/spot-entry-activation.d.ts +4 -3
- package/dist/runtime/spots/spot-entry-activation.js +7 -12
- package/dist/runtime/spots/spot-handler-registry.d.ts +5 -1
- package/dist/runtime/spots/spot-handler-registry.js +31 -15
- package/dist/runtime/spots/spot-manager-public.js +3 -2
- package/dist/runtime/spots/spot-node-runtime-manager.d.ts +11 -6
- package/dist/runtime/spots/spot-node-runtime-manager.js +6 -1
- package/dist/runtime/spots/spot-outbound.d.ts +8 -2
- package/dist/runtime/spots/spot-outbound.js +5 -5
- package/dist/runtime/spots/spot-route-packet-dispatch.js +13 -8
- package/dist/runtime/spots/spot-routed-spot-packet-dispatch.d.ts +3 -3
- package/dist/runtime/spots/spot-routed-spot-packet-dispatch.js +9 -5
- package/dist/runtime/spots/spot-runtime-ports.d.ts +2 -2
- package/dist/runtime/spots/spot-serial-executor.d.ts +2 -1
- package/dist/runtime/spots/spot-serial-turn-executor.js +20 -26
- package/dist/runtime/spots/spot-subscription-dispatch.js +5 -2
- package/dist/runtime/spots/spot-timer.d.ts +1 -1
- package/dist/runtime/streams/actor-session-binding-registry.d.ts +11 -3
- package/dist/runtime/streams/actor-session-binding-registry.js +28 -0
- package/dist/runtime/streams/bound-actor-relay-sender.d.ts +2 -2
- package/dist/runtime/streams/bound-actor-relay-sender.js +3 -4
- package/dist/runtime/streams/bound-session-service.js +6 -7
- package/dist/runtime/streams/index.d.ts +3 -3
- package/dist/runtime/streams/index.js +22 -2
- package/dist/runtime/streams/managed-stream.js +2 -1
- package/dist/runtime/streams/session-calls.d.ts +1 -1
- package/dist/runtime/streams/session-calls.js +3 -9
- package/dist/runtime/streams/session-context.d.ts +2 -2
- package/dist/runtime/streams/session-context.js +2 -2
- package/dist/runtime/streams/stream-session-runtime.d.ts +1 -0
- package/dist/runtime/streams/stream-session-runtime.js +64 -33
- package/package.json +3 -3
- package/src/contracts/Actors/ZLinkActor.ts +6 -0
- package/src/contracts/Actors/ZLinkSessionBindingIdentity.ts +7 -0
- package/src/contracts/Actors/index.ts +1 -0
- package/src/contracts/Common/CoreTypes.ts +1 -0
- package/src/contracts/Common/HandlerMessageType.ts +50 -0
- package/src/contracts/Common/ZLinkEncodedPayload.ts +13 -25
- package/src/contracts/Common/ZLinkMessage.ts +11 -7
- package/src/contracts/Common/encoded-payload-storage.ts +4 -16
- package/src/contracts/Common/index.ts +1 -1
- package/src/contracts/Common/payload-slab.ts +29 -0
- package/src/contracts/Configuration/RegistrationBuilders.ts +29 -15
- package/src/contracts/Configuration/RegistrationTypes.ts +19 -0
- package/src/contracts/Handlers/Contexts.ts +1 -0
- package/src/contracts/Locations/Authority.ts +7 -1
- package/src/internal.ts +17 -0
- package/src/nest-integration.ts +1 -0
- package/src/runtime/actors/actor-client.ts +257 -163
- package/src/runtime/actors/actor-context.ts +26 -14
- package/src/runtime/actors/actor-execution-context.ts +2 -2
- package/src/runtime/actors/actor-handoff.ts +86 -51
- package/src/runtime/actors/actor-join-deferred-scope.ts +6 -6
- package/src/runtime/actors/actor-local-native-join.ts +38 -17
- package/src/runtime/actors/actor-mailbox.ts +1 -1
- package/src/runtime/actors/actor-remote-joiner.ts +8 -4
- package/src/runtime/actors/actor-routed-join-transport.ts +13 -5
- package/src/runtime/actors/actor-routed-json-request.ts +3 -0
- package/src/runtime/actors/actor-runtime-contracts.ts +4 -2
- package/src/runtime/actors/actor-runtime-state.ts +1 -1
- package/src/runtime/actors/spot-actor-dispatch.ts +70 -68
- package/src/runtime/admission.ts +42 -15
- package/src/runtime/application-jobs/application-ingress-record-owner.ts +4 -0
- package/src/runtime/backend/contracts/index.ts +77 -10
- package/src/runtime/backend/mesh-completion-table.ts +106 -15
- package/src/runtime/backend/mesh-dispatch-pump.ts +294 -146
- package/src/runtime/backend/node/node-backend-adapter-support.ts +42 -32
- package/src/runtime/backend/node/node-dealer-channel-client-transport.ts +91 -34
- package/src/runtime/backend/node/node-event-loop-poller.ts +14 -5
- package/src/runtime/backend/node/node-mesh-backend-adapter.ts +5 -1
- package/src/runtime/backend/node/node-raw-binding-port.ts +180 -69
- package/src/runtime/backend/node/node-raw-mesh-backend.ts +386 -157
- package/src/runtime/backend/node/node-socket-backend-adapter.ts +56 -11
- package/src/runtime/backend/raw-binding-port.ts +13 -5
- package/src/runtime/channels/channel-clients.ts +26 -11
- package/src/runtime/channels/channel-dispatch-pipeline.ts +77 -65
- package/src/runtime/channels/channel-dispatch-services.ts +7 -12
- package/src/runtime/channels/channel-dispatchers.ts +93 -39
- package/src/runtime/channels/channel-envelope.ts +680 -144
- package/src/runtime/channels/channel-multipart.ts +17 -13
- package/src/runtime/channels/channel-outbound-operations.ts +204 -178
- package/src/runtime/channels/channel-receive-loops.ts +160 -107
- package/src/runtime/channels/channel-runtime-lifecycle.ts +64 -59
- package/src/runtime/channels/channel-runtime-manager.ts +74 -27
- package/src/runtime/channels/channel-socket-registry.ts +20 -5
- package/src/runtime/channels/channel-transports.ts +414 -287
- package/src/runtime/channels/dispatch-error-reporter.ts +4 -9
- package/src/runtime/channels/local-spot-route-transport.ts +27 -29
- package/src/runtime/channels/router-socket-spot-route-transport.ts +63 -32
- package/src/runtime/channels/source-spot-router.ts +75 -38
- package/src/runtime/channels/spot-node-route-transport.ts +67 -37
- package/src/runtime/channels/spot-route-bridge-transport.ts +62 -30
- package/src/runtime/channels/spot-route-dispatch-strategy.ts +105 -34
- package/src/runtime/diagnostics/dispatch-error-details.ts +10 -2
- package/src/runtime/diagnostics/message-flow-bootstrap.ts +6 -0
- package/src/runtime/diagnostics/message-flow-delivery.ts +171 -0
- package/src/runtime/diagnostics/message-flow-record.ts +295 -0
- package/src/runtime/diagnostics/message-flow-worker.ts +146 -0
- package/src/runtime/diagnostics/message-flow.ts +49 -362
- package/src/runtime/diagnostics/runtime-metrics.ts +10 -4
- package/src/runtime/execution/index.ts +6 -0
- package/src/runtime/execution/serial-execution-queue.ts +94 -96
- package/src/runtime/foundation/durable-service-request.ts +212 -89
- package/src/runtime/foundation/operation-registry.ts +287 -38
- package/src/runtime/foundation/raw-service-mesh-runtime.ts +617 -292
- package/src/runtime/foundation/request-runtime.ts +227 -0
- package/src/runtime/foundation/service-discovery-registry.ts +7 -0
- package/src/runtime/foundation/service-liveness-registry.ts +1 -1
- package/src/runtime/foundation/service-mailbox.ts +7 -2
- package/src/runtime/foundation/service-relocation-object-owner.ts +21 -6
- package/src/runtime/foundation/service-runtime-contracts.ts +12 -2
- package/src/runtime/foundation/service-stateful-registry.ts +52 -19
- package/src/runtime/foundation/service-stateful-runtime.ts +365 -198
- package/src/runtime/foundation/service-stateful-wire-codec.ts +18 -0
- package/src/runtime/foundation/service-topology-registry.ts +21 -3
- package/src/runtime/foundation/service-wire-constants.generated.ts +10 -0
- package/src/runtime/foundation/service-wire-m6a-codec.ts +69 -17
- package/src/runtime/host/actor-packet-relay.ts +160 -156
- package/src/runtime/host/actor-placement-coordinator.ts +1 -1
- package/src/runtime/host/actor-runtime-options-factory.ts +7 -2
- package/src/runtime/host/actor-transfer-runtime.ts +3 -3
- package/src/runtime/host/application-job-queue.ts +56 -27
- package/src/runtime/host/bound-session-relay.ts +0 -1
- package/src/runtime/host/channel-runtime-options-factory.ts +3 -0
- package/src/runtime/host/entry-actor-runtime.ts +14 -6
- package/src/runtime/host/index.ts +388 -113
- package/src/runtime/host/location-runtime-owner.ts +3 -3
- package/src/runtime/host/service-relocation-host-runtime.ts +380 -252
- package/src/runtime/host/spot-address-transport.ts +110 -95
- package/src/runtime/host/spot-runtime-options-factory.ts +3 -0
- package/src/runtime/host/user-spot-creation-coordinator.ts +69 -22
- package/src/runtime/internal-observation.ts +2 -0
- package/src/runtime/locations/actor-location-claims.ts +42 -16
- package/src/runtime/locations/auto-connect-loop.ts +24 -16
- package/src/runtime/locations/auto-connect-planner.ts +2 -5
- package/src/runtime/locations/auto-connect-reconciler.ts +37 -24
- package/src/runtime/locations/in-memory-authority-store.ts +27 -7
- package/src/runtime/locations/in-memory-location-store.ts +1 -74
- package/src/runtime/locations/lifecycle.ts +4 -2
- package/src/runtime/locations/location-store-repository.ts +228 -308
- package/src/runtime/locations/resolvers.ts +20 -8
- package/src/runtime/locations/runtime.ts +16 -28
- package/src/runtime/messaging/creation-payload-codec.ts +12 -10
- package/src/runtime/messaging/framework-json-v1.ts +10 -1
- package/src/runtime/messaging/payload-codec.ts +50 -75
- package/src/runtime/messaging/request-deadline.ts +47 -39
- package/src/runtime/messaging/request-result.ts +88 -17
- package/src/runtime/protocol/service_wire_codec.generated.ts +18 -8
- package/src/runtime/protocol/service_wire_pilot_codec.generated.ts +1 -1
- package/src/runtime/spots/index.ts +57 -10
- package/src/runtime/spots/spot-activation-registry.ts +12 -8
- package/src/runtime/spots/spot-activation-state.ts +2 -0
- package/src/runtime/spots/spot-actor-admission-coordinator.ts +62 -37
- package/src/runtime/spots/spot-actor-ingress-admission.ts +157 -0
- package/src/runtime/spots/spot-actor-membership.ts +8 -5
- package/src/runtime/spots/spot-actor-packet-dispatch.ts +122 -206
- package/src/runtime/spots/spot-actor-packet-drain.ts +21 -6
- package/src/runtime/spots/spot-entry-activation.ts +25 -35
- package/src/runtime/spots/spot-handler-registry.ts +72 -15
- package/src/runtime/spots/spot-manager-public.ts +4 -2
- package/src/runtime/spots/spot-node-runtime-manager.ts +16 -7
- package/src/runtime/spots/spot-outbound.ts +26 -10
- package/src/runtime/spots/spot-route-packet-dispatch.ts +18 -8
- package/src/runtime/spots/spot-routed-spot-packet-dispatch.ts +14 -8
- package/src/runtime/spots/spot-runtime-ports.ts +5 -2
- package/src/runtime/spots/spot-serial-executor.ts +1 -1
- package/src/runtime/spots/spot-serial-turn-executor.ts +25 -40
- package/src/runtime/spots/spot-subscription-dispatch.ts +9 -2
- package/src/runtime/spots/spot-timer.ts +1 -1
- package/src/runtime/streams/actor-session-binding-registry.ts +46 -3
- package/src/runtime/streams/bound-actor-relay-sender.ts +16 -5
- package/src/runtime/streams/bound-session-service.ts +10 -7
- package/src/runtime/streams/index.ts +30 -4
- package/src/runtime/streams/managed-stream.ts +2 -1
- package/src/runtime/streams/session-calls.ts +9 -14
- package/src/runtime/streams/session-context.ts +6 -11
- package/src/runtime/streams/stream-session-runtime.ts +79 -40
- package/dist/runtime/spots/spot-lifecycle-metrics.d.ts +0 -8
- package/dist/runtime/spots/spot-lifecycle-metrics.js +0 -17
- package/src/runtime/spots/spot-lifecycle-metrics.ts +0 -16
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.DefaultZLinkActorClient = void 0;
|
|
4
|
+
const request_runtime_1 = require("../foundation/request-runtime");
|
|
4
5
|
const node_buffer_1 = require("node:buffer");
|
|
5
6
|
const channel_envelope_1 = require("../channels/channel-envelope");
|
|
6
7
|
const routing_id_1 = require("../routing-id");
|
|
@@ -23,11 +24,12 @@ const protocol_1 = require("../streams/protocol");
|
|
|
23
24
|
const actor_execution_context_1 = require("./actor-execution-context");
|
|
24
25
|
const actor_message_follow_context_1 = require("./actor-message-follow-context");
|
|
25
26
|
const actor_packet_relay_wire_1 = require("./actor-packet-relay-wire");
|
|
26
|
-
const actor_routed_json_request_1 = require("./actor-routed-json-request");
|
|
27
27
|
class DefaultZLinkActorClient {
|
|
28
28
|
options;
|
|
29
|
+
requests;
|
|
29
30
|
constructor(options) {
|
|
30
31
|
this.options = options;
|
|
32
|
+
this.requests = options.requests ?? new request_runtime_1.RequestRuntime();
|
|
31
33
|
}
|
|
32
34
|
sendToActor(actorId, message) {
|
|
33
35
|
requireActorId(actorId);
|
|
@@ -40,11 +42,13 @@ class DefaultZLinkActorClient {
|
|
|
40
42
|
async send(actorId, explicitPacketName, message, metadata) {
|
|
41
43
|
const route = await this.resolveActorRoute(actorId);
|
|
42
44
|
const { meshName, actorRef: actor } = route;
|
|
43
|
-
this.throwIfKnownStale(
|
|
45
|
+
this.throwIfKnownStale(route);
|
|
44
46
|
const parts = this.createPacketParts(protocol_1.ZLinkStreamMessageKind.Send, undefined, explicitPacketName, message, metadata);
|
|
45
|
-
|
|
46
|
-
const routedActor = (0, actor_message_follow_context_1.attachActorMessageFollowContext)(actor, messageFollow);
|
|
47
|
+
let routeFence;
|
|
47
48
|
try {
|
|
49
|
+
const messageFollow = createActorMessageFollowContext(route, parts, false);
|
|
50
|
+
routeFence = actorRouteInvalidationFence(route);
|
|
51
|
+
const routedActor = (0, actor_message_follow_context_1.attachActorMessageFollowContext)(actor, messageFollow);
|
|
48
52
|
const submissionCopies = (await this.options.transportDeliveryGate?.()?.waitBeforeSubmit(actorId, 'oneWay')) ?? 1;
|
|
49
53
|
const handoff = this.options.handoffCapture?.(meshName, actor.actorId, parts, false, routedActor);
|
|
50
54
|
if (handoff !== undefined) {
|
|
@@ -74,75 +78,76 @@ class DefaultZLinkActorClient {
|
|
|
74
78
|
return await this.submitActorSend(meshName, toBackendActorRef(actor), parts, route);
|
|
75
79
|
}
|
|
76
80
|
catch (error) {
|
|
77
|
-
|
|
78
|
-
this.invalidateActorRoute(actorId);
|
|
79
|
-
this.options.staleActorRefReporter?.(meshName, actor.actorId);
|
|
80
|
-
throw actorLocationStale(actor.actorId, error);
|
|
81
|
-
}
|
|
82
|
-
throw error;
|
|
81
|
+
throw this.mapActorFailure(actorId, error, routeFence, meshName);
|
|
83
82
|
}
|
|
84
83
|
finally {
|
|
85
84
|
closeMessages(parts);
|
|
86
85
|
}
|
|
87
86
|
}
|
|
88
|
-
|
|
87
|
+
request(actorId, explicitPacketName, request, timeoutMs, metadata, signal, waitPolicy = 'async', onAdmitted) {
|
|
89
88
|
(0, abort_1.throwIfAborted)(signal);
|
|
90
89
|
const sourceSpotId = (0, actor_execution_context_1.currentZLinkActorExecution)()?.spotId ?? (0, execution_1.currentZLinkSpotSerialSourceId)();
|
|
91
90
|
const effectiveTimeoutMs = timeoutMs ?? this.options.defaultRequestTimeoutMs;
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
const parts = this.createPacketParts(protocol_1.ZLinkStreamMessageKind.Request, requestSequence === 0n ? 1n : requestSequence, explicitPacketName, request, mergeActorRequestMetadata(metadata, deadlineUnixMs), correlationId);
|
|
106
|
-
const messageFollow = createActorMessageFollowContext(route, parts, true, deadlineUnixMs, correlationId, operationId);
|
|
107
|
-
const routedActor = (0, actor_message_follow_context_1.attachActorMessageFollowContext)(actor, messageFollow);
|
|
108
|
-
try {
|
|
109
|
-
const delivery = this.options
|
|
110
|
-
.transportDeliveryGate?.()
|
|
111
|
-
?.waitBeforeSubmit(actorId, 'request', signal);
|
|
112
|
-
const submissionCopies = delivery === undefined
|
|
113
|
-
? 1
|
|
114
|
-
: ((await (0, actor_request_deadline_1.waitActorReply)(delivery, actorId, deadlineMs, signal)) ?? 1);
|
|
115
|
-
const handoff = this.options.handoffCapture?.(meshName, actor.actorId, parts, true, routedActor, deadlineUnixMs, onAdmitted);
|
|
116
|
-
if (handoff !== undefined) {
|
|
117
|
-
const submissions = [handoff];
|
|
118
|
-
for (let copy = 1; copy < submissionCopies; copy++) {
|
|
119
|
-
const duplicate = this.options.handoffCapture?.(meshName, actor.actorId, parts, true, routedActor, deadlineUnixMs, onAdmitted);
|
|
120
|
-
if (duplicate !== undefined)
|
|
121
|
-
submissions.push(duplicate);
|
|
91
|
+
let meshName;
|
|
92
|
+
let routeFence;
|
|
93
|
+
return this.requests.prepare(effectiveTimeoutMs, signal, (requestOperation, receiver) => {
|
|
94
|
+
void (async () => {
|
|
95
|
+
const deadlineMs = requestOperation.deadlineMs;
|
|
96
|
+
const deadlineUnixMs = effectiveTimeoutMs === undefined ? undefined : Date.now() + effectiveTimeoutMs;
|
|
97
|
+
const route = await this.resolveActorRoute(actorId, signal, deadlineMs, requestOperation);
|
|
98
|
+
if (!requestOperation.isPending())
|
|
99
|
+
return;
|
|
100
|
+
if (waitPolicy === 'async' &&
|
|
101
|
+
sourceSpotId !== undefined &&
|
|
102
|
+
sameSpotRoute(sourceSpotId, route)) {
|
|
103
|
+
throw (0, framework_errors_internal_1.createInternalFrameworkException)(framework_errors_internal_1.ZLinkFrameworkInternalErrorKind.InvalidOperation, `An Actor request cannot await Actor '${actorId}' on the current Spot while holding its execution claim.`);
|
|
122
104
|
}
|
|
123
|
-
const
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
105
|
+
const { actorRef: actor } = route;
|
|
106
|
+
meshName = route.meshName;
|
|
107
|
+
if (this.options.staleActorRefPredicate?.(meshName, actor) === true) {
|
|
108
|
+
routeFence = actorRouteInvalidationFence(route);
|
|
109
|
+
throw actorLocationStale(actor.actorId, undefined);
|
|
110
|
+
}
|
|
111
|
+
const operationId = (0, actor_message_follow_context_1.createMessageFollowId)();
|
|
112
|
+
const correlationId = (0, actor_message_follow_context_1.createMessageFollowId)();
|
|
113
|
+
const requestSequence = BigInt(`0x${operationId.slice(16)}`);
|
|
114
|
+
const parts = this.createPacketParts(protocol_1.ZLinkStreamMessageKind.Request, requestSequence === 0n ? 1n : requestSequence, explicitPacketName, request, mergeActorRequestMetadata(metadata, deadlineUnixMs), correlationId);
|
|
115
|
+
try {
|
|
116
|
+
const messageFollow = createActorMessageFollowContext(route, parts, true, deadlineUnixMs, correlationId, operationId);
|
|
117
|
+
routeFence = actorRouteInvalidationFence(route);
|
|
118
|
+
const routedActor = (0, actor_message_follow_context_1.attachActorMessageFollowContext)(actor, messageFollow);
|
|
119
|
+
const delivery = this.options
|
|
120
|
+
.transportDeliveryGate?.()
|
|
121
|
+
?.waitBeforeSubmit(actorId, 'request', signal);
|
|
122
|
+
const submissionCopies = delivery === undefined
|
|
123
|
+
? 1
|
|
124
|
+
: ((await (0, actor_request_deadline_1.waitActorReply)(delivery, actorId, requestOperation)) ?? 1);
|
|
125
|
+
const handoff = this.options.handoffCapture?.(meshName, actor.actorId, parts, true, routedActor, deadlineUnixMs, onAdmitted, requestOperation);
|
|
126
|
+
if (handoff !== undefined) {
|
|
127
|
+
const submissions = [handoff];
|
|
128
|
+
for (let copy = 1; copy < submissionCopies; copy++) {
|
|
129
|
+
const duplicate = this.options.handoffCapture?.(meshName, actor.actorId, parts, true, routedActor, deadlineUnixMs, onAdmitted, requestOperation);
|
|
130
|
+
if (duplicate !== undefined)
|
|
131
|
+
submissions.push(duplicate);
|
|
132
|
+
}
|
|
133
|
+
const replies = await Promise.all(submissions);
|
|
134
|
+
receiver.operationCompleted(requestOperation.id, replies[0], undefined);
|
|
135
|
+
return;
|
|
136
|
+
}
|
|
137
|
+
this.submitActorRequest(meshName, toBackendActorRef(actor), parts, (0, actor_request_deadline_1.remainingActorRequestTimeout)(actorId, deadlineMs), signal, route, messageFollow, onAdmitted, requestOperation, receiver);
|
|
138
|
+
}
|
|
139
|
+
finally {
|
|
140
|
+
closeMessages(parts);
|
|
141
|
+
}
|
|
142
|
+
})().catch((error) => receiver.operationFailed(requestOperation.id, error, undefined));
|
|
143
|
+
}, (value) => value, (error) => this.mapActorFailure(actorId, error, routeFence, meshName));
|
|
139
144
|
}
|
|
140
|
-
async resolveActorRoute(actorId, signal, deadlineMs) {
|
|
145
|
+
async resolveActorRoute(actorId, signal, deadlineMs, requestOperation) {
|
|
141
146
|
const resolver = this.options.locationResolver();
|
|
142
147
|
if (resolver === undefined) {
|
|
143
148
|
throw (0, framework_errors_internal_1.createInternalFrameworkException)(framework_errors_internal_1.ZLinkFrameworkInternalErrorKind.InvalidConfiguration, 'Actor direct messaging requires a Location Store.');
|
|
144
149
|
}
|
|
145
|
-
const resolution = await resolver.resolveDirectActorRoute(actorId, signal, deadlineMs);
|
|
150
|
+
const resolution = await resolver.resolveDirectActorRoute(actorId, signal, deadlineMs, requestOperation);
|
|
146
151
|
if (resolution.kind === 'missing') {
|
|
147
152
|
throw (0, framework_errors_internal_1.createInternalFrameworkException)(framework_errors_internal_1.ZLinkFrameworkInternalErrorKind.ActorRouteNotFound, `Actor route '${actorId}' was not found.`);
|
|
148
153
|
}
|
|
@@ -151,15 +156,21 @@ class DefaultZLinkActorClient {
|
|
|
151
156
|
}
|
|
152
157
|
return resolution.route;
|
|
153
158
|
}
|
|
154
|
-
|
|
155
|
-
|
|
159
|
+
mapActorFailure(actorId, error, routeFence, meshName) {
|
|
160
|
+
if (!isStaleActorError(error))
|
|
161
|
+
return error;
|
|
162
|
+
const resolver = this.options.locationResolver();
|
|
163
|
+
if (routeFence !== undefined && resolver !== undefined)
|
|
164
|
+
resolver.invalidateActorRouteIfMatches(routeFence);
|
|
165
|
+
if (meshName !== undefined)
|
|
166
|
+
this.options.staleActorRefReporter?.(meshName, actorId);
|
|
167
|
+
return actorLocationStale(actorId, error);
|
|
156
168
|
}
|
|
157
|
-
throwIfKnownStale(
|
|
169
|
+
throwIfKnownStale(route) {
|
|
170
|
+
const { meshName, actorRef: actor } = route;
|
|
158
171
|
if (this.options.staleActorRefPredicate?.(meshName, actor) !== true)
|
|
159
172
|
return;
|
|
160
|
-
this.
|
|
161
|
-
this.options.staleActorRefReporter?.(meshName, actor.actorId);
|
|
162
|
-
throw actorLocationStale(actor.actorId, undefined);
|
|
173
|
+
throw this.mapActorFailure(actor.actorId, actorLocationStale(actor.actorId, undefined), actorRouteInvalidationFence(route), meshName);
|
|
163
174
|
}
|
|
164
175
|
createPacketParts(kind, requestSeq, explicitPacketName, message, metadata, correlationId) {
|
|
165
176
|
const packetName = (0, packet_name_1.resolveFrameworkPacketName)(message, explicitPacketName, 'Actor');
|
|
@@ -208,7 +219,7 @@ class DefaultZLinkActorClient {
|
|
|
208
219
|
throw mapSubmitError(error, 'Actor send');
|
|
209
220
|
}
|
|
210
221
|
}
|
|
211
|
-
|
|
222
|
+
submitActorRequest(meshName, actor, parts, timeoutMs, signal, route, messageFollowContext, onAdmitted, requestOperation, destination) {
|
|
212
223
|
const node = this.requireNode(meshName);
|
|
213
224
|
if (this.options.routeTransport !== undefined &&
|
|
214
225
|
!(0, routing_id_1.routingIdsEqual)(node.status().routingId, actor.nodeRid)) {
|
|
@@ -231,29 +242,46 @@ class DefaultZLinkActorClient {
|
|
|
231
242
|
returnResponse: true,
|
|
232
243
|
messageFollowContext
|
|
233
244
|
});
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
245
|
+
this.options.routeTransport.requestToSpot(remoteActorRouteTarget(route), relay, {
|
|
246
|
+
packetName: actor_packet_relay_wire_1.ZLINK_REMOTE_ACTOR_PACKET_RELAY_PACKET,
|
|
247
|
+
timeoutMs,
|
|
248
|
+
signal,
|
|
249
|
+
onAdmitted,
|
|
250
|
+
requestOperation
|
|
251
|
+
}, {
|
|
252
|
+
operationCompleted: (id, value) => {
|
|
253
|
+
const reply = value;
|
|
254
|
+
if (reply.ok !== true) {
|
|
255
|
+
destination.operationFailed(id, (0, framework_errors_internal_1.createInternalFrameworkException)(remoteRelayErrorKind(reply.errorKind), typeof reply.error === 'string'
|
|
256
|
+
? reply.error
|
|
257
|
+
: `Remote Actor request failed for '${actor.actorId}'.`), undefined);
|
|
258
|
+
return;
|
|
259
|
+
}
|
|
260
|
+
destination.operationCompleted(id, reply.response, undefined);
|
|
261
|
+
},
|
|
262
|
+
operationFailed: (id, error) => destination.operationFailed(id, error, undefined)
|
|
263
|
+
});
|
|
264
|
+
return;
|
|
241
265
|
}
|
|
242
266
|
const completions = this.options.completionTableProvider(meshName);
|
|
243
267
|
if (completions === undefined) {
|
|
244
268
|
throw routeNotConnected('Actor request requires a running MeshNode completion table.');
|
|
245
269
|
}
|
|
246
|
-
const
|
|
270
|
+
const packetName = (0, protocol_1.decodeStreamHeader)(parts[0].data()).name;
|
|
271
|
+
this.requests.run(requestOperation, (receiver) => completions.submit((completion) => node.requestToActor(actor, toMessageLikeParts(parts), {
|
|
247
272
|
flags: runtime_values_1.ZLINK_BACKEND_SEND_NONE,
|
|
248
273
|
routeFence: nativeActorRouteFence(route, actor),
|
|
249
274
|
timeoutMs,
|
|
250
|
-
onAdmitted
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
275
|
+
onAdmitted,
|
|
276
|
+
requestOperation
|
|
277
|
+
}, completion), signal, requestOperation, receiver), (raw) => {
|
|
278
|
+
const completion = raw;
|
|
279
|
+
if (completion.terminalResult !== runtime_values_1.RequestResult.Ok) {
|
|
280
|
+
(0, backend_1.closeMeshCompletion)(completion);
|
|
281
|
+
throw mapRequestResult(completion.terminalResult, completion.failureErrno, 'Actor request');
|
|
282
|
+
}
|
|
283
|
+
return decodeActorReply(completion.parts, this.options.messageSerializers, packetName);
|
|
284
|
+
}, request_result_1.identityRequestReply, destination);
|
|
257
285
|
}
|
|
258
286
|
requireNode(meshName) {
|
|
259
287
|
const node = this.options.nodeProvider(meshName);
|
|
@@ -272,6 +300,16 @@ function nativeActorRouteFence(route, actor) {
|
|
|
272
300
|
ownerLeaseGeneration: route.ownerLeaseGeneration
|
|
273
301
|
};
|
|
274
302
|
}
|
|
303
|
+
function actorRouteInvalidationFence(route) {
|
|
304
|
+
return {
|
|
305
|
+
actorId: route.actorRef.actorId,
|
|
306
|
+
objectGeneration: route.actorRef.objectGeneration,
|
|
307
|
+
targetNodeRid: route.actorRef.nodeRid,
|
|
308
|
+
targetNodeGeneration: route.ownerNodeGeneration,
|
|
309
|
+
authorityOwnerGeneration: route.authorityOwnerGeneration,
|
|
310
|
+
ownerLeaseGeneration: route.ownerLeaseGeneration
|
|
311
|
+
};
|
|
312
|
+
}
|
|
275
313
|
function remoteActorRouteTarget(route) {
|
|
276
314
|
if (route.enclosingSpotRoute !== undefined) {
|
|
277
315
|
return route.enclosingSpotRoute;
|
|
@@ -403,7 +441,7 @@ class DefaultZLinkActorRequestCall {
|
|
|
403
441
|
yield(signal) {
|
|
404
442
|
this.rejectSelfActorRequest();
|
|
405
443
|
const turn = (0, execution_1.requireZLinkYieldTurn)(this.turn);
|
|
406
|
-
const pending = this.execute('yield', signal);
|
|
444
|
+
const pending = (0, request_result_1.mapZLinkRequestReply)(this.execute('yield', signal));
|
|
407
445
|
return turn.yieldFrameworkPromise(pending);
|
|
408
446
|
}
|
|
409
447
|
execute(waitPolicy, signal, onAdmitted) {
|
|
@@ -85,7 +85,18 @@ class DefaultZLinkActorContext {
|
|
|
85
85
|
async [exports.ZLINK_ACTOR_JOIN_ENTRY_SPOT_RUNTIME](nodeRid, request, signal) {
|
|
86
86
|
const requestMessage = encodeJoinRequest(request, this.messageSerializers);
|
|
87
87
|
try {
|
|
88
|
-
|
|
88
|
+
const result = await this.requireJoinCoordinator().joinEntrySpot(this.requireActor(), this.state, nodeRid, requestMessage, undefined, signal);
|
|
89
|
+
try {
|
|
90
|
+
if (result.sourceCleanup !== undefined) {
|
|
91
|
+
await result.sourceCleanup();
|
|
92
|
+
return result.accepted;
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
finally {
|
|
96
|
+
result.reply?.close();
|
|
97
|
+
}
|
|
98
|
+
await result.finalizeDeferredJoin?.();
|
|
99
|
+
return result.accepted;
|
|
89
100
|
}
|
|
90
101
|
finally {
|
|
91
102
|
requestMessage.close();
|
|
@@ -172,7 +183,7 @@ class DefaultZLinkActorJoinSpotCall {
|
|
|
172
183
|
// handler terminal. Target admission starts before reply encoding,
|
|
173
184
|
// while completion and finalization remain in execute().
|
|
174
185
|
this.coordinator.beginDeferredJoin?.(this.actor, this.state);
|
|
175
|
-
pendingJoin = this.coordinator.joinSpot(this.actor, this.state, this.spotId, requestMessage, remainingJoinTimeout(deadline.atMs), deadline.signal, operationId);
|
|
186
|
+
pendingJoin = this.coordinator.joinSpot(this.actor, this.state, this.spotId, requestMessage, remainingJoinTimeout(deadline.atMs), deadline.signal, operationId, deadline.atMs);
|
|
176
187
|
if (this.turn === undefined) {
|
|
177
188
|
await pendingJoin.catch(() => undefined);
|
|
178
189
|
}
|
|
@@ -187,7 +198,7 @@ class DefaultZLinkActorJoinSpotCall {
|
|
|
187
198
|
let result;
|
|
188
199
|
try {
|
|
189
200
|
const pending = pendingJoin ??
|
|
190
|
-
this.coordinator.joinSpot(this.actor, this.state, this.spotId, requestMessage, remainingJoinTimeout(deadline.atMs), deadline.signal, operationId);
|
|
201
|
+
this.coordinator.joinSpot(this.actor, this.state, this.spotId, requestMessage, remainingJoinTimeout(deadline.atMs), deadline.signal, operationId, deadline.atMs);
|
|
191
202
|
result =
|
|
192
203
|
this.turn === undefined
|
|
193
204
|
? await pending
|
|
@@ -309,7 +320,7 @@ class DefaultZLinkActorJoinEntrySpotCall {
|
|
|
309
320
|
this.state.endDeferredJoin();
|
|
310
321
|
try {
|
|
311
322
|
this.coordinator.beginDeferredJoin?.(this.actor, this.state);
|
|
312
|
-
pendingJoin = this.coordinator.joinEntrySpot(this.actor, this.state, undefined, requestMessage, remainingJoinTimeout(deadline.atMs), deadline.signal, operationId);
|
|
323
|
+
pendingJoin = this.coordinator.joinEntrySpot(this.actor, this.state, undefined, requestMessage, remainingJoinTimeout(deadline.atMs), deadline.signal, operationId, deadline.atMs);
|
|
313
324
|
if (this.turn === undefined) {
|
|
314
325
|
await pendingJoin.catch(() => undefined);
|
|
315
326
|
}
|
|
@@ -324,7 +335,7 @@ class DefaultZLinkActorJoinEntrySpotCall {
|
|
|
324
335
|
let result;
|
|
325
336
|
try {
|
|
326
337
|
const pending = pendingJoin ??
|
|
327
|
-
this.coordinator.joinEntrySpot(this.actor, this.state, undefined, requestMessage, remainingJoinTimeout(deadline.atMs), deadline.signal, operationId);
|
|
338
|
+
this.coordinator.joinEntrySpot(this.actor, this.state, undefined, requestMessage, remainingJoinTimeout(deadline.atMs), deadline.signal, operationId, deadline.atMs);
|
|
328
339
|
result =
|
|
329
340
|
this.turn === undefined
|
|
330
341
|
? await pending
|
|
@@ -5,9 +5,9 @@ exports.currentZLinkActorExecution = currentZLinkActorExecution;
|
|
|
5
5
|
const node_async_hooks_1 = require("node:async_hooks");
|
|
6
6
|
const actorExecutionStorage = new node_async_hooks_1.AsyncLocalStorage();
|
|
7
7
|
/** Runs one Actor handler while retaining its Actor FIFO claim across Yield. */
|
|
8
|
-
|
|
8
|
+
function runZLinkActorExecution(actorId, spotId, operation) {
|
|
9
9
|
const context = { actorId, spotId, active: true };
|
|
10
|
-
return
|
|
10
|
+
return actorExecutionStorage.run(context, async () => {
|
|
11
11
|
try {
|
|
12
12
|
return await operation();
|
|
13
13
|
}
|
|
@@ -1,3 +1,6 @@
|
|
|
1
|
+
import { RequestRuntime } from '../foundation/request-runtime';
|
|
2
|
+
import type { PendingOperation } from '../foundation/operation-registry';
|
|
3
|
+
import { inspectRuntime } from '../internal-observation';
|
|
1
4
|
import { type ActorRef, type RoutingId } from '../../contracts';
|
|
2
5
|
import type { Message } from '../../contracts/Common/Message';
|
|
3
6
|
import type { ApplicationJobOrigin } from '../application-jobs/contracts';
|
|
@@ -10,6 +13,7 @@ import type { ZLinkRemoteBoundSessionTarget } from './actor-runtime-state';
|
|
|
10
13
|
export declare const DEFAULT_MESSAGE_FOLLOW_DURATION_MS: number;
|
|
11
14
|
export declare const RELOCATED_REQUEST_OWNED_BY_REQUESTER: unique symbol;
|
|
12
15
|
export interface ZLinkActorHandoffPacket {
|
|
16
|
+
requestOperation?: PendingOperation<unknown>;
|
|
13
17
|
readonly index: number;
|
|
14
18
|
readonly header: string;
|
|
15
19
|
readonly payload: string;
|
|
@@ -84,6 +88,7 @@ interface ReplySourceEvidence {
|
|
|
84
88
|
readonly authorityOwnerGeneration: bigint;
|
|
85
89
|
}
|
|
86
90
|
export interface ZLinkActorHandoffCoordinatorOptions {
|
|
91
|
+
readonly requests?: RequestRuntime;
|
|
87
92
|
readonly routedTransport: ZLinkActorRoutedJoinTransport;
|
|
88
93
|
readonly messageFollowDurationMs?: number;
|
|
89
94
|
readonly requestTimeoutMs?: number;
|
|
@@ -109,6 +114,12 @@ export interface ZLinkActorHandoffCoordinatorOptions {
|
|
|
109
114
|
/** Owns packet ordering from relocation start through Message Follow removal. */
|
|
110
115
|
export declare class ZLinkActorHandoffCoordinator {
|
|
111
116
|
private readonly options;
|
|
117
|
+
private readonly requests;
|
|
118
|
+
[inspectRuntime](): Readonly<{
|
|
119
|
+
replyRouteCount: number;
|
|
120
|
+
hasMessageFollowRoute: (actorId: string, actorRef: ActorRef) => boolean;
|
|
121
|
+
tenureAuthorityOwnerGeneration: (actorId: string, actorRef: ActorRef) => bigint | undefined;
|
|
122
|
+
}>;
|
|
112
123
|
private readonly active;
|
|
113
124
|
private readonly messageFollowRoutes;
|
|
114
125
|
private readonly messageFollowSuppression;
|
|
@@ -147,7 +158,7 @@ export declare class ZLinkActorHandoffCoordinator {
|
|
|
147
158
|
*/
|
|
148
159
|
failPending(actorId: string, reason: unknown): void;
|
|
149
160
|
cancel(actorId: string): void;
|
|
150
|
-
capture(origin: ApplicationJobOrigin, actorId: string, parts: readonly Message[], returnResponse?: boolean, remoteBoundSessionTarget?: ZLinkRemoteBoundSessionTarget, fallbackActorRef?: ActorRef, deadlineUnixMs?: number, messageFollowOrigin?: ZLinkMessageFollowOrigin, provisionalReplay?: ZLinkActorHandoffDispatch, onAdmitted?: () => void): Promise<unknown> | undefined;
|
|
161
|
+
capture(origin: ApplicationJobOrigin, actorId: string, parts: readonly Message[], returnResponse?: boolean, remoteBoundSessionTarget?: ZLinkRemoteBoundSessionTarget, fallbackActorRef?: ActorRef, deadlineUnixMs?: number, messageFollowOrigin?: ZLinkMessageFollowOrigin, provisionalReplay?: ZLinkActorHandoffDispatch, onAdmitted?: () => void, requestOperation?: PendingOperation<unknown>): Promise<unknown> | undefined;
|
|
151
162
|
snapshot(actorId: string): readonly ZLinkActorHandoffPacket[];
|
|
152
163
|
/**
|
|
153
164
|
* Freezes the post-capture ingress segment immediately before the caller
|
|
@@ -3,6 +3,8 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.ZLinkActorHandoffCoordinator = exports.RELOCATED_REQUEST_OWNED_BY_REQUESTER = exports.DEFAULT_MESSAGE_FOLLOW_DURATION_MS = void 0;
|
|
4
4
|
exports.decodeHandoffPacket = decodeHandoffPacket;
|
|
5
5
|
exports.replayActorHandoffBacklog = replayActorHandoffBacklog;
|
|
6
|
+
const request_runtime_1 = require("../foundation/request-runtime");
|
|
7
|
+
const internal_observation_1 = require("../internal-observation");
|
|
6
8
|
const contracts_1 = require("../../contracts");
|
|
7
9
|
const Registration_1 = require("../../contracts/Configuration/Registration");
|
|
8
10
|
const Options_1 = require("../../contracts/Locations/Options");
|
|
@@ -13,12 +15,10 @@ const service_stateful_registry_1 = require("../foundation/service-stateful-regi
|
|
|
13
15
|
const operation_identity_1 = require("../foundation/operation-identity");
|
|
14
16
|
const stream_wire_1 = require("@zlink-systems/stream-wire");
|
|
15
17
|
const framework_errors_internal_1 = require("../framework-errors-internal");
|
|
16
|
-
const request_deadline_1 = require("../messaging/request-deadline");
|
|
17
18
|
const routing_id_1 = require("../routing-id");
|
|
18
19
|
const protocol_1 = require("../streams/protocol");
|
|
19
20
|
const actor_message_follow_context_1 = require("./actor-message-follow-context");
|
|
20
21
|
const actor_packet_relay_wire_1 = require("./actor-packet-relay-wire");
|
|
21
|
-
const actor_routed_json_request_1 = require("./actor-routed-json-request");
|
|
22
22
|
exports.DEFAULT_MESSAGE_FOLLOW_DURATION_MS = Options_1.zlinkDefaultLocationOptions.messageFollowDurationMs;
|
|
23
23
|
exports.RELOCATED_REQUEST_OWNED_BY_REQUESTER = Symbol('relocated request owned by requester');
|
|
24
24
|
function requireExactTargetOwnerFence(actorId, fence) {
|
|
@@ -35,6 +35,14 @@ function requireExactTargetOwnerFence(actorId, fence) {
|
|
|
35
35
|
/** Owns packet ordering from relocation start through Message Follow removal. */
|
|
36
36
|
class ZLinkActorHandoffCoordinator {
|
|
37
37
|
options;
|
|
38
|
+
requests;
|
|
39
|
+
[internal_observation_1.inspectRuntime]() {
|
|
40
|
+
return Object.freeze({
|
|
41
|
+
replyRouteCount: this.replyRoutes.size,
|
|
42
|
+
hasMessageFollowRoute: (actorId, actorRef) => this.hasMessageFollowRouteForStaleRef(actorId, actorRef),
|
|
43
|
+
tenureAuthorityOwnerGeneration: (actorId, actorRef) => this.tenureAuthorityOwnerGeneration(actorId, actorRef)
|
|
44
|
+
});
|
|
45
|
+
}
|
|
38
46
|
active = new Map();
|
|
39
47
|
// Each route is stored once: Actor -> native fence -> location owner id.
|
|
40
48
|
// Native ingress has the complete fence except the location owner's text id.
|
|
@@ -53,6 +61,7 @@ class ZLinkActorHandoffCoordinator {
|
|
|
53
61
|
replyRoutes = new Map();
|
|
54
62
|
constructor(options) {
|
|
55
63
|
this.options = options;
|
|
64
|
+
this.requests = options.requests ?? new request_runtime_1.RequestRuntime();
|
|
56
65
|
this.messageFollowDurationMs =
|
|
57
66
|
options.messageFollowDurationMs ?? exports.DEFAULT_MESSAGE_FOLLOW_DURATION_MS;
|
|
58
67
|
}
|
|
@@ -479,7 +488,7 @@ class ZLinkActorHandoffCoordinator {
|
|
|
479
488
|
pending.reject?.(error);
|
|
480
489
|
}
|
|
481
490
|
}
|
|
482
|
-
capture(origin, actorId, parts, returnResponse = false, remoteBoundSessionTarget, fallbackActorRef, deadlineUnixMs, messageFollowOrigin, provisionalReplay, onAdmitted) {
|
|
491
|
+
capture(origin, actorId, parts, returnResponse = false, remoteBoundSessionTarget, fallbackActorRef, deadlineUnixMs, messageFollowOrigin, provisionalReplay, onAdmitted, requestOperation) {
|
|
483
492
|
let incomingContext = (0, actor_message_follow_context_1.actorMessageFollowContext)(fallbackActorRef);
|
|
484
493
|
const originalDeadlineUnixMs = deadlineUnixMs ?? incomingContext?.deadlineUnixMs ?? packetDeadlineUnixMs(parts);
|
|
485
494
|
const followRoute = this.findMessageFollowRoute(actorId, incomingContext, messageFollowOrigin?.target);
|
|
@@ -522,7 +531,7 @@ class ZLinkActorHandoffCoordinator {
|
|
|
522
531
|
catch (error) {
|
|
523
532
|
return Promise.reject(error);
|
|
524
533
|
}
|
|
525
|
-
const packet = encodePacket(handoff.nextIndex++, parts, returnResponse, remoteBoundSessionTarget, fallbackActorRef, context, messageFollowOrigin);
|
|
534
|
+
const packet = encodePacket(handoff.nextIndex++, parts, returnResponse, remoteBoundSessionTarget, fallbackActorRef, context, messageFollowOrigin, requestOperation);
|
|
526
535
|
handoff.pendingBytes += packetBytes(packet);
|
|
527
536
|
this.options.onMarker?.('handoff_backlog', actorId, packet.index);
|
|
528
537
|
if (returnResponse) {
|
|
@@ -622,7 +631,7 @@ class ZLinkActorHandoffCoordinator {
|
|
|
622
631
|
this.options.onMarker?.('message_follow_rejected', actorId);
|
|
623
632
|
return Promise.reject(actorLocationStale(actorId));
|
|
624
633
|
}
|
|
625
|
-
const packet = encodePacket(0, parts, returnResponse, remoteBoundSessionTarget, fallbackActorRef, incomingContext, messageFollowOrigin);
|
|
634
|
+
const packet = encodePacket(0, parts, returnResponse, remoteBoundSessionTarget, fallbackActorRef, incomingContext, messageFollowOrigin, requestOperation);
|
|
626
635
|
return this.enqueueMessageFollow(followRoute, actorId, packet, onAdmitted);
|
|
627
636
|
}
|
|
628
637
|
this.options.onMarker?.('message_follow_rejected', actorId);
|
|
@@ -668,7 +677,7 @@ class ZLinkActorHandoffCoordinator {
|
|
|
668
677
|
catch (error) {
|
|
669
678
|
return Promise.reject(error);
|
|
670
679
|
}
|
|
671
|
-
const packet = encodePacket(0, parts, returnResponse, remoteBoundSessionTarget, fallbackActorRef, context, messageFollowOrigin);
|
|
680
|
+
const packet = encodePacket(0, parts, returnResponse, remoteBoundSessionTarget, fallbackActorRef, context, messageFollowOrigin, requestOperation);
|
|
672
681
|
return this.enqueueMessageFollow(followRoute, actorId, packet, onAdmitted);
|
|
673
682
|
}
|
|
674
683
|
snapshot(actorId) {
|
|
@@ -1113,23 +1122,32 @@ class ZLinkActorHandoffCoordinator {
|
|
|
1113
1122
|
replyRouteId: context.replyRouteId,
|
|
1114
1123
|
result
|
|
1115
1124
|
});
|
|
1125
|
+
packet.requestOperation?.setFailureDispatcher(reject);
|
|
1116
1126
|
onAdmitted?.();
|
|
1117
1127
|
entry.tail = entry.tail.then(async () => {
|
|
1118
1128
|
try {
|
|
1119
|
-
|
|
1129
|
+
if (packet.requestOperation !== undefined && !packet.requestOperation.isPending()) {
|
|
1130
|
+
resolve(await packet.requestOperation.promise);
|
|
1131
|
+
}
|
|
1132
|
+
else {
|
|
1133
|
+
await this.relayMessageFollow(actorId, entry, packet, resolve, reject);
|
|
1134
|
+
}
|
|
1135
|
+
await result;
|
|
1120
1136
|
}
|
|
1121
1137
|
catch (error) {
|
|
1122
1138
|
this.options.onMarker?.('message_follow_rejected', actorId);
|
|
1123
1139
|
reject(error);
|
|
1124
1140
|
}
|
|
1125
1141
|
finally {
|
|
1142
|
+
packet.requestOperation?.clearFailureDispatcher(reject);
|
|
1143
|
+
delete packet.requestOperation;
|
|
1126
1144
|
entry.queuedMessages--;
|
|
1127
1145
|
entry.queuedBytes -= bytes;
|
|
1128
1146
|
}
|
|
1129
1147
|
});
|
|
1130
1148
|
return result;
|
|
1131
1149
|
}
|
|
1132
|
-
async relayMessageFollow(actorId, entry, packet) {
|
|
1150
|
+
async relayMessageFollow(actorId, entry, packet, resolve, reject) {
|
|
1133
1151
|
const { target, targetActorRef } = entry;
|
|
1134
1152
|
const context = packet.messageFollowContext;
|
|
1135
1153
|
let advanced;
|
|
@@ -1157,33 +1175,54 @@ class ZLinkActorHandoffCoordinator {
|
|
|
1157
1175
|
packetName: actor_packet_relay_wire_1.ZLINK_REMOTE_ACTOR_PACKET_RELAY_PACKET
|
|
1158
1176
|
});
|
|
1159
1177
|
await this.messageFollowRelayed(actorId, entry, packet, advanced);
|
|
1160
|
-
|
|
1178
|
+
resolve(undefined);
|
|
1179
|
+
return;
|
|
1161
1180
|
}
|
|
1162
1181
|
const timeoutMs = this.options.requestTimeoutMs ?? Registration_1.DEFAULT_REQUEST_TIMEOUT_MS;
|
|
1163
|
-
const
|
|
1164
|
-
if (
|
|
1165
|
-
|
|
1166
|
-
|
|
1167
|
-
|
|
1168
|
-
|
|
1169
|
-
|
|
1170
|
-
|
|
1171
|
-
|
|
1172
|
-
|
|
1173
|
-
|
|
1182
|
+
const requestOperation = packet.requestOperation ?? this.requests.begin(timeoutMs);
|
|
1183
|
+
if (packet.requestOperation === undefined) {
|
|
1184
|
+
// The existing business result delivers failures from this entry alias.
|
|
1185
|
+
void requestOperation.promise.catch(() => { });
|
|
1186
|
+
requestOperation.setFailureDispatcher(reject);
|
|
1187
|
+
}
|
|
1188
|
+
if (!requestOperation.isPending()) {
|
|
1189
|
+
resolve(await requestOperation.promise);
|
|
1190
|
+
return;
|
|
1191
|
+
}
|
|
1192
|
+
try {
|
|
1193
|
+
this.options.routedTransport.requestToSpot(target, payload, { packetName: actor_packet_relay_wire_1.ZLINK_REMOTE_ACTOR_PACKET_RELAY_PACKET, timeoutMs, requestOperation }, {
|
|
1194
|
+
operationCompleted: (_id, value) => {
|
|
1195
|
+
requestOperation.clearFailureDispatcher(reject);
|
|
1196
|
+
if (!requestOperation.isPending())
|
|
1197
|
+
return;
|
|
1198
|
+
void (async () => {
|
|
1199
|
+
const reply = value;
|
|
1200
|
+
if (reply.ok === false)
|
|
1201
|
+
throw actorRelayError(actorId, reply.errorKind, reply.error);
|
|
1202
|
+
await this.messageFollowRelayed(actorId, entry, packet, advanced);
|
|
1203
|
+
if (packet.requestOperation === undefined)
|
|
1204
|
+
requestOperation.complete(reply.response);
|
|
1205
|
+
resolve(reply.response);
|
|
1206
|
+
})().catch((error) => {
|
|
1207
|
+
if (packet.requestOperation === undefined)
|
|
1208
|
+
requestOperation.fail(error);
|
|
1209
|
+
reject(error);
|
|
1210
|
+
});
|
|
1211
|
+
},
|
|
1212
|
+
operationFailed: (_id, error) => {
|
|
1213
|
+
requestOperation.clearFailureDispatcher(reject);
|
|
1214
|
+
if (packet.requestOperation === undefined)
|
|
1215
|
+
requestOperation.fail(error);
|
|
1216
|
+
reject(error);
|
|
1217
|
+
}
|
|
1218
|
+
});
|
|
1219
|
+
}
|
|
1220
|
+
catch (error) {
|
|
1221
|
+
requestOperation.clearFailureDispatcher(reject);
|
|
1222
|
+
if (packet.requestOperation === undefined)
|
|
1223
|
+
requestOperation.fail(error);
|
|
1224
|
+
throw error;
|
|
1174
1225
|
}
|
|
1175
|
-
const response = await (0, request_deadline_1.waitRequestReply)((0, actor_routed_json_request_1.requestRoutedJsonReply)(this.options.routedTransport, target, payload, { timeoutMs }, `Actor Message Follow raw request is not available for '${actorId}'.`, (parts) => {
|
|
1176
|
-
if (parts.length === 0) {
|
|
1177
|
-
throw new Error(`Actor Message Follow reply was empty for '${actorId}'.`);
|
|
1178
|
-
}
|
|
1179
|
-
const reply = JSON.parse(parts[0].getString('utf8'));
|
|
1180
|
-
if (reply.ok === false) {
|
|
1181
|
-
throw actorRelayError(actorId, reply.errorKind, reply.error);
|
|
1182
|
-
}
|
|
1183
|
-
return reply.response;
|
|
1184
|
-
}), actorId, relayDeadlineMs);
|
|
1185
|
-
await this.messageFollowRelayed(actorId, entry, packet, advanced);
|
|
1186
|
-
return response;
|
|
1187
1226
|
}
|
|
1188
1227
|
async messageFollowRelayed(actorId, entry, packet, context) {
|
|
1189
1228
|
this.options.onMarker?.('message_follow_relay', actorId, undefined, context);
|
|
@@ -1281,11 +1320,11 @@ async function replayActorHandoffBacklog(backlog, dispatch, onEnqueued) {
|
|
|
1281
1320
|
}
|
|
1282
1321
|
return results;
|
|
1283
1322
|
}
|
|
1284
|
-
function encodePacket(index, parts, returnResponse, remoteBoundSessionTarget, fallbackActorRef, messageFollowContext, messageFollowOrigin) {
|
|
1323
|
+
function encodePacket(index, parts, returnResponse, remoteBoundSessionTarget, fallbackActorRef, messageFollowContext, messageFollowOrigin, requestOperation) {
|
|
1285
1324
|
if (messageFollowContext === undefined) {
|
|
1286
1325
|
throw new Error('Actor handoff packet requires a Message Follow context.');
|
|
1287
1326
|
}
|
|
1288
|
-
|
|
1327
|
+
const packet = {
|
|
1289
1328
|
index,
|
|
1290
1329
|
header: Buffer.from(parts[0].data()).toString('base64'),
|
|
1291
1330
|
payload: Buffer.from(parts[1].data()).toString('base64'),
|
|
@@ -1312,6 +1351,12 @@ function encodePacket(index, parts, returnResponse, remoteBoundSessionTarget, fa
|
|
|
1312
1351
|
nodeRid: String(fallbackActorRef.nodeRid)
|
|
1313
1352
|
}
|
|
1314
1353
|
};
|
|
1354
|
+
if (requestOperation !== undefined)
|
|
1355
|
+
Object.defineProperty(packet, 'requestOperation', {
|
|
1356
|
+
value: requestOperation,
|
|
1357
|
+
configurable: true
|
|
1358
|
+
});
|
|
1359
|
+
return packet;
|
|
1315
1360
|
}
|
|
1316
1361
|
function optionalBigInt(value) {
|
|
1317
1362
|
return value === undefined ? undefined : BigInt(value);
|