@vercel/queue 0.0.0-alpha.35 → 0.0.0-alpha.37

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/README.md CHANGED
@@ -346,7 +346,6 @@ The queue client provides specific error types:
346
346
  - **`UnauthorizedError`**: Authentication failed (invalid or missing token)
347
347
  - **`ForbiddenError`**: Access denied (wrong environment or project)
348
348
  - **`DuplicateMessageError`**: Idempotency key was already used
349
- - **`ConcurrencyLimitError`**: Too many in-flight messages
350
349
  - **`ConsumerDiscoveryError`**: Could not reach the consumer deployment
351
350
  - **`ConsumerRegistryNotConfiguredError`**: Project not configured for queues
352
351
  - **`InternalServerError`**: Unexpected server error
@@ -357,7 +356,6 @@ Example error handling:
357
356
  ```typescript
358
357
  import {
359
358
  BadRequestError,
360
- ConcurrencyLimitError,
361
359
  DuplicateMessageError,
362
360
  ForbiddenError,
363
361
  InternalServerError,
@@ -375,13 +373,6 @@ try {
375
373
  console.log("Invalid parameters:", error.message);
376
374
  } else if (error instanceof DuplicateMessageError) {
377
375
  console.log("Duplicate message:", error.idempotencyKey);
378
- } else if (error instanceof ConcurrencyLimitError) {
379
- console.log(
380
- "Rate limited:",
381
- error.currentInflight,
382
- "/",
383
- error.maxConcurrency,
384
- );
385
376
  } else if (error instanceof InternalServerError) {
386
377
  console.log("Server error - retry with backoff");
387
378
  }
@@ -464,11 +455,10 @@ interface MessageMetadata {
464
455
 
465
456
  #### Receiving Messages
466
457
 
467
- | Parameter | Default | Min | Max | Notes |
468
- | -------------------------- | --------- | --- | ------ | --------------------------- |
469
- | `visibilityTimeoutSeconds` | 30 | 0 | 3,600 | 0 = immediate re-visibility |
470
- | `limit` | 1 | 1 | 10 | Messages per request |
471
- | `maxConcurrency` | unlimited | 1 | 10,000 | In-flight message limit |
458
+ | Parameter | Default | Min | Max | Notes |
459
+ | -------------------------- | ------- | --- | ----- | --------------------------- |
460
+ | `visibilityTimeoutSeconds` | 30 | 0 | 3,600 | 0 = immediate re-visibility |
461
+ | `limit` | 1 | 1 | 10 | Messages per request |
472
462
 
473
463
  #### Visibility Extension
474
464
 
package/dist/index.d.mts CHANGED
@@ -1,5 +1,5 @@
1
- import { Q as QueueClientOptions, S as SendMessageOptions, T as Transport, a as SendMessageResponse, R as ReceiveMessagesOptions, M as Message, b as ReceiveMessageByIdOptions, c as ReceiveMessageByIdResponse, D as DeleteMessageOptions, d as DeleteMessageResponse, C as ChangeVisibilityOptions, e as ChangeVisibilityResponse, f as MessageHandler, P as PublishOptions, g as ConsumerGroupOptions } from './types-BLG4ASI_.mjs';
2
- export { i as BadRequestError, B as BufferTransport, j as ConcurrencyLimitError, k as ConsumerDiscoveryError, l as ConsumerRegistryNotConfiguredError, m as DuplicateMessageError, F as ForbiddenError, I as InternalServerError, n as InvalidLimitError, J as JsonTransport, o as MessageAlreadyProcessedError, p as MessageCorruptedError, q as MessageLockedError, u as MessageMetadata, r as MessageNotAvailableError, s as MessageNotFoundError, t as QueueEmptyError, h as StreamTransport, U as UnauthorizedError } from './types-BLG4ASI_.mjs';
1
+ import { Q as QueueClientOptions, S as SendMessageOptions, T as Transport, a as SendMessageResponse, R as ReceiveMessagesOptions, M as Message, b as ReceiveMessageByIdOptions, c as ReceiveMessageByIdResponse, D as DeleteMessageOptions, d as DeleteMessageResponse, C as ChangeVisibilityOptions, e as ChangeVisibilityResponse, f as MessageHandler, P as PublishOptions, g as ConsumerGroupOptions } from './types-CAA8nT8x.mjs';
2
+ export { i as BadRequestError, B as BufferTransport, j as ConsumerDiscoveryError, k as ConsumerRegistryNotConfiguredError, l as DuplicateMessageError, F as ForbiddenError, I as InternalServerError, m as InvalidLimitError, J as JsonTransport, n as MessageAlreadyProcessedError, o as MessageCorruptedError, p as MessageLockedError, t as MessageMetadata, q as MessageNotAvailableError, r as MessageNotFoundError, s as QueueEmptyError, h as StreamTransport, U as UnauthorizedError } from './types-CAA8nT8x.mjs';
3
3
 
4
4
  declare class QueueClient {
5
5
  private baseUrl;
@@ -42,12 +42,10 @@ declare class QueueClient {
42
42
  * @param options.consumerGroup - Consumer group name (pattern: `[A-Za-z0-9_-]+`)
43
43
  * @param options.visibilityTimeoutSeconds - Lock duration (default: 30, min: 0, max: 3600)
44
44
  * @param options.limit - Max messages to retrieve (default: 1, min: 1, max: 10)
45
- * @param options.maxConcurrency - Max in-flight messages (default: unlimited, min: 1)
46
45
  * @param transport - Deserializer for message payloads
47
46
  * @yields Message objects with payload, messageId, receiptHandle, etc.
48
47
  * @throws {QueueEmptyError} When no messages available
49
48
  * @throws {InvalidLimitError} When limit is outside 1-10 range
50
- * @throws {ConcurrencyLimitError} When maxConcurrency exceeded
51
49
  * @throws {BadRequestError} When parameters are invalid
52
50
  * @throws {UnauthorizedError} When authentication fails
53
51
  * @throws {ForbiddenError} When access is denied
@@ -62,13 +60,11 @@ declare class QueueClient {
62
60
  * @param options.consumerGroup - Consumer group name (pattern: `[A-Za-z0-9_-]+`)
63
61
  * @param options.messageId - Message ID to retrieve
64
62
  * @param options.visibilityTimeoutSeconds - Lock duration (default: 30, min: 0, max: 3600)
65
- * @param options.maxConcurrency - Max in-flight messages (default: unlimited, min: 1)
66
63
  * @param transport - Deserializer for the message payload
67
64
  * @returns Promise with the message
68
65
  * @throws {MessageNotFoundError} When message doesn't exist
69
66
  * @throws {MessageNotAvailableError} When message is in wrong state or was a duplicate
70
67
  * @throws {MessageAlreadyProcessedError} When message was already processed
71
- * @throws {ConcurrencyLimitError} When maxConcurrency exceeded
72
68
  * @throws {BadRequestError} When parameters are invalid
73
69
  * @throws {UnauthorizedError} When authentication fails
74
70
  * @throws {ForbiddenError} When access is denied
@@ -397,7 +393,6 @@ interface ReceiveOptions<T = unknown> extends ConsumerGroupOptions<T>, ConsumeOp
397
393
  * @param options.transport - Payload deserializer (default: JsonTransport)
398
394
  * @returns Promise that resolves when the message is processed and deleted
399
395
  * @throws {QueueEmptyError} When no messages available
400
- * @throws {ConcurrencyLimitError} When maxConcurrency exceeded
401
396
  */
402
397
  declare function receive<T = unknown>(topicName: string, consumerGroup: string, handler: MessageHandler<T>, options?: ReceiveOptions<T>): Promise<void>;
403
398
  /**
package/dist/index.d.ts CHANGED
@@ -1,5 +1,5 @@
1
- import { Q as QueueClientOptions, S as SendMessageOptions, T as Transport, a as SendMessageResponse, R as ReceiveMessagesOptions, M as Message, b as ReceiveMessageByIdOptions, c as ReceiveMessageByIdResponse, D as DeleteMessageOptions, d as DeleteMessageResponse, C as ChangeVisibilityOptions, e as ChangeVisibilityResponse, f as MessageHandler, P as PublishOptions, g as ConsumerGroupOptions } from './types-BLG4ASI_.js';
2
- export { i as BadRequestError, B as BufferTransport, j as ConcurrencyLimitError, k as ConsumerDiscoveryError, l as ConsumerRegistryNotConfiguredError, m as DuplicateMessageError, F as ForbiddenError, I as InternalServerError, n as InvalidLimitError, J as JsonTransport, o as MessageAlreadyProcessedError, p as MessageCorruptedError, q as MessageLockedError, u as MessageMetadata, r as MessageNotAvailableError, s as MessageNotFoundError, t as QueueEmptyError, h as StreamTransport, U as UnauthorizedError } from './types-BLG4ASI_.js';
1
+ import { Q as QueueClientOptions, S as SendMessageOptions, T as Transport, a as SendMessageResponse, R as ReceiveMessagesOptions, M as Message, b as ReceiveMessageByIdOptions, c as ReceiveMessageByIdResponse, D as DeleteMessageOptions, d as DeleteMessageResponse, C as ChangeVisibilityOptions, e as ChangeVisibilityResponse, f as MessageHandler, P as PublishOptions, g as ConsumerGroupOptions } from './types-CAA8nT8x.js';
2
+ export { i as BadRequestError, B as BufferTransport, j as ConsumerDiscoveryError, k as ConsumerRegistryNotConfiguredError, l as DuplicateMessageError, F as ForbiddenError, I as InternalServerError, m as InvalidLimitError, J as JsonTransport, n as MessageAlreadyProcessedError, o as MessageCorruptedError, p as MessageLockedError, t as MessageMetadata, q as MessageNotAvailableError, r as MessageNotFoundError, s as QueueEmptyError, h as StreamTransport, U as UnauthorizedError } from './types-CAA8nT8x.js';
3
3
 
4
4
  declare class QueueClient {
5
5
  private baseUrl;
@@ -42,12 +42,10 @@ declare class QueueClient {
42
42
  * @param options.consumerGroup - Consumer group name (pattern: `[A-Za-z0-9_-]+`)
43
43
  * @param options.visibilityTimeoutSeconds - Lock duration (default: 30, min: 0, max: 3600)
44
44
  * @param options.limit - Max messages to retrieve (default: 1, min: 1, max: 10)
45
- * @param options.maxConcurrency - Max in-flight messages (default: unlimited, min: 1)
46
45
  * @param transport - Deserializer for message payloads
47
46
  * @yields Message objects with payload, messageId, receiptHandle, etc.
48
47
  * @throws {QueueEmptyError} When no messages available
49
48
  * @throws {InvalidLimitError} When limit is outside 1-10 range
50
- * @throws {ConcurrencyLimitError} When maxConcurrency exceeded
51
49
  * @throws {BadRequestError} When parameters are invalid
52
50
  * @throws {UnauthorizedError} When authentication fails
53
51
  * @throws {ForbiddenError} When access is denied
@@ -62,13 +60,11 @@ declare class QueueClient {
62
60
  * @param options.consumerGroup - Consumer group name (pattern: `[A-Za-z0-9_-]+`)
63
61
  * @param options.messageId - Message ID to retrieve
64
62
  * @param options.visibilityTimeoutSeconds - Lock duration (default: 30, min: 0, max: 3600)
65
- * @param options.maxConcurrency - Max in-flight messages (default: unlimited, min: 1)
66
63
  * @param transport - Deserializer for the message payload
67
64
  * @returns Promise with the message
68
65
  * @throws {MessageNotFoundError} When message doesn't exist
69
66
  * @throws {MessageNotAvailableError} When message is in wrong state or was a duplicate
70
67
  * @throws {MessageAlreadyProcessedError} When message was already processed
71
- * @throws {ConcurrencyLimitError} When maxConcurrency exceeded
72
68
  * @throws {BadRequestError} When parameters are invalid
73
69
  * @throws {UnauthorizedError} When authentication fails
74
70
  * @throws {ForbiddenError} When access is denied
@@ -397,7 +393,6 @@ interface ReceiveOptions<T = unknown> extends ConsumerGroupOptions<T>, ConsumeOp
397
393
  * @param options.transport - Payload deserializer (default: JsonTransport)
398
394
  * @returns Promise that resolves when the message is processed and deleted
399
395
  * @throws {QueueEmptyError} When no messages available
400
- * @throws {ConcurrencyLimitError} When maxConcurrency exceeded
401
396
  */
402
397
  declare function receive<T = unknown>(topicName: string, consumerGroup: string, handler: MessageHandler<T>, options?: ReceiveOptions<T>): Promise<void>;
403
398
  /**
package/dist/index.js CHANGED
@@ -33,7 +33,6 @@ __export(index_exports, {
33
33
  BadRequestError: () => BadRequestError,
34
34
  BufferTransport: () => BufferTransport,
35
35
  Client: () => Client,
36
- ConcurrencyLimitError: () => ConcurrencyLimitError,
37
36
  ConsumerDiscoveryError: () => ConsumerDiscoveryError,
38
37
  ConsumerRegistryNotConfiguredError: () => ConsumerRegistryNotConfiguredError,
39
38
  DuplicateMessageError: () => DuplicateMessageError,
@@ -211,18 +210,6 @@ var MessageAlreadyProcessedError = class extends Error {
211
210
  this.name = "MessageAlreadyProcessedError";
212
211
  }
213
212
  };
214
- var ConcurrencyLimitError = class extends Error {
215
- /** Current number of in-flight messages for this consumer group. */
216
- currentInflight;
217
- /** Maximum allowed concurrent messages (as configured). */
218
- maxConcurrency;
219
- constructor(message = "Concurrency limit exceeded", currentInflight, maxConcurrency) {
220
- super(message);
221
- this.name = "ConcurrencyLimitError";
222
- this.currentInflight = currentInflight;
223
- this.maxConcurrency = maxConcurrency;
224
- }
225
- };
226
213
  var DuplicateMessageError = class extends Error {
227
214
  idempotencyKey;
228
215
  constructor(message, idempotencyKey) {
@@ -626,13 +613,30 @@ var QueueClient = class {
626
613
  payload,
627
614
  idempotencyKey,
628
615
  retentionSeconds,
629
- delaySeconds
616
+ delaySeconds,
617
+ headers: optionHeaders
630
618
  } = options;
631
- const headers = new Headers({
632
- Authorization: `Bearer ${await this.getToken()}`,
633
- "Content-Type": transport.contentType,
634
- ...this.customHeaders
635
- });
619
+ const headers = new Headers();
620
+ if (this.customHeaders) {
621
+ for (const [name, value] of Object.entries(this.customHeaders)) {
622
+ headers.append(name, value);
623
+ }
624
+ }
625
+ if (optionHeaders) {
626
+ const protectedHeaderNames = /* @__PURE__ */ new Set(["authorization", "content-type"]);
627
+ const isProtectedHeader = (name) => {
628
+ const lower = name.toLowerCase();
629
+ if (protectedHeaderNames.has(lower)) return true;
630
+ return lower.startsWith("vqs-");
631
+ };
632
+ for (const [name, value] of Object.entries(optionHeaders)) {
633
+ if (!isProtectedHeader(name) && value !== void 0) {
634
+ headers.append(name, value);
635
+ }
636
+ }
637
+ }
638
+ headers.set("Authorization", `Bearer ${await this.getToken()}`);
639
+ headers.set("Content-Type", transport.contentType);
636
640
  const deploymentId = this.getSendDeploymentId();
637
641
  if (deploymentId) {
638
642
  headers.set("Vqs-Deployment-Id", deploymentId);
@@ -690,25 +694,17 @@ var QueueClient = class {
690
694
  * @param options.consumerGroup - Consumer group name (pattern: `[A-Za-z0-9_-]+`)
691
695
  * @param options.visibilityTimeoutSeconds - Lock duration (default: 30, min: 0, max: 3600)
692
696
  * @param options.limit - Max messages to retrieve (default: 1, min: 1, max: 10)
693
- * @param options.maxConcurrency - Max in-flight messages (default: unlimited, min: 1)
694
697
  * @param transport - Deserializer for message payloads
695
698
  * @yields Message objects with payload, messageId, receiptHandle, etc.
696
699
  * @throws {QueueEmptyError} When no messages available
697
700
  * @throws {InvalidLimitError} When limit is outside 1-10 range
698
- * @throws {ConcurrencyLimitError} When maxConcurrency exceeded
699
701
  * @throws {BadRequestError} When parameters are invalid
700
702
  * @throws {UnauthorizedError} When authentication fails
701
703
  * @throws {ForbiddenError} When access is denied
702
704
  * @throws {InternalServerError} When server encounters an error
703
705
  */
704
706
  async *receiveMessages(options, transport) {
705
- const {
706
- queueName,
707
- consumerGroup,
708
- visibilityTimeoutSeconds,
709
- limit,
710
- maxConcurrency
711
- } = options;
707
+ const { queueName, consumerGroup, visibilityTimeoutSeconds, limit } = options;
712
708
  if (limit !== void 0 && (limit < 1 || limit > 10)) {
713
709
  throw new InvalidLimitError(limit);
714
710
  }
@@ -726,9 +722,6 @@ var QueueClient = class {
726
722
  if (limit !== void 0) {
727
723
  headers.set("Vqs-Max-Messages", limit.toString());
728
724
  }
729
- if (maxConcurrency !== void 0) {
730
- headers.set("Vqs-Max-Concurrency", maxConcurrency.toString());
731
- }
732
725
  const effectiveDeploymentId = this.getConsumeDeploymentId();
733
726
  if (effectiveDeploymentId) {
734
727
  headers.set("Vqs-Deployment-Id", effectiveDeploymentId);
@@ -745,18 +738,6 @@ var QueueClient = class {
745
738
  }
746
739
  if (!response.ok) {
747
740
  const errorText = await response.text();
748
- if (response.status === 429) {
749
- let errorData = {};
750
- try {
751
- errorData = JSON.parse(errorText);
752
- } catch {
753
- }
754
- throw new ConcurrencyLimitError(
755
- errorData.error || "Concurrency limit exceeded or throttled",
756
- errorData.currentInflight,
757
- errorData.maxConcurrency
758
- );
759
- }
760
741
  throwCommonHttpError(
761
742
  response.status,
762
743
  response.statusText,
@@ -794,26 +775,18 @@ var QueueClient = class {
794
775
  * @param options.consumerGroup - Consumer group name (pattern: `[A-Za-z0-9_-]+`)
795
776
  * @param options.messageId - Message ID to retrieve
796
777
  * @param options.visibilityTimeoutSeconds - Lock duration (default: 30, min: 0, max: 3600)
797
- * @param options.maxConcurrency - Max in-flight messages (default: unlimited, min: 1)
798
778
  * @param transport - Deserializer for the message payload
799
779
  * @returns Promise with the message
800
780
  * @throws {MessageNotFoundError} When message doesn't exist
801
781
  * @throws {MessageNotAvailableError} When message is in wrong state or was a duplicate
802
782
  * @throws {MessageAlreadyProcessedError} When message was already processed
803
- * @throws {ConcurrencyLimitError} When maxConcurrency exceeded
804
783
  * @throws {BadRequestError} When parameters are invalid
805
784
  * @throws {UnauthorizedError} When authentication fails
806
785
  * @throws {ForbiddenError} When access is denied
807
786
  * @throws {InternalServerError} When server encounters an error
808
787
  */
809
788
  async receiveMessageById(options, transport) {
810
- const {
811
- queueName,
812
- consumerGroup,
813
- messageId,
814
- visibilityTimeoutSeconds,
815
- maxConcurrency
816
- } = options;
789
+ const { queueName, consumerGroup, messageId, visibilityTimeoutSeconds } = options;
817
790
  const headers = new Headers({
818
791
  Authorization: `Bearer ${await this.getToken()}`,
819
792
  Accept: "multipart/mixed",
@@ -825,9 +798,6 @@ var QueueClient = class {
825
798
  visibilityTimeoutSeconds.toString()
826
799
  );
827
800
  }
828
- if (maxConcurrency !== void 0) {
829
- headers.set("Vqs-Max-Concurrency", maxConcurrency.toString());
830
- }
831
801
  const effectiveDeploymentId = this.getConsumeDeploymentId();
832
802
  if (effectiveDeploymentId) {
833
803
  headers.set("Vqs-Deployment-Id", effectiveDeploymentId);
@@ -861,18 +831,6 @@ var QueueClient = class {
861
831
  if (response.status === 410) {
862
832
  throw new MessageAlreadyProcessedError(messageId);
863
833
  }
864
- if (response.status === 429) {
865
- let errorData = {};
866
- try {
867
- errorData = JSON.parse(errorText);
868
- } catch {
869
- }
870
- throw new ConcurrencyLimitError(
871
- errorData.error || "Concurrency limit exceeded or throttled",
872
- errorData.currentInflight,
873
- errorData.maxConcurrency
874
- );
875
- }
876
834
  throwCommonHttpError(
877
835
  response.status,
878
836
  response.statusText,
@@ -1279,7 +1237,8 @@ var Topic = class {
1279
1237
  payload,
1280
1238
  idempotencyKey: options?.idempotencyKey,
1281
1239
  retentionSeconds: options?.retentionSeconds,
1282
- delaySeconds: options?.delaySeconds
1240
+ delaySeconds: options?.delaySeconds,
1241
+ headers: options?.headers
1283
1242
  },
1284
1243
  this.transport
1285
1244
  );
@@ -1462,7 +1421,8 @@ async function send(topicName, payload, options) {
1462
1421
  payload,
1463
1422
  idempotencyKey: options?.idempotencyKey,
1464
1423
  retentionSeconds: options?.retentionSeconds,
1465
- delaySeconds: options?.delaySeconds
1424
+ delaySeconds: options?.delaySeconds,
1425
+ headers: options?.headers
1466
1426
  },
1467
1427
  transport
1468
1428
  );
@@ -1552,7 +1512,6 @@ var Client = class {
1552
1512
  BadRequestError,
1553
1513
  BufferTransport,
1554
1514
  Client,
1555
- ConcurrencyLimitError,
1556
1515
  ConsumerDiscoveryError,
1557
1516
  ConsumerRegistryNotConfiguredError,
1558
1517
  DuplicateMessageError,