@atproto/ozone 0.1.148 → 0.1.150

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 (107) hide show
  1. package/CHANGELOG.md +16 -0
  2. package/dist/lexicon/lexicons.d.ts +2 -2
  3. package/dist/lexicon/lexicons.js +1 -1
  4. package/dist/lexicon/lexicons.js.map +1 -1
  5. package/dist/lexicon/types/app/bsky/actor/profile.d.ts +4 -3
  6. package/dist/lexicon/types/app/bsky/actor/profile.d.ts.map +1 -1
  7. package/dist/lexicon/types/app/bsky/actor/profile.js +9 -7
  8. package/dist/lexicon/types/app/bsky/actor/profile.js.map +1 -1
  9. package/dist/lexicon/types/app/bsky/actor/status.d.ts +4 -3
  10. package/dist/lexicon/types/app/bsky/actor/status.d.ts.map +1 -1
  11. package/dist/lexicon/types/app/bsky/actor/status.js +9 -7
  12. package/dist/lexicon/types/app/bsky/actor/status.js.map +1 -1
  13. package/dist/lexicon/types/app/bsky/feed/generator.d.ts +4 -3
  14. package/dist/lexicon/types/app/bsky/feed/generator.d.ts.map +1 -1
  15. package/dist/lexicon/types/app/bsky/feed/generator.js +9 -7
  16. package/dist/lexicon/types/app/bsky/feed/generator.js.map +1 -1
  17. package/dist/lexicon/types/app/bsky/feed/like.d.ts +4 -3
  18. package/dist/lexicon/types/app/bsky/feed/like.d.ts.map +1 -1
  19. package/dist/lexicon/types/app/bsky/feed/like.js +9 -7
  20. package/dist/lexicon/types/app/bsky/feed/like.js.map +1 -1
  21. package/dist/lexicon/types/app/bsky/feed/post.d.ts +4 -3
  22. package/dist/lexicon/types/app/bsky/feed/post.d.ts.map +1 -1
  23. package/dist/lexicon/types/app/bsky/feed/post.js +9 -7
  24. package/dist/lexicon/types/app/bsky/feed/post.js.map +1 -1
  25. package/dist/lexicon/types/app/bsky/feed/postgate.d.ts +4 -3
  26. package/dist/lexicon/types/app/bsky/feed/postgate.d.ts.map +1 -1
  27. package/dist/lexicon/types/app/bsky/feed/postgate.js +9 -7
  28. package/dist/lexicon/types/app/bsky/feed/postgate.js.map +1 -1
  29. package/dist/lexicon/types/app/bsky/feed/repost.d.ts +4 -3
  30. package/dist/lexicon/types/app/bsky/feed/repost.d.ts.map +1 -1
  31. package/dist/lexicon/types/app/bsky/feed/repost.js +9 -7
  32. package/dist/lexicon/types/app/bsky/feed/repost.js.map +1 -1
  33. package/dist/lexicon/types/app/bsky/feed/threadgate.d.ts +4 -3
  34. package/dist/lexicon/types/app/bsky/feed/threadgate.d.ts.map +1 -1
  35. package/dist/lexicon/types/app/bsky/feed/threadgate.js +9 -7
  36. package/dist/lexicon/types/app/bsky/feed/threadgate.js.map +1 -1
  37. package/dist/lexicon/types/app/bsky/graph/block.d.ts +4 -3
  38. package/dist/lexicon/types/app/bsky/graph/block.d.ts.map +1 -1
  39. package/dist/lexicon/types/app/bsky/graph/block.js +9 -7
  40. package/dist/lexicon/types/app/bsky/graph/block.js.map +1 -1
  41. package/dist/lexicon/types/app/bsky/graph/follow.d.ts +4 -3
  42. package/dist/lexicon/types/app/bsky/graph/follow.d.ts.map +1 -1
  43. package/dist/lexicon/types/app/bsky/graph/follow.js +9 -7
  44. package/dist/lexicon/types/app/bsky/graph/follow.js.map +1 -1
  45. package/dist/lexicon/types/app/bsky/graph/list.d.ts +4 -3
  46. package/dist/lexicon/types/app/bsky/graph/list.d.ts.map +1 -1
  47. package/dist/lexicon/types/app/bsky/graph/list.js +9 -7
  48. package/dist/lexicon/types/app/bsky/graph/list.js.map +1 -1
  49. package/dist/lexicon/types/app/bsky/graph/listblock.d.ts +4 -3
  50. package/dist/lexicon/types/app/bsky/graph/listblock.d.ts.map +1 -1
  51. package/dist/lexicon/types/app/bsky/graph/listblock.js +9 -7
  52. package/dist/lexicon/types/app/bsky/graph/listblock.js.map +1 -1
  53. package/dist/lexicon/types/app/bsky/graph/listitem.d.ts +4 -3
  54. package/dist/lexicon/types/app/bsky/graph/listitem.d.ts.map +1 -1
  55. package/dist/lexicon/types/app/bsky/graph/listitem.js +9 -7
  56. package/dist/lexicon/types/app/bsky/graph/listitem.js.map +1 -1
  57. package/dist/lexicon/types/app/bsky/graph/starterpack.d.ts +4 -3
  58. package/dist/lexicon/types/app/bsky/graph/starterpack.d.ts.map +1 -1
  59. package/dist/lexicon/types/app/bsky/graph/starterpack.js +9 -7
  60. package/dist/lexicon/types/app/bsky/graph/starterpack.js.map +1 -1
  61. package/dist/lexicon/types/app/bsky/graph/verification.d.ts +4 -3
  62. package/dist/lexicon/types/app/bsky/graph/verification.d.ts.map +1 -1
  63. package/dist/lexicon/types/app/bsky/graph/verification.js +9 -7
  64. package/dist/lexicon/types/app/bsky/graph/verification.js.map +1 -1
  65. package/dist/lexicon/types/app/bsky/labeler/service.d.ts +4 -3
  66. package/dist/lexicon/types/app/bsky/labeler/service.d.ts.map +1 -1
  67. package/dist/lexicon/types/app/bsky/labeler/service.js +9 -7
  68. package/dist/lexicon/types/app/bsky/labeler/service.js.map +1 -1
  69. package/dist/lexicon/types/app/bsky/notification/declaration.d.ts +4 -3
  70. package/dist/lexicon/types/app/bsky/notification/declaration.d.ts.map +1 -1
  71. package/dist/lexicon/types/app/bsky/notification/declaration.js +9 -7
  72. package/dist/lexicon/types/app/bsky/notification/declaration.js.map +1 -1
  73. package/dist/lexicon/types/chat/bsky/actor/declaration.d.ts +4 -3
  74. package/dist/lexicon/types/chat/bsky/actor/declaration.d.ts.map +1 -1
  75. package/dist/lexicon/types/chat/bsky/actor/declaration.js +9 -7
  76. package/dist/lexicon/types/chat/bsky/actor/declaration.js.map +1 -1
  77. package/dist/lexicon/types/com/atproto/lexicon/schema.d.ts +4 -3
  78. package/dist/lexicon/types/com/atproto/lexicon/schema.d.ts.map +1 -1
  79. package/dist/lexicon/types/com/atproto/lexicon/schema.js +9 -7
  80. package/dist/lexicon/types/com/atproto/lexicon/schema.js.map +1 -1
  81. package/dist/mod-service/views.d.ts.map +1 -1
  82. package/dist/mod-service/views.js +0 -1
  83. package/dist/mod-service/views.js.map +1 -1
  84. package/package.json +4 -4
  85. package/src/lexicon/lexicons.ts +1 -1
  86. package/src/lexicon/types/app/bsky/actor/profile.ts +12 -6
  87. package/src/lexicon/types/app/bsky/actor/status.ts +12 -6
  88. package/src/lexicon/types/app/bsky/feed/generator.ts +12 -6
  89. package/src/lexicon/types/app/bsky/feed/like.ts +12 -6
  90. package/src/lexicon/types/app/bsky/feed/post.ts +12 -6
  91. package/src/lexicon/types/app/bsky/feed/postgate.ts +12 -6
  92. package/src/lexicon/types/app/bsky/feed/repost.ts +12 -6
  93. package/src/lexicon/types/app/bsky/feed/threadgate.ts +12 -6
  94. package/src/lexicon/types/app/bsky/graph/block.ts +12 -6
  95. package/src/lexicon/types/app/bsky/graph/follow.ts +12 -6
  96. package/src/lexicon/types/app/bsky/graph/list.ts +12 -6
  97. package/src/lexicon/types/app/bsky/graph/listblock.ts +12 -6
  98. package/src/lexicon/types/app/bsky/graph/listitem.ts +12 -6
  99. package/src/lexicon/types/app/bsky/graph/starterpack.ts +12 -6
  100. package/src/lexicon/types/app/bsky/graph/verification.ts +12 -6
  101. package/src/lexicon/types/app/bsky/labeler/service.ts +12 -6
  102. package/src/lexicon/types/app/bsky/notification/declaration.ts +12 -6
  103. package/src/lexicon/types/chat/bsky/actor/declaration.ts +12 -6
  104. package/src/lexicon/types/com/atproto/lexicon/schema.ts +12 -6
  105. package/src/mod-service/views.ts +2 -1
  106. package/tests/__snapshots__/blob-divert.test.ts.snap +197 -0
  107. package/tests/blob-divert.test.ts +3 -0
@@ -1,16 +1,18 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.isRecord = isRecord;
4
- exports.validateRecord = validateRecord;
3
+ exports.isMain = isMain;
4
+ exports.isRecord = isMain;
5
+ exports.validateMain = validateMain;
6
+ exports.validateRecord = validateMain;
5
7
  const lexicons_1 = require("../../../../lexicons");
6
8
  const util_1 = require("../../../../util");
7
9
  const is$typed = util_1.is$typed, validate = lexicons_1.validate;
8
10
  const id = 'app.bsky.notification.declaration';
9
- const hashRecord = 'main';
10
- function isRecord(v) {
11
- return is$typed(v, id, hashRecord);
11
+ const hashMain = 'main';
12
+ function isMain(v) {
13
+ return is$typed(v, id, hashMain);
12
14
  }
13
- function validateRecord(v) {
14
- return validate(v, id, hashRecord, true);
15
+ function validateMain(v) {
16
+ return validate(v, id, hashMain, true);
15
17
  }
16
18
  //# sourceMappingURL=declaration.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"declaration.js","sourceRoot":"","sources":["../../../../../../src/lexicon/types/app/bsky/notification/declaration.ts"],"names":[],"mappings":";;AAyBA,4BAEC;AAED,wCAEC;AA1BD,mDAA4D;AAC5D,2CAIyB;AAEzB,MAAM,QAAQ,GAAG,eAAS,EACxB,QAAQ,GAAG,mBAAS,CAAA;AACtB,MAAM,EAAE,GAAG,mCAAmC,CAAA;AAS9C,MAAM,UAAU,GAAG,MAAM,CAAA;AAEzB,SAAgB,QAAQ,CAAI,CAAI;IAC9B,OAAO,QAAQ,CAAC,CAAC,EAAE,EAAE,EAAE,UAAU,CAAC,CAAA;AACpC,CAAC;AAED,SAAgB,cAAc,CAAI,CAAI;IACpC,OAAO,QAAQ,CAAa,CAAC,EAAE,EAAE,EAAE,UAAU,EAAE,IAAI,CAAC,CAAA;AACtD,CAAC","sourcesContent":["/**\n * GENERATED CODE - DO NOT MODIFY\n */\nimport { type ValidationResult, BlobRef } from '@atproto/lexicon'\nimport { CID } from 'multiformats/cid'\nimport { validate as _validate } from '../../../../lexicons'\nimport {\n type $Typed,\n is$typed as _is$typed,\n type OmitKey,\n} from '../../../../util'\n\nconst is$typed = _is$typed,\n validate = _validate\nconst id = 'app.bsky.notification.declaration'\n\nexport interface Record {\n $type: 'app.bsky.notification.declaration'\n /** A declaration of the user's preference for allowing activity subscriptions from other users. Absence of a record implies 'followers'. */\n allowSubscriptions: 'followers' | 'mutuals' | 'none' | (string & {})\n [k: string]: unknown\n}\n\nconst hashRecord = 'main'\n\nexport function isRecord<V>(v: V) {\n return is$typed(v, id, hashRecord)\n}\n\nexport function validateRecord<V>(v: V) {\n return validate<Record & V>(v, id, hashRecord, true)\n}\n"]}
1
+ {"version":3,"file":"declaration.js","sourceRoot":"","sources":["../../../../../../src/lexicon/types/app/bsky/notification/declaration.ts"],"names":[],"mappings":";;AAyBA,wBAEC;AAQW,0BAAQ;AANpB,oCAEC;AAKiB,sCAAc;AA/BhC,mDAA4D;AAC5D,2CAIyB;AAEzB,MAAM,QAAQ,GAAG,eAAS,EACxB,QAAQ,GAAG,mBAAS,CAAA;AACtB,MAAM,EAAE,GAAG,mCAAmC,CAAA;AAS9C,MAAM,QAAQ,GAAG,MAAM,CAAA;AAEvB,SAAgB,MAAM,CAAI,CAAI;IAC5B,OAAO,QAAQ,CAAC,CAAC,EAAE,EAAE,EAAE,QAAQ,CAAC,CAAA;AAClC,CAAC;AAED,SAAgB,YAAY,CAAI,CAAI;IAClC,OAAO,QAAQ,CAAW,CAAC,EAAE,EAAE,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAA;AAClD,CAAC","sourcesContent":["/**\n * GENERATED CODE - DO NOT MODIFY\n */\nimport { type ValidationResult, BlobRef } from '@atproto/lexicon'\nimport { CID } from 'multiformats/cid'\nimport { validate as _validate } from '../../../../lexicons'\nimport {\n type $Typed,\n is$typed as _is$typed,\n type OmitKey,\n} from '../../../../util'\n\nconst is$typed = _is$typed,\n validate = _validate\nconst id = 'app.bsky.notification.declaration'\n\nexport interface Main {\n $type: 'app.bsky.notification.declaration'\n /** A declaration of the user's preference for allowing activity subscriptions from other users. Absence of a record implies 'followers'. */\n allowSubscriptions: 'followers' | 'mutuals' | 'none' | (string & {})\n [k: string]: unknown\n}\n\nconst hashMain = 'main'\n\nexport function isMain<V>(v: V) {\n return is$typed(v, id, hashMain)\n}\n\nexport function validateMain<V>(v: V) {\n return validate<Main & V>(v, id, hashMain, true)\n}\n\nexport {\n type Main as Record,\n isMain as isRecord,\n validateMain as validateRecord,\n}\n"]}
@@ -2,11 +2,12 @@
2
2
  * GENERATED CODE - DO NOT MODIFY
3
3
  */
4
4
  import { type ValidationResult } from '@atproto/lexicon';
5
- export interface Record {
5
+ export interface Main {
6
6
  $type: 'chat.bsky.actor.declaration';
7
7
  allowIncoming: 'all' | 'none' | 'following' | (string & {});
8
8
  [k: string]: unknown;
9
9
  }
10
- export declare function isRecord<V>(v: V): v is import("../../../../util").$TypedObject<V, "chat.bsky.actor.declaration", "main">;
11
- export declare function validateRecord<V>(v: V): ValidationResult<Record & V>;
10
+ export declare function isMain<V>(v: V): v is import("../../../../util").$TypedObject<V, "chat.bsky.actor.declaration", "main">;
11
+ export declare function validateMain<V>(v: V): ValidationResult<Main & V>;
12
+ export { type Main as Record, isMain as isRecord, validateMain as validateRecord, };
12
13
  //# sourceMappingURL=declaration.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"declaration.d.ts","sourceRoot":"","sources":["../../../../../../src/lexicon/types/chat/bsky/actor/declaration.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,KAAK,gBAAgB,EAAW,MAAM,kBAAkB,CAAA;AAajE,MAAM,WAAW,MAAM;IACrB,KAAK,EAAE,6BAA6B,CAAA;IACpC,aAAa,EAAE,KAAK,GAAG,MAAM,GAAG,WAAW,GAAG,CAAC,MAAM,GAAG,EAAE,CAAC,CAAA;IAC3D,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO,CAAA;CACrB;AAID,wBAAgB,QAAQ,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,0FAE/B;AAED,wBAAgB,cAAc,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,gCAErC"}
1
+ {"version":3,"file":"declaration.d.ts","sourceRoot":"","sources":["../../../../../../src/lexicon/types/chat/bsky/actor/declaration.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,KAAK,gBAAgB,EAAW,MAAM,kBAAkB,CAAA;AAajE,MAAM,WAAW,IAAI;IACnB,KAAK,EAAE,6BAA6B,CAAA;IACpC,aAAa,EAAE,KAAK,GAAG,MAAM,GAAG,WAAW,GAAG,CAAC,MAAM,GAAG,EAAE,CAAC,CAAA;IAC3D,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO,CAAA;CACrB;AAID,wBAAgB,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,0FAE7B;AAED,wBAAgB,YAAY,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,8BAEnC;AAED,OAAO,EACL,KAAK,IAAI,IAAI,MAAM,EACnB,MAAM,IAAI,QAAQ,EAClB,YAAY,IAAI,cAAc,GAC/B,CAAA"}
@@ -1,16 +1,18 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.isRecord = isRecord;
4
- exports.validateRecord = validateRecord;
3
+ exports.isMain = isMain;
4
+ exports.isRecord = isMain;
5
+ exports.validateMain = validateMain;
6
+ exports.validateRecord = validateMain;
5
7
  const lexicons_1 = require("../../../../lexicons");
6
8
  const util_1 = require("../../../../util");
7
9
  const is$typed = util_1.is$typed, validate = lexicons_1.validate;
8
10
  const id = 'chat.bsky.actor.declaration';
9
- const hashRecord = 'main';
10
- function isRecord(v) {
11
- return is$typed(v, id, hashRecord);
11
+ const hashMain = 'main';
12
+ function isMain(v) {
13
+ return is$typed(v, id, hashMain);
12
14
  }
13
- function validateRecord(v) {
14
- return validate(v, id, hashRecord, true);
15
+ function validateMain(v) {
16
+ return validate(v, id, hashMain, true);
15
17
  }
16
18
  //# sourceMappingURL=declaration.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"declaration.js","sourceRoot":"","sources":["../../../../../../src/lexicon/types/chat/bsky/actor/declaration.ts"],"names":[],"mappings":";;AAwBA,4BAEC;AAED,wCAEC;AAzBD,mDAA4D;AAC5D,2CAIyB;AAEzB,MAAM,QAAQ,GAAG,eAAS,EACxB,QAAQ,GAAG,mBAAS,CAAA;AACtB,MAAM,EAAE,GAAG,6BAA6B,CAAA;AAQxC,MAAM,UAAU,GAAG,MAAM,CAAA;AAEzB,SAAgB,QAAQ,CAAI,CAAI;IAC9B,OAAO,QAAQ,CAAC,CAAC,EAAE,EAAE,EAAE,UAAU,CAAC,CAAA;AACpC,CAAC;AAED,SAAgB,cAAc,CAAI,CAAI;IACpC,OAAO,QAAQ,CAAa,CAAC,EAAE,EAAE,EAAE,UAAU,EAAE,IAAI,CAAC,CAAA;AACtD,CAAC","sourcesContent":["/**\n * GENERATED CODE - DO NOT MODIFY\n */\nimport { type ValidationResult, BlobRef } from '@atproto/lexicon'\nimport { CID } from 'multiformats/cid'\nimport { validate as _validate } from '../../../../lexicons'\nimport {\n type $Typed,\n is$typed as _is$typed,\n type OmitKey,\n} from '../../../../util'\n\nconst is$typed = _is$typed,\n validate = _validate\nconst id = 'chat.bsky.actor.declaration'\n\nexport interface Record {\n $type: 'chat.bsky.actor.declaration'\n allowIncoming: 'all' | 'none' | 'following' | (string & {})\n [k: string]: unknown\n}\n\nconst hashRecord = 'main'\n\nexport function isRecord<V>(v: V) {\n return is$typed(v, id, hashRecord)\n}\n\nexport function validateRecord<V>(v: V) {\n return validate<Record & V>(v, id, hashRecord, true)\n}\n"]}
1
+ {"version":3,"file":"declaration.js","sourceRoot":"","sources":["../../../../../../src/lexicon/types/chat/bsky/actor/declaration.ts"],"names":[],"mappings":";;AAwBA,wBAEC;AAQW,0BAAQ;AANpB,oCAEC;AAKiB,sCAAc;AA9BhC,mDAA4D;AAC5D,2CAIyB;AAEzB,MAAM,QAAQ,GAAG,eAAS,EACxB,QAAQ,GAAG,mBAAS,CAAA;AACtB,MAAM,EAAE,GAAG,6BAA6B,CAAA;AAQxC,MAAM,QAAQ,GAAG,MAAM,CAAA;AAEvB,SAAgB,MAAM,CAAI,CAAI;IAC5B,OAAO,QAAQ,CAAC,CAAC,EAAE,EAAE,EAAE,QAAQ,CAAC,CAAA;AAClC,CAAC;AAED,SAAgB,YAAY,CAAI,CAAI;IAClC,OAAO,QAAQ,CAAW,CAAC,EAAE,EAAE,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAA;AAClD,CAAC","sourcesContent":["/**\n * GENERATED CODE - DO NOT MODIFY\n */\nimport { type ValidationResult, BlobRef } from '@atproto/lexicon'\nimport { CID } from 'multiformats/cid'\nimport { validate as _validate } from '../../../../lexicons'\nimport {\n type $Typed,\n is$typed as _is$typed,\n type OmitKey,\n} from '../../../../util'\n\nconst is$typed = _is$typed,\n validate = _validate\nconst id = 'chat.bsky.actor.declaration'\n\nexport interface Main {\n $type: 'chat.bsky.actor.declaration'\n allowIncoming: 'all' | 'none' | 'following' | (string & {})\n [k: string]: unknown\n}\n\nconst hashMain = 'main'\n\nexport function isMain<V>(v: V) {\n return is$typed(v, id, hashMain)\n}\n\nexport function validateMain<V>(v: V) {\n return validate<Main & V>(v, id, hashMain, true)\n}\n\nexport {\n type Main as Record,\n isMain as isRecord,\n validateMain as validateRecord,\n}\n"]}
@@ -2,12 +2,13 @@
2
2
  * GENERATED CODE - DO NOT MODIFY
3
3
  */
4
4
  import { type ValidationResult } from '@atproto/lexicon';
5
- export interface Record {
5
+ export interface Main {
6
6
  $type: 'com.atproto.lexicon.schema';
7
7
  /** Indicates the 'version' of the Lexicon language. Must be '1' for the current atproto/Lexicon schema system. */
8
8
  lexicon: number;
9
9
  [k: string]: unknown;
10
10
  }
11
- export declare function isRecord<V>(v: V): v is import("../../../../util").$TypedObject<V, "com.atproto.lexicon.schema", "main">;
12
- export declare function validateRecord<V>(v: V): ValidationResult<Record & V>;
11
+ export declare function isMain<V>(v: V): v is import("../../../../util").$TypedObject<V, "com.atproto.lexicon.schema", "main">;
12
+ export declare function validateMain<V>(v: V): ValidationResult<Main & V>;
13
+ export { type Main as Record, isMain as isRecord, validateMain as validateRecord, };
13
14
  //# sourceMappingURL=schema.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../../../../../src/lexicon/types/com/atproto/lexicon/schema.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,KAAK,gBAAgB,EAAW,MAAM,kBAAkB,CAAA;AAajE,MAAM,WAAW,MAAM;IACrB,KAAK,EAAE,4BAA4B,CAAA;IACnC,kHAAkH;IAClH,OAAO,EAAE,MAAM,CAAA;IACf,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO,CAAA;CACrB;AAID,wBAAgB,QAAQ,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,yFAE/B;AAED,wBAAgB,cAAc,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,gCAErC"}
1
+ {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../../../../../src/lexicon/types/com/atproto/lexicon/schema.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,KAAK,gBAAgB,EAAW,MAAM,kBAAkB,CAAA;AAajE,MAAM,WAAW,IAAI;IACnB,KAAK,EAAE,4BAA4B,CAAA;IACnC,kHAAkH;IAClH,OAAO,EAAE,MAAM,CAAA;IACf,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO,CAAA;CACrB;AAID,wBAAgB,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,yFAE7B;AAED,wBAAgB,YAAY,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,8BAEnC;AAED,OAAO,EACL,KAAK,IAAI,IAAI,MAAM,EACnB,MAAM,IAAI,QAAQ,EAClB,YAAY,IAAI,cAAc,GAC/B,CAAA"}
@@ -1,16 +1,18 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.isRecord = isRecord;
4
- exports.validateRecord = validateRecord;
3
+ exports.isMain = isMain;
4
+ exports.isRecord = isMain;
5
+ exports.validateMain = validateMain;
6
+ exports.validateRecord = validateMain;
5
7
  const lexicons_1 = require("../../../../lexicons");
6
8
  const util_1 = require("../../../../util");
7
9
  const is$typed = util_1.is$typed, validate = lexicons_1.validate;
8
10
  const id = 'com.atproto.lexicon.schema';
9
- const hashRecord = 'main';
10
- function isRecord(v) {
11
- return is$typed(v, id, hashRecord);
11
+ const hashMain = 'main';
12
+ function isMain(v) {
13
+ return is$typed(v, id, hashMain);
12
14
  }
13
- function validateRecord(v) {
14
- return validate(v, id, hashRecord, true);
15
+ function validateMain(v) {
16
+ return validate(v, id, hashMain, true);
15
17
  }
16
18
  //# sourceMappingURL=schema.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"schema.js","sourceRoot":"","sources":["../../../../../../src/lexicon/types/com/atproto/lexicon/schema.ts"],"names":[],"mappings":";;AAyBA,4BAEC;AAED,wCAEC;AA1BD,mDAA4D;AAC5D,2CAIyB;AAEzB,MAAM,QAAQ,GAAG,eAAS,EACxB,QAAQ,GAAG,mBAAS,CAAA;AACtB,MAAM,EAAE,GAAG,4BAA4B,CAAA;AASvC,MAAM,UAAU,GAAG,MAAM,CAAA;AAEzB,SAAgB,QAAQ,CAAI,CAAI;IAC9B,OAAO,QAAQ,CAAC,CAAC,EAAE,EAAE,EAAE,UAAU,CAAC,CAAA;AACpC,CAAC;AAED,SAAgB,cAAc,CAAI,CAAI;IACpC,OAAO,QAAQ,CAAa,CAAC,EAAE,EAAE,EAAE,UAAU,EAAE,IAAI,CAAC,CAAA;AACtD,CAAC","sourcesContent":["/**\n * GENERATED CODE - DO NOT MODIFY\n */\nimport { type ValidationResult, BlobRef } from '@atproto/lexicon'\nimport { CID } from 'multiformats/cid'\nimport { validate as _validate } from '../../../../lexicons'\nimport {\n type $Typed,\n is$typed as _is$typed,\n type OmitKey,\n} from '../../../../util'\n\nconst is$typed = _is$typed,\n validate = _validate\nconst id = 'com.atproto.lexicon.schema'\n\nexport interface Record {\n $type: 'com.atproto.lexicon.schema'\n /** Indicates the 'version' of the Lexicon language. Must be '1' for the current atproto/Lexicon schema system. */\n lexicon: number\n [k: string]: unknown\n}\n\nconst hashRecord = 'main'\n\nexport function isRecord<V>(v: V) {\n return is$typed(v, id, hashRecord)\n}\n\nexport function validateRecord<V>(v: V) {\n return validate<Record & V>(v, id, hashRecord, true)\n}\n"]}
1
+ {"version":3,"file":"schema.js","sourceRoot":"","sources":["../../../../../../src/lexicon/types/com/atproto/lexicon/schema.ts"],"names":[],"mappings":";;AAyBA,wBAEC;AAQW,0BAAQ;AANpB,oCAEC;AAKiB,sCAAc;AA/BhC,mDAA4D;AAC5D,2CAIyB;AAEzB,MAAM,QAAQ,GAAG,eAAS,EACxB,QAAQ,GAAG,mBAAS,CAAA;AACtB,MAAM,EAAE,GAAG,4BAA4B,CAAA;AASvC,MAAM,QAAQ,GAAG,MAAM,CAAA;AAEvB,SAAgB,MAAM,CAAI,CAAI;IAC5B,OAAO,QAAQ,CAAC,CAAC,EAAE,EAAE,EAAE,QAAQ,CAAC,CAAA;AAClC,CAAC;AAED,SAAgB,YAAY,CAAI,CAAI;IAClC,OAAO,QAAQ,CAAW,CAAC,EAAE,EAAE,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAA;AAClD,CAAC","sourcesContent":["/**\n * GENERATED CODE - DO NOT MODIFY\n */\nimport { type ValidationResult, BlobRef } from '@atproto/lexicon'\nimport { CID } from 'multiformats/cid'\nimport { validate as _validate } from '../../../../lexicons'\nimport {\n type $Typed,\n is$typed as _is$typed,\n type OmitKey,\n} from '../../../../util'\n\nconst is$typed = _is$typed,\n validate = _validate\nconst id = 'com.atproto.lexicon.schema'\n\nexport interface Main {\n $type: 'com.atproto.lexicon.schema'\n /** Indicates the 'version' of the Lexicon language. Must be '1' for the current atproto/Lexicon schema system. */\n lexicon: number\n [k: string]: unknown\n}\n\nconst hashMain = 'main'\n\nexport function isMain<V>(v: V) {\n return is$typed(v, id, hashMain)\n}\n\nexport function validateMain<V>(v: V) {\n return validate<Main & V>(v, id, hashMain, true)\n}\n\nexport {\n type Main as Record,\n isMain as isRecord,\n validateMain as validateRecord,\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"views.d.ts","sourceRoot":"","sources":["../../src/mod-service/views.ts"],"names":[],"mappings":"AACA,OAAO,EACL,gBAAgB,EAChB,QAAQ,EACR,uBAAuB,EACxB,MAAM,cAAc,CAAA;AAErB,OAAO,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAA;AACzC,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAA;AAC9C,OAAO,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAA;AAE1C,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAA;AAChC,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAA;AAE7C,OAAO,EAAE,YAAY,EAAE,MAAM,qCAAqC,CAAA;AAClE,OAAO,EAAE,WAAW,EAAE,MAAM,yCAAyC,CAAA;AACrE,OAAO,EACL,KAAK,EAEN,MAAM,yCAAyC,CAAA;AAChD,OAAO,EAAE,YAAY,IAAI,YAAY,EAAE,MAAM,sDAAsD,CAAA;AAEnG,OAAO,EACL,QAAQ,EACR,YAAY,EACZ,kBAAkB,EAClB,UAAU,EACV,gBAAgB,EAChB,QAAQ,EACR,iBAAiB,EAkBlB,MAAM,8CAA8C,CAAA;AACrD,OAAO,EAAE,QAAQ,EAAe,MAAM,iBAAiB,CAAA;AAEvD,OAAO,EAAE,cAAc,EAAE,MAAM,SAAS,CAAA;AAGxC,OAAO,EACL,4BAA4B,EAC5B,oCAAoC,EACrC,MAAM,SAAS,CAAA;AAYhB,MAAM,MAAM,WAAW,GAAG;IACxB,OAAO,EAAE;QACP,aAAa,EAAE,MAAM,CAAA;QACrB,yBAAyB,CAAC,EAAE,MAAM,CAAA;KACnC,CAAA;CACF,CAAA;AAED,qBAAa,eAAe;IAExB,OAAO,CAAC,EAAE;IACV,OAAO,CAAC,UAAU;IAClB,OAAO,CAAC,YAAY;IACpB,OAAO,CAAC,YAAY;IACpB,OAAO,CAAC,WAAW;IACZ,UAAU,EAAE,UAAU;IACtB,OAAO,CAAC,EAAE,OAAO;gBANhB,EAAE,EAAE,QAAQ,EACZ,UAAU,EAAE,OAAO,EACnB,YAAY,EAAE,MAAM,EACpB,YAAY,EAAE,QAAQ,EACtB,WAAW,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC,WAAW,CAAC,EACtD,UAAU,EAAE,UAAU,EACtB,OAAO,CAAC,EAAE,OAAO,YAAA;IAGpB,mBAAmB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;IAuBtE,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IAwB3D,WAAW,CAAC,GAAG,EAAE,4BAA4B,GAAG,QAAQ,CAAC,YAAY,CAAC;IA6IhE,WAAW,CACf,MAAM,EAAE,4BAA4B,GACnC,OAAO,CAAC,kBAAkB,CAAC;IAuBxB,WAAW,CACf,IAAI,EAAE,MAAM,EAAE,EACd,QAAQ,CAAC,EAAE,cAAc,GACxB,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IA8B3B,WAAW,CACf,MAAM,EAAE,uBAAuB,CAAC,WAAW,EAC3C,WAAW,EAAE,WAAW;IAgCpB,YAAY,CAChB,QAAQ,EAAE,aAAa,EAAE,GACxB,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IAwB7B,OAAO,CAAC,QAAQ,EAAE,aAAa,EAAE;gBAiBzB,SAAS;oBACL;YAAE,KAAK,CAAC,EAAE,SAAS,CAAC;YAAC,aAAa,CAAC,EAAE,iBAAiB,CAAA;SAAE;;IA6BpE,aAAa,CACjB,QAAQ,EAAE,aAAa,EAAE,EACzB,QAAQ,CAAC,EAAE,cAAc,GACxB,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC;IA+CnC,iBAAiB,CACrB,QAAQ,EAAE,MAAM,EAAE,EAClB,QAAQ,CAAC,EAAE,cAAc,GACxB,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;IA2BhC,YAAY,CAAC,MAAM,EAAE,4BAA4B,GAAG,YAAY;IAgB1D,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IAkC9C,IAAI,CAAC,KAAK,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC;IAqC3C,MAAM,CACV,QAAQ,EAAE,MAAM,EAAE,EAClB,UAAU,CAAC,EAAE,OAAO,GACnB,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;IAyB1B,uBAAuB,CAAC,GAAG,EAAE,QAAQ;IAkBrC,gBAAgB,CACpB,QAAQ,EAAE,MAAM,EAAE,GACjB,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,oCAAoC,CAAC,CAAC;IAoC7D,mBAAmB,CACjB,MAAM,EAAE,oCAAoC,GAC3C,iBAAiB;IA6Ed,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;IAUvD,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE;CAgBjC;AAED,KAAK,aAAa,GAAG;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAA;CAAE,CAAA;AAElD,KAAK,WAAW,GAAG,kBAAkB,CAAC,SAAS,CAAC,CAAA;AAIhD,KAAK,UAAU,GAAG;IAChB,GAAG,EAAE,MAAM,CAAA;IACX,GAAG,EAAE,MAAM,CAAA;IACX,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAC9B,SAAS,EAAE,MAAM,CAAA;CAClB,CAAA;AAyBD,wBAAgB,aAAa,CAAC,OAAO,EAAE;IACrC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAA;IAClB,GAAG,EAAE,MAAM,GAAG,IAAI,CAAA;IAClB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAA;CACvC,GAAG,KAAK,EAAE,CAYV"}
1
+ {"version":3,"file":"views.d.ts","sourceRoot":"","sources":["../../src/mod-service/views.ts"],"names":[],"mappings":"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"}
@@ -458,7 +458,6 @@ class ModerationViews {
458
458
  const { ref } = this.db.db.dynamic;
459
459
  const modStatusResults = await (0, status_1.moderationSubjectStatusQueryBuilder)(this.db.db)
460
460
  .where((0, kysely_1.sql) `${ref('moderation_subject_status.blobCids')} @> ${JSON.stringify(blobs.map((blob) => blob.ref.toString()))}`)
461
- .selectAll()
462
461
  .executeTakeFirst();
463
462
  const statusByCid = (modStatusResults?.blobCids || [])?.reduce((acc, cur) => Object.assign(acc, { [cur]: modStatusResults }), {});
464
463
  // Intentionally missing details field, since we don't have any on appview.
@@ -1 +1 @@
1
- {"version":3,"file":"views.js","sourceRoot":"","sources":["../../src/mod-service/views.ts"],"names":[],"mappings":"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","sourcesContent":["import { sql } from 'kysely'\nimport {\n AppBskyActorDefs,\n AtpAgent,\n ComAtprotoRepoGetRecord,\n} from '@atproto/api'\nimport { chunkArray, dedupeStrs } from '@atproto/common'\nimport { Keypair } from '@atproto/crypto'\nimport { IdResolver } from '@atproto/identity'\nimport { BlobRef } from '@atproto/lexicon'\nimport { AtUri, INVALID_HANDLE, normalizeDatetimeAlways } from '@atproto/syntax'\nimport { Database } from '../db'\nimport { LabelRow } from '../db/schema/label'\nimport { ids } from '../lexicon/lexicons'\nimport { FeedViewPost } from '../lexicon/types/app/bsky/feed/defs'\nimport { AccountView } from '../lexicon/types/com/atproto/admin/defs'\nimport {\n Label,\n validateSelfLabels,\n} from '../lexicon/types/com/atproto/label/defs'\nimport { OutputSchema as ReportOutput } from '../lexicon/types/com/atproto/moderation/createReport'\nimport { REASONOTHER } from '../lexicon/types/com/atproto/moderation/defs'\nimport {\n BlobView,\n ModEventView,\n ModEventViewDetail,\n RecordView,\n RecordViewDetail,\n RepoView,\n SubjectStatusView,\n isAccountEvent,\n isAgeAssuranceEvent,\n isAgeAssuranceOverrideEvent,\n isIdentityEvent,\n isModEventAcknowledge,\n isModEventComment,\n isModEventEmail,\n isModEventEscalate,\n isModEventLabel,\n isModEventMute,\n isModEventMuteReporter,\n isModEventPriorityScore,\n isModEventReport,\n isModEventTag,\n isModEventTakedown,\n isRecordEvent,\n isScheduleTakedownEvent,\n} from '../lexicon/types/tools/ozone/moderation/defs'\nimport { Un$Typed, asPredicate } from '../lexicon/util'\nimport { dbLogger, httpLogger } from '../logger'\nimport { ParsedLabelers } from '../util'\nimport { moderationSubjectStatusQueryBuilder } from './status'\nimport { subjectFromEventRow, subjectFromStatusRow } from './subject'\nimport {\n ModerationEventRowWithHandle,\n ModerationSubjectStatusRowWithHandle,\n} from './types'\nimport { formatLabel, getPdsAgentForRepo, signLabel } from './util'\n\nconst isValidSelfLabels = asPredicate(validateSelfLabels)\n\nconst ifString = (val: unknown): string | undefined =>\n typeof val === 'string' ? val : undefined\nconst ifBoolean = (val: unknown): boolean | undefined =>\n typeof val === 'boolean' ? val : undefined\nconst ifNumber = (val: unknown): number | undefined =>\n typeof val === 'number' ? val : undefined\n\nexport type AuthHeaders = {\n headers: {\n authorization: string\n 'atproto-accept-labelers'?: string\n }\n}\n\nexport class ModerationViews {\n constructor(\n private db: Database,\n private signingKey: Keypair,\n private signingKeyId: number,\n private appviewAgent: AtpAgent,\n private appviewAuth: (method: string) => Promise<AuthHeaders>,\n public idResolver: IdResolver,\n public devMode?: boolean,\n ) {}\n\n async getAccoutInfosByDid(dids: string[]): Promise<Map<string, AccountView>> {\n if (dids.length === 0) return new Map()\n const auth = await this.appviewAuth(ids.ComAtprotoAdminGetAccountInfos)\n if (!auth) return new Map()\n try {\n const res = await this.appviewAgent.com.atproto.admin.getAccountInfos(\n {\n dids: dedupeStrs(dids),\n },\n auth,\n )\n return res.data.infos.reduce((acc, cur) => {\n return acc.set(cur.did, cur)\n }, new Map<string, AccountView>())\n } catch (err) {\n httpLogger.error(\n { err, dids },\n 'failed to resolve account infos from appview',\n )\n return new Map()\n }\n }\n\n async repos(dids: string[]): Promise<Map<string, RepoView>> {\n if (dids.length === 0) return new Map()\n const [infos, subjectStatuses] = await Promise.all([\n this.getAccoutInfosByDid(dids),\n this.getSubjectStatus(dids),\n ])\n\n return dids.reduce((acc, did) => {\n const info = infos.get(did)\n if (!info) return acc\n const status = subjectStatuses.get(did)\n return acc.set(did, {\n // No email or invite info on appview\n did,\n handle: info.handle,\n relatedRecords: info.relatedRecords ?? [],\n indexedAt: info.indexedAt,\n moderation: {\n subjectStatus: status ? this.formatSubjectStatus(status) : undefined,\n },\n })\n }, new Map<string, RepoView>())\n }\n\n formatEvent(row: ModerationEventRowWithHandle): Un$Typed<ModEventView> {\n const eventView: Un$Typed<ModEventView> = {\n id: row.id,\n event: {\n $type: row.action,\n comment: row.comment ?? undefined,\n },\n subject: subjectFromEventRow(row).lex(),\n subjectBlobCids: row.subjectBlobCids ?? [],\n createdBy: row.createdBy,\n createdAt: row.createdAt,\n subjectHandle: row.subjectHandle ?? undefined,\n creatorHandle: row.creatorHandle ?? undefined,\n modTool: row.modTool\n ? {\n name: row.modTool.name,\n meta: row.modTool.meta,\n }\n : undefined,\n }\n\n const { event } = eventView\n const meta = row.meta || {}\n\n if (\n isModEventMuteReporter(event) ||\n isModEventTakedown(event) ||\n isModEventLabel(event) ||\n isModEventMute(event)\n ) {\n event.durationInHours = row.durationInHours ?? undefined\n }\n\n if (\n (isModEventTakedown(event) || isModEventAcknowledge(event)) &&\n meta.acknowledgeAccountSubjects\n ) {\n event.acknowledgeAccountSubjects = ifBoolean(\n meta.acknowledgeAccountSubjects,\n )!\n }\n\n if (isModEventPriorityScore(event)) {\n event.score = ifNumber(meta?.priorityScore) ?? 0\n }\n\n if (\n isModEventTakedown(event) &&\n typeof meta.policies === 'string' &&\n meta.policies.length > 0\n ) {\n event.policies = meta.policies.split(',')\n }\n\n if (isModEventLabel(event)) {\n event.createLabelVals = row.createLabelVals?.length\n ? row.createLabelVals.split(' ')\n : []\n event.negateLabelVals = row.negateLabelVals?.length\n ? row.negateLabelVals.split(' ')\n : []\n } else if (\n isModEventAcknowledge(event) ||\n isModEventTakedown(event) ||\n isModEventEscalate(event)\n ) {\n // This is for legacy data only, for new events, these types of events\n // won't have labels attached:\n\n if (row.createLabelVals?.length) {\n // @ts-expect-error legacy\n event.createLabelVals = row.createLabelVals.split(' ')\n }\n\n if (row.negateLabelVals?.length) {\n // @ts-expect-error legacy\n event.negateLabelVals = row.negateLabelVals.split(' ')\n }\n }\n\n if (isModEventReport(event)) {\n event.isReporterMuted = !!meta.isReporterMuted\n event.reportType = ifString(meta.reportType)!\n }\n\n if (isModEventEmail(event)) {\n event.content = ifString(meta.content)!\n event.subjectLine = ifString(meta.subjectLine)!\n }\n\n if (isModEventComment(event) && meta.sticky) {\n event.sticky = true\n }\n\n if (isModEventTag(event)) {\n event.add = row.addedTags || []\n event.remove = row.removedTags || []\n }\n\n if (isAccountEvent(event)) {\n event.active = !!meta.active\n event.timestamp = ifString(meta.timestamp)!\n event.status = ifString(meta.status)!\n }\n\n if (isIdentityEvent(event)) {\n event.timestamp = ifString(meta.timestamp)!\n event.handle = ifString(meta.handle)!\n event.pdsHost = ifString(meta.pdsHost)!\n event.tombstone = !!meta.tombstone\n }\n\n if (isRecordEvent(event)) {\n event.op = ifString(meta.op)!\n event.cid = ifString(meta.cid)!\n event.timestamp = ifString(meta.timestamp)!\n }\n\n if (isAgeAssuranceEvent(event)) {\n event.status = ifString(meta.status)!\n event.createdAt = ifString(meta.createdAt)!\n event.attemptId = ifString(meta.attemptId)!\n event.initIp = ifString(meta.initIp)\n event.initUa = ifString(meta.initUa)\n event.completeIp = ifString(meta.completeIp)\n event.completeUa = ifString(meta.completeUa)\n }\n\n if (isAgeAssuranceOverrideEvent(event)) {\n event.status = ifString(meta.status)!\n }\n\n if (isScheduleTakedownEvent(event)) {\n event.executeAt = ifString(meta.executeAt)\n event.executeAfter = ifString(meta.executeAfter)\n event.executeUntil = ifString(meta.executeUntil)\n }\n\n return eventView\n }\n\n async eventDetail(\n result: ModerationEventRowWithHandle,\n ): Promise<ModEventViewDetail> {\n const subjectId =\n result.subjectType === 'com.atproto.admin.defs#repoRef'\n ? result.subjectDid\n : result.subjectUri\n if (!subjectId) {\n throw new Error(`Bad subject: ${result.id}`)\n }\n const subject = await this.subject(subjectId)\n const eventView = this.formatEvent(result)\n const allBlobs = 'value' in subject ? findBlobRefs(subject.value) : []\n const subjectBlobs = await this.blob(\n allBlobs.filter((blob) =>\n eventView.subjectBlobCids.includes(blob.ref.toString()),\n ),\n )\n return {\n ...eventView,\n subject,\n subjectBlobs,\n }\n }\n\n async repoDetails(\n dids: string[],\n labelers?: ParsedLabelers,\n ): Promise<Map<string, RepoView>> {\n const results = new Map<string, RepoView>()\n if (!dids.length) {\n return results\n }\n\n const [repos, localLabels, externalLabels] = await Promise.all([\n this.repos(dids),\n this.labels(dids),\n this.getExternalLabels(dids, labelers),\n ])\n\n repos.forEach((repo, did) => {\n const labels = [\n ...(localLabels.get(did) || []),\n ...(externalLabels.get(did) || []),\n ]\n const repoView = {\n ...repo,\n labels,\n moderation: {\n ...repo.moderation,\n },\n }\n results.set(did, repoView)\n })\n\n return results\n }\n\n async fetchRecord(\n params: ComAtprotoRepoGetRecord.QueryParams,\n appviewAuth: AuthHeaders,\n ) {\n try {\n const record = await this.appviewAgent.com.atproto.repo.getRecord(\n params,\n appviewAuth,\n )\n return record\n } catch (err) {\n if (err instanceof ComAtprotoRepoGetRecord.RecordNotFoundError) {\n // If pds fetch fails, just return null regardless of the error\n try {\n const { agent: pdsAgent } = await getPdsAgentForRepo(\n this.idResolver,\n params.repo,\n this.devMode,\n )\n if (!pdsAgent) {\n return null\n }\n\n const record = await pdsAgent.com.atproto.repo.getRecord(params)\n return record\n } catch (error) {\n return null\n }\n }\n\n return null\n }\n }\n\n async fetchRecords(\n subjects: RecordSubject[],\n ): Promise<Map<string, RecordInfo>> {\n const appviewAuth = await this.appviewAuth(ids.ComAtprotoRepoGetRecord)\n if (!appviewAuth) return new Map()\n\n const fetched = await Promise.all(\n subjects.map(async (subject) => {\n const uri = new AtUri(subject.uri)\n const params = {\n repo: uri.hostname,\n collection: uri.collection,\n rkey: uri.rkey,\n cid: subject.cid,\n }\n return this.fetchRecord(params, appviewAuth)\n }),\n )\n return fetched.reduce((acc, cur) => {\n if (!cur) return acc\n const data = cur.data\n const indexedAt = new Date().toISOString()\n return acc.set(data.uri, { ...data, cid: data.cid ?? '', indexedAt })\n }, new Map<string, RecordInfo>())\n }\n\n async records(subjects: RecordSubject[]) {\n const uris = subjects.map((record) => new AtUri(record.uri))\n const dids = uris.map((u) => u.hostname)\n\n const [repos, subjectStatuses, records] = await Promise.all([\n this.repos(dids),\n this.getSubjectStatus(subjects.map((s) => s.uri)),\n this.fetchRecords(subjects),\n ])\n\n const map = new Map<\n string,\n // Because the result of this function is used to build RecordViewDetail,\n // we explicitly type the result without the $type field, so can be used\n // as both RecordView and RecordViewDetail, without having to cast or\n // override the $type field.\n RecordView & {\n $type?: undefined\n moderation: { $type?: undefined; subjectStatus?: SubjectStatusView }\n }\n >()\n\n for (const uri of uris) {\n const repo = repos.get(uri.hostname)\n if (!repo) continue\n const record = records.get(uri.toString())\n if (!record) continue\n const subjectStatus = subjectStatuses.get(uri.toString())\n\n map.set(uri.toString(), {\n uri: uri.toString(),\n cid: record.cid,\n value: record.value,\n blobCids: findBlobRefs(record.value).map((blob) => blob.ref.toString()),\n indexedAt: record.indexedAt,\n repo,\n moderation: {\n subjectStatus: subjectStatus\n ? this.formatSubjectStatus(subjectStatus)\n : undefined,\n },\n })\n }\n\n return map\n }\n\n async recordDetails(\n subjects: RecordSubject[],\n labelers?: ParsedLabelers,\n ): Promise<Map<string, RecordViewDetail>> {\n const results = new Map<string, RecordViewDetail>()\n if (!subjects.length) {\n return results\n }\n\n const subjectUris = subjects.map((s) => s.uri)\n const [records, subjectStatusesResult, localLabels, externalLabels] =\n await Promise.all([\n this.records(subjects),\n this.getSubjectStatus(subjectUris),\n this.labels(subjectUris),\n this.getExternalLabels(subjectUris, labelers),\n ])\n\n await Promise.all(\n Array.from(records.entries()).map(async ([uri, record]) => {\n const selfLabels = getSelfLabels({\n uri: record.uri,\n cid: record.cid,\n record: record.value,\n })\n\n const status = subjectStatusesResult.get(uri)\n const blobs = await this.blob(findBlobRefs(record.value))\n\n results.set(uri, {\n ...record,\n blobs,\n moderation: {\n ...record.moderation,\n subjectStatus: status\n ? this.formatSubjectStatus(status)\n : undefined,\n },\n labels: [\n ...(localLabels.get(uri) || []),\n ...selfLabels,\n ...(externalLabels.get(uri) || []),\n ],\n })\n }),\n )\n\n return results\n }\n\n async getExternalLabels(\n subjects: string[],\n labelers?: ParsedLabelers,\n ): Promise<Map<string, Label[]>> {\n const results = new Map<string, Label[]>()\n if (!labelers?.dids.length && !labelers?.redact.size) return results\n try {\n const {\n data: { labels },\n } = await this.appviewAgent.com.atproto.label.queryLabels({\n uriPatterns: subjects,\n sources: labelers.dids,\n })\n labels.forEach((label) => {\n if (!results.has(label.uri)) {\n results.set(label.uri, [label])\n return\n }\n results.get(label.uri)?.push(label)\n })\n return results\n } catch (err) {\n httpLogger.error(\n { err, subjects, labelers },\n 'failed to resolve labels from appview',\n )\n return results\n }\n }\n\n formatReport(report: ModerationEventRowWithHandle): ReportOutput {\n return {\n id: report.id,\n createdAt: report.createdAt,\n // Ideally, we would never have a report entry that does not have a reasonType but at the schema level\n // we are not guarantying that so in whatever case, if we end up with such entries, default to 'other'\n reasonType: report.meta?.reportType\n ? (report.meta?.reportType as string)\n : REASONOTHER,\n reason: report.comment ?? undefined,\n reportedBy: report.createdBy,\n subject: subjectFromEventRow(report).lex() as ReportOutput['subject'],\n }\n }\n // Partial view for subjects\n\n async subject(subject: string): Promise<SubjectView> {\n if (subject.startsWith('did:')) {\n const repos = await this.repos([subject])\n const repo = repos.get(subject)\n if (repo) {\n return {\n ...repo,\n $type: 'tools.ozone.moderation.defs#repoView',\n }\n } else {\n return {\n $type: 'tools.ozone.moderation.defs#repoViewNotFound',\n did: subject,\n }\n }\n } else {\n const records = await this.records([{ uri: subject }])\n const record = records.get(subject)\n if (record) {\n return {\n ...record,\n $type: 'tools.ozone.moderation.defs#recordView',\n }\n } else {\n return {\n $type: 'tools.ozone.moderation.defs#recordViewNotFound',\n uri: subject,\n }\n }\n }\n }\n\n // Partial view for blobs\n\n async blob(blobs: BlobRef[]): Promise<BlobView[]> {\n if (!blobs.length) return []\n const { ref } = this.db.db.dynamic\n const modStatusResults = await moderationSubjectStatusQueryBuilder(\n this.db.db,\n )\n .where(\n sql<string>`${ref(\n 'moderation_subject_status.blobCids',\n )} @> ${JSON.stringify(blobs.map((blob) => blob.ref.toString()))}`,\n )\n .selectAll()\n .executeTakeFirst()\n const statusByCid = (modStatusResults?.blobCids || [])?.reduce(\n (acc, cur) => Object.assign(acc, { [cur]: modStatusResults }),\n {},\n )\n // Intentionally missing details field, since we don't have any on appview.\n // We also don't know when the blob was created, so we use a canned creation time.\n const unknownTime = new Date(0).toISOString()\n return blobs.map((blob) => {\n const cid = blob.ref.toString()\n const subjectStatus = statusByCid[cid]\n ? this.formatSubjectStatus(statusByCid[cid])\n : undefined\n return {\n cid,\n mimeType: blob.mimeType,\n size: blob.size,\n createdAt: unknownTime,\n moderation: {\n subjectStatus,\n },\n }\n })\n }\n\n async labels(\n subjects: string[],\n includeNeg?: boolean,\n ): Promise<Map<string, Label[]>> {\n const now = new Date().toISOString()\n const labels = new Map<string, Label[]>()\n const res = await this.db.db\n .selectFrom('label')\n .where('label.uri', 'in', subjects)\n .where((qb) =>\n qb.where('label.exp', 'is', null).orWhere('label.exp', '>', now),\n )\n .if(!includeNeg, (qb) => qb.where('neg', '=', false))\n .selectAll()\n .execute()\n\n await Promise.all(\n res.map(async (labelRow) => {\n const signedLabel = await this.formatLabelAndEnsureSig(labelRow)\n\n const current = labels.get(labelRow.uri)\n if (current) current.push(signedLabel)\n else labels.set(labelRow.uri, [signedLabel])\n }),\n )\n return labels\n }\n\n async formatLabelAndEnsureSig(row: LabelRow) {\n const formatted = formatLabel(row)\n if (!!row.sig && row.signingKeyId === this.signingKeyId) {\n return formatted\n }\n const signed = await signLabel(formatted, this.signingKey)\n try {\n await this.db.db\n .updateTable('label')\n .set({ sig: Buffer.from(signed.sig), signingKeyId: this.signingKeyId })\n .where('id', '=', row.id)\n .execute()\n } catch (err) {\n dbLogger.error({ err, label: row }, 'failed to update resigned label')\n }\n return signed\n }\n\n async getSubjectStatus(\n subjects: string[],\n ): Promise<Map<string, ModerationSubjectStatusRowWithHandle>> {\n if (!subjects.length) return new Map()\n\n const parsedSubjects = subjects.map(parseSubjectId)\n\n const builder = moderationSubjectStatusQueryBuilder(this.db.db)\n //\n .where((qb) => {\n for (const sub of parsedSubjects) {\n qb = qb.orWhere((qb) =>\n qb\n .where('moderation_subject_status.did', '=', sub.did)\n .where(\n 'moderation_subject_status.recordPath',\n '=',\n sub.recordPath ?? '',\n ),\n )\n }\n return qb\n })\n\n const [statusRes, accountsByDid] = await Promise.all([\n builder.execute(),\n this.getAccoutInfosByDid(parsedSubjects.map((s) => s.did)),\n ])\n\n return new Map(\n statusRes.map((row): [string, ModerationSubjectStatusRowWithHandle] => {\n const subjectId = formatSubjectId(row.did, row.recordPath)\n const handle = accountsByDid.get(row.did)?.handle ?? INVALID_HANDLE\n return [subjectId, { ...row, handle }]\n }),\n )\n }\n\n formatSubjectStatus(\n status: ModerationSubjectStatusRowWithHandle,\n ): SubjectStatusView {\n const statusView: SubjectStatusView = {\n id: status.id,\n reviewState: status.reviewState,\n createdAt: status.createdAt,\n updatedAt: status.updatedAt,\n comment: status.comment ?? undefined,\n lastReviewedBy: status.lastReviewedBy ?? undefined,\n lastReviewedAt: status.lastReviewedAt ?? undefined,\n lastReportedAt: status.lastReportedAt ?? undefined,\n lastAppealedAt: status.lastAppealedAt ?? undefined,\n muteUntil: status.muteUntil ?? undefined,\n muteReportingUntil: status.muteReportingUntil ?? undefined,\n suspendUntil: status.suspendUntil ?? undefined,\n takendown: status.takendown ?? undefined,\n appealed: status.appealed ?? undefined,\n subjectRepoHandle: status.handle ?? undefined,\n subjectBlobCids: status.blobCids || [],\n tags: status.tags || [],\n priorityScore: status.priorityScore,\n ageAssuranceState: status.ageAssuranceState ?? undefined,\n ageAssuranceUpdatedBy: status.ageAssuranceUpdatedBy ?? undefined,\n subject: subjectFromStatusRow(\n status,\n ).lex() as SubjectStatusView['subject'],\n\n accountStats: {\n // Explicitly typing to allow for easy manipulation (e.g. to strip from tests snapshots)\n $type: 'tools.ozone.moderation.defs#accountStats',\n\n // account_events_stats\n reportCount: status.reportCount ?? undefined,\n appealCount: status.appealCount ?? undefined,\n suspendCount: status.suspendCount ?? undefined,\n takedownCount: status.takedownCount ?? undefined,\n escalateCount: status.escalateCount ?? undefined,\n },\n\n recordsStats: {\n // Explicitly typing to allow for easy manipulation (e.g. to strip from tests snapshots)\n $type: 'tools.ozone.moderation.defs#recordsStats',\n\n // account_record_events_stats\n totalReports: status.totalReports ?? undefined,\n reportedCount: status.reportedCount ?? undefined,\n escalatedCount: status.escalatedCount ?? undefined,\n appealedCount: status.appealedCount ?? undefined,\n\n // account_record_status_stats\n subjectCount: status.subjectCount ?? undefined,\n pendingCount: status.pendingCount ?? undefined,\n processedCount: status.processedCount ?? undefined,\n takendownCount: status.takendownCount ?? undefined,\n },\n }\n\n if (status.recordPath !== '') {\n statusView.hosting = {\n $type: 'tools.ozone.moderation.defs#recordHosting',\n updatedAt: status.hostingUpdatedAt ?? undefined,\n deletedAt: status.hostingDeletedAt ?? undefined,\n status: status.hostingStatus ?? 'unknown',\n }\n } else {\n statusView.hosting = {\n $type: 'tools.ozone.moderation.defs#accountHosting',\n updatedAt: status.hostingUpdatedAt ?? undefined,\n deletedAt: status.hostingDeletedAt ?? undefined,\n status: status.hostingStatus ?? 'unknown',\n deactivatedAt: status.hostingDeactivatedAt ?? undefined,\n reactivatedAt: status.hostingReactivatedAt ?? undefined,\n }\n }\n\n return statusView\n }\n\n async fetchAuthorFeed(actor: string): Promise<FeedViewPost[]> {\n const auth = await this.appviewAuth(ids.AppBskyFeedGetAuthorFeed)\n if (!auth) return []\n const {\n data: { feed },\n } = await this.appviewAgent.app.bsky.feed.getAuthorFeed({ actor }, auth)\n\n return feed\n }\n\n async getProfiles(dids: string[]) {\n const profiles = new Map<string, AppBskyActorDefs.ProfileViewDetailed>()\n\n const auth = await this.appviewAuth(ids.AppBskyActorGetProfiles)\n if (!auth) return profiles\n\n for (const actors of chunkArray(dids, 25)) {\n const { data } = await this.appviewAgent.getProfiles({ actors }, auth)\n\n data.profiles.forEach((profile) => {\n profiles.set(profile.did, profile)\n })\n }\n\n return profiles\n }\n}\n\ntype RecordSubject = { uri: string; cid?: string }\n\ntype SubjectView = ModEventViewDetail['subject']\n// @TODO tidy\n// type SubjectView = ModEventViewDetail['subject'] & ReportViewDetail['subject']\n\ntype RecordInfo = {\n uri: string\n cid: string\n value: Record<string, unknown>\n indexedAt: string\n}\n\nfunction parseSubjectId(subject: string): { did: string; recordPath?: string } {\n if (subject.startsWith('did:')) {\n return { did: subject }\n }\n const uri = new AtUri(subject)\n return { did: uri.hostname, recordPath: `${uri.collection}/${uri.rkey}` }\n}\n\nfunction formatSubjectId(did: string, recordPath?: string) {\n return recordPath ? `at://${did}/${recordPath}` : did\n}\n\nfunction findBlobRefs(value: unknown, refs: BlobRef[] = []) {\n if (value instanceof BlobRef) {\n refs.push(value)\n } else if (Array.isArray(value)) {\n value.forEach((val) => findBlobRefs(val, refs))\n } else if (value && typeof value === 'object') {\n Object.values(value).forEach((val) => findBlobRefs(val, refs))\n }\n return refs\n}\n\nexport function getSelfLabels(details: {\n uri: string | null\n cid: string | null\n record: Record<string, unknown> | null\n}): Label[] {\n const { uri, cid, record } = details\n if (!uri || !cid || !record) return []\n if (!isValidSelfLabels(record.labels)) return []\n const src = new AtUri(uri).host // record creator\n const cts =\n typeof record.createdAt === 'string'\n ? normalizeDatetimeAlways(record.createdAt)\n : new Date(0).toISOString()\n return record.labels.values.map(({ val }) => {\n return { src, uri, cid, val, cts }\n })\n}\n"]}
1
+ {"version":3,"file":"views.js","sourceRoot":"","sources":["../../src/mod-service/views.ts"],"names":[],"mappings":"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","sourcesContent":["import { sql } from 'kysely'\nimport {\n AppBskyActorDefs,\n AtpAgent,\n ComAtprotoRepoGetRecord,\n} from '@atproto/api'\nimport { chunkArray, dedupeStrs } from '@atproto/common'\nimport { Keypair } from '@atproto/crypto'\nimport { IdResolver } from '@atproto/identity'\nimport { BlobRef } from '@atproto/lexicon'\nimport { AtUri, INVALID_HANDLE, normalizeDatetimeAlways } from '@atproto/syntax'\nimport { Database } from '../db'\nimport { LabelRow } from '../db/schema/label'\nimport { ids } from '../lexicon/lexicons'\nimport { FeedViewPost } from '../lexicon/types/app/bsky/feed/defs'\nimport { AccountView } from '../lexicon/types/com/atproto/admin/defs'\nimport {\n Label,\n validateSelfLabels,\n} from '../lexicon/types/com/atproto/label/defs'\nimport { OutputSchema as ReportOutput } from '../lexicon/types/com/atproto/moderation/createReport'\nimport { REASONOTHER } from '../lexicon/types/com/atproto/moderation/defs'\nimport {\n BlobView,\n ModEventView,\n ModEventViewDetail,\n RecordView,\n RecordViewDetail,\n RepoView,\n SubjectStatusView,\n isAccountEvent,\n isAgeAssuranceEvent,\n isAgeAssuranceOverrideEvent,\n isIdentityEvent,\n isModEventAcknowledge,\n isModEventComment,\n isModEventEmail,\n isModEventEscalate,\n isModEventLabel,\n isModEventMute,\n isModEventMuteReporter,\n isModEventPriorityScore,\n isModEventReport,\n isModEventTag,\n isModEventTakedown,\n isRecordEvent,\n isScheduleTakedownEvent,\n} from '../lexicon/types/tools/ozone/moderation/defs'\nimport { Un$Typed, asPredicate } from '../lexicon/util'\nimport { dbLogger, httpLogger } from '../logger'\nimport { ParsedLabelers } from '../util'\nimport { moderationSubjectStatusQueryBuilder } from './status'\nimport { subjectFromEventRow, subjectFromStatusRow } from './subject'\nimport {\n ModerationEventRowWithHandle,\n ModerationSubjectStatusRowWithHandle,\n} from './types'\nimport { formatLabel, getPdsAgentForRepo, signLabel } from './util'\n\nconst isValidSelfLabels = asPredicate(validateSelfLabels)\n\nconst ifString = (val: unknown): string | undefined =>\n typeof val === 'string' ? val : undefined\nconst ifBoolean = (val: unknown): boolean | undefined =>\n typeof val === 'boolean' ? val : undefined\nconst ifNumber = (val: unknown): number | undefined =>\n typeof val === 'number' ? val : undefined\n\nexport type AuthHeaders = {\n headers: {\n authorization: string\n 'atproto-accept-labelers'?: string\n }\n}\n\nexport class ModerationViews {\n constructor(\n private db: Database,\n private signingKey: Keypair,\n private signingKeyId: number,\n private appviewAgent: AtpAgent,\n private appviewAuth: (method: string) => Promise<AuthHeaders>,\n public idResolver: IdResolver,\n public devMode?: boolean,\n ) {}\n\n async getAccoutInfosByDid(dids: string[]): Promise<Map<string, AccountView>> {\n if (dids.length === 0) return new Map()\n const auth = await this.appviewAuth(ids.ComAtprotoAdminGetAccountInfos)\n if (!auth) return new Map()\n try {\n const res = await this.appviewAgent.com.atproto.admin.getAccountInfos(\n {\n dids: dedupeStrs(dids),\n },\n auth,\n )\n return res.data.infos.reduce((acc, cur) => {\n return acc.set(cur.did, cur)\n }, new Map<string, AccountView>())\n } catch (err) {\n httpLogger.error(\n { err, dids },\n 'failed to resolve account infos from appview',\n )\n return new Map()\n }\n }\n\n async repos(dids: string[]): Promise<Map<string, RepoView>> {\n if (dids.length === 0) return new Map()\n const [infos, subjectStatuses] = await Promise.all([\n this.getAccoutInfosByDid(dids),\n this.getSubjectStatus(dids),\n ])\n\n return dids.reduce((acc, did) => {\n const info = infos.get(did)\n if (!info) return acc\n const status = subjectStatuses.get(did)\n return acc.set(did, {\n // No email or invite info on appview\n did,\n handle: info.handle,\n relatedRecords: info.relatedRecords ?? [],\n indexedAt: info.indexedAt,\n moderation: {\n subjectStatus: status ? this.formatSubjectStatus(status) : undefined,\n },\n })\n }, new Map<string, RepoView>())\n }\n\n formatEvent(row: ModerationEventRowWithHandle): Un$Typed<ModEventView> {\n const eventView: Un$Typed<ModEventView> = {\n id: row.id,\n event: {\n $type: row.action,\n comment: row.comment ?? undefined,\n },\n subject: subjectFromEventRow(row).lex(),\n subjectBlobCids: row.subjectBlobCids ?? [],\n createdBy: row.createdBy,\n createdAt: row.createdAt,\n subjectHandle: row.subjectHandle ?? undefined,\n creatorHandle: row.creatorHandle ?? undefined,\n modTool: row.modTool\n ? {\n name: row.modTool.name,\n meta: row.modTool.meta,\n }\n : undefined,\n }\n\n const { event } = eventView\n const meta = row.meta || {}\n\n if (\n isModEventMuteReporter(event) ||\n isModEventTakedown(event) ||\n isModEventLabel(event) ||\n isModEventMute(event)\n ) {\n event.durationInHours = row.durationInHours ?? undefined\n }\n\n if (\n (isModEventTakedown(event) || isModEventAcknowledge(event)) &&\n meta.acknowledgeAccountSubjects\n ) {\n event.acknowledgeAccountSubjects = ifBoolean(\n meta.acknowledgeAccountSubjects,\n )!\n }\n\n if (isModEventPriorityScore(event)) {\n event.score = ifNumber(meta?.priorityScore) ?? 0\n }\n\n if (\n isModEventTakedown(event) &&\n typeof meta.policies === 'string' &&\n meta.policies.length > 0\n ) {\n event.policies = meta.policies.split(',')\n }\n\n if (isModEventLabel(event)) {\n event.createLabelVals = row.createLabelVals?.length\n ? row.createLabelVals.split(' ')\n : []\n event.negateLabelVals = row.negateLabelVals?.length\n ? row.negateLabelVals.split(' ')\n : []\n } else if (\n isModEventAcknowledge(event) ||\n isModEventTakedown(event) ||\n isModEventEscalate(event)\n ) {\n // This is for legacy data only, for new events, these types of events\n // won't have labels attached:\n\n if (row.createLabelVals?.length) {\n // @ts-expect-error legacy\n event.createLabelVals = row.createLabelVals.split(' ')\n }\n\n if (row.negateLabelVals?.length) {\n // @ts-expect-error legacy\n event.negateLabelVals = row.negateLabelVals.split(' ')\n }\n }\n\n if (isModEventReport(event)) {\n event.isReporterMuted = !!meta.isReporterMuted\n event.reportType = ifString(meta.reportType)!\n }\n\n if (isModEventEmail(event)) {\n event.content = ifString(meta.content)!\n event.subjectLine = ifString(meta.subjectLine)!\n }\n\n if (isModEventComment(event) && meta.sticky) {\n event.sticky = true\n }\n\n if (isModEventTag(event)) {\n event.add = row.addedTags || []\n event.remove = row.removedTags || []\n }\n\n if (isAccountEvent(event)) {\n event.active = !!meta.active\n event.timestamp = ifString(meta.timestamp)!\n event.status = ifString(meta.status)!\n }\n\n if (isIdentityEvent(event)) {\n event.timestamp = ifString(meta.timestamp)!\n event.handle = ifString(meta.handle)!\n event.pdsHost = ifString(meta.pdsHost)!\n event.tombstone = !!meta.tombstone\n }\n\n if (isRecordEvent(event)) {\n event.op = ifString(meta.op)!\n event.cid = ifString(meta.cid)!\n event.timestamp = ifString(meta.timestamp)!\n }\n\n if (isAgeAssuranceEvent(event)) {\n event.status = ifString(meta.status)!\n event.createdAt = ifString(meta.createdAt)!\n event.attemptId = ifString(meta.attemptId)!\n event.initIp = ifString(meta.initIp)\n event.initUa = ifString(meta.initUa)\n event.completeIp = ifString(meta.completeIp)\n event.completeUa = ifString(meta.completeUa)\n }\n\n if (isAgeAssuranceOverrideEvent(event)) {\n event.status = ifString(meta.status)!\n }\n\n if (isScheduleTakedownEvent(event)) {\n event.executeAt = ifString(meta.executeAt)\n event.executeAfter = ifString(meta.executeAfter)\n event.executeUntil = ifString(meta.executeUntil)\n }\n\n return eventView\n }\n\n async eventDetail(\n result: ModerationEventRowWithHandle,\n ): Promise<ModEventViewDetail> {\n const subjectId =\n result.subjectType === 'com.atproto.admin.defs#repoRef'\n ? result.subjectDid\n : result.subjectUri\n if (!subjectId) {\n throw new Error(`Bad subject: ${result.id}`)\n }\n const subject = await this.subject(subjectId)\n const eventView = this.formatEvent(result)\n const allBlobs = 'value' in subject ? findBlobRefs(subject.value) : []\n const subjectBlobs = await this.blob(\n allBlobs.filter((blob) =>\n eventView.subjectBlobCids.includes(blob.ref.toString()),\n ),\n )\n return {\n ...eventView,\n subject,\n subjectBlobs,\n }\n }\n\n async repoDetails(\n dids: string[],\n labelers?: ParsedLabelers,\n ): Promise<Map<string, RepoView>> {\n const results = new Map<string, RepoView>()\n if (!dids.length) {\n return results\n }\n\n const [repos, localLabels, externalLabels] = await Promise.all([\n this.repos(dids),\n this.labels(dids),\n this.getExternalLabels(dids, labelers),\n ])\n\n repos.forEach((repo, did) => {\n const labels = [\n ...(localLabels.get(did) || []),\n ...(externalLabels.get(did) || []),\n ]\n const repoView = {\n ...repo,\n labels,\n moderation: {\n ...repo.moderation,\n },\n }\n results.set(did, repoView)\n })\n\n return results\n }\n\n async fetchRecord(\n params: ComAtprotoRepoGetRecord.QueryParams,\n appviewAuth: AuthHeaders,\n ) {\n try {\n const record = await this.appviewAgent.com.atproto.repo.getRecord(\n params,\n appviewAuth,\n )\n return record\n } catch (err) {\n if (err instanceof ComAtprotoRepoGetRecord.RecordNotFoundError) {\n // If pds fetch fails, just return null regardless of the error\n try {\n const { agent: pdsAgent } = await getPdsAgentForRepo(\n this.idResolver,\n params.repo,\n this.devMode,\n )\n if (!pdsAgent) {\n return null\n }\n\n const record = await pdsAgent.com.atproto.repo.getRecord(params)\n return record\n } catch (error) {\n return null\n }\n }\n\n return null\n }\n }\n\n async fetchRecords(\n subjects: RecordSubject[],\n ): Promise<Map<string, RecordInfo>> {\n const appviewAuth = await this.appviewAuth(ids.ComAtprotoRepoGetRecord)\n if (!appviewAuth) return new Map()\n\n const fetched = await Promise.all(\n subjects.map(async (subject) => {\n const uri = new AtUri(subject.uri)\n const params = {\n repo: uri.hostname,\n collection: uri.collection,\n rkey: uri.rkey,\n cid: subject.cid,\n }\n return this.fetchRecord(params, appviewAuth)\n }),\n )\n return fetched.reduce((acc, cur) => {\n if (!cur) return acc\n const data = cur.data\n const indexedAt = new Date().toISOString()\n return acc.set(data.uri, { ...data, cid: data.cid ?? '', indexedAt })\n }, new Map<string, RecordInfo>())\n }\n\n async records(subjects: RecordSubject[]) {\n const uris = subjects.map((record) => new AtUri(record.uri))\n const dids = uris.map((u) => u.hostname)\n\n const [repos, subjectStatuses, records] = await Promise.all([\n this.repos(dids),\n this.getSubjectStatus(subjects.map((s) => s.uri)),\n this.fetchRecords(subjects),\n ])\n\n const map = new Map<\n string,\n // Because the result of this function is used to build RecordViewDetail,\n // we explicitly type the result without the $type field, so can be used\n // as both RecordView and RecordViewDetail, without having to cast or\n // override the $type field.\n RecordView & {\n $type?: undefined\n moderation: { $type?: undefined; subjectStatus?: SubjectStatusView }\n }\n >()\n\n for (const uri of uris) {\n const repo = repos.get(uri.hostname)\n if (!repo) continue\n const record = records.get(uri.toString())\n if (!record) continue\n const subjectStatus = subjectStatuses.get(uri.toString())\n\n map.set(uri.toString(), {\n uri: uri.toString(),\n cid: record.cid,\n value: record.value,\n blobCids: findBlobRefs(record.value).map((blob) => blob.ref.toString()),\n indexedAt: record.indexedAt,\n repo,\n moderation: {\n subjectStatus: subjectStatus\n ? this.formatSubjectStatus(subjectStatus)\n : undefined,\n },\n })\n }\n\n return map\n }\n\n async recordDetails(\n subjects: RecordSubject[],\n labelers?: ParsedLabelers,\n ): Promise<Map<string, RecordViewDetail>> {\n const results = new Map<string, RecordViewDetail>()\n if (!subjects.length) {\n return results\n }\n\n const subjectUris = subjects.map((s) => s.uri)\n const [records, subjectStatusesResult, localLabels, externalLabels] =\n await Promise.all([\n this.records(subjects),\n this.getSubjectStatus(subjectUris),\n this.labels(subjectUris),\n this.getExternalLabels(subjectUris, labelers),\n ])\n\n await Promise.all(\n Array.from(records.entries()).map(async ([uri, record]) => {\n const selfLabels = getSelfLabels({\n uri: record.uri,\n cid: record.cid,\n record: record.value,\n })\n\n const status = subjectStatusesResult.get(uri)\n const blobs = await this.blob(findBlobRefs(record.value))\n\n results.set(uri, {\n ...record,\n blobs,\n moderation: {\n ...record.moderation,\n subjectStatus: status\n ? this.formatSubjectStatus(status)\n : undefined,\n },\n labels: [\n ...(localLabels.get(uri) || []),\n ...selfLabels,\n ...(externalLabels.get(uri) || []),\n ],\n })\n }),\n )\n\n return results\n }\n\n async getExternalLabels(\n subjects: string[],\n labelers?: ParsedLabelers,\n ): Promise<Map<string, Label[]>> {\n const results = new Map<string, Label[]>()\n if (!labelers?.dids.length && !labelers?.redact.size) return results\n try {\n const {\n data: { labels },\n } = await this.appviewAgent.com.atproto.label.queryLabels({\n uriPatterns: subjects,\n sources: labelers.dids,\n })\n labels.forEach((label) => {\n if (!results.has(label.uri)) {\n results.set(label.uri, [label])\n return\n }\n results.get(label.uri)?.push(label)\n })\n return results\n } catch (err) {\n httpLogger.error(\n { err, subjects, labelers },\n 'failed to resolve labels from appview',\n )\n return results\n }\n }\n\n formatReport(report: ModerationEventRowWithHandle): ReportOutput {\n return {\n id: report.id,\n createdAt: report.createdAt,\n // Ideally, we would never have a report entry that does not have a reasonType but at the schema level\n // we are not guarantying that so in whatever case, if we end up with such entries, default to 'other'\n reasonType: report.meta?.reportType\n ? (report.meta?.reportType as string)\n : REASONOTHER,\n reason: report.comment ?? undefined,\n reportedBy: report.createdBy,\n subject: subjectFromEventRow(report).lex() as ReportOutput['subject'],\n }\n }\n // Partial view for subjects\n\n async subject(subject: string): Promise<SubjectView> {\n if (subject.startsWith('did:')) {\n const repos = await this.repos([subject])\n const repo = repos.get(subject)\n if (repo) {\n return {\n ...repo,\n $type: 'tools.ozone.moderation.defs#repoView',\n }\n } else {\n return {\n $type: 'tools.ozone.moderation.defs#repoViewNotFound',\n did: subject,\n }\n }\n } else {\n const records = await this.records([{ uri: subject }])\n const record = records.get(subject)\n if (record) {\n return {\n ...record,\n $type: 'tools.ozone.moderation.defs#recordView',\n }\n } else {\n return {\n $type: 'tools.ozone.moderation.defs#recordViewNotFound',\n uri: subject,\n }\n }\n }\n }\n\n // Partial view for blobs\n\n async blob(blobs: BlobRef[]): Promise<BlobView[]> {\n if (!blobs.length) return []\n const { ref } = this.db.db.dynamic\n const modStatusResults = await moderationSubjectStatusQueryBuilder(\n this.db.db,\n )\n .where(\n sql<string>`${ref(\n 'moderation_subject_status.blobCids',\n )} @> ${JSON.stringify(blobs.map((blob) => blob.ref.toString()))}`,\n )\n .executeTakeFirst()\n\n const statusByCid = (modStatusResults?.blobCids || [])?.reduce(\n (acc, cur) => Object.assign(acc, { [cur]: modStatusResults }),\n {},\n )\n // Intentionally missing details field, since we don't have any on appview.\n // We also don't know when the blob was created, so we use a canned creation time.\n const unknownTime = new Date(0).toISOString()\n return blobs.map((blob) => {\n const cid = blob.ref.toString()\n const subjectStatus = statusByCid[cid]\n ? this.formatSubjectStatus(statusByCid[cid])\n : undefined\n\n return {\n cid,\n mimeType: blob.mimeType,\n size: blob.size,\n createdAt: unknownTime,\n moderation: {\n subjectStatus,\n },\n }\n })\n }\n\n async labels(\n subjects: string[],\n includeNeg?: boolean,\n ): Promise<Map<string, Label[]>> {\n const now = new Date().toISOString()\n const labels = new Map<string, Label[]>()\n const res = await this.db.db\n .selectFrom('label')\n .where('label.uri', 'in', subjects)\n .where((qb) =>\n qb.where('label.exp', 'is', null).orWhere('label.exp', '>', now),\n )\n .if(!includeNeg, (qb) => qb.where('neg', '=', false))\n .selectAll()\n .execute()\n\n await Promise.all(\n res.map(async (labelRow) => {\n const signedLabel = await this.formatLabelAndEnsureSig(labelRow)\n\n const current = labels.get(labelRow.uri)\n if (current) current.push(signedLabel)\n else labels.set(labelRow.uri, [signedLabel])\n }),\n )\n return labels\n }\n\n async formatLabelAndEnsureSig(row: LabelRow) {\n const formatted = formatLabel(row)\n if (!!row.sig && row.signingKeyId === this.signingKeyId) {\n return formatted\n }\n const signed = await signLabel(formatted, this.signingKey)\n try {\n await this.db.db\n .updateTable('label')\n .set({ sig: Buffer.from(signed.sig), signingKeyId: this.signingKeyId })\n .where('id', '=', row.id)\n .execute()\n } catch (err) {\n dbLogger.error({ err, label: row }, 'failed to update resigned label')\n }\n return signed\n }\n\n async getSubjectStatus(\n subjects: string[],\n ): Promise<Map<string, ModerationSubjectStatusRowWithHandle>> {\n if (!subjects.length) return new Map()\n\n const parsedSubjects = subjects.map(parseSubjectId)\n\n const builder = moderationSubjectStatusQueryBuilder(this.db.db)\n //\n .where((qb) => {\n for (const sub of parsedSubjects) {\n qb = qb.orWhere((qb) =>\n qb\n .where('moderation_subject_status.did', '=', sub.did)\n .where(\n 'moderation_subject_status.recordPath',\n '=',\n sub.recordPath ?? '',\n ),\n )\n }\n return qb\n })\n\n const [statusRes, accountsByDid] = await Promise.all([\n builder.execute(),\n this.getAccoutInfosByDid(parsedSubjects.map((s) => s.did)),\n ])\n\n return new Map(\n statusRes.map((row): [string, ModerationSubjectStatusRowWithHandle] => {\n const subjectId = formatSubjectId(row.did, row.recordPath)\n const handle = accountsByDid.get(row.did)?.handle ?? INVALID_HANDLE\n return [subjectId, { ...row, handle }]\n }),\n )\n }\n\n formatSubjectStatus(\n status: ModerationSubjectStatusRowWithHandle,\n ): SubjectStatusView {\n const statusView: SubjectStatusView = {\n id: status.id,\n reviewState: status.reviewState,\n createdAt: status.createdAt,\n updatedAt: status.updatedAt,\n comment: status.comment ?? undefined,\n lastReviewedBy: status.lastReviewedBy ?? undefined,\n lastReviewedAt: status.lastReviewedAt ?? undefined,\n lastReportedAt: status.lastReportedAt ?? undefined,\n lastAppealedAt: status.lastAppealedAt ?? undefined,\n muteUntil: status.muteUntil ?? undefined,\n muteReportingUntil: status.muteReportingUntil ?? undefined,\n suspendUntil: status.suspendUntil ?? undefined,\n takendown: status.takendown ?? undefined,\n appealed: status.appealed ?? undefined,\n subjectRepoHandle: status.handle ?? undefined,\n subjectBlobCids: status.blobCids || [],\n tags: status.tags || [],\n priorityScore: status.priorityScore,\n ageAssuranceState: status.ageAssuranceState ?? undefined,\n ageAssuranceUpdatedBy: status.ageAssuranceUpdatedBy ?? undefined,\n subject: subjectFromStatusRow(\n status,\n ).lex() as SubjectStatusView['subject'],\n\n accountStats: {\n // Explicitly typing to allow for easy manipulation (e.g. to strip from tests snapshots)\n $type: 'tools.ozone.moderation.defs#accountStats',\n\n // account_events_stats\n reportCount: status.reportCount ?? undefined,\n appealCount: status.appealCount ?? undefined,\n suspendCount: status.suspendCount ?? undefined,\n takedownCount: status.takedownCount ?? undefined,\n escalateCount: status.escalateCount ?? undefined,\n },\n\n recordsStats: {\n // Explicitly typing to allow for easy manipulation (e.g. to strip from tests snapshots)\n $type: 'tools.ozone.moderation.defs#recordsStats',\n\n // account_record_events_stats\n totalReports: status.totalReports ?? undefined,\n reportedCount: status.reportedCount ?? undefined,\n escalatedCount: status.escalatedCount ?? undefined,\n appealedCount: status.appealedCount ?? undefined,\n\n // account_record_status_stats\n subjectCount: status.subjectCount ?? undefined,\n pendingCount: status.pendingCount ?? undefined,\n processedCount: status.processedCount ?? undefined,\n takendownCount: status.takendownCount ?? undefined,\n },\n }\n\n if (status.recordPath !== '') {\n statusView.hosting = {\n $type: 'tools.ozone.moderation.defs#recordHosting',\n updatedAt: status.hostingUpdatedAt ?? undefined,\n deletedAt: status.hostingDeletedAt ?? undefined,\n status: status.hostingStatus ?? 'unknown',\n }\n } else {\n statusView.hosting = {\n $type: 'tools.ozone.moderation.defs#accountHosting',\n updatedAt: status.hostingUpdatedAt ?? undefined,\n deletedAt: status.hostingDeletedAt ?? undefined,\n status: status.hostingStatus ?? 'unknown',\n deactivatedAt: status.hostingDeactivatedAt ?? undefined,\n reactivatedAt: status.hostingReactivatedAt ?? undefined,\n }\n }\n\n return statusView\n }\n\n async fetchAuthorFeed(actor: string): Promise<FeedViewPost[]> {\n const auth = await this.appviewAuth(ids.AppBskyFeedGetAuthorFeed)\n if (!auth) return []\n const {\n data: { feed },\n } = await this.appviewAgent.app.bsky.feed.getAuthorFeed({ actor }, auth)\n\n return feed\n }\n\n async getProfiles(dids: string[]) {\n const profiles = new Map<string, AppBskyActorDefs.ProfileViewDetailed>()\n\n const auth = await this.appviewAuth(ids.AppBskyActorGetProfiles)\n if (!auth) return profiles\n\n for (const actors of chunkArray(dids, 25)) {\n const { data } = await this.appviewAgent.getProfiles({ actors }, auth)\n\n data.profiles.forEach((profile) => {\n profiles.set(profile.did, profile)\n })\n }\n\n return profiles\n }\n}\n\ntype RecordSubject = { uri: string; cid?: string }\n\ntype SubjectView = ModEventViewDetail['subject']\n// @TODO tidy\n// type SubjectView = ModEventViewDetail['subject'] & ReportViewDetail['subject']\n\ntype RecordInfo = {\n uri: string\n cid: string\n value: Record<string, unknown>\n indexedAt: string\n}\n\nfunction parseSubjectId(subject: string): { did: string; recordPath?: string } {\n if (subject.startsWith('did:')) {\n return { did: subject }\n }\n const uri = new AtUri(subject)\n return { did: uri.hostname, recordPath: `${uri.collection}/${uri.rkey}` }\n}\n\nfunction formatSubjectId(did: string, recordPath?: string) {\n return recordPath ? `at://${did}/${recordPath}` : did\n}\n\nfunction findBlobRefs(value: unknown, refs: BlobRef[] = []) {\n if (value instanceof BlobRef) {\n refs.push(value)\n } else if (Array.isArray(value)) {\n value.forEach((val) => findBlobRefs(val, refs))\n } else if (value && typeof value === 'object') {\n Object.values(value).forEach((val) => findBlobRefs(val, refs))\n }\n return refs\n}\n\nexport function getSelfLabels(details: {\n uri: string | null\n cid: string | null\n record: Record<string, unknown> | null\n}): Label[] {\n const { uri, cid, record } = details\n if (!uri || !cid || !record) return []\n if (!isValidSelfLabels(record.labels)) return []\n const src = new AtUri(uri).host // record creator\n const cts =\n typeof record.createdAt === 'string'\n ? normalizeDatetimeAlways(record.createdAt)\n : new Date(0).toISOString()\n return record.labels.values.map(({ val }) => {\n return { src, uri, cid, val, cts }\n })\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@atproto/ozone",
3
- "version": "0.1.148",
3
+ "version": "0.1.150",
4
4
  "license": "MIT",
5
5
  "description": "Backend service for moderating the Bluesky network.",
6
6
  "keywords": [
@@ -35,7 +35,7 @@
35
35
  "uint8arrays": "3.0.0",
36
36
  "undici": "^6.14.1",
37
37
  "ws": "^8.12.0",
38
- "@atproto/api": "^0.17.2",
38
+ "@atproto/api": "^0.17.4",
39
39
  "@atproto/common": "^0.4.12",
40
40
  "@atproto/crypto": "^0.4.4",
41
41
  "@atproto/identity": "^0.4.9",
@@ -54,8 +54,8 @@
54
54
  "jest": "^28.1.2",
55
55
  "ts-node": "^10.8.2",
56
56
  "typescript": "^5.6.3",
57
- "@atproto/lex-cli": "^0.9.5",
58
- "@atproto/pds": "^0.4.185"
57
+ "@atproto/lex-cli": "^0.9.6",
58
+ "@atproto/pds": "^0.4.187"
59
59
  },
60
60
  "scripts": {
61
61
  "codegen": "lex gen-server --yes ./src/lexicon ../../lexicons/com/atproto/*/* ../../lexicons/app/bsky/*/* ../../lexicons/chat/bsky/*/* ../../lexicons/tools/ozone/*/*",
@@ -3694,7 +3694,7 @@ export const schemaDict = {
3694
3694
  },
3695
3695
  hiddenReplies: {
3696
3696
  type: 'array',
3697
- maxLength: 50,
3697
+ maxLength: 300,
3698
3698
  items: {
3699
3699
  type: 'string',
3700
3700
  format: 'at-uri',
@@ -16,7 +16,7 @@ const is$typed = _is$typed,
16
16
  validate = _validate
17
17
  const id = 'app.bsky.actor.profile'
18
18
 
19
- export interface Record {
19
+ export interface Main {
20
20
  $type: 'app.bsky.actor.profile'
21
21
  displayName?: string
22
22
  /** Free-form profile description text. */
@@ -35,12 +35,18 @@ export interface Record {
35
35
  [k: string]: unknown
36
36
  }
37
37
 
38
- const hashRecord = 'main'
38
+ const hashMain = 'main'
39
39
 
40
- export function isRecord<V>(v: V) {
41
- return is$typed(v, id, hashRecord)
40
+ export function isMain<V>(v: V) {
41
+ return is$typed(v, id, hashMain)
42
42
  }
43
43
 
44
- export function validateRecord<V>(v: V) {
45
- return validate<Record & V>(v, id, hashRecord, true)
44
+ export function validateMain<V>(v: V) {
45
+ return validate<Main & V>(v, id, hashMain, true)
46
+ }
47
+
48
+ export {
49
+ type Main as Record,
50
+ isMain as isRecord,
51
+ validateMain as validateRecord,
46
52
  }
@@ -15,7 +15,7 @@ const is$typed = _is$typed,
15
15
  validate = _validate
16
16
  const id = 'app.bsky.actor.status'
17
17
 
18
- export interface Record {
18
+ export interface Main {
19
19
  $type: 'app.bsky.actor.status'
20
20
  /** The status for the account. */
21
21
  status: 'app.bsky.actor.status#live' | (string & {})
@@ -26,14 +26,20 @@ export interface Record {
26
26
  [k: string]: unknown
27
27
  }
28
28
 
29
- const hashRecord = 'main'
29
+ const hashMain = 'main'
30
30
 
31
- export function isRecord<V>(v: V) {
32
- return is$typed(v, id, hashRecord)
31
+ export function isMain<V>(v: V) {
32
+ return is$typed(v, id, hashMain)
33
33
  }
34
34
 
35
- export function validateRecord<V>(v: V) {
36
- return validate<Record & V>(v, id, hashRecord, true)
35
+ export function validateMain<V>(v: V) {
36
+ return validate<Main & V>(v, id, hashMain, true)
37
+ }
38
+
39
+ export {
40
+ type Main as Record,
41
+ isMain as isRecord,
42
+ validateMain as validateRecord,
37
43
  }
38
44
 
39
45
  /** Advertises an account as currently offering live content. */
@@ -16,7 +16,7 @@ const is$typed = _is$typed,
16
16
  validate = _validate
17
17
  const id = 'app.bsky.feed.generator'
18
18
 
19
- export interface Record {
19
+ export interface Main {
20
20
  $type: 'app.bsky.feed.generator'
21
21
  did: string
22
22
  displayName: string
@@ -34,12 +34,18 @@ export interface Record {
34
34
  [k: string]: unknown
35
35
  }
36
36
 
37
- const hashRecord = 'main'
37
+ const hashMain = 'main'
38
38
 
39
- export function isRecord<V>(v: V) {
40
- return is$typed(v, id, hashRecord)
39
+ export function isMain<V>(v: V) {
40
+ return is$typed(v, id, hashMain)
41
41
  }
42
42
 
43
- export function validateRecord<V>(v: V) {
44
- return validate<Record & V>(v, id, hashRecord, true)
43
+ export function validateMain<V>(v: V) {
44
+ return validate<Main & V>(v, id, hashMain, true)
45
+ }
46
+
47
+ export {
48
+ type Main as Record,
49
+ isMain as isRecord,
50
+ validateMain as validateRecord,
45
51
  }
@@ -15,7 +15,7 @@ const is$typed = _is$typed,
15
15
  validate = _validate
16
16
  const id = 'app.bsky.feed.like'
17
17
 
18
- export interface Record {
18
+ export interface Main {
19
19
  $type: 'app.bsky.feed.like'
20
20
  subject: ComAtprotoRepoStrongRef.Main
21
21
  createdAt: string
@@ -23,12 +23,18 @@ export interface Record {
23
23
  [k: string]: unknown
24
24
  }
25
25
 
26
- const hashRecord = 'main'
26
+ const hashMain = 'main'
27
27
 
28
- export function isRecord<V>(v: V) {
29
- return is$typed(v, id, hashRecord)
28
+ export function isMain<V>(v: V) {
29
+ return is$typed(v, id, hashMain)
30
30
  }
31
31
 
32
- export function validateRecord<V>(v: V) {
33
- return validate<Record & V>(v, id, hashRecord, true)
32
+ export function validateMain<V>(v: V) {
33
+ return validate<Main & V>(v, id, hashMain, true)
34
+ }
35
+
36
+ export {
37
+ type Main as Record,
38
+ isMain as isRecord,
39
+ validateMain as validateRecord,
34
40
  }