@fedify/postgres 0.3.0-dev.10 → 0.3.0-dev.17

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -68,6 +68,21 @@ Changelog
68
68
 
69
69
  To be released.
70
70
 
71
+ - Added some logging using [LogTape] for the sake of debugging. The following
72
+ categories are used:
73
+
74
+ - `["fedify", "postgres", "kv"]`
75
+ - `["fedify", "postgres", "mq"]`
76
+
77
+ [LogTape]: https://logtape.org/
78
+
79
+ ### Version 0.2.2
80
+
81
+ Released on November 18, 2024.
82
+
83
+ - Fixed a bug where binding parameters have not been properly escaped with
84
+ some settings of Postgres.js.
85
+
71
86
  ### Version 0.2.1
72
87
 
73
88
  Released on November 3, 2024.
package/esm/src/kv.js CHANGED
@@ -9,7 +9,10 @@ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (
9
9
  if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
10
10
  return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
11
11
  };
12
- var _PostgresKvStore_instances, _PostgresKvStore_sql, _PostgresKvStore_tableName, _PostgresKvStore_initialized, _PostgresKvStore_expire;
12
+ var _PostgresKvStore_instances, _PostgresKvStore_sql, _PostgresKvStore_tableName, _PostgresKvStore_initialized, _PostgresKvStore_driverSerializesJson, _PostgresKvStore_expire, _PostgresKvStore_json;
13
+ import { getLogger } from "@logtape/logtape";
14
+ import { driverSerializesJson } from "./utils.js";
15
+ const logger = getLogger(["fedify", "postgres", "kv"]);
13
16
  /**
14
17
  * A key-value store that uses PostgreSQL as the underlying storage.
15
18
  *
@@ -39,6 +42,7 @@ export class PostgresKvStore {
39
42
  _PostgresKvStore_sql.set(this, void 0);
40
43
  _PostgresKvStore_tableName.set(this, void 0);
41
44
  _PostgresKvStore_initialized.set(this, void 0);
45
+ _PostgresKvStore_driverSerializesJson.set(this, false);
42
46
  __classPrivateFieldSet(this, _PostgresKvStore_sql, sql, "f");
43
47
  __classPrivateFieldSet(this, _PostgresKvStore_tableName, options.tableName ?? "fedify_kv_v2", "f");
44
48
  __classPrivateFieldSet(this, _PostgresKvStore_initialized, options.initialized ?? false, "f");
@@ -61,7 +65,7 @@ export class PostgresKvStore {
61
65
  INSERT INTO ${__classPrivateFieldGet(this, _PostgresKvStore_sql, "f").call(this, __classPrivateFieldGet(this, _PostgresKvStore_tableName, "f"))} (key, value, ttl)
62
66
  VALUES (
63
67
  ${key},
64
- (${{ value }}::jsonb) -> 'value',
68
+ ${__classPrivateFieldGet(this, _PostgresKvStore_instances, "m", _PostgresKvStore_json).call(this, value)},
65
69
  ${ttl}
66
70
  )
67
71
  ON CONFLICT (key)
@@ -84,6 +88,9 @@ export class PostgresKvStore {
84
88
  async initialize() {
85
89
  if (__classPrivateFieldGet(this, _PostgresKvStore_initialized, "f"))
86
90
  return;
91
+ logger.debug("Initializing the key-value store table {tableName}...", {
92
+ tableName: __classPrivateFieldGet(this, _PostgresKvStore_tableName, "f"),
93
+ });
87
94
  await __classPrivateFieldGet(this, _PostgresKvStore_sql, "f").bind(this) `
88
95
  CREATE UNLOGGED TABLE IF NOT EXISTS ${__classPrivateFieldGet(this, _PostgresKvStore_sql, "f").call(this, __classPrivateFieldGet(this, _PostgresKvStore_tableName, "f"))} (
89
96
  key text[] PRIMARY KEY,
@@ -92,7 +99,11 @@ export class PostgresKvStore {
92
99
  ttl interval
93
100
  );
94
101
  `;
102
+ __classPrivateFieldSet(this, _PostgresKvStore_driverSerializesJson, await driverSerializesJson(__classPrivateFieldGet(this, _PostgresKvStore_sql, "f")), "f");
95
103
  __classPrivateFieldSet(this, _PostgresKvStore_initialized, true, "f");
104
+ logger.debug("Initialized the key-value store table {tableName}.", {
105
+ tableName: __classPrivateFieldGet(this, _PostgresKvStore_tableName, "f"),
106
+ });
96
107
  }
97
108
  /**
98
109
  * Drops the table used by the key-value store. Does nothing if the table
@@ -102,9 +113,13 @@ export class PostgresKvStore {
102
113
  await __classPrivateFieldGet(this, _PostgresKvStore_sql, "f").bind(this) `DROP TABLE IF EXISTS ${__classPrivateFieldGet(this, _PostgresKvStore_sql, "f").call(this, __classPrivateFieldGet(this, _PostgresKvStore_tableName, "f"))};`;
103
114
  }
104
115
  }
105
- _PostgresKvStore_sql = new WeakMap(), _PostgresKvStore_tableName = new WeakMap(), _PostgresKvStore_initialized = new WeakMap(), _PostgresKvStore_instances = new WeakSet(), _PostgresKvStore_expire = async function _PostgresKvStore_expire() {
116
+ _PostgresKvStore_sql = new WeakMap(), _PostgresKvStore_tableName = new WeakMap(), _PostgresKvStore_initialized = new WeakMap(), _PostgresKvStore_driverSerializesJson = new WeakMap(), _PostgresKvStore_instances = new WeakSet(), _PostgresKvStore_expire = async function _PostgresKvStore_expire() {
106
117
  await __classPrivateFieldGet(this, _PostgresKvStore_sql, "f").bind(this) `
107
118
  DELETE FROM ${__classPrivateFieldGet(this, _PostgresKvStore_sql, "f").call(this, __classPrivateFieldGet(this, _PostgresKvStore_tableName, "f"))}
108
119
  WHERE ttl IS NOT NULL AND created + ttl < CURRENT_TIMESTAMP;
109
120
  `;
121
+ }, _PostgresKvStore_json = function _PostgresKvStore_json(value) {
122
+ if (__classPrivateFieldGet(this, _PostgresKvStore_driverSerializesJson, "f"))
123
+ return __classPrivateFieldGet(this, _PostgresKvStore_sql, "f").json(value);
124
+ return __classPrivateFieldGet(this, _PostgresKvStore_sql, "f").json(JSON.stringify(value));
110
125
  };
package/esm/src/mq.js CHANGED
@@ -9,9 +9,12 @@ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (
9
9
  if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
10
10
  return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
11
11
  };
12
- var _PostgresMessageQueue_sql, _PostgresMessageQueue_tableName, _PostgresMessageQueue_channelName, _PostgresMessageQueue_pollIntervalMs, _PostgresMessageQueue_initialized;
12
+ var _PostgresMessageQueue_instances, _PostgresMessageQueue_sql, _PostgresMessageQueue_tableName, _PostgresMessageQueue_channelName, _PostgresMessageQueue_pollIntervalMs, _PostgresMessageQueue_initialized, _PostgresMessageQueue_driverSerializesJson, _PostgresMessageQueue_json;
13
13
  import * as dntShim from "../_dnt.shims.js";
14
+ import { getLogger } from "@logtape/logtape";
14
15
  import postgres from "postgres";
16
+ import { driverSerializesJson } from "./utils.js";
17
+ const logger = getLogger(["fedify", "postgres", "mq"]);
15
18
  /**
16
19
  * A message queue that uses PostgreSQL as the underlying storage.
17
20
  *
@@ -33,12 +36,14 @@ export class PostgresMessageQueue {
33
36
  constructor(
34
37
  // deno-lint-ignore ban-types
35
38
  sql, options = {}) {
39
+ _PostgresMessageQueue_instances.add(this);
36
40
  // deno-lint-ignore ban-types
37
41
  _PostgresMessageQueue_sql.set(this, void 0);
38
42
  _PostgresMessageQueue_tableName.set(this, void 0);
39
43
  _PostgresMessageQueue_channelName.set(this, void 0);
40
44
  _PostgresMessageQueue_pollIntervalMs.set(this, void 0);
41
45
  _PostgresMessageQueue_initialized.set(this, void 0);
46
+ _PostgresMessageQueue_driverSerializesJson.set(this, false);
42
47
  __classPrivateFieldSet(this, _PostgresMessageQueue_sql, sql, "f");
43
48
  __classPrivateFieldSet(this, _PostgresMessageQueue_tableName, options?.tableName ?? "fedify_message_v2", "f");
44
49
  __classPrivateFieldSet(this, _PostgresMessageQueue_channelName, options?.channelName ?? "fedify_channel", "f");
@@ -50,14 +55,28 @@ export class PostgresMessageQueue {
50
55
  message, options) {
51
56
  await this.initialize();
52
57
  const delay = options?.delay ?? dntShim.Temporal.Duration.from({ seconds: 0 });
58
+ if (options?.delay) {
59
+ logger.debug("Enqueuing a message with a delay of {delay}...", {
60
+ delay,
61
+ message,
62
+ });
63
+ }
64
+ else {
65
+ logger.debug("Enqueuing a message...", { message });
66
+ }
53
67
  await __classPrivateFieldGet(this, _PostgresMessageQueue_sql, "f").bind(this) `
54
68
  INSERT INTO ${__classPrivateFieldGet(this, _PostgresMessageQueue_sql, "f").call(this, __classPrivateFieldGet(this, _PostgresMessageQueue_tableName, "f"))} (message, delay)
55
69
  VALUES (
56
- (${{ message }}::jsonb) -> 'message',
70
+ ${__classPrivateFieldGet(this, _PostgresMessageQueue_instances, "m", _PostgresMessageQueue_json).call(this, message)},
57
71
  ${delay.toString()}
58
72
  );
59
73
  `;
74
+ logger.debug("Enqueued a message.", { message });
60
75
  await __classPrivateFieldGet(this, _PostgresMessageQueue_sql, "f").notify(__classPrivateFieldGet(this, _PostgresMessageQueue_channelName, "f"), delay.toString());
76
+ logger.debug("Notified the message queue channel {channelName}.", {
77
+ channelName: __classPrivateFieldGet(this, _PostgresMessageQueue_channelName, "f"),
78
+ message,
79
+ });
61
80
  }
62
81
  async listen(
63
82
  // deno-lint-ignore no-explicit-any
@@ -131,6 +150,9 @@ export class PostgresMessageQueue {
131
150
  async initialize() {
132
151
  if (__classPrivateFieldGet(this, _PostgresMessageQueue_initialized, "f"))
133
152
  return;
153
+ logger.debug("Initializing the message queue table {tableName}...", {
154
+ tableName: __classPrivateFieldGet(this, _PostgresMessageQueue_tableName, "f"),
155
+ });
134
156
  try {
135
157
  await __classPrivateFieldGet(this, _PostgresMessageQueue_sql, "f").bind(this) `
136
158
  CREATE TABLE IF NOT EXISTS ${__classPrivateFieldGet(this, _PostgresMessageQueue_sql, "f").call(this, __classPrivateFieldGet(this, _PostgresMessageQueue_tableName, "f"))} (
@@ -141,13 +163,20 @@ export class PostgresMessageQueue {
141
163
  );
142
164
  `;
143
165
  }
144
- catch (e) {
145
- if (!(e instanceof postgres.PostgresError &&
146
- e.constraint_name === "pg_type_typname_nsp_index")) {
147
- throw e;
166
+ catch (error) {
167
+ if (!(error instanceof postgres.PostgresError &&
168
+ error.constraint_name === "pg_type_typname_nsp_index")) {
169
+ logger.error("Failed to initialize the message queue table: {error}", {
170
+ error,
171
+ });
172
+ throw error;
148
173
  }
149
174
  }
175
+ __classPrivateFieldSet(this, _PostgresMessageQueue_driverSerializesJson, await driverSerializesJson(__classPrivateFieldGet(this, _PostgresMessageQueue_sql, "f")), "f");
150
176
  __classPrivateFieldSet(this, _PostgresMessageQueue_initialized, true, "f");
177
+ logger.debug("Initialized the message queue table {tableName}.", {
178
+ tableName: __classPrivateFieldGet(this, _PostgresMessageQueue_tableName, "f"),
179
+ });
151
180
  }
152
181
  /**
153
182
  * Drops the message queue table if it exists.
@@ -156,5 +185,9 @@ export class PostgresMessageQueue {
156
185
  await __classPrivateFieldGet(this, _PostgresMessageQueue_sql, "f").bind(this) `DROP TABLE IF EXISTS ${__classPrivateFieldGet(this, _PostgresMessageQueue_sql, "f").call(this, __classPrivateFieldGet(this, _PostgresMessageQueue_tableName, "f"))};`;
157
186
  }
158
187
  }
159
- _PostgresMessageQueue_sql = new WeakMap(), _PostgresMessageQueue_tableName = new WeakMap(), _PostgresMessageQueue_channelName = new WeakMap(), _PostgresMessageQueue_pollIntervalMs = new WeakMap(), _PostgresMessageQueue_initialized = new WeakMap();
188
+ _PostgresMessageQueue_sql = new WeakMap(), _PostgresMessageQueue_tableName = new WeakMap(), _PostgresMessageQueue_channelName = new WeakMap(), _PostgresMessageQueue_pollIntervalMs = new WeakMap(), _PostgresMessageQueue_initialized = new WeakMap(), _PostgresMessageQueue_driverSerializesJson = new WeakMap(), _PostgresMessageQueue_instances = new WeakSet(), _PostgresMessageQueue_json = function _PostgresMessageQueue_json(value) {
189
+ if (__classPrivateFieldGet(this, _PostgresMessageQueue_driverSerializesJson, "f"))
190
+ return __classPrivateFieldGet(this, _PostgresMessageQueue_sql, "f").json(value);
191
+ return __classPrivateFieldGet(this, _PostgresMessageQueue_sql, "f").json(JSON.stringify(value));
192
+ };
160
193
  // cSpell: ignore typname
@@ -0,0 +1,5 @@
1
+ // deno-lint-ignore ban-types
2
+ export async function driverSerializesJson(sql) {
3
+ const result = await sql `SELECT ${sql.json('{"foo":1}')}::jsonb AS test;`;
4
+ return result[0].test === '{"foo":1}';
5
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fedify/postgres",
3
- "version": "0.3.0-dev.10+9c1c324e",
3
+ "version": "0.3.0-dev.17+57e1e1d2",
4
4
  "description": "PostgreSQL drivers for Fedify",
5
5
  "keywords": [
6
6
  "fedify",
@@ -61,6 +61,7 @@
61
61
  ],
62
62
  "dependencies": {
63
63
  "@fedify/fedify": "^1.0.0",
64
+ "@logtape/logtape": "^0.8.0",
64
65
  "postgres": "^3.4.5",
65
66
  "@deno/shim-deno": "~0.18.0",
66
67
  "@js-temporal/polyfill": "^0.4.4"
package/script/src/kv.js CHANGED
@@ -10,9 +10,12 @@ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (
10
10
  if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
11
11
  return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
12
12
  };
13
- var _PostgresKvStore_instances, _PostgresKvStore_sql, _PostgresKvStore_tableName, _PostgresKvStore_initialized, _PostgresKvStore_expire;
13
+ var _PostgresKvStore_instances, _PostgresKvStore_sql, _PostgresKvStore_tableName, _PostgresKvStore_initialized, _PostgresKvStore_driverSerializesJson, _PostgresKvStore_expire, _PostgresKvStore_json;
14
14
  Object.defineProperty(exports, "__esModule", { value: true });
15
15
  exports.PostgresKvStore = void 0;
16
+ const logtape_1 = require("@logtape/logtape");
17
+ const utils_js_1 = require("./utils.js");
18
+ const logger = (0, logtape_1.getLogger)(["fedify", "postgres", "kv"]);
16
19
  /**
17
20
  * A key-value store that uses PostgreSQL as the underlying storage.
18
21
  *
@@ -42,6 +45,7 @@ class PostgresKvStore {
42
45
  _PostgresKvStore_sql.set(this, void 0);
43
46
  _PostgresKvStore_tableName.set(this, void 0);
44
47
  _PostgresKvStore_initialized.set(this, void 0);
48
+ _PostgresKvStore_driverSerializesJson.set(this, false);
45
49
  __classPrivateFieldSet(this, _PostgresKvStore_sql, sql, "f");
46
50
  __classPrivateFieldSet(this, _PostgresKvStore_tableName, options.tableName ?? "fedify_kv_v2", "f");
47
51
  __classPrivateFieldSet(this, _PostgresKvStore_initialized, options.initialized ?? false, "f");
@@ -64,7 +68,7 @@ class PostgresKvStore {
64
68
  INSERT INTO ${__classPrivateFieldGet(this, _PostgresKvStore_sql, "f").call(this, __classPrivateFieldGet(this, _PostgresKvStore_tableName, "f"))} (key, value, ttl)
65
69
  VALUES (
66
70
  ${key},
67
- (${{ value }}::jsonb) -> 'value',
71
+ ${__classPrivateFieldGet(this, _PostgresKvStore_instances, "m", _PostgresKvStore_json).call(this, value)},
68
72
  ${ttl}
69
73
  )
70
74
  ON CONFLICT (key)
@@ -87,6 +91,9 @@ class PostgresKvStore {
87
91
  async initialize() {
88
92
  if (__classPrivateFieldGet(this, _PostgresKvStore_initialized, "f"))
89
93
  return;
94
+ logger.debug("Initializing the key-value store table {tableName}...", {
95
+ tableName: __classPrivateFieldGet(this, _PostgresKvStore_tableName, "f"),
96
+ });
90
97
  await __classPrivateFieldGet(this, _PostgresKvStore_sql, "f").bind(this) `
91
98
  CREATE UNLOGGED TABLE IF NOT EXISTS ${__classPrivateFieldGet(this, _PostgresKvStore_sql, "f").call(this, __classPrivateFieldGet(this, _PostgresKvStore_tableName, "f"))} (
92
99
  key text[] PRIMARY KEY,
@@ -95,7 +102,11 @@ class PostgresKvStore {
95
102
  ttl interval
96
103
  );
97
104
  `;
105
+ __classPrivateFieldSet(this, _PostgresKvStore_driverSerializesJson, await (0, utils_js_1.driverSerializesJson)(__classPrivateFieldGet(this, _PostgresKvStore_sql, "f")), "f");
98
106
  __classPrivateFieldSet(this, _PostgresKvStore_initialized, true, "f");
107
+ logger.debug("Initialized the key-value store table {tableName}.", {
108
+ tableName: __classPrivateFieldGet(this, _PostgresKvStore_tableName, "f"),
109
+ });
99
110
  }
100
111
  /**
101
112
  * Drops the table used by the key-value store. Does nothing if the table
@@ -106,9 +117,13 @@ class PostgresKvStore {
106
117
  }
107
118
  }
108
119
  exports.PostgresKvStore = PostgresKvStore;
109
- _PostgresKvStore_sql = new WeakMap(), _PostgresKvStore_tableName = new WeakMap(), _PostgresKvStore_initialized = new WeakMap(), _PostgresKvStore_instances = new WeakSet(), _PostgresKvStore_expire = async function _PostgresKvStore_expire() {
120
+ _PostgresKvStore_sql = new WeakMap(), _PostgresKvStore_tableName = new WeakMap(), _PostgresKvStore_initialized = new WeakMap(), _PostgresKvStore_driverSerializesJson = new WeakMap(), _PostgresKvStore_instances = new WeakSet(), _PostgresKvStore_expire = async function _PostgresKvStore_expire() {
110
121
  await __classPrivateFieldGet(this, _PostgresKvStore_sql, "f").bind(this) `
111
122
  DELETE FROM ${__classPrivateFieldGet(this, _PostgresKvStore_sql, "f").call(this, __classPrivateFieldGet(this, _PostgresKvStore_tableName, "f"))}
112
123
  WHERE ttl IS NOT NULL AND created + ttl < CURRENT_TIMESTAMP;
113
124
  `;
125
+ }, _PostgresKvStore_json = function _PostgresKvStore_json(value) {
126
+ if (__classPrivateFieldGet(this, _PostgresKvStore_driverSerializesJson, "f"))
127
+ return __classPrivateFieldGet(this, _PostgresKvStore_sql, "f").json(value);
128
+ return __classPrivateFieldGet(this, _PostgresKvStore_sql, "f").json(JSON.stringify(value));
114
129
  };
package/script/src/mq.js CHANGED
@@ -36,11 +36,14 @@ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (
36
36
  var __importDefault = (this && this.__importDefault) || function (mod) {
37
37
  return (mod && mod.__esModule) ? mod : { "default": mod };
38
38
  };
39
- var _PostgresMessageQueue_sql, _PostgresMessageQueue_tableName, _PostgresMessageQueue_channelName, _PostgresMessageQueue_pollIntervalMs, _PostgresMessageQueue_initialized;
39
+ var _PostgresMessageQueue_instances, _PostgresMessageQueue_sql, _PostgresMessageQueue_tableName, _PostgresMessageQueue_channelName, _PostgresMessageQueue_pollIntervalMs, _PostgresMessageQueue_initialized, _PostgresMessageQueue_driverSerializesJson, _PostgresMessageQueue_json;
40
40
  Object.defineProperty(exports, "__esModule", { value: true });
41
41
  exports.PostgresMessageQueue = void 0;
42
42
  const dntShim = __importStar(require("../_dnt.shims.js"));
43
+ const logtape_1 = require("@logtape/logtape");
43
44
  const postgres_1 = __importDefault(require("postgres"));
45
+ const utils_js_1 = require("./utils.js");
46
+ const logger = (0, logtape_1.getLogger)(["fedify", "postgres", "mq"]);
44
47
  /**
45
48
  * A message queue that uses PostgreSQL as the underlying storage.
46
49
  *
@@ -62,12 +65,14 @@ class PostgresMessageQueue {
62
65
  constructor(
63
66
  // deno-lint-ignore ban-types
64
67
  sql, options = {}) {
68
+ _PostgresMessageQueue_instances.add(this);
65
69
  // deno-lint-ignore ban-types
66
70
  _PostgresMessageQueue_sql.set(this, void 0);
67
71
  _PostgresMessageQueue_tableName.set(this, void 0);
68
72
  _PostgresMessageQueue_channelName.set(this, void 0);
69
73
  _PostgresMessageQueue_pollIntervalMs.set(this, void 0);
70
74
  _PostgresMessageQueue_initialized.set(this, void 0);
75
+ _PostgresMessageQueue_driverSerializesJson.set(this, false);
71
76
  __classPrivateFieldSet(this, _PostgresMessageQueue_sql, sql, "f");
72
77
  __classPrivateFieldSet(this, _PostgresMessageQueue_tableName, options?.tableName ?? "fedify_message_v2", "f");
73
78
  __classPrivateFieldSet(this, _PostgresMessageQueue_channelName, options?.channelName ?? "fedify_channel", "f");
@@ -79,14 +84,28 @@ class PostgresMessageQueue {
79
84
  message, options) {
80
85
  await this.initialize();
81
86
  const delay = options?.delay ?? dntShim.Temporal.Duration.from({ seconds: 0 });
87
+ if (options?.delay) {
88
+ logger.debug("Enqueuing a message with a delay of {delay}...", {
89
+ delay,
90
+ message,
91
+ });
92
+ }
93
+ else {
94
+ logger.debug("Enqueuing a message...", { message });
95
+ }
82
96
  await __classPrivateFieldGet(this, _PostgresMessageQueue_sql, "f").bind(this) `
83
97
  INSERT INTO ${__classPrivateFieldGet(this, _PostgresMessageQueue_sql, "f").call(this, __classPrivateFieldGet(this, _PostgresMessageQueue_tableName, "f"))} (message, delay)
84
98
  VALUES (
85
- (${{ message }}::jsonb) -> 'message',
99
+ ${__classPrivateFieldGet(this, _PostgresMessageQueue_instances, "m", _PostgresMessageQueue_json).call(this, message)},
86
100
  ${delay.toString()}
87
101
  );
88
102
  `;
103
+ logger.debug("Enqueued a message.", { message });
89
104
  await __classPrivateFieldGet(this, _PostgresMessageQueue_sql, "f").notify(__classPrivateFieldGet(this, _PostgresMessageQueue_channelName, "f"), delay.toString());
105
+ logger.debug("Notified the message queue channel {channelName}.", {
106
+ channelName: __classPrivateFieldGet(this, _PostgresMessageQueue_channelName, "f"),
107
+ message,
108
+ });
90
109
  }
91
110
  async listen(
92
111
  // deno-lint-ignore no-explicit-any
@@ -160,6 +179,9 @@ class PostgresMessageQueue {
160
179
  async initialize() {
161
180
  if (__classPrivateFieldGet(this, _PostgresMessageQueue_initialized, "f"))
162
181
  return;
182
+ logger.debug("Initializing the message queue table {tableName}...", {
183
+ tableName: __classPrivateFieldGet(this, _PostgresMessageQueue_tableName, "f"),
184
+ });
163
185
  try {
164
186
  await __classPrivateFieldGet(this, _PostgresMessageQueue_sql, "f").bind(this) `
165
187
  CREATE TABLE IF NOT EXISTS ${__classPrivateFieldGet(this, _PostgresMessageQueue_sql, "f").call(this, __classPrivateFieldGet(this, _PostgresMessageQueue_tableName, "f"))} (
@@ -170,13 +192,20 @@ class PostgresMessageQueue {
170
192
  );
171
193
  `;
172
194
  }
173
- catch (e) {
174
- if (!(e instanceof postgres_1.default.PostgresError &&
175
- e.constraint_name === "pg_type_typname_nsp_index")) {
176
- throw e;
195
+ catch (error) {
196
+ if (!(error instanceof postgres_1.default.PostgresError &&
197
+ error.constraint_name === "pg_type_typname_nsp_index")) {
198
+ logger.error("Failed to initialize the message queue table: {error}", {
199
+ error,
200
+ });
201
+ throw error;
177
202
  }
178
203
  }
204
+ __classPrivateFieldSet(this, _PostgresMessageQueue_driverSerializesJson, await (0, utils_js_1.driverSerializesJson)(__classPrivateFieldGet(this, _PostgresMessageQueue_sql, "f")), "f");
179
205
  __classPrivateFieldSet(this, _PostgresMessageQueue_initialized, true, "f");
206
+ logger.debug("Initialized the message queue table {tableName}.", {
207
+ tableName: __classPrivateFieldGet(this, _PostgresMessageQueue_tableName, "f"),
208
+ });
180
209
  }
181
210
  /**
182
211
  * Drops the message queue table if it exists.
@@ -186,5 +215,9 @@ class PostgresMessageQueue {
186
215
  }
187
216
  }
188
217
  exports.PostgresMessageQueue = PostgresMessageQueue;
189
- _PostgresMessageQueue_sql = new WeakMap(), _PostgresMessageQueue_tableName = new WeakMap(), _PostgresMessageQueue_channelName = new WeakMap(), _PostgresMessageQueue_pollIntervalMs = new WeakMap(), _PostgresMessageQueue_initialized = new WeakMap();
218
+ _PostgresMessageQueue_sql = new WeakMap(), _PostgresMessageQueue_tableName = new WeakMap(), _PostgresMessageQueue_channelName = new WeakMap(), _PostgresMessageQueue_pollIntervalMs = new WeakMap(), _PostgresMessageQueue_initialized = new WeakMap(), _PostgresMessageQueue_driverSerializesJson = new WeakMap(), _PostgresMessageQueue_instances = new WeakSet(), _PostgresMessageQueue_json = function _PostgresMessageQueue_json(value) {
219
+ if (__classPrivateFieldGet(this, _PostgresMessageQueue_driverSerializesJson, "f"))
220
+ return __classPrivateFieldGet(this, _PostgresMessageQueue_sql, "f").json(value);
221
+ return __classPrivateFieldGet(this, _PostgresMessageQueue_sql, "f").json(JSON.stringify(value));
222
+ };
190
223
  // cSpell: ignore typname
@@ -0,0 +1,8 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.driverSerializesJson = driverSerializesJson;
4
+ // deno-lint-ignore ban-types
5
+ async function driverSerializesJson(sql) {
6
+ const result = await sql `SELECT ${sql.json('{"foo":1}')}::jsonb AS test;`;
7
+ return result[0].test === '{"foo":1}';
8
+ }
@@ -1 +1 @@
1
- {"version":3,"file":"kv.d.ts","sourceRoot":"","sources":["../../src/src/kv.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACxE,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AAEpC;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACrC;;;;OAIG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB;;;OAGG;IACH,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED;;;;;;;;;;;;;;GAcG;AACH,qBAAa,eAAgB,YAAW,OAAO;;IAM7C;;;;OAIG;gBAGD,GAAG,EAAE,GAAG,CAAC,EAAE,CAAC,EACZ,OAAO,GAAE,sBAA2B;IAchC,GAAG,CAAC,CAAC,GAAG,OAAO,EAAE,GAAG,EAAE,KAAK,GAAG,OAAO,CAAC,CAAC,GAAG,SAAS,CAAC;IAWpD,GAAG,CACP,GAAG,EAAE,KAAK,EACV,KAAK,EAAE,OAAO,EACd,OAAO,CAAC,EAAE,iBAAiB,GAAG,SAAS,GACtC,OAAO,CAAC,IAAI,CAAC;IAgBV,MAAM,CAAC,GAAG,EAAE,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC;IASvC;;;OAGG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAajC;;;OAGG;IACG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;CAG5B"}
1
+ {"version":3,"file":"kv.d.ts","sourceRoot":"","sources":["../../src/src/kv.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAExE,OAAO,KAAK,EAAwB,GAAG,EAAE,MAAM,UAAU,CAAC;AAK1D;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACrC;;;;OAIG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB;;;OAGG;IACH,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED;;;;;;;;;;;;;;GAcG;AACH,qBAAa,eAAgB,YAAW,OAAO;;IAO7C;;;;OAIG;gBAGD,GAAG,EAAE,GAAG,CAAC,EAAE,CAAC,EACZ,OAAO,GAAE,sBAA2B;IAchC,GAAG,CAAC,CAAC,GAAG,OAAO,EAAE,GAAG,EAAE,KAAK,GAAG,OAAO,CAAC,CAAC,GAAG,SAAS,CAAC;IAWpD,GAAG,CACP,GAAG,EAAE,KAAK,EACV,KAAK,EAAE,OAAO,EACd,OAAO,CAAC,EAAE,iBAAiB,GAAG,SAAS,GACtC,OAAO,CAAC,IAAI,CAAC;IAgBV,MAAM,CAAC,GAAG,EAAE,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC;IASvC;;;OAGG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAoBjC;;;OAGG;IACG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;CAQ5B"}
@@ -1 +1 @@
1
- {"version":3,"file":"mq.d.ts","sourceRoot":"","sources":["../../src/src/mq.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,OAAO,MAAM,kBAAkB,CAAC;AAC5C,OAAO,KAAK,EACV,YAAY,EACZ,0BAA0B,EAC1B,yBAAyB,EAC1B,MAAM,gBAAgB,CAAC;AACxB,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AAGpC;;GAEG;AACH,MAAM,WAAW,2BAA2B;IAC1C;;;;OAIG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB;;;;OAIG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB;;;OAGG;IACH,WAAW,CAAC,EAAE,OAAO,CAAC;IAEtB;;;OAGG;IACH,YAAY,CAAC,EAAE,OAAO,CAAC,QAAQ,CAAC,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAC;CAC1E;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,qBAAa,oBAAqB,YAAW,YAAY;;gBAUrD,GAAG,EAAE,GAAG,CAAC,EAAE,CAAC,EACZ,OAAO,GAAE,2BAAgC;IAWrC,OAAO,CAEX,OAAO,EAAE,GAAG,EACZ,OAAO,CAAC,EAAE,0BAA0B,GACnC,OAAO,CAAC,IAAI,CAAC;IAaV,MAAM,CAEV,OAAO,EAAE,CAAC,OAAO,EAAE,GAAG,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,EAC/C,OAAO,GAAE,yBAA8B,GACtC,OAAO,CAAC,IAAI,CAAC;IA8DhB;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAsBjC;;OAEG;IACG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;CAG5B"}
1
+ {"version":3,"file":"mq.d.ts","sourceRoot":"","sources":["../../src/src/mq.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,OAAO,MAAM,kBAAkB,CAAC;AAC5C,OAAO,KAAK,EACV,YAAY,EACZ,0BAA0B,EAC1B,yBAAyB,EAC1B,MAAM,gBAAgB,CAAC;AAExB,OAAO,KAAK,EAAwB,GAAG,EAAE,MAAM,UAAU,CAAC;AAM1D;;GAEG;AACH,MAAM,WAAW,2BAA2B;IAC1C;;;;OAIG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB;;;;OAIG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB;;;OAGG;IACH,WAAW,CAAC,EAAE,OAAO,CAAC;IAEtB;;;OAGG;IACH,YAAY,CAAC,EAAE,OAAO,CAAC,QAAQ,CAAC,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAC;CAC1E;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,qBAAa,oBAAqB,YAAW,YAAY;;gBAWrD,GAAG,EAAE,GAAG,CAAC,EAAE,CAAC,EACZ,OAAO,GAAE,2BAAgC;IAWrC,OAAO,CAEX,OAAO,EAAE,GAAG,EACZ,OAAO,CAAC,EAAE,0BAA0B,GACnC,OAAO,CAAC,IAAI,CAAC;IA0BV,MAAM,CAEV,OAAO,EAAE,CAAC,OAAO,EAAE,GAAG,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,EAC/C,OAAO,GAAE,yBAA8B,GACtC,OAAO,CAAC,IAAI,CAAC;IA8DhB;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAgCjC;;OAEG;IACG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;CAQ5B"}
@@ -0,0 +1,3 @@
1
+ import type { Sql } from "postgres";
2
+ export declare function driverSerializesJson(sql: Sql<{}>): Promise<boolean>;
3
+ //# sourceMappingURL=utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/src/utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AAGpC,wBAAsB,oBAAoB,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,CAGzE"}