@ddd-ts-kit/kernel 0.8.0 → 0.10.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 (499) hide show
  1. package/README.md +207 -2
  2. package/dist/application/criteria/index.d.ts +33 -0
  3. package/dist/application/criteria/index.d.ts.map +1 -0
  4. package/dist/application/criteria/index.js +33 -0
  5. package/dist/application/criteria/index.js.map +1 -0
  6. package/dist/application/event-sourcing/appended.d.ts +8 -0
  7. package/dist/application/event-sourcing/appended.d.ts.map +1 -0
  8. package/dist/application/event-sourcing/appended.js +2 -0
  9. package/dist/application/event-sourcing/appended.js.map +1 -0
  10. package/dist/application/event-sourcing/define-stored-event.d.ts +10 -0
  11. package/dist/application/event-sourcing/define-stored-event.d.ts.map +1 -0
  12. package/dist/application/event-sourcing/define-stored-event.js +22 -0
  13. package/dist/application/event-sourcing/define-stored-event.js.map +1 -0
  14. package/dist/application/event-sourcing/erased-personal-data.d.ts +3 -0
  15. package/dist/application/event-sourcing/erased-personal-data.d.ts.map +1 -0
  16. package/dist/application/event-sourcing/erased-personal-data.js +3 -0
  17. package/dist/application/event-sourcing/erased-personal-data.js.map +1 -0
  18. package/dist/application/event-sourcing/event-envelope.d.ts +9 -0
  19. package/dist/application/event-sourcing/event-envelope.d.ts.map +1 -0
  20. package/dist/application/event-sourcing/event-envelope.js +2 -0
  21. package/dist/application/event-sourcing/event-envelope.js.map +1 -0
  22. package/dist/application/event-sourcing/event-to-append.d.ts +15 -0
  23. package/dist/application/event-sourcing/event-to-append.d.ts.map +1 -0
  24. package/dist/application/event-sourcing/event-to-append.js +2 -0
  25. package/dist/application/event-sourcing/event-to-append.js.map +1 -0
  26. package/dist/application/event-sourcing/index.d.ts +21 -0
  27. package/dist/application/event-sourcing/index.d.ts.map +1 -0
  28. package/dist/application/event-sourcing/index.js +21 -0
  29. package/dist/application/event-sourcing/index.js.map +1 -0
  30. package/dist/application/event-sourcing/is-stored-data.d.ts +5 -0
  31. package/dist/application/event-sourcing/is-stored-data.d.ts.map +1 -0
  32. package/dist/application/event-sourcing/is-stored-data.js +5 -0
  33. package/dist/application/event-sourcing/is-stored-data.js.map +1 -0
  34. package/dist/application/event-sourcing/is-stored-list.d.ts +4 -0
  35. package/dist/application/event-sourcing/is-stored-list.d.ts.map +1 -0
  36. package/dist/application/event-sourcing/is-stored-list.js +5 -0
  37. package/dist/application/event-sourcing/is-stored-list.js.map +1 -0
  38. package/dist/application/event-sourcing/personal-data.d.ts +14 -0
  39. package/dist/application/event-sourcing/personal-data.d.ts.map +1 -0
  40. package/dist/application/event-sourcing/personal-data.js +9 -0
  41. package/dist/application/event-sourcing/personal-data.js.map +1 -0
  42. package/dist/application/event-sourcing/stored-data-of.d.ts +9 -0
  43. package/dist/application/event-sourcing/stored-data-of.d.ts.map +1 -0
  44. package/dist/application/event-sourcing/stored-data-of.js +40 -0
  45. package/dist/application/event-sourcing/stored-data-of.js.map +1 -0
  46. package/dist/application/event-sourcing/stored-data.d.ts +6 -0
  47. package/dist/application/event-sourcing/stored-data.d.ts.map +1 -0
  48. package/dist/application/event-sourcing/stored-data.js +2 -0
  49. package/dist/application/event-sourcing/stored-data.js.map +1 -0
  50. package/dist/application/event-sourcing/stored-event-data.d.ts +25 -0
  51. package/dist/application/event-sourcing/stored-event-data.d.ts.map +1 -0
  52. package/dist/application/event-sourcing/stored-event-data.js +82 -0
  53. package/dist/application/event-sourcing/stored-event-data.js.map +1 -0
  54. package/dist/application/event-sourcing/stored-event-spec.d.ts +20 -0
  55. package/dist/application/event-sourcing/stored-event-spec.d.ts.map +1 -0
  56. package/dist/application/event-sourcing/stored-event-spec.js +2 -0
  57. package/dist/application/event-sourcing/stored-event-spec.js.map +1 -0
  58. package/dist/application/event-sourcing/stored-event-type.d.ts +14 -0
  59. package/dist/application/event-sourcing/stored-event-type.d.ts.map +1 -0
  60. package/dist/application/event-sourcing/stored-event-type.js +2 -0
  61. package/dist/application/event-sourcing/stored-event-type.js.map +1 -0
  62. package/dist/application/event-sourcing/stored-event-types.d.ts +9 -0
  63. package/dist/application/event-sourcing/stored-event-types.d.ts.map +1 -0
  64. package/dist/application/event-sourcing/stored-event-types.js +2 -0
  65. package/dist/application/event-sourcing/stored-event-types.js.map +1 -0
  66. package/dist/application/event-sourcing/stored-event.d.ts +12 -0
  67. package/dist/application/event-sourcing/stored-event.d.ts.map +1 -0
  68. package/dist/application/event-sourcing/stored-event.js +2 -0
  69. package/dist/application/event-sourcing/stored-event.js.map +1 -0
  70. package/dist/application/event-sourcing/stored-json.d.ts +5 -0
  71. package/dist/application/event-sourcing/stored-json.d.ts.map +1 -0
  72. package/dist/application/event-sourcing/stored-json.js +2 -0
  73. package/dist/application/event-sourcing/stored-json.js.map +1 -0
  74. package/dist/application/event-sourcing/stored-snapshot.d.ts +11 -0
  75. package/dist/application/event-sourcing/stored-snapshot.d.ts.map +1 -0
  76. package/dist/application/event-sourcing/stored-snapshot.js +2 -0
  77. package/dist/application/event-sourcing/stored-snapshot.js.map +1 -0
  78. package/dist/application/event-sourcing/subject-key.d.ts +10 -0
  79. package/dist/application/event-sourcing/subject-key.d.ts.map +1 -0
  80. package/dist/application/event-sourcing/subject-key.js +2 -0
  81. package/dist/application/event-sourcing/subject-key.js.map +1 -0
  82. package/dist/application/event-sourcing/unreadable-event-error.d.ts +5 -0
  83. package/dist/application/event-sourcing/unreadable-event-error.d.ts.map +1 -0
  84. package/dist/application/event-sourcing/unreadable-event-error.js +8 -0
  85. package/dist/application/event-sourcing/unreadable-event-error.js.map +1 -0
  86. package/dist/application/event-sourcing/upcaster.d.ts +4 -0
  87. package/dist/application/event-sourcing/upcaster.d.ts.map +1 -0
  88. package/dist/application/event-sourcing/upcaster.js +2 -0
  89. package/dist/application/event-sourcing/upcaster.js.map +1 -0
  90. package/dist/application/files/accepts-media-type.d.ts +3 -0
  91. package/dist/application/files/accepts-media-type.d.ts.map +1 -0
  92. package/dist/application/files/accepts-media-type.js +11 -0
  93. package/dist/application/files/accepts-media-type.js.map +1 -0
  94. package/dist/application/files/assert-expiry.d.ts +3 -0
  95. package/dist/application/files/assert-expiry.d.ts.map +1 -0
  96. package/dist/application/files/assert-expiry.js +10 -0
  97. package/dist/application/files/assert-expiry.js.map +1 -0
  98. package/dist/application/files/assert-file-key.d.ts +3 -0
  99. package/dist/application/files/assert-file-key.d.ts.map +1 -0
  100. package/dist/application/files/assert-file-key.js +10 -0
  101. package/dist/application/files/assert-file-key.js.map +1 -0
  102. package/dist/application/files/assert-final-key.d.ts +3 -0
  103. package/dist/application/files/assert-final-key.d.ts.map +1 -0
  104. package/dist/application/files/assert-final-key.js +11 -0
  105. package/dist/application/files/assert-final-key.js.map +1 -0
  106. package/dist/application/files/content-disposition.d.ts +3 -0
  107. package/dist/application/files/content-disposition.d.ts.map +1 -0
  108. package/dist/application/files/content-disposition.js +9 -0
  109. package/dist/application/files/content-disposition.js.map +1 -0
  110. package/dist/application/files/content-expectation.d.ts +6 -0
  111. package/dist/application/files/content-expectation.d.ts.map +1 -0
  112. package/dist/application/files/content-expectation.js +2 -0
  113. package/dist/application/files/content-expectation.js.map +1 -0
  114. package/dist/application/files/content-matches.d.ts +7 -0
  115. package/dist/application/files/content-matches.d.ts.map +1 -0
  116. package/dist/application/files/content-matches.js +39 -0
  117. package/dist/application/files/content-matches.js.map +1 -0
  118. package/dist/application/files/download-url-options.d.ts +7 -0
  119. package/dist/application/files/download-url-options.d.ts.map +1 -0
  120. package/dist/application/files/download-url-options.js +2 -0
  121. package/dist/application/files/download-url-options.js.map +1 -0
  122. package/dist/application/files/file-content.d.ts +8 -0
  123. package/dist/application/files/file-content.d.ts.map +1 -0
  124. package/dist/application/files/file-content.js +2 -0
  125. package/dist/application/files/file-content.js.map +1 -0
  126. package/dist/application/files/file-error.d.ts +28 -0
  127. package/dist/application/files/file-error.d.ts.map +1 -0
  128. package/dist/application/files/file-error.js +29 -0
  129. package/dist/application/files/file-error.js.map +1 -0
  130. package/dist/application/files/file-metadata.d.ts +10 -0
  131. package/dist/application/files/file-metadata.d.ts.map +1 -0
  132. package/dist/application/files/file-metadata.js +2 -0
  133. package/dist/application/files/file-metadata.js.map +1 -0
  134. package/dist/application/files/file-source.d.ts +4 -0
  135. package/dist/application/files/file-source.d.ts.map +1 -0
  136. package/dist/application/files/file-source.js +2 -0
  137. package/dist/application/files/file-source.js.map +1 -0
  138. package/dist/application/files/file-upload.d.ts +25 -0
  139. package/dist/application/files/file-upload.d.ts.map +1 -0
  140. package/dist/application/files/file-upload.js +36 -0
  141. package/dist/application/files/file-upload.js.map +1 -0
  142. package/dist/application/files/index.d.ts +31 -0
  143. package/dist/application/files/index.d.ts.map +1 -0
  144. package/dist/application/files/index.js +31 -0
  145. package/dist/application/files/index.js.map +1 -0
  146. package/dist/application/files/inspection-limits.d.ts +8 -0
  147. package/dist/application/files/inspection-limits.d.ts.map +1 -0
  148. package/dist/application/files/inspection-limits.js +2 -0
  149. package/dist/application/files/inspection-limits.js.map +1 -0
  150. package/dist/application/files/is-file-key.d.ts +7 -0
  151. package/dist/application/files/is-file-key.d.ts.map +1 -0
  152. package/dist/application/files/is-file-key.js +11 -0
  153. package/dist/application/files/is-file-key.js.map +1 -0
  154. package/dist/application/files/listed-file.d.ts +7 -0
  155. package/dist/application/files/listed-file.d.ts.map +1 -0
  156. package/dist/application/files/listed-file.js +2 -0
  157. package/dist/application/files/listed-file.js.map +1 -0
  158. package/dist/application/files/max-signed-url-seconds.d.ts +3 -0
  159. package/dist/application/files/max-signed-url-seconds.d.ts.map +1 -0
  160. package/dist/application/files/max-signed-url-seconds.js +3 -0
  161. package/dist/application/files/max-signed-url-seconds.js.map +1 -0
  162. package/dist/application/files/media-type-of.d.ts +3 -0
  163. package/dist/application/files/media-type-of.d.ts.map +1 -0
  164. package/dist/application/files/media-type-of.js +5 -0
  165. package/dist/application/files/media-type-of.js.map +1 -0
  166. package/dist/application/files/pending-upload-link.d.ts +10 -0
  167. package/dist/application/files/pending-upload-link.d.ts.map +1 -0
  168. package/dist/application/files/pending-upload-link.js +2 -0
  169. package/dist/application/files/pending-upload-link.js.map +1 -0
  170. package/dist/application/files/pending-upload.d.ts +15 -0
  171. package/dist/application/files/pending-upload.d.ts.map +1 -0
  172. package/dist/application/files/pending-upload.js +2 -0
  173. package/dist/application/files/pending-upload.js.map +1 -0
  174. package/dist/application/files/put-options.d.ts +7 -0
  175. package/dist/application/files/put-options.d.ts.map +1 -0
  176. package/dist/application/files/put-options.js +2 -0
  177. package/dist/application/files/put-options.js.map +1 -0
  178. package/dist/application/files/received-file.d.ts +15 -0
  179. package/dist/application/files/received-file.d.ts.map +1 -0
  180. package/dist/application/files/received-file.js +2 -0
  181. package/dist/application/files/received-file.js.map +1 -0
  182. package/dist/application/files/scan-verdict.d.ts +8 -0
  183. package/dist/application/files/scan-verdict.d.ts.map +1 -0
  184. package/dist/application/files/scan-verdict.js +2 -0
  185. package/dist/application/files/scan-verdict.js.map +1 -0
  186. package/dist/application/files/signature-of.d.ts +3 -0
  187. package/dist/application/files/signature-of.d.ts.map +1 -0
  188. package/dist/application/files/signature-of.js +28 -0
  189. package/dist/application/files/signature-of.js.map +1 -0
  190. package/dist/application/files/signed-download.d.ts +6 -0
  191. package/dist/application/files/signed-download.d.ts.map +1 -0
  192. package/dist/application/files/signed-download.js +2 -0
  193. package/dist/application/files/signed-download.js.map +1 -0
  194. package/dist/application/files/signed-upload.d.ts +9 -0
  195. package/dist/application/files/signed-upload.d.ts.map +1 -0
  196. package/dist/application/files/signed-upload.js +2 -0
  197. package/dist/application/files/signed-upload.js.map +1 -0
  198. package/dist/application/files/signed-url.d.ts +6 -0
  199. package/dist/application/files/signed-url.d.ts.map +1 -0
  200. package/dist/application/files/signed-url.js +2 -0
  201. package/dist/application/files/signed-url.js.map +1 -0
  202. package/dist/application/files/staged-key-of.d.ts +5 -0
  203. package/dist/application/files/staged-key-of.d.ts.map +1 -0
  204. package/dist/application/files/staged-key-of.js +7 -0
  205. package/dist/application/files/staged-key-of.js.map +1 -0
  206. package/dist/application/files/stored-file.d.ts +16 -0
  207. package/dist/application/files/stored-file.d.ts.map +1 -0
  208. package/dist/application/files/stored-file.js +2 -0
  209. package/dist/application/files/stored-file.js.map +1 -0
  210. package/dist/application/files/upload-url-options.d.ts +12 -0
  211. package/dist/application/files/upload-url-options.d.ts.map +1 -0
  212. package/dist/application/files/upload-url-options.js +2 -0
  213. package/dist/application/files/upload-url-options.js.map +1 -0
  214. package/dist/application/persistence/append-changes.d.ts +18 -0
  215. package/dist/application/persistence/append-changes.d.ts.map +1 -0
  216. package/dist/application/persistence/append-changes.js +17 -0
  217. package/dist/application/persistence/append-changes.js.map +1 -0
  218. package/dist/application/ports/checkpoint-store.d.ts +14 -0
  219. package/dist/application/ports/checkpoint-store.d.ts.map +1 -0
  220. package/dist/application/ports/checkpoint-store.js +10 -0
  221. package/dist/application/ports/checkpoint-store.js.map +1 -0
  222. package/dist/application/ports/event-store.d.ts +24 -0
  223. package/dist/application/ports/event-store.d.ts.map +1 -0
  224. package/dist/application/ports/event-store.js +12 -0
  225. package/dist/application/ports/event-store.js.map +1 -0
  226. package/dist/application/ports/file-keys.d.ts +9 -0
  227. package/dist/application/ports/file-keys.d.ts.map +1 -0
  228. package/dist/application/ports/file-keys.js +10 -0
  229. package/dist/application/ports/file-keys.js.map +1 -0
  230. package/dist/application/ports/file-scanner.d.ts +13 -0
  231. package/dist/application/ports/file-scanner.d.ts.map +1 -0
  232. package/dist/application/ports/file-scanner.js +12 -0
  233. package/dist/application/ports/file-scanner.js.map +1 -0
  234. package/dist/application/ports/file-storage.d.ts +40 -0
  235. package/dist/application/ports/file-storage.d.ts.map +1 -0
  236. package/dist/application/ports/file-storage.js +15 -0
  237. package/dist/application/ports/file-storage.js.map +1 -0
  238. package/dist/application/ports/served-file-storage.d.ts +16 -0
  239. package/dist/application/ports/served-file-storage.d.ts.map +1 -0
  240. package/dist/application/ports/served-file-storage.js +12 -0
  241. package/dist/application/ports/served-file-storage.js.map +1 -0
  242. package/dist/application/ports/snapshot-store.d.ts +8 -0
  243. package/dist/application/ports/snapshot-store.d.ts.map +1 -0
  244. package/dist/application/ports/snapshot-store.js +7 -0
  245. package/dist/application/ports/snapshot-store.js.map +1 -0
  246. package/dist/application/ports/subject-key-store.d.ts +17 -0
  247. package/dist/application/ports/subject-key-store.d.ts.map +1 -0
  248. package/dist/application/ports/subject-key-store.js +13 -0
  249. package/dist/application/ports/subject-key-store.js.map +1 -0
  250. package/dist/declarations/decorators/projection-options.d.ts +5 -0
  251. package/dist/declarations/decorators/projection-options.d.ts.map +1 -0
  252. package/dist/declarations/decorators/projection-options.js +2 -0
  253. package/dist/declarations/decorators/projection-options.js.map +1 -0
  254. package/dist/declarations/decorators/projection.d.ts +4 -0
  255. package/dist/declarations/decorators/projection.d.ts.map +1 -1
  256. package/dist/declarations/decorators/projection.js +16 -8
  257. package/dist/declarations/decorators/projection.js.map +1 -1
  258. package/dist/declarations/model/projection-declaration.d.ts +3 -0
  259. package/dist/declarations/model/projection-declaration.d.ts.map +1 -1
  260. package/dist/declarations/model/projection-feed.d.ts +8 -0
  261. package/dist/declarations/model/projection-feed.d.ts.map +1 -0
  262. package/dist/declarations/model/projection-feed.js +2 -0
  263. package/dist/declarations/model/projection-feed.js.map +1 -0
  264. package/dist/declarations/projection/applying-projection.d.ts +14 -0
  265. package/dist/declarations/projection/applying-projection.d.ts.map +1 -0
  266. package/dist/declarations/projection/applying-projection.js +32 -0
  267. package/dist/declarations/projection/applying-projection.js.map +1 -0
  268. package/dist/declarations.d.ts +3 -0
  269. package/dist/declarations.d.ts.map +1 -1
  270. package/dist/declarations.js +1 -0
  271. package/dist/declarations.js.map +1 -1
  272. package/dist/domain/event-sourcing/aggregate-history.d.ts +10 -0
  273. package/dist/domain/event-sourcing/aggregate-history.d.ts.map +1 -0
  274. package/dist/domain/event-sourcing/aggregate-history.js +2 -0
  275. package/dist/domain/event-sourcing/aggregate-history.js.map +1 -0
  276. package/dist/domain/event-sourcing/aggregate-snapshot.d.ts +6 -0
  277. package/dist/domain/event-sourcing/aggregate-snapshot.d.ts.map +1 -0
  278. package/dist/domain/event-sourcing/aggregate-snapshot.js +2 -0
  279. package/dist/domain/event-sourcing/aggregate-snapshot.js.map +1 -0
  280. package/dist/domain/event-sourcing/appliers.d.ts +12 -0
  281. package/dist/domain/event-sourcing/appliers.d.ts.map +1 -0
  282. package/dist/domain/event-sourcing/appliers.js +2 -0
  283. package/dist/domain/event-sourcing/appliers.js.map +1 -0
  284. package/dist/domain/event-sourcing/event-sourced-aggregate.d.ts +28 -0
  285. package/dist/domain/event-sourcing/event-sourced-aggregate.d.ts.map +1 -0
  286. package/dist/domain/event-sourcing/event-sourced-aggregate.js +51 -0
  287. package/dist/domain/event-sourcing/event-sourced-aggregate.js.map +1 -0
  288. package/dist/domain/event-sourcing/unstored-events.d.ts +8 -0
  289. package/dist/domain/event-sourcing/unstored-events.d.ts.map +1 -0
  290. package/dist/domain/event-sourcing/unstored-events.js +7 -0
  291. package/dist/domain/event-sourcing/unstored-events.js.map +1 -0
  292. package/dist/index.d.ts +52 -32
  293. package/dist/index.d.ts.map +1 -1
  294. package/dist/index.js +52 -32
  295. package/dist/index.js.map +1 -1
  296. package/dist/infrastructure/domain-events/after-commit.d.ts +10 -0
  297. package/dist/infrastructure/domain-events/after-commit.d.ts.map +1 -0
  298. package/dist/infrastructure/domain-events/after-commit.js +19 -0
  299. package/dist/infrastructure/domain-events/after-commit.js.map +1 -0
  300. package/dist/infrastructure/domain-events/at-commit.d.ts +11 -0
  301. package/dist/infrastructure/domain-events/at-commit.d.ts.map +1 -0
  302. package/dist/infrastructure/domain-events/at-commit.js +19 -0
  303. package/dist/infrastructure/domain-events/at-commit.js.map +1 -0
  304. package/dist/infrastructure/domain-events/commit-step.d.ts +10 -0
  305. package/dist/infrastructure/domain-events/commit-step.d.ts.map +1 -0
  306. package/dist/infrastructure/domain-events/commit-step.js +2 -0
  307. package/dist/infrastructure/domain-events/commit-step.js.map +1 -0
  308. package/dist/infrastructure/domain-events/unit-of-work-scope.d.ts +5 -0
  309. package/dist/infrastructure/domain-events/unit-of-work-scope.d.ts.map +1 -1
  310. package/dist/infrastructure/domain-events/unit-of-work-scope.js.map +1 -1
  311. package/dist/infrastructure/domain-events/within-unit-of-work.d.ts +3 -1
  312. package/dist/infrastructure/domain-events/within-unit-of-work.d.ts.map +1 -1
  313. package/dist/infrastructure/domain-events/within-unit-of-work.js +32 -5
  314. package/dist/infrastructure/domain-events/within-unit-of-work.js.map +1 -1
  315. package/dist/infrastructure/event-sourcing/catch-up-subscription.d.ts +33 -0
  316. package/dist/infrastructure/event-sourcing/catch-up-subscription.d.ts.map +1 -0
  317. package/dist/infrastructure/event-sourcing/catch-up-subscription.js +39 -0
  318. package/dist/infrastructure/event-sourcing/catch-up-subscription.js.map +1 -0
  319. package/dist/infrastructure/event-sourcing/event-serializer.d.ts +35 -0
  320. package/dist/infrastructure/event-sourcing/event-serializer.d.ts.map +1 -0
  321. package/dist/infrastructure/event-sourcing/event-serializer.js +104 -0
  322. package/dist/infrastructure/event-sourcing/event-serializer.js.map +1 -0
  323. package/dist/infrastructure/event-sourcing/event-sourced-repository.d.ts +32 -0
  324. package/dist/infrastructure/event-sourcing/event-sourced-repository.d.ts.map +1 -0
  325. package/dist/infrastructure/event-sourcing/event-sourced-repository.js +68 -0
  326. package/dist/infrastructure/event-sourcing/event-sourced-repository.js.map +1 -0
  327. package/dist/infrastructure/event-sourcing/event-sourcing-stores.d.ts +12 -0
  328. package/dist/infrastructure/event-sourcing/event-sourcing-stores.d.ts.map +1 -0
  329. package/dist/infrastructure/event-sourcing/event-sourcing-stores.js +2 -0
  330. package/dist/infrastructure/event-sourcing/event-sourcing-stores.js.map +1 -0
  331. package/dist/infrastructure/event-sourcing/event-store-projection-rebuild.d.ts +34 -0
  332. package/dist/infrastructure/event-sourcing/event-store-projection-rebuild.d.ts.map +1 -0
  333. package/dist/infrastructure/event-sourcing/event-store-projection-rebuild.js +48 -0
  334. package/dist/infrastructure/event-sourcing/event-store-projection-rebuild.js.map +1 -0
  335. package/dist/infrastructure/event-sourcing/personal-data-cipher.d.ts +19 -0
  336. package/dist/infrastructure/event-sourcing/personal-data-cipher.d.ts.map +1 -0
  337. package/dist/infrastructure/event-sourcing/personal-data-cipher.js +84 -0
  338. package/dist/infrastructure/event-sourcing/personal-data-cipher.js.map +1 -0
  339. package/dist/infrastructure/event-sourcing/postgres/event-store-tables-options.d.ts +6 -0
  340. package/dist/infrastructure/event-sourcing/postgres/event-store-tables-options.d.ts.map +1 -0
  341. package/dist/infrastructure/event-sourcing/postgres/event-store-tables-options.js +2 -0
  342. package/dist/infrastructure/event-sourcing/postgres/event-store-tables-options.js.map +1 -0
  343. package/dist/infrastructure/event-sourcing/postgres/event-store-tables-sql.d.ts +9 -0
  344. package/dist/infrastructure/event-sourcing/postgres/event-store-tables-sql.d.ts.map +1 -0
  345. package/dist/infrastructure/event-sourcing/postgres/event-store-tables-sql.js +32 -0
  346. package/dist/infrastructure/event-sourcing/postgres/event-store-tables-sql.js.map +1 -0
  347. package/dist/infrastructure/event-sourcing/postgres/event-store-tables.d.ts +9 -0
  348. package/dist/infrastructure/event-sourcing/postgres/event-store-tables.d.ts.map +1 -0
  349. package/dist/infrastructure/event-sourcing/postgres/event-store-tables.js +9 -0
  350. package/dist/infrastructure/event-sourcing/postgres/event-store-tables.js.map +1 -0
  351. package/dist/infrastructure/event-sourcing/postgres/is-append-conflict.d.ts +3 -0
  352. package/dist/infrastructure/event-sourcing/postgres/is-append-conflict.d.ts.map +1 -0
  353. package/dist/infrastructure/event-sourcing/postgres/is-append-conflict.js +22 -0
  354. package/dist/infrastructure/event-sourcing/postgres/is-append-conflict.js.map +1 -0
  355. package/dist/infrastructure/event-sourcing/postgres/postgres-checkpoint-store.d.ts +12 -0
  356. package/dist/infrastructure/event-sourcing/postgres/postgres-checkpoint-store.d.ts.map +1 -0
  357. package/dist/infrastructure/event-sourcing/postgres/postgres-checkpoint-store.js +26 -0
  358. package/dist/infrastructure/event-sourcing/postgres/postgres-checkpoint-store.js.map +1 -0
  359. package/dist/infrastructure/event-sourcing/postgres/postgres-event-sourcing.d.ts +6 -0
  360. package/dist/infrastructure/event-sourcing/postgres/postgres-event-sourcing.d.ts.map +1 -0
  361. package/dist/infrastructure/event-sourcing/postgres/postgres-event-sourcing.js +14 -0
  362. package/dist/infrastructure/event-sourcing/postgres/postgres-event-sourcing.js.map +1 -0
  363. package/dist/infrastructure/event-sourcing/postgres/postgres-event-store.d.ts +31 -0
  364. package/dist/infrastructure/event-sourcing/postgres/postgres-event-store.d.ts.map +1 -0
  365. package/dist/infrastructure/event-sourcing/postgres/postgres-event-store.js +120 -0
  366. package/dist/infrastructure/event-sourcing/postgres/postgres-event-store.js.map +1 -0
  367. package/dist/infrastructure/event-sourcing/postgres/postgres-snapshot-store.d.ts +13 -0
  368. package/dist/infrastructure/event-sourcing/postgres/postgres-snapshot-store.d.ts.map +1 -0
  369. package/dist/infrastructure/event-sourcing/postgres/postgres-snapshot-store.js +28 -0
  370. package/dist/infrastructure/event-sourcing/postgres/postgres-snapshot-store.js.map +1 -0
  371. package/dist/infrastructure/event-sourcing/postgres/postgres-subject-key-store.d.ts +21 -0
  372. package/dist/infrastructure/event-sourcing/postgres/postgres-subject-key-store.d.ts.map +1 -0
  373. package/dist/infrastructure/event-sourcing/postgres/postgres-subject-key-store.js +48 -0
  374. package/dist/infrastructure/event-sourcing/postgres/postgres-subject-key-store.js.map +1 -0
  375. package/dist/infrastructure/event-sourcing/postgres/qualified-table.d.ts +4 -0
  376. package/dist/infrastructure/event-sourcing/postgres/qualified-table.d.ts.map +1 -0
  377. package/dist/infrastructure/event-sourcing/postgres/qualified-table.js +10 -0
  378. package/dist/infrastructure/event-sourcing/postgres/qualified-table.js.map +1 -0
  379. package/dist/infrastructure/event-sourcing/postgres/stored-data-from.d.ts +4 -0
  380. package/dist/infrastructure/event-sourcing/postgres/stored-data-from.d.ts.map +1 -0
  381. package/dist/infrastructure/event-sourcing/postgres/stored-data-from.js +23 -0
  382. package/dist/infrastructure/event-sourcing/postgres/stored-data-from.js.map +1 -0
  383. package/dist/infrastructure/event-sourcing/rewrite-objects.d.ts +8 -0
  384. package/dist/infrastructure/event-sourcing/rewrite-objects.d.ts.map +1 -0
  385. package/dist/infrastructure/event-sourcing/rewrite-objects.js +16 -0
  386. package/dist/infrastructure/event-sourcing/rewrite-objects.js.map +1 -0
  387. package/dist/infrastructure/event-sourcing/snapshot-policy.d.ts +14 -0
  388. package/dist/infrastructure/event-sourcing/snapshot-policy.d.ts.map +1 -0
  389. package/dist/infrastructure/event-sourcing/snapshot-policy.js +2 -0
  390. package/dist/infrastructure/event-sourcing/snapshot-policy.js.map +1 -0
  391. package/dist/infrastructure/event-sourcing/stored-origins.d.ts +5 -0
  392. package/dist/infrastructure/event-sourcing/stored-origins.d.ts.map +1 -0
  393. package/dist/infrastructure/event-sourcing/stored-origins.js +3 -0
  394. package/dist/infrastructure/event-sourcing/stored-origins.js.map +1 -0
  395. package/dist/infrastructure/event-sourcing/stored-stamp-of.d.ts +10 -0
  396. package/dist/infrastructure/event-sourcing/stored-stamp-of.d.ts.map +1 -0
  397. package/dist/infrastructure/event-sourcing/stored-stamp-of.js +14 -0
  398. package/dist/infrastructure/event-sourcing/stored-stamp-of.js.map +1 -0
  399. package/dist/infrastructure/files/accept-every-file-scanner.d.ts +7 -0
  400. package/dist/infrastructure/files/accept-every-file-scanner.d.ts.map +1 -0
  401. package/dist/infrastructure/files/accept-every-file-scanner.js +7 -0
  402. package/dist/infrastructure/files/accept-every-file-scanner.js.map +1 -0
  403. package/dist/infrastructure/files/collect.d.ts +4 -0
  404. package/dist/infrastructure/files/collect.d.ts.map +1 -0
  405. package/dist/infrastructure/files/collect.js +11 -0
  406. package/dist/infrastructure/files/collect.js.map +1 -0
  407. package/dist/infrastructure/files/file-grant.d.ts +11 -0
  408. package/dist/infrastructure/files/file-grant.d.ts.map +1 -0
  409. package/dist/infrastructure/files/file-grant.js +2 -0
  410. package/dist/infrastructure/files/file-grant.js.map +1 -0
  411. package/dist/infrastructure/files/file-inspection.d.ts +22 -0
  412. package/dist/infrastructure/files/file-inspection.d.ts.map +1 -0
  413. package/dist/infrastructure/files/file-inspection.js +66 -0
  414. package/dist/infrastructure/files/file-inspection.js.map +1 -0
  415. package/dist/infrastructure/files/file-staging.d.ts +59 -0
  416. package/dist/infrastructure/files/file-staging.d.ts.map +1 -0
  417. package/dist/infrastructure/files/file-staging.js +142 -0
  418. package/dist/infrastructure/files/file-staging.js.map +1 -0
  419. package/dist/infrastructure/files/file-uploads-middleware.d.ts +11 -0
  420. package/dist/infrastructure/files/file-uploads-middleware.d.ts.map +1 -0
  421. package/dist/infrastructure/files/file-uploads-middleware.js +25 -0
  422. package/dist/infrastructure/files/file-uploads-middleware.js.map +1 -0
  423. package/dist/infrastructure/files/in-memory-file-storage.d.ts +25 -0
  424. package/dist/infrastructure/files/in-memory-file-storage.d.ts.map +1 -0
  425. package/dist/infrastructure/files/in-memory-file-storage.js +73 -0
  426. package/dist/infrastructure/files/in-memory-file-storage.js.map +1 -0
  427. package/dist/infrastructure/files/is-file-grant.d.ts +3 -0
  428. package/dist/infrastructure/files/is-file-grant.d.ts.map +1 -0
  429. package/dist/infrastructure/files/is-file-grant.js +16 -0
  430. package/dist/infrastructure/files/is-file-grant.js.map +1 -0
  431. package/dist/infrastructure/files/is-stored-metadata.d.ts +3 -0
  432. package/dist/infrastructure/files/is-stored-metadata.d.ts.map +1 -0
  433. package/dist/infrastructure/files/is-stored-metadata.js +8 -0
  434. package/dist/infrastructure/files/is-stored-metadata.js.map +1 -0
  435. package/dist/infrastructure/files/local-file-storage-options.d.ts +6 -0
  436. package/dist/infrastructure/files/local-file-storage-options.d.ts.map +1 -0
  437. package/dist/infrastructure/files/local-file-storage-options.js +2 -0
  438. package/dist/infrastructure/files/local-file-storage-options.js.map +1 -0
  439. package/dist/infrastructure/files/local-file-storage.d.ts +29 -0
  440. package/dist/infrastructure/files/local-file-storage.d.ts.map +1 -0
  441. package/dist/infrastructure/files/local-file-storage.js +103 -0
  442. package/dist/infrastructure/files/local-file-storage.js.map +1 -0
  443. package/dist/infrastructure/files/local-paths.d.ts +12 -0
  444. package/dist/infrastructure/files/local-paths.d.ts.map +1 -0
  445. package/dist/infrastructure/files/local-paths.js +33 -0
  446. package/dist/infrastructure/files/local-paths.js.map +1 -0
  447. package/dist/infrastructure/files/purge-staged-files.d.ts +16 -0
  448. package/dist/infrastructure/files/purge-staged-files.d.ts.map +1 -0
  449. package/dist/infrastructure/files/purge-staged-files.js +21 -0
  450. package/dist/infrastructure/files/purge-staged-files.js.map +1 -0
  451. package/dist/infrastructure/files/self-signed-file-storage.d.ts +23 -0
  452. package/dist/infrastructure/files/self-signed-file-storage.d.ts.map +1 -0
  453. package/dist/infrastructure/files/self-signed-file-storage.js +57 -0
  454. package/dist/infrastructure/files/self-signed-file-storage.js.map +1 -0
  455. package/dist/infrastructure/files/signed-file-tokens.d.ts +20 -0
  456. package/dist/infrastructure/files/signed-file-tokens.d.ts.map +1 -0
  457. package/dist/infrastructure/files/signed-file-tokens.js +45 -0
  458. package/dist/infrastructure/files/signed-file-tokens.js.map +1 -0
  459. package/dist/infrastructure/files/signed-link-options.d.ts +10 -0
  460. package/dist/infrastructure/files/signed-link-options.d.ts.map +1 -0
  461. package/dist/infrastructure/files/signed-link-options.js +2 -0
  462. package/dist/infrastructure/files/signed-link-options.js.map +1 -0
  463. package/dist/infrastructure/files/stored-metadata.d.ts +6 -0
  464. package/dist/infrastructure/files/stored-metadata.d.ts.map +1 -0
  465. package/dist/infrastructure/files/stored-metadata.js +2 -0
  466. package/dist/infrastructure/files/stored-metadata.js.map +1 -0
  467. package/dist/infrastructure/files/tenant-file-keys.d.ts +20 -0
  468. package/dist/infrastructure/files/tenant-file-keys.d.ts.map +1 -0
  469. package/dist/infrastructure/files/tenant-file-keys.js +27 -0
  470. package/dist/infrastructure/files/tenant-file-keys.js.map +1 -0
  471. package/dist/infrastructure/files/upload-desk.d.ts +8 -0
  472. package/dist/infrastructure/files/upload-desk.d.ts.map +1 -0
  473. package/dist/infrastructure/files/upload-desk.js +2 -0
  474. package/dist/infrastructure/files/upload-desk.js.map +1 -0
  475. package/dist/infrastructure/files/without-trailing-slashes.d.ts +3 -0
  476. package/dist/infrastructure/files/without-trailing-slashes.d.ts.map +1 -0
  477. package/dist/infrastructure/files/without-trailing-slashes.js +9 -0
  478. package/dist/infrastructure/files/without-trailing-slashes.js.map +1 -0
  479. package/dist/infrastructure/in-memory/in-memory-checkpoint-store.d.ts +8 -0
  480. package/dist/infrastructure/in-memory/in-memory-checkpoint-store.d.ts.map +1 -0
  481. package/dist/infrastructure/in-memory/in-memory-checkpoint-store.js +15 -0
  482. package/dist/infrastructure/in-memory/in-memory-checkpoint-store.js.map +1 -0
  483. package/dist/infrastructure/in-memory/in-memory-event-store.d.ts +14 -0
  484. package/dist/infrastructure/in-memory/in-memory-event-store.d.ts.map +1 -0
  485. package/dist/infrastructure/in-memory/in-memory-event-store.js +37 -0
  486. package/dist/infrastructure/in-memory/in-memory-event-store.js.map +1 -0
  487. package/dist/infrastructure/in-memory/in-memory-snapshot-store.d.ts +9 -0
  488. package/dist/infrastructure/in-memory/in-memory-snapshot-store.d.ts.map +1 -0
  489. package/dist/infrastructure/in-memory/in-memory-snapshot-store.js +15 -0
  490. package/dist/infrastructure/in-memory/in-memory-snapshot-store.js.map +1 -0
  491. package/dist/infrastructure/in-memory/in-memory-subject-key-store.d.ts +10 -0
  492. package/dist/infrastructure/in-memory/in-memory-subject-key-store.d.ts.map +1 -0
  493. package/dist/infrastructure/in-memory/in-memory-subject-key-store.js +21 -0
  494. package/dist/infrastructure/in-memory/in-memory-subject-key-store.js.map +1 -0
  495. package/dist/infrastructure/read-model/shadow-read-model-store.d.ts +20 -0
  496. package/dist/infrastructure/read-model/shadow-read-model-store.d.ts.map +1 -0
  497. package/dist/infrastructure/read-model/shadow-read-model-store.js +25 -0
  498. package/dist/infrastructure/read-model/shadow-read-model-store.js.map +1 -0
  499. package/package.json +1 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"collect.js","sourceRoot":"","sources":["../../../src/infrastructure/files/collect.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAEvC,uFAAuF;AACvF,MAAM,UAAU,OAAO,CAAC,MAAgB;IACtC,OAAO,IAAI,QAAQ,CAAC;QAClB,KAAK,CAAC,KAAa,EAAE,SAAS,EAAE,IAAI;YAClC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACnB,IAAI,EAAE,CAAC;QACT,CAAC;KACF,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,11 @@
1
+ /** What a signed link allows: one action on one key, until `expiresAt` (seconds since the epoch). */
2
+ export interface FileGrant {
3
+ readonly action: 'download' | 'upload';
4
+ readonly key: string;
5
+ readonly expiresAt: number;
6
+ readonly fileName?: string;
7
+ readonly mediaType?: string;
8
+ /** The size an upload may not exceed, in bytes. */
9
+ readonly maxBytes?: number;
10
+ }
11
+ //# sourceMappingURL=file-grant.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-grant.d.ts","sourceRoot":"","sources":["../../../src/infrastructure/files/file-grant.ts"],"names":[],"mappings":"AAAA,qGAAqG;AACrG,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,MAAM,EAAE,UAAU,GAAG,QAAQ,CAAC;IACvC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,mDAAmD;IACnD,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;CAC5B"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=file-grant.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-grant.js","sourceRoot":"","sources":["../../../src/infrastructure/files/file-grant.ts"],"names":[],"mappings":""}
@@ -0,0 +1,22 @@
1
+ import { Transform, type TransformCallback } from 'node:stream';
2
+ import type { InspectionLimits } from '../../application/files/inspection-limits.js';
3
+ /**
4
+ * A pass-through for content on its way to a storage: counts it and fails beyond `maxBytes`,
5
+ * hashes it, and when an expectation is given holds back the first bytes until they prove the
6
+ * declared media type. Nothing of a refused content goes on. Read `size` and `checksum` once the
7
+ * stream has finished.
8
+ */
9
+ export declare class FileInspection extends Transform {
10
+ private readonly limits;
11
+ size: number;
12
+ private readonly hash;
13
+ private held;
14
+ private verified;
15
+ constructor(limits?: InspectionLimits);
16
+ get checksum(): string;
17
+ _transform(chunk: unknown, _encoding: BufferEncoding, done: TransformCallback): void;
18
+ _flush(done: TransformCallback): void;
19
+ private pass;
20
+ private refusalOf;
21
+ }
22
+ //# sourceMappingURL=file-inspection.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-inspection.d.ts","sourceRoot":"","sources":["../../../src/infrastructure/files/file-inspection.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,KAAK,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAIhE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,8CAA8C,CAAC;AAKrF;;;;;GAKG;AACH,qBAAa,cAAe,SAAQ,SAAS;IAS/B,OAAO,CAAC,QAAQ,CAAC,MAAM;IARnC,IAAI,SAAK;IAET,OAAO,CAAC,QAAQ,CAAC,IAAI,CAA8B;IAEnD,OAAO,CAAC,IAAI,CAAgB;IAE5B,OAAO,CAAC,QAAQ,CAAU;IAE1B,YAA6B,MAAM,GAAE,gBAAqB,EAGzD;IAED,IAAI,QAAQ,IAAI,MAAM,CAErB;IAEQ,UAAU,CAAC,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,IAAI,EAAE,iBAAiB,GAAG,IAAI,CAa5F;IAEQ,MAAM,CAAC,IAAI,EAAE,iBAAiB,GAAG,IAAI,CAE7C;IAED,OAAO,CAAC,IAAI;IAqBZ,OAAO,CAAC,SAAS;CAalB"}
@@ -0,0 +1,66 @@
1
+ import { createHash } from 'node:crypto';
2
+ import { Transform } from 'node:stream';
3
+ import { acceptsMediaType } from '../../application/files/accepts-media-type.js';
4
+ import { contentMatches } from '../../application/files/content-matches.js';
5
+ import { FileError } from '../../application/files/file-error.js';
6
+ /** Enough bytes for every signature, and for a fair judgement of text. */
7
+ const HEAD_BYTES = 4_096;
8
+ /**
9
+ * A pass-through for content on its way to a storage: counts it and fails beyond `maxBytes`,
10
+ * hashes it, and when an expectation is given holds back the first bytes until they prove the
11
+ * declared media type. Nothing of a refused content goes on. Read `size` and `checksum` once the
12
+ * stream has finished.
13
+ */
14
+ export class FileInspection extends Transform {
15
+ limits;
16
+ size = 0;
17
+ hash = createHash('sha256');
18
+ held = [];
19
+ verified;
20
+ constructor(limits = {}) {
21
+ super();
22
+ this.limits = limits;
23
+ this.verified = limits.expected === undefined;
24
+ }
25
+ get checksum() {
26
+ return `sha256:${this.hash.copy().digest('hex')}`;
27
+ }
28
+ _transform(chunk, _encoding, done) {
29
+ const bytes = Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk instanceof Uint8Array ? chunk : String(chunk));
30
+ this.size += bytes.length;
31
+ if (this.limits.maxBytes !== undefined && this.size > this.limits.maxBytes) {
32
+ done(FileError.tooLarge(this.limits.maxBytes));
33
+ return;
34
+ }
35
+ this.hash.update(bytes);
36
+ this.pass(bytes, false, done);
37
+ }
38
+ _flush(done) {
39
+ this.pass(Buffer.alloc(0), true, done);
40
+ }
41
+ pass(bytes, ended, done) {
42
+ if (this.verified) {
43
+ done(null, bytes);
44
+ return;
45
+ }
46
+ this.held.push(bytes);
47
+ const head = Buffer.concat(this.held);
48
+ if (head.length < HEAD_BYTES && !ended) {
49
+ done();
50
+ return;
51
+ }
52
+ this.held = [];
53
+ this.verified = true;
54
+ done(this.refusalOf(head), head);
55
+ }
56
+ refusalOf(head) {
57
+ const { expected } = this.limits;
58
+ if (expected === undefined) {
59
+ return null;
60
+ }
61
+ const valid = acceptsMediaType(expected.accepted, expected.mediaType) &&
62
+ contentMatches(head.subarray(0, HEAD_BYTES), expected.mediaType);
63
+ return valid ? null : FileError.unsupportedMediaType(expected.mediaType, expected.accepted);
64
+ }
65
+ }
66
+ //# sourceMappingURL=file-inspection.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-inspection.js","sourceRoot":"","sources":["../../../src/infrastructure/files/file-inspection.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,59 @@
1
+ import type { ContentExpectation } from '../../application/files/content-expectation.js';
2
+ import type { FileSource } from '../../application/files/file-source.js';
3
+ import type { PendingUpload } from '../../application/files/pending-upload.js';
4
+ import type { PendingUploadLink } from '../../application/files/pending-upload-link.js';
5
+ import type { PutOptions } from '../../application/files/put-options.js';
6
+ import type { StoredFile } from '../../application/files/stored-file.js';
7
+ import type { UploadUrlOptions } from '../../application/files/upload-url-options.js';
8
+ import type { ErrorReporter } from '../../application/ports/error-reporter.js';
9
+ import type { FileScanner } from '../../application/ports/file-scanner.js';
10
+ import type { FileStorage } from '../../application/ports/file-storage.js';
11
+ /**
12
+ * Keeps the storage consistent with the database, which a write to the storage cannot join in a
13
+ * transaction. A file is staged first (under `staging/`, scanned, where nothing reads), before
14
+ * the unit of work opens when it comes from a client. The handler records its reference, under
15
+ * its final key, in the aggregate it saves, and asks for `promoteOnCommit`: the file moves to its
16
+ * key as the last step of the transaction, and back to `staging/` if the transaction rolls back.
17
+ * So a committed row never points into `staging/`, and every staged file is an orphan (a refused
18
+ * command, a rollback, an upload never confirmed) that `purge` removes on a schedule.
19
+ */
20
+ export declare class FileStaging {
21
+ private readonly storage;
22
+ private readonly scanner;
23
+ private readonly reporter;
24
+ constructor(storage: FileStorage, scanner: FileScanner, reporter: ErrorReporter);
25
+ /** Writes the content under the staged key, then has it scanned; a refused file is removed and `FILE_REJECTED` thrown. */
26
+ stage(key: string, content: FileSource, options: PutOptions): Promise<StoredFile>;
27
+ /**
28
+ * A request the client sends the file with, straight to the staged key, and the grant to keep
29
+ * on the server (on the aggregate that awaits the file) for `confirm` to read back.
30
+ */
31
+ uploadUrl(key: string, options: UploadUrlOptions & Pick<ContentExpectation, 'accepted'>): Promise<PendingUploadLink>;
32
+ /**
33
+ * Reads a file uploaded straight to the staged key of a grant the server kept: its size against
34
+ * the cap of the grant, its media type on its bytes, its checksum, the scan. A file that fails
35
+ * is discarded.
36
+ */
37
+ confirm(pending: PendingUpload): Promise<StoredFile>;
38
+ /**
39
+ * Moves the staged file to its key as the last step of the unit of work in progress, so that
40
+ * the commit and the file land together: a promotion that fails rolls the command back, and a
41
+ * transaction that rolls back after it returns the file to `staging/`. At once outside of any.
42
+ */
43
+ promoteOnCommit(key: string): Promise<void>;
44
+ /** Moves the staged file to its key. Promoting twice is not an error; a key staged nowhere and stored nowhere is `FILE_NOT_FOUND`. */
45
+ promote(key: string): Promise<void>;
46
+ /** Deletes a stored file once the unit of work in progress has committed, the one its aggregate no longer references; a failure is reported. */
47
+ deleteAfterCommit(key: string): Promise<void>;
48
+ /** Removes a staged file, one a command will not record. */
49
+ discard(key: string): Promise<void>;
50
+ /**
51
+ * Removes the staged files older than the instant; answers how many. Each is an orphan: no
52
+ * committed row points into `staging/`, since a promotion lands with its commit.
53
+ */
54
+ purge(olderThan: Date): Promise<number>;
55
+ /** A transaction rolled back after the promotion: the file goes back where the purge finds it; a failure is reported. */
56
+ private returnToStaging;
57
+ private scanned;
58
+ }
59
+ //# sourceMappingURL=file-staging.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-staging.d.ts","sourceRoot":"","sources":["../../../src/infrastructure/files/file-staging.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,gDAAgD,CAAC;AAEzF,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,wCAAwC,CAAC;AAEzE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,2CAA2C,CAAC;AAC/E,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,gDAAgD,CAAC;AACxF,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,wCAAwC,CAAC;AAEzE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,wCAAwC,CAAC;AACzE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,+CAA+C,CAAC;AACtF,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,2CAA2C,CAAC;AAC/E,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,yCAAyC,CAAC;AAC3E,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,yCAAyC,CAAC;AAK3E;;;;;;;;GAQG;AACH,qBAAa,WAAW;IAMpB,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,QAAQ;IAH3B,YACmB,OAAO,EAAE,WAAW,EACpB,OAAO,EAAE,WAAW,EACpB,QAAQ,EAAE,aAAa,EACtC;IAEJ,0HAA0H;IACpH,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC,CAItF;IAED;;;OAGG;IACG,SAAS,CACb,GAAG,EAAE,MAAM,EACX,OAAO,EAAE,gBAAgB,GAAG,IAAI,CAAC,kBAAkB,EAAE,UAAU,CAAC,GAC/D,OAAO,CAAC,iBAAiB,CAAC,CAU5B;IAED;;;;OAIG;IACG,OAAO,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,UAAU,CAAC,CAqBzD;IAED;;;;OAIG;IACH,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAE1C;IAED,sIAAsI;IAChI,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAUxC;IAED,gJAAgJ;IAChJ,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAM5C;IAED,4DAA4D;IAC5D,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAElC;IAED;;;OAGG;IACG,KAAK,CAAC,SAAS,EAAE,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,CAW5C;IAED,yHAAyH;YAC3G,eAAe;YAUf,OAAO;CAkBtB"}
@@ -0,0 +1,142 @@
1
+ import { Writable } from 'node:stream';
2
+ import { pipeline } from 'node:stream/promises';
3
+ import { errorReportOf } from '../../application/error-reporting/error-report-of.js';
4
+ import { reportOnce } from '../../application/error-reporting/report-once.js';
5
+ import { assertFinalKey } from '../../application/files/assert-final-key.js';
6
+ import { FileError } from '../../application/files/file-error.js';
7
+ import { mediaTypeOf } from '../../application/files/media-type-of.js';
8
+ import { STAGING_PREFIX, stagedKeyOf } from '../../application/files/staged-key-of.js';
9
+ import { afterCommit } from '../domain-events/after-commit.js';
10
+ import { atCommit } from '../domain-events/at-commit.js';
11
+ import { FileInspection } from './file-inspection.js';
12
+ /**
13
+ * Keeps the storage consistent with the database, which a write to the storage cannot join in a
14
+ * transaction. A file is staged first (under `staging/`, scanned, where nothing reads), before
15
+ * the unit of work opens when it comes from a client. The handler records its reference, under
16
+ * its final key, in the aggregate it saves, and asks for `promoteOnCommit`: the file moves to its
17
+ * key as the last step of the transaction, and back to `staging/` if the transaction rolls back.
18
+ * So a committed row never points into `staging/`, and every staged file is an orphan (a refused
19
+ * command, a rollback, an upload never confirmed) that `purge` removes on a schedule.
20
+ */
21
+ export class FileStaging {
22
+ storage;
23
+ scanner;
24
+ reporter;
25
+ static {
26
+ Object.defineProperty(this, 'tokenKey', { value: 'kernel.FileStaging' });
27
+ }
28
+ constructor(storage, scanner, reporter) {
29
+ this.storage = storage;
30
+ this.scanner = scanner;
31
+ this.reporter = reporter;
32
+ }
33
+ /** Writes the content under the staged key, then has it scanned; a refused file is removed and `FILE_REJECTED` thrown. */
34
+ async stage(key, content, options) {
35
+ const staged = await this.storage.put(stagedKeyOf(assertFinalKey(key)), content, options);
36
+ return this.scanned({ ...staged, key });
37
+ }
38
+ /**
39
+ * A request the client sends the file with, straight to the staged key, and the grant to keep
40
+ * on the server (on the aggregate that awaits the file) for `confirm` to read back.
41
+ */
42
+ async uploadUrl(key, options) {
43
+ const { expiresInSeconds, mediaType, maxBytes, accepted } = options;
44
+ const link = await this.storage.signedUploadUrl(stagedKeyOf(assertFinalKey(key)), {
45
+ expiresInSeconds,
46
+ mediaType,
47
+ maxBytes,
48
+ });
49
+ return { link, pending: { key, mediaType: mediaTypeOf(mediaType), accepted, maxBytes } };
50
+ }
51
+ /**
52
+ * Reads a file uploaded straight to the staged key of a grant the server kept: its size against
53
+ * the cap of the grant, its media type on its bytes, its checksum, the scan. A file that fails
54
+ * is discarded.
55
+ */
56
+ async confirm(pending) {
57
+ const { key, maxBytes, mediaType, accepted } = pending;
58
+ const content = await this.storage.get(stagedKeyOf(assertFinalKey(key)));
59
+ if (content === undefined) {
60
+ throw FileError.notFound(key);
61
+ }
62
+ const inspection = new FileInspection({ maxBytes, expected: { mediaType, accepted } });
63
+ await pipeline(content.stream, inspection, sink()).catch(async (error) => {
64
+ await this.discard(key);
65
+ throw error;
66
+ });
67
+ return this.scanned({
68
+ key,
69
+ size: inspection.size,
70
+ mediaType: mediaTypeOf(mediaType),
71
+ checksum: inspection.checksum,
72
+ });
73
+ }
74
+ /**
75
+ * Moves the staged file to its key as the last step of the unit of work in progress, so that
76
+ * the commit and the file land together: a promotion that fails rolls the command back, and a
77
+ * transaction that rolls back after it returns the file to `staging/`. At once outside of any.
78
+ */
79
+ promoteOnCommit(key) {
80
+ return atCommit({ apply: () => this.promote(key), undo: () => this.returnToStaging(key) });
81
+ }
82
+ /** Moves the staged file to its key. Promoting twice is not an error; a key staged nowhere and stored nowhere is `FILE_NOT_FOUND`. */
83
+ async promote(key) {
84
+ if ((await this.storage.stat(stagedKeyOf(assertFinalKey(key)))) !== undefined) {
85
+ await this.storage.move(stagedKeyOf(key), key);
86
+ return;
87
+ }
88
+ if ((await this.storage.stat(key)) === undefined) {
89
+ throw FileError.notFound(key);
90
+ }
91
+ }
92
+ /** Deletes a stored file once the unit of work in progress has committed, the one its aggregate no longer references; a failure is reported. */
93
+ deleteAfterCommit(key) {
94
+ return afterCommit(async () => {
95
+ await this.storage.delete(key).catch((error) => {
96
+ reportOnce(this.reporter, error, errorReportOf(error, { origin: 'process', operation: 'delete stored file' }));
97
+ });
98
+ });
99
+ }
100
+ /** Removes a staged file, one a command will not record. */
101
+ discard(key) {
102
+ return this.storage.delete(stagedKeyOf(key));
103
+ }
104
+ /**
105
+ * Removes the staged files older than the instant; answers how many. Each is an orphan: no
106
+ * committed row points into `staging/`, since a promotion lands with its commit.
107
+ */
108
+ async purge(olderThan) {
109
+ let purged = 0;
110
+ for await (const file of this.storage.list(STAGING_PREFIX)) {
111
+ if (file.lastModified < olderThan) {
112
+ await this.storage.delete(file.key);
113
+ purged += 1;
114
+ }
115
+ }
116
+ return purged;
117
+ }
118
+ /** A transaction rolled back after the promotion: the file goes back where the purge finds it; a failure is reported. */
119
+ async returnToStaging(key) {
120
+ await this.storage.move(key, stagedKeyOf(key)).catch((error) => {
121
+ reportOnce(this.reporter, error, errorReportOf(error, { origin: 'process', operation: 'return file to staging' }));
122
+ });
123
+ }
124
+ async scanned(file) {
125
+ const verdict = await this.scanner.scan(file, async () => {
126
+ const content = await this.storage.get(stagedKeyOf(file.key));
127
+ if (content === undefined) {
128
+ throw FileError.notFound(file.key);
129
+ }
130
+ return content.stream;
131
+ });
132
+ if (!verdict.accepted) {
133
+ await this.discard(file.key);
134
+ throw FileError.rejected(file.key, verdict.reason);
135
+ }
136
+ return file;
137
+ }
138
+ }
139
+ function sink() {
140
+ return new Writable({ write: (_chunk, _encoding, done) => done() });
141
+ }
142
+ //# sourceMappingURL=file-staging.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-staging.js","sourceRoot":"","sources":["../../../src/infrastructure/files/file-staging.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import type { BusMiddleware } from '../../application/messaging/bus-middleware.js';
2
+ import type { UploadDesk } from './upload-desk.js';
3
+ /**
4
+ * Stages the `FileUpload` fields of a command, each under a new key of its area, scanned, then
5
+ * hands over to the next middleware. Installed after the permission check, so a refused actor
6
+ * stores nothing, and before the unit of work (and the audit entry that opens it), so that no
7
+ * transaction waits while a client uploads. `desk` is resolved only for a command that carries
8
+ * a file: building the bus opens nothing.
9
+ */
10
+ export declare function fileUploadsMiddleware(desk: () => UploadDesk): BusMiddleware;
11
+ //# sourceMappingURL=file-uploads-middleware.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-uploads-middleware.d.ts","sourceRoot":"","sources":["../../../src/infrastructure/files/file-uploads-middleware.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,+CAA+C,CAAC;AAEnF,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAEnD;;;;;;GAMG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,UAAU,GAAG,aAAa,CAgB3E"}
@@ -0,0 +1,25 @@
1
+ import { FileUpload } from '../../application/files/file-upload.js';
2
+ /**
3
+ * Stages the `FileUpload` fields of a command, each under a new key of its area, scanned, then
4
+ * hands over to the next middleware. Installed after the permission check, so a refused actor
5
+ * stores nothing, and before the unit of work (and the audit entry that opens it), so that no
6
+ * transaction waits while a client uploads. `desk` is resolved only for a command that carries
7
+ * a file: building the bus opens nothing.
8
+ */
9
+ export function fileUploadsMiddleware(desk) {
10
+ return async (message, next, info) => {
11
+ const uploads = info.kind === 'command' ? waitingUploadsOf(message) : [];
12
+ if (uploads.length > 0) {
13
+ const { keys, staging } = desk();
14
+ for (const upload of uploads) {
15
+ const { stream, mediaType } = upload.received;
16
+ upload.stagedAs(await staging.stage(keys.next(upload.area), stream, { mediaType }));
17
+ }
18
+ }
19
+ return next();
20
+ };
21
+ }
22
+ function waitingUploadsOf(message) {
23
+ return Object.values(message).filter((value) => value instanceof FileUpload && !value.isStaged);
24
+ }
25
+ //# sourceMappingURL=file-uploads-middleware.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-uploads-middleware.js","sourceRoot":"","sources":["../../../src/infrastructure/files/file-uploads-middleware.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,wCAAwC,CAAC;AAKpE;;;;;;GAMG;AACH,MAAM,UAAU,qBAAqB,CAAC,IAAsB;IAC1D,OAAO,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE;QACnC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAEzE,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACvB,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,EAAE,CAAC;YAEjC,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;gBAC7B,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,CAAC,QAAQ,CAAC;gBAE9C,MAAM,CAAC,QAAQ,CAAC,MAAM,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC;YACtF,CAAC;QACH,CAAC;QAED,OAAO,IAAI,EAAE,CAAC;IAChB,CAAC,CAAC;AACJ,CAAC;AAED,SAAS,gBAAgB,CAAC,OAAgB;IACxC,OAAO,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,KAAK,EAAuB,EAAE,CAAC,KAAK,YAAY,UAAU,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;AACvH,CAAC"}
@@ -0,0 +1,25 @@
1
+ import type { FileContent } from '../../application/files/file-content.js';
2
+ import type { FileMetadata } from '../../application/files/file-metadata.js';
3
+ import type { FileSource } from '../../application/files/file-source.js';
4
+ import type { ListedFile } from '../../application/files/listed-file.js';
5
+ import type { PutOptions } from '../../application/files/put-options.js';
6
+ import type { StoredFile } from '../../application/files/stored-file.js';
7
+ import type { SignedLinkOptions } from './signed-link-options.js';
8
+ import { SelfSignedFileStorage } from './self-signed-file-storage.js';
9
+ /** The storage of the tests: files in a map, the same contract as every connector, links served by the application. */
10
+ export declare class InMemoryFileStorage extends SelfSignedFileStorage {
11
+ private readonly files;
12
+ private readonly clock;
13
+ constructor(options?: SignedLinkOptions);
14
+ /** The keys held, sorted: what a test asserts about the storage, for instance that a rollback left none. */
15
+ keys(): readonly string[];
16
+ put(key: string, content: FileSource, options: PutOptions): Promise<StoredFile>;
17
+ get(key: string): Promise<FileContent | undefined>;
18
+ stat(key: string): Promise<FileMetadata | undefined>;
19
+ delete(key: string): Promise<void>;
20
+ copy(from: string, to: string): Promise<void>;
21
+ move(from: string, to: string): Promise<void>;
22
+ list(prefix: string): AsyncIterable<ListedFile>;
23
+ private held;
24
+ }
25
+ //# sourceMappingURL=in-memory-file-storage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"in-memory-file-storage.d.ts","sourceRoot":"","sources":["../../../src/infrastructure/files/in-memory-file-storage.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,yCAAyC,CAAC;AAG3E,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,0CAA0C,CAAC;AAC7E,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,wCAAwC,CAAC;AACzE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,wCAAwC,CAAC;AAEzE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,wCAAwC,CAAC;AACzE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,wCAAwC,CAAC;AAKzE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAClE,OAAO,EAAE,qBAAqB,EAAE,MAAM,+BAA+B,CAAC;AAOtE,uHAAuH;AACvH,qBAAa,mBAAoB,SAAQ,qBAAqB;IAC5D,OAAO,CAAC,QAAQ,CAAC,KAAK,CAA2B;IAEjD,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAQ;IAE9B,YAAY,OAAO,GAAE,iBAAsB,EAG1C;IAED,4GAA4G;IAC5G,IAAI,IAAI,SAAS,MAAM,EAAE,CAExB;IAEK,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC,CAgBpF;IAED,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,GAAG,SAAS,CAAC,CAMjD;IAED,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,GAAG,SAAS,CAAC,CAEnD;IAED,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAIjC;IAED,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAS5C;IAEK,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAMlD;IAEM,IAAI,CAAC,MAAM,EAAE,MAAM,GAAG,aAAa,CAAC,UAAU,CAAC,CAIrD;IAED,OAAO,CAAC,IAAI;CASb"}
@@ -0,0 +1,73 @@
1
+ import { Readable } from 'node:stream';
2
+ import { pipeline } from 'node:stream/promises';
3
+ import { FileError } from '../../application/files/file-error.js';
4
+ import { assertFileKey } from '../../application/files/assert-file-key.js';
5
+ import { mediaTypeOf } from '../../application/files/media-type-of.js';
6
+ import { SystemClock } from '../clock/system-clock.js';
7
+ import { collect } from './collect.js';
8
+ import { FileInspection } from './file-inspection.js';
9
+ import { SelfSignedFileStorage } from './self-signed-file-storage.js';
10
+ /** The storage of the tests: files in a map, the same contract as every connector, links served by the application. */
11
+ export class InMemoryFileStorage extends SelfSignedFileStorage {
12
+ files = new Map();
13
+ clock;
14
+ constructor(options = {}) {
15
+ super(options);
16
+ this.clock = options.clock ?? new SystemClock();
17
+ }
18
+ /** The keys held, sorted: what a test asserts about the storage, for instance that a rollback left none. */
19
+ keys() {
20
+ return [...this.files.keys()].sort();
21
+ }
22
+ async put(key, content, options) {
23
+ assertFileKey(key);
24
+ const inspection = new FileInspection(options.maxBytes === undefined ? {} : { maxBytes: options.maxBytes });
25
+ const chunks = [];
26
+ await pipeline(content, inspection, collect(chunks));
27
+ const { size, checksum } = inspection;
28
+ const mediaType = mediaTypeOf(options.mediaType);
29
+ this.files.set(key, {
30
+ bytes: Buffer.concat(chunks),
31
+ metadata: { key, size, mediaType, checksum, lastModified: this.clock.now() },
32
+ });
33
+ return { key, size, mediaType, checksum };
34
+ }
35
+ get(key) {
36
+ const held = this.files.get(assertFileKey(key));
37
+ return Promise.resolve(held === undefined ? undefined : { metadata: held.metadata, stream: Readable.from([held.bytes]) });
38
+ }
39
+ stat(key) {
40
+ return Promise.resolve(this.files.get(assertFileKey(key))?.metadata);
41
+ }
42
+ delete(key) {
43
+ this.files.delete(assertFileKey(key));
44
+ return Promise.resolve();
45
+ }
46
+ copy(from, to) {
47
+ const held = this.held(from);
48
+ this.files.set(assertFileKey(to), {
49
+ bytes: held.bytes,
50
+ metadata: { ...held.metadata, key: to, lastModified: this.clock.now() },
51
+ });
52
+ return Promise.resolve();
53
+ }
54
+ async move(from, to) {
55
+ await this.copy(from, to);
56
+ if (from !== to) {
57
+ this.files.delete(from);
58
+ }
59
+ }
60
+ async *list(prefix) {
61
+ for (const { metadata } of [...this.files.values()].filter((held) => held.metadata.key.startsWith(prefix))) {
62
+ yield { key: metadata.key, size: metadata.size, lastModified: metadata.lastModified };
63
+ }
64
+ }
65
+ held(key) {
66
+ const held = this.files.get(assertFileKey(key));
67
+ if (held === undefined) {
68
+ throw FileError.notFound(key);
69
+ }
70
+ return held;
71
+ }
72
+ }
73
+ //# sourceMappingURL=in-memory-file-storage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"in-memory-file-storage.js","sourceRoot":"","sources":["../../../src/infrastructure/files/in-memory-file-storage.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { FileGrant } from './file-grant.js';
2
+ export declare function isFileGrant(value: unknown): value is FileGrant;
3
+ //# sourceMappingURL=is-file-grant.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"is-file-grant.d.ts","sourceRoot":"","sources":["../../../src/infrastructure/files/is-file-grant.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAEjD,wBAAgB,WAAW,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,SAAS,CAe9D"}
@@ -0,0 +1,16 @@
1
+ export function isFileGrant(value) {
2
+ if (typeof value !== 'object' || value === null) {
3
+ return false;
4
+ }
5
+ const grant = value;
6
+ return ((grant.action === 'download' || grant.action === 'upload') &&
7
+ typeof grant.key === 'string' &&
8
+ typeof grant.expiresAt === 'number' &&
9
+ optionalString(grant.fileName) &&
10
+ optionalString(grant.mediaType) &&
11
+ (grant.maxBytes === undefined || typeof grant.maxBytes === 'number'));
12
+ }
13
+ function optionalString(value) {
14
+ return value === undefined || typeof value === 'string';
15
+ }
16
+ //# sourceMappingURL=is-file-grant.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"is-file-grant.js","sourceRoot":"","sources":["../../../src/infrastructure/files/is-file-grant.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,WAAW,CAAC,KAAc;IACxC,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;QAChD,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM,KAAK,GAA8C,KAAK,CAAC;IAE/D,OAAO,CACL,CAAC,KAAK,CAAC,MAAM,KAAK,UAAU,IAAI,KAAK,CAAC,MAAM,KAAK,QAAQ,CAAC;QAC1D,OAAO,KAAK,CAAC,GAAG,KAAK,QAAQ;QAC7B,OAAO,KAAK,CAAC,SAAS,KAAK,QAAQ;QACnC,cAAc,CAAC,KAAK,CAAC,QAAQ,CAAC;QAC9B,cAAc,CAAC,KAAK,CAAC,SAAS,CAAC;QAC/B,CAAC,KAAK,CAAC,QAAQ,KAAK,SAAS,IAAI,OAAO,KAAK,CAAC,QAAQ,KAAK,QAAQ,CAAC,CACrE,CAAC;AACJ,CAAC;AAED,SAAS,cAAc,CAAC,KAAc;IACpC,OAAO,KAAK,KAAK,SAAS,IAAI,OAAO,KAAK,KAAK,QAAQ,CAAC;AAC1D,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { StoredMetadata } from './stored-metadata.js';
2
+ export declare function isStoredMetadata(value: unknown): value is StoredMetadata;
3
+ //# sourceMappingURL=is-stored-metadata.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"is-stored-metadata.d.ts","sourceRoot":"","sources":["../../../src/infrastructure/files/is-stored-metadata.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAE3D,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,cAAc,CAQxE"}
@@ -0,0 +1,8 @@
1
+ export function isStoredMetadata(value) {
2
+ if (typeof value !== 'object' || value === null) {
3
+ return false;
4
+ }
5
+ const metadata = value;
6
+ return typeof metadata.mediaType === 'string' && typeof metadata.checksum === 'string';
7
+ }
8
+ //# sourceMappingURL=is-stored-metadata.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"is-stored-metadata.js","sourceRoot":"","sources":["../../../src/infrastructure/files/is-stored-metadata.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,gBAAgB,CAAC,KAAc;IAC7C,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;QAChD,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM,QAAQ,GAAmD,KAAK,CAAC;IAEvE,OAAO,OAAO,QAAQ,CAAC,SAAS,KAAK,QAAQ,IAAI,OAAO,QAAQ,CAAC,QAAQ,KAAK,QAAQ,CAAC;AACzF,CAAC"}
@@ -0,0 +1,6 @@
1
+ import type { SignedLinkOptions } from './signed-link-options.js';
2
+ export interface LocalFileStorageOptions extends SignedLinkOptions {
3
+ /** The directory that holds the files, created when missing. Keep it out of version control. */
4
+ readonly directory: string;
5
+ }
6
+ //# sourceMappingURL=local-file-storage-options.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"local-file-storage-options.d.ts","sourceRoot":"","sources":["../../../src/infrastructure/files/local-file-storage-options.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAElE,MAAM,WAAW,uBAAwB,SAAQ,iBAAiB;IAChE,gGAAgG;IAChG,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;CAC5B"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=local-file-storage-options.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"local-file-storage-options.js","sourceRoot":"","sources":["../../../src/infrastructure/files/local-file-storage-options.ts"],"names":[],"mappings":""}
@@ -0,0 +1,29 @@
1
+ import type { FileContent } from '../../application/files/file-content.js';
2
+ import type { FileMetadata } from '../../application/files/file-metadata.js';
3
+ import type { FileSource } from '../../application/files/file-source.js';
4
+ import type { ListedFile } from '../../application/files/listed-file.js';
5
+ import type { PutOptions } from '../../application/files/put-options.js';
6
+ import type { StoredFile } from '../../application/files/stored-file.js';
7
+ import type { LocalFileStorageOptions } from './local-file-storage-options.js';
8
+ import { SelfSignedFileStorage } from './self-signed-file-storage.js';
9
+ /**
10
+ * The storage of development: a directory, each file under its key and what the file system does
11
+ * not know beside it in `.metadata/`. A write goes to `.incoming/` first and is renamed into place,
12
+ * so a failed or refused write leaves nothing under its key. One machine only: in a deployment
13
+ * with several instances, use an object store.
14
+ */
15
+ export declare class LocalFileStorage extends SelfSignedFileStorage {
16
+ private readonly paths;
17
+ constructor(options: LocalFileStorageOptions);
18
+ put(key: string, content: FileSource, options: PutOptions): Promise<StoredFile>;
19
+ get(key: string): Promise<FileContent | undefined>;
20
+ stat(key: string): Promise<FileMetadata | undefined>;
21
+ delete(key: string): Promise<void>;
22
+ copy(from: string, to: string): Promise<void>;
23
+ move(from: string, to: string): Promise<void>;
24
+ list(prefix: string): AsyncIterable<ListedFile>;
25
+ private existing;
26
+ private readMetadata;
27
+ private writeMetadata;
28
+ }
29
+ //# sourceMappingURL=local-file-storage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"local-file-storage.d.ts","sourceRoot":"","sources":["../../../src/infrastructure/files/local-file-storage.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,yCAAyC,CAAC;AAE3E,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,0CAA0C,CAAC;AAC7E,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,wCAAwC,CAAC;AACzE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,wCAAwC,CAAC;AAEzE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,wCAAwC,CAAC;AACzE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,wCAAwC,CAAC;AAEzE,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,iCAAiC,CAAC;AAI/E,OAAO,EAAE,qBAAqB,EAAE,MAAM,+BAA+B,CAAC;AAEtE;;;;;GAKG;AACH,qBAAa,gBAAiB,SAAQ,qBAAqB;IACzD,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAa;IAEnC,YAAY,OAAO,EAAE,uBAAuB,EAG3C;IAEK,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC,CAuBpF;IAEK,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,GAAG,SAAS,CAAC,CAIvD;IAEK,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,GAAG,SAAS,CAAC,CAUzD;IAEK,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAGvC;IAEK,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAKlD;IAEK,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAQlD;IAEM,IAAI,CAAC,MAAM,EAAE,MAAM,GAAG,aAAa,CAAC,UAAU,CAAC,CAYrD;YAEa,QAAQ;YAMR,YAAY;YAOZ,aAAa;CAO5B"}