@atproto/ozone 0.2.4 → 0.2.6

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 (217) hide show
  1. package/CHANGELOG.md +24 -0
  2. package/dist/api/index.d.ts.map +1 -1
  3. package/dist/api/index.js +2 -0
  4. package/dist/api/index.js.map +1 -1
  5. package/dist/api/label/queryLabels.d.ts.map +1 -1
  6. package/dist/api/label/queryLabels.js +13 -21
  7. package/dist/api/label/queryLabels.js.map +1 -1
  8. package/dist/api/report/queryActivities.d.ts +4 -0
  9. package/dist/api/report/queryActivities.d.ts.map +1 -0
  10. package/dist/api/report/queryActivities.js +36 -0
  11. package/dist/api/report/queryActivities.js.map +1 -0
  12. package/dist/assignment/index.d.ts.map +1 -1
  13. package/dist/assignment/index.js +9 -12
  14. package/dist/assignment/index.js.map +1 -1
  15. package/dist/background.d.ts +5 -3
  16. package/dist/background.d.ts.map +1 -1
  17. package/dist/background.js +13 -4
  18. package/dist/background.js.map +1 -1
  19. package/dist/context.js +1 -1
  20. package/dist/context.js.map +1 -1
  21. package/dist/daemon/context.js +1 -1
  22. package/dist/daemon/context.js.map +1 -1
  23. package/dist/daemon/event-pusher.d.ts +7 -1
  24. package/dist/daemon/event-pusher.d.ts.map +1 -1
  25. package/dist/daemon/verification-listener.d.ts +1 -1
  26. package/dist/daemon/verification-listener.d.ts.map +1 -1
  27. package/dist/daemon/verification-listener.js +10 -4
  28. package/dist/daemon/verification-listener.js.map +1 -1
  29. package/dist/db/index.d.ts +4 -5
  30. package/dist/db/index.d.ts.map +1 -1
  31. package/dist/db/index.js +2 -1
  32. package/dist/db/index.js.map +1 -1
  33. package/dist/db/migrations/20241220T144630860Z-stats-materialized-views.d.ts +1 -2
  34. package/dist/db/migrations/20241220T144630860Z-stats-materialized-views.d.ts.map +1 -1
  35. package/dist/db/migrations/20241220T144630860Z-stats-materialized-views.js.map +1 -1
  36. package/dist/db/migrations/20250718T150931000Z-update-appeal-reason-stats.d.ts +1 -2
  37. package/dist/db/migrations/20250718T150931000Z-update-appeal-reason-stats.d.ts.map +1 -1
  38. package/dist/db/migrations/20250718T150931000Z-update-appeal-reason-stats.js.map +1 -1
  39. package/dist/db/migrations/20260602T120000000Z-add-report-activity-created-index.d.ts +4 -0
  40. package/dist/db/migrations/20260602T120000000Z-add-report-activity-created-index.d.ts.map +1 -0
  41. package/dist/db/migrations/20260602T120000000Z-add-report-activity-created-index.js +15 -0
  42. package/dist/db/migrations/20260602T120000000Z-add-report-activity-created-index.js.map +1 -0
  43. package/dist/db/migrations/index.d.ts +1 -0
  44. package/dist/db/migrations/index.d.ts.map +1 -1
  45. package/dist/db/migrations/index.js +1 -0
  46. package/dist/db/migrations/index.js.map +1 -1
  47. package/dist/db/migrations/provider.d.ts +2 -1
  48. package/dist/db/migrations/provider.d.ts.map +1 -1
  49. package/dist/db/migrations/provider.js.map +1 -1
  50. package/dist/db/pagination.d.ts +4 -3
  51. package/dist/db/pagination.d.ts.map +1 -1
  52. package/dist/db/pagination.js +4 -4
  53. package/dist/db/pagination.js.map +1 -1
  54. package/dist/db/types.d.ts +1 -1
  55. package/dist/db/types.d.ts.map +1 -1
  56. package/dist/db/types.js.map +1 -1
  57. package/dist/index.d.ts.map +1 -1
  58. package/dist/index.js +23 -13
  59. package/dist/index.js.map +1 -1
  60. package/dist/jetstream/service.d.ts +1 -1
  61. package/dist/jetstream/service.d.ts.map +1 -1
  62. package/dist/jetstream/service.js +3 -1
  63. package/dist/jetstream/service.js.map +1 -1
  64. package/dist/lexicon/index.d.ts +11 -0
  65. package/dist/lexicon/index.d.ts.map +1 -1
  66. package/dist/lexicon/index.js +18 -0
  67. package/dist/lexicon/index.js.map +1 -1
  68. package/dist/lexicon/lexicons.d.ts +338 -0
  69. package/dist/lexicon/lexicons.d.ts.map +1 -1
  70. package/dist/lexicon/lexicons.js +173 -0
  71. package/dist/lexicon/lexicons.js.map +1 -1
  72. package/dist/lexicon/types/app/bsky/notification/defs.d.ts +1 -0
  73. package/dist/lexicon/types/app/bsky/notification/defs.d.ts.map +1 -1
  74. package/dist/lexicon/types/app/bsky/notification/defs.js.map +1 -1
  75. package/dist/lexicon/types/chat/bsky/notification/defs.d.ts +19 -0
  76. package/dist/lexicon/types/chat/bsky/notification/defs.d.ts.map +1 -0
  77. package/dist/lexicon/types/chat/bsky/notification/defs.js +19 -0
  78. package/dist/lexicon/types/chat/bsky/notification/defs.js.map +1 -0
  79. package/dist/lexicon/types/chat/bsky/notification/getPreferences.d.ts +20 -0
  80. package/dist/lexicon/types/chat/bsky/notification/getPreferences.d.ts.map +1 -0
  81. package/dist/lexicon/types/chat/bsky/notification/getPreferences.js +5 -0
  82. package/dist/lexicon/types/chat/bsky/notification/getPreferences.js.map +1 -0
  83. package/dist/lexicon/types/chat/bsky/notification/putPreferences.d.ts +26 -0
  84. package/dist/lexicon/types/chat/bsky/notification/putPreferences.d.ts.map +1 -0
  85. package/dist/lexicon/types/chat/bsky/notification/putPreferences.js +5 -0
  86. package/dist/lexicon/types/chat/bsky/notification/putPreferences.js.map +1 -0
  87. package/dist/lexicon/types/tools/ozone/report/defs.d.ts +1 -0
  88. package/dist/lexicon/types/tools/ozone/report/defs.d.ts.map +1 -1
  89. package/dist/lexicon/types/tools/ozone/report/defs.js.map +1 -1
  90. package/dist/lexicon/types/tools/ozone/report/queryActivities.d.ts +32 -0
  91. package/dist/lexicon/types/tools/ozone/report/queryActivities.d.ts.map +1 -0
  92. package/dist/lexicon/types/tools/ozone/report/queryActivities.js +5 -0
  93. package/dist/lexicon/types/tools/ozone/report/queryActivities.js.map +1 -0
  94. package/dist/mod-service/index.d.ts.map +1 -1
  95. package/dist/mod-service/index.js +28 -52
  96. package/dist/mod-service/index.js.map +1 -1
  97. package/dist/mod-service/report.d.ts +1 -0
  98. package/dist/mod-service/report.d.ts.map +1 -1
  99. package/dist/mod-service/report.js +16 -0
  100. package/dist/mod-service/report.js.map +1 -1
  101. package/dist/mod-service/status.d.ts +23 -128
  102. package/dist/mod-service/status.d.ts.map +1 -1
  103. package/dist/mod-service/views.js +7 -11
  104. package/dist/mod-service/views.js.map +1 -1
  105. package/dist/queue/service.js +1 -3
  106. package/dist/queue/service.js.map +1 -1
  107. package/dist/report/activity.d.ts +31 -2
  108. package/dist/report/activity.d.ts.map +1 -1
  109. package/dist/report/activity.js +27 -1
  110. package/dist/report/activity.js.map +1 -1
  111. package/dist/report/stats.d.ts.map +1 -1
  112. package/dist/report/stats.js.map +1 -1
  113. package/dist/scheduled-action/service.d.ts.map +1 -1
  114. package/dist/scheduled-action/service.js +16 -20
  115. package/dist/scheduled-action/service.js.map +1 -1
  116. package/dist/set/service.d.ts +10 -1
  117. package/dist/set/service.d.ts.map +1 -1
  118. package/dist/set/service.js +5 -2
  119. package/dist/set/service.js.map +1 -1
  120. package/dist/team/index.d.ts.map +1 -1
  121. package/dist/team/index.js +5 -4
  122. package/dist/team/index.js.map +1 -1
  123. package/dist/verification/issuer.d.ts +13 -3
  124. package/dist/verification/issuer.d.ts.map +1 -1
  125. package/dist/verification/service.d.ts +13 -1
  126. package/dist/verification/service.d.ts.map +1 -1
  127. package/dist/verification/service.js +1 -1
  128. package/dist/verification/service.js.map +1 -1
  129. package/package.json +12 -11
  130. package/src/api/index.ts +2 -0
  131. package/src/api/label/queryLabels.ts +11 -14
  132. package/src/api/report/queryActivities.ts +64 -0
  133. package/src/assignment/index.ts +15 -18
  134. package/src/background.ts +19 -4
  135. package/src/context.ts +1 -1
  136. package/src/daemon/context.ts +1 -1
  137. package/src/daemon/verification-listener.ts +9 -4
  138. package/src/db/index.ts +1 -1
  139. package/src/db/migrations/20241220T144630860Z-stats-materialized-views.ts +1 -2
  140. package/src/db/migrations/20250718T150931000Z-update-appeal-reason-stats.ts +1 -2
  141. package/src/db/migrations/20260602T120000000Z-add-report-activity-created-index.ts +17 -0
  142. package/src/db/migrations/index.ts +1 -0
  143. package/src/db/migrations/provider.ts +2 -1
  144. package/src/db/pagination.ts +18 -18
  145. package/src/db/types.ts +3 -1
  146. package/src/index.ts +25 -15
  147. package/src/jetstream/service.ts +3 -1
  148. package/src/mod-service/index.ts +78 -71
  149. package/src/mod-service/report.ts +24 -3
  150. package/src/mod-service/views.ts +16 -16
  151. package/src/queue/service.ts +5 -5
  152. package/src/report/activity.ts +47 -0
  153. package/src/report/stats.ts +5 -3
  154. package/src/scheduled-action/service.ts +22 -20
  155. package/src/set/service.ts +17 -14
  156. package/src/team/index.ts +6 -5
  157. package/src/verification/service.ts +2 -2
  158. package/tests/3p-labeler.test.ts +2 -2
  159. package/tests/_util.ts +8 -25
  160. package/tests/account-strikes.test.ts +1 -1
  161. package/tests/ack-all-subjects-of-account.test.ts +1 -1
  162. package/tests/age-assurance.test.ts +1 -1
  163. package/tests/blob-divert.test.ts +1 -1
  164. package/tests/communication-templates.test.ts +1 -1
  165. package/tests/content-tagger.test.ts +1 -1
  166. package/tests/db.test.ts +1 -1
  167. package/tests/expiring-label.test.ts +1 -1
  168. package/tests/expiring-tags.test.ts +1 -1
  169. package/tests/get-account-timeline.test.ts +1 -1
  170. package/tests/get-config.test.ts +1 -1
  171. package/tests/get-lists.test.ts +2 -1
  172. package/tests/get-profiles.test.ts +1 -1
  173. package/tests/get-record.test.ts +1 -1
  174. package/tests/get-records.test.ts +1 -1
  175. package/tests/get-repo.test.ts +1 -1
  176. package/tests/get-report.test.ts +1 -1
  177. package/tests/get-reporter-stats.test.ts +1 -1
  178. package/tests/get-repos.test.ts +1 -1
  179. package/tests/get-starter-pack.test.ts +1 -1
  180. package/tests/get-subjects.test.ts +1 -1
  181. package/tests/mod-tool.test.ts +1 -1
  182. package/tests/moderation-appeals.test.ts +1 -1
  183. package/tests/moderation-events.test.ts +1 -1
  184. package/tests/moderation-status-tags.test.ts +1 -1
  185. package/tests/moderation-statuses.test.ts +1 -1
  186. package/tests/moderation.test.ts +1 -1
  187. package/tests/protected-tags.test.ts +1 -1
  188. package/tests/query-labels.test.ts +1 -1
  189. package/tests/query-reports.test.ts +1 -1
  190. package/tests/queue-assignment.test.ts +1 -1
  191. package/tests/queue-router.test.ts +1 -1
  192. package/tests/queues.test.ts +1 -1
  193. package/tests/record-and-account-events.test.ts +1 -1
  194. package/tests/repo-search.test.ts +2 -2
  195. package/tests/report-action.test.ts +1 -1
  196. package/tests/report-activity.test.ts +145 -1
  197. package/tests/report-assignment.test.ts +1 -1
  198. package/tests/report-muting.test.ts +1 -1
  199. package/tests/report-reason.test.ts +1 -1
  200. package/tests/report-reassign-queue.test.ts +1 -1
  201. package/tests/report-routing.test.ts +1 -1
  202. package/tests/report-stats.test.ts +1 -1
  203. package/tests/revoke-account-credentials.test.ts +1 -1
  204. package/tests/safelink.test.ts +1 -1
  205. package/tests/scheduled-action-processor.test.ts +1 -1
  206. package/tests/scheduled-action.test.ts +1 -1
  207. package/tests/sequencer.test.ts +1 -1
  208. package/tests/server.test.ts +9 -12
  209. package/tests/sets.test.ts +1 -1
  210. package/tests/settings.test.ts +1 -1
  211. package/tests/strike-expiry-processor.test.ts +1 -1
  212. package/tests/subject-priority-score.test.ts +1 -1
  213. package/tests/takedown.test.ts +1 -1
  214. package/tests/team.test.ts +1 -1
  215. package/tests/verification-listener.test.ts +40 -13
  216. package/tests/verification.test.ts +1 -1
  217. package/tsconfig.build.tsbuildinfo +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"20250718T150931000Z-update-appeal-reason-stats.js","sourceRoot":"","sources":["../../../src/db/migrations/20250718T150931000Z-update-appeal-reason-stats.ts"],"names":[],"mappings":"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","sourcesContent":["import { Kysely, sql } from 'kysely'\nimport { OZONE_APPEAL_REASON_TYPE } from '../../api/util.js'\nimport { REASONAPPEAL } from '../../lexicon/types/com/atproto/moderation/defs.js'\nimport { DatabaseSchemaType } from '../schema/index.js'\nimport * as modEvent from '../schema/moderation_event.js'\nimport * as recordEventsStats from '../schema/record_events_stats.js'\n\nexport async function up(db: Kysely<any>): Promise<void> {\n // Drop and recreate materialized views to update appeal reason counting\n // to include both REASONAPPEAL and OZONE_APPEAL_REASON_TYPE\n // The primary difference between the old and new query is that we were using = and != operators\n // to match against the meta->>'reportType' field and now we use IN and NOT IN\n\n // Drop existing materialized views in reverse dependency order\n await db.schema\n .dropView('account_record_events_stats')\n .materialized()\n .execute()\n await db.schema.dropView('record_events_stats').materialized().execute()\n await db.schema.dropView('account_events_stats').materialized().execute()\n\n // Recreate account_events_stats with updated appeal counting\n await db.schema\n .createView('account_events_stats')\n .materialized()\n .as(\n (db as Kysely<modEvent.PartialDB>)\n .selectFrom('moderation_event')\n .where('subjectType', '=', 'com.atproto.admin.defs#repoRef')\n .where('subjectUri', 'is', null)\n .select('subjectDid')\n .select([\n (eb) =>\n sql<number>`COUNT(*) FILTER(\n WHERE ${eb.ref('action')} = 'tools.ozone.moderation.defs#modEventTakedown'\n AND ${eb.ref('durationInHours')} IS NULL\n )`.as('takedownCount'),\n (eb) =>\n sql<number>`COUNT(*) FILTER(\n WHERE ${eb.ref('action')} = 'tools.ozone.moderation.defs#modEventTakedown'\n AND ${eb.ref('durationInHours')} IS NOT NULL\n )`.as('suspendCount'),\n (eb) =>\n sql<number>`COUNT(*) FILTER(\n WHERE ${eb.ref('action')} = 'tools.ozone.moderation.defs#modEventEscalate'\n )`.as('escalateCount'),\n (eb) =>\n sql<number>`COUNT(*) FILTER(\n WHERE ${eb.ref('action')} = 'tools.ozone.moderation.defs#modEventReport'\n AND ${eb.ref('meta')} ->> 'reportType' NOT IN (${REASONAPPEAL}, ${OZONE_APPEAL_REASON_TYPE})\n )`.as('reportCount'),\n (eb) =>\n sql<number>`COUNT(*) FILTER(\n WHERE ${eb.ref('action')} = 'tools.ozone.moderation.defs#modEventReport'\n AND ${eb.ref('meta')} ->> 'reportType' IN (${REASONAPPEAL}, ${OZONE_APPEAL_REASON_TYPE})\n )`.as('appealCount'),\n ])\n .groupBy('subjectDid'),\n )\n .execute()\n\n // Recreate record_events_stats with updated appeal counting\n await db.schema\n .createView('record_events_stats')\n .materialized()\n .as(\n (db as Kysely<modEvent.PartialDB>)\n .selectFrom('moderation_event')\n .select([\n 'subjectDid',\n 'subjectUri',\n (eb) =>\n sql<number>`COUNT(*) FILTER (WHERE ${eb.ref('action')} = 'tools.ozone.moderation.defs#modEventEscalate')`.as(\n 'escalateCount',\n ),\n (eb) =>\n sql<number>`COUNT(*) FILTER (WHERE ${eb.ref('action')} = 'tools.ozone.moderation.defs#modEventReport' AND ${eb.ref('meta')} ->> 'reportType' NOT IN (${REASONAPPEAL}, ${OZONE_APPEAL_REASON_TYPE}))`.as(\n 'reportCount',\n ),\n (eb) =>\n sql<number>`COUNT(*) FILTER (WHERE ${eb.ref('action')} = 'tools.ozone.moderation.defs#modEventReport' AND ${eb.ref('meta')} ->> 'reportType' IN (${REASONAPPEAL}, ${OZONE_APPEAL_REASON_TYPE}))`.as(\n 'appealCount',\n ),\n ])\n .where('subjectType', '=', 'com.atproto.repo.strongRef')\n .where('subjectUri', 'is not', null)\n .groupBy(['subjectDid', 'subjectUri']),\n )\n .execute()\n\n // Recreate account_record_events_stats (unchanged logic, but depends on record_events_stats)\n await db.schema\n .createView('account_record_events_stats')\n .materialized()\n .as(\n (db as Kysely<recordEventsStats.PartialDB>)\n .selectFrom('record_events_stats')\n .select([\n 'subjectDid',\n (eb) =>\n sql<number>`SUM(${eb.ref('reportCount')})::bigint`.as(\n 'totalReports',\n ),\n (eb) =>\n sql<number>`COUNT(*) FILTER (WHERE ${eb.ref('reportCount')} > 0)`.as(\n 'reportedCount',\n ),\n (eb) =>\n sql<number>`COUNT(*) FILTER (WHERE ${eb.ref('escalateCount')} > 0)`.as(\n 'escalatedCount',\n ),\n (eb) =>\n sql<number>`COUNT(*) FILTER (WHERE ${eb.ref('appealCount')} > 0)`.as(\n 'appealedCount',\n ),\n ])\n .groupBy('subjectDid'),\n )\n .execute()\n\n // Recreate all indexes for the materialized views\n await db.schema\n .createIndex('account_events_stats_did_idx')\n .unique()\n .on('account_events_stats')\n .column('subjectDid')\n .execute()\n\n await db.schema\n .createIndex('account_events_stats_suspend_count_idx')\n .on('account_events_stats')\n .expression(sql`\"suspendCount\" ASC NULLS FIRST`)\n .column('subjectDid')\n .execute()\n\n await db.schema\n .createIndex('record_events_stats_uri_idx')\n .unique()\n .on('record_events_stats')\n .column('subjectUri')\n .execute()\n\n await db.schema\n .createIndex('record_events_stats_did_idx')\n .on('record_events_stats')\n .column('subjectDid')\n .execute()\n\n await db.schema\n .createIndex('account_record_events_stats_did_idx')\n .unique()\n .on('account_record_events_stats')\n .column('subjectDid')\n .execute()\n\n await db.schema\n .createIndex('account_record_events_stats_reported_count_idx')\n .on('account_record_events_stats')\n .expression(sql`\"reportedCount\" ASC NULLS FIRST`)\n .column('subjectDid')\n .execute()\n}\n\nexport async function down(db: Kysely<DatabaseSchemaType>): Promise<void> {\n // Drop the updated materialized views\n await db.schema\n .dropView('account_record_events_stats')\n .materialized()\n .execute()\n await db.schema.dropView('record_events_stats').materialized().execute()\n await db.schema.dropView('account_events_stats').materialized().execute()\n\n // Recreate the original views with single appeal reason type\n await db.schema\n .createView('account_events_stats')\n .materialized()\n .as(\n (db as Kysely<modEvent.PartialDB>)\n .selectFrom('moderation_event')\n .where('subjectType', '=', 'com.atproto.admin.defs#repoRef')\n .where('subjectUri', 'is', null)\n .select('subjectDid')\n .select([\n (eb) =>\n sql<number>`COUNT(*) FILTER(\n WHERE ${eb.ref('action')} = 'tools.ozone.moderation.defs#modEventTakedown'\n AND ${eb.ref('durationInHours')} IS NULL\n )`.as('takedownCount'),\n (eb) =>\n sql<number>`COUNT(*) FILTER(\n WHERE ${eb.ref('action')} = 'tools.ozone.moderation.defs#modEventTakedown'\n AND ${eb.ref('durationInHours')} IS NOT NULL\n )`.as('suspendCount'),\n (eb) =>\n sql<number>`COUNT(*) FILTER(\n WHERE ${eb.ref('action')} = 'tools.ozone.moderation.defs#modEventEscalate'\n )`.as('escalateCount'),\n (eb) =>\n sql<number>`COUNT(*) FILTER(\n WHERE ${eb.ref('action')} = 'tools.ozone.moderation.defs#modEventReport'\n AND ${eb.ref('meta')} ->> 'reportType' != ${REASONAPPEAL}\n )`.as('reportCount'),\n (eb) =>\n sql<number>`COUNT(*) FILTER(\n WHERE ${eb.ref('action')} = 'tools.ozone.moderation.defs#modEventReport'\n AND ${eb.ref('meta')} ->> 'reportType' = ${REASONAPPEAL}\n )`.as('appealCount'),\n ])\n .groupBy('subjectDid'),\n )\n .execute()\n\n await db.schema\n .createView('record_events_stats')\n .materialized()\n .as(\n (db as Kysely<modEvent.PartialDB>)\n .selectFrom('moderation_event')\n .select([\n 'subjectDid',\n 'subjectUri',\n (eb) =>\n sql<number>`COUNT(*) FILTER (WHERE ${eb.ref('action')} = 'tools.ozone.moderation.defs#modEventEscalate')`.as(\n 'escalateCount',\n ),\n (eb) =>\n sql<number>`COUNT(*) FILTER (WHERE ${eb.ref('action')} = 'tools.ozone.moderation.defs#modEventReport' AND ${eb.ref('meta')} ->> 'reportType' != 'com.atproto.moderation.defs#reasonAppeal')`.as(\n 'reportCount',\n ),\n (eb) =>\n sql<number>`COUNT(*) FILTER (WHERE ${eb.ref('action')} = 'tools.ozone.moderation.defs#modEventReport' AND ${eb.ref('meta')} ->> 'reportType' = 'com.atproto.moderation.defs#reasonAppeal')`.as(\n 'appealCount',\n ),\n ])\n .where('subjectType', '=', 'com.atproto.repo.strongRef')\n .where('subjectUri', 'is not', null)\n .groupBy(['subjectDid', 'subjectUri']),\n )\n .execute()\n\n await db.schema\n .createView('account_record_events_stats')\n .materialized()\n .as(\n (db as Kysely<recordEventsStats.PartialDB>)\n .selectFrom('record_events_stats')\n .select([\n 'subjectDid',\n (eb) =>\n sql<number>`SUM(${eb.ref('reportCount')})::bigint`.as(\n 'totalReports',\n ),\n (eb) =>\n sql<number>`COUNT(*) FILTER (WHERE ${eb.ref('reportCount')} > 0)`.as(\n 'reportedCount',\n ),\n (eb) =>\n sql<number>`COUNT(*) FILTER (WHERE ${eb.ref('escalateCount')} > 0)`.as(\n 'escalatedCount',\n ),\n (eb) =>\n sql<number>`COUNT(*) FILTER (WHERE ${eb.ref('appealCount')} > 0)`.as(\n 'appealedCount',\n ),\n ])\n .groupBy('subjectDid'),\n )\n .execute()\n\n // Recreate indexes\n await db.schema\n .createIndex('account_events_stats_did_idx')\n .unique()\n .on('account_events_stats')\n .column('subjectDid')\n .execute()\n\n await db.schema\n .createIndex('account_events_stats_suspend_count_idx')\n .on('account_events_stats')\n .expression(sql`\"suspendCount\" ASC NULLS FIRST`)\n .column('subjectDid')\n .execute()\n\n await db.schema\n .createIndex('record_events_stats_uri_idx')\n .unique()\n .on('record_events_stats')\n .column('subjectUri')\n .execute()\n\n await db.schema\n .createIndex('record_events_stats_did_idx')\n .on('record_events_stats')\n .column('subjectDid')\n .execute()\n\n await db.schema\n .createIndex('account_record_events_stats_did_idx')\n .unique()\n .on('account_record_events_stats')\n .column('subjectDid')\n .execute()\n\n await db.schema\n .createIndex('account_record_events_stats_reported_count_idx')\n .on('account_record_events_stats')\n .expression(sql`\"reportedCount\" ASC NULLS FIRST`)\n .column('subjectDid')\n .execute()\n}\n"]}
1
+ {"version":3,"file":"20250718T150931000Z-update-appeal-reason-stats.js","sourceRoot":"","sources":["../../../src/db/migrations/20250718T150931000Z-update-appeal-reason-stats.ts"],"names":[],"mappings":"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","sourcesContent":["import { Kysely, sql } from 'kysely'\nimport { OZONE_APPEAL_REASON_TYPE } from '../../api/util.js'\nimport { REASONAPPEAL } from '../../lexicon/types/com/atproto/moderation/defs.js'\nimport * as modEvent from '../schema/moderation_event.js'\nimport * as recordEventsStats from '../schema/record_events_stats.js'\n\nexport async function up(db: Kysely<any>): Promise<void> {\n // Drop and recreate materialized views to update appeal reason counting\n // to include both REASONAPPEAL and OZONE_APPEAL_REASON_TYPE\n // The primary difference between the old and new query is that we were using = and != operators\n // to match against the meta->>'reportType' field and now we use IN and NOT IN\n\n // Drop existing materialized views in reverse dependency order\n await db.schema\n .dropView('account_record_events_stats')\n .materialized()\n .execute()\n await db.schema.dropView('record_events_stats').materialized().execute()\n await db.schema.dropView('account_events_stats').materialized().execute()\n\n // Recreate account_events_stats with updated appeal counting\n await db.schema\n .createView('account_events_stats')\n .materialized()\n .as(\n (db as Kysely<modEvent.PartialDB>)\n .selectFrom('moderation_event')\n .where('subjectType', '=', 'com.atproto.admin.defs#repoRef')\n .where('subjectUri', 'is', null)\n .select('subjectDid')\n .select([\n (eb) =>\n sql<number>`COUNT(*) FILTER(\n WHERE ${eb.ref('action')} = 'tools.ozone.moderation.defs#modEventTakedown'\n AND ${eb.ref('durationInHours')} IS NULL\n )`.as('takedownCount'),\n (eb) =>\n sql<number>`COUNT(*) FILTER(\n WHERE ${eb.ref('action')} = 'tools.ozone.moderation.defs#modEventTakedown'\n AND ${eb.ref('durationInHours')} IS NOT NULL\n )`.as('suspendCount'),\n (eb) =>\n sql<number>`COUNT(*) FILTER(\n WHERE ${eb.ref('action')} = 'tools.ozone.moderation.defs#modEventEscalate'\n )`.as('escalateCount'),\n (eb) =>\n sql<number>`COUNT(*) FILTER(\n WHERE ${eb.ref('action')} = 'tools.ozone.moderation.defs#modEventReport'\n AND ${eb.ref('meta')} ->> 'reportType' NOT IN (${REASONAPPEAL}, ${OZONE_APPEAL_REASON_TYPE})\n )`.as('reportCount'),\n (eb) =>\n sql<number>`COUNT(*) FILTER(\n WHERE ${eb.ref('action')} = 'tools.ozone.moderation.defs#modEventReport'\n AND ${eb.ref('meta')} ->> 'reportType' IN (${REASONAPPEAL}, ${OZONE_APPEAL_REASON_TYPE})\n )`.as('appealCount'),\n ])\n .groupBy('subjectDid'),\n )\n .execute()\n\n // Recreate record_events_stats with updated appeal counting\n await db.schema\n .createView('record_events_stats')\n .materialized()\n .as(\n (db as Kysely<modEvent.PartialDB>)\n .selectFrom('moderation_event')\n .select([\n 'subjectDid',\n 'subjectUri',\n (eb) =>\n sql<number>`COUNT(*) FILTER (WHERE ${eb.ref('action')} = 'tools.ozone.moderation.defs#modEventEscalate')`.as(\n 'escalateCount',\n ),\n (eb) =>\n sql<number>`COUNT(*) FILTER (WHERE ${eb.ref('action')} = 'tools.ozone.moderation.defs#modEventReport' AND ${eb.ref('meta')} ->> 'reportType' NOT IN (${REASONAPPEAL}, ${OZONE_APPEAL_REASON_TYPE}))`.as(\n 'reportCount',\n ),\n (eb) =>\n sql<number>`COUNT(*) FILTER (WHERE ${eb.ref('action')} = 'tools.ozone.moderation.defs#modEventReport' AND ${eb.ref('meta')} ->> 'reportType' IN (${REASONAPPEAL}, ${OZONE_APPEAL_REASON_TYPE}))`.as(\n 'appealCount',\n ),\n ])\n .where('subjectType', '=', 'com.atproto.repo.strongRef')\n .where('subjectUri', 'is not', null)\n .groupBy(['subjectDid', 'subjectUri']),\n )\n .execute()\n\n // Recreate account_record_events_stats (unchanged logic, but depends on record_events_stats)\n await db.schema\n .createView('account_record_events_stats')\n .materialized()\n .as(\n (db as Kysely<recordEventsStats.PartialDB>)\n .selectFrom('record_events_stats')\n .select([\n 'subjectDid',\n (eb) =>\n sql<number>`SUM(${eb.ref('reportCount')})::bigint`.as(\n 'totalReports',\n ),\n (eb) =>\n sql<number>`COUNT(*) FILTER (WHERE ${eb.ref('reportCount')} > 0)`.as(\n 'reportedCount',\n ),\n (eb) =>\n sql<number>`COUNT(*) FILTER (WHERE ${eb.ref('escalateCount')} > 0)`.as(\n 'escalatedCount',\n ),\n (eb) =>\n sql<number>`COUNT(*) FILTER (WHERE ${eb.ref('appealCount')} > 0)`.as(\n 'appealedCount',\n ),\n ])\n .groupBy('subjectDid'),\n )\n .execute()\n\n // Recreate all indexes for the materialized views\n await db.schema\n .createIndex('account_events_stats_did_idx')\n .unique()\n .on('account_events_stats')\n .column('subjectDid')\n .execute()\n\n await db.schema\n .createIndex('account_events_stats_suspend_count_idx')\n .on('account_events_stats')\n .expression(sql`\"suspendCount\" ASC NULLS FIRST`)\n .column('subjectDid')\n .execute()\n\n await db.schema\n .createIndex('record_events_stats_uri_idx')\n .unique()\n .on('record_events_stats')\n .column('subjectUri')\n .execute()\n\n await db.schema\n .createIndex('record_events_stats_did_idx')\n .on('record_events_stats')\n .column('subjectDid')\n .execute()\n\n await db.schema\n .createIndex('account_record_events_stats_did_idx')\n .unique()\n .on('account_record_events_stats')\n .column('subjectDid')\n .execute()\n\n await db.schema\n .createIndex('account_record_events_stats_reported_count_idx')\n .on('account_record_events_stats')\n .expression(sql`\"reportedCount\" ASC NULLS FIRST`)\n .column('subjectDid')\n .execute()\n}\n\nexport async function down(db: Kysely<any>): Promise<void> {\n // Drop the updated materialized views\n await db.schema\n .dropView('account_record_events_stats')\n .materialized()\n .execute()\n await db.schema.dropView('record_events_stats').materialized().execute()\n await db.schema.dropView('account_events_stats').materialized().execute()\n\n // Recreate the original views with single appeal reason type\n await db.schema\n .createView('account_events_stats')\n .materialized()\n .as(\n (db as Kysely<modEvent.PartialDB>)\n .selectFrom('moderation_event')\n .where('subjectType', '=', 'com.atproto.admin.defs#repoRef')\n .where('subjectUri', 'is', null)\n .select('subjectDid')\n .select([\n (eb) =>\n sql<number>`COUNT(*) FILTER(\n WHERE ${eb.ref('action')} = 'tools.ozone.moderation.defs#modEventTakedown'\n AND ${eb.ref('durationInHours')} IS NULL\n )`.as('takedownCount'),\n (eb) =>\n sql<number>`COUNT(*) FILTER(\n WHERE ${eb.ref('action')} = 'tools.ozone.moderation.defs#modEventTakedown'\n AND ${eb.ref('durationInHours')} IS NOT NULL\n )`.as('suspendCount'),\n (eb) =>\n sql<number>`COUNT(*) FILTER(\n WHERE ${eb.ref('action')} = 'tools.ozone.moderation.defs#modEventEscalate'\n )`.as('escalateCount'),\n (eb) =>\n sql<number>`COUNT(*) FILTER(\n WHERE ${eb.ref('action')} = 'tools.ozone.moderation.defs#modEventReport'\n AND ${eb.ref('meta')} ->> 'reportType' != ${REASONAPPEAL}\n )`.as('reportCount'),\n (eb) =>\n sql<number>`COUNT(*) FILTER(\n WHERE ${eb.ref('action')} = 'tools.ozone.moderation.defs#modEventReport'\n AND ${eb.ref('meta')} ->> 'reportType' = ${REASONAPPEAL}\n )`.as('appealCount'),\n ])\n .groupBy('subjectDid'),\n )\n .execute()\n\n await db.schema\n .createView('record_events_stats')\n .materialized()\n .as(\n (db as Kysely<modEvent.PartialDB>)\n .selectFrom('moderation_event')\n .select([\n 'subjectDid',\n 'subjectUri',\n (eb) =>\n sql<number>`COUNT(*) FILTER (WHERE ${eb.ref('action')} = 'tools.ozone.moderation.defs#modEventEscalate')`.as(\n 'escalateCount',\n ),\n (eb) =>\n sql<number>`COUNT(*) FILTER (WHERE ${eb.ref('action')} = 'tools.ozone.moderation.defs#modEventReport' AND ${eb.ref('meta')} ->> 'reportType' != 'com.atproto.moderation.defs#reasonAppeal')`.as(\n 'reportCount',\n ),\n (eb) =>\n sql<number>`COUNT(*) FILTER (WHERE ${eb.ref('action')} = 'tools.ozone.moderation.defs#modEventReport' AND ${eb.ref('meta')} ->> 'reportType' = 'com.atproto.moderation.defs#reasonAppeal')`.as(\n 'appealCount',\n ),\n ])\n .where('subjectType', '=', 'com.atproto.repo.strongRef')\n .where('subjectUri', 'is not', null)\n .groupBy(['subjectDid', 'subjectUri']),\n )\n .execute()\n\n await db.schema\n .createView('account_record_events_stats')\n .materialized()\n .as(\n (db as Kysely<recordEventsStats.PartialDB>)\n .selectFrom('record_events_stats')\n .select([\n 'subjectDid',\n (eb) =>\n sql<number>`SUM(${eb.ref('reportCount')})::bigint`.as(\n 'totalReports',\n ),\n (eb) =>\n sql<number>`COUNT(*) FILTER (WHERE ${eb.ref('reportCount')} > 0)`.as(\n 'reportedCount',\n ),\n (eb) =>\n sql<number>`COUNT(*) FILTER (WHERE ${eb.ref('escalateCount')} > 0)`.as(\n 'escalatedCount',\n ),\n (eb) =>\n sql<number>`COUNT(*) FILTER (WHERE ${eb.ref('appealCount')} > 0)`.as(\n 'appealedCount',\n ),\n ])\n .groupBy('subjectDid'),\n )\n .execute()\n\n // Recreate indexes\n await db.schema\n .createIndex('account_events_stats_did_idx')\n .unique()\n .on('account_events_stats')\n .column('subjectDid')\n .execute()\n\n await db.schema\n .createIndex('account_events_stats_suspend_count_idx')\n .on('account_events_stats')\n .expression(sql`\"suspendCount\" ASC NULLS FIRST`)\n .column('subjectDid')\n .execute()\n\n await db.schema\n .createIndex('record_events_stats_uri_idx')\n .unique()\n .on('record_events_stats')\n .column('subjectUri')\n .execute()\n\n await db.schema\n .createIndex('record_events_stats_did_idx')\n .on('record_events_stats')\n .column('subjectDid')\n .execute()\n\n await db.schema\n .createIndex('account_record_events_stats_did_idx')\n .unique()\n .on('account_record_events_stats')\n .column('subjectDid')\n .execute()\n\n await db.schema\n .createIndex('account_record_events_stats_reported_count_idx')\n .on('account_record_events_stats')\n .expression(sql`\"reportedCount\" ASC NULLS FIRST`)\n .column('subjectDid')\n .execute()\n}\n"]}
@@ -0,0 +1,4 @@
1
+ import { Kysely } from 'kysely';
2
+ export declare function up(db: Kysely<unknown>): Promise<void>;
3
+ export declare function down(db: Kysely<unknown>): Promise<void>;
4
+ //# sourceMappingURL=20260602T120000000Z-add-report-activity-created-index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"20260602T120000000Z-add-report-activity-created-index.d.ts","sourceRoot":"","sources":["../../../src/db/migrations/20260602T120000000Z-add-report-activity-created-index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAE/B,wBAAsB,EAAE,CAAC,EAAE,EAAE,MAAM,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAU3D;AAED,wBAAsB,IAAI,CAAC,EAAE,EAAE,MAAM,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAE7D"}
@@ -0,0 +1,15 @@
1
+ export async function up(db) {
2
+ // Supports time-ordered scans across all reports for downstream pollers
3
+ // (e.g. Nimbus' report-activity watcher). The existing indexes are all
4
+ // leading-`reportId`, which would force a sequential scan for global
5
+ // ordered queries.
6
+ await db.schema
7
+ .createIndex('idx_report_activity_created')
8
+ .on('report_activity')
9
+ .columns(['createdAt', 'id'])
10
+ .execute();
11
+ }
12
+ export async function down(db) {
13
+ await db.schema.dropIndex('idx_report_activity_created').execute();
14
+ }
15
+ //# sourceMappingURL=20260602T120000000Z-add-report-activity-created-index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"20260602T120000000Z-add-report-activity-created-index.js","sourceRoot":"","sources":["../../../src/db/migrations/20260602T120000000Z-add-report-activity-created-index.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,KAAK,UAAU,EAAE,CAAC,EAAmB;IAC1C,wEAAwE;IACxE,uEAAuE;IACvE,qEAAqE;IACrE,mBAAmB;IACnB,MAAM,EAAE,CAAC,MAAM;SACZ,WAAW,CAAC,6BAA6B,CAAC;SAC1C,EAAE,CAAC,iBAAiB,CAAC;SACrB,OAAO,CAAC,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;SAC5B,OAAO,EAAE,CAAA;AACd,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,IAAI,CAAC,EAAmB;IAC5C,MAAM,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,6BAA6B,CAAC,CAAC,OAAO,EAAE,CAAA;AACpE,CAAC","sourcesContent":["import { Kysely } from 'kysely'\n\nexport async function up(db: Kysely<unknown>): Promise<void> {\n // Supports time-ordered scans across all reports for downstream pollers\n // (e.g. Nimbus' report-activity watcher). The existing indexes are all\n // leading-`reportId`, which would force a sequential scan for global\n // ordered queries.\n await db.schema\n .createIndex('idx_report_activity_created')\n .on('report_activity')\n .columns(['createdAt', 'id'])\n .execute()\n}\n\nexport async function down(db: Kysely<unknown>): Promise<void> {\n await db.schema.dropIndex('idx_report_activity_created').execute()\n}\n"]}
@@ -37,4 +37,5 @@ export * as _20260313T000000000Z from './20260313T000000000Z-add-report-activity
37
37
  export * as _20260318T152058935Z from './20260318T152058935Z-add-report-stat.js';
38
38
  export * as _20260428T000000000Z from './20260428T000000000Z-add-expiring-tag-table.js';
39
39
  export * as _20260513T202941104Z from './20260513T202941104Z-add-subject-convo-id.js';
40
+ export * as _20260602T120000000Z from './20260602T120000000Z-add-report-activity-created-index.js';
40
41
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/db/migrations/index.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,oBAAoB,MAAM,+BAA+B,CAAA;AACrE,OAAO,KAAK,oBAAoB,MAAM,iDAAiD,CAAA;AACvF,OAAO,KAAK,oBAAoB,MAAM,0CAA0C,CAAA;AAChF,OAAO,KAAK,oBAAoB,MAAM,gEAAgE,CAAA;AACtG,OAAO,KAAK,oBAAoB,MAAM,yCAAyC,CAAA;AAC/E,OAAO,KAAK,oBAAoB,MAAM,yCAAyC,CAAA;AAC/E,OAAO,KAAK,oBAAoB,MAAM,0CAA0C,CAAA;AAChF,OAAO,KAAK,oBAAoB,MAAM,iCAAiC,CAAA;AACvE,OAAO,KAAK,oBAAoB,MAAM,iDAAiD,CAAA;AACvF,OAAO,KAAK,oBAAoB,MAAM,4CAA4C,CAAA;AAClF,OAAO,KAAK,oBAAoB,MAAM,gDAAgD,CAAA;AACtF,OAAO,KAAK,oBAAoB,MAAM,4DAA4D,CAAA;AAClG,OAAO,KAAK,oBAAoB,MAAM,+BAA+B,CAAA;AACrE,OAAO,KAAK,oBAAoB,MAAM,kCAAkC,CAAA;AACxE,OAAO,KAAK,oBAAoB,MAAM,+DAA+D,CAAA;AACrG,OAAO,KAAK,oBAAoB,MAAM,mDAAmD,CAAA;AACzF,OAAO,KAAK,oBAAoB,MAAM,qDAAqD,CAAA;AAC3F,OAAO,KAAK,oBAAoB,MAAM,mDAAmD,CAAA;AACzF,OAAO,KAAK,oBAAoB,MAAM,+DAA+D,CAAA;AACrG,OAAO,KAAK,oBAAoB,MAAM,yCAAyC,CAAA;AAC/E,OAAO,KAAK,oBAAoB,MAAM,mDAAmD,CAAA;AACzF,OAAO,KAAK,oBAAoB,MAAM,uCAAuC,CAAA;AAC7E,OAAO,KAAK,oBAAoB,MAAM,0CAA0C,CAAA;AAChF,OAAO,KAAK,oBAAoB,MAAM,mCAAmC,CAAA;AACzE,OAAO,KAAK,oBAAoB,MAAM,2DAA2D,CAAA;AACjG,OAAO,KAAK,oBAAoB,MAAM,kDAAkD,CAAA;AACxF,OAAO,KAAK,oBAAoB,MAAM,oDAAoD,CAAA;AAC1F,OAAO,KAAK,oBAAoB,MAAM,qDAAqD,CAAA;AAC3F,OAAO,KAAK,oBAAoB,MAAM,kDAAkD,CAAA;AACxF,OAAO,KAAK,oBAAoB,MAAM,4CAA4C,CAAA;AAClF,OAAO,KAAK,oBAAoB,MAAM,4CAA4C,CAAA;AAClF,OAAO,KAAK,oBAAoB,MAAM,uDAAuD,CAAA;AAC7F,OAAO,KAAK,oBAAoB,MAAM,8CAA8C,CAAA;AACpF,OAAO,KAAK,oBAAoB,MAAM,+CAA+C,CAAA;AACrF,OAAO,KAAK,oBAAoB,MAAM,iDAAiD,CAAA;AACvF,OAAO,KAAK,oBAAoB,MAAM,oDAAoD,CAAA;AAC1F,OAAO,KAAK,oBAAoB,MAAM,0CAA0C,CAAA;AAChF,OAAO,KAAK,oBAAoB,MAAM,iDAAiD,CAAA;AACvF,OAAO,KAAK,oBAAoB,MAAM,+CAA+C,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/db/migrations/index.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,oBAAoB,MAAM,+BAA+B,CAAA;AACrE,OAAO,KAAK,oBAAoB,MAAM,iDAAiD,CAAA;AACvF,OAAO,KAAK,oBAAoB,MAAM,0CAA0C,CAAA;AAChF,OAAO,KAAK,oBAAoB,MAAM,gEAAgE,CAAA;AACtG,OAAO,KAAK,oBAAoB,MAAM,yCAAyC,CAAA;AAC/E,OAAO,KAAK,oBAAoB,MAAM,yCAAyC,CAAA;AAC/E,OAAO,KAAK,oBAAoB,MAAM,0CAA0C,CAAA;AAChF,OAAO,KAAK,oBAAoB,MAAM,iCAAiC,CAAA;AACvE,OAAO,KAAK,oBAAoB,MAAM,iDAAiD,CAAA;AACvF,OAAO,KAAK,oBAAoB,MAAM,4CAA4C,CAAA;AAClF,OAAO,KAAK,oBAAoB,MAAM,gDAAgD,CAAA;AACtF,OAAO,KAAK,oBAAoB,MAAM,4DAA4D,CAAA;AAClG,OAAO,KAAK,oBAAoB,MAAM,+BAA+B,CAAA;AACrE,OAAO,KAAK,oBAAoB,MAAM,kCAAkC,CAAA;AACxE,OAAO,KAAK,oBAAoB,MAAM,+DAA+D,CAAA;AACrG,OAAO,KAAK,oBAAoB,MAAM,mDAAmD,CAAA;AACzF,OAAO,KAAK,oBAAoB,MAAM,qDAAqD,CAAA;AAC3F,OAAO,KAAK,oBAAoB,MAAM,mDAAmD,CAAA;AACzF,OAAO,KAAK,oBAAoB,MAAM,+DAA+D,CAAA;AACrG,OAAO,KAAK,oBAAoB,MAAM,yCAAyC,CAAA;AAC/E,OAAO,KAAK,oBAAoB,MAAM,mDAAmD,CAAA;AACzF,OAAO,KAAK,oBAAoB,MAAM,uCAAuC,CAAA;AAC7E,OAAO,KAAK,oBAAoB,MAAM,0CAA0C,CAAA;AAChF,OAAO,KAAK,oBAAoB,MAAM,mCAAmC,CAAA;AACzE,OAAO,KAAK,oBAAoB,MAAM,2DAA2D,CAAA;AACjG,OAAO,KAAK,oBAAoB,MAAM,kDAAkD,CAAA;AACxF,OAAO,KAAK,oBAAoB,MAAM,oDAAoD,CAAA;AAC1F,OAAO,KAAK,oBAAoB,MAAM,qDAAqD,CAAA;AAC3F,OAAO,KAAK,oBAAoB,MAAM,kDAAkD,CAAA;AACxF,OAAO,KAAK,oBAAoB,MAAM,4CAA4C,CAAA;AAClF,OAAO,KAAK,oBAAoB,MAAM,4CAA4C,CAAA;AAClF,OAAO,KAAK,oBAAoB,MAAM,uDAAuD,CAAA;AAC7F,OAAO,KAAK,oBAAoB,MAAM,8CAA8C,CAAA;AACpF,OAAO,KAAK,oBAAoB,MAAM,+CAA+C,CAAA;AACrF,OAAO,KAAK,oBAAoB,MAAM,iDAAiD,CAAA;AACvF,OAAO,KAAK,oBAAoB,MAAM,oDAAoD,CAAA;AAC1F,OAAO,KAAK,oBAAoB,MAAM,0CAA0C,CAAA;AAChF,OAAO,KAAK,oBAAoB,MAAM,iDAAiD,CAAA;AACvF,OAAO,KAAK,oBAAoB,MAAM,+CAA+C,CAAA;AACrF,OAAO,KAAK,oBAAoB,MAAM,4DAA4D,CAAA"}
@@ -40,4 +40,5 @@ export * as _20260313T000000000Z from './20260313T000000000Z-add-report-activity
40
40
  export * as _20260318T152058935Z from './20260318T152058935Z-add-report-stat.js';
41
41
  export * as _20260428T000000000Z from './20260428T000000000Z-add-expiring-tag-table.js';
42
42
  export * as _20260513T202941104Z from './20260513T202941104Z-add-subject-convo-id.js';
43
+ export * as _20260602T120000000Z from './20260602T120000000Z-add-report-activity-created-index.js';
43
44
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/db/migrations/index.ts"],"names":[],"mappings":"AAAA,oGAAoG;AACpG,gGAAgG;AAChG,+FAA+F;AAE/F,OAAO,KAAK,oBAAoB,MAAM,+BAA+B,CAAA;AACrE,OAAO,KAAK,oBAAoB,MAAM,iDAAiD,CAAA;AACvF,OAAO,KAAK,oBAAoB,MAAM,0CAA0C,CAAA;AAChF,OAAO,KAAK,oBAAoB,MAAM,gEAAgE,CAAA;AACtG,OAAO,KAAK,oBAAoB,MAAM,yCAAyC,CAAA;AAC/E,OAAO,KAAK,oBAAoB,MAAM,yCAAyC,CAAA;AAC/E,OAAO,KAAK,oBAAoB,MAAM,0CAA0C,CAAA;AAChF,OAAO,KAAK,oBAAoB,MAAM,iCAAiC,CAAA;AACvE,OAAO,KAAK,oBAAoB,MAAM,iDAAiD,CAAA;AACvF,OAAO,KAAK,oBAAoB,MAAM,4CAA4C,CAAA;AAClF,OAAO,KAAK,oBAAoB,MAAM,gDAAgD,CAAA;AACtF,OAAO,KAAK,oBAAoB,MAAM,4DAA4D,CAAA;AAClG,OAAO,KAAK,oBAAoB,MAAM,+BAA+B,CAAA;AACrE,OAAO,KAAK,oBAAoB,MAAM,kCAAkC,CAAA;AACxE,OAAO,KAAK,oBAAoB,MAAM,+DAA+D,CAAA;AACrG,OAAO,KAAK,oBAAoB,MAAM,mDAAmD,CAAA;AACzF,OAAO,KAAK,oBAAoB,MAAM,qDAAqD,CAAA;AAC3F,OAAO,KAAK,oBAAoB,MAAM,mDAAmD,CAAA;AACzF,OAAO,KAAK,oBAAoB,MAAM,+DAA+D,CAAA;AACrG,OAAO,KAAK,oBAAoB,MAAM,yCAAyC,CAAA;AAC/E,OAAO,KAAK,oBAAoB,MAAM,mDAAmD,CAAA;AACzF,OAAO,KAAK,oBAAoB,MAAM,uCAAuC,CAAA;AAC7E,OAAO,KAAK,oBAAoB,MAAM,0CAA0C,CAAA;AAChF,OAAO,KAAK,oBAAoB,MAAM,mCAAmC,CAAA;AACzE,OAAO,KAAK,oBAAoB,MAAM,2DAA2D,CAAA;AACjG,OAAO,KAAK,oBAAoB,MAAM,kDAAkD,CAAA;AACxF,OAAO,KAAK,oBAAoB,MAAM,oDAAoD,CAAA;AAC1F,OAAO,KAAK,oBAAoB,MAAM,qDAAqD,CAAA;AAC3F,OAAO,KAAK,oBAAoB,MAAM,kDAAkD,CAAA;AACxF,OAAO,KAAK,oBAAoB,MAAM,4CAA4C,CAAA;AAClF,OAAO,KAAK,oBAAoB,MAAM,4CAA4C,CAAA;AAClF,OAAO,KAAK,oBAAoB,MAAM,uDAAuD,CAAA;AAC7F,OAAO,KAAK,oBAAoB,MAAM,8CAA8C,CAAA;AACpF,OAAO,KAAK,oBAAoB,MAAM,+CAA+C,CAAA;AACrF,OAAO,KAAK,oBAAoB,MAAM,iDAAiD,CAAA;AACvF,OAAO,KAAK,oBAAoB,MAAM,oDAAoD,CAAA;AAC1F,OAAO,KAAK,oBAAoB,MAAM,0CAA0C,CAAA;AAChF,OAAO,KAAK,oBAAoB,MAAM,iDAAiD,CAAA;AACvF,OAAO,KAAK,oBAAoB,MAAM,+CAA+C,CAAA","sourcesContent":["// NOTE this file can be edited by hand, but it is also appended to by the migration:create command.\n// It's important that every migration is exported from here with the proper name. We'd simplify\n// this with kysely's FileMigrationProvider, but it doesn't play nicely with the build process.\n\nexport * as _20231219T205730722Z from './20231219T205730722Z-init.js'\nexport * as _20240116T085607200Z from './20240116T085607200Z-communication-template.js'\nexport * as _20240201T051104136Z from './20240201T051104136Z-mod-event-blobs.js'\nexport * as _20240208T213404429Z from './20240208T213404429Z-add-tags-column-to-moderation-subject.js'\nexport * as _20240228T003647759Z from './20240228T003647759Z-add-label-sigs.js'\nexport * as _20240408T192432676Z from './20240408T192432676Z-mute-reporting.js'\nexport * as _20240506T225055595Z from './20240506T225055595Z-message-subject.js'\nexport * as _20240430T211332580Z from './20240521T211332580Z-member.js'\nexport * as _20240814T003647759Z from './20240814T003647759Z-event-created-at-index.js'\nexport * as _20240903T205730722Z from './20240903T205730722Z-add-template-lang.js'\nexport * as _20240904T205730722Z from './20240904T205730722Z-add-subject-did-index.js'\nexport * as _20241001T205730722Z from './20241001T205730722Z-subject-status-review-state-index.js'\nexport * as _20241008T205730722Z from './20241008T205730722Z-sets.js'\nexport * as _20241018T205730722Z from './20241018T205730722Z-setting.js'\nexport * as _20241026T205730722Z from './20241026T205730722Z-add-hosting-status-to-subject-status.js'\nexport * as _20241220T144630860Z from './20241220T144630860Z-stats-materialized-views.js'\nexport * as _20250204T003647759Z from './20250204T003647759Z-add-subject-priority-score.js'\nexport * as _20250211T003647759Z from './20250211T003647759Z-add-reporter-stats-index.js'\nexport * as _20250211T132135150Z from './20250211T132135150Z-moderation-event-message-partial-idx.js'\nexport * as _20250221T132135150Z from './20250221T132135150Z-member-details.js'\nexport * as _20250404T201720309Z from './20250404T201720309Z-subject-status-sort-idxs.js'\nexport * as _20250415T201720309Z from './20250415T201720309Z-verification.js'\nexport * as _20250417T201720309Z from './20250417T201720309Z-firehose-cursor.js'\nexport * as _20250609T110704000Z from './20250609T110704000Z-safelink.js'\nexport * as _20250618T180246000Z from './20250618T180246000Z-add-mod-tool-to-moderation-event.js'\nexport * as _20250701T000000000Z from './20250701T000000000Z-add-age-assurance-state.js'\nexport * as _20250715T000000000Z from './20250715T000000000Z-add-mod-event-external-id.js'\nexport * as _20250718T150931000Z from './20250718T150931000Z-update-appeal-reason-stats.js'\nexport * as _20250813T000000000Z from './20250813T000000000Z-mod-tool-batch-id-index.js'\nexport * as _20250923T000000000Z from './20250923T000000000Z-scheduled-actions.js'\nexport * as _20251008T120000000Z from './20251008T120000000Z-add-strike-system.js'\nexport * as _20260210T154806448Z from './20260210T154806448Z-mod-event-created-by-indexes.js'\nexport * as _20260219T164523000Z from './20260219T164523000Z-create-report-table.js'\nexport * as _20260219T165302248Z from './20260219T165302248Z-moderator-assignment.js'\nexport * as _20260225T000000000Z from './20260225T000000000Z-add-report-queue-table.js'\nexport * as _20260313T000000000Z from './20260313T000000000Z-add-report-activity-table.js'\nexport * as _20260318T152058935Z from './20260318T152058935Z-add-report-stat.js'\nexport * as _20260428T000000000Z from './20260428T000000000Z-add-expiring-tag-table.js'\nexport * as _20260513T202941104Z from './20260513T202941104Z-add-subject-convo-id.js'\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/db/migrations/index.ts"],"names":[],"mappings":"AAAA,oGAAoG;AACpG,gGAAgG;AAChG,+FAA+F;AAE/F,OAAO,KAAK,oBAAoB,MAAM,+BAA+B,CAAA;AACrE,OAAO,KAAK,oBAAoB,MAAM,iDAAiD,CAAA;AACvF,OAAO,KAAK,oBAAoB,MAAM,0CAA0C,CAAA;AAChF,OAAO,KAAK,oBAAoB,MAAM,gEAAgE,CAAA;AACtG,OAAO,KAAK,oBAAoB,MAAM,yCAAyC,CAAA;AAC/E,OAAO,KAAK,oBAAoB,MAAM,yCAAyC,CAAA;AAC/E,OAAO,KAAK,oBAAoB,MAAM,0CAA0C,CAAA;AAChF,OAAO,KAAK,oBAAoB,MAAM,iCAAiC,CAAA;AACvE,OAAO,KAAK,oBAAoB,MAAM,iDAAiD,CAAA;AACvF,OAAO,KAAK,oBAAoB,MAAM,4CAA4C,CAAA;AAClF,OAAO,KAAK,oBAAoB,MAAM,gDAAgD,CAAA;AACtF,OAAO,KAAK,oBAAoB,MAAM,4DAA4D,CAAA;AAClG,OAAO,KAAK,oBAAoB,MAAM,+BAA+B,CAAA;AACrE,OAAO,KAAK,oBAAoB,MAAM,kCAAkC,CAAA;AACxE,OAAO,KAAK,oBAAoB,MAAM,+DAA+D,CAAA;AACrG,OAAO,KAAK,oBAAoB,MAAM,mDAAmD,CAAA;AACzF,OAAO,KAAK,oBAAoB,MAAM,qDAAqD,CAAA;AAC3F,OAAO,KAAK,oBAAoB,MAAM,mDAAmD,CAAA;AACzF,OAAO,KAAK,oBAAoB,MAAM,+DAA+D,CAAA;AACrG,OAAO,KAAK,oBAAoB,MAAM,yCAAyC,CAAA;AAC/E,OAAO,KAAK,oBAAoB,MAAM,mDAAmD,CAAA;AACzF,OAAO,KAAK,oBAAoB,MAAM,uCAAuC,CAAA;AAC7E,OAAO,KAAK,oBAAoB,MAAM,0CAA0C,CAAA;AAChF,OAAO,KAAK,oBAAoB,MAAM,mCAAmC,CAAA;AACzE,OAAO,KAAK,oBAAoB,MAAM,2DAA2D,CAAA;AACjG,OAAO,KAAK,oBAAoB,MAAM,kDAAkD,CAAA;AACxF,OAAO,KAAK,oBAAoB,MAAM,oDAAoD,CAAA;AAC1F,OAAO,KAAK,oBAAoB,MAAM,qDAAqD,CAAA;AAC3F,OAAO,KAAK,oBAAoB,MAAM,kDAAkD,CAAA;AACxF,OAAO,KAAK,oBAAoB,MAAM,4CAA4C,CAAA;AAClF,OAAO,KAAK,oBAAoB,MAAM,4CAA4C,CAAA;AAClF,OAAO,KAAK,oBAAoB,MAAM,uDAAuD,CAAA;AAC7F,OAAO,KAAK,oBAAoB,MAAM,8CAA8C,CAAA;AACpF,OAAO,KAAK,oBAAoB,MAAM,+CAA+C,CAAA;AACrF,OAAO,KAAK,oBAAoB,MAAM,iDAAiD,CAAA;AACvF,OAAO,KAAK,oBAAoB,MAAM,oDAAoD,CAAA;AAC1F,OAAO,KAAK,oBAAoB,MAAM,0CAA0C,CAAA;AAChF,OAAO,KAAK,oBAAoB,MAAM,iDAAiD,CAAA;AACvF,OAAO,KAAK,oBAAoB,MAAM,+CAA+C,CAAA;AACrF,OAAO,KAAK,oBAAoB,MAAM,4DAA4D,CAAA","sourcesContent":["// NOTE this file can be edited by hand, but it is also appended to by the migration:create command.\n// It's important that every migration is exported from here with the proper name. We'd simplify\n// this with kysely's FileMigrationProvider, but it doesn't play nicely with the build process.\n\nexport * as _20231219T205730722Z from './20231219T205730722Z-init.js'\nexport * as _20240116T085607200Z from './20240116T085607200Z-communication-template.js'\nexport * as _20240201T051104136Z from './20240201T051104136Z-mod-event-blobs.js'\nexport * as _20240208T213404429Z from './20240208T213404429Z-add-tags-column-to-moderation-subject.js'\nexport * as _20240228T003647759Z from './20240228T003647759Z-add-label-sigs.js'\nexport * as _20240408T192432676Z from './20240408T192432676Z-mute-reporting.js'\nexport * as _20240506T225055595Z from './20240506T225055595Z-message-subject.js'\nexport * as _20240430T211332580Z from './20240521T211332580Z-member.js'\nexport * as _20240814T003647759Z from './20240814T003647759Z-event-created-at-index.js'\nexport * as _20240903T205730722Z from './20240903T205730722Z-add-template-lang.js'\nexport * as _20240904T205730722Z from './20240904T205730722Z-add-subject-did-index.js'\nexport * as _20241001T205730722Z from './20241001T205730722Z-subject-status-review-state-index.js'\nexport * as _20241008T205730722Z from './20241008T205730722Z-sets.js'\nexport * as _20241018T205730722Z from './20241018T205730722Z-setting.js'\nexport * as _20241026T205730722Z from './20241026T205730722Z-add-hosting-status-to-subject-status.js'\nexport * as _20241220T144630860Z from './20241220T144630860Z-stats-materialized-views.js'\nexport * as _20250204T003647759Z from './20250204T003647759Z-add-subject-priority-score.js'\nexport * as _20250211T003647759Z from './20250211T003647759Z-add-reporter-stats-index.js'\nexport * as _20250211T132135150Z from './20250211T132135150Z-moderation-event-message-partial-idx.js'\nexport * as _20250221T132135150Z from './20250221T132135150Z-member-details.js'\nexport * as _20250404T201720309Z from './20250404T201720309Z-subject-status-sort-idxs.js'\nexport * as _20250415T201720309Z from './20250415T201720309Z-verification.js'\nexport * as _20250417T201720309Z from './20250417T201720309Z-firehose-cursor.js'\nexport * as _20250609T110704000Z from './20250609T110704000Z-safelink.js'\nexport * as _20250618T180246000Z from './20250618T180246000Z-add-mod-tool-to-moderation-event.js'\nexport * as _20250701T000000000Z from './20250701T000000000Z-add-age-assurance-state.js'\nexport * as _20250715T000000000Z from './20250715T000000000Z-add-mod-event-external-id.js'\nexport * as _20250718T150931000Z from './20250718T150931000Z-update-appeal-reason-stats.js'\nexport * as _20250813T000000000Z from './20250813T000000000Z-mod-tool-batch-id-index.js'\nexport * as _20250923T000000000Z from './20250923T000000000Z-scheduled-actions.js'\nexport * as _20251008T120000000Z from './20251008T120000000Z-add-strike-system.js'\nexport * as _20260210T154806448Z from './20260210T154806448Z-mod-event-created-by-indexes.js'\nexport * as _20260219T164523000Z from './20260219T164523000Z-create-report-table.js'\nexport * as _20260219T165302248Z from './20260219T165302248Z-moderator-assignment.js'\nexport * as _20260225T000000000Z from './20260225T000000000Z-add-report-queue-table.js'\nexport * as _20260313T000000000Z from './20260313T000000000Z-add-report-activity-table.js'\nexport * as _20260318T152058935Z from './20260318T152058935Z-add-report-stat.js'\nexport * as _20260428T000000000Z from './20260428T000000000Z-add-expiring-tag-table.js'\nexport * as _20260513T202941104Z from './20260513T202941104Z-add-subject-convo-id.js'\nexport * as _20260602T120000000Z from './20260602T120000000Z-add-report-activity-created-index.js'\n"]}
@@ -1,4 +1,5 @@
1
- import { Kysely, Migration, MigrationProvider } from 'kysely';
1
+ import { Kysely } from 'kysely';
2
+ import { Migration, MigrationProvider } from 'kysely/migration';
2
3
  export declare class CtxMigrationProvider<T> implements MigrationProvider {
3
4
  private migrations;
4
5
  private ctx;
@@ -1 +1 @@
1
- {"version":3,"file":"provider.d.ts","sourceRoot":"","sources":["../../../src/db/migrations/provider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,iBAAiB,EAAE,MAAM,QAAQ,CAAA;AAI7D,qBAAa,oBAAoB,CAAC,CAAC,CAAE,YAAW,iBAAiB;IAE7D,OAAO,CAAC,UAAU;IAClB,OAAO,CAAC,GAAG;IAFb,YACU,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC,CAAC,CAAC,EAC3C,GAAG,EAAE,CAAC,EACZ;IACE,aAAa,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC,CASxD;CACF;AAED,MAAM,WAAW,YAAY,CAAC,CAAC;IAC7B,EAAE,CAAC,EAAE,EAAE,MAAM,CAAC,OAAO,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAC9C,IAAI,CAAC,CAAC,EAAE,EAAE,MAAM,CAAC,OAAO,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;CAClD"}
1
+ {"version":3,"file":"provider.d.ts","sourceRoot":"","sources":["../../../src/db/migrations/provider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAC/B,OAAO,EAAE,SAAS,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAA;AAI/D,qBAAa,oBAAoB,CAAC,CAAC,CAAE,YAAW,iBAAiB;IAE7D,OAAO,CAAC,UAAU;IAClB,OAAO,CAAC,GAAG;IAFb,YACU,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC,CAAC,CAAC,EAC3C,GAAG,EAAE,CAAC,EACZ;IACE,aAAa,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC,CASxD;CACF;AAED,MAAM,WAAW,YAAY,CAAC,CAAC;IAC7B,EAAE,CAAC,EAAE,EAAE,MAAM,CAAC,OAAO,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAC9C,IAAI,CAAC,CAAC,EAAE,EAAE,MAAM,CAAC,OAAO,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;CAClD"}
@@ -1 +1 @@
1
- {"version":3,"file":"provider.js","sourceRoot":"","sources":["../../../src/db/migrations/provider.ts"],"names":[],"mappings":"AAEA,6FAA6F;AAE7F,MAAM,OAAO,oBAAoB;IAC/B,YACU,UAA2C,EAC3C,GAAM;0BADN,UAAU;mBACV,GAAG;IACV,CAAC;IACJ,KAAK,CAAC,aAAa;QACjB,MAAM,aAAa,GAA8B,EAAE,CAAA;QACnD,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,EAAE,SAAS,CAAC,EAAE,EAAE;YAC5D,aAAa,CAAC,IAAI,CAAC,GAAG;gBACpB,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,CAAC,MAAM,SAAS,CAAC,EAAE,CAAC,EAAE,EAAE,IAAI,CAAC,GAAG,CAAC;gBAClD,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,CAAC,MAAM,SAAS,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,IAAI,CAAC,GAAG,CAAC;aACzD,CAAA;QACH,CAAC,CAAC,CAAA;QACF,OAAO,aAAa,CAAA;IACtB,CAAC;CACF","sourcesContent":["import { Kysely, Migration, MigrationProvider } from 'kysely'\n\n// Passes a context argument to migrations. We use this to thread the dialect into migrations\n\nexport class CtxMigrationProvider<T> implements MigrationProvider {\n constructor(\n private migrations: Record<string, CtxMigration<T>>,\n private ctx: T,\n ) {}\n async getMigrations(): Promise<Record<string, Migration>> {\n const ctxMigrations: Record<string, Migration> = {}\n Object.entries(this.migrations).forEach(([name, migration]) => {\n ctxMigrations[name] = {\n up: async (db) => await migration.up(db, this.ctx),\n down: async (db) => await migration.down?.(db, this.ctx),\n }\n })\n return ctxMigrations\n }\n}\n\nexport interface CtxMigration<T> {\n up(db: Kysely<unknown>, ctx: T): Promise<void>\n down?(db: Kysely<unknown>, ctx: T): Promise<void>\n}\n"]}
1
+ {"version":3,"file":"provider.js","sourceRoot":"","sources":["../../../src/db/migrations/provider.ts"],"names":[],"mappings":"AAGA,6FAA6F;AAE7F,MAAM,OAAO,oBAAoB;IAC/B,YACU,UAA2C,EAC3C,GAAM;0BADN,UAAU;mBACV,GAAG;IACV,CAAC;IACJ,KAAK,CAAC,aAAa;QACjB,MAAM,aAAa,GAA8B,EAAE,CAAA;QACnD,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,EAAE,SAAS,CAAC,EAAE,EAAE;YAC5D,aAAa,CAAC,IAAI,CAAC,GAAG;gBACpB,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,CAAC,MAAM,SAAS,CAAC,EAAE,CAAC,EAAE,EAAE,IAAI,CAAC,GAAG,CAAC;gBAClD,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,CAAC,MAAM,SAAS,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,IAAI,CAAC,GAAG,CAAC;aACzD,CAAA;QACH,CAAC,CAAC,CAAA;QACF,OAAO,aAAa,CAAA;IACtB,CAAC;CACF","sourcesContent":["import { Kysely } from 'kysely'\nimport { Migration, MigrationProvider } from 'kysely/migration'\n\n// Passes a context argument to migrations. We use this to thread the dialect into migrations\n\nexport class CtxMigrationProvider<T> implements MigrationProvider {\n constructor(\n private migrations: Record<string, CtxMigration<T>>,\n private ctx: T,\n ) {}\n async getMigrations(): Promise<Record<string, Migration>> {\n const ctxMigrations: Record<string, Migration> = {}\n Object.entries(this.migrations).forEach(([name, migration]) => {\n ctxMigrations[name] = {\n up: async (db) => await migration.up(db, this.ctx),\n down: async (db) => await migration.down?.(db, this.ctx),\n }\n })\n return ctxMigrations\n }\n}\n\nexport interface CtxMigration<T> {\n up(db: Kysely<unknown>, ctx: T): Promise<void>\n down?(db: Kysely<unknown>, ctx: T): Promise<void>\n}\n"]}
@@ -1,3 +1,4 @@
1
+ import { SqlBool } from 'kysely';
1
2
  import { AnyQb, DbRef } from './types.js';
2
3
  export type Cursor = {
3
4
  primary: string;
@@ -33,7 +34,7 @@ export declare abstract class GenericKeyset<R, LR extends LabeledResult> {
33
34
  unpack(cursorStr?: string): LR | undefined;
34
35
  packCursor(cursor?: Cursor): string | undefined;
35
36
  unpackCursor(cursorStr?: string): Cursor | undefined;
36
- getSql(labeled?: LR, direction?: 'asc' | 'desc', tryIndex?: boolean): import("kysely").RawBuilder<unknown> | undefined;
37
+ getSql(labeled?: LR, direction?: 'asc' | 'desc', tryIndex?: boolean): import("kysely").RawBuilder<SqlBool> | undefined;
37
38
  }
38
39
  type StatusKeysetParam = {
39
40
  lastReviewedAt: string | null;
@@ -51,7 +52,7 @@ export declare class StatusKeyset extends GenericKeyset<StatusKeysetParam, Curso
51
52
  secondary: string;
52
53
  };
53
54
  unpackCursor(cursorStr?: string): Cursor | undefined;
54
- getSql(labeled?: Cursor, direction?: 'asc' | 'desc'): import("kysely").RawBuilder<unknown> | undefined;
55
+ getSql(labeled?: Cursor, direction?: 'asc' | 'desc'): import("kysely").RawBuilder<SqlBool> | undefined;
55
56
  }
56
57
  type TimeIdKeysetParam = {
57
58
  id: number;
@@ -98,7 +99,7 @@ export declare class EndAtIdKeyset extends GenericKeyset<EndAtIdKeysetParam, Cur
98
99
  primary: string;
99
100
  secondary: string;
100
101
  };
101
- getSql(labeled?: Cursor, direction?: 'asc' | 'desc', tryIndex?: boolean): import("kysely").RawBuilder<unknown> | undefined;
102
+ getSql(labeled?: Cursor, direction?: 'asc' | 'desc', tryIndex?: boolean): import("kysely").RawBuilder<SqlBool> | undefined;
102
103
  }
103
104
  type ComputedAtIdKeysetParam = {
104
105
  id: number;
@@ -1 +1 @@
1
- {"version":3,"file":"pagination.d.ts","sourceRoot":"","sources":["../../src/db/pagination.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"pagination.d.ts","sourceRoot":"","sources":["../../src/db/pagination.ts"],"names":[],"mappings":"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"}
@@ -250,15 +250,15 @@ export const paginate = (qb, opts) => {
250
250
  const { limit, cursor, keyset, direction = 'desc', tryIndex, nullsLast, } = opts;
251
251
  const keysetSql = keyset.getSql(keyset.unpack(cursor), direction, tryIndex);
252
252
  return qb
253
- .if(!!limit, (q) => q.limit(limit))
254
- .if(!nullsLast, (q) => q.orderBy(keyset.primary, direction).orderBy(keyset.secondary, direction))
255
- .if(!!nullsLast, (q) => q
253
+ .$if(!!limit, (q) => q.limit(limit))
254
+ .$if(!nullsLast, (q) => q.orderBy(keyset.primary, direction).orderBy(keyset.secondary, direction))
255
+ .$if(!!nullsLast, (q) => q
256
256
  .orderBy(direction === 'asc'
257
257
  ? sql `${keyset.primary} asc nulls last`
258
258
  : sql `${keyset.primary} desc nulls last`)
259
259
  .orderBy(direction === 'asc'
260
260
  ? sql `${keyset.secondary} asc nulls last`
261
261
  : sql `${keyset.secondary} desc nulls last`))
262
- .if(!!keysetSql, (qb) => (keysetSql ? qb.where(keysetSql) : qb));
262
+ .$if(!!keysetSql, (qb) => (keysetSql ? qb.where(keysetSql) : qb));
263
263
  };
264
264
  //# sourceMappingURL=pagination.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"pagination.js","sourceRoot":"","sources":["../../src/db/pagination.ts"],"names":[],"mappings":"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","sourcesContent":["import { DynamicModule, sql } from 'kysely'\nimport { InvalidRequestError } from '@atproto/xrpc-server'\nimport { AnyQb, DbRef } from './types.js'\n\nexport type Cursor = { primary: string; secondary: string }\nexport type LabeledResult = {\n primary: string | number\n secondary: string | number\n}\n\n/**\n * The GenericKeyset is an abstract class that sets-up the interface and partial implementation\n * of a keyset-paginated cursor with two parts. There are three types involved:\n * - Result: a raw result (i.e. a row from the db) containing data that will make-up a cursor.\n * - E.g. { createdAt: '2022-01-01T12:00:00Z', cid: 'bafyx' }\n * - LabeledResult: a Result processed such that the \"primary\" and \"secondary\" parts of the cursor are labeled.\n * - E.g. { primary: '2022-01-01T12:00:00Z', secondary: 'bafyx' }\n * - Cursor: the two string parts that make-up the packed/string cursor.\n * - E.g. packed cursor '1641038400000::bafyx' in parts { primary: '1641038400000', secondary: 'bafyx' }\n *\n * These types relate as such. Implementers define the relations marked with a *:\n * Result -*-> LabeledResult <-*-> Cursor <--> packed/string cursor\n * ↳ SQL Condition\n */\nexport abstract class GenericKeyset<R, LR extends LabeledResult> {\n constructor(\n public primary: DbRef,\n public secondary: DbRef,\n ) {}\n abstract labelResult(result: R): LR\n abstract labeledResultToCursor(labeled: LR): Cursor\n abstract cursorToLabeledResult(cursor: Cursor): LR\n packFromResult(results: R | R[]): string | undefined {\n const result = Array.isArray(results) ? results.at(-1) : results\n if (!result) return\n return this.pack(this.labelResult(result))\n }\n pack(labeled?: LR): string | undefined {\n if (!labeled) return\n const cursor = this.labeledResultToCursor(labeled)\n return this.packCursor(cursor)\n }\n unpack(cursorStr?: string): LR | undefined {\n const cursor = this.unpackCursor(cursorStr)\n if (!cursor) return\n return this.cursorToLabeledResult(cursor)\n }\n packCursor(cursor?: Cursor): string | undefined {\n if (!cursor) return\n return `${cursor.primary}::${cursor.secondary}`\n }\n unpackCursor(cursorStr?: string): Cursor | undefined {\n if (!cursorStr) return\n const result = cursorStr.split('::')\n const [primary, secondary, ...others] = result\n if (!primary || !secondary || others.length > 0) {\n throw new InvalidRequestError('Malformed cursor')\n }\n return {\n primary,\n secondary,\n }\n }\n getSql(labeled?: LR, direction?: 'asc' | 'desc', tryIndex?: boolean) {\n if (labeled === undefined) return\n if (tryIndex) {\n // The tryIndex param will likely disappear and become the default implementation: here for now for gradual rollout query-by-query.\n if (direction === 'asc') {\n return sql`((${this.primary}, ${this.secondary}) > (${labeled.primary}, ${labeled.secondary}))`\n } else {\n return sql`((${this.primary}, ${this.secondary}) < (${labeled.primary}, ${labeled.secondary}))`\n }\n } else {\n // @NOTE this implementation can struggle to use an index on (primary, secondary) for pagination due to the \"or\" usage.\n if (direction === 'asc') {\n return sql`((${this.primary} > ${labeled.primary}) or (${this.primary} = ${labeled.primary} and ${this.secondary} > ${labeled.secondary}))`\n } else {\n return sql`((${this.primary} < ${labeled.primary}) or (${this.primary} = ${labeled.primary} and ${this.secondary} < ${labeled.secondary}))`\n }\n }\n }\n}\n\ntype StatusKeysetParam = {\n lastReviewedAt: string | null\n lastReportedAt: string | null\n id: number\n}\n\nexport class StatusKeyset extends GenericKeyset<StatusKeysetParam, Cursor> {\n labelResult(result: StatusKeysetParam): Cursor\n labelResult(result: StatusKeysetParam) {\n const primaryField = (\n this.primary as ReturnType<DynamicModule['ref']>\n ).dynamicReference.includes('lastReviewedAt')\n ? 'lastReviewedAt'\n : 'lastReportedAt'\n\n return {\n primary: result[primaryField]\n ? new Date(`${result[primaryField]}`).getTime().toString()\n : '',\n secondary: result.id.toString(),\n }\n }\n labeledResultToCursor(labeled: Cursor) {\n return {\n primary: labeled.primary,\n secondary: labeled.secondary,\n }\n }\n cursorToLabeledResult(cursor: Cursor) {\n return {\n primary: cursor.primary\n ? new Date(parseInt(cursor.primary, 10)).toISOString()\n : '',\n secondary: cursor.secondary,\n }\n }\n unpackCursor(cursorStr?: string): Cursor | undefined {\n if (!cursorStr) return\n const result = cursorStr.split('::')\n const [primary, secondary, ...others] = result\n if (!secondary || others.length > 0) {\n throw new InvalidRequestError('Malformed cursor')\n }\n return {\n primary,\n secondary,\n }\n }\n // This is specifically built to handle nullable columns as primary sorting column\n getSql(labeled?: Cursor, direction?: 'asc' | 'desc') {\n if (labeled === undefined) return\n if (direction === 'asc') {\n return !labeled.primary\n ? sql`(${this.primary} IS NULL AND ${this.secondary} > ${labeled.secondary})`\n : sql`((${this.primary}, ${this.secondary}) > (${labeled.primary}, ${labeled.secondary}) OR (${this.primary} is null))`\n } else {\n return !labeled.primary\n ? sql`(${this.primary} IS NULL AND ${this.secondary} < ${labeled.secondary})`\n : sql`((${this.primary}, ${this.secondary}) < (${labeled.primary}, ${labeled.secondary}) OR (${this.primary} is null))`\n }\n }\n}\n\ntype TimeIdKeysetParam = {\n id: number\n createdAt: string | Date\n}\ntype TimeIdResult = TimeIdKeysetParam\n\nexport class TimeIdKeyset extends GenericKeyset<TimeIdKeysetParam, Cursor> {\n labelResult(result: TimeIdResult): Cursor\n labelResult(result: TimeIdResult) {\n return { primary: result.createdAt, secondary: result.id.toString() }\n }\n labeledResultToCursor(labeled: Cursor) {\n return {\n primary: new Date(labeled.primary).getTime().toString(),\n secondary: labeled.secondary,\n }\n }\n cursorToLabeledResult(cursor: Cursor) {\n const primaryDate = new Date(parseInt(cursor.primary, 10))\n if (isNaN(primaryDate.getTime())) {\n throw new InvalidRequestError('Malformed cursor')\n }\n return {\n primary: primaryDate.toISOString(),\n secondary: cursor.secondary,\n }\n }\n}\n\ntype CreatedAtUriKeysetParam = {\n createdAt: string\n uri: string\n}\n\nexport class CreatedAtUriKeyset extends GenericKeyset<\n CreatedAtUriKeysetParam,\n Cursor\n> {\n labelResult(result: CreatedAtUriKeysetParam): Cursor\n labelResult(result: CreatedAtUriKeysetParam) {\n return { primary: result.createdAt, secondary: result.uri }\n }\n labeledResultToCursor(labeled: Cursor) {\n return {\n primary: new Date(labeled.primary).getTime().toString(),\n secondary: labeled.secondary,\n }\n }\n cursorToLabeledResult(cursor: Cursor) {\n const primaryDate = new Date(parseInt(cursor.primary, 10))\n if (isNaN(primaryDate.getTime())) {\n throw new InvalidRequestError('Malformed cursor')\n }\n return {\n primary: primaryDate.toISOString(),\n secondary: cursor.secondary,\n }\n }\n}\n\ntype EndAtIdKeysetParam = {\n id: number\n endAt: string | null\n}\n\n// Special value used here to represent a \"permanent\" endAt (i.e. a record that should be sorted as if it has an endAt infinitely far in the future).\n// Chosen to sort before all real timestamps in DESC order.\nconst PERMANENT_ENDSAT = '9999-12-31T23:59:59.999Z'\n\nexport class EndAtIdKeyset extends GenericKeyset<EndAtIdKeysetParam, Cursor> {\n labelResult(result: EndAtIdKeysetParam): Cursor\n labelResult(result: EndAtIdKeysetParam) {\n return {\n primary: result.endAt ?? PERMANENT_ENDSAT,\n secondary: result.id.toString(),\n }\n }\n labeledResultToCursor(labeled: Cursor) {\n return {\n primary: new Date(labeled.primary).getTime().toString(),\n secondary: labeled.secondary,\n }\n }\n cursorToLabeledResult(cursor: Cursor) {\n const primaryDate = new Date(parseInt(cursor.primary, 10))\n if (isNaN(primaryDate.getTime())) {\n throw new InvalidRequestError('Malformed cursor')\n }\n return {\n primary: primaryDate.toISOString(),\n secondary: cursor.secondary,\n }\n }\n // Override to substitute the PERMANENT_ENDSAT sentinel for NULL endAt rows\n // so cursor pagination works across permanent (endAt IS NULL) assignments.\n getSql(labeled?: Cursor, direction?: 'asc' | 'desc', tryIndex?: boolean) {\n if (labeled === undefined) return\n const primaryRef = sql`COALESCE(${this.primary}, ${PERMANENT_ENDSAT})`\n if (tryIndex) {\n if (direction === 'asc') {\n return sql`((${primaryRef}, ${this.secondary}) > (${labeled.primary}, ${labeled.secondary}))`\n } else {\n return sql`((${primaryRef}, ${this.secondary}) < (${labeled.primary}, ${labeled.secondary}))`\n }\n } else {\n if (direction === 'asc') {\n return sql`((${primaryRef} > ${labeled.primary}) or (${primaryRef} = ${labeled.primary} and ${this.secondary} > ${labeled.secondary}))`\n } else {\n return sql`((${primaryRef} < ${labeled.primary}) or (${primaryRef} = ${labeled.primary} and ${this.secondary} < ${labeled.secondary}))`\n }\n }\n }\n}\n\ntype ComputedAtIdKeysetParam = {\n id: number\n computedAt: string | Date\n}\n\nexport class ComputedAtIdKeyset extends GenericKeyset<\n ComputedAtIdKeysetParam,\n Cursor\n> {\n labelResult(result: ComputedAtIdKeysetParam): Cursor\n labelResult(result: ComputedAtIdKeysetParam) {\n return { primary: result.computedAt, secondary: result.id.toString() }\n }\n labeledResultToCursor(labeled: Cursor) {\n return {\n primary: new Date(labeled.primary).getTime().toString(),\n secondary: labeled.secondary,\n }\n }\n cursorToLabeledResult(cursor: Cursor) {\n const primaryDate = new Date(parseInt(cursor.primary, 10))\n if (isNaN(primaryDate.getTime())) {\n throw new InvalidRequestError('Malformed cursor')\n }\n return {\n primary: primaryDate.toISOString(),\n secondary: cursor.secondary,\n }\n }\n}\n\nexport const paginate = <\n QB extends AnyQb,\n K extends GenericKeyset<unknown, any>,\n>(\n qb: QB,\n opts: {\n limit?: number\n cursor?: string\n direction?: 'asc' | 'desc'\n keyset: K\n tryIndex?: boolean\n // By default, pg does nullsFirst\n nullsLast?: boolean\n },\n): QB => {\n const {\n limit,\n cursor,\n keyset,\n direction = 'desc',\n tryIndex,\n nullsLast,\n } = opts\n const keysetSql = keyset.getSql(keyset.unpack(cursor), direction, tryIndex)\n return qb\n .if(!!limit, (q) => q.limit(limit as number))\n .if(!nullsLast, (q) =>\n q.orderBy(keyset.primary, direction).orderBy(keyset.secondary, direction),\n )\n .if(!!nullsLast, (q) =>\n q\n .orderBy(\n direction === 'asc'\n ? sql`${keyset.primary} asc nulls last`\n : sql`${keyset.primary} desc nulls last`,\n )\n .orderBy(\n direction === 'asc'\n ? sql`${keyset.secondary} asc nulls last`\n : sql`${keyset.secondary} desc nulls last`,\n ),\n )\n .if(!!keysetSql, (qb) => (keysetSql ? qb.where(keysetSql) : qb)) as QB\n}\n"]}
1
+ {"version":3,"file":"pagination.js","sourceRoot":"","sources":["../../src/db/pagination.ts"],"names":[],"mappings":"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","sourcesContent":["import { DynamicModule, SqlBool, sql } from 'kysely'\nimport { InvalidRequestError } from '@atproto/xrpc-server'\nimport { AnyQb, DbRef } from './types.js'\n\nexport type Cursor = { primary: string; secondary: string }\nexport type LabeledResult = {\n primary: string | number\n secondary: string | number\n}\n\n/**\n * The GenericKeyset is an abstract class that sets-up the interface and partial implementation\n * of a keyset-paginated cursor with two parts. There are three types involved:\n * - Result: a raw result (i.e. a row from the db) containing data that will make-up a cursor.\n * - E.g. { createdAt: '2022-01-01T12:00:00Z', cid: 'bafyx' }\n * - LabeledResult: a Result processed such that the \"primary\" and \"secondary\" parts of the cursor are labeled.\n * - E.g. { primary: '2022-01-01T12:00:00Z', secondary: 'bafyx' }\n * - Cursor: the two string parts that make-up the packed/string cursor.\n * - E.g. packed cursor '1641038400000::bafyx' in parts { primary: '1641038400000', secondary: 'bafyx' }\n *\n * These types relate as such. Implementers define the relations marked with a *:\n * Result -*-> LabeledResult <-*-> Cursor <--> packed/string cursor\n * ↳ SQL Condition\n */\nexport abstract class GenericKeyset<R, LR extends LabeledResult> {\n constructor(\n public primary: DbRef,\n public secondary: DbRef,\n ) {}\n abstract labelResult(result: R): LR\n abstract labeledResultToCursor(labeled: LR): Cursor\n abstract cursorToLabeledResult(cursor: Cursor): LR\n packFromResult(results: R | R[]): string | undefined {\n const result = Array.isArray(results) ? results.at(-1) : results\n if (!result) return\n return this.pack(this.labelResult(result))\n }\n pack(labeled?: LR): string | undefined {\n if (!labeled) return\n const cursor = this.labeledResultToCursor(labeled)\n return this.packCursor(cursor)\n }\n unpack(cursorStr?: string): LR | undefined {\n const cursor = this.unpackCursor(cursorStr)\n if (!cursor) return\n return this.cursorToLabeledResult(cursor)\n }\n packCursor(cursor?: Cursor): string | undefined {\n if (!cursor) return\n return `${cursor.primary}::${cursor.secondary}`\n }\n unpackCursor(cursorStr?: string): Cursor | undefined {\n if (!cursorStr) return\n const result = cursorStr.split('::')\n const [primary, secondary, ...others] = result\n if (!primary || !secondary || others.length > 0) {\n throw new InvalidRequestError('Malformed cursor')\n }\n return {\n primary,\n secondary,\n }\n }\n getSql(labeled?: LR, direction?: 'asc' | 'desc', tryIndex?: boolean) {\n if (labeled === undefined) return\n if (tryIndex) {\n // The tryIndex param will likely disappear and become the default implementation: here for now for gradual rollout query-by-query.\n if (direction === 'asc') {\n return sql<SqlBool>`((${this.primary}, ${this.secondary}) > (${labeled.primary}, ${labeled.secondary}))`\n } else {\n return sql<SqlBool>`((${this.primary}, ${this.secondary}) < (${labeled.primary}, ${labeled.secondary}))`\n }\n } else {\n // @NOTE this implementation can struggle to use an index on (primary, secondary) for pagination due to the \"or\" usage.\n if (direction === 'asc') {\n return sql<SqlBool>`((${this.primary} > ${labeled.primary}) or (${this.primary} = ${labeled.primary} and ${this.secondary} > ${labeled.secondary}))`\n } else {\n return sql<SqlBool>`((${this.primary} < ${labeled.primary}) or (${this.primary} = ${labeled.primary} and ${this.secondary} < ${labeled.secondary}))`\n }\n }\n }\n}\n\ntype StatusKeysetParam = {\n lastReviewedAt: string | null\n lastReportedAt: string | null\n id: number\n}\n\nexport class StatusKeyset extends GenericKeyset<StatusKeysetParam, Cursor> {\n labelResult(result: StatusKeysetParam): Cursor\n labelResult(result: StatusKeysetParam) {\n const primaryField = (\n this.primary as ReturnType<DynamicModule<unknown>['ref']>\n ).dynamicReference.includes('lastReviewedAt')\n ? 'lastReviewedAt'\n : 'lastReportedAt'\n\n return {\n primary: result[primaryField]\n ? new Date(`${result[primaryField]}`).getTime().toString()\n : '',\n secondary: result.id.toString(),\n }\n }\n labeledResultToCursor(labeled: Cursor) {\n return {\n primary: labeled.primary,\n secondary: labeled.secondary,\n }\n }\n cursorToLabeledResult(cursor: Cursor) {\n return {\n primary: cursor.primary\n ? new Date(parseInt(cursor.primary, 10)).toISOString()\n : '',\n secondary: cursor.secondary,\n }\n }\n unpackCursor(cursorStr?: string): Cursor | undefined {\n if (!cursorStr) return\n const result = cursorStr.split('::')\n const [primary, secondary, ...others] = result\n if (!secondary || others.length > 0) {\n throw new InvalidRequestError('Malformed cursor')\n }\n return {\n primary,\n secondary,\n }\n }\n // This is specifically built to handle nullable columns as primary sorting column\n getSql(labeled?: Cursor, direction?: 'asc' | 'desc') {\n if (labeled === undefined) return\n if (direction === 'asc') {\n return !labeled.primary\n ? sql<SqlBool>`(${this.primary} IS NULL AND ${this.secondary} > ${labeled.secondary})`\n : sql<SqlBool>`((${this.primary}, ${this.secondary}) > (${labeled.primary}, ${labeled.secondary}) OR (${this.primary} is null))`\n } else {\n return !labeled.primary\n ? sql<SqlBool>`(${this.primary} IS NULL AND ${this.secondary} < ${labeled.secondary})`\n : sql<SqlBool>`((${this.primary}, ${this.secondary}) < (${labeled.primary}, ${labeled.secondary}) OR (${this.primary} is null))`\n }\n }\n}\n\ntype TimeIdKeysetParam = {\n id: number\n createdAt: string | Date\n}\ntype TimeIdResult = TimeIdKeysetParam\n\nexport class TimeIdKeyset extends GenericKeyset<TimeIdKeysetParam, Cursor> {\n labelResult(result: TimeIdResult): Cursor\n labelResult(result: TimeIdResult) {\n return { primary: result.createdAt, secondary: result.id.toString() }\n }\n labeledResultToCursor(labeled: Cursor) {\n return {\n primary: new Date(labeled.primary).getTime().toString(),\n secondary: labeled.secondary,\n }\n }\n cursorToLabeledResult(cursor: Cursor) {\n const primaryDate = new Date(parseInt(cursor.primary, 10))\n if (isNaN(primaryDate.getTime())) {\n throw new InvalidRequestError('Malformed cursor')\n }\n return {\n primary: primaryDate.toISOString(),\n secondary: cursor.secondary,\n }\n }\n}\n\ntype CreatedAtUriKeysetParam = {\n createdAt: string\n uri: string\n}\n\nexport class CreatedAtUriKeyset extends GenericKeyset<\n CreatedAtUriKeysetParam,\n Cursor\n> {\n labelResult(result: CreatedAtUriKeysetParam): Cursor\n labelResult(result: CreatedAtUriKeysetParam) {\n return { primary: result.createdAt, secondary: result.uri }\n }\n labeledResultToCursor(labeled: Cursor) {\n return {\n primary: new Date(labeled.primary).getTime().toString(),\n secondary: labeled.secondary,\n }\n }\n cursorToLabeledResult(cursor: Cursor) {\n const primaryDate = new Date(parseInt(cursor.primary, 10))\n if (isNaN(primaryDate.getTime())) {\n throw new InvalidRequestError('Malformed cursor')\n }\n return {\n primary: primaryDate.toISOString(),\n secondary: cursor.secondary,\n }\n }\n}\n\ntype EndAtIdKeysetParam = {\n id: number\n endAt: string | null\n}\n\n// Special value used here to represent a \"permanent\" endAt (i.e. a record that should be sorted as if it has an endAt infinitely far in the future).\n// Chosen to sort before all real timestamps in DESC order.\nconst PERMANENT_ENDSAT = '9999-12-31T23:59:59.999Z'\n\nexport class EndAtIdKeyset extends GenericKeyset<EndAtIdKeysetParam, Cursor> {\n labelResult(result: EndAtIdKeysetParam): Cursor\n labelResult(result: EndAtIdKeysetParam) {\n return {\n primary: result.endAt ?? PERMANENT_ENDSAT,\n secondary: result.id.toString(),\n }\n }\n labeledResultToCursor(labeled: Cursor) {\n return {\n primary: new Date(labeled.primary).getTime().toString(),\n secondary: labeled.secondary,\n }\n }\n cursorToLabeledResult(cursor: Cursor) {\n const primaryDate = new Date(parseInt(cursor.primary, 10))\n if (isNaN(primaryDate.getTime())) {\n throw new InvalidRequestError('Malformed cursor')\n }\n return {\n primary: primaryDate.toISOString(),\n secondary: cursor.secondary,\n }\n }\n // Override to substitute the PERMANENT_ENDSAT sentinel for NULL endAt rows\n // so cursor pagination works across permanent (endAt IS NULL) assignments.\n getSql(labeled?: Cursor, direction?: 'asc' | 'desc', tryIndex?: boolean) {\n if (labeled === undefined) return\n const primaryRef = sql`COALESCE(${this.primary}, ${PERMANENT_ENDSAT})`\n if (tryIndex) {\n if (direction === 'asc') {\n return sql<SqlBool>`((${primaryRef}, ${this.secondary}) > (${labeled.primary}, ${labeled.secondary}))`\n } else {\n return sql<SqlBool>`((${primaryRef}, ${this.secondary}) < (${labeled.primary}, ${labeled.secondary}))`\n }\n } else {\n if (direction === 'asc') {\n return sql<SqlBool>`((${primaryRef} > ${labeled.primary}) or (${primaryRef} = ${labeled.primary} and ${this.secondary} > ${labeled.secondary}))`\n } else {\n return sql<SqlBool>`((${primaryRef} < ${labeled.primary}) or (${primaryRef} = ${labeled.primary} and ${this.secondary} < ${labeled.secondary}))`\n }\n }\n }\n}\n\ntype ComputedAtIdKeysetParam = {\n id: number\n computedAt: string | Date\n}\n\nexport class ComputedAtIdKeyset extends GenericKeyset<\n ComputedAtIdKeysetParam,\n Cursor\n> {\n labelResult(result: ComputedAtIdKeysetParam): Cursor\n labelResult(result: ComputedAtIdKeysetParam) {\n return { primary: result.computedAt, secondary: result.id.toString() }\n }\n labeledResultToCursor(labeled: Cursor) {\n return {\n primary: new Date(labeled.primary).getTime().toString(),\n secondary: labeled.secondary,\n }\n }\n cursorToLabeledResult(cursor: Cursor) {\n const primaryDate = new Date(parseInt(cursor.primary, 10))\n if (isNaN(primaryDate.getTime())) {\n throw new InvalidRequestError('Malformed cursor')\n }\n return {\n primary: primaryDate.toISOString(),\n secondary: cursor.secondary,\n }\n }\n}\n\nexport const paginate = <\n QB extends AnyQb,\n K extends GenericKeyset<unknown, any>,\n>(\n qb: QB,\n opts: {\n limit?: number\n cursor?: string\n direction?: 'asc' | 'desc'\n keyset: K\n tryIndex?: boolean\n // By default, pg does nullsFirst\n nullsLast?: boolean\n },\n): QB => {\n const {\n limit,\n cursor,\n keyset,\n direction = 'desc',\n tryIndex,\n nullsLast,\n } = opts\n const keysetSql = keyset.getSql(keyset.unpack(cursor), direction, tryIndex)\n return qb\n .$if(!!limit, (q) => q.limit(limit as number))\n .$if(!nullsLast, (q) =>\n q.orderBy(keyset.primary, direction).orderBy(keyset.secondary, direction),\n )\n .$if(!!nullsLast, (q) =>\n q\n .orderBy(\n direction === 'asc'\n ? sql`${keyset.primary} asc nulls last`\n : sql`${keyset.primary} desc nulls last`,\n )\n .orderBy(\n direction === 'asc'\n ? sql`${keyset.secondary} asc nulls last`\n : sql`${keyset.secondary} desc nulls last`,\n ),\n )\n .$if(!!keysetSql, (qb) => (keysetSql ? qb.where(keysetSql) : qb)) as QB\n}\n"]}
@@ -1,7 +1,7 @@
1
1
  import { DynamicModule, RawBuilder, SelectQueryBuilder } from 'kysely';
2
2
  import pg from 'pg';
3
3
  type PgPool = pg.Pool;
4
- export type DbRef = RawBuilder | ReturnType<DynamicModule['ref']>;
4
+ export type DbRef = RawBuilder<unknown> | ReturnType<DynamicModule<unknown>['ref']>;
5
5
  export type AnyQb = SelectQueryBuilder<any, any, any>;
6
6
  export type PgOptions = {
7
7
  url: string;
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/db/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,kBAAkB,EAAO,MAAM,QAAQ,CAAA;AAE3E,OAAO,EAAE,MAAM,IAAI,CAAA;AACnB,KAAK,MAAM,GAAG,EAAE,CAAC,IAAI,CAAA;AAErB,MAAM,MAAM,KAAK,GAAG,UAAU,GAAG,UAAU,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,CAAA;AAEjE,MAAM,MAAM,KAAK,GAAG,kBAAkB,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAA;AAErD,MAAM,MAAM,SAAS,GAAG;IACtB,GAAG,EAAE,MAAM,CAAA;IACX,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,iBAAiB,CAAC,EAAE,MAAM,CAAA;CAC3B,CAAA;AAED,eAAO,MAAM,KAAK,GAAI,CAAC,OAAO,CAAC,kBAG9B,CAAA"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/db/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,kBAAkB,EAAO,MAAM,QAAQ,CAAA;AAE3E,OAAO,EAAE,MAAM,IAAI,CAAA;AACnB,KAAK,MAAM,GAAG,EAAE,CAAC,IAAI,CAAA;AAErB,MAAM,MAAM,KAAK,GACb,UAAU,CAAC,OAAO,CAAC,GACnB,UAAU,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC,CAAA;AAE7C,MAAM,MAAM,KAAK,GAAG,kBAAkB,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAA;AAErD,MAAM,MAAM,SAAS,GAAG;IACtB,GAAG,EAAE,MAAM,CAAA;IACX,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,iBAAiB,CAAC,EAAE,MAAM,CAAA;CAC3B,CAAA;AAED,eAAO,MAAM,KAAK,GAAI,CAAC,OAAO,CAAC,kBAG9B,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/db/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAiD,GAAG,EAAE,MAAM,QAAQ,CAAA;AAkB3E,MAAM,CAAC,MAAM,KAAK,GAAG,CAAI,GAAM,EAAE,EAAE;IACjC,IAAI,GAAG,KAAK,IAAI;QAAE,OAAO,GAAG,CAAG,MAAM,CAAA;IACrC,OAAO,GAAG,CAAG,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,SAAS,CAAA;AAC9C,CAAC,CAAA","sourcesContent":["import { DynamicModule, RawBuilder, SelectQueryBuilder, sql } from 'kysely'\n// eslint-disable-next-line import/default\nimport pg from 'pg'\ntype PgPool = pg.Pool\n\nexport type DbRef = RawBuilder | ReturnType<DynamicModule['ref']>\n\nexport type AnyQb = SelectQueryBuilder<any, any, any>\n\nexport type PgOptions = {\n url: string\n pool?: PgPool\n schema?: string\n poolSize?: number\n poolMaxUses?: number\n poolIdleTimeoutMs?: number\n}\n\nexport const jsonb = <T>(val: T) => {\n if (val === null) return sql<T>`null`\n return sql<T>`${JSON.stringify(val)}::jsonb`\n}\n"]}
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/db/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAiD,GAAG,EAAE,MAAM,QAAQ,CAAA;AAoB3E,MAAM,CAAC,MAAM,KAAK,GAAG,CAAI,GAAM,EAAE,EAAE;IACjC,IAAI,GAAG,KAAK,IAAI;QAAE,OAAO,GAAG,CAAG,MAAM,CAAA;IACrC,OAAO,GAAG,CAAG,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,SAAS,CAAA;AAC9C,CAAC,CAAA","sourcesContent":["import { DynamicModule, RawBuilder, SelectQueryBuilder, sql } from 'kysely'\n// eslint-disable-next-line import/default\nimport pg from 'pg'\ntype PgPool = pg.Pool\n\nexport type DbRef =\n | RawBuilder<unknown>\n | ReturnType<DynamicModule<unknown>['ref']>\n\nexport type AnyQb = SelectQueryBuilder<any, any, any>\n\nexport type PgOptions = {\n url: string\n pool?: PgPool\n schema?: string\n poolSize?: number\n poolMaxUses?: number\n poolIdleTimeoutMs?: number\n}\n\nexport const jsonb = <T>(val: T) => {\n if (val === null) return sql<T>`null`\n return sql<T>`${JSON.stringify(val)}::jsonb`\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,IAAI,MAAM,WAAW,CAAA;AAI5B,OAAO,OAAO,MAAM,SAAS,CAAA;AAQ7B,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAC7D,OAAO,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAA;AAM5D,cAAc,mBAAmB,CAAA;AACjC,OAAO,EAAE,KAAK,gBAAgB,EAAE,MAAM,wBAAwB,CAAA;AAC9D,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AACxC,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAC3E,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAA;AACzC,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAExC,qBAAa,YAAY;IAChB,GAAG,EAAE,UAAU,CAAA;IACf,GAAG,EAAE,OAAO,CAAC,WAAW,CAAA;IACxB,MAAM,CAAC,EAAE,IAAI,CAAC,MAAM,CAAA;IAC3B,OAAO,CAAC,UAAU,CAAC,CAAgB;IACnC,OAAO,CAAC,eAAe,CAAC,CAAgB;IAExC,YAAY,IAAI,EAAE;QAAE,GAAG,EAAE,UAAU,CAAC;QAAC,GAAG,EAAE,OAAO,CAAC,WAAW,CAAA;KAAE,EAG9D;IAED,OAAa,MAAM,CACjB,GAAG,EAAE,WAAW,EAChB,OAAO,EAAE,YAAY,EACrB,SAAS,CAAC,EAAE,OAAO,CAAC,iBAAiB,CAAC,GACrC,OAAO,CAAC,YAAY,CAAC,CA0BvB;IAEK,kBAAkB,kBA4BvB;IAEK,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CA8BlC;IAEK,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAO7B;CACF;eAEc,YAAY"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,IAAI,MAAM,WAAW,CAAA;AAI5B,OAAO,OAAO,MAAM,SAAS,CAAA;AAK7B,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAC7D,OAAO,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAA;AAM5D,cAAc,mBAAmB,CAAA;AACjC,OAAO,EAAE,KAAK,gBAAgB,EAAE,MAAM,wBAAwB,CAAA;AAC9D,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AACxC,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAC3E,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAA;AACzC,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAExC,qBAAa,YAAY;IAChB,GAAG,EAAE,UAAU,CAAA;IACf,GAAG,EAAE,OAAO,CAAC,WAAW,CAAA;IACxB,MAAM,CAAC,EAAE,IAAI,CAAC,MAAM,CAAA;IAC3B,OAAO,CAAC,UAAU,CAAC,CAA+B;IAClD,OAAO,CAAC,eAAe,CAAC,CAAgB;IAExC,YAAY,IAAI,EAAE;QAAE,GAAG,EAAE,UAAU,CAAC;QAAC,GAAG,EAAE,OAAO,CAAC,WAAW,CAAA;KAAE,EAG9D;IAED,OAAa,MAAM,CACjB,GAAG,EAAE,WAAW,EAChB,OAAO,EAAE,YAAY,EACrB,SAAS,CAAC,EAAE,OAAO,CAAC,iBAAiB,CAAC,GACrC,OAAO,CAAC,YAAY,CAAC,CA0BvB;IAEK,kBAAkB,kBA4BvB;IAEK,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAgClC;IAEK,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAkB7B;CACF;eAEc,YAAY"}
package/dist/index.js CHANGED
@@ -2,10 +2,8 @@ import events from 'node:events';
2
2
  import compression from 'compression';
3
3
  import cors from 'cors';
4
4
  import express from 'express';
5
- // eslint-disable-next-line import/default, import/no-named-as-default-member
5
+ // eslint-disable-next-line import/default
6
6
  import httpTerminator from 'http-terminator';
7
- // eslint-disable-next-line import/no-named-as-default-member
8
- const { createHttpTerminator } = httpTerminator;
9
7
  import { DAY, SECOND } from '@atproto/common';
10
8
  import API, { health, wellKnown } from './api/index.js';
11
9
  import { AppContext } from './context.js';
@@ -73,32 +71,44 @@ export class OzoneService {
73
71
  // Any moderator that are configured via env var may not exist in the database
74
72
  // so we need to sync them from env var to the database
75
73
  await this.seedInitialMembers();
76
- const { db, backgroundQueue } = this.ctx;
77
74
  this.dbStatsInterval = setInterval(() => {
78
75
  dbLogger.info({
79
- idleCount: db.pool.idleCount,
80
- totalCount: db.pool.totalCount,
81
- waitingCount: db.pool.waitingCount,
76
+ idleCount: this.ctx.db.pool.idleCount,
77
+ totalCount: this.ctx.db.pool.totalCount,
78
+ waitingCount: this.ctx.db.pool.waitingCount,
82
79
  }, 'db pool stats');
83
- dbLogger.info(backgroundQueue.getStats(), 'background queue stats');
80
+ dbLogger.info(this.ctx.backgroundQueue.getStats(), 'background queue stats');
84
81
  }, 10000);
85
82
  await this.ctx.sequencer.start();
86
83
  const server = this.app.listen(this.ctx.cfg.service.port);
87
84
  this.server = server;
88
85
  server.keepAliveTimeout = 90000;
89
- this.terminator = createHttpTerminator({ server });
86
+ this.terminator = httpTerminator.createHttpTerminator({ server });
90
87
  await events.once(server, 'listening');
91
88
  const { port } = server.address();
92
89
  this.ctx.assignPort(port);
93
90
  return server;
94
91
  }
95
92
  async destroy() {
96
- await this.terminator?.terminate();
97
- await this.ctx.backgroundQueue.destroy();
98
- await this.ctx.sequencer.destroy();
99
- await this.ctx.db.close();
100
93
  clearInterval(this.dbStatsInterval);
101
94
  this.dbStatsInterval = undefined;
95
+ // @TODO Use a disposable stack when Node24 becomes the min supported version
96
+ try {
97
+ await this.terminator?.terminate();
98
+ }
99
+ finally {
100
+ try {
101
+ await this.ctx.backgroundQueue.destroy();
102
+ }
103
+ finally {
104
+ try {
105
+ await this.ctx.sequencer.destroy();
106
+ }
107
+ finally {
108
+ await this.ctx.db.close();
109
+ }
110
+ }
111
+ }
102
112
  }
103
113
  }
104
114
  export default OzoneService;
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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","sourcesContent":["import events from 'node:events'\nimport http from 'node:http'\nimport { AddressInfo } from 'node:net'\nimport compression from 'compression'\nimport cors from 'cors'\nimport express from 'express'\n// eslint-disable-next-line import/default, import/no-named-as-default-member\nimport httpTerminator from 'http-terminator'\n// eslint-disable-next-line import/no-named-as-default-member\nconst { createHttpTerminator } = httpTerminator\ntype HttpTerminator = ReturnType<typeof createHttpTerminator>\nimport { DAY, SECOND } from '@atproto/common'\nimport API, { health, wellKnown } from './api/index.js'\nimport { OzoneConfig, OzoneSecrets } from './config/index.js'\nimport { AppContext, AppContextOptions } from './context.js'\nimport { Member } from './db/schema/member.js'\nimport * as error from './error.js'\nimport { createServer } from './lexicon/index.js'\nimport { dbLogger, loggerMiddleware } from './logger.js'\n\nexport * from './config/index.js'\nexport { type ImageInvalidator } from './image-invalidator.js'\nexport { Database } from './db/index.js'\nexport { EventPusher, EventReverser, OzoneDaemon } from './daemon/index.js'\nexport { AppContext } from './context.js'\nexport { httpLogger } from './logger.js'\n\nexport class OzoneService {\n public ctx: AppContext\n public app: express.Application\n public server?: http.Server\n private terminator?: HttpTerminator\n private dbStatsInterval?: NodeJS.Timeout\n\n constructor(opts: { ctx: AppContext; app: express.Application }) {\n this.ctx = opts.ctx\n this.app = opts.app\n }\n\n static async create(\n cfg: OzoneConfig,\n secrets: OzoneSecrets,\n overrides?: Partial<AppContextOptions>,\n ): Promise<OzoneService> {\n const app = express()\n app.set('trust proxy', true)\n app.use(cors({ maxAge: DAY / SECOND }))\n app.use(loggerMiddleware)\n app.use(compression())\n\n const ctx = await AppContext.fromConfig(cfg, secrets, overrides)\n\n let server = createServer({\n validateResponse: false,\n payload: {\n jsonLimit: 100 * 1024, // 100kb\n textLimit: 100 * 1024, // 100kb\n blobLimit: 5 * 1024 * 1024, // 5mb\n },\n })\n\n server = API(server, ctx)\n\n app.use(health.createRouter(ctx))\n app.use(wellKnown.createRouter(ctx))\n app.use(server.xrpc.router)\n app.use(error.handler)\n\n return new OzoneService({ ctx, app })\n }\n\n async seedInitialMembers() {\n const members: Array<{ role: Member['role']; did: string }> = []\n this.ctx.cfg.access.admins.forEach((did) =>\n members.push({\n role: 'tools.ozone.team.defs#roleAdmin',\n did,\n }),\n )\n this.ctx.cfg.access.triage.forEach((did) =>\n members.push({\n role: 'tools.ozone.team.defs#roleTriage',\n did,\n }),\n )\n this.ctx.cfg.access.moderators.forEach((did) =>\n members.push({\n role: 'tools.ozone.team.defs#roleModerator',\n did,\n }),\n )\n\n for (const member of members) {\n const service = this.ctx.teamService(this.ctx.db)\n await service.upsert({\n ...member,\n lastUpdatedBy: this.ctx.cfg.service.did,\n })\n }\n }\n\n async start(): Promise<http.Server> {\n if (this.dbStatsInterval) {\n throw new Error(`${this.constructor.name} already started`)\n }\n\n // Any moderator that are configured via env var may not exist in the database\n // so we need to sync them from env var to the database\n await this.seedInitialMembers()\n\n const { db, backgroundQueue } = this.ctx\n this.dbStatsInterval = setInterval(() => {\n dbLogger.info(\n {\n idleCount: db.pool.idleCount,\n totalCount: db.pool.totalCount,\n waitingCount: db.pool.waitingCount,\n },\n 'db pool stats',\n )\n dbLogger.info(backgroundQueue.getStats(), 'background queue stats')\n }, 10000)\n await this.ctx.sequencer.start()\n const server = this.app.listen(this.ctx.cfg.service.port)\n this.server = server\n server.keepAliveTimeout = 90000\n this.terminator = createHttpTerminator({ server })\n await events.once(server, 'listening')\n const { port } = server.address() as AddressInfo\n this.ctx.assignPort(port)\n return server\n }\n\n async destroy(): Promise<void> {\n await this.terminator?.terminate()\n await this.ctx.backgroundQueue.destroy()\n await this.ctx.sequencer.destroy()\n await this.ctx.db.close()\n clearInterval(this.dbStatsInterval)\n this.dbStatsInterval = undefined\n }\n}\n\nexport default OzoneService\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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","sourcesContent":["import events from 'node:events'\nimport http from 'node:http'\nimport { AddressInfo } from 'node:net'\nimport compression from 'compression'\nimport cors from 'cors'\nimport express from 'express'\n// eslint-disable-next-line import/default\nimport httpTerminator from 'http-terminator'\nimport { DAY, SECOND } from '@atproto/common'\nimport API, { health, wellKnown } from './api/index.js'\nimport { OzoneConfig, OzoneSecrets } from './config/index.js'\nimport { AppContext, AppContextOptions } from './context.js'\nimport { Member } from './db/schema/member.js'\nimport * as error from './error.js'\nimport { createServer } from './lexicon/index.js'\nimport { dbLogger, loggerMiddleware } from './logger.js'\n\nexport * from './config/index.js'\nexport { type ImageInvalidator } from './image-invalidator.js'\nexport { Database } from './db/index.js'\nexport { EventPusher, EventReverser, OzoneDaemon } from './daemon/index.js'\nexport { AppContext } from './context.js'\nexport { httpLogger } from './logger.js'\n\nexport class OzoneService {\n public ctx: AppContext\n public app: express.Application\n public server?: http.Server\n private terminator?: httpTerminator.HttpTerminator\n private dbStatsInterval?: NodeJS.Timeout\n\n constructor(opts: { ctx: AppContext; app: express.Application }) {\n this.ctx = opts.ctx\n this.app = opts.app\n }\n\n static async create(\n cfg: OzoneConfig,\n secrets: OzoneSecrets,\n overrides?: Partial<AppContextOptions>,\n ): Promise<OzoneService> {\n const app = express()\n app.set('trust proxy', true)\n app.use(cors({ maxAge: DAY / SECOND }))\n app.use(loggerMiddleware)\n app.use(compression())\n\n const ctx = await AppContext.fromConfig(cfg, secrets, overrides)\n\n let server = createServer({\n validateResponse: false,\n payload: {\n jsonLimit: 100 * 1024, // 100kb\n textLimit: 100 * 1024, // 100kb\n blobLimit: 5 * 1024 * 1024, // 5mb\n },\n })\n\n server = API(server, ctx)\n\n app.use(health.createRouter(ctx))\n app.use(wellKnown.createRouter(ctx))\n app.use(server.xrpc.router)\n app.use(error.handler)\n\n return new OzoneService({ ctx, app })\n }\n\n async seedInitialMembers() {\n const members: Array<{ role: Member['role']; did: string }> = []\n this.ctx.cfg.access.admins.forEach((did) =>\n members.push({\n role: 'tools.ozone.team.defs#roleAdmin',\n did,\n }),\n )\n this.ctx.cfg.access.triage.forEach((did) =>\n members.push({\n role: 'tools.ozone.team.defs#roleTriage',\n did,\n }),\n )\n this.ctx.cfg.access.moderators.forEach((did) =>\n members.push({\n role: 'tools.ozone.team.defs#roleModerator',\n did,\n }),\n )\n\n for (const member of members) {\n const service = this.ctx.teamService(this.ctx.db)\n await service.upsert({\n ...member,\n lastUpdatedBy: this.ctx.cfg.service.did,\n })\n }\n }\n\n async start(): Promise<http.Server> {\n if (this.dbStatsInterval) {\n throw new Error(`${this.constructor.name} already started`)\n }\n\n // Any moderator that are configured via env var may not exist in the database\n // so we need to sync them from env var to the database\n await this.seedInitialMembers()\n\n this.dbStatsInterval = setInterval(() => {\n dbLogger.info(\n {\n idleCount: this.ctx.db.pool.idleCount,\n totalCount: this.ctx.db.pool.totalCount,\n waitingCount: this.ctx.db.pool.waitingCount,\n },\n 'db pool stats',\n )\n dbLogger.info(\n this.ctx.backgroundQueue.getStats(),\n 'background queue stats',\n )\n }, 10000)\n await this.ctx.sequencer.start()\n const server = this.app.listen(this.ctx.cfg.service.port)\n this.server = server\n server.keepAliveTimeout = 90000\n this.terminator = httpTerminator.createHttpTerminator({ server })\n await events.once(server, 'listening')\n const { port } = server.address() as AddressInfo\n this.ctx.assignPort(port)\n return server\n }\n\n async destroy(): Promise<void> {\n clearInterval(this.dbStatsInterval)\n this.dbStatsInterval = undefined\n\n // @TODO Use a disposable stack when Node24 becomes the min supported version\n try {\n await this.terminator?.terminate()\n } finally {\n try {\n await this.ctx.backgroundQueue.destroy()\n } finally {\n try {\n await this.ctx.sequencer.destroy()\n } finally {\n await this.ctx.db.close()\n }\n }\n }\n }\n}\n\nexport default OzoneService\n"]}
@@ -54,7 +54,7 @@ export declare class Jetstream {
54
54
  /**
55
55
  * Closes the WebSocket connection.
56
56
  */
57
- close(): void;
57
+ close(): Promise<void>;
58
58
  }
59
59
  export {};
60
60
  //# sourceMappingURL=service.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../src/jetstream/service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAA;AAEvD,KAAK,eAAe,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;AAC9C,KAAK,gBAAgB,CAAC,CAAC,SAAS,eAAe,IAAI,CACjD,CAAC,EAAE,iBAAiB,CAAC,CAAC,CAAC,KACpB,OAAO,CAAC,IAAI,CAAC,CAAA;AAElB,MAAM,MAAM,gBAAgB,GAAG;IAC7B,QAAQ,EAAE,MAAM,CAAA;IAChB;;;OAGG;IACH,iBAAiB,CAAC,EAAE,MAAM,EAAE,CAAA;IAC5B;;;OAGG;IACH,UAAU,CAAC,EAAE,MAAM,EAAE,CAAA;IAErB;;OAEG;IACH,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB,CAAA;AACD,MAAM,MAAM,SAAS,GAAG;IACtB,GAAG,EAAE,MAAM,CAAA;IACX,OAAO,EAAE,MAAM,CAAA;IAEf,IAAI,EAAE,QAAQ,CAAA;CACf,CAAA;AACD,MAAM,MAAM,UAAU,GAAG;IACvB,UAAU,EAAE,MAAM,CAAA;IAClB,IAAI,EAAE,MAAM,CAAA;IACZ,GAAG,EAAE,MAAM,CAAA;CACZ,CAAA;AACD,MAAM,WAAW,iBAAiB,CAAC,UAAU,SAAS,eAAe,CACnE,SAAQ,SAAS;IACjB,IAAI,EAAE,QAAQ,CAAA;IACd,MAAM,EAAE;QACN,SAAS,EAAE,QAAQ,CAAA;QACnB,MAAM,EAAE,UAAU,CAAA;KACnB,GAAG,UAAU,CAAA;CACf;AAED,MAAM,WAAW,iBAAkB,SAAQ,SAAS;IAClD,IAAI,EAAE,QAAQ,CAAA;IACd,MAAM,EAAE;QACN,SAAS,EAAE,QAAQ,CAAA;KACpB,GAAG,UAAU,CAAA;CACf;AAED,qBAAa,SAAS;IACb,EAAE,CAAC,EAAE,kBAAkB,CAAA;IACvB,GAAG,EAAE,GAAG,CAAA;IACf,0BAA0B;IACnB,MAAM,CAAC,EAAE,MAAM,CAAA;IAEtB,YAAY,IAAI,EAAE,gBAAgB,EASjC;IAEK,KAAK,CAAC,OAAO,EAAE;QACnB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,GAAG,CAAC,CAAC,CAAA;QAChD,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,EAAE,iBAAiB,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC,CAAA;KACnE,iBAwBA;IAED;;OAEG;IACH,KAAK,SAEJ;CACF"}
1
+ {"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../src/jetstream/service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAA;AAEvD,KAAK,eAAe,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;AAC9C,KAAK,gBAAgB,CAAC,CAAC,SAAS,eAAe,IAAI,CACjD,CAAC,EAAE,iBAAiB,CAAC,CAAC,CAAC,KACpB,OAAO,CAAC,IAAI,CAAC,CAAA;AAElB,MAAM,MAAM,gBAAgB,GAAG;IAC7B,QAAQ,EAAE,MAAM,CAAA;IAChB;;;OAGG;IACH,iBAAiB,CAAC,EAAE,MAAM,EAAE,CAAA;IAC5B;;;OAGG;IACH,UAAU,CAAC,EAAE,MAAM,EAAE,CAAA;IAErB;;OAEG;IACH,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB,CAAA;AACD,MAAM,MAAM,SAAS,GAAG;IACtB,GAAG,EAAE,MAAM,CAAA;IACX,OAAO,EAAE,MAAM,CAAA;IAEf,IAAI,EAAE,QAAQ,CAAA;CACf,CAAA;AACD,MAAM,MAAM,UAAU,GAAG;IACvB,UAAU,EAAE,MAAM,CAAA;IAClB,IAAI,EAAE,MAAM,CAAA;IACZ,GAAG,EAAE,MAAM,CAAA;CACZ,CAAA;AACD,MAAM,WAAW,iBAAiB,CAAC,UAAU,SAAS,eAAe,CACnE,SAAQ,SAAS;IACjB,IAAI,EAAE,QAAQ,CAAA;IACd,MAAM,EAAE;QACN,SAAS,EAAE,QAAQ,CAAA;QACnB,MAAM,EAAE,UAAU,CAAA;KACnB,GAAG,UAAU,CAAA;CACf;AAED,MAAM,WAAW,iBAAkB,SAAQ,SAAS;IAClD,IAAI,EAAE,QAAQ,CAAA;IACd,MAAM,EAAE;QACN,SAAS,EAAE,QAAQ,CAAA;KACpB,GAAG,UAAU,CAAA;CACf;AAED,qBAAa,SAAS;IACb,EAAE,CAAC,EAAE,kBAAkB,CAAA;IACvB,GAAG,EAAE,GAAG,CAAA;IACf,0BAA0B;IACnB,MAAM,CAAC,EAAE,MAAM,CAAA;IAEtB,YAAY,IAAI,EAAE,gBAAgB,EASjC;IAEK,KAAK,CAAC,OAAO,EAAE;QACnB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,GAAG,CAAC,CAAC,CAAA;QAChD,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,EAAE,iBAAiB,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC,CAAA;KACnE,iBAwBA;IAED;;OAEG;IACG,KAAK,kBAIV;CACF"}
@@ -36,7 +36,9 @@ export class Jetstream {
36
36
  /**
37
37
  * Closes the WebSocket connection.
38
38
  */
39
- close() {
39
+ async close() {
40
+ // @TODO This should return a promise that fulfills when the connection is
41
+ // fully closed.
40
42
  this.ws?.ws?.close();
41
43
  }
42
44
  }