@atproto/pds 0.4.117 → 0.4.118

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 (137) hide show
  1. package/CHANGELOG.md +16 -0
  2. package/dist/account-manager/account-manager.d.ts +5 -2
  3. package/dist/account-manager/account-manager.d.ts.map +1 -1
  4. package/dist/account-manager/account-manager.js.map +1 -1
  5. package/dist/actor-store/blob/transactor.d.ts +2 -1
  6. package/dist/actor-store/blob/transactor.d.ts.map +1 -1
  7. package/dist/actor-store/blob/transactor.js +19 -5
  8. package/dist/actor-store/blob/transactor.js.map +1 -1
  9. package/dist/api/com/atproto/repo/uploadBlob.d.ts.map +1 -1
  10. package/dist/api/com/atproto/repo/uploadBlob.js +1 -0
  11. package/dist/api/com/atproto/repo/uploadBlob.js.map +1 -1
  12. package/dist/config/env.d.ts +1 -0
  13. package/dist/config/env.d.ts.map +1 -1
  14. package/dist/config/env.js +1 -0
  15. package/dist/config/env.js.map +1 -1
  16. package/dist/config/secrets.d.ts +1 -0
  17. package/dist/config/secrets.d.ts.map +1 -1
  18. package/dist/config/secrets.js +1 -0
  19. package/dist/config/secrets.js.map +1 -1
  20. package/dist/context.d.ts +3 -0
  21. package/dist/context.d.ts.map +1 -1
  22. package/dist/context.js +19 -0
  23. package/dist/context.js.map +1 -1
  24. package/dist/lexicon/index.d.ts +10 -0
  25. package/dist/lexicon/index.d.ts.map +1 -1
  26. package/dist/lexicon/index.js +20 -0
  27. package/dist/lexicon/index.js.map +1 -1
  28. package/dist/lexicon/lexicons.d.ts +516 -0
  29. package/dist/lexicon/lexicons.d.ts.map +1 -1
  30. package/dist/lexicon/lexicons.js +277 -0
  31. package/dist/lexicon/lexicons.js.map +1 -1
  32. package/dist/lexicon/types/app/bsky/unspecced/defs.d.ts +27 -0
  33. package/dist/lexicon/types/app/bsky/unspecced/defs.d.ts.map +1 -1
  34. package/dist/lexicon/types/app/bsky/unspecced/defs.js +18 -0
  35. package/dist/lexicon/types/app/bsky/unspecced/defs.js.map +1 -1
  36. package/dist/lexicon/types/app/bsky/unspecced/getSuggestedStarterPacks.d.ts +36 -0
  37. package/dist/lexicon/types/app/bsky/unspecced/getSuggestedStarterPacks.d.ts.map +1 -0
  38. package/dist/lexicon/types/app/bsky/unspecced/getSuggestedStarterPacks.js +7 -0
  39. package/dist/lexicon/types/app/bsky/unspecced/getSuggestedStarterPacks.js.map +1 -0
  40. package/dist/lexicon/types/app/bsky/unspecced/getSuggestedStarterPacksSkeleton.d.ts +37 -0
  41. package/dist/lexicon/types/app/bsky/unspecced/getSuggestedStarterPacksSkeleton.d.ts.map +1 -0
  42. package/dist/lexicon/types/app/bsky/unspecced/getSuggestedStarterPacksSkeleton.js +7 -0
  43. package/dist/lexicon/types/app/bsky/unspecced/getSuggestedStarterPacksSkeleton.js.map +1 -0
  44. package/dist/lexicon/types/app/bsky/unspecced/getTrends.d.ts +36 -0
  45. package/dist/lexicon/types/app/bsky/unspecced/getTrends.d.ts.map +1 -0
  46. package/dist/lexicon/types/app/bsky/unspecced/getTrends.js +7 -0
  47. package/dist/lexicon/types/app/bsky/unspecced/getTrends.js.map +1 -0
  48. package/dist/lexicon/types/app/bsky/unspecced/getTrendsSkeleton.d.ts +38 -0
  49. package/dist/lexicon/types/app/bsky/unspecced/getTrendsSkeleton.d.ts.map +1 -0
  50. package/dist/lexicon/types/app/bsky/unspecced/getTrendsSkeleton.js +7 -0
  51. package/dist/lexicon/types/app/bsky/unspecced/getTrendsSkeleton.js.map +1 -0
  52. package/dist/lexicon/types/com/atproto/admin/updateAccountSigningKey.d.ts +31 -0
  53. package/dist/lexicon/types/com/atproto/admin/updateAccountSigningKey.d.ts.map +1 -0
  54. package/dist/lexicon/types/com/atproto/admin/updateAccountSigningKey.js +7 -0
  55. package/dist/lexicon/types/com/atproto/admin/updateAccountSigningKey.js.map +1 -0
  56. package/dist/repo/prepare.d.ts.map +1 -1
  57. package/dist/repo/prepare.js +1 -0
  58. package/dist/repo/prepare.js.map +1 -1
  59. package/dist/repo/types.d.ts +1 -0
  60. package/dist/repo/types.d.ts.map +1 -1
  61. package/dist/repo/types.js.map +1 -1
  62. package/dist/scripts/index.d.ts +8 -1
  63. package/dist/scripts/index.d.ts.map +1 -1
  64. package/dist/scripts/index.js +11 -0
  65. package/dist/scripts/index.js.map +1 -1
  66. package/dist/scripts/publish-identity.d.ts +8 -0
  67. package/dist/scripts/publish-identity.d.ts.map +1 -0
  68. package/dist/scripts/publish-identity.js +46 -0
  69. package/dist/scripts/publish-identity.js.map +1 -0
  70. package/dist/scripts/rebuild-repo.d.ts +10 -2
  71. package/dist/scripts/rebuild-repo.d.ts.map +1 -1
  72. package/dist/scripts/rebuild-repo.js +21 -12
  73. package/dist/scripts/rebuild-repo.js.map +1 -1
  74. package/dist/scripts/rotate-keys.d.ts +18 -0
  75. package/dist/scripts/rotate-keys.d.ts.map +1 -0
  76. package/dist/scripts/rotate-keys.js +115 -0
  77. package/dist/scripts/rotate-keys.js.map +1 -0
  78. package/dist/scripts/sequencer-recovery/index.d.ts +3 -0
  79. package/dist/scripts/sequencer-recovery/index.d.ts.map +1 -0
  80. package/dist/scripts/sequencer-recovery/index.js +17 -0
  81. package/dist/scripts/sequencer-recovery/index.js.map +1 -0
  82. package/dist/scripts/sequencer-recovery/recoverer.d.ts +27 -0
  83. package/dist/scripts/sequencer-recovery/recoverer.d.ts.map +1 -0
  84. package/dist/scripts/sequencer-recovery/recoverer.js +235 -0
  85. package/dist/scripts/sequencer-recovery/recoverer.js.map +1 -0
  86. package/dist/scripts/sequencer-recovery/recovery-db.d.ts +18 -0
  87. package/dist/scripts/sequencer-recovery/recovery-db.d.ts.map +1 -0
  88. package/dist/scripts/sequencer-recovery/recovery-db.js +45 -0
  89. package/dist/scripts/sequencer-recovery/recovery-db.js.map +1 -0
  90. package/dist/scripts/sequencer-recovery/repair-repos.d.ts +3 -0
  91. package/dist/scripts/sequencer-recovery/repair-repos.d.ts.map +1 -0
  92. package/dist/scripts/sequencer-recovery/repair-repos.js +45 -0
  93. package/dist/scripts/sequencer-recovery/repair-repos.js.map +1 -0
  94. package/dist/scripts/sequencer-recovery/user-queues.d.ts +12 -0
  95. package/dist/scripts/sequencer-recovery/user-queues.d.ts.map +1 -0
  96. package/dist/scripts/sequencer-recovery/user-queues.js +54 -0
  97. package/dist/scripts/sequencer-recovery/user-queues.js.map +1 -0
  98. package/dist/scripts/util.d.ts +2 -0
  99. package/dist/scripts/util.d.ts.map +1 -0
  100. package/dist/scripts/util.js +12 -0
  101. package/dist/scripts/util.js.map +1 -0
  102. package/dist/sequencer/sequencer.d.ts +2 -0
  103. package/dist/sequencer/sequencer.d.ts.map +1 -1
  104. package/dist/sequencer/sequencer.js +52 -42
  105. package/dist/sequencer/sequencer.js.map +1 -1
  106. package/package.json +10 -10
  107. package/src/account-manager/account-manager.ts +6 -2
  108. package/src/actor-store/blob/transactor.ts +25 -7
  109. package/src/api/com/atproto/repo/uploadBlob.ts +1 -0
  110. package/src/config/env.ts +2 -0
  111. package/src/config/secrets.ts +2 -0
  112. package/src/context.ts +23 -0
  113. package/src/lexicon/index.ts +62 -0
  114. package/src/lexicon/lexicons.ts +285 -0
  115. package/src/lexicon/types/app/bsky/unspecced/defs.ts +45 -0
  116. package/src/lexicon/types/app/bsky/unspecced/getSuggestedStarterPacks.ts +54 -0
  117. package/src/lexicon/types/app/bsky/unspecced/getSuggestedStarterPacksSkeleton.ts +55 -0
  118. package/src/lexicon/types/app/bsky/unspecced/getTrends.ts +54 -0
  119. package/src/lexicon/types/app/bsky/unspecced/getTrendsSkeleton.ts +56 -0
  120. package/src/lexicon/types/com/atproto/admin/updateAccountSigningKey.ts +48 -0
  121. package/src/repo/prepare.ts +1 -0
  122. package/src/repo/types.ts +1 -0
  123. package/src/scripts/README.md +40 -0
  124. package/src/scripts/index.ts +15 -0
  125. package/src/scripts/publish-identity.ts +54 -0
  126. package/src/scripts/rebuild-repo.ts +39 -12
  127. package/src/scripts/rotate-keys.ts +141 -0
  128. package/src/scripts/sequencer-recovery/index.ts +23 -0
  129. package/src/scripts/sequencer-recovery/recoverer.ts +289 -0
  130. package/src/scripts/sequencer-recovery/recovery-db.ts +64 -0
  131. package/src/scripts/sequencer-recovery/repair-repos.ts +48 -0
  132. package/src/scripts/sequencer-recovery/user-queues.ts +41 -0
  133. package/src/scripts/util.ts +7 -0
  134. package/src/sequencer/sequencer.ts +43 -40
  135. package/tests/recovery.test.ts +178 -0
  136. package/tsconfig.build.tsbuildinfo +1 -1
  137. package/tsconfig.tests.tsbuildinfo +1 -1
@@ -3,22 +3,29 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
3
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.rebuildRepo = void 0;
6
+ exports.rebuildRepo = exports.rebuildRepoScript = void 0;
7
7
  const promises_1 = __importDefault(require("node:readline/promises"));
8
8
  const common_1 = require("@atproto/common");
9
9
  const repo_1 = require("@atproto/repo");
10
- const rebuildRepo = async (ctx, args) => {
10
+ const rebuildRepoScript = async (ctx, args) => {
11
11
  const did = args[0];
12
12
  if (!did || !did.startsWith('did:')) {
13
13
  throw new Error('Expected DID as argument');
14
14
  }
15
+ return (0, exports.rebuildRepo)(ctx, did, true);
16
+ };
17
+ exports.rebuildRepoScript = rebuildRepoScript;
18
+ const rebuildRepo = async (ctx, did, promptUser) => {
15
19
  const memoryStore = new repo_1.MemoryBlockstore();
16
- const rev = common_1.TID.nextStr();
17
20
  const commit = await ctx.actorStore.transact(did, async (store) => {
18
- const [records, existingCids] = await Promise.all([
21
+ const [rootDetails, records, existingCids] = await Promise.all([
22
+ store.repo.storage.getRootDetailed(),
19
23
  store.record.listAll(),
20
24
  store.record.listExistingBlocks(),
21
25
  ]);
26
+ // increment existing rev by 1 ms
27
+ const revTid = common_1.TID.fromStr(rootDetails.rev);
28
+ const rev = common_1.TID.fromTime(revTid.timestamp() + 1, revTid.clockid()).toString();
22
29
  let mst = await repo_1.MST.create(memoryStore);
23
30
  for (const record of records) {
24
31
  mst = await mst.add(record.path, record.cid);
@@ -43,13 +50,15 @@ const rebuildRepo = async (ctx, args) => {
43
50
  data: await mst.getPointer(),
44
51
  }, store.repo.signingKey);
45
52
  const commitCid = await newBlocks.add(newCommit);
46
- console.log('Record count: ', records.length);
47
- console.log('Existing blocks: ', existingCids.toList().length);
48
- console.log('Deleting blocks:', toDelete.toList().length);
49
- console.log('Adding blocks: ', newBlocks.size);
50
- const shouldContinue = await promptContinue();
51
- if (!shouldContinue) {
52
- throw new Error('Aborted');
53
+ if (promptUser) {
54
+ console.log('Record count: ', records.length);
55
+ console.log('Existing blocks: ', existingCids.toList().length);
56
+ console.log('Deleting blocks:', toDelete.toList().length);
57
+ console.log('Adding blocks: ', newBlocks.size);
58
+ const shouldContinue = await promptContinue();
59
+ if (!shouldContinue) {
60
+ throw new Error('Aborted');
61
+ }
53
62
  }
54
63
  await store.repo.storage.deleteMany(toDelete.toList());
55
64
  await store.repo.storage.putMany(newBlocks, rev);
@@ -67,7 +76,7 @@ const rebuildRepo = async (ctx, args) => {
67
76
  prevData: null,
68
77
  };
69
78
  });
70
- await ctx.accountManager.updateRepoRoot(did, commit.cid, rev);
79
+ await ctx.accountManager.updateRepoRoot(did, commit.cid, commit.rev);
71
80
  const syncData = await ctx.actorStore.read(did, (store) => store.repo.getSyncEventData());
72
81
  await ctx.sequencer.sequenceSyncEvt(did, syncData);
73
82
  };
@@ -1 +1 @@
1
- {"version":3,"file":"rebuild-repo.js","sourceRoot":"","sources":["../../src/scripts/rebuild-repo.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"rebuild-repo.js","sourceRoot":"","sources":["../../src/scripts/rebuild-repo.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ import * as plc from '@did-plc/lib';
2
+ import AtpAgent from '@atproto/api';
3
+ import { Keypair } from '@atproto/crypto';
4
+ import { IdResolver } from '@atproto/identity';
5
+ import { ActorStore } from '../actor-store/actor-store';
6
+ import { Sequencer } from '../sequencer';
7
+ export type RotateKeysContext = {
8
+ sequencer: Sequencer;
9
+ actorStore: ActorStore;
10
+ idResolver: IdResolver;
11
+ plcClient: plc.Client;
12
+ plcRotationKey: Keypair;
13
+ entrywayAdminAgent?: AtpAgent;
14
+ };
15
+ export declare const rotateKeys: (ctx: RotateKeysContext, args: string[]) => Promise<void>;
16
+ export declare const rotateKeysFromFile: (ctx: RotateKeysContext, args: string[]) => Promise<void>;
17
+ export declare const rotateKeysRecovery: (ctx: RotateKeysContext, args: string[]) => Promise<void>;
18
+ //# sourceMappingURL=rotate-keys.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rotate-keys.d.ts","sourceRoot":"","sources":["../../src/scripts/rotate-keys.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,GAAG,MAAM,cAAc,CAAA;AAEnC,OAAO,QAAQ,MAAM,cAAc,CAAA;AACnC,OAAO,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAA;AACzC,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAA;AAC9C,OAAO,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAA;AAEvD,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAA;AAIxC,MAAM,MAAM,iBAAiB,GAAG;IAC9B,SAAS,EAAE,SAAS,CAAA;IACpB,UAAU,EAAE,UAAU,CAAA;IACtB,UAAU,EAAE,UAAU,CAAA;IACtB,SAAS,EAAE,GAAG,CAAC,MAAM,CAAA;IACrB,cAAc,EAAE,OAAO,CAAA;IACvB,kBAAkB,CAAC,EAAE,QAAQ,CAAA;CAC9B,CAAA;AAED,eAAO,MAAM,UAAU,QAAe,iBAAiB,QAAQ,MAAM,EAAE,kBAGtE,CAAA;AAED,eAAO,MAAM,kBAAkB,QACxB,iBAAiB,QAChB,MAAM,EAAE,kBAef,CAAA;AAED,eAAO,MAAM,kBAAkB,QACxB,iBAAiB,QAChB,MAAM,EAAE,kBAqBf,CAAA"}
@@ -0,0 +1,115 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.rotateKeysRecovery = exports.rotateKeysFromFile = exports.rotateKeys = void 0;
7
+ const promises_1 = __importDefault(require("node:fs/promises"));
8
+ const p_queue_1 = __importDefault(require("p-queue"));
9
+ const recovery_db_1 = require("./sequencer-recovery/recovery-db");
10
+ const util_1 = require("./util");
11
+ const rotateKeys = async (ctx, args) => {
12
+ const dids = args;
13
+ await rotateKeysForRepos(ctx, dids, 10);
14
+ };
15
+ exports.rotateKeys = rotateKeys;
16
+ const rotateKeysFromFile = async (ctx, args) => {
17
+ const filepath = args[0];
18
+ if (!filepath) {
19
+ throw new Error('Expected filepath as argument');
20
+ }
21
+ const concurrency = args[1] ? (0, util_1.parseIntArg)(args[1]) : 25;
22
+ const file = await promises_1.default.readFile(filepath);
23
+ const dids = file
24
+ .toString()
25
+ .split('\n')
26
+ .map((did) => did.trim())
27
+ .filter((did) => did.startsWith('did:plc'));
28
+ await rotateKeysForRepos(ctx, dids, concurrency);
29
+ };
30
+ exports.rotateKeysFromFile = rotateKeysFromFile;
31
+ const rotateKeysRecovery = async (ctx, args) => {
32
+ const concurrency = args[1] ? (0, util_1.parseIntArg)(args[0]) : 10;
33
+ const recoveryDb = await (0, recovery_db_1.getRecoveryDbFromSequencerLoc)(ctx.sequencer.dbLocation);
34
+ const rows = await recoveryDb.db
35
+ .selectFrom('new_account')
36
+ .select('did')
37
+ .where('new_account.published', '=', 0)
38
+ .execute();
39
+ const dids = rows.map((r) => r.did);
40
+ await rotateKeysForRepos(ctx, dids, concurrency, async (did) => {
41
+ await recoveryDb.db
42
+ .updateTable('new_account')
43
+ .set({ published: 1 })
44
+ .where('did', '=', did)
45
+ .execute();
46
+ });
47
+ };
48
+ exports.rotateKeysRecovery = rotateKeysRecovery;
49
+ const rotateKeysForRepos = async (ctx, dids, concurrency, onSuccess) => {
50
+ const queue = new p_queue_1.default({ concurrency });
51
+ let completed = 0;
52
+ for (const did of dids) {
53
+ queue.add(async () => {
54
+ try {
55
+ await updatePlcSigningKey(ctx, did);
56
+ }
57
+ catch (err) {
58
+ console.error(`failed to update key for ${did}: ${err}`);
59
+ return;
60
+ }
61
+ let syncData;
62
+ try {
63
+ syncData = await ctx.actorStore.transact(did, async (actorTxn) => {
64
+ await actorTxn.repo.processWrites([]);
65
+ return actorTxn.repo.getSyncEventData();
66
+ });
67
+ }
68
+ catch (err) {
69
+ console.error(`failed to write new commit for ${did}: ${err}`);
70
+ return;
71
+ }
72
+ try {
73
+ await ctx.sequencer.sequenceIdentityEvt(did);
74
+ }
75
+ catch (err) {
76
+ console.error(`failed to sequence new identity evt for ${did}: ${err}`);
77
+ return;
78
+ }
79
+ try {
80
+ await ctx.sequencer.sequenceSyncEvt(did, syncData);
81
+ }
82
+ catch (err) {
83
+ console.error(`failed to sequence for ${did}: ${err}`);
84
+ return;
85
+ }
86
+ if (onSuccess) {
87
+ await onSuccess(did);
88
+ }
89
+ completed++;
90
+ if (completed % 10 === 0) {
91
+ console.log(`${completed}/${dids.length}`);
92
+ }
93
+ });
94
+ }
95
+ await queue.onIdle();
96
+ console.log('DONE');
97
+ };
98
+ const updatePlcSigningKey = async (ctx, did) => {
99
+ const updateTo = await ctx.actorStore.keypair(did);
100
+ const currSigningKey = await ctx.idResolver.did.resolveAtprotoKey(did, true);
101
+ if (updateTo.did() === currSigningKey) {
102
+ // already up to date
103
+ return;
104
+ }
105
+ if (ctx.entrywayAdminAgent) {
106
+ await ctx.entrywayAdminAgent.api.com.atproto.admin.updateAccountSigningKey({
107
+ did,
108
+ signingKey: updateTo.did(),
109
+ });
110
+ }
111
+ else {
112
+ await ctx.plcClient.updateAtprotoKey(did, ctx.plcRotationKey, updateTo.did());
113
+ }
114
+ };
115
+ //# sourceMappingURL=rotate-keys.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rotate-keys.js","sourceRoot":"","sources":["../../src/scripts/rotate-keys.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { RecovererContextNoDb } from './recoverer';
2
+ export declare const sequencerRecovery: (ctx: RecovererContextNoDb, args: string[]) => Promise<void>;
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/scripts/sequencer-recovery/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAa,oBAAoB,EAAE,MAAM,aAAa,CAAA;AAG7D,eAAO,MAAM,iBAAiB,QACvB,oBAAoB,QACnB,MAAM,EAAE,kBAgBf,CAAA"}
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.sequencerRecovery = void 0;
4
+ const util_1 = require("../util");
5
+ const recoverer_1 = require("./recoverer");
6
+ const recovery_db_1 = require("./recovery-db");
7
+ const sequencerRecovery = async (ctx, args) => {
8
+ const cursor = args[0] ? (0, util_1.parseIntArg)(args[0]) : 0;
9
+ const concurrency = args[1] ? (0, util_1.parseIntArg)(args[1]) : 10;
10
+ const recoveryDb = await (0, recovery_db_1.getRecoveryDbFromSequencerLoc)(ctx.sequencer.dbLocation);
11
+ const recover = new recoverer_1.Recoverer({ ...ctx, recoveryDb }, {
12
+ concurrency,
13
+ });
14
+ await recover.run(cursor);
15
+ };
16
+ exports.sequencerRecovery = sequencerRecovery;
17
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/scripts/sequencer-recovery/index.ts"],"names":[],"mappings":";;;AAAA,kCAAqC;AACrC,2CAA6D;AAC7D,+CAA6D;AAEtD,MAAM,iBAAiB,GAAG,KAAK,EACpC,GAAyB,EACzB,IAAc,EACd,EAAE;IACF,MAAM,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAA,kBAAW,EAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;IACjD,MAAM,WAAW,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAA,kBAAW,EAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAA;IAEvD,MAAM,UAAU,GAAG,MAAM,IAAA,2CAA6B,EACpD,GAAG,CAAC,SAAS,CAAC,UAAU,CACzB,CAAA;IAED,MAAM,OAAO,GAAG,IAAI,qBAAS,CAC3B,EAAE,GAAG,GAAG,EAAE,UAAU,EAAE,EACtB;QACE,WAAW;KACZ,CACF,CAAA;IACD,MAAM,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;AAC3B,CAAC,CAAA;AAlBY,QAAA,iBAAiB,qBAkB7B"}
@@ -0,0 +1,27 @@
1
+ import { AccountManager } from '../../account-manager/account-manager';
2
+ import { ActorStore } from '../../actor-store/actor-store';
3
+ import { SeqEvt, Sequencer } from '../../sequencer';
4
+ import { RecoveryDb } from './recovery-db';
5
+ import { UserQueues } from './user-queues';
6
+ export type RecovererContextNoDb = {
7
+ sequencer: Sequencer;
8
+ accountManager: AccountManager;
9
+ actorStore: ActorStore;
10
+ };
11
+ export type RecovererContext = RecovererContextNoDb & {
12
+ recoveryDb: RecoveryDb;
13
+ };
14
+ export declare class Recoverer {
15
+ ctx: RecovererContext;
16
+ queues: UserQueues;
17
+ failed: Set<string>;
18
+ constructor(ctx: RecovererContext, opts: {
19
+ concurrency: number;
20
+ });
21
+ run(startCursor?: number): Promise<void>;
22
+ processAll(): Promise<void>;
23
+ destroy(): Promise<void>;
24
+ processEvent(evt: SeqEvt): void;
25
+ }
26
+ export declare const processSeqEvt: (ctx: RecovererContext, evt: SeqEvt) => Promise<void>;
27
+ //# sourceMappingURL=recoverer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"recoverer.d.ts","sourceRoot":"","sources":["../../../src/scripts/sequencer-recovery/recoverer.ts"],"names":[],"mappings":"AAWA,OAAO,EACL,cAAc,EAEf,MAAM,uCAAuC,CAAA;AAC9C,OAAO,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAA;AAS1D,OAAO,EAAyB,MAAM,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAC1E,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAA;AAC1C,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAA;AAE1C,MAAM,MAAM,oBAAoB,GAAG;IACjC,SAAS,EAAE,SAAS,CAAA;IACpB,cAAc,EAAE,cAAc,CAAA;IAC9B,UAAU,EAAE,UAAU,CAAA;CACvB,CAAA;AAED,MAAM,MAAM,gBAAgB,GAAG,oBAAoB,GAAG;IACpD,UAAU,EAAE,UAAU,CAAA;CACvB,CAAA;AAID,qBAAa,SAAS;IAKX,GAAG,EAAE,gBAAgB;IAJ9B,MAAM,EAAE,UAAU,CAAA;IAClB,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,CAAA;gBAGV,GAAG,EAAE,gBAAgB,EAC5B,IAAI,EAAE;QAAE,WAAW,EAAE,MAAM,CAAA;KAAE;IAMzB,GAAG,CAAC,WAAW,SAAI;IAmCnB,UAAU;IAIV,OAAO;IAIb,YAAY,CAAC,GAAG,EAAE,MAAM;CAezB;AAED,eAAO,MAAM,aAAa,QAAe,gBAAgB,OAAO,MAAM,kBAQrE,CAAA"}
@@ -0,0 +1,235 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.processSeqEvt = exports.Recoverer = void 0;
4
+ const common_1 = require("@atproto/common");
5
+ const crypto_1 = require("@atproto/crypto");
6
+ const repo_1 = require("@atproto/repo");
7
+ const account_manager_1 = require("../../account-manager/account-manager");
8
+ const db_1 = require("../../db");
9
+ const repo_2 = require("../../repo");
10
+ const user_queues_1 = require("./user-queues");
11
+ const PAGE_SIZE = 5000;
12
+ class Recoverer {
13
+ constructor(ctx, opts) {
14
+ Object.defineProperty(this, "ctx", {
15
+ enumerable: true,
16
+ configurable: true,
17
+ writable: true,
18
+ value: ctx
19
+ });
20
+ Object.defineProperty(this, "queues", {
21
+ enumerable: true,
22
+ configurable: true,
23
+ writable: true,
24
+ value: void 0
25
+ });
26
+ Object.defineProperty(this, "failed", {
27
+ enumerable: true,
28
+ configurable: true,
29
+ writable: true,
30
+ value: void 0
31
+ });
32
+ this.queues = new user_queues_1.UserQueues(opts.concurrency);
33
+ this.failed = new Set();
34
+ }
35
+ async run(startCursor = 0) {
36
+ const failed = await this.ctx.recoveryDb.db
37
+ .selectFrom('failed')
38
+ .select('did')
39
+ .execute();
40
+ for (const row of failed) {
41
+ this.failed.add(row.did);
42
+ }
43
+ const totalRes = await this.ctx.sequencer.db.db
44
+ .selectFrom('repo_seq')
45
+ .select(db_1.countAll.as('count'))
46
+ .executeTakeFirstOrThrow();
47
+ const totalEvts = totalRes.count;
48
+ let completed = 0;
49
+ let cursor = startCursor;
50
+ while (cursor !== undefined) {
51
+ const page = await this.ctx.sequencer.requestSeqRange({
52
+ earliestSeq: cursor,
53
+ limit: PAGE_SIZE,
54
+ });
55
+ page.forEach((evt) => this.processEvent(evt));
56
+ cursor = page.at(-1)?.seq;
57
+ await this.queues.onEmpty();
58
+ completed += PAGE_SIZE;
59
+ const percentComplete = (completed / totalEvts) * 100;
60
+ console.log(`${percentComplete.toFixed(2)}% - ${cursor}`);
61
+ }
62
+ await this.queues.processAll();
63
+ }
64
+ async processAll() {
65
+ await this.queues.processAll();
66
+ }
67
+ async destroy() {
68
+ await this.queues.destroy();
69
+ }
70
+ processEvent(evt) {
71
+ const did = didFromEvt(evt);
72
+ if (!did) {
73
+ return;
74
+ }
75
+ this.queues.addToUser(did, async () => {
76
+ if (this.failed.has(did)) {
77
+ return;
78
+ }
79
+ await (0, exports.processSeqEvt)(this.ctx, evt).catch(async (err) => {
80
+ this.failed.add(did);
81
+ await trackFailure(this.ctx.recoveryDb, did, err);
82
+ });
83
+ });
84
+ }
85
+ }
86
+ exports.Recoverer = Recoverer;
87
+ const processSeqEvt = async (ctx, evt) => {
88
+ // only need to process commits & tombstones
89
+ if (evt.type === 'account') {
90
+ await processAccountEvt(ctx, evt.evt);
91
+ }
92
+ if (evt.type === 'commit') {
93
+ await processCommit(ctx, evt.evt).catch();
94
+ }
95
+ };
96
+ exports.processSeqEvt = processSeqEvt;
97
+ const processCommit = async (ctx, evt) => {
98
+ const did = evt.repo;
99
+ const { writes, blocks } = await parseCommitEvt(evt);
100
+ if (evt.since === null) {
101
+ const actorExists = await ctx.actorStore.exists(did);
102
+ if (!actorExists) {
103
+ await processRepoCreation(ctx, evt, writes, blocks);
104
+ return;
105
+ }
106
+ }
107
+ await ctx.actorStore.transact(did, async (actorTxn) => {
108
+ const root = await actorTxn.repo.storage.getRootDetailed();
109
+ if (root.rev >= evt.rev) {
110
+ return;
111
+ }
112
+ const commit = await actorTxn.repo.formatCommit(writes);
113
+ commit.newBlocks = blocks;
114
+ commit.cid = evt.commit;
115
+ commit.rev = evt.rev;
116
+ await Promise.all([
117
+ actorTxn.repo.storage.applyCommit(commit),
118
+ actorTxn.repo.indexWrites(writes, commit.rev),
119
+ trackBlobs(actorTxn, writes),
120
+ ]);
121
+ });
122
+ };
123
+ const processRepoCreation = async (ctx, evt, writes, blocks) => {
124
+ const did = evt.repo;
125
+ const keypair = await crypto_1.Secp256k1Keypair.create({ exportable: true });
126
+ await ctx.actorStore.create(did, keypair);
127
+ const commit = {
128
+ cid: evt.commit,
129
+ rev: evt.rev,
130
+ since: evt.since,
131
+ prev: null,
132
+ newBlocks: blocks,
133
+ relevantBlocks: new repo_1.BlockMap(),
134
+ removedCids: new repo_1.CidSet(),
135
+ };
136
+ await ctx.actorStore.transact(did, (actorTxn) => Promise.all([
137
+ actorTxn.repo.storage.applyCommit(commit, true),
138
+ actorTxn.repo.indexWrites(writes, commit.rev),
139
+ actorTxn.repo.blob.processWriteBlobs(commit.rev, writes),
140
+ ]));
141
+ await trackNewAccount(ctx.recoveryDb, did);
142
+ };
143
+ const processAccountEvt = async (ctx, evt) => {
144
+ // do not need to process deactivation/takedowns because we backup account DB as well
145
+ if (evt.status !== account_manager_1.AccountStatus.Deleted) {
146
+ return;
147
+ }
148
+ const { directory } = await ctx.actorStore.getLocation(evt.did);
149
+ await (0, common_1.rmIfExists)(directory, true);
150
+ await ctx.accountManager.deleteAccount(evt.did);
151
+ };
152
+ const trackBlobs = async (store, writes) => {
153
+ await store.repo.blob.deleteDereferencedBlobs(writes);
154
+ for (const write of writes) {
155
+ if (write.action === repo_1.WriteOpAction.Create ||
156
+ write.action === repo_1.WriteOpAction.Update) {
157
+ for (const blob of write.blobs) {
158
+ await store.repo.blob.insertBlobMetadata(blob);
159
+ await store.repo.blob.associateBlob(blob, write.uri);
160
+ }
161
+ }
162
+ }
163
+ };
164
+ const trackFailure = async (recoveryDb, did, err) => {
165
+ await recoveryDb.db
166
+ .insertInto('failed')
167
+ .values({
168
+ did,
169
+ error: err?.toString(),
170
+ fixed: 0,
171
+ })
172
+ .onConflict((oc) => oc.doNothing())
173
+ .execute();
174
+ };
175
+ const trackNewAccount = async (recoveryDb, did) => {
176
+ await recoveryDb.db
177
+ .insertInto('new_account')
178
+ .values({
179
+ did,
180
+ published: 0,
181
+ })
182
+ .onConflict((oc) => oc.doNothing())
183
+ .execute();
184
+ };
185
+ const parseCommitEvt = async (evt) => {
186
+ const did = evt.repo;
187
+ const evtCar = await (0, repo_1.readCar)(evt.blocks);
188
+ const writesUnfiltered = await Promise.all(evt.ops.map(async (op) => {
189
+ const { collection, rkey } = (0, repo_1.parseDataKey)(op.path);
190
+ if (op.action === 'delete') {
191
+ return (0, repo_2.prepareDelete)({ did, collection, rkey });
192
+ }
193
+ if (!op.cid)
194
+ return undefined;
195
+ const recordBytes = evtCar.blocks.get(op.cid);
196
+ if (!recordBytes)
197
+ return undefined;
198
+ const record = (0, repo_1.cborToLexRecord)(recordBytes);
199
+ if (op.action === 'create') {
200
+ return (0, repo_2.prepareCreate)({
201
+ did,
202
+ collection,
203
+ rkey,
204
+ record,
205
+ validate: false,
206
+ });
207
+ }
208
+ else {
209
+ return (0, repo_2.prepareUpdate)({
210
+ did,
211
+ collection,
212
+ rkey,
213
+ record,
214
+ validate: false,
215
+ });
216
+ }
217
+ }));
218
+ const writes = writesUnfiltered.filter((w) => w !== undefined);
219
+ return {
220
+ writes,
221
+ blocks: evtCar.blocks,
222
+ };
223
+ };
224
+ const didFromEvt = (evt) => {
225
+ if (evt.type === 'account') {
226
+ return evt.evt.did;
227
+ }
228
+ else if (evt.type === 'commit') {
229
+ return evt.evt.repo;
230
+ }
231
+ else {
232
+ return null;
233
+ }
234
+ };
235
+ //# sourceMappingURL=recoverer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"recoverer.js","sourceRoot":"","sources":["../../../src/scripts/sequencer-recovery/recoverer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ import { Database } from '../../db';
2
+ export interface NewAccount {
3
+ did: string;
4
+ published: 0 | 1;
5
+ }
6
+ export interface Failed {
7
+ did: string;
8
+ error: string | null;
9
+ fixed: 0 | 1;
10
+ }
11
+ export type RecoveryDbSchema = {
12
+ new_account: NewAccount;
13
+ failed: Failed;
14
+ };
15
+ export type RecoveryDb = Database<RecoveryDbSchema>;
16
+ export declare const getRecoveryDbFromSequencerLoc: (sequencerLoc: string) => Promise<RecoveryDb>;
17
+ export declare const getAndMigrateRecoveryDb: (location: string, disableWalAutoCheckpoint?: boolean) => Promise<RecoveryDb>;
18
+ //# sourceMappingURL=recovery-db.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"recovery-db.d.ts","sourceRoot":"","sources":["../../../src/scripts/sequencer-recovery/recovery-db.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,QAAQ,EAAY,MAAM,UAAU,CAAA;AAE7C,MAAM,WAAW,UAAU;IACzB,GAAG,EAAE,MAAM,CAAA;IACX,SAAS,EAAE,CAAC,GAAG,CAAC,CAAA;CACjB;AAED,MAAM,WAAW,MAAM;IACrB,GAAG,EAAE,MAAM,CAAA;IACX,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;IACpB,KAAK,EAAE,CAAC,GAAG,CAAC,CAAA;CACb;AAED,MAAM,MAAM,gBAAgB,GAAG;IAC7B,WAAW,EAAE,UAAU,CAAA;IACvB,MAAM,EAAE,MAAM,CAAA;CACf,CAAA;AAED,MAAM,MAAM,UAAU,GAAG,QAAQ,CAAC,gBAAgB,CAAC,CAAA;AAEnD,eAAO,MAAM,6BAA6B,iBAC1B,MAAM,KACnB,OAAO,CAAC,UAAU,CAGpB,CAAA;AAED,eAAO,MAAM,uBAAuB,aACxB,MAAM,yCAEf,OAAO,CAAC,UAAU,CAQpB,CAAA"}
@@ -0,0 +1,45 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.getAndMigrateRecoveryDb = exports.getRecoveryDbFromSequencerLoc = void 0;
7
+ const node_path_1 = __importDefault(require("node:path"));
8
+ const db_1 = require("../../db");
9
+ const getRecoveryDbFromSequencerLoc = (sequencerLoc) => {
10
+ const recoveryDbLoc = node_path_1.default.join(node_path_1.default.dirname(sequencerLoc), 'recovery.sqlite');
11
+ return (0, exports.getAndMigrateRecoveryDb)(recoveryDbLoc);
12
+ };
13
+ exports.getRecoveryDbFromSequencerLoc = getRecoveryDbFromSequencerLoc;
14
+ const getAndMigrateRecoveryDb = async (location, disableWalAutoCheckpoint = false) => {
15
+ const pragmas = disableWalAutoCheckpoint
16
+ ? { wal_autocheckpoint: '0' }
17
+ : {};
18
+ const db = db_1.Database.sqlite(location, pragmas);
19
+ const migrator = new db_1.Migrator(db.db, migrations);
20
+ await migrator.migrateToLatestOrThrow();
21
+ return db;
22
+ };
23
+ exports.getAndMigrateRecoveryDb = getAndMigrateRecoveryDb;
24
+ const migrations = {
25
+ '001': {
26
+ up: async (db) => {
27
+ await db.schema
28
+ .createTable('new_account')
29
+ .addColumn('did', 'varchar', (col) => col.primaryKey())
30
+ .addColumn('published', 'int2', (col) => col.notNull())
31
+ .execute();
32
+ await db.schema
33
+ .createTable('failed')
34
+ .addColumn('did', 'varchar', (col) => col.primaryKey())
35
+ .addColumn('error', 'varchar')
36
+ .addColumn('fixed', 'int2', (col) => col.notNull())
37
+ .execute();
38
+ },
39
+ down: async (db) => {
40
+ await db.schema.dropTable('new_account').execute();
41
+ await db.schema.dropTable('failed').execute();
42
+ },
43
+ },
44
+ };
45
+ //# sourceMappingURL=recovery-db.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"recovery-db.js","sourceRoot":"","sources":["../../../src/scripts/sequencer-recovery/recovery-db.ts"],"names":[],"mappings":";;;;;;AAAA,0DAA4B;AAE5B,iCAA6C;AAoBtC,MAAM,6BAA6B,GAAG,CAC3C,YAAoB,EACC,EAAE;IACvB,MAAM,aAAa,GAAG,mBAAI,CAAC,IAAI,CAAC,mBAAI,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE,iBAAiB,CAAC,CAAA;IAC9E,OAAO,IAAA,+BAAuB,EAAC,aAAa,CAAC,CAAA;AAC/C,CAAC,CAAA;AALY,QAAA,6BAA6B,iCAKzC;AAEM,MAAM,uBAAuB,GAAG,KAAK,EAC1C,QAAgB,EAChB,wBAAwB,GAAG,KAAK,EACX,EAAE;IACvB,MAAM,OAAO,GAA2B,wBAAwB;QAC9D,CAAC,CAAC,EAAE,kBAAkB,EAAE,GAAG,EAAE;QAC7B,CAAC,CAAC,EAAE,CAAA;IACN,MAAM,EAAE,GAAG,aAAQ,CAAC,MAAM,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAA;IAC7C,MAAM,QAAQ,GAAG,IAAI,aAAQ,CAAC,EAAE,CAAC,EAAE,EAAE,UAAU,CAAC,CAAA;IAChD,MAAM,QAAQ,CAAC,sBAAsB,EAAE,CAAA;IACvC,OAAO,EAAE,CAAA;AACX,CAAC,CAAA;AAXY,QAAA,uBAAuB,2BAWnC;AAED,MAAM,UAAU,GAAG;IACjB,KAAK,EAAE;QACL,EAAE,EAAE,KAAK,EAAE,EAAmB,EAAE,EAAE;YAChC,MAAM,EAAE,CAAC,MAAM;iBACZ,WAAW,CAAC,aAAa,CAAC;iBAC1B,SAAS,CAAC,KAAK,EAAE,SAAS,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,UAAU,EAAE,CAAC;iBACtD,SAAS,CAAC,WAAW,EAAE,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;iBACtD,OAAO,EAAE,CAAA;YAEZ,MAAM,EAAE,CAAC,MAAM;iBACZ,WAAW,CAAC,QAAQ,CAAC;iBACrB,SAAS,CAAC,KAAK,EAAE,SAAS,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,UAAU,EAAE,CAAC;iBACtD,SAAS,CAAC,OAAO,EAAE,SAAS,CAAC;iBAC7B,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;iBAClD,OAAO,EAAE,CAAA;QACd,CAAC;QACD,IAAI,EAAE,KAAK,EAAE,EAAmB,EAAE,EAAE;YAClC,MAAM,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC,OAAO,EAAE,CAAA;YAClD,MAAM,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,OAAO,EAAE,CAAA;QAC/C,CAAC;KACF;CACF,CAAA"}
@@ -0,0 +1,3 @@
1
+ import { RecovererContextNoDb } from './recoverer';
2
+ export declare const repairRepos: (ctx: RecovererContextNoDb) => Promise<void>;
3
+ //# sourceMappingURL=repair-repos.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"repair-repos.d.ts","sourceRoot":"","sources":["../../../src/scripts/sequencer-recovery/repair-repos.ts"],"names":[],"mappings":"AAEA,OAAO,EAEL,oBAAoB,EAErB,MAAM,aAAa,CAAA;AAGpB,eAAO,MAAM,WAAW,QAAe,oBAAoB,kBAiB1D,CAAA"}