@fedify/postgres 2.1.23 → 2.1.25

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/dist/kv.cjs CHANGED
@@ -58,11 +58,12 @@ var PostgresKvStore = class {
58
58
  async set(key, value, options) {
59
59
  await this.initialize();
60
60
  const ttl = options?.ttl == null ? null : options.ttl.toString();
61
+ const jsonValue = value === null ? this.#sql`'null'::jsonb` : this.#json(value);
61
62
  await this.#sql`
62
63
  INSERT INTO ${this.#sql(this.#tableName)} (key, value, ttl)
63
64
  VALUES (
64
65
  ${key},
65
- ${this.#json(value)},
66
+ ${jsonValue},
66
67
  ${ttl}
67
68
  )
68
69
  ON CONFLICT (key)
package/dist/kv.js CHANGED
@@ -57,11 +57,12 @@ var PostgresKvStore = class {
57
57
  async set(key, value, options) {
58
58
  await this.initialize();
59
59
  const ttl = options?.ttl == null ? null : options.ttl.toString();
60
+ const jsonValue = value === null ? this.#sql`'null'::jsonb` : this.#json(value);
60
61
  await this.#sql`
61
62
  INSERT INTO ${this.#sql(this.#tableName)} (key, value, ttl)
62
63
  VALUES (
63
64
  ${key},
64
- ${this.#json(value)},
65
+ ${jsonValue},
65
66
  ${ttl}
66
67
  )
67
68
  ON CONFLICT (key)
package/dist/mq.cjs CHANGED
@@ -136,6 +136,7 @@ var PostgresMessageQueue = class {
136
136
  async listen(handler, options = {}) {
137
137
  await this.initialize();
138
138
  const { signal } = options;
139
+ if (signal?.aborted) return;
139
140
  const poll = async () => {
140
141
  while (!signal?.aborted) {
141
142
  let processed = false;
@@ -229,6 +230,7 @@ var PostgresMessageQueue = class {
229
230
  };
230
231
  const timeouts = /* @__PURE__ */ new Set();
231
232
  const listen = await this.#sql.listen(this.#channelName, async (delay) => {
233
+ if (signal?.aborted) return;
232
234
  try {
233
235
  const durationMs = Temporal.Duration.from(delay).total("millisecond");
234
236
  if (durationMs < 1) await safeSerializedPoll("notify-immediate");
@@ -247,28 +249,40 @@ var PostgresMessageQueue = class {
247
249
  await safeSerializedPoll("notify-fallback");
248
250
  }
249
251
  }, () => safeSerializedPoll("subscribe"));
250
- signal?.addEventListener("abort", () => {
251
- listen.unlisten();
252
+ const clearTimeouts = () => {
252
253
  for (const timeout of timeouts) clearTimeout(timeout);
253
254
  timeouts.clear();
254
- });
255
- while (!signal?.aborted) {
256
- let timeout;
257
- await new Promise((resolve) => {
258
- signal?.addEventListener("abort", resolve);
259
- timeout = setTimeout(() => {
260
- signal?.removeEventListener("abort", resolve);
261
- resolve(0);
262
- }, this.#pollIntervalMs);
263
- timeouts.add(timeout);
264
- });
265
- if (timeout != null) timeouts.delete(timeout);
266
- await safeSerializedPoll("interval");
255
+ };
256
+ signal?.addEventListener("abort", clearTimeouts);
257
+ try {
258
+ while (!signal?.aborted) {
259
+ await new Promise((resolve) => {
260
+ const onAbort = () => {
261
+ clearTimeout(timeout);
262
+ signal?.removeEventListener("abort", onAbort);
263
+ resolve();
264
+ };
265
+ const timeout = setTimeout(() => {
266
+ signal?.removeEventListener("abort", onAbort);
267
+ resolve();
268
+ }, this.#pollIntervalMs);
269
+ signal?.addEventListener("abort", onAbort, { once: true });
270
+ });
271
+ await safeSerializedPoll("interval");
272
+ }
273
+ } finally {
274
+ signal?.removeEventListener("abort", clearTimeouts);
275
+ clearTimeouts();
276
+ await pollLock;
277
+ try {
278
+ await listen.unlisten();
279
+ } catch (error) {
280
+ logger.error("Error while unlistening from channel {channelName}: {error}", {
281
+ channelName: this.#channelName,
282
+ error
283
+ });
284
+ }
267
285
  }
268
- await new Promise((resolve) => {
269
- signal?.addEventListener("abort", () => resolve());
270
- if (signal?.aborted) return resolve();
271
- });
272
286
  }
273
287
  /**
274
288
  * Initializes the message queue table if it does not already exist.
package/dist/mq.js CHANGED
@@ -133,6 +133,7 @@ var PostgresMessageQueue = class {
133
133
  async listen(handler, options = {}) {
134
134
  await this.initialize();
135
135
  const { signal } = options;
136
+ if (signal?.aborted) return;
136
137
  const poll = async () => {
137
138
  while (!signal?.aborted) {
138
139
  let processed = false;
@@ -226,6 +227,7 @@ var PostgresMessageQueue = class {
226
227
  };
227
228
  const timeouts = /* @__PURE__ */ new Set();
228
229
  const listen = await this.#sql.listen(this.#channelName, async (delay) => {
230
+ if (signal?.aborted) return;
229
231
  try {
230
232
  const durationMs = Temporal.Duration.from(delay).total("millisecond");
231
233
  if (durationMs < 1) await safeSerializedPoll("notify-immediate");
@@ -244,28 +246,40 @@ var PostgresMessageQueue = class {
244
246
  await safeSerializedPoll("notify-fallback");
245
247
  }
246
248
  }, () => safeSerializedPoll("subscribe"));
247
- signal?.addEventListener("abort", () => {
248
- listen.unlisten();
249
+ const clearTimeouts = () => {
249
250
  for (const timeout of timeouts) clearTimeout(timeout);
250
251
  timeouts.clear();
251
- });
252
- while (!signal?.aborted) {
253
- let timeout;
254
- await new Promise((resolve) => {
255
- signal?.addEventListener("abort", resolve);
256
- timeout = setTimeout(() => {
257
- signal?.removeEventListener("abort", resolve);
258
- resolve(0);
259
- }, this.#pollIntervalMs);
260
- timeouts.add(timeout);
261
- });
262
- if (timeout != null) timeouts.delete(timeout);
263
- await safeSerializedPoll("interval");
252
+ };
253
+ signal?.addEventListener("abort", clearTimeouts);
254
+ try {
255
+ while (!signal?.aborted) {
256
+ await new Promise((resolve) => {
257
+ const onAbort = () => {
258
+ clearTimeout(timeout);
259
+ signal?.removeEventListener("abort", onAbort);
260
+ resolve();
261
+ };
262
+ const timeout = setTimeout(() => {
263
+ signal?.removeEventListener("abort", onAbort);
264
+ resolve();
265
+ }, this.#pollIntervalMs);
266
+ signal?.addEventListener("abort", onAbort, { once: true });
267
+ });
268
+ await safeSerializedPoll("interval");
269
+ }
270
+ } finally {
271
+ signal?.removeEventListener("abort", clearTimeouts);
272
+ clearTimeouts();
273
+ await pollLock;
274
+ try {
275
+ await listen.unlisten();
276
+ } catch (error) {
277
+ logger.error("Error while unlistening from channel {channelName}: {error}", {
278
+ channelName: this.#channelName,
279
+ error
280
+ });
281
+ }
264
282
  }
265
- await new Promise((resolve) => {
266
- signal?.addEventListener("abort", () => resolve());
267
- if (signal?.aborted) return resolve();
268
- });
269
283
  }
270
284
  /**
271
285
  * Initializes the message queue table if it does not already exist.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fedify/postgres",
3
- "version": "2.1.23",
3
+ "version": "2.1.25",
4
4
  "description": "PostgreSQL drivers for Fedify",
5
5
  "keywords": [
6
6
  "fedify",
@@ -74,14 +74,14 @@
74
74
  },
75
75
  "peerDependencies": {
76
76
  "postgres": "^3.4.7",
77
- "@fedify/fedify": "^2.1.23"
77
+ "@fedify/fedify": "^2.1.25"
78
78
  },
79
79
  "devDependencies": {
80
80
  "@std/async": "npm:@jsr/std__async@^1.0.13",
81
81
  "tsdown": "^0.21.6",
82
82
  "typescript": "^6.0.0",
83
83
  "@fedify/fixture": "^2.0.0",
84
- "@fedify/testing": "^2.1.23"
84
+ "@fedify/testing": "^2.1.25"
85
85
  },
86
86
  "scripts": {
87
87
  "build:self": "tsdown",