@fedify/sqlite 2.3.0-dev.994 → 2.3.0-pr.809.37

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 CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fedify/sqlite",
3
- "version": "2.3.0-dev.994+9071ca0a",
3
+ "version": "2.3.0-pr.809.37+0574ba5c",
4
4
  "license": "MIT",
5
5
  "exports": {
6
6
  ".": "./src/mod.ts",
@@ -1,3 +1,4 @@
1
+ /// <reference lib="esnext.temporal" />
1
2
  //#region src/adapter.d.ts
2
3
  /**
3
4
  * SQLite database adapter.
package/dist/adapter.d.ts CHANGED
@@ -1,5 +1,4 @@
1
- import { Temporal } from "@js-temporal/polyfill";
2
-
1
+ /// <reference lib="esnext.temporal" />
3
2
  //#region src/adapter.d.ts
4
3
  /**
5
4
  * SQLite database adapter.
package/dist/kv.cjs CHANGED
@@ -26,6 +26,8 @@ const logger = (0, _logtape_logtape.getLogger)([
26
26
  * ```
27
27
  */
28
28
  var SqliteKvStore = class SqliteKvStore {
29
+ db;
30
+ options;
29
31
  static #defaultTableName = "fedify_kv";
30
32
  static #tableNameRegex = /^[A-Za-z_][A-Za-z0-9_]{0,63}$/;
31
33
  #db;
package/dist/kv.d.cts CHANGED
@@ -1,3 +1,4 @@
1
+ /// <reference lib="esnext.temporal" />
1
2
  import { PlatformDatabase } from "#sqlite";
2
3
  import { KvKey, KvStore, KvStoreListEntry, KvStoreSetOptions } from "@fedify/fedify";
3
4
 
package/dist/kv.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { Temporal } from "@js-temporal/polyfill";
1
+ /// <reference lib="esnext.temporal" />
2
2
  import { PlatformDatabase } from "#sqlite";
3
3
  import { KvKey, KvStore, KvStoreListEntry, KvStoreSetOptions } from "@fedify/fedify";
4
4
 
package/dist/kv.js CHANGED
@@ -25,6 +25,8 @@ const logger = getLogger([
25
25
  * ```
26
26
  */
27
27
  var SqliteKvStore = class SqliteKvStore {
28
+ db;
29
+ options;
28
30
  static #defaultTableName = "fedify_kv";
29
31
  static #tableNameRegex = /^[A-Za-z_][A-Za-z0-9_]{0,63}$/;
30
32
  #db;
package/dist/mod.d.cts CHANGED
@@ -1,3 +1,4 @@
1
+ /// <reference lib="esnext.temporal" />
1
2
  import { SqliteKvStore } from "./kv.cjs";
2
3
  import { SqliteMessageQueue } from "./mq.cjs";
3
4
  export { SqliteKvStore, SqliteMessageQueue };
package/dist/mod.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { Temporal } from "@js-temporal/polyfill";
1
+ /// <reference lib="esnext.temporal" />
2
2
  import { SqliteKvStore } from "./kv.js";
3
3
  import { SqliteMessageQueue } from "./mq.js";
4
4
  export { SqliteKvStore, SqliteMessageQueue };
package/dist/mod.js CHANGED
@@ -1,4 +1,4 @@
1
- import "@js-temporal/polyfill";
1
+ import { Temporal } from "@js-temporal/polyfill";
2
2
  import { SqliteKvStore } from "./kv.js";
3
3
  import { SqliteMessageQueue } from "./mq.js";
4
4
  export { SqliteKvStore, SqliteMessageQueue };
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
- import { Temporal } from "@js-temporal/polyfill";
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) {
@@ -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
  }
@@ -1,3 +1,4 @@
1
+ /// <reference lib="esnext.temporal" />
1
2
  import { SqliteDatabaseAdapter, SqliteStatementAdapter } from "./adapter.cjs";
2
3
  import { Database, Statement } from "bun:sqlite";
3
4
 
@@ -1,4 +1,4 @@
1
- import { Temporal } from "@js-temporal/polyfill";
1
+ /// <reference lib="esnext.temporal" />
2
2
  import { SqliteDatabaseAdapter, SqliteStatementAdapter } from "./adapter.js";
3
3
  import { Database, Statement } from "bun:sqlite";
4
4
 
@@ -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
  }
@@ -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
  }
@@ -1,3 +1,4 @@
1
+ /// <reference lib="esnext.temporal" />
1
2
  import { SqliteDatabaseAdapter, SqliteStatementAdapter } from "./adapter.cjs";
2
3
  import { DatabaseSync, StatementSync } from "node:sqlite";
3
4
 
@@ -1,4 +1,4 @@
1
- import { Temporal } from "@js-temporal/polyfill";
1
+ /// <reference lib="esnext.temporal" />
2
2
  import { SqliteDatabaseAdapter, SqliteStatementAdapter } from "./adapter.js";
3
3
  import { DatabaseSync, StatementSync } from "node:sqlite";
4
4
 
@@ -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-dev.994+9071ca0a",
3
+ "version": "2.3.0-pr.809.37+0574ba5c",
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.5",
72
- "es-toolkit": "^1.31.0"
71
+ "@logtape/logtape": "^2.1.0",
72
+ "es-toolkit": "^1.46.1"
73
73
  },
74
74
  "peerDependencies": {
75
- "@fedify/fedify": "^2.3.0-dev.994+9071ca0a"
75
+ "@fedify/fedify": "^2.3.0-pr.809.37+0574ba5c"
76
76
  },
77
77
  "devDependencies": {
78
78
  "@std/async": "npm:@jsr/std__async@^1.0.13",
79
- "tsdown": "^0.21.6",
80
- "typescript": "^5.9.2",
81
- "@fedify/testing": "^2.3.0-dev.994+9071ca0a"
79
+ "tsdown": "^0.22.0",
80
+ "typescript": "^6.0.0",
81
+ "@fedify/testing": "^2.3.0-pr.809.37+0574ba5c"
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
- outputOptions(outputOptions, format) {
33
- if (format === "cjs") {
34
- outputOptions.intro = `
35
- const { Temporal } = require("@js-temporal/polyfill");
36
- `;
37
- } else {
38
- outputOptions.intro = `
39
- import { Temporal } from "@js-temporal/polyfill";
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
  });