@atproto/ozone 0.1.150 → 0.1.152

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (118) hide show
  1. package/CHANGELOG.md +16 -0
  2. package/dist/api/moderation/queryEvents.d.ts.map +1 -1
  3. package/dist/api/moderation/queryEvents.js +2 -1
  4. package/dist/api/moderation/queryEvents.js.map +1 -1
  5. package/dist/context.d.ts +3 -0
  6. package/dist/context.d.ts.map +1 -1
  7. package/dist/context.js +7 -1
  8. package/dist/context.js.map +1 -1
  9. package/dist/daemon/context.d.ts +3 -0
  10. package/dist/daemon/context.d.ts.map +1 -1
  11. package/dist/daemon/context.js +11 -1
  12. package/dist/daemon/context.js.map +1 -1
  13. package/dist/daemon/index.d.ts +1 -0
  14. package/dist/daemon/index.d.ts.map +1 -1
  15. package/dist/daemon/index.js +3 -1
  16. package/dist/daemon/index.js.map +1 -1
  17. package/dist/daemon/strike-expiry-processor.d.ts +18 -0
  18. package/dist/daemon/strike-expiry-processor.d.ts.map +1 -0
  19. package/dist/daemon/strike-expiry-processor.js +111 -0
  20. package/dist/daemon/strike-expiry-processor.js.map +1 -0
  21. package/dist/db/migrations/20251008T120000000Z-add-strike-system.d.ts +4 -0
  22. package/dist/db/migrations/20251008T120000000Z-add-strike-system.d.ts.map +1 -0
  23. package/dist/db/migrations/20251008T120000000Z-add-strike-system.js +75 -0
  24. package/dist/db/migrations/20251008T120000000Z-add-strike-system.js.map +1 -0
  25. package/dist/db/migrations/index.d.ts +1 -0
  26. package/dist/db/migrations/index.d.ts.map +1 -1
  27. package/dist/db/migrations/index.js +2 -1
  28. package/dist/db/migrations/index.js.map +1 -1
  29. package/dist/db/schema/account_strike.d.ts +12 -0
  30. package/dist/db/schema/account_strike.d.ts.map +1 -0
  31. package/dist/db/schema/account_strike.js +5 -0
  32. package/dist/db/schema/account_strike.js.map +1 -0
  33. package/dist/db/schema/index.d.ts +3 -1
  34. package/dist/db/schema/index.d.ts.map +1 -1
  35. package/dist/db/schema/index.js.map +1 -1
  36. package/dist/db/schema/job_cursor.d.ts +11 -0
  37. package/dist/db/schema/job_cursor.d.ts.map +1 -0
  38. package/dist/db/schema/job_cursor.js +5 -0
  39. package/dist/db/schema/job_cursor.js.map +1 -0
  40. package/dist/db/schema/moderation_event.d.ts +3 -0
  41. package/dist/db/schema/moderation_event.d.ts.map +1 -1
  42. package/dist/db/schema/moderation_event.js.map +1 -1
  43. package/dist/lexicon/lexicons.d.ts +208 -0
  44. package/dist/lexicon/lexicons.d.ts.map +1 -1
  45. package/dist/lexicon/lexicons.js +104 -0
  46. package/dist/lexicon/lexicons.js.map +1 -1
  47. package/dist/lexicon/types/app/bsky/actor/defs.d.ts +12 -0
  48. package/dist/lexicon/types/app/bsky/actor/defs.d.ts.map +1 -1
  49. package/dist/lexicon/types/app/bsky/actor/defs.js.map +1 -1
  50. package/dist/lexicon/types/app/bsky/feed/defs.d.ts +4 -0
  51. package/dist/lexicon/types/app/bsky/feed/defs.d.ts.map +1 -1
  52. package/dist/lexicon/types/app/bsky/feed/defs.js.map +1 -1
  53. package/dist/lexicon/types/tools/ozone/moderation/defs.d.ts +35 -0
  54. package/dist/lexicon/types/tools/ozone/moderation/defs.d.ts.map +1 -1
  55. package/dist/lexicon/types/tools/ozone/moderation/defs.js +9 -0
  56. package/dist/lexicon/types/tools/ozone/moderation/defs.js.map +1 -1
  57. package/dist/lexicon/types/tools/ozone/moderation/queryEvents.d.ts +2 -0
  58. package/dist/lexicon/types/tools/ozone/moderation/queryEvents.d.ts.map +1 -1
  59. package/dist/lexicon/types/tools/ozone/moderation/queryEvents.js.map +1 -1
  60. package/dist/lexicon/types/tools/ozone/moderation/queryStatuses.d.ts +2 -0
  61. package/dist/lexicon/types/tools/ozone/moderation/queryStatuses.d.ts.map +1 -1
  62. package/dist/lexicon/types/tools/ozone/moderation/queryStatuses.js.map +1 -1
  63. package/dist/mod-service/index.d.ts +9 -3
  64. package/dist/mod-service/index.d.ts.map +1 -1
  65. package/dist/mod-service/index.js +59 -6
  66. package/dist/mod-service/index.js.map +1 -1
  67. package/dist/mod-service/status.d.ts +44 -2
  68. package/dist/mod-service/status.d.ts.map +1 -1
  69. package/dist/mod-service/status.js +7 -0
  70. package/dist/mod-service/status.js.map +1 -1
  71. package/dist/mod-service/strike.d.ts +19 -0
  72. package/dist/mod-service/strike.d.ts.map +1 -0
  73. package/dist/mod-service/strike.js +86 -0
  74. package/dist/mod-service/strike.js.map +1 -0
  75. package/dist/mod-service/types.d.ts +4 -0
  76. package/dist/mod-service/types.d.ts.map +1 -1
  77. package/dist/mod-service/types.js.map +1 -1
  78. package/dist/mod-service/views.d.ts.map +1 -1
  79. package/dist/mod-service/views.js +20 -4
  80. package/dist/mod-service/views.js.map +1 -1
  81. package/dist/setting/constants.d.ts +1 -0
  82. package/dist/setting/constants.d.ts.map +1 -1
  83. package/dist/setting/constants.js +2 -1
  84. package/dist/setting/constants.js.map +1 -1
  85. package/dist/setting/validators.d.ts.map +1 -1
  86. package/dist/setting/validators.js +179 -0
  87. package/dist/setting/validators.js.map +1 -1
  88. package/package.json +3 -3
  89. package/src/api/moderation/queryEvents.ts +2 -0
  90. package/src/context.ts +20 -11
  91. package/src/daemon/context.ts +15 -1
  92. package/src/daemon/index.ts +1 -0
  93. package/src/daemon/strike-expiry-processor.ts +111 -0
  94. package/src/db/migrations/20251008T120000000Z-add-strike-system.ts +87 -0
  95. package/src/db/migrations/index.ts +1 -0
  96. package/src/db/schema/account_strike.ts +13 -0
  97. package/src/db/schema/index.ts +4 -0
  98. package/src/db/schema/job_cursor.ts +13 -0
  99. package/src/db/schema/moderation_event.ts +3 -0
  100. package/src/lexicon/lexicons.ts +119 -0
  101. package/src/lexicon/types/app/bsky/actor/defs.ts +6 -0
  102. package/src/lexicon/types/app/bsky/feed/defs.ts +2 -0
  103. package/src/lexicon/types/tools/ozone/moderation/defs.ts +44 -0
  104. package/src/lexicon/types/tools/ozone/moderation/queryEvents.ts +2 -0
  105. package/src/lexicon/types/tools/ozone/moderation/queryStatuses.ts +2 -0
  106. package/src/mod-service/index.ts +70 -3
  107. package/src/mod-service/status.ts +9 -0
  108. package/src/mod-service/strike.ts +96 -0
  109. package/src/mod-service/types.ts +6 -0
  110. package/src/mod-service/views.ts +25 -4
  111. package/src/setting/constants.ts +1 -0
  112. package/src/setting/validators.ts +231 -1
  113. package/tests/__snapshots__/account-strikes.test.ts.snap +159 -0
  114. package/tests/account-strikes.test.ts +184 -0
  115. package/tests/query-labels.test.ts +1 -0
  116. package/tests/strike-expiry-processor.test.ts +299 -0
  117. package/tsconfig.build.tsbuildinfo +1 -1
  118. package/tsconfig.tests.tsbuildinfo +1 -1
package/CHANGELOG.md CHANGED
@@ -1,5 +1,21 @@
1
1
  # @atproto/ozone
2
2
 
3
+ ## 0.1.152
4
+
5
+ ### Patch Changes
6
+
7
+ - Updated dependencies [[`7c1429fe3`](https://github.com/bluesky-social/atproto/commit/7c1429fe36226d0d57e57c037ba4221d2fbd57ee)]:
8
+ - @atproto/api@0.17.6
9
+
10
+ ## 0.1.151
11
+
12
+ ### Patch Changes
13
+
14
+ - [#4279](https://github.com/bluesky-social/atproto/pull/4279) [`601401afc`](https://github.com/bluesky-social/atproto/commit/601401afce9f4da2e8a257f8dcca996dd64e6031) Thanks [@foysalit](https://github.com/foysalit)! - Add strike system to ozone
15
+
16
+ - Updated dependencies [[`601401afc`](https://github.com/bluesky-social/atproto/commit/601401afce9f4da2e8a257f8dcca996dd64e6031)]:
17
+ - @atproto/api@0.17.5
18
+
3
19
  ## 0.1.150
4
20
 
5
21
  ### Patch Changes
@@ -1 +1 @@
1
- {"version":3,"file":"queryEvents.d.ts","sourceRoot":"","sources":["../../../src/api/moderation/queryEvents.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAA;AAC1C,OAAO,EAAE,MAAM,EAAE,MAAM,eAAe,CAAA;AAGtC,MAAM,CAAC,OAAO,WAAW,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,UAAU,QAiEvD"}
1
+ {"version":3,"file":"queryEvents.d.ts","sourceRoot":"","sources":["../../../src/api/moderation/queryEvents.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAA;AAC1C,OAAO,EAAE,MAAM,EAAE,MAAM,eAAe,CAAA;AAGtC,MAAM,CAAC,OAAO,WAAW,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,UAAU,QAmEvD"}
@@ -6,7 +6,7 @@ function default_1(server, ctx) {
6
6
  server.tools.ozone.moderation.queryEvents({
7
7
  auth: ctx.authVerifier.modOrAdminToken,
8
8
  handler: async ({ params }) => {
9
- const { subject, limit = 50, cursor, sortDirection = 'desc', types, includeAllUserRecords = false, hasComment, comment, createdBy, createdAfter, createdBefore, addedLabels = [], removedLabels = [], addedTags = [], removedTags = [], reportTypes, collections = [], subjectType, policies, modTool, ageAssuranceState, batchId, } = params;
9
+ const { subject, limit = 50, cursor, sortDirection = 'desc', types, includeAllUserRecords = false, hasComment, comment, createdBy, createdAfter, createdBefore, addedLabels = [], removedLabels = [], addedTags = [], removedTags = [], reportTypes, collections = [], subjectType, policies, modTool, ageAssuranceState, batchId, withStrike, } = params;
10
10
  const db = ctx.db;
11
11
  const modService = ctx.modService(db);
12
12
  const results = await modService.getEvents({
@@ -32,6 +32,7 @@ function default_1(server, ctx) {
32
32
  modTool,
33
33
  ageAssuranceState,
34
34
  batchId,
35
+ withStrike,
35
36
  });
36
37
  return {
37
38
  encoding: 'application/json',
@@ -1 +1 @@
1
- {"version":3,"file":"queryEvents.js","sourceRoot":"","sources":["../../../src/api/moderation/queryEvents.ts"],"names":[],"mappings":";;AAIA,4BAiEC;AAnED,kCAAsC;AAEtC,mBAAyB,MAAc,EAAE,GAAe;IACtD,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,UAAU,CAAC,WAAW,CAAC;QACxC,IAAI,EAAE,GAAG,CAAC,YAAY,CAAC,eAAe;QACtC,OAAO,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE;YAC5B,MAAM,EACJ,OAAO,EACP,KAAK,GAAG,EAAE,EACV,MAAM,EACN,aAAa,GAAG,MAAM,EACtB,KAAK,EACL,qBAAqB,GAAG,KAAK,EAC7B,UAAU,EACV,OAAO,EACP,SAAS,EACT,YAAY,EACZ,aAAa,EACb,WAAW,GAAG,EAAE,EAChB,aAAa,GAAG,EAAE,EAClB,SAAS,GAAG,EAAE,EACd,WAAW,GAAG,EAAE,EAChB,WAAW,EACX,WAAW,GAAG,EAAE,EAChB,WAAW,EACX,QAAQ,EACR,OAAO,EACP,iBAAiB,EACjB,OAAO,GACR,GAAG,MAAM,CAAA;YACV,MAAM,EAAE,GAAG,GAAG,CAAC,EAAE,CAAA;YACjB,MAAM,UAAU,GAAG,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC,CAAA;YACrC,MAAM,OAAO,GAAG,MAAM,UAAU,CAAC,SAAS,CAAC;gBACzC,KAAK,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,mBAAY,CAAC,CAAC,CAAC,CAAC,EAAE;gBACnD,OAAO;gBACP,SAAS;gBACT,KAAK;gBACL,MAAM;gBACN,aAAa;gBACb,qBAAqB;gBACrB,UAAU;gBACV,OAAO;gBACP,YAAY;gBACZ,aAAa;gBACb,WAAW;gBACX,SAAS;gBACT,aAAa;gBACb,WAAW;gBACX,WAAW;gBACX,WAAW;gBACX,WAAW;gBACX,QAAQ;gBACR,OAAO;gBACP,iBAAiB;gBACjB,OAAO;aACR,CAAC,CAAA;YACF,OAAO;gBACL,QAAQ,EAAE,kBAAkB;gBAC5B,IAAI,EAAE;oBACJ,MAAM,EAAE,OAAO,CAAC,MAAM;oBACtB,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CACjC,UAAU,CAAC,KAAK,CAAC,WAAW,CAAC,GAAG,CAAC,CAClC;iBACF;aACF,CAAA;QACH,CAAC;KACF,CAAC,CAAA;AACJ,CAAC","sourcesContent":["import { AppContext } from '../../context'\nimport { Server } from '../../lexicon'\nimport { getEventType } from '../util'\n\nexport default function (server: Server, ctx: AppContext) {\n server.tools.ozone.moderation.queryEvents({\n auth: ctx.authVerifier.modOrAdminToken,\n handler: async ({ params }) => {\n const {\n subject,\n limit = 50,\n cursor,\n sortDirection = 'desc',\n types,\n includeAllUserRecords = false,\n hasComment,\n comment,\n createdBy,\n createdAfter,\n createdBefore,\n addedLabels = [],\n removedLabels = [],\n addedTags = [],\n removedTags = [],\n reportTypes,\n collections = [],\n subjectType,\n policies,\n modTool,\n ageAssuranceState,\n batchId,\n } = params\n const db = ctx.db\n const modService = ctx.modService(db)\n const results = await modService.getEvents({\n types: types?.length ? types.map(getEventType) : [],\n subject,\n createdBy,\n limit,\n cursor,\n sortDirection,\n includeAllUserRecords,\n hasComment,\n comment,\n createdAfter,\n createdBefore,\n addedLabels,\n addedTags,\n removedLabels,\n removedTags,\n reportTypes,\n collections,\n subjectType,\n policies,\n modTool,\n ageAssuranceState,\n batchId,\n })\n return {\n encoding: 'application/json',\n body: {\n cursor: results.cursor,\n events: results.events.map((evt) =>\n modService.views.formatEvent(evt),\n ),\n },\n }\n },\n })\n}\n"]}
1
+ {"version":3,"file":"queryEvents.js","sourceRoot":"","sources":["../../../src/api/moderation/queryEvents.ts"],"names":[],"mappings":";;AAIA,4BAmEC;AArED,kCAAsC;AAEtC,mBAAyB,MAAc,EAAE,GAAe;IACtD,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,UAAU,CAAC,WAAW,CAAC;QACxC,IAAI,EAAE,GAAG,CAAC,YAAY,CAAC,eAAe;QACtC,OAAO,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE;YAC5B,MAAM,EACJ,OAAO,EACP,KAAK,GAAG,EAAE,EACV,MAAM,EACN,aAAa,GAAG,MAAM,EACtB,KAAK,EACL,qBAAqB,GAAG,KAAK,EAC7B,UAAU,EACV,OAAO,EACP,SAAS,EACT,YAAY,EACZ,aAAa,EACb,WAAW,GAAG,EAAE,EAChB,aAAa,GAAG,EAAE,EAClB,SAAS,GAAG,EAAE,EACd,WAAW,GAAG,EAAE,EAChB,WAAW,EACX,WAAW,GAAG,EAAE,EAChB,WAAW,EACX,QAAQ,EACR,OAAO,EACP,iBAAiB,EACjB,OAAO,EACP,UAAU,GACX,GAAG,MAAM,CAAA;YACV,MAAM,EAAE,GAAG,GAAG,CAAC,EAAE,CAAA;YACjB,MAAM,UAAU,GAAG,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC,CAAA;YACrC,MAAM,OAAO,GAAG,MAAM,UAAU,CAAC,SAAS,CAAC;gBACzC,KAAK,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,mBAAY,CAAC,CAAC,CAAC,CAAC,EAAE;gBACnD,OAAO;gBACP,SAAS;gBACT,KAAK;gBACL,MAAM;gBACN,aAAa;gBACb,qBAAqB;gBACrB,UAAU;gBACV,OAAO;gBACP,YAAY;gBACZ,aAAa;gBACb,WAAW;gBACX,SAAS;gBACT,aAAa;gBACb,WAAW;gBACX,WAAW;gBACX,WAAW;gBACX,WAAW;gBACX,QAAQ;gBACR,OAAO;gBACP,iBAAiB;gBACjB,OAAO;gBACP,UAAU;aACX,CAAC,CAAA;YACF,OAAO;gBACL,QAAQ,EAAE,kBAAkB;gBAC5B,IAAI,EAAE;oBACJ,MAAM,EAAE,OAAO,CAAC,MAAM;oBACtB,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CACjC,UAAU,CAAC,KAAK,CAAC,WAAW,CAAC,GAAG,CAAC,CAClC;iBACF;aACF,CAAA;QACH,CAAC;KACF,CAAC,CAAA;AACJ,CAAC","sourcesContent":["import { AppContext } from '../../context'\nimport { Server } from '../../lexicon'\nimport { getEventType } from '../util'\n\nexport default function (server: Server, ctx: AppContext) {\n server.tools.ozone.moderation.queryEvents({\n auth: ctx.authVerifier.modOrAdminToken,\n handler: async ({ params }) => {\n const {\n subject,\n limit = 50,\n cursor,\n sortDirection = 'desc',\n types,\n includeAllUserRecords = false,\n hasComment,\n comment,\n createdBy,\n createdAfter,\n createdBefore,\n addedLabels = [],\n removedLabels = [],\n addedTags = [],\n removedTags = [],\n reportTypes,\n collections = [],\n subjectType,\n policies,\n modTool,\n ageAssuranceState,\n batchId,\n withStrike,\n } = params\n const db = ctx.db\n const modService = ctx.modService(db)\n const results = await modService.getEvents({\n types: types?.length ? types.map(getEventType) : [],\n subject,\n createdBy,\n limit,\n cursor,\n sortDirection,\n includeAllUserRecords,\n hasComment,\n comment,\n createdAfter,\n createdBefore,\n addedLabels,\n addedTags,\n removedLabels,\n removedTags,\n reportTypes,\n collections,\n subjectType,\n policies,\n modTool,\n ageAssuranceState,\n batchId,\n withStrike,\n })\n return {\n encoding: 'application/json',\n body: {\n cursor: results.cursor,\n events: results.events.map((evt) =>\n modService.views.formatEvent(evt),\n ),\n },\n }\n },\n })\n}\n"]}
package/dist/context.d.ts CHANGED
@@ -12,6 +12,7 @@ import { Database } from './db';
12
12
  import { ImageInvalidator } from './image-invalidator';
13
13
  import { ModerationServiceCreator } from './mod-service';
14
14
  import { ModerationServiceProfileCreator } from './mod-service/profile';
15
+ import { StrikeServiceCreator } from './mod-service/strike';
15
16
  import { SafelinkRuleServiceCreator } from './safelink/service';
16
17
  import { ScheduledActionServiceCreator } from './scheduled-action/service';
17
18
  import { Sequencer } from './sequencer/sequencer';
@@ -31,6 +32,7 @@ export type AppContextOptions = {
31
32
  scheduledActionService: ScheduledActionServiceCreator;
32
33
  setService: SetServiceCreator;
33
34
  settingService: SettingServiceCreator;
35
+ strikeService: StrikeServiceCreator;
34
36
  teamService: TeamServiceCreator;
35
37
  appviewAgent: AtpAgent;
36
38
  pdsAgent: AtpAgent | undefined;
@@ -63,6 +65,7 @@ export declare class AppContext {
63
65
  get teamService(): TeamServiceCreator;
64
66
  get setService(): SetServiceCreator;
65
67
  get settingService(): SettingServiceCreator;
68
+ get strikeService(): StrikeServiceCreator;
66
69
  get verificationService(): VerificationServiceCreator;
67
70
  get verificationIssuer(): VerificationIssuerCreator;
68
71
  get moderationServiceProfile(): ModerationServiceProfileCreator;
@@ -1 +1 @@
1
- {"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../src/context.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../src/context.ts"],"names":[],"mappings":"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"}
package/dist/context.js CHANGED
@@ -51,6 +51,7 @@ const blob_diverter_1 = require("./daemon/blob-diverter");
51
51
  const db_1 = require("./db");
52
52
  const mod_service_1 = require("./mod-service");
53
53
  const profile_1 = require("./mod-service/profile");
54
+ const strike_1 = require("./mod-service/strike");
54
55
  const service_1 = require("./safelink/service");
55
56
  const service_2 = require("./scheduled-action/service");
56
57
  const sequencer_1 = require("./sequencer/sequencer");
@@ -114,16 +115,17 @@ class AppContext {
114
115
  appview: cfg.appview.pushEvents ? cfg.appview : undefined,
115
116
  pds: cfg.pds ?? undefined,
116
117
  });
117
- const modService = mod_service_1.ModerationService.creator(signingKey, signingKeyId, cfg, backgroundQueue, idResolver, eventPusher, appviewAgent, createAuthHeaders, overrides?.imgInvalidator);
118
118
  const communicationTemplateService = template_1.CommunicationTemplateService.creator();
119
119
  const safelinkRuleService = service_1.SafelinkRuleService.creator();
120
120
  const scheduledActionService = service_2.ScheduledActionService.creator();
121
121
  const teamService = team_1.TeamService.creator(appviewAgent, cfg.appview.did, createAuthHeaders);
122
122
  const setService = service_3.SetService.creator();
123
123
  const settingService = service_4.SettingService.creator();
124
+ const strikeService = strike_1.StrikeService.creator();
124
125
  const verificationService = service_5.VerificationService.creator();
125
126
  const verificationIssuer = issuer_1.VerificationIssuer.creator();
126
127
  const moderationServiceProfile = profile_1.ModerationServiceProfile.creator(cfg, appviewAgent);
128
+ const modService = mod_service_1.ModerationService.creator(signingKey, signingKeyId, cfg, backgroundQueue, idResolver, eventPusher, appviewAgent, createAuthHeaders, strikeService, overrides?.imgInvalidator);
127
129
  const sequencer = new sequencer_1.Sequencer(modService(db));
128
130
  const authVerifier = new auth_verifier_1.AuthVerifier(idResolver, {
129
131
  serviceDid: cfg.service.did,
@@ -141,6 +143,7 @@ class AppContext {
141
143
  teamService,
142
144
  setService,
143
145
  settingService,
146
+ strikeService,
144
147
  appviewAgent,
145
148
  pdsAgent,
146
149
  chatAgent,
@@ -191,6 +194,9 @@ class AppContext {
191
194
  get settingService() {
192
195
  return this.opts.settingService;
193
196
  }
197
+ get strikeService() {
198
+ return this.opts.strikeService;
199
+ }
194
200
  get verificationService() {
195
201
  return this.opts.verificationService;
196
202
  }
@@ -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 { AuthVerifier } from './auth-verifier'\nimport { BackgroundQueue } from './background'\nimport {\n CommunicationTemplateService,\n CommunicationTemplateServiceCreator,\n} from './communication-service/template'\nimport { OzoneConfig, OzoneSecrets } from './config'\nimport { EventPusher } from './daemon'\nimport { BlobDiverter } from './daemon/blob-diverter'\nimport { Database } from './db'\nimport { ImageInvalidator } from './image-invalidator'\nimport { ModerationService, ModerationServiceCreator } from './mod-service'\nimport {\n ModerationServiceProfile,\n ModerationServiceProfileCreator,\n} from './mod-service/profile'\nimport {\n SafelinkRuleService,\n SafelinkRuleServiceCreator,\n} from './safelink/service'\nimport {\n ScheduledActionService,\n ScheduledActionServiceCreator,\n} from './scheduled-action/service'\nimport { Sequencer } from './sequencer/sequencer'\nimport { SetService, SetServiceCreator } from './set/service'\nimport { SettingService, SettingServiceCreator } from './setting/service'\nimport { TeamService, TeamServiceCreator } from './team'\nimport {\n LABELER_HEADER_NAME,\n ParsedLabelers,\n defaultLabelerHeader,\n getSigningKeyId,\n parseLabelerHeader,\n} from './util'\nimport {\n VerificationIssuer,\n VerificationIssuerCreator,\n} from './verification/issuer'\nimport {\n VerificationService,\n VerificationServiceCreator,\n} from './verification/service'\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 setService: SetServiceCreator\n settingService: SettingServiceCreator\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 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 const modService = ModerationService.creator(\n signingKey,\n signingKeyId,\n cfg,\n backgroundQueue,\n idResolver,\n eventPusher,\n appviewAgent,\n createAuthHeaders,\n overrides?.imgInvalidator,\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 setService = SetService.creator()\n const settingService = SettingService.creator()\n const verificationService = VerificationService.creator()\n const verificationIssuer = VerificationIssuer.creator()\n const moderationServiceProfile = ModerationServiceProfile.creator(\n cfg,\n appviewAgent,\n )\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 setService,\n settingService,\n appviewAgent,\n pdsAgent,\n chatAgent,\n signingKey,\n signingKeyId,\n didCache,\n idResolver,\n backgroundQueue,\n sequencer,\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 setService(): SetServiceCreator {\n return this.opts.setService\n }\n\n get settingService(): SettingServiceCreator {\n return this.opts.settingService\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 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":"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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 { AuthVerifier } from './auth-verifier'\nimport { BackgroundQueue } from './background'\nimport {\n CommunicationTemplateService,\n CommunicationTemplateServiceCreator,\n} from './communication-service/template'\nimport { OzoneConfig, OzoneSecrets } from './config'\nimport { EventPusher } from './daemon'\nimport { BlobDiverter } from './daemon/blob-diverter'\nimport { Database } from './db'\nimport { ImageInvalidator } from './image-invalidator'\nimport { ModerationService, ModerationServiceCreator } from './mod-service'\nimport {\n ModerationServiceProfile,\n ModerationServiceProfileCreator,\n} from './mod-service/profile'\nimport { StrikeService, StrikeServiceCreator } from './mod-service/strike'\nimport {\n SafelinkRuleService,\n SafelinkRuleServiceCreator,\n} from './safelink/service'\nimport {\n ScheduledActionService,\n ScheduledActionServiceCreator,\n} from './scheduled-action/service'\nimport { Sequencer } from './sequencer/sequencer'\nimport { SetService, SetServiceCreator } from './set/service'\nimport { SettingService, SettingServiceCreator } from './setting/service'\nimport { TeamService, TeamServiceCreator } from './team'\nimport {\n LABELER_HEADER_NAME,\n ParsedLabelers,\n defaultLabelerHeader,\n getSigningKeyId,\n parseLabelerHeader,\n} from './util'\nimport {\n VerificationIssuer,\n VerificationIssuerCreator,\n} from './verification/issuer'\nimport {\n VerificationService,\n VerificationServiceCreator,\n} from './verification/service'\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 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 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 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\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 setService,\n settingService,\n strikeService,\n appviewAgent,\n pdsAgent,\n chatAgent,\n signingKey,\n signingKeyId,\n didCache,\n idResolver,\n backgroundQueue,\n sequencer,\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 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 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"]}
@@ -6,6 +6,7 @@ import { EventPusher } from './event-pusher';
6
6
  import { EventReverser } from './event-reverser';
7
7
  import { MaterializedViewRefresher } from './materialized-view-refresher';
8
8
  import { ScheduledActionProcessor } from './scheduled-action-processor';
9
+ import { StrikeExpiryProcessor } from './strike-expiry-processor';
9
10
  import { TeamProfileSynchronizer } from './team-profile-synchronizer';
10
11
  import { VerificationListener } from './verification-listener';
11
12
  export type DaemonContextOptions = {
@@ -18,6 +19,7 @@ export type DaemonContextOptions = {
18
19
  materializedViewRefresher: MaterializedViewRefresher;
19
20
  teamProfileSynchronizer: TeamProfileSynchronizer;
20
21
  scheduledActionProcessor: ScheduledActionProcessor;
22
+ strikeExpiryProcessor: StrikeExpiryProcessor;
21
23
  verificationListener?: VerificationListener;
22
24
  };
23
25
  export declare class DaemonContext {
@@ -32,6 +34,7 @@ export declare class DaemonContext {
32
34
  get materializedViewRefresher(): MaterializedViewRefresher;
33
35
  get teamProfileSynchronizer(): TeamProfileSynchronizer;
34
36
  get scheduledActionProcessor(): ScheduledActionProcessor;
37
+ get strikeExpiryProcessor(): StrikeExpiryProcessor;
35
38
  get verificationListener(): VerificationListener | undefined;
36
39
  start(): Promise<void>;
37
40
  processAll(): Promise<void>;
@@ -1 +1 @@
1
- {"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../src/daemon/context.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,EAAoB,MAAM,iBAAiB,CAAA;AAG3D,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAA;AAC/C,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,WAAW,CAAA;AACrD,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAA;AAMhC,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAA;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAA;AAChD,OAAO,EAAE,yBAAyB,EAAE,MAAM,+BAA+B,CAAA;AACzE,OAAO,EAAE,wBAAwB,EAAE,MAAM,8BAA8B,CAAA;AACvE,OAAO,EAAE,uBAAuB,EAAE,MAAM,6BAA6B,CAAA;AACrE,OAAO,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAA;AAE9D,MAAM,MAAM,oBAAoB,GAAG;IACjC,EAAE,EAAE,QAAQ,CAAA;IACZ,GAAG,EAAE,WAAW,CAAA;IAChB,eAAe,EAAE,eAAe,CAAA;IAChC,UAAU,EAAE,OAAO,CAAA;IACnB,WAAW,EAAE,WAAW,CAAA;IACxB,aAAa,EAAE,aAAa,CAAA;IAC5B,yBAAyB,EAAE,yBAAyB,CAAA;IACpD,uBAAuB,EAAE,uBAAuB,CAAA;IAChD,wBAAwB,EAAE,wBAAwB,CAAA;IAClD,oBAAoB,CAAC,EAAE,oBAAoB,CAAA;CAC5C,CAAA;AAED,qBAAa,aAAa;IACZ,OAAO,CAAC,IAAI;gBAAJ,IAAI,EAAE,oBAAoB;WAEjC,UAAU,CACrB,GAAG,EAAE,WAAW,EAChB,OAAO,EAAE,YAAY,EACrB,SAAS,CAAC,EAAE,OAAO,CAAC,oBAAoB,CAAC,GACxC,OAAO,CAAC,aAAa,CAAC;IA2FzB,IAAI,EAAE,IAAI,QAAQ,CAEjB;IAED,IAAI,GAAG,IAAI,WAAW,CAErB;IAED,IAAI,eAAe,IAAI,eAAe,CAErC;IAED,IAAI,WAAW,IAAI,WAAW,CAE7B;IAED,IAAI,aAAa,IAAI,aAAa,CAEjC;IAED,IAAI,yBAAyB,IAAI,yBAAyB,CAEzD;IAED,IAAI,uBAAuB,IAAI,uBAAuB,CAErD;IAED,IAAI,wBAAwB,IAAI,wBAAwB,CAEvD;IAED,IAAI,oBAAoB,IAAI,oBAAoB,GAAG,SAAS,CAE3D;IAEK,KAAK;IASL,UAAU;IAOV,OAAO;CAed"}
1
+ {"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../src/daemon/context.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,EAAoB,MAAM,iBAAiB,CAAA;AAG3D,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAA;AAC/C,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,WAAW,CAAA;AACrD,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAA;AAOhC,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAA;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAA;AAChD,OAAO,EAAE,yBAAyB,EAAE,MAAM,+BAA+B,CAAA;AACzE,OAAO,EAAE,wBAAwB,EAAE,MAAM,8BAA8B,CAAA;AACvE,OAAO,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAA;AACjE,OAAO,EAAE,uBAAuB,EAAE,MAAM,6BAA6B,CAAA;AACrE,OAAO,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAA;AAE9D,MAAM,MAAM,oBAAoB,GAAG;IACjC,EAAE,EAAE,QAAQ,CAAA;IACZ,GAAG,EAAE,WAAW,CAAA;IAChB,eAAe,EAAE,eAAe,CAAA;IAChC,UAAU,EAAE,OAAO,CAAA;IACnB,WAAW,EAAE,WAAW,CAAA;IACxB,aAAa,EAAE,aAAa,CAAA;IAC5B,yBAAyB,EAAE,yBAAyB,CAAA;IACpD,uBAAuB,EAAE,uBAAuB,CAAA;IAChD,wBAAwB,EAAE,wBAAwB,CAAA;IAClD,qBAAqB,EAAE,qBAAqB,CAAA;IAC5C,oBAAoB,CAAC,EAAE,oBAAoB,CAAA;CAC5C,CAAA;AAED,qBAAa,aAAa;IACZ,OAAO,CAAC,IAAI;gBAAJ,IAAI,EAAE,oBAAoB;WAEjC,UAAU,CACrB,GAAG,EAAE,WAAW,EAChB,OAAO,EAAE,YAAY,EACrB,SAAS,CAAC,EAAE,OAAO,CAAC,oBAAoB,CAAC,GACxC,OAAO,CAAC,aAAa,CAAC;IAgGzB,IAAI,EAAE,IAAI,QAAQ,CAEjB;IAED,IAAI,GAAG,IAAI,WAAW,CAErB;IAED,IAAI,eAAe,IAAI,eAAe,CAErC;IAED,IAAI,WAAW,IAAI,WAAW,CAE7B;IAED,IAAI,aAAa,IAAI,aAAa,CAEjC;IAED,IAAI,yBAAyB,IAAI,yBAAyB,CAEzD;IAED,IAAI,uBAAuB,IAAI,uBAAuB,CAErD;IAED,IAAI,wBAAwB,IAAI,wBAAwB,CAEvD;IAED,IAAI,qBAAqB,IAAI,qBAAqB,CAEjD;IAED,IAAI,oBAAoB,IAAI,oBAAoB,GAAG,SAAS,CAE3D;IAEK,KAAK;IAUL,UAAU;IAOV,OAAO;CAgBd"}
@@ -9,6 +9,7 @@ const xrpc_server_1 = require("@atproto/xrpc-server");
9
9
  const background_1 = require("../background");
10
10
  const db_1 = require("../db");
11
11
  const mod_service_1 = require("../mod-service");
12
+ const strike_1 = require("../mod-service/strike");
12
13
  const service_1 = require("../scheduled-action/service");
13
14
  const service_2 = require("../setting/service");
14
15
  const team_1 = require("../team");
@@ -17,6 +18,7 @@ const event_pusher_1 = require("./event-pusher");
17
18
  const event_reverser_1 = require("./event-reverser");
18
19
  const materialized_view_refresher_1 = require("./materialized-view-refresher");
19
20
  const scheduled_action_processor_1 = require("./scheduled-action-processor");
21
+ const strike_expiry_processor_1 = require("./strike-expiry-processor");
20
22
  const team_profile_synchronizer_1 = require("./team-profile-synchronizer");
21
23
  const verification_listener_1 = require("./verification-listener");
22
24
  class DaemonContext {
@@ -50,14 +52,16 @@ class DaemonContext {
50
52
  pds: cfg.pds ?? undefined,
51
53
  });
52
54
  const backgroundQueue = new background_1.BackgroundQueue(db);
53
- const modService = mod_service_1.ModerationService.creator(signingKey, signingKeyId, cfg, backgroundQueue, idResolver, eventPusher, appviewAgent, createAuthHeaders);
54
55
  const settingService = service_2.SettingService.creator();
56
+ const strikeService = strike_1.StrikeService.creator();
57
+ const modService = mod_service_1.ModerationService.creator(signingKey, signingKeyId, cfg, backgroundQueue, idResolver, eventPusher, appviewAgent, createAuthHeaders, strikeService);
55
58
  const scheduledActionService = service_1.ScheduledActionService.creator();
56
59
  const teamService = team_1.TeamService.creator(appviewAgent, cfg.appview.did, createAuthHeaders);
57
60
  const teamProfileSynchronizer = new team_profile_synchronizer_1.TeamProfileSynchronizer(backgroundQueue, teamService(db), cfg.db.teamProfileRefreshIntervalMs);
58
61
  const eventReverser = new event_reverser_1.EventReverser(db, modService);
59
62
  const materializedViewRefresher = new materialized_view_refresher_1.MaterializedViewRefresher(backgroundQueue, cfg.db.materializedViewRefreshIntervalMs);
60
63
  const scheduledActionProcessor = new scheduled_action_processor_1.ScheduledActionProcessor(db, cfg.service.did, settingService, modService, scheduledActionService);
64
+ const strikeExpiryProcessor = new strike_expiry_processor_1.StrikeExpiryProcessor(db, strikeService);
61
65
  // Only spawn the listener if verifier config exists and a jetstream URL is provided
62
66
  const verificationListener = cfg.verifier && cfg.jetstreamUrl
63
67
  ? new verification_listener_1.VerificationListener(db, cfg.jetstreamUrl, cfg.verifier?.issuersToIndex)
@@ -72,6 +76,7 @@ class DaemonContext {
72
76
  materializedViewRefresher,
73
77
  teamProfileSynchronizer,
74
78
  scheduledActionProcessor,
79
+ strikeExpiryProcessor,
75
80
  verificationListener,
76
81
  ...(overrides ?? {}),
77
82
  });
@@ -100,6 +105,9 @@ class DaemonContext {
100
105
  get scheduledActionProcessor() {
101
106
  return this.opts.scheduledActionProcessor;
102
107
  }
108
+ get strikeExpiryProcessor() {
109
+ return this.opts.strikeExpiryProcessor;
110
+ }
103
111
  get verificationListener() {
104
112
  return this.opts.verificationListener;
105
113
  }
@@ -109,6 +117,7 @@ class DaemonContext {
109
117
  this.materializedViewRefresher.start();
110
118
  this.teamProfileSynchronizer.start();
111
119
  this.scheduledActionProcessor.start();
120
+ this.strikeExpiryProcessor.start();
112
121
  this.verificationListener?.start();
113
122
  }
114
123
  async processAll() {
@@ -125,6 +134,7 @@ class DaemonContext {
125
134
  this.materializedViewRefresher.destroy(),
126
135
  this.teamProfileSynchronizer.destroy(),
127
136
  this.scheduledActionProcessor.destroy(),
137
+ this.strikeExpiryProcessor.destroy(),
128
138
  this.verificationListener?.stop(),
129
139
  ]);
130
140
  }
@@ -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'\nimport { OzoneConfig, OzoneSecrets } from '../config'\nimport { Database } from '../db'\nimport { ModerationService } from '../mod-service'\nimport { ScheduledActionService } from '../scheduled-action/service'\nimport { SettingService } from '../setting/service'\nimport { TeamService } from '../team'\nimport { getSigningKeyId } from '../util'\nimport { EventPusher } from './event-pusher'\nimport { EventReverser } from './event-reverser'\nimport { MaterializedViewRefresher } from './materialized-view-refresher'\nimport { ScheduledActionProcessor } from './scheduled-action-processor'\nimport { TeamProfileSynchronizer } from './team-profile-synchronizer'\nimport { VerificationListener } from './verification-listener'\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 verificationListener?: VerificationListener\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 modService = ModerationService.creator(\n signingKey,\n signingKeyId,\n cfg,\n backgroundQueue,\n idResolver,\n eventPusher,\n appviewAgent,\n createAuthHeaders,\n )\n const settingService = SettingService.creator()\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 // 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 verificationListener,\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 verificationListener(): VerificationListener | undefined {\n return this.opts.verificationListener\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.verificationListener?.start()\n }\n\n async processAll() {\n // Sequential because the materialized view values depend on the events.\n await this.eventPusher.processAll()\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.verificationListener?.stop(),\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'\nimport { OzoneConfig, OzoneSecrets } from '../config'\nimport { Database } from '../db'\nimport { ModerationService } from '../mod-service'\nimport { StrikeService } from '../mod-service/strike'\nimport { ScheduledActionService } from '../scheduled-action/service'\nimport { SettingService } from '../setting/service'\nimport { TeamService } from '../team'\nimport { getSigningKeyId } from '../util'\nimport { EventPusher } from './event-pusher'\nimport { EventReverser } from './event-reverser'\nimport { MaterializedViewRefresher } from './materialized-view-refresher'\nimport { ScheduledActionProcessor } from './scheduled-action-processor'\nimport { StrikeExpiryProcessor } from './strike-expiry-processor'\nimport { TeamProfileSynchronizer } from './team-profile-synchronizer'\nimport { VerificationListener } from './verification-listener'\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 verificationListener?: VerificationListener\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 // 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 verificationListener,\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 verificationListener(): VerificationListener | undefined {\n return this.opts.verificationListener\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.verificationListener?.start()\n }\n\n async processAll() {\n // Sequential because the materialized view values depend on the events.\n await this.eventPusher.processAll()\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.verificationListener?.stop(),\n ])\n } finally {\n await this.backgroundQueue.destroy()\n await this.db.close()\n }\n }\n}\n"]}
@@ -5,6 +5,7 @@ export { EventPusher } from './event-pusher';
5
5
  export { BlobDiverter } from './blob-diverter';
6
6
  export { EventReverser } from './event-reverser';
7
7
  export { ScheduledActionProcessor } from './scheduled-action-processor';
8
+ export { StrikeExpiryProcessor } from './strike-expiry-processor';
8
9
  export declare class OzoneDaemon {
9
10
  ctx: DaemonContext;
10
11
  constructor(ctx: DaemonContext);
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/daemon/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,WAAW,CAAA;AACrD,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAA;AAC9C,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAA;AAEzC,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAA;AAC5C,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAA;AAC9C,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAA;AAChD,OAAO,EAAE,wBAAwB,EAAE,MAAM,8BAA8B,CAAA;AAEvE,qBAAa,WAAW;IACH,GAAG,EAAE,aAAa;gBAAlB,GAAG,EAAE,aAAa;WACxB,MAAM,CACjB,GAAG,EAAE,WAAW,EAChB,OAAO,EAAE,YAAY,EACrB,SAAS,CAAC,EAAE,OAAO,CAAC,iBAAiB,CAAC,GACrC,OAAO,CAAC,WAAW,CAAC;IAKjB,KAAK;IAIL,UAAU;IAIV,OAAO;CAGd"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/daemon/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,WAAW,CAAA;AACrD,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAA;AAC9C,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAA;AAEzC,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAA;AAC5C,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAA;AAC9C,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAA;AAChD,OAAO,EAAE,wBAAwB,EAAE,MAAM,8BAA8B,CAAA;AACvE,OAAO,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAA;AAEjE,qBAAa,WAAW;IACH,GAAG,EAAE,aAAa;gBAAlB,GAAG,EAAE,aAAa;WACxB,MAAM,CACjB,GAAG,EAAE,WAAW,EAChB,OAAO,EAAE,YAAY,EACrB,SAAS,CAAC,EAAE,OAAO,CAAC,iBAAiB,CAAC,GACrC,OAAO,CAAC,WAAW,CAAC;IAKjB,KAAK;IAIL,UAAU;IAIV,OAAO;CAGd"}
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.OzoneDaemon = exports.ScheduledActionProcessor = exports.EventReverser = exports.BlobDiverter = exports.EventPusher = void 0;
3
+ exports.OzoneDaemon = exports.StrikeExpiryProcessor = exports.ScheduledActionProcessor = exports.EventReverser = exports.BlobDiverter = exports.EventPusher = void 0;
4
4
  const context_1 = require("./context");
5
5
  var event_pusher_1 = require("./event-pusher");
6
6
  Object.defineProperty(exports, "EventPusher", { enumerable: true, get: function () { return event_pusher_1.EventPusher; } });
@@ -10,6 +10,8 @@ var event_reverser_1 = require("./event-reverser");
10
10
  Object.defineProperty(exports, "EventReverser", { enumerable: true, get: function () { return event_reverser_1.EventReverser; } });
11
11
  var scheduled_action_processor_1 = require("./scheduled-action-processor");
12
12
  Object.defineProperty(exports, "ScheduledActionProcessor", { enumerable: true, get: function () { return scheduled_action_processor_1.ScheduledActionProcessor; } });
13
+ var strike_expiry_processor_1 = require("./strike-expiry-processor");
14
+ Object.defineProperty(exports, "StrikeExpiryProcessor", { enumerable: true, get: function () { return strike_expiry_processor_1.StrikeExpiryProcessor; } });
13
15
  class OzoneDaemon {
14
16
  constructor(ctx) {
15
17
  Object.defineProperty(this, "ctx", {
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/daemon/index.ts"],"names":[],"mappings":";;;AAEA,uCAAyC;AAEzC,+CAA4C;AAAnC,2GAAA,WAAW,OAAA;AACpB,iDAA8C;AAArC,6GAAA,YAAY,OAAA;AACrB,mDAAgD;AAAvC,+GAAA,aAAa,OAAA;AACtB,2EAAuE;AAA9D,sIAAA,wBAAwB,OAAA;AAEjC,MAAa,WAAW;IACtB,YAAmB,GAAkB;QAAzB;;;;mBAAO,GAAG;WAAe;IAAG,CAAC;IACzC,MAAM,CAAC,KAAK,CAAC,MAAM,CACjB,GAAgB,EAChB,OAAqB,EACrB,SAAsC;QAEtC,MAAM,GAAG,GAAG,MAAM,uBAAa,CAAC,UAAU,CAAC,GAAG,EAAE,OAAO,EAAE,SAAS,CAAC,CAAA;QACnE,OAAO,IAAI,WAAW,CAAC,GAAG,CAAC,CAAA;IAC7B,CAAC;IAED,KAAK,CAAC,KAAK;QACT,MAAM,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,CAAA;IACxB,CAAC;IAED,KAAK,CAAC,UAAU;QACd,MAAM,IAAI,CAAC,GAAG,CAAC,UAAU,EAAE,CAAA;IAC7B,CAAC;IAED,KAAK,CAAC,OAAO;QACX,MAAM,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,CAAA;IAC1B,CAAC;CACF;AAtBD,kCAsBC","sourcesContent":["import { OzoneConfig, OzoneSecrets } from '../config'\nimport { AppContextOptions } from '../context'\nimport { DaemonContext } from './context'\n\nexport { EventPusher } from './event-pusher'\nexport { BlobDiverter } from './blob-diverter'\nexport { EventReverser } from './event-reverser'\nexport { ScheduledActionProcessor } from './scheduled-action-processor'\n\nexport class OzoneDaemon {\n constructor(public ctx: DaemonContext) {}\n static async create(\n cfg: OzoneConfig,\n secrets: OzoneSecrets,\n overrides?: Partial<AppContextOptions>,\n ): Promise<OzoneDaemon> {\n const ctx = await DaemonContext.fromConfig(cfg, secrets, overrides)\n return new OzoneDaemon(ctx)\n }\n\n async start() {\n await this.ctx.start()\n }\n\n async processAll() {\n await this.ctx.processAll()\n }\n\n async destroy() {\n await this.ctx.destroy()\n }\n}\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/daemon/index.ts"],"names":[],"mappings":";;;AAEA,uCAAyC;AAEzC,+CAA4C;AAAnC,2GAAA,WAAW,OAAA;AACpB,iDAA8C;AAArC,6GAAA,YAAY,OAAA;AACrB,mDAAgD;AAAvC,+GAAA,aAAa,OAAA;AACtB,2EAAuE;AAA9D,sIAAA,wBAAwB,OAAA;AACjC,qEAAiE;AAAxD,gIAAA,qBAAqB,OAAA;AAE9B,MAAa,WAAW;IACtB,YAAmB,GAAkB;QAAzB;;;;mBAAO,GAAG;WAAe;IAAG,CAAC;IACzC,MAAM,CAAC,KAAK,CAAC,MAAM,CACjB,GAAgB,EAChB,OAAqB,EACrB,SAAsC;QAEtC,MAAM,GAAG,GAAG,MAAM,uBAAa,CAAC,UAAU,CAAC,GAAG,EAAE,OAAO,EAAE,SAAS,CAAC,CAAA;QACnE,OAAO,IAAI,WAAW,CAAC,GAAG,CAAC,CAAA;IAC7B,CAAC;IAED,KAAK,CAAC,KAAK;QACT,MAAM,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,CAAA;IACxB,CAAC;IAED,KAAK,CAAC,UAAU;QACd,MAAM,IAAI,CAAC,GAAG,CAAC,UAAU,EAAE,CAAA;IAC7B,CAAC;IAED,KAAK,CAAC,OAAO;QACX,MAAM,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,CAAA;IAC1B,CAAC;CACF;AAtBD,kCAsBC","sourcesContent":["import { OzoneConfig, OzoneSecrets } from '../config'\nimport { AppContextOptions } from '../context'\nimport { DaemonContext } from './context'\n\nexport { EventPusher } from './event-pusher'\nexport { BlobDiverter } from './blob-diverter'\nexport { EventReverser } from './event-reverser'\nexport { ScheduledActionProcessor } from './scheduled-action-processor'\nexport { StrikeExpiryProcessor } from './strike-expiry-processor'\n\nexport class OzoneDaemon {\n constructor(public ctx: DaemonContext) {}\n static async create(\n cfg: OzoneConfig,\n secrets: OzoneSecrets,\n overrides?: Partial<AppContextOptions>,\n ): Promise<OzoneDaemon> {\n const ctx = await DaemonContext.fromConfig(cfg, secrets, overrides)\n return new OzoneDaemon(ctx)\n }\n\n async start() {\n await this.ctx.start()\n }\n\n async processAll() {\n await this.ctx.processAll()\n }\n\n async destroy() {\n await this.ctx.destroy()\n }\n}\n"]}
@@ -0,0 +1,18 @@
1
+ import { Database } from '../db';
2
+ import { StrikeServiceCreator } from '../mod-service/strike';
3
+ export declare class StrikeExpiryProcessor {
4
+ private db;
5
+ private strikeServiceCreator;
6
+ destroyed: boolean;
7
+ processingPromise: Promise<void>;
8
+ timer?: NodeJS.Timeout;
9
+ constructor(db: Database, strikeServiceCreator: StrikeServiceCreator);
10
+ start(): void;
11
+ poll(): void;
12
+ destroy(): Promise<void>;
13
+ initializeCursor(): Promise<void>;
14
+ getCursor(): Promise<string | null>;
15
+ updateCursor(cursor: string): Promise<void>;
16
+ processExpiredStrikes(): Promise<void>;
17
+ }
18
+ //# sourceMappingURL=strike-expiry-processor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"strike-expiry-processor.d.ts","sourceRoot":"","sources":["../../src/daemon/strike-expiry-processor.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAA;AAEhC,OAAO,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAA;AAI5D,qBAAa,qBAAqB;IAM9B,OAAO,CAAC,EAAE;IACV,OAAO,CAAC,oBAAoB;IAN9B,SAAS,UAAQ;IACjB,iBAAiB,EAAE,OAAO,CAAC,IAAI,CAAC,CAAoB;IACpD,KAAK,CAAC,EAAE,MAAM,CAAC,OAAO,CAAA;gBAGZ,EAAE,EAAE,QAAQ,EACZ,oBAAoB,EAAE,oBAAoB;IAGpD,KAAK;IAIL,IAAI;IAWE,OAAO;IASP,gBAAgB;IAWhB,SAAS,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAUnC,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAQ3C,qBAAqB;CAgC5B"}
@@ -0,0 +1,111 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.StrikeExpiryProcessor = void 0;
4
+ const common_1 = require("@atproto/common");
5
+ const logger_1 = require("../logger");
6
+ const JOB_NAME = 'strike_expiry';
7
+ class StrikeExpiryProcessor {
8
+ constructor(db, strikeServiceCreator) {
9
+ Object.defineProperty(this, "db", {
10
+ enumerable: true,
11
+ configurable: true,
12
+ writable: true,
13
+ value: db
14
+ });
15
+ Object.defineProperty(this, "strikeServiceCreator", {
16
+ enumerable: true,
17
+ configurable: true,
18
+ writable: true,
19
+ value: strikeServiceCreator
20
+ });
21
+ Object.defineProperty(this, "destroyed", {
22
+ enumerable: true,
23
+ configurable: true,
24
+ writable: true,
25
+ value: false
26
+ });
27
+ Object.defineProperty(this, "processingPromise", {
28
+ enumerable: true,
29
+ configurable: true,
30
+ writable: true,
31
+ value: Promise.resolve()
32
+ });
33
+ Object.defineProperty(this, "timer", {
34
+ enumerable: true,
35
+ configurable: true,
36
+ writable: true,
37
+ value: void 0
38
+ });
39
+ }
40
+ start() {
41
+ this.initializeCursor().then(() => this.poll());
42
+ }
43
+ poll() {
44
+ if (this.destroyed)
45
+ return;
46
+ this.processingPromise = this.processExpiredStrikes()
47
+ .catch((err) => logger_1.dbLogger.error({ err }, 'strike expiry processing errored'))
48
+ .finally(() => {
49
+ this.timer = setTimeout(() => this.poll(), getInterval());
50
+ });
51
+ }
52
+ async destroy() {
53
+ this.destroyed = true;
54
+ if (this.timer) {
55
+ clearTimeout(this.timer);
56
+ this.timer = undefined;
57
+ }
58
+ await this.processingPromise;
59
+ }
60
+ async initializeCursor() {
61
+ await this.db.db
62
+ .insertInto('job_cursor')
63
+ .values({
64
+ job: JOB_NAME,
65
+ cursor: null,
66
+ })
67
+ .onConflict((oc) => oc.doNothing())
68
+ .execute();
69
+ }
70
+ async getCursor() {
71
+ const entry = await this.db.db
72
+ .selectFrom('job_cursor')
73
+ .select('cursor')
74
+ .where('job', '=', JOB_NAME)
75
+ .executeTakeFirst();
76
+ return entry?.cursor || null;
77
+ }
78
+ async updateCursor(cursor) {
79
+ await this.db.db
80
+ .updateTable('job_cursor')
81
+ .set({ cursor })
82
+ .where('job', '=', JOB_NAME)
83
+ .execute();
84
+ }
85
+ async processExpiredStrikes() {
86
+ const now = new Date();
87
+ const strikeService = this.strikeServiceCreator(this.db);
88
+ const lastProcessedAt = await this.getCursor();
89
+ const affectedSubjects = await strikeService.getExpiredStrikeSubjects(lastProcessedAt || undefined);
90
+ if (!affectedSubjects.length) {
91
+ logger_1.dbLogger.info('no expired strikes to process');
92
+ await this.updateCursor(now.toISOString());
93
+ return;
94
+ }
95
+ logger_1.dbLogger.info({ count: affectedSubjects.length }, 'processing subjects with expired strikes');
96
+ await Promise.all(affectedSubjects.map(({ subjectDid }) => {
97
+ return strikeService.updateSubjectStrikeCount(subjectDid);
98
+ }));
99
+ await this.updateCursor(now.toISOString());
100
+ logger_1.dbLogger.info({ processed: affectedSubjects.length }, 'strike expiry processing completed');
101
+ }
102
+ }
103
+ exports.StrikeExpiryProcessor = StrikeExpiryProcessor;
104
+ const getInterval = () => {
105
+ // Run every hour, synchronized to the hour boundary
106
+ const now = Date.now();
107
+ const intervalMs = common_1.HOUR;
108
+ const nextIteration = Math.ceil(now / intervalMs);
109
+ return nextIteration * intervalMs - now;
110
+ };
111
+ //# sourceMappingURL=strike-expiry-processor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"strike-expiry-processor.js","sourceRoot":"","sources":["../../src/daemon/strike-expiry-processor.ts"],"names":[],"mappings":"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","sourcesContent":["import { HOUR } from '@atproto/common'\nimport { Database } from '../db'\nimport { dbLogger } from '../logger'\nimport { StrikeServiceCreator } from '../mod-service/strike'\n\nconst JOB_NAME = 'strike_expiry'\n\nexport class StrikeExpiryProcessor {\n destroyed = false\n processingPromise: Promise<void> = Promise.resolve()\n timer?: NodeJS.Timeout\n\n constructor(\n private db: Database,\n private strikeServiceCreator: StrikeServiceCreator,\n ) {}\n\n start() {\n this.initializeCursor().then(() => this.poll())\n }\n\n poll() {\n if (this.destroyed) return\n this.processingPromise = this.processExpiredStrikes()\n .catch((err) =>\n dbLogger.error({ err }, 'strike expiry processing errored'),\n )\n .finally(() => {\n this.timer = setTimeout(() => this.poll(), getInterval())\n })\n }\n\n async destroy() {\n this.destroyed = true\n if (this.timer) {\n clearTimeout(this.timer)\n this.timer = undefined\n }\n await this.processingPromise\n }\n\n async initializeCursor() {\n await this.db.db\n .insertInto('job_cursor')\n .values({\n job: JOB_NAME,\n cursor: null,\n })\n .onConflict((oc) => oc.doNothing())\n .execute()\n }\n\n async getCursor(): Promise<string | null> {\n const entry = await this.db.db\n .selectFrom('job_cursor')\n .select('cursor')\n .where('job', '=', JOB_NAME)\n .executeTakeFirst()\n\n return entry?.cursor || null\n }\n\n async updateCursor(cursor: string): Promise<void> {\n await this.db.db\n .updateTable('job_cursor')\n .set({ cursor })\n .where('job', '=', JOB_NAME)\n .execute()\n }\n\n async processExpiredStrikes() {\n const now = new Date()\n const strikeService = this.strikeServiceCreator(this.db)\n const lastProcessedAt = await this.getCursor()\n const affectedSubjects = await strikeService.getExpiredStrikeSubjects(\n lastProcessedAt || undefined,\n )\n\n if (!affectedSubjects.length) {\n dbLogger.info('no expired strikes to process')\n await this.updateCursor(now.toISOString())\n return\n }\n\n dbLogger.info(\n { count: affectedSubjects.length },\n 'processing subjects with expired strikes',\n )\n\n await Promise.all(\n affectedSubjects.map(({ subjectDid }) => {\n return strikeService.updateSubjectStrikeCount(subjectDid)\n }),\n )\n\n await this.updateCursor(now.toISOString())\n\n dbLogger.info(\n { processed: affectedSubjects.length },\n 'strike expiry processing completed',\n )\n }\n}\n\nconst getInterval = (): number => {\n // Run every hour, synchronized to the hour boundary\n const now = Date.now()\n const intervalMs = HOUR\n const nextIteration = Math.ceil(now / intervalMs)\n return nextIteration * intervalMs - now\n}\n"]}
@@ -0,0 +1,4 @@
1
+ import { Kysely } from 'kysely';
2
+ export declare function up(db: Kysely<unknown>): Promise<void>;
3
+ export declare function down(db: Kysely<unknown>): Promise<void>;
4
+ //# sourceMappingURL=20251008T120000000Z-add-strike-system.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"20251008T120000000Z-add-strike-system.d.ts","sourceRoot":"","sources":["../../../src/db/migrations/20251008T120000000Z-add-strike-system.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAO,MAAM,QAAQ,CAAA;AAEpC,wBAAsB,EAAE,CAAC,EAAE,EAAE,MAAM,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAwD3D;AAED,wBAAsB,IAAI,CAAC,EAAE,EAAE,MAAM,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CA0B7D"}