prisma-pgmq 1.0.0 → 1.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +6 -33
- package/dist/index.d.mts +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +2 -2
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +1 -1
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -78,7 +78,12 @@ const msgId = await pgmq.send(tx, 'my-queue', { data: 'hello' });
|
|
|
78
78
|
const msgId = await pgmq.send(tx, 'my-queue', { data: 'hello' }, 30);
|
|
79
79
|
|
|
80
80
|
// Send with specific time
|
|
81
|
-
|
|
81
|
+
const msgId = await pgmq.send(
|
|
82
|
+
tx,
|
|
83
|
+
'my-queue',
|
|
84
|
+
{ data: 'hello' },
|
|
85
|
+
new Date('2024-01-01T10:00:00Z')
|
|
86
|
+
);
|
|
82
87
|
```
|
|
83
88
|
|
|
84
89
|
#### `sendBatch(tx, queueName, messages, delay?)`
|
|
@@ -265,38 +270,6 @@ interface QueueInfo {
|
|
|
265
270
|
}
|
|
266
271
|
```
|
|
267
272
|
|
|
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
273
|
## Examples
|
|
301
274
|
|
|
302
275
|
### Basic Worker Pattern
|
package/dist/index.d.mts
CHANGED
package/dist/index.d.ts
CHANGED
package/dist/index.js
CHANGED
|
@@ -47,8 +47,8 @@ __export(pgmq_exports, {
|
|
|
47
47
|
sendBatch: () => sendBatch,
|
|
48
48
|
setVt: () => setVt
|
|
49
49
|
});
|
|
50
|
-
var
|
|
51
|
-
var PrismaAny =
|
|
50
|
+
var import_client = require("@prisma/client");
|
|
51
|
+
var PrismaAny = import_client.Prisma;
|
|
52
52
|
async function send(tx, queueName, msg, delay) {
|
|
53
53
|
const delayRepr = typeof delay === "number" ? PrismaAny.sql`${delay}::integer` : PrismaAny.sql`${delay}`;
|
|
54
54
|
const delaySql = delay ? PrismaAny.sql`, ${delayRepr}` : PrismaAny.sql``;
|
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 Task,\n MessageRecord,\n QueueInfo,\n QueueMetrics,\n } from './pgmq';\n \nexport * as pgmq from './pgmq';","import { Prisma } from '@prisma/client';\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":[]}
|
package/dist/index.mjs
CHANGED
|
@@ -27,7 +27,7 @@ __export(pgmq_exports, {
|
|
|
27
27
|
sendBatch: () => sendBatch,
|
|
28
28
|
setVt: () => setVt
|
|
29
29
|
});
|
|
30
|
-
import { Prisma } from "@prisma/client
|
|
30
|
+
import { Prisma } from "@prisma/client";
|
|
31
31
|
var PrismaAny = Prisma;
|
|
32
32
|
async function send(tx, queueName, msg, delay) {
|
|
33
33
|
const delayRepr = typeof delay === "number" ? PrismaAny.sql`${delay}::integer` : PrismaAny.sql`${delay}`;
|
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 { Prisma } from '@prisma/client';\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":[]}
|