@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 +15 -0
- package/esm/src/kv.js +18 -3
- package/esm/src/mq.js +40 -7
- package/esm/src/utils.js +5 -0
- package/package.json +2 -1
- package/script/src/kv.js +18 -3
- package/script/src/mq.js +40 -7
- package/script/src/utils.js +8 -0
- package/types/src/kv.d.ts.map +1 -1
- package/types/src/mq.d.ts.map +1 -1
- package/types/src/utils.d.ts +3 -0
- package/types/src/utils.d.ts.map +1 -0
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
|
-
|
|
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
|
-
|
|
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 (
|
|
145
|
-
if (!(
|
|
146
|
-
|
|
147
|
-
|
|
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
|
package/esm/src/utils.js
ADDED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@fedify/postgres",
|
|
3
|
-
"version": "0.3.0-dev.
|
|
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
|
-
|
|
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
|
-
|
|
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 (
|
|
174
|
-
if (!(
|
|
175
|
-
|
|
176
|
-
|
|
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
|
+
}
|
package/types/src/kv.d.ts.map
CHANGED
|
@@ -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;
|
|
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"}
|
package/types/src/mq.d.ts.map
CHANGED
|
@@ -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;
|
|
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 @@
|
|
|
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"}
|