@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.
Files changed (135) hide show
  1. package/LICENSE +21 -0
  2. package/dist/auth-adapter.d.ts +23 -0
  3. package/dist/auth-adapter.d.ts.map +1 -0
  4. package/dist/auth-adapter.js +159 -0
  5. package/dist/auth-adapter.js.map +1 -0
  6. package/dist/checkpoints.d.ts +20 -0
  7. package/dist/checkpoints.d.ts.map +1 -0
  8. package/dist/checkpoints.js +119 -0
  9. package/dist/checkpoints.js.map +1 -0
  10. package/dist/connection.d.ts +29 -0
  11. package/dist/connection.d.ts.map +1 -0
  12. package/dist/connection.js +77 -0
  13. package/dist/connection.js.map +1 -0
  14. package/dist/content-migration.d.ts +18 -0
  15. package/dist/content-migration.d.ts.map +1 -0
  16. package/dist/content-migration.js +68 -0
  17. package/dist/content-migration.js.map +1 -0
  18. package/dist/content-query.d.ts +16 -0
  19. package/dist/content-query.d.ts.map +1 -0
  20. package/dist/content-query.js +155 -0
  21. package/dist/content-query.js.map +1 -0
  22. package/dist/index.d.ts +20 -0
  23. package/dist/index.d.ts.map +1 -0
  24. package/dist/index.js +16 -0
  25. package/dist/index.js.map +1 -0
  26. package/dist/lock-adapter.d.ts +11 -0
  27. package/dist/lock-adapter.d.ts.map +1 -0
  28. package/dist/lock-adapter.js +63 -0
  29. package/dist/lock-adapter.js.map +1 -0
  30. package/dist/media-adapter.d.ts +27 -0
  31. package/dist/media-adapter.d.ts.map +1 -0
  32. package/dist/media-adapter.js +175 -0
  33. package/dist/media-adapter.js.map +1 -0
  34. package/dist/media-folder-adapter.d.ts +13 -0
  35. package/dist/media-folder-adapter.d.ts.map +1 -0
  36. package/dist/media-folder-adapter.js +58 -0
  37. package/dist/media-folder-adapter.js.map +1 -0
  38. package/dist/migration-runner.d.ts +28 -0
  39. package/dist/migration-runner.d.ts.map +1 -0
  40. package/dist/migration-runner.js +109 -0
  41. package/dist/migration-runner.js.map +1 -0
  42. package/dist/migrations/index.d.ts +4 -0
  43. package/dist/migrations/index.d.ts.map +1 -0
  44. package/dist/migrations/index.js +32 -0
  45. package/dist/migrations/index.js.map +1 -0
  46. package/dist/migrations/v001-initial-schema.d.ts +10 -0
  47. package/dist/migrations/v001-initial-schema.d.ts.map +1 -0
  48. package/dist/migrations/v001-initial-schema.js +94 -0
  49. package/dist/migrations/v001-initial-schema.js.map +1 -0
  50. package/dist/migrations/v002-auth-tables.d.ts +9 -0
  51. package/dist/migrations/v002-auth-tables.d.ts.map +1 -0
  52. package/dist/migrations/v002-auth-tables.js +38 -0
  53. package/dist/migrations/v002-auth-tables.js.map +1 -0
  54. package/dist/migrations/v003-user-permissions.d.ts +9 -0
  55. package/dist/migrations/v003-user-permissions.d.ts.map +1 -0
  56. package/dist/migrations/v003-user-permissions.js +21 -0
  57. package/dist/migrations/v003-user-permissions.js.map +1 -0
  58. package/dist/migrations/v004-media-hotspot.d.ts +14 -0
  59. package/dist/migrations/v004-media-hotspot.d.ts.map +1 -0
  60. package/dist/migrations/v004-media-hotspot.js +24 -0
  61. package/dist/migrations/v004-media-hotspot.js.map +1 -0
  62. package/dist/migrations/v005-content-locks.d.ts +9 -0
  63. package/dist/migrations/v005-content-locks.d.ts.map +1 -0
  64. package/dist/migrations/v005-content-locks.js +24 -0
  65. package/dist/migrations/v005-content-locks.js.map +1 -0
  66. package/dist/migrations/v006-webhook-deliveries.d.ts +6 -0
  67. package/dist/migrations/v006-webhook-deliveries.d.ts.map +1 -0
  68. package/dist/migrations/v006-webhook-deliveries.js +24 -0
  69. package/dist/migrations/v006-webhook-deliveries.js.map +1 -0
  70. package/dist/migrations/v007-media-folders.d.ts +10 -0
  71. package/dist/migrations/v007-media-folders.d.ts.map +1 -0
  72. package/dist/migrations/v007-media-folders.js +23 -0
  73. package/dist/migrations/v007-media-folders.js.map +1 -0
  74. package/dist/migrations/v008-site-settings.d.ts +9 -0
  75. package/dist/migrations/v008-site-settings.d.ts.map +1 -0
  76. package/dist/migrations/v008-site-settings.js +20 -0
  77. package/dist/migrations/v008-site-settings.js.map +1 -0
  78. package/dist/migrations/v009-seo-config.d.ts +15 -0
  79. package/dist/migrations/v009-seo-config.d.ts.map +1 -0
  80. package/dist/migrations/v009-seo-config.js +29 -0
  81. package/dist/migrations/v009-seo-config.js.map +1 -0
  82. package/dist/migrations/v010-content-live-version.d.ts +15 -0
  83. package/dist/migrations/v010-content-live-version.d.ts.map +1 -0
  84. package/dist/migrations/v010-content-live-version.js +40 -0
  85. package/dist/migrations/v010-content-live-version.js.map +1 -0
  86. package/dist/migrations/v011-media.d.ts +12 -0
  87. package/dist/migrations/v011-media.d.ts.map +1 -0
  88. package/dist/migrations/v011-media.js +43 -0
  89. package/dist/migrations/v011-media.js.map +1 -0
  90. package/dist/migrations/v012-page-cache.d.ts +12 -0
  91. package/dist/migrations/v012-page-cache.d.ts.map +1 -0
  92. package/dist/migrations/v012-page-cache.js +31 -0
  93. package/dist/migrations/v012-page-cache.js.map +1 -0
  94. package/dist/migrations/v013-content-contracts.d.ts +17 -0
  95. package/dist/migrations/v013-content-contracts.d.ts.map +1 -0
  96. package/dist/migrations/v013-content-contracts.js +46 -0
  97. package/dist/migrations/v013-content-contracts.js.map +1 -0
  98. package/dist/migrations/v014-content-manifest-commit.d.ts +7 -0
  99. package/dist/migrations/v014-content-manifest-commit.d.ts.map +1 -0
  100. package/dist/migrations/v014-content-manifest-commit.js +12 -0
  101. package/dist/migrations/v014-content-manifest-commit.js.map +1 -0
  102. package/dist/page-cache-store.d.ts +17 -0
  103. package/dist/page-cache-store.d.ts.map +1 -0
  104. package/dist/page-cache-store.js +76 -0
  105. package/dist/page-cache-store.js.map +1 -0
  106. package/dist/queries.d.ts +82 -0
  107. package/dist/queries.d.ts.map +1 -0
  108. package/dist/queries.js +25 -0
  109. package/dist/queries.js.map +1 -0
  110. package/dist/retention-adapter.d.ts +13 -0
  111. package/dist/retention-adapter.d.ts.map +1 -0
  112. package/dist/retention-adapter.js +62 -0
  113. package/dist/retention-adapter.js.map +1 -0
  114. package/dist/row-mapping.d.ts +14 -0
  115. package/dist/row-mapping.d.ts.map +1 -0
  116. package/dist/row-mapping.js +71 -0
  117. package/dist/row-mapping.js.map +1 -0
  118. package/dist/seo-config-adapter.d.ts +14 -0
  119. package/dist/seo-config-adapter.d.ts.map +1 -0
  120. package/dist/seo-config-adapter.js +57 -0
  121. package/dist/seo-config-adapter.js.map +1 -0
  122. package/dist/site-settings-adapter.d.ts +10 -0
  123. package/dist/site-settings-adapter.d.ts.map +1 -0
  124. package/dist/site-settings-adapter.js +27 -0
  125. package/dist/site-settings-adapter.js.map +1 -0
  126. package/dist/sqlite-adapter.d.ts +69 -0
  127. package/dist/sqlite-adapter.d.ts.map +1 -0
  128. package/dist/sqlite-adapter.js +242 -0
  129. package/dist/sqlite-adapter.js.map +1 -0
  130. package/dist/webhook-delivery-adapter.d.ts +27 -0
  131. package/dist/webhook-delivery-adapter.d.ts.map +1 -0
  132. package/dist/webhook-delivery-adapter.js +93 -0
  133. package/dist/webhook-delivery-adapter.js.map +1 -0
  134. package/package.json +37 -3
  135. 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":"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"}
package/package.json CHANGED
@@ -1,6 +1,40 @@
1
1
  {
2
2
  "name": "@krantho/persistence-sqlite",
3
- "version": "0.0.0-stage",
4
- "stub": true,
5
- "description": "Temporary package placeholder for staged publishing"
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
@@ -1,3 +0,0 @@
1
- # Temporary Holding Version
2
-
3
- This version is a temporary placeholder for this package. An operational version to replace this has been submitted for review and is awaiting a staged release.