@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.
- package/CHANGELOG.md +24 -0
- package/dist/api/index.d.ts.map +1 -1
- package/dist/api/index.js +2 -0
- package/dist/api/index.js.map +1 -1
- package/dist/api/label/queryLabels.d.ts.map +1 -1
- package/dist/api/label/queryLabels.js +13 -21
- package/dist/api/label/queryLabels.js.map +1 -1
- package/dist/api/report/queryActivities.d.ts +4 -0
- package/dist/api/report/queryActivities.d.ts.map +1 -0
- package/dist/api/report/queryActivities.js +36 -0
- package/dist/api/report/queryActivities.js.map +1 -0
- package/dist/assignment/index.d.ts.map +1 -1
- package/dist/assignment/index.js +9 -12
- package/dist/assignment/index.js.map +1 -1
- package/dist/background.d.ts +5 -3
- package/dist/background.d.ts.map +1 -1
- package/dist/background.js +13 -4
- package/dist/background.js.map +1 -1
- package/dist/context.js +1 -1
- package/dist/context.js.map +1 -1
- package/dist/daemon/context.js +1 -1
- package/dist/daemon/context.js.map +1 -1
- package/dist/daemon/event-pusher.d.ts +7 -1
- package/dist/daemon/event-pusher.d.ts.map +1 -1
- package/dist/daemon/verification-listener.d.ts +1 -1
- package/dist/daemon/verification-listener.d.ts.map +1 -1
- package/dist/daemon/verification-listener.js +10 -4
- package/dist/daemon/verification-listener.js.map +1 -1
- package/dist/db/index.d.ts +4 -5
- package/dist/db/index.d.ts.map +1 -1
- package/dist/db/index.js +2 -1
- package/dist/db/index.js.map +1 -1
- package/dist/db/migrations/20241220T144630860Z-stats-materialized-views.d.ts +1 -2
- package/dist/db/migrations/20241220T144630860Z-stats-materialized-views.d.ts.map +1 -1
- package/dist/db/migrations/20241220T144630860Z-stats-materialized-views.js.map +1 -1
- package/dist/db/migrations/20250718T150931000Z-update-appeal-reason-stats.d.ts +1 -2
- package/dist/db/migrations/20250718T150931000Z-update-appeal-reason-stats.d.ts.map +1 -1
- package/dist/db/migrations/20250718T150931000Z-update-appeal-reason-stats.js.map +1 -1
- package/dist/db/migrations/20260602T120000000Z-add-report-activity-created-index.d.ts +4 -0
- package/dist/db/migrations/20260602T120000000Z-add-report-activity-created-index.d.ts.map +1 -0
- package/dist/db/migrations/20260602T120000000Z-add-report-activity-created-index.js +15 -0
- package/dist/db/migrations/20260602T120000000Z-add-report-activity-created-index.js.map +1 -0
- package/dist/db/migrations/index.d.ts +1 -0
- package/dist/db/migrations/index.d.ts.map +1 -1
- package/dist/db/migrations/index.js +1 -0
- package/dist/db/migrations/index.js.map +1 -1
- package/dist/db/migrations/provider.d.ts +2 -1
- package/dist/db/migrations/provider.d.ts.map +1 -1
- package/dist/db/migrations/provider.js.map +1 -1
- package/dist/db/pagination.d.ts +4 -3
- package/dist/db/pagination.d.ts.map +1 -1
- package/dist/db/pagination.js +4 -4
- package/dist/db/pagination.js.map +1 -1
- package/dist/db/types.d.ts +1 -1
- package/dist/db/types.d.ts.map +1 -1
- package/dist/db/types.js.map +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +23 -13
- package/dist/index.js.map +1 -1
- package/dist/jetstream/service.d.ts +1 -1
- package/dist/jetstream/service.d.ts.map +1 -1
- package/dist/jetstream/service.js +3 -1
- package/dist/jetstream/service.js.map +1 -1
- package/dist/lexicon/index.d.ts +11 -0
- package/dist/lexicon/index.d.ts.map +1 -1
- package/dist/lexicon/index.js +18 -0
- package/dist/lexicon/index.js.map +1 -1
- package/dist/lexicon/lexicons.d.ts +338 -0
- package/dist/lexicon/lexicons.d.ts.map +1 -1
- package/dist/lexicon/lexicons.js +173 -0
- package/dist/lexicon/lexicons.js.map +1 -1
- package/dist/lexicon/types/app/bsky/notification/defs.d.ts +1 -0
- package/dist/lexicon/types/app/bsky/notification/defs.d.ts.map +1 -1
- package/dist/lexicon/types/app/bsky/notification/defs.js.map +1 -1
- package/dist/lexicon/types/chat/bsky/notification/defs.d.ts +19 -0
- package/dist/lexicon/types/chat/bsky/notification/defs.d.ts.map +1 -0
- package/dist/lexicon/types/chat/bsky/notification/defs.js +19 -0
- package/dist/lexicon/types/chat/bsky/notification/defs.js.map +1 -0
- package/dist/lexicon/types/chat/bsky/notification/getPreferences.d.ts +20 -0
- package/dist/lexicon/types/chat/bsky/notification/getPreferences.d.ts.map +1 -0
- package/dist/lexicon/types/chat/bsky/notification/getPreferences.js +5 -0
- package/dist/lexicon/types/chat/bsky/notification/getPreferences.js.map +1 -0
- package/dist/lexicon/types/chat/bsky/notification/putPreferences.d.ts +26 -0
- package/dist/lexicon/types/chat/bsky/notification/putPreferences.d.ts.map +1 -0
- package/dist/lexicon/types/chat/bsky/notification/putPreferences.js +5 -0
- package/dist/lexicon/types/chat/bsky/notification/putPreferences.js.map +1 -0
- package/dist/lexicon/types/tools/ozone/report/defs.d.ts +1 -0
- package/dist/lexicon/types/tools/ozone/report/defs.d.ts.map +1 -1
- package/dist/lexicon/types/tools/ozone/report/defs.js.map +1 -1
- package/dist/lexicon/types/tools/ozone/report/queryActivities.d.ts +32 -0
- package/dist/lexicon/types/tools/ozone/report/queryActivities.d.ts.map +1 -0
- package/dist/lexicon/types/tools/ozone/report/queryActivities.js +5 -0
- package/dist/lexicon/types/tools/ozone/report/queryActivities.js.map +1 -0
- package/dist/mod-service/index.d.ts.map +1 -1
- package/dist/mod-service/index.js +28 -52
- package/dist/mod-service/index.js.map +1 -1
- package/dist/mod-service/report.d.ts +1 -0
- package/dist/mod-service/report.d.ts.map +1 -1
- package/dist/mod-service/report.js +16 -0
- package/dist/mod-service/report.js.map +1 -1
- package/dist/mod-service/status.d.ts +23 -128
- package/dist/mod-service/status.d.ts.map +1 -1
- package/dist/mod-service/views.js +7 -11
- package/dist/mod-service/views.js.map +1 -1
- package/dist/queue/service.js +1 -3
- package/dist/queue/service.js.map +1 -1
- package/dist/report/activity.d.ts +31 -2
- package/dist/report/activity.d.ts.map +1 -1
- package/dist/report/activity.js +27 -1
- package/dist/report/activity.js.map +1 -1
- package/dist/report/stats.d.ts.map +1 -1
- package/dist/report/stats.js.map +1 -1
- package/dist/scheduled-action/service.d.ts.map +1 -1
- package/dist/scheduled-action/service.js +16 -20
- package/dist/scheduled-action/service.js.map +1 -1
- package/dist/set/service.d.ts +10 -1
- package/dist/set/service.d.ts.map +1 -1
- package/dist/set/service.js +5 -2
- package/dist/set/service.js.map +1 -1
- package/dist/team/index.d.ts.map +1 -1
- package/dist/team/index.js +5 -4
- package/dist/team/index.js.map +1 -1
- package/dist/verification/issuer.d.ts +13 -3
- package/dist/verification/issuer.d.ts.map +1 -1
- package/dist/verification/service.d.ts +13 -1
- package/dist/verification/service.d.ts.map +1 -1
- package/dist/verification/service.js +1 -1
- package/dist/verification/service.js.map +1 -1
- package/package.json +12 -11
- package/src/api/index.ts +2 -0
- package/src/api/label/queryLabels.ts +11 -14
- package/src/api/report/queryActivities.ts +64 -0
- package/src/assignment/index.ts +15 -18
- package/src/background.ts +19 -4
- package/src/context.ts +1 -1
- package/src/daemon/context.ts +1 -1
- package/src/daemon/verification-listener.ts +9 -4
- package/src/db/index.ts +1 -1
- package/src/db/migrations/20241220T144630860Z-stats-materialized-views.ts +1 -2
- package/src/db/migrations/20250718T150931000Z-update-appeal-reason-stats.ts +1 -2
- package/src/db/migrations/20260602T120000000Z-add-report-activity-created-index.ts +17 -0
- package/src/db/migrations/index.ts +1 -0
- package/src/db/migrations/provider.ts +2 -1
- package/src/db/pagination.ts +18 -18
- package/src/db/types.ts +3 -1
- package/src/index.ts +25 -15
- package/src/jetstream/service.ts +3 -1
- package/src/mod-service/index.ts +78 -71
- package/src/mod-service/report.ts +24 -3
- package/src/mod-service/views.ts +16 -16
- package/src/queue/service.ts +5 -5
- package/src/report/activity.ts +47 -0
- package/src/report/stats.ts +5 -3
- package/src/scheduled-action/service.ts +22 -20
- package/src/set/service.ts +17 -14
- package/src/team/index.ts +6 -5
- package/src/verification/service.ts +2 -2
- package/tests/3p-labeler.test.ts +2 -2
- package/tests/_util.ts +8 -25
- package/tests/account-strikes.test.ts +1 -1
- package/tests/ack-all-subjects-of-account.test.ts +1 -1
- package/tests/age-assurance.test.ts +1 -1
- package/tests/blob-divert.test.ts +1 -1
- package/tests/communication-templates.test.ts +1 -1
- package/tests/content-tagger.test.ts +1 -1
- package/tests/db.test.ts +1 -1
- package/tests/expiring-label.test.ts +1 -1
- package/tests/expiring-tags.test.ts +1 -1
- package/tests/get-account-timeline.test.ts +1 -1
- package/tests/get-config.test.ts +1 -1
- package/tests/get-lists.test.ts +2 -1
- package/tests/get-profiles.test.ts +1 -1
- package/tests/get-record.test.ts +1 -1
- package/tests/get-records.test.ts +1 -1
- package/tests/get-repo.test.ts +1 -1
- package/tests/get-report.test.ts +1 -1
- package/tests/get-reporter-stats.test.ts +1 -1
- package/tests/get-repos.test.ts +1 -1
- package/tests/get-starter-pack.test.ts +1 -1
- package/tests/get-subjects.test.ts +1 -1
- package/tests/mod-tool.test.ts +1 -1
- package/tests/moderation-appeals.test.ts +1 -1
- package/tests/moderation-events.test.ts +1 -1
- package/tests/moderation-status-tags.test.ts +1 -1
- package/tests/moderation-statuses.test.ts +1 -1
- package/tests/moderation.test.ts +1 -1
- package/tests/protected-tags.test.ts +1 -1
- package/tests/query-labels.test.ts +1 -1
- package/tests/query-reports.test.ts +1 -1
- package/tests/queue-assignment.test.ts +1 -1
- package/tests/queue-router.test.ts +1 -1
- package/tests/queues.test.ts +1 -1
- package/tests/record-and-account-events.test.ts +1 -1
- package/tests/repo-search.test.ts +2 -2
- package/tests/report-action.test.ts +1 -1
- package/tests/report-activity.test.ts +145 -1
- package/tests/report-assignment.test.ts +1 -1
- package/tests/report-muting.test.ts +1 -1
- package/tests/report-reason.test.ts +1 -1
- package/tests/report-reassign-queue.test.ts +1 -1
- package/tests/report-routing.test.ts +1 -1
- package/tests/report-stats.test.ts +1 -1
- package/tests/revoke-account-credentials.test.ts +1 -1
- package/tests/safelink.test.ts +1 -1
- package/tests/scheduled-action-processor.test.ts +1 -1
- package/tests/scheduled-action.test.ts +1 -1
- package/tests/sequencer.test.ts +1 -1
- package/tests/server.test.ts +9 -12
- package/tests/sets.test.ts +1 -1
- package/tests/settings.test.ts +1 -1
- package/tests/strike-expiry-processor.test.ts +1 -1
- package/tests/subject-priority-score.test.ts +1 -1
- package/tests/takedown.test.ts +1 -1
- package/tests/team.test.ts +1 -1
- package/tests/verification-listener.test.ts +40 -13
- package/tests/verification.test.ts +1 -1
- package/tsconfig.build.tsbuildinfo +1 -1
package/dist/background.js
CHANGED
|
@@ -4,6 +4,10 @@ import { boundAbortController, isCausedBySignal, startInterval, } from './util.j
|
|
|
4
4
|
/**
|
|
5
5
|
* A simple queue for in-process, out-of-band/backgrounded work
|
|
6
6
|
*/
|
|
7
|
+
// @NOTE Keep this in sync with the BackgroundQueue in
|
|
8
|
+
// - packages/bsky/src/data-plane/server/background.ts
|
|
9
|
+
// - packages/ozone/src/background.ts
|
|
10
|
+
// - packages/pds/src/background.ts
|
|
7
11
|
export class BackgroundQueue {
|
|
8
12
|
get signal() {
|
|
9
13
|
return this.abortController.signal;
|
|
@@ -11,10 +15,10 @@ export class BackgroundQueue {
|
|
|
11
15
|
get destroyed() {
|
|
12
16
|
return this.signal.aborted;
|
|
13
17
|
}
|
|
14
|
-
constructor(db,
|
|
18
|
+
constructor(db, options) {
|
|
15
19
|
this.db = db;
|
|
16
20
|
this.abortController = new AbortController();
|
|
17
|
-
this.queue = new PQueue(
|
|
21
|
+
this.queue = new PQueue(options);
|
|
18
22
|
}
|
|
19
23
|
getStats() {
|
|
20
24
|
return {
|
|
@@ -59,7 +63,9 @@ export class BackgroundQueue {
|
|
|
59
63
|
});
|
|
60
64
|
}
|
|
61
65
|
async processAll() {
|
|
62
|
-
|
|
66
|
+
const { queue } = this;
|
|
67
|
+
while (queue.size || queue.pending)
|
|
68
|
+
await queue.onIdle();
|
|
63
69
|
}
|
|
64
70
|
/**
|
|
65
71
|
* On destroy we stop accepting new tasks, but complete all
|
|
@@ -68,8 +74,11 @@ export class BackgroundQueue {
|
|
|
68
74
|
* only once http connections have drained (tasks no longer being added).
|
|
69
75
|
*/
|
|
70
76
|
async destroy() {
|
|
77
|
+
if (this.destroyed) {
|
|
78
|
+
dbLogger.warn('BackgroundQueue.destroy() called multiple times');
|
|
79
|
+
}
|
|
71
80
|
this.abortController.abort();
|
|
72
|
-
|
|
81
|
+
return this.processAll();
|
|
73
82
|
}
|
|
74
83
|
}
|
|
75
84
|
/**
|
package/dist/background.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"background.js","sourceRoot":"","sources":["../src/background.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,SAAS,CAAA;AAE5B,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAA;AACtC,OAAO,EACL,oBAAoB,EACpB,gBAAgB,EAChB,aAAa,GACd,MAAM,WAAW,CAAA;
|
|
1
|
+
{"version":3,"file":"background.js","sourceRoot":"","sources":["../src/background.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,SAAS,CAAA;AAE5B,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAA;AACtC,OAAO,EACL,oBAAoB,EACpB,gBAAgB,EAChB,aAAa,GACd,MAAM,WAAW,CAAA;AAUlB;;GAEG;AACH,sDAAsD;AACtD,sDAAsD;AACtD,qCAAqC;AACrC,mCAAmC;AACnC,MAAM,OAAO,eAAe;IAI1B,IAAW,MAAM;QACf,OAAO,IAAI,CAAC,eAAe,CAAC,MAAM,CAAA;IACpC,CAAC;IAED,IAAW,SAAS;QAClB,OAAO,IAAI,CAAC,MAAM,CAAC,OAAO,CAAA;IAC5B,CAAC;IAED,YACY,EAAY,EACtB,OAA+B;QADrB,OAAE,GAAF,EAAE,CAAU;QAZhB,oBAAe,GAAG,IAAI,eAAe,EAAE,CAAA;QAe7C,IAAI,CAAC,KAAK,GAAG,IAAI,MAAM,CAAC,OAAO,CAAC,CAAA;IAClC,CAAC;IAED,QAAQ;QACN,OAAO;YACL,YAAY,EAAE,IAAI,CAAC,KAAK,CAAC,OAAO;YAChC,YAAY,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI;SAC9B,CAAA;IACH,CAAC;IAED;;;;;;;;OAQG;IACH,KAAK,CAAC,GAAG,CAAC,IAAU,EAAE,MAAoB;QACxC,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACnB,OAAM;QACR,CAAC;QAED,MAAM,eAAe,GAAG,oBAAoB,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;QAEjE,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAO,KAAK,IAAI,EAAE;YACrC,IAAI,CAAC;gBACH,oEAAoE;gBACpE,oEAAoE;gBACpE,oEAAoE;gBACpE,IAAI,MAAM,EAAE,OAAO;oBAAE,OAAM;gBAE3B,oEAAoE;gBACpE,oEAAoE;gBACpE,WAAW;gBACX,MAAM,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,eAAe,CAAC,MAAM,CAAC,CAAA;YAC7C,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,IAAI,CAAC,gBAAgB,CAAC,GAAG,EAAE,eAAe,CAAC,MAAM,CAAC,EAAE,CAAC;oBACnD,QAAQ,CAAC,KAAK,CAAC,EAAE,GAAG,EAAE,EAAE,8BAA8B,CAAC,CAAA;gBACzD,CAAC;YACH,CAAC;oBAAS,CAAC;gBACT,eAAe,CAAC,KAAK,EAAE,CAAA;YACzB,CAAC;QACH,CAAC,CAAC,CAAA;IACJ,CAAC;IAED,KAAK,CAAC,UAAU;QACd,MAAM,EAAE,KAAK,EAAE,GAAG,IAAI,CAAA;QACtB,OAAO,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,OAAO;YAAE,MAAM,KAAK,CAAC,MAAM,EAAE,CAAA;IAC1D,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,OAAO;QACX,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACnB,QAAQ,CAAC,IAAI,CAAC,iDAAiD,CAAC,CAAA;QAClE,CAAC;QAED,IAAI,CAAC,eAAe,CAAC,KAAK,EAAE,CAAA;QAC5B,OAAO,IAAI,CAAC,UAAU,EAAE,CAAA;IAC1B,CAAC;CACF;AAED;;;;;GAKG;AACH,MAAM,OAAO,sBAAsB;IAMjC,IAAW,MAAM;QACf,OAAO,IAAI,CAAC,eAAe,CAAC,MAAM,CAAA;IACpC,CAAC;IAED,IAAW,SAAS;QAClB,OAAO,IAAI,CAAC,MAAM,CAAC,OAAO,CAAA;IAC5B,CAAC;IAED,YACY,eAAgC,EAChC,QAAgB,EAChB,IAAU;+BAFV,eAAe;wBACf,QAAQ;oBACR,IAAI;QAEd,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,QAAQ,IAAI,CAAC,EAAE,CAAC;YAChD,MAAM,IAAI,SAAS,CAAC,oCAAoC,CAAC,CAAA;QAC3D,CAAC;QAED,4EAA4E;QAC5E,gDAAgD;QAChD,IAAI,CAAC,eAAe,GAAG,oBAAoB,CAAC,eAAe,CAAC,MAAM,CAAC,CAAA;IACrE,CAAC;IAEM,GAAG,CAAC,MAAoB;QAC7B,wEAAwE;QACxE,2EAA2E;QAC3E,2EAA2E;QAC3E,4CAA4C;QAE5C,IAAI,IAAI,CAAC,cAAc;YAAE,OAAO,IAAI,CAAC,cAAc,CAAA;QAEnD,gEAAgE;QAChE,MAAM,eAAe,GAAG,oBAAoB,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;QAEjE,MAAM,OAAO,GAAG,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,eAAe,CAAC,MAAM,CAAC,CAAA;QAE3E,OAAO,CAAC,IAAI,CAAC,cAAc,GAAG,OAAO,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE;YAClD,IAAI,IAAI,CAAC,cAAc,KAAK,OAAO;gBAAE,IAAI,CAAC,cAAc,GAAG,SAAS,CAAA;YAEpE,wDAAwD;YACxD,eAAe,CAAC,KAAK,EAAE,CAAA;QACzB,CAAC,CAAC,CAAA;IACJ,CAAC;IAEM,KAAK;QACV,yEAAyE;QACzE,cAAc;QACd,IAAI,CAAC,eAAe,KAAK,aAAa,CACpC,KAAK,EAAE,MAAM,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,EAClC,IAAI,CAAC,QAAQ,EACb,IAAI,CAAC,MAAM,CACZ,CAAA;IACH,CAAC;IAEM,KAAK,CAAC,OAAO;QAClB,uEAAuE;QACvE,mBAAmB;QAEnB,IAAI,CAAC,eAAe,CAAC,KAAK,EAAE,CAAA;QAE5B,MAAM,IAAI,CAAC,eAAe,CAAA;QAC1B,IAAI,CAAC,eAAe,GAAG,SAAS,CAAA;IAClC,CAAC;CACF","sourcesContent":["import PQueue from 'p-queue'\nimport { Database } from './db/index.js'\nimport { dbLogger } from './logger.js'\nimport {\n boundAbortController,\n isCausedBySignal,\n startInterval,\n} from './util.js'\n\ntype Task = (db: Database, signal: AbortSignal) => Promise<void>\n\nexport type BackgroundQueueOptions = NonNullable<\n ConstructorParameters<typeof PQueue>[0]\n> & {\n concurrency: number\n}\n\n/**\n * A simple queue for in-process, out-of-band/backgrounded work\n */\n// @NOTE Keep this in sync with the BackgroundQueue in\n// - packages/bsky/src/data-plane/server/background.ts\n// - packages/ozone/src/background.ts\n// - packages/pds/src/background.ts\nexport class BackgroundQueue {\n private abortController = new AbortController()\n private queue: PQueue\n\n public get signal(): AbortSignal {\n return this.abortController.signal\n }\n\n public get destroyed() {\n return this.signal.aborted\n }\n\n constructor(\n protected db: Database,\n options: BackgroundQueueOptions,\n ) {\n this.queue = new PQueue(options)\n }\n\n getStats() {\n return {\n runningCount: this.queue.pending,\n waitingCount: this.queue.size,\n }\n }\n\n /**\n * Add a task that will be executed at some point in the future.\n *\n * The task will be executed even if the backgroundQueue is destroyed, unless\n * the provided `signal` is aborted.\n *\n * The `signal` provided to the task will be aborted whenever either the\n * backgroundQueue is destroyed or the provided `signal` is aborted.\n */\n async add(task: Task, signal?: AbortSignal): Promise<void> {\n if (this.destroyed) {\n return\n }\n\n const abortController = boundAbortController(this.signal, signal)\n\n return this.queue.add<void>(async () => {\n try {\n // Do not run the task if the signal provided to the task has become\n // aborted. Do not use `abortController.signal` here since we do not\n // want to abort the task if the backgroundQueue is being destroyed.\n if (signal?.aborted) return\n\n // The task will receive a \"combined signal\" allowing it to abort if\n // either the backgroundQueue is destroyed or the provided signal is\n // aborted.\n await task(this.db, abortController.signal)\n } catch (err) {\n if (!isCausedBySignal(err, abortController.signal)) {\n dbLogger.error({ err }, 'background queue task failed')\n }\n } finally {\n abortController.abort()\n }\n })\n }\n\n async processAll() {\n const { queue } = this\n while (queue.size || queue.pending) await queue.onIdle()\n }\n\n /**\n * On destroy we stop accepting new tasks, but complete all\n * pending/in-progress tasks. Tasks can decide to abort their current\n * operation based on the signal they received. The application calls this\n * only once http connections have drained (tasks no longer being added).\n */\n async destroy() {\n if (this.destroyed) {\n dbLogger.warn('BackgroundQueue.destroy() called multiple times')\n }\n\n this.abortController.abort()\n return this.processAll()\n }\n}\n\n/**\n * A simple periodic background task runner. This class will schedule a task to\n * run through a provided {@link BackgroundQueue} at a fixed interval. The task\n * will never run more than once concurrently, and will wait at least `interval`\n * milliseconds between the end of one run and the start of the next.\n */\nexport class PeriodicBackgroundTask {\n private abortController: AbortController\n\n private intervalPromise?: Promise<void>\n private runningPromise?: Promise<void>\n\n public get signal(): AbortSignal {\n return this.abortController.signal\n }\n\n public get destroyed() {\n return this.signal.aborted\n }\n\n constructor(\n protected backgroundQueue: BackgroundQueue,\n protected interval: number,\n protected task: Task,\n ) {\n if (!Number.isFinite(interval) || interval <= 0) {\n throw new TypeError('interval must be a positive number')\n }\n\n // Bind this class's signal to the backgroundQueue's signal (destroying this\n // instance if the backgroundQueue is destroyed)\n this.abortController = boundAbortController(backgroundQueue.signal)\n }\n\n public run(signal?: AbortSignal): Promise<void> {\n // `startInterval` already ensures that only one run is in progress at a\n // time. However, we want to be able to expose a `run()` method that can be\n // used to force a run, which could cause concurrent executions. We prevent\n // this using the `runningPromise` property.\n\n if (this.runningPromise) return this.runningPromise\n\n // Combine the `this.signal` with the provided `signal`, if any.\n const abortController = boundAbortController(this.signal, signal)\n\n const promise = this.backgroundQueue.add(this.task, abortController.signal)\n\n return (this.runningPromise = promise).finally(() => {\n if (this.runningPromise === promise) this.runningPromise = undefined\n\n // Cleanup the listeners added by `boundAbortController`\n abortController.abort()\n })\n }\n\n public start() {\n // Noop if already started. Throws if this.signal is aborted (instance is\n // destroyed).\n this.intervalPromise ||= startInterval(\n async (signal) => this.run(signal),\n this.interval,\n this.signal,\n )\n }\n\n public async destroy() {\n // @NOTE This instance does not \"own\" the backgroundQueue, so we do not\n // destroy it here.\n\n this.abortController.abort()\n\n await this.intervalPromise\n this.intervalPromise = undefined\n }\n}\n"]}
|
package/dist/context.js
CHANGED
|
@@ -58,7 +58,7 @@ export class AppContext {
|
|
|
58
58
|
lxm,
|
|
59
59
|
keypair: signingKey,
|
|
60
60
|
});
|
|
61
|
-
const backgroundQueue = new BackgroundQueue(db);
|
|
61
|
+
const backgroundQueue = new BackgroundQueue(db, { concurrency: 20 });
|
|
62
62
|
const blobDiverter = cfg.blobDivert
|
|
63
63
|
? new BlobDiverter(db, {
|
|
64
64
|
idResolver,
|
package/dist/context.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"context.js","sourceRoot":"","sources":["../src/context.ts"],"names":[],"mappings":"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","sourcesContent":["import assert from 'node:assert'\nimport * as plc from '@did-plc/lib'\nimport express from 'express'\nimport { AtpAgent } from '@atproto/api'\nimport { Keypair, Secp256k1Keypair } from '@atproto/crypto'\nimport { DidCache, IdResolver, MemoryCache } from '@atproto/identity'\nimport { createServiceAuthHeaders } from '@atproto/xrpc-server'\nimport { AssignmentService } from './assignment/index.js'\nimport { AuthVerifier } from './auth-verifier.js'\nimport { BackgroundQueue } from './background.js'\nimport {\n CommunicationTemplateService,\n CommunicationTemplateServiceCreator,\n} from './communication-service/template.js'\nimport { OzoneConfig, OzoneSecrets } from './config/index.js'\nimport { BlobDiverter } from './daemon/blob-diverter.js'\nimport { EventPusher } from './daemon/index.js'\nimport { Database } from './db/index.js'\nimport { ImageInvalidator } from './image-invalidator.js'\nimport {\n ModerationService,\n ModerationServiceCreator,\n} from './mod-service/index.js'\nimport {\n ModerationServiceProfile,\n ModerationServiceProfileCreator,\n} from './mod-service/profile.js'\nimport { StrikeService, StrikeServiceCreator } from './mod-service/strike.js'\nimport { QueueService, QueueServiceCreator } from './queue/service.js'\nimport {\n ReportStatsService,\n ReportStatsServiceCreator,\n} from './report/stats.js'\nimport {\n SafelinkRuleService,\n SafelinkRuleServiceCreator,\n} from './safelink/service.js'\nimport {\n ScheduledActionService,\n ScheduledActionServiceCreator,\n} from './scheduled-action/service.js'\nimport { Sequencer } from './sequencer/sequencer.js'\nimport { SetService, SetServiceCreator } from './set/service.js'\nimport { SettingService, SettingServiceCreator } from './setting/service.js'\nimport { TeamService, TeamServiceCreator } from './team/index.js'\nimport {\n LABELER_HEADER_NAME,\n ParsedLabelers,\n defaultLabelerHeader,\n getSigningKeyId,\n parseLabelerHeader,\n} from './util.js'\nimport {\n VerificationIssuer,\n VerificationIssuerCreator,\n} from './verification/issuer.js'\nimport {\n VerificationService,\n VerificationServiceCreator,\n} from './verification/service.js'\n\nexport type AppContextOptions = {\n db: Database\n cfg: OzoneConfig\n modService: ModerationServiceCreator\n moderationServiceProfile: ModerationServiceProfileCreator\n communicationTemplateService: CommunicationTemplateServiceCreator\n safelinkRuleService: SafelinkRuleServiceCreator\n scheduledActionService: ScheduledActionServiceCreator\n queueService: QueueServiceCreator\n reportStatsService: ReportStatsServiceCreator\n setService: SetServiceCreator\n settingService: SettingServiceCreator\n strikeService: StrikeServiceCreator\n teamService: TeamServiceCreator\n appviewAgent: AtpAgent\n pdsAgent: AtpAgent | undefined\n chatAgent: AtpAgent | undefined\n blobDiverter?: BlobDiverter\n signingKey: Keypair\n signingKeyId: number\n didCache: DidCache\n idResolver: IdResolver\n imgInvalidator?: ImageInvalidator\n backgroundQueue: BackgroundQueue\n sequencer: Sequencer\n assignmentService: AssignmentService\n authVerifier: AuthVerifier\n verificationService: VerificationServiceCreator\n verificationIssuer: VerificationIssuerCreator\n}\n\nexport class AppContext {\n constructor(\n private opts: AppContextOptions,\n private secrets: OzoneSecrets,\n ) {}\n\n static async fromConfig(\n cfg: OzoneConfig,\n secrets: OzoneSecrets,\n overrides?: Partial<AppContextOptions>,\n ): Promise<AppContext> {\n const db = new Database({\n url: cfg.db.postgresUrl,\n schema: cfg.db.postgresSchema,\n poolSize: cfg.db.poolSize,\n poolMaxUses: cfg.db.poolMaxUses,\n poolIdleTimeoutMs: cfg.db.poolIdleTimeoutMs,\n })\n const signingKey = await Secp256k1Keypair.import(secrets.signingKeyHex)\n const signingKeyId = await getSigningKeyId(db, signingKey.did())\n const appviewAgent = new AtpAgent({ service: cfg.appview.url })\n const pdsAgent = cfg.pds\n ? new AtpAgent({ service: cfg.pds.url })\n : undefined\n const chatAgent = cfg.chat\n ? new AtpAgent({ service: cfg.chat.url })\n : undefined\n\n const didCache = new MemoryCache(\n cfg.identity.cacheStaleTTL,\n cfg.identity.cacheMaxTTL,\n )\n const idResolver = new IdResolver({\n plcUrl: cfg.identity.plcUrl,\n didCache,\n })\n\n const createAuthHeaders = (aud: string, lxm: string) =>\n createServiceAuthHeaders({\n iss: `${cfg.service.did}#atproto_labeler`,\n aud,\n lxm,\n keypair: signingKey,\n })\n\n const backgroundQueue = new BackgroundQueue(db)\n const blobDiverter = cfg.blobDivert\n ? new BlobDiverter(db, {\n idResolver,\n serviceConfig: cfg.blobDivert,\n })\n : undefined\n const eventPusher = new EventPusher(db, createAuthHeaders, {\n appview: cfg.appview.pushEvents ? cfg.appview : undefined,\n pds: cfg.pds ?? undefined,\n })\n\n const communicationTemplateService = CommunicationTemplateService.creator()\n const safelinkRuleService = SafelinkRuleService.creator()\n const scheduledActionService = ScheduledActionService.creator()\n const teamService = TeamService.creator(\n appviewAgent,\n cfg.appview.did,\n createAuthHeaders,\n )\n const queueService = QueueService.creator()\n const reportStatsService = ReportStatsService.creator()\n const setService = SetService.creator()\n const settingService = SettingService.creator()\n const strikeService = StrikeService.creator()\n const verificationService = VerificationService.creator()\n const verificationIssuer = VerificationIssuer.creator()\n const moderationServiceProfile = ModerationServiceProfile.creator(\n cfg,\n appviewAgent,\n )\n const modService = ModerationService.creator(\n signingKey,\n signingKeyId,\n cfg,\n backgroundQueue,\n idResolver,\n eventPusher,\n appviewAgent,\n createAuthHeaders,\n strikeService,\n overrides?.imgInvalidator,\n )\n const assignmentService = AssignmentService.creator(\n {\n queueDurationMs: cfg.assignments.queueDurationMs,\n reportDurationMs: cfg.assignments.reportDurationMs,\n },\n queueService,\n teamService,\n )(db)\n\n const sequencer = new Sequencer(modService(db))\n\n const authVerifier = new AuthVerifier(idResolver, {\n serviceDid: cfg.service.did,\n adminPassword: secrets.adminPassword,\n teamService: teamService(db),\n })\n\n return new AppContext(\n {\n db,\n cfg,\n modService,\n moderationServiceProfile,\n communicationTemplateService,\n safelinkRuleService,\n scheduledActionService,\n teamService,\n queueService,\n reportStatsService,\n setService,\n settingService,\n strikeService,\n appviewAgent,\n pdsAgent,\n chatAgent,\n signingKey,\n signingKeyId,\n didCache,\n idResolver,\n backgroundQueue,\n sequencer,\n assignmentService,\n authVerifier,\n blobDiverter,\n verificationService,\n verificationIssuer,\n ...(overrides ?? {}),\n },\n secrets,\n )\n }\n\n assignPort(port: number) {\n assert(\n !this.cfg.service.port || this.cfg.service.port === port,\n 'Conflicting port in config',\n )\n this.opts.cfg.service.port = port\n }\n\n get db(): Database {\n return this.opts.db\n }\n\n get cfg(): OzoneConfig {\n return this.opts.cfg\n }\n\n get modService(): ModerationServiceCreator {\n return this.opts.modService\n }\n\n get blobDiverter(): BlobDiverter | undefined {\n return this.opts.blobDiverter\n }\n\n get communicationTemplateService(): CommunicationTemplateServiceCreator {\n return this.opts.communicationTemplateService\n }\n\n get safelinkRuleService(): SafelinkRuleServiceCreator {\n return this.opts.safelinkRuleService\n }\n\n get scheduledActionService(): ScheduledActionServiceCreator {\n return this.opts.scheduledActionService\n }\n\n get teamService(): TeamServiceCreator {\n return this.opts.teamService\n }\n\n get queueService(): QueueServiceCreator {\n return this.opts.queueService\n }\n\n get reportStatsService(): ReportStatsServiceCreator {\n return this.opts.reportStatsService\n }\n\n get setService(): SetServiceCreator {\n return this.opts.setService\n }\n\n get settingService(): SettingServiceCreator {\n return this.opts.settingService\n }\n\n get strikeService(): StrikeServiceCreator {\n return this.opts.strikeService\n }\n\n get verificationService(): VerificationServiceCreator {\n return this.opts.verificationService\n }\n\n get verificationIssuer(): VerificationIssuerCreator {\n return this.opts.verificationIssuer\n }\n\n get moderationServiceProfile(): ModerationServiceProfileCreator {\n return this.opts.moderationServiceProfile\n }\n\n get appviewAgent(): AtpAgent {\n return this.opts.appviewAgent\n }\n\n get pdsAgent(): AtpAgent | undefined {\n return this.opts.pdsAgent\n }\n\n get chatAgent(): AtpAgent | undefined {\n return this.opts.chatAgent\n }\n\n get signingKey(): Keypair {\n return this.opts.signingKey\n }\n\n get signingKeyId(): number {\n return this.opts.signingKeyId\n }\n\n get plcClient(): plc.Client {\n return new plc.Client(this.cfg.identity.plcUrl)\n }\n\n get didCache(): DidCache {\n return this.opts.didCache\n }\n\n get idResolver(): IdResolver {\n return this.opts.idResolver\n }\n\n get backgroundQueue(): BackgroundQueue {\n return this.opts.backgroundQueue\n }\n\n get sequencer(): Sequencer {\n return this.opts.sequencer\n }\n\n get assignmentService(): AssignmentService {\n return this.opts.assignmentService\n }\n\n get authVerifier(): AuthVerifier {\n return this.opts.authVerifier\n }\n\n async serviceAuthHeaders(aud: string, lxm: string) {\n const iss = `${this.cfg.service.did}#atproto_labeler`\n return createServiceAuthHeaders({\n iss,\n aud,\n lxm,\n keypair: this.signingKey,\n })\n }\n\n async pdsAuth(lxm: string) {\n if (!this.cfg.pds) {\n return undefined\n }\n return this.serviceAuthHeaders(this.cfg.pds.did, lxm)\n }\n\n async appviewAuth(lxm: string) {\n return this.serviceAuthHeaders(this.cfg.appview.did, lxm)\n }\n\n async chatAuth(lxm: string) {\n if (!this.cfg.chat) {\n throw new Error('No chat service configured')\n }\n return this.serviceAuthHeaders(this.cfg.chat.did, lxm)\n }\n\n devOverride(overrides: Partial<AppContextOptions>) {\n this.opts = {\n ...this.opts,\n ...overrides,\n }\n }\n\n reqLabelers(req: express.Request): ParsedLabelers {\n const val = req.header(LABELER_HEADER_NAME)\n let parsed: ParsedLabelers | null\n try {\n parsed = parseLabelerHeader(val, this.cfg.service.did)\n } catch (err) {\n parsed = null\n }\n if (!parsed) return defaultLabelerHeader([])\n return parsed\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"context.js","sourceRoot":"","sources":["../src/context.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,aAAa,CAAA;AAChC,OAAO,KAAK,GAAG,MAAM,cAAc,CAAA;AAEnC,OAAO,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAA;AACvC,OAAO,EAAW,gBAAgB,EAAE,MAAM,iBAAiB,CAAA;AAC3D,OAAO,EAAY,UAAU,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AACrE,OAAO,EAAE,wBAAwB,EAAE,MAAM,sBAAsB,CAAA;AAC/D,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAA;AACzD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AACjD,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAA;AACjD,OAAO,EACL,4BAA4B,GAE7B,MAAM,qCAAqC,CAAA;AAE5C,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAA;AACxD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAC/C,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AAExC,OAAO,EACL,iBAAiB,GAElB,MAAM,wBAAwB,CAAA;AAC/B,OAAO,EACL,wBAAwB,GAEzB,MAAM,0BAA0B,CAAA;AACjC,OAAO,EAAE,aAAa,EAAwB,MAAM,yBAAyB,CAAA;AAC7E,OAAO,EAAE,YAAY,EAAuB,MAAM,oBAAoB,CAAA;AACtE,OAAO,EACL,kBAAkB,GAEnB,MAAM,mBAAmB,CAAA;AAC1B,OAAO,EACL,mBAAmB,GAEpB,MAAM,uBAAuB,CAAA;AAC9B,OAAO,EACL,sBAAsB,GAEvB,MAAM,+BAA+B,CAAA;AACtC,OAAO,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAA;AACpD,OAAO,EAAE,UAAU,EAAqB,MAAM,kBAAkB,CAAA;AAChE,OAAO,EAAE,cAAc,EAAyB,MAAM,sBAAsB,CAAA;AAC5E,OAAO,EAAE,WAAW,EAAsB,MAAM,iBAAiB,CAAA;AACjE,OAAO,EACL,mBAAmB,EAEnB,oBAAoB,EACpB,eAAe,EACf,kBAAkB,GACnB,MAAM,WAAW,CAAA;AAClB,OAAO,EACL,kBAAkB,GAEnB,MAAM,0BAA0B,CAAA;AACjC,OAAO,EACL,mBAAmB,GAEpB,MAAM,2BAA2B,CAAA;AAiClC,MAAM,OAAO,UAAU;IACrB,YACU,IAAuB,EACvB,OAAqB;oBADrB,IAAI;uBACJ,OAAO;IACd,CAAC;IAEJ,MAAM,CAAC,KAAK,CAAC,UAAU,CACrB,GAAgB,EAChB,OAAqB,EACrB,SAAsC;QAEtC,MAAM,EAAE,GAAG,IAAI,QAAQ,CAAC;YACtB,GAAG,EAAE,GAAG,CAAC,EAAE,CAAC,WAAW;YACvB,MAAM,EAAE,GAAG,CAAC,EAAE,CAAC,cAAc;YAC7B,QAAQ,EAAE,GAAG,CAAC,EAAE,CAAC,QAAQ;YACzB,WAAW,EAAE,GAAG,CAAC,EAAE,CAAC,WAAW;YAC/B,iBAAiB,EAAE,GAAG,CAAC,EAAE,CAAC,iBAAiB;SAC5C,CAAC,CAAA;QACF,MAAM,UAAU,GAAG,MAAM,gBAAgB,CAAC,MAAM,CAAC,OAAO,CAAC,aAAa,CAAC,CAAA;QACvE,MAAM,YAAY,GAAG,MAAM,eAAe,CAAC,EAAE,EAAE,UAAU,CAAC,GAAG,EAAE,CAAC,CAAA;QAChE,MAAM,YAAY,GAAG,IAAI,QAAQ,CAAC,EAAE,OAAO,EAAE,GAAG,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAA;QAC/D,MAAM,QAAQ,GAAG,GAAG,CAAC,GAAG;YACtB,CAAC,CAAC,IAAI,QAAQ,CAAC,EAAE,OAAO,EAAE,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC;YACxC,CAAC,CAAC,SAAS,CAAA;QACb,MAAM,SAAS,GAAG,GAAG,CAAC,IAAI;YACxB,CAAC,CAAC,IAAI,QAAQ,CAAC,EAAE,OAAO,EAAE,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;YACzC,CAAC,CAAC,SAAS,CAAA;QAEb,MAAM,QAAQ,GAAG,IAAI,WAAW,CAC9B,GAAG,CAAC,QAAQ,CAAC,aAAa,EAC1B,GAAG,CAAC,QAAQ,CAAC,WAAW,CACzB,CAAA;QACD,MAAM,UAAU,GAAG,IAAI,UAAU,CAAC;YAChC,MAAM,EAAE,GAAG,CAAC,QAAQ,CAAC,MAAM;YAC3B,QAAQ;SACT,CAAC,CAAA;QAEF,MAAM,iBAAiB,GAAG,CAAC,GAAW,EAAE,GAAW,EAAE,EAAE,CACrD,wBAAwB,CAAC;YACvB,GAAG,EAAE,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,kBAAkB;YACzC,GAAG;YACH,GAAG;YACH,OAAO,EAAE,UAAU;SACpB,CAAC,CAAA;QAEJ,MAAM,eAAe,GAAG,IAAI,eAAe,CAAC,EAAE,EAAE,EAAE,WAAW,EAAE,EAAE,EAAE,CAAC,CAAA;QACpE,MAAM,YAAY,GAAG,GAAG,CAAC,UAAU;YACjC,CAAC,CAAC,IAAI,YAAY,CAAC,EAAE,EAAE;gBACnB,UAAU;gBACV,aAAa,EAAE,GAAG,CAAC,UAAU;aAC9B,CAAC;YACJ,CAAC,CAAC,SAAS,CAAA;QACb,MAAM,WAAW,GAAG,IAAI,WAAW,CAAC,EAAE,EAAE,iBAAiB,EAAE;YACzD,OAAO,EAAE,GAAG,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS;YACzD,GAAG,EAAE,GAAG,CAAC,GAAG,IAAI,SAAS;SAC1B,CAAC,CAAA;QAEF,MAAM,4BAA4B,GAAG,4BAA4B,CAAC,OAAO,EAAE,CAAA;QAC3E,MAAM,mBAAmB,GAAG,mBAAmB,CAAC,OAAO,EAAE,CAAA;QACzD,MAAM,sBAAsB,GAAG,sBAAsB,CAAC,OAAO,EAAE,CAAA;QAC/D,MAAM,WAAW,GAAG,WAAW,CAAC,OAAO,CACrC,YAAY,EACZ,GAAG,CAAC,OAAO,CAAC,GAAG,EACf,iBAAiB,CAClB,CAAA;QACD,MAAM,YAAY,GAAG,YAAY,CAAC,OAAO,EAAE,CAAA;QAC3C,MAAM,kBAAkB,GAAG,kBAAkB,CAAC,OAAO,EAAE,CAAA;QACvD,MAAM,UAAU,GAAG,UAAU,CAAC,OAAO,EAAE,CAAA;QACvC,MAAM,cAAc,GAAG,cAAc,CAAC,OAAO,EAAE,CAAA;QAC/C,MAAM,aAAa,GAAG,aAAa,CAAC,OAAO,EAAE,CAAA;QAC7C,MAAM,mBAAmB,GAAG,mBAAmB,CAAC,OAAO,EAAE,CAAA;QACzD,MAAM,kBAAkB,GAAG,kBAAkB,CAAC,OAAO,EAAE,CAAA;QACvD,MAAM,wBAAwB,GAAG,wBAAwB,CAAC,OAAO,CAC/D,GAAG,EACH,YAAY,CACb,CAAA;QACD,MAAM,UAAU,GAAG,iBAAiB,CAAC,OAAO,CAC1C,UAAU,EACV,YAAY,EACZ,GAAG,EACH,eAAe,EACf,UAAU,EACV,WAAW,EACX,YAAY,EACZ,iBAAiB,EACjB,aAAa,EACb,SAAS,EAAE,cAAc,CAC1B,CAAA;QACD,MAAM,iBAAiB,GAAG,iBAAiB,CAAC,OAAO,CACjD;YACE,eAAe,EAAE,GAAG,CAAC,WAAW,CAAC,eAAe;YAChD,gBAAgB,EAAE,GAAG,CAAC,WAAW,CAAC,gBAAgB;SACnD,EACD,YAAY,EACZ,WAAW,CACZ,CAAC,EAAE,CAAC,CAAA;QAEL,MAAM,SAAS,GAAG,IAAI,SAAS,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,CAAA;QAE/C,MAAM,YAAY,GAAG,IAAI,YAAY,CAAC,UAAU,EAAE;YAChD,UAAU,EAAE,GAAG,CAAC,OAAO,CAAC,GAAG;YAC3B,aAAa,EAAE,OAAO,CAAC,aAAa;YACpC,WAAW,EAAE,WAAW,CAAC,EAAE,CAAC;SAC7B,CAAC,CAAA;QAEF,OAAO,IAAI,UAAU,CACnB;YACE,EAAE;YACF,GAAG;YACH,UAAU;YACV,wBAAwB;YACxB,4BAA4B;YAC5B,mBAAmB;YACnB,sBAAsB;YACtB,WAAW;YACX,YAAY;YACZ,kBAAkB;YAClB,UAAU;YACV,cAAc;YACd,aAAa;YACb,YAAY;YACZ,QAAQ;YACR,SAAS;YACT,UAAU;YACV,YAAY;YACZ,QAAQ;YACR,UAAU;YACV,eAAe;YACf,SAAS;YACT,iBAAiB;YACjB,YAAY;YACZ,YAAY;YACZ,mBAAmB;YACnB,kBAAkB;YAClB,GAAG,CAAC,SAAS,IAAI,EAAE,CAAC;SACrB,EACD,OAAO,CACR,CAAA;IACH,CAAC;IAED,UAAU,CAAC,IAAY;QACrB,MAAM,CACJ,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,IAAI,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,KAAK,IAAI,EACxD,4BAA4B,CAC7B,CAAA;QACD,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,GAAG,IAAI,CAAA;IACnC,CAAC;IAED,IAAI,EAAE;QACJ,OAAO,IAAI,CAAC,IAAI,CAAC,EAAE,CAAA;IACrB,CAAC;IAED,IAAI,GAAG;QACL,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAA;IACtB,CAAC;IAED,IAAI,UAAU;QACZ,OAAO,IAAI,CAAC,IAAI,CAAC,UAAU,CAAA;IAC7B,CAAC;IAED,IAAI,YAAY;QACd,OAAO,IAAI,CAAC,IAAI,CAAC,YAAY,CAAA;IAC/B,CAAC;IAED,IAAI,4BAA4B;QAC9B,OAAO,IAAI,CAAC,IAAI,CAAC,4BAA4B,CAAA;IAC/C,CAAC;IAED,IAAI,mBAAmB;QACrB,OAAO,IAAI,CAAC,IAAI,CAAC,mBAAmB,CAAA;IACtC,CAAC;IAED,IAAI,sBAAsB;QACxB,OAAO,IAAI,CAAC,IAAI,CAAC,sBAAsB,CAAA;IACzC,CAAC;IAED,IAAI,WAAW;QACb,OAAO,IAAI,CAAC,IAAI,CAAC,WAAW,CAAA;IAC9B,CAAC;IAED,IAAI,YAAY;QACd,OAAO,IAAI,CAAC,IAAI,CAAC,YAAY,CAAA;IAC/B,CAAC;IAED,IAAI,kBAAkB;QACpB,OAAO,IAAI,CAAC,IAAI,CAAC,kBAAkB,CAAA;IACrC,CAAC;IAED,IAAI,UAAU;QACZ,OAAO,IAAI,CAAC,IAAI,CAAC,UAAU,CAAA;IAC7B,CAAC;IAED,IAAI,cAAc;QAChB,OAAO,IAAI,CAAC,IAAI,CAAC,cAAc,CAAA;IACjC,CAAC;IAED,IAAI,aAAa;QACf,OAAO,IAAI,CAAC,IAAI,CAAC,aAAa,CAAA;IAChC,CAAC;IAED,IAAI,mBAAmB;QACrB,OAAO,IAAI,CAAC,IAAI,CAAC,mBAAmB,CAAA;IACtC,CAAC;IAED,IAAI,kBAAkB;QACpB,OAAO,IAAI,CAAC,IAAI,CAAC,kBAAkB,CAAA;IACrC,CAAC;IAED,IAAI,wBAAwB;QAC1B,OAAO,IAAI,CAAC,IAAI,CAAC,wBAAwB,CAAA;IAC3C,CAAC;IAED,IAAI,YAAY;QACd,OAAO,IAAI,CAAC,IAAI,CAAC,YAAY,CAAA;IAC/B,CAAC;IAED,IAAI,QAAQ;QACV,OAAO,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAA;IAC3B,CAAC;IAED,IAAI,SAAS;QACX,OAAO,IAAI,CAAC,IAAI,CAAC,SAAS,CAAA;IAC5B,CAAC;IAED,IAAI,UAAU;QACZ,OAAO,IAAI,CAAC,IAAI,CAAC,UAAU,CAAA;IAC7B,CAAC;IAED,IAAI,YAAY;QACd,OAAO,IAAI,CAAC,IAAI,CAAC,YAAY,CAAA;IAC/B,CAAC;IAED,IAAI,SAAS;QACX,OAAO,IAAI,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAA;IACjD,CAAC;IAED,IAAI,QAAQ;QACV,OAAO,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAA;IAC3B,CAAC;IAED,IAAI,UAAU;QACZ,OAAO,IAAI,CAAC,IAAI,CAAC,UAAU,CAAA;IAC7B,CAAC;IAED,IAAI,eAAe;QACjB,OAAO,IAAI,CAAC,IAAI,CAAC,eAAe,CAAA;IAClC,CAAC;IAED,IAAI,SAAS;QACX,OAAO,IAAI,CAAC,IAAI,CAAC,SAAS,CAAA;IAC5B,CAAC;IAED,IAAI,iBAAiB;QACnB,OAAO,IAAI,CAAC,IAAI,CAAC,iBAAiB,CAAA;IACpC,CAAC;IAED,IAAI,YAAY;QACd,OAAO,IAAI,CAAC,IAAI,CAAC,YAAY,CAAA;IAC/B,CAAC;IAED,KAAK,CAAC,kBAAkB,CAAC,GAAW,EAAE,GAAW;QAC/C,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,kBAAkB,CAAA;QACrD,OAAO,wBAAwB,CAAC;YAC9B,GAAG;YACH,GAAG;YACH,GAAG;YACH,OAAO,EAAE,IAAI,CAAC,UAAU;SACzB,CAAC,CAAA;IACJ,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,GAAW;QACvB,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC;YAClB,OAAO,SAAS,CAAA;QAClB,CAAC;QACD,OAAO,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,CAAA;IACvD,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,GAAW;QAC3B,OAAO,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,CAAA;IAC3D,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,GAAW;QACxB,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;YACnB,MAAM,IAAI,KAAK,CAAC,4BAA4B,CAAC,CAAA;QAC/C,CAAC;QACD,OAAO,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,CAAA;IACxD,CAAC;IAED,WAAW,CAAC,SAAqC;QAC/C,IAAI,CAAC,IAAI,GAAG;YACV,GAAG,IAAI,CAAC,IAAI;YACZ,GAAG,SAAS;SACb,CAAA;IACH,CAAC;IAED,WAAW,CAAC,GAAoB;QAC9B,MAAM,GAAG,GAAG,GAAG,CAAC,MAAM,CAAC,mBAAmB,CAAC,CAAA;QAC3C,IAAI,MAA6B,CAAA;QACjC,IAAI,CAAC;YACH,MAAM,GAAG,kBAAkB,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;QACxD,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,GAAG,IAAI,CAAA;QACf,CAAC;QACD,IAAI,CAAC,MAAM;YAAE,OAAO,oBAAoB,CAAC,EAAE,CAAC,CAAA;QAC5C,OAAO,MAAM,CAAA;IACf,CAAC;CACF","sourcesContent":["import assert from 'node:assert'\nimport * as plc from '@did-plc/lib'\nimport express from 'express'\nimport { AtpAgent } from '@atproto/api'\nimport { Keypair, Secp256k1Keypair } from '@atproto/crypto'\nimport { DidCache, IdResolver, MemoryCache } from '@atproto/identity'\nimport { createServiceAuthHeaders } from '@atproto/xrpc-server'\nimport { AssignmentService } from './assignment/index.js'\nimport { AuthVerifier } from './auth-verifier.js'\nimport { BackgroundQueue } from './background.js'\nimport {\n CommunicationTemplateService,\n CommunicationTemplateServiceCreator,\n} from './communication-service/template.js'\nimport { OzoneConfig, OzoneSecrets } from './config/index.js'\nimport { BlobDiverter } from './daemon/blob-diverter.js'\nimport { EventPusher } from './daemon/index.js'\nimport { Database } from './db/index.js'\nimport { ImageInvalidator } from './image-invalidator.js'\nimport {\n ModerationService,\n ModerationServiceCreator,\n} from './mod-service/index.js'\nimport {\n ModerationServiceProfile,\n ModerationServiceProfileCreator,\n} from './mod-service/profile.js'\nimport { StrikeService, StrikeServiceCreator } from './mod-service/strike.js'\nimport { QueueService, QueueServiceCreator } from './queue/service.js'\nimport {\n ReportStatsService,\n ReportStatsServiceCreator,\n} from './report/stats.js'\nimport {\n SafelinkRuleService,\n SafelinkRuleServiceCreator,\n} from './safelink/service.js'\nimport {\n ScheduledActionService,\n ScheduledActionServiceCreator,\n} from './scheduled-action/service.js'\nimport { Sequencer } from './sequencer/sequencer.js'\nimport { SetService, SetServiceCreator } from './set/service.js'\nimport { SettingService, SettingServiceCreator } from './setting/service.js'\nimport { TeamService, TeamServiceCreator } from './team/index.js'\nimport {\n LABELER_HEADER_NAME,\n ParsedLabelers,\n defaultLabelerHeader,\n getSigningKeyId,\n parseLabelerHeader,\n} from './util.js'\nimport {\n VerificationIssuer,\n VerificationIssuerCreator,\n} from './verification/issuer.js'\nimport {\n VerificationService,\n VerificationServiceCreator,\n} from './verification/service.js'\n\nexport type AppContextOptions = {\n db: Database\n cfg: OzoneConfig\n modService: ModerationServiceCreator\n moderationServiceProfile: ModerationServiceProfileCreator\n communicationTemplateService: CommunicationTemplateServiceCreator\n safelinkRuleService: SafelinkRuleServiceCreator\n scheduledActionService: ScheduledActionServiceCreator\n queueService: QueueServiceCreator\n reportStatsService: ReportStatsServiceCreator\n setService: SetServiceCreator\n settingService: SettingServiceCreator\n strikeService: StrikeServiceCreator\n teamService: TeamServiceCreator\n appviewAgent: AtpAgent\n pdsAgent: AtpAgent | undefined\n chatAgent: AtpAgent | undefined\n blobDiverter?: BlobDiverter\n signingKey: Keypair\n signingKeyId: number\n didCache: DidCache\n idResolver: IdResolver\n imgInvalidator?: ImageInvalidator\n backgroundQueue: BackgroundQueue\n sequencer: Sequencer\n assignmentService: AssignmentService\n authVerifier: AuthVerifier\n verificationService: VerificationServiceCreator\n verificationIssuer: VerificationIssuerCreator\n}\n\nexport class AppContext {\n constructor(\n private opts: AppContextOptions,\n private secrets: OzoneSecrets,\n ) {}\n\n static async fromConfig(\n cfg: OzoneConfig,\n secrets: OzoneSecrets,\n overrides?: Partial<AppContextOptions>,\n ): Promise<AppContext> {\n const db = new Database({\n url: cfg.db.postgresUrl,\n schema: cfg.db.postgresSchema,\n poolSize: cfg.db.poolSize,\n poolMaxUses: cfg.db.poolMaxUses,\n poolIdleTimeoutMs: cfg.db.poolIdleTimeoutMs,\n })\n const signingKey = await Secp256k1Keypair.import(secrets.signingKeyHex)\n const signingKeyId = await getSigningKeyId(db, signingKey.did())\n const appviewAgent = new AtpAgent({ service: cfg.appview.url })\n const pdsAgent = cfg.pds\n ? new AtpAgent({ service: cfg.pds.url })\n : undefined\n const chatAgent = cfg.chat\n ? new AtpAgent({ service: cfg.chat.url })\n : undefined\n\n const didCache = new MemoryCache(\n cfg.identity.cacheStaleTTL,\n cfg.identity.cacheMaxTTL,\n )\n const idResolver = new IdResolver({\n plcUrl: cfg.identity.plcUrl,\n didCache,\n })\n\n const createAuthHeaders = (aud: string, lxm: string) =>\n createServiceAuthHeaders({\n iss: `${cfg.service.did}#atproto_labeler`,\n aud,\n lxm,\n keypair: signingKey,\n })\n\n const backgroundQueue = new BackgroundQueue(db, { concurrency: 20 })\n const blobDiverter = cfg.blobDivert\n ? new BlobDiverter(db, {\n idResolver,\n serviceConfig: cfg.blobDivert,\n })\n : undefined\n const eventPusher = new EventPusher(db, createAuthHeaders, {\n appview: cfg.appview.pushEvents ? cfg.appview : undefined,\n pds: cfg.pds ?? undefined,\n })\n\n const communicationTemplateService = CommunicationTemplateService.creator()\n const safelinkRuleService = SafelinkRuleService.creator()\n const scheduledActionService = ScheduledActionService.creator()\n const teamService = TeamService.creator(\n appviewAgent,\n cfg.appview.did,\n createAuthHeaders,\n )\n const queueService = QueueService.creator()\n const reportStatsService = ReportStatsService.creator()\n const setService = SetService.creator()\n const settingService = SettingService.creator()\n const strikeService = StrikeService.creator()\n const verificationService = VerificationService.creator()\n const verificationIssuer = VerificationIssuer.creator()\n const moderationServiceProfile = ModerationServiceProfile.creator(\n cfg,\n appviewAgent,\n )\n const modService = ModerationService.creator(\n signingKey,\n signingKeyId,\n cfg,\n backgroundQueue,\n idResolver,\n eventPusher,\n appviewAgent,\n createAuthHeaders,\n strikeService,\n overrides?.imgInvalidator,\n )\n const assignmentService = AssignmentService.creator(\n {\n queueDurationMs: cfg.assignments.queueDurationMs,\n reportDurationMs: cfg.assignments.reportDurationMs,\n },\n queueService,\n teamService,\n )(db)\n\n const sequencer = new Sequencer(modService(db))\n\n const authVerifier = new AuthVerifier(idResolver, {\n serviceDid: cfg.service.did,\n adminPassword: secrets.adminPassword,\n teamService: teamService(db),\n })\n\n return new AppContext(\n {\n db,\n cfg,\n modService,\n moderationServiceProfile,\n communicationTemplateService,\n safelinkRuleService,\n scheduledActionService,\n teamService,\n queueService,\n reportStatsService,\n setService,\n settingService,\n strikeService,\n appviewAgent,\n pdsAgent,\n chatAgent,\n signingKey,\n signingKeyId,\n didCache,\n idResolver,\n backgroundQueue,\n sequencer,\n assignmentService,\n authVerifier,\n blobDiverter,\n verificationService,\n verificationIssuer,\n ...(overrides ?? {}),\n },\n secrets,\n )\n }\n\n assignPort(port: number) {\n assert(\n !this.cfg.service.port || this.cfg.service.port === port,\n 'Conflicting port in config',\n )\n this.opts.cfg.service.port = port\n }\n\n get db(): Database {\n return this.opts.db\n }\n\n get cfg(): OzoneConfig {\n return this.opts.cfg\n }\n\n get modService(): ModerationServiceCreator {\n return this.opts.modService\n }\n\n get blobDiverter(): BlobDiverter | undefined {\n return this.opts.blobDiverter\n }\n\n get communicationTemplateService(): CommunicationTemplateServiceCreator {\n return this.opts.communicationTemplateService\n }\n\n get safelinkRuleService(): SafelinkRuleServiceCreator {\n return this.opts.safelinkRuleService\n }\n\n get scheduledActionService(): ScheduledActionServiceCreator {\n return this.opts.scheduledActionService\n }\n\n get teamService(): TeamServiceCreator {\n return this.opts.teamService\n }\n\n get queueService(): QueueServiceCreator {\n return this.opts.queueService\n }\n\n get reportStatsService(): ReportStatsServiceCreator {\n return this.opts.reportStatsService\n }\n\n get setService(): SetServiceCreator {\n return this.opts.setService\n }\n\n get settingService(): SettingServiceCreator {\n return this.opts.settingService\n }\n\n get strikeService(): StrikeServiceCreator {\n return this.opts.strikeService\n }\n\n get verificationService(): VerificationServiceCreator {\n return this.opts.verificationService\n }\n\n get verificationIssuer(): VerificationIssuerCreator {\n return this.opts.verificationIssuer\n }\n\n get moderationServiceProfile(): ModerationServiceProfileCreator {\n return this.opts.moderationServiceProfile\n }\n\n get appviewAgent(): AtpAgent {\n return this.opts.appviewAgent\n }\n\n get pdsAgent(): AtpAgent | undefined {\n return this.opts.pdsAgent\n }\n\n get chatAgent(): AtpAgent | undefined {\n return this.opts.chatAgent\n }\n\n get signingKey(): Keypair {\n return this.opts.signingKey\n }\n\n get signingKeyId(): number {\n return this.opts.signingKeyId\n }\n\n get plcClient(): plc.Client {\n return new plc.Client(this.cfg.identity.plcUrl)\n }\n\n get didCache(): DidCache {\n return this.opts.didCache\n }\n\n get idResolver(): IdResolver {\n return this.opts.idResolver\n }\n\n get backgroundQueue(): BackgroundQueue {\n return this.opts.backgroundQueue\n }\n\n get sequencer(): Sequencer {\n return this.opts.sequencer\n }\n\n get assignmentService(): AssignmentService {\n return this.opts.assignmentService\n }\n\n get authVerifier(): AuthVerifier {\n return this.opts.authVerifier\n }\n\n async serviceAuthHeaders(aud: string, lxm: string) {\n const iss = `${this.cfg.service.did}#atproto_labeler`\n return createServiceAuthHeaders({\n iss,\n aud,\n lxm,\n keypair: this.signingKey,\n })\n }\n\n async pdsAuth(lxm: string) {\n if (!this.cfg.pds) {\n return undefined\n }\n return this.serviceAuthHeaders(this.cfg.pds.did, lxm)\n }\n\n async appviewAuth(lxm: string) {\n return this.serviceAuthHeaders(this.cfg.appview.did, lxm)\n }\n\n async chatAuth(lxm: string) {\n if (!this.cfg.chat) {\n throw new Error('No chat service configured')\n }\n return this.serviceAuthHeaders(this.cfg.chat.did, lxm)\n }\n\n devOverride(overrides: Partial<AppContextOptions>) {\n this.opts = {\n ...this.opts,\n ...overrides,\n }\n }\n\n reqLabelers(req: express.Request): ParsedLabelers {\n const val = req.header(LABELER_HEADER_NAME)\n let parsed: ParsedLabelers | null\n try {\n parsed = parseLabelerHeader(val, this.cfg.service.did)\n } catch (err) {\n parsed = null\n }\n if (!parsed) return defaultLabelerHeader([])\n return parsed\n }\n}\n"]}
|
package/dist/daemon/context.js
CHANGED
|
@@ -47,7 +47,7 @@ export class DaemonContext {
|
|
|
47
47
|
appview: cfg.appview.pushEvents ? cfg.appview : undefined,
|
|
48
48
|
pds: cfg.pds ?? undefined,
|
|
49
49
|
});
|
|
50
|
-
const backgroundQueue = new BackgroundQueue(db);
|
|
50
|
+
const backgroundQueue = new BackgroundQueue(db, { concurrency: 20 });
|
|
51
51
|
const settingService = SettingService.creator();
|
|
52
52
|
const strikeService = StrikeService.creator();
|
|
53
53
|
const modService = ModerationService.creator(signingKey, signingKeyId, cfg, backgroundQueue, idResolver, eventPusher, appviewAgent, createAuthHeaders, strikeService);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"context.js","sourceRoot":"","sources":["../../src/daemon/context.ts"],"names":[],"mappings":"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","sourcesContent":["import { AtpAgent } from '@atproto/api'\nimport { allFulfilled } from '@atproto/common'\nimport { Keypair, Secp256k1Keypair } from '@atproto/crypto'\nimport { IdResolver } from '@atproto/identity'\nimport { createServiceAuthHeaders } from '@atproto/xrpc-server'\nimport { BackgroundQueue } from '../background.js'\nimport { OzoneConfig, OzoneSecrets } from '../config/index.js'\nimport { Database } from '../db/index.js'\nimport { ModerationService } from '../mod-service/index.js'\nimport { StrikeService } from '../mod-service/strike.js'\nimport { QueueService } from '../queue/service.js'\nimport { ReportStatsService } from '../report/stats.js'\nimport { ScheduledActionService } from '../scheduled-action/service.js'\nimport { SettingService } from '../setting/service.js'\nimport { TeamService } from '../team/index.js'\nimport { getSigningKeyId } from '../util.js'\nimport { EventPusher } from './event-pusher.js'\nimport { EventReverser } from './event-reverser.js'\nimport { MaterializedViewRefresher } from './materialized-view-refresher.js'\nimport { QueueRouter } from './queue-router.js'\nimport { ScheduledActionProcessor } from './scheduled-action-processor.js'\nimport { StatsComputer } from './stats-computer.js'\nimport { StrikeExpiryProcessor } from './strike-expiry-processor.js'\nimport { TeamProfileSynchronizer } from './team-profile-synchronizer.js'\nimport { VerificationListener } from './verification-listener.js'\n\nexport type DaemonContextOptions = {\n db: Database\n cfg: OzoneConfig\n backgroundQueue: BackgroundQueue\n signingKey: Keypair\n eventPusher: EventPusher\n eventReverser: EventReverser\n materializedViewRefresher: MaterializedViewRefresher\n teamProfileSynchronizer: TeamProfileSynchronizer\n scheduledActionProcessor: ScheduledActionProcessor\n strikeExpiryProcessor: StrikeExpiryProcessor\n queueRouter: QueueRouter\n verificationListener?: VerificationListener\n statsComputer?: StatsComputer\n}\n\nexport class DaemonContext {\n constructor(private opts: DaemonContextOptions) {}\n\n static async fromConfig(\n cfg: OzoneConfig,\n secrets: OzoneSecrets,\n overrides?: Partial<DaemonContextOptions>,\n ): Promise<DaemonContext> {\n const db = new Database({\n url: cfg.db.postgresUrl,\n schema: cfg.db.postgresSchema,\n })\n const signingKey = await Secp256k1Keypair.import(secrets.signingKeyHex)\n const signingKeyId = await getSigningKeyId(db, signingKey.did())\n\n const idResolver = new IdResolver({\n plcUrl: cfg.identity.plcUrl,\n })\n\n const appviewAgent = new AtpAgent({ service: cfg.appview.url })\n const createAuthHeaders = (aud: string, lxm: string) =>\n createServiceAuthHeaders({\n iss: `${cfg.service.did}#atproto_labeler`,\n aud,\n lxm,\n keypair: signingKey,\n })\n\n const eventPusher = new EventPusher(db, createAuthHeaders, {\n appview: cfg.appview.pushEvents ? cfg.appview : undefined,\n pds: cfg.pds ?? undefined,\n })\n\n const backgroundQueue = new BackgroundQueue(db)\n\n const settingService = SettingService.creator()\n const strikeService = StrikeService.creator()\n const modService = ModerationService.creator(\n signingKey,\n signingKeyId,\n cfg,\n backgroundQueue,\n idResolver,\n eventPusher,\n appviewAgent,\n createAuthHeaders,\n strikeService,\n )\n const scheduledActionService = ScheduledActionService.creator()\n const teamService = TeamService.creator(\n appviewAgent,\n cfg.appview.did,\n createAuthHeaders,\n )\n const teamProfileSynchronizer = new TeamProfileSynchronizer(\n backgroundQueue,\n teamService(db),\n cfg.db.teamProfileRefreshIntervalMs,\n )\n\n const eventReverser = new EventReverser(db, modService)\n\n const materializedViewRefresher = new MaterializedViewRefresher(\n backgroundQueue,\n cfg.db.materializedViewRefreshIntervalMs,\n )\n\n const scheduledActionProcessor = new ScheduledActionProcessor(\n db,\n cfg.service.did,\n settingService,\n modService,\n scheduledActionService,\n )\n\n const strikeExpiryProcessor = new StrikeExpiryProcessor(db, strikeService)\n\n const queueService = QueueService.creator()\n const queueRouter = new QueueRouter(db, queueService)\n\n const reportStatsService = ReportStatsService.creator()\n const statsComputer = new StatsComputer(\n db,\n reportStatsService,\n cfg.stats.computerIntervalMinutes,\n )\n\n // Only spawn the listener if verifier config exists and a jetstream URL is provided\n const verificationListener =\n cfg.verifier && cfg.jetstreamUrl\n ? new VerificationListener(\n db,\n cfg.jetstreamUrl,\n cfg.verifier?.issuersToIndex,\n )\n : undefined\n\n return new DaemonContext({\n db,\n cfg,\n backgroundQueue,\n signingKey,\n eventPusher,\n eventReverser,\n materializedViewRefresher,\n teamProfileSynchronizer,\n scheduledActionProcessor,\n strikeExpiryProcessor,\n queueRouter,\n verificationListener,\n statsComputer,\n ...(overrides ?? {}),\n })\n }\n\n get db(): Database {\n return this.opts.db\n }\n\n get cfg(): OzoneConfig {\n return this.opts.cfg\n }\n\n get backgroundQueue(): BackgroundQueue {\n return this.opts.backgroundQueue\n }\n\n get eventPusher(): EventPusher {\n return this.opts.eventPusher\n }\n\n get eventReverser(): EventReverser {\n return this.opts.eventReverser\n }\n\n get materializedViewRefresher(): MaterializedViewRefresher {\n return this.opts.materializedViewRefresher\n }\n\n get teamProfileSynchronizer(): TeamProfileSynchronizer {\n return this.opts.teamProfileSynchronizer\n }\n\n get scheduledActionProcessor(): ScheduledActionProcessor {\n return this.opts.scheduledActionProcessor\n }\n\n get strikeExpiryProcessor(): StrikeExpiryProcessor {\n return this.opts.strikeExpiryProcessor\n }\n\n get queueRouter(): QueueRouter {\n return this.opts.queueRouter\n }\n\n get verificationListener(): VerificationListener | undefined {\n return this.opts.verificationListener\n }\n\n get statsComputer(): StatsComputer | undefined {\n return this.opts.statsComputer\n }\n\n async start() {\n this.eventPusher.start()\n this.eventReverser.start()\n this.materializedViewRefresher.start()\n this.teamProfileSynchronizer.start()\n this.scheduledActionProcessor.start()\n this.strikeExpiryProcessor.start()\n this.queueRouter.start()\n this.verificationListener?.start()\n this.statsComputer?.start()\n }\n\n async processAll() {\n // Sequential because the materialized view values depend on the events.\n await this.eventPusher.processAll()\n // Drain pending modEventReport rows into the report table so test code\n // that calls processAll() after creating reports sees the report rows\n // immediately (in production this happens via the 1-min poll).\n await this.queueRouter.routeReports()\n await this.materializedViewRefresher.run()\n await this.teamProfileSynchronizer.run()\n }\n\n async destroy() {\n try {\n await allFulfilled([\n this.eventReverser.destroy(),\n this.eventPusher.destroy(),\n this.materializedViewRefresher.destroy(),\n this.teamProfileSynchronizer.destroy(),\n this.scheduledActionProcessor.destroy(),\n this.strikeExpiryProcessor.destroy(),\n this.queueRouter.destroy(),\n this.verificationListener?.stop(),\n this.statsComputer?.destroy(),\n ])\n } finally {\n await this.backgroundQueue.destroy()\n await this.db.close()\n }\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"context.js","sourceRoot":"","sources":["../../src/daemon/context.ts"],"names":[],"mappings":"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","sourcesContent":["import { AtpAgent } from '@atproto/api'\nimport { allFulfilled } from '@atproto/common'\nimport { Keypair, Secp256k1Keypair } from '@atproto/crypto'\nimport { IdResolver } from '@atproto/identity'\nimport { createServiceAuthHeaders } from '@atproto/xrpc-server'\nimport { BackgroundQueue } from '../background.js'\nimport { OzoneConfig, OzoneSecrets } from '../config/index.js'\nimport { Database } from '../db/index.js'\nimport { ModerationService } from '../mod-service/index.js'\nimport { StrikeService } from '../mod-service/strike.js'\nimport { QueueService } from '../queue/service.js'\nimport { ReportStatsService } from '../report/stats.js'\nimport { ScheduledActionService } from '../scheduled-action/service.js'\nimport { SettingService } from '../setting/service.js'\nimport { TeamService } from '../team/index.js'\nimport { getSigningKeyId } from '../util.js'\nimport { EventPusher } from './event-pusher.js'\nimport { EventReverser } from './event-reverser.js'\nimport { MaterializedViewRefresher } from './materialized-view-refresher.js'\nimport { QueueRouter } from './queue-router.js'\nimport { ScheduledActionProcessor } from './scheduled-action-processor.js'\nimport { StatsComputer } from './stats-computer.js'\nimport { StrikeExpiryProcessor } from './strike-expiry-processor.js'\nimport { TeamProfileSynchronizer } from './team-profile-synchronizer.js'\nimport { VerificationListener } from './verification-listener.js'\n\nexport type DaemonContextOptions = {\n db: Database\n cfg: OzoneConfig\n backgroundQueue: BackgroundQueue\n signingKey: Keypair\n eventPusher: EventPusher\n eventReverser: EventReverser\n materializedViewRefresher: MaterializedViewRefresher\n teamProfileSynchronizer: TeamProfileSynchronizer\n scheduledActionProcessor: ScheduledActionProcessor\n strikeExpiryProcessor: StrikeExpiryProcessor\n queueRouter: QueueRouter\n verificationListener?: VerificationListener\n statsComputer?: StatsComputer\n}\n\nexport class DaemonContext {\n constructor(private opts: DaemonContextOptions) {}\n\n static async fromConfig(\n cfg: OzoneConfig,\n secrets: OzoneSecrets,\n overrides?: Partial<DaemonContextOptions>,\n ): Promise<DaemonContext> {\n const db = new Database({\n url: cfg.db.postgresUrl,\n schema: cfg.db.postgresSchema,\n })\n const signingKey = await Secp256k1Keypair.import(secrets.signingKeyHex)\n const signingKeyId = await getSigningKeyId(db, signingKey.did())\n\n const idResolver = new IdResolver({\n plcUrl: cfg.identity.plcUrl,\n })\n\n const appviewAgent = new AtpAgent({ service: cfg.appview.url })\n const createAuthHeaders = (aud: string, lxm: string) =>\n createServiceAuthHeaders({\n iss: `${cfg.service.did}#atproto_labeler`,\n aud,\n lxm,\n keypair: signingKey,\n })\n\n const eventPusher = new EventPusher(db, createAuthHeaders, {\n appview: cfg.appview.pushEvents ? cfg.appview : undefined,\n pds: cfg.pds ?? undefined,\n })\n\n const backgroundQueue = new BackgroundQueue(db, { concurrency: 20 })\n\n const settingService = SettingService.creator()\n const strikeService = StrikeService.creator()\n const modService = ModerationService.creator(\n signingKey,\n signingKeyId,\n cfg,\n backgroundQueue,\n idResolver,\n eventPusher,\n appviewAgent,\n createAuthHeaders,\n strikeService,\n )\n const scheduledActionService = ScheduledActionService.creator()\n const teamService = TeamService.creator(\n appviewAgent,\n cfg.appview.did,\n createAuthHeaders,\n )\n const teamProfileSynchronizer = new TeamProfileSynchronizer(\n backgroundQueue,\n teamService(db),\n cfg.db.teamProfileRefreshIntervalMs,\n )\n\n const eventReverser = new EventReverser(db, modService)\n\n const materializedViewRefresher = new MaterializedViewRefresher(\n backgroundQueue,\n cfg.db.materializedViewRefreshIntervalMs,\n )\n\n const scheduledActionProcessor = new ScheduledActionProcessor(\n db,\n cfg.service.did,\n settingService,\n modService,\n scheduledActionService,\n )\n\n const strikeExpiryProcessor = new StrikeExpiryProcessor(db, strikeService)\n\n const queueService = QueueService.creator()\n const queueRouter = new QueueRouter(db, queueService)\n\n const reportStatsService = ReportStatsService.creator()\n const statsComputer = new StatsComputer(\n db,\n reportStatsService,\n cfg.stats.computerIntervalMinutes,\n )\n\n // Only spawn the listener if verifier config exists and a jetstream URL is provided\n const verificationListener =\n cfg.verifier && cfg.jetstreamUrl\n ? new VerificationListener(\n db,\n cfg.jetstreamUrl,\n cfg.verifier?.issuersToIndex,\n )\n : undefined\n\n return new DaemonContext({\n db,\n cfg,\n backgroundQueue,\n signingKey,\n eventPusher,\n eventReverser,\n materializedViewRefresher,\n teamProfileSynchronizer,\n scheduledActionProcessor,\n strikeExpiryProcessor,\n queueRouter,\n verificationListener,\n statsComputer,\n ...(overrides ?? {}),\n })\n }\n\n get db(): Database {\n return this.opts.db\n }\n\n get cfg(): OzoneConfig {\n return this.opts.cfg\n }\n\n get backgroundQueue(): BackgroundQueue {\n return this.opts.backgroundQueue\n }\n\n get eventPusher(): EventPusher {\n return this.opts.eventPusher\n }\n\n get eventReverser(): EventReverser {\n return this.opts.eventReverser\n }\n\n get materializedViewRefresher(): MaterializedViewRefresher {\n return this.opts.materializedViewRefresher\n }\n\n get teamProfileSynchronizer(): TeamProfileSynchronizer {\n return this.opts.teamProfileSynchronizer\n }\n\n get scheduledActionProcessor(): ScheduledActionProcessor {\n return this.opts.scheduledActionProcessor\n }\n\n get strikeExpiryProcessor(): StrikeExpiryProcessor {\n return this.opts.strikeExpiryProcessor\n }\n\n get queueRouter(): QueueRouter {\n return this.opts.queueRouter\n }\n\n get verificationListener(): VerificationListener | undefined {\n return this.opts.verificationListener\n }\n\n get statsComputer(): StatsComputer | undefined {\n return this.opts.statsComputer\n }\n\n async start() {\n this.eventPusher.start()\n this.eventReverser.start()\n this.materializedViewRefresher.start()\n this.teamProfileSynchronizer.start()\n this.scheduledActionProcessor.start()\n this.strikeExpiryProcessor.start()\n this.queueRouter.start()\n this.verificationListener?.start()\n this.statsComputer?.start()\n }\n\n async processAll() {\n // Sequential because the materialized view values depend on the events.\n await this.eventPusher.processAll()\n // Drain pending modEventReport rows into the report table so test code\n // that calls processAll() after creating reports sees the report rows\n // immediately (in production this happens via the 1-min poll).\n await this.queueRouter.routeReports()\n await this.materializedViewRefresher.run()\n await this.teamProfileSynchronizer.run()\n }\n\n async destroy() {\n try {\n await allFulfilled([\n this.eventReverser.destroy(),\n this.eventPusher.destroy(),\n this.materializedViewRefresher.destroy(),\n this.teamProfileSynchronizer.destroy(),\n this.scheduledActionProcessor.destroy(),\n this.strikeExpiryProcessor.destroy(),\n this.queueRouter.destroy(),\n this.verificationListener?.stop(),\n this.statsComputer?.destroy(),\n ])\n } finally {\n await this.backgroundQueue.destroy()\n await this.db.close()\n }\n }\n}\n"]}
|
|
@@ -48,7 +48,13 @@ export declare class EventPusher {
|
|
|
48
48
|
attemptRecordEvent(id: number): Promise<void>;
|
|
49
49
|
attemptBlobEvent(id: number): Promise<void>;
|
|
50
50
|
markBlobEventAttempt(dbTxn: Database, event: Selectable<BlobPushEvent>, succeeded: boolean): Promise<void>;
|
|
51
|
-
logBlobPushEvent(blobValues: Insertable<BlobPushEvent>[], takedownRef?: string | null): Promise<
|
|
51
|
+
logBlobPushEvent(blobValues: Insertable<BlobPushEvent>[], takedownRef?: string | null): Promise<{
|
|
52
|
+
eventType: import("../db/schema/blob_push_event.js").BlobPushEventType;
|
|
53
|
+
id: number;
|
|
54
|
+
subjectBlobCid: string;
|
|
55
|
+
subjectDid: string;
|
|
56
|
+
subjectUri: string | null;
|
|
57
|
+
}[]>;
|
|
52
58
|
}
|
|
53
59
|
export {};
|
|
54
60
|
//# sourceMappingURL=event-pusher.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"event-pusher.d.ts","sourceRoot":"","sources":["../../src/daemon/event-pusher.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAA;AAC/C,OAAO,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAA;AAEvC,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AACzC,OAAO,EAAE,aAAa,EAAE,MAAM,iCAAiC,CAAA;AAC/D,OAAO,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAA;AAQnE,KAAK,SAAS,GAAG;IACf,KAAK,CAAC,EAAE,MAAM,CAAC,OAAO,CAAA;IACtB,OAAO,EAAE,OAAO,CAAC,IAAI,CAAC,CAAA;CACvB,CAAA;AAED,KAAK,WAAW,GAAG;IACjB,OAAO,EAAE;QACP,aAAa,EAAE,MAAM,CAAA;KACtB,CAAA;CACF,CAAA;AAED,KAAK,OAAO,GAAG;IACb,KAAK,EAAE,QAAQ,CAAA;IACf,GAAG,EAAE,MAAM,CAAA;CACZ,CAAA;AAED,qBAAa,WAAW;IAiBb,EAAE,EAAE,QAAQ;IACZ,iBAAiB,EAAE,CACxB,GAAG,EAAE,MAAM,EACX,MAAM,EAAE,MAAM,KACX,OAAO,CAAC,WAAW,CAAC;IApB3B,SAAS,UAAQ;IAEjB,aAAa,EAAE,SAAS,CAEvB;IACD,eAAe,EAAE,SAAS,CAEzB;IACD,aAAa,EAAE,SAAS,CAEvB;IAED,OAAO,EAAE,OAAO,GAAG,SAAS,CAAA;IAC5B,GAAG,EAAE,OAAO,GAAG,SAAS,CAAA;IAExB,YACS,EAAE,EAAE,QAAQ,EACZ,iBAAiB,EAAE,CACxB,GAAG,EAAE,MAAM,EACX,MAAM,EAAE,MAAM,KACX,OAAO,CAAC,WAAW,CAAC,EACzB,QAAQ,EAAE;QACR,OAAO,CAAC,EAAE;YACR,GAAG,EAAE,MAAM,CAAA;YACX,GAAG,EAAE,MAAM,CAAA;SACZ,CAAA;QACD,GAAG,CAAC,EAAE;YACJ,GAAG,EAAE,MAAM,CAAA;YACX,GAAG,EAAE,MAAM,CAAA;SACZ,CAAA;KACF,EAcF;IAED,KAAK,SAIJ;IAKD,mBAAmB,CAAC,cAAc,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,iBAAiB,EAAE,CAmBpE;IAED,IAAI,CAAC,KAAK,EAAE,SAAS,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,QAS7C;IAEK,UAAU,kBASf;IAEK,OAAO,kBAaZ;IAEK,cAAc,kBAUnB;IAEK,gBAAgB,kBAUrB;IAEK,cAAc,kBAUnB;YAEa,sBAAsB;IAgC9B,gBAAgB,CAAC,EAAE,EAAE,MAAM,iBAoChC;IAEK,kBAAkB,CAAC,EAAE,EAAE,MAAM,iBAqClC;IAEK,gBAAgB,CAAC,EAAE,EAAE,MAAM,iBA0BhC;IAEK,oBAAoB,CACxB,KAAK,EAAE,QAAQ,EACf,KAAK,EAAE,UAAU,CAAC,aAAa,CAAC,EAChC,SAAS,EAAE,OAAO,iBAgBnB;IAEK,gBAAgB,CACpB,UAAU,EAAE,UAAU,CAAC,aAAa,CAAC,EAAE,EACvC,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI
|
|
1
|
+
{"version":3,"file":"event-pusher.d.ts","sourceRoot":"","sources":["../../src/daemon/event-pusher.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAA;AAC/C,OAAO,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAA;AAEvC,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AACzC,OAAO,EAAE,aAAa,EAAE,MAAM,iCAAiC,CAAA;AAC/D,OAAO,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAA;AAQnE,KAAK,SAAS,GAAG;IACf,KAAK,CAAC,EAAE,MAAM,CAAC,OAAO,CAAA;IACtB,OAAO,EAAE,OAAO,CAAC,IAAI,CAAC,CAAA;CACvB,CAAA;AAED,KAAK,WAAW,GAAG;IACjB,OAAO,EAAE;QACP,aAAa,EAAE,MAAM,CAAA;KACtB,CAAA;CACF,CAAA;AAED,KAAK,OAAO,GAAG;IACb,KAAK,EAAE,QAAQ,CAAA;IACf,GAAG,EAAE,MAAM,CAAA;CACZ,CAAA;AAED,qBAAa,WAAW;IAiBb,EAAE,EAAE,QAAQ;IACZ,iBAAiB,EAAE,CACxB,GAAG,EAAE,MAAM,EACX,MAAM,EAAE,MAAM,KACX,OAAO,CAAC,WAAW,CAAC;IApB3B,SAAS,UAAQ;IAEjB,aAAa,EAAE,SAAS,CAEvB;IACD,eAAe,EAAE,SAAS,CAEzB;IACD,aAAa,EAAE,SAAS,CAEvB;IAED,OAAO,EAAE,OAAO,GAAG,SAAS,CAAA;IAC5B,GAAG,EAAE,OAAO,GAAG,SAAS,CAAA;IAExB,YACS,EAAE,EAAE,QAAQ,EACZ,iBAAiB,EAAE,CACxB,GAAG,EAAE,MAAM,EACX,MAAM,EAAE,MAAM,KACX,OAAO,CAAC,WAAW,CAAC,EACzB,QAAQ,EAAE;QACR,OAAO,CAAC,EAAE;YACR,GAAG,EAAE,MAAM,CAAA;YACX,GAAG,EAAE,MAAM,CAAA;SACZ,CAAA;QACD,GAAG,CAAC,EAAE;YACJ,GAAG,EAAE,MAAM,CAAA;YACX,GAAG,EAAE,MAAM,CAAA;SACZ,CAAA;KACF,EAcF;IAED,KAAK,SAIJ;IAKD,mBAAmB,CAAC,cAAc,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,iBAAiB,EAAE,CAmBpE;IAED,IAAI,CAAC,KAAK,EAAE,SAAS,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,QAS7C;IAEK,UAAU,kBASf;IAEK,OAAO,kBAaZ;IAEK,cAAc,kBAUnB;IAEK,gBAAgB,kBAUrB;IAEK,cAAc,kBAUnB;YAEa,sBAAsB;IAgC9B,gBAAgB,CAAC,EAAE,EAAE,MAAM,iBAoChC;IAEK,kBAAkB,CAAC,EAAE,EAAE,MAAM,iBAqClC;IAEK,gBAAgB,CAAC,EAAE,EAAE,MAAM,iBA0BhC;IAEK,oBAAoB,CACxB,KAAK,EAAE,QAAQ,EACf,KAAK,EAAE,UAAU,CAAC,aAAa,CAAC,EAChC,SAAS,EAAE,OAAO,iBAgBnB;IAEK,gBAAgB,CACpB,UAAU,EAAE,UAAU,CAAC,aAAa,CAAC,EAAE,EACvC,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI;;;;;;SAqB5B;CACF"}
|
|
@@ -23,7 +23,7 @@ export declare class VerificationListener {
|
|
|
23
23
|
getCursor(): Promise<number | undefined>;
|
|
24
24
|
updateCursor(cursor: number): Promise<void>;
|
|
25
25
|
start(): Promise<void>;
|
|
26
|
-
stop(): void
|
|
26
|
+
stop(): Promise<void>;
|
|
27
27
|
}
|
|
28
28
|
export {};
|
|
29
29
|
//# sourceMappingURL=verification-listener.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"verification-listener.d.ts","sourceRoot":"","sources":["../../src/daemon/verification-listener.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAA;AAClD,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AAKzC,KAAK,kBAAkB,GAAG;IACxB,OAAO,EAAE,MAAM,CAAA;IACf,MAAM,EAAE,MAAM,CAAA;IACd,WAAW,EAAE,MAAM,CAAA;IACnB,SAAS,EAAE,MAAM,CAAA;CAClB,CAAA;AAED,qBAAa,oBAAoB;IAS7B,OAAO,CAAC,EAAE;IACV,OAAO,CAAC,YAAY;IACpB,OAAO,CAAC,sBAAsB,CAAC;IAVjC,SAAS,UAAQ;IACjB,OAAO,CAAC,MAAM,CAAC,CAAQ;IACvB,OAAO,CAAC,SAAS,CAAyB;IAC1C,OAAO,CAAC,UAAU,CAAgC;IAC3C,eAAe,kBAAmD;IACzE,OAAO,CAAC,mBAAmB,CAAyC;IAEpE,YACU,EAAE,EAAE,QAAQ,EACZ,YAAY,EAAE,MAAM,EACpB,sBAAsB,CAAC,EAAE,MAAM,EAAE,YAAA,EACvC;IAME,cAAc,qBAUnB;IAED,qBAAqB,CACnB,MAAM,EAAE,MAAM,EACd,GAAG,EAAE,MAAM,EACX,GAAG,EAAE,MAAM,EACX,MAAM,EAAE,kBAAkB,EAC1B,MAAM,EAAE,MAAM,QAgBf;IAED,yBAAyB,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,QAcpD;IAEK,SAAS,gCAOd;IAEK,YAAY,CAAC,MAAM,EAAE,MAAM,iBAahC;IAEK,KAAK,kBAiDV;
|
|
1
|
+
{"version":3,"file":"verification-listener.d.ts","sourceRoot":"","sources":["../../src/daemon/verification-listener.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAA;AAClD,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AAKzC,KAAK,kBAAkB,GAAG;IACxB,OAAO,EAAE,MAAM,CAAA;IACf,MAAM,EAAE,MAAM,CAAA;IACd,WAAW,EAAE,MAAM,CAAA;IACnB,SAAS,EAAE,MAAM,CAAA;CAClB,CAAA;AAED,qBAAa,oBAAoB;IAS7B,OAAO,CAAC,EAAE;IACV,OAAO,CAAC,YAAY;IACpB,OAAO,CAAC,sBAAsB,CAAC;IAVjC,SAAS,UAAQ;IACjB,OAAO,CAAC,MAAM,CAAC,CAAQ;IACvB,OAAO,CAAC,SAAS,CAAyB;IAC1C,OAAO,CAAC,UAAU,CAAgC;IAC3C,eAAe,kBAAmD;IACzE,OAAO,CAAC,mBAAmB,CAAyC;IAEpE,YACU,EAAE,EAAE,QAAQ,EACZ,YAAY,EAAE,MAAM,EACpB,sBAAsB,CAAC,EAAE,MAAM,EAAE,YAAA,EACvC;IAME,cAAc,qBAUnB;IAED,qBAAqB,CACnB,MAAM,EAAE,MAAM,EACd,GAAG,EAAE,MAAM,EACX,GAAG,EAAE,MAAM,EACX,MAAM,EAAE,kBAAkB,EAC1B,MAAM,EAAE,MAAM,QAgBf;IAED,yBAAyB,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,QAcpD;IAEK,SAAS,gCAOd;IAEK,YAAY,CAAC,MAAM,EAAE,MAAM,iBAahC;IAEK,KAAK,kBAiDV;IAEK,IAAI,kBAST;CACF"}
|
|
@@ -112,10 +112,16 @@ export class VerificationListener {
|
|
|
112
112
|
},
|
|
113
113
|
});
|
|
114
114
|
}
|
|
115
|
-
stop() {
|
|
116
|
-
this.
|
|
117
|
-
|
|
118
|
-
|
|
115
|
+
async stop() {
|
|
116
|
+
if (!this.destroyed) {
|
|
117
|
+
this.destroyed = true;
|
|
118
|
+
try {
|
|
119
|
+
await this.jetstream?.close();
|
|
120
|
+
}
|
|
121
|
+
finally {
|
|
122
|
+
await this.backgroundQueue.destroy();
|
|
123
|
+
}
|
|
124
|
+
}
|
|
119
125
|
}
|
|
120
126
|
}
|
|
121
127
|
//# sourceMappingURL=verification-listener.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"verification-listener.js","sourceRoot":"","sources":["../../src/daemon/verification-listener.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"verification-listener.js","sourceRoot":"","sources":["../../src/daemon/verification-listener.ts"],"names":[],"mappings":"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","sourcesContent":["import { lexicons } from '@atproto/api'\nimport { BackgroundQueue } from '../background.js'\nimport { Database } from '../db/index.js'\nimport { CommitCreateEvent, Jetstream } from '../jetstream/service.js'\nimport { verificationLogger } from '../logger.js'\nimport { VerificationService } from '../verification/service.js'\n\ntype VerificationRecord = {\n subject: string\n handle: string\n displayName: string\n createdAt: string\n}\n\nexport class VerificationListener {\n destroyed = false\n private cursor?: number\n private jetstream: Jetstream | null = null\n private collection = 'app.bsky.graph.verification'\n public backgroundQueue = new BackgroundQueue(this.db, { concurrency: 1 })\n private verificationService = VerificationService.creator()(this.db)\n\n constructor(\n private db: Database,\n private jetstreamUrl: string,\n private verifierIssuersToIndex?: string[],\n ) {}\n\n // When the queue has capacity, this method returns true which means we can continue to handle events\n // otherwise, it will close jetstream connection and wait for all previously queued events to be processed first\n // and then start jetstream listener again before returning false. At that point, the previous listeners should\n // have updates the cursor in db to the last processed event and the new listener will start from that cursor\n async ensureCoolDown() {\n const { waitingCount, runningCount } = this.backgroundQueue.getStats()\n if (waitingCount > 50 || runningCount > 50) {\n verificationLogger.warn(`Background queue is full, pausing listener`)\n this.jetstream?.close()\n await this.backgroundQueue.processAll()\n await this.start()\n return false\n }\n return true\n }\n\n handleNewVerification(\n issuer: string,\n uri: string,\n cid: string,\n record: VerificationRecord,\n cursor: number,\n ) {\n this.backgroundQueue.add(async () => {\n try {\n const { subject, handle, displayName, createdAt } = record\n await this.verificationService.create([\n { uri, cid, issuer, subject, handle, displayName, createdAt },\n ])\n await this.updateCursor(cursor)\n } catch (err) {\n verificationLogger.error(\n err,\n 'Error handling verification create event',\n )\n }\n })\n }\n\n handleDeletedVerification(uri: string, cursor: number) {\n this.backgroundQueue.add(async () => {\n try {\n await this.verificationService.markRevoked({\n uris: [uri],\n })\n await this.updateCursor(cursor)\n } catch (err) {\n verificationLogger.error(\n err,\n 'Error handling verification delete event',\n )\n }\n })\n }\n\n async getCursor() {\n await this.verificationService.createFirehoseCursor()\n const cursor = await this.verificationService.getFirehoseCursor()\n if (cursor) {\n this.cursor = cursor\n }\n return this.cursor\n }\n\n async updateCursor(cursor: number) {\n // Assuming cursors are always incremental, if we have processed an event with higher value cursor, let's not update to a lower value\n if (this.cursor && this.cursor >= cursor) {\n return\n }\n\n // This will only update if the cursor is higher than the current one in db\n const updatedCursor =\n await this.verificationService.updateFirehoseCursor(cursor)\n\n if (updatedCursor) {\n this.cursor = updatedCursor\n }\n }\n\n async start() {\n await this.getCursor()\n\n this.jetstream = new Jetstream({\n endpoint: this.jetstreamUrl,\n cursor: this.cursor || undefined,\n wantedCollections: [this.collection],\n wantedDids: this.verifierIssuersToIndex?.length\n ? this.verifierIssuersToIndex\n : undefined,\n })\n\n await this.jetstream.start({\n onCreate: {\n [this.collection]: async (e: CommitCreateEvent<VerificationRecord>) => {\n const recordValidity = lexicons.validate(\n this.collection,\n e.commit.record,\n )\n\n if (!recordValidity.success) {\n verificationLogger.error(\n recordValidity.error,\n 'Invalid verification record in the firehose',\n )\n return\n }\n\n const hasCapacity = await this.ensureCoolDown()\n if (hasCapacity) {\n const issuer = e.did\n const { record, rkey, collection, cid } = e.commit\n const uri = `at://${issuer}/${collection}/${rkey}`\n this.handleNewVerification(issuer, uri, cid, record, e.time_us)\n }\n },\n },\n onDelete: {\n [this.collection]: async (e) => {\n const hasCapacity = await this.ensureCoolDown()\n if (hasCapacity) {\n this.handleDeletedVerification(\n `at://${e.did}/${e.commit.collection}/${e.commit.rkey}`,\n e.time_us,\n )\n }\n },\n },\n })\n }\n\n async stop() {\n if (!this.destroyed) {\n this.destroyed = true\n try {\n await this.jetstream?.close()\n } finally {\n await this.backgroundQueue.destroy()\n }\n }\n }\n}\n"]}
|
package/dist/db/index.d.ts
CHANGED
|
@@ -1,6 +1,5 @@
|
|
|
1
|
-
import { Migrator } from 'kysely';
|
|
2
|
-
|
|
3
|
-
declare const PgPool: typeof pg.Pool;
|
|
1
|
+
import { Migrator } from 'kysely/migration';
|
|
2
|
+
declare const PgPool: typeof import("pg").Pool;
|
|
4
3
|
type PgPool = InstanceType<typeof PgPool>;
|
|
5
4
|
import type TypedEmitter from 'typed-emitter';
|
|
6
5
|
import { DatabaseSchema } from './schema/index.js';
|
|
@@ -24,8 +23,8 @@ export declare class Database {
|
|
|
24
23
|
transaction<T>(fn: (db: Database) => Promise<T>): Promise<T>;
|
|
25
24
|
onCommit(fn: () => void): void;
|
|
26
25
|
close(): Promise<void>;
|
|
27
|
-
migrateToOrThrow(migration: string): Promise<import("kysely").MigrationResult[]>;
|
|
28
|
-
migrateToLatestOrThrow(): Promise<import("kysely").MigrationResult[]>;
|
|
26
|
+
migrateToOrThrow(migration: string): Promise<import("kysely/migration").MigrationResult[]>;
|
|
27
|
+
migrateToLatestOrThrow(): Promise<import("kysely/migration").MigrationResult[]>;
|
|
29
28
|
}
|
|
30
29
|
export default Database;
|
|
31
30
|
type TxnEmitter = TypedEmitter.default<TxnEvents>;
|
package/dist/db/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/db/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/db/index.ts"],"names":[],"mappings":"AAYA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAA;AAI3C,QAAA,MAAc,MAAM,0BAAuB,CAAA;AAC3C,KAAK,MAAM,GAAG,YAAY,CAAC,OAAO,MAAM,CAAC,CAAA;AACzC,OAAO,KAAK,YAAY,MAAM,eAAe,CAAA;AAI7C,OAAO,EAAE,cAAc,EAAsB,MAAM,mBAAmB,CAAA;AACtE,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAA;AAEtC,qBAAa,QAAQ;IASV,IAAI,EAAE,SAAS;IARxB,IAAI,EAAE,MAAM,CAAA;IACZ,EAAE,EAAE,cAAc,CAAA;IAClB,QAAQ,EAAE,QAAQ,CAAA;IAClB,KAAK,EAAyB,UAAU,CAAA;IACxC,SAAS,UAAQ;IACjB,SAAS,UAAQ;IAEjB,YACS,IAAI,EAAE,SAAS,EACtB,SAAS,CAAC,EAAE;QAAE,EAAE,EAAE,cAAc,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,EAkDjD;IAED,IAAI,MAAM,IAAI,MAAM,GAAG,SAAS,CAE/B;IAED,IAAI,aAAa,YAEhB;IAED,iBAAiB,SAEhB;IAED,oBAAoB,SAEnB;IAEK,WAAW,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAsBjE;IAED,QAAQ,CAAC,EAAE,EAAE,MAAM,IAAI,QAGtB;IAEK,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAI3B;IAEK,gBAAgB,CAAC,SAAS,EAAE,MAAM,yDAYvC;IAEK,sBAAsB,0DAY3B;CACF;eAEc,QAAQ;AA6BvB,KAAK,UAAU,GAAG,YAAY,CAAC,OAAO,CAAC,SAAS,CAAC,CAAA;AAEjD,KAAK,SAAS,GAAG;IACf,MAAM,EAAE,MAAM,IAAI,CAAA;CACnB,CAAA"}
|
package/dist/db/index.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import assert from 'node:assert';
|
|
2
2
|
import { EventEmitter } from 'node:events';
|
|
3
|
-
import { Kysely,
|
|
3
|
+
import { Kysely, PostgresDialect, } from 'kysely';
|
|
4
|
+
import { Migrator } from 'kysely/migration';
|
|
4
5
|
// eslint-disable-next-line import/default
|
|
5
6
|
import pg from 'pg';
|
|
6
7
|
// eslint-disable-next-line import/no-named-as-default-member
|
package/dist/db/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/db/index.ts"],"names":[],"mappings":"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","sourcesContent":["import assert from 'node:assert'\nimport { EventEmitter } from 'node:events'\nimport {\n Kysely,\n KyselyPlugin,\n Migrator,\n PluginTransformQueryArgs,\n PluginTransformResultArgs,\n PostgresDialect,\n QueryResult,\n RootOperationNode,\n UnknownRow,\n} from 'kysely'\n// eslint-disable-next-line import/default\nimport pg from 'pg'\n// eslint-disable-next-line import/no-named-as-default-member\nconst { Pool: PgPool, types: pgTypes } = pg\ntype PgPool = InstanceType<typeof PgPool>\nimport type TypedEmitter from 'typed-emitter'\nimport { dbLogger } from '../logger.js'\nimport * as migrations from './migrations/index.js'\nimport { CtxMigrationProvider } from './migrations/provider.js'\nimport { DatabaseSchema, DatabaseSchemaType } from './schema/index.js'\nimport { PgOptions } from './types.js'\n\nexport class Database {\n pool: PgPool\n db: DatabaseSchema\n migrator: Migrator\n txEvt = new EventEmitter() as TxnEmitter\n destroyed = false\n isPrimary = false\n\n constructor(\n public opts: PgOptions,\n instances?: { db: DatabaseSchema; pool: PgPool },\n ) {\n // if instances are provided, use those\n if (instances) {\n this.db = instances.db\n this.pool = instances.pool\n } else {\n // else create a pool & connect\n const { schema, url } = opts\n const pool =\n opts.pool ??\n new PgPool({\n connectionString: url,\n max: opts.poolSize,\n maxUses: opts.poolMaxUses,\n idleTimeoutMillis: opts.poolIdleTimeoutMs,\n })\n\n // Select count(*) and other pg bigints as js integer\n pgTypes.setTypeParser(pgTypes.builtins.INT8, (n) => parseInt(n, 10))\n\n // Setup schema usage, primarily for test parallelism (each test suite runs in its own pg schema)\n if (schema && !/^[a-z_]+$/i.test(schema)) {\n throw new Error(\n `Postgres schema must only contain [A-Za-z_]: ${schema}`,\n )\n }\n\n pool.on('error', onPoolError)\n pool.on('connect', (client) => {\n client.on('error', onClientError)\n // Used for trigram indexes, e.g. on actor search\n client.query('SET pg_trgm.word_similarity_threshold TO .4;')\n if (schema) {\n // Shared objects such as extensions will go in the public schema\n client.query(`SET search_path TO \"${schema}\",public;`)\n }\n })\n\n this.pool = pool\n this.db = new Kysely<DatabaseSchemaType>({\n dialect: new PostgresDialect({ pool }),\n })\n }\n\n this.migrator = new Migrator({\n db: this.db,\n migrationTableSchema: opts.schema,\n provider: new CtxMigrationProvider(migrations, 'pg'),\n })\n }\n\n get schema(): string | undefined {\n return this.opts.schema\n }\n\n get isTransaction() {\n return this.db.isTransaction\n }\n\n assertTransaction() {\n assert(this.isTransaction, 'Transaction required')\n }\n\n assertNotTransaction() {\n assert(!this.isTransaction, 'Cannot be in a transaction')\n }\n\n async transaction<T>(fn: (db: Database) => Promise<T>): Promise<T> {\n const leakyTxPlugin = new LeakyTxPlugin()\n const { dbTxn, txRes } = await this.db\n .withPlugin(leakyTxPlugin)\n .transaction()\n .execute(async (txn) => {\n const dbTxn = new Database(this.opts, {\n db: txn,\n pool: this.pool,\n })\n const txRes = await fn(dbTxn)\n .catch(async (err) => {\n leakyTxPlugin.endTx()\n // ensure that all in-flight queries are flushed & the connection is open\n await dbTxn.db.getExecutor().provideConnection(noopAsync)\n throw err\n })\n .finally(() => leakyTxPlugin.endTx())\n return { dbTxn, txRes }\n })\n dbTxn?.txEvt.emit('commit')\n return txRes\n }\n\n onCommit(fn: () => void) {\n this.assertTransaction()\n this.txEvt.once('commit', fn)\n }\n\n async close(): Promise<void> {\n if (this.destroyed) return\n await this.db.destroy()\n this.destroyed = true\n }\n\n async migrateToOrThrow(migration: string) {\n if (this.schema) {\n await this.db.schema.createSchema(this.schema).ifNotExists().execute()\n }\n const { error, results } = await this.migrator.migrateTo(migration)\n if (error) {\n throw error\n }\n if (!results) {\n throw new Error('An unknown failure occurred while migrating')\n }\n return results\n }\n\n async migrateToLatestOrThrow() {\n if (this.schema) {\n await this.db.schema.createSchema(this.schema).ifNotExists().execute()\n }\n const { error, results } = await this.migrator.migrateToLatest()\n if (error) {\n throw error\n }\n if (!results) {\n throw new Error('An unknown failure occurred while migrating')\n }\n return results\n }\n}\n\nexport default Database\n\nconst onPoolError = (err: Error) => dbLogger.error({ err }, 'db pool error')\nconst onClientError = (err: Error) => dbLogger.error({ err }, 'db client error')\n\n// utils\n// -------\n\nclass LeakyTxPlugin implements KyselyPlugin {\n private txOver = false\n\n endTx() {\n this.txOver = true\n }\n\n transformQuery(args: PluginTransformQueryArgs): RootOperationNode {\n if (this.txOver) {\n throw new Error('tx already failed')\n }\n return args.node\n }\n\n async transformResult(\n args: PluginTransformResultArgs,\n ): Promise<QueryResult<UnknownRow>> {\n return args.result\n }\n}\n\ntype TxnEmitter = TypedEmitter.default<TxnEvents>\n\ntype TxnEvents = {\n commit: () => void\n}\n\nconst noopAsync = async () => {}\n"]}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/db/index.ts"],"names":[],"mappings":"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","sourcesContent":["import assert from 'node:assert'\nimport { EventEmitter } from 'node:events'\nimport {\n Kysely,\n KyselyPlugin,\n PluginTransformQueryArgs,\n PluginTransformResultArgs,\n PostgresDialect,\n QueryResult,\n RootOperationNode,\n UnknownRow,\n} from 'kysely'\nimport { Migrator } from 'kysely/migration'\n// eslint-disable-next-line import/default\nimport pg from 'pg'\n// eslint-disable-next-line import/no-named-as-default-member\nconst { Pool: PgPool, types: pgTypes } = pg\ntype PgPool = InstanceType<typeof PgPool>\nimport type TypedEmitter from 'typed-emitter'\nimport { dbLogger } from '../logger.js'\nimport * as migrations from './migrations/index.js'\nimport { CtxMigrationProvider } from './migrations/provider.js'\nimport { DatabaseSchema, DatabaseSchemaType } from './schema/index.js'\nimport { PgOptions } from './types.js'\n\nexport class Database {\n pool: PgPool\n db: DatabaseSchema\n migrator: Migrator\n txEvt = new EventEmitter() as TxnEmitter\n destroyed = false\n isPrimary = false\n\n constructor(\n public opts: PgOptions,\n instances?: { db: DatabaseSchema; pool: PgPool },\n ) {\n // if instances are provided, use those\n if (instances) {\n this.db = instances.db\n this.pool = instances.pool\n } else {\n // else create a pool & connect\n const { schema, url } = opts\n const pool =\n opts.pool ??\n new PgPool({\n connectionString: url,\n max: opts.poolSize,\n maxUses: opts.poolMaxUses,\n idleTimeoutMillis: opts.poolIdleTimeoutMs,\n })\n\n // Select count(*) and other pg bigints as js integer\n pgTypes.setTypeParser(pgTypes.builtins.INT8, (n) => parseInt(n, 10))\n\n // Setup schema usage, primarily for test parallelism (each test suite runs in its own pg schema)\n if (schema && !/^[a-z_]+$/i.test(schema)) {\n throw new Error(\n `Postgres schema must only contain [A-Za-z_]: ${schema}`,\n )\n }\n\n pool.on('error', onPoolError)\n pool.on('connect', (client) => {\n client.on('error', onClientError)\n // Used for trigram indexes, e.g. on actor search\n client.query('SET pg_trgm.word_similarity_threshold TO .4;')\n if (schema) {\n // Shared objects such as extensions will go in the public schema\n client.query(`SET search_path TO \"${schema}\",public;`)\n }\n })\n\n this.pool = pool\n this.db = new Kysely<DatabaseSchemaType>({\n dialect: new PostgresDialect({ pool }),\n })\n }\n\n this.migrator = new Migrator({\n db: this.db,\n migrationTableSchema: opts.schema,\n provider: new CtxMigrationProvider(migrations, 'pg'),\n })\n }\n\n get schema(): string | undefined {\n return this.opts.schema\n }\n\n get isTransaction() {\n return this.db.isTransaction\n }\n\n assertTransaction() {\n assert(this.isTransaction, 'Transaction required')\n }\n\n assertNotTransaction() {\n assert(!this.isTransaction, 'Cannot be in a transaction')\n }\n\n async transaction<T>(fn: (db: Database) => Promise<T>): Promise<T> {\n const leakyTxPlugin = new LeakyTxPlugin()\n const { dbTxn, txRes } = await this.db\n .withPlugin(leakyTxPlugin)\n .transaction()\n .execute(async (txn) => {\n const dbTxn = new Database(this.opts, {\n db: txn,\n pool: this.pool,\n })\n const txRes = await fn(dbTxn)\n .catch(async (err) => {\n leakyTxPlugin.endTx()\n // ensure that all in-flight queries are flushed & the connection is open\n await dbTxn.db.getExecutor().provideConnection(noopAsync)\n throw err\n })\n .finally(() => leakyTxPlugin.endTx())\n return { dbTxn, txRes }\n })\n dbTxn?.txEvt.emit('commit')\n return txRes\n }\n\n onCommit(fn: () => void) {\n this.assertTransaction()\n this.txEvt.once('commit', fn)\n }\n\n async close(): Promise<void> {\n if (this.destroyed) return\n await this.db.destroy()\n this.destroyed = true\n }\n\n async migrateToOrThrow(migration: string) {\n if (this.schema) {\n await this.db.schema.createSchema(this.schema).ifNotExists().execute()\n }\n const { error, results } = await this.migrator.migrateTo(migration)\n if (error) {\n throw error\n }\n if (!results) {\n throw new Error('An unknown failure occurred while migrating')\n }\n return results\n }\n\n async migrateToLatestOrThrow() {\n if (this.schema) {\n await this.db.schema.createSchema(this.schema).ifNotExists().execute()\n }\n const { error, results } = await this.migrator.migrateToLatest()\n if (error) {\n throw error\n }\n if (!results) {\n throw new Error('An unknown failure occurred while migrating')\n }\n return results\n }\n}\n\nexport default Database\n\nconst onPoolError = (err: Error) => dbLogger.error({ err }, 'db pool error')\nconst onClientError = (err: Error) => dbLogger.error({ err }, 'db client error')\n\n// utils\n// -------\n\nclass LeakyTxPlugin implements KyselyPlugin {\n private txOver = false\n\n endTx() {\n this.txOver = true\n }\n\n transformQuery(args: PluginTransformQueryArgs): RootOperationNode {\n if (this.txOver) {\n throw new Error('tx already failed')\n }\n return args.node\n }\n\n async transformResult(\n args: PluginTransformResultArgs,\n ): Promise<QueryResult<UnknownRow>> {\n return args.result\n }\n}\n\ntype TxnEmitter = TypedEmitter.default<TxnEvents>\n\ntype TxnEvents = {\n commit: () => void\n}\n\nconst noopAsync = async () => {}\n"]}
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import { Kysely } from 'kysely';
|
|
2
|
-
import { DatabaseSchemaType } from '../schema/index.js';
|
|
3
2
|
export declare function up(db: Kysely<any>): Promise<void>;
|
|
4
|
-
export declare function down(db: Kysely<
|
|
3
|
+
export declare function down(db: Kysely<any>): Promise<void>;
|
|
5
4
|
//# sourceMappingURL=20241220T144630860Z-stats-materialized-views.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"20241220T144630860Z-stats-materialized-views.d.ts","sourceRoot":"","sources":["../../../src/db/migrations/20241220T144630860Z-stats-materialized-views.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAO,MAAM,QAAQ,CAAA;
|
|
1
|
+
{"version":3,"file":"20241220T144630860Z-stats-materialized-views.d.ts","sourceRoot":"","sources":["../../../src/db/migrations/20241220T144630860Z-stats-materialized-views.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAO,MAAM,QAAQ,CAAA;AAUpC,wBAAsB,EAAE,CAAC,EAAE,EAAE,MAAM,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAqMvD;AAED,wBAAsB,IAAI,CAAC,EAAE,EAAE,MAAM,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAKzD"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"20241220T144630860Z-stats-materialized-views.js","sourceRoot":"","sources":["../../../src/db/migrations/20241220T144630860Z-stats-materialized-views.ts"],"names":[],"mappings":"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","sourcesContent":["import { Kysely, sql } from 'kysely'\nimport { REASONAPPEAL } from '../../lexicon/types/com/atproto/moderation/defs.js'\nimport {\n REVIEWESCALATED,\n REVIEWOPEN,\n} from '../../lexicon/types/tools/ozone/moderation/defs.js'\nimport { DatabaseSchemaType } from '../schema/index.js'\nimport * as modEvent from '../schema/moderation_event.js'\nimport * as modStatus from '../schema/moderation_subject_status.js'\nimport * as recordEventsStats from '../schema/record_events_stats.js'\n\nexport async function up(db: Kysely<any>): Promise<void> {\n // Used by \"tools.ozone.moderation.queryStatuses\". Reduces query cost by two\n // order of magnitudes when sorting using \"reportedRecordsCount\" or\n // \"takendownRecordsCount\" and filtering by \"reviewState\".\n await db.schema\n .createIndex('moderation_subject_status_did_id_review_state_idx')\n .on('moderation_subject_status')\n .column('did')\n .expression(sql`\"id\" ASC NULLS FIRST`)\n .column('reviewState')\n .execute()\n\n // ~6sec for 16M events\n await db.schema\n .createView('account_events_stats')\n .materialized()\n .ifNotExists()\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 .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 // ~50sec for 16M events\n await db.schema\n .createView('record_events_stats')\n .materialized()\n .ifNotExists()\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 .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 .createView('account_record_events_stats')\n .materialized()\n .ifNotExists()\n .as(\n (db as Kysely<recordEventsStats.PartialDB>)\n .selectFrom('record_events_stats')\n .select([\n 'subjectDid',\n (eb) =>\n // Casting to \"bigint\" because \"numeric\" gets casted to a string\n // by default by postgres-node.\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 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 await db.schema\n .createView('account_record_status_stats')\n .materialized()\n .ifNotExists()\n .as(\n (db as Kysely<modStatus.PartialDB>)\n .selectFrom('moderation_subject_status')\n .select('did')\n .select([\n sql<number>`COUNT(*)`.as('subjectCount'),\n (eb) =>\n sql<number>`COUNT(*) FILTER (WHERE ${eb.ref('reviewState')} IN (${REVIEWOPEN}, ${REVIEWESCALATED}))`.as(\n 'pendingCount',\n ),\n (eb) =>\n sql<number>`COUNT(*) FILTER (WHERE ${eb.ref('reviewState')} NOT IN (${REVIEWOPEN}, ${REVIEWESCALATED}))`.as(\n 'processedCount',\n ),\n (eb) =>\n sql<number>`COUNT(*) FILTER (WHERE ${eb.ref('takendown')})`.as(\n 'takendownCount',\n ),\n ])\n .where('recordPath', '!=', '')\n .groupBy('did'),\n )\n .execute()\n\n await db.schema\n .createIndex('account_record_status_stats_did_idx')\n .unique()\n .on('account_record_status_stats')\n .column('did')\n .execute()\n\n await db.schema\n .createIndex('account_record_status_stats_takendown_count_idx')\n .on('account_record_status_stats')\n .expression(sql`\"takendownCount\" ASC NULLS FIRST`)\n .column('did')\n .execute()\n}\n\nexport async function down(db: Kysely<DatabaseSchemaType>): Promise<void> {\n db.schema.dropView('account_record_status_stats').materialized().execute()\n db.schema.dropView('account_record_events_stats').materialized().execute()\n db.schema.dropView('record_events_stats').materialized().execute()\n db.schema.dropView('account_events_stats').materialized().execute()\n}\n"]}
|
|
1
|
+
{"version":3,"file":"20241220T144630860Z-stats-materialized-views.js","sourceRoot":"","sources":["../../../src/db/migrations/20241220T144630860Z-stats-materialized-views.ts"],"names":[],"mappings":"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","sourcesContent":["import { Kysely, sql } from 'kysely'\nimport { REASONAPPEAL } from '../../lexicon/types/com/atproto/moderation/defs.js'\nimport {\n REVIEWESCALATED,\n REVIEWOPEN,\n} from '../../lexicon/types/tools/ozone/moderation/defs.js'\nimport * as modEvent from '../schema/moderation_event.js'\nimport * as modStatus from '../schema/moderation_subject_status.js'\nimport * as recordEventsStats from '../schema/record_events_stats.js'\n\nexport async function up(db: Kysely<any>): Promise<void> {\n // Used by \"tools.ozone.moderation.queryStatuses\". Reduces query cost by two\n // order of magnitudes when sorting using \"reportedRecordsCount\" or\n // \"takendownRecordsCount\" and filtering by \"reviewState\".\n await db.schema\n .createIndex('moderation_subject_status_did_id_review_state_idx')\n .on('moderation_subject_status')\n .column('did')\n .expression(sql`\"id\" ASC NULLS FIRST`)\n .column('reviewState')\n .execute()\n\n // ~6sec for 16M events\n await db.schema\n .createView('account_events_stats')\n .materialized()\n .ifNotExists()\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 .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 // ~50sec for 16M events\n await db.schema\n .createView('record_events_stats')\n .materialized()\n .ifNotExists()\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 .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 .createView('account_record_events_stats')\n .materialized()\n .ifNotExists()\n .as(\n (db as Kysely<recordEventsStats.PartialDB>)\n .selectFrom('record_events_stats')\n .select([\n 'subjectDid',\n (eb) =>\n // Casting to \"bigint\" because \"numeric\" gets casted to a string\n // by default by postgres-node.\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 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 await db.schema\n .createView('account_record_status_stats')\n .materialized()\n .ifNotExists()\n .as(\n (db as Kysely<modStatus.PartialDB>)\n .selectFrom('moderation_subject_status')\n .select('did')\n .select([\n sql<number>`COUNT(*)`.as('subjectCount'),\n (eb) =>\n sql<number>`COUNT(*) FILTER (WHERE ${eb.ref('reviewState')} IN (${REVIEWOPEN}, ${REVIEWESCALATED}))`.as(\n 'pendingCount',\n ),\n (eb) =>\n sql<number>`COUNT(*) FILTER (WHERE ${eb.ref('reviewState')} NOT IN (${REVIEWOPEN}, ${REVIEWESCALATED}))`.as(\n 'processedCount',\n ),\n (eb) =>\n sql<number>`COUNT(*) FILTER (WHERE ${eb.ref('takendown')})`.as(\n 'takendownCount',\n ),\n ])\n .where('recordPath', '!=', '')\n .groupBy('did'),\n )\n .execute()\n\n await db.schema\n .createIndex('account_record_status_stats_did_idx')\n .unique()\n .on('account_record_status_stats')\n .column('did')\n .execute()\n\n await db.schema\n .createIndex('account_record_status_stats_takendown_count_idx')\n .on('account_record_status_stats')\n .expression(sql`\"takendownCount\" ASC NULLS FIRST`)\n .column('did')\n .execute()\n}\n\nexport async function down(db: Kysely<any>): Promise<void> {\n db.schema.dropView('account_record_status_stats').materialized().execute()\n db.schema.dropView('account_record_events_stats').materialized().execute()\n db.schema.dropView('record_events_stats').materialized().execute()\n db.schema.dropView('account_events_stats').materialized().execute()\n}\n"]}
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import { Kysely } from 'kysely';
|
|
2
|
-
import { DatabaseSchemaType } from '../schema/index.js';
|
|
3
2
|
export declare function up(db: Kysely<any>): Promise<void>;
|
|
4
|
-
export declare function down(db: Kysely<
|
|
3
|
+
export declare function down(db: Kysely<any>): Promise<void>;
|
|
5
4
|
//# sourceMappingURL=20250718T150931000Z-update-appeal-reason-stats.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"20250718T150931000Z-update-appeal-reason-stats.d.ts","sourceRoot":"","sources":["../../../src/db/migrations/20250718T150931000Z-update-appeal-reason-stats.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAO,MAAM,QAAQ,CAAA;
|
|
1
|
+
{"version":3,"file":"20250718T150931000Z-update-appeal-reason-stats.d.ts","sourceRoot":"","sources":["../../../src/db/migrations/20250718T150931000Z-update-appeal-reason-stats.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAO,MAAM,QAAQ,CAAA;AAMpC,wBAAsB,EAAE,CAAC,EAAE,EAAE,MAAM,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CA0JvD;AAED,wBAAsB,IAAI,CAAC,EAAE,EAAE,MAAM,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAmJzD"}
|