@spooled/sdk 1.4.0 → 1.5.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/index.d.cts CHANGED
@@ -1,5 +1,5 @@
1
- import { R as RealtimeConnectionOptions, C as ConnectionState, S as SubscriptionFilter, a as RealtimeEventType, b as RealtimeEvent, c as RetryConfig } from './index-DzTC8ld3.cjs';
2
- export { A as API_VERSION, d as AddDependenciesParams, e as AddDependenciesResponse, f as AdminApiKeyResponse, g as AdminCreateApiKeyParams, h as AdminCreateOrganizationParams, i as AdminCreateOrganizationResponse, j as AdminDeleteOrganizationParams, k as AdminListOrganizationsParams, l as AdminOrganizationDetail, m as AdminOrganizationList, n as AdminOrganizationSummary, o as AdminPlanLimits, p as AdminPlatformStats, q as AdminResource, r as AdminUpdateOrganizationParams, s as AdminUsageStats, t as ApiErrorBody, u as ApiKeySummary, v as ApiKeysResource, w as AuthResource, x as AuthenticationError, y as AuthorizationError, B as BatchJobStatus, z as BillingResource, D as BillingStatus, E as BoostPriorityResponse, F as BulkEnqueueParams, G as BulkEnqueueResponse, H as BulkJobItem, I as CheckEmailResponse, J as CheckSlugResponse, K as CircuitBreaker, L as CircuitBreakerConfig, M as CircuitBreakerOpenError, N as CircuitBreakerOptions, O as CircuitState, P as CircuitStateChange, Q as ClaimJobsParams, T as ClaimJobsResult, U as ClaimedJob, V as CompleteJobParams, W as ConflictError, X as CreateApiKeyParams, Y as CreateApiKeyResponse, Z as CreateBillingPortalParams, _ as CreateBillingPortalResponse, $ as CreateJobParams, a0 as CreateJobResult, a1 as CreateOrganizationParams, a2 as CreateOrganizationResponse, a3 as CreateOutgoingWebhookParams, a4 as CreateScheduleParams, a5 as CreateScheduleResponse, a6 as CreateWorkflowParams, a7 as CreateWorkflowResponse, a8 as CurrentUserResponse, a9 as DEFAULT_CONFIG, aa as DashboardData, ab as DashboardResource, ac as DashboardWorkerSummary, ad as DebugFn, ae as DeleteQueueOptions, af as DependencyInfo, ag as DependencyMode, ah as FailJobParams, ai as GrpcClientOptions, aj as GrpcCompleteJobParams, ak as GrpcCompleteJobResponse, al as GrpcCompleteRequest, am as GrpcCompleteResponse, an as GrpcDequeueJobParams, ao as GrpcDequeueJobResponse, ap as GrpcDequeueRequest, aq as GrpcDequeueResponse, ar as GrpcDeregisterRequest, as as GrpcDeregisterResponse, at as GrpcEnqueueJobParams, au as GrpcEnqueueJobResponse, av as GrpcEnqueueRequest, aw as GrpcEnqueueResponse, ax as GrpcErrorResponse, ay as GrpcFailJobParams, az as GrpcFailJobResponse, aA as GrpcFailRequest, aB as GrpcFailResponse, aC as GrpcGetJobRequest, aD as GrpcGetJobResponse, aE as GrpcGetQueueStatsRequest, aF as GrpcGetQueueStatsResponse, aG as GrpcGetQueueStatsResponse_Legacy, aH as GrpcHeartbeatParams, aI as GrpcHeartbeatRequest, aJ as GrpcHeartbeatResponse, aK as GrpcHeartbeatResponse_Legacy, aL as GrpcJob, aM as GrpcJobStatus, aN as GrpcJobStatusNumber, aO as GrpcProcessRequest, aP as GrpcProcessResponse, aQ as GrpcQueueOperations, aR as GrpcRegisterWorkerParams, aS as GrpcRegisterWorkerRequest, aT as GrpcRegisterWorkerResponse, aU as GrpcRegisterWorkerResponse_Legacy, aV as GrpcRenewLeaseParams, aW as GrpcRenewLeaseRequest, aX as GrpcRenewLeaseResponse, aY as GrpcRenewLeaseResponse_Legacy, aZ as GrpcStreamJobsRequest, a_ as GrpcTimestamp, a$ as GrpcWorkerOperations, b0 as HealthResource, b1 as HealthResponse, b2 as HeartbeatEvent, b3 as HeartbeatJobParams, b4 as HttpClient, b5 as InboundDeliveryStatus, b6 as InboundWebhookDelivery, b7 as IngestCustomWebhookParams, b8 as IngestCustomWebhookResponse, b9 as IngestGitHubWebhookOptions, ba as IngestStripeWebhookOptions, bb as InitialApiKey, bc as Job, bd as JobCompletedEvent, be as JobContext, bf as JobCreatedEvent, bg as JobFailedEvent, bh as JobHandler, bi as JobHistoryEvent, bj as JobHistoryEventType, bk as JobHistoryParams, bl as JobProgressEvent, bm as JobResult, bn as JobSearchParams, bo as JobStartedEvent, bp as JobStats, bq as JobStatus, br as JobStatusChangedEvent, bs as JobStream, bt as JobSummary, bu as JobSummaryStats, bv as JobWithDependencies, bw as JobsResource, bx as JsonArray, by as JsonObject, bz as JsonPrimitive, bA as JsonValue, bB as ListDlqParams, bC as ListInboundDeliveriesParams, bD as ListJobsParams, bE as ListPage, bF as ListParams, bG as ListSchedulesParams, bH as ListWorkflowsParams, bI as LoginParams, bJ as LoginResponse, bK as MetricsResource, bL as NetworkError, bM as NotFoundError, bN as Organization, bO as OrganizationMember, bP as OrganizationSummary, bQ as OrganizationUsage, bR as OrganizationsResource, bS as OutgoingWebhook, bT as OutgoingWebhookDelivery, bU as PaginatedResponse, bV as PaginationParams, bW as PauseQueueResponse, bX as PayloadTooLargeError, bY as PlanCount, bZ as PlanLimits, b_ as PlanTier, b$ as ProcessJobsStream, c0 as PurgeDlqParams, c1 as PurgeDlqResponse, c2 as QueueConfig, c3 as QueueConfigSummary, c4 as QueuePausedEvent, c5 as QueueResumedEvent, c6 as QueueStats, c7 as QueueSummary, c8 as QueuesResource, c9 as RateLimitError, ca as RateLimitInfo, cb as RealtimeEventData, cc as RecentActivity, cd as RefreshTokenParams, ce as RefreshTokenResponse, cf as RegisterWorkerParams, cg as RegisterWorkerResponse, ch as ResolvedConfig, ci as ResourceUsage, cj as ResumeQueueResponse, ck as RetryDlqParams, cl as RetryDlqResponse, cm as SDK_VERSION, cn as Schedule, co as ScheduleRun, cp as ScheduleRunStatus, cq as ScheduleTriggeredEvent, cr as SchedulesResource, cs as ServerError, ct as SpooledClient, cu as SpooledClientConfig, cv as SpooledError, cw as SpooledGrpcClient, cx as SpooledRealtime, cy as SpooledRealtimeOptions, cz as SpooledWorker, cA as SpooledWorkerOptions, cB as StartEmailLoginResponse, cC as StreamOptions, cD as SystemInfo, cE as TestWebhookResponse, cF as TimeoutError, cG as TokenClaims, cH as TriggerScheduleResponse, cI as UnsupportedOperationError, cJ as UpdateApiKeyParams, cK as UpdateOrganizationParams, cL as UpdateOutgoingWebhookParams, cM as UpdateQueueConfigParams, cN as UpdateScheduleParams, cO as UsageItem, cP as UsageWarning, cQ as ValidateTokenParams, cR as ValidateTokenResponse, cS as ValidationError, cT as WebhookDeliveryStatus, cU as WebhookEventType, cV as WebhookFormat, cW as WebhookIngestionResource, cX as WebhookTokenResponse, cY as WebhooksResource, cZ as Worker, c_ as WorkerDeregisteredEvent, c$ as WorkerEvent, d0 as WorkerEventData, d1 as WorkerHeartbeatParams, d2 as WorkerRegisteredEvent, d3 as WorkerState, d4 as WorkerStatus, d5 as WorkerSummary, d6 as WorkersResource, d7 as Workflow, d8 as WorkflowJob, d9 as WorkflowJobDefinition, da as WorkflowJobStatus, db as WorkflowResponse, dc as WorkflowStatus, dd as WorkflowsResource, de as asyncIterableFromStream, df as createCircuitBreaker, dg as createClient, dh as createErrorFromResponse, di as createHttpClient, dj as createJobStream, dk as createPaginatedResponse, dl as createProcessJobsStream, dm as dateToTimestamp, dn as isCircuitBreakerFailure, dp as isRetryableError, dq as isSpooledError, dr as parseRateLimitHeaders, ds as resolveConfig, dt as timestampToDate, du as validateConfig } from './index-DzTC8ld3.cjs';
1
+ import { R as RealtimeConnectionOptions, C as ConnectionState, S as SubscriptionFilter, a as RealtimeEventType, b as RealtimeEvent, c as RetryConfig } from './index-CSWlguB8.cjs';
2
+ export { A as API_VERSION, d as AddDependenciesParams, e as AddDependenciesResponse, f as AdminApiKeyResponse, g as AdminCreateApiKeyParams, h as AdminCreateOrganizationParams, i as AdminCreateOrganizationResponse, j as AdminDeleteOrganizationParams, k as AdminListOrganizationsParams, l as AdminOrganizationDetail, m as AdminOrganizationList, n as AdminOrganizationSummary, o as AdminPlanLimits, p as AdminPlatformStats, q as AdminResource, r as AdminUpdateOrganizationParams, s as AdminUsageStats, t as ApiErrorBody, u as ApiKeySummary, v as ApiKeysResource, w as AuthResource, x as AuthenticationError, y as AuthorizationError, B as BatchJobStatus, z as BillingResource, D as BillingStatus, E as BoostPriorityResponse, F as BulkEnqueueParams, G as BulkEnqueueResponse, H as BulkJobItem, I as CheckEmailResponse, J as CheckSlugResponse, K as CircuitBreaker, L as CircuitBreakerConfig, M as CircuitBreakerOpenError, N as CircuitBreakerOptions, O as CircuitState, P as CircuitStateChange, Q as ClaimJobsParams, T as ClaimJobsResult, U as ClaimedJob, V as CompleteJobParams, W as ConflictError, X as CreateApiKeyParams, Y as CreateApiKeyResponse, Z as CreateBillingPortalParams, _ as CreateBillingPortalResponse, $ as CreateJobParams, a0 as CreateJobResult, a1 as CreateOrganizationParams, a2 as CreateOrganizationResponse, a3 as CreateOutgoingWebhookParams, a4 as CreateScheduleParams, a5 as CreateScheduleResponse, a6 as CreateWorkflowParams, a7 as CreateWorkflowResponse, a8 as CurrentUserResponse, a9 as DEFAULT_CONFIG, aa as DashboardData, ab as DashboardResource, ac as DashboardWorkerSummary, ad as DebugFn, ae as DeleteQueueOptions, af as DependencyInfo, ag as DependencyMode, ah as FailJobParams, ai as GrpcClientOptions, aj as GrpcCompleteJobParams, ak as GrpcCompleteJobResponse, al as GrpcCompleteRequest, am as GrpcCompleteResponse, an as GrpcDequeueJobParams, ao as GrpcDequeueJobResponse, ap as GrpcDequeueRequest, aq as GrpcDequeueResponse, ar as GrpcDeregisterRequest, as as GrpcDeregisterResponse, at as GrpcEnqueueJobParams, au as GrpcEnqueueJobResponse, av as GrpcEnqueueRequest, aw as GrpcEnqueueResponse, ax as GrpcErrorResponse, ay as GrpcFailJobParams, az as GrpcFailJobResponse, aA as GrpcFailRequest, aB as GrpcFailResponse, aC as GrpcGetJobRequest, aD as GrpcGetJobResponse, aE as GrpcGetQueueStatsRequest, aF as GrpcGetQueueStatsResponse, aG as GrpcGetQueueStatsResponse_Legacy, aH as GrpcHeartbeatParams, aI as GrpcHeartbeatRequest, aJ as GrpcHeartbeatResponse, aK as GrpcHeartbeatResponse_Legacy, aL as GrpcJob, aM as GrpcJobStatus, aN as GrpcJobStatusNumber, aO as GrpcProcessRequest, aP as GrpcProcessResponse, aQ as GrpcQueueOperations, aR as GrpcRegisterWorkerParams, aS as GrpcRegisterWorkerRequest, aT as GrpcRegisterWorkerResponse, aU as GrpcRegisterWorkerResponse_Legacy, aV as GrpcRenewLeaseParams, aW as GrpcRenewLeaseRequest, aX as GrpcRenewLeaseResponse, aY as GrpcRenewLeaseResponse_Legacy, aZ as GrpcStreamJobsRequest, a_ as GrpcTimestamp, a$ as GrpcWorkerOperations, b0 as HealthResource, b1 as HealthResponse, b2 as HeartbeatEvent, b3 as HeartbeatJobParams, b4 as HttpClient, b5 as InboundDeliveryStatus, b6 as InboundWebhookDelivery, b7 as IngestCustomWebhookParams, b8 as IngestCustomWebhookResponse, b9 as IngestGitHubWebhookOptions, ba as IngestStripeWebhookOptions, bb as InitialApiKey, bc as Job, bd as JobCompletedEvent, be as JobContext, bf as JobCreatedEvent, bg as JobFailedEvent, bh as JobHandler, bi as JobHistoryEvent, bj as JobHistoryEventType, bk as JobHistoryParams, bl as JobProgressEvent, bm as JobResult, bn as JobSearchParams, bo as JobStartedEvent, bp as JobStats, bq as JobStatus, br as JobStatusChangedEvent, bs as JobStream, bt as JobSummary, bu as JobSummaryStats, bv as JobWithDependencies, bw as JobsResource, bx as JsonArray, by as JsonObject, bz as JsonPrimitive, bA as JsonValue, bB as ListDlqParams, bC as ListInboundDeliveriesParams, bD as ListJobsParams, bE as ListPage, bF as ListParams, bG as ListSchedulesParams, bH as ListWorkflowsParams, bI as LoginParams, bJ as LoginResponse, bK as MetricsResource, bL as NetworkError, bM as NotFoundError, bN as Organization, bO as OrganizationMember, bP as OrganizationSummary, bQ as OrganizationUsage, bR as OrganizationsResource, bS as OutgoingWebhook, bT as OutgoingWebhookDelivery, bU as PaginatedResponse, bV as PaginationParams, bW as PauseQueueResponse, bX as PayloadTooLargeError, bY as PlanCount, bZ as PlanLimits, b_ as PlanTier, b$ as ProcessJobsStream, c0 as PurgeDlqParams, c1 as PurgeDlqResponse, c2 as QueueConfig, c3 as QueueConfigSummary, c4 as QueuePausedEvent, c5 as QueueResumedEvent, c6 as QueueStats, c7 as QueueSummary, c8 as QueuesResource, c9 as RateLimitError, ca as RateLimitInfo, cb as RealtimeEventData, cc as RecentActivity, cd as RefreshTokenParams, ce as RefreshTokenResponse, cf as RegisterWorkerParams, cg as RegisterWorkerResponse, ch as ResolvedConfig, ci as ResourceUsage, cj as ResumeQueueResponse, ck as RetryDlqParams, cl as RetryDlqResponse, cm as SDK_VERSION, cn as Schedule, co as ScheduleRun, cp as ScheduleRunStatus, cq as ScheduleTriggeredEvent, cr as SchedulesResource, cs as ServerError, ct as SpooledClient, cu as SpooledClientConfig, cv as SpooledError, cw as SpooledGrpcClient, cx as SpooledRealtime, cy as SpooledRealtimeOptions, cz as SpooledWorker, cA as SpooledWorkerOptions, cB as StartEmailLoginResponse, cC as StreamOptions, cD as SystemInfo, cE as TestWebhookResponse, cF as TimeoutError, cG as TokenClaims, cH as TriggerScheduleResponse, cI as UnsupportedOperationError, cJ as UpdateApiKeyParams, cK as UpdateOrganizationParams, cL as UpdateOutgoingWebhookParams, cM as UpdateQueueConfigParams, cN as UpdateScheduleParams, cO as UsageItem, cP as UsageWarning, cQ as ValidateTokenParams, cR as ValidateTokenResponse, cS as ValidationError, cT as WebhookDeliveryStatus, cU as WebhookEventType, cV as WebhookFormat, cW as WebhookIngestionResource, cX as WebhookTokenResponse, cY as WebhooksResource, cZ as Worker, c_ as WorkerDeregisteredEvent, c$ as WorkerEvent, d0 as WorkerEventData, d1 as WorkerHeartbeatParams, d2 as WorkerRegisteredEvent, d3 as WorkerState, d4 as WorkerStatus, d5 as WorkerSummary, d6 as WorkersResource, d7 as Workflow, d8 as WorkflowJob, d9 as WorkflowJobDefinition, da as WorkflowJobStatus, db as WorkflowResponse, dc as WorkflowStatus, dd as WorkflowsResource, de as asyncIterableFromStream, df as createCircuitBreaker, dg as createClient, dh as createErrorFromResponse, di as createHttpClient, dj as createJobStream, dk as createPaginatedResponse, dl as createProcessJobsStream, dm as dateToTimestamp, dn as isCircuitBreakerFailure, dp as isRetryableError, dq as isSpooledError, dr as parseRateLimitHeaders, ds as resolveConfig, dt as timestampToDate, du as validateConfig } from './index-CSWlguB8.cjs';
3
3
  import * as protoLoader from '@grpc/proto-loader';
4
4
  import { ServiceClientConstructor } from '@grpc/grpc-js';
5
5
 
@@ -268,12 +268,6 @@ declare function withRetry<T>(fn: () => Promise<T>, options: RetryOptions): Prom
268
268
  */
269
269
  declare function createRetryWrapper(config: RetryConfig): <T>(fn: () => Promise<T>, options?: Partial<Omit<RetryOptions, "config">>) => Promise<T>;
270
270
 
271
- /**
272
- * Case Conversion Utilities
273
- *
274
- * Provides deep conversion between snake_case (API) and camelCase (SDK).
275
- * User-defined JSON blobs are preserved without conversion.
276
- */
277
271
  /**
278
272
  * Convert a string from camelCase to snake_case
279
273
  */
package/dist/index.d.ts CHANGED
@@ -1,5 +1,5 @@
1
- import { R as RealtimeConnectionOptions, C as ConnectionState, S as SubscriptionFilter, a as RealtimeEventType, b as RealtimeEvent, c as RetryConfig } from './index-DzTC8ld3.js';
2
- export { A as API_VERSION, d as AddDependenciesParams, e as AddDependenciesResponse, f as AdminApiKeyResponse, g as AdminCreateApiKeyParams, h as AdminCreateOrganizationParams, i as AdminCreateOrganizationResponse, j as AdminDeleteOrganizationParams, k as AdminListOrganizationsParams, l as AdminOrganizationDetail, m as AdminOrganizationList, n as AdminOrganizationSummary, o as AdminPlanLimits, p as AdminPlatformStats, q as AdminResource, r as AdminUpdateOrganizationParams, s as AdminUsageStats, t as ApiErrorBody, u as ApiKeySummary, v as ApiKeysResource, w as AuthResource, x as AuthenticationError, y as AuthorizationError, B as BatchJobStatus, z as BillingResource, D as BillingStatus, E as BoostPriorityResponse, F as BulkEnqueueParams, G as BulkEnqueueResponse, H as BulkJobItem, I as CheckEmailResponse, J as CheckSlugResponse, K as CircuitBreaker, L as CircuitBreakerConfig, M as CircuitBreakerOpenError, N as CircuitBreakerOptions, O as CircuitState, P as CircuitStateChange, Q as ClaimJobsParams, T as ClaimJobsResult, U as ClaimedJob, V as CompleteJobParams, W as ConflictError, X as CreateApiKeyParams, Y as CreateApiKeyResponse, Z as CreateBillingPortalParams, _ as CreateBillingPortalResponse, $ as CreateJobParams, a0 as CreateJobResult, a1 as CreateOrganizationParams, a2 as CreateOrganizationResponse, a3 as CreateOutgoingWebhookParams, a4 as CreateScheduleParams, a5 as CreateScheduleResponse, a6 as CreateWorkflowParams, a7 as CreateWorkflowResponse, a8 as CurrentUserResponse, a9 as DEFAULT_CONFIG, aa as DashboardData, ab as DashboardResource, ac as DashboardWorkerSummary, ad as DebugFn, ae as DeleteQueueOptions, af as DependencyInfo, ag as DependencyMode, ah as FailJobParams, ai as GrpcClientOptions, aj as GrpcCompleteJobParams, ak as GrpcCompleteJobResponse, al as GrpcCompleteRequest, am as GrpcCompleteResponse, an as GrpcDequeueJobParams, ao as GrpcDequeueJobResponse, ap as GrpcDequeueRequest, aq as GrpcDequeueResponse, ar as GrpcDeregisterRequest, as as GrpcDeregisterResponse, at as GrpcEnqueueJobParams, au as GrpcEnqueueJobResponse, av as GrpcEnqueueRequest, aw as GrpcEnqueueResponse, ax as GrpcErrorResponse, ay as GrpcFailJobParams, az as GrpcFailJobResponse, aA as GrpcFailRequest, aB as GrpcFailResponse, aC as GrpcGetJobRequest, aD as GrpcGetJobResponse, aE as GrpcGetQueueStatsRequest, aF as GrpcGetQueueStatsResponse, aG as GrpcGetQueueStatsResponse_Legacy, aH as GrpcHeartbeatParams, aI as GrpcHeartbeatRequest, aJ as GrpcHeartbeatResponse, aK as GrpcHeartbeatResponse_Legacy, aL as GrpcJob, aM as GrpcJobStatus, aN as GrpcJobStatusNumber, aO as GrpcProcessRequest, aP as GrpcProcessResponse, aQ as GrpcQueueOperations, aR as GrpcRegisterWorkerParams, aS as GrpcRegisterWorkerRequest, aT as GrpcRegisterWorkerResponse, aU as GrpcRegisterWorkerResponse_Legacy, aV as GrpcRenewLeaseParams, aW as GrpcRenewLeaseRequest, aX as GrpcRenewLeaseResponse, aY as GrpcRenewLeaseResponse_Legacy, aZ as GrpcStreamJobsRequest, a_ as GrpcTimestamp, a$ as GrpcWorkerOperations, b0 as HealthResource, b1 as HealthResponse, b2 as HeartbeatEvent, b3 as HeartbeatJobParams, b4 as HttpClient, b5 as InboundDeliveryStatus, b6 as InboundWebhookDelivery, b7 as IngestCustomWebhookParams, b8 as IngestCustomWebhookResponse, b9 as IngestGitHubWebhookOptions, ba as IngestStripeWebhookOptions, bb as InitialApiKey, bc as Job, bd as JobCompletedEvent, be as JobContext, bf as JobCreatedEvent, bg as JobFailedEvent, bh as JobHandler, bi as JobHistoryEvent, bj as JobHistoryEventType, bk as JobHistoryParams, bl as JobProgressEvent, bm as JobResult, bn as JobSearchParams, bo as JobStartedEvent, bp as JobStats, bq as JobStatus, br as JobStatusChangedEvent, bs as JobStream, bt as JobSummary, bu as JobSummaryStats, bv as JobWithDependencies, bw as JobsResource, bx as JsonArray, by as JsonObject, bz as JsonPrimitive, bA as JsonValue, bB as ListDlqParams, bC as ListInboundDeliveriesParams, bD as ListJobsParams, bE as ListPage, bF as ListParams, bG as ListSchedulesParams, bH as ListWorkflowsParams, bI as LoginParams, bJ as LoginResponse, bK as MetricsResource, bL as NetworkError, bM as NotFoundError, bN as Organization, bO as OrganizationMember, bP as OrganizationSummary, bQ as OrganizationUsage, bR as OrganizationsResource, bS as OutgoingWebhook, bT as OutgoingWebhookDelivery, bU as PaginatedResponse, bV as PaginationParams, bW as PauseQueueResponse, bX as PayloadTooLargeError, bY as PlanCount, bZ as PlanLimits, b_ as PlanTier, b$ as ProcessJobsStream, c0 as PurgeDlqParams, c1 as PurgeDlqResponse, c2 as QueueConfig, c3 as QueueConfigSummary, c4 as QueuePausedEvent, c5 as QueueResumedEvent, c6 as QueueStats, c7 as QueueSummary, c8 as QueuesResource, c9 as RateLimitError, ca as RateLimitInfo, cb as RealtimeEventData, cc as RecentActivity, cd as RefreshTokenParams, ce as RefreshTokenResponse, cf as RegisterWorkerParams, cg as RegisterWorkerResponse, ch as ResolvedConfig, ci as ResourceUsage, cj as ResumeQueueResponse, ck as RetryDlqParams, cl as RetryDlqResponse, cm as SDK_VERSION, cn as Schedule, co as ScheduleRun, cp as ScheduleRunStatus, cq as ScheduleTriggeredEvent, cr as SchedulesResource, cs as ServerError, ct as SpooledClient, cu as SpooledClientConfig, cv as SpooledError, cw as SpooledGrpcClient, cx as SpooledRealtime, cy as SpooledRealtimeOptions, cz as SpooledWorker, cA as SpooledWorkerOptions, cB as StartEmailLoginResponse, cC as StreamOptions, cD as SystemInfo, cE as TestWebhookResponse, cF as TimeoutError, cG as TokenClaims, cH as TriggerScheduleResponse, cI as UnsupportedOperationError, cJ as UpdateApiKeyParams, cK as UpdateOrganizationParams, cL as UpdateOutgoingWebhookParams, cM as UpdateQueueConfigParams, cN as UpdateScheduleParams, cO as UsageItem, cP as UsageWarning, cQ as ValidateTokenParams, cR as ValidateTokenResponse, cS as ValidationError, cT as WebhookDeliveryStatus, cU as WebhookEventType, cV as WebhookFormat, cW as WebhookIngestionResource, cX as WebhookTokenResponse, cY as WebhooksResource, cZ as Worker, c_ as WorkerDeregisteredEvent, c$ as WorkerEvent, d0 as WorkerEventData, d1 as WorkerHeartbeatParams, d2 as WorkerRegisteredEvent, d3 as WorkerState, d4 as WorkerStatus, d5 as WorkerSummary, d6 as WorkersResource, d7 as Workflow, d8 as WorkflowJob, d9 as WorkflowJobDefinition, da as WorkflowJobStatus, db as WorkflowResponse, dc as WorkflowStatus, dd as WorkflowsResource, de as asyncIterableFromStream, df as createCircuitBreaker, dg as createClient, dh as createErrorFromResponse, di as createHttpClient, dj as createJobStream, dk as createPaginatedResponse, dl as createProcessJobsStream, dm as dateToTimestamp, dn as isCircuitBreakerFailure, dp as isRetryableError, dq as isSpooledError, dr as parseRateLimitHeaders, ds as resolveConfig, dt as timestampToDate, du as validateConfig } from './index-DzTC8ld3.js';
1
+ import { R as RealtimeConnectionOptions, C as ConnectionState, S as SubscriptionFilter, a as RealtimeEventType, b as RealtimeEvent, c as RetryConfig } from './index-CSWlguB8.js';
2
+ export { A as API_VERSION, d as AddDependenciesParams, e as AddDependenciesResponse, f as AdminApiKeyResponse, g as AdminCreateApiKeyParams, h as AdminCreateOrganizationParams, i as AdminCreateOrganizationResponse, j as AdminDeleteOrganizationParams, k as AdminListOrganizationsParams, l as AdminOrganizationDetail, m as AdminOrganizationList, n as AdminOrganizationSummary, o as AdminPlanLimits, p as AdminPlatformStats, q as AdminResource, r as AdminUpdateOrganizationParams, s as AdminUsageStats, t as ApiErrorBody, u as ApiKeySummary, v as ApiKeysResource, w as AuthResource, x as AuthenticationError, y as AuthorizationError, B as BatchJobStatus, z as BillingResource, D as BillingStatus, E as BoostPriorityResponse, F as BulkEnqueueParams, G as BulkEnqueueResponse, H as BulkJobItem, I as CheckEmailResponse, J as CheckSlugResponse, K as CircuitBreaker, L as CircuitBreakerConfig, M as CircuitBreakerOpenError, N as CircuitBreakerOptions, O as CircuitState, P as CircuitStateChange, Q as ClaimJobsParams, T as ClaimJobsResult, U as ClaimedJob, V as CompleteJobParams, W as ConflictError, X as CreateApiKeyParams, Y as CreateApiKeyResponse, Z as CreateBillingPortalParams, _ as CreateBillingPortalResponse, $ as CreateJobParams, a0 as CreateJobResult, a1 as CreateOrganizationParams, a2 as CreateOrganizationResponse, a3 as CreateOutgoingWebhookParams, a4 as CreateScheduleParams, a5 as CreateScheduleResponse, a6 as CreateWorkflowParams, a7 as CreateWorkflowResponse, a8 as CurrentUserResponse, a9 as DEFAULT_CONFIG, aa as DashboardData, ab as DashboardResource, ac as DashboardWorkerSummary, ad as DebugFn, ae as DeleteQueueOptions, af as DependencyInfo, ag as DependencyMode, ah as FailJobParams, ai as GrpcClientOptions, aj as GrpcCompleteJobParams, ak as GrpcCompleteJobResponse, al as GrpcCompleteRequest, am as GrpcCompleteResponse, an as GrpcDequeueJobParams, ao as GrpcDequeueJobResponse, ap as GrpcDequeueRequest, aq as GrpcDequeueResponse, ar as GrpcDeregisterRequest, as as GrpcDeregisterResponse, at as GrpcEnqueueJobParams, au as GrpcEnqueueJobResponse, av as GrpcEnqueueRequest, aw as GrpcEnqueueResponse, ax as GrpcErrorResponse, ay as GrpcFailJobParams, az as GrpcFailJobResponse, aA as GrpcFailRequest, aB as GrpcFailResponse, aC as GrpcGetJobRequest, aD as GrpcGetJobResponse, aE as GrpcGetQueueStatsRequest, aF as GrpcGetQueueStatsResponse, aG as GrpcGetQueueStatsResponse_Legacy, aH as GrpcHeartbeatParams, aI as GrpcHeartbeatRequest, aJ as GrpcHeartbeatResponse, aK as GrpcHeartbeatResponse_Legacy, aL as GrpcJob, aM as GrpcJobStatus, aN as GrpcJobStatusNumber, aO as GrpcProcessRequest, aP as GrpcProcessResponse, aQ as GrpcQueueOperations, aR as GrpcRegisterWorkerParams, aS as GrpcRegisterWorkerRequest, aT as GrpcRegisterWorkerResponse, aU as GrpcRegisterWorkerResponse_Legacy, aV as GrpcRenewLeaseParams, aW as GrpcRenewLeaseRequest, aX as GrpcRenewLeaseResponse, aY as GrpcRenewLeaseResponse_Legacy, aZ as GrpcStreamJobsRequest, a_ as GrpcTimestamp, a$ as GrpcWorkerOperations, b0 as HealthResource, b1 as HealthResponse, b2 as HeartbeatEvent, b3 as HeartbeatJobParams, b4 as HttpClient, b5 as InboundDeliveryStatus, b6 as InboundWebhookDelivery, b7 as IngestCustomWebhookParams, b8 as IngestCustomWebhookResponse, b9 as IngestGitHubWebhookOptions, ba as IngestStripeWebhookOptions, bb as InitialApiKey, bc as Job, bd as JobCompletedEvent, be as JobContext, bf as JobCreatedEvent, bg as JobFailedEvent, bh as JobHandler, bi as JobHistoryEvent, bj as JobHistoryEventType, bk as JobHistoryParams, bl as JobProgressEvent, bm as JobResult, bn as JobSearchParams, bo as JobStartedEvent, bp as JobStats, bq as JobStatus, br as JobStatusChangedEvent, bs as JobStream, bt as JobSummary, bu as JobSummaryStats, bv as JobWithDependencies, bw as JobsResource, bx as JsonArray, by as JsonObject, bz as JsonPrimitive, bA as JsonValue, bB as ListDlqParams, bC as ListInboundDeliveriesParams, bD as ListJobsParams, bE as ListPage, bF as ListParams, bG as ListSchedulesParams, bH as ListWorkflowsParams, bI as LoginParams, bJ as LoginResponse, bK as MetricsResource, bL as NetworkError, bM as NotFoundError, bN as Organization, bO as OrganizationMember, bP as OrganizationSummary, bQ as OrganizationUsage, bR as OrganizationsResource, bS as OutgoingWebhook, bT as OutgoingWebhookDelivery, bU as PaginatedResponse, bV as PaginationParams, bW as PauseQueueResponse, bX as PayloadTooLargeError, bY as PlanCount, bZ as PlanLimits, b_ as PlanTier, b$ as ProcessJobsStream, c0 as PurgeDlqParams, c1 as PurgeDlqResponse, c2 as QueueConfig, c3 as QueueConfigSummary, c4 as QueuePausedEvent, c5 as QueueResumedEvent, c6 as QueueStats, c7 as QueueSummary, c8 as QueuesResource, c9 as RateLimitError, ca as RateLimitInfo, cb as RealtimeEventData, cc as RecentActivity, cd as RefreshTokenParams, ce as RefreshTokenResponse, cf as RegisterWorkerParams, cg as RegisterWorkerResponse, ch as ResolvedConfig, ci as ResourceUsage, cj as ResumeQueueResponse, ck as RetryDlqParams, cl as RetryDlqResponse, cm as SDK_VERSION, cn as Schedule, co as ScheduleRun, cp as ScheduleRunStatus, cq as ScheduleTriggeredEvent, cr as SchedulesResource, cs as ServerError, ct as SpooledClient, cu as SpooledClientConfig, cv as SpooledError, cw as SpooledGrpcClient, cx as SpooledRealtime, cy as SpooledRealtimeOptions, cz as SpooledWorker, cA as SpooledWorkerOptions, cB as StartEmailLoginResponse, cC as StreamOptions, cD as SystemInfo, cE as TestWebhookResponse, cF as TimeoutError, cG as TokenClaims, cH as TriggerScheduleResponse, cI as UnsupportedOperationError, cJ as UpdateApiKeyParams, cK as UpdateOrganizationParams, cL as UpdateOutgoingWebhookParams, cM as UpdateQueueConfigParams, cN as UpdateScheduleParams, cO as UsageItem, cP as UsageWarning, cQ as ValidateTokenParams, cR as ValidateTokenResponse, cS as ValidationError, cT as WebhookDeliveryStatus, cU as WebhookEventType, cV as WebhookFormat, cW as WebhookIngestionResource, cX as WebhookTokenResponse, cY as WebhooksResource, cZ as Worker, c_ as WorkerDeregisteredEvent, c$ as WorkerEvent, d0 as WorkerEventData, d1 as WorkerHeartbeatParams, d2 as WorkerRegisteredEvent, d3 as WorkerState, d4 as WorkerStatus, d5 as WorkerSummary, d6 as WorkersResource, d7 as Workflow, d8 as WorkflowJob, d9 as WorkflowJobDefinition, da as WorkflowJobStatus, db as WorkflowResponse, dc as WorkflowStatus, dd as WorkflowsResource, de as asyncIterableFromStream, df as createCircuitBreaker, dg as createClient, dh as createErrorFromResponse, di as createHttpClient, dj as createJobStream, dk as createPaginatedResponse, dl as createProcessJobsStream, dm as dateToTimestamp, dn as isCircuitBreakerFailure, dp as isRetryableError, dq as isSpooledError, dr as parseRateLimitHeaders, ds as resolveConfig, dt as timestampToDate, du as validateConfig } from './index-CSWlguB8.js';
3
3
  import * as protoLoader from '@grpc/proto-loader';
4
4
  import { ServiceClientConstructor } from '@grpc/grpc-js';
5
5
 
@@ -268,12 +268,6 @@ declare function withRetry<T>(fn: () => Promise<T>, options: RetryOptions): Prom
268
268
  */
269
269
  declare function createRetryWrapper(config: RetryConfig): <T>(fn: () => Promise<T>, options?: Partial<Omit<RetryOptions, "config">>) => Promise<T>;
270
270
 
271
- /**
272
- * Case Conversion Utilities
273
- *
274
- * Provides deep conversion between snake_case (API) and camelCase (SDK).
275
- * User-defined JSON blobs are preserved without conversion.
276
- */
277
271
  /**
278
272
  * Convert a string from camelCase to snake_case
279
273
  */
package/dist/index.js CHANGED
@@ -24,10 +24,10 @@ var DEFAULT_CONFIG = {
24
24
  successThreshold: 3,
25
25
  timeout: 3e4
26
26
  },
27
- userAgent: "@spooled/sdk-nodejs/1.4.0",
27
+ userAgent: "@spooled/sdk-nodejs/1.5.0",
28
28
  autoRefreshToken: true
29
29
  };
30
- var SDK_VERSION = "1.4.0";
30
+ var SDK_VERSION = "1.5.0";
31
31
  var API_VERSION = "v1";
32
32
  var API_BASE_PATH = `/api/${API_VERSION}`;
33
33
  function normalizeCredential(value) {
@@ -607,6 +607,175 @@ function createRetryWrapper(config) {
607
607
  };
608
608
  }
609
609
 
610
+ // src/utils/json.ts
611
+ var TWO_POW_53 = "9007199254740992";
612
+ function parseApiJson(text) {
613
+ return JSON.parse(preserveExactIntegers(text));
614
+ }
615
+ function magnitudeExceedsTwoPow53(digits) {
616
+ let start = 0;
617
+ while (start < digits.length - 1 && digits.charCodeAt(start) === 48) {
618
+ start++;
619
+ }
620
+ const len = digits.length - start;
621
+ if (len !== TWO_POW_53.length) {
622
+ return len > TWO_POW_53.length;
623
+ }
624
+ for (let i = 0; i < len; i++) {
625
+ const digit = digits.charCodeAt(start + i);
626
+ const limit = TWO_POW_53.charCodeAt(i);
627
+ if (digit !== limit) {
628
+ return digit > limit;
629
+ }
630
+ }
631
+ return false;
632
+ }
633
+ function inExactValue(frames) {
634
+ const top = frames[frames.length - 1];
635
+ if (!top || top.expect !== "value") {
636
+ return false;
637
+ }
638
+ return top.exact || top.keyIsExact;
639
+ }
640
+ function preserveExactIntegers(text) {
641
+ const out = [];
642
+ const frames = [];
643
+ const n = text.length;
644
+ let i = 0;
645
+ const valueEnded = () => {
646
+ const top = frames[frames.length - 1];
647
+ if (top) {
648
+ top.expect = "after";
649
+ }
650
+ };
651
+ while (i < n) {
652
+ const c = text[i];
653
+ if (c === " " || c === "\n" || c === "\r" || c === " ") {
654
+ out.push(c);
655
+ i++;
656
+ continue;
657
+ }
658
+ if (c === "{") {
659
+ frames.push({
660
+ kind: "object",
661
+ exact: inExactValue(frames),
662
+ expect: "key",
663
+ keyIsExact: false
664
+ });
665
+ out.push(c);
666
+ i++;
667
+ continue;
668
+ }
669
+ if (c === "[") {
670
+ frames.push({
671
+ kind: "array",
672
+ exact: inExactValue(frames),
673
+ expect: "value",
674
+ keyIsExact: false
675
+ });
676
+ out.push(c);
677
+ i++;
678
+ continue;
679
+ }
680
+ if (c === "}" || c === "]") {
681
+ frames.pop();
682
+ out.push(c);
683
+ i++;
684
+ valueEnded();
685
+ continue;
686
+ }
687
+ if (c === ":") {
688
+ const top = frames[frames.length - 1];
689
+ if (top && top.kind === "object") {
690
+ top.expect = "value";
691
+ }
692
+ out.push(c);
693
+ i++;
694
+ continue;
695
+ }
696
+ if (c === ",") {
697
+ const top = frames[frames.length - 1];
698
+ if (top) {
699
+ top.expect = top.kind === "object" ? "key" : "value";
700
+ top.keyIsExact = false;
701
+ }
702
+ out.push(c);
703
+ i++;
704
+ continue;
705
+ }
706
+ if (c === '"') {
707
+ const start = i;
708
+ i++;
709
+ while (i < n) {
710
+ if (text[i] === "\\") {
711
+ i++;
712
+ if (i < n) i++;
713
+ continue;
714
+ }
715
+ if (text[i] === '"') {
716
+ i++;
717
+ break;
718
+ }
719
+ i++;
720
+ }
721
+ const raw = text.slice(start, i);
722
+ const top = frames[frames.length - 1];
723
+ if (top && top.kind === "object" && top.expect === "key") {
724
+ let key = "";
725
+ try {
726
+ key = JSON.parse(raw);
727
+ } catch {
728
+ key = "";
729
+ }
730
+ top.keyIsExact = typeof key === "string" && SKIP_CONVERSION_KEYS.has(key);
731
+ top.expect = "colon";
732
+ } else {
733
+ valueEnded();
734
+ }
735
+ out.push(raw);
736
+ continue;
737
+ }
738
+ if (c === "-" || c >= "0" && c <= "9") {
739
+ const start = i;
740
+ if (text[i] === "-") i++;
741
+ const digitsAt = i;
742
+ while (i < n && text[i] >= "0" && text[i] <= "9") i++;
743
+ const digitsEnd = i;
744
+ let isInteger = true;
745
+ if (i < n && text[i] === ".") {
746
+ isInteger = false;
747
+ i++;
748
+ while (i < n && text[i] >= "0" && text[i] <= "9") i++;
749
+ }
750
+ if (i < n && (text[i] === "e" || text[i] === "E")) {
751
+ isInteger = false;
752
+ i++;
753
+ if (i < n && (text[i] === "+" || text[i] === "-")) i++;
754
+ while (i < n && text[i] >= "0" && text[i] <= "9") i++;
755
+ }
756
+ const raw = text.slice(start, i);
757
+ const digits = text.slice(digitsAt, digitsEnd);
758
+ if (isInteger && digits.length > 0 && inExactValue(frames) && magnitudeExceedsTwoPow53(digits)) {
759
+ out.push(`"${raw}"`);
760
+ } else {
761
+ out.push(raw);
762
+ }
763
+ valueEnded();
764
+ continue;
765
+ }
766
+ if (c >= "a" && c <= "z") {
767
+ const start = i;
768
+ while (i < n && text[i] >= "a" && text[i] <= "z") i++;
769
+ out.push(text.slice(start, i));
770
+ valueEnded();
771
+ continue;
772
+ }
773
+ out.push(c);
774
+ i++;
775
+ }
776
+ return out.join("");
777
+ }
778
+
610
779
  // src/utils/http.ts
611
780
  var IDEMPOTENT_METHODS = /* @__PURE__ */ new Set(["GET", "PUT", "DELETE"]);
612
781
  var HttpClient = class {
@@ -807,7 +976,7 @@ var HttpClient = class {
807
976
  if (response.status === 204) {
808
977
  data = void 0;
809
978
  } else if (contentType.includes("application/json")) {
810
- const rawData = await response.json();
979
+ const rawData = parseApiJson(await response.text());
811
980
  data = options.skipResponseConversion ? rawData : convertResponse(rawData);
812
981
  } else {
813
982
  data = await response.text();
@@ -2565,7 +2734,7 @@ var WebSocketRealtimeClient = class {
2565
2734
  }
2566
2735
  handleMessage(data) {
2567
2736
  try {
2568
- const message = convertResponse(JSON.parse(data));
2737
+ const message = convertResponse(parseApiJson(data));
2569
2738
  const eventType = mapEventType(String(message.type));
2570
2739
  message.type = eventType;
2571
2740
  const event = message;
@@ -2750,8 +2919,9 @@ var SseRealtimeClient = class {
2750
2919
  this.setState("connecting");
2751
2920
  const sseUrl = this.buildSseUrl(filter);
2752
2921
  this.options.debug(`Connecting to SSE: ${sseUrl}`);
2922
+ const usingPlatformEventSource = typeof EventSource !== "undefined";
2753
2923
  let EventSourceImpl;
2754
- if (typeof EventSource !== "undefined") {
2924
+ if (usingPlatformEventSource) {
2755
2925
  EventSourceImpl = EventSource;
2756
2926
  } else {
2757
2927
  try {
@@ -2775,16 +2945,20 @@ var SseRealtimeClient = class {
2775
2945
  }
2776
2946
  return new Promise((resolve, reject) => {
2777
2947
  try {
2778
- this.eventSource = new EventSourceImpl(sseUrl, {
2779
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
2780
- fetch: (input, init) => fetch(input, {
2781
- ...init,
2782
- headers: {
2783
- ...init?.headers,
2784
- Authorization: `Bearer ${token}`
2785
- }
2786
- })
2787
- });
2948
+ const connectUrl = usingPlatformEventSource ? appendSseToken(sseUrl, token) : sseUrl;
2949
+ this.eventSource = new EventSourceImpl(
2950
+ connectUrl,
2951
+ usingPlatformEventSource ? void 0 : {
2952
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
2953
+ fetch: (input, init) => fetch(input, {
2954
+ ...init,
2955
+ headers: {
2956
+ ...init?.headers,
2957
+ Authorization: `Bearer ${token}`
2958
+ }
2959
+ })
2960
+ }
2961
+ );
2788
2962
  this.eventSource.onopen = () => {
2789
2963
  this.options.debug("SSE connected");
2790
2964
  this.setState("connected");
@@ -2896,7 +3070,7 @@ var SseRealtimeClient = class {
2896
3070
  }
2897
3071
  handleMessage(data) {
2898
3072
  try {
2899
- const parsed = convertResponse(JSON.parse(data));
3073
+ const parsed = convertResponse(parseApiJson(data));
2900
3074
  const eventType = mapEventType(String(parsed.type));
2901
3075
  parsed.type = eventType;
2902
3076
  const event = parsed;
@@ -2971,6 +3145,10 @@ var SseRealtimeClient = class {
2971
3145
  }, delay);
2972
3146
  }
2973
3147
  };
3148
+ function appendSseToken(url, token) {
3149
+ const separator = url.includes("?") ? "&" : "?";
3150
+ return `${url}${separator}token=${encodeURIComponent(token)}`;
3151
+ }
2974
3152
  function isStreamEndingEvent(eventType, data) {
2975
3153
  if (eventType === "error" || eventType === "job.completed") {
2976
3154
  return true;
@@ -4436,6 +4614,10 @@ var SpooledWorker = class {
4436
4614
  };
4437
4615
  try {
4438
4616
  const outcome = await this.runHandler(activeJob, context);
4617
+ if (activeJob.leaseLost) {
4618
+ this.debug(`Job ${job.id} lost its lease; dropping late result`);
4619
+ return;
4620
+ }
4439
4621
  if (activeJob.settled) {
4440
4622
  this.debug(`Job ${job.id} was already settled; dropping late result`);
4441
4623
  return;
@@ -4443,11 +4625,14 @@ var SpooledWorker = class {
4443
4625
  activeJob.settled = true;
4444
4626
  switch (outcome.kind) {
4445
4627
  case "returned":
4446
- activeJob.ack = this.completeJob(job, outcome.value ?? void 0);
4628
+ activeJob.ack = this.completeJob(
4629
+ activeJob,
4630
+ outcome.value ?? void 0
4631
+ );
4447
4632
  break;
4448
4633
  case "threw":
4449
4634
  activeJob.ack = this.failJob(
4450
- job,
4635
+ activeJob,
4451
4636
  outcome.error instanceof Error ? outcome.error.message : String(outcome.error)
4452
4637
  );
4453
4638
  break;
@@ -4457,7 +4642,7 @@ var SpooledWorker = class {
4457
4642
  jobId: job.id,
4458
4643
  queueName: job.queueName
4459
4644
  });
4460
- activeJob.ack = this.failJob(job, JOB_TIMEOUT_MESSAGE);
4645
+ activeJob.ack = this.failJob(activeJob, JOB_TIMEOUT_MESSAGE);
4461
4646
  break;
4462
4647
  }
4463
4648
  await activeJob.ack;
@@ -4497,12 +4682,13 @@ var SpooledWorker = class {
4497
4682
  this.debug(`Force-failing job ${activeJob.job.id} due to shutdown timeout`);
4498
4683
  activeJob.settled = true;
4499
4684
  activeJob.abortController.abort(new Error(SHUTDOWN_TIMEOUT_MESSAGE));
4500
- activeJob.ack = this.failJob(activeJob.job, SHUTDOWN_TIMEOUT_MESSAGE);
4685
+ activeJob.ack = this.failJob(activeJob, SHUTDOWN_TIMEOUT_MESSAGE);
4501
4686
  await activeJob.ack;
4502
4687
  this.cleanupJob(activeJob);
4503
4688
  }
4504
- async completeJob(job, result) {
4505
- if (!this.workerId) return;
4689
+ async completeJob(activeJob, result) {
4690
+ if (!this.workerId || activeJob.leaseLost) return;
4691
+ const { job } = activeJob;
4506
4692
  try {
4507
4693
  await this.client.jobs.complete(job.id, {
4508
4694
  workerId: this.workerId,
@@ -4515,12 +4701,17 @@ var SpooledWorker = class {
4515
4701
  result
4516
4702
  });
4517
4703
  } catch (error) {
4704
+ if (isLeaseExpired(error)) {
4705
+ this.noteLeaseLost(activeJob, error);
4706
+ return;
4707
+ }
4518
4708
  this.debug(`Failed to complete job ${job.id}`, error);
4519
4709
  this.emit("error", { error });
4520
4710
  }
4521
4711
  }
4522
- async failJob(job, errorMessage) {
4523
- if (!this.workerId) return;
4712
+ async failJob(activeJob, errorMessage) {
4713
+ if (!this.workerId || activeJob.leaseLost) return;
4714
+ const { job } = activeJob;
4524
4715
  const willRetry = job.retryCount < job.maxRetries;
4525
4716
  const message = coerceFailureMessage(errorMessage);
4526
4717
  try {
@@ -4536,6 +4727,10 @@ var SpooledWorker = class {
4536
4727
  willRetry
4537
4728
  });
4538
4729
  } catch (error) {
4730
+ if (isLeaseExpired(error)) {
4731
+ this.noteLeaseLost(activeJob, error);
4732
+ return;
4733
+ }
4539
4734
  this.debug(`Failed to fail job ${job.id}`, error);
4540
4735
  this.emit("error", { error });
4541
4736
  }
@@ -4560,7 +4755,7 @@ var SpooledWorker = class {
4560
4755
  }
4561
4756
  }
4562
4757
  async sendJobHeartbeat(activeJob) {
4563
- if (!this.workerId) return;
4758
+ if (!this.workerId || activeJob.leaseLost) return;
4564
4759
  const { job } = activeJob;
4565
4760
  try {
4566
4761
  await this.client.jobs.heartbeat(job.id, {
@@ -4569,9 +4764,34 @@ var SpooledWorker = class {
4569
4764
  ...job.leaseId != null && { leaseId: job.leaseId }
4570
4765
  });
4571
4766
  } catch (error) {
4767
+ if (isLeaseExpired(error)) {
4768
+ this.noteLeaseLost(activeJob, error);
4769
+ return;
4770
+ }
4572
4771
  this.debug(`Job heartbeat failed for ${job.id}`, error);
4573
4772
  }
4574
4773
  }
4774
+ /**
4775
+ * The lease is gone. Abort the handler if it listens, stop renewing, and
4776
+ * refuse a later complete/fail with the stale lease.
4777
+ */
4778
+ noteLeaseLost(activeJob, error) {
4779
+ if (activeJob.leaseLost) return;
4780
+ activeJob.leaseLost = true;
4781
+ if (activeJob.heartbeatTimer) {
4782
+ clearInterval(activeJob.heartbeatTimer);
4783
+ activeJob.heartbeatTimer = void 0;
4784
+ }
4785
+ this.clearTimeoutTimer(activeJob);
4786
+ const reason = error instanceof Error ? error : new Error("Job lease expired");
4787
+ activeJob.abortController.abort(reason);
4788
+ this.debug(
4789
+ `Job lease lost for ${activeJob.job.id}; stopping handler`,
4790
+ error
4791
+ );
4792
+ activeJob.settled = true;
4793
+ this.cleanupJob(activeJob);
4794
+ }
4575
4795
  async sendWorkerHeartbeat() {
4576
4796
  if (!this.workerId || this.state !== "running" && this.state !== "stopping") {
4577
4797
  return;
@@ -4606,6 +4826,9 @@ var SpooledWorker = class {
4606
4826
  });
4607
4827
  }
4608
4828
  };
4829
+ function isLeaseExpired(error) {
4830
+ return error instanceof SpooledError && error.statusCode === 409 && error.code.toUpperCase() === "LEASE_EXPIRED";
4831
+ }
4609
4832
 
4610
4833
  export { API_VERSION, AdminResource, ApiKeysResource, AuthResource, AuthenticationError, AuthorizationError, BillingResource, CircuitBreaker, CircuitBreakerOpenError, CircuitState, ConflictError, DEFAULT_CONFIG, DashboardResource, GrpcJobStatus, GrpcJobStatusNumber, GrpcQueueOperations, GrpcWorkerOperations, HealthResource, HttpClient, JobsResource, MetricsResource, NetworkError, NotFoundError, OrganizationsResource, PROTO_LOADER_OPTIONS, PayloadTooLargeError, QueuesResource, RateLimitError, SDK_VERSION, SchedulesResource, ServerError, SpooledClient, SpooledError, SpooledGrpcClient, SpooledRealtime, SpooledWorker, SseRealtimeClient, TimeoutError, UnsupportedOperationError, ValidationError, WebSocketRealtimeClient, WebhookIngestionResource, WebhooksResource, WorkersResource, WorkflowsResource, asyncIterableFromStream, calculateDelay, camelToSnake, clearProtoCache, convertQueryParams, convertRequest, convertResponse, createCircuitBreaker, createClient, createErrorFromResponse, createHttpClient, createJobStream, createPaginatedResponse, createProcessJobsStream, createRetryWrapper, dateToTimestamp, getProtoPath, isCircuitBreakerFailure, isRetryableError, isSpooledError, loadProtoDefinition, loadProtoDefinitionAsync, parseRateLimitHeaders, resolveConfig, shouldRetry, sleep, snakeToCamel, timestampToDate, toCamelCase, toSnakeCase, validateConfig, withRetry };
4611
4834
  //# sourceMappingURL=index.js.map