@de-otio/trellis 0.4.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 (1150) hide show
  1. package/dist/db.d.ts +36 -0
  2. package/dist/db.d.ts.map +1 -0
  3. package/dist/db.js +39 -0
  4. package/dist/db.js.map +1 -0
  5. package/dist/env.d.ts +107 -0
  6. package/dist/env.d.ts.map +1 -0
  7. package/dist/env.js +268 -0
  8. package/dist/env.js.map +1 -0
  9. package/dist/extensions.d.ts +15 -0
  10. package/dist/extensions.d.ts.map +1 -0
  11. package/dist/extensions.js +35 -0
  12. package/dist/extensions.js.map +1 -0
  13. package/dist/index.d.ts +8 -0
  14. package/dist/index.d.ts.map +1 -0
  15. package/dist/index.js +15 -0
  16. package/dist/index.js.map +1 -0
  17. package/dist/lambda/cleanup-cron.d.ts +2 -0
  18. package/dist/lambda/cleanup-cron.d.ts.map +1 -0
  19. package/dist/lambda/cleanup-cron.js +38 -0
  20. package/dist/lambda/cleanup-cron.js.map +1 -0
  21. package/dist/lambda/create-auth-challenge.d.ts +2 -0
  22. package/dist/lambda/create-auth-challenge.d.ts.map +1 -0
  23. package/dist/lambda/create-auth-challenge.js +108 -0
  24. package/dist/lambda/create-auth-challenge.js.map +1 -0
  25. package/dist/lambda/custom-message.d.ts +3 -0
  26. package/dist/lambda/custom-message.d.ts.map +1 -0
  27. package/dist/lambda/custom-message.js +29 -0
  28. package/dist/lambda/custom-message.js.map +1 -0
  29. package/dist/lambda/define-auth-challenge.d.ts +2 -0
  30. package/dist/lambda/define-auth-challenge.d.ts.map +1 -0
  31. package/dist/lambda/define-auth-challenge.js +27 -0
  32. package/dist/lambda/define-auth-challenge.js.map +1 -0
  33. package/dist/lambda/delete-account-worker.d.ts +3 -0
  34. package/dist/lambda/delete-account-worker.d.ts.map +1 -0
  35. package/dist/lambda/delete-account-worker.js +122 -0
  36. package/dist/lambda/delete-account-worker.js.map +1 -0
  37. package/dist/lambda/diagnostics-proxy.d.ts +6 -0
  38. package/dist/lambda/diagnostics-proxy.d.ts.map +1 -0
  39. package/dist/lambda/diagnostics-proxy.js +154 -0
  40. package/dist/lambda/diagnostics-proxy.js.map +1 -0
  41. package/dist/lambda/e2e-sweeper.d.ts +18 -0
  42. package/dist/lambda/e2e-sweeper.d.ts.map +1 -0
  43. package/dist/lambda/e2e-sweeper.js +127 -0
  44. package/dist/lambda/e2e-sweeper.js.map +1 -0
  45. package/dist/lambda/federation-outbox-worker.d.ts +3 -0
  46. package/dist/lambda/federation-outbox-worker.d.ts.map +1 -0
  47. package/dist/lambda/federation-outbox-worker.js +11 -0
  48. package/dist/lambda/federation-outbox-worker.js.map +1 -0
  49. package/dist/lambda/followers-events-worker.d.ts +3 -0
  50. package/dist/lambda/followers-events-worker.d.ts.map +1 -0
  51. package/dist/lambda/followers-events-worker.js +11 -0
  52. package/dist/lambda/followers-events-worker.js.map +1 -0
  53. package/dist/lambda/hourly-cron.d.ts +2 -0
  54. package/dist/lambda/hourly-cron.d.ts.map +1 -0
  55. package/dist/lambda/hourly-cron.js +101 -0
  56. package/dist/lambda/hourly-cron.js.map +1 -0
  57. package/dist/lambda/link-check-worker.d.ts +3 -0
  58. package/dist/lambda/link-check-worker.d.ts.map +1 -0
  59. package/dist/lambda/link-check-worker.js +11 -0
  60. package/dist/lambda/link-check-worker.js.map +1 -0
  61. package/dist/lambda/maintenance-cron.d.ts +2 -0
  62. package/dist/lambda/maintenance-cron.d.ts.map +1 -0
  63. package/dist/lambda/maintenance-cron.js +127 -0
  64. package/dist/lambda/maintenance-cron.js.map +1 -0
  65. package/dist/lambda/media-processing-worker.d.ts +3 -0
  66. package/dist/lambda/media-processing-worker.d.ts.map +1 -0
  67. package/dist/lambda/media-processing-worker.js +95 -0
  68. package/dist/lambda/media-processing-worker.js.map +1 -0
  69. package/dist/lambda/media-reconciliation-worker.d.ts +3 -0
  70. package/dist/lambda/media-reconciliation-worker.d.ts.map +1 -0
  71. package/dist/lambda/media-reconciliation-worker.js +11 -0
  72. package/dist/lambda/media-reconciliation-worker.js.map +1 -0
  73. package/dist/lambda/nightly-cron.d.ts +2 -0
  74. package/dist/lambda/nightly-cron.d.ts.map +1 -0
  75. package/dist/lambda/nightly-cron.js +348 -0
  76. package/dist/lambda/nightly-cron.js.map +1 -0
  77. package/dist/lambda/post-confirmation.d.ts +3 -0
  78. package/dist/lambda/post-confirmation.d.ts.map +1 -0
  79. package/dist/lambda/post-confirmation.js +79 -0
  80. package/dist/lambda/post-confirmation.js.map +1 -0
  81. package/dist/lambda/pre-signup.d.ts +3 -0
  82. package/dist/lambda/pre-signup.d.ts.map +1 -0
  83. package/dist/lambda/pre-signup.js +35 -0
  84. package/dist/lambda/pre-signup.js.map +1 -0
  85. package/dist/lambda/pre-token-generation.d.ts +3 -0
  86. package/dist/lambda/pre-token-generation.d.ts.map +1 -0
  87. package/dist/lambda/pre-token-generation.js +79 -0
  88. package/dist/lambda/pre-token-generation.js.map +1 -0
  89. package/dist/lambda/tools/check-health.d.ts +6 -0
  90. package/dist/lambda/tools/check-health.d.ts.map +1 -0
  91. package/dist/lambda/tools/check-health.js +24 -0
  92. package/dist/lambda/tools/check-health.js.map +1 -0
  93. package/dist/lambda/tools/describe-services.d.ts +20 -0
  94. package/dist/lambda/tools/describe-services.d.ts.map +1 -0
  95. package/dist/lambda/tools/describe-services.js +41 -0
  96. package/dist/lambda/tools/describe-services.js.map +1 -0
  97. package/dist/lambda/tools/get-cost-report.d.ts +16 -0
  98. package/dist/lambda/tools/get-cost-report.d.ts.map +1 -0
  99. package/dist/lambda/tools/get-cost-report.js +54 -0
  100. package/dist/lambda/tools/get-cost-report.js.map +1 -0
  101. package/dist/lambda/tools/get-errors.d.ts +11 -0
  102. package/dist/lambda/tools/get-errors.d.ts.map +1 -0
  103. package/dist/lambda/tools/get-errors.js +62 -0
  104. package/dist/lambda/tools/get-errors.js.map +1 -0
  105. package/dist/lambda/tools/get-feature-flags.d.ts +8 -0
  106. package/dist/lambda/tools/get-feature-flags.d.ts.map +1 -0
  107. package/dist/lambda/tools/get-feature-flags.js +23 -0
  108. package/dist/lambda/tools/get-feature-flags.js.map +1 -0
  109. package/dist/lambda/tools/get-queue-status.d.ts +9 -0
  110. package/dist/lambda/tools/get-queue-status.d.ts.map +1 -0
  111. package/dist/lambda/tools/get-queue-status.js +46 -0
  112. package/dist/lambda/tools/get-queue-status.js.map +1 -0
  113. package/dist/lambda/tools/search-logs.d.ts +19 -0
  114. package/dist/lambda/tools/search-logs.d.ts.map +1 -0
  115. package/dist/lambda/tools/search-logs.js +55 -0
  116. package/dist/lambda/tools/search-logs.js.map +1 -0
  117. package/dist/lambda/tools/send-alert.d.ts +8 -0
  118. package/dist/lambda/tools/send-alert.d.ts.map +1 -0
  119. package/dist/lambda/tools/send-alert.js +29 -0
  120. package/dist/lambda/tools/send-alert.js.map +1 -0
  121. package/dist/lambda/verify-auth-challenge.d.ts +2 -0
  122. package/dist/lambda/verify-auth-challenge.d.ts.map +1 -0
  123. package/dist/lambda/verify-auth-challenge.js +35 -0
  124. package/dist/lambda/verify-auth-challenge.js.map +1 -0
  125. package/dist/lib/abuse-metrics.d.ts +44 -0
  126. package/dist/lib/abuse-metrics.d.ts.map +1 -0
  127. package/dist/lib/abuse-metrics.js +322 -0
  128. package/dist/lib/abuse-metrics.js.map +1 -0
  129. package/dist/lib/activitypub/activity-processor.d.ts +89 -0
  130. package/dist/lib/activitypub/activity-processor.d.ts.map +1 -0
  131. package/dist/lib/activitypub/activity-processor.js +709 -0
  132. package/dist/lib/activitypub/activity-processor.js.map +1 -0
  133. package/dist/lib/activitypub/activity-service.d.ts +47 -0
  134. package/dist/lib/activitypub/activity-service.d.ts.map +1 -0
  135. package/dist/lib/activitypub/activity-service.js +165 -0
  136. package/dist/lib/activitypub/activity-service.js.map +1 -0
  137. package/dist/lib/activitypub/actor.d.ts +44 -0
  138. package/dist/lib/activitypub/actor.d.ts.map +1 -0
  139. package/dist/lib/activitypub/actor.js +116 -0
  140. package/dist/lib/activitypub/actor.js.map +1 -0
  141. package/dist/lib/activitypub/audience-service.d.ts +52 -0
  142. package/dist/lib/activitypub/audience-service.d.ts.map +1 -0
  143. package/dist/lib/activitypub/audience-service.js +245 -0
  144. package/dist/lib/activitypub/audience-service.js.map +1 -0
  145. package/dist/lib/activitypub/crypto.d.ts +42 -0
  146. package/dist/lib/activitypub/crypto.d.ts.map +1 -0
  147. package/dist/lib/activitypub/crypto.js +129 -0
  148. package/dist/lib/activitypub/crypto.js.map +1 -0
  149. package/dist/lib/activitypub/delivery-service.d.ts +44 -0
  150. package/dist/lib/activitypub/delivery-service.d.ts.map +1 -0
  151. package/dist/lib/activitypub/delivery-service.js +259 -0
  152. package/dist/lib/activitypub/delivery-service.js.map +1 -0
  153. package/dist/lib/activitypub/dispatchers/entity-actor.d.ts +50 -0
  154. package/dist/lib/activitypub/dispatchers/entity-actor.d.ts.map +1 -0
  155. package/dist/lib/activitypub/dispatchers/entity-actor.js +247 -0
  156. package/dist/lib/activitypub/dispatchers/entity-actor.js.map +1 -0
  157. package/dist/lib/activitypub/dispatchers/group-actor.d.ts +47 -0
  158. package/dist/lib/activitypub/dispatchers/group-actor.d.ts.map +1 -0
  159. package/dist/lib/activitypub/dispatchers/group-actor.js +202 -0
  160. package/dist/lib/activitypub/dispatchers/group-actor.js.map +1 -0
  161. package/dist/lib/activitypub/dispatchers/user-actor.d.ts +47 -0
  162. package/dist/lib/activitypub/dispatchers/user-actor.d.ts.map +1 -0
  163. package/dist/lib/activitypub/dispatchers/user-actor.js +207 -0
  164. package/dist/lib/activitypub/dispatchers/user-actor.js.map +1 -0
  165. package/dist/lib/activitypub/dm-service.d.ts +35 -0
  166. package/dist/lib/activitypub/dm-service.d.ts.map +1 -0
  167. package/dist/lib/activitypub/dm-service.js +73 -0
  168. package/dist/lib/activitypub/dm-service.js.map +1 -0
  169. package/dist/lib/activitypub/entity-profile-service.d.ts +43 -0
  170. package/dist/lib/activitypub/entity-profile-service.d.ts.map +1 -0
  171. package/dist/lib/activitypub/entity-profile-service.js +80 -0
  172. package/dist/lib/activitypub/entity-profile-service.js.map +1 -0
  173. package/dist/lib/activitypub/fedify/config.d.ts +15 -0
  174. package/dist/lib/activitypub/fedify/config.d.ts.map +1 -0
  175. package/dist/lib/activitypub/fedify/config.js +38 -0
  176. package/dist/lib/activitypub/fedify/config.js.map +1 -0
  177. package/dist/lib/activitypub/fedify/context.d.ts +21 -0
  178. package/dist/lib/activitypub/fedify/context.d.ts.map +1 -0
  179. package/dist/lib/activitypub/fedify/context.js +67 -0
  180. package/dist/lib/activitypub/fedify/context.js.map +1 -0
  181. package/dist/lib/activitypub/fedify/runtime.d.ts +18 -0
  182. package/dist/lib/activitypub/fedify/runtime.d.ts.map +1 -0
  183. package/dist/lib/activitypub/fedify/runtime.js +26 -0
  184. package/dist/lib/activitypub/fedify/runtime.js.map +1 -0
  185. package/dist/lib/activitypub/friendship-service.d.ts +15 -0
  186. package/dist/lib/activitypub/friendship-service.d.ts.map +1 -0
  187. package/dist/lib/activitypub/friendship-service.js +26 -0
  188. package/dist/lib/activitypub/friendship-service.js.map +1 -0
  189. package/dist/lib/activitypub/group-service.d.ts +83 -0
  190. package/dist/lib/activitypub/group-service.d.ts.map +1 -0
  191. package/dist/lib/activitypub/group-service.js +301 -0
  192. package/dist/lib/activitypub/group-service.js.map +1 -0
  193. package/dist/lib/activitypub/http-signatures.d.ts +41 -0
  194. package/dist/lib/activitypub/http-signatures.d.ts.map +1 -0
  195. package/dist/lib/activitypub/http-signatures.js +284 -0
  196. package/dist/lib/activitypub/http-signatures.js.map +1 -0
  197. package/dist/lib/activitypub/jsonld.d.ts +39 -0
  198. package/dist/lib/activitypub/jsonld.d.ts.map +1 -0
  199. package/dist/lib/activitypub/jsonld.js +97 -0
  200. package/dist/lib/activitypub/jsonld.js.map +1 -0
  201. package/dist/lib/activitypub/listeners/friends-collection.d.ts +20 -0
  202. package/dist/lib/activitypub/listeners/friends-collection.d.ts.map +1 -0
  203. package/dist/lib/activitypub/listeners/friends-collection.js +105 -0
  204. package/dist/lib/activitypub/listeners/friends-collection.js.map +1 -0
  205. package/dist/lib/activitypub/listeners/http-signatures.d.ts +29 -0
  206. package/dist/lib/activitypub/listeners/http-signatures.d.ts.map +1 -0
  207. package/dist/lib/activitypub/listeners/http-signatures.js +208 -0
  208. package/dist/lib/activitypub/listeners/http-signatures.js.map +1 -0
  209. package/dist/lib/activitypub/listeners/inbox.d.ts +34 -0
  210. package/dist/lib/activitypub/listeners/inbox.d.ts.map +1 -0
  211. package/dist/lib/activitypub/listeners/inbox.js +226 -0
  212. package/dist/lib/activitypub/listeners/inbox.js.map +1 -0
  213. package/dist/lib/activitypub/listeners/outbox.d.ts +20 -0
  214. package/dist/lib/activitypub/listeners/outbox.d.ts.map +1 -0
  215. package/dist/lib/activitypub/listeners/outbox.js +117 -0
  216. package/dist/lib/activitypub/listeners/outbox.js.map +1 -0
  217. package/dist/lib/activitypub/remote-fetch-service.d.ts +108 -0
  218. package/dist/lib/activitypub/remote-fetch-service.d.ts.map +1 -0
  219. package/dist/lib/activitypub/remote-fetch-service.js +364 -0
  220. package/dist/lib/activitypub/remote-fetch-service.js.map +1 -0
  221. package/dist/lib/activitypub/services/abuse-prevention.d.ts +52 -0
  222. package/dist/lib/activitypub/services/abuse-prevention.d.ts.map +1 -0
  223. package/dist/lib/activitypub/services/abuse-prevention.js +118 -0
  224. package/dist/lib/activitypub/services/abuse-prevention.js.map +1 -0
  225. package/dist/lib/activitypub/services/dm-service-fedify.d.ts +46 -0
  226. package/dist/lib/activitypub/services/dm-service-fedify.d.ts.map +1 -0
  227. package/dist/lib/activitypub/services/dm-service-fedify.js +168 -0
  228. package/dist/lib/activitypub/services/dm-service-fedify.js.map +1 -0
  229. package/dist/lib/activitypub/services/fedify-converters.d.ts +51 -0
  230. package/dist/lib/activitypub/services/fedify-converters.d.ts.map +1 -0
  231. package/dist/lib/activitypub/services/fedify-converters.js +109 -0
  232. package/dist/lib/activitypub/services/fedify-converters.js.map +1 -0
  233. package/dist/lib/activitypub/services/fedify-delivery.d.ts +41 -0
  234. package/dist/lib/activitypub/services/fedify-delivery.d.ts.map +1 -0
  235. package/dist/lib/activitypub/services/fedify-delivery.js +186 -0
  236. package/dist/lib/activitypub/services/fedify-delivery.js.map +1 -0
  237. package/dist/lib/activitypub/services/follow-activity-service.d.ts +34 -0
  238. package/dist/lib/activitypub/services/follow-activity-service.d.ts.map +1 -0
  239. package/dist/lib/activitypub/services/follow-activity-service.js +64 -0
  240. package/dist/lib/activitypub/services/follow-activity-service.js.map +1 -0
  241. package/dist/lib/activitypub/services/post-service-fedify.d.ts +49 -0
  242. package/dist/lib/activitypub/services/post-service-fedify.d.ts.map +1 -0
  243. package/dist/lib/activitypub/services/post-service-fedify.js +281 -0
  244. package/dist/lib/activitypub/services/post-service-fedify.js.map +1 -0
  245. package/dist/lib/activitypub/services/remote-activity-handler.d.ts +22 -0
  246. package/dist/lib/activitypub/services/remote-activity-handler.d.ts.map +1 -0
  247. package/dist/lib/activitypub/services/remote-activity-handler.js +136 -0
  248. package/dist/lib/activitypub/services/remote-activity-handler.js.map +1 -0
  249. package/dist/lib/activitypub/standalone-mode.d.ts +34 -0
  250. package/dist/lib/activitypub/standalone-mode.d.ts.map +1 -0
  251. package/dist/lib/activitypub/standalone-mode.js +127 -0
  252. package/dist/lib/activitypub/standalone-mode.js.map +1 -0
  253. package/dist/lib/activitypub/webfinger/server.d.ts +16 -0
  254. package/dist/lib/activitypub/webfinger/server.d.ts.map +1 -0
  255. package/dist/lib/activitypub/webfinger/server.js +221 -0
  256. package/dist/lib/activitypub/webfinger/server.js.map +1 -0
  257. package/dist/lib/age-gate-middleware.d.ts +19 -0
  258. package/dist/lib/age-gate-middleware.d.ts.map +1 -0
  259. package/dist/lib/age-gate-middleware.js +26 -0
  260. package/dist/lib/age-gate-middleware.js.map +1 -0
  261. package/dist/lib/age-gate.d.ts +37 -0
  262. package/dist/lib/age-gate.d.ts.map +1 -0
  263. package/dist/lib/age-gate.js +96 -0
  264. package/dist/lib/age-gate.js.map +1 -0
  265. package/dist/lib/age-tier-transition.d.ts +21 -0
  266. package/dist/lib/age-tier-transition.d.ts.map +1 -0
  267. package/dist/lib/age-tier-transition.js +190 -0
  268. package/dist/lib/age-tier-transition.js.map +1 -0
  269. package/dist/lib/audit-logger.d.ts +142 -0
  270. package/dist/lib/audit-logger.d.ts.map +1 -0
  271. package/dist/lib/audit-logger.js +326 -0
  272. package/dist/lib/audit-logger.js.map +1 -0
  273. package/dist/lib/auth/cognito-jwt.d.ts +20 -0
  274. package/dist/lib/auth/cognito-jwt.d.ts.map +1 -0
  275. package/dist/lib/auth/cognito-jwt.js +56 -0
  276. package/dist/lib/auth/cognito-jwt.js.map +1 -0
  277. package/dist/lib/auth-context-manager.d.ts +116 -0
  278. package/dist/lib/auth-context-manager.d.ts.map +1 -0
  279. package/dist/lib/auth-context-manager.js +130 -0
  280. package/dist/lib/auth-context-manager.js.map +1 -0
  281. package/dist/lib/auth-handler.d.ts +19 -0
  282. package/dist/lib/auth-handler.d.ts.map +1 -0
  283. package/dist/lib/auth-handler.js +76 -0
  284. package/dist/lib/auth-handler.js.map +1 -0
  285. package/dist/lib/badge-handler.d.ts +20 -0
  286. package/dist/lib/badge-handler.d.ts.map +1 -0
  287. package/dist/lib/badge-handler.js +142 -0
  288. package/dist/lib/badge-handler.js.map +1 -0
  289. package/dist/lib/circle-handler.d.ts +22 -0
  290. package/dist/lib/circle-handler.d.ts.map +1 -0
  291. package/dist/lib/circle-handler.js +224 -0
  292. package/dist/lib/circle-handler.js.map +1 -0
  293. package/dist/lib/circuit-breaker.d.ts +27 -0
  294. package/dist/lib/circuit-breaker.d.ts.map +1 -0
  295. package/dist/lib/circuit-breaker.js +63 -0
  296. package/dist/lib/circuit-breaker.js.map +1 -0
  297. package/dist/lib/comment-handler.d.ts +77 -0
  298. package/dist/lib/comment-handler.d.ts.map +1 -0
  299. package/dist/lib/comment-handler.js +953 -0
  300. package/dist/lib/comment-handler.js.map +1 -0
  301. package/dist/lib/connection-code-handler.d.ts +17 -0
  302. package/dist/lib/connection-code-handler.d.ts.map +1 -0
  303. package/dist/lib/connection-code-handler.js +293 -0
  304. package/dist/lib/connection-code-handler.js.map +1 -0
  305. package/dist/lib/content-discovery.d.ts +113 -0
  306. package/dist/lib/content-discovery.d.ts.map +1 -0
  307. package/dist/lib/content-discovery.js +519 -0
  308. package/dist/lib/content-discovery.js.map +1 -0
  309. package/dist/lib/context-aware-data-access.d.ts +89 -0
  310. package/dist/lib/context-aware-data-access.d.ts.map +1 -0
  311. package/dist/lib/context-aware-data-access.js +97 -0
  312. package/dist/lib/context-aware-data-access.js.map +1 -0
  313. package/dist/lib/cors-handler.d.ts +29 -0
  314. package/dist/lib/cors-handler.d.ts.map +1 -0
  315. package/dist/lib/cors-handler.js +225 -0
  316. package/dist/lib/cors-handler.js.map +1 -0
  317. package/dist/lib/cost-accumulator.d.ts +58 -0
  318. package/dist/lib/cost-accumulator.d.ts.map +1 -0
  319. package/dist/lib/cost-accumulator.js +173 -0
  320. package/dist/lib/cost-accumulator.js.map +1 -0
  321. package/dist/lib/crypto/encryption-service.d.ts +100 -0
  322. package/dist/lib/crypto/encryption-service.d.ts.map +1 -0
  323. package/dist/lib/crypto/encryption-service.js +293 -0
  324. package/dist/lib/crypto/encryption-service.js.map +1 -0
  325. package/dist/lib/crypto/index.d.ts +22 -0
  326. package/dist/lib/crypto/index.d.ts.map +1 -0
  327. package/dist/lib/crypto/index.js +28 -0
  328. package/dist/lib/crypto/index.js.map +1 -0
  329. package/dist/lib/crypto/types.d.ts +71 -0
  330. package/dist/lib/crypto/types.d.ts.map +1 -0
  331. package/dist/lib/crypto/types.js +3 -0
  332. package/dist/lib/crypto/types.js.map +1 -0
  333. package/dist/lib/crypto/versioning.d.ts +112 -0
  334. package/dist/lib/crypto/versioning.d.ts.map +1 -0
  335. package/dist/lib/crypto/versioning.js +148 -0
  336. package/dist/lib/crypto/versioning.js.map +1 -0
  337. package/dist/lib/crypto/voting/elgamal-encryption.d.ts +156 -0
  338. package/dist/lib/crypto/voting/elgamal-encryption.d.ts.map +1 -0
  339. package/dist/lib/crypto/voting/elgamal-encryption.js +172 -0
  340. package/dist/lib/crypto/voting/elgamal-encryption.js.map +1 -0
  341. package/dist/lib/crypto/voting/encryption-scheme.d.ts +138 -0
  342. package/dist/lib/crypto/voting/encryption-scheme.d.ts.map +1 -0
  343. package/dist/lib/crypto/voting/encryption-scheme.js +13 -0
  344. package/dist/lib/crypto/voting/encryption-scheme.js.map +1 -0
  345. package/dist/lib/crypto/voting/hash-utils.d.ts +58 -0
  346. package/dist/lib/crypto/voting/hash-utils.d.ts.map +1 -0
  347. package/dist/lib/crypto/voting/hash-utils.js +73 -0
  348. package/dist/lib/crypto/voting/hash-utils.js.map +1 -0
  349. package/dist/lib/crypto/voting/hybrid-encryption.d.ts +109 -0
  350. package/dist/lib/crypto/voting/hybrid-encryption.d.ts.map +1 -0
  351. package/dist/lib/crypto/voting/hybrid-encryption.js +134 -0
  352. package/dist/lib/crypto/voting/hybrid-encryption.js.map +1 -0
  353. package/dist/lib/crypto/voting/index.d.ts +18 -0
  354. package/dist/lib/crypto/voting/index.d.ts.map +1 -0
  355. package/dist/lib/crypto/voting/index.js +27 -0
  356. package/dist/lib/crypto/voting/index.js.map +1 -0
  357. package/dist/lib/crypto/voting/post-quantum-encryption.d.ts +107 -0
  358. package/dist/lib/crypto/voting/post-quantum-encryption.d.ts.map +1 -0
  359. package/dist/lib/crypto/voting/post-quantum-encryption.js +123 -0
  360. package/dist/lib/crypto/voting/post-quantum-encryption.js.map +1 -0
  361. package/dist/lib/csrf.d.ts +95 -0
  362. package/dist/lib/csrf.d.ts.map +1 -0
  363. package/dist/lib/csrf.js +174 -0
  364. package/dist/lib/csrf.js.map +1 -0
  365. package/dist/lib/data-router.d.ts +209 -0
  366. package/dist/lib/data-router.d.ts.map +1 -0
  367. package/dist/lib/data-router.js +792 -0
  368. package/dist/lib/data-router.js.map +1 -0
  369. package/dist/lib/database-circuit-breaker.d.ts +75 -0
  370. package/dist/lib/database-circuit-breaker.d.ts.map +1 -0
  371. package/dist/lib/database-circuit-breaker.js +155 -0
  372. package/dist/lib/database-circuit-breaker.js.map +1 -0
  373. package/dist/lib/database-config.d.ts +20 -0
  374. package/dist/lib/database-config.d.ts.map +1 -0
  375. package/dist/lib/database-config.js +46 -0
  376. package/dist/lib/database-config.js.map +1 -0
  377. package/dist/lib/database-connection-manager.d.ts +99 -0
  378. package/dist/lib/database-connection-manager.d.ts.map +1 -0
  379. package/dist/lib/database-connection-manager.js +495 -0
  380. package/dist/lib/database-connection-manager.js.map +1 -0
  381. package/dist/lib/database-monitor.d.ts +89 -0
  382. package/dist/lib/database-monitor.d.ts.map +1 -0
  383. package/dist/lib/database-monitor.js +199 -0
  384. package/dist/lib/database-monitor.js.map +1 -0
  385. package/dist/lib/database-rate-limiter.d.ts +41 -0
  386. package/dist/lib/database-rate-limiter.d.ts.map +1 -0
  387. package/dist/lib/database-rate-limiter.js +90 -0
  388. package/dist/lib/database-rate-limiter.js.map +1 -0
  389. package/dist/lib/database-wrapper-helper.d.ts +44 -0
  390. package/dist/lib/database-wrapper-helper.d.ts.map +1 -0
  391. package/dist/lib/database-wrapper-helper.js +104 -0
  392. package/dist/lib/database-wrapper-helper.js.map +1 -0
  393. package/dist/lib/database-wrapper.d.ts +51 -0
  394. package/dist/lib/database-wrapper.d.ts.map +1 -0
  395. package/dist/lib/database-wrapper.js +109 -0
  396. package/dist/lib/database-wrapper.js.map +1 -0
  397. package/dist/lib/db-query-helper.d.ts +130 -0
  398. package/dist/lib/db-query-helper.d.ts.map +1 -0
  399. package/dist/lib/db-query-helper.js +105 -0
  400. package/dist/lib/db-query-helper.js.map +1 -0
  401. package/dist/lib/discovery-handler.d.ts +19 -0
  402. package/dist/lib/discovery-handler.d.ts.map +1 -0
  403. package/dist/lib/discovery-handler.js +195 -0
  404. package/dist/lib/discovery-handler.js.map +1 -0
  405. package/dist/lib/domain-reputation-service.d.ts +112 -0
  406. package/dist/lib/domain-reputation-service.d.ts.map +1 -0
  407. package/dist/lib/domain-reputation-service.js +344 -0
  408. package/dist/lib/domain-reputation-service.js.map +1 -0
  409. package/dist/lib/email-privacy.d.ts +54 -0
  410. package/dist/lib/email-privacy.d.ts.map +1 -0
  411. package/dist/lib/email-privacy.js +72 -0
  412. package/dist/lib/email-privacy.js.map +1 -0
  413. package/dist/lib/email-provider.d.ts +133 -0
  414. package/dist/lib/email-provider.d.ts.map +1 -0
  415. package/dist/lib/email-provider.js +391 -0
  416. package/dist/lib/email-provider.js.map +1 -0
  417. package/dist/lib/encryption-key-service.d.ts +115 -0
  418. package/dist/lib/encryption-key-service.d.ts.map +1 -0
  419. package/dist/lib/encryption-key-service.js +272 -0
  420. package/dist/lib/encryption-key-service.js.map +1 -0
  421. package/dist/lib/entity-handler.d.ts +59 -0
  422. package/dist/lib/entity-handler.d.ts.map +1 -0
  423. package/dist/lib/entity-handler.js +866 -0
  424. package/dist/lib/entity-handler.js.map +1 -0
  425. package/dist/lib/entity-relationship-handler.d.ts +19 -0
  426. package/dist/lib/entity-relationship-handler.d.ts.map +1 -0
  427. package/dist/lib/entity-relationship-handler.js +242 -0
  428. package/dist/lib/entity-relationship-handler.js.map +1 -0
  429. package/dist/lib/entity-tagging-errors.d.ts +32 -0
  430. package/dist/lib/entity-tagging-errors.d.ts.map +1 -0
  431. package/dist/lib/entity-tagging-errors.js +53 -0
  432. package/dist/lib/entity-tagging-errors.js.map +1 -0
  433. package/dist/lib/entity-tagging-validator.d.ts +47 -0
  434. package/dist/lib/entity-tagging-validator.d.ts.map +1 -0
  435. package/dist/lib/entity-tagging-validator.js +84 -0
  436. package/dist/lib/entity-tagging-validator.js.map +1 -0
  437. package/dist/lib/exif-stripper.d.ts +37 -0
  438. package/dist/lib/exif-stripper.d.ts.map +1 -0
  439. package/dist/lib/exif-stripper.js +62 -0
  440. package/dist/lib/exif-stripper.js.map +1 -0
  441. package/dist/lib/extension-context.d.ts +19 -0
  442. package/dist/lib/extension-context.d.ts.map +1 -0
  443. package/dist/lib/extension-context.js +78 -0
  444. package/dist/lib/extension-context.js.map +1 -0
  445. package/dist/lib/extension-route-wrapper.d.ts +21 -0
  446. package/dist/lib/extension-route-wrapper.d.ts.map +1 -0
  447. package/dist/lib/extension-route-wrapper.js +113 -0
  448. package/dist/lib/extension-route-wrapper.js.map +1 -0
  449. package/dist/lib/extension-validator.d.ts +12 -0
  450. package/dist/lib/extension-validator.d.ts.map +1 -0
  451. package/dist/lib/extension-validator.js +60 -0
  452. package/dist/lib/extension-validator.js.map +1 -0
  453. package/dist/lib/feature-flags.d.ts +56 -0
  454. package/dist/lib/feature-flags.d.ts.map +1 -0
  455. package/dist/lib/feature-flags.js +140 -0
  456. package/dist/lib/feature-flags.js.map +1 -0
  457. package/dist/lib/feature-toggle-service.d.ts +48 -0
  458. package/dist/lib/feature-toggle-service.d.ts.map +1 -0
  459. package/dist/lib/feature-toggle-service.js +167 -0
  460. package/dist/lib/feature-toggle-service.js.map +1 -0
  461. package/dist/lib/feed-handler.d.ts +152 -0
  462. package/dist/lib/feed-handler.d.ts.map +1 -0
  463. package/dist/lib/feed-handler.js +784 -0
  464. package/dist/lib/feed-handler.js.map +1 -0
  465. package/dist/lib/feed-pagination.d.ts +42 -0
  466. package/dist/lib/feed-pagination.d.ts.map +1 -0
  467. package/dist/lib/feed-pagination.js +54 -0
  468. package/dist/lib/feed-pagination.js.map +1 -0
  469. package/dist/lib/feed-personalization.d.ts +52 -0
  470. package/dist/lib/feed-personalization.d.ts.map +1 -0
  471. package/dist/lib/feed-personalization.js +105 -0
  472. package/dist/lib/feed-personalization.js.map +1 -0
  473. package/dist/lib/followers-events.d.ts +37 -0
  474. package/dist/lib/followers-events.d.ts.map +1 -0
  475. package/dist/lib/followers-events.js +149 -0
  476. package/dist/lib/followers-events.js.map +1 -0
  477. package/dist/lib/followers-handler.d.ts +21 -0
  478. package/dist/lib/followers-handler.d.ts.map +1 -0
  479. package/dist/lib/followers-handler.js +35 -0
  480. package/dist/lib/followers-handler.js.map +1 -0
  481. package/dist/lib/friends-handler.d.ts +78 -0
  482. package/dist/lib/friends-handler.d.ts.map +1 -0
  483. package/dist/lib/friends-handler.js +390 -0
  484. package/dist/lib/friends-handler.js.map +1 -0
  485. package/dist/lib/graph/dual-write-service.d.ts +116 -0
  486. package/dist/lib/graph/dual-write-service.d.ts.map +1 -0
  487. package/dist/lib/graph/dual-write-service.js +332 -0
  488. package/dist/lib/graph/dual-write-service.js.map +1 -0
  489. package/dist/lib/graph/dual-write.d.ts +396 -0
  490. package/dist/lib/graph/dual-write.d.ts.map +1 -0
  491. package/dist/lib/graph/dual-write.js +53 -0
  492. package/dist/lib/graph/dual-write.js.map +1 -0
  493. package/dist/lib/graph/errors.d.ts +90 -0
  494. package/dist/lib/graph/errors.d.ts.map +1 -0
  495. package/dist/lib/graph/errors.js +131 -0
  496. package/dist/lib/graph/errors.js.map +1 -0
  497. package/dist/lib/graph/graph-factory.d.ts +64 -0
  498. package/dist/lib/graph/graph-factory.d.ts.map +1 -0
  499. package/dist/lib/graph/graph-factory.js +190 -0
  500. package/dist/lib/graph/graph-factory.js.map +1 -0
  501. package/dist/lib/graph/graph-schema-init.d.ts +31 -0
  502. package/dist/lib/graph/graph-schema-init.d.ts.map +1 -0
  503. package/dist/lib/graph/graph-schema-init.js +105 -0
  504. package/dist/lib/graph/graph-schema-init.js.map +1 -0
  505. package/dist/lib/graph/graph-service.d.ts +479 -0
  506. package/dist/lib/graph/graph-service.d.ts.map +1 -0
  507. package/dist/lib/graph/graph-service.js +21 -0
  508. package/dist/lib/graph/graph-service.js.map +1 -0
  509. package/dist/lib/graph/index.d.ts +40 -0
  510. package/dist/lib/graph/index.d.ts.map +1 -0
  511. package/dist/lib/graph/index.js +74 -0
  512. package/dist/lib/graph/index.js.map +1 -0
  513. package/dist/lib/graph/neo4j-graph-service.d.ts +186 -0
  514. package/dist/lib/graph/neo4j-graph-service.d.ts.map +1 -0
  515. package/dist/lib/graph/neo4j-graph-service.js +1625 -0
  516. package/dist/lib/graph/neo4j-graph-service.js.map +1 -0
  517. package/dist/lib/graph/reconciliation-service.d.ts +113 -0
  518. package/dist/lib/graph/reconciliation-service.d.ts.map +1 -0
  519. package/dist/lib/graph/reconciliation-service.js +533 -0
  520. package/dist/lib/graph/reconciliation-service.js.map +1 -0
  521. package/dist/lib/graph/scoring-engine.d.ts +154 -0
  522. package/dist/lib/graph/scoring-engine.d.ts.map +1 -0
  523. package/dist/lib/graph/scoring-engine.js +286 -0
  524. package/dist/lib/graph/scoring-engine.js.map +1 -0
  525. package/dist/lib/graph/types.d.ts +480 -0
  526. package/dist/lib/graph/types.d.ts.map +1 -0
  527. package/dist/lib/graph/types.js +10 -0
  528. package/dist/lib/graph/types.js.map +1 -0
  529. package/dist/lib/hook-dispatcher.d.ts +21 -0
  530. package/dist/lib/hook-dispatcher.d.ts.map +1 -0
  531. package/dist/lib/hook-dispatcher.js +62 -0
  532. package/dist/lib/hook-dispatcher.js.map +1 -0
  533. package/dist/lib/id-generator.d.ts +29 -0
  534. package/dist/lib/id-generator.d.ts.map +1 -0
  535. package/dist/lib/id-generator.js +51 -0
  536. package/dist/lib/id-generator.js.map +1 -0
  537. package/dist/lib/input-sanitizer.d.ts +55 -0
  538. package/dist/lib/input-sanitizer.d.ts.map +1 -0
  539. package/dist/lib/input-sanitizer.js +167 -0
  540. package/dist/lib/input-sanitizer.js.map +1 -0
  541. package/dist/lib/internal-docs-dashboard.json +112 -0
  542. package/dist/lib/internal-docs-handler.d.ts +60 -0
  543. package/dist/lib/internal-docs-handler.d.ts.map +1 -0
  544. package/dist/lib/internal-docs-handler.js +570 -0
  545. package/dist/lib/internal-docs-handler.js.map +1 -0
  546. package/dist/lib/internal-docs-navigation.d.ts +42 -0
  547. package/dist/lib/internal-docs-navigation.d.ts.map +1 -0
  548. package/dist/lib/internal-docs-navigation.js +73 -0
  549. package/dist/lib/internal-docs-navigation.js.map +1 -0
  550. package/dist/lib/internal-docs-navigation.json +169 -0
  551. package/dist/lib/invitation-handler.d.ts +133 -0
  552. package/dist/lib/invitation-handler.d.ts.map +1 -0
  553. package/dist/lib/invitation-handler.js +1335 -0
  554. package/dist/lib/invitation-handler.js.map +1 -0
  555. package/dist/lib/ip-scrubber.d.ts +59 -0
  556. package/dist/lib/ip-scrubber.d.ts.map +1 -0
  557. package/dist/lib/ip-scrubber.js +101 -0
  558. package/dist/lib/ip-scrubber.js.map +1 -0
  559. package/dist/lib/kv/dynamodb-kv.d.ts +39 -0
  560. package/dist/lib/kv/dynamodb-kv.d.ts.map +1 -0
  561. package/dist/lib/kv/dynamodb-kv.js +239 -0
  562. package/dist/lib/kv/dynamodb-kv.js.map +1 -0
  563. package/dist/lib/link-security-handler.d.ts +140 -0
  564. package/dist/lib/link-security-handler.d.ts.map +1 -0
  565. package/dist/lib/link-security-handler.js +460 -0
  566. package/dist/lib/link-security-handler.js.map +1 -0
  567. package/dist/lib/logger.d.ts +100 -0
  568. package/dist/lib/logger.d.ts.map +1 -0
  569. package/dist/lib/logger.js +201 -0
  570. package/dist/lib/logger.js.map +1 -0
  571. package/dist/lib/media-cleanup-handler.d.ts +46 -0
  572. package/dist/lib/media-cleanup-handler.d.ts.map +1 -0
  573. package/dist/lib/media-cleanup-handler.js +190 -0
  574. package/dist/lib/media-cleanup-handler.js.map +1 -0
  575. package/dist/lib/media-handler.d.ts +150 -0
  576. package/dist/lib/media-handler.d.ts.map +1 -0
  577. package/dist/lib/media-handler.js +1544 -0
  578. package/dist/lib/media-handler.js.map +1 -0
  579. package/dist/lib/media-metadata-extractor.d.ts +71 -0
  580. package/dist/lib/media-metadata-extractor.d.ts.map +1 -0
  581. package/dist/lib/media-metadata-extractor.js +278 -0
  582. package/dist/lib/media-metadata-extractor.js.map +1 -0
  583. package/dist/lib/media-metrics.d.ts +57 -0
  584. package/dist/lib/media-metrics.d.ts.map +1 -0
  585. package/dist/lib/media-metrics.js +202 -0
  586. package/dist/lib/media-metrics.js.map +1 -0
  587. package/dist/lib/metadata/index.d.ts +6 -0
  588. package/dist/lib/metadata/index.d.ts.map +1 -0
  589. package/dist/lib/metadata/index.js +22 -0
  590. package/dist/lib/metadata/index.js.map +1 -0
  591. package/dist/lib/metadata/metadata-config.d.ts +17 -0
  592. package/dist/lib/metadata/metadata-config.d.ts.map +1 -0
  593. package/dist/lib/metadata/metadata-config.js +23 -0
  594. package/dist/lib/metadata/metadata-config.js.map +1 -0
  595. package/dist/lib/metadata/metadata-errors.d.ts +18 -0
  596. package/dist/lib/metadata/metadata-errors.d.ts.map +1 -0
  597. package/dist/lib/metadata/metadata-errors.js +26 -0
  598. package/dist/lib/metadata/metadata-errors.js.map +1 -0
  599. package/dist/lib/metadata/metadata-extractor.d.ts +17 -0
  600. package/dist/lib/metadata/metadata-extractor.d.ts.map +1 -0
  601. package/dist/lib/metadata/metadata-extractor.js +264 -0
  602. package/dist/lib/metadata/metadata-extractor.js.map +1 -0
  603. package/dist/lib/metadata/metadata-sanitizer.d.ts +9 -0
  604. package/dist/lib/metadata/metadata-sanitizer.d.ts.map +1 -0
  605. package/dist/lib/metadata/metadata-sanitizer.js +100 -0
  606. package/dist/lib/metadata/metadata-sanitizer.js.map +1 -0
  607. package/dist/lib/metadata/metadata-schemas.d.ts +131 -0
  608. package/dist/lib/metadata/metadata-schemas.d.ts.map +1 -0
  609. package/dist/lib/metadata/metadata-schemas.js +71 -0
  610. package/dist/lib/metadata/metadata-schemas.js.map +1 -0
  611. package/dist/lib/mfa/mfa-handler.d.ts +60 -0
  612. package/dist/lib/mfa/mfa-handler.d.ts.map +1 -0
  613. package/dist/lib/mfa/mfa-handler.js +150 -0
  614. package/dist/lib/mfa/mfa-handler.js.map +1 -0
  615. package/dist/lib/mfa/totp-service.d.ts +41 -0
  616. package/dist/lib/mfa/totp-service.d.ts.map +1 -0
  617. package/dist/lib/mfa/totp-service.js +183 -0
  618. package/dist/lib/mfa/totp-service.js.map +1 -0
  619. package/dist/lib/middleware/comment-rate-limit.d.ts +19 -0
  620. package/dist/lib/middleware/comment-rate-limit.d.ts.map +1 -0
  621. package/dist/lib/middleware/comment-rate-limit.js +113 -0
  622. package/dist/lib/middleware/comment-rate-limit.js.map +1 -0
  623. package/dist/lib/middleware/feature-toggle-rate-limit.d.ts +53 -0
  624. package/dist/lib/middleware/feature-toggle-rate-limit.d.ts.map +1 -0
  625. package/dist/lib/middleware/feature-toggle-rate-limit.js +164 -0
  626. package/dist/lib/middleware/feature-toggle-rate-limit.js.map +1 -0
  627. package/dist/lib/middleware.d.ts +70 -0
  628. package/dist/lib/middleware.d.ts.map +1 -0
  629. package/dist/lib/middleware.js +375 -0
  630. package/dist/lib/middleware.js.map +1 -0
  631. package/dist/lib/moderation-handler.d.ts +55 -0
  632. package/dist/lib/moderation-handler.d.ts.map +1 -0
  633. package/dist/lib/moderation-handler.js +230 -0
  634. package/dist/lib/moderation-handler.js.map +1 -0
  635. package/dist/lib/notification-handler.d.ts +65 -0
  636. package/dist/lib/notification-handler.d.ts.map +1 -0
  637. package/dist/lib/notification-handler.js +236 -0
  638. package/dist/lib/notification-handler.js.map +1 -0
  639. package/dist/lib/notification-preferences-handler.d.ts +27 -0
  640. package/dist/lib/notification-preferences-handler.d.ts.map +1 -0
  641. package/dist/lib/notification-preferences-handler.js +119 -0
  642. package/dist/lib/notification-preferences-handler.js.map +1 -0
  643. package/dist/lib/openai-budget.d.ts +45 -0
  644. package/dist/lib/openai-budget.d.ts.map +1 -0
  645. package/dist/lib/openai-budget.js +175 -0
  646. package/dist/lib/openai-budget.js.map +1 -0
  647. package/dist/lib/orphaned-media-handler.d.ts +60 -0
  648. package/dist/lib/orphaned-media-handler.d.ts.map +1 -0
  649. package/dist/lib/orphaned-media-handler.js +487 -0
  650. package/dist/lib/orphaned-media-handler.js.map +1 -0
  651. package/dist/lib/parental-control-handler.d.ts +42 -0
  652. package/dist/lib/parental-control-handler.d.ts.map +1 -0
  653. package/dist/lib/parental-control-handler.js +327 -0
  654. package/dist/lib/parental-control-handler.js.map +1 -0
  655. package/dist/lib/parental-link-handler.d.ts +38 -0
  656. package/dist/lib/parental-link-handler.d.ts.map +1 -0
  657. package/dist/lib/parental-link-handler.js +217 -0
  658. package/dist/lib/parental-link-handler.js.map +1 -0
  659. package/dist/lib/performance-metrics.d.ts +125 -0
  660. package/dist/lib/performance-metrics.d.ts.map +1 -0
  661. package/dist/lib/performance-metrics.js +277 -0
  662. package/dist/lib/performance-metrics.js.map +1 -0
  663. package/dist/lib/post-handler.d.ts +94 -0
  664. package/dist/lib/post-handler.d.ts.map +1 -0
  665. package/dist/lib/post-handler.js +1346 -0
  666. package/dist/lib/post-handler.js.map +1 -0
  667. package/dist/lib/privacy-defaults.d.ts +32 -0
  668. package/dist/lib/privacy-defaults.d.ts.map +1 -0
  669. package/dist/lib/privacy-defaults.js +85 -0
  670. package/dist/lib/privacy-defaults.js.map +1 -0
  671. package/dist/lib/privacy-handler.d.ts +43 -0
  672. package/dist/lib/privacy-handler.d.ts.map +1 -0
  673. package/dist/lib/privacy-handler.js +124 -0
  674. package/dist/lib/privacy-handler.js.map +1 -0
  675. package/dist/lib/queue/sqs-queue.d.ts +16 -0
  676. package/dist/lib/queue/sqs-queue.d.ts.map +1 -0
  677. package/dist/lib/queue/sqs-queue.js +39 -0
  678. package/dist/lib/queue/sqs-queue.js.map +1 -0
  679. package/dist/lib/queue-consumers/media-reconciliation-consumer.d.ts +9 -0
  680. package/dist/lib/queue-consumers/media-reconciliation-consumer.d.ts.map +1 -0
  681. package/dist/lib/queue-consumers/media-reconciliation-consumer.js +37 -0
  682. package/dist/lib/queue-consumers/media-reconciliation-consumer.js.map +1 -0
  683. package/dist/lib/quiet-hours.d.ts +33 -0
  684. package/dist/lib/quiet-hours.d.ts.map +1 -0
  685. package/dist/lib/quiet-hours.js +51 -0
  686. package/dist/lib/quiet-hours.js.map +1 -0
  687. package/dist/lib/rate-limit.d.ts +95 -0
  688. package/dist/lib/rate-limit.d.ts.map +1 -0
  689. package/dist/lib/rate-limit.js +247 -0
  690. package/dist/lib/rate-limit.js.map +1 -0
  691. package/dist/lib/reaction-handler.d.ts +68 -0
  692. package/dist/lib/reaction-handler.d.ts.map +1 -0
  693. package/dist/lib/reaction-handler.js +858 -0
  694. package/dist/lib/reaction-handler.js.map +1 -0
  695. package/dist/lib/recaptcha.d.ts +16 -0
  696. package/dist/lib/recaptcha.d.ts.map +1 -0
  697. package/dist/lib/recaptcha.js +71 -0
  698. package/dist/lib/recaptcha.js.map +1 -0
  699. package/dist/lib/redirect-resolver.d.ts +78 -0
  700. package/dist/lib/redirect-resolver.d.ts.map +1 -0
  701. package/dist/lib/redirect-resolver.js +276 -0
  702. package/dist/lib/redirect-resolver.js.map +1 -0
  703. package/dist/lib/region-config.d.ts +179 -0
  704. package/dist/lib/region-config.d.ts.map +1 -0
  705. package/dist/lib/region-config.js +474 -0
  706. package/dist/lib/region-config.js.map +1 -0
  707. package/dist/lib/region-detection.d.ts +110 -0
  708. package/dist/lib/region-detection.d.ts.map +1 -0
  709. package/dist/lib/region-detection.js +408 -0
  710. package/dist/lib/region-detection.js.map +1 -0
  711. package/dist/lib/relationship-handler.d.ts +19 -0
  712. package/dist/lib/relationship-handler.d.ts.map +1 -0
  713. package/dist/lib/relationship-handler.js +233 -0
  714. package/dist/lib/relationship-handler.js.map +1 -0
  715. package/dist/lib/request-context.d.ts +103 -0
  716. package/dist/lib/request-context.d.ts.map +1 -0
  717. package/dist/lib/request-context.js +179 -0
  718. package/dist/lib/request-context.js.map +1 -0
  719. package/dist/lib/route-helpers.d.ts +74 -0
  720. package/dist/lib/route-helpers.d.ts.map +1 -0
  721. package/dist/lib/route-helpers.js +190 -0
  722. package/dist/lib/route-helpers.js.map +1 -0
  723. package/dist/lib/route-matcher.d.ts +24 -0
  724. package/dist/lib/route-matcher.d.ts.map +1 -0
  725. package/dist/lib/route-matcher.js +96 -0
  726. package/dist/lib/route-matcher.js.map +1 -0
  727. package/dist/lib/router.d.ts +26 -0
  728. package/dist/lib/router.d.ts.map +1 -0
  729. package/dist/lib/router.js +90 -0
  730. package/dist/lib/router.js.map +1 -0
  731. package/dist/lib/routes/activitypub/actor.d.ts +12 -0
  732. package/dist/lib/routes/activitypub/actor.d.ts.map +1 -0
  733. package/dist/lib/routes/activitypub/actor.js +141 -0
  734. package/dist/lib/routes/activitypub/actor.js.map +1 -0
  735. package/dist/lib/routes/activitypub/audiences.d.ts +12 -0
  736. package/dist/lib/routes/activitypub/audiences.d.ts.map +1 -0
  737. package/dist/lib/routes/activitypub/audiences.js +325 -0
  738. package/dist/lib/routes/activitypub/audiences.js.map +1 -0
  739. package/dist/lib/routes/activitypub/collections.d.ts +12 -0
  740. package/dist/lib/routes/activitypub/collections.d.ts.map +1 -0
  741. package/dist/lib/routes/activitypub/collections.js +127 -0
  742. package/dist/lib/routes/activitypub/collections.js.map +1 -0
  743. package/dist/lib/routes/activitypub/entity-profile.d.ts +9 -0
  744. package/dist/lib/routes/activitypub/entity-profile.d.ts.map +1 -0
  745. package/dist/lib/routes/activitypub/entity-profile.js +136 -0
  746. package/dist/lib/routes/activitypub/entity-profile.js.map +1 -0
  747. package/dist/lib/routes/activitypub/friends.d.ts +15 -0
  748. package/dist/lib/routes/activitypub/friends.d.ts.map +1 -0
  749. package/dist/lib/routes/activitypub/friends.js +33 -0
  750. package/dist/lib/routes/activitypub/friends.js.map +1 -0
  751. package/dist/lib/routes/activitypub/group.d.ts +8 -0
  752. package/dist/lib/routes/activitypub/group.d.ts.map +1 -0
  753. package/dist/lib/routes/activitypub/group.js +436 -0
  754. package/dist/lib/routes/activitypub/group.js.map +1 -0
  755. package/dist/lib/routes/activitypub/inbox.d.ts +15 -0
  756. package/dist/lib/routes/activitypub/inbox.d.ts.map +1 -0
  757. package/dist/lib/routes/activitypub/inbox.js +125 -0
  758. package/dist/lib/routes/activitypub/inbox.js.map +1 -0
  759. package/dist/lib/routes/activitypub/messages.d.ts +12 -0
  760. package/dist/lib/routes/activitypub/messages.d.ts.map +1 -0
  761. package/dist/lib/routes/activitypub/messages.js +374 -0
  762. package/dist/lib/routes/activitypub/messages.js.map +1 -0
  763. package/dist/lib/routes/activitypub/outbox.d.ts +15 -0
  764. package/dist/lib/routes/activitypub/outbox.d.ts.map +1 -0
  765. package/dist/lib/routes/activitypub/outbox.js +33 -0
  766. package/dist/lib/routes/activitypub/outbox.js.map +1 -0
  767. package/dist/lib/routes/activitypub/post.d.ts +12 -0
  768. package/dist/lib/routes/activitypub/post.d.ts.map +1 -0
  769. package/dist/lib/routes/activitypub/post.js +213 -0
  770. package/dist/lib/routes/activitypub/post.js.map +1 -0
  771. package/dist/lib/routes/activitypub/webfinger.d.ts +11 -0
  772. package/dist/lib/routes/activitypub/webfinger.d.ts.map +1 -0
  773. package/dist/lib/routes/activitypub/webfinger.js +27 -0
  774. package/dist/lib/routes/activitypub/webfinger.js.map +1 -0
  775. package/dist/lib/routes/admin-costs.d.ts +8 -0
  776. package/dist/lib/routes/admin-costs.d.ts.map +1 -0
  777. package/dist/lib/routes/admin-costs.js +89 -0
  778. package/dist/lib/routes/admin-costs.js.map +1 -0
  779. package/dist/lib/routes/admin.d.ts +6 -0
  780. package/dist/lib/routes/admin.d.ts.map +1 -0
  781. package/dist/lib/routes/admin.js +1450 -0
  782. package/dist/lib/routes/admin.js.map +1 -0
  783. package/dist/lib/routes/auth.d.ts +6 -0
  784. package/dist/lib/routes/auth.d.ts.map +1 -0
  785. package/dist/lib/routes/auth.js +49 -0
  786. package/dist/lib/routes/auth.js.map +1 -0
  787. package/dist/lib/routes/badges.d.ts +6 -0
  788. package/dist/lib/routes/badges.d.ts.map +1 -0
  789. package/dist/lib/routes/badges.js +66 -0
  790. package/dist/lib/routes/badges.js.map +1 -0
  791. package/dist/lib/routes/circles.d.ts +8 -0
  792. package/dist/lib/routes/circles.d.ts.map +1 -0
  793. package/dist/lib/routes/circles.js +135 -0
  794. package/dist/lib/routes/circles.js.map +1 -0
  795. package/dist/lib/routes/comments.d.ts +6 -0
  796. package/dist/lib/routes/comments.d.ts.map +1 -0
  797. package/dist/lib/routes/comments.js +228 -0
  798. package/dist/lib/routes/comments.js.map +1 -0
  799. package/dist/lib/routes/connection-codes.d.ts +8 -0
  800. package/dist/lib/routes/connection-codes.d.ts.map +1 -0
  801. package/dist/lib/routes/connection-codes.js +84 -0
  802. package/dist/lib/routes/connection-codes.js.map +1 -0
  803. package/dist/lib/routes/content-discovery.d.ts +11 -0
  804. package/dist/lib/routes/content-discovery.d.ts.map +1 -0
  805. package/dist/lib/routes/content-discovery.js +211 -0
  806. package/dist/lib/routes/content-discovery.js.map +1 -0
  807. package/dist/lib/routes/dashboard.d.ts +8 -0
  808. package/dist/lib/routes/dashboard.d.ts.map +1 -0
  809. package/dist/lib/routes/dashboard.js +1139 -0
  810. package/dist/lib/routes/dashboard.js.map +1 -0
  811. package/dist/lib/routes/deletion.d.ts +6 -0
  812. package/dist/lib/routes/deletion.d.ts.map +1 -0
  813. package/dist/lib/routes/deletion.js +213 -0
  814. package/dist/lib/routes/deletion.js.map +1 -0
  815. package/dist/lib/routes/discovery.d.ts +8 -0
  816. package/dist/lib/routes/discovery.d.ts.map +1 -0
  817. package/dist/lib/routes/discovery.js +67 -0
  818. package/dist/lib/routes/discovery.js.map +1 -0
  819. package/dist/lib/routes/employees.d.ts +6 -0
  820. package/dist/lib/routes/employees.d.ts.map +1 -0
  821. package/dist/lib/routes/employees.js +82 -0
  822. package/dist/lib/routes/employees.js.map +1 -0
  823. package/dist/lib/routes/entities.d.ts +8 -0
  824. package/dist/lib/routes/entities.d.ts.map +1 -0
  825. package/dist/lib/routes/entities.js +467 -0
  826. package/dist/lib/routes/entities.js.map +1 -0
  827. package/dist/lib/routes/entity-relationships.d.ts +8 -0
  828. package/dist/lib/routes/entity-relationships.d.ts.map +1 -0
  829. package/dist/lib/routes/entity-relationships.js +118 -0
  830. package/dist/lib/routes/entity-relationships.js.map +1 -0
  831. package/dist/lib/routes/export.d.ts +6 -0
  832. package/dist/lib/routes/export.d.ts.map +1 -0
  833. package/dist/lib/routes/export.js +118 -0
  834. package/dist/lib/routes/export.js.map +1 -0
  835. package/dist/lib/routes/feature-flags.d.ts +8 -0
  836. package/dist/lib/routes/feature-flags.d.ts.map +1 -0
  837. package/dist/lib/routes/feature-flags.js +75 -0
  838. package/dist/lib/routes/feature-flags.js.map +1 -0
  839. package/dist/lib/routes/feeds.d.ts +6 -0
  840. package/dist/lib/routes/feeds.d.ts.map +1 -0
  841. package/dist/lib/routes/feeds.js +131 -0
  842. package/dist/lib/routes/feeds.js.map +1 -0
  843. package/dist/lib/routes/followers.d.ts +6 -0
  844. package/dist/lib/routes/followers.d.ts.map +1 -0
  845. package/dist/lib/routes/followers.js +405 -0
  846. package/dist/lib/routes/followers.js.map +1 -0
  847. package/dist/lib/routes/friends.d.ts +6 -0
  848. package/dist/lib/routes/friends.d.ts.map +1 -0
  849. package/dist/lib/routes/friends.js +116 -0
  850. package/dist/lib/routes/friends.js.map +1 -0
  851. package/dist/lib/routes/health.d.ts +6 -0
  852. package/dist/lib/routes/health.d.ts.map +1 -0
  853. package/dist/lib/routes/health.js +129 -0
  854. package/dist/lib/routes/health.js.map +1 -0
  855. package/dist/lib/routes/index.d.ts +21 -0
  856. package/dist/lib/routes/index.d.ts.map +1 -0
  857. package/dist/lib/routes/index.js +212 -0
  858. package/dist/lib/routes/index.js.map +1 -0
  859. package/dist/lib/routes/internal-docs.d.ts +6 -0
  860. package/dist/lib/routes/internal-docs.d.ts.map +1 -0
  861. package/dist/lib/routes/internal-docs.js +44 -0
  862. package/dist/lib/routes/internal-docs.js.map +1 -0
  863. package/dist/lib/routes/invitations.d.ts +6 -0
  864. package/dist/lib/routes/invitations.d.ts.map +1 -0
  865. package/dist/lib/routes/invitations.js +67 -0
  866. package/dist/lib/routes/invitations.js.map +1 -0
  867. package/dist/lib/routes/link-reports.d.ts +11 -0
  868. package/dist/lib/routes/link-reports.d.ts.map +1 -0
  869. package/dist/lib/routes/link-reports.js +287 -0
  870. package/dist/lib/routes/link-reports.js.map +1 -0
  871. package/dist/lib/routes/map.d.ts +6 -0
  872. package/dist/lib/routes/map.d.ts.map +1 -0
  873. package/dist/lib/routes/map.js +21 -0
  874. package/dist/lib/routes/map.js.map +1 -0
  875. package/dist/lib/routes/media-metadata-visibility.d.ts +3 -0
  876. package/dist/lib/routes/media-metadata-visibility.d.ts.map +1 -0
  877. package/dist/lib/routes/media-metadata-visibility.js +184 -0
  878. package/dist/lib/routes/media-metadata-visibility.js.map +1 -0
  879. package/dist/lib/routes/media.d.ts +9 -0
  880. package/dist/lib/routes/media.d.ts.map +1 -0
  881. package/dist/lib/routes/media.js +1910 -0
  882. package/dist/lib/routes/media.js.map +1 -0
  883. package/dist/lib/routes/mfa.d.ts +8 -0
  884. package/dist/lib/routes/mfa.d.ts.map +1 -0
  885. package/dist/lib/routes/mfa.js +193 -0
  886. package/dist/lib/routes/mfa.js.map +1 -0
  887. package/dist/lib/routes/notifications.d.ts +9 -0
  888. package/dist/lib/routes/notifications.d.ts.map +1 -0
  889. package/dist/lib/routes/notifications.js +230 -0
  890. package/dist/lib/routes/notifications.js.map +1 -0
  891. package/dist/lib/routes/orphaned-media-health.d.ts +9 -0
  892. package/dist/lib/routes/orphaned-media-health.d.ts.map +1 -0
  893. package/dist/lib/routes/orphaned-media-health.js +121 -0
  894. package/dist/lib/routes/orphaned-media-health.js.map +1 -0
  895. package/dist/lib/routes/orphaned-media.d.ts +8 -0
  896. package/dist/lib/routes/orphaned-media.d.ts.map +1 -0
  897. package/dist/lib/routes/orphaned-media.js +111 -0
  898. package/dist/lib/routes/orphaned-media.js.map +1 -0
  899. package/dist/lib/routes/out.d.ts +17 -0
  900. package/dist/lib/routes/out.d.ts.map +1 -0
  901. package/dist/lib/routes/out.js +339 -0
  902. package/dist/lib/routes/out.js.map +1 -0
  903. package/dist/lib/routes/parental-controls.d.ts +8 -0
  904. package/dist/lib/routes/parental-controls.d.ts.map +1 -0
  905. package/dist/lib/routes/parental-controls.js +282 -0
  906. package/dist/lib/routes/parental-controls.js.map +1 -0
  907. package/dist/lib/routes/posts.d.ts +6 -0
  908. package/dist/lib/routes/posts.d.ts.map +1 -0
  909. package/dist/lib/routes/posts.js +518 -0
  910. package/dist/lib/routes/posts.js.map +1 -0
  911. package/dist/lib/routes/privacy.d.ts +6 -0
  912. package/dist/lib/routes/privacy.d.ts.map +1 -0
  913. package/dist/lib/routes/privacy.js +66 -0
  914. package/dist/lib/routes/privacy.js.map +1 -0
  915. package/dist/lib/routes/products.d.ts +9 -0
  916. package/dist/lib/routes/products.d.ts.map +1 -0
  917. package/dist/lib/routes/products.js +224 -0
  918. package/dist/lib/routes/products.js.map +1 -0
  919. package/dist/lib/routes/relationships.d.ts +8 -0
  920. package/dist/lib/routes/relationships.d.ts.map +1 -0
  921. package/dist/lib/routes/relationships.js +118 -0
  922. package/dist/lib/routes/relationships.js.map +1 -0
  923. package/dist/lib/routes/sentiments.d.ts +6 -0
  924. package/dist/lib/routes/sentiments.d.ts.map +1 -0
  925. package/dist/lib/routes/sentiments.js +285 -0
  926. package/dist/lib/routes/sentiments.js.map +1 -0
  927. package/dist/lib/routes/taxonomy-analytics.d.ts +8 -0
  928. package/dist/lib/routes/taxonomy-analytics.d.ts.map +1 -0
  929. package/dist/lib/routes/taxonomy-analytics.js +151 -0
  930. package/dist/lib/routes/taxonomy-analytics.js.map +1 -0
  931. package/dist/lib/routes/taxonomy.d.ts +15 -0
  932. package/dist/lib/routes/taxonomy.d.ts.map +1 -0
  933. package/dist/lib/routes/taxonomy.js +370 -0
  934. package/dist/lib/routes/taxonomy.js.map +1 -0
  935. package/dist/lib/routes/types.d.ts +46 -0
  936. package/dist/lib/routes/types.d.ts.map +1 -0
  937. package/dist/lib/routes/types.js +8 -0
  938. package/dist/lib/routes/types.js.map +1 -0
  939. package/dist/lib/routes/upload-sessions.d.ts +9 -0
  940. package/dist/lib/routes/upload-sessions.d.ts.map +1 -0
  941. package/dist/lib/routes/upload-sessions.js +268 -0
  942. package/dist/lib/routes/upload-sessions.js.map +1 -0
  943. package/dist/lib/routes/user.d.ts +8 -0
  944. package/dist/lib/routes/user.d.ts.map +1 -0
  945. package/dist/lib/routes/user.js +287 -0
  946. package/dist/lib/routes/user.js.map +1 -0
  947. package/dist/lib/routes-all.d.ts +9 -0
  948. package/dist/lib/routes-all.d.ts.map +1 -0
  949. package/dist/lib/routes-all.js +170 -0
  950. package/dist/lib/routes-all.js.map +1 -0
  951. package/dist/lib/routes.d.ts +10 -0
  952. package/dist/lib/routes.d.ts.map +1 -0
  953. package/dist/lib/routes.js +16 -0
  954. package/dist/lib/routes.js.map +1 -0
  955. package/dist/lib/scaling-health.d.ts +48 -0
  956. package/dist/lib/scaling-health.d.ts.map +1 -0
  957. package/dist/lib/scaling-health.js +363 -0
  958. package/dist/lib/scaling-health.js.map +1 -0
  959. package/dist/lib/scheduled/media-stale-cleanup.d.ts +11 -0
  960. package/dist/lib/scheduled/media-stale-cleanup.d.ts.map +1 -0
  961. package/dist/lib/scheduled/media-stale-cleanup.js +79 -0
  962. package/dist/lib/scheduled/media-stale-cleanup.js.map +1 -0
  963. package/dist/lib/scheduled/orphaned-media-monitor.d.ts +97 -0
  964. package/dist/lib/scheduled/orphaned-media-monitor.d.ts.map +1 -0
  965. package/dist/lib/scheduled/orphaned-media-monitor.js +399 -0
  966. package/dist/lib/scheduled/orphaned-media-monitor.js.map +1 -0
  967. package/dist/lib/schemas.d.ts +314 -0
  968. package/dist/lib/schemas.d.ts.map +1 -0
  969. package/dist/lib/schemas.js +235 -0
  970. package/dist/lib/schemas.js.map +1 -0
  971. package/dist/lib/secret-resolver.d.ts +88 -0
  972. package/dist/lib/secret-resolver.d.ts.map +1 -0
  973. package/dist/lib/secret-resolver.js +183 -0
  974. package/dist/lib/secret-resolver.js.map +1 -0
  975. package/dist/lib/security-event-cleaner.d.ts +61 -0
  976. package/dist/lib/security-event-cleaner.d.ts.map +1 -0
  977. package/dist/lib/security-event-cleaner.js +74 -0
  978. package/dist/lib/security-event-cleaner.js.map +1 -0
  979. package/dist/lib/security-headers.d.ts +36 -0
  980. package/dist/lib/security-headers.d.ts.map +1 -0
  981. package/dist/lib/security-headers.js +87 -0
  982. package/dist/lib/security-headers.js.map +1 -0
  983. package/dist/lib/security-monitor.d.ts +92 -0
  984. package/dist/lib/security-monitor.d.ts.map +1 -0
  985. package/dist/lib/security-monitor.js +287 -0
  986. package/dist/lib/security-monitor.js.map +1 -0
  987. package/dist/lib/sentiment-digest.d.ts +19 -0
  988. package/dist/lib/sentiment-digest.d.ts.map +1 -0
  989. package/dist/lib/sentiment-digest.js +99 -0
  990. package/dist/lib/sentiment-digest.js.map +1 -0
  991. package/dist/lib/sentiment-display.d.ts +20 -0
  992. package/dist/lib/sentiment-display.d.ts.map +1 -0
  993. package/dist/lib/sentiment-display.js +38 -0
  994. package/dist/lib/sentiment-display.js.map +1 -0
  995. package/dist/lib/services/image-normalizer.d.ts +15 -0
  996. package/dist/lib/services/image-normalizer.d.ts.map +1 -0
  997. package/dist/lib/services/image-normalizer.js +22 -0
  998. package/dist/lib/services/image-normalizer.js.map +1 -0
  999. package/dist/lib/services/media-reconciliation-service.d.ts +25 -0
  1000. package/dist/lib/services/media-reconciliation-service.d.ts.map +1 -0
  1001. package/dist/lib/services/media-reconciliation-service.js +191 -0
  1002. package/dist/lib/services/media-reconciliation-service.js.map +1 -0
  1003. package/dist/lib/services/media-upload-service.d.ts +25 -0
  1004. package/dist/lib/services/media-upload-service.d.ts.map +1 -0
  1005. package/dist/lib/services/media-upload-service.js +240 -0
  1006. package/dist/lib/services/media-upload-service.js.map +1 -0
  1007. package/dist/lib/services/user-data-deletion.d.ts +30 -0
  1008. package/dist/lib/services/user-data-deletion.d.ts.map +1 -0
  1009. package/dist/lib/services/user-data-deletion.js +118 -0
  1010. package/dist/lib/services/user-data-deletion.js.map +1 -0
  1011. package/dist/lib/session-awareness.d.ts +35 -0
  1012. package/dist/lib/session-awareness.d.ts.map +1 -0
  1013. package/dist/lib/session-awareness.js +79 -0
  1014. package/dist/lib/session-awareness.js.map +1 -0
  1015. package/dist/lib/session-config.d.ts +87 -0
  1016. package/dist/lib/session-config.d.ts.map +1 -0
  1017. package/dist/lib/session-config.js +165 -0
  1018. package/dist/lib/session-config.js.map +1 -0
  1019. package/dist/lib/session-manager.d.ts +103 -0
  1020. package/dist/lib/session-manager.d.ts.map +1 -0
  1021. package/dist/lib/session-manager.js +492 -0
  1022. package/dist/lib/session-manager.js.map +1 -0
  1023. package/dist/lib/sso-auth-handler.d.ts +12 -0
  1024. package/dist/lib/sso-auth-handler.d.ts.map +1 -0
  1025. package/dist/lib/sso-auth-handler.js +24 -0
  1026. package/dist/lib/sso-auth-handler.js.map +1 -0
  1027. package/dist/lib/storage/s3-storage.d.ts +29 -0
  1028. package/dist/lib/storage/s3-storage.d.ts.map +1 -0
  1029. package/dist/lib/storage/s3-storage.js +135 -0
  1030. package/dist/lib/storage/s3-storage.js.map +1 -0
  1031. package/dist/lib/tag-suggestions-handler.d.ts +52 -0
  1032. package/dist/lib/tag-suggestions-handler.d.ts.map +1 -0
  1033. package/dist/lib/tag-suggestions-handler.js +195 -0
  1034. package/dist/lib/tag-suggestions-handler.js.map +1 -0
  1035. package/dist/lib/taxonomy-handler-factory.d.ts +18 -0
  1036. package/dist/lib/taxonomy-handler-factory.d.ts.map +1 -0
  1037. package/dist/lib/taxonomy-handler-factory.js +29 -0
  1038. package/dist/lib/taxonomy-handler-factory.js.map +1 -0
  1039. package/dist/lib/taxonomy-handler.d.ts +142 -0
  1040. package/dist/lib/taxonomy-handler.d.ts.map +1 -0
  1041. package/dist/lib/taxonomy-handler.js +636 -0
  1042. package/dist/lib/taxonomy-handler.js.map +1 -0
  1043. package/dist/lib/taxonomy-metrics.d.ts +76 -0
  1044. package/dist/lib/taxonomy-metrics.d.ts.map +1 -0
  1045. package/dist/lib/taxonomy-metrics.js +201 -0
  1046. package/dist/lib/taxonomy-metrics.js.map +1 -0
  1047. package/dist/lib/taxonomy-search-metrics.d.ts +45 -0
  1048. package/dist/lib/taxonomy-search-metrics.d.ts.map +1 -0
  1049. package/dist/lib/taxonomy-search-metrics.js +75 -0
  1050. package/dist/lib/taxonomy-search-metrics.js.map +1 -0
  1051. package/dist/lib/tenant-context.d.ts +35 -0
  1052. package/dist/lib/tenant-context.d.ts.map +1 -0
  1053. package/dist/lib/tenant-context.js +54 -0
  1054. package/dist/lib/tenant-context.js.map +1 -0
  1055. package/dist/lib/terminology.d.ts +25 -0
  1056. package/dist/lib/terminology.d.ts.map +1 -0
  1057. package/dist/lib/terminology.js +44 -0
  1058. package/dist/lib/terminology.js.map +1 -0
  1059. package/dist/lib/theme.d.ts +29 -0
  1060. package/dist/lib/theme.d.ts.map +1 -0
  1061. package/dist/lib/theme.js +38 -0
  1062. package/dist/lib/theme.js.map +1 -0
  1063. package/dist/lib/threat-intel-service.d.ts +67 -0
  1064. package/dist/lib/threat-intel-service.d.ts.map +1 -0
  1065. package/dist/lib/threat-intel-service.js +193 -0
  1066. package/dist/lib/threat-intel-service.js.map +1 -0
  1067. package/dist/lib/types/media-reconciliation.d.ts +64 -0
  1068. package/dist/lib/types/media-reconciliation.d.ts.map +1 -0
  1069. package/dist/lib/types/media-reconciliation.js +8 -0
  1070. package/dist/lib/types/media-reconciliation.js.map +1 -0
  1071. package/dist/lib/upload-session-handler.d.ts +56 -0
  1072. package/dist/lib/upload-session-handler.d.ts.map +1 -0
  1073. package/dist/lib/upload-session-handler.js +312 -0
  1074. package/dist/lib/upload-session-handler.js.map +1 -0
  1075. package/dist/lib/user-badge.d.ts +56 -0
  1076. package/dist/lib/user-badge.d.ts.map +1 -0
  1077. package/dist/lib/user-badge.js +92 -0
  1078. package/dist/lib/user-badge.js.map +1 -0
  1079. package/dist/lib/user-deletion-handler-enhanced.d.ts +96 -0
  1080. package/dist/lib/user-deletion-handler-enhanced.d.ts.map +1 -0
  1081. package/dist/lib/user-deletion-handler-enhanced.js +401 -0
  1082. package/dist/lib/user-deletion-handler-enhanced.js.map +1 -0
  1083. package/dist/lib/user-deprovisioning.d.ts +43 -0
  1084. package/dist/lib/user-deprovisioning.d.ts.map +1 -0
  1085. package/dist/lib/user-deprovisioning.js +138 -0
  1086. package/dist/lib/user-deprovisioning.js.map +1 -0
  1087. package/dist/lib/user-export-handler.d.ts +172 -0
  1088. package/dist/lib/user-export-handler.d.ts.map +1 -0
  1089. package/dist/lib/user-export-handler.js +435 -0
  1090. package/dist/lib/user-export-handler.js.map +1 -0
  1091. package/dist/lib/validate-request.d.ts +46 -0
  1092. package/dist/lib/validate-request.d.ts.map +1 -0
  1093. package/dist/lib/validate-request.js +127 -0
  1094. package/dist/lib/validate-request.js.map +1 -0
  1095. package/dist/lib/validation/feature-toggle-schemas.d.ts +410 -0
  1096. package/dist/lib/validation/feature-toggle-schemas.d.ts.map +1 -0
  1097. package/dist/lib/validation/feature-toggle-schemas.js +274 -0
  1098. package/dist/lib/validation/feature-toggle-schemas.js.map +1 -0
  1099. package/dist/lib/validation/validate-request.d.ts +75 -0
  1100. package/dist/lib/validation/validate-request.d.ts.map +1 -0
  1101. package/dist/lib/validation/validate-request.js +183 -0
  1102. package/dist/lib/validation/validate-request.js.map +1 -0
  1103. package/dist/lib/validation.d.ts +50 -0
  1104. package/dist/lib/validation.d.ts.map +1 -0
  1105. package/dist/lib/validation.js +122 -0
  1106. package/dist/lib/validation.js.map +1 -0
  1107. package/dist/lib/version.d.ts +36 -0
  1108. package/dist/lib/version.d.ts.map +1 -0
  1109. package/dist/lib/version.js +44 -0
  1110. package/dist/lib/version.js.map +1 -0
  1111. package/dist/server.d.ts +13 -0
  1112. package/dist/server.d.ts.map +1 -0
  1113. package/dist/server.js +254 -0
  1114. package/dist/server.js.map +1 -0
  1115. package/dist/types/cloudflare-compat.d.ts +134 -0
  1116. package/dist/types/cloudflare-compat.d.ts.map +1 -0
  1117. package/dist/types/cloudflare-compat.js +7 -0
  1118. package/dist/types/cloudflare-compat.js.map +1 -0
  1119. package/dist/worker.d.ts +16 -0
  1120. package/dist/worker.d.ts.map +1 -0
  1121. package/dist/worker.js +21 -0
  1122. package/dist/worker.js.map +1 -0
  1123. package/package.json +91 -0
  1124. package/src/lambda/cleanup-cron.ts +37 -0
  1125. package/src/lambda/create-auth-challenge.ts +112 -0
  1126. package/src/lambda/custom-message.ts +30 -0
  1127. package/src/lambda/define-auth-challenge.ts +24 -0
  1128. package/src/lambda/delete-account-worker.ts +96 -0
  1129. package/src/lambda/diagnostics-proxy.ts +139 -0
  1130. package/src/lambda/e2e-sweeper.ts +140 -0
  1131. package/src/lambda/federation-outbox-worker.ts +8 -0
  1132. package/src/lambda/followers-events-worker.ts +8 -0
  1133. package/src/lambda/hourly-cron.ts +103 -0
  1134. package/src/lambda/link-check-worker.ts +8 -0
  1135. package/src/lambda/maintenance-cron.ts +95 -0
  1136. package/src/lambda/media-processing-worker.ts +68 -0
  1137. package/src/lambda/media-reconciliation-worker.ts +8 -0
  1138. package/src/lambda/nightly-cron.ts +338 -0
  1139. package/src/lambda/post-confirmation.ts +80 -0
  1140. package/src/lambda/pre-signup.ts +39 -0
  1141. package/src/lambda/pre-token-generation.ts +93 -0
  1142. package/src/lambda/tools/check-health.ts +22 -0
  1143. package/src/lambda/tools/describe-services.ts +45 -0
  1144. package/src/lambda/tools/get-cost-report.ts +64 -0
  1145. package/src/lambda/tools/get-errors.ts +78 -0
  1146. package/src/lambda/tools/get-feature-flags.ts +27 -0
  1147. package/src/lambda/tools/get-queue-status.ts +60 -0
  1148. package/src/lambda/tools/search-logs.ts +75 -0
  1149. package/src/lambda/tools/send-alert.ts +37 -0
  1150. package/src/lambda/verify-auth-challenge.ts +37 -0
@@ -0,0 +1,1346 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.PostHandler = void 0;
37
+ /**
38
+ * Post Handler
39
+ *
40
+ * Handles post creation, deletion, and hiding.
41
+ *
42
+ * PREPARATORY: Uses DataRouter for region-aware data operations.
43
+ */
44
+ const data_router_1 = require("./data-router");
45
+ const logger_1 = require("./logger");
46
+ const moderation_handler_1 = require("./moderation-handler");
47
+ class PostHandler {
48
+ moderationHandler;
49
+ logger;
50
+ constructor(env) {
51
+ this.moderationHandler = new moderation_handler_1.ModerationHandler();
52
+ this.logger = logger_1.Logger.getInstance(env);
53
+ }
54
+ /**
55
+ * Create a new post
56
+ *
57
+ * PREPARATORY: Uses DataRouter for region-aware post creation.
58
+ */
59
+ async createPost(request, session, env, requestContext) {
60
+ try {
61
+ // PREPARATORY: Check if post creation is enabled for this region
62
+ // Note: Post creation is always enabled by default, but can be disabled via feature flags
63
+ // This is a placeholder for future feature flag checks (e.g., offlineMode, content moderation)
64
+ // Validate request body with Zod schema
65
+ const { validateRequest } = await Promise.resolve().then(() => __importStar(require("./validate-request")));
66
+ const { createPostSchema } = await Promise.resolve().then(() => __importStar(require("./schemas")));
67
+ const validation = await validateRequest(request, createPostSchema);
68
+ if (!validation.success) {
69
+ return validation.error;
70
+ }
71
+ const body = validation.data;
72
+ // Check if public posting is enabled globally
73
+ if (body.visibility === "public") {
74
+ const { FeatureToggleService } = await Promise.resolve().then(() => __importStar(require("./feature-toggle-service")));
75
+ const { createPrisma } = await Promise.resolve().then(() => __importStar(require("../db")));
76
+ const db = createPrisma(env);
77
+ const toggleService = new FeatureToggleService(db);
78
+ const publicPostingEnabled = await toggleService.isEnabled("global_public_posting_enabled");
79
+ if (!publicPostingEnabled) {
80
+ return new Response(JSON.stringify({
81
+ error: "PUBLIC_POSTING_DISABLED",
82
+ message: 'Public posting is currently disabled. Please use "Friends Only" or "Private" visibility.',
83
+ }), { status: 403, headers: { "content-type": "application/json" } });
84
+ }
85
+ }
86
+ // Check if content moderation is enabled via feature toggle
87
+ const { FeatureToggleService } = await Promise.resolve().then(() => __importStar(require("./feature-toggle-service")));
88
+ const { createPrisma } = await Promise.resolve().then(() => __importStar(require("../db")));
89
+ const db = createPrisma(env);
90
+ const toggleService = new FeatureToggleService(db, env);
91
+ const moderationEnabled = await toggleService.isEnabled("content_moderation_enabled");
92
+ // Moderate text content (if moderation is enabled)
93
+ if (moderationEnabled) {
94
+ const moderationResult = await this.moderationHandler.moderateText(body.text, env);
95
+ // Debug: Log Perspective API result (safely handle serialization)
96
+ try {
97
+ const debugData = {
98
+ approved: moderationResult.approved,
99
+ score: moderationResult.score,
100
+ details: moderationResult.details,
101
+ error: moderationResult.error,
102
+ text: body.text.substring(0, 100), // First 100 chars for context
103
+ };
104
+ logger_1.Logger.getInstance(env).debug("[PostHandler] Moderation API result:", JSON.stringify(debugData));
105
+ }
106
+ catch (debugError) {
107
+ // If serialization fails, log a simpler version
108
+ logger_1.Logger.getInstance(env).debug("[PostHandler] Moderation API result (simplified):", {
109
+ approved: moderationResult.approved,
110
+ score: moderationResult.score,
111
+ hasDetails: !!moderationResult.details,
112
+ hasError: !!moderationResult.error,
113
+ });
114
+ }
115
+ if (!moderationResult.approved) {
116
+ return new Response(JSON.stringify({
117
+ error: "CONTENT_REJECTED",
118
+ message: "Your post contains inappropriate content. Please be more constructive.",
119
+ score: moderationResult.score,
120
+ details: moderationResult.details,
121
+ }), { status: 400, headers: { "content-type": "application/json" } });
122
+ }
123
+ }
124
+ else {
125
+ logger_1.Logger.getInstance(env).debug("[PostHandler] Content moderation is disabled via feature toggle");
126
+ }
127
+ // Check for malicious links
128
+ const { LinkSecurityHandler, LinkStatus } = await Promise.resolve().then(() => __importStar(require("./link-security-handler")));
129
+ const linkSecurityHandler = new LinkSecurityHandler(env);
130
+ const urls = linkSecurityHandler.extractUrls(body.text);
131
+ let hasBlockedLinks = false;
132
+ const linkChecks = [];
133
+ for (const url of urls) {
134
+ const validation = linkSecurityHandler.validateUrlSync(url);
135
+ if (validation.status === LinkStatus.BLOCKED) {
136
+ hasBlockedLinks = true;
137
+ this.logger.warn(`Blocked dangerous URL in post: ${url}`, {
138
+ reason: validation.reason,
139
+ userId: session.userId,
140
+ });
141
+ }
142
+ if (validation.normalizedUrl) {
143
+ linkChecks.push({
144
+ originalUrl: url,
145
+ normalizedUrl: validation.normalizedUrl.normalized,
146
+ domain: validation.normalizedUrl.domain,
147
+ status: validation.status,
148
+ });
149
+ }
150
+ }
151
+ // Block post creation if dangerous links detected
152
+ if (hasBlockedLinks) {
153
+ return new Response(JSON.stringify({
154
+ error: "DANGEROUS_LINKS_DETECTED",
155
+ message: "Your post contains dangerous or blocked links. Please remove them and try again.",
156
+ }), { status: 400, headers: { "content-type": "application/json" } });
157
+ }
158
+ // PREPARATORY: Use DataRouter for region-aware operations
159
+ const requestId = (0, logger_1.generateRequestId)();
160
+ const region = requestContext.region;
161
+ // OPTIMIZATION: Use upsert directly instead of getUser + createUser
162
+ // This eliminates an unnecessary database query and is faster
163
+ // DataRouter.createUser uses upsert, so it handles both create and update cases
164
+ const user = await data_router_1.DataRouter.createUser({
165
+ id: session.userId,
166
+ email: session.email,
167
+ }, region, env, request, requestId);
168
+ // Sanitize user input to prevent XSS
169
+ const { InputSanitizer } = await Promise.resolve().then(() => __importStar(require("./input-sanitizer")));
170
+ const sanitizedText = InputSanitizer.sanitizeText(body.text);
171
+ // Get entityRefs (validation happens in DataRouter within transaction)
172
+ const entityRefs = body.entityRefs || [];
173
+ // Get taxonomy tags (optional)
174
+ const taxonomyTags = body.taxonomyTags || [];
175
+ // Validate media ownership and existence
176
+ if (body.media && body.media.length > 0) {
177
+ const mediaIds = body.media.map((m) => m.id);
178
+ // Debug: Log media IDs being validated
179
+ this.logger.debug("[PostHandler] Validating media IDs", {
180
+ mediaIds,
181
+ userId: session.userId,
182
+ count: mediaIds.length,
183
+ });
184
+ // Import database helpers for media validation
185
+ const { withQueryTimeoutAndRetry, QueryTimeoutPresets } = await Promise.resolve().then(() => __importStar(require("./db-query-helper")));
186
+ const { sharedDatabaseConnectionManager } = await Promise.resolve().then(() => __importStar(require("./database-connection-manager")));
187
+ // Verify all media files exist and belong to user
188
+ // Note: mediaIds can be either contentHash (SHA-256) or CUID
189
+ // We search by contentHash first (preferred), then fall back to id
190
+ const mediaFiles = await withQueryTimeoutAndRetry(sharedDatabaseConnectionManager, region, env, async (db) => {
191
+ return await db.mediaFile.findMany({
192
+ where: {
193
+ OR: [
194
+ { contentHash: { in: mediaIds } },
195
+ { id: { in: mediaIds } },
196
+ ],
197
+ uploadedBy: session.userId,
198
+ deletedAt: null,
199
+ },
200
+ });
201
+ }, {
202
+ ...QueryTimeoutPresets.USER_FACING,
203
+ maxRetries: 2,
204
+ context: {
205
+ operation: "createPost_validateMedia",
206
+ userId: session.userId,
207
+ },
208
+ });
209
+ // Debug: Log validation results
210
+ this.logger.debug("[PostHandler] Media validation results", {
211
+ requestedCount: mediaIds.length,
212
+ foundCount: mediaFiles.length,
213
+ foundIds: mediaFiles.map((m) => m.id),
214
+ foundContentHashes: mediaFiles.map((m) => m.contentHash),
215
+ missingIds: mediaIds.filter((id) => !mediaFiles.find((m) => m.id === id || m.contentHash === id)),
216
+ });
217
+ // Check if all media IDs are valid
218
+ if (mediaFiles.length !== mediaIds.length) {
219
+ // Diagnostic: query WITHOUT uploadedBy filter to determine root cause
220
+ let diagnosticInfo = {};
221
+ try {
222
+ const allMatches = await withQueryTimeoutAndRetry(sharedDatabaseConnectionManager, region, env, async (db) => {
223
+ return await db.mediaFile.findMany({
224
+ where: {
225
+ OR: [
226
+ { contentHash: { in: mediaIds } },
227
+ { id: { in: mediaIds } },
228
+ ],
229
+ },
230
+ select: {
231
+ id: true,
232
+ contentHash: true,
233
+ uploadedBy: true,
234
+ deletedAt: true,
235
+ uploadStatus: true,
236
+ createdAt: true,
237
+ },
238
+ });
239
+ }, {
240
+ ...QueryTimeoutPresets.USER_FACING,
241
+ maxRetries: 1,
242
+ context: { operation: "createPost_mediaDebug" },
243
+ });
244
+ diagnosticInfo = {
245
+ recordsWithoutOwnerFilter: allMatches.length,
246
+ records: allMatches.map((m) => ({
247
+ id: m.id,
248
+ contentHash: m.contentHash?.substring(0, 12) + "...",
249
+ uploadedBy: m.uploadedBy,
250
+ deletedAt: m.deletedAt,
251
+ uploadStatus: m.uploadStatus,
252
+ createdAt: m.createdAt,
253
+ })),
254
+ };
255
+ }
256
+ catch (e) {
257
+ diagnosticInfo = { diagnosticQueryError: e.message };
258
+ }
259
+ console.log("[PostHandler] INVALID_MEDIA diagnostic", {
260
+ requestedIds: mediaIds,
261
+ userId: session.userId,
262
+ region,
263
+ foundWithOwnerFilter: mediaFiles.length,
264
+ ...diagnosticInfo,
265
+ });
266
+ this.logger.warn("[PostHandler] Media validation failed", {
267
+ requestedIds: mediaIds,
268
+ foundIds: mediaFiles.map((m) => m.id),
269
+ foundContentHashes: mediaFiles.map((m) => m.contentHash),
270
+ userId: session.userId,
271
+ });
272
+ return new Response(JSON.stringify({
273
+ error: "INVALID_MEDIA",
274
+ message: "One or more media files not found or not owned by user",
275
+ details: {
276
+ requested: mediaIds.length,
277
+ found: mediaFiles.length,
278
+ ...diagnosticInfo,
279
+ },
280
+ }), { status: 400, headers: { "content-type": "application/json" } });
281
+ }
282
+ // Create a mapping from contentHash/id to database ID
283
+ // This ensures we use the correct database ID when creating PostMedia records
284
+ const mediaIdMap = new Map();
285
+ for (const file of mediaFiles) {
286
+ mediaIdMap.set(file.contentHash, file.id);
287
+ mediaIdMap.set(file.id, file.id);
288
+ }
289
+ // Remap media IDs to database IDs
290
+ body.media = body.media.map((m) => ({
291
+ ...m,
292
+ id: mediaIdMap.get(m.id) || m.id,
293
+ }));
294
+ }
295
+ // Convert visibility to Prisma enum format
296
+ // API accepts: "public", "friends-only", "private"
297
+ // Prisma expects: "PUBLIC", "FRIENDS", "PRIVATE"
298
+ let visibility = (body.visibility || "public").toUpperCase();
299
+ if (visibility === "FRIENDS-ONLY" || visibility === "FRIENDS_ONLY") {
300
+ visibility = "FRIENDS";
301
+ }
302
+ // Create post using DataRouter (enforces dataRegion)
303
+ // Note: Entity tagging validation happens within transaction in DataRouter
304
+ const post = await data_router_1.DataRouter.createPost({
305
+ authorId: session.userId,
306
+ text: sanitizedText.trim(),
307
+ visibility,
308
+ entityRefs: entityRefs.length > 0 ? entityRefs : undefined,
309
+ geoData: body.geoData,
310
+ contentWarnings: body.contentWarnings || [],
311
+ hasBlockedLinks: hasBlockedLinks,
312
+ media: body.media, // NEW: Pass media to DataRouter
313
+ }, region, env, request, requestId, session);
314
+ // Create LinkCheck records and queue threat intel checks
315
+ if (linkChecks.length > 0) {
316
+ try {
317
+ const { createPrisma } = await Promise.resolve().then(() => __importStar(require("../db")));
318
+ const db = createPrisma(env);
319
+ // Ensure domain reputation records exist
320
+ const domains = [...new Set(linkChecks.map((lc) => lc.domain))];
321
+ for (const domain of domains) {
322
+ await db.domainReputation.upsert({
323
+ where: { domain },
324
+ create: {
325
+ domain,
326
+ reputation: 0,
327
+ status: "unknown",
328
+ },
329
+ update: {},
330
+ });
331
+ }
332
+ // Create LinkCheck records
333
+ const linkCheckPromises = linkChecks.map(async (linkCheck) => {
334
+ const check = await db.linkCheck.create({
335
+ data: {
336
+ postId: post.id,
337
+ originalUrl: linkCheck.originalUrl,
338
+ normalizedUrl: linkCheck.normalizedUrl,
339
+ domain: linkCheck.domain,
340
+ status: linkCheck.status,
341
+ checkType: "async",
342
+ },
343
+ });
344
+ // Queue threat intel check if queue is available
345
+ if (env.LINK_CHECK_QUEUE) {
346
+ try {
347
+ await env.LINK_CHECK_QUEUE.send({
348
+ linkCheckId: check.id,
349
+ url: linkCheck.normalizedUrl,
350
+ domain: linkCheck.domain,
351
+ });
352
+ }
353
+ catch (queueError) {
354
+ this.logger.warn("Failed to queue threat intel check:", queueError);
355
+ }
356
+ }
357
+ return check;
358
+ });
359
+ await Promise.all(linkCheckPromises);
360
+ }
361
+ catch (error) {
362
+ // Log error but don't fail post creation if link checks fail
363
+ this.logger.error("Error creating link checks:", error);
364
+ }
365
+ }
366
+ // Add taxonomy tags if provided
367
+ if (taxonomyTags.length > 0) {
368
+ try {
369
+ const { TaxonomyHandler } = await Promise.resolve().then(() => __importStar(require("./taxonomy-handler")));
370
+ const { getRequestContext } = await Promise.resolve().then(() => __importStar(require("./tenant-context")));
371
+ const { createRequestContext } = await Promise.resolve().then(() => __importStar(require("./request-context")));
372
+ const { getWrappedDatabase } = await Promise.resolve().then(() => __importStar(require("./database-wrapper-helper")));
373
+ // Get tenant ID
374
+ const ctx = await createRequestContext(request, env);
375
+ const tenantCtx = await getRequestContext(request, ctx.session || null);
376
+ const tenantId = tenantCtx.tenant?.id || "trellis";
377
+ // Get database and taxonomy handler
378
+ const db = getWrappedDatabase(region, env, request);
379
+ const taxonomyHandler = new TaxonomyHandler(db, tenantId, env.TAXONOMY_CACHE_KV);
380
+ // Add taxonomy tags
381
+ await taxonomyHandler.addPostTaxonomyTags(post.id, taxonomyTags, session.userId);
382
+ }
383
+ catch (error) {
384
+ // Log error but don't fail post creation if taxonomy tagging fails
385
+ this.logger.error("Error adding taxonomy tags to post:", error);
386
+ // Continue with post creation - taxonomy tags are optional
387
+ }
388
+ }
389
+ // Graph sync: dual-write post to graph database
390
+ try {
391
+ const { createGraphServiceFromEnv } = await Promise.resolve().then(() => __importStar(require("./graph")));
392
+ const graphService = await createGraphServiceFromEnv(env);
393
+ await graphService.syncPost({
394
+ id: post.id,
395
+ authorId: session.userId,
396
+ radius: body.radius || "NORMAL",
397
+ createdAt: post.createdAt || new Date(),
398
+ });
399
+ if (entityRefs.length > 0) {
400
+ await graphService.syncPostSubjects({
401
+ postId: post.id,
402
+ entityIds: entityRefs,
403
+ primaryEntityId: entityRefs[0],
404
+ });
405
+ for (const entityId of entityRefs) {
406
+ await graphService.recordInteraction({
407
+ userId: session.userId,
408
+ targetType: "entity",
409
+ targetId: entityId,
410
+ interactionType: "content_creation",
411
+ metadata: { postId: post.id },
412
+ });
413
+ }
414
+ }
415
+ }
416
+ catch (graphError) {
417
+ this.logger.error("[PostHandler] Graph sync failed for post creation (non-fatal):", {
418
+ postId: post.id,
419
+ message: graphError?.message,
420
+ });
421
+ }
422
+ // Note: AT Protocol integration removed
423
+ // Generate post URI for response
424
+ const baseUrl = new URL(request.url).origin;
425
+ let postUri = `${baseUrl}/api/posts/${post.id}`;
426
+ // Create ActivityPub activity for the post (async, don't block response)
427
+ // Only create if author has ActivityPub fields set
428
+ // Import database helpers once for this function
429
+ const dbHelpers = await Promise.resolve().then(() => __importStar(require("./db-query-helper")));
430
+ const dbManager = await Promise.resolve().then(() => __importStar(require("./database-connection-manager")));
431
+ const { sharedDatabaseConnectionManager } = dbManager;
432
+ const { withQueryTimeoutAndRetry, QueryTimeoutPresets } = dbHelpers;
433
+ // Fetch full post and author with ActivityPub fields
434
+ const postWithAuthor = await withQueryTimeoutAndRetry(sharedDatabaseConnectionManager, region, env, async (db) => {
435
+ return await db.post.findUnique({
436
+ where: { id: post.id },
437
+ include: {
438
+ author: {
439
+ select: {
440
+ id: true,
441
+ username: true,
442
+ actorUri: true,
443
+ inboxUrl: true,
444
+ outboxUrl: true,
445
+ publicKey: true,
446
+ },
447
+ },
448
+ },
449
+ });
450
+ }, {
451
+ ...QueryTimeoutPresets.STANDARD,
452
+ maxRetries: 2,
453
+ baseDelayMs: 100,
454
+ defaultValue: null,
455
+ context: {
456
+ operation: "createPost_fetchForActivityPub",
457
+ userId: session.userId,
458
+ postId: post.id,
459
+ },
460
+ });
461
+ // Create ActivityPub activity if author has ActivityPub fields
462
+ if (postWithAuthor?.author?.actorUri && postWithAuthor.author.publicKey) {
463
+ // Run ActivityPub activity creation asynchronously (don't block response)
464
+ // Use a separate async operation to avoid blocking the response
465
+ (async () => {
466
+ try {
467
+ const { PostActivityServiceFedify } = await Promise.resolve().then(() => __importStar(require("./activitypub/services/post-service-fedify")));
468
+ const { DeliveryService } = await Promise.resolve().then(() => __importStar(require("./activitypub/delivery-service")));
469
+ const { fedifyCreateToActivityStreams } = await Promise.resolve().then(() => __importStar(require("./activitypub/services/fedify-converters")));
470
+ const { UserActorDispatcher } = await Promise.resolve().then(() => __importStar(require("./activitypub/dispatchers/user-actor")));
471
+ // Create activity using Fedify and store in outbox
472
+ await withQueryTimeoutAndRetry(sharedDatabaseConnectionManager, region, env, async (db) => {
473
+ // Use Fedify service for type-safe activity creation
474
+ const fedifyActivity = await PostActivityServiceFedify.createPostActivity(db, postWithAuthor, postWithAuthor.author, env, request.url);
475
+ // Convert Fedify Create to ActivityStreamsActivity format for delivery service
476
+ // (Delivery service stores activities in database, which requires plain objects)
477
+ // Re-create the note and get URIs to pass to converter (Fedify doesn't expose properties directly)
478
+ const note = await PostActivityServiceFedify.createNote(postWithAuthor, postWithAuthor.author, env, request.url);
479
+ const uris = PostActivityServiceFedify.generatePostUris(postWithAuthor.id, env, request.url);
480
+ const actorUri = UserActorDispatcher.generateActorUri(postWithAuthor.author.username || "", env);
481
+ const activityForDelivery = fedifyCreateToActivityStreams(fedifyActivity, note, actorUri, uris.activityId.toString(), uris.objectId.toString());
482
+ // Deliver to recipients (async, don't block)
483
+ DeliveryService.deliverPost(db, activityForDelivery, postWithAuthor, postWithAuthor.author, env, request.url, this.logger).catch((error) => {
484
+ // Log error but don't fail
485
+ this.logger.error("[PostHandler] ActivityPub delivery failed:", error);
486
+ });
487
+ }, {
488
+ ...QueryTimeoutPresets.STANDARD,
489
+ maxRetries: 2,
490
+ baseDelayMs: 100,
491
+ context: {
492
+ operation: "createPost_activityPub",
493
+ userId: session.userId,
494
+ postId: post.id,
495
+ },
496
+ });
497
+ }
498
+ catch (error) {
499
+ // Log error but don't fail post creation if ActivityPub fails
500
+ this.logger.error("[PostHandler] ActivityPub activity creation failed:", error);
501
+ }
502
+ })();
503
+ }
504
+ // Invalidate feed cache
505
+ await this.invalidateFeedCache(env);
506
+ // Fetch tagged entities for response
507
+ let taggedEntities;
508
+ if (entityRefs.length > 0) {
509
+ const db = data_router_1.DataRouter.getDatabaseForRegion(region, env, request, session.userId);
510
+ // Fetch tagged entities with timeout/retry
511
+ // Use already imported helpers
512
+ const postWithEntities = await withQueryTimeoutAndRetry(sharedDatabaseConnectionManager, region, env, async (db) => {
513
+ return await db.post.findUnique({
514
+ where: { id: post.id },
515
+ include: {
516
+ subjectEntities: {
517
+ include: {
518
+ entity: {
519
+ select: {
520
+ id: true,
521
+ name: true,
522
+ entityType: true,
523
+ },
524
+ },
525
+ },
526
+ },
527
+ },
528
+ });
529
+ }, {
530
+ ...QueryTimeoutPresets.USER_FACING,
531
+ maxRetries: 3,
532
+ baseDelayMs: 100,
533
+ context: {
534
+ operation: "createPost_fetchTaggedEntities",
535
+ userId: session.userId,
536
+ postId: post.id,
537
+ },
538
+ });
539
+ if (postWithEntities?.subjectEntities) {
540
+ taggedEntities = postWithEntities.subjectEntities.map((te) => ({
541
+ id: te.entity.id,
542
+ name: te.entity.name,
543
+ entityType: te.entity.entityType || undefined,
544
+ }));
545
+ }
546
+ }
547
+ // Fetch media for response
548
+ let mediaResponse;
549
+ if (body.media && body.media.length > 0) {
550
+ const postWithMedia = await withQueryTimeoutAndRetry(sharedDatabaseConnectionManager, region, env, async (db) => {
551
+ return await db.post.findUnique({
552
+ where: { id: post.id },
553
+ include: {
554
+ media: {
555
+ include: {
556
+ media: true,
557
+ },
558
+ orderBy: {
559
+ order: "asc",
560
+ },
561
+ },
562
+ },
563
+ });
564
+ }, {
565
+ ...QueryTimeoutPresets.USER_FACING,
566
+ maxRetries: 3,
567
+ baseDelayMs: 100,
568
+ context: {
569
+ operation: "createPost_fetchMedia",
570
+ userId: session.userId,
571
+ postId: post.id,
572
+ },
573
+ });
574
+ if (postWithMedia?.media) {
575
+ mediaResponse = postWithMedia.media.map((pm) => ({
576
+ id: pm.id,
577
+ mediaId: pm.mediaId,
578
+ alt: pm.alt || null,
579
+ order: pm.order,
580
+ file: {
581
+ id: pm.media.id,
582
+ contentHash: pm.media.contentHash,
583
+ mimeType: pm.media.mimeType,
584
+ originalKey: pm.media.originalKey,
585
+ thumbnailKey: pm.media.thumbnailKey || null,
586
+ optimizedKey: pm.media.optimizedKey || null,
587
+ width: pm.media.width || null,
588
+ height: pm.media.height || null,
589
+ },
590
+ }));
591
+ }
592
+ }
593
+ // Fetch link checks for response
594
+ let linksResponse;
595
+ if (linkChecks.length > 0) {
596
+ try {
597
+ const { getWrappedDatabase } = await Promise.resolve().then(() => __importStar(require("./database-wrapper-helper")));
598
+ const db = getWrappedDatabase(region, env, request);
599
+ const linkChecksFromDb = await db.linkCheck.findMany({
600
+ where: { postId: post.id },
601
+ select: {
602
+ id: true,
603
+ originalUrl: true,
604
+ normalizedUrl: true,
605
+ domain: true,
606
+ status: true,
607
+ },
608
+ });
609
+ linksResponse = linkChecksFromDb.map((lc) => ({
610
+ id: lc.id,
611
+ originalUrl: lc.originalUrl,
612
+ normalizedUrl: lc.normalizedUrl,
613
+ domain: lc.domain,
614
+ status: lc.status,
615
+ }));
616
+ }
617
+ catch (error) {
618
+ // If fetching link checks fails, just continue without them
619
+ this.logger.error("Error fetching link checks for response:", error);
620
+ }
621
+ }
622
+ // Fetch taxonomy tags for response
623
+ let taxonomyTagsResponse;
624
+ if (taxonomyTags.length > 0) {
625
+ try {
626
+ const { TaxonomyHandler } = await Promise.resolve().then(() => __importStar(require("./taxonomy-handler")));
627
+ const { getRequestContext } = await Promise.resolve().then(() => __importStar(require("./tenant-context")));
628
+ const { createRequestContext } = await Promise.resolve().then(() => __importStar(require("./request-context")));
629
+ const { getWrappedDatabase } = await Promise.resolve().then(() => __importStar(require("./database-wrapper-helper")));
630
+ const ctx = await createRequestContext(request, env);
631
+ const tenantCtx = await getRequestContext(request, ctx.session || null);
632
+ const tenantId = tenantCtx.tenant?.id || "trellis";
633
+ const db = getWrappedDatabase(region, env, request);
634
+ const taxonomyHandler = new TaxonomyHandler(db, tenantId, env.TAXONOMY_CACHE_KV);
635
+ const tags = await taxonomyHandler.getPostTaxonomyTags(post.id);
636
+ taxonomyTagsResponse = tags.map((t) => ({
637
+ taxonId: t.taxonId,
638
+ displayName: t.displayName,
639
+ description: t.description,
640
+ }));
641
+ }
642
+ catch (error) {
643
+ // If fetching tags fails, just continue without them
644
+ this.logger.error("Error fetching taxonomy tags for response:", error);
645
+ }
646
+ }
647
+ // Note: post.createdAt may not be available from DataRouter return type
648
+ // We'll use current timestamp as fallback
649
+ const createdAt = post.createdAt
650
+ ? new Date(post.createdAt).toISOString()
651
+ : new Date().toISOString();
652
+ // Fetch author information for response - with timeout/retry
653
+ // Use already imported helpers
654
+ const author = await withQueryTimeoutAndRetry(sharedDatabaseConnectionManager, region, env, async (db) => {
655
+ return await db.user.findUnique({
656
+ where: { id: session.userId },
657
+ select: {
658
+ id: true,
659
+ email: true,
660
+ username: true,
661
+ },
662
+ });
663
+ }, {
664
+ ...QueryTimeoutPresets.USER_FACING,
665
+ maxRetries: 3,
666
+ baseDelayMs: 100,
667
+ context: {
668
+ operation: "createPost_fetchAuthor",
669
+ userId: session.userId,
670
+ },
671
+ });
672
+ // Build response with all required fields for PostModel
673
+ const responseData = {
674
+ id: post.id,
675
+ uri: postUri, // PostModel requires uri to be a non-null string
676
+ text: body.text.trim(),
677
+ visibility: body.visibility,
678
+ createdAt, // ISO 8601 string format
679
+ author: author
680
+ ? {
681
+ actorUri: author.id, // PostModel expects actorUri, not did
682
+ handle: author.username || author.email.split("@")[0],
683
+ }
684
+ : {
685
+ actorUri: session.userId, // PostModel expects actorUri, not did
686
+ handle: session.email.split("@")[0],
687
+ },
688
+ sentimentCounts: {
689
+ joy: 0,
690
+ love: 0,
691
+ calm: 0,
692
+ sad: 0,
693
+ angry: 0,
694
+ fear: 0,
695
+ surprise: 0,
696
+ disgust: 0,
697
+ neutral: 0,
698
+ excited: 0,
699
+ grateful: 0,
700
+ },
701
+ commentCount: 0,
702
+ contentWarnings: body.contentWarnings || [],
703
+ };
704
+ // Add optional fields if present
705
+ if (taggedEntities && taggedEntities.length > 0) {
706
+ responseData.taggedEntities = taggedEntities;
707
+ }
708
+ if (taxonomyTagsResponse && taxonomyTagsResponse.length > 0) {
709
+ responseData.taxonomyTags = taxonomyTagsResponse;
710
+ }
711
+ if (body.geoData) {
712
+ responseData.geoData = body.geoData;
713
+ }
714
+ if (linksResponse && linksResponse.length > 0) {
715
+ responseData.links = linksResponse;
716
+ }
717
+ if (mediaResponse && mediaResponse.length > 0) {
718
+ responseData.media = mediaResponse;
719
+ }
720
+ // Log response data for debugging (always log in dev, use info level so it shows up)
721
+ try {
722
+ const responseBody = JSON.stringify(responseData);
723
+ // Log full response in dev environment for debugging
724
+ if (env.ENVIRONMENT === "dev") {
725
+ this.logger.info("[PostHandler] Post creation response:", {
726
+ postId: responseData.id,
727
+ hasAuthor: !!responseData.author,
728
+ hasSentimentCounts: !!responseData.sentimentCounts,
729
+ uri: responseData.uri,
730
+ responseSize: responseBody.length,
731
+ fullResponse: responseBody, // Log full response for debugging
732
+ });
733
+ }
734
+ return new Response(responseBody, {
735
+ status: 201,
736
+ headers: { "content-type": "application/json" },
737
+ });
738
+ }
739
+ catch (serializationError) {
740
+ this.logger.error("[PostHandler] Failed to serialize response:", {
741
+ message: serializationError.message,
742
+ stack: serializationError.stack,
743
+ responseDataKeys: Object.keys(responseData),
744
+ postId: responseData.id,
745
+ });
746
+ // Return error response instead of throwing
747
+ return new Response(JSON.stringify({
748
+ error: "Failed to serialize response",
749
+ postId: responseData.id,
750
+ }), { status: 500, headers: { "content-type": "application/json" } });
751
+ }
752
+ }
753
+ catch (error) {
754
+ // Safely log error (handle Symbols and non-serializable values)
755
+ try {
756
+ const errorMessage = error?.message || String(error);
757
+ const errorStack = error?.stack;
758
+ this.logger.error("Error creating post:", {
759
+ message: errorMessage,
760
+ stack: errorStack,
761
+ name: error?.name,
762
+ code: error?.code,
763
+ });
764
+ }
765
+ catch (logError) {
766
+ // If even logging fails, use a fallback
767
+ this.logger.error("Error creating post: [Unable to serialize error]");
768
+ }
769
+ // Handle entity tagging errors with proper status codes
770
+ const { EntityTaggingError } = await Promise.resolve().then(() => __importStar(require("./entity-tagging-errors")));
771
+ if (error instanceof EntityTaggingError) {
772
+ return new Response(JSON.stringify({
773
+ error: error.code,
774
+ message: error.message,
775
+ }), {
776
+ status: error.statusCode,
777
+ headers: { "content-type": "application/json" },
778
+ });
779
+ }
780
+ // Generic error handling
781
+ // In dev/test environments, include error details for debugging
782
+ const environment = (env.ENVIRONMENT ||
783
+ env.DEPLOY_ENV ||
784
+ "dev").toLowerCase();
785
+ const isDevOrTest = environment === "dev" ||
786
+ environment === "test" ||
787
+ env.CI === "true";
788
+ const errorResponse = { error: "Failed to create post" };
789
+ if (isDevOrTest) {
790
+ // Include error details in dev/test for debugging
791
+ errorResponse.details = {
792
+ message: error?.message || String(error),
793
+ name: error?.name,
794
+ code: error?.code,
795
+ // Don't include stack trace in response (security)
796
+ };
797
+ }
798
+ return new Response(JSON.stringify(errorResponse), {
799
+ status: 500,
800
+ headers: { "content-type": "application/json" },
801
+ });
802
+ }
803
+ }
804
+ /**
805
+ * Delete a post (soft delete)
806
+ *
807
+ * PREPARATORY: Uses DataRouter to validate region before deletion.
808
+ */
809
+ async deletePost(postId, request, session, env, requestContext) {
810
+ try {
811
+ const requestId = (0, logger_1.generateRequestId)();
812
+ const region = requestContext.region;
813
+ // PREPARATORY: Verify post exists in correct region using DataRouter
814
+ const post = await data_router_1.DataRouter.getPost(postId, region, env, undefined, requestId, session.userId);
815
+ if (!post) {
816
+ return new Response(JSON.stringify({ error: "Post not found" }), {
817
+ status: 404,
818
+ headers: { "content-type": "application/json" },
819
+ });
820
+ }
821
+ if (post.authorId !== session.userId) {
822
+ return new Response(JSON.stringify({ error: "Forbidden" }), {
823
+ status: 403,
824
+ headers: { "content-type": "application/json" },
825
+ });
826
+ }
827
+ // Use DataRouter to get database for region, then update directly
828
+ // (DataRouter doesn't have update methods yet, but we've validated region)
829
+ const db = data_router_1.DataRouter.getDatabaseForRegion(region, env, request, session?.userId);
830
+ // Check if already deleted - with timeout/retry
831
+ const dbHelpers = await Promise.resolve().then(() => __importStar(require("./db-query-helper")));
832
+ const dbManager = await Promise.resolve().then(() => __importStar(require("./database-connection-manager")));
833
+ const { sharedDatabaseConnectionManager } = dbManager;
834
+ const { withQueryTimeoutAndRetry, QueryTimeoutPresets } = dbHelpers;
835
+ const existingPost = await withQueryTimeoutAndRetry(sharedDatabaseConnectionManager, region, env, async (db) => {
836
+ return await db.post.findUnique({
837
+ where: { id: postId },
838
+ select: { deletedAt: true },
839
+ });
840
+ }, {
841
+ ...QueryTimeoutPresets.USER_FACING,
842
+ maxRetries: 3,
843
+ baseDelayMs: 100,
844
+ context: {
845
+ operation: "deletePost_checkDeleted",
846
+ userId: session.userId,
847
+ postId,
848
+ },
849
+ });
850
+ if (existingPost?.deletedAt) {
851
+ return new Response(JSON.stringify({ error: "Post already deleted" }), {
852
+ status: 410,
853
+ headers: { "content-type": "application/json" },
854
+ });
855
+ }
856
+ // Soft delete - with timeout/retry
857
+ await withQueryTimeoutAndRetry(sharedDatabaseConnectionManager, region, env, async (db) => {
858
+ return await db.post.update({
859
+ where: { id: postId },
860
+ data: { deletedAt: new Date() },
861
+ });
862
+ }, {
863
+ ...QueryTimeoutPresets.USER_FACING,
864
+ maxRetries: 3,
865
+ baseDelayMs: 100,
866
+ context: {
867
+ operation: "deletePost",
868
+ userId: session.userId,
869
+ postId,
870
+ },
871
+ });
872
+ // Note: AT Protocol integration removed
873
+ // Graph sync: remove post from graph database
874
+ try {
875
+ const { createGraphServiceFromEnv } = await Promise.resolve().then(() => __importStar(require("./graph")));
876
+ const graphService = await createGraphServiceFromEnv(env);
877
+ await graphService.removePost(postId);
878
+ }
879
+ catch (graphError) {
880
+ this.logger.error("[PostHandler] Graph sync failed for post deletion (non-fatal):", {
881
+ postId,
882
+ message: graphError?.message,
883
+ });
884
+ }
885
+ // Invalidate feed cache
886
+ await this.invalidateFeedCache(env);
887
+ return new Response(JSON.stringify({ success: true, message: "Post deleted successfully" }), { status: 200, headers: { "content-type": "application/json" } });
888
+ }
889
+ catch (error) {
890
+ this.logger.error("Error deleting post:", error);
891
+ return new Response(JSON.stringify({ error: "Failed to delete post" }), {
892
+ status: 500,
893
+ headers: { "content-type": "application/json" },
894
+ });
895
+ }
896
+ }
897
+ /**
898
+ * Edit an existing post
899
+ *
900
+ * PREPARATORY: Uses DataRouter to validate region before editing.
901
+ *
902
+ * Requirements:
903
+ * - 4.1: PATCH /api/posts/:postId endpoint
904
+ * - 4.2: Update post text and media
905
+ * - 4.3: Set editedAt timestamp
906
+ * - 4.4, 4.5: Validate input (text required, max 3000 chars)
907
+ * - 4.6: Return 401 if not authenticated
908
+ * - 4.7: Return 403 if not post owner
909
+ * - 4.8: Return 404 if post not found
910
+ * - 5.1-5.4: Content moderation on edited content
911
+ * - 6.1-6.4: ActivityPub sync for public posts
912
+ * - 7.1-7.3: Cache invalidation
913
+ */
914
+ async editPost(postId, request, session, env, requestContext) {
915
+ try {
916
+ // Validate request body with Zod schema
917
+ const { validateRequest } = await Promise.resolve().then(() => __importStar(require("./validate-request")));
918
+ const { editPostSchema } = await Promise.resolve().then(() => __importStar(require("./schemas")));
919
+ const validation = await validateRequest(request, editPostSchema);
920
+ if (!validation.success) {
921
+ return validation.error;
922
+ }
923
+ const body = validation.data;
924
+ const requestId = (0, logger_1.generateRequestId)();
925
+ const region = requestContext.region;
926
+ // Verify post exists in correct region using DataRouter
927
+ const post = await data_router_1.DataRouter.getPost(postId, region, env, undefined, requestId, session.userId);
928
+ if (!post) {
929
+ return new Response(JSON.stringify({ error: "Post not found" }), {
930
+ status: 404,
931
+ headers: { "content-type": "application/json" },
932
+ });
933
+ }
934
+ // Authorization check - only post owner can edit
935
+ if (post.authorId !== session.userId) {
936
+ return new Response(JSON.stringify({
937
+ error: "Forbidden",
938
+ message: "You can only edit your own posts",
939
+ }), {
940
+ status: 403,
941
+ headers: { "content-type": "application/json" },
942
+ });
943
+ }
944
+ // Check if post is deleted
945
+ if (post.deletedAt) {
946
+ return new Response(JSON.stringify({ error: "Cannot edit a deleted post" }), {
947
+ status: 410,
948
+ headers: { "content-type": "application/json" },
949
+ });
950
+ }
951
+ // Check if content moderation is enabled via feature toggle
952
+ const { FeatureToggleService } = await Promise.resolve().then(() => __importStar(require("./feature-toggle-service")));
953
+ const { createPrisma } = await Promise.resolve().then(() => __importStar(require("../db")));
954
+ const db = createPrisma(env);
955
+ const toggleService = new FeatureToggleService(db, env);
956
+ const moderationEnabled = await toggleService.isEnabled("content_moderation_enabled");
957
+ // Content moderation on edited text (if moderation is enabled)
958
+ if (moderationEnabled) {
959
+ const moderationResult = await this.moderationHandler.moderateText(body.text, env);
960
+ if (!moderationResult.approved) {
961
+ return new Response(JSON.stringify({
962
+ error: "CONTENT_REJECTED",
963
+ message: "Your edited post contains inappropriate content. Please be more constructive.",
964
+ score: moderationResult.score,
965
+ details: moderationResult.details,
966
+ }), { status: 400, headers: { "content-type": "application/json" } });
967
+ }
968
+ }
969
+ else {
970
+ logger_1.Logger.getInstance(env).debug("[PostHandler] Content moderation is disabled via feature toggle (edit post)");
971
+ }
972
+ // Check for malicious links in edited content
973
+ const { LinkSecurityHandler, LinkStatus } = await Promise.resolve().then(() => __importStar(require("./link-security-handler")));
974
+ const linkSecurityHandler = new LinkSecurityHandler(env);
975
+ const urls = linkSecurityHandler.extractUrls(body.text);
976
+ let hasBlockedLinks = false;
977
+ for (const url of urls) {
978
+ const linkValidation = linkSecurityHandler.validateUrlSync(url);
979
+ if (linkValidation.status === LinkStatus.BLOCKED) {
980
+ hasBlockedLinks = true;
981
+ this.logger.warn(`Blocked dangerous URL in post edit: ${url}`, {
982
+ reason: linkValidation.reason,
983
+ userId: session.userId,
984
+ postId,
985
+ });
986
+ break;
987
+ }
988
+ }
989
+ if (hasBlockedLinks) {
990
+ return new Response(JSON.stringify({
991
+ error: "DANGEROUS_LINKS_DETECTED",
992
+ message: "Your edited post contains dangerous or blocked links. Please remove them and try again.",
993
+ }), { status: 400, headers: { "content-type": "application/json" } });
994
+ }
995
+ // Sanitize user input to prevent XSS
996
+ const { InputSanitizer } = await Promise.resolve().then(() => __importStar(require("./input-sanitizer")));
997
+ const sanitizedText = InputSanitizer.sanitizeText(body.text);
998
+ // Update post in database with timeout/retry
999
+ const dbHelpers = await Promise.resolve().then(() => __importStar(require("./db-query-helper")));
1000
+ const dbManager = await Promise.resolve().then(() => __importStar(require("./database-connection-manager")));
1001
+ const { sharedDatabaseConnectionManager } = dbManager;
1002
+ const { withQueryTimeoutAndRetry, QueryTimeoutPresets } = dbHelpers;
1003
+ const updatedPost = await withQueryTimeoutAndRetry(sharedDatabaseConnectionManager, region, env, async (db) => {
1004
+ const updateData = {
1005
+ text: sanitizedText.trim(),
1006
+ editedAt: new Date(),
1007
+ hasBlockedLinks: false, // Reset since we validated
1008
+ };
1009
+ // Update visibility if provided
1010
+ if (body.visibility) {
1011
+ // Convert visibility to Prisma enum format
1012
+ // API accepts: "public", "friends-only", "private"
1013
+ // Prisma expects: "PUBLIC", "FRIENDS", "PRIVATE"
1014
+ let visibility = body.visibility.toUpperCase();
1015
+ if (visibility === "FRIENDS-ONLY" ||
1016
+ visibility === "FRIENDS_ONLY") {
1017
+ visibility = "FRIENDS";
1018
+ }
1019
+ updateData.visibility = visibility;
1020
+ }
1021
+ return await db.post.update({
1022
+ where: { id: postId },
1023
+ data: updateData,
1024
+ include: {
1025
+ author: {
1026
+ select: {
1027
+ id: true,
1028
+ email: true,
1029
+ username: true,
1030
+ actorUri: true,
1031
+ publicKey: true,
1032
+ },
1033
+ },
1034
+ media: {
1035
+ include: {
1036
+ media: true,
1037
+ },
1038
+ },
1039
+ },
1040
+ });
1041
+ }, {
1042
+ ...QueryTimeoutPresets.USER_FACING,
1043
+ maxRetries: 3,
1044
+ baseDelayMs: 100,
1045
+ context: {
1046
+ operation: "editPost",
1047
+ userId: session.userId,
1048
+ postId,
1049
+ },
1050
+ });
1051
+ // ActivityPub sync for public posts only
1052
+ if (updatedPost.radius === "SHOUT" &&
1053
+ updatedPost.author?.actorUri &&
1054
+ updatedPost.author?.publicKey) {
1055
+ // Run ActivityPub update asynchronously (don't block response)
1056
+ (async () => {
1057
+ try {
1058
+ const { PostActivityServiceFedify } = await Promise.resolve().then(() => __importStar(require("./activitypub/services/post-service-fedify")));
1059
+ const { DeliveryService } = await Promise.resolve().then(() => __importStar(require("./activitypub/delivery-service")));
1060
+ // Send Update activity to followers
1061
+ await withQueryTimeoutAndRetry(sharedDatabaseConnectionManager, region, env, async (db) => {
1062
+ // Create Update activity for the edited post
1063
+ await PostActivityServiceFedify.createUpdateActivity(db, updatedPost, updatedPost.author, env, request.url);
1064
+ }, {
1065
+ ...QueryTimeoutPresets.STANDARD,
1066
+ maxRetries: 2,
1067
+ baseDelayMs: 100,
1068
+ context: {
1069
+ operation: "editPost_activityPub",
1070
+ userId: session.userId,
1071
+ postId,
1072
+ },
1073
+ });
1074
+ }
1075
+ catch (error) {
1076
+ // Log error but don't fail the edit if ActivityPub fails
1077
+ this.logger.error("[PostHandler] ActivityPub update failed for edited post:", error);
1078
+ }
1079
+ })();
1080
+ }
1081
+ // Invalidate caches
1082
+ await this.invalidateFeedCache(env);
1083
+ await this.invalidatePostCache(postId, env);
1084
+ // Fetch sentiment counts for the post
1085
+ const sentiments = await withQueryTimeoutAndRetry(sharedDatabaseConnectionManager, region, env, async (db) => {
1086
+ return await db.postSentiment.groupBy({
1087
+ by: ["sentiment"],
1088
+ where: { postId },
1089
+ _count: true,
1090
+ });
1091
+ }, {
1092
+ ...QueryTimeoutPresets.USER_FACING,
1093
+ maxRetries: 2,
1094
+ baseDelayMs: 50,
1095
+ context: {
1096
+ operation: "editPost_getSentiments",
1097
+ postId,
1098
+ },
1099
+ });
1100
+ const sentimentCounts = {
1101
+ joy: 0,
1102
+ love: 0,
1103
+ calm: 0,
1104
+ sad: 0,
1105
+ angry: 0,
1106
+ fear: 0,
1107
+ surprise: 0,
1108
+ disgust: 0,
1109
+ neutral: 0,
1110
+ excited: 0,
1111
+ grateful: 0,
1112
+ };
1113
+ for (const s of sentiments) {
1114
+ sentimentCounts[s.sentiment] = s._count;
1115
+ }
1116
+ // Fetch comment count for the post
1117
+ const commentCount = await withQueryTimeoutAndRetry(sharedDatabaseConnectionManager, region, env, async (db) => {
1118
+ return await db.postComment.count({
1119
+ where: { postId },
1120
+ });
1121
+ }, {
1122
+ ...QueryTimeoutPresets.USER_FACING,
1123
+ maxRetries: 2,
1124
+ baseDelayMs: 50,
1125
+ context: {
1126
+ operation: "editPost_getCommentCount",
1127
+ postId,
1128
+ },
1129
+ });
1130
+ // Build response with all required fields for PostModel
1131
+ const responseData = {
1132
+ id: updatedPost.id,
1133
+ uri: updatedPost.uri || "",
1134
+ text: updatedPost.text,
1135
+ visibility: updatedPost.radius?.toLowerCase() || "normal",
1136
+ createdAt: updatedPost.createdAt.toISOString(),
1137
+ editedAt: updatedPost.editedAt?.toISOString() || null,
1138
+ author: {
1139
+ actorUri: updatedPost.author?.actorUri ||
1140
+ updatedPost.author?.id ||
1141
+ session.userId,
1142
+ handle: updatedPost.author?.username ||
1143
+ updatedPost.author?.email?.split("@")[0] ||
1144
+ session.email.split("@")[0],
1145
+ },
1146
+ sentimentCounts: {
1147
+ joy: sentimentCounts.joy || 0,
1148
+ love: sentimentCounts.love || 0,
1149
+ calm: sentimentCounts.calm || 0,
1150
+ sad: sentimentCounts.sad || 0,
1151
+ angry: sentimentCounts.angry || 0,
1152
+ fear: sentimentCounts.fear || 0,
1153
+ surprise: sentimentCounts.surprise || 0,
1154
+ disgust: sentimentCounts.disgust || 0,
1155
+ neutral: sentimentCounts.neutral || 0,
1156
+ excited: sentimentCounts.excited || 0,
1157
+ grateful: sentimentCounts.grateful || 0,
1158
+ },
1159
+ commentCount,
1160
+ contentWarnings: updatedPost.contentWarnings || [],
1161
+ media: updatedPost.media?.map((pm) => ({
1162
+ id: pm.id,
1163
+ mediaId: pm.mediaId,
1164
+ alt: pm.alt || null,
1165
+ order: pm.order,
1166
+ file: {
1167
+ id: pm.media.id,
1168
+ contentHash: pm.media.contentHash,
1169
+ mimeType: pm.media.mimeType,
1170
+ originalKey: pm.media.originalKey,
1171
+ thumbnailKey: pm.media.thumbnailKey || null,
1172
+ optimizedKey: pm.media.optimizedKey || null,
1173
+ width: pm.media.width || null,
1174
+ height: pm.media.height || null,
1175
+ },
1176
+ })) || [],
1177
+ };
1178
+ return new Response(JSON.stringify(responseData), {
1179
+ status: 200,
1180
+ headers: { "content-type": "application/json" },
1181
+ });
1182
+ }
1183
+ catch (error) {
1184
+ this.logger.error("Error editing post:", error);
1185
+ return new Response(JSON.stringify({ error: "Failed to edit post" }), {
1186
+ status: 500,
1187
+ headers: { "content-type": "application/json" },
1188
+ });
1189
+ }
1190
+ }
1191
+ /**
1192
+ * Invalidate post-specific cache entries
1193
+ */
1194
+ async invalidatePostCache(postId, env) {
1195
+ const kv = env.FEED_CACHE_KV;
1196
+ if (!kv)
1197
+ return;
1198
+ try {
1199
+ // Delete post-specific cache entries
1200
+ const keys = [
1201
+ `post:${postId}`,
1202
+ `post:${postId}:reactions`,
1203
+ `post:${postId}:comments`,
1204
+ ];
1205
+ await Promise.all(keys.map((key) => kv.delete(key)));
1206
+ }
1207
+ catch (error) {
1208
+ this.logger.error("Error invalidating post cache:", error);
1209
+ }
1210
+ }
1211
+ /**
1212
+ * Hide a post
1213
+ *
1214
+ * PREPARATORY: Uses DataRouter to validate region before hiding.
1215
+ */
1216
+ async hidePost(postId, request, session, env, requestContext) {
1217
+ try {
1218
+ const requestId = (0, logger_1.generateRequestId)();
1219
+ const region = requestContext.region;
1220
+ // PREPARATORY: Verify post exists in correct region using DataRouter
1221
+ const post = await data_router_1.DataRouter.getPost(postId, region, env, undefined, requestId, session.userId);
1222
+ if (!post) {
1223
+ return new Response(JSON.stringify({ error: "Post not found" }), {
1224
+ status: 404,
1225
+ headers: { "content-type": "application/json" },
1226
+ });
1227
+ }
1228
+ if (post.authorId !== session.userId) {
1229
+ return new Response(JSON.stringify({ error: "Forbidden" }), {
1230
+ status: 403,
1231
+ headers: { "content-type": "application/json" },
1232
+ });
1233
+ }
1234
+ // Update post with timeout/retry
1235
+ const dbHelpers = await Promise.resolve().then(() => __importStar(require("./db-query-helper")));
1236
+ const dbManager = await Promise.resolve().then(() => __importStar(require("./database-connection-manager")));
1237
+ const { sharedDatabaseConnectionManager } = dbManager;
1238
+ const { withQueryTimeoutAndRetry, QueryTimeoutPresets } = dbHelpers;
1239
+ await withQueryTimeoutAndRetry(sharedDatabaseConnectionManager, region, env, async (db) => {
1240
+ return await db.post.update({
1241
+ where: { id: postId },
1242
+ data: { hiddenByAuthor: true },
1243
+ });
1244
+ }, {
1245
+ ...QueryTimeoutPresets.USER_FACING,
1246
+ maxRetries: 3,
1247
+ baseDelayMs: 100,
1248
+ context: {
1249
+ operation: "hidePost",
1250
+ userId: session.userId,
1251
+ postId,
1252
+ },
1253
+ });
1254
+ await this.invalidateFeedCache(env);
1255
+ return new Response(JSON.stringify({ success: true, message: "Post hidden successfully" }), { status: 200, headers: { "content-type": "application/json" } });
1256
+ }
1257
+ catch (error) {
1258
+ this.logger.error("Error hiding post:", error);
1259
+ return new Response(JSON.stringify({ error: "Failed to hide post" }), {
1260
+ status: 500,
1261
+ headers: { "content-type": "application/json" },
1262
+ });
1263
+ }
1264
+ }
1265
+ /**
1266
+ * Unhide a post
1267
+ *
1268
+ * PREPARATORY: Uses DataRouter to validate region before unhiding.
1269
+ */
1270
+ async unhidePost(postId, request, session, env, requestContext) {
1271
+ try {
1272
+ const requestId = (0, logger_1.generateRequestId)();
1273
+ const region = requestContext.region;
1274
+ // PREPARATORY: Verify post exists in correct region using DataRouter
1275
+ const post = await data_router_1.DataRouter.getPost(postId, region, env, undefined, requestId, session.userId);
1276
+ if (!post) {
1277
+ return new Response(JSON.stringify({ error: "Post not found" }), {
1278
+ status: 404,
1279
+ headers: { "content-type": "application/json" },
1280
+ });
1281
+ }
1282
+ if (post.authorId !== session.userId) {
1283
+ return new Response(JSON.stringify({ error: "Forbidden" }), {
1284
+ status: 403,
1285
+ headers: { "content-type": "application/json" },
1286
+ });
1287
+ }
1288
+ // Update post with timeout/retry
1289
+ const dbHelpers = await Promise.resolve().then(() => __importStar(require("./db-query-helper")));
1290
+ const dbManager = await Promise.resolve().then(() => __importStar(require("./database-connection-manager")));
1291
+ const { sharedDatabaseConnectionManager } = dbManager;
1292
+ const { withQueryTimeoutAndRetry, QueryTimeoutPresets } = dbHelpers;
1293
+ await withQueryTimeoutAndRetry(sharedDatabaseConnectionManager, region, env, async (db) => {
1294
+ return await db.post.update({
1295
+ where: { id: postId },
1296
+ data: { hiddenByAuthor: false },
1297
+ });
1298
+ }, {
1299
+ ...QueryTimeoutPresets.USER_FACING,
1300
+ maxRetries: 3,
1301
+ baseDelayMs: 100,
1302
+ context: {
1303
+ operation: "unhidePost",
1304
+ userId: session.userId,
1305
+ postId,
1306
+ },
1307
+ });
1308
+ await this.invalidateFeedCache(env);
1309
+ return new Response(JSON.stringify({
1310
+ success: true,
1311
+ message: "Post unhidden successfully",
1312
+ }), { status: 200, headers: { "content-type": "application/json" } });
1313
+ }
1314
+ catch (error) {
1315
+ this.logger.error("Error unhiding post:", error);
1316
+ return new Response(JSON.stringify({ error: "Failed to unhide post" }), {
1317
+ status: 500,
1318
+ headers: { "content-type": "application/json" },
1319
+ });
1320
+ }
1321
+ }
1322
+ /**
1323
+ * Invalidate feed cache by incrementing version
1324
+ * Uses cache versioning: all cache keys include a version number,
1325
+ * and incrementing the version makes all old cache entries invalid.
1326
+ */
1327
+ async invalidateFeedCache(env) {
1328
+ const kv = env.FEED_CACHE_KV;
1329
+ if (!kv)
1330
+ return;
1331
+ try {
1332
+ // Get current version
1333
+ const versionStr = await kv.get("feed:cache:version", "text");
1334
+ const currentVersion = versionStr ? parseInt(versionStr, 10) : 1;
1335
+ // Increment version - this invalidates all existing cache entries
1336
+ // (they use old version in their keys)
1337
+ const newVersion = currentVersion + 1;
1338
+ await kv.put("feed:cache:version", newVersion.toString());
1339
+ }
1340
+ catch (error) {
1341
+ this.logger.error("Error invalidating feed cache:", error);
1342
+ }
1343
+ }
1344
+ }
1345
+ exports.PostHandler = PostHandler;
1346
+ //# sourceMappingURL=post-handler.js.map