@haathie/pgmb 0.2.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/LICENSE +21 -0
- package/lib/abortable-async-iterator.d.ts +14 -0
- package/lib/abortable-async-iterator.js +86 -0
- package/lib/batcher.d.ts +12 -0
- package/lib/batcher.js +71 -0
- package/lib/client.d.ts +73 -0
- package/lib/client.js +432 -0
- package/lib/consts.d.ts +1 -0
- package/lib/consts.js +4 -0
- package/lib/index.d.ts +5 -0
- package/lib/index.js +19 -0
- package/lib/queries.d.ts +453 -0
- package/lib/queries.js +235 -0
- package/lib/query-types.d.ts +17 -0
- package/lib/query-types.js +2 -0
- package/lib/retry-handler.d.ts +11 -0
- package/lib/retry-handler.js +93 -0
- package/lib/sse.d.ts +4 -0
- package/lib/sse.js +137 -0
- package/lib/types.d.ts +202 -0
- package/lib/types.js +2 -0
- package/lib/utils.d.ts +15 -0
- package/lib/utils.js +52 -0
- package/lib/webhook-handler.d.ts +6 -0
- package/lib/webhook-handler.js +68 -0
- package/package.json +52 -0
- package/readme.md +493 -0
- package/sql/pgmb-0.1.12-0.2.0.sql +1018 -0
- package/sql/pgmb-0.1.12.sql +612 -0
- package/sql/pgmb-0.1.5-0.1.6.sql +256 -0
- package/sql/pgmb-0.1.6-0.1.12.sql +95 -0
- package/sql/pgmb.sql +1030 -0
- package/sql/queries.sql +154 -0
package/sql/queries.sql
ADDED
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
/* @name assertGroup */
|
|
2
|
+
INSERT INTO pgmb.subscription_groups (id)
|
|
3
|
+
VALUES (:id!)
|
|
4
|
+
ON CONFLICT DO NOTHING;
|
|
5
|
+
|
|
6
|
+
/* @name assertSubscription */
|
|
7
|
+
INSERT INTO pgmb.subscriptions
|
|
8
|
+
AS s(group_id, conditions_sql, params, expiry_interval)
|
|
9
|
+
VALUES (
|
|
10
|
+
:groupId!,
|
|
11
|
+
COALESCE(:conditionsSql, 'TRUE'),
|
|
12
|
+
COALESCE(:params::jsonb, '{}'),
|
|
13
|
+
:expiryInterval::interval
|
|
14
|
+
)
|
|
15
|
+
ON CONFLICT (identity) DO UPDATE
|
|
16
|
+
SET
|
|
17
|
+
-- set expiry_interval to the new value only if it's greater than the existing one
|
|
18
|
+
-- or if the new value is NULL (indicating no expiration)
|
|
19
|
+
expiry_interval = CASE
|
|
20
|
+
WHEN EXCLUDED.expiry_interval IS NULL OR s.expiry_interval IS NULL
|
|
21
|
+
THEN NULL
|
|
22
|
+
ELSE
|
|
23
|
+
GREATEST(s.expiry_interval, EXCLUDED.expiry_interval)
|
|
24
|
+
END,
|
|
25
|
+
last_active_at = NOW()
|
|
26
|
+
RETURNING id AS "id!";
|
|
27
|
+
|
|
28
|
+
/*
|
|
29
|
+
@name deleteSubscriptions
|
|
30
|
+
@param ids -> (...)
|
|
31
|
+
*/
|
|
32
|
+
DELETE FROM pgmb.subscriptions
|
|
33
|
+
WHERE id IN :ids!;
|
|
34
|
+
|
|
35
|
+
/*
|
|
36
|
+
@name markSubscriptionsActive
|
|
37
|
+
*/
|
|
38
|
+
UPDATE pgmb.subscriptions
|
|
39
|
+
SET
|
|
40
|
+
last_active_at = NOW()
|
|
41
|
+
WHERE id IN (SELECT * FROM unnest(:ids!::pgmb.subscription_id[]));
|
|
42
|
+
|
|
43
|
+
/* @name pollForEvents */
|
|
44
|
+
SELECT count AS "count!" FROM pgmb.poll_for_events() AS count;
|
|
45
|
+
|
|
46
|
+
/* @name readNextEvents */
|
|
47
|
+
SELECT
|
|
48
|
+
id AS "id!",
|
|
49
|
+
topic AS "topic!",
|
|
50
|
+
payload AS "payload!",
|
|
51
|
+
metadata AS "metadata!",
|
|
52
|
+
subscription_ids::text[] AS "subscriptionIds!",
|
|
53
|
+
next_cursor AS "nextCursor!"
|
|
54
|
+
FROM pgmb.read_next_events(:groupId!, :cursor, :chunkSize!);
|
|
55
|
+
|
|
56
|
+
/* @name readNextEventsText */
|
|
57
|
+
SELECT
|
|
58
|
+
id AS "id!",
|
|
59
|
+
topic AS "topic!",
|
|
60
|
+
payload::text AS "payload!"
|
|
61
|
+
FROM pgmb.read_next_events(:groupId!, :cursor, :chunkSize!);
|
|
62
|
+
|
|
63
|
+
/* @name replayEvents */
|
|
64
|
+
SELECT
|
|
65
|
+
id AS "id!",
|
|
66
|
+
topic AS "topic!",
|
|
67
|
+
payload AS "payload!",
|
|
68
|
+
metadata AS "metadata!"
|
|
69
|
+
FROM pgmb.replay_events(
|
|
70
|
+
:groupId!,
|
|
71
|
+
:subscriptionId!,
|
|
72
|
+
:fromEventId!::pgmb.event_id,
|
|
73
|
+
:maxEvents!
|
|
74
|
+
);
|
|
75
|
+
|
|
76
|
+
/* @name setGroupCursor */
|
|
77
|
+
SELECT pgmb.set_group_cursor(
|
|
78
|
+
:groupId!,
|
|
79
|
+
:cursor!::pgmb.event_id,
|
|
80
|
+
:releaseLock::boolean
|
|
81
|
+
) AS "success!";
|
|
82
|
+
|
|
83
|
+
/* @name releaseGroupLock */
|
|
84
|
+
SELECT pgmb.release_group_lock(:groupId!) AS "success!";
|
|
85
|
+
|
|
86
|
+
/* @name writeEvents */
|
|
87
|
+
INSERT INTO pgmb.events (topic, payload, metadata)
|
|
88
|
+
SELECT
|
|
89
|
+
topic,
|
|
90
|
+
payload,
|
|
91
|
+
metadata
|
|
92
|
+
FROM unnest(
|
|
93
|
+
:topics!::TEXT[],
|
|
94
|
+
:payloads!::JSONB[],
|
|
95
|
+
:metadatas!::JSONB[]
|
|
96
|
+
) AS t(topic, payload, metadata)
|
|
97
|
+
RETURNING id AS "id!";
|
|
98
|
+
|
|
99
|
+
/* @name writeScheduledEvents */
|
|
100
|
+
INSERT INTO pgmb.events (id, topic, payload, metadata)
|
|
101
|
+
SELECT
|
|
102
|
+
pgmb.create_event_id(COALESCE(ts, clock_timestamp()), pgmb.create_random_bigint()),
|
|
103
|
+
topic,
|
|
104
|
+
payload,
|
|
105
|
+
metadata
|
|
106
|
+
FROM unnest(
|
|
107
|
+
:ts!::TIMESTAMPTZ[],
|
|
108
|
+
:topics!::TEXT[],
|
|
109
|
+
:payloads!::JSONB[],
|
|
110
|
+
:metadatas!::JSONB[]
|
|
111
|
+
) AS t(ts, topic, payload, metadata)
|
|
112
|
+
RETURNING id AS "id!";
|
|
113
|
+
|
|
114
|
+
/* @name scheduleEventRetry */
|
|
115
|
+
INSERT INTO pgmb.events (id, topic, payload, subscription_id)
|
|
116
|
+
SELECT
|
|
117
|
+
pgmb.create_event_id(
|
|
118
|
+
NOW() + (:delayInterval!::INTERVAL),
|
|
119
|
+
pgmb.create_random_bigint()
|
|
120
|
+
),
|
|
121
|
+
'pgmb-retry',
|
|
122
|
+
jsonb_build_object(
|
|
123
|
+
'ids',
|
|
124
|
+
:ids!::pgmb.event_id[],
|
|
125
|
+
'retryNumber',
|
|
126
|
+
:retryNumber!::int,
|
|
127
|
+
'handlerName',
|
|
128
|
+
:handlerName!::text
|
|
129
|
+
),
|
|
130
|
+
:subscriptionId!::pgmb.subscription_id
|
|
131
|
+
RETURNING id AS "id!";
|
|
132
|
+
|
|
133
|
+
/* @name findEvents */
|
|
134
|
+
SELECT
|
|
135
|
+
id AS "id!",
|
|
136
|
+
topic AS "topic!",
|
|
137
|
+
payload AS "payload!",
|
|
138
|
+
metadata AS "metadata!"
|
|
139
|
+
FROM pgmb.events
|
|
140
|
+
WHERE id = ANY(:ids!::pgmb.event_id[]);
|
|
141
|
+
|
|
142
|
+
/* @name removeExpiredSubscriptions */
|
|
143
|
+
WITH deleted AS (
|
|
144
|
+
DELETE FROM pgmb.subscriptions
|
|
145
|
+
WHERE group_id = :groupId!
|
|
146
|
+
AND expiry_interval IS NOT NULL
|
|
147
|
+
AND pgmb.add_interval_imm(last_active_at, expiry_interval) < NOW()
|
|
148
|
+
AND id NOT IN (select * from unnest(:activeIds!::pgmb.subscription_id[]))
|
|
149
|
+
RETURNING id
|
|
150
|
+
)
|
|
151
|
+
SELECT COUNT(*) AS "deleted!" FROM deleted;
|
|
152
|
+
|
|
153
|
+
/* @name maintainEventsTable */
|
|
154
|
+
SELECT pgmb.maintain_events_table();
|