@digitalpaws/starr 0.0.1

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 (290) hide show
  1. package/README.rst +75 -0
  2. package/data/.nfs.811bbb0d.43c34.4 +0 -0
  3. package/data/.nfs.81ba4cd0.ffff87804.4 +0 -0
  4. package/data/.nfs.82d127f7.fffff5704.4 +0 -0
  5. package/data/.nfs.82d127fe.fffff5704.4 +0 -0
  6. package/data/.nfs.82d159a5.fffff5aa4.4 +0 -0
  7. package/data/.nfs.82d159aa.fffff5aa4.4 +0 -0
  8. package/data/.nfs.82d15a9c.fffff5bb4.4 +0 -0
  9. package/data/.nfs.82d15aa1.fffff5bb4.4 +0 -0
  10. package/data/.nfs.82d15c65.fffff5c24.4 +0 -0
  11. package/data/.nfs.82d1852c.fffff5e24.4 +0 -0
  12. package/data/.nfs.82d18536.fffff5e24.4 +0 -0
  13. package/data/.nfs.82d18dbe.fffff5e44.4 +0 -0
  14. package/data/.nfs.82d18dc6.fffff5e44.4 +0 -0
  15. package/data/.nfs.8309a3f5.fffff82f4.4 +0 -0
  16. package/data/.nfs.8309a3fe.fffff82f4.4 +0 -0
  17. package/data/.nfs.8314122e.fffffb044.4 +0 -0
  18. package/data/.nfs.83141236.fffffb044.4 +0 -0
  19. package/data/.nfs.833c4fe9.fffffbc34.4 +0 -0
  20. package/data/.nfs.833c4ff3.fffffbc34.4 +0 -0
  21. package/data/logs/starr.log +66244 -0
  22. package/data/starr.db +0 -0
  23. package/data/starr.db-shm +0 -0
  24. package/data/starr.db-wal +0 -0
  25. package/data/starr.jwt +1 -0
  26. package/data/starr.key +1 -0
  27. package/dist/auth/auth-service.d.ts +42 -0
  28. package/dist/auth/auth-service.d.ts.map +1 -0
  29. package/dist/auth/auth-service.js +226 -0
  30. package/dist/auth/auth-service.js.map +1 -0
  31. package/dist/auth/http-server.d.ts +16 -0
  32. package/dist/auth/http-server.d.ts.map +1 -0
  33. package/dist/auth/http-server.js +207 -0
  34. package/dist/auth/http-server.js.map +1 -0
  35. package/dist/auth/jwt-secret.d.ts +6 -0
  36. package/dist/auth/jwt-secret.d.ts.map +1 -0
  37. package/dist/auth/jwt-secret.js +51 -0
  38. package/dist/auth/jwt-secret.js.map +1 -0
  39. package/dist/auth/oidc/oidc-flow.d.ts +60 -0
  40. package/dist/auth/oidc/oidc-flow.d.ts.map +1 -0
  41. package/dist/auth/oidc/oidc-flow.js +201 -0
  42. package/dist/auth/oidc/oidc-flow.js.map +1 -0
  43. package/dist/auth/oidc/oidc-provider-service.d.ts +59 -0
  44. package/dist/auth/oidc/oidc-provider-service.d.ts.map +1 -0
  45. package/dist/auth/oidc/oidc-provider-service.js +124 -0
  46. package/dist/auth/oidc/oidc-provider-service.js.map +1 -0
  47. package/dist/auth/oidc/user-service.d.ts +67 -0
  48. package/dist/auth/oidc/user-service.d.ts.map +1 -0
  49. package/dist/auth/oidc/user-service.js +177 -0
  50. package/dist/auth/oidc/user-service.js.map +1 -0
  51. package/dist/auth/rate-limiter.d.ts +31 -0
  52. package/dist/auth/rate-limiter.d.ts.map +1 -0
  53. package/dist/auth/rate-limiter.js +70 -0
  54. package/dist/auth/rate-limiter.js.map +1 -0
  55. package/dist/config/config-service.d.ts +83 -0
  56. package/dist/config/config-service.d.ts.map +1 -0
  57. package/dist/config/config-service.js +309 -0
  58. package/dist/config/config-service.js.map +1 -0
  59. package/dist/config/validate.d.ts +12 -0
  60. package/dist/config/validate.d.ts.map +1 -0
  61. package/dist/config/validate.js +140 -0
  62. package/dist/config/validate.js.map +1 -0
  63. package/dist/content-types/registry.d.ts +75 -0
  64. package/dist/content-types/registry.d.ts.map +1 -0
  65. package/dist/content-types/registry.js +171 -0
  66. package/dist/content-types/registry.js.map +1 -0
  67. package/dist/datastore/db.d.ts +9 -0
  68. package/dist/datastore/db.d.ts.map +1 -0
  69. package/dist/datastore/db.js +27 -0
  70. package/dist/datastore/db.js.map +1 -0
  71. package/dist/datastore/encrypt.d.ts +9 -0
  72. package/dist/datastore/encrypt.d.ts.map +1 -0
  73. package/dist/datastore/encrypt.js +84 -0
  74. package/dist/datastore/encrypt.js.map +1 -0
  75. package/dist/datastore/migrations.d.ts +10 -0
  76. package/dist/datastore/migrations.d.ts.map +1 -0
  77. package/dist/datastore/migrations.js +340 -0
  78. package/dist/datastore/migrations.js.map +1 -0
  79. package/dist/datastore/storage.d.ts +4 -0
  80. package/dist/datastore/storage.d.ts.map +1 -0
  81. package/dist/datastore/storage.js +60 -0
  82. package/dist/datastore/storage.js.map +1 -0
  83. package/dist/events/event-bus.d.ts +15 -0
  84. package/dist/events/event-bus.d.ts.map +1 -0
  85. package/dist/events/event-bus.js +140 -0
  86. package/dist/events/event-bus.js.map +1 -0
  87. package/dist/events/spine.d.ts +31 -0
  88. package/dist/events/spine.d.ts.map +1 -0
  89. package/dist/events/spine.js +68 -0
  90. package/dist/events/spine.js.map +1 -0
  91. package/dist/events/trace.d.ts +24 -0
  92. package/dist/events/trace.d.ts.map +1 -0
  93. package/dist/events/trace.js +33 -0
  94. package/dist/events/trace.js.map +1 -0
  95. package/dist/host.d.ts +65 -0
  96. package/dist/host.d.ts.map +1 -0
  97. package/dist/host.js +94 -0
  98. package/dist/host.js.map +1 -0
  99. package/dist/library/importer.d.ts +29 -0
  100. package/dist/library/importer.d.ts.map +1 -0
  101. package/dist/library/importer.js +145 -0
  102. package/dist/library/importer.js.map +1 -0
  103. package/dist/library/library-cache.d.ts +46 -0
  104. package/dist/library/library-cache.d.ts.map +1 -0
  105. package/dist/library/library-cache.js +152 -0
  106. package/dist/library/library-cache.js.map +1 -0
  107. package/dist/library/library-config.d.ts +12 -0
  108. package/dist/library/library-config.d.ts.map +1 -0
  109. package/dist/library/library-config.js +10 -0
  110. package/dist/library/library-config.js.map +1 -0
  111. package/dist/library/library-scanner.d.ts +62 -0
  112. package/dist/library/library-scanner.d.ts.map +1 -0
  113. package/dist/library/library-scanner.js +336 -0
  114. package/dist/library/library-scanner.js.map +1 -0
  115. package/dist/library/library-service.d.ts +65 -0
  116. package/dist/library/library-service.d.ts.map +1 -0
  117. package/dist/library/library-service.js +197 -0
  118. package/dist/library/library-service.js.map +1 -0
  119. package/dist/library/metadata-matcher.d.ts +56 -0
  120. package/dist/library/metadata-matcher.d.ts.map +1 -0
  121. package/dist/library/metadata-matcher.js +207 -0
  122. package/dist/library/metadata-matcher.js.map +1 -0
  123. package/dist/library/naming.d.ts +8 -0
  124. package/dist/library/naming.d.ts.map +1 -0
  125. package/dist/library/naming.js +47 -0
  126. package/dist/library/naming.js.map +1 -0
  127. package/dist/library/scan-controller.d.ts +95 -0
  128. package/dist/library/scan-controller.d.ts.map +1 -0
  129. package/dist/library/scan-controller.js +379 -0
  130. package/dist/library/scan-controller.js.map +1 -0
  131. package/dist/library/source-resolver.d.ts +17 -0
  132. package/dist/library/source-resolver.d.ts.map +1 -0
  133. package/dist/library/source-resolver.js +75 -0
  134. package/dist/library/source-resolver.js.map +1 -0
  135. package/dist/logging/logger.d.ts +3 -0
  136. package/dist/logging/logger.d.ts.map +1 -0
  137. package/dist/logging/logger.js +107 -0
  138. package/dist/logging/logger.js.map +1 -0
  139. package/dist/main.d.ts +36 -0
  140. package/dist/main.d.ts.map +1 -0
  141. package/dist/main.js +229 -0
  142. package/dist/main.js.map +1 -0
  143. package/dist/plugins/context.d.ts +10 -0
  144. package/dist/plugins/context.d.ts.map +1 -0
  145. package/dist/plugins/context.js +110 -0
  146. package/dist/plugins/context.js.map +1 -0
  147. package/dist/plugins/discovery.d.ts +2 -0
  148. package/dist/plugins/discovery.d.ts.map +1 -0
  149. package/dist/plugins/discovery.js +32 -0
  150. package/dist/plugins/discovery.js.map +1 -0
  151. package/dist/plugins/loader.d.ts +9 -0
  152. package/dist/plugins/loader.d.ts.map +1 -0
  153. package/dist/plugins/loader.js +245 -0
  154. package/dist/plugins/loader.js.map +1 -0
  155. package/dist/state/request-intake.d.ts +26 -0
  156. package/dist/state/request-intake.d.ts.map +1 -0
  157. package/dist/state/request-intake.js +74 -0
  158. package/dist/state/request-intake.js.map +1 -0
  159. package/dist/state/state-store.d.ts +146 -0
  160. package/dist/state/state-store.d.ts.map +1 -0
  161. package/dist/state/state-store.js +465 -0
  162. package/dist/state/state-store.js.map +1 -0
  163. package/dist/state/trace-store.d.ts +12 -0
  164. package/dist/state/trace-store.d.ts.map +1 -0
  165. package/dist/state/trace-store.js +24 -0
  166. package/dist/state/trace-store.js.map +1 -0
  167. package/dist/types/plugin.d.ts +93 -0
  168. package/dist/types/plugin.d.ts.map +1 -0
  169. package/dist/types/plugin.js +4 -0
  170. package/dist/types/plugin.js.map +1 -0
  171. package/dist/web/index.d.ts +10 -0
  172. package/dist/web/index.d.ts.map +1 -0
  173. package/dist/web/index.js +153 -0
  174. package/dist/web/index.js.map +1 -0
  175. package/dist/web/routes/activity.d.ts +6 -0
  176. package/dist/web/routes/activity.d.ts.map +1 -0
  177. package/dist/web/routes/activity.js +31 -0
  178. package/dist/web/routes/activity.js.map +1 -0
  179. package/dist/web/routes/auth.d.ts +6 -0
  180. package/dist/web/routes/auth.d.ts.map +1 -0
  181. package/dist/web/routes/auth.js +142 -0
  182. package/dist/web/routes/auth.js.map +1 -0
  183. package/dist/web/routes/config.d.ts +7 -0
  184. package/dist/web/routes/config.d.ts.map +1 -0
  185. package/dist/web/routes/config.js +204 -0
  186. package/dist/web/routes/config.js.map +1 -0
  187. package/dist/web/routes/content-types.d.ts +6 -0
  188. package/dist/web/routes/content-types.d.ts.map +1 -0
  189. package/dist/web/routes/content-types.js +29 -0
  190. package/dist/web/routes/content-types.js.map +1 -0
  191. package/dist/web/routes/discovery.d.ts +6 -0
  192. package/dist/web/routes/discovery.d.ts.map +1 -0
  193. package/dist/web/routes/discovery.js +111 -0
  194. package/dist/web/routes/discovery.js.map +1 -0
  195. package/dist/web/routes/library-import.d.ts +6 -0
  196. package/dist/web/routes/library-import.d.ts.map +1 -0
  197. package/dist/web/routes/library-import.js +120 -0
  198. package/dist/web/routes/library-import.js.map +1 -0
  199. package/dist/web/routes/library-management.d.ts +6 -0
  200. package/dist/web/routes/library-management.d.ts.map +1 -0
  201. package/dist/web/routes/library-management.js +120 -0
  202. package/dist/web/routes/library-management.js.map +1 -0
  203. package/dist/web/routes/library.d.ts +6 -0
  204. package/dist/web/routes/library.d.ts.map +1 -0
  205. package/dist/web/routes/library.js +28 -0
  206. package/dist/web/routes/library.js.map +1 -0
  207. package/dist/web/routes/oidc.d.ts +9 -0
  208. package/dist/web/routes/oidc.d.ts.map +1 -0
  209. package/dist/web/routes/oidc.js +203 -0
  210. package/dist/web/routes/oidc.js.map +1 -0
  211. package/dist/web/routes/requests.d.ts +6 -0
  212. package/dist/web/routes/requests.d.ts.map +1 -0
  213. package/dist/web/routes/requests.js +183 -0
  214. package/dist/web/routes/requests.js.map +1 -0
  215. package/dist/web/routes/sse.d.ts +6 -0
  216. package/dist/web/routes/sse.d.ts.map +1 -0
  217. package/dist/web/routes/sse.js +54 -0
  218. package/dist/web/routes/sse.js.map +1 -0
  219. package/package.json +33 -0
  220. package/package.json.license +2 -0
  221. package/src/auth/auth-service.ts +333 -0
  222. package/src/auth/http-server.ts +249 -0
  223. package/src/auth/jwt-secret.ts +65 -0
  224. package/src/auth/oidc/oidc-flow.ts +266 -0
  225. package/src/auth/oidc/oidc-provider-service.ts +174 -0
  226. package/src/auth/oidc/user-service.ts +227 -0
  227. package/src/auth/rate-limiter.ts +85 -0
  228. package/src/config/config-service.ts +434 -0
  229. package/src/config/validate.ts +153 -0
  230. package/src/content-types/registry.ts +194 -0
  231. package/src/datastore/db.ts +38 -0
  232. package/src/datastore/encrypt.ts +107 -0
  233. package/src/datastore/migrations.ts +367 -0
  234. package/src/datastore/storage.ts +83 -0
  235. package/src/events/event-bus.ts +180 -0
  236. package/src/events/spine.ts +87 -0
  237. package/src/events/trace.ts +38 -0
  238. package/src/host.ts +130 -0
  239. package/src/library/importer.ts +174 -0
  240. package/src/library/library-cache.ts +212 -0
  241. package/src/library/library-config.ts +22 -0
  242. package/src/library/library-scanner.ts +404 -0
  243. package/src/library/library-service.ts +282 -0
  244. package/src/library/metadata-matcher.ts +285 -0
  245. package/src/library/naming.ts +59 -0
  246. package/src/library/scan-controller.ts +490 -0
  247. package/src/library/source-resolver.ts +92 -0
  248. package/src/logging/logger.ts +115 -0
  249. package/src/main.ts +364 -0
  250. package/src/plugins/context.ts +138 -0
  251. package/src/plugins/discovery.ts +29 -0
  252. package/src/plugins/loader.ts +309 -0
  253. package/src/state/request-intake.ts +101 -0
  254. package/src/state/state-store.ts +621 -0
  255. package/src/state/trace-store.ts +27 -0
  256. package/src/types/plugin.ts +110 -0
  257. package/src/web/index.ts +182 -0
  258. package/src/web/routes/activity.ts +41 -0
  259. package/src/web/routes/auth.ts +170 -0
  260. package/src/web/routes/config.ts +282 -0
  261. package/src/web/routes/content-types.ts +42 -0
  262. package/src/web/routes/discovery.ts +156 -0
  263. package/src/web/routes/library-import.ts +196 -0
  264. package/src/web/routes/library-management.ts +140 -0
  265. package/src/web/routes/library.ts +46 -0
  266. package/src/web/routes/oidc.ts +260 -0
  267. package/src/web/routes/requests.ts +250 -0
  268. package/src/web/routes/sse.ts +92 -0
  269. package/tests/auth.test.ts +510 -0
  270. package/tests/config-route.test.ts +345 -0
  271. package/tests/config.test.ts +612 -0
  272. package/tests/content-types.test.ts +376 -0
  273. package/tests/datastore.test.ts +345 -0
  274. package/tests/e2e.test.ts +430 -0
  275. package/tests/event-bus.test.ts +925 -0
  276. package/tests/host.test.ts +449 -0
  277. package/tests/library-cache.test.ts +171 -0
  278. package/tests/library-scanner.test.ts +177 -0
  279. package/tests/library.test.ts +210 -0
  280. package/tests/loader-context.test.ts +644 -0
  281. package/tests/logger-jsonl.test.ts +154 -0
  282. package/tests/metadata-matcher.test.ts +198 -0
  283. package/tests/oidc.test.ts +218 -0
  284. package/tests/scan-controller.test.ts +328 -0
  285. package/tests/source-resolver.test.ts +100 -0
  286. package/tests/starr-video-integration.test.ts +153 -0
  287. package/tests/state-store.test.ts +700 -0
  288. package/tests/trace-history.test.ts +356 -0
  289. package/tsconfig.json +8 -0
  290. package/tsconfig.json.license +2 -0
@@ -0,0 +1,171 @@
1
+ // SPDX-License-Identifier: 0BSD
2
+ // SPDX-FileCopyrightText: 2025 Digi <digitalpaws@proton.me>
3
+ /**
4
+ * Pure validation function. Returns null if valid, or an error message string.
5
+ *
6
+ * Checks in order:
7
+ * - id is truthy
8
+ * - name is truthy
9
+ * - identity is a non-empty array (DS2)
10
+ * - Each field: key, label, type are truthy
11
+ * - list fields must have itemType (FT2)
12
+ * - enum fields must have non-empty options (FT2)
13
+ */
14
+ export function validateDescriptor(descriptor) {
15
+ // Check required fields (as unknown for runtime validation of TS-required fields).
16
+ const d = descriptor;
17
+ if (!d.id)
18
+ return "content-type id is required";
19
+ if (!d.name)
20
+ return "content-type name is required";
21
+ if (!Array.isArray(d.identity) || d.identity.length === 0) {
22
+ return "content-type identity must be a non-empty array";
23
+ }
24
+ const fields = d.fields;
25
+ if (Array.isArray(fields)) {
26
+ for (let i = 0; i < fields.length; i++) {
27
+ const f = fields[i];
28
+ if (!f.key)
29
+ return `field[${i}]: key is required`;
30
+ if (!f.label)
31
+ return `field[${i}]: label is required`;
32
+ if (!f.type)
33
+ return `field[${i}]: type is required`;
34
+ if (f.type === "list" && !f.itemType) {
35
+ return `field[${i}] (list): itemType is required`;
36
+ }
37
+ if (f.type === "enum") {
38
+ if (!Array.isArray(f.options) || f.options.length === 0) {
39
+ return `field[${i}] (enum): non-empty options is required`;
40
+ }
41
+ }
42
+ }
43
+ }
44
+ return null;
45
+ }
46
+ /**
47
+ * Full content-type registry implementation.
48
+ *
49
+ * Plugins call register() via ctx.contentTypes.register. The host internally
50
+ * uses get(), list(), and rollbackPlugin().
51
+ */
52
+ export class ContentTypeRegistryImpl {
53
+ descriptors = new Map();
54
+ pluginToIds = new Map();
55
+ /**
56
+ * Register a descriptor. Optionally associates it with a pluginId for
57
+ * rollback support.
58
+ */
59
+ register(descriptor, pluginId) {
60
+ // 1. Validate
61
+ const err = validateDescriptor(descriptor);
62
+ if (err)
63
+ throw new Error(`Invalid content-type descriptor: ${err}`);
64
+ // 2. Duplicate check (CT5, RC2)
65
+ if (this.descriptors.has(descriptor.id)) {
66
+ throw new Error(`Duplicate content-type id: ${descriptor.id}`);
67
+ }
68
+ // 3. Store
69
+ this.descriptors.set(descriptor.id, descriptor);
70
+ if (pluginId) {
71
+ const ids = this.pluginToIds.get(pluginId) ?? [];
72
+ ids.push(descriptor.id);
73
+ this.pluginToIds.set(pluginId, ids);
74
+ }
75
+ }
76
+ /** Retrieve a descriptor by id. Returns undefined if not found. */
77
+ get(id) {
78
+ return this.descriptors.get(id);
79
+ }
80
+ /** List all registered descriptors. */
81
+ list() {
82
+ return [...this.descriptors.values()];
83
+ }
84
+ /**
85
+ * Roll back (remove) all descriptors registered by a given plugin.
86
+ * Safe to call for unknown pluginIds (no-op).
87
+ */
88
+ rollbackPlugin(pluginId) {
89
+ const ids = this.pluginToIds.get(pluginId);
90
+ if (ids) {
91
+ for (const id of ids)
92
+ this.descriptors.delete(id);
93
+ this.pluginToIds.delete(pluginId);
94
+ }
95
+ }
96
+ }
97
+ /**
98
+ * Build a sorted external ids string for fallback identity computation.
99
+ * Produces: "key1=val1|key2=val2|..." sorted alphabetically by key.
100
+ */
101
+ function sortedExternalIdsString(externalIds) {
102
+ return Object.keys(externalIds)
103
+ .sort()
104
+ .map((k) => `${k}=${externalIds[k]}`)
105
+ .join("|");
106
+ }
107
+ /**
108
+ * Compute a deterministic content-identity string for an item.
109
+ *
110
+ * Algorithm:
111
+ * 1. Look up the descriptor for item.contentTypeId.
112
+ * 2. If descriptor exists: walk descriptor.identity in order. For each key,
113
+ * if item.externalIds[key] is present and non-empty, return
114
+ * "${contentTypeId}::${key}=${value}".
115
+ * 3. If no identity key is present in the item's externalIds (or descriptor
116
+ * not found): return "${contentTypeId}::undecidable::${sortedExternalIds}"
117
+ * where sortedExternalIds is all externalId pairs sorted by key.
118
+ */
119
+ export function computeContentIdentity(item, registry) {
120
+ const descriptor = registry.get(item.contentTypeId);
121
+ if (descriptor) {
122
+ for (const key of descriptor.identity) {
123
+ const value = item.externalIds[key];
124
+ if (value && value.length > 0) {
125
+ return `${item.contentTypeId}::${key}=${value}`;
126
+ }
127
+ }
128
+ }
129
+ // Fallback: undecidable or unknown type
130
+ return `${item.contentTypeId}::undecidable::${sortedExternalIdsString(item.externalIds)}`;
131
+ }
132
+ /**
133
+ * Compare two content items for identity.
134
+ *
135
+ * Algorithm:
136
+ * 1. If contentTypeId differs → false (ID2).
137
+ * 2. Look up descriptor. If not found → false.
138
+ * 3. Walk descriptor.identity in order. For each key, if BOTH items have a
139
+ * truthy value, return whether they are equal.
140
+ * 4. No mutually-present key → false (ID1 — undecidable).
141
+ */
142
+ export function areSameItem(a, b, registry) {
143
+ if (a.contentTypeId !== b.contentTypeId)
144
+ return false; // ID2
145
+ const descriptor = registry.get(a.contentTypeId);
146
+ if (!descriptor)
147
+ return false; // Unknown type → conservative
148
+ for (const key of descriptor.identity) {
149
+ const aVal = a.externalIds[key];
150
+ const bVal = b.externalIds[key];
151
+ if (aVal && aVal.length > 0 && bVal && bVal.length > 0) {
152
+ return aVal === bVal;
153
+ }
154
+ }
155
+ return false; // ID1 — no mutually-present key
156
+ }
157
+ /** Default naming: "{Title}/{Title}.{ext}" */
158
+ function defaultNamingRule() {
159
+ return {
160
+ directory: [[{ type: "field", value: "Title" }]],
161
+ filename: [[{ type: "field", value: "Title" }]],
162
+ };
163
+ }
164
+ /**
165
+ * Get the naming rule for a content type, falling back to a safe default.
166
+ */
167
+ export function getNamingRule(contentTypeId, registry) {
168
+ const descriptor = registry.get(contentTypeId);
169
+ return descriptor?.naming ?? defaultNamingRule();
170
+ }
171
+ //# sourceMappingURL=registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/content-types/registry.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import Database from "better-sqlite3";
2
+ import type { Logger } from "../types/plugin.js";
3
+ export interface Datastore {
4
+ readonly db: Database.Database;
5
+ readonly dbPath: string;
6
+ close(): void;
7
+ }
8
+ export declare function openDatastore(dataDir: string, logger: Logger): Datastore;
9
+ //# sourceMappingURL=db.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"db.d.ts","sourceRoot":"","sources":["../../src/datastore/db.ts"],"names":[],"mappings":"AAGA,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AAGtC,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAQjD,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,CAAC;IAC/B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,KAAK,IAAI,IAAI,CAAC;CACf;AAED,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,SAAS,CAiBxE"}
@@ -0,0 +1,27 @@
1
+ // SPDX-License-Identifier: 0BSD
2
+ // SPDX-FileCopyrightText: 2025 Digi <digitalpaws@proton.me>
3
+ import Database from "better-sqlite3";
4
+ import { mkdirSync, existsSync } from "node:fs";
5
+ import path from "node:path";
6
+ function ensureDir(dir) {
7
+ if (!existsSync(dir)) {
8
+ mkdirSync(dir, { recursive: true });
9
+ }
10
+ }
11
+ export function openDatastore(dataDir, logger) {
12
+ ensureDir(dataDir);
13
+ const dbPath = path.join(dataDir, "starr.db");
14
+ logger.info("opening datastore", { dbPath });
15
+ const db = new Database(dbPath);
16
+ db.pragma("journal_mode = WAL");
17
+ db.pragma("foreign_keys = ON");
18
+ return {
19
+ db,
20
+ dbPath,
21
+ close() {
22
+ logger.info("closing datastore");
23
+ db.close();
24
+ },
25
+ };
26
+ }
27
+ //# sourceMappingURL=db.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"db.js","sourceRoot":"","sources":["../../src/datastore/db.ts"],"names":[],"mappings":"AAAA,gCAAgC;AAChC,4DAA4D;AAE5D,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AACtC,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAChD,OAAO,IAAI,MAAM,WAAW,CAAC;AAG7B,SAAS,SAAS,CAAC,GAAW;IAC5B,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QACrB,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACtC,CAAC;AACH,CAAC;AAQD,MAAM,UAAU,aAAa,CAAC,OAAe,EAAE,MAAc;IAC3D,SAAS,CAAC,OAAO,CAAC,CAAC;IACnB,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;IAC9C,MAAM,CAAC,IAAI,CAAC,mBAAmB,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;IAE7C,MAAM,EAAE,GAAG,IAAI,QAAQ,CAAC,MAAM,CAAC,CAAC;IAChC,EAAE,CAAC,MAAM,CAAC,oBAAoB,CAAC,CAAC;IAChC,EAAE,CAAC,MAAM,CAAC,mBAAmB,CAAC,CAAC;IAE/B,OAAO;QACL,EAAE;QACF,MAAM;QACN,KAAK;YACH,MAAM,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;YACjC,EAAE,CAAC,KAAK,EAAE,CAAC;QACb,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,9 @@
1
+ import type { Logger } from "../types/plugin.js";
2
+ export declare function loadEncryptionKey(dataDir: string, logger: Logger): Buffer;
3
+ /**
4
+ * Reset the cached encryption key. For testing only.
5
+ */
6
+ export declare function resetEncryptionKey(): void;
7
+ export declare function encrypt(plaintext: string): string;
8
+ export declare function decrypt(blob: string): string;
9
+ //# sourceMappingURL=encrypt.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"encrypt.d.ts","sourceRoot":"","sources":["../../src/datastore/encrypt.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AASjD,wBAAgB,iBAAiB,CAC/B,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,GACb,MAAM,CA0CR;AAED;;GAEG;AACH,wBAAgB,kBAAkB,IAAI,IAAI,CAEzC;AAED,wBAAgB,OAAO,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAcjD;AAED,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAiB5C"}
@@ -0,0 +1,84 @@
1
+ // SPDX-License-Identifier: 0BSD
2
+ // SPDX-FileCopyrightText: 2025 Digi <digitalpaws@proton.me>
3
+ import { createCipheriv, createDecipheriv, randomBytes, } from "node:crypto";
4
+ import { readFileSync, writeFileSync, existsSync } from "node:fs";
5
+ import path from "node:path";
6
+ const ALGORITHM = "aes-256-gcm";
7
+ const IV_LENGTH = 12;
8
+ const AUTH_TAG_LENGTH = 16;
9
+ const KEY_LENGTH = 32; // bytes
10
+ let _key = null;
11
+ export function loadEncryptionKey(dataDir, logger) {
12
+ if (_key)
13
+ return _key;
14
+ // 1. Env var
15
+ const envKey = process.env.STARR_ENCRYPTION_KEY;
16
+ if (envKey) {
17
+ const buf = Buffer.from(envKey, "base64");
18
+ if (buf.length !== KEY_LENGTH) {
19
+ throw new Error(`STARR_ENCRYPTION_KEY must decode to ${KEY_LENGTH} bytes, got ${buf.length}`);
20
+ }
21
+ _key = buf;
22
+ logger.info("encryption key loaded from STARR_ENCRYPTION_KEY");
23
+ return _key;
24
+ }
25
+ // 2. Key file
26
+ const keyPath = path.join(dataDir, "starr.key");
27
+ if (existsSync(keyPath)) {
28
+ const fileContent = readFileSync(keyPath, "utf8").trim();
29
+ const buf = Buffer.from(fileContent, "base64");
30
+ if (buf.length !== KEY_LENGTH) {
31
+ throw new Error(`Key file ${keyPath} must decode to ${KEY_LENGTH} bytes, got ${buf.length}`);
32
+ }
33
+ _key = buf;
34
+ logger.info("encryption key loaded from file", { keyPath });
35
+ return _key;
36
+ }
37
+ // 3. Auto-generate
38
+ const newKey = randomBytes(KEY_LENGTH);
39
+ const encoded = newKey.toString("base64");
40
+ writeFileSync(keyPath, encoded + "\n", { mode: 0o600 });
41
+ _key = newKey;
42
+ logger.info("auto-generated encryption key (no STARR_ENCRYPTION_KEY set)", { keyPath });
43
+ return _key;
44
+ }
45
+ /**
46
+ * Reset the cached encryption key. For testing only.
47
+ */
48
+ export function resetEncryptionKey() {
49
+ _key = null;
50
+ }
51
+ export function encrypt(plaintext) {
52
+ if (!_key)
53
+ throw new Error("encryption key not loaded");
54
+ const iv = randomBytes(IV_LENGTH);
55
+ const cipher = createCipheriv(ALGORITHM, _key, iv, {
56
+ authTagLength: AUTH_TAG_LENGTH,
57
+ });
58
+ const encrypted = Buffer.concat([
59
+ cipher.update(plaintext, "utf8"),
60
+ cipher.final(),
61
+ ]);
62
+ const authTag = cipher.getAuthTag();
63
+ // Pack: iv (12) + authTag (16) + ciphertext (variable)
64
+ const blob = Buffer.concat([iv, authTag, encrypted]);
65
+ return blob.toString("base64");
66
+ }
67
+ export function decrypt(blob) {
68
+ if (!_key)
69
+ throw new Error("encryption key not loaded");
70
+ const buf = Buffer.from(blob, "base64");
71
+ if (buf.length < IV_LENGTH + AUTH_TAG_LENGTH) {
72
+ throw new Error("invalid encrypted blob: too short");
73
+ }
74
+ const iv = buf.subarray(0, IV_LENGTH);
75
+ const authTag = buf.subarray(IV_LENGTH, IV_LENGTH + AUTH_TAG_LENGTH);
76
+ const ciphertext = buf.subarray(IV_LENGTH + AUTH_TAG_LENGTH);
77
+ const decipher = createDecipheriv(ALGORITHM, _key, iv, {
78
+ authTagLength: AUTH_TAG_LENGTH,
79
+ });
80
+ decipher.setAuthTag(authTag);
81
+ return (decipher.update(ciphertext, undefined, "utf8") +
82
+ decipher.final("utf8"));
83
+ }
84
+ //# sourceMappingURL=encrypt.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"encrypt.js","sourceRoot":"","sources":["../../src/datastore/encrypt.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import type Database from "better-sqlite3";
2
+ import type { Logger } from "../types/plugin.js";
3
+ export interface Migration {
4
+ id: number;
5
+ name: string;
6
+ up: string;
7
+ }
8
+ export declare function runMigrations(db: Database.Database, migrations: Migration[], logger: Logger): void;
9
+ export declare const CORE_MIGRATIONS: Migration[];
10
+ //# sourceMappingURL=migrations.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"migrations.d.ts","sourceRoot":"","sources":["../../src/datastore/migrations.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAC3C,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAEjD,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;CACZ;AAUD,wBAAgB,aAAa,CAC3B,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,UAAU,EAAE,SAAS,EAAE,EACvB,MAAM,EAAE,MAAM,GACb,IAAI,CAmCN;AAID,eAAO,MAAM,eAAe,EAAE,SAAS,EA+StC,CAAC"}