@pkcprotocol/pkc-js 0.0.34 → 0.0.36

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 (114) hide show
  1. package/README.md +18 -0
  2. package/dist/browser/community/remote-community.d.ts +3 -3
  3. package/dist/browser/community/remote-community.js.map +1 -1
  4. package/dist/browser/generated-version.d.ts +1 -1
  5. package/dist/browser/generated-version.js +1 -1
  6. package/dist/browser/helia/helia-for-pkc.js +30 -12
  7. package/dist/browser/helia/helia-for-pkc.js.map +1 -1
  8. package/dist/browser/helia/util.js +142 -42
  9. package/dist/browser/helia/util.js.map +1 -1
  10. package/dist/browser/pkc/pkc.js +3 -3
  11. package/dist/browser/pkc/pkc.js.map +1 -1
  12. package/dist/browser/runtime/browser/community/local-community.d.ts +2 -0
  13. package/dist/browser/runtime/browser/community/local-community.js +6 -0
  14. package/dist/browser/runtime/browser/community/local-community.js.map +1 -1
  15. package/dist/browser/runtime/node/community/db-handler.js +6 -4
  16. package/dist/browser/runtime/node/community/db-handler.js.map +1 -1
  17. package/dist/browser/runtime/node/community/local-community/challenges.d.ts +26 -0
  18. package/dist/browser/runtime/node/community/local-community/challenges.js +519 -0
  19. package/dist/browser/runtime/node/community/local-community/challenges.js.map +1 -0
  20. package/dist/browser/runtime/node/community/local-community/cleanup.d.ts +9 -0
  21. package/dist/browser/runtime/node/community/local-community/cleanup.js +165 -0
  22. package/dist/browser/runtime/node/community/local-community/cleanup.js.map +1 -0
  23. package/dist/browser/runtime/node/community/local-community/comment-updates.d.ts +11 -0
  24. package/dist/browser/runtime/node/community/local-community/comment-updates.js +218 -0
  25. package/dist/browser/runtime/node/community/local-community/comment-updates.js.map +1 -0
  26. package/dist/browser/runtime/node/community/local-community/db-state.d.ts +15 -0
  27. package/dist/browser/runtime/node/community/local-community/db-state.js +323 -0
  28. package/dist/browser/runtime/node/community/local-community/db-state.js.map +1 -0
  29. package/dist/browser/runtime/node/community/local-community/defaults.d.ts +12 -0
  30. package/dist/browser/runtime/node/community/local-community/defaults.js +29 -0
  31. package/dist/browser/runtime/node/community/local-community/defaults.js.map +1 -0
  32. package/dist/browser/runtime/node/community/local-community/editing.d.ts +10 -0
  33. package/dist/browser/runtime/node/community/local-community/editing.js +188 -0
  34. package/dist/browser/runtime/node/community/local-community/editing.js.map +1 -0
  35. package/dist/browser/runtime/node/community/local-community/ipns-publishing.d.ts +12 -0
  36. package/dist/browser/runtime/node/community/local-community/ipns-publishing.js +340 -0
  37. package/dist/browser/runtime/node/community/local-community/ipns-publishing.js.map +1 -0
  38. package/dist/browser/runtime/node/community/local-community/lifecycle.d.ts +11 -0
  39. package/dist/browser/runtime/node/community/local-community/lifecycle.js +428 -0
  40. package/dist/browser/runtime/node/community/local-community/lifecycle.js.map +1 -0
  41. package/dist/browser/runtime/node/community/local-community/publication-store.d.ts +100 -0
  42. package/dist/browser/runtime/node/community/local-community/publication-store.js +395 -0
  43. package/dist/browser/runtime/node/community/local-community/publication-store.js.map +1 -0
  44. package/dist/browser/runtime/node/community/local-community/publication-validation.d.ts +9 -0
  45. package/dist/browser/runtime/node/community/local-community/publication-validation.js +493 -0
  46. package/dist/browser/runtime/node/community/local-community/publication-validation.js.map +1 -0
  47. package/dist/browser/runtime/node/community/local-community/pubsub.d.ts +3 -0
  48. package/dist/browser/runtime/node/community/local-community/pubsub.js +43 -0
  49. package/dist/browser/runtime/node/community/local-community/pubsub.js.map +1 -0
  50. package/dist/browser/runtime/node/community/local-community/registry.d.ts +3 -0
  51. package/dist/browser/runtime/node/community/local-community/registry.js +4 -0
  52. package/dist/browser/runtime/node/community/local-community/registry.js.map +1 -0
  53. package/dist/browser/runtime/node/community/local-community.d.ts +68 -105
  54. package/dist/browser/runtime/node/community/local-community.js +127 -2927
  55. package/dist/browser/runtime/node/community/local-community.js.map +1 -1
  56. package/dist/browser/test/test-util.js +0 -1
  57. package/dist/browser/test/test-util.js.map +1 -1
  58. package/dist/node/community/remote-community.d.ts +3 -3
  59. package/dist/node/community/remote-community.js.map +1 -1
  60. package/dist/node/generated-version.d.ts +1 -1
  61. package/dist/node/generated-version.js +1 -1
  62. package/dist/node/helia/helia-for-pkc.js +30 -12
  63. package/dist/node/helia/helia-for-pkc.js.map +1 -1
  64. package/dist/node/helia/util.js +142 -42
  65. package/dist/node/helia/util.js.map +1 -1
  66. package/dist/node/pkc/pkc.js +3 -3
  67. package/dist/node/pkc/pkc.js.map +1 -1
  68. package/dist/node/runtime/browser/community/local-community.d.ts +2 -0
  69. package/dist/node/runtime/browser/community/local-community.js +6 -0
  70. package/dist/node/runtime/browser/community/local-community.js.map +1 -1
  71. package/dist/node/runtime/node/community/db-handler.js +6 -4
  72. package/dist/node/runtime/node/community/db-handler.js.map +1 -1
  73. package/dist/node/runtime/node/community/local-community/challenges.d.ts +26 -0
  74. package/dist/node/runtime/node/community/local-community/challenges.js +519 -0
  75. package/dist/node/runtime/node/community/local-community/challenges.js.map +1 -0
  76. package/dist/node/runtime/node/community/local-community/cleanup.d.ts +9 -0
  77. package/dist/node/runtime/node/community/local-community/cleanup.js +165 -0
  78. package/dist/node/runtime/node/community/local-community/cleanup.js.map +1 -0
  79. package/dist/node/runtime/node/community/local-community/comment-updates.d.ts +11 -0
  80. package/dist/node/runtime/node/community/local-community/comment-updates.js +218 -0
  81. package/dist/node/runtime/node/community/local-community/comment-updates.js.map +1 -0
  82. package/dist/node/runtime/node/community/local-community/db-state.d.ts +15 -0
  83. package/dist/node/runtime/node/community/local-community/db-state.js +323 -0
  84. package/dist/node/runtime/node/community/local-community/db-state.js.map +1 -0
  85. package/dist/node/runtime/node/community/local-community/defaults.d.ts +12 -0
  86. package/dist/node/runtime/node/community/local-community/defaults.js +29 -0
  87. package/dist/node/runtime/node/community/local-community/defaults.js.map +1 -0
  88. package/dist/node/runtime/node/community/local-community/editing.d.ts +10 -0
  89. package/dist/node/runtime/node/community/local-community/editing.js +188 -0
  90. package/dist/node/runtime/node/community/local-community/editing.js.map +1 -0
  91. package/dist/node/runtime/node/community/local-community/ipns-publishing.d.ts +12 -0
  92. package/dist/node/runtime/node/community/local-community/ipns-publishing.js +340 -0
  93. package/dist/node/runtime/node/community/local-community/ipns-publishing.js.map +1 -0
  94. package/dist/node/runtime/node/community/local-community/lifecycle.d.ts +11 -0
  95. package/dist/node/runtime/node/community/local-community/lifecycle.js +428 -0
  96. package/dist/node/runtime/node/community/local-community/lifecycle.js.map +1 -0
  97. package/dist/node/runtime/node/community/local-community/publication-store.d.ts +100 -0
  98. package/dist/node/runtime/node/community/local-community/publication-store.js +395 -0
  99. package/dist/node/runtime/node/community/local-community/publication-store.js.map +1 -0
  100. package/dist/node/runtime/node/community/local-community/publication-validation.d.ts +9 -0
  101. package/dist/node/runtime/node/community/local-community/publication-validation.js +493 -0
  102. package/dist/node/runtime/node/community/local-community/publication-validation.js.map +1 -0
  103. package/dist/node/runtime/node/community/local-community/pubsub.d.ts +3 -0
  104. package/dist/node/runtime/node/community/local-community/pubsub.js +43 -0
  105. package/dist/node/runtime/node/community/local-community/pubsub.js.map +1 -0
  106. package/dist/node/runtime/node/community/local-community/registry.d.ts +3 -0
  107. package/dist/node/runtime/node/community/local-community/registry.js +4 -0
  108. package/dist/node/runtime/node/community/local-community/registry.js.map +1 -0
  109. package/dist/node/runtime/node/community/local-community.d.ts +68 -105
  110. package/dist/node/runtime/node/community/local-community.js +127 -2927
  111. package/dist/node/runtime/node/community/local-community.js.map +1 -1
  112. package/dist/node/test/test-util.js +0 -1
  113. package/dist/node/test/test-util.js.map +1 -1
  114. package/package.json +3 -2
@@ -0,0 +1,340 @@
1
+ import Logger from "../../../../logger.js";
2
+ import * as remeda from "remeda";
3
+ import * as cborg from "cborg";
4
+ import { sha256 } from "js-sha256";
5
+ import { stringify as deterministicStringify } from "safe-stable-stringify";
6
+ import { getIpnsRecordInLocalKuboNode, removeBlocksFromKuboNode, retryKuboIpfsAddAndProvide, timestamp } from "../../../../util.js";
7
+ import env from "../../../../version.js";
8
+ import { PKCError } from "../../../../pkc-error.js";
9
+ import { STORAGE_KEYS } from "../../../../constants.js";
10
+ import { calculateExpectedSignatureSize } from "../../util.js";
11
+ import { iterateOverPageCidsToFindAllCids } from "../../../../pages/util.js";
12
+ import { cleanUpBeforePublishing, signCommunity } from "../../../../signer/signatures.js";
13
+ import { CommunityIpfsSchema } from "../../../../community/schema.js";
14
+ import { MAX_FILE_SIZE_BYTES_FOR_COMMUNITY_IPFS } from "../../../../community/community-client-manager.js";
15
+ import { adjustPostUpdatesBucketsIfNeeded, syncPostUpdatesWithIpfs, updateCommentsThatNeedToBeUpdated } from "./comment-updates.js";
16
+ import { cleanUpIpfsRepoRarely, purgeDisapprovedCommentsOlderThan, unpinStaleCids } from "./cleanup.js";
17
+ import { providePubsubTopicRoutingCidsIfNeeded } from "./pubsub.js";
18
+ export async function calculateNewPostUpdates(community) {
19
+ const postUpdates = {};
20
+ const kuboRpcClient = community._clientsManager.getDefaultKuboRpcClient()._client;
21
+ for (const timeBucket of community._postUpdatesBuckets) {
22
+ try {
23
+ const statRes = await kuboRpcClient.files.stat(`/${community.address}/postUpdates/${timeBucket}`);
24
+ if (statRes.blocks !== 0)
25
+ postUpdates[String(timeBucket)] = String(statRes.cid);
26
+ }
27
+ catch { }
28
+ }
29
+ if (remeda.isEmpty(postUpdates))
30
+ return undefined;
31
+ return postUpdates;
32
+ }
33
+ export function calculateLatestUpdateTrigger(community) {
34
+ const lastPublishTooOld = (community.updatedAt || 0) < timestamp() - 60 * 15; // Publish a community record every 15 minutes at least
35
+ // these two checks below are for rare cases where a purged comments or post is not forcing community for a new update
36
+ const lastPostCidChanged = community.lastPostCid !== community._dbHandler.queryLatestPostCid()?.cid;
37
+ const lastCommentCidChanged = community.lastCommentCid !== community._dbHandler.queryLatestCommentCid()?.cid;
38
+ community._communityUpdateTrigger =
39
+ community._communityUpdateTrigger ||
40
+ lastPublishTooOld ||
41
+ community._pendingEditProps.length > 0 ||
42
+ community._blocksToRm.length > 0 ||
43
+ lastCommentCidChanged ||
44
+ lastPostCidChanged; // we have at least one edit to include in new ipns
45
+ }
46
+ export function requireCommunityUpdateIfModQueueChanged(community) {
47
+ const combinedHashOfAllQueuedComments = community._dbHandler.queryCombinedHashOfPendingComments();
48
+ if (community._combinedHashOfPendingCommentsCids !== combinedHashOfAllQueuedComments)
49
+ community._communityUpdateTrigger = true;
50
+ }
51
+ export async function resolveIpnsAndLogIfPotentialProblematicSequence(community) {
52
+ const log = Logger("pkc-js:local-community:_resolveIpnsAndLogIfPotentialProblematicSequence");
53
+ if (!community.signer.ipnsKeyName)
54
+ throw Error("IPNS key name is not defined");
55
+ if (!community.updateCid)
56
+ return;
57
+ try {
58
+ const ipnsCid = await community._clientsManager.resolveIpnsToCidP2P(community.signer.ipnsKeyName, { timeoutMs: 120000 });
59
+ log.trace("Resolved community", community.address, "IPNS key", community.signer.ipnsKeyName, "to", ipnsCid);
60
+ if (ipnsCid && community.updateCid && ipnsCid !== community.updateCid) {
61
+ log.error("community", community.address, "IPNS key", community.signer.ipnsKeyName, "points to", ipnsCid, "but we expected it to point to", community.updateCid, "This could result an IPNS record with invalid sequence number");
62
+ }
63
+ }
64
+ catch (e) {
65
+ log.trace("Failed to resolve community before publishing", community.address, "IPNS key", community.signer.ipnsKeyName, e);
66
+ }
67
+ }
68
+ export async function addOldPageCidsToCidsToUnpin(community, curPages, newPages, addToBlockRm) {
69
+ if (!curPages && !newPages)
70
+ return;
71
+ else if (curPages && !newPages) {
72
+ // we had to reset our community pages, maybe because we purged all comments or changed community address
73
+ const allPageCidsUnderCurPages = await iterateOverPageCidsToFindAllCids({
74
+ pages: curPages,
75
+ clientManager: community._clientsManager
76
+ });
77
+ allPageCidsUnderCurPages.forEach((cid) => {
78
+ community._cidsToUnPin.add(cid);
79
+ if (addToBlockRm)
80
+ community._blocksToRm.push(cid);
81
+ });
82
+ }
83
+ else if (curPages && newPages) {
84
+ // need to find cids for both, and compare them and only keep ones in newPages
85
+ const allPageCidsUnderCurPages = await iterateOverPageCidsToFindAllCids({
86
+ pages: curPages,
87
+ clientManager: community._clientsManager
88
+ });
89
+ const allPageCidsUnderNewPages = await iterateOverPageCidsToFindAllCids({
90
+ pages: newPages,
91
+ clientManager: community._clientsManager
92
+ });
93
+ const cidsToUnpin = remeda.difference(allPageCidsUnderCurPages, allPageCidsUnderNewPages);
94
+ cidsToUnpin.forEach((cid) => {
95
+ community._cidsToUnPin.add(cid);
96
+ if (addToBlockRm)
97
+ community._blocksToRm.push(cid);
98
+ });
99
+ }
100
+ }
101
+ export function shouldResolveDomainForVerification(community) {
102
+ return community.address.includes(".") && Math.random() < 0.005; // Resolving domain should be a rare process because default rpcs throttle if we resolve too much
103
+ }
104
+ // Phase 1: gather DB stats, sync post updates to MFS, compute the new (unsigned) community record + posts/modQueue.
105
+ async function calculateNextCommunityRecord(community, commentUpdateRowsToPublishToIpfs, log) {
106
+ community._dbHandler.createTransaction();
107
+ const latestPost = community._dbHandler.queryLatestPostCid();
108
+ const latestComment = community._dbHandler.queryLatestCommentCid();
109
+ community._dbHandler.commitTransaction();
110
+ const stats = community._dbHandler.queryCommunityStats();
111
+ if (commentUpdateRowsToPublishToIpfs.length > 0) {
112
+ try {
113
+ await syncPostUpdatesWithIpfs(community, commentUpdateRowsToPublishToIpfs);
114
+ }
115
+ catch (e) {
116
+ const err = e;
117
+ const isMfsTimeout = err.message.includes("Timed out writing to MFS path") || err.message.includes("Timed out removing MFS paths");
118
+ if (isMfsTimeout) {
119
+ // Workaround for ipfs/kubo#10842: deeply nested MFS paths hang, but rm of the community root is fast.
120
+ log.error(`MFS sync stuck for community ${community.address} - auto-nuking /${community.address} and forcing a full republish. See https://github.com/ipfs/kubo/issues/10842 for upstream context.`);
121
+ const kuboRpc = community._clientsManager.getDefaultKuboRpcClient();
122
+ try {
123
+ await kuboRpc._client.files.rm("/" + community.address, {
124
+ recursive: true,
125
+ //@ts-expect-error force is not in FilesRmOptions
126
+ force: true
127
+ });
128
+ }
129
+ catch (rmErr) {
130
+ log.error(`Auto-nuke files.rm of /${community.address} failed:`, rmErr);
131
+ }
132
+ community._dbHandler.forceUpdateOnAllComments();
133
+ }
134
+ throw e;
135
+ }
136
+ }
137
+ const newPostUpdates = await community._calculateNewPostUpdates();
138
+ const newModQueue = await community._pageGenerator.generateModQueuePages();
139
+ const kuboRpcClient = community._clientsManager.getDefaultKuboRpcClient();
140
+ const statsCid = (await retryKuboIpfsAddAndProvide({
141
+ ipfsClient: kuboRpcClient._client,
142
+ log,
143
+ content: deterministicStringify(stats),
144
+ addOptions: { pin: true },
145
+ provideOptions: { recursive: true },
146
+ provideInBackground: true
147
+ })).path;
148
+ if (community.statsCid && statsCid !== community.statsCid)
149
+ community._cidsToUnPin.add(community.statsCid);
150
+ const currentTimestamp = timestamp();
151
+ const updatedAt = typeof community?.updatedAt === "number" && community.updatedAt >= currentTimestamp ? community.updatedAt + 1 : currentTimestamp;
152
+ const editIdsToIncludeInNextUpdate = community._pendingEditProps.map((editProps) => editProps.editId);
153
+ const pendingCommunityIpfsEditProps = Object.assign({}, //@ts-expect-error
154
+ ...community._pendingEditProps.map((editProps) => remeda.pick(editProps, remeda.keys.strict(CommunityIpfsSchema.shape))));
155
+ if (community._pendingEditProps.length > 0)
156
+ log("Including edit props in next IPNS update", community._pendingEditProps);
157
+ const newIpns = {
158
+ ...cleanUpBeforePublishing({
159
+ ...remeda.omit(community._toJSONIpfsBaseNoPosts(), ["signature"]),
160
+ ...pendingCommunityIpfsEditProps,
161
+ lastPostCid: latestPost?.cid,
162
+ lastCommentCid: latestComment?.cid,
163
+ statsCid,
164
+ updatedAt,
165
+ postUpdates: newPostUpdates,
166
+ protocolVersion: env.PROTOCOL_VERSION
167
+ })
168
+ };
169
+ const preloadedPostsPages = "hot";
170
+ // Calculate size taken by community without posts and signature
171
+ const communityWithoutPostsSignatureSize = Buffer.byteLength(JSON.stringify(newIpns), "utf8");
172
+ // Calculate expected signature size
173
+ const expectedSignatureSize = calculateExpectedSignatureSize(newIpns);
174
+ // Calculate remaining space for posts
175
+ const availablePostsSize = MAX_FILE_SIZE_BYTES_FOR_COMMUNITY_IPFS - communityWithoutPostsSignatureSize - expectedSignatureSize - 1000;
176
+ const generatedPosts = await community._pageGenerator.generateCommunityPosts(preloadedPostsPages, availablePostsSize);
177
+ // posts should not be cleaned up because we want to make sure not to modify authors' posts
178
+ // Extract allPageCids from generation result for DB CID-ref storage and unpinning
179
+ const newPostsAllPageCids = generatedPosts && !("singlePreloadedPage" in generatedPosts) ? generatedPosts.allPageCids : undefined;
180
+ if (generatedPosts) {
181
+ if ("singlePreloadedPage" in generatedPosts)
182
+ newIpns.posts = { pages: generatedPosts.singlePreloadedPage };
183
+ else if (generatedPosts.pageCids) {
184
+ // multiple pages
185
+ newIpns.posts = {
186
+ pageCids: generatedPosts.pageCids,
187
+ pages: remeda.pick(generatedPosts.pages, [preloadedPostsPages])
188
+ };
189
+ }
190
+ }
191
+ else {
192
+ await community._updateDbInternalState({ posts: undefined }); // make sure db resets posts as well
193
+ }
194
+ // Unpin old posts page CIDs using direct allPageCids comparison (no IPFS fetches needed)
195
+ {
196
+ const oldCids = new Set(community._postsAllPageCids ? Object.values(community._postsAllPageCids).flat() : []);
197
+ const newCids = new Set(newPostsAllPageCids ? Object.values(newPostsAllPageCids).flat() : []);
198
+ for (const cid of oldCids) {
199
+ if (!newCids.has(cid))
200
+ community._cidsToUnPin.add(cid);
201
+ }
202
+ }
203
+ community._postsAllPageCids = newPostsAllPageCids;
204
+ if (newModQueue) {
205
+ newIpns.modQueue = { pageCids: newModQueue.pageCids };
206
+ }
207
+ else {
208
+ await community._updateDbInternalState({ modQueue: undefined });
209
+ community.modQueue.resetPages();
210
+ }
211
+ return { log, latestPost, latestComment, newIpns, newPostsAllPageCids, newModQueue, editIdsToIncludeInNextUpdate };
212
+ }
213
+ // Phase 2: sign and run schema/signature validation, returning the final record.
214
+ async function validateAndSignCommunityRecord(community, build) {
215
+ const signature = await signCommunity({ community: build.newIpns, signer: community.signer });
216
+ const newCommunityRecord = { ...build.newIpns, signature };
217
+ await community._validateCommunitySizeSchemaAndSignatureBeforePublishing(newCommunityRecord);
218
+ return newCommunityRecord;
219
+ }
220
+ // Phase 3: upload to IPFS, publish IPNS, perform post-publish cleanup, and update in-memory + DB state.
221
+ async function publishCommunityRecordToIpns(community, build, newCommunityRecord) {
222
+ const { log, newIpns, newModQueue, editIdsToIncludeInNextUpdate } = build;
223
+ const kuboRpcClient = community._clientsManager.getDefaultKuboRpcClient();
224
+ const contentToPublish = deterministicStringify(newCommunityRecord);
225
+ const file = await retryKuboIpfsAddAndProvide({
226
+ ipfsClient: kuboRpcClient._client,
227
+ log,
228
+ content: contentToPublish, // you need to do deterministic here or otherwise cids in commentUpdate.replies won't match up correctly
229
+ addOptions: { pin: true },
230
+ provideOptions: { recursive: true },
231
+ provideInBackground: false
232
+ });
233
+ if (file.size > MAX_FILE_SIZE_BYTES_FOR_COMMUNITY_IPFS) {
234
+ throw new PKCError("ERR_LOCAL_COMMUNITY_RECORD_TOO_LARGE", {
235
+ calculatedSizeOfNewCommunityRecord: file.size,
236
+ maxSize: MAX_FILE_SIZE_BYTES_FOR_COMMUNITY_IPFS,
237
+ newCommunityRecord,
238
+ address: community.address
239
+ });
240
+ }
241
+ if (!community.signer.ipnsKeyName)
242
+ throw Error("IPNS key name is not defined");
243
+ // after kubo 0.40 implements fetching IPNS record from local blockstore, we don't need line below anymore
244
+ if (community._firstUpdateAfterStart)
245
+ await community._resolveIpnsAndLogIfPotentialProblematicSequence();
246
+ const ttl = `${community._pkc.publishInterval * 3}ms`; // default publish interval is 20s, so default ttl is 60s
247
+ const lastPublishedIpnsRecordData = await community._dbHandler.keyvGet(STORAGE_KEYS[STORAGE_KEYS.LAST_IPNS_RECORD]);
248
+ const decodedIpnsRecord = lastPublishedIpnsRecordData
249
+ ? cborg.decode(new Uint8Array(Object.values(lastPublishedIpnsRecordData)))
250
+ : undefined;
251
+ const ipnsSequence = decodedIpnsRecord ? BigInt(decodedIpnsRecord.sequence) + 1n : undefined;
252
+ const publishRes = await kuboRpcClient._client.name.publish(file.path, {
253
+ key: community.signer.ipnsKeyName,
254
+ allowOffline: true,
255
+ resolve: true,
256
+ ttl
257
+ // enable below line after kubo fixes their problems with fetching IPNS records from local blockstore
258
+ // ...(ipnsSequence ? { sequence: ipnsSequence } : undefined)
259
+ });
260
+ log(`Published a new IPNS record for community(${community.address}) on IPNS (${publishRes.name}) that points to file (${publishRes.value}) with updatedAt (${newCommunityRecord.updatedAt}) and TTL (${ttl})`);
261
+ community._clientsManager.updateKuboRpcState("stopped", kuboRpcClient.url);
262
+ addOldPageCidsToCidsToUnpin(community, community.raw.communityIpfs?.modQueue, newIpns.modQueue).catch((err) => log.error("Failed to add old page cids of community.modQueue to _cidsToUnpin", err));
263
+ await unpinStaleCids(community);
264
+ if (community._blocksToRm.length > 0) {
265
+ const removedBlocks = await removeBlocksFromKuboNode({
266
+ ipfsClient: community._clientsManager.getDefaultKuboRpcClient()._client,
267
+ log,
268
+ cids: community._blocksToRm,
269
+ options: { force: true }
270
+ });
271
+ log("Removed blocks", removedBlocks, "from kubo node");
272
+ community._blocksToRm = community._blocksToRm.filter((blockCid) => !removedBlocks.includes(blockCid));
273
+ }
274
+ if (community.updateCid)
275
+ community._cidsToUnPin.add(community.updateCid); // add old cid of community to be unpinned
276
+ community.initCommunityIpfsPropsNoMerge(newCommunityRecord);
277
+ community.updateCid = file.path;
278
+ community._pendingEditProps = community._pendingEditProps.filter((editProps) => !editIdsToIncludeInNextUpdate.includes(editProps.editId));
279
+ // Re-apply remaining pending edits to in-memory state.
280
+ // initCommunityIpfsPropsNoMerge above overwrites all CommunityIpfs properties from the
281
+ // published IPNS record. If edit() was called during the long IPNS publish await,
282
+ // those edits are still in _pendingEditProps but their in-memory values were overwritten.
283
+ if (community._pendingEditProps.length > 0) {
284
+ const remainingEditProps = Object.assign({}, //@ts-expect-error
285
+ ...community._pendingEditProps.map((editProps) => remeda.pick(editProps, remeda.keys.strict(CommunityIpfsSchema.shape))));
286
+ Object.assign(community, remainingEditProps);
287
+ }
288
+ community._communityUpdateTrigger = false;
289
+ community._firstUpdateAfterStart = false;
290
+ try {
291
+ // this call will fail if we have http routers + kubo 0.38 and earlier
292
+ const ipnsRecord = await getIpnsRecordInLocalKuboNode(kuboRpcClient, community.signer.address);
293
+ await community._dbHandler.keyvSet(STORAGE_KEYS[STORAGE_KEYS.LAST_IPNS_RECORD], cborg.encode(ipnsRecord));
294
+ }
295
+ catch (e) {
296
+ log.trace("Failed to update IPNS record in sqlite record, not a critical error and will most likely be fixed by kubo past 0.38", e);
297
+ }
298
+ community._combinedHashOfPendingCommentsCids = newModQueue?.combinedHashOfCids || sha256("");
299
+ log.trace("Updated combined hash of pending comments to", community._combinedHashOfPendingCommentsCids);
300
+ await community._updateDbInternalState(community.toJSONInternalAfterFirstUpdate());
301
+ community._changeStateEmitEventEmitStateChangeEvent({
302
+ newStartedState: "succeeded",
303
+ event: { name: "update", args: [community] }
304
+ });
305
+ }
306
+ export async function updateCommunityIpnsIfNeeded(community, commentUpdateRowsToPublishToIpfs) {
307
+ const log = Logger("pkc-js:local-community:start:updateCommunityIpnsIfNeeded");
308
+ community._calculateLatestUpdateTrigger();
309
+ if (!community._communityUpdateTrigger)
310
+ return; // No reason to update
311
+ const build = await calculateNextCommunityRecord(community, commentUpdateRowsToPublishToIpfs, log);
312
+ const newCommunityRecord = await validateAndSignCommunityRecord(community, build);
313
+ await publishCommunityRecordToIpns(community, build, newCommunityRecord);
314
+ }
315
+ export async function syncIpnsWithDb(community) {
316
+ const log = Logger("pkc-js:local-community:sync");
317
+ const kuboRpc = community._clientsManager.getDefaultKuboRpcClient();
318
+ try {
319
+ await community._listenToIncomingRequests();
320
+ await providePubsubTopicRoutingCidsIfNeeded(community);
321
+ await adjustPostUpdatesBucketsIfNeeded(community);
322
+ community._setStartedStateWithEmission("publishing-ipns");
323
+ community._clientsManager.updateKuboRpcState("publishing-ipns", kuboRpc.url);
324
+ await purgeDisapprovedCommentsOlderThan(community);
325
+ const commentUpdateRows = await updateCommentsThatNeedToBeUpdated(community);
326
+ requireCommunityUpdateIfModQueueChanged(community);
327
+ await updateCommunityIpnsIfNeeded(community, commentUpdateRows);
328
+ await cleanUpIpfsRepoRarely(community);
329
+ }
330
+ catch (e) {
331
+ //@ts-expect-error
332
+ e.details = { ...e.details, communityAddress: community.address };
333
+ const errorTyped = e;
334
+ community._setStartedStateWithEmission("failed");
335
+ community._clientsManager.updateKuboRpcState("stopped", kuboRpc.url);
336
+ log.error(`Failed to sync community`, community.address, `due to error,`, errorTyped, "Error.message", errorTyped.message, "Error keys", Object.keys(errorTyped));
337
+ throw e;
338
+ }
339
+ }
340
+ //# sourceMappingURL=ipns-publishing.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ipns-publishing.js","sourceRoot":"","sources":["../../../../../../src/runtime/browser/community/local-community/ipns-publishing.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import { LocalCommunity } from "../local-community.js";
2
+ export declare function publishLoop(community: LocalCommunity, syncIntervalMs: number): Promise<void>;
3
+ export declare function initBeforeStarting(community: LocalCommunity): Promise<void>;
4
+ export declare function start(community: LocalCommunity): Promise<void>;
5
+ export declare function initMirroringStartedOrUpdatingCommunity(community: LocalCommunity, startedCommunity: LocalCommunity): Promise<void>;
6
+ export declare function cleanUpMirroredStartedOrUpdatingCommunity(community: LocalCommunity): Promise<void>;
7
+ export declare function updateOnce(community: LocalCommunity): Promise<void>;
8
+ export declare function updateLoop(community: LocalCommunity): Promise<void>;
9
+ export declare function update(community: LocalCommunity): Promise<void>;
10
+ export declare function stop(community: LocalCommunity): Promise<void>;
11
+ export declare function deleteCommunity(community: LocalCommunity): Promise<void>;