@krantho/persistence-sqlite 0.0.0-stage → 1.0.0
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/LICENSE +21 -0
- package/dist/auth-adapter.d.ts +23 -0
- package/dist/auth-adapter.d.ts.map +1 -0
- package/dist/auth-adapter.js +159 -0
- package/dist/auth-adapter.js.map +1 -0
- package/dist/checkpoints.d.ts +20 -0
- package/dist/checkpoints.d.ts.map +1 -0
- package/dist/checkpoints.js +119 -0
- package/dist/checkpoints.js.map +1 -0
- package/dist/connection.d.ts +29 -0
- package/dist/connection.d.ts.map +1 -0
- package/dist/connection.js +77 -0
- package/dist/connection.js.map +1 -0
- package/dist/content-migration.d.ts +18 -0
- package/dist/content-migration.d.ts.map +1 -0
- package/dist/content-migration.js +68 -0
- package/dist/content-migration.js.map +1 -0
- package/dist/content-query.d.ts +16 -0
- package/dist/content-query.d.ts.map +1 -0
- package/dist/content-query.js +155 -0
- package/dist/content-query.js.map +1 -0
- package/dist/index.d.ts +20 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +16 -0
- package/dist/index.js.map +1 -0
- package/dist/lock-adapter.d.ts +11 -0
- package/dist/lock-adapter.d.ts.map +1 -0
- package/dist/lock-adapter.js +63 -0
- package/dist/lock-adapter.js.map +1 -0
- package/dist/media-adapter.d.ts +27 -0
- package/dist/media-adapter.d.ts.map +1 -0
- package/dist/media-adapter.js +175 -0
- package/dist/media-adapter.js.map +1 -0
- package/dist/media-folder-adapter.d.ts +13 -0
- package/dist/media-folder-adapter.d.ts.map +1 -0
- package/dist/media-folder-adapter.js +58 -0
- package/dist/media-folder-adapter.js.map +1 -0
- package/dist/migration-runner.d.ts +28 -0
- package/dist/migration-runner.d.ts.map +1 -0
- package/dist/migration-runner.js +109 -0
- package/dist/migration-runner.js.map +1 -0
- package/dist/migrations/index.d.ts +4 -0
- package/dist/migrations/index.d.ts.map +1 -0
- package/dist/migrations/index.js +32 -0
- package/dist/migrations/index.js.map +1 -0
- package/dist/migrations/v001-initial-schema.d.ts +10 -0
- package/dist/migrations/v001-initial-schema.d.ts.map +1 -0
- package/dist/migrations/v001-initial-schema.js +94 -0
- package/dist/migrations/v001-initial-schema.js.map +1 -0
- package/dist/migrations/v002-auth-tables.d.ts +9 -0
- package/dist/migrations/v002-auth-tables.d.ts.map +1 -0
- package/dist/migrations/v002-auth-tables.js +38 -0
- package/dist/migrations/v002-auth-tables.js.map +1 -0
- package/dist/migrations/v003-user-permissions.d.ts +9 -0
- package/dist/migrations/v003-user-permissions.d.ts.map +1 -0
- package/dist/migrations/v003-user-permissions.js +21 -0
- package/dist/migrations/v003-user-permissions.js.map +1 -0
- package/dist/migrations/v004-media-hotspot.d.ts +14 -0
- package/dist/migrations/v004-media-hotspot.d.ts.map +1 -0
- package/dist/migrations/v004-media-hotspot.js +24 -0
- package/dist/migrations/v004-media-hotspot.js.map +1 -0
- package/dist/migrations/v005-content-locks.d.ts +9 -0
- package/dist/migrations/v005-content-locks.d.ts.map +1 -0
- package/dist/migrations/v005-content-locks.js +24 -0
- package/dist/migrations/v005-content-locks.js.map +1 -0
- package/dist/migrations/v006-webhook-deliveries.d.ts +6 -0
- package/dist/migrations/v006-webhook-deliveries.d.ts.map +1 -0
- package/dist/migrations/v006-webhook-deliveries.js +24 -0
- package/dist/migrations/v006-webhook-deliveries.js.map +1 -0
- package/dist/migrations/v007-media-folders.d.ts +10 -0
- package/dist/migrations/v007-media-folders.d.ts.map +1 -0
- package/dist/migrations/v007-media-folders.js +23 -0
- package/dist/migrations/v007-media-folders.js.map +1 -0
- package/dist/migrations/v008-site-settings.d.ts +9 -0
- package/dist/migrations/v008-site-settings.d.ts.map +1 -0
- package/dist/migrations/v008-site-settings.js +20 -0
- package/dist/migrations/v008-site-settings.js.map +1 -0
- package/dist/migrations/v009-seo-config.d.ts +15 -0
- package/dist/migrations/v009-seo-config.d.ts.map +1 -0
- package/dist/migrations/v009-seo-config.js +29 -0
- package/dist/migrations/v009-seo-config.js.map +1 -0
- package/dist/migrations/v010-content-live-version.d.ts +15 -0
- package/dist/migrations/v010-content-live-version.d.ts.map +1 -0
- package/dist/migrations/v010-content-live-version.js +40 -0
- package/dist/migrations/v010-content-live-version.js.map +1 -0
- package/dist/migrations/v011-media.d.ts +12 -0
- package/dist/migrations/v011-media.d.ts.map +1 -0
- package/dist/migrations/v011-media.js +43 -0
- package/dist/migrations/v011-media.js.map +1 -0
- package/dist/migrations/v012-page-cache.d.ts +12 -0
- package/dist/migrations/v012-page-cache.d.ts.map +1 -0
- package/dist/migrations/v012-page-cache.js +31 -0
- package/dist/migrations/v012-page-cache.js.map +1 -0
- package/dist/migrations/v013-content-contracts.d.ts +17 -0
- package/dist/migrations/v013-content-contracts.d.ts.map +1 -0
- package/dist/migrations/v013-content-contracts.js +46 -0
- package/dist/migrations/v013-content-contracts.js.map +1 -0
- package/dist/migrations/v014-content-manifest-commit.d.ts +7 -0
- package/dist/migrations/v014-content-manifest-commit.d.ts.map +1 -0
- package/dist/migrations/v014-content-manifest-commit.js +12 -0
- package/dist/migrations/v014-content-manifest-commit.js.map +1 -0
- package/dist/page-cache-store.d.ts +17 -0
- package/dist/page-cache-store.d.ts.map +1 -0
- package/dist/page-cache-store.js +76 -0
- package/dist/page-cache-store.js.map +1 -0
- package/dist/queries.d.ts +82 -0
- package/dist/queries.d.ts.map +1 -0
- package/dist/queries.js +25 -0
- package/dist/queries.js.map +1 -0
- package/dist/retention-adapter.d.ts +13 -0
- package/dist/retention-adapter.d.ts.map +1 -0
- package/dist/retention-adapter.js +62 -0
- package/dist/retention-adapter.js.map +1 -0
- package/dist/row-mapping.d.ts +14 -0
- package/dist/row-mapping.d.ts.map +1 -0
- package/dist/row-mapping.js +71 -0
- package/dist/row-mapping.js.map +1 -0
- package/dist/seo-config-adapter.d.ts +14 -0
- package/dist/seo-config-adapter.d.ts.map +1 -0
- package/dist/seo-config-adapter.js +57 -0
- package/dist/seo-config-adapter.js.map +1 -0
- package/dist/site-settings-adapter.d.ts +10 -0
- package/dist/site-settings-adapter.d.ts.map +1 -0
- package/dist/site-settings-adapter.js +27 -0
- package/dist/site-settings-adapter.js.map +1 -0
- package/dist/sqlite-adapter.d.ts +69 -0
- package/dist/sqlite-adapter.d.ts.map +1 -0
- package/dist/sqlite-adapter.js +242 -0
- package/dist/sqlite-adapter.js.map +1 -0
- package/dist/webhook-delivery-adapter.d.ts +27 -0
- package/dist/webhook-delivery-adapter.d.ts.map +1 -0
- package/dist/webhook-delivery-adapter.js +93 -0
- package/dist/webhook-delivery-adapter.js.map +1 -0
- package/package.json +37 -3
- package/README.md +0 -3
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
import { MAX_WEBHOOK_ATTEMPTS } from '@krantho/persistence';
|
|
2
|
+
/** A delivery is failed when it was never delivered and has used every attempt */
|
|
3
|
+
const FAILED = `delivered_at IS NULL AND attempts >= ${MAX_WEBHOOK_ATTEMPTS}`;
|
|
4
|
+
function toRecord(row) {
|
|
5
|
+
return {
|
|
6
|
+
id: row.id,
|
|
7
|
+
url: row.webhook_url,
|
|
8
|
+
event: row.event,
|
|
9
|
+
status: row.status,
|
|
10
|
+
attempts: row.attempts,
|
|
11
|
+
nextRetryAt: row.next_retry_at,
|
|
12
|
+
createdAt: row.created_at,
|
|
13
|
+
deliveredAt: row.delivered_at,
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
/** SQLite implementation of webhook delivery log */
|
|
17
|
+
export class SqliteWebhookDeliveryAdapter {
|
|
18
|
+
db;
|
|
19
|
+
constructor(db) {
|
|
20
|
+
this.db = db;
|
|
21
|
+
}
|
|
22
|
+
async listDeliveries(options) {
|
|
23
|
+
let where = '1=1';
|
|
24
|
+
if (options.status === 'pending') {
|
|
25
|
+
where = `delivered_at IS NULL AND attempts < ${MAX_WEBHOOK_ATTEMPTS}`;
|
|
26
|
+
}
|
|
27
|
+
else if (options.status === 'delivered') {
|
|
28
|
+
where = 'delivered_at IS NOT NULL';
|
|
29
|
+
}
|
|
30
|
+
else if (options.status === 'failed') {
|
|
31
|
+
where = FAILED;
|
|
32
|
+
}
|
|
33
|
+
const countRow = this.db
|
|
34
|
+
.prepare(`SELECT COUNT(*) as count FROM webhook_deliveries WHERE ${where}`)
|
|
35
|
+
.get();
|
|
36
|
+
const rows = this.db
|
|
37
|
+
.prepare(`SELECT * FROM webhook_deliveries WHERE ${where} ORDER BY created_at DESC LIMIT ? OFFSET ?`)
|
|
38
|
+
.all(options.limit, options.offset);
|
|
39
|
+
return { deliveries: rows.map(toRecord), total: countRow.count };
|
|
40
|
+
}
|
|
41
|
+
async getDelivery(id) {
|
|
42
|
+
const row = this.row(id);
|
|
43
|
+
return row ? { ...toRecord(row), payload: row.payload } : null;
|
|
44
|
+
}
|
|
45
|
+
async requeueDelivery(id, dueAt) {
|
|
46
|
+
const result = this.db
|
|
47
|
+
.prepare(`UPDATE webhook_deliveries SET attempts = ?, next_retry_at = ? WHERE id = ? AND ${FAILED}`)
|
|
48
|
+
.run(MAX_WEBHOOK_ATTEMPTS - 1, dueAt.toISOString(), id);
|
|
49
|
+
if (result.changes === 0)
|
|
50
|
+
return null;
|
|
51
|
+
const row = this.row(id);
|
|
52
|
+
return row ? toRecord(row) : null;
|
|
53
|
+
}
|
|
54
|
+
async logDelivery(delivery) {
|
|
55
|
+
const row = this.db
|
|
56
|
+
.prepare(`INSERT INTO webhook_deliveries (webhook_url, event, payload, attempts, next_retry_at)
|
|
57
|
+
VALUES (?, ?, ?, 1, ?) RETURNING id`)
|
|
58
|
+
.get(delivery.url, delivery.event, delivery.payload, delivery.retryAt.toISOString());
|
|
59
|
+
return row.id;
|
|
60
|
+
}
|
|
61
|
+
async markDelivered(id, status) {
|
|
62
|
+
this.db
|
|
63
|
+
.prepare("UPDATE webhook_deliveries SET status = ?, delivered_at = datetime('now') WHERE id = ?")
|
|
64
|
+
.run(status, id);
|
|
65
|
+
}
|
|
66
|
+
async markFailed(id, status, nextRetryAt) {
|
|
67
|
+
this.db
|
|
68
|
+
.prepare('UPDATE webhook_deliveries SET status = ?, attempts = attempts + 1, next_retry_at = ? WHERE id = ?')
|
|
69
|
+
.run(status, nextRetryAt.toISOString(), id);
|
|
70
|
+
}
|
|
71
|
+
async claimDueDeliveries(options) {
|
|
72
|
+
if (options.urls.length === 0)
|
|
73
|
+
return [];
|
|
74
|
+
// next_retry_at holds ISO timestamps, which order as text; one statement claims the rows
|
|
75
|
+
const rows = this.db
|
|
76
|
+
.prepare(`UPDATE webhook_deliveries SET next_retry_at = ?
|
|
77
|
+
WHERE id IN (
|
|
78
|
+
SELECT id FROM webhook_deliveries
|
|
79
|
+
WHERE delivered_at IS NULL AND attempts < ? AND (next_retry_at IS NULL OR next_retry_at <= ?)
|
|
80
|
+
AND webhook_url IN (${options.urls.map(() => '?').join(', ')})
|
|
81
|
+
ORDER BY created_at, id LIMIT ?
|
|
82
|
+
)
|
|
83
|
+
RETURNING *`)
|
|
84
|
+
.all(options.leaseUntil.toISOString(), MAX_WEBHOOK_ATTEMPTS, options.now.toISOString(), ...options.urls, options.limit);
|
|
85
|
+
return rows
|
|
86
|
+
.sort((a, b) => a.created_at.localeCompare(b.created_at) || a.id - b.id)
|
|
87
|
+
.map((row) => ({ ...toRecord(row), payload: row.payload }));
|
|
88
|
+
}
|
|
89
|
+
row(id) {
|
|
90
|
+
return this.db.prepare('SELECT * FROM webhook_deliveries WHERE id = ?').get(id);
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
//# sourceMappingURL=webhook-delivery-adapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"webhook-delivery-adapter.js","sourceRoot":"","sources":["../src/webhook-delivery-adapter.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAA;AAc3D,kFAAkF;AAClF,MAAM,MAAM,GAAG,wCAAwC,oBAAoB,EAAE,CAAA;AAE7E,SAAS,QAAQ,CAAC,GAAgB;IAChC,OAAO;QACL,EAAE,EAAE,GAAG,CAAC,EAAE;QACV,GAAG,EAAE,GAAG,CAAC,WAAW;QACpB,KAAK,EAAE,GAAG,CAAC,KAAK;QAChB,MAAM,EAAE,GAAG,CAAC,MAAM;QAClB,QAAQ,EAAE,GAAG,CAAC,QAAQ;QACtB,WAAW,EAAE,GAAG,CAAC,aAAa;QAC9B,SAAS,EAAE,GAAG,CAAC,UAAU;QACzB,WAAW,EAAE,GAAG,CAAC,YAAY;KAC9B,CAAA;AACH,CAAC;AAED,oDAAoD;AACpD,MAAM,OAAO,4BAA4B;IACtB,EAAE,CAAmC;IAEtD,YAAY,EAAqC;QAC/C,IAAI,CAAC,EAAE,GAAG,EAAE,CAAA;IACd,CAAC;IAED,KAAK,CAAC,cAAc,CAAC,OAIpB;QACC,IAAI,KAAK,GAAG,KAAK,CAAA;QAEjB,IAAI,OAAO,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;YACjC,KAAK,GAAG,uCAAuC,oBAAoB,EAAE,CAAA;QACvE,CAAC;aAAM,IAAI,OAAO,CAAC,MAAM,KAAK,WAAW,EAAE,CAAC;YAC1C,KAAK,GAAG,0BAA0B,CAAA;QACpC,CAAC;aAAM,IAAI,OAAO,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;YACvC,KAAK,GAAG,MAAM,CAAA;QAChB,CAAC;QAED,MAAM,QAAQ,GAAG,IAAI,CAAC,EAAE;aACrB,OAAO,CAAC,0DAA0D,KAAK,EAAE,CAAC;aAC1E,GAAG,EAAuB,CAAA;QAE7B,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE;aACjB,OAAO,CACN,0CAA0C,KAAK,4CAA4C,CAC5F;aACA,GAAG,CAAC,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC,MAAM,CAAkB,CAAA;QAEtD,OAAO,EAAE,UAAU,EAAE,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,KAAK,EAAE,QAAQ,CAAC,KAAK,EAAE,CAAA;IAClE,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,EAAU;QAC1B,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;QACxB,OAAO,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,QAAQ,CAAC,GAAG,CAAC,EAAE,OAAO,EAAE,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,IAAI,CAAA;IAChE,CAAC;IAED,KAAK,CAAC,eAAe,CAAC,EAAU,EAAE,KAAW;QAC3C,MAAM,MAAM,GAAG,IAAI,CAAC,EAAE;aACnB,OAAO,CACN,kFAAkF,MAAM,EAAE,CAC3F;aACA,GAAG,CAAC,oBAAoB,GAAG,CAAC,EAAE,KAAK,CAAC,WAAW,EAAE,EAAE,EAAE,CAAC,CAAA;QACzD,IAAI,MAAM,CAAC,OAAO,KAAK,CAAC;YAAE,OAAO,IAAI,CAAA;QACrC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;QACxB,OAAO,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAA;IACnC,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,QAA4B;QAC5C,MAAM,GAAG,GAAG,IAAI,CAAC,EAAE;aAChB,OAAO,CACN;6CACqC,CACtC;aACA,GAAG,CAAC,QAAQ,CAAC,GAAG,EAAE,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,OAAO,CAAC,WAAW,EAAE,CAEpF,CAAA;QACD,OAAO,GAAG,CAAC,EAAE,CAAA;IACf,CAAC;IAED,KAAK,CAAC,aAAa,CAAC,EAAU,EAAE,MAAc;QAC5C,IAAI,CAAC,EAAE;aACJ,OAAO,CACN,uFAAuF,CACxF;aACA,GAAG,CAAC,MAAM,EAAE,EAAE,CAAC,CAAA;IACpB,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,EAAU,EAAE,MAAc,EAAE,WAAiB;QAC5D,IAAI,CAAC,EAAE;aACJ,OAAO,CACN,mGAAmG,CACpG;aACA,GAAG,CAAC,MAAM,EAAE,WAAW,CAAC,WAAW,EAAE,EAAE,EAAE,CAAC,CAAA;IAC/C,CAAC;IAED,KAAK,CAAC,kBAAkB,CAAC,OAKxB;QACC,IAAI,OAAO,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,EAAE,CAAA;QACxC,yFAAyF;QACzF,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE;aACjB,OAAO,CACN;;;;mCAI2B,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;;;qBAGpD,CACd;aACA,GAAG,CACF,OAAO,CAAC,UAAU,CAAC,WAAW,EAAE,EAChC,oBAAoB,EACpB,OAAO,CAAC,GAAG,CAAC,WAAW,EAAE,EACzB,GAAG,OAAO,CAAC,IAAI,EACf,OAAO,CAAC,KAAK,CACG,CAAA;QACpB,OAAO,IAAI;aACR,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE,CAAC;aACvE,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,QAAQ,CAAC,GAAG,CAAC,EAAE,OAAO,EAAE,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,CAAA;IAC/D,CAAC;IAEO,GAAG,CAAC,EAAU;QACpB,OAAO,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,+CAA+C,CAAC,CAAC,GAAG,CAAC,EAAE,CAEjE,CAAA;IACf,CAAC;CACF"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,40 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@krantho/persistence-sqlite",
|
|
3
|
-
"version": "
|
|
4
|
-
"
|
|
5
|
-
"
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"license": "MIT",
|
|
5
|
+
"homepage": "https://krantho.com",
|
|
6
|
+
"repository": {
|
|
7
|
+
"type": "git",
|
|
8
|
+
"url": "git+https://github.com/descoped/krantho.git",
|
|
9
|
+
"directory": "packages/persistence-sqlite"
|
|
10
|
+
},
|
|
11
|
+
"bugs": {
|
|
12
|
+
"url": "https://github.com/descoped/krantho/issues"
|
|
13
|
+
},
|
|
14
|
+
"type": "module",
|
|
15
|
+
"exports": {
|
|
16
|
+
".": {
|
|
17
|
+
"types": "./dist/index.d.ts",
|
|
18
|
+
"import": "./dist/index.js"
|
|
19
|
+
}
|
|
20
|
+
},
|
|
21
|
+
"files": [
|
|
22
|
+
"dist"
|
|
23
|
+
],
|
|
24
|
+
"dependencies": {
|
|
25
|
+
"better-sqlite3": "^12.11.1",
|
|
26
|
+
"@krantho/core": "1.0.0",
|
|
27
|
+
"@krantho/persistence": "1.0.0",
|
|
28
|
+
"@krantho/seo-shared": "1.0.0"
|
|
29
|
+
},
|
|
30
|
+
"devDependencies": {
|
|
31
|
+
"@types/better-sqlite3": "^7.6.13",
|
|
32
|
+
"@types/node": "^25.9.9",
|
|
33
|
+
"typescript": "^6.0.3"
|
|
34
|
+
},
|
|
35
|
+
"scripts": {
|
|
36
|
+
"build": "tsc",
|
|
37
|
+
"typecheck": "tsc --noEmit",
|
|
38
|
+
"clean": "rm -rf dist"
|
|
39
|
+
}
|
|
6
40
|
}
|
package/README.md
DELETED