@upstash/qstash 2.9.0 → 2.9.1-rc.1

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/index.d.mts CHANGED
@@ -1,5 +1,5 @@
1
- import { R as RateLimit, C as ChatRateLimit, S as Step, F as FailureFunctionPayload, L as LLMOwner, B as BaseProvider, E as EmailOwner, P as ProviderInfo } from './client-BVG9vt90.mjs';
2
- export { A as AddEndpointsRequest, K as BodyInit, X as Chat, Z as ChatCompletion, _ as ChatCompletionChunk, Y as ChatCompletionMessage, a4 as ChatRequest, j as Client, r as CreateScheduleRequest, t as Endpoint, y as Event, D as EventPayload, h as EventsRequest, T as FlowControl, J as GetEventsPayload, i as GetEventsResponse, I as GetLogsPayload, G as GetLogsResponse, H as HTTPMethods, N as HeadersInit, x as Log, z as LogPayload, g as LogsRequest, M as Message, o as MessagePayload, p as Messages, a2 as OpenAIChatModel, a3 as PromptChatRequest, d as PublishBatchRequest, f as PublishJsonRequest, e as PublishRequest, n as PublishResponse, k as PublishToApiResponse, m as PublishToUrlGroupsResponse, l as PublishToUrlResponse, Q as QueueRequest, c as Receiver, a as ReceiverConfig, u as RemoveEndpointsRequest, O as RequestOptions, q as Schedule, s as Schedules, b as SignatureError, w as State, a0 as StreamDisabled, $ as StreamEnabled, a1 as StreamParameter, U as UrlGroup, v as UrlGroups, V as VerifyRequest, W as WithCursor, a7 as anthropic, a8 as custom, a6 as openai, a5 as upstash } from './client-BVG9vt90.mjs';
1
+ import { R as RateLimit, C as ChatRateLimit, S as Step, F as FailureFunctionPayload, L as LLMOwner, B as BaseProvider, E as EmailOwner, P as ProviderInfo } from './client-Gv4WRTxB.mjs';
2
+ export { A as AddEndpointsRequest, N as BodyInit, Y as Chat, _ as ChatCompletion, $ as ChatCompletionChunk, Z as ChatCompletionMessage, a5 as ChatRequest, j as Client, r as CreateScheduleRequest, t as Endpoint, z as Event, I as EventPayload, h as EventsRequest, X as FlowControl, K as GetEventsPayload, i as GetEventsResponse, J as GetLogsPayload, G as GetLogsResponse, H as HTTPMethods, O as HeadersInit, y as Log, D as LogPayload, g as LogsRequest, M as Message, o as MessagePayload, p as Messages, a3 as OpenAIChatModel, a4 as PromptChatRequest, d as PublishBatchRequest, f as PublishJsonRequest, e as PublishRequest, n as PublishResponse, k as PublishToApiResponse, m as PublishToUrlGroupsResponse, l as PublishToUrlResponse, Q as QueueRequest, c as Receiver, a as ReceiverConfig, u as RemoveEndpointsRequest, T as RequestOptions, q as Schedule, s as Schedules, b as SignatureError, x as State, a1 as StreamDisabled, a0 as StreamEnabled, a2 as StreamParameter, U as UniversalFilterFields, v as UrlGroup, w as UrlGroups, V as VerifyRequest, W as WithCursor, a8 as anthropic, a9 as custom, a7 as openai, a6 as upstash } from './client-Gv4WRTxB.mjs';
3
3
  import 'neverthrow';
4
4
 
5
5
  /**
package/index.d.ts CHANGED
@@ -1,5 +1,5 @@
1
- import { R as RateLimit, C as ChatRateLimit, S as Step, F as FailureFunctionPayload, L as LLMOwner, B as BaseProvider, E as EmailOwner, P as ProviderInfo } from './client-BVG9vt90.js';
2
- export { A as AddEndpointsRequest, K as BodyInit, X as Chat, Z as ChatCompletion, _ as ChatCompletionChunk, Y as ChatCompletionMessage, a4 as ChatRequest, j as Client, r as CreateScheduleRequest, t as Endpoint, y as Event, D as EventPayload, h as EventsRequest, T as FlowControl, J as GetEventsPayload, i as GetEventsResponse, I as GetLogsPayload, G as GetLogsResponse, H as HTTPMethods, N as HeadersInit, x as Log, z as LogPayload, g as LogsRequest, M as Message, o as MessagePayload, p as Messages, a2 as OpenAIChatModel, a3 as PromptChatRequest, d as PublishBatchRequest, f as PublishJsonRequest, e as PublishRequest, n as PublishResponse, k as PublishToApiResponse, m as PublishToUrlGroupsResponse, l as PublishToUrlResponse, Q as QueueRequest, c as Receiver, a as ReceiverConfig, u as RemoveEndpointsRequest, O as RequestOptions, q as Schedule, s as Schedules, b as SignatureError, w as State, a0 as StreamDisabled, $ as StreamEnabled, a1 as StreamParameter, U as UrlGroup, v as UrlGroups, V as VerifyRequest, W as WithCursor, a7 as anthropic, a8 as custom, a6 as openai, a5 as upstash } from './client-BVG9vt90.js';
1
+ import { R as RateLimit, C as ChatRateLimit, S as Step, F as FailureFunctionPayload, L as LLMOwner, B as BaseProvider, E as EmailOwner, P as ProviderInfo } from './client-Gv4WRTxB.js';
2
+ export { A as AddEndpointsRequest, N as BodyInit, Y as Chat, _ as ChatCompletion, $ as ChatCompletionChunk, Z as ChatCompletionMessage, a5 as ChatRequest, j as Client, r as CreateScheduleRequest, t as Endpoint, z as Event, I as EventPayload, h as EventsRequest, X as FlowControl, K as GetEventsPayload, i as GetEventsResponse, J as GetLogsPayload, G as GetLogsResponse, H as HTTPMethods, O as HeadersInit, y as Log, D as LogPayload, g as LogsRequest, M as Message, o as MessagePayload, p as Messages, a3 as OpenAIChatModel, a4 as PromptChatRequest, d as PublishBatchRequest, f as PublishJsonRequest, e as PublishRequest, n as PublishResponse, k as PublishToApiResponse, m as PublishToUrlGroupsResponse, l as PublishToUrlResponse, Q as QueueRequest, c as Receiver, a as ReceiverConfig, u as RemoveEndpointsRequest, T as RequestOptions, q as Schedule, s as Schedules, b as SignatureError, x as State, a1 as StreamDisabled, a0 as StreamEnabled, a2 as StreamParameter, U as UniversalFilterFields, v as UrlGroup, w as UrlGroups, V as VerifyRequest, W as WithCursor, a8 as anthropic, a9 as custom, a7 as openai, a6 as upstash } from './client-Gv4WRTxB.js';
3
3
  import 'neverthrow';
4
4
 
5
5
  /**
package/index.js CHANGED
@@ -423,6 +423,43 @@ function decodeBase64(base64) {
423
423
  }
424
424
  }
425
425
  }
426
+ function buildBulkActionFilterPayload(request, options) {
427
+ const hasDlqIds = "dlqIds" in request && request.dlqIds !== void 0;
428
+ const hasAll = "all" in request && Boolean(request.all);
429
+ const filterKeys = Object.keys(request).filter((k) => k !== "dlqIds" && k !== "all");
430
+ const hasFilters = filterKeys.length > 0;
431
+ if (hasDlqIds && hasAll) {
432
+ throw new QstashError("dlqIds and all: true are mutually exclusive.");
433
+ }
434
+ if (hasDlqIds && hasFilters) {
435
+ throw new QstashError(
436
+ `dlqIds cannot be combined with filter fields: ${filterKeys.join(", ")}.`
437
+ );
438
+ }
439
+ if (hasAll && hasFilters) {
440
+ throw new QstashError(
441
+ `all: true cannot be combined with filter fields: ${filterKeys.join(", ")}.`
442
+ );
443
+ }
444
+ if (hasAll)
445
+ return {};
446
+ const { urlGroup, callerIp, ...rest } = request;
447
+ const payload = {
448
+ ...rest,
449
+ ...urlGroup === void 0 || typeof urlGroup !== "string" ? {} : { topicName: urlGroup },
450
+ ...callerIp === void 0 || typeof callerIp !== "string" ? {} : options?.callerIpCasing ? { callerIP: callerIp } : { callerIp }
451
+ };
452
+ if (Object.keys(payload).length === 0) {
453
+ throw new QstashError(
454
+ "No filters provided. Pass { all: true } to explicitly target all messages."
455
+ );
456
+ }
457
+ return payload;
458
+ }
459
+ function normalizeCursor(response) {
460
+ const cursor = response.cursor;
461
+ return { ...response, cursor: cursor || void 0 };
462
+ }
426
463
  function getRuntime() {
427
464
  if (typeof process === "object" && typeof process.versions == "object" && process.versions.bun)
428
465
  return `bun@${process.versions.bun}`;
@@ -652,17 +689,20 @@ var DLQ = class {
652
689
  /**
653
690
  * List messages in the dlq
654
691
  */
655
- async listMessages(options) {
692
+ async listMessages(options = {}) {
693
+ const { urlGroup, ...restFilter } = options.filter ?? {};
656
694
  const filterPayload = {
657
- ...options?.filter,
658
- topicName: options?.filter?.urlGroup
695
+ ...restFilter,
696
+ ...urlGroup === void 0 ? {} : { topicName: urlGroup }
659
697
  };
660
698
  const messagesPayload = await this.http.request({
661
699
  method: "GET",
662
700
  path: ["v2", "dlq"],
663
701
  query: {
664
- cursor: options?.cursor,
665
- count: options?.count,
702
+ cursor: options.cursor,
703
+ count: options.count,
704
+ order: options.order,
705
+ trimBody: options.trimBody,
666
706
  ...filterPayload
667
707
  }
668
708
  });
@@ -678,26 +718,70 @@ var DLQ = class {
678
718
  };
679
719
  }
680
720
  /**
681
- * Remove a message from the dlq using it's `dlqId`
721
+ * Remove messages from the dlq.
722
+ *
723
+ * Can be called with:
724
+ * - A single dlqId: `delete("id")`
725
+ * - An array of dlqIds: `delete(["id1", "id2"])`
726
+ * - An object with dlqIds: `delete({ dlqIds: ["id1", "id2"] })`
727
+ * - A filter object: `delete({ url: "https://example.com", label: "label" })`
728
+ * - All messages: `delete({ all: true })`
729
+ *
730
+ * Note: passing an empty array returns `{ deleted: 0 }` without making a request.
682
731
  */
683
- async delete(dlqMessageId) {
684
- return await this.http.request({
685
- method: "DELETE",
686
- path: ["v2", "dlq", dlqMessageId],
687
- parseResponseAsJson: false
688
- // there is no response
689
- });
732
+ async delete(request) {
733
+ if (typeof request === "string") {
734
+ await this.http.request({
735
+ method: "DELETE",
736
+ path: ["v2", "dlq", request],
737
+ parseResponseAsJson: false
738
+ });
739
+ return { deleted: 1 };
740
+ }
741
+ if (Array.isArray(request) && request.length === 0)
742
+ return { deleted: 0 };
743
+ const filters = Array.isArray(request) ? { dlqIds: request } : request;
744
+ return normalizeCursor(
745
+ await this.http.request({
746
+ method: "DELETE",
747
+ path: ["v2", "dlq"],
748
+ query: buildBulkActionFilterPayload(filters)
749
+ })
750
+ );
690
751
  }
691
752
  /**
692
753
  * Remove multiple messages from the dlq using their `dlqId`s
754
+ *
755
+ * @deprecated Use `delete` instead
693
756
  */
694
757
  async deleteMany(request) {
695
- return await this.http.request({
696
- method: "DELETE",
697
- path: ["v2", "dlq"],
698
- headers: { "Content-Type": "application/json" },
699
- body: JSON.stringify({ dlqIds: request.dlqIds })
700
- });
758
+ return await this.delete(request);
759
+ }
760
+ /**
761
+ * Retry messages from the dlq.
762
+ *
763
+ * Can be called with:
764
+ * - A single dlqId: `retry("id")`
765
+ * - An array of dlqIds: `retry(["id1", "id2"])`
766
+ * - An object with dlqIds: `retry({ dlqIds: ["id1", "id2"] })`
767
+ * - A filter object: `retry({ url: "https://example.com", label: "label" })`
768
+ * - All messages: `retry({ all: true })`
769
+ *
770
+ * Note: passing an empty array returns `{ responses: [] }` without making a request.
771
+ */
772
+ async retry(request) {
773
+ if (typeof request === "string")
774
+ request = [request];
775
+ if (Array.isArray(request) && request.length === 0)
776
+ return { responses: [] };
777
+ const filters = Array.isArray(request) ? { dlqIds: request } : request;
778
+ return normalizeCursor(
779
+ await this.http.request({
780
+ method: "POST",
781
+ path: ["v2", "dlq", "retry"],
782
+ query: buildBulkActionFilterPayload(filters)
783
+ })
784
+ );
701
785
  }
702
786
  };
703
787
 
@@ -798,7 +882,15 @@ var HttpClient = class {
798
882
  const url = new URL([request.baseUrl ?? this.baseUrl, ...request.path].join("/"));
799
883
  if (request.query) {
800
884
  for (const [key, value] of Object.entries(request.query)) {
801
- if (value !== void 0) {
885
+ if (value === void 0)
886
+ continue;
887
+ if (Array.isArray(value)) {
888
+ for (const item of value) {
889
+ url.searchParams.append(key, item);
890
+ }
891
+ } else if (value instanceof Date) {
892
+ url.searchParams.set(key, value.getTime().toString());
893
+ } else {
802
894
  url.searchParams.set(key, value.toString());
803
895
  }
804
896
  }
@@ -1029,29 +1121,57 @@ var Messages = class {
1029
1121
  return message;
1030
1122
  }
1031
1123
  /**
1032
- * Cancel a message
1124
+ * Cancel messages.
1125
+ *
1126
+ * Can be called with:
1127
+ * - A single messageId: `cancel("id")`
1128
+ * - An array of messageIds: `cancel(["id1", "id2"])`
1129
+ * - A filter object: `cancel({ flowControlKey: "key", label: "label" })`
1130
+ * - All messages: `cancel({ all: true })`
1033
1131
  */
1034
- async delete(messageId) {
1132
+ async cancel(request) {
1133
+ if (typeof request === "string") {
1134
+ return await this.http.request({
1135
+ method: "DELETE",
1136
+ path: ["v2", "messages", request]
1137
+ });
1138
+ }
1139
+ if (Array.isArray(request) && request.length === 0)
1140
+ return { cancelled: 0 };
1141
+ const filters = Array.isArray(request) ? { messageIds: request } : request;
1035
1142
  return await this.http.request({
1143
+ method: "DELETE",
1144
+ path: ["v2", "messages"],
1145
+ query: buildBulkActionFilterPayload(filters, { callerIpCasing: true })
1146
+ });
1147
+ }
1148
+ /**
1149
+ * Delete a message.
1150
+ *
1151
+ * @deprecated Use `cancel(messageId: string)` instead
1152
+ */
1153
+ async delete(messageId) {
1154
+ await this.http.request({
1036
1155
  method: "DELETE",
1037
1156
  path: ["v2", "messages", messageId],
1038
1157
  parseResponseAsJson: false
1039
1158
  });
1040
1159
  }
1160
+ /**
1161
+ * Cancel multiple messages by their messageIds.
1162
+ *
1163
+ * @deprecated Use `cancel(messageIds: string[])` instead
1164
+ */
1041
1165
  async deleteMany(messageIds) {
1042
- const result = await this.http.request({
1043
- method: "DELETE",
1044
- path: ["v2", "messages"],
1045
- headers: { "Content-Type": "application/json" },
1046
- body: JSON.stringify({ messageIds })
1047
- });
1166
+ const result = await this.cancel(messageIds);
1048
1167
  return result.cancelled;
1049
1168
  }
1169
+ /**
1170
+ * Cancel all messages
1171
+ * @deprecated Use `cancel({all: true})` to cancel all
1172
+ */
1050
1173
  async deleteAll() {
1051
- const result = await this.http.request({
1052
- method: "DELETE",
1053
- path: ["v2", "messages"]
1054
- });
1174
+ const result = await this.cancel({ all: true });
1055
1175
  return result.cancelled;
1056
1176
  }
1057
1177
  };
@@ -1416,7 +1536,7 @@ var Workflow = class {
1416
1536
  };
1417
1537
 
1418
1538
  // version.ts
1419
- var VERSION = "v2.9.0";
1539
+ var VERSION = "v2.9.1-rc.1";
1420
1540
 
1421
1541
  // src/client/client.ts
1422
1542
  var Client = class {
@@ -1611,39 +1731,47 @@ var Client = class {
1611
1731
  * }
1612
1732
  * ```
1613
1733
  */
1614
- async logs(request) {
1615
- const query = {};
1616
- if (typeof request?.cursor === "number" && request.cursor > 0) {
1617
- query.cursor = request.cursor.toString();
1618
- } else if (typeof request?.cursor === "string" && request.cursor !== "") {
1619
- query.cursor = request.cursor;
1620
- }
1621
- for (const [key, value] of Object.entries(request?.filter ?? {})) {
1622
- if (typeof value === "number" && value < 0) {
1623
- continue;
1624
- }
1625
- if (key === "urlGroup") {
1626
- query.topicName = value.toString();
1627
- } else if (typeof value !== "undefined") {
1628
- query[key] = value.toString();
1629
- }
1734
+ async logs(request = {}) {
1735
+ const {
1736
+ urlGroup,
1737
+ // eslint-disable-next-line @typescript-eslint/no-deprecated
1738
+ topicName,
1739
+ fromDate,
1740
+ toDate,
1741
+ callerIp,
1742
+ messageIds,
1743
+ // eslint-disable-next-line @typescript-eslint/no-deprecated
1744
+ count: filterCount,
1745
+ ...restFilter
1746
+ } = request.filter ?? {};
1747
+ const filterPayload = {
1748
+ ...restFilter,
1749
+ topicName: urlGroup ?? topicName,
1750
+ fromDate,
1751
+ toDate,
1752
+ callerIp
1753
+ };
1754
+ let cursorString;
1755
+ if (typeof request.cursor === "number" && request.cursor > 0) {
1756
+ cursorString = request.cursor.toString();
1757
+ } else if (typeof request.cursor === "string" && request.cursor !== "") {
1758
+ cursorString = request.cursor;
1630
1759
  }
1760
+ const query = {
1761
+ cursor: cursorString,
1762
+ count: request.count ?? filterCount,
1763
+ order: request.order,
1764
+ trimBody: request.trimBody,
1765
+ messageIds,
1766
+ ...filterPayload
1767
+ };
1631
1768
  const responsePayload = await this.http.request({
1632
1769
  path: ["v2", "events"],
1633
1770
  method: "GET",
1634
1771
  query
1635
1772
  });
1636
- const logs = responsePayload.events.map((event) => {
1637
- return {
1638
- ...event,
1639
- urlGroup: event.topicName
1640
- };
1641
- });
1642
- return {
1643
- cursor: responsePayload.cursor,
1644
- logs,
1645
- events: logs
1646
- };
1773
+ const logs = responsePayload.events.map((event) => ({ ...event, urlGroup: event.topicName }));
1774
+ return { cursor: responsePayload.cursor, logs, events: logs };
1647
1775
  }
1648
1776
  /**
1649
1777
  * @deprecated Will be removed in the next major release. Use the `logs` method instead.
package/index.mjs CHANGED
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  resend
3
- } from "./chunk-M7SEEFAC.mjs";
3
+ } from "./chunk-SN6OPGRS.mjs";
4
4
  import {
5
5
  Chat,
6
6
  Client,
@@ -22,7 +22,7 @@ import {
22
22
  openai,
23
23
  setupAnalytics,
24
24
  upstash
25
- } from "./chunk-QYBCXZKB.mjs";
25
+ } from "./chunk-RUCOF5QZ.mjs";
26
26
  export {
27
27
  Chat,
28
28
  Client,
package/nextjs.d.mts CHANGED
@@ -1,6 +1,6 @@
1
1
  import { NextApiHandler } from 'next';
2
2
  import { NextRequest, NextFetchEvent } from 'next/server';
3
- import { a9 as RouteFunction, aa as WorkflowServeOptions } from './client-BVG9vt90.mjs';
3
+ import { aa as RouteFunction, ab as WorkflowServeOptions } from './client-Gv4WRTxB.mjs';
4
4
  import 'neverthrow';
5
5
 
6
6
  type VerifySignatureConfig = {
package/nextjs.d.ts CHANGED
@@ -1,6 +1,6 @@
1
1
  import { NextApiHandler } from 'next';
2
2
  import { NextRequest, NextFetchEvent } from 'next/server';
3
- import { a9 as RouteFunction, aa as WorkflowServeOptions } from './client-BVG9vt90.js';
3
+ import { aa as RouteFunction, ab as WorkflowServeOptions } from './client-Gv4WRTxB.js';
4
4
  import 'neverthrow';
5
5
 
6
6
  type VerifySignatureConfig = {