@pkcprotocol/pkc-js 0.0.35 → 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 (106) 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/pkc/pkc.js +3 -3
  7. package/dist/browser/pkc/pkc.js.map +1 -1
  8. package/dist/browser/runtime/browser/community/local-community.d.ts +2 -0
  9. package/dist/browser/runtime/browser/community/local-community.js +6 -0
  10. package/dist/browser/runtime/browser/community/local-community.js.map +1 -1
  11. package/dist/browser/runtime/node/community/db-handler.js +6 -4
  12. package/dist/browser/runtime/node/community/db-handler.js.map +1 -1
  13. package/dist/browser/runtime/node/community/local-community/challenges.d.ts +26 -0
  14. package/dist/browser/runtime/node/community/local-community/challenges.js +519 -0
  15. package/dist/browser/runtime/node/community/local-community/challenges.js.map +1 -0
  16. package/dist/browser/runtime/node/community/local-community/cleanup.d.ts +9 -0
  17. package/dist/browser/runtime/node/community/local-community/cleanup.js +165 -0
  18. package/dist/browser/runtime/node/community/local-community/cleanup.js.map +1 -0
  19. package/dist/browser/runtime/node/community/local-community/comment-updates.d.ts +11 -0
  20. package/dist/browser/runtime/node/community/local-community/comment-updates.js +218 -0
  21. package/dist/browser/runtime/node/community/local-community/comment-updates.js.map +1 -0
  22. package/dist/browser/runtime/node/community/local-community/db-state.d.ts +15 -0
  23. package/dist/browser/runtime/node/community/local-community/db-state.js +323 -0
  24. package/dist/browser/runtime/node/community/local-community/db-state.js.map +1 -0
  25. package/dist/browser/runtime/node/community/local-community/defaults.d.ts +12 -0
  26. package/dist/browser/runtime/node/community/local-community/defaults.js +29 -0
  27. package/dist/browser/runtime/node/community/local-community/defaults.js.map +1 -0
  28. package/dist/browser/runtime/node/community/local-community/editing.d.ts +10 -0
  29. package/dist/browser/runtime/node/community/local-community/editing.js +188 -0
  30. package/dist/browser/runtime/node/community/local-community/editing.js.map +1 -0
  31. package/dist/browser/runtime/node/community/local-community/ipns-publishing.d.ts +12 -0
  32. package/dist/browser/runtime/node/community/local-community/ipns-publishing.js +340 -0
  33. package/dist/browser/runtime/node/community/local-community/ipns-publishing.js.map +1 -0
  34. package/dist/browser/runtime/node/community/local-community/lifecycle.d.ts +11 -0
  35. package/dist/browser/runtime/node/community/local-community/lifecycle.js +428 -0
  36. package/dist/browser/runtime/node/community/local-community/lifecycle.js.map +1 -0
  37. package/dist/browser/runtime/node/community/local-community/publication-store.d.ts +100 -0
  38. package/dist/browser/runtime/node/community/local-community/publication-store.js +395 -0
  39. package/dist/browser/runtime/node/community/local-community/publication-store.js.map +1 -0
  40. package/dist/browser/runtime/node/community/local-community/publication-validation.d.ts +9 -0
  41. package/dist/browser/runtime/node/community/local-community/publication-validation.js +493 -0
  42. package/dist/browser/runtime/node/community/local-community/publication-validation.js.map +1 -0
  43. package/dist/browser/runtime/node/community/local-community/pubsub.d.ts +3 -0
  44. package/dist/browser/runtime/node/community/local-community/pubsub.js +43 -0
  45. package/dist/browser/runtime/node/community/local-community/pubsub.js.map +1 -0
  46. package/dist/browser/runtime/node/community/local-community/registry.d.ts +3 -0
  47. package/dist/browser/runtime/node/community/local-community/registry.js +4 -0
  48. package/dist/browser/runtime/node/community/local-community/registry.js.map +1 -0
  49. package/dist/browser/runtime/node/community/local-community.d.ts +68 -105
  50. package/dist/browser/runtime/node/community/local-community.js +127 -2927
  51. package/dist/browser/runtime/node/community/local-community.js.map +1 -1
  52. package/dist/browser/test/test-util.js +0 -1
  53. package/dist/browser/test/test-util.js.map +1 -1
  54. package/dist/node/community/remote-community.d.ts +3 -3
  55. package/dist/node/community/remote-community.js.map +1 -1
  56. package/dist/node/generated-version.d.ts +1 -1
  57. package/dist/node/generated-version.js +1 -1
  58. package/dist/node/pkc/pkc.js +3 -3
  59. package/dist/node/pkc/pkc.js.map +1 -1
  60. package/dist/node/runtime/browser/community/local-community.d.ts +2 -0
  61. package/dist/node/runtime/browser/community/local-community.js +6 -0
  62. package/dist/node/runtime/browser/community/local-community.js.map +1 -1
  63. package/dist/node/runtime/node/community/db-handler.js +6 -4
  64. package/dist/node/runtime/node/community/db-handler.js.map +1 -1
  65. package/dist/node/runtime/node/community/local-community/challenges.d.ts +26 -0
  66. package/dist/node/runtime/node/community/local-community/challenges.js +519 -0
  67. package/dist/node/runtime/node/community/local-community/challenges.js.map +1 -0
  68. package/dist/node/runtime/node/community/local-community/cleanup.d.ts +9 -0
  69. package/dist/node/runtime/node/community/local-community/cleanup.js +165 -0
  70. package/dist/node/runtime/node/community/local-community/cleanup.js.map +1 -0
  71. package/dist/node/runtime/node/community/local-community/comment-updates.d.ts +11 -0
  72. package/dist/node/runtime/node/community/local-community/comment-updates.js +218 -0
  73. package/dist/node/runtime/node/community/local-community/comment-updates.js.map +1 -0
  74. package/dist/node/runtime/node/community/local-community/db-state.d.ts +15 -0
  75. package/dist/node/runtime/node/community/local-community/db-state.js +323 -0
  76. package/dist/node/runtime/node/community/local-community/db-state.js.map +1 -0
  77. package/dist/node/runtime/node/community/local-community/defaults.d.ts +12 -0
  78. package/dist/node/runtime/node/community/local-community/defaults.js +29 -0
  79. package/dist/node/runtime/node/community/local-community/defaults.js.map +1 -0
  80. package/dist/node/runtime/node/community/local-community/editing.d.ts +10 -0
  81. package/dist/node/runtime/node/community/local-community/editing.js +188 -0
  82. package/dist/node/runtime/node/community/local-community/editing.js.map +1 -0
  83. package/dist/node/runtime/node/community/local-community/ipns-publishing.d.ts +12 -0
  84. package/dist/node/runtime/node/community/local-community/ipns-publishing.js +340 -0
  85. package/dist/node/runtime/node/community/local-community/ipns-publishing.js.map +1 -0
  86. package/dist/node/runtime/node/community/local-community/lifecycle.d.ts +11 -0
  87. package/dist/node/runtime/node/community/local-community/lifecycle.js +428 -0
  88. package/dist/node/runtime/node/community/local-community/lifecycle.js.map +1 -0
  89. package/dist/node/runtime/node/community/local-community/publication-store.d.ts +100 -0
  90. package/dist/node/runtime/node/community/local-community/publication-store.js +395 -0
  91. package/dist/node/runtime/node/community/local-community/publication-store.js.map +1 -0
  92. package/dist/node/runtime/node/community/local-community/publication-validation.d.ts +9 -0
  93. package/dist/node/runtime/node/community/local-community/publication-validation.js +493 -0
  94. package/dist/node/runtime/node/community/local-community/publication-validation.js.map +1 -0
  95. package/dist/node/runtime/node/community/local-community/pubsub.d.ts +3 -0
  96. package/dist/node/runtime/node/community/local-community/pubsub.js +43 -0
  97. package/dist/node/runtime/node/community/local-community/pubsub.js.map +1 -0
  98. package/dist/node/runtime/node/community/local-community/registry.d.ts +3 -0
  99. package/dist/node/runtime/node/community/local-community/registry.js +4 -0
  100. package/dist/node/runtime/node/community/local-community/registry.js.map +1 -0
  101. package/dist/node/runtime/node/community/local-community.d.ts +68 -105
  102. package/dist/node/runtime/node/community/local-community.js +127 -2927
  103. package/dist/node/runtime/node/community/local-community.js.map +1 -1
  104. package/dist/node/test/test-util.js +0 -1
  105. package/dist/node/test/test-util.js.map +1 -1
  106. package/package.json +3 -2
@@ -0,0 +1,165 @@
1
+ import pLimit from "p-limit";
2
+ import Logger from "../../../../logger.js";
3
+ import { genToArray, removeMfsFilesSafely } from "../../../../util.js";
4
+ import { calculateLocalMfsPathForCommentUpdate } from "./comment-updates.js";
5
+ export async function repinCommentsIPFSIfNeeded(community) {
6
+ const log = Logger("pkc-js:local-community:start:_repinCommentsIPFSIfNeeded");
7
+ const latestCommentCid = community._dbHandler.queryLatestCommentCid(); // latest comment ordered by id
8
+ if (!latestCommentCid)
9
+ return;
10
+ const kuboRpcOrHelia = community._clientsManager.getDefaultKuboRpcClient();
11
+ try {
12
+ await genToArray(kuboRpcOrHelia._client.pin.ls({ paths: latestCommentCid.cid }));
13
+ return; // the comment is already pinned, we assume the rest of the comments are so too
14
+ }
15
+ catch (e) {
16
+ if (!e.message.includes("is not pinned"))
17
+ throw e;
18
+ }
19
+ log("The latest comment is not pinned in the ipfs node, pkc-js will repin all existing comment ipfs for community", community.address);
20
+ // latestCommentCid should be the last in unpinnedCommentsFromDb array, in case we throw an error on a comment before it, it does not get pinned
21
+ const unpinnedCommentsFromDb = community._dbHandler.queryAllCommentsOrderedByIdAsc(); // we assume all comments are unpinned if latest comment is not pinned
22
+ // In the _repinCommentIpfs method:
23
+ const limit = pLimit(50);
24
+ const pinningPromises = unpinnedCommentsFromDb.map((unpinnedCommentRow) => limit(async () => {
25
+ if (unpinnedCommentRow.pendingApproval)
26
+ return; // we don't pin comments waiting to get approved
27
+ await community._addCommentRowToIPFS(unpinnedCommentRow, Logger("pkc-js:local-community:start:_repinCommentsIPFSIfNeeded:_addCommentRowToIPFS"));
28
+ }));
29
+ await Promise.all(pinningPromises);
30
+ community._dbHandler.forceUpdateOnAllComments(); // force pkc-js to republish all comment updates
31
+ log(`${unpinnedCommentsFromDb.length} comments' IPFS have been repinned`);
32
+ }
33
+ export async function unpinStaleCids(community) {
34
+ const log = Logger("pkc-js:local-community:sync:unpinStaleCids");
35
+ if (community._cidsToUnPin.size > 0) {
36
+ const sizeBefore = community._cidsToUnPin.size;
37
+ // Create a concurrency limiter with a limit of 50
38
+ const limit = pLimit(50);
39
+ const kuboRpc = community._clientsManager.getDefaultKuboRpcClient();
40
+ // Process all unpinning in parallel with concurrency limit
41
+ await Promise.all(Array.from(community._cidsToUnPin.values()).map((cid) => limit(async () => {
42
+ try {
43
+ await kuboRpc._client.pin.rm(cid, { recursive: true });
44
+ community._cidsToUnPin.delete(cid);
45
+ }
46
+ catch (e) {
47
+ const error = e;
48
+ if (error.message.startsWith("not pinned")) {
49
+ community._cidsToUnPin.delete(cid);
50
+ }
51
+ else {
52
+ log.trace("Failed to unpin cid", cid, "on community", community.address, "due to error", error);
53
+ }
54
+ }
55
+ })));
56
+ log.trace(`unpinned ${sizeBefore - community._cidsToUnPin.size} stale cids from ipfs node for community (${community.address})`);
57
+ }
58
+ }
59
+ export async function rmUnneededMfsPaths(community) {
60
+ const log = Logger("pkc-js:local-community:sync:_rmUnneededMfsPaths");
61
+ if (community._mfsPathsToRemove.size > 0) {
62
+ const toDeleteMfsPaths = Array.from(community._mfsPathsToRemove.values());
63
+ const kuboRpc = community._clientsManager.getDefaultKuboRpcClient();
64
+ try {
65
+ await removeMfsFilesSafely({
66
+ kuboRpcClient: kuboRpc,
67
+ paths: toDeleteMfsPaths,
68
+ log
69
+ });
70
+ toDeleteMfsPaths.forEach((path) => community._mfsPathsToRemove.delete(path));
71
+ return toDeleteMfsPaths;
72
+ }
73
+ catch (e) {
74
+ const error = e;
75
+ if (error.message.includes("file does not exist"))
76
+ return toDeleteMfsPaths; // file does not exist, we can return the paths that were not deleted
77
+ else {
78
+ log.error("Failed to remove paths from MFS", toDeleteMfsPaths, e);
79
+ throw error;
80
+ }
81
+ }
82
+ }
83
+ else
84
+ return [];
85
+ }
86
+ export async function repinCommentUpdateIfNeeded(community) {
87
+ const log = Logger("pkc-js:start:_repinCommentUpdateIfNeeded");
88
+ // iterating on all comment updates is not efficient, we should figure out a better way
89
+ // Most of the time we run this function, the comment updates are already written to ipfs rpeo
90
+ const kuboRpc = community._clientsManager.getDefaultKuboRpcClient();
91
+ try {
92
+ await kuboRpc._client.files.stat(`/${community.address}`, { hash: true });
93
+ return; // if the directory of this community exists, we assume all the comment updates are there
94
+ }
95
+ catch (e) {
96
+ if (!e.message.includes("file does not exist"))
97
+ throw e;
98
+ }
99
+ // community has no comment updates, we can return
100
+ if (!community.lastCommentCid)
101
+ return;
102
+ log(`CommentUpdate directory`, community.address, "will republish all comment updates");
103
+ community._dbHandler.forceUpdateOnAllComments(); // pkc-js will recalculate and publish all comment updates
104
+ }
105
+ export async function cleanUpIpfsRepoRarely(community, force = false) {
106
+ const log = Logger("pkc-js:local-community:syncIpnsWithDb:_cleanUpIpfsRepoRarely");
107
+ if (Math.random() < 0.00001 || force) {
108
+ let gcCids = 0;
109
+ const kuboRpc = community._clientsManager.getDefaultKuboRpcClient();
110
+ try {
111
+ for await (const res of kuboRpc._client.repo.gc({ quiet: true })) {
112
+ if (res.cid)
113
+ gcCids++;
114
+ else
115
+ log.error("Failed to GC ipfs repo due to error", res.err);
116
+ }
117
+ }
118
+ catch (e) {
119
+ log.error("Failed to GC ipfs repo due to error", e);
120
+ }
121
+ log("GC cleaned", gcCids, "cids out of the IPFS node");
122
+ }
123
+ }
124
+ export async function addAllCidsUnderPurgedCommentToBeRemoved(community, purgedCommentAndCommentUpdate) {
125
+ community._cidsToUnPin.add(purgedCommentAndCommentUpdate.commentTableRow.cid);
126
+ community._blocksToRm.push(purgedCommentAndCommentUpdate.commentTableRow.cid);
127
+ if (typeof purgedCommentAndCommentUpdate.commentUpdateTableRow?.postUpdatesBucket === "number") {
128
+ const localCommentUpdatePath = calculateLocalMfsPathForCommentUpdate(community, purgedCommentAndCommentUpdate.commentTableRow, purgedCommentAndCommentUpdate.commentUpdateTableRow?.postUpdatesBucket);
129
+ community._mfsPathsToRemove.add(localCommentUpdatePath);
130
+ }
131
+ if (purgedCommentAndCommentUpdate?.commentUpdateTableRow?.replies) {
132
+ // replies is DbRepliesFormat — flat per-sort with allPageCids
133
+ const dbReplies = purgedCommentAndCommentUpdate.commentUpdateTableRow.replies;
134
+ for (const sortEntry of Object.values(dbReplies)) {
135
+ if (sortEntry?.allPageCids) {
136
+ for (const cid of sortEntry.allPageCids) {
137
+ community._cidsToUnPin.add(cid);
138
+ community._blocksToRm.push(cid);
139
+ }
140
+ }
141
+ }
142
+ }
143
+ }
144
+ export async function purgeDisapprovedCommentsOlderThan(community) {
145
+ if (typeof community.settings?.purgeDisapprovedCommentsOlderThan !== "number")
146
+ return;
147
+ const log = Logger("pkc-js:local-community:_purgeDisapprovedCommentsOlderThan");
148
+ const purgedComments = community._dbHandler.purgeDisapprovedCommentsOlderThan(community.settings.purgeDisapprovedCommentsOlderThan);
149
+ if (!purgedComments || purgedComments.length === 0)
150
+ return;
151
+ log("Purged disapproved comments", purgedComments, "because retention time has passed and it's time to purge them from DB and pages");
152
+ // need to clear out any commentUpdate.postUpdatesBucket
153
+ // need to clear out any comment.cid
154
+ // need to clear out any commentUpdate.replies
155
+ for (const purgedComment of purgedComments)
156
+ for (const purgedCommentAndCommentUpdate of purgedComment.purgedTableRows)
157
+ await addAllCidsUnderPurgedCommentToBeRemoved(community, purgedCommentAndCommentUpdate);
158
+ if (community._mfsPathsToRemove.size > 0)
159
+ await rmUnneededMfsPaths(community);
160
+ if (community.updateCid) {
161
+ community._blocksToRm.push(community.updateCid); // we need to remove current updateCid which references purged comments
162
+ community._cidsToUnPin.add(community.updateCid);
163
+ }
164
+ }
165
+ //# sourceMappingURL=cleanup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cleanup.js","sourceRoot":"","sources":["../../../../../../src/runtime/browser/community/local-community/cleanup.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import Logger from "../../../../logger.js";
2
+ import type { CommentsTableRow, CommentUpdateType } from "../../../../publications/comment/types.js";
3
+ import type { LocalCommunity } from "../local-community.js";
4
+ import type { CommentUpdateToWriteToDbAndPublishToIpfs } from "./defaults.js";
5
+ export declare function pubsubTopicWithfallback(community: LocalCommunity): string;
6
+ export declare function calculateLocalMfsPathForCommentUpdate(community: LocalCommunity, postDbComment: Pick<CommentsTableRow, "cid">, timestampRange: number): string;
7
+ export declare function calculateNewCommentUpdate(community: LocalCommunity, comment: CommentsTableRow): Promise<CommentUpdateToWriteToDbAndPublishToIpfs>;
8
+ export declare function validateCommentUpdateSignature(community: LocalCommunity, newCommentUpdate: CommentUpdateType, comment: CommentsTableRow, log: Logger): Promise<void>;
9
+ export declare function updateCommentsThatNeedToBeUpdated(community: LocalCommunity): Promise<CommentUpdateToWriteToDbAndPublishToIpfs[]>;
10
+ export declare function syncPostUpdatesWithIpfs(community: LocalCommunity, commentUpdateRowsToPublishToIpfs: CommentUpdateToWriteToDbAndPublishToIpfs[]): Promise<void>;
11
+ export declare function adjustPostUpdatesBucketsIfNeeded(community: LocalCommunity): Promise<void>;
@@ -0,0 +1,218 @@
1
+ import { stringify as deterministicStringify } from "safe-stable-stringify";
2
+ import * as remeda from "remeda";
3
+ import pLimit from "p-limit";
4
+ import Logger from "../../../../logger.js";
5
+ import { timestamp, writeKuboFilesWithTimeout } from "../../../../util.js";
6
+ import env from "../../../../version.js";
7
+ import { calculateInlineRepliesBudget } from "../../util.js";
8
+ import { cleanUpBeforePublishing, signCommentUpdate, verifyCommentUpdate } from "../../../../signer/signatures.js";
9
+ import { PKCError } from "../../../../pkc-error.js";
10
+ import { getAuthorNameFromWire } from "../../../../publications/publication-author.js";
11
+ import { deriveDbReplies } from "../../util.js";
12
+ import { rmUnneededMfsPaths } from "./cleanup.js";
13
+ export function pubsubTopicWithfallback(community) {
14
+ return community.pubsubTopic || community.address;
15
+ }
16
+ export function calculateLocalMfsPathForCommentUpdate(community, postDbComment, timestampRange) {
17
+ // TODO Can optimize the call below by only asking for timestamp field
18
+ return ["/" + community.address, "postUpdates", timestampRange, postDbComment.cid, "update"].join("/");
19
+ }
20
+ export async function calculateNewCommentUpdate(community, comment) {
21
+ const log = Logger("pkc-js:local-community:_calculateNewCommentUpdate");
22
+ // If we're here that means we're gonna calculate the new update and publish it
23
+ log.trace(`Attempting to calculate new CommentUpdate for comment (${comment.cid}) on community`, community.address);
24
+ // This comment will have the local new CommentUpdate, which we will publish to IPFS fiels
25
+ // It includes new author.community as well as updated values in CommentUpdate (except for replies field)
26
+ const storedCommentUpdate = community._dbHandler.queryCommentUpdateTimestampBucketReplies({ cid: comment.cid });
27
+ const authorDomain = getAuthorNameFromWire(comment.author);
28
+ const calculatedCommentUpdate = community._dbHandler.queryCalculatedCommentUpdate({ comment, authorDomain });
29
+ log.trace("Calculated comment update for comment", comment.cid, "on community", community.address, "with reply count", calculatedCommentUpdate.replyCount);
30
+ const currentTimestamp = timestamp();
31
+ const newUpdatedAt = typeof storedCommentUpdate?.updatedAt === "number" && storedCommentUpdate.updatedAt >= currentTimestamp
32
+ ? storedCommentUpdate.updatedAt + 1
33
+ : currentTimestamp;
34
+ const commentUpdatePriorToSigning = {
35
+ ...cleanUpBeforePublishing({
36
+ ...calculatedCommentUpdate,
37
+ updatedAt: newUpdatedAt,
38
+ protocolVersion: env.PROTOCOL_VERSION
39
+ })
40
+ };
41
+ const preloadedRepliesPages = "best";
42
+ const inlineRepliesBudget = calculateInlineRepliesBudget({
43
+ comment,
44
+ commentUpdateWithoutReplies: commentUpdatePriorToSigning
45
+ });
46
+ const adjustedPreloadedRepliesPageSizeBytes = Math.max(inlineRepliesBudget, 1);
47
+ const generatedRepliesPages = comment.depth === 0
48
+ ? await community._pageGenerator.generatePostPages(comment, preloadedRepliesPages, adjustedPreloadedRepliesPageSizeBytes)
49
+ : await community._pageGenerator.generateReplyPages(comment, preloadedRepliesPages, adjustedPreloadedRepliesPageSizeBytes);
50
+ // we have to make sure not clean up submissions of authors by calling cleanUpBeforePublishing
51
+ if (generatedRepliesPages) {
52
+ if ("singlePreloadedPage" in generatedRepliesPages)
53
+ commentUpdatePriorToSigning.replies = { pages: generatedRepliesPages.singlePreloadedPage };
54
+ else if (generatedRepliesPages.pageCids) {
55
+ commentUpdatePriorToSigning.replies = {
56
+ pageCids: generatedRepliesPages.pageCids,
57
+ pages: remeda.pick(generatedRepliesPages.pages, [preloadedRepliesPages])
58
+ };
59
+ }
60
+ }
61
+ // Extract allPageCids from the generation result (not available for singlePreloadedPage case)
62
+ const allPageCids = generatedRepliesPages && !("singlePreloadedPage" in generatedRepliesPages) ? generatedRepliesPages.allPageCids : undefined;
63
+ // Unpin old page CIDs that are no longer in the new generation
64
+ {
65
+ const oldDbReplies = storedCommentUpdate?.replies;
66
+ const oldCids = new Set(oldDbReplies ? Object.values(oldDbReplies).flatMap((sort) => sort?.allPageCids ?? []) : []);
67
+ const newCids = new Set(allPageCids ? Object.values(allPageCids).flat() : []);
68
+ for (const cid of oldCids) {
69
+ if (!newCids.has(cid))
70
+ community._cidsToUnPin.add(cid);
71
+ }
72
+ }
73
+ const newCommentUpdate = {
74
+ ...commentUpdatePriorToSigning,
75
+ signature: await signCommentUpdate({ update: commentUpdatePriorToSigning, signer: community.signer })
76
+ };
77
+ await validateCommentUpdateSignature(community, newCommentUpdate, comment, log);
78
+ const newPostUpdateBucket = comment.depth === 0 ? community._postUpdatesBuckets.find((bucket) => timestamp() - bucket <= comment.timestamp) : undefined;
79
+ const newLocalMfsPath = typeof newPostUpdateBucket === "number"
80
+ ? calculateLocalMfsPathForCommentUpdate(community, comment, newPostUpdateBucket)
81
+ : undefined;
82
+ if (storedCommentUpdate?.postUpdatesBucket &&
83
+ newLocalMfsPath &&
84
+ newPostUpdateBucket &&
85
+ storedCommentUpdate.postUpdatesBucket !== newPostUpdateBucket) {
86
+ const oldPostUpdates = calculateLocalMfsPathForCommentUpdate(community, comment, storedCommentUpdate.postUpdatesBucket).replace("/update", "");
87
+ community._mfsPathsToRemove.add(oldPostUpdates);
88
+ }
89
+ const newCommentUpdateDbRecord = {
90
+ ...newCommentUpdate,
91
+ // Store CID refs instead of full inline page data — see deriveDbReplies()
92
+ replies: deriveDbReplies({ replies: newCommentUpdate.replies, allPageCids }),
93
+ postUpdatesBucket: newPostUpdateBucket,
94
+ publishedToPostUpdatesMFS: false,
95
+ insertedAt: timestamp()
96
+ };
97
+ return {
98
+ newCommentUpdate,
99
+ newCommentUpdateToWriteToDb: newCommentUpdateDbRecord,
100
+ localMfsPath: newLocalMfsPath,
101
+ pendingApproval: comment.pendingApproval
102
+ };
103
+ }
104
+ export async function validateCommentUpdateSignature(community, newCommentUpdate, comment, log) {
105
+ // This function should be deleted at some point, once the protocol ossifies
106
+ const verificationOpts = {
107
+ update: newCommentUpdate,
108
+ resolveAuthorNames: false,
109
+ clientsManager: community._clientsManager,
110
+ community,
111
+ comment,
112
+ validatePages: community._pkc.validatePages,
113
+ validateUpdateSignature: true
114
+ };
115
+ const validation = await verifyCommentUpdate(verificationOpts);
116
+ if (!validation.valid) {
117
+ log.error(`CommentUpdate (${comment.cid}) signature is invalid due to (${validation.reason}). This is a critical error`);
118
+ throw new PKCError("ERR_COMMENT_UPDATE_SIGNATURE_IS_INVALID", { validation, verificationOpts });
119
+ }
120
+ }
121
+ export async function updateCommentsThatNeedToBeUpdated(community) {
122
+ const log = Logger(`pkc-js:local-community:_updateCommentsThatNeedToBeUpdated`);
123
+ // Get all comments that need to be updated
124
+ const commentsToUpdate = community._dbHandler.queryCommentsToBeUpdated();
125
+ if (commentsToUpdate.length === 0)
126
+ return [];
127
+ community._communityUpdateTrigger = true;
128
+ log(`Will update ${commentsToUpdate.length} comments in this update loop for community (${community.address})`);
129
+ // Group by postCid
130
+ const commentsByPostCid = remeda.groupBy.strict(commentsToUpdate, (x) => x.postCid);
131
+ const allCommentUpdateRows = [];
132
+ // Process different post trees in parallel
133
+ const postLimit = pLimit(10); // Process up to 10 post trees concurrently
134
+ const postProcessingPromises = Object.entries(commentsByPostCid).map(([postCid, commentsForPost]) => postLimit(async () => {
135
+ try {
136
+ // Group by depth
137
+ const commentsByDepth = remeda.groupBy.strict(commentsForPost, (x) => x.depth);
138
+ const depthsKeySorted = remeda.keys.strict(commentsByDepth).sort((a, b) => Number(b) - Number(a)); // Sort depths from highest to lowest
139
+ const postUpdateRows = [];
140
+ // Process each depth level in sequence within this post tree
141
+ for (const depthKey of depthsKeySorted) {
142
+ const commentsAtDepth = commentsByDepth[depthKey];
143
+ // Process all comments at this depth in parallel
144
+ const depthLimit = pLimit(50);
145
+ // Calculate updates for all comments at this depth in parallel
146
+ const depthUpdatePromises = commentsAtDepth.map((comment) => depthLimit(async () => await calculateNewCommentUpdate(community, comment)));
147
+ // Wait for all comments at this depth to be calculated
148
+ const depthResults = await Promise.all(depthUpdatePromises);
149
+ // Batch write all updates for this depth to the database
150
+ community._dbHandler.upsertCommentUpdates(depthResults.map((r) => r.newCommentUpdateToWriteToDb));
151
+ // Add to our results
152
+ postUpdateRows.push(...depthResults);
153
+ }
154
+ return postUpdateRows;
155
+ }
156
+ catch (error) {
157
+ log.error(`Failed to process post tree ${postCid}:`, error);
158
+ throw error;
159
+ }
160
+ }));
161
+ // Wait for all post trees to be processed
162
+ const postResults = await Promise.all(postProcessingPromises);
163
+ // Collect all results
164
+ for (const result of postResults) {
165
+ allCommentUpdateRows.push(...result);
166
+ }
167
+ return allCommentUpdateRows;
168
+ }
169
+ export async function syncPostUpdatesWithIpfs(community, commentUpdateRowsToPublishToIpfs) {
170
+ const log = Logger("pkc-js:local-community:sync:_syncPostUpdatesFilesystemWithIpfs");
171
+ const postUpdatesDirectory = `/${community.address}`;
172
+ const commentUpdatesWithLocalPath = commentUpdateRowsToPublishToIpfs.filter((row) => typeof row.localMfsPath === "string");
173
+ if (commentUpdatesWithLocalPath.length === 0)
174
+ throw Error("No comment updates of posts to publish to postUpdates directory. This is a critical bug");
175
+ const kuboRpc = community._clientsManager.getDefaultKuboRpcClient();
176
+ const removedMfsPaths = await rmUnneededMfsPaths(community);
177
+ let postUpdatesDirectoryCid;
178
+ const BATCH_SIZE = 50;
179
+ for (let index = 0; index < commentUpdatesWithLocalPath.length; index += BATCH_SIZE) {
180
+ const batch = commentUpdatesWithLocalPath.slice(index, index + BATCH_SIZE);
181
+ await Promise.all(batch.map(async (row) => {
182
+ const { localMfsPath, newCommentUpdate } = row;
183
+ const content = deterministicStringify(newCommentUpdate);
184
+ await writeKuboFilesWithTimeout({
185
+ ipfsClient: kuboRpc._client,
186
+ log,
187
+ path: localMfsPath,
188
+ content,
189
+ options: {
190
+ create: true,
191
+ truncate: true,
192
+ parents: true,
193
+ // flush: true to avoid Kubo's global Internal.MFSNoFlushLimit (default 256).
194
+ // Costs some throughput (each write self-flushes instead of batching) but
195
+ // is safe under multi-community concurrency, which the global counter is not.
196
+ flush: true
197
+ }
198
+ });
199
+ removedMfsPaths.push(localMfsPath);
200
+ }));
201
+ postUpdatesDirectoryCid = await kuboRpc._client.files.flush(postUpdatesDirectory);
202
+ }
203
+ const postUpdatesDirectoryCidString = postUpdatesDirectoryCid?.toString();
204
+ log("Community", community.address, "Synced", commentUpdatesWithLocalPath.length, "post CommentUpdates", "with MFS postUpdates directory", postUpdatesDirectoryCidString);
205
+ community._dbHandler.markCommentsAsPublishedToPostUpdates(commentUpdateRowsToPublishToIpfs.map((row) => row.newCommentUpdate.cid));
206
+ }
207
+ export async function adjustPostUpdatesBucketsIfNeeded(community) {
208
+ if (!community.postUpdates)
209
+ return;
210
+ // Look for posts whose buckets should be changed
211
+ const log = Logger("pkc-js:local-community:start:_adjustPostUpdatesBucketsIfNeeded");
212
+ const postsWithOutdatedPostUpdateBucket = community._dbHandler.queryPostsWithOutdatedBuckets(community._postUpdatesBuckets);
213
+ if (postsWithOutdatedPostUpdateBucket.length === 0)
214
+ return;
215
+ community._dbHandler.forceUpdateOnAllCommentsWithCid(postsWithOutdatedPostUpdateBucket.map((post) => post.cid));
216
+ log(`Found ${postsWithOutdatedPostUpdateBucket.length} posts with outdated buckets and forced their updates`);
217
+ }
218
+ //# sourceMappingURL=comment-updates.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"comment-updates.js","sourceRoot":"","sources":["../../../../../../src/runtime/browser/community/local-community/comment-updates.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import Logger from "../../../../logger.js";
2
+ import type { CreateNewLocalCommunityParsedOptions, InternalCommunityRecordAfterFirstUpdateType, InternalCommunityRecordBeforeFirstUpdateType } from "../../../../community/types.js";
3
+ import type { LocalCommunity } from "../local-community.js";
4
+ export declare function initSignerProps(community: LocalCommunity, newSignerProps: InternalCommunityRecordBeforeFirstUpdateType["signer"]): Promise<void>;
5
+ export declare function importCommunitySignerIntoIpfsIfNeeded(community: LocalCommunity): Promise<void>;
6
+ export declare function getDbInternalState(community: LocalCommunity, lock: boolean): Promise<InternalCommunityRecordAfterFirstUpdateType | InternalCommunityRecordBeforeFirstUpdateType>;
7
+ export declare function updateDbInternalState(community: LocalCommunity, props: Partial<InternalCommunityRecordBeforeFirstUpdateType | InternalCommunityRecordAfterFirstUpdateType>): Promise<InternalCommunityRecordBeforeFirstUpdateType | InternalCommunityRecordAfterFirstUpdateType>;
8
+ export declare function updateInstanceStateWithDbState(community: LocalCommunity): Promise<void>;
9
+ export declare function updateInstancePropsWithStartedCommunityOrDb(community: LocalCommunity): Promise<void>;
10
+ export declare function setChallengesToDefaultIfNotDefined(community: LocalCommunity, log: Logger): Promise<void>;
11
+ export declare function createNewLocalCommunityDb(community: LocalCommunity): Promise<void>;
12
+ export declare function initNewLocalCommunityPropsNoMerge(community: LocalCommunity, newProps: CreateNewLocalCommunityParsedOptions): Promise<void>;
13
+ export declare function initInternalCommunityAfterFirstUpdateNoMerge(community: LocalCommunity, newProps: InternalCommunityRecordAfterFirstUpdateType): Promise<void>;
14
+ export declare function initInternalCommunityBeforeFirstUpdateNoMerge(community: LocalCommunity, newProps: InternalCommunityRecordBeforeFirstUpdateType): Promise<void>;
15
+ export declare function initDbHandlerIfNeeded(community: LocalCommunity): Promise<void>;