bunqueue 2.8.54 → 2.8.56
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/application/background/dlq.d.ts +2 -0
- package/dist/application/background/dlq.js +26 -0
- package/dist/application/background/lifecycle.d.ts +4 -0
- package/dist/application/background/lifecycle.js +90 -0
- package/dist/application/background/recovery/active.d.ts +4 -0
- package/dist/application/background/recovery/active.js +69 -0
- package/dist/application/background/recovery/index.d.ts +2 -0
- package/dist/application/background/recovery/index.js +22 -0
- package/dist/application/background/recovery/pending.d.ts +3 -0
- package/dist/application/background/recovery/pending.js +69 -0
- package/dist/application/background/recovery/restore.d.ts +5 -0
- package/dist/application/background/recovery/restore.js +58 -0
- package/dist/application/background/recovery/shared.d.ts +6 -0
- package/dist/application/background/recovery/shared.js +15 -0
- package/dist/application/background/timeouts.d.ts +25 -0
- package/dist/application/background/timeouts.js +191 -0
- package/dist/application/backgroundTasks.d.ts +7 -31
- package/dist/application/backgroundTasks.js +6 -442
- package/dist/application/cleanupTasks.js +1 -0
- package/dist/application/clientTracking.js +2 -0
- package/dist/application/contextFactory.d.ts +13 -90
- package/dist/application/contextFactory.js +8 -0
- package/dist/application/dependencyResultTracker.d.ts +1 -0
- package/dist/application/dependencyResultTracker.js +3 -0
- package/dist/application/dlqManager.d.ts +2 -8
- package/dist/application/dlqManager.js +33 -162
- package/dist/application/dlqRetry.d.ts +12 -0
- package/dist/application/dlqRetry.js +97 -0
- package/dist/application/lockManager.js +21 -1
- package/dist/application/lockOperations.js +16 -3
- package/dist/application/operations/ack/batch.d.ts +8 -0
- package/dist/application/operations/ack/batch.js +64 -0
- package/dist/application/operations/ack/completion.d.ts +3 -0
- package/dist/application/operations/ack/completion.js +74 -0
- package/dist/application/operations/ack/failure.d.ts +3 -0
- package/dist/application/operations/ack/failure.js +160 -0
- package/dist/application/operations/ack.d.ts +5 -79
- package/dist/application/operations/ack.js +4 -319
- package/dist/application/operations/ackHelpers.d.ts +3 -52
- package/dist/application/operations/ackHelpers.js +10 -3
- package/dist/application/operations/customId.d.ts +18 -5
- package/dist/application/operations/customId.js +36 -25
- package/dist/application/operations/flowValidation.js +9 -4
- package/dist/application/operations/jobManagement.js +44 -7
- package/dist/application/operations/parentLink.d.ts +36 -0
- package/dist/application/operations/parentLink.js +153 -0
- package/dist/application/operations/parentLinkInput.d.ts +8 -0
- package/dist/application/operations/parentLinkInput.js +23 -0
- package/dist/application/operations/push.d.ts +5 -44
- package/dist/application/operations/push.js +62 -152
- package/dist/application/operations/pushAdmission.d.ts +32 -0
- package/dist/application/operations/pushAdmission.js +38 -0
- package/dist/application/operations/pushBatch.d.ts +4 -0
- package/dist/application/operations/pushBatch.js +136 -0
- package/dist/application/operations/pushContext.d.ts +39 -0
- package/dist/application/operations/pushContext.js +1 -0
- package/dist/application/operations/pushDeduplication.d.ts +42 -0
- package/dist/application/operations/pushDeduplication.js +131 -0
- package/dist/application/operations/pushInsert.d.ts +13 -1
- package/dist/application/operations/pushInsert.js +33 -17
- package/dist/application/operations/pushLocks.js +13 -9
- package/dist/application/operations/query/collect.d.ts +12 -0
- package/dist/application/operations/query/collect.js +118 -0
- package/dist/application/operations/query/jobLookup.d.ts +9 -0
- package/dist/application/operations/query/jobLookup.js +110 -0
- package/dist/application/operations/query/pagination.d.ts +8 -0
- package/dist/application/operations/query/pagination.js +90 -0
- package/dist/application/operations/query/state.d.ts +4 -0
- package/dist/application/operations/query/state.js +63 -0
- package/dist/application/operations/queryOperations.d.ts +5 -50
- package/dist/application/operations/queryOperations.js +4 -474
- package/dist/application/queue-manager/ack.d.ts +23 -0
- package/dist/application/queue-manager/ack.js +242 -0
- package/dist/application/queue-manager/configuration.d.ts +27 -0
- package/dist/application/queue-manager/configuration.js +84 -0
- package/dist/application/queue-manager/context.d.ts +5 -0
- package/dist/application/queue-manager/context.js +61 -0
- package/dist/application/queue-manager/control.d.ts +17 -0
- package/dist/application/queue-manager/control.js +133 -0
- package/dist/application/queue-manager/delivery.d.ts +32 -0
- package/dist/application/queue-manager/delivery.js +143 -0
- package/dist/application/queue-manager/dependencies.d.ts +8 -0
- package/dist/application/queue-manager/dependencies.js +127 -0
- package/dist/application/queue-manager/dependency-runtime.d.ts +8 -0
- package/dist/application/queue-manager/dependency-runtime.js +40 -0
- package/dist/application/queue-manager/flow-failures.d.ts +18 -0
- package/dist/application/queue-manager/flow-failures.js +107 -0
- package/dist/application/queue-manager/flow-options.d.ts +8 -0
- package/dist/application/queue-manager/flow-options.js +129 -0
- package/dist/application/queue-manager/job-management.d.ts +17 -0
- package/dist/application/queue-manager/job-management.js +100 -0
- package/dist/application/queue-manager/lifecycle.d.ts +4 -0
- package/dist/application/queue-manager/lifecycle.js +41 -0
- package/dist/application/queue-manager/limits.d.ts +41 -0
- package/dist/application/queue-manager/limits.js +108 -0
- package/dist/application/queue-manager/locks.d.ts +21 -0
- package/dist/application/queue-manager/locks.js +59 -0
- package/dist/application/queue-manager/observability.d.ts +16 -0
- package/dist/application/queue-manager/observability.js +44 -0
- package/dist/application/queue-manager/queries.d.ts +17 -0
- package/dist/application/queue-manager/queries.js +118 -0
- package/dist/application/queue-manager/repeat.d.ts +4 -0
- package/dist/application/queue-manager/repeat.js +26 -0
- package/dist/application/queue-manager/services.d.ts +19 -0
- package/dist/application/queue-manager/services.js +80 -0
- package/dist/application/queue-manager/state.d.ts +92 -0
- package/dist/application/queue-manager/state.js +144 -0
- package/dist/application/queue-manager/stats.d.ts +28 -0
- package/dist/application/queue-manager/stats.js +52 -0
- package/dist/application/queueManager.d.ts +4 -400
- package/dist/application/queueManager.js +3 -1922
- package/dist/application/queueTelemetryJournal.d.ts +20 -0
- package/dist/application/queueTelemetryJournal.js +133 -0
- package/dist/application/repeatJobs.d.ts +7 -0
- package/dist/application/repeatJobs.js +132 -0
- package/dist/application/stallDetection.js +6 -1
- package/dist/application/types/ack.d.ts +132 -0
- package/dist/application/types/ack.js +1 -0
- package/dist/application/types/background.d.ts +18 -0
- package/dist/application/types/background.js +1 -0
- package/dist/application/types/config.d.ts +37 -0
- package/dist/application/types/config.js +15 -0
- package/dist/application/types/contextFactory.d.ts +83 -0
- package/dist/application/types/contextFactory.js +1 -0
- package/dist/application/types/contexts.d.ts +110 -0
- package/dist/application/types/contexts.js +1 -0
- package/dist/application/types/index.d.ts +7 -0
- package/dist/application/types/index.js +1 -0
- package/dist/application/types/query.d.ts +23 -0
- package/dist/application/types/query.js +1 -0
- package/dist/application/types/queueManager.d.ts +94 -0
- package/dist/application/types/queueManager.js +1 -0
- package/dist/cli/commandRouter.d.ts +1 -1
- package/dist/cli/commands/core.js +1 -0
- package/dist/cli/output/collections.d.ts +8 -0
- package/dist/cli/output/collections.js +131 -0
- package/dist/cli/output/jobs.d.ts +2 -0
- package/dist/cli/output/jobs.js +61 -0
- package/dist/cli/output/style.d.ts +14 -0
- package/dist/cli/output/style.js +28 -0
- package/dist/cli/output/success.d.ts +1 -0
- package/dist/cli/output/success.js +108 -0
- package/dist/cli/output.d.ts +1 -6
- package/dist/cli/output.js +7 -395
- package/dist/client/bunqueue/dlqRateLimit.d.ts +8 -0
- package/dist/client/bunqueue/dlqRateLimit.js +24 -0
- package/dist/client/bunqueue/runtime.d.ts +35 -0
- package/dist/client/bunqueue/runtime.js +138 -0
- package/dist/client/bunqueue.d.ts +19 -34
- package/dist/client/bunqueue.js +45 -166
- package/dist/client/dlqConversion.d.ts +5 -0
- package/dist/client/dlqConversion.js +28 -0
- package/dist/client/events.d.ts +7 -56
- package/dist/client/events.js +38 -15
- package/dist/client/flow.d.ts +6 -12
- package/dist/client/flow.js +16 -34
- package/dist/client/flowJobFactory.d.ts +9 -1
- package/dist/client/flowJobFactory.js +25 -9
- package/dist/client/flowJobMoveMethods.d.ts +5 -5
- package/dist/client/flowJobMoveMethods.js +31 -16
- package/dist/client/flowLegacyPlan.js +22 -8
- package/dist/client/flowOptions.d.ts +1 -1
- package/dist/client/flowOptions.js +2 -1
- package/dist/client/flowPlan.js +2 -3
- package/dist/client/flowPush.d.ts +1 -0
- package/dist/client/flowPush.js +5 -1
- package/dist/client/flowReader.js +5 -5
- package/dist/client/flowResults.d.ts +11 -0
- package/dist/client/flowResults.js +42 -0
- package/dist/client/index.d.ts +3 -1
- package/dist/client/jobConversion.d.ts +0 -4
- package/dist/client/jobConversion.js +32 -33
- package/dist/client/jobConversionHelpers.d.ts +18 -2
- package/dist/client/jobConversionHelpers.js +17 -10
- package/dist/client/jobConversionTypes.d.ts +5 -1
- package/dist/client/jobHelpers.d.ts +7 -2
- package/dist/client/jobHelpers.js +16 -8
- package/dist/client/queue/dlq.js +12 -14
- package/dist/client/queue/dlqJobMethods.js +11 -10
- package/dist/client/queue/dlqOps.js +2 -8
- package/dist/client/queue/dlqStats.d.ts +3 -0
- package/dist/client/queue/dlqStats.js +21 -0
- package/dist/client/queue/job-proxy/dependencies.d.ts +9 -0
- package/dist/client/queue/job-proxy/dependencies.js +67 -0
- package/dist/client/queue/job-proxy/reflection.d.ts +2 -0
- package/dist/client/queue/job-proxy/reflection.js +18 -0
- package/dist/client/queue/job-proxy/simple.d.ts +3 -0
- package/dist/client/queue/job-proxy/simple.js +316 -0
- package/dist/client/queue/job-proxy/tcp.d.ts +4 -0
- package/dist/client/queue/job-proxy/tcp.js +191 -0
- package/dist/client/queue/jobMetadata.d.ts +10 -0
- package/dist/client/queue/jobMetadata.js +24 -0
- package/dist/client/queue/jobMove.d.ts +4 -4
- package/dist/client/queue/jobMove.js +82 -24
- package/dist/client/queue/jobProxy.d.ts +4 -50
- package/dist/client/queue/jobProxy.js +3 -516
- package/dist/client/queue/operations/add/bulk.d.ts +7 -0
- package/dist/client/queue/operations/add/bulk.js +129 -0
- package/dist/client/queue/operations/add/payload.d.ts +24 -0
- package/dist/client/queue/operations/add/payload.js +85 -0
- package/dist/client/queue/operations/add/single.d.ts +3 -0
- package/dist/client/queue/operations/add/single.js +107 -0
- package/dist/client/queue/operations/add.d.ts +2 -47
- package/dist/client/queue/operations/add.js +2 -364
- package/dist/client/queue/operations/management.js +2 -1
- package/dist/client/queue/operations/query.js +20 -63
- package/dist/client/queue/queue.d.ts +6 -192
- package/dist/client/queue/queue.js +6 -559
- package/dist/client/queue/runtime/compatibility.d.ts +13 -0
- package/dist/client/queue/runtime/compatibility.js +38 -0
- package/dist/client/queue/runtime/configuration.d.ts +42 -0
- package/dist/client/queue/runtime/configuration.js +109 -0
- package/dist/client/queue/runtime/connection.d.ts +6 -0
- package/dist/client/queue/runtime/connection.js +16 -0
- package/dist/client/queue/runtime/control.d.ts +41 -0
- package/dist/client/queue/runtime/control.js +87 -0
- package/dist/client/queue/runtime/queries.d.ts +48 -0
- package/dist/client/queue/runtime/queries.js +95 -0
- package/dist/client/queue/runtime/scheduling.d.ts +33 -0
- package/dist/client/queue/runtime/scheduling.js +56 -0
- package/dist/client/queue/runtime/state.d.ts +96 -0
- package/dist/client/queue/runtime/state.js +149 -0
- package/dist/client/queue/scheduler.d.ts +2 -5
- package/dist/client/queue/scheduler.js +25 -23
- package/dist/client/queue/schedulerPagination.d.ts +7 -0
- package/dist/client/queue/schedulerPagination.js +10 -0
- package/dist/client/queue/types/add.d.ts +40 -0
- package/dist/client/queue/types/add.js +1 -0
- package/dist/client/queue/types/contexts.d.ts +33 -0
- package/dist/client/queue/types/contexts.js +5 -0
- package/dist/client/queue/types/index.d.ts +3 -0
- package/dist/client/queue/types/index.js +1 -0
- package/dist/client/queue/types/job.d.ts +50 -0
- package/dist/client/queue/types/job.js +1 -0
- package/dist/client/queue/types/runtime.d.ts +35 -0
- package/dist/client/queue/types/runtime.js +1 -0
- package/dist/client/queue/workers.d.ts +4 -8
- package/dist/client/queue/workers.js +22 -14
- package/dist/client/queue-events/tcpSubscription.d.ts +23 -0
- package/dist/client/queue-events/tcpSubscription.js +99 -0
- package/dist/client/sandboxed/queueOps.d.ts +2 -2
- package/dist/client/sandboxed/queueOps.js +32 -5
- package/dist/client/sandboxed/runtime/dispatch.d.ts +13 -0
- package/dist/client/sandboxed/runtime/dispatch.js +186 -0
- package/dist/client/sandboxed/runtime/lifecycle.d.ts +20 -0
- package/dist/client/sandboxed/runtime/lifecycle.js +95 -0
- package/dist/client/sandboxed/runtime/log.d.ts +1 -0
- package/dist/client/sandboxed/runtime/log.js +15 -0
- package/dist/client/sandboxed/runtime/pool.d.ts +11 -0
- package/dist/client/sandboxed/runtime/pool.js +121 -0
- package/dist/client/sandboxed/runtime/recovery.d.ts +11 -0
- package/dist/client/sandboxed/runtime/recovery.js +122 -0
- package/dist/client/sandboxed/runtime/state.d.ts +39 -0
- package/dist/client/sandboxed/runtime/state.js +59 -0
- package/dist/client/sandboxed/types/index.d.ts +2 -0
- package/dist/client/sandboxed/types/index.js +1 -0
- package/dist/client/sandboxed/types/options.d.ts +27 -0
- package/dist/client/sandboxed/types/options.js +1 -0
- package/dist/client/sandboxed/types/process.d.ts +30 -0
- package/dist/client/sandboxed/types/process.js +1 -0
- package/dist/client/sandboxed/worker.d.ts +3 -85
- package/dist/client/sandboxed/worker.js +3 -557
- package/dist/client/sandboxed/wrapper.js +1 -0
- package/dist/client/tcp/client.d.ts +5 -112
- package/dist/client/tcp/client.js +5 -481
- package/dist/client/tcp/commandQueue.d.ts +23 -0
- package/dist/client/tcp/commandQueue.js +89 -0
- package/dist/client/tcp/connection.d.ts +4 -85
- package/dist/client/tcp/connection.js +3 -315
- package/dist/client/tcp/errors.d.ts +6 -0
- package/dist/client/tcp/errors.js +18 -0
- package/dist/client/tcp/runtime/commands.d.ts +9 -0
- package/dist/client/tcp/runtime/commands.js +124 -0
- package/dist/client/tcp/runtime/connectivity.d.ts +13 -0
- package/dist/client/tcp/runtime/connectivity.js +77 -0
- package/dist/client/tcp/runtime/health.d.ts +14 -0
- package/dist/client/tcp/runtime/health.js +127 -0
- package/dist/client/tcp/runtime/lifecycle.d.ts +8 -0
- package/dist/client/tcp/runtime/lifecycle.js +32 -0
- package/dist/client/tcp/runtime/state.d.ts +50 -0
- package/dist/client/tcp/runtime/state.js +45 -0
- package/dist/client/tcp/transport.d.ts +18 -0
- package/dist/client/tcp/transport.js +158 -0
- package/dist/client/tcp/types/command.d.ts +9 -0
- package/dist/client/tcp/types/command.js +1 -0
- package/dist/client/tcp/types/connection.d.ts +31 -0
- package/dist/client/tcp/types/connection.js +17 -0
- package/dist/client/tcp/types/index.d.ts +5 -0
- package/dist/client/tcp/types/index.js +1 -0
- package/dist/client/tcp/types/socket.d.ts +8 -0
- package/dist/client/tcp/types/socket.js +1 -0
- package/dist/client/tcp/types/tls.d.ts +4 -0
- package/dist/client/tcp/types/tls.js +1 -0
- package/dist/client/tcp/types.d.ts +2 -106
- package/dist/client/tcp/types.js +2 -22
- package/dist/client/types/connection.d.ts +29 -0
- package/dist/client/types/connection.js +1 -0
- package/dist/client/types/dlq.d.ts +45 -0
- package/dist/client/types/dlq.js +1 -0
- package/dist/client/types/events.d.ts +54 -0
- package/dist/client/types/events.js +1 -0
- package/dist/client/types/flow.d.ts +10 -0
- package/dist/client/types/flow.js +1 -0
- package/dist/client/types/index.d.ts +10 -0
- package/dist/client/types/index.js +1 -0
- package/dist/client/types/job.d.ts +127 -0
- package/dist/client/types/job.js +1 -0
- package/dist/client/types/metrics.d.ts +1 -0
- package/dist/client/types/metrics.js +1 -0
- package/dist/client/types/options.d.ts +62 -0
- package/dist/client/types/options.js +1 -0
- package/dist/client/types/worker.d.ts +38 -0
- package/dist/client/types/worker.js +1 -0
- package/dist/client/types.d.ts +2 -583
- package/dist/client/types.js +2 -6
- package/dist/client/worker/ackBatcher.d.ts +1 -1
- package/dist/client/worker/ackBatcher.js +17 -5
- package/dist/client/worker/ackOutcome.d.ts +8 -0
- package/dist/client/worker/ackOutcome.js +58 -0
- package/dist/client/worker/constants.d.ts +7 -0
- package/dist/client/worker/constants.js +7 -0
- package/dist/client/worker/groupConcurrency.js +3 -0
- package/dist/client/worker/handlers/completion.d.ts +28 -0
- package/dist/client/worker/handlers/completion.js +68 -0
- package/dist/client/worker/handlers/dependencies.d.ts +11 -0
- package/dist/client/worker/handlers/dependencies.js +107 -0
- package/dist/client/worker/handlers/mutations.d.ts +23 -0
- package/dist/client/worker/handlers/mutations.js +211 -0
- package/dist/client/worker/handlers/queries.d.ts +15 -0
- package/dist/client/worker/handlers/queries.js +100 -0
- package/dist/client/worker/index.d.ts +2 -2
- package/dist/client/worker/index.js +1 -1
- package/dist/client/worker/jobParser.js +4 -2
- package/dist/client/worker/processor.d.ts +2 -15
- package/dist/client/worker/processor.js +67 -124
- package/dist/client/worker/processorHandlers.d.ts +4 -61
- package/dist/client/worker/processorHandlers.js +4 -398
- package/dist/client/worker/processorOutcome.d.ts +14 -0
- package/dist/client/worker/processorOutcome.js +125 -0
- package/dist/client/worker/runtime/buffer.d.ts +8 -0
- package/dist/client/worker/runtime/buffer.js +50 -0
- package/dist/client/worker/runtime/control.d.ts +26 -0
- package/dist/client/worker/runtime/control.js +175 -0
- package/dist/client/worker/runtime/execution.d.ts +11 -0
- package/dist/client/worker/runtime/execution.js +123 -0
- package/dist/client/worker/runtime/lifecycle.d.ts +7 -0
- package/dist/client/worker/runtime/lifecycle.js +114 -0
- package/dist/client/worker/runtime/manual.d.ts +10 -0
- package/dist/client/worker/runtime/manual.js +137 -0
- package/dist/client/worker/runtime/options.d.ts +5 -0
- package/dist/client/worker/runtime/options.js +39 -0
- package/dist/client/worker/runtime/polling.d.ts +12 -0
- package/dist/client/worker/runtime/polling.js +123 -0
- package/dist/client/worker/runtime/state.d.ts +110 -0
- package/dist/client/worker/runtime/state.js +156 -0
- package/dist/client/worker/types/index.d.ts +5 -0
- package/dist/client/worker/types/index.js +1 -0
- package/dist/client/worker/types/manual.d.ts +7 -0
- package/dist/client/worker/types/manual.js +1 -0
- package/dist/client/worker/types/options.d.ts +24 -0
- package/dist/client/worker/types/options.js +1 -0
- package/dist/client/worker/types/outcome.d.ts +23 -0
- package/dist/client/worker/types/outcome.js +1 -0
- package/dist/client/worker/types/processor.d.ts +22 -0
- package/dist/client/worker/types/processor.js +1 -0
- package/dist/client/worker/types/transport.d.ts +11 -0
- package/dist/client/worker/types/transport.js +1 -0
- package/dist/client/worker/worker.d.ts +3 -160
- package/dist/client/worker/worker.js +3 -928
- package/dist/client/worker/workerRateLimiter.d.ts +5 -1
- package/dist/client/worker/workerRateLimiter.js +40 -20
- package/dist/client/worker.d.ts +1 -0
- package/dist/client/workflow/compensationChild.d.ts +2 -1
- package/dist/client/workflow/compensationChild.js +1 -1
- package/dist/client/workflow/compensationClaim.d.ts +11 -0
- package/dist/client/workflow/compensationClaim.js +30 -0
- package/dist/client/workflow/compensator.d.ts +7 -2
- package/dist/client/workflow/compensator.js +5 -11
- package/dist/client/workflow/recovery.js +25 -2
- package/dist/client/workflow/rollbackControl.js +1 -1
- package/dist/domain/job/constants.d.ts +12 -0
- package/dist/domain/job/constants.js +12 -0
- package/dist/domain/job/create.d.ts +2 -0
- package/dist/domain/job/create.js +103 -0
- package/dist/domain/job/ids.d.ts +5 -0
- package/dist/domain/job/ids.js +12 -0
- package/dist/domain/job/locks.d.ts +4 -0
- package/dist/domain/job/locks.js +23 -0
- package/dist/domain/job/payload.d.ts +18 -0
- package/dist/domain/job/payload.js +43 -0
- package/dist/domain/job/state.d.ts +8 -0
- package/dist/domain/job/state.js +51 -0
- package/dist/domain/job/terminal.d.ts +3 -0
- package/dist/domain/job/terminal.js +9 -0
- package/dist/domain/queue/dlqShard.d.ts +2 -0
- package/dist/domain/queue/dlqShard.js +34 -9
- package/dist/domain/queue/priorityQueue.js +3 -39
- package/dist/domain/queue/priorityQueueOrder.d.ts +3 -0
- package/dist/domain/queue/priorityQueueOrder.js +21 -0
- package/dist/domain/queue/shard/dependencies.d.ts +11 -0
- package/dist/domain/queue/shard/dependencies.js +22 -0
- package/dist/domain/queue/shard/dlq.d.ts +25 -0
- package/dist/domain/queue/shard/dlq.js +71 -0
- package/dist/domain/queue/shard/keys.d.ts +18 -0
- package/dist/domain/queue/shard/keys.js +45 -0
- package/dist/domain/queue/shard/lifecycle.d.ts +10 -0
- package/dist/domain/queue/shard/lifecycle.js +43 -0
- package/dist/domain/queue/shard/limits.d.ts +24 -0
- package/dist/domain/queue/shard/limits.js +57 -0
- package/dist/domain/queue/shard/metrics.d.ts +32 -0
- package/dist/domain/queue/shard/metrics.js +72 -0
- package/dist/domain/queue/shard/state.d.ts +34 -0
- package/dist/domain/queue/shard/state.js +80 -0
- package/dist/domain/queue/shard.d.ts +5 -145
- package/dist/domain/queue/shard.js +4 -409
- package/dist/domain/response/builders.d.ts +15 -0
- package/dist/domain/response/builders.js +39 -0
- package/dist/domain/types/command.d.ts +2 -555
- package/dist/domain/types/command.js +2 -5
- package/dist/domain/types/commands/base.d.ts +5 -0
- package/dist/domain/types/commands/base.js +1 -0
- package/dist/domain/types/commands/core.d.ts +106 -0
- package/dist/domain/types/commands/core.js +1 -0
- package/dist/domain/types/commands/cron.d.ts +36 -0
- package/dist/domain/types/commands/cron.js +1 -0
- package/dist/domain/types/commands/dashboard.d.ts +13 -0
- package/dist/domain/types/commands/dashboard.js +1 -0
- package/dist/domain/types/commands/dlq.d.ts +39 -0
- package/dist/domain/types/commands/dlq.js +1 -0
- package/dist/domain/types/commands/extended.d.ts +63 -0
- package/dist/domain/types/commands/extended.js +1 -0
- package/dist/domain/types/commands/index.d.ts +12 -0
- package/dist/domain/types/commands/index.js +12 -0
- package/dist/domain/types/commands/limits.d.ts +54 -0
- package/dist/domain/types/commands/limits.js +1 -0
- package/dist/domain/types/commands/management.d.ts +73 -0
- package/dist/domain/types/commands/management.js +1 -0
- package/dist/domain/types/commands/monitoring.d.ts +49 -0
- package/dist/domain/types/commands/monitoring.js +1 -0
- package/dist/domain/types/commands/protocol.d.ts +20 -0
- package/dist/domain/types/commands/protocol.js +1 -0
- package/dist/domain/types/commands/query.d.ts +46 -0
- package/dist/domain/types/commands/query.js +1 -0
- package/dist/domain/types/commands/union.d.ts +13 -0
- package/dist/domain/types/commands/union.js +1 -0
- package/dist/domain/types/commands/workers.d.ts +39 -0
- package/dist/domain/types/commands/workers.js +1 -0
- package/dist/domain/types/cron.d.ts +4 -2
- package/dist/domain/types/cron.js +3 -0
- package/dist/domain/types/dlq.d.ts +17 -0
- package/dist/domain/types/dlq.js +70 -14
- package/dist/domain/types/index.d.ts +2 -0
- package/dist/domain/types/index.js +1 -0
- package/dist/domain/types/job.d.ts +8 -269
- package/dist/domain/types/job.js +8 -234
- package/dist/domain/types/jobs/model.d.ts +152 -0
- package/dist/domain/types/jobs/model.js +1 -0
- package/dist/domain/types/metrics.d.ts +16 -0
- package/dist/domain/types/metrics.js +1 -0
- package/dist/domain/types/priorityQueue.d.ts +12 -0
- package/dist/domain/types/priorityQueue.js +1 -0
- package/dist/domain/types/protocol.d.ts +5 -0
- package/dist/domain/types/protocol.js +4 -0
- package/dist/domain/types/queue.d.ts +2 -0
- package/dist/domain/types/response.d.ts +3 -192
- package/dist/domain/types/response.js +3 -101
- package/dist/domain/types/responses/model.d.ts +152 -0
- package/dist/domain/types/responses/model.js +1 -0
- package/dist/domain/types/shard.d.ts +4 -0
- package/dist/domain/types/shard.js +1 -0
- package/dist/infrastructure/cloud/cloudAgent.js +6 -0
- package/dist/infrastructure/cloud/commandHandler.d.ts +2 -41
- package/dist/infrastructure/cloud/commandHandler.js +1 -1
- package/dist/infrastructure/cloud/commands/integrations.d.ts +2 -0
- package/dist/infrastructure/cloud/commands/integrations.js +31 -0
- package/dist/infrastructure/cloud/commands/jobMapper.d.ts +56 -0
- package/dist/infrastructure/cloud/commands/jobMapper.js +72 -0
- package/dist/infrastructure/cloud/commands/jobs.d.ts +2 -0
- package/dist/infrastructure/cloud/commands/jobs.js +111 -0
- package/dist/infrastructure/cloud/commands/queues.d.ts +2 -0
- package/dist/infrastructure/cloud/commands/queues.js +126 -0
- package/dist/infrastructure/cloud/commands.d.ts +3 -10
- package/dist/infrastructure/cloud/commands.js +7 -344
- package/dist/infrastructure/cloud/snapshot/analytics.d.ts +16 -0
- package/dist/infrastructure/cloud/snapshot/analytics.js +132 -0
- package/dist/infrastructure/cloud/snapshot/collector.d.ts +24 -0
- package/dist/infrastructure/cloud/snapshot/collector.js +105 -0
- package/dist/infrastructure/cloud/snapshot/config.d.ts +5 -0
- package/dist/infrastructure/cloud/snapshot/config.js +86 -0
- package/dist/infrastructure/cloud/snapshot/jobs.d.ts +5 -0
- package/dist/infrastructure/cloud/snapshot/jobs.js +148 -0
- package/dist/infrastructure/cloud/snapshot/stalls.d.ts +3 -0
- package/dist/infrastructure/cloud/snapshot/stalls.js +34 -0
- package/dist/infrastructure/cloud/snapshotCollector.d.ts +2 -53
- package/dist/infrastructure/cloud/snapshotCollector.js +5 -107
- package/dist/infrastructure/cloud/snapshotHelpers.d.ts +5 -45
- package/dist/infrastructure/cloud/snapshotHelpers.js +4 -426
- package/dist/infrastructure/cloud/types/collector.d.ts +54 -0
- package/dist/infrastructure/cloud/types/collector.js +1 -0
- package/dist/infrastructure/cloud/types/command.d.ts +44 -0
- package/dist/infrastructure/cloud/types/command.js +1 -0
- package/dist/infrastructure/cloud/types/config.d.ts +18 -0
- package/dist/infrastructure/cloud/types/config.js +1 -0
- package/dist/infrastructure/cloud/types/event.d.ts +14 -0
- package/dist/infrastructure/cloud/types/event.js +1 -0
- package/dist/infrastructure/cloud/types/redact.d.ts +4 -0
- package/dist/infrastructure/cloud/types/redact.js +1 -0
- package/dist/infrastructure/cloud/types/snapshot.d.ts +52 -0
- package/dist/infrastructure/cloud/types/snapshot.js +1 -0
- package/dist/infrastructure/cloud/types/snapshotCore.d.ts +125 -0
- package/dist/infrastructure/cloud/types/snapshotCore.js +1 -0
- package/dist/infrastructure/cloud/types/snapshotJobs.d.ts +124 -0
- package/dist/infrastructure/cloud/types/snapshotJobs.js +1 -0
- package/dist/infrastructure/cloud/types/snapshotTelemetry.d.ts +100 -0
- package/dist/infrastructure/cloud/types/snapshotTelemetry.js +1 -0
- package/dist/infrastructure/cloud/types.d.ts +3 -445
- package/dist/infrastructure/cloud/types.js +0 -4
- package/dist/infrastructure/persistence/batchInsert.d.ts +13 -0
- package/dist/infrastructure/persistence/batchInsert.js +96 -0
- package/dist/infrastructure/persistence/jobOptionsBlob.d.ts +18 -0
- package/dist/infrastructure/persistence/jobOptionsBlob.js +56 -0
- package/dist/infrastructure/persistence/legacyNameMigration.d.ts +5 -0
- package/dist/infrastructure/persistence/legacyNameMigration.js +42 -0
- package/dist/infrastructure/persistence/migrations.d.ts +3 -0
- package/dist/infrastructure/persistence/migrations.js +120 -0
- package/dist/infrastructure/persistence/schema.d.ts +3 -5
- package/dist/infrastructure/persistence/schema.js +40 -136
- package/dist/infrastructure/persistence/sqlite/admission.d.ts +9 -0
- package/dist/infrastructure/persistence/sqlite/admission.js +34 -0
- package/dist/infrastructure/persistence/sqlite/control.d.ts +32 -0
- package/dist/infrastructure/persistence/sqlite/control.js +90 -0
- package/dist/infrastructure/persistence/sqlite/flows.d.ts +26 -0
- package/dist/infrastructure/persistence/sqlite/flows.js +167 -0
- package/dist/infrastructure/persistence/sqlite/jobs.d.ts +23 -0
- package/dist/infrastructure/persistence/sqlite/jobs.js +166 -0
- package/dist/infrastructure/persistence/sqlite/lifecycle.d.ts +6 -0
- package/dist/infrastructure/persistence/sqlite/lifecycle.js +30 -0
- package/dist/infrastructure/persistence/sqlite/mutations.d.ts +20 -0
- package/dist/infrastructure/persistence/sqlite/mutations.js +149 -0
- package/dist/infrastructure/persistence/sqlite/queries.d.ts +23 -0
- package/dist/infrastructure/persistence/sqlite/queries.js +89 -0
- package/dist/infrastructure/persistence/sqlite/records.d.ts +24 -0
- package/dist/infrastructure/persistence/sqlite/records.js +115 -0
- package/dist/infrastructure/persistence/sqlite/state.d.ts +36 -0
- package/dist/infrastructure/persistence/sqlite/state.js +207 -0
- package/dist/infrastructure/persistence/sqlite/telemetry.d.ts +16 -0
- package/dist/infrastructure/persistence/sqlite/telemetry.js +126 -0
- package/dist/infrastructure/persistence/sqlite.d.ts +5 -280
- package/dist/infrastructure/persistence/sqlite.js +3 -1013
- package/dist/infrastructure/persistence/sqliteBatch.d.ts +4 -121
- package/dist/infrastructure/persistence/sqliteBatch.js +3 -422
- package/dist/infrastructure/persistence/sqliteSerializer.d.ts +6 -1
- package/dist/infrastructure/persistence/sqliteSerializer.js +33 -11
- package/dist/infrastructure/persistence/statements.d.ts +5 -1
- package/dist/infrastructure/persistence/statements.js +14 -9
- package/dist/infrastructure/persistence/types/admission.d.ts +8 -0
- package/dist/infrastructure/persistence/types/admission.js +1 -0
- package/dist/infrastructure/persistence/types/batch.d.ts +12 -0
- package/dist/infrastructure/persistence/types/batch.js +1 -0
- package/dist/infrastructure/persistence/types/sqlite.d.ts +17 -0
- package/dist/infrastructure/persistence/types/sqlite.js +1 -0
- package/dist/infrastructure/persistence/writeBuffer.d.ts +38 -0
- package/dist/infrastructure/persistence/writeBuffer.js +221 -0
- package/dist/infrastructure/scheduler/cron/execution.d.ts +12 -0
- package/dist/infrastructure/scheduler/cron/execution.js +150 -0
- package/dist/infrastructure/scheduler/cron/runtime.d.ts +31 -0
- package/dist/infrastructure/scheduler/cron/runtime.js +143 -0
- package/dist/infrastructure/scheduler/cronScheduler.d.ts +4 -117
- package/dist/infrastructure/scheduler/cronScheduler.js +3 -436
- package/dist/infrastructure/scheduler/types/cronScheduler.d.ts +16 -0
- package/dist/infrastructure/scheduler/types/cronScheduler.js +1 -0
- package/dist/infrastructure/server/bootstrap.js +3 -0
- package/dist/infrastructure/server/handler-routes/control.d.ts +8 -0
- package/dist/infrastructure/server/handler-routes/control.js +82 -0
- package/dist/infrastructure/server/handler-routes/jobs.d.ts +6 -0
- package/dist/infrastructure/server/handler-routes/jobs.js +110 -0
- package/dist/infrastructure/server/handler-routes/monitoring.d.ts +5 -0
- package/dist/infrastructure/server/handler-routes/monitoring.js +65 -0
- package/dist/infrastructure/server/handlerRoutes.d.ts +3 -26
- package/dist/infrastructure/server/handlerRoutes.js +3 -270
- package/dist/infrastructure/server/handlers/advanced/configNumbers.d.ts +2 -0
- package/dist/infrastructure/server/handlers/advanced/configNumbers.js +26 -0
- package/dist/infrastructure/server/handlers/advanced/dependencies.d.ts +15 -0
- package/dist/infrastructure/server/handlers/advanced/dependencies.js +38 -0
- package/dist/infrastructure/server/handlers/advanced/jobs.d.ts +33 -0
- package/dist/infrastructure/server/handlers/advanced/jobs.js +136 -0
- package/dist/infrastructure/server/handlers/advanced/queue.d.ts +42 -0
- package/dist/infrastructure/server/handlers/advanced/queue.js +111 -0
- package/dist/infrastructure/server/handlers/advanced.d.ts +3 -121
- package/dist/infrastructure/server/handlers/advanced.js +3 -336
- package/dist/infrastructure/server/handlers/core.d.ts +1 -4
- package/dist/infrastructure/server/handlers/core.js +37 -20
- package/dist/infrastructure/server/handlers/cron.js +9 -1
- package/dist/infrastructure/server/handlers/flow.js +6 -1
- package/dist/infrastructure/server/handlers/introspection.js +1 -1
- package/dist/infrastructure/server/handlers/management.d.ts +8 -0
- package/dist/infrastructure/server/handlers/management.js +30 -0
- package/dist/infrastructure/server/handlers/monitoring/health.d.ts +13 -0
- package/dist/infrastructure/server/handlers/monitoring/health.js +61 -0
- package/dist/infrastructure/server/handlers/monitoring/operations.d.ts +8 -0
- package/dist/infrastructure/server/handlers/monitoring/operations.js +28 -0
- package/dist/infrastructure/server/handlers/monitoring/webhooks.d.ts +7 -0
- package/dist/infrastructure/server/handlers/monitoring/webhooks.js +56 -0
- package/dist/infrastructure/server/handlers/monitoring/workers.d.ts +6 -0
- package/dist/infrastructure/server/handlers/monitoring/workers.js +57 -0
- package/dist/infrastructure/server/handlers/monitoring.d.ts +4 -30
- package/dist/infrastructure/server/handlers/monitoring.js +4 -222
- package/dist/infrastructure/server/handlers/pushBatchValidation.d.ts +1 -1
- package/dist/infrastructure/server/handlers/pushBatchValidation.js +7 -0
- package/dist/infrastructure/server/handlers/query.js +12 -3
- package/dist/infrastructure/server/http-routes/jobAdvanced.d.ts +2 -0
- package/dist/infrastructure/server/http-routes/jobAdvanced.js +106 -0
- package/dist/infrastructure/server/http-routes/jobManagement.d.ts +2 -0
- package/dist/infrastructure/server/http-routes/jobManagement.js +74 -0
- package/dist/infrastructure/server/http-routes/queueJobs.d.ts +2 -0
- package/dist/infrastructure/server/http-routes/queueJobs.js +108 -0
- package/dist/infrastructure/server/httpRouteJobs.d.ts +1 -8
- package/dist/infrastructure/server/httpRouteJobs.js +33 -222
- package/dist/infrastructure/server/httpRouteQueues.d.ts +1 -6
- package/dist/infrastructure/server/httpRouteQueues.js +51 -217
- package/dist/infrastructure/server/httpRouteResources.js +1 -0
- package/dist/infrastructure/server/protocol/commands.d.ts +8 -0
- package/dist/infrastructure/server/protocol/commands.js +31 -0
- package/dist/infrastructure/server/protocol/frameParser.d.ts +16 -0
- package/dist/infrastructure/server/protocol/frameParser.js +65 -0
- package/dist/infrastructure/server/protocol/lineBuffer.d.ts +6 -0
- package/dist/infrastructure/server/protocol/lineBuffer.js +21 -0
- package/dist/infrastructure/server/protocol/validation.d.ts +9 -0
- package/dist/infrastructure/server/protocol/validation.js +75 -0
- package/dist/infrastructure/server/protocol.d.ts +5 -77
- package/dist/infrastructure/server/protocol.js +4 -265
- package/dist/infrastructure/server/rateLimiter.js +1 -0
- package/dist/infrastructure/server/socketWriteQueue.d.ts +1 -1
- package/dist/infrastructure/server/socketWriteQueue.js +8 -5
- package/dist/infrastructure/server/sse/constants.d.ts +5 -0
- package/dist/infrastructure/server/sse/constants.js +5 -0
- package/dist/infrastructure/server/sse/eventBuffer.d.ts +3 -0
- package/dist/infrastructure/server/sse/eventBuffer.js +21 -0
- package/dist/infrastructure/server/sseHandler.d.ts +2 -6
- package/dist/infrastructure/server/sseHandler.js +20 -96
- package/dist/infrastructure/server/tcp/clientRelease.d.ts +2 -0
- package/dist/infrastructure/server/tcp/clientRelease.js +18 -0
- package/dist/infrastructure/server/tcp/connections.d.ts +24 -0
- package/dist/infrastructure/server/tcp/connections.js +162 -0
- package/dist/infrastructure/server/tcp/constants.d.ts +3 -0
- package/dist/infrastructure/server/tcp/constants.js +3 -0
- package/dist/infrastructure/server/tcp/eventSubscriptions.d.ts +10 -0
- package/dist/infrastructure/server/tcp/eventSubscriptions.js +17 -0
- package/dist/infrastructure/server/tcp/responses.d.ts +3 -0
- package/dist/infrastructure/server/tcp/responses.js +8 -0
- package/dist/infrastructure/server/tcp.d.ts +10 -68
- package/dist/infrastructure/server/tcp.js +47 -256
- package/dist/infrastructure/server/types/protocol.d.ts +4 -0
- package/dist/infrastructure/server/types/protocol.js +1 -0
- package/dist/infrastructure/server/types/sse.d.ts +11 -0
- package/dist/infrastructure/server/types/sse.js +1 -0
- package/dist/infrastructure/server/types/tcpServer.d.ts +25 -0
- package/dist/infrastructure/server/types/tcpServer.js +1 -0
- package/dist/infrastructure/server/types/ws.d.ts +6 -0
- package/dist/infrastructure/server/types/ws.js +1 -0
- package/dist/infrastructure/server/ws/constants.d.ts +6 -0
- package/dist/infrastructure/server/ws/constants.js +130 -0
- package/dist/infrastructure/server/ws/snapshots.d.ts +4 -0
- package/dist/infrastructure/server/ws/snapshots.js +52 -0
- package/dist/infrastructure/server/ws/subscriptions.d.ts +10 -0
- package/dist/infrastructure/server/ws/subscriptions.js +39 -0
- package/dist/infrastructure/server/wsHandler.d.ts +2 -10
- package/dist/infrastructure/server/wsHandler.js +12 -237
- package/dist/mcp/adapter.d.ts +5 -403
- package/dist/mcp/adapter.js +6 -778
- package/dist/mcp/backend/embedded/base.d.ts +7 -0
- package/dist/mcp/backend/embedded/base.js +15 -0
- package/dist/mcp/backend/embedded/index.d.ts +14 -0
- package/dist/mcp/backend/embedded/index.js +22 -0
- package/dist/mcp/backend/embedded/jobs.d.ts +44 -0
- package/dist/mcp/backend/embedded/jobs.js +98 -0
- package/dist/mcp/backend/embedded/queues.d.ts +27 -0
- package/dist/mcp/backend/embedded/queues.js +84 -0
- package/dist/mcp/backend/embedded/services.d.ts +29 -0
- package/dist/mcp/backend/embedded/services.js +107 -0
- package/dist/mcp/backend/serializers.d.ts +7 -0
- package/dist/mcp/backend/serializers.js +32 -0
- package/dist/mcp/backend/tcp/base.d.ts +19 -0
- package/dist/mcp/backend/tcp/base.js +54 -0
- package/dist/mcp/backend/tcp/index.d.ts +14 -0
- package/dist/mcp/backend/tcp/index.js +20 -0
- package/dist/mcp/backend/tcp/jobs.d.ts +44 -0
- package/dist/mcp/backend/tcp/jobs.js +122 -0
- package/dist/mcp/backend/tcp/queues.d.ts +27 -0
- package/dist/mcp/backend/tcp/queues.js +89 -0
- package/dist/mcp/backend/tcp/services.d.ts +30 -0
- package/dist/mcp/backend/tcp/services.js +161 -0
- package/dist/mcp/types/adapter.d.ts +176 -0
- package/dist/mcp/types/adapter.js +1 -0
- package/dist/shared/asyncLock.d.ts +13 -0
- package/dist/shared/asyncLock.js +65 -0
- package/dist/shared/lock.d.ts +10 -72
- package/dist/shared/lock.js +7 -231
- package/dist/shared/lockError.d.ts +3 -0
- package/dist/shared/lockError.js +6 -0
- package/dist/shared/lockTimeout.d.ts +2 -0
- package/dist/shared/lockTimeout.js +2 -0
- package/dist/shared/rwLock.d.ts +22 -0
- package/dist/shared/rwLock.js +124 -0
- package/dist/shared/serialization.js +1 -0
- package/dist/shared/skipList.d.ts +0 -5
- package/dist/shared/skipList.js +10 -57
- package/dist/shared/skipListNodes.d.ts +6 -0
- package/dist/shared/skipListNodes.js +43 -0
- package/dist/shared/types/lock.d.ts +7 -0
- package/dist/shared/types/lock.js +1 -0
- package/dist/shared/types/skipList.d.ts +4 -0
- package/dist/shared/types/skipList.js +1 -0
- package/package.json +2 -1
|
@@ -1,482 +1,6 @@
|
|
|
1
|
-
/**
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
import { EventEmitter } from 'events';
|
|
7
|
-
import { DEFAULT_CONNECTION } from './types';
|
|
8
|
-
import { HealthTracker } from './health';
|
|
9
|
-
import { ReconnectManager } from './reconnect';
|
|
10
|
-
import { createConnection, CommandQueue } from './connection';
|
|
11
|
-
import { FrameParser } from '../../infrastructure/server/protocol';
|
|
12
|
-
import { decodeMessagePack, encodeMessagePack } from '../../shared/msgpack';
|
|
13
|
-
/**
|
|
14
|
-
* Sentinel error class for the synthetic rejection issued by close()/rejectAll().
|
|
15
|
-
* Using a dedicated subclass (instead of matching `error.message`) ensures the
|
|
16
|
-
* process-level filter never collides with user code that happens to throw an
|
|
17
|
-
* Error whose message is "Client closed" (Redis, HTTP, DB pool clients all do).
|
|
18
|
-
*/
|
|
19
|
-
export class ClientClosedError extends Error {
|
|
20
|
-
constructor(message = 'Client closed') {
|
|
21
|
-
super(message);
|
|
22
|
-
this.name = 'ClientClosedError';
|
|
23
|
-
}
|
|
24
|
-
}
|
|
25
|
-
/**
|
|
26
|
-
* One-time installer of a process-level filter that swallows the synthetic
|
|
27
|
-
* ClientClosedError issued by close()/rejectAll(). Catches the rare chained-
|
|
28
|
-
* Promise leak that `cmd.promise?.catch(() => {})` in rejectAll cannot reach
|
|
29
|
-
* (e.g. await-then-throw patterns where the rejection propagates through the
|
|
30
|
-
* awaiter's own Promise chain).
|
|
31
|
-
*
|
|
32
|
-
* Implementation note: the listener is intentionally a no-op for non-matching
|
|
33
|
-
* rejections. process.on('unhandledRejection', fn) calls all registered
|
|
34
|
-
* listeners independently — so existing handlers (e.g. main.ts shutdown
|
|
35
|
-
* handler) still fire for real rejections. We must NOT re-throw here because
|
|
36
|
-
* a throw inside an unhandledRejection listener becomes an uncaughtException,
|
|
37
|
-
* which would interact badly with main.ts's existing uncaughtException
|
|
38
|
-
* handler and cause double-shutdown attempts.
|
|
39
|
-
*/
|
|
40
|
-
let clientClosedFilterInstalled = false;
|
|
41
|
-
function installClientClosedFilter() {
|
|
42
|
-
if (clientClosedFilterInstalled)
|
|
43
|
-
return;
|
|
44
|
-
clientClosedFilterInstalled = true;
|
|
45
|
-
process.on('unhandledRejection', (reason) => {
|
|
46
|
-
if (reason instanceof ClientClosedError) {
|
|
47
|
-
return; // swallow — other listeners (if any) fire independently
|
|
48
|
-
}
|
|
49
|
-
// Non-matching rejection: no-op here. Other registered listeners (or the
|
|
50
|
-
// runtime default per --unhandled-rejections) handle it independently.
|
|
51
|
-
});
|
|
52
|
-
}
|
|
53
|
-
/**
|
|
54
|
-
* TCP Client - manages connection to bunqueue server
|
|
55
|
-
* Supports pipelining for high-throughput operations
|
|
56
|
-
*/
|
|
57
|
-
export class TcpClient extends EventEmitter {
|
|
58
|
-
// biome-ignore lint/suspicious/noExplicitAny: EventEmitter's fallback overload requires any[]
|
|
59
|
-
on(event, listener) {
|
|
60
|
-
return super.on(event, listener);
|
|
61
|
-
}
|
|
62
|
-
// biome-ignore lint/suspicious/noExplicitAny: EventEmitter's fallback overload requires any[]
|
|
63
|
-
once(event, listener) {
|
|
64
|
-
return super.once(event, listener);
|
|
65
|
-
}
|
|
66
|
-
socket = null;
|
|
67
|
-
connected = false;
|
|
68
|
-
connecting = false;
|
|
69
|
-
options;
|
|
70
|
-
health;
|
|
71
|
-
reconnect;
|
|
72
|
-
commands;
|
|
73
|
-
/** Request ID counter for pipelining support */
|
|
74
|
-
reqIdCounter = 0;
|
|
75
|
-
constructor(options = {}) {
|
|
76
|
-
super();
|
|
77
|
-
this.options = { ...DEFAULT_CONNECTION, ...options };
|
|
78
|
-
this.commands = new CommandQueue();
|
|
79
|
-
this.health = new HealthTracker({
|
|
80
|
-
pingInterval: this.options.pingInterval,
|
|
81
|
-
maxPingFailures: this.options.maxPingFailures,
|
|
82
|
-
maxCommandTimeouts: this.options.maxCommandTimeouts,
|
|
83
|
-
});
|
|
84
|
-
this.reconnect = new ReconnectManager({
|
|
85
|
-
maxReconnectAttempts: this.options.maxReconnectAttempts,
|
|
86
|
-
reconnectDelay: this.options.reconnectDelay,
|
|
87
|
-
maxReconnectDelay: this.options.maxReconnectDelay,
|
|
88
|
-
autoReconnect: this.options.autoReconnect,
|
|
89
|
-
});
|
|
90
|
-
this.reconnect.on('reconnecting', (data) => this.emit('reconnecting', data));
|
|
91
|
-
this.reconnect.on('maxReconnectAttemptsReached', () => {
|
|
92
|
-
this.emit('maxReconnectAttemptsReached');
|
|
93
|
-
this.commands.rejectAll(new Error('Max reconnection attempts reached'));
|
|
94
|
-
});
|
|
95
|
-
}
|
|
96
|
-
/** Connect to server */
|
|
97
|
-
async connect() {
|
|
98
|
-
if (this.connected)
|
|
99
|
-
return;
|
|
100
|
-
if (this.connecting) {
|
|
101
|
-
return this.waitForConnection();
|
|
102
|
-
}
|
|
103
|
-
this.connecting = true;
|
|
104
|
-
this.reconnect.setClosed(false);
|
|
105
|
-
try {
|
|
106
|
-
await this.doConnect();
|
|
107
|
-
this.reconnect.reset();
|
|
108
|
-
this.emit('connected');
|
|
109
|
-
this.health.startPing(async () => {
|
|
110
|
-
await this.ping();
|
|
111
|
-
});
|
|
112
|
-
this.processQueue();
|
|
113
|
-
}
|
|
114
|
-
catch (err) {
|
|
115
|
-
this.connecting = false;
|
|
116
|
-
if (this.reconnect.canReconnect()) {
|
|
117
|
-
this.reconnect.scheduleReconnect(() => this.connect());
|
|
118
|
-
}
|
|
119
|
-
throw err;
|
|
120
|
-
}
|
|
121
|
-
}
|
|
122
|
-
waitForConnection() {
|
|
123
|
-
return new Promise((resolve, reject) => {
|
|
124
|
-
const onConnect = () => {
|
|
125
|
-
this.off('error', onError);
|
|
126
|
-
resolve();
|
|
127
|
-
};
|
|
128
|
-
const onError = (err) => {
|
|
129
|
-
this.off('connected', onConnect);
|
|
130
|
-
reject(err);
|
|
131
|
-
};
|
|
132
|
-
this.once('connected', onConnect);
|
|
133
|
-
this.once('error', onError);
|
|
134
|
-
});
|
|
135
|
-
}
|
|
136
|
-
async doConnect() {
|
|
137
|
-
const { socket } = await createConnection({
|
|
138
|
-
host: this.options.host,
|
|
139
|
-
port: this.options.port,
|
|
140
|
-
tls: this.options.tls,
|
|
141
|
-
}, this.options.connectTimeout, {
|
|
142
|
-
onData: (frame) => {
|
|
143
|
-
this.handleData(frame);
|
|
144
|
-
},
|
|
145
|
-
onClose: () => {
|
|
146
|
-
this.handleClose();
|
|
147
|
-
},
|
|
148
|
-
onError: (error) => this.emit('error', error),
|
|
149
|
-
});
|
|
150
|
-
this.socket = socket;
|
|
151
|
-
if (this.options.token) {
|
|
152
|
-
try {
|
|
153
|
-
await this.authenticate();
|
|
154
|
-
}
|
|
155
|
-
catch (err) {
|
|
156
|
-
this.socket.end();
|
|
157
|
-
this.socket = null;
|
|
158
|
-
throw err;
|
|
159
|
-
}
|
|
160
|
-
}
|
|
161
|
-
this.connected = true;
|
|
162
|
-
this.connecting = false;
|
|
163
|
-
this.health.recordConnected();
|
|
164
|
-
}
|
|
165
|
-
async authenticate() {
|
|
166
|
-
const response = await this.sendDirect({ cmd: 'Auth', token: this.options.token });
|
|
167
|
-
if (!response.ok) {
|
|
168
|
-
throw new Error('Authentication failed');
|
|
169
|
-
}
|
|
170
|
-
}
|
|
171
|
-
/**
|
|
172
|
-
* Handle incoming data frame
|
|
173
|
-
* Uses reqId-based matching for pipelining support
|
|
174
|
-
*/
|
|
175
|
-
handleData(frame) {
|
|
176
|
-
try {
|
|
177
|
-
const response = decodeMessagePack(frame);
|
|
178
|
-
const reqId = response.reqId;
|
|
179
|
-
// Try pipelining mode first (reqId-based matching)
|
|
180
|
-
if (reqId) {
|
|
181
|
-
const pending = this.commands.removeByReqId(reqId);
|
|
182
|
-
if (pending) {
|
|
183
|
-
clearTimeout(pending.timeout);
|
|
184
|
-
pending.resolve(response);
|
|
185
|
-
// Process more queued commands if we have room
|
|
186
|
-
this.processQueue();
|
|
187
|
-
return;
|
|
188
|
-
}
|
|
189
|
-
}
|
|
190
|
-
// Fall back to legacy mode (current command)
|
|
191
|
-
const current = this.commands.getCurrentCommand();
|
|
192
|
-
if (current) {
|
|
193
|
-
clearTimeout(current.timeout);
|
|
194
|
-
current.resolve(response);
|
|
195
|
-
this.commands.setCurrentCommand(null);
|
|
196
|
-
this.processQueue();
|
|
197
|
-
return;
|
|
198
|
-
}
|
|
199
|
-
// Unknown response - log warning
|
|
200
|
-
this.emit('warning', { type: 'unknown_response', reqId });
|
|
201
|
-
}
|
|
202
|
-
catch {
|
|
203
|
-
// Malformed/unparseable frame: the framed byte stream is now
|
|
204
|
-
// unrecoverable (we cannot trust subsequent frame boundaries), and in
|
|
205
|
-
// pipelining mode the legacy `currentCommand` slot is null — so checking
|
|
206
|
-
// it alone would leave every in-flight command hanging until its
|
|
207
|
-
// per-command timeout. Reject ALL pending + in-flight commands promptly
|
|
208
|
-
// and tear down the socket so reconnection (if enabled) can re-establish
|
|
209
|
-
// a clean stream.
|
|
210
|
-
const err = new Error('Invalid response from server');
|
|
211
|
-
this.emit('warning', { type: 'malformed_frame' });
|
|
212
|
-
this.commands.rejectAll(err);
|
|
213
|
-
this.forceReconnect();
|
|
214
|
-
}
|
|
215
|
-
}
|
|
216
|
-
handleClose() {
|
|
217
|
-
const wasConnected = this.connected;
|
|
218
|
-
this.connected = false;
|
|
219
|
-
this.connecting = false;
|
|
220
|
-
this.socket = null;
|
|
221
|
-
this.health.stopPing();
|
|
222
|
-
// Reject all in-flight commands (pipelining + legacy)
|
|
223
|
-
this.commands.rejectAll(new Error('Connection lost'));
|
|
224
|
-
if (wasConnected) {
|
|
225
|
-
this.emit('disconnected');
|
|
226
|
-
if (this.reconnect.canReconnect()) {
|
|
227
|
-
this.reconnect.scheduleReconnect(() => this.connect());
|
|
228
|
-
}
|
|
229
|
-
}
|
|
230
|
-
}
|
|
231
|
-
/** Send ping to check connection health */
|
|
232
|
-
async ping() {
|
|
233
|
-
if (!this.connected)
|
|
234
|
-
return false;
|
|
235
|
-
try {
|
|
236
|
-
const start = Date.now();
|
|
237
|
-
const response = await this.send({ cmd: 'Ping' });
|
|
238
|
-
const data = response.data;
|
|
239
|
-
const success = data?.pong === true;
|
|
240
|
-
if (success) {
|
|
241
|
-
this.health.recordPingSuccess(Date.now() - start);
|
|
242
|
-
this.emit('health', { type: 'ping_success', latency: Date.now() - start });
|
|
243
|
-
}
|
|
244
|
-
else {
|
|
245
|
-
this.handlePingFailure();
|
|
246
|
-
}
|
|
247
|
-
return success;
|
|
248
|
-
}
|
|
249
|
-
catch {
|
|
250
|
-
this.handlePingFailure();
|
|
251
|
-
return false;
|
|
252
|
-
}
|
|
253
|
-
}
|
|
254
|
-
handlePingFailure() {
|
|
255
|
-
if (this.health.recordPingFailure()) {
|
|
256
|
-
this.emit('health', { type: 'unhealthy', reason: 'max_ping_failures' });
|
|
257
|
-
this.forceReconnect();
|
|
258
|
-
}
|
|
259
|
-
else {
|
|
260
|
-
this.emit('health', { type: 'ping_failed' });
|
|
261
|
-
}
|
|
262
|
-
}
|
|
263
|
-
/**
|
|
264
|
-
* A command timed out. On a half-open socket (peer gone, no FIN/RST) writes
|
|
265
|
-
* keep succeeding but no response ever returns — every command times out
|
|
266
|
-
* while the socket still looks "connected". The health-check ping is one way
|
|
267
|
-
* to notice, but it can be disabled or slower than real traffic, leaving a
|
|
268
|
-
* worker's PULL loop to time out forever without ever reconnecting (#94).
|
|
269
|
-
* Treat a sustained run of timeouts as a dead link and force a reconnect.
|
|
270
|
-
*/
|
|
271
|
-
handleCommandTimeout() {
|
|
272
|
-
if (this.health.recordCommandTimeout()) {
|
|
273
|
-
this.emit('health', { type: 'unhealthy', reason: 'max_command_timeouts' });
|
|
274
|
-
this.forceReconnect();
|
|
275
|
-
}
|
|
276
|
-
}
|
|
277
|
-
forceReconnect() {
|
|
278
|
-
if (this.reconnect.isClosed())
|
|
279
|
-
return;
|
|
280
|
-
if (this.socket) {
|
|
281
|
-
// end() can throw on an already-errored/half-dead socket. Swallow it:
|
|
282
|
-
// failing to close the corpse must NOT abort the reconnect path below,
|
|
283
|
-
// or the connection would stay wedged forever (the #94 failure mode).
|
|
284
|
-
try {
|
|
285
|
-
this.socket.end();
|
|
286
|
-
}
|
|
287
|
-
catch {
|
|
288
|
-
/* socket already torn down */
|
|
289
|
-
}
|
|
290
|
-
this.socket = null;
|
|
291
|
-
}
|
|
292
|
-
this.connected = false;
|
|
293
|
-
this.health.stopPing();
|
|
294
|
-
// Settle every in-flight/queued command NOW. Otherwise their per-command
|
|
295
|
-
// timeouts keep ticking and fire AFTER the fresh socket is up — each stale
|
|
296
|
-
// timeout bumps the new connection's dead-link counter and can re-trigger
|
|
297
|
-
// forceReconnect in a loop (a reconnect storm that never stabilises). It
|
|
298
|
-
// also unblocks awaiting callers (e.g. a Worker's PULL) immediately instead
|
|
299
|
-
// of making them wait out the full commandTimeout on a corpse.
|
|
300
|
-
this.commands.rejectAll(new Error('Connection lost'));
|
|
301
|
-
if (this.reconnect.canReconnect())
|
|
302
|
-
this.reconnect.scheduleReconnect(() => this.connect());
|
|
303
|
-
}
|
|
304
|
-
/** Get connection health metrics */
|
|
305
|
-
getHealth() {
|
|
306
|
-
return this.health.getHealth(this.getState());
|
|
307
|
-
}
|
|
308
|
-
/** Generate unique request ID for pipelining */
|
|
309
|
-
generateReqId() {
|
|
310
|
-
// Use modulo to prevent overflow, wrap at 2^31
|
|
311
|
-
this.reqIdCounter = (this.reqIdCounter + 1) & 0x7fffffff;
|
|
312
|
-
return String(this.reqIdCounter);
|
|
313
|
-
}
|
|
314
|
-
/**
|
|
315
|
-
* Send command directly (bypass queue)
|
|
316
|
-
* Used for authentication and critical commands
|
|
317
|
-
*/
|
|
318
|
-
sendDirect(command) {
|
|
319
|
-
if (!this.socket)
|
|
320
|
-
return Promise.reject(new Error('Not connected'));
|
|
321
|
-
const startTime = Date.now();
|
|
322
|
-
this.health.recordCommandSent();
|
|
323
|
-
const reqId = this.generateReqId();
|
|
324
|
-
const commandWithReqId = { ...command, reqId };
|
|
325
|
-
// Definite-assignment assertion: assigned synchronously by Promise executor below.
|
|
326
|
-
let pendingRef;
|
|
327
|
-
const promise = new Promise((resolve, reject) => {
|
|
328
|
-
const timeout = setTimeout(() => {
|
|
329
|
-
// Try to remove from in-flight
|
|
330
|
-
const removed = this.commands.removeByReqId(reqId);
|
|
331
|
-
if (removed) {
|
|
332
|
-
this.health.recordError();
|
|
333
|
-
reject(new Error('Command timeout'));
|
|
334
|
-
}
|
|
335
|
-
}, this.options.commandTimeout);
|
|
336
|
-
pendingRef = {
|
|
337
|
-
id: 0,
|
|
338
|
-
reqId,
|
|
339
|
-
command: commandWithReqId,
|
|
340
|
-
resolve: (result) => {
|
|
341
|
-
this.health.recordSuccess(Date.now() - startTime);
|
|
342
|
-
resolve(result);
|
|
343
|
-
},
|
|
344
|
-
reject: (err) => {
|
|
345
|
-
this.health.recordError();
|
|
346
|
-
reject(err);
|
|
347
|
-
},
|
|
348
|
-
timeout,
|
|
349
|
-
};
|
|
350
|
-
});
|
|
351
|
-
// Promise constructor executor is synchronous, so pendingRef is assigned.
|
|
352
|
-
pendingRef.promise = promise;
|
|
353
|
-
this.commands.addInFlight(pendingRef);
|
|
354
|
-
// Send immediately (this.socket null-checked at entry of sendDirect)
|
|
355
|
-
this.socket.write(FrameParser.frame(encodeMessagePack(commandWithReqId)));
|
|
356
|
-
return promise;
|
|
357
|
-
}
|
|
358
|
-
/**
|
|
359
|
-
* Process queued commands
|
|
360
|
-
* Sends multiple commands up to maxInFlight (pipelining)
|
|
361
|
-
*/
|
|
362
|
-
processQueue() {
|
|
363
|
-
if (!this.connected || !this.socket)
|
|
364
|
-
return;
|
|
365
|
-
// Send commands while under the maxInFlight limit
|
|
366
|
-
while (this.commands.hasPending() && this.commands.canSendMore(this.options.maxInFlight)) {
|
|
367
|
-
const next = this.commands.dequeue();
|
|
368
|
-
if (!next)
|
|
369
|
-
break;
|
|
370
|
-
// Clear old timeout and create new one
|
|
371
|
-
clearTimeout(next.timeout);
|
|
372
|
-
const newTimeout = setTimeout(() => {
|
|
373
|
-
const removed = this.commands.removeByReqId(next.reqId);
|
|
374
|
-
if (removed) {
|
|
375
|
-
this.health.recordError();
|
|
376
|
-
next.reject(new Error('Command timeout'));
|
|
377
|
-
// In-flight command got no response: count it toward dead-link detection.
|
|
378
|
-
this.handleCommandTimeout();
|
|
379
|
-
}
|
|
380
|
-
}, this.options.commandTimeout);
|
|
381
|
-
next.timeout = newTimeout;
|
|
382
|
-
// Add to in-flight tracking and send
|
|
383
|
-
this.commands.addInFlight(next);
|
|
384
|
-
this.socket.write(FrameParser.frame(encodeMessagePack(next.command)));
|
|
385
|
-
}
|
|
386
|
-
}
|
|
387
|
-
/**
|
|
388
|
-
* Send command and wait for response
|
|
389
|
-
* Uses pipelining for high throughput
|
|
390
|
-
*/
|
|
391
|
-
send(command) {
|
|
392
|
-
const startTime = Date.now();
|
|
393
|
-
this.health.recordCommandSent();
|
|
394
|
-
const reqId = this.generateReqId();
|
|
395
|
-
const commandWithReqId = { ...command, reqId };
|
|
396
|
-
const id = this.commands.nextId();
|
|
397
|
-
// Definite-assignment assertion: assigned synchronously by Promise executor below.
|
|
398
|
-
let pendingRef;
|
|
399
|
-
const promise = new Promise((resolve, reject) => {
|
|
400
|
-
const timeout = setTimeout(() => {
|
|
401
|
-
// Try to remove from queue first. A still-queued command never reached
|
|
402
|
-
// the socket (e.g. waiting on connect), so it is NOT evidence of a dead
|
|
403
|
-
// link — reject it but don't count it toward dead-link detection.
|
|
404
|
-
if (this.commands.remove(id)) {
|
|
405
|
-
this.health.recordError();
|
|
406
|
-
reject(new Error('Command timeout'));
|
|
407
|
-
return;
|
|
408
|
-
}
|
|
409
|
-
// Try to remove from in-flight: this one WAS sent and got no response.
|
|
410
|
-
const removed = this.commands.removeByReqId(reqId);
|
|
411
|
-
if (removed) {
|
|
412
|
-
this.health.recordError();
|
|
413
|
-
reject(new Error('Command timeout'));
|
|
414
|
-
this.handleCommandTimeout();
|
|
415
|
-
}
|
|
416
|
-
}, this.options.commandTimeout);
|
|
417
|
-
pendingRef = {
|
|
418
|
-
id,
|
|
419
|
-
reqId,
|
|
420
|
-
command: commandWithReqId,
|
|
421
|
-
resolve: (result) => {
|
|
422
|
-
this.health.recordSuccess(Date.now() - startTime);
|
|
423
|
-
resolve(result);
|
|
424
|
-
},
|
|
425
|
-
reject: (err) => {
|
|
426
|
-
this.health.recordError();
|
|
427
|
-
reject(err);
|
|
428
|
-
},
|
|
429
|
-
timeout,
|
|
430
|
-
};
|
|
431
|
-
});
|
|
432
|
-
// Promise constructor executor is synchronous, so pendingRef is assigned.
|
|
433
|
-
pendingRef.promise = promise;
|
|
434
|
-
this.commands.enqueue(pendingRef);
|
|
435
|
-
// Connect if needed, then process queue
|
|
436
|
-
if (!this.connected && !this.connecting) {
|
|
437
|
-
// Connection errors during send are handled by command timeout/rejection
|
|
438
|
-
this.connect().catch(() => {
|
|
439
|
-
// The queued command owns timeout and rejection reporting.
|
|
440
|
-
});
|
|
441
|
-
}
|
|
442
|
-
else if (this.connected) {
|
|
443
|
-
this.processQueue();
|
|
444
|
-
}
|
|
445
|
-
return promise;
|
|
446
|
-
}
|
|
447
|
-
/** Close connection */
|
|
448
|
-
close() {
|
|
449
|
-
this.reconnect.setClosed(true);
|
|
450
|
-
this.health.stopPing();
|
|
451
|
-
this.reconnect.cancelReconnect();
|
|
452
|
-
// Install a process-level filter for the synthetic ClientClosedError we
|
|
453
|
-
// are about to issue. Catches the rare case where a caller's .catch() is
|
|
454
|
-
// attached on a chained Promise that our cmd.promise?.catch() cannot
|
|
455
|
-
// reach (await-then-throw patterns).
|
|
456
|
-
installClientClosedFilter();
|
|
457
|
-
this.commands.rejectAll(new ClientClosedError());
|
|
458
|
-
if (this.socket) {
|
|
459
|
-
this.socket.end();
|
|
460
|
-
this.socket = null;
|
|
461
|
-
this.connected = false;
|
|
462
|
-
}
|
|
463
|
-
}
|
|
464
|
-
/** Check if connected */
|
|
465
|
-
isConnected() {
|
|
466
|
-
return this.connected;
|
|
467
|
-
}
|
|
468
|
-
/** Get connection state */
|
|
469
|
-
getState() {
|
|
470
|
-
if (this.reconnect.isClosed())
|
|
471
|
-
return 'closed';
|
|
472
|
-
if (this.connected)
|
|
473
|
-
return 'connected';
|
|
474
|
-
if (this.connecting)
|
|
475
|
-
return 'connecting';
|
|
476
|
-
return 'disconnected';
|
|
477
|
-
}
|
|
478
|
-
/** Get number of in-flight commands (for monitoring) */
|
|
479
|
-
getInFlightCount() {
|
|
480
|
-
return this.commands.getInFlightCount();
|
|
481
|
-
}
|
|
1
|
+
/** Production TCP client façade. */
|
|
2
|
+
import { TcpClientLifecycle } from './runtime/lifecycle';
|
|
3
|
+
export { ClientClosedError } from './errors';
|
|
4
|
+
/** Behavior is composed from focused connection, health, and command layers. */
|
|
5
|
+
export class TcpClient extends TcpClientLifecycle {
|
|
482
6
|
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { PendingCommand } from './types';
|
|
2
|
+
/** Pending-command queue with reqId-based in-flight tracking. */
|
|
3
|
+
export declare class CommandQueue {
|
|
4
|
+
private readonly pendingCommands;
|
|
5
|
+
private pendingQueue;
|
|
6
|
+
private currentCommand;
|
|
7
|
+
private commandIdCounter;
|
|
8
|
+
private readonly inFlightByReqId;
|
|
9
|
+
getCurrentCommand(): PendingCommand | null;
|
|
10
|
+
setCurrentCommand(command: PendingCommand | null): void;
|
|
11
|
+
hasPending(): boolean;
|
|
12
|
+
getInFlightCount(): number;
|
|
13
|
+
canSendMore(maxInFlight: number): boolean;
|
|
14
|
+
addInFlight(command: PendingCommand): void;
|
|
15
|
+
getByReqId(reqId: string): PendingCommand | undefined;
|
|
16
|
+
removeByReqId(reqId: string): PendingCommand | undefined;
|
|
17
|
+
enqueue(command: PendingCommand): void;
|
|
18
|
+
nextId(): number;
|
|
19
|
+
dequeue(): PendingCommand | null;
|
|
20
|
+
remove(id: number): boolean;
|
|
21
|
+
rejectAll(error: Error): void;
|
|
22
|
+
clearCurrent(error?: Error): void;
|
|
23
|
+
}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
/** Pending-command queue with reqId-based in-flight tracking. */
|
|
2
|
+
export class CommandQueue {
|
|
3
|
+
pendingCommands = new Map();
|
|
4
|
+
pendingQueue = [];
|
|
5
|
+
currentCommand = null;
|
|
6
|
+
commandIdCounter = 0;
|
|
7
|
+
inFlightByReqId = new Map();
|
|
8
|
+
getCurrentCommand() {
|
|
9
|
+
return this.currentCommand;
|
|
10
|
+
}
|
|
11
|
+
setCurrentCommand(command) {
|
|
12
|
+
this.currentCommand = command;
|
|
13
|
+
}
|
|
14
|
+
hasPending() {
|
|
15
|
+
return this.pendingCommands.size > 0;
|
|
16
|
+
}
|
|
17
|
+
getInFlightCount() {
|
|
18
|
+
return this.inFlightByReqId.size;
|
|
19
|
+
}
|
|
20
|
+
canSendMore(maxInFlight) {
|
|
21
|
+
return this.inFlightByReqId.size < maxInFlight;
|
|
22
|
+
}
|
|
23
|
+
addInFlight(command) {
|
|
24
|
+
this.inFlightByReqId.set(command.reqId, command);
|
|
25
|
+
}
|
|
26
|
+
getByReqId(reqId) {
|
|
27
|
+
return this.inFlightByReqId.get(reqId);
|
|
28
|
+
}
|
|
29
|
+
removeByReqId(reqId) {
|
|
30
|
+
const command = this.inFlightByReqId.get(reqId);
|
|
31
|
+
if (command)
|
|
32
|
+
this.inFlightByReqId.delete(reqId);
|
|
33
|
+
return command;
|
|
34
|
+
}
|
|
35
|
+
enqueue(command) {
|
|
36
|
+
this.pendingCommands.set(command.id, command);
|
|
37
|
+
this.pendingQueue.push(command.id);
|
|
38
|
+
}
|
|
39
|
+
nextId() {
|
|
40
|
+
return ++this.commandIdCounter;
|
|
41
|
+
}
|
|
42
|
+
dequeue() {
|
|
43
|
+
const nextId = this.pendingQueue.shift();
|
|
44
|
+
if (nextId === undefined)
|
|
45
|
+
return null;
|
|
46
|
+
const next = this.pendingCommands.get(nextId);
|
|
47
|
+
if (!next)
|
|
48
|
+
return null;
|
|
49
|
+
this.pendingCommands.delete(nextId);
|
|
50
|
+
return next;
|
|
51
|
+
}
|
|
52
|
+
remove(id) {
|
|
53
|
+
if (!this.pendingCommands.has(id))
|
|
54
|
+
return false;
|
|
55
|
+
this.pendingCommands.delete(id);
|
|
56
|
+
const queueIndex = this.pendingQueue.indexOf(id);
|
|
57
|
+
if (queueIndex !== -1)
|
|
58
|
+
this.pendingQueue.splice(queueIndex, 1);
|
|
59
|
+
return true;
|
|
60
|
+
}
|
|
61
|
+
rejectAll(error) {
|
|
62
|
+
for (const command of this.pendingCommands.values()) {
|
|
63
|
+
clearTimeout(command.timeout);
|
|
64
|
+
command.promise?.catch(() => { });
|
|
65
|
+
command.reject(error);
|
|
66
|
+
}
|
|
67
|
+
this.pendingCommands.clear();
|
|
68
|
+
this.pendingQueue = [];
|
|
69
|
+
for (const command of this.inFlightByReqId.values()) {
|
|
70
|
+
clearTimeout(command.timeout);
|
|
71
|
+
command.promise?.catch(() => { });
|
|
72
|
+
command.reject(error);
|
|
73
|
+
}
|
|
74
|
+
this.inFlightByReqId.clear();
|
|
75
|
+
if (this.currentCommand) {
|
|
76
|
+
clearTimeout(this.currentCommand.timeout);
|
|
77
|
+
this.currentCommand.reject(error);
|
|
78
|
+
this.currentCommand = null;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
clearCurrent(error) {
|
|
82
|
+
if (this.currentCommand) {
|
|
83
|
+
clearTimeout(this.currentCommand.timeout);
|
|
84
|
+
if (error)
|
|
85
|
+
this.currentCommand.reject(error);
|
|
86
|
+
this.currentCommand = null;
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
}
|
|
@@ -1,85 +1,4 @@
|
|
|
1
|
-
/**
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
import type { SocketWrapper, PendingCommand, ClientTlsOptions } from './types';
|
|
6
|
-
/** Connection events */
|
|
7
|
-
export interface ConnectionEvents {
|
|
8
|
-
onData: (frame: Uint8Array) => void;
|
|
9
|
-
onClose: () => void;
|
|
10
|
-
onError: (error: Error) => void;
|
|
11
|
-
}
|
|
12
|
-
/** Connection result */
|
|
13
|
-
export interface ConnectionResult {
|
|
14
|
-
socket: SocketWrapper;
|
|
15
|
-
cleanup: () => void;
|
|
16
|
-
}
|
|
17
|
-
/** Connection target */
|
|
18
|
-
export interface ConnectionTarget {
|
|
19
|
-
/** TCP host */
|
|
20
|
-
host?: string;
|
|
21
|
-
/** TCP port */
|
|
22
|
-
port?: number;
|
|
23
|
-
/** Enable TLS: true (system CAs) or per-connection TLS options */
|
|
24
|
-
tls?: boolean | ClientTlsOptions;
|
|
25
|
-
}
|
|
26
|
-
/**
|
|
27
|
-
* Map client TLS options to the `tls` value accepted by Bun.connect.
|
|
28
|
-
* Returns undefined when TLS is disabled (plaintext, the default).
|
|
29
|
-
*
|
|
30
|
-
* The CA is read into bytes (not passed as a `Bun.file` handle): Bun computes
|
|
31
|
-
* the peer's `authorizationError` from this `ca`, and we enforce it in the
|
|
32
|
-
* `handshake` handler (see `tlsRequiresVerification` / #109) — Bun.connect
|
|
33
|
-
* itself never rejects an unauthorized peer on the client side.
|
|
34
|
-
*/
|
|
35
|
-
export declare function buildClientTls(tls: boolean | ClientTlsOptions | undefined): true | Record<string, unknown> | undefined;
|
|
36
|
-
/**
|
|
37
|
-
* Whether the caller asked us to authenticate the server certificate.
|
|
38
|
-
* Verification is the default for any TLS connection; only an explicit
|
|
39
|
-
* `rejectUnauthorized: false` opts out (encryption-only). #109
|
|
40
|
-
*/
|
|
41
|
-
export declare function tlsRequiresVerification(tls: boolean | ClientTlsOptions | undefined): boolean;
|
|
42
|
-
/**
|
|
43
|
-
* Establish TCP connection to server
|
|
44
|
-
*/
|
|
45
|
-
export declare function createConnection(target: ConnectionTarget, connectTimeout: number, events: ConnectionEvents): Promise<ConnectionResult>;
|
|
46
|
-
/**
|
|
47
|
-
* Command queue for managing pending commands
|
|
48
|
-
* Supports both legacy single-command mode and pipelining mode with reqId tracking
|
|
49
|
-
*/
|
|
50
|
-
export declare class CommandQueue {
|
|
51
|
-
private readonly pendingCommands;
|
|
52
|
-
private pendingQueue;
|
|
53
|
-
private currentCommand;
|
|
54
|
-
private commandIdCounter;
|
|
55
|
-
/** In-flight commands tracked by reqId for pipelining */
|
|
56
|
-
private readonly inFlightByReqId;
|
|
57
|
-
/** Get current command being processed (legacy mode) */
|
|
58
|
-
getCurrentCommand(): PendingCommand | null;
|
|
59
|
-
/** Set current command (legacy mode) */
|
|
60
|
-
setCurrentCommand(cmd: PendingCommand | null): void;
|
|
61
|
-
/** Check if has pending commands in queue */
|
|
62
|
-
hasPending(): boolean;
|
|
63
|
-
/** Get number of in-flight commands */
|
|
64
|
-
getInFlightCount(): number;
|
|
65
|
-
/** Check if can send more commands (pipelining backpressure) */
|
|
66
|
-
canSendMore(maxInFlight: number): boolean;
|
|
67
|
-
/** Add command to in-flight tracking by reqId */
|
|
68
|
-
addInFlight(command: PendingCommand): void;
|
|
69
|
-
/** Get in-flight command by reqId */
|
|
70
|
-
getByReqId(reqId: string): PendingCommand | undefined;
|
|
71
|
-
/** Remove in-flight command by reqId */
|
|
72
|
-
removeByReqId(reqId: string): PendingCommand | undefined;
|
|
73
|
-
/** Add command to queue */
|
|
74
|
-
enqueue(command: PendingCommand): void;
|
|
75
|
-
/** Get next command ID */
|
|
76
|
-
nextId(): number;
|
|
77
|
-
/** Dequeue next command */
|
|
78
|
-
dequeue(): PendingCommand | null;
|
|
79
|
-
/** Remove command by ID */
|
|
80
|
-
remove(id: number): boolean;
|
|
81
|
-
/** Reject all pending and in-flight commands */
|
|
82
|
-
rejectAll(error: Error): void;
|
|
83
|
-
/** Clear current command with optional rejection (legacy mode) */
|
|
84
|
-
clearCurrent(error?: Error): void;
|
|
85
|
-
}
|
|
1
|
+
/** Stable low-level TCP connection import surface. */
|
|
2
|
+
export { CommandQueue } from './commandQueue';
|
|
3
|
+
export { buildClientTls, createConnection, tlsRequiresVerification, } from './transport';
|
|
4
|
+
export type { ConnectionEvents, ConnectionResult, ConnectionTarget } from './transport';
|