@vercel/queue 0.0.0-alpha.32 → 0.0.0-alpha.34

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.
@@ -50,7 +50,7 @@ declare class BufferTransport implements Transport<Buffer> {
50
50
  *
51
51
  * IMPORTANT: When using StreamTransport, you must call finalize(payload) when done
52
52
  * processing the message to prevent resource leaks, especially in error cases.
53
- * ConsumerGroup handles this automatically, but direct QueueClient usage requires manual cleanup.
53
+ * ConsumerGroup handles this automatically, but direct Client usage requires manual cleanup.
54
54
  *
55
55
  * Example usage:
56
56
  * ```typescript
@@ -77,6 +77,44 @@ declare class StreamTransport implements Transport<ReadableStream<Uint8Array>> {
77
77
  * Vercel Queue Service client types
78
78
  */
79
79
 
80
+ interface QueueClientOptions {
81
+ /**
82
+ * Base URL for the Vercel Queue Service API
83
+ * Can also be set via VERCEL_QUEUE_BASE_URL environment variable
84
+ * @default "https://vercel-queue.com"
85
+ */
86
+ baseUrl?: string;
87
+ /**
88
+ * Base path for API endpoints
89
+ * Can also be set via VERCEL_QUEUE_BASE_PATH environment variable
90
+ * @default "/api/v3/topic"
91
+ */
92
+ basePath?: string;
93
+ /**
94
+ * Authentication token for the Vercel Queue Service API
95
+ * If not provided, the client will attempt to get a token via OIDC
96
+ */
97
+ token?: string;
98
+ /**
99
+ * Custom headers to include in all requests
100
+ */
101
+ headers?: Record<string, string>;
102
+ /**
103
+ * Default deployment ID to include in requests
104
+ * If not provided, defaults to VERCEL_DEPLOYMENT_ID environment variable
105
+ */
106
+ deploymentId?: string;
107
+ /**
108
+ * Whether to pin messages to the current deployment when publishing.
109
+ * When true, sends VERCEL_DEPLOYMENT_ID from environment, ensuring
110
+ * messages are routed to consumers on the same deployment.
111
+ * Only affects send/publish operations - consume operations always
112
+ * send deployment ID in production to identify the processing deployment.
113
+ * Ignored in development mode (deployment ID is never sent locally).
114
+ * @default true
115
+ */
116
+ pinToDeployment?: boolean;
117
+ }
80
118
  /**
81
119
  * Shared options for publishing messages
82
120
  */
@@ -94,10 +132,11 @@ interface PublishOptions {
94
132
  */
95
133
  retentionSeconds?: number;
96
134
  /**
97
- * Explicit deployment identifier to include in the `Vqs-Deployment-Id` header
98
- * If provided, this takes precedence over any value from the environment
135
+ * Delay delivery of the message by this many seconds
136
+ * @min 0
137
+ * @max retentionSeconds
99
138
  */
100
- deploymentId?: string;
139
+ delaySeconds?: number;
101
140
  }
102
141
  interface SendMessageOptions<T = unknown> extends PublishOptions {
103
142
  /**
@@ -139,23 +178,79 @@ interface Message<T = unknown> {
139
178
  */
140
179
  contentType: string;
141
180
  /**
142
- * Unique ticket for this message delivery (required for delete/patch operations)
181
+ * Receipt handle for this message delivery (required for delete/patch operations)
143
182
  */
144
- ticket: string;
183
+ receiptHandle: string;
145
184
  }
146
- /**
147
- * Result indicating the message should be timed out for retry later
148
- */
149
- interface MessageTimeoutResult {
185
+ interface ReceiveMessagesOptions<T = unknown> {
186
+ /**
187
+ * The queue name to receive messages from
188
+ */
189
+ queueName: string;
190
+ /**
191
+ * Consumer group name
192
+ */
193
+ consumerGroup: string;
150
194
  /**
151
- * Time in seconds before the message becomes visible again
195
+ * Time in seconds that messages will be invisible to other consumers
196
+ * @default 30
197
+ */
198
+ visibilityTimeoutSeconds?: number;
199
+ /**
200
+ * Maximum number of messages to retrieve
201
+ * @default 1
202
+ * @max 10
203
+ */
204
+ limit?: number;
205
+ /**
206
+ * Maximum concurrent in-flight messages
152
207
  */
153
- timeoutSeconds: number;
208
+ maxConcurrency?: number;
209
+ }
210
+ interface DeleteMessageOptions {
211
+ /**
212
+ * The queue name the message belongs to
213
+ */
214
+ queueName: string;
215
+ /**
216
+ * Consumer group name
217
+ */
218
+ consumerGroup: string;
219
+ /**
220
+ * Receipt handle received from the message
221
+ */
222
+ receiptHandle: string;
223
+ }
224
+ interface DeleteMessageResponse {
225
+ /**
226
+ * Whether the message was successfully deleted
227
+ */
228
+ deleted: boolean;
229
+ }
230
+ interface ChangeVisibilityOptions {
231
+ /**
232
+ * The queue name the message belongs to
233
+ */
234
+ queueName: string;
235
+ /**
236
+ * Consumer group name
237
+ */
238
+ consumerGroup: string;
239
+ /**
240
+ * Receipt handle received from the message
241
+ */
242
+ receiptHandle: string;
243
+ /**
244
+ * New visibility timeout in seconds
245
+ */
246
+ visibilityTimeoutSeconds: number;
247
+ }
248
+ interface ChangeVisibilityResponse {
249
+ /**
250
+ * Whether the visibility was successfully updated
251
+ */
252
+ success: boolean;
154
253
  }
155
- /**
156
- * Result returned by message handlers
157
- */
158
- type MessageHandlerResult = void | MessageTimeoutResult;
159
254
  /**
160
255
  * Message metadata provided to handlers
161
256
  */
@@ -169,7 +264,7 @@ interface MessageMetadata {
169
264
  /**
170
265
  * Message handler function type
171
266
  */
172
- type MessageHandler<T = unknown> = (message: T, metadata: MessageMetadata) => Promise<MessageHandlerResult> | MessageHandlerResult;
267
+ type MessageHandler<T = unknown> = (message: T, metadata: MessageMetadata) => Promise<void> | void;
173
268
  /**
174
269
  * Options for creating a ConsumerGroup instance
175
270
  */
@@ -190,6 +285,32 @@ interface ConsumerGroupOptions<T = unknown> {
190
285
  */
191
286
  refreshInterval?: number;
192
287
  }
288
+ interface ReceiveMessageByIdOptions<T = unknown> {
289
+ /**
290
+ * The queue name to receive the message from
291
+ */
292
+ queueName: string;
293
+ /**
294
+ * Consumer group name
295
+ */
296
+ consumerGroup: string;
297
+ /**
298
+ * The message ID to retrieve
299
+ */
300
+ messageId: string;
301
+ /**
302
+ * Time in seconds that the message will be invisible to other consumers
303
+ * @default 30
304
+ */
305
+ visibilityTimeoutSeconds?: number;
306
+ /**
307
+ * Maximum concurrent in-flight messages
308
+ */
309
+ maxConcurrency?: number;
310
+ }
311
+ interface ReceiveMessageByIdResponse<T = unknown> {
312
+ message: Message<T>;
313
+ }
193
314
  /**
194
315
  * Error thrown when a message is not found (404)
195
316
  */
@@ -252,5 +373,39 @@ declare class InternalServerError extends Error {
252
373
  declare class InvalidLimitError extends Error {
253
374
  constructor(limit: number, min?: number, max?: number);
254
375
  }
376
+ /**
377
+ * Error thrown when a message has already been processed (410)
378
+ */
379
+ declare class MessageAlreadyProcessedError extends Error {
380
+ constructor(messageId: string);
381
+ }
382
+ /**
383
+ * Error thrown when concurrency limit is exceeded (429)
384
+ */
385
+ declare class ConcurrencyLimitError extends Error {
386
+ readonly currentInflight?: number;
387
+ readonly maxConcurrency?: number;
388
+ constructor(message?: string, currentInflight?: number, maxConcurrency?: number);
389
+ }
390
+ /**
391
+ * Error thrown when a duplicate idempotency key is detected (409)
392
+ */
393
+ declare class DuplicateMessageError extends Error {
394
+ readonly idempotencyKey?: string;
395
+ constructor(message: string, idempotencyKey?: string);
396
+ }
397
+ /**
398
+ * Error thrown when consumer discovery fails (502)
399
+ */
400
+ declare class ConsumerDiscoveryError extends Error {
401
+ readonly deploymentId?: string;
402
+ constructor(message: string, deploymentId?: string);
403
+ }
404
+ /**
405
+ * Error thrown when consumer registry is not configured (503)
406
+ */
407
+ declare class ConsumerRegistryNotConfiguredError extends Error {
408
+ constructor(message?: string);
409
+ }
255
410
 
256
- export { BufferTransport as B, type ConsumerGroupOptions as C, ForbiddenError as F, InternalServerError as I, JsonTransport as J, type MessageHandler as M, type PublishOptions as P, QueueEmptyError as Q, StreamTransport as S, type Transport as T, UnauthorizedError as U, BadRequestError as a, InvalidLimitError as b, MessageCorruptedError as c, MessageLockedError as d, MessageNotAvailableError as e, MessageNotFoundError as f, type Message as g, type MessageHandlerResult as h, type MessageMetadata as i, type MessageTimeoutResult as j, type SendMessageOptions as k, type SendMessageResponse as l };
411
+ export { BufferTransport as B, type ChangeVisibilityOptions as C, type DeleteMessageOptions as D, ForbiddenError as F, InternalServerError as I, JsonTransport as J, type Message as M, type PublishOptions as P, type QueueClientOptions as Q, type ReceiveMessagesOptions as R, type SendMessageOptions as S, type Transport as T, UnauthorizedError as U, type SendMessageResponse as a, type ReceiveMessageByIdOptions as b, type ReceiveMessageByIdResponse as c, type DeleteMessageResponse as d, type ChangeVisibilityResponse as e, type MessageHandler as f, type ConsumerGroupOptions as g, StreamTransport as h, BadRequestError as i, ConcurrencyLimitError as j, ConsumerDiscoveryError as k, ConsumerRegistryNotConfiguredError as l, DuplicateMessageError as m, InvalidLimitError as n, MessageAlreadyProcessedError as o, MessageCorruptedError as p, MessageLockedError as q, MessageNotAvailableError as r, MessageNotFoundError as s, QueueEmptyError as t, type MessageMetadata as u };
@@ -50,7 +50,7 @@ declare class BufferTransport implements Transport<Buffer> {
50
50
  *
51
51
  * IMPORTANT: When using StreamTransport, you must call finalize(payload) when done
52
52
  * processing the message to prevent resource leaks, especially in error cases.
53
- * ConsumerGroup handles this automatically, but direct QueueClient usage requires manual cleanup.
53
+ * ConsumerGroup handles this automatically, but direct Client usage requires manual cleanup.
54
54
  *
55
55
  * Example usage:
56
56
  * ```typescript
@@ -77,6 +77,44 @@ declare class StreamTransport implements Transport<ReadableStream<Uint8Array>> {
77
77
  * Vercel Queue Service client types
78
78
  */
79
79
 
80
+ interface QueueClientOptions {
81
+ /**
82
+ * Base URL for the Vercel Queue Service API
83
+ * Can also be set via VERCEL_QUEUE_BASE_URL environment variable
84
+ * @default "https://vercel-queue.com"
85
+ */
86
+ baseUrl?: string;
87
+ /**
88
+ * Base path for API endpoints
89
+ * Can also be set via VERCEL_QUEUE_BASE_PATH environment variable
90
+ * @default "/api/v3/topic"
91
+ */
92
+ basePath?: string;
93
+ /**
94
+ * Authentication token for the Vercel Queue Service API
95
+ * If not provided, the client will attempt to get a token via OIDC
96
+ */
97
+ token?: string;
98
+ /**
99
+ * Custom headers to include in all requests
100
+ */
101
+ headers?: Record<string, string>;
102
+ /**
103
+ * Default deployment ID to include in requests
104
+ * If not provided, defaults to VERCEL_DEPLOYMENT_ID environment variable
105
+ */
106
+ deploymentId?: string;
107
+ /**
108
+ * Whether to pin messages to the current deployment when publishing.
109
+ * When true, sends VERCEL_DEPLOYMENT_ID from environment, ensuring
110
+ * messages are routed to consumers on the same deployment.
111
+ * Only affects send/publish operations - consume operations always
112
+ * send deployment ID in production to identify the processing deployment.
113
+ * Ignored in development mode (deployment ID is never sent locally).
114
+ * @default true
115
+ */
116
+ pinToDeployment?: boolean;
117
+ }
80
118
  /**
81
119
  * Shared options for publishing messages
82
120
  */
@@ -94,10 +132,11 @@ interface PublishOptions {
94
132
  */
95
133
  retentionSeconds?: number;
96
134
  /**
97
- * Explicit deployment identifier to include in the `Vqs-Deployment-Id` header
98
- * If provided, this takes precedence over any value from the environment
135
+ * Delay delivery of the message by this many seconds
136
+ * @min 0
137
+ * @max retentionSeconds
99
138
  */
100
- deploymentId?: string;
139
+ delaySeconds?: number;
101
140
  }
102
141
  interface SendMessageOptions<T = unknown> extends PublishOptions {
103
142
  /**
@@ -139,23 +178,79 @@ interface Message<T = unknown> {
139
178
  */
140
179
  contentType: string;
141
180
  /**
142
- * Unique ticket for this message delivery (required for delete/patch operations)
181
+ * Receipt handle for this message delivery (required for delete/patch operations)
143
182
  */
144
- ticket: string;
183
+ receiptHandle: string;
145
184
  }
146
- /**
147
- * Result indicating the message should be timed out for retry later
148
- */
149
- interface MessageTimeoutResult {
185
+ interface ReceiveMessagesOptions<T = unknown> {
186
+ /**
187
+ * The queue name to receive messages from
188
+ */
189
+ queueName: string;
190
+ /**
191
+ * Consumer group name
192
+ */
193
+ consumerGroup: string;
150
194
  /**
151
- * Time in seconds before the message becomes visible again
195
+ * Time in seconds that messages will be invisible to other consumers
196
+ * @default 30
197
+ */
198
+ visibilityTimeoutSeconds?: number;
199
+ /**
200
+ * Maximum number of messages to retrieve
201
+ * @default 1
202
+ * @max 10
203
+ */
204
+ limit?: number;
205
+ /**
206
+ * Maximum concurrent in-flight messages
152
207
  */
153
- timeoutSeconds: number;
208
+ maxConcurrency?: number;
209
+ }
210
+ interface DeleteMessageOptions {
211
+ /**
212
+ * The queue name the message belongs to
213
+ */
214
+ queueName: string;
215
+ /**
216
+ * Consumer group name
217
+ */
218
+ consumerGroup: string;
219
+ /**
220
+ * Receipt handle received from the message
221
+ */
222
+ receiptHandle: string;
223
+ }
224
+ interface DeleteMessageResponse {
225
+ /**
226
+ * Whether the message was successfully deleted
227
+ */
228
+ deleted: boolean;
229
+ }
230
+ interface ChangeVisibilityOptions {
231
+ /**
232
+ * The queue name the message belongs to
233
+ */
234
+ queueName: string;
235
+ /**
236
+ * Consumer group name
237
+ */
238
+ consumerGroup: string;
239
+ /**
240
+ * Receipt handle received from the message
241
+ */
242
+ receiptHandle: string;
243
+ /**
244
+ * New visibility timeout in seconds
245
+ */
246
+ visibilityTimeoutSeconds: number;
247
+ }
248
+ interface ChangeVisibilityResponse {
249
+ /**
250
+ * Whether the visibility was successfully updated
251
+ */
252
+ success: boolean;
154
253
  }
155
- /**
156
- * Result returned by message handlers
157
- */
158
- type MessageHandlerResult = void | MessageTimeoutResult;
159
254
  /**
160
255
  * Message metadata provided to handlers
161
256
  */
@@ -169,7 +264,7 @@ interface MessageMetadata {
169
264
  /**
170
265
  * Message handler function type
171
266
  */
172
- type MessageHandler<T = unknown> = (message: T, metadata: MessageMetadata) => Promise<MessageHandlerResult> | MessageHandlerResult;
267
+ type MessageHandler<T = unknown> = (message: T, metadata: MessageMetadata) => Promise<void> | void;
173
268
  /**
174
269
  * Options for creating a ConsumerGroup instance
175
270
  */
@@ -190,6 +285,32 @@ interface ConsumerGroupOptions<T = unknown> {
190
285
  */
191
286
  refreshInterval?: number;
192
287
  }
288
+ interface ReceiveMessageByIdOptions<T = unknown> {
289
+ /**
290
+ * The queue name to receive the message from
291
+ */
292
+ queueName: string;
293
+ /**
294
+ * Consumer group name
295
+ */
296
+ consumerGroup: string;
297
+ /**
298
+ * The message ID to retrieve
299
+ */
300
+ messageId: string;
301
+ /**
302
+ * Time in seconds that the message will be invisible to other consumers
303
+ * @default 30
304
+ */
305
+ visibilityTimeoutSeconds?: number;
306
+ /**
307
+ * Maximum concurrent in-flight messages
308
+ */
309
+ maxConcurrency?: number;
310
+ }
311
+ interface ReceiveMessageByIdResponse<T = unknown> {
312
+ message: Message<T>;
313
+ }
193
314
  /**
194
315
  * Error thrown when a message is not found (404)
195
316
  */
@@ -252,5 +373,39 @@ declare class InternalServerError extends Error {
252
373
  declare class InvalidLimitError extends Error {
253
374
  constructor(limit: number, min?: number, max?: number);
254
375
  }
376
+ /**
377
+ * Error thrown when a message has already been processed (410)
378
+ */
379
+ declare class MessageAlreadyProcessedError extends Error {
380
+ constructor(messageId: string);
381
+ }
382
+ /**
383
+ * Error thrown when concurrency limit is exceeded (429)
384
+ */
385
+ declare class ConcurrencyLimitError extends Error {
386
+ readonly currentInflight?: number;
387
+ readonly maxConcurrency?: number;
388
+ constructor(message?: string, currentInflight?: number, maxConcurrency?: number);
389
+ }
390
+ /**
391
+ * Error thrown when a duplicate idempotency key is detected (409)
392
+ */
393
+ declare class DuplicateMessageError extends Error {
394
+ readonly idempotencyKey?: string;
395
+ constructor(message: string, idempotencyKey?: string);
396
+ }
397
+ /**
398
+ * Error thrown when consumer discovery fails (502)
399
+ */
400
+ declare class ConsumerDiscoveryError extends Error {
401
+ readonly deploymentId?: string;
402
+ constructor(message: string, deploymentId?: string);
403
+ }
404
+ /**
405
+ * Error thrown when consumer registry is not configured (503)
406
+ */
407
+ declare class ConsumerRegistryNotConfiguredError extends Error {
408
+ constructor(message?: string);
409
+ }
255
410
 
256
- export { BufferTransport as B, type ConsumerGroupOptions as C, ForbiddenError as F, InternalServerError as I, JsonTransport as J, type MessageHandler as M, type PublishOptions as P, QueueEmptyError as Q, StreamTransport as S, type Transport as T, UnauthorizedError as U, BadRequestError as a, InvalidLimitError as b, MessageCorruptedError as c, MessageLockedError as d, MessageNotAvailableError as e, MessageNotFoundError as f, type Message as g, type MessageHandlerResult as h, type MessageMetadata as i, type MessageTimeoutResult as j, type SendMessageOptions as k, type SendMessageResponse as l };
411
+ export { BufferTransport as B, type ChangeVisibilityOptions as C, type DeleteMessageOptions as D, ForbiddenError as F, InternalServerError as I, JsonTransport as J, type Message as M, type PublishOptions as P, type QueueClientOptions as Q, type ReceiveMessagesOptions as R, type SendMessageOptions as S, type Transport as T, UnauthorizedError as U, type SendMessageResponse as a, type ReceiveMessageByIdOptions as b, type ReceiveMessageByIdResponse as c, type DeleteMessageResponse as d, type ChangeVisibilityResponse as e, type MessageHandler as f, type ConsumerGroupOptions as g, StreamTransport as h, BadRequestError as i, ConcurrencyLimitError as j, ConsumerDiscoveryError as k, ConsumerRegistryNotConfiguredError as l, DuplicateMessageError as m, InvalidLimitError as n, MessageAlreadyProcessedError as o, MessageCorruptedError as p, MessageLockedError as q, MessageNotAvailableError as r, MessageNotFoundError as s, QueueEmptyError as t, type MessageMetadata as u };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vercel/queue",
3
- "version": "0.0.0-alpha.32",
3
+ "version": "0.0.0-alpha.34",
4
4
  "publishConfig": {
5
5
  "access": "public"
6
6
  },
@@ -8,9 +8,6 @@
8
8
  "main": "dist/index.js",
9
9
  "module": "dist/index.mjs",
10
10
  "types": "dist/index.d.ts",
11
- "bin": {
12
- "vercel-queue-local-init": "./bin/local-discover.js"
13
- },
14
11
  "exports": {
15
12
  ".": {
16
13
  "import": {
@@ -34,8 +31,7 @@
34
31
  }
35
32
  },
36
33
  "files": [
37
- "dist",
38
- "bin"
34
+ "dist"
39
35
  ],
40
36
  "engines": {
41
37
  "node": ">=20.0.0"