prisma-pgmq 1.0.0 → 2.0.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/README.md CHANGED
@@ -8,6 +8,13 @@ A TypeScript library that provides type-safe methods for PostgreSQL Message Queu
8
8
  - 📦 **Easy to use**: Simple API with functional methods
9
9
  - 🔌 **Prisma Integration**: Seamless integration with your existing Prisma setup
10
10
 
11
+ ## Compatibility
12
+
13
+ | prisma-pgmq | Prisma ORM | Node.js |
14
+ |-------------|------------|-----------|
15
+ | v2.x | v7+ | >= 20.19 |
16
+ | v1.x | v5 / v6 | >= 16 |
17
+
11
18
  ## Installation
12
19
 
13
20
  ```bash
@@ -21,8 +28,8 @@ yarn add prisma-pgmq
21
28
  ### Prerequisites
22
29
 
23
30
  - PostgreSQL database with the PGMQ extension installed
24
- - Prisma Client v5.0.0 or higher
25
- - Node.js 16+
31
+ - Prisma Client v7.0.0 or higher
32
+ - Node.js 20.19+
26
33
 
27
34
  > **Enabling the PGMQ extension via Prisma**
28
35
  >
@@ -30,13 +37,12 @@ yarn add prisma-pgmq
30
37
  >
31
38
  > ```prisma
32
39
  > generator client {
33
- > provider = "prisma-client-js"
34
- > previewFeatures = ["postgresqlExtensions"]
40
+ > provider = "prisma-client"
41
+ > output = "./generated/prisma/client"
35
42
  > }
36
43
  >
37
44
  > datasource db {
38
45
  > provider = "postgresql"
39
- > url = env("DATABASE_URL")
40
46
  > extensions = [pgmq]
41
47
  > }
42
48
  > ```
@@ -48,7 +54,7 @@ yarn add prisma-pgmq
48
54
  ### Functional API
49
55
 
50
56
  ```typescript
51
- import { PrismaClient } from '@prisma/client';
57
+ import { PrismaClient } from './generated/prisma/client';
52
58
  import { pgmq } from 'prisma-pgmq';
53
59
 
54
60
  const prisma = new PrismaClient();
@@ -78,7 +84,12 @@ const msgId = await pgmq.send(tx, 'my-queue', { data: 'hello' });
78
84
  const msgId = await pgmq.send(tx, 'my-queue', { data: 'hello' }, 30);
79
85
 
80
86
  // Send with specific time
81
- tx, 'my-queue', { data: 'hello' }, new Date('2024-01-01T10:00:00Z'));
87
+ const msgId = await pgmq.send(
88
+ tx,
89
+ 'my-queue',
90
+ { data: 'hello' },
91
+ new Date('2024-01-01T10:00:00Z')
92
+ );
82
93
  ```
83
94
 
84
95
  #### `sendBatch(tx, queueName, messages, delay?)`
@@ -265,44 +276,12 @@ interface QueueInfo {
265
276
  }
266
277
  ```
267
278
 
268
- ## Best Practices
269
-
270
- ### 1. Use Appropriate Visibility Timeouts
271
- Choose visibility timeouts based on your message processing time:
272
-
273
- ```typescript
274
- // For quick operations (30 seconds)
275
- const messages = await prisma.$pgmq.read('quick-tasks', 30);
276
-
277
- // For longer operations (5 minutes)
278
- const messages = await prisma.$pgmq.read('heavy-tasks', 300);
279
- ```
280
-
281
- ### 2. Handle Message Processing Failures
282
- Always delete or archive messages after successful processing:
283
-
284
- ```typescript
285
- const messages = await prisma.$pgmq.read('my-queue', 30, 10);
286
-
287
- for (const message of messages) {
288
- try {
289
- await processMessage(message.message);
290
- await prisma.$pgmq.deleteMessage('my-queue', message.msg_id);
291
- } catch (error) {
292
- // Handle error - message will become visible again after timeout
293
- console.error('Failed to process message:', error);
294
- // Optionally archive failed messages
295
- await prisma.$pgmq.archive('my-queue', message.msg_id);
296
- }
297
- }
298
- ```
299
-
300
279
  ## Examples
301
280
 
302
281
  ### Basic Worker Pattern
303
282
 
304
283
  ```typescript
305
- import { PrismaClient } from '@prisma/client';
284
+ import { PrismaClient } from './generated/prisma/client';
306
285
  import { pgmq } from 'prisma-pgmq';
307
286
 
308
287
  const prisma = new PrismaClient();
package/dist/index.d.mts CHANGED
@@ -1,6 +1,10 @@
1
- import { Prisma } from '@prisma/client/extension';
1
+ import { Sql } from '@prisma/client/runtime/client';
2
2
 
3
3
  type Task = Record<string, unknown>;
4
+ interface PgmqClient {
5
+ $queryRaw<T = unknown>(query: TemplateStringsArray | Sql, ...values: any[]): Promise<T>;
6
+ $executeRaw(query: TemplateStringsArray | Sql, ...values: any[]): Promise<number>;
7
+ }
4
8
  interface MessageRecord {
5
9
  msg_id: number;
6
10
  read_ct: number;
@@ -22,27 +26,28 @@ interface QueueInfo {
22
26
  is_partitioned: boolean;
23
27
  is_unlogged: boolean;
24
28
  }
25
- declare function send(tx: Prisma.TransactionClient, queueName: string, msg: Task, delay?: number | Date): Promise<number>;
26
- declare function sendBatch(tx: Prisma.TransactionClient, queueName: string, msgs: Task[], delay?: number | Date): Promise<number[]>;
27
- declare function read(tx: Prisma.TransactionClient, queueName: string, vt: number, qty?: number, conditional?: Task): Promise<MessageRecord[]>;
28
- declare function readWithPoll(tx: Prisma.TransactionClient, queueName: string, vt: number, qty?: number, maxPollSeconds?: number, pollIntervalMs?: number, conditional?: Task): Promise<MessageRecord[]>;
29
- declare function pop(tx: Prisma.TransactionClient, queueName: string): Promise<MessageRecord[]>;
30
- declare function deleteMessage(tx: Prisma.TransactionClient, queueName: string, msgId: number): Promise<boolean>;
31
- declare function deleteBatch(tx: Prisma.TransactionClient, queueName: string, msgIds: number[]): Promise<number[]>;
32
- declare function purgeQueue(tx: Prisma.TransactionClient, queueName: string): Promise<number>;
33
- declare function archive(tx: Prisma.TransactionClient, queueName: string, msgId: number): Promise<boolean>;
34
- declare function archiveBatch(tx: Prisma.TransactionClient, queueName: string, msgIds: number[]): Promise<number[]>;
35
- declare function createQueue(tx: Prisma.TransactionClient, queueName: string): Promise<void>;
36
- declare function createPartitionedQueue(tx: Prisma.TransactionClient, queueName: string, partitionInterval?: string, retentionInterval?: string): Promise<void>;
37
- declare function createUnloggedQueue(tx: Prisma.TransactionClient, queueName: string): Promise<void>;
38
- declare function detachArchive(tx: Prisma.TransactionClient, queueName: string): Promise<void>;
39
- declare function dropQueue(tx: Prisma.TransactionClient, queueName: string): Promise<boolean>;
40
- declare function setVt(tx: Prisma.TransactionClient, queueName: string, msgId: number, vtOffset: number): Promise<MessageRecord>;
41
- declare function listQueues(tx: Prisma.TransactionClient): Promise<QueueInfo[]>;
42
- declare function metrics(tx: Prisma.TransactionClient, queueName: string): Promise<QueueMetrics>;
43
- declare function metricsAll(tx: Prisma.TransactionClient): Promise<QueueMetrics[]>;
29
+ declare function send(tx: PgmqClient, queueName: string, msg: Task, delay?: number | Date): Promise<number>;
30
+ declare function sendBatch(tx: PgmqClient, queueName: string, msgs: Task[], delay?: number | Date): Promise<number[]>;
31
+ declare function read(tx: PgmqClient, queueName: string, vt: number, qty?: number, conditional?: Task): Promise<MessageRecord[]>;
32
+ declare function readWithPoll(tx: PgmqClient, queueName: string, vt: number, qty?: number, maxPollSeconds?: number, pollIntervalMs?: number, conditional?: Task): Promise<MessageRecord[]>;
33
+ declare function pop(tx: PgmqClient, queueName: string): Promise<MessageRecord[]>;
34
+ declare function deleteMessage(tx: PgmqClient, queueName: string, msgId: number): Promise<boolean>;
35
+ declare function deleteBatch(tx: PgmqClient, queueName: string, msgIds: number[]): Promise<number[]>;
36
+ declare function purgeQueue(tx: PgmqClient, queueName: string): Promise<number>;
37
+ declare function archive(tx: PgmqClient, queueName: string, msgId: number): Promise<boolean>;
38
+ declare function archiveBatch(tx: PgmqClient, queueName: string, msgIds: number[]): Promise<number[]>;
39
+ declare function createQueue(tx: PgmqClient, queueName: string): Promise<void>;
40
+ declare function createPartitionedQueue(tx: PgmqClient, queueName: string, partitionInterval?: string, retentionInterval?: string): Promise<void>;
41
+ declare function createUnloggedQueue(tx: PgmqClient, queueName: string): Promise<void>;
42
+ declare function detachArchive(tx: PgmqClient, queueName: string): Promise<void>;
43
+ declare function dropQueue(tx: PgmqClient, queueName: string): Promise<boolean>;
44
+ declare function setVt(tx: PgmqClient, queueName: string, msgId: number, vtOffset: number): Promise<MessageRecord>;
45
+ declare function listQueues(tx: PgmqClient): Promise<QueueInfo[]>;
46
+ declare function metrics(tx: PgmqClient, queueName: string): Promise<QueueMetrics>;
47
+ declare function metricsAll(tx: PgmqClient): Promise<QueueMetrics[]>;
44
48
 
45
49
  type pgmq_MessageRecord = MessageRecord;
50
+ type pgmq_PgmqClient = PgmqClient;
46
51
  type pgmq_QueueInfo = QueueInfo;
47
52
  type pgmq_QueueMetrics = QueueMetrics;
48
53
  type pgmq_Task = Task;
@@ -66,7 +71,7 @@ declare const pgmq_send: typeof send;
66
71
  declare const pgmq_sendBatch: typeof sendBatch;
67
72
  declare const pgmq_setVt: typeof setVt;
68
73
  declare namespace pgmq {
69
- export { type pgmq_MessageRecord as MessageRecord, type pgmq_QueueInfo as QueueInfo, type pgmq_QueueMetrics as QueueMetrics, type pgmq_Task as Task, pgmq_archive as archive, pgmq_archiveBatch as archiveBatch, pgmq_createPartitionedQueue as createPartitionedQueue, pgmq_createQueue as createQueue, pgmq_createUnloggedQueue as createUnloggedQueue, pgmq_deleteBatch as deleteBatch, pgmq_deleteMessage as deleteMessage, pgmq_detachArchive as detachArchive, pgmq_dropQueue as dropQueue, pgmq_listQueues as listQueues, pgmq_metrics as metrics, pgmq_metricsAll as metricsAll, pgmq_pop as pop, pgmq_purgeQueue as purgeQueue, pgmq_read as read, pgmq_readWithPoll as readWithPoll, pgmq_send as send, pgmq_sendBatch as sendBatch, pgmq_setVt as setVt };
74
+ export { type pgmq_MessageRecord as MessageRecord, type pgmq_PgmqClient as PgmqClient, type pgmq_QueueInfo as QueueInfo, type pgmq_QueueMetrics as QueueMetrics, type pgmq_Task as Task, pgmq_archive as archive, pgmq_archiveBatch as archiveBatch, pgmq_createPartitionedQueue as createPartitionedQueue, pgmq_createQueue as createQueue, pgmq_createUnloggedQueue as createUnloggedQueue, pgmq_deleteBatch as deleteBatch, pgmq_deleteMessage as deleteMessage, pgmq_detachArchive as detachArchive, pgmq_dropQueue as dropQueue, pgmq_listQueues as listQueues, pgmq_metrics as metrics, pgmq_metricsAll as metricsAll, pgmq_pop as pop, pgmq_purgeQueue as purgeQueue, pgmq_read as read, pgmq_readWithPoll as readWithPoll, pgmq_send as send, pgmq_sendBatch as sendBatch, pgmq_setVt as setVt };
70
75
  }
71
76
 
72
- export { type MessageRecord, type QueueInfo, type QueueMetrics, type Task, pgmq };
77
+ export { type MessageRecord, type PgmqClient, type QueueInfo, type QueueMetrics, type Task, pgmq };
package/dist/index.d.ts CHANGED
@@ -1,6 +1,10 @@
1
- import { Prisma } from '@prisma/client/extension';
1
+ import { Sql } from '@prisma/client/runtime/client';
2
2
 
3
3
  type Task = Record<string, unknown>;
4
+ interface PgmqClient {
5
+ $queryRaw<T = unknown>(query: TemplateStringsArray | Sql, ...values: any[]): Promise<T>;
6
+ $executeRaw(query: TemplateStringsArray | Sql, ...values: any[]): Promise<number>;
7
+ }
4
8
  interface MessageRecord {
5
9
  msg_id: number;
6
10
  read_ct: number;
@@ -22,27 +26,28 @@ interface QueueInfo {
22
26
  is_partitioned: boolean;
23
27
  is_unlogged: boolean;
24
28
  }
25
- declare function send(tx: Prisma.TransactionClient, queueName: string, msg: Task, delay?: number | Date): Promise<number>;
26
- declare function sendBatch(tx: Prisma.TransactionClient, queueName: string, msgs: Task[], delay?: number | Date): Promise<number[]>;
27
- declare function read(tx: Prisma.TransactionClient, queueName: string, vt: number, qty?: number, conditional?: Task): Promise<MessageRecord[]>;
28
- declare function readWithPoll(tx: Prisma.TransactionClient, queueName: string, vt: number, qty?: number, maxPollSeconds?: number, pollIntervalMs?: number, conditional?: Task): Promise<MessageRecord[]>;
29
- declare function pop(tx: Prisma.TransactionClient, queueName: string): Promise<MessageRecord[]>;
30
- declare function deleteMessage(tx: Prisma.TransactionClient, queueName: string, msgId: number): Promise<boolean>;
31
- declare function deleteBatch(tx: Prisma.TransactionClient, queueName: string, msgIds: number[]): Promise<number[]>;
32
- declare function purgeQueue(tx: Prisma.TransactionClient, queueName: string): Promise<number>;
33
- declare function archive(tx: Prisma.TransactionClient, queueName: string, msgId: number): Promise<boolean>;
34
- declare function archiveBatch(tx: Prisma.TransactionClient, queueName: string, msgIds: number[]): Promise<number[]>;
35
- declare function createQueue(tx: Prisma.TransactionClient, queueName: string): Promise<void>;
36
- declare function createPartitionedQueue(tx: Prisma.TransactionClient, queueName: string, partitionInterval?: string, retentionInterval?: string): Promise<void>;
37
- declare function createUnloggedQueue(tx: Prisma.TransactionClient, queueName: string): Promise<void>;
38
- declare function detachArchive(tx: Prisma.TransactionClient, queueName: string): Promise<void>;
39
- declare function dropQueue(tx: Prisma.TransactionClient, queueName: string): Promise<boolean>;
40
- declare function setVt(tx: Prisma.TransactionClient, queueName: string, msgId: number, vtOffset: number): Promise<MessageRecord>;
41
- declare function listQueues(tx: Prisma.TransactionClient): Promise<QueueInfo[]>;
42
- declare function metrics(tx: Prisma.TransactionClient, queueName: string): Promise<QueueMetrics>;
43
- declare function metricsAll(tx: Prisma.TransactionClient): Promise<QueueMetrics[]>;
29
+ declare function send(tx: PgmqClient, queueName: string, msg: Task, delay?: number | Date): Promise<number>;
30
+ declare function sendBatch(tx: PgmqClient, queueName: string, msgs: Task[], delay?: number | Date): Promise<number[]>;
31
+ declare function read(tx: PgmqClient, queueName: string, vt: number, qty?: number, conditional?: Task): Promise<MessageRecord[]>;
32
+ declare function readWithPoll(tx: PgmqClient, queueName: string, vt: number, qty?: number, maxPollSeconds?: number, pollIntervalMs?: number, conditional?: Task): Promise<MessageRecord[]>;
33
+ declare function pop(tx: PgmqClient, queueName: string): Promise<MessageRecord[]>;
34
+ declare function deleteMessage(tx: PgmqClient, queueName: string, msgId: number): Promise<boolean>;
35
+ declare function deleteBatch(tx: PgmqClient, queueName: string, msgIds: number[]): Promise<number[]>;
36
+ declare function purgeQueue(tx: PgmqClient, queueName: string): Promise<number>;
37
+ declare function archive(tx: PgmqClient, queueName: string, msgId: number): Promise<boolean>;
38
+ declare function archiveBatch(tx: PgmqClient, queueName: string, msgIds: number[]): Promise<number[]>;
39
+ declare function createQueue(tx: PgmqClient, queueName: string): Promise<void>;
40
+ declare function createPartitionedQueue(tx: PgmqClient, queueName: string, partitionInterval?: string, retentionInterval?: string): Promise<void>;
41
+ declare function createUnloggedQueue(tx: PgmqClient, queueName: string): Promise<void>;
42
+ declare function detachArchive(tx: PgmqClient, queueName: string): Promise<void>;
43
+ declare function dropQueue(tx: PgmqClient, queueName: string): Promise<boolean>;
44
+ declare function setVt(tx: PgmqClient, queueName: string, msgId: number, vtOffset: number): Promise<MessageRecord>;
45
+ declare function listQueues(tx: PgmqClient): Promise<QueueInfo[]>;
46
+ declare function metrics(tx: PgmqClient, queueName: string): Promise<QueueMetrics>;
47
+ declare function metricsAll(tx: PgmqClient): Promise<QueueMetrics[]>;
44
48
 
45
49
  type pgmq_MessageRecord = MessageRecord;
50
+ type pgmq_PgmqClient = PgmqClient;
46
51
  type pgmq_QueueInfo = QueueInfo;
47
52
  type pgmq_QueueMetrics = QueueMetrics;
48
53
  type pgmq_Task = Task;
@@ -66,7 +71,7 @@ declare const pgmq_send: typeof send;
66
71
  declare const pgmq_sendBatch: typeof sendBatch;
67
72
  declare const pgmq_setVt: typeof setVt;
68
73
  declare namespace pgmq {
69
- export { type pgmq_MessageRecord as MessageRecord, type pgmq_QueueInfo as QueueInfo, type pgmq_QueueMetrics as QueueMetrics, type pgmq_Task as Task, pgmq_archive as archive, pgmq_archiveBatch as archiveBatch, pgmq_createPartitionedQueue as createPartitionedQueue, pgmq_createQueue as createQueue, pgmq_createUnloggedQueue as createUnloggedQueue, pgmq_deleteBatch as deleteBatch, pgmq_deleteMessage as deleteMessage, pgmq_detachArchive as detachArchive, pgmq_dropQueue as dropQueue, pgmq_listQueues as listQueues, pgmq_metrics as metrics, pgmq_metricsAll as metricsAll, pgmq_pop as pop, pgmq_purgeQueue as purgeQueue, pgmq_read as read, pgmq_readWithPoll as readWithPoll, pgmq_send as send, pgmq_sendBatch as sendBatch, pgmq_setVt as setVt };
74
+ export { type pgmq_MessageRecord as MessageRecord, type pgmq_PgmqClient as PgmqClient, type pgmq_QueueInfo as QueueInfo, type pgmq_QueueMetrics as QueueMetrics, type pgmq_Task as Task, pgmq_archive as archive, pgmq_archiveBatch as archiveBatch, pgmq_createPartitionedQueue as createPartitionedQueue, pgmq_createQueue as createQueue, pgmq_createUnloggedQueue as createUnloggedQueue, pgmq_deleteBatch as deleteBatch, pgmq_deleteMessage as deleteMessage, pgmq_detachArchive as detachArchive, pgmq_dropQueue as dropQueue, pgmq_listQueues as listQueues, pgmq_metrics as metrics, pgmq_metricsAll as metricsAll, pgmq_pop as pop, pgmq_purgeQueue as purgeQueue, pgmq_read as read, pgmq_readWithPoll as readWithPoll, pgmq_send as send, pgmq_sendBatch as sendBatch, pgmq_setVt as setVt };
70
75
  }
71
76
 
72
- export { type MessageRecord, type QueueInfo, type QueueMetrics, type Task, pgmq };
77
+ export { type MessageRecord, type PgmqClient, type QueueInfo, type QueueMetrics, type Task, pgmq };
package/dist/index.js CHANGED
@@ -47,11 +47,10 @@ __export(pgmq_exports, {
47
47
  sendBatch: () => sendBatch,
48
48
  setVt: () => setVt
49
49
  });
50
- var import_extension = require("@prisma/client/extension");
51
- var PrismaAny = import_extension.Prisma;
50
+ var import_client = require("@prisma/client/runtime/client");
52
51
  async function send(tx, queueName, msg, delay) {
53
- const delayRepr = typeof delay === "number" ? PrismaAny.sql`${delay}::integer` : PrismaAny.sql`${delay}`;
54
- const delaySql = delay ? PrismaAny.sql`, ${delayRepr}` : PrismaAny.sql``;
52
+ const delayRepr = typeof delay === "number" ? import_client.sqltag`${delay}::integer` : import_client.sqltag`${delay}`;
53
+ const delaySql = delay ? import_client.sqltag`, ${delayRepr}` : import_client.sqltag``;
55
54
  const result = await tx.$queryRaw`SELECT pgmq.send(${queueName}, ${msg}${delaySql})`;
56
55
  const firstResult = result[0];
57
56
  if (!firstResult) {
@@ -60,8 +59,8 @@ async function send(tx, queueName, msg, delay) {
60
59
  return firstResult.send;
61
60
  }
62
61
  async function sendBatch(tx, queueName, msgs, delay) {
63
- const delayRepr = typeof delay === "number" ? PrismaAny.sql`${delay}::integer` : PrismaAny.sql`${delay}`;
64
- const delaySql = delay ? PrismaAny.sql`, ${delayRepr}` : PrismaAny.sql``;
62
+ const delayRepr = typeof delay === "number" ? import_client.sqltag`${delay}::integer` : import_client.sqltag`${delay}`;
63
+ const delaySql = delay ? import_client.sqltag`, ${delayRepr}` : import_client.sqltag``;
65
64
  const result = await tx.$queryRaw`SELECT pgmq.send_batch(${queueName}, ${msgs}${delaySql})`;
66
65
  return result.map((a) => a.send_batch);
67
66
  }
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/pgmq.ts"],"sourcesContent":["export { \n Task,\n MessageRecord,\n QueueInfo,\n QueueMetrics,\n } from './pgmq';\n \nexport * as pgmq from './pgmq';","import { Prisma } from '@prisma/client/extension';\n\nexport type Task = Record<string, unknown>;\n\n// Message record type based on PGMQ documentation\nexport interface MessageRecord {\n msg_id: number;\n read_ct: number;\n enqueued_at: Date;\n vt: Date;\n message: Task;\n}\n\n// Queue metrics type\nexport interface QueueMetrics {\n queue_name: string;\n queue_length: number;\n newest_msg_age_sec: number | null;\n oldest_msg_age_sec: number | null;\n total_messages: number;\n scrape_time: Date;\n}\n\n// Queue info type\nexport interface QueueInfo {\n queue_name: string;\n created_at: Date;\n is_partitioned: boolean;\n is_unlogged: boolean;\n}\n\n// I expect that Prisma has `sql` defined\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst PrismaAny = Prisma as any;\n\nexport async function send(tx: Prisma.TransactionClient, queueName: string, msg: Task, delay?: number | Date): Promise<number> {\n const delayRepr = typeof delay === 'number' ? PrismaAny.sql`${delay}::integer` : PrismaAny.sql`${delay}`;\n const delaySql = delay ? PrismaAny.sql`, ${delayRepr}` : PrismaAny.sql``;\n const result: { send: number }[] = await tx.$queryRaw`SELECT pgmq.send(${queueName}, ${msg}${delaySql})`;\n const firstResult = result[0];\n if (!firstResult) {\n throw new Error('No result returned from pgmq.send');\n }\n return firstResult.send;\n}\n\nexport async function sendBatch(tx: Prisma.TransactionClient, queueName: string, msgs: Task[], delay?: number | Date): Promise<number[]> {\n const delayRepr = typeof delay === 'number' ? PrismaAny.sql`${delay}::integer` : PrismaAny.sql`${delay}`;\n const delaySql = delay ? PrismaAny.sql`, ${delayRepr}` : PrismaAny.sql``;\n const result: { send_batch: number }[] = await tx.$queryRaw`SELECT pgmq.send_batch(${queueName}, ${msgs}${delaySql})`;\n return result.map(a => a.send_batch);\n}\n\n// Reading Messages\n\nexport function read(\n tx: Prisma.TransactionClient, \n queueName: string, \n vt: number, \n qty: number = 1, \n conditional: Task = {}\n): Promise<MessageRecord[]> {\n return tx.$queryRaw`SELECT * FROM pgmq.read(${queueName}, ${vt}::integer, ${qty}::integer, ${conditional})` as Promise<MessageRecord[]>;\n}\n\nexport function readWithPoll(\n tx: Prisma.TransactionClient,\n queueName: string,\n vt: number,\n qty: number = 1,\n maxPollSeconds: number = 5,\n pollIntervalMs: number = 100,\n conditional: Task = {}\n): Promise<MessageRecord[]> {\n return tx.$queryRaw`SELECT * FROM pgmq.read_with_poll(${queueName}, ${vt}::integer, ${qty}::integer, ${maxPollSeconds}::integer, ${pollIntervalMs}::integer, ${conditional})` as Promise<MessageRecord[]>;\n}\n\nexport function pop(tx: Prisma.TransactionClient, queueName: string): Promise<MessageRecord[]> {\n return tx.$queryRaw`SELECT * FROM pgmq.pop(${queueName})` as Promise<MessageRecord[]>;\n}\n\n// Deleting/Archiving Messages\n\nexport async function deleteMessage(tx: Prisma.TransactionClient, queueName: string, msgId: number): Promise<boolean> {\n const result: { delete: boolean }[] = await tx.$queryRaw`SELECT pgmq.delete(${queueName}, ${msgId}::integer)`;\n const firstResult = result[0];\n if (!firstResult) {\n throw new Error('No result returned from pgmq.delete');\n }\n return firstResult.delete;\n}\n\nexport async function deleteBatch(tx: Prisma.TransactionClient, queueName: string, msgIds: number[]): Promise<number[]> {\n const result: { delete: number }[] = await tx.$queryRaw`SELECT pgmq.delete(${queueName}, ${msgIds}::integer[])`;\n return result.map(a => a.delete);\n}\n\nexport async function purgeQueue(tx: Prisma.TransactionClient, queueName: string): Promise<number> {\n const result: { purge_queue: number }[] = await tx.$queryRaw`SELECT pgmq.purge_queue(${queueName})`;\n const firstResult = result[0];\n if (!firstResult) {\n throw new Error('No result returned from pgmq.purge_queue');\n }\n return firstResult.purge_queue;\n}\n\nexport async function archive(tx: Prisma.TransactionClient, queueName: string, msgId: number): Promise<boolean> {\n const result: { archive: boolean }[] = await tx.$queryRaw`SELECT pgmq.archive(${queueName}, ${msgId}::integer)`;\n const firstResult = result[0];\n if (!firstResult) {\n throw new Error('No result returned from pgmq.archive');\n }\n return firstResult.archive;\n}\n\nexport async function archiveBatch(tx: Prisma.TransactionClient, queueName: string, msgIds: number[]): Promise<number[]> {\n const result: { archive: number }[] = await tx.$queryRaw`SELECT pgmq.archive(${queueName}, ${msgIds}::integer[])`;\n return result.map(a => a.archive);\n}\n\n// Queue Management\n\nexport async function createQueue(tx: Prisma.TransactionClient, queueName: string): Promise<void> {\n await tx.$executeRaw`SELECT pgmq.create(${queueName})`;\n}\n\nexport async function createPartitionedQueue(\n tx: Prisma.TransactionClient, \n queueName: string, \n partitionInterval: string = '10000', \n retentionInterval: string = '100000'\n): Promise<void> {\n await tx.$executeRaw`SELECT pgmq.create_partitioned(${queueName}, ${partitionInterval}, ${retentionInterval})`;\n}\n\nexport async function createUnloggedQueue(tx: Prisma.TransactionClient, queueName: string): Promise<void> {\n await tx.$executeRaw`SELECT pgmq.create_unlogged(${queueName})`;\n}\n\nexport async function detachArchive(tx: Prisma.TransactionClient, queueName: string): Promise<void> {\n await tx.$executeRaw`SELECT pgmq.detach_archive(${queueName})`;\n}\n\nexport async function dropQueue(tx: Prisma.TransactionClient, queueName: string): Promise<boolean> {\n const result: { drop_queue: boolean }[] = await tx.$queryRaw`SELECT pgmq.drop_queue(${queueName})`;\n const firstResult = result[0];\n if (!firstResult) {\n throw new Error('No result returned from pgmq.drop_queue');\n }\n return firstResult.drop_queue;\n}\n\n// Utilities\n\nexport async function setVt(\n tx: Prisma.TransactionClient, \n queueName: string, \n msgId: number, \n vtOffset: number\n): Promise<MessageRecord> {\n const result: MessageRecord[] = await tx.$queryRaw`SELECT * FROM pgmq.set_vt(${queueName}, ${msgId}::integer, ${vtOffset}::integer)`;\n const firstResult = result[0];\n if (!firstResult) {\n throw new Error('No result returned from pgmq.set_vt');\n }\n return firstResult;\n}\n\nexport async function listQueues(tx: Prisma.TransactionClient): Promise<QueueInfo[]> {\n const result: QueueInfo[] = await tx.$queryRaw`SELECT * FROM pgmq.list_queues()`;\n return result;\n}\n\nexport async function metrics(tx: Prisma.TransactionClient, queueName: string): Promise<QueueMetrics> {\n const result: QueueMetrics[] = await tx.$queryRaw`SELECT * FROM pgmq.metrics(${queueName})`;\n const firstResult = result[0];\n if (!firstResult) {\n throw new Error('No result returned from pgmq.metrics');\n }\n return firstResult;\n}\n\nexport async function metricsAll(tx: Prisma.TransactionClient): Promise<QueueMetrics[]> {\n const result: QueueMetrics[] = await tx.$queryRaw`SELECT * FROM pgmq.metrics_all()`;\n return result;\n}"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../src/index.ts","../src/pgmq.ts"],"sourcesContent":["export {\n PgmqClient,\n Task,\n MessageRecord,\n QueueInfo,\n QueueMetrics,\n } from './pgmq';\n \nexport * as pgmq from './pgmq';","import { Sql, sqltag as sql } from '@prisma/client/runtime/client';\n\nexport type Task = Record<string, unknown>;\n\n// Minimal interface for Prisma client or transaction client\nexport interface PgmqClient {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n $queryRaw<T = unknown>(query: TemplateStringsArray | Sql, ...values: any[]): Promise<T>;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n $executeRaw(query: TemplateStringsArray | Sql, ...values: any[]): Promise<number>;\n}\n\n// Message record type based on PGMQ documentation\nexport interface MessageRecord {\n msg_id: number;\n read_ct: number;\n enqueued_at: Date;\n vt: Date;\n message: Task;\n}\n\n// Queue metrics type\nexport interface QueueMetrics {\n queue_name: string;\n queue_length: number;\n newest_msg_age_sec: number | null;\n oldest_msg_age_sec: number | null;\n total_messages: number;\n scrape_time: Date;\n}\n\n// Queue info type\nexport interface QueueInfo {\n queue_name: string;\n created_at: Date;\n is_partitioned: boolean;\n is_unlogged: boolean;\n}\n\nexport async function send(tx: PgmqClient, queueName: string, msg: Task, delay?: number | Date): Promise<number> {\n const delayRepr = typeof delay === 'number' ? sql`${delay}::integer` : sql`${delay}`;\n const delaySql = delay ? sql`, ${delayRepr}` : sql``;\n const result: { send: number }[] = await tx.$queryRaw`SELECT pgmq.send(${queueName}, ${msg}${delaySql})`;\n const firstResult = result[0];\n if (!firstResult) {\n throw new Error('No result returned from pgmq.send');\n }\n return firstResult.send;\n}\n\nexport async function sendBatch(tx: PgmqClient, queueName: string, msgs: Task[], delay?: number | Date): Promise<number[]> {\n const delayRepr = typeof delay === 'number' ? sql`${delay}::integer` : sql`${delay}`;\n const delaySql = delay ? sql`, ${delayRepr}` : sql``;\n const result: { send_batch: number }[] = await tx.$queryRaw`SELECT pgmq.send_batch(${queueName}, ${msgs}${delaySql})`;\n return result.map(a => a.send_batch);\n}\n\n// Reading Messages\n\nexport function read(\n tx: PgmqClient,\n queueName: string,\n vt: number,\n qty: number = 1,\n conditional: Task = {}\n): Promise<MessageRecord[]> {\n return tx.$queryRaw`SELECT * FROM pgmq.read(${queueName}, ${vt}::integer, ${qty}::integer, ${conditional})` as Promise<MessageRecord[]>;\n}\n\nexport function readWithPoll(\n tx: PgmqClient,\n queueName: string,\n vt: number,\n qty: number = 1,\n maxPollSeconds: number = 5,\n pollIntervalMs: number = 100,\n conditional: Task = {}\n): Promise<MessageRecord[]> {\n return tx.$queryRaw`SELECT * FROM pgmq.read_with_poll(${queueName}, ${vt}::integer, ${qty}::integer, ${maxPollSeconds}::integer, ${pollIntervalMs}::integer, ${conditional})` as Promise<MessageRecord[]>;\n}\n\nexport function pop(tx: PgmqClient, queueName: string): Promise<MessageRecord[]> {\n return tx.$queryRaw`SELECT * FROM pgmq.pop(${queueName})` as Promise<MessageRecord[]>;\n}\n\n// Deleting/Archiving Messages\n\nexport async function deleteMessage(tx: PgmqClient, queueName: string, msgId: number): Promise<boolean> {\n const result: { delete: boolean }[] = await tx.$queryRaw`SELECT pgmq.delete(${queueName}, ${msgId}::integer)`;\n const firstResult = result[0];\n if (!firstResult) {\n throw new Error('No result returned from pgmq.delete');\n }\n return firstResult.delete;\n}\n\nexport async function deleteBatch(tx: PgmqClient, queueName: string, msgIds: number[]): Promise<number[]> {\n const result: { delete: number }[] = await tx.$queryRaw`SELECT pgmq.delete(${queueName}, ${msgIds}::integer[])`;\n return result.map(a => a.delete);\n}\n\nexport async function purgeQueue(tx: PgmqClient, queueName: string): Promise<number> {\n const result: { purge_queue: number }[] = await tx.$queryRaw`SELECT pgmq.purge_queue(${queueName})`;\n const firstResult = result[0];\n if (!firstResult) {\n throw new Error('No result returned from pgmq.purge_queue');\n }\n return firstResult.purge_queue;\n}\n\nexport async function archive(tx: PgmqClient, queueName: string, msgId: number): Promise<boolean> {\n const result: { archive: boolean }[] = await tx.$queryRaw`SELECT pgmq.archive(${queueName}, ${msgId}::integer)`;\n const firstResult = result[0];\n if (!firstResult) {\n throw new Error('No result returned from pgmq.archive');\n }\n return firstResult.archive;\n}\n\nexport async function archiveBatch(tx: PgmqClient, queueName: string, msgIds: number[]): Promise<number[]> {\n const result: { archive: number }[] = await tx.$queryRaw`SELECT pgmq.archive(${queueName}, ${msgIds}::integer[])`;\n return result.map(a => a.archive);\n}\n\n// Queue Management\n\nexport async function createQueue(tx: PgmqClient, queueName: string): Promise<void> {\n await tx.$executeRaw`SELECT pgmq.create(${queueName})`;\n}\n\nexport async function createPartitionedQueue(\n tx: PgmqClient,\n queueName: string,\n partitionInterval: string = '10000',\n retentionInterval: string = '100000'\n): Promise<void> {\n await tx.$executeRaw`SELECT pgmq.create_partitioned(${queueName}, ${partitionInterval}, ${retentionInterval})`;\n}\n\nexport async function createUnloggedQueue(tx: PgmqClient, queueName: string): Promise<void> {\n await tx.$executeRaw`SELECT pgmq.create_unlogged(${queueName})`;\n}\n\nexport async function detachArchive(tx: PgmqClient, queueName: string): Promise<void> {\n await tx.$executeRaw`SELECT pgmq.detach_archive(${queueName})`;\n}\n\nexport async function dropQueue(tx: PgmqClient, queueName: string): Promise<boolean> {\n const result: { drop_queue: boolean }[] = await tx.$queryRaw`SELECT pgmq.drop_queue(${queueName})`;\n const firstResult = result[0];\n if (!firstResult) {\n throw new Error('No result returned from pgmq.drop_queue');\n }\n return firstResult.drop_queue;\n}\n\n// Utilities\n\nexport async function setVt(\n tx: PgmqClient,\n queueName: string,\n msgId: number,\n vtOffset: number\n): Promise<MessageRecord> {\n const result: MessageRecord[] = await tx.$queryRaw`SELECT * FROM pgmq.set_vt(${queueName}, ${msgId}::integer, ${vtOffset}::integer)`;\n const firstResult = result[0];\n if (!firstResult) {\n throw new Error('No result returned from pgmq.set_vt');\n }\n return firstResult;\n}\n\nexport async function listQueues(tx: PgmqClient): Promise<QueueInfo[]> {\n const result: QueueInfo[] = await tx.$queryRaw`SELECT * FROM pgmq.list_queues()`;\n return result;\n}\n\nexport async function metrics(tx: PgmqClient, queueName: string): Promise<QueueMetrics> {\n const result: QueueMetrics[] = await tx.$queryRaw`SELECT * FROM pgmq.metrics(${queueName})`;\n const firstResult = result[0];\n if (!firstResult) {\n throw new Error('No result returned from pgmq.metrics');\n }\n return firstResult;\n}\n\nexport async function metricsAll(tx: PgmqClient): Promise<QueueMetrics[]> {\n const result: QueueMetrics[] = await tx.$queryRaw`SELECT * FROM pgmq.metrics_all()`;\n return result;\n}\n"],"mappings":"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","names":["sql"]}
package/dist/index.mjs CHANGED
@@ -27,11 +27,10 @@ __export(pgmq_exports, {
27
27
  sendBatch: () => sendBatch,
28
28
  setVt: () => setVt
29
29
  });
30
- import { Prisma } from "@prisma/client/extension";
31
- var PrismaAny = Prisma;
30
+ import { sqltag as sql } from "@prisma/client/runtime/client";
32
31
  async function send(tx, queueName, msg, delay) {
33
- const delayRepr = typeof delay === "number" ? PrismaAny.sql`${delay}::integer` : PrismaAny.sql`${delay}`;
34
- const delaySql = delay ? PrismaAny.sql`, ${delayRepr}` : PrismaAny.sql``;
32
+ const delayRepr = typeof delay === "number" ? sql`${delay}::integer` : sql`${delay}`;
33
+ const delaySql = delay ? sql`, ${delayRepr}` : sql``;
35
34
  const result = await tx.$queryRaw`SELECT pgmq.send(${queueName}, ${msg}${delaySql})`;
36
35
  const firstResult = result[0];
37
36
  if (!firstResult) {
@@ -40,8 +39,8 @@ async function send(tx, queueName, msg, delay) {
40
39
  return firstResult.send;
41
40
  }
42
41
  async function sendBatch(tx, queueName, msgs, delay) {
43
- const delayRepr = typeof delay === "number" ? PrismaAny.sql`${delay}::integer` : PrismaAny.sql`${delay}`;
44
- const delaySql = delay ? PrismaAny.sql`, ${delayRepr}` : PrismaAny.sql``;
42
+ const delayRepr = typeof delay === "number" ? sql`${delay}::integer` : sql`${delay}`;
43
+ const delaySql = delay ? sql`, ${delayRepr}` : sql``;
45
44
  const result = await tx.$queryRaw`SELECT pgmq.send_batch(${queueName}, ${msgs}${delaySql})`;
46
45
  return result.map((a) => a.send_batch);
47
46
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/pgmq.ts"],"sourcesContent":["import { Prisma } from '@prisma/client/extension';\n\nexport type Task = Record<string, unknown>;\n\n// Message record type based on PGMQ documentation\nexport interface MessageRecord {\n msg_id: number;\n read_ct: number;\n enqueued_at: Date;\n vt: Date;\n message: Task;\n}\n\n// Queue metrics type\nexport interface QueueMetrics {\n queue_name: string;\n queue_length: number;\n newest_msg_age_sec: number | null;\n oldest_msg_age_sec: number | null;\n total_messages: number;\n scrape_time: Date;\n}\n\n// Queue info type\nexport interface QueueInfo {\n queue_name: string;\n created_at: Date;\n is_partitioned: boolean;\n is_unlogged: boolean;\n}\n\n// I expect that Prisma has `sql` defined\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst PrismaAny = Prisma as any;\n\nexport async function send(tx: Prisma.TransactionClient, queueName: string, msg: Task, delay?: number | Date): Promise<number> {\n const delayRepr = typeof delay === 'number' ? PrismaAny.sql`${delay}::integer` : PrismaAny.sql`${delay}`;\n const delaySql = delay ? PrismaAny.sql`, ${delayRepr}` : PrismaAny.sql``;\n const result: { send: number }[] = await tx.$queryRaw`SELECT pgmq.send(${queueName}, ${msg}${delaySql})`;\n const firstResult = result[0];\n if (!firstResult) {\n throw new Error('No result returned from pgmq.send');\n }\n return firstResult.send;\n}\n\nexport async function sendBatch(tx: Prisma.TransactionClient, queueName: string, msgs: Task[], delay?: number | Date): Promise<number[]> {\n const delayRepr = typeof delay === 'number' ? PrismaAny.sql`${delay}::integer` : PrismaAny.sql`${delay}`;\n const delaySql = delay ? PrismaAny.sql`, ${delayRepr}` : PrismaAny.sql``;\n const result: { send_batch: number }[] = await tx.$queryRaw`SELECT pgmq.send_batch(${queueName}, ${msgs}${delaySql})`;\n return result.map(a => a.send_batch);\n}\n\n// Reading Messages\n\nexport function read(\n tx: Prisma.TransactionClient, \n queueName: string, \n vt: number, \n qty: number = 1, \n conditional: Task = {}\n): Promise<MessageRecord[]> {\n return tx.$queryRaw`SELECT * FROM pgmq.read(${queueName}, ${vt}::integer, ${qty}::integer, ${conditional})` as Promise<MessageRecord[]>;\n}\n\nexport function readWithPoll(\n tx: Prisma.TransactionClient,\n queueName: string,\n vt: number,\n qty: number = 1,\n maxPollSeconds: number = 5,\n pollIntervalMs: number = 100,\n conditional: Task = {}\n): Promise<MessageRecord[]> {\n return tx.$queryRaw`SELECT * FROM pgmq.read_with_poll(${queueName}, ${vt}::integer, ${qty}::integer, ${maxPollSeconds}::integer, ${pollIntervalMs}::integer, ${conditional})` as Promise<MessageRecord[]>;\n}\n\nexport function pop(tx: Prisma.TransactionClient, queueName: string): Promise<MessageRecord[]> {\n return tx.$queryRaw`SELECT * FROM pgmq.pop(${queueName})` as Promise<MessageRecord[]>;\n}\n\n// Deleting/Archiving Messages\n\nexport async function deleteMessage(tx: Prisma.TransactionClient, queueName: string, msgId: number): Promise<boolean> {\n const result: { delete: boolean }[] = await tx.$queryRaw`SELECT pgmq.delete(${queueName}, ${msgId}::integer)`;\n const firstResult = result[0];\n if (!firstResult) {\n throw new Error('No result returned from pgmq.delete');\n }\n return firstResult.delete;\n}\n\nexport async function deleteBatch(tx: Prisma.TransactionClient, queueName: string, msgIds: number[]): Promise<number[]> {\n const result: { delete: number }[] = await tx.$queryRaw`SELECT pgmq.delete(${queueName}, ${msgIds}::integer[])`;\n return result.map(a => a.delete);\n}\n\nexport async function purgeQueue(tx: Prisma.TransactionClient, queueName: string): Promise<number> {\n const result: { purge_queue: number }[] = await tx.$queryRaw`SELECT pgmq.purge_queue(${queueName})`;\n const firstResult = result[0];\n if (!firstResult) {\n throw new Error('No result returned from pgmq.purge_queue');\n }\n return firstResult.purge_queue;\n}\n\nexport async function archive(tx: Prisma.TransactionClient, queueName: string, msgId: number): Promise<boolean> {\n const result: { archive: boolean }[] = await tx.$queryRaw`SELECT pgmq.archive(${queueName}, ${msgId}::integer)`;\n const firstResult = result[0];\n if (!firstResult) {\n throw new Error('No result returned from pgmq.archive');\n }\n return firstResult.archive;\n}\n\nexport async function archiveBatch(tx: Prisma.TransactionClient, queueName: string, msgIds: number[]): Promise<number[]> {\n const result: { archive: number }[] = await tx.$queryRaw`SELECT pgmq.archive(${queueName}, ${msgIds}::integer[])`;\n return result.map(a => a.archive);\n}\n\n// Queue Management\n\nexport async function createQueue(tx: Prisma.TransactionClient, queueName: string): Promise<void> {\n await tx.$executeRaw`SELECT pgmq.create(${queueName})`;\n}\n\nexport async function createPartitionedQueue(\n tx: Prisma.TransactionClient, \n queueName: string, \n partitionInterval: string = '10000', \n retentionInterval: string = '100000'\n): Promise<void> {\n await tx.$executeRaw`SELECT pgmq.create_partitioned(${queueName}, ${partitionInterval}, ${retentionInterval})`;\n}\n\nexport async function createUnloggedQueue(tx: Prisma.TransactionClient, queueName: string): Promise<void> {\n await tx.$executeRaw`SELECT pgmq.create_unlogged(${queueName})`;\n}\n\nexport async function detachArchive(tx: Prisma.TransactionClient, queueName: string): Promise<void> {\n await tx.$executeRaw`SELECT pgmq.detach_archive(${queueName})`;\n}\n\nexport async function dropQueue(tx: Prisma.TransactionClient, queueName: string): Promise<boolean> {\n const result: { drop_queue: boolean }[] = await tx.$queryRaw`SELECT pgmq.drop_queue(${queueName})`;\n const firstResult = result[0];\n if (!firstResult) {\n throw new Error('No result returned from pgmq.drop_queue');\n }\n return firstResult.drop_queue;\n}\n\n// Utilities\n\nexport async function setVt(\n tx: Prisma.TransactionClient, \n queueName: string, \n msgId: number, \n vtOffset: number\n): Promise<MessageRecord> {\n const result: MessageRecord[] = await tx.$queryRaw`SELECT * FROM pgmq.set_vt(${queueName}, ${msgId}::integer, ${vtOffset}::integer)`;\n const firstResult = result[0];\n if (!firstResult) {\n throw new Error('No result returned from pgmq.set_vt');\n }\n return firstResult;\n}\n\nexport async function listQueues(tx: Prisma.TransactionClient): Promise<QueueInfo[]> {\n const result: QueueInfo[] = await tx.$queryRaw`SELECT * FROM pgmq.list_queues()`;\n return result;\n}\n\nexport async function metrics(tx: Prisma.TransactionClient, queueName: string): Promise<QueueMetrics> {\n const result: QueueMetrics[] = await tx.$queryRaw`SELECT * FROM pgmq.metrics(${queueName})`;\n const firstResult = result[0];\n if (!firstResult) {\n throw new Error('No result returned from pgmq.metrics');\n }\n return firstResult;\n}\n\nexport async function metricsAll(tx: Prisma.TransactionClient): Promise<QueueMetrics[]> {\n const result: QueueMetrics[] = await tx.$queryRaw`SELECT * FROM pgmq.metrics_all()`;\n return result;\n}"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../src/pgmq.ts"],"sourcesContent":["import { Sql, sqltag as sql } from '@prisma/client/runtime/client';\n\nexport type Task = Record<string, unknown>;\n\n// Minimal interface for Prisma client or transaction client\nexport interface PgmqClient {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n $queryRaw<T = unknown>(query: TemplateStringsArray | Sql, ...values: any[]): Promise<T>;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n $executeRaw(query: TemplateStringsArray | Sql, ...values: any[]): Promise<number>;\n}\n\n// Message record type based on PGMQ documentation\nexport interface MessageRecord {\n msg_id: number;\n read_ct: number;\n enqueued_at: Date;\n vt: Date;\n message: Task;\n}\n\n// Queue metrics type\nexport interface QueueMetrics {\n queue_name: string;\n queue_length: number;\n newest_msg_age_sec: number | null;\n oldest_msg_age_sec: number | null;\n total_messages: number;\n scrape_time: Date;\n}\n\n// Queue info type\nexport interface QueueInfo {\n queue_name: string;\n created_at: Date;\n is_partitioned: boolean;\n is_unlogged: boolean;\n}\n\nexport async function send(tx: PgmqClient, queueName: string, msg: Task, delay?: number | Date): Promise<number> {\n const delayRepr = typeof delay === 'number' ? sql`${delay}::integer` : sql`${delay}`;\n const delaySql = delay ? sql`, ${delayRepr}` : sql``;\n const result: { send: number }[] = await tx.$queryRaw`SELECT pgmq.send(${queueName}, ${msg}${delaySql})`;\n const firstResult = result[0];\n if (!firstResult) {\n throw new Error('No result returned from pgmq.send');\n }\n return firstResult.send;\n}\n\nexport async function sendBatch(tx: PgmqClient, queueName: string, msgs: Task[], delay?: number | Date): Promise<number[]> {\n const delayRepr = typeof delay === 'number' ? sql`${delay}::integer` : sql`${delay}`;\n const delaySql = delay ? sql`, ${delayRepr}` : sql``;\n const result: { send_batch: number }[] = await tx.$queryRaw`SELECT pgmq.send_batch(${queueName}, ${msgs}${delaySql})`;\n return result.map(a => a.send_batch);\n}\n\n// Reading Messages\n\nexport function read(\n tx: PgmqClient,\n queueName: string,\n vt: number,\n qty: number = 1,\n conditional: Task = {}\n): Promise<MessageRecord[]> {\n return tx.$queryRaw`SELECT * FROM pgmq.read(${queueName}, ${vt}::integer, ${qty}::integer, ${conditional})` as Promise<MessageRecord[]>;\n}\n\nexport function readWithPoll(\n tx: PgmqClient,\n queueName: string,\n vt: number,\n qty: number = 1,\n maxPollSeconds: number = 5,\n pollIntervalMs: number = 100,\n conditional: Task = {}\n): Promise<MessageRecord[]> {\n return tx.$queryRaw`SELECT * FROM pgmq.read_with_poll(${queueName}, ${vt}::integer, ${qty}::integer, ${maxPollSeconds}::integer, ${pollIntervalMs}::integer, ${conditional})` as Promise<MessageRecord[]>;\n}\n\nexport function pop(tx: PgmqClient, queueName: string): Promise<MessageRecord[]> {\n return tx.$queryRaw`SELECT * FROM pgmq.pop(${queueName})` as Promise<MessageRecord[]>;\n}\n\n// Deleting/Archiving Messages\n\nexport async function deleteMessage(tx: PgmqClient, queueName: string, msgId: number): Promise<boolean> {\n const result: { delete: boolean }[] = await tx.$queryRaw`SELECT pgmq.delete(${queueName}, ${msgId}::integer)`;\n const firstResult = result[0];\n if (!firstResult) {\n throw new Error('No result returned from pgmq.delete');\n }\n return firstResult.delete;\n}\n\nexport async function deleteBatch(tx: PgmqClient, queueName: string, msgIds: number[]): Promise<number[]> {\n const result: { delete: number }[] = await tx.$queryRaw`SELECT pgmq.delete(${queueName}, ${msgIds}::integer[])`;\n return result.map(a => a.delete);\n}\n\nexport async function purgeQueue(tx: PgmqClient, queueName: string): Promise<number> {\n const result: { purge_queue: number }[] = await tx.$queryRaw`SELECT pgmq.purge_queue(${queueName})`;\n const firstResult = result[0];\n if (!firstResult) {\n throw new Error('No result returned from pgmq.purge_queue');\n }\n return firstResult.purge_queue;\n}\n\nexport async function archive(tx: PgmqClient, queueName: string, msgId: number): Promise<boolean> {\n const result: { archive: boolean }[] = await tx.$queryRaw`SELECT pgmq.archive(${queueName}, ${msgId}::integer)`;\n const firstResult = result[0];\n if (!firstResult) {\n throw new Error('No result returned from pgmq.archive');\n }\n return firstResult.archive;\n}\n\nexport async function archiveBatch(tx: PgmqClient, queueName: string, msgIds: number[]): Promise<number[]> {\n const result: { archive: number }[] = await tx.$queryRaw`SELECT pgmq.archive(${queueName}, ${msgIds}::integer[])`;\n return result.map(a => a.archive);\n}\n\n// Queue Management\n\nexport async function createQueue(tx: PgmqClient, queueName: string): Promise<void> {\n await tx.$executeRaw`SELECT pgmq.create(${queueName})`;\n}\n\nexport async function createPartitionedQueue(\n tx: PgmqClient,\n queueName: string,\n partitionInterval: string = '10000',\n retentionInterval: string = '100000'\n): Promise<void> {\n await tx.$executeRaw`SELECT pgmq.create_partitioned(${queueName}, ${partitionInterval}, ${retentionInterval})`;\n}\n\nexport async function createUnloggedQueue(tx: PgmqClient, queueName: string): Promise<void> {\n await tx.$executeRaw`SELECT pgmq.create_unlogged(${queueName})`;\n}\n\nexport async function detachArchive(tx: PgmqClient, queueName: string): Promise<void> {\n await tx.$executeRaw`SELECT pgmq.detach_archive(${queueName})`;\n}\n\nexport async function dropQueue(tx: PgmqClient, queueName: string): Promise<boolean> {\n const result: { drop_queue: boolean }[] = await tx.$queryRaw`SELECT pgmq.drop_queue(${queueName})`;\n const firstResult = result[0];\n if (!firstResult) {\n throw new Error('No result returned from pgmq.drop_queue');\n }\n return firstResult.drop_queue;\n}\n\n// Utilities\n\nexport async function setVt(\n tx: PgmqClient,\n queueName: string,\n msgId: number,\n vtOffset: number\n): Promise<MessageRecord> {\n const result: MessageRecord[] = await tx.$queryRaw`SELECT * FROM pgmq.set_vt(${queueName}, ${msgId}::integer, ${vtOffset}::integer)`;\n const firstResult = result[0];\n if (!firstResult) {\n throw new Error('No result returned from pgmq.set_vt');\n }\n return firstResult;\n}\n\nexport async function listQueues(tx: PgmqClient): Promise<QueueInfo[]> {\n const result: QueueInfo[] = await tx.$queryRaw`SELECT * FROM pgmq.list_queues()`;\n return result;\n}\n\nexport async function metrics(tx: PgmqClient, queueName: string): Promise<QueueMetrics> {\n const result: QueueMetrics[] = await tx.$queryRaw`SELECT * FROM pgmq.metrics(${queueName})`;\n const firstResult = result[0];\n if (!firstResult) {\n throw new Error('No result returned from pgmq.metrics');\n }\n return firstResult;\n}\n\nexport async function metricsAll(tx: PgmqClient): Promise<QueueMetrics[]> {\n const result: QueueMetrics[] = await tx.$queryRaw`SELECT * FROM pgmq.metrics_all()`;\n return result;\n}\n"],"mappings":"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","names":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "prisma-pgmq",
3
- "version": "1.0.0",
3
+ "version": "2.0.0",
4
4
  "description": "A Prisma PGMQ implementation providing type-safe message queue operations",
5
5
  "main": "dist/index.js",
6
6
  "module": "dist/index.mjs",
@@ -31,23 +31,23 @@
31
31
  },
32
32
  "homepage": "https://github.com/dvlkv/prisma-pgmq#readme",
33
33
  "peerDependencies": {
34
- "@prisma/client": ">=5.0.0"
34
+ "@prisma/client": ">=7.0.0"
35
35
  },
36
36
  "devDependencies": {
37
- "@eslint/js": "^9.29.0",
38
- "@prisma/client": "^5.0.0",
39
- "@types/node": "^24.0.4",
40
- "@typescript-eslint/eslint-plugin": "^8.35.0",
41
- "@typescript-eslint/parser": "^8.35.0",
42
- "eslint": "^9.29.0",
43
- "prisma": "^5.0.0",
44
- "rimraf": "^6.0.1",
45
- "tsup": "^8.5.0",
46
- "typescript": "^5.8.3",
47
- "typescript-eslint": "^8.35.0"
37
+ "@eslint/js": "^10.0.1",
38
+ "@prisma/client": "^7.6.0",
39
+ "@types/node": "^25.5.0",
40
+ "@typescript-eslint/eslint-plugin": "^8.58.0",
41
+ "@typescript-eslint/parser": "^8.58.0",
42
+ "eslint": "^10.1.0",
43
+ "prisma": "^7.6.0",
44
+ "rimraf": "^6.1.3",
45
+ "tsup": "^8.5.1",
46
+ "typescript": "^6.0.2",
47
+ "typescript-eslint": "^8.58.0"
48
48
  },
49
49
  "engines": {
50
- "node": ">=16.0.0"
50
+ "node": ">=20.19.0"
51
51
  },
52
52
  "scripts": {
53
53
  "build": "tsup",