@pkcprotocol/pkc-js 0.0.35 → 0.0.37
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.
- package/README.md +18 -0
- package/dist/browser/community/remote-community.d.ts +3 -3
- package/dist/browser/community/remote-community.js.map +1 -1
- package/dist/browser/community/schema.d.ts +24 -0
- package/dist/browser/community/schema.js +14 -1
- package/dist/browser/community/schema.js.map +1 -1
- package/dist/browser/errors.d.ts +5 -1
- package/dist/browser/errors.js +4 -0
- package/dist/browser/errors.js.map +1 -1
- package/dist/browser/generated-version.d.ts +1 -1
- package/dist/browser/generated-version.js +1 -1
- package/dist/browser/index.d.ts +12 -0
- package/dist/browser/pkc/pkc.js +3 -3
- package/dist/browser/pkc/pkc.js.map +1 -1
- package/dist/browser/pkc-error.d.ts +1 -1
- package/dist/browser/publications/comment/schema.d.ts +2 -0
- package/dist/browser/publications/comment/schema.js +32 -0
- package/dist/browser/publications/comment/schema.js.map +1 -1
- package/dist/browser/rpc/src/lib/pkc-js/index.d.ts +6 -0
- package/dist/browser/rpc/src/schema.d.ts +36 -0
- package/dist/browser/runtime/browser/community/local-community.d.ts +2 -0
- package/dist/browser/runtime/browser/community/local-community.js +6 -0
- package/dist/browser/runtime/browser/community/local-community.js.map +1 -1
- package/dist/browser/runtime/node/community/challenges/index.d.ts +11 -5
- package/dist/browser/runtime/node/community/challenges/index.js +40 -5
- package/dist/browser/runtime/node/community/challenges/index.js.map +1 -1
- package/dist/browser/runtime/node/community/challenges/validate-challenge-result.d.ts +5 -0
- package/dist/browser/runtime/node/community/challenges/validate-challenge-result.js +70 -0
- package/dist/browser/runtime/node/community/challenges/validate-challenge-result.js.map +1 -0
- package/dist/browser/runtime/node/community/db-handler.d.ts +3 -1
- package/dist/browser/runtime/node/community/db-handler.js +24 -9
- package/dist/browser/runtime/node/community/db-handler.js.map +1 -1
- package/dist/browser/runtime/node/community/local-community/challenges.d.ts +27 -0
- package/dist/browser/runtime/node/community/local-community/challenges.js +534 -0
- package/dist/browser/runtime/node/community/local-community/challenges.js.map +1 -0
- package/dist/browser/runtime/node/community/local-community/cleanup.d.ts +9 -0
- package/dist/browser/runtime/node/community/local-community/cleanup.js +165 -0
- package/dist/browser/runtime/node/community/local-community/cleanup.js.map +1 -0
- package/dist/browser/runtime/node/community/local-community/comment-updates.d.ts +11 -0
- package/dist/browser/runtime/node/community/local-community/comment-updates.js +218 -0
- package/dist/browser/runtime/node/community/local-community/comment-updates.js.map +1 -0
- package/dist/browser/runtime/node/community/local-community/db-state.d.ts +15 -0
- package/dist/browser/runtime/node/community/local-community/db-state.js +323 -0
- package/dist/browser/runtime/node/community/local-community/db-state.js.map +1 -0
- package/dist/browser/runtime/node/community/local-community/defaults.d.ts +12 -0
- package/dist/browser/runtime/node/community/local-community/defaults.js +29 -0
- package/dist/browser/runtime/node/community/local-community/defaults.js.map +1 -0
- package/dist/browser/runtime/node/community/local-community/editing.d.ts +10 -0
- package/dist/browser/runtime/node/community/local-community/editing.js +188 -0
- package/dist/browser/runtime/node/community/local-community/editing.js.map +1 -0
- package/dist/browser/runtime/node/community/local-community/ipns-publishing.d.ts +12 -0
- package/dist/browser/runtime/node/community/local-community/ipns-publishing.js +340 -0
- package/dist/browser/runtime/node/community/local-community/ipns-publishing.js.map +1 -0
- package/dist/browser/runtime/node/community/local-community/lifecycle.d.ts +11 -0
- package/dist/browser/runtime/node/community/local-community/lifecycle.js +428 -0
- package/dist/browser/runtime/node/community/local-community/lifecycle.js.map +1 -0
- package/dist/browser/runtime/node/community/local-community/publication-store.d.ts +102 -0
- package/dist/browser/runtime/node/community/local-community/publication-store.js +403 -0
- package/dist/browser/runtime/node/community/local-community/publication-store.js.map +1 -0
- package/dist/browser/runtime/node/community/local-community/publication-validation.d.ts +9 -0
- package/dist/browser/runtime/node/community/local-community/publication-validation.js +493 -0
- package/dist/browser/runtime/node/community/local-community/publication-validation.js.map +1 -0
- package/dist/browser/runtime/node/community/local-community/pubsub.d.ts +3 -0
- package/dist/browser/runtime/node/community/local-community/pubsub.js +43 -0
- package/dist/browser/runtime/node/community/local-community/pubsub.js.map +1 -0
- package/dist/browser/runtime/node/community/local-community/registry.d.ts +3 -0
- package/dist/browser/runtime/node/community/local-community/registry.js +4 -0
- package/dist/browser/runtime/node/community/local-community/registry.js.map +1 -0
- package/dist/browser/runtime/node/community/local-community.d.ts +68 -105
- package/dist/browser/runtime/node/community/local-community.js +127 -2927
- package/dist/browser/runtime/node/community/local-community.js.map +1 -1
- package/dist/browser/schema/schema.d.ts +1 -0
- package/dist/browser/schema/schema.js +17 -0
- package/dist/browser/schema/schema.js.map +1 -1
- package/dist/browser/schema.d.ts +48 -0
- package/dist/browser/signer/signatures.d.ts +1 -1
- package/dist/browser/signer/signatures.js +9 -2
- package/dist/browser/signer/signatures.js.map +1 -1
- package/dist/browser/test/test-util.js +0 -1
- package/dist/browser/test/test-util.js.map +1 -1
- package/dist/browser/version.js +1 -1
- package/dist/node/community/remote-community.d.ts +3 -3
- package/dist/node/community/remote-community.js.map +1 -1
- package/dist/node/community/schema.d.ts +24 -0
- package/dist/node/community/schema.js +14 -1
- package/dist/node/community/schema.js.map +1 -1
- package/dist/node/errors.d.ts +5 -1
- package/dist/node/errors.js +4 -0
- package/dist/node/errors.js.map +1 -1
- package/dist/node/generated-version.d.ts +1 -1
- package/dist/node/generated-version.js +1 -1
- package/dist/node/index.d.ts +12 -0
- package/dist/node/pkc/pkc.js +3 -3
- package/dist/node/pkc/pkc.js.map +1 -1
- package/dist/node/pkc-error.d.ts +1 -1
- package/dist/node/publications/comment/schema.d.ts +2 -0
- package/dist/node/publications/comment/schema.js +32 -0
- package/dist/node/publications/comment/schema.js.map +1 -1
- package/dist/node/rpc/src/lib/pkc-js/index.d.ts +6 -0
- package/dist/node/rpc/src/schema.d.ts +36 -0
- package/dist/node/runtime/browser/community/local-community.d.ts +2 -0
- package/dist/node/runtime/browser/community/local-community.js +6 -0
- package/dist/node/runtime/browser/community/local-community.js.map +1 -1
- package/dist/node/runtime/node/community/challenges/index.d.ts +11 -5
- package/dist/node/runtime/node/community/challenges/index.js +40 -5
- package/dist/node/runtime/node/community/challenges/index.js.map +1 -1
- package/dist/node/runtime/node/community/challenges/validate-challenge-result.d.ts +5 -0
- package/dist/node/runtime/node/community/challenges/validate-challenge-result.js +70 -0
- package/dist/node/runtime/node/community/challenges/validate-challenge-result.js.map +1 -0
- package/dist/node/runtime/node/community/db-handler.d.ts +3 -1
- package/dist/node/runtime/node/community/db-handler.js +24 -9
- package/dist/node/runtime/node/community/db-handler.js.map +1 -1
- package/dist/node/runtime/node/community/local-community/challenges.d.ts +27 -0
- package/dist/node/runtime/node/community/local-community/challenges.js +534 -0
- package/dist/node/runtime/node/community/local-community/challenges.js.map +1 -0
- package/dist/node/runtime/node/community/local-community/cleanup.d.ts +9 -0
- package/dist/node/runtime/node/community/local-community/cleanup.js +165 -0
- package/dist/node/runtime/node/community/local-community/cleanup.js.map +1 -0
- package/dist/node/runtime/node/community/local-community/comment-updates.d.ts +11 -0
- package/dist/node/runtime/node/community/local-community/comment-updates.js +218 -0
- package/dist/node/runtime/node/community/local-community/comment-updates.js.map +1 -0
- package/dist/node/runtime/node/community/local-community/db-state.d.ts +15 -0
- package/dist/node/runtime/node/community/local-community/db-state.js +323 -0
- package/dist/node/runtime/node/community/local-community/db-state.js.map +1 -0
- package/dist/node/runtime/node/community/local-community/defaults.d.ts +12 -0
- package/dist/node/runtime/node/community/local-community/defaults.js +29 -0
- package/dist/node/runtime/node/community/local-community/defaults.js.map +1 -0
- package/dist/node/runtime/node/community/local-community/editing.d.ts +10 -0
- package/dist/node/runtime/node/community/local-community/editing.js +188 -0
- package/dist/node/runtime/node/community/local-community/editing.js.map +1 -0
- package/dist/node/runtime/node/community/local-community/ipns-publishing.d.ts +12 -0
- package/dist/node/runtime/node/community/local-community/ipns-publishing.js +340 -0
- package/dist/node/runtime/node/community/local-community/ipns-publishing.js.map +1 -0
- package/dist/node/runtime/node/community/local-community/lifecycle.d.ts +11 -0
- package/dist/node/runtime/node/community/local-community/lifecycle.js +428 -0
- package/dist/node/runtime/node/community/local-community/lifecycle.js.map +1 -0
- package/dist/node/runtime/node/community/local-community/publication-store.d.ts +102 -0
- package/dist/node/runtime/node/community/local-community/publication-store.js +403 -0
- package/dist/node/runtime/node/community/local-community/publication-store.js.map +1 -0
- package/dist/node/runtime/node/community/local-community/publication-validation.d.ts +9 -0
- package/dist/node/runtime/node/community/local-community/publication-validation.js +493 -0
- package/dist/node/runtime/node/community/local-community/publication-validation.js.map +1 -0
- package/dist/node/runtime/node/community/local-community/pubsub.d.ts +3 -0
- package/dist/node/runtime/node/community/local-community/pubsub.js +43 -0
- package/dist/node/runtime/node/community/local-community/pubsub.js.map +1 -0
- package/dist/node/runtime/node/community/local-community/registry.d.ts +3 -0
- package/dist/node/runtime/node/community/local-community/registry.js +4 -0
- package/dist/node/runtime/node/community/local-community/registry.js.map +1 -0
- package/dist/node/runtime/node/community/local-community.d.ts +68 -105
- package/dist/node/runtime/node/community/local-community.js +127 -2927
- package/dist/node/runtime/node/community/local-community.js.map +1 -1
- package/dist/node/schema/schema.d.ts +1 -0
- package/dist/node/schema/schema.js +17 -0
- package/dist/node/schema/schema.js.map +1 -1
- package/dist/node/schema.d.ts +48 -0
- package/dist/node/signer/signatures.d.ts +1 -1
- package/dist/node/signer/signatures.js +9 -2
- package/dist/node/signer/signatures.js.map +1 -1
- package/dist/node/test/test-util.js +0 -1
- package/dist/node/test/test-util.js.map +1 -1
- package/dist/node/version.js +1 -1
- 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>;
|