@fedify/sqlite 2.3.0-dev.994 → 2.3.0-pr.809.36
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/deno.json +1 -1
- package/dist/adapter.d.cts +1 -0
- package/dist/adapter.d.ts +1 -2
- package/dist/kv.cjs +2 -0
- package/dist/kv.d.cts +1 -0
- package/dist/kv.d.ts +1 -1
- package/dist/kv.js +2 -0
- package/dist/mod.d.cts +1 -0
- package/dist/mod.d.ts +1 -1
- package/dist/mod.js +1 -1
- package/dist/mq.cjs +20 -0
- package/dist/mq.d.cts +6 -1
- package/dist/mq.d.ts +6 -2
- package/dist/mq.js +20 -0
- package/dist/sqlite.bun.cjs +2 -0
- package/dist/sqlite.bun.d.cts +1 -0
- package/dist/sqlite.bun.d.ts +1 -1
- package/dist/sqlite.bun.js +3 -1
- package/dist/sqlite.node.cjs +2 -0
- package/dist/sqlite.node.d.cts +1 -0
- package/dist/sqlite.node.d.ts +1 -1
- package/dist/sqlite.node.js +3 -1
- package/package.json +7 -7
- package/src/mq.test.ts +30 -0
- package/src/mq.ts +24 -0
- package/tsdown.config.ts +8 -11
package/deno.json
CHANGED
package/dist/adapter.d.cts
CHANGED
package/dist/adapter.d.ts
CHANGED
package/dist/kv.cjs
CHANGED
package/dist/kv.d.cts
CHANGED
package/dist/kv.d.ts
CHANGED
package/dist/kv.js
CHANGED
package/dist/mod.d.cts
CHANGED
package/dist/mod.d.ts
CHANGED
package/dist/mod.js
CHANGED
package/dist/mq.cjs
CHANGED
|
@@ -35,6 +35,8 @@ var EnqueueEvent = class extends Event {
|
|
|
35
35
|
* ```
|
|
36
36
|
*/
|
|
37
37
|
var SqliteMessageQueue = class SqliteMessageQueue {
|
|
38
|
+
db;
|
|
39
|
+
options;
|
|
38
40
|
static #defaultTableName = "fedify_message";
|
|
39
41
|
static #tableNameRegex = /^[A-Za-z_][A-Za-z0-9_]{0,63}$/;
|
|
40
42
|
static #notifyChannels = /* @__PURE__ */ new Map();
|
|
@@ -150,6 +152,24 @@ var SqliteMessageQueue = class SqliteMessageQueue {
|
|
|
150
152
|
});
|
|
151
153
|
}
|
|
152
154
|
/**
|
|
155
|
+
* {@inheritDoc MessageQueue.getDepth}
|
|
156
|
+
*/
|
|
157
|
+
async getDepth() {
|
|
158
|
+
this.initialize();
|
|
159
|
+
const row = await this.#retryOnBusy(() => {
|
|
160
|
+
const now = Temporal.Now.instant().epochMilliseconds;
|
|
161
|
+
return this.#db.prepare(`SELECT
|
|
162
|
+
COUNT(*) AS queued,
|
|
163
|
+
COALESCE(SUM(CASE WHEN scheduled <= ? THEN 1 ELSE 0 END), 0) AS ready
|
|
164
|
+
FROM "${this.#tableName}"`).get(now);
|
|
165
|
+
});
|
|
166
|
+
return {
|
|
167
|
+
queued: row.queued,
|
|
168
|
+
ready: row.ready,
|
|
169
|
+
delayed: Math.max(0, row.queued - row.ready)
|
|
170
|
+
};
|
|
171
|
+
}
|
|
172
|
+
/**
|
|
153
173
|
* {@inheritDoc MessageQueue.listen}
|
|
154
174
|
*/
|
|
155
175
|
async listen(handler, options) {
|
package/dist/mq.d.cts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
|
+
/// <reference lib="esnext.temporal" />
|
|
1
2
|
import { PlatformDatabase } from "#sqlite";
|
|
2
|
-
import { MessageQueue, MessageQueueEnqueueOptions, MessageQueueListenOptions } from "@fedify/fedify";
|
|
3
|
+
import { MessageQueue, MessageQueueDepth, MessageQueueEnqueueOptions, MessageQueueListenOptions } from "@fedify/fedify";
|
|
3
4
|
|
|
4
5
|
//#region src/mq.d.ts
|
|
5
6
|
/**
|
|
@@ -86,6 +87,10 @@ declare class SqliteMessageQueue implements MessageQueue, Disposable {
|
|
|
86
87
|
*/
|
|
87
88
|
enqueueMany(messages: readonly any[], options?: MessageQueueEnqueueOptions): Promise<void>;
|
|
88
89
|
/**
|
|
90
|
+
* {@inheritDoc MessageQueue.getDepth}
|
|
91
|
+
*/
|
|
92
|
+
getDepth(): Promise<MessageQueueDepth>;
|
|
93
|
+
/**
|
|
89
94
|
* {@inheritDoc MessageQueue.listen}
|
|
90
95
|
*/
|
|
91
96
|
listen(handler: (message: any) => Promise<void> | void, options?: MessageQueueListenOptions): Promise<void>;
|
package/dist/mq.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
|
|
1
|
+
/// <reference lib="esnext.temporal" />
|
|
2
2
|
import { PlatformDatabase } from "#sqlite";
|
|
3
|
-
import { MessageQueue, MessageQueueEnqueueOptions, MessageQueueListenOptions } from "@fedify/fedify";
|
|
3
|
+
import { MessageQueue, MessageQueueDepth, MessageQueueEnqueueOptions, MessageQueueListenOptions } from "@fedify/fedify";
|
|
4
4
|
|
|
5
5
|
//#region src/mq.d.ts
|
|
6
6
|
/**
|
|
@@ -87,6 +87,10 @@ declare class SqliteMessageQueue implements MessageQueue, Disposable {
|
|
|
87
87
|
*/
|
|
88
88
|
enqueueMany(messages: readonly any[], options?: MessageQueueEnqueueOptions): Promise<void>;
|
|
89
89
|
/**
|
|
90
|
+
* {@inheritDoc MessageQueue.getDepth}
|
|
91
|
+
*/
|
|
92
|
+
getDepth(): Promise<MessageQueueDepth>;
|
|
93
|
+
/**
|
|
90
94
|
* {@inheritDoc MessageQueue.listen}
|
|
91
95
|
*/
|
|
92
96
|
listen(handler: (message: any) => Promise<void> | void, options?: MessageQueueListenOptions): Promise<void>;
|
package/dist/mq.js
CHANGED
|
@@ -35,6 +35,8 @@ var EnqueueEvent = class extends Event {
|
|
|
35
35
|
* ```
|
|
36
36
|
*/
|
|
37
37
|
var SqliteMessageQueue = class SqliteMessageQueue {
|
|
38
|
+
db;
|
|
39
|
+
options;
|
|
38
40
|
static #defaultTableName = "fedify_message";
|
|
39
41
|
static #tableNameRegex = /^[A-Za-z_][A-Za-z0-9_]{0,63}$/;
|
|
40
42
|
static #notifyChannels = /* @__PURE__ */ new Map();
|
|
@@ -150,6 +152,24 @@ var SqliteMessageQueue = class SqliteMessageQueue {
|
|
|
150
152
|
});
|
|
151
153
|
}
|
|
152
154
|
/**
|
|
155
|
+
* {@inheritDoc MessageQueue.getDepth}
|
|
156
|
+
*/
|
|
157
|
+
async getDepth() {
|
|
158
|
+
this.initialize();
|
|
159
|
+
const row = await this.#retryOnBusy(() => {
|
|
160
|
+
const now = Temporal.Now.instant().epochMilliseconds;
|
|
161
|
+
return this.#db.prepare(`SELECT
|
|
162
|
+
COUNT(*) AS queued,
|
|
163
|
+
COALESCE(SUM(CASE WHEN scheduled <= ? THEN 1 ELSE 0 END), 0) AS ready
|
|
164
|
+
FROM "${this.#tableName}"`).get(now);
|
|
165
|
+
});
|
|
166
|
+
return {
|
|
167
|
+
queued: row.queued,
|
|
168
|
+
ready: row.ready,
|
|
169
|
+
delayed: Math.max(0, row.queued - row.ready)
|
|
170
|
+
};
|
|
171
|
+
}
|
|
172
|
+
/**
|
|
153
173
|
* {@inheritDoc MessageQueue.listen}
|
|
154
174
|
*/
|
|
155
175
|
async listen(handler, options) {
|
package/dist/sqlite.bun.cjs
CHANGED
|
@@ -3,6 +3,7 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
|
3
3
|
let bun_sqlite = require("bun:sqlite");
|
|
4
4
|
//#region src/sqlite.bun.ts
|
|
5
5
|
var SqliteDatabase = class {
|
|
6
|
+
db;
|
|
6
7
|
constructor(db) {
|
|
7
8
|
this.db = db;
|
|
8
9
|
}
|
|
@@ -17,6 +18,7 @@ var SqliteDatabase = class {
|
|
|
17
18
|
}
|
|
18
19
|
};
|
|
19
20
|
var SqliteStatement = class {
|
|
21
|
+
stmt;
|
|
20
22
|
constructor(stmt) {
|
|
21
23
|
this.stmt = stmt;
|
|
22
24
|
}
|
package/dist/sqlite.bun.d.cts
CHANGED
package/dist/sqlite.bun.d.ts
CHANGED
package/dist/sqlite.bun.js
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
|
-
import "@js-temporal/polyfill";
|
|
1
|
+
import { Temporal } from "@js-temporal/polyfill";
|
|
2
2
|
import { Database } from "bun:sqlite";
|
|
3
3
|
//#region src/sqlite.bun.ts
|
|
4
4
|
var SqliteDatabase = class {
|
|
5
|
+
db;
|
|
5
6
|
constructor(db) {
|
|
6
7
|
this.db = db;
|
|
7
8
|
}
|
|
@@ -16,6 +17,7 @@ var SqliteDatabase = class {
|
|
|
16
17
|
}
|
|
17
18
|
};
|
|
18
19
|
var SqliteStatement = class {
|
|
20
|
+
stmt;
|
|
19
21
|
constructor(stmt) {
|
|
20
22
|
this.stmt = stmt;
|
|
21
23
|
}
|
package/dist/sqlite.node.cjs
CHANGED
|
@@ -3,6 +3,7 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
|
3
3
|
let node_sqlite = require("node:sqlite");
|
|
4
4
|
//#region src/sqlite.node.ts
|
|
5
5
|
var SqliteDatabase = class {
|
|
6
|
+
db;
|
|
6
7
|
constructor(db) {
|
|
7
8
|
this.db = db;
|
|
8
9
|
}
|
|
@@ -17,6 +18,7 @@ var SqliteDatabase = class {
|
|
|
17
18
|
}
|
|
18
19
|
};
|
|
19
20
|
var SqliteStatement = class {
|
|
21
|
+
stmt;
|
|
20
22
|
constructor(stmt) {
|
|
21
23
|
this.stmt = stmt;
|
|
22
24
|
}
|
package/dist/sqlite.node.d.cts
CHANGED
package/dist/sqlite.node.d.ts
CHANGED
package/dist/sqlite.node.js
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
|
-
import "@js-temporal/polyfill";
|
|
1
|
+
import { Temporal } from "@js-temporal/polyfill";
|
|
2
2
|
import { DatabaseSync } from "node:sqlite";
|
|
3
3
|
//#region src/sqlite.node.ts
|
|
4
4
|
var SqliteDatabase = class {
|
|
5
|
+
db;
|
|
5
6
|
constructor(db) {
|
|
6
7
|
this.db = db;
|
|
7
8
|
}
|
|
@@ -16,6 +17,7 @@ var SqliteDatabase = class {
|
|
|
16
17
|
}
|
|
17
18
|
};
|
|
18
19
|
var SqliteStatement = class {
|
|
20
|
+
stmt;
|
|
19
21
|
constructor(stmt) {
|
|
20
22
|
this.stmt = stmt;
|
|
21
23
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@fedify/sqlite",
|
|
3
|
-
"version": "2.3.0-
|
|
3
|
+
"version": "2.3.0-pr.809.36+c592d116",
|
|
4
4
|
"description": "SQLite drivers for Fedify",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"fedify",
|
|
@@ -68,17 +68,17 @@
|
|
|
68
68
|
},
|
|
69
69
|
"dependencies": {
|
|
70
70
|
"@js-temporal/polyfill": "^0.5.1",
|
|
71
|
-
"@logtape/logtape": "^2.0
|
|
72
|
-
"es-toolkit": "^1.
|
|
71
|
+
"@logtape/logtape": "^2.1.0",
|
|
72
|
+
"es-toolkit": "^1.46.1"
|
|
73
73
|
},
|
|
74
74
|
"peerDependencies": {
|
|
75
|
-
"@fedify/fedify": "^2.3.0-
|
|
75
|
+
"@fedify/fedify": "^2.3.0-pr.809.36+c592d116"
|
|
76
76
|
},
|
|
77
77
|
"devDependencies": {
|
|
78
78
|
"@std/async": "npm:@jsr/std__async@^1.0.13",
|
|
79
|
-
"tsdown": "^0.
|
|
80
|
-
"typescript": "^
|
|
81
|
-
"@fedify/testing": "^2.3.0-
|
|
79
|
+
"tsdown": "^0.22.0",
|
|
80
|
+
"typescript": "^6.0.0",
|
|
81
|
+
"@fedify/testing": "^2.3.0-pr.809.36+c592d116"
|
|
82
82
|
},
|
|
83
83
|
"scripts": {
|
|
84
84
|
"build:self": "tsdown",
|
package/src/mq.test.ts
CHANGED
|
@@ -2,10 +2,14 @@ import { PlatformDatabase } from "#sqlite";
|
|
|
2
2
|
import { test } from "@fedify/fixture";
|
|
3
3
|
import { SqliteMessageQueue } from "@fedify/sqlite/mq";
|
|
4
4
|
import { getRandomKey, testMessageQueue } from "@fedify/testing";
|
|
5
|
+
import * as temporal from "@js-temporal/polyfill";
|
|
6
|
+
import assert from "node:assert/strict";
|
|
5
7
|
import { mkdtemp } from "node:fs/promises";
|
|
6
8
|
import { tmpdir } from "node:os";
|
|
7
9
|
import { join } from "node:path";
|
|
8
10
|
|
|
11
|
+
const Temporal = globalThis.Temporal ?? temporal.Temporal;
|
|
12
|
+
|
|
9
13
|
const dbDir = await mkdtemp(join(tmpdir(), "fedify-sqlite-"));
|
|
10
14
|
const dbPath = join(dbDir, `${getRandomKey("sqlite")}.db`);
|
|
11
15
|
const db = new PlatformDatabase(dbPath);
|
|
@@ -22,3 +26,29 @@ test("SqliteMessageQueue", () =>
|
|
|
22
26
|
},
|
|
23
27
|
{ testOrderingKey: true },
|
|
24
28
|
));
|
|
29
|
+
|
|
30
|
+
test("SqliteMessageQueue.getDepth()", async () => {
|
|
31
|
+
const dbPath = join(dbDir, `${getRandomKey("sqlite_depth")}.db`);
|
|
32
|
+
const db = new PlatformDatabase(dbPath);
|
|
33
|
+
const tableName = getRandomKey("message_depth").replaceAll("-", "_");
|
|
34
|
+
const mq = new SqliteMessageQueue(db, { tableName });
|
|
35
|
+
try {
|
|
36
|
+
assert.deepStrictEqual(await mq.getDepth(), {
|
|
37
|
+
queued: 0,
|
|
38
|
+
ready: 0,
|
|
39
|
+
delayed: 0,
|
|
40
|
+
});
|
|
41
|
+
await mq.enqueue("ready");
|
|
42
|
+
await mq.enqueue("delayed", {
|
|
43
|
+
delay: Temporal.Duration.from({ hours: 1 }),
|
|
44
|
+
});
|
|
45
|
+
assert.deepStrictEqual(await mq.getDepth(), {
|
|
46
|
+
queued: 2,
|
|
47
|
+
ready: 1,
|
|
48
|
+
delayed: 1,
|
|
49
|
+
});
|
|
50
|
+
} finally {
|
|
51
|
+
mq.drop();
|
|
52
|
+
mq[Symbol.dispose]();
|
|
53
|
+
}
|
|
54
|
+
});
|
package/src/mq.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { type PlatformDatabase, SqliteDatabase } from "#sqlite";
|
|
2
2
|
import type {
|
|
3
3
|
MessageQueue,
|
|
4
|
+
MessageQueueDepth,
|
|
4
5
|
MessageQueueEnqueueOptions,
|
|
5
6
|
MessageQueueListenOptions,
|
|
6
7
|
} from "@fedify/fedify";
|
|
@@ -260,6 +261,29 @@ export class SqliteMessageQueue implements MessageQueue, Disposable {
|
|
|
260
261
|
});
|
|
261
262
|
}
|
|
262
263
|
|
|
264
|
+
/**
|
|
265
|
+
* {@inheritDoc MessageQueue.getDepth}
|
|
266
|
+
*/
|
|
267
|
+
async getDepth(): Promise<MessageQueueDepth> {
|
|
268
|
+
this.initialize();
|
|
269
|
+
const row = await this.#retryOnBusy(() => {
|
|
270
|
+
const now = Temporal.Now.instant().epochMilliseconds;
|
|
271
|
+
return this.#db
|
|
272
|
+
.prepare(
|
|
273
|
+
`SELECT
|
|
274
|
+
COUNT(*) AS queued,
|
|
275
|
+
COALESCE(SUM(CASE WHEN scheduled <= ? THEN 1 ELSE 0 END), 0) AS ready
|
|
276
|
+
FROM "${this.#tableName}"`,
|
|
277
|
+
)
|
|
278
|
+
.get(now) as { queued: number; ready: number };
|
|
279
|
+
});
|
|
280
|
+
return {
|
|
281
|
+
queued: row.queued,
|
|
282
|
+
ready: row.ready,
|
|
283
|
+
delayed: Math.max(0, row.queued - row.ready),
|
|
284
|
+
};
|
|
285
|
+
}
|
|
286
|
+
|
|
263
287
|
/**
|
|
264
288
|
* {@inheritDoc MessageQueue.listen}
|
|
265
289
|
*/
|
package/tsdown.config.ts
CHANGED
|
@@ -29,16 +29,13 @@ export default defineConfig({
|
|
|
29
29
|
defaultHandler(warning);
|
|
30
30
|
},
|
|
31
31
|
},
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
`;
|
|
41
|
-
}
|
|
42
|
-
return outputOptions;
|
|
32
|
+
banner({ format }) {
|
|
33
|
+
const js = format === "cjs"
|
|
34
|
+
? `const { Temporal } = require("@js-temporal/polyfill");`
|
|
35
|
+
: `import { Temporal } from "@js-temporal/polyfill";`;
|
|
36
|
+
return {
|
|
37
|
+
js,
|
|
38
|
+
dts: `/// <reference lib="esnext.temporal" />`,
|
|
39
|
+
};
|
|
43
40
|
},
|
|
44
41
|
});
|