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 +19 -40
- package/dist/index.d.mts +27 -22
- package/dist/index.d.ts +27 -22
- package/dist/index.js +5 -6
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +5 -6
- package/dist/index.mjs.map +1 -1
- package/package.json +14 -14
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
|
|
25
|
-
- Node.js
|
|
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
|
|
34
|
-
>
|
|
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 '
|
|
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
|
-
|
|
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 '
|
|
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 {
|
|
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:
|
|
26
|
-
declare function sendBatch(tx:
|
|
27
|
-
declare function read(tx:
|
|
28
|
-
declare function readWithPoll(tx:
|
|
29
|
-
declare function pop(tx:
|
|
30
|
-
declare function deleteMessage(tx:
|
|
31
|
-
declare function deleteBatch(tx:
|
|
32
|
-
declare function purgeQueue(tx:
|
|
33
|
-
declare function archive(tx:
|
|
34
|
-
declare function archiveBatch(tx:
|
|
35
|
-
declare function createQueue(tx:
|
|
36
|
-
declare function createPartitionedQueue(tx:
|
|
37
|
-
declare function createUnloggedQueue(tx:
|
|
38
|
-
declare function detachArchive(tx:
|
|
39
|
-
declare function dropQueue(tx:
|
|
40
|
-
declare function setVt(tx:
|
|
41
|
-
declare function listQueues(tx:
|
|
42
|
-
declare function metrics(tx:
|
|
43
|
-
declare function metricsAll(tx:
|
|
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 {
|
|
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:
|
|
26
|
-
declare function sendBatch(tx:
|
|
27
|
-
declare function read(tx:
|
|
28
|
-
declare function readWithPoll(tx:
|
|
29
|
-
declare function pop(tx:
|
|
30
|
-
declare function deleteMessage(tx:
|
|
31
|
-
declare function deleteBatch(tx:
|
|
32
|
-
declare function purgeQueue(tx:
|
|
33
|
-
declare function archive(tx:
|
|
34
|
-
declare function archiveBatch(tx:
|
|
35
|
-
declare function createQueue(tx:
|
|
36
|
-
declare function createPartitionedQueue(tx:
|
|
37
|
-
declare function createUnloggedQueue(tx:
|
|
38
|
-
declare function detachArchive(tx:
|
|
39
|
-
declare function dropQueue(tx:
|
|
40
|
-
declare function setVt(tx:
|
|
41
|
-
declare function listQueues(tx:
|
|
42
|
-
declare function metrics(tx:
|
|
43
|
-
declare function metricsAll(tx:
|
|
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
|
|
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" ?
|
|
54
|
-
const delaySql = delay ?
|
|
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" ?
|
|
64
|
-
const delaySql = delay ?
|
|
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 {
|
|
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" ?
|
|
34
|
-
const delaySql = delay ?
|
|
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" ?
|
|
44
|
-
const delaySql = delay ?
|
|
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
|
}
|
package/dist/index.mjs.map
CHANGED
|
@@ -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": "
|
|
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": ">=
|
|
34
|
+
"@prisma/client": ">=7.0.0"
|
|
35
35
|
},
|
|
36
36
|
"devDependencies": {
|
|
37
|
-
"@eslint/js": "^
|
|
38
|
-
"@prisma/client": "^
|
|
39
|
-
"@types/node": "^
|
|
40
|
-
"@typescript-eslint/eslint-plugin": "^8.
|
|
41
|
-
"@typescript-eslint/parser": "^8.
|
|
42
|
-
"eslint": "^
|
|
43
|
-
"prisma": "^
|
|
44
|
-
"rimraf": "^6.
|
|
45
|
-
"tsup": "^8.5.
|
|
46
|
-
"typescript": "^
|
|
47
|
-
"typescript-eslint": "^8.
|
|
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": ">=
|
|
50
|
+
"node": ">=20.19.0"
|
|
51
51
|
},
|
|
52
52
|
"scripts": {
|
|
53
53
|
"build": "tsup",
|