@upstash/qstash 2.5.5 → 2.6.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/index.js CHANGED
@@ -13,11 +13,20 @@ var DLQ = class {
13
13
  * List messages in the dlq
14
14
  */
15
15
  async listMessages(options) {
16
- return await this.http.request({
16
+ const messagesPayload = await this.http.request({
17
17
  method: "GET",
18
18
  path: ["v2", "dlq"],
19
19
  query: { cursor: _optionalChain([options, 'optionalAccess', _ => _.cursor]) }
20
20
  });
21
+ return {
22
+ messages: messagesPayload.messages.map((message) => {
23
+ return {
24
+ ...message,
25
+ urlGroup: message.topicName
26
+ };
27
+ }),
28
+ cursor: messagesPayload.cursor
29
+ };
21
30
  }
22
31
  /**
23
32
  * Remove a message from the dlq using it's `dlqId`
@@ -140,14 +149,16 @@ var HttpClient = (_class = class {
140
149
  }}
141
150
  __init2() {this.processRequest = (request) => {
142
151
  const headers = new Headers(request.headers);
143
- headers.set("Authorization", this.authorization);
152
+ if (!headers.has("Authorization")) {
153
+ headers.set("Authorization", this.authorization);
154
+ }
144
155
  const requestOptions = {
145
156
  method: request.method,
146
157
  headers,
147
158
  body: request.body,
148
159
  keepalive: request.keepalive
149
160
  };
150
- const url = new URL([this.baseUrl, ...request.path].join("/"));
161
+ const url = new URL([_nullishCoalesce(request.baseUrl, () => ( this.baseUrl)), ...request.path].join("/"));
151
162
  if (request.query) {
152
163
  for (const [key, value] of Object.entries(request.query)) {
153
164
  if (value !== void 0) {
@@ -192,10 +203,15 @@ var Messages = class {
192
203
  * Get a message
193
204
  */
194
205
  async get(messageId) {
195
- return await this.http.request({
206
+ const messagePayload = await this.http.request({
196
207
  method: "GET",
197
208
  path: ["v2", "messages", messageId]
198
209
  });
210
+ const message = {
211
+ ...messagePayload,
212
+ urlGroup: messagePayload.topicName
213
+ };
214
+ return message;
199
215
  }
200
216
  /**
201
217
  * Cancel a message
@@ -209,6 +225,29 @@ var Messages = class {
209
225
  }
210
226
  };
211
227
 
228
+ // src/client/llm/constants.ts
229
+ var PROVIDER_MAP = {
230
+ openai: "https://api.openai.com",
231
+ togetherai: "https://api.together.xyz"
232
+ };
233
+
234
+ // src/client/llm/utils.ts
235
+ function appendLLMOptions(request, headers) {
236
+ if ("llmProvider" in request) {
237
+ const llmProvider = request.llmProvider;
238
+ if (llmProvider === "openai") {
239
+ const token = _nullishCoalesce(process.env.OPENAI_API_KEY, () => ( request.llmToken));
240
+ request.url = _nullishCoalesce(request.url, () => ( `${PROVIDER_MAP[llmProvider]}/v1/chat/completion`));
241
+ headers.set("Authorization", `Bearer ${token}`);
242
+ }
243
+ if (llmProvider === "togetherai") {
244
+ const token = _nullishCoalesce(process.env.TOGETHER_API_KEY, () => ( request.llmToken));
245
+ request.url = _nullishCoalesce(request.url, () => ( `${PROVIDER_MAP[llmProvider]}/v1/chat/completion`));
246
+ headers.set("Authorization", `Bearer ${token}`);
247
+ }
248
+ }
249
+ }
250
+
212
251
  // src/client/utils.ts
213
252
  var isIgnoredHeader = (header) => {
214
253
  const lowerCaseHeader = header.toLowerCase();
@@ -249,10 +288,13 @@ function processHeaders(request) {
249
288
  if (request.failureCallback !== void 0) {
250
289
  headers.set("Upstash-Failure-Callback", request.failureCallback);
251
290
  }
291
+ if (request.timeout !== void 0) {
292
+ headers.set("Upstash-Timeout", `${request.timeout}s`);
293
+ }
252
294
  return headers;
253
295
  }
254
296
  function getRequestPath(request) {
255
- return _nullishCoalesce(_nullishCoalesce(request.url, () => ( request.topic)), () => ( `api/${request.api}`));
297
+ return _nullishCoalesce(_nullishCoalesce(request.url, () => ( request.urlGroup)), () => ( `api/${request.api}`));
256
298
  }
257
299
 
258
300
  // src/client/queue.ts
@@ -272,7 +314,8 @@ var Queue = class {
272
314
  }
273
315
  const body = {
274
316
  queueName: this.queueName,
275
- parallelism: request.parallelism
317
+ parallelism: _nullishCoalesce(request.parallelism, () => ( 1)),
318
+ paused: _nullishCoalesce(request.paused, () => ( false))
276
319
  };
277
320
  await this.http.request({
278
321
  method: "POST",
@@ -341,6 +384,7 @@ var Queue = class {
341
384
  async enqueueJSON(request) {
342
385
  const headers = prefixHeaders(new Headers(request.headers));
343
386
  headers.set("Content-Type", "application/json");
387
+ appendLLMOptions(request, headers);
344
388
  const response = await this.enqueue({
345
389
  ...request,
346
390
  body: JSON.stringify(request.body),
@@ -348,6 +392,35 @@ var Queue = class {
348
392
  });
349
393
  return response;
350
394
  }
395
+ /**
396
+ * Pauses the queue.
397
+ *
398
+ * A paused queue will not deliver messages until
399
+ * it is resumed.
400
+ */
401
+ async pause() {
402
+ if (!this.queueName) {
403
+ throw new Error("Please provide a queue name to the Queue constructor");
404
+ }
405
+ await this.http.request({
406
+ method: "POST",
407
+ path: ["v2", "queues", this.queueName, "pause"],
408
+ parseResponseAsJson: false
409
+ });
410
+ }
411
+ /**
412
+ * Resumes the queue.
413
+ */
414
+ async resume() {
415
+ if (!this.queueName) {
416
+ throw new Error("Please provide a queue name to the Queue constructor");
417
+ }
418
+ await this.http.request({
419
+ method: "POST",
420
+ path: ["v2", "queues", this.queueName, "resume"],
421
+ parseResponseAsJson: false
422
+ });
423
+ }
351
424
  };
352
425
 
353
426
  // src/client/schedules.ts
@@ -380,6 +453,9 @@ var Schedules = class {
380
453
  if (request.failureCallback !== void 0) {
381
454
  headers.set("Upstash-Failure-Callback", request.failureCallback);
382
455
  }
456
+ if (request.timeout !== void 0) {
457
+ headers.set("Upstash-Timeout", `${request.timeout}s`);
458
+ }
383
459
  return await this.http.request({
384
460
  method: "POST",
385
461
  headers,
@@ -415,16 +491,39 @@ var Schedules = class {
415
491
  parseResponseAsJson: false
416
492
  });
417
493
  }
494
+ /**
495
+ * Pauses the schedule.
496
+ *
497
+ * A paused schedule will not deliver messages until
498
+ * it is resumed.
499
+ */
500
+ async pause({ schedule }) {
501
+ await this.http.request({
502
+ method: "PATCH",
503
+ path: ["v2", "schedules", schedule, "pause"],
504
+ parseResponseAsJson: false
505
+ });
506
+ }
507
+ /**
508
+ * Resumes the schedule.
509
+ */
510
+ async resume({ schedule }) {
511
+ await this.http.request({
512
+ method: "PATCH",
513
+ path: ["v2", "schedules", schedule, "resume"],
514
+ parseResponseAsJson: false
515
+ });
516
+ }
418
517
  };
419
518
 
420
- // src/client/topics.ts
421
- var Topics = class {
519
+ // src/client/url-groups.ts
520
+ var UrlGroups = class {
422
521
 
423
522
  constructor(http) {
424
523
  this.http = http;
425
524
  }
426
525
  /**
427
- * Create a new topic with the given name and endpoints
526
+ * Create a new url group with the given name and endpoints
428
527
  */
429
528
  async addEndpoints(request) {
430
529
  await this.http.request({
@@ -436,7 +535,7 @@ var Topics = class {
436
535
  });
437
536
  }
438
537
  /**
439
- * Remove endpoints from a topic.
538
+ * Remove endpoints from a url group.
440
539
  */
441
540
  async removeEndpoints(request) {
442
541
  await this.http.request({
@@ -448,7 +547,7 @@ var Topics = class {
448
547
  });
449
548
  }
450
549
  /**
451
- * Get a list of all topics.
550
+ * Get a list of all url groups.
452
551
  */
453
552
  async list() {
454
553
  return await this.http.request({
@@ -457,7 +556,7 @@ var Topics = class {
457
556
  });
458
557
  }
459
558
  /**
460
- * Get a single topic
559
+ * Get a single url group
461
560
  */
462
561
  async get(name) {
463
562
  return await this.http.request({
@@ -466,7 +565,7 @@ var Topics = class {
466
565
  });
467
566
  }
468
567
  /**
469
- * Delete a topic
568
+ * Delete a url group
470
569
  */
471
570
  async delete(name) {
472
571
  return await this.http.request({
@@ -480,7 +579,7 @@ var Topics = class {
480
579
  // src/client/llm/chat.ts
481
580
  var Chat = (_class2 = class _Chat {
482
581
 
483
- constructor(http) {;_class2.prototype.__init3.call(this);_class2.prototype.__init4.call(this);
582
+ constructor(http) {;_class2.prototype.__init3.call(this);_class2.prototype.__init4.call(this);_class2.prototype.__init5.call(this);
484
583
  this.http = http;
485
584
  }
486
585
  static toChatRequest(request) {
@@ -502,6 +601,8 @@ var Chat = (_class2 = class _Chat {
502
601
  * @returns Chat completion or stream
503
602
  */
504
603
  __init3() {this.create = async (request) => {
604
+ if (request.provider === "openai" || request.provider === "togetherai")
605
+ return this.createThirdParty(request);
505
606
  const body = JSON.stringify(request);
506
607
  if ("stream" in request && request.stream) {
507
608
  return this.http.requestStream({
@@ -523,6 +624,51 @@ var Chat = (_class2 = class _Chat {
523
624
  body
524
625
  });
525
626
  }}
627
+ /**
628
+ * Calls the Upstash completions api given a ChatRequest.
629
+ *
630
+ * Returns a ChatCompletion or a stream of ChatCompletionChunks
631
+ * if stream is enabled.
632
+ *
633
+ * @param request ChatRequest with messages
634
+ * @returns Chat completion or stream
635
+ */
636
+ __init4() {this.createThirdParty = async (request) => {
637
+ if (request.provider === "openai" || request.provider === "togetherai") {
638
+ const baseUrl = PROVIDER_MAP[request.provider];
639
+ const llmToken = request.llmToken;
640
+ delete request.llmToken;
641
+ delete request.system;
642
+ delete request.provider;
643
+ const body = JSON.stringify(request);
644
+ if ("stream" in request && request.stream) {
645
+ return this.http.requestStream({
646
+ path: ["v1", "chat", "completions"],
647
+ method: "POST",
648
+ headers: {
649
+ "Content-Type": "application/json",
650
+ Connection: "keep-alive",
651
+ Accept: "text/event-stream",
652
+ "Cache-Control": "no-cache",
653
+ Authorization: `Bearer ${llmToken}`
654
+ },
655
+ body,
656
+ baseUrl
657
+ });
658
+ }
659
+ return this.http.request({
660
+ path: ["v1", "chat", "completions"],
661
+ method: "POST",
662
+ headers: {
663
+ "Content-Type": "application/json",
664
+ Authorization: `Bearer ${llmToken}`
665
+ },
666
+ body,
667
+ baseUrl
668
+ });
669
+ }
670
+ throw new Error("Could not find any third party provider");
671
+ }}
526
672
  /**
527
673
  * Calls the Upstash completions api given a PromptRequest.
528
674
  *
@@ -534,7 +680,7 @@ var Chat = (_class2 = class _Chat {
534
680
  * mistralai/Mistral-7B-Instruct-v0.2 model.
535
681
  * @returns Chat completion or stream
536
682
  */
537
- __init4() {this.prompt = async (request) => {
683
+ __init5() {this.prompt = async (request) => {
538
684
  const chatRequest = _Chat.toChatRequest(request);
539
685
  return this.create(chatRequest);
540
686
  }}
@@ -551,12 +697,12 @@ var Client = class {
551
697
  });
552
698
  }
553
699
  /**
554
- * Access the topic API.
700
+ * Access the urlGroup API.
555
701
  *
556
- * Create, read, update or delete topics.
702
+ * Create, read, update or delete urlGroups.
557
703
  */
558
- get topics() {
559
- return new Topics(this.http);
704
+ get urlGroups() {
705
+ return new UrlGroups(this.http);
560
706
  }
561
707
  /**
562
708
  * Access the dlq API.
@@ -615,6 +761,7 @@ var Client = class {
615
761
  async publishJSON(request) {
616
762
  const headers = prefixHeaders(new Headers(request.headers));
617
763
  headers.set("Content-Type", "application/json");
764
+ appendLLMOptions(request, headers);
618
765
  const response = await this.publish({
619
766
  ...request,
620
767
  headers,
@@ -656,6 +803,7 @@ var Client = class {
656
803
  message.body = JSON.stringify(message.body);
657
804
  }
658
805
  message.headers = new Headers(message.headers);
806
+ appendLLMOptions(message, message.headers);
659
807
  message.headers.set("Content-Type", "application/json");
660
808
  }
661
809
  const response = await this.batch(request);
@@ -693,12 +841,20 @@ var Client = class {
693
841
  query[key] = value.toString();
694
842
  }
695
843
  }
696
- const response = await this.http.request({
844
+ const responsePayload = await this.http.request({
697
845
  path: ["v2", "events"],
698
846
  method: "GET",
699
847
  query
700
848
  });
701
- return response;
849
+ return {
850
+ cursor: responsePayload.cursor,
851
+ events: responsePayload.events.map((event) => {
852
+ return {
853
+ ...event,
854
+ urlGroup: event.topicName
855
+ };
856
+ })
857
+ };
702
858
  }
703
859
  };
704
860
 
@@ -712,4 +868,4 @@ var Client = class {
712
868
 
713
869
 
714
870
 
715
- exports.Chat = Chat; exports.Client = Client; exports.Messages = Messages; exports.QstashChatRatelimitError = QstashChatRatelimitError; exports.QstashError = QstashError; exports.QstashRatelimitError = QstashRatelimitError; exports.Receiver = _chunkUUR7N6E6js.Receiver; exports.Schedules = Schedules; exports.SignatureError = _chunkUUR7N6E6js.SignatureError; exports.Topics = Topics;
871
+ exports.Chat = Chat; exports.Client = Client; exports.Messages = Messages; exports.QstashChatRatelimitError = QstashChatRatelimitError; exports.QstashError = QstashError; exports.QstashRatelimitError = QstashRatelimitError; exports.Receiver = _chunkUUR7N6E6js.Receiver; exports.Schedules = Schedules; exports.SignatureError = _chunkUUR7N6E6js.SignatureError; exports.UrlGroups = UrlGroups;