@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.
Files changed (162) 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/community/schema.d.ts +24 -0
  5. package/dist/browser/community/schema.js +14 -1
  6. package/dist/browser/community/schema.js.map +1 -1
  7. package/dist/browser/errors.d.ts +5 -1
  8. package/dist/browser/errors.js +4 -0
  9. package/dist/browser/errors.js.map +1 -1
  10. package/dist/browser/generated-version.d.ts +1 -1
  11. package/dist/browser/generated-version.js +1 -1
  12. package/dist/browser/index.d.ts +12 -0
  13. package/dist/browser/pkc/pkc.js +3 -3
  14. package/dist/browser/pkc/pkc.js.map +1 -1
  15. package/dist/browser/pkc-error.d.ts +1 -1
  16. package/dist/browser/publications/comment/schema.d.ts +2 -0
  17. package/dist/browser/publications/comment/schema.js +32 -0
  18. package/dist/browser/publications/comment/schema.js.map +1 -1
  19. package/dist/browser/rpc/src/lib/pkc-js/index.d.ts +6 -0
  20. package/dist/browser/rpc/src/schema.d.ts +36 -0
  21. package/dist/browser/runtime/browser/community/local-community.d.ts +2 -0
  22. package/dist/browser/runtime/browser/community/local-community.js +6 -0
  23. package/dist/browser/runtime/browser/community/local-community.js.map +1 -1
  24. package/dist/browser/runtime/node/community/challenges/index.d.ts +11 -5
  25. package/dist/browser/runtime/node/community/challenges/index.js +40 -5
  26. package/dist/browser/runtime/node/community/challenges/index.js.map +1 -1
  27. package/dist/browser/runtime/node/community/challenges/validate-challenge-result.d.ts +5 -0
  28. package/dist/browser/runtime/node/community/challenges/validate-challenge-result.js +70 -0
  29. package/dist/browser/runtime/node/community/challenges/validate-challenge-result.js.map +1 -0
  30. package/dist/browser/runtime/node/community/db-handler.d.ts +3 -1
  31. package/dist/browser/runtime/node/community/db-handler.js +24 -9
  32. package/dist/browser/runtime/node/community/db-handler.js.map +1 -1
  33. package/dist/browser/runtime/node/community/local-community/challenges.d.ts +27 -0
  34. package/dist/browser/runtime/node/community/local-community/challenges.js +534 -0
  35. package/dist/browser/runtime/node/community/local-community/challenges.js.map +1 -0
  36. package/dist/browser/runtime/node/community/local-community/cleanup.d.ts +9 -0
  37. package/dist/browser/runtime/node/community/local-community/cleanup.js +165 -0
  38. package/dist/browser/runtime/node/community/local-community/cleanup.js.map +1 -0
  39. package/dist/browser/runtime/node/community/local-community/comment-updates.d.ts +11 -0
  40. package/dist/browser/runtime/node/community/local-community/comment-updates.js +218 -0
  41. package/dist/browser/runtime/node/community/local-community/comment-updates.js.map +1 -0
  42. package/dist/browser/runtime/node/community/local-community/db-state.d.ts +15 -0
  43. package/dist/browser/runtime/node/community/local-community/db-state.js +323 -0
  44. package/dist/browser/runtime/node/community/local-community/db-state.js.map +1 -0
  45. package/dist/browser/runtime/node/community/local-community/defaults.d.ts +12 -0
  46. package/dist/browser/runtime/node/community/local-community/defaults.js +29 -0
  47. package/dist/browser/runtime/node/community/local-community/defaults.js.map +1 -0
  48. package/dist/browser/runtime/node/community/local-community/editing.d.ts +10 -0
  49. package/dist/browser/runtime/node/community/local-community/editing.js +188 -0
  50. package/dist/browser/runtime/node/community/local-community/editing.js.map +1 -0
  51. package/dist/browser/runtime/node/community/local-community/ipns-publishing.d.ts +12 -0
  52. package/dist/browser/runtime/node/community/local-community/ipns-publishing.js +340 -0
  53. package/dist/browser/runtime/node/community/local-community/ipns-publishing.js.map +1 -0
  54. package/dist/browser/runtime/node/community/local-community/lifecycle.d.ts +11 -0
  55. package/dist/browser/runtime/node/community/local-community/lifecycle.js +428 -0
  56. package/dist/browser/runtime/node/community/local-community/lifecycle.js.map +1 -0
  57. package/dist/browser/runtime/node/community/local-community/publication-store.d.ts +102 -0
  58. package/dist/browser/runtime/node/community/local-community/publication-store.js +403 -0
  59. package/dist/browser/runtime/node/community/local-community/publication-store.js.map +1 -0
  60. package/dist/browser/runtime/node/community/local-community/publication-validation.d.ts +9 -0
  61. package/dist/browser/runtime/node/community/local-community/publication-validation.js +493 -0
  62. package/dist/browser/runtime/node/community/local-community/publication-validation.js.map +1 -0
  63. package/dist/browser/runtime/node/community/local-community/pubsub.d.ts +3 -0
  64. package/dist/browser/runtime/node/community/local-community/pubsub.js +43 -0
  65. package/dist/browser/runtime/node/community/local-community/pubsub.js.map +1 -0
  66. package/dist/browser/runtime/node/community/local-community/registry.d.ts +3 -0
  67. package/dist/browser/runtime/node/community/local-community/registry.js +4 -0
  68. package/dist/browser/runtime/node/community/local-community/registry.js.map +1 -0
  69. package/dist/browser/runtime/node/community/local-community.d.ts +68 -105
  70. package/dist/browser/runtime/node/community/local-community.js +127 -2927
  71. package/dist/browser/runtime/node/community/local-community.js.map +1 -1
  72. package/dist/browser/schema/schema.d.ts +1 -0
  73. package/dist/browser/schema/schema.js +17 -0
  74. package/dist/browser/schema/schema.js.map +1 -1
  75. package/dist/browser/schema.d.ts +48 -0
  76. package/dist/browser/signer/signatures.d.ts +1 -1
  77. package/dist/browser/signer/signatures.js +9 -2
  78. package/dist/browser/signer/signatures.js.map +1 -1
  79. package/dist/browser/test/test-util.js +0 -1
  80. package/dist/browser/test/test-util.js.map +1 -1
  81. package/dist/browser/version.js +1 -1
  82. package/dist/node/community/remote-community.d.ts +3 -3
  83. package/dist/node/community/remote-community.js.map +1 -1
  84. package/dist/node/community/schema.d.ts +24 -0
  85. package/dist/node/community/schema.js +14 -1
  86. package/dist/node/community/schema.js.map +1 -1
  87. package/dist/node/errors.d.ts +5 -1
  88. package/dist/node/errors.js +4 -0
  89. package/dist/node/errors.js.map +1 -1
  90. package/dist/node/generated-version.d.ts +1 -1
  91. package/dist/node/generated-version.js +1 -1
  92. package/dist/node/index.d.ts +12 -0
  93. package/dist/node/pkc/pkc.js +3 -3
  94. package/dist/node/pkc/pkc.js.map +1 -1
  95. package/dist/node/pkc-error.d.ts +1 -1
  96. package/dist/node/publications/comment/schema.d.ts +2 -0
  97. package/dist/node/publications/comment/schema.js +32 -0
  98. package/dist/node/publications/comment/schema.js.map +1 -1
  99. package/dist/node/rpc/src/lib/pkc-js/index.d.ts +6 -0
  100. package/dist/node/rpc/src/schema.d.ts +36 -0
  101. package/dist/node/runtime/browser/community/local-community.d.ts +2 -0
  102. package/dist/node/runtime/browser/community/local-community.js +6 -0
  103. package/dist/node/runtime/browser/community/local-community.js.map +1 -1
  104. package/dist/node/runtime/node/community/challenges/index.d.ts +11 -5
  105. package/dist/node/runtime/node/community/challenges/index.js +40 -5
  106. package/dist/node/runtime/node/community/challenges/index.js.map +1 -1
  107. package/dist/node/runtime/node/community/challenges/validate-challenge-result.d.ts +5 -0
  108. package/dist/node/runtime/node/community/challenges/validate-challenge-result.js +70 -0
  109. package/dist/node/runtime/node/community/challenges/validate-challenge-result.js.map +1 -0
  110. package/dist/node/runtime/node/community/db-handler.d.ts +3 -1
  111. package/dist/node/runtime/node/community/db-handler.js +24 -9
  112. package/dist/node/runtime/node/community/db-handler.js.map +1 -1
  113. package/dist/node/runtime/node/community/local-community/challenges.d.ts +27 -0
  114. package/dist/node/runtime/node/community/local-community/challenges.js +534 -0
  115. package/dist/node/runtime/node/community/local-community/challenges.js.map +1 -0
  116. package/dist/node/runtime/node/community/local-community/cleanup.d.ts +9 -0
  117. package/dist/node/runtime/node/community/local-community/cleanup.js +165 -0
  118. package/dist/node/runtime/node/community/local-community/cleanup.js.map +1 -0
  119. package/dist/node/runtime/node/community/local-community/comment-updates.d.ts +11 -0
  120. package/dist/node/runtime/node/community/local-community/comment-updates.js +218 -0
  121. package/dist/node/runtime/node/community/local-community/comment-updates.js.map +1 -0
  122. package/dist/node/runtime/node/community/local-community/db-state.d.ts +15 -0
  123. package/dist/node/runtime/node/community/local-community/db-state.js +323 -0
  124. package/dist/node/runtime/node/community/local-community/db-state.js.map +1 -0
  125. package/dist/node/runtime/node/community/local-community/defaults.d.ts +12 -0
  126. package/dist/node/runtime/node/community/local-community/defaults.js +29 -0
  127. package/dist/node/runtime/node/community/local-community/defaults.js.map +1 -0
  128. package/dist/node/runtime/node/community/local-community/editing.d.ts +10 -0
  129. package/dist/node/runtime/node/community/local-community/editing.js +188 -0
  130. package/dist/node/runtime/node/community/local-community/editing.js.map +1 -0
  131. package/dist/node/runtime/node/community/local-community/ipns-publishing.d.ts +12 -0
  132. package/dist/node/runtime/node/community/local-community/ipns-publishing.js +340 -0
  133. package/dist/node/runtime/node/community/local-community/ipns-publishing.js.map +1 -0
  134. package/dist/node/runtime/node/community/local-community/lifecycle.d.ts +11 -0
  135. package/dist/node/runtime/node/community/local-community/lifecycle.js +428 -0
  136. package/dist/node/runtime/node/community/local-community/lifecycle.js.map +1 -0
  137. package/dist/node/runtime/node/community/local-community/publication-store.d.ts +102 -0
  138. package/dist/node/runtime/node/community/local-community/publication-store.js +403 -0
  139. package/dist/node/runtime/node/community/local-community/publication-store.js.map +1 -0
  140. package/dist/node/runtime/node/community/local-community/publication-validation.d.ts +9 -0
  141. package/dist/node/runtime/node/community/local-community/publication-validation.js +493 -0
  142. package/dist/node/runtime/node/community/local-community/publication-validation.js.map +1 -0
  143. package/dist/node/runtime/node/community/local-community/pubsub.d.ts +3 -0
  144. package/dist/node/runtime/node/community/local-community/pubsub.js +43 -0
  145. package/dist/node/runtime/node/community/local-community/pubsub.js.map +1 -0
  146. package/dist/node/runtime/node/community/local-community/registry.d.ts +3 -0
  147. package/dist/node/runtime/node/community/local-community/registry.js +4 -0
  148. package/dist/node/runtime/node/community/local-community/registry.js.map +1 -0
  149. package/dist/node/runtime/node/community/local-community.d.ts +68 -105
  150. package/dist/node/runtime/node/community/local-community.js +127 -2927
  151. package/dist/node/runtime/node/community/local-community.js.map +1 -1
  152. package/dist/node/schema/schema.d.ts +1 -0
  153. package/dist/node/schema/schema.js +17 -0
  154. package/dist/node/schema/schema.js.map +1 -1
  155. package/dist/node/schema.d.ts +48 -0
  156. package/dist/node/signer/signatures.d.ts +1 -1
  157. package/dist/node/signer/signatures.js +9 -2
  158. package/dist/node/signer/signatures.js.map +1 -1
  159. package/dist/node/test/test-util.js +0 -1
  160. package/dist/node/test/test-util.js.map +1 -1
  161. package/dist/node/version.js +1 -1
  162. package/package.json +3 -2
@@ -0,0 +1,493 @@
1
+ import Logger from "../../../../logger.js";
2
+ import * as remeda from "remeda";
3
+ import { contentContainsMarkdownAudio, contentContainsMarkdownImages, contentContainsMarkdownVideos, getErrorCodeFromMessage, isLinkOfAnimatedImage, isLinkOfAudio, isLinkOfImage, isLinkOfMedia, isLinkOfVideo, isLinkValid, isStringDomain, timestamp } from "../../../../util.js";
4
+ import { PKCError } from "../../../../pkc-error.js";
5
+ import { messages } from "../../../../errors.js";
6
+ import { AuthorReservedFields } from "../../../../schema/schema.js";
7
+ import { verifyCommentEdit, verifyCommentModeration, verifyCommentPubsubMessage, verifyCommunityEdit, verifyVote } from "../../../../signer/signatures.js";
8
+ import { getPKCAddressFromPublicKey } from "../../../../signer/util.js";
9
+ import { getAuthorNameFromWire } from "../../../../publications/publication-author.js";
10
+ import { getCommunityNameFromWire, getCommunityPublicKeyFromWire } from "../../../../publications/publication-community.js";
11
+ import { CommentEditReservedFields } from "../../../../publications/comment-edit/schema.js";
12
+ import { CommentPubsubMessageReservedFields } from "../../../../publications/comment/schema.js";
13
+ import { CommentModerationReservedFields } from "../../../../publications/comment-moderation/schema.js";
14
+ import { CommunityEditPublicationPubsubReservedFields } from "../../../../publications/community-edit/schema.js";
15
+ import { CommunityIpfsSchema } from "../../../../community/schema.js";
16
+ import { VotePubsubReservedFields } from "../../../../publications/vote/schema.js";
17
+ import { publishFailedChallengeVerification } from "./challenges.js";
18
+ export function isFlairInAllowedList(flair, allowedFlairs) {
19
+ return allowedFlairs.some((allowed) => remeda.isDeepEqual(allowed, flair));
20
+ }
21
+ export async function isPublicationAuthorPartOfRoles(community, publication, rolesToCheckAgainst) {
22
+ if (!community.roles)
23
+ return false;
24
+ // is the author of publication a moderator?
25
+ const signerAddress = await getPKCAddressFromPublicKey(publication.signature.publicKey);
26
+ if (rolesToCheckAgainst.includes(community.roles[signerAddress]?.role))
27
+ return true;
28
+ const authorName = getAuthorNameFromWire(publication.author);
29
+ if (typeof authorName === "string") {
30
+ if (rolesToCheckAgainst.includes(community.roles[authorName]?.role))
31
+ return true;
32
+ if (community._pkc.resolveAuthorNames && isStringDomain(authorName)) {
33
+ const { resolvedAuthorName: resolvedSignerAddress } = await community._clientsManager.resolveAuthorNameIfNeeded({
34
+ authorName,
35
+ abortSignal: AbortSignal.timeout(community._pkc._timeouts["resolve-author-name"]),
36
+ // Mod authority must reflect current state — bypass cache.
37
+ cache: { maxAge: 0 }
38
+ });
39
+ if (resolvedSignerAddress !== signerAddress)
40
+ return false;
41
+ if (rolesToCheckAgainst.includes(community.roles[resolvedSignerAddress]?.role))
42
+ return true;
43
+ }
44
+ }
45
+ return false;
46
+ }
47
+ export async function respondWithErrorIfSignatureOfPublicationIsInvalid(community, request) {
48
+ let validity;
49
+ if (request.comment)
50
+ validity = await verifyCommentPubsubMessage({
51
+ comment: request.comment,
52
+ resolveAuthorNames: community._pkc.resolveAuthorNames,
53
+ clientsManager: community._clientsManager
54
+ });
55
+ else if (request.commentEdit)
56
+ validity = await verifyCommentEdit({
57
+ edit: request.commentEdit,
58
+ resolveAuthorNames: community._pkc.resolveAuthorNames,
59
+ clientsManager: community._clientsManager
60
+ });
61
+ else if (request.vote)
62
+ validity = await verifyVote({
63
+ vote: request.vote,
64
+ resolveAuthorNames: community._pkc.resolveAuthorNames,
65
+ clientsManager: community._clientsManager
66
+ });
67
+ else if (request.commentModeration)
68
+ validity = await verifyCommentModeration({
69
+ moderation: request.commentModeration,
70
+ resolveAuthorNames: community._pkc.resolveAuthorNames,
71
+ clientsManager: community._clientsManager
72
+ });
73
+ else if (request.communityEdit)
74
+ validity = await verifyCommunityEdit({
75
+ communityEdit: request.communityEdit,
76
+ resolveAuthorNames: community._pkc.resolveAuthorNames,
77
+ clientsManager: community._clientsManager
78
+ });
79
+ else
80
+ throw Error("Can't detect the type of publication");
81
+ if (!validity.valid) {
82
+ await publishFailedChallengeVerification(community, { reason: validity.reason }, request.challengeRequestId);
83
+ throw new PKCError(getErrorCodeFromMessage(validity.reason), { request, validity });
84
+ }
85
+ }
86
+ // Validates wire-format fields (rejecting deprecated names, ensuring community keys/name match, timestamp range, ban status).
87
+ async function checkWireFormatAndCommunityAuthor(community, publication, authorCommunity) {
88
+ // Reject deprecated old wire format fields
89
+ if ("subplebbitAddress" in publication)
90
+ return messages.ERR_PUBLICATION_USES_DEPRECATED_SUBPLEBBIT_ADDRESS;
91
+ // reject run time field
92
+ if ("communityAddress" in publication)
93
+ return messages.ERR_PUBLICATION_USES_DEPRECATED_COMMUNITY_ADDRESS;
94
+ // communityPublicKey must be present and match this community's IPNS key
95
+ const pubCommunityPublicKey = getCommunityPublicKeyFromWire(publication);
96
+ if (!pubCommunityPublicKey || pubCommunityPublicKey !== community.signer.address)
97
+ return messages.ERR_PUBLICATION_INVALID_COMMUNITY_PUBLIC_KEY;
98
+ // communityName, if present, must match this community's address
99
+ const pubCommunityName = getCommunityNameFromWire(publication);
100
+ if (pubCommunityName && pubCommunityName !== community.address)
101
+ return messages.ERR_PUBLICATION_INVALID_COMMUNITY_NAME;
102
+ if (publication.timestamp <= timestamp() - 5 * 60 || publication.timestamp >= timestamp() + 5 * 60)
103
+ return messages.ERR_PUBLICATION_TIMESTAMP_IS_NOT_IN_PROPER_RANGE;
104
+ if (typeof authorCommunity?.banExpiresAt === "number" && authorCommunity.banExpiresAt > timestamp())
105
+ return messages.ERR_AUTHOR_IS_BANNED;
106
+ return undefined;
107
+ }
108
+ // Author identity checks: reserved fields, name-must-be-domain, name-resolution-matches-signer.
109
+ async function checkAuthorIdentity(community, publication, log) {
110
+ if (publication.author && remeda.intersection(remeda.keys.strict(publication.author), AuthorReservedFields).length > 0)
111
+ return messages.ERR_PUBLICATION_AUTHOR_HAS_RESERVED_FIELD;
112
+ // Reject publications with non-domain author.name — author.name must be a domain or absent
113
+ const authorName = getAuthorNameFromWire(publication.author);
114
+ if (authorName && !isStringDomain(authorName)) {
115
+ log("Rejecting publication: author.name is not a domain", authorName);
116
+ return messages.ERR_AUTHOR_NAME_MUST_BE_A_DOMAIN;
117
+ }
118
+ // Reject publications with author domains that can't be resolved or don't match the signer
119
+ // Use community._clientsManager (not community._pkc) so nameResolver state changes emit on the community's clients
120
+ if (authorName && isStringDomain(authorName) && community._pkc.resolveAuthorNames) {
121
+ let resolvedAddress;
122
+ try {
123
+ ({ resolvedAuthorName: resolvedAddress } = await community._clientsManager.resolveAuthorNameIfNeeded({
124
+ authorName,
125
+ abortSignal: AbortSignal.timeout(community._pkc._timeouts["resolve-author-name"]),
126
+ // Incoming pub validation: 30m staleness window is acceptable; domain transfers are rare.
127
+ cache: { maxAge: 1800 }
128
+ }));
129
+ }
130
+ catch (e) {
131
+ log("Rejecting publication with unresolvable author domain", authorName, e);
132
+ return messages.ERR_FAILED_TO_RESOLVE_AUTHOR_DOMAIN;
133
+ }
134
+ if (resolvedAddress === null) {
135
+ log("Rejecting publication: author domain could not be resolved", authorName);
136
+ return messages.ERR_FAILED_TO_RESOLVE_AUTHOR_DOMAIN;
137
+ }
138
+ const signerAddress = await getPKCAddressFromPublicKey(publication.signature.publicKey);
139
+ if (resolvedAddress !== signerAddress) {
140
+ log("Rejecting publication: author domain resolves to different signer", authorName, resolvedAddress, signerAddress);
141
+ return messages.ERR_AUTHOR_DOMAIN_RESOLVES_TO_DIFFERENT_SIGNER;
142
+ }
143
+ }
144
+ return undefined;
145
+ }
146
+ // Parent/post lifecycle checks: comment/parent existence, mod flags (removed/deleted/locked/archived/pending/disapproved), and timestamp ordering.
147
+ async function checkParentAndPostState(community, request, publication) {
148
+ if ("commentCid" in publication || "parentCid" in publication) {
149
+ // vote or reply or commentEdit or commentModeration
150
+ // not post though
151
+ //@ts-expect-error
152
+ const parentCid = publication.parentCid || publication.commentCid;
153
+ if (typeof parentCid !== "string")
154
+ return messages.ERR_COMMUNITY_PUBLICATION_PARENT_CID_NOT_DEFINED;
155
+ const parent = community._dbHandler.queryComment(parentCid);
156
+ if (!parent)
157
+ return messages.ERR_PUBLICATION_PARENT_DOES_NOT_EXIST_IN_COMMUNITY;
158
+ const parentFlags = community._dbHandler.queryCommentFlagsSetByMod(parentCid);
159
+ if (parentFlags.removed && !request.commentModeration)
160
+ // not allowed to vote or reply under removed comments
161
+ return messages.ERR_COMMUNITY_PUBLICATION_PARENT_HAS_BEEN_REMOVED;
162
+ const isParentDeletedQueryRes = community._dbHandler.queryAuthorEditDeleted(parentCid);
163
+ if (isParentDeletedQueryRes?.deleted && !request.commentModeration)
164
+ return messages.ERR_COMMUNITY_PUBLICATION_PARENT_HAS_BEEN_DELETED; // not allowed to vote or reply under deleted comments
165
+ const postFlags = community._dbHandler.queryCommentFlagsSetByMod(parent.postCid);
166
+ if (postFlags.removed && !request.commentModeration)
167
+ return messages.ERR_COMMUNITY_PUBLICATION_POST_HAS_BEEN_REMOVED;
168
+ const isPostDeletedQueryRes = community._dbHandler.queryAuthorEditDeleted(parent.postCid);
169
+ if (isPostDeletedQueryRes?.deleted && !request.commentModeration)
170
+ return messages.ERR_COMMUNITY_PUBLICATION_POST_HAS_BEEN_DELETED;
171
+ if (postFlags.locked && !request.commentModeration)
172
+ return messages.ERR_COMMUNITY_PUBLICATION_POST_IS_LOCKED;
173
+ if (postFlags.archived && !request.commentModeration)
174
+ return messages.ERR_COMMUNITY_PUBLICATION_POST_IS_ARCHIVED;
175
+ if (parent.timestamp > publication.timestamp)
176
+ return messages.ERR_COMMUNITY_COMMENT_TIMESTAMP_IS_EARLIER_THAN_PARENT;
177
+ // if user publishes vote/reply/commentEdit under pending comment, it should fail
178
+ if (parent.pendingApproval && !("commentModeration" in request) && !(request.commentEdit?.deleted === true))
179
+ return messages.ERR_USER_PUBLISHED_UNDER_PENDING_COMMENT;
180
+ const isCommentDisapproved = community._dbHandler._queryIsCommentApproved(parent);
181
+ if (isCommentDisapproved &&
182
+ !isCommentDisapproved.approved &&
183
+ !("commentModeration" in request) &&
184
+ !(request.commentEdit?.deleted === true))
185
+ return messages.ERR_USER_PUBLISHED_UNDER_DISAPPROVED_COMMENT;
186
+ }
187
+ return undefined;
188
+ }
189
+ // Comment-only validation: feature toggles (links, markdown, spoilers, nesting), flair allowlist, postCid integrity, quotedCid checks, duplicate signature.
190
+ async function checkCommentPublication(community, request) {
191
+ if (!request.comment)
192
+ return undefined;
193
+ const commentPublication = request.comment;
194
+ if (remeda.intersection(remeda.keys.strict(commentPublication), CommentPubsubMessageReservedFields).length > 0)
195
+ return messages.ERR_COMMENT_HAS_RESERVED_FIELD;
196
+ if (community.features?.requirePostLink &&
197
+ !commentPublication.parentCid &&
198
+ (!commentPublication.link || (!community.features?.requirePostLinkIsMedia && !isLinkValid(commentPublication.link))))
199
+ return messages.ERR_COMMENT_HAS_INVALID_LINK_FIELD;
200
+ if (community.features?.requirePostLinkIsMedia &&
201
+ commentPublication.link &&
202
+ (!isLinkValid(commentPublication.link) || !isLinkOfMedia(commentPublication.link)))
203
+ return messages.ERR_POST_LINK_IS_NOT_OF_MEDIA;
204
+ if (community.features?.requireReplyLink &&
205
+ commentPublication.parentCid &&
206
+ (!commentPublication.link || (!community.features?.requireReplyLinkIsMedia && !isLinkValid(commentPublication.link))))
207
+ return messages.ERR_REPLY_HAS_INVALID_LINK_FIELD;
208
+ if (community.features?.requireReplyLinkIsMedia &&
209
+ commentPublication.parentCid &&
210
+ commentPublication.link &&
211
+ (!isLinkValid(commentPublication.link) || !isLinkOfMedia(commentPublication.link)))
212
+ return messages.ERR_REPLY_LINK_IS_NOT_OF_MEDIA;
213
+ if (community.features?.noMarkdownImages && commentPublication.content && contentContainsMarkdownImages(commentPublication.content))
214
+ return messages.ERR_COMMENT_CONTENT_CONTAINS_MARKDOWN_IMAGE;
215
+ if (community.features?.noMarkdownVideos && commentPublication.content && contentContainsMarkdownVideos(commentPublication.content))
216
+ return messages.ERR_COMMENT_CONTENT_CONTAINS_MARKDOWN_VIDEO;
217
+ if (community.features?.noMarkdownAudio && commentPublication.content && contentContainsMarkdownAudio(commentPublication.content))
218
+ return messages.ERR_COMMENT_CONTENT_CONTAINS_MARKDOWN_AUDIO;
219
+ // noImages - block ALL comments with image links
220
+ if (community.features?.noImages && commentPublication.link && isLinkOfImage(commentPublication.link))
221
+ return messages.ERR_COMMENT_HAS_LINK_THAT_IS_IMAGE;
222
+ // noVideos - block ALL comments with video links (including animated images like GIF/APNG)
223
+ if (community.features?.noVideos &&
224
+ commentPublication.link &&
225
+ (isLinkOfVideo(commentPublication.link) || isLinkOfAnimatedImage(commentPublication.link)))
226
+ return messages.ERR_COMMENT_HAS_LINK_THAT_IS_VIDEO;
227
+ // noSpoilers - block ALL comments with spoiler=true
228
+ if (community.features?.noSpoilers && commentPublication.spoiler === true)
229
+ return messages.ERR_COMMENT_HAS_SPOILER_ENABLED;
230
+ // noImageReplies - block only replies with image links
231
+ if (community.features?.noImageReplies &&
232
+ commentPublication.parentCid &&
233
+ commentPublication.link &&
234
+ isLinkOfImage(commentPublication.link))
235
+ return messages.ERR_REPLY_HAS_LINK_THAT_IS_IMAGE;
236
+ // noVideoReplies - block only replies with video links (including animated images like GIF/APNG)
237
+ if (community.features?.noVideoReplies &&
238
+ commentPublication.parentCid &&
239
+ commentPublication.link &&
240
+ (isLinkOfVideo(commentPublication.link) || isLinkOfAnimatedImage(commentPublication.link)))
241
+ return messages.ERR_REPLY_HAS_LINK_THAT_IS_VIDEO;
242
+ // noAudio - block ALL comments with audio links
243
+ if (community.features?.noAudio && commentPublication.link && isLinkOfAudio(commentPublication.link))
244
+ return messages.ERR_COMMENT_HAS_LINK_THAT_IS_AUDIO;
245
+ // noAudioReplies - block only replies with audio links
246
+ if (community.features?.noAudioReplies &&
247
+ commentPublication.parentCid &&
248
+ commentPublication.link &&
249
+ isLinkOfAudio(commentPublication.link))
250
+ return messages.ERR_REPLY_HAS_LINK_THAT_IS_AUDIO;
251
+ // noSpoilerReplies - block only replies with spoiler=true
252
+ if (community.features?.noSpoilerReplies && commentPublication.parentCid && commentPublication.spoiler === true)
253
+ return messages.ERR_REPLY_HAS_SPOILER_ENABLED;
254
+ // noNestedReplies - block replies with depth > 1 (replies to replies)
255
+ if (community.features?.noNestedReplies && commentPublication.parentCid) {
256
+ const parent = community._dbHandler.queryComment(commentPublication.parentCid);
257
+ if (parent && parent.depth > 0) {
258
+ return messages.ERR_NESTED_REPLIES_NOT_ALLOWED;
259
+ }
260
+ }
261
+ // Post flairs validation (comment.flairs)
262
+ if (commentPublication.flairs && commentPublication.flairs.length > 0) {
263
+ if (!community.features?.postFlairs) {
264
+ return messages.ERR_POST_FLAIRS_NOT_ALLOWED;
265
+ }
266
+ const allowedPostFlairs = community.flairs?.["post"] || [];
267
+ for (const flair of commentPublication.flairs) {
268
+ if (!isFlairInAllowedList(flair, allowedPostFlairs)) {
269
+ return messages.ERR_POST_FLAIR_NOT_IN_ALLOWED_FLAIRS;
270
+ }
271
+ }
272
+ }
273
+ // requirePostFlairs - only for posts (depth=0)
274
+ if (community.features?.requirePostFlairs && !commentPublication.parentCid) {
275
+ if (!commentPublication.flairs || commentPublication.flairs.length === 0) {
276
+ return messages.ERR_POST_FLAIRS_REQUIRED;
277
+ }
278
+ }
279
+ // Author flairs validation (comment.author.flairs)
280
+ if (commentPublication.author?.flairs && commentPublication.author.flairs.length > 0 && !community.features?.pseudonymityMode) {
281
+ if (!community.features?.authorFlairs) {
282
+ return messages.ERR_AUTHOR_FLAIRS_NOT_ALLOWED;
283
+ }
284
+ const allowedAuthorFlairs = community.flairs?.["author"] || [];
285
+ for (const flair of commentPublication.author.flairs) {
286
+ if (!isFlairInAllowedList(flair, allowedAuthorFlairs)) {
287
+ return messages.ERR_AUTHOR_FLAIR_NOT_IN_ALLOWED_FLAIRS;
288
+ }
289
+ }
290
+ }
291
+ // requireAuthorFlairs - for all comments (posts and replies)
292
+ if (community.features?.requireAuthorFlairs && !community.features?.pseudonymityMode) {
293
+ if (!commentPublication.author?.flairs || commentPublication.author.flairs.length === 0) {
294
+ return messages.ERR_AUTHOR_FLAIRS_REQUIRED;
295
+ }
296
+ }
297
+ if (commentPublication.parentCid && !commentPublication.postCid)
298
+ return messages.ERR_REPLY_HAS_NOT_DEFINED_POST_CID;
299
+ if (commentPublication.parentCid) {
300
+ // query parents, and make sure commentPublication.postCid is the final parent
301
+ const parentsOfComment = community._dbHandler.queryParentsCids({ parentCid: commentPublication.parentCid });
302
+ if (parentsOfComment[parentsOfComment.length - 1].cid !== commentPublication.postCid)
303
+ return messages.ERR_REPLY_POST_CID_IS_NOT_PARENT_OF_REPLY;
304
+ }
305
+ // Validate quotedCids
306
+ if (commentPublication.quotedCids && commentPublication.quotedCids.length > 0) {
307
+ // Only replies can have quotedCids
308
+ if (!commentPublication.parentCid) {
309
+ return messages.ERR_POST_CANNOT_HAVE_QUOTED_CIDS;
310
+ }
311
+ const threadPostCid = commentPublication.postCid; // postCid is always defined for replies
312
+ for (const quotedCid of commentPublication.quotedCids) {
313
+ // 1. Check existence
314
+ const quotedComment = community._dbHandler.queryComment(quotedCid);
315
+ if (!quotedComment) {
316
+ return messages.ERR_QUOTED_CID_DOES_NOT_EXIST;
317
+ }
318
+ // 2. Check quoted comment is under the same post
319
+ const quotedPostCid = quotedComment.depth === 0 ? quotedComment.cid : quotedComment.postCid;
320
+ if (quotedPostCid !== threadPostCid) {
321
+ return messages.ERR_QUOTED_CID_NOT_UNDER_POST;
322
+ }
323
+ // 3. Check not pending approval
324
+ if (quotedComment.pendingApproval) {
325
+ return messages.ERR_QUOTED_CID_IS_PENDING_APPROVAL;
326
+ }
327
+ }
328
+ }
329
+ const isCommentDuplicate = community._dbHandler.hasCommentWithSignatureEncoded(commentPublication.signature.signature);
330
+ if (isCommentDuplicate)
331
+ return messages.ERR_DUPLICATE_COMMENT;
332
+ return undefined;
333
+ }
334
+ async function checkVotePublication(community, request) {
335
+ if (!request.vote)
336
+ return undefined;
337
+ const votePublication = request.vote;
338
+ if (remeda.intersection(VotePubsubReservedFields, remeda.keys.strict(votePublication)).length > 0)
339
+ return messages.ERR_VOTE_HAS_RESERVED_FIELD;
340
+ if (community.features?.noUpvotes && votePublication.vote === 1)
341
+ return messages.ERR_NOT_ALLOWED_TO_PUBLISH_UPVOTES;
342
+ if (community.features?.noDownvotes && votePublication.vote === -1)
343
+ return messages.ERR_NOT_ALLOWED_TO_PUBLISH_DOWNVOTES;
344
+ const commentToVoteOn = community._dbHandler.queryComment(request.vote.commentCid);
345
+ if (community.features?.noPostDownvotes && commentToVoteOn.depth === 0 && votePublication.vote === -1)
346
+ return messages.ERR_NOT_ALLOWED_TO_PUBLISH_POST_DOWNVOTES;
347
+ if (community.features?.noPostUpvotes && commentToVoteOn.depth === 0 && votePublication.vote === 1)
348
+ return messages.ERR_NOT_ALLOWED_TO_PUBLISH_POST_UPVOTES;
349
+ if (community.features?.noReplyDownvotes && commentToVoteOn.depth > 0 && votePublication.vote === -1)
350
+ return messages.ERR_NOT_ALLOWED_TO_PUBLISH_REPLY_DOWNVOTES;
351
+ if (community.features?.noReplyUpvotes && commentToVoteOn.depth > 0 && votePublication.vote === 1)
352
+ return messages.ERR_NOT_ALLOWED_TO_PUBLISH_REPLY_UPVOTES;
353
+ const voteAuthorSignerAddress = await getPKCAddressFromPublicKey(votePublication.signature.publicKey);
354
+ const previousVote = community._dbHandler.queryVote(commentToVoteOn.cid, voteAuthorSignerAddress);
355
+ if (!previousVote && votePublication.vote === 0)
356
+ return messages.ERR_THERE_IS_NO_PREVIOUS_VOTE_TO_CANCEL;
357
+ return undefined;
358
+ }
359
+ async function checkCommentModerationPublication(community, request) {
360
+ if (!request.commentModeration)
361
+ return undefined;
362
+ const commentModerationPublication = request.commentModeration;
363
+ if (remeda.intersection(CommentModerationReservedFields, remeda.keys.strict(commentModerationPublication)).length > 0)
364
+ return messages.ERR_COMMENT_MODERATION_HAS_RESERVED_FIELD;
365
+ const isAuthorMod = await isPublicationAuthorPartOfRoles(community, commentModerationPublication, ["owner", "moderator", "admin"]);
366
+ if (!isAuthorMod)
367
+ return messages.ERR_COMMENT_MODERATION_ATTEMPTED_WITHOUT_BEING_MODERATOR;
368
+ const commentToBeEdited = community._dbHandler.queryComment(commentModerationPublication.commentCid); // We assume commentToBeEdited to be defined because we already tested for its existence above
369
+ if (!commentToBeEdited)
370
+ return messages.ERR_COMMENT_MODERATION_NO_COMMENT_TO_EDIT;
371
+ if (isAuthorMod && commentModerationPublication.commentModeration.locked && commentToBeEdited.depth !== 0)
372
+ return messages.ERR_COMMUNITY_COMMENT_MOD_CAN_NOT_LOCK_REPLY;
373
+ if (isAuthorMod && commentModerationPublication.commentModeration.archived && commentToBeEdited.depth !== 0)
374
+ return messages.ERR_COMMUNITY_COMMENT_MOD_CAN_NOT_ARCHIVE_REPLY;
375
+ const commentModInDb = community._dbHandler.hasCommentModerationWithSignatureEncoded(commentModerationPublication.signature.signature);
376
+ if (commentModInDb)
377
+ return messages.ERR_DUPLICATE_COMMENT_MODERATION;
378
+ if ("approved" in commentModerationPublication.commentModeration && !commentToBeEdited.pendingApproval)
379
+ return messages.ERR_MOD_ATTEMPTING_TO_APPROVE_OR_DISAPPROVE_COMMENT_THAT_IS_NOT_PENDING;
380
+ return undefined;
381
+ }
382
+ async function checkCommunityEditPublication(community, request) {
383
+ if (!request.communityEdit)
384
+ return undefined;
385
+ const communityEdit = request.communityEdit;
386
+ if (remeda.intersection(CommunityEditPublicationPubsubReservedFields, remeda.keys.strict(communityEdit)).length > 0)
387
+ return messages.ERR_COMMUNITY_EDIT_HAS_RESERVED_FIELD;
388
+ if (communityEdit.communityEdit.roles || communityEdit.communityEdit.address) {
389
+ const isAuthorOwner = await isPublicationAuthorPartOfRoles(community, communityEdit, ["owner"]);
390
+ if (!isAuthorOwner)
391
+ return messages.ERR_COMMUNITY_EDIT_ATTEMPTED_TO_MODIFY_OWNER_EXCLUSIVE_PROPS;
392
+ }
393
+ const isAuthorOwnerOrAdmin = await isPublicationAuthorPartOfRoles(community, communityEdit, ["owner", "admin"]);
394
+ if (!isAuthorOwnerOrAdmin) {
395
+ return messages.ERR_COMMUNITY_EDIT_ATTEMPTED_TO_MODIFY_COMMUNITY_WITHOUT_BEING_OWNER_OR_ADMIN;
396
+ }
397
+ const allowedCommunityEditKeys = [...remeda.keys.strict(CommunityIpfsSchema.shape), "address"];
398
+ if (remeda.difference(remeda.keys.strict(communityEdit.communityEdit), allowedCommunityEditKeys).length > 0) {
399
+ // should only be allowed to modify public props from CommunityIpfs
400
+ // shouldn't be able to modify settings for example
401
+ return messages.ERR_COMMUNITY_EDIT_ATTEMPTED_TO_NON_PUBLIC_PROPS;
402
+ }
403
+ return undefined;
404
+ }
405
+ async function checkCommentEditPublication(community, request) {
406
+ if (!request.commentEdit)
407
+ return undefined;
408
+ const commentEditPublication = request.commentEdit;
409
+ if (remeda.intersection(CommentEditReservedFields, remeda.keys.strict(commentEditPublication)).length > 0)
410
+ return messages.ERR_COMMENT_EDIT_HAS_RESERVED_FIELD;
411
+ const commentToBeEdited = community._dbHandler.queryComment(commentEditPublication.commentCid); // We assume commentToBeEdited to be defined because we already tested for its existence above
412
+ if (!commentToBeEdited)
413
+ return messages.ERR_COMMENT_EDIT_NO_COMMENT_TO_EDIT;
414
+ const commentEditInDb = community._dbHandler.hasCommentEditWithSignatureEncoded(commentEditPublication.signature.signature);
415
+ if (commentEditInDb)
416
+ return messages.ERR_DUPLICATE_COMMENT_EDIT;
417
+ const aliasSignerOfComment = community._dbHandler.queryPseudonymityAliasByCommentCid(commentToBeEdited.cid);
418
+ if (aliasSignerOfComment) {
419
+ const editSignedByOriginalAuthor = commentEditPublication.signature.publicKey === aliasSignerOfComment.originalAuthorPublicKey;
420
+ if (!editSignedByOriginalAuthor)
421
+ return messages.ERR_COMMENT_EDIT_CAN_NOT_EDIT_COMMENT_IF_NOT_ORIGINAL_AUTHOR;
422
+ }
423
+ else {
424
+ const editSignedByOriginalAuthor = commentEditPublication.signature.publicKey === commentToBeEdited.signature.publicKey;
425
+ if (!editSignedByOriginalAuthor)
426
+ return messages.ERR_COMMENT_EDIT_CAN_NOT_EDIT_COMMENT_IF_NOT_ORIGINAL_AUTHOR;
427
+ }
428
+ // Validate markdown content restrictions for comment edits
429
+ if (community.features?.noMarkdownImages &&
430
+ commentEditPublication.content &&
431
+ contentContainsMarkdownImages(commentEditPublication.content))
432
+ return messages.ERR_COMMENT_CONTENT_CONTAINS_MARKDOWN_IMAGE;
433
+ if (community.features?.noMarkdownVideos &&
434
+ commentEditPublication.content &&
435
+ contentContainsMarkdownVideos(commentEditPublication.content))
436
+ return messages.ERR_COMMENT_CONTENT_CONTAINS_MARKDOWN_VIDEO;
437
+ if (community.features?.noMarkdownAudio &&
438
+ commentEditPublication.content &&
439
+ contentContainsMarkdownAudio(commentEditPublication.content))
440
+ return messages.ERR_COMMENT_CONTENT_CONTAINS_MARKDOWN_AUDIO;
441
+ // noSpoilers - block ALL comment edits that set spoiler=true
442
+ if (community.features?.noSpoilers && commentEditPublication.spoiler === true)
443
+ return messages.ERR_COMMENT_HAS_SPOILER_ENABLED;
444
+ // noSpoilerReplies - block only reply edits that set spoiler=true
445
+ if (community.features?.noSpoilerReplies && commentToBeEdited.depth > 0 && commentEditPublication.spoiler === true)
446
+ return messages.ERR_REPLY_HAS_SPOILER_ENABLED;
447
+ // Post flairs validation for comment edits
448
+ if (commentEditPublication.flairs && commentEditPublication.flairs.length > 0) {
449
+ if (!community.features?.postFlairs) {
450
+ return messages.ERR_POST_FLAIRS_NOT_ALLOWED;
451
+ }
452
+ const allowedPostFlairs = community.flairs?.["post"] || [];
453
+ for (const flair of commentEditPublication.flairs) {
454
+ if (!isFlairInAllowedList(flair, allowedPostFlairs)) {
455
+ return messages.ERR_POST_FLAIR_NOT_IN_ALLOWED_FLAIRS;
456
+ }
457
+ }
458
+ }
459
+ return undefined;
460
+ }
461
+ export async function checkPublicationValidity(community, request, publication, authorCommunity) {
462
+ const log = Logger("pkc-js:local-community:handleChallengeRequest:checkPublicationValidity");
463
+ const wireResult = await checkWireFormatAndCommunityAuthor(community, publication, authorCommunity);
464
+ if (wireResult)
465
+ return wireResult;
466
+ const authorResult = await checkAuthorIdentity(community, publication, log);
467
+ if (authorResult)
468
+ return authorResult;
469
+ const parentResult = await checkParentAndPostState(community, request, publication);
470
+ if (parentResult)
471
+ return parentResult;
472
+ // Reject publications if their size is over 40kb
473
+ const publicationKilobyteSize = Buffer.byteLength(JSON.stringify(publication)) / 1000;
474
+ if (publicationKilobyteSize > 40)
475
+ return messages.ERR_REQUEST_PUBLICATION_OVER_ALLOWED_SIZE;
476
+ const commentResult = await checkCommentPublication(community, request);
477
+ if (commentResult)
478
+ return commentResult;
479
+ const voteResult = await checkVotePublication(community, request);
480
+ if (voteResult)
481
+ return voteResult;
482
+ const modResult = await checkCommentModerationPublication(community, request);
483
+ if (modResult)
484
+ return modResult;
485
+ const communityEditResult = await checkCommunityEditPublication(community, request);
486
+ if (communityEditResult)
487
+ return communityEditResult;
488
+ const commentEditResult = await checkCommentEditPublication(community, request);
489
+ if (commentEditResult)
490
+ return commentEditResult;
491
+ return undefined;
492
+ }
493
+ //# sourceMappingURL=publication-validation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"publication-validation.js","sourceRoot":"","sources":["../../../../../../src/runtime/node/community/local-community/publication-validation.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { LocalCommunity } from "../local-community.js";
2
+ export declare function listenToIncomingRequests(community: LocalCommunity): Promise<void>;
3
+ export declare function providePubsubTopicRoutingCidsIfNeeded(community: LocalCommunity, force?: boolean): Promise<void>;
@@ -0,0 +1,43 @@
1
+ import Logger from "../../../../logger.js";
2
+ import { retryKuboBlockPutPinAndProvidePubsubTopic } from "../../../../util.js";
3
+ import { pubsubTopicWithfallback } from "./comment-updates.js";
4
+ export async function listenToIncomingRequests(community) {
5
+ const log = Logger("pkc-js:local-community:sync:_listenToIncomingRequests");
6
+ // Make sure community listens to pubsub topic
7
+ // Code below is to handle in case the ipfs node restarted and the subscription got lost or something
8
+ const pubsubClient = community._clientsManager.getDefaultKuboPubsubClient();
9
+ const subscribedTopics = await pubsubClient._client.pubsub.ls();
10
+ const topic = pubsubTopicWithfallback(community);
11
+ if (!subscribedTopics.includes(topic)) {
12
+ await community._clientsManager.pubsubUnsubscribe(topic, community.handleChallengeExchange); // Make sure it's not hanging
13
+ await community._clientsManager.pubsubSubscribe(topic, community.handleChallengeExchange);
14
+ community._clientsManager.updateKuboRpcPubsubState("waiting-challenge-requests", pubsubClient.url);
15
+ log(`Waiting for publications on pubsub topic (${topic})`);
16
+ }
17
+ }
18
+ export async function providePubsubTopicRoutingCidsIfNeeded(community, force = false) {
19
+ const log = Logger("pkc-js:local-community:_providePubsubTopicRoutingCidsIfNeeded");
20
+ const reprovideIntervalMs = 6 * 60 * 60 * 1000;
21
+ const now = Date.now();
22
+ if (!force && community._lastPubsubTopicRoutingProvideAt && now - community._lastPubsubTopicRoutingProvideAt < reprovideIntervalMs)
23
+ return;
24
+ const pubsubTopic = pubsubTopicWithfallback(community);
25
+ const topics = [pubsubTopic, community.ipnsPubsubTopic].filter((topic) => typeof topic === "string");
26
+ if (topics.length === 0)
27
+ return;
28
+ community._lastPubsubTopicRoutingProvideAt = now;
29
+ const kuboRpcClient = community._clientsManager.getDefaultKuboRpcClient()._client;
30
+ for (const topic of topics) {
31
+ try {
32
+ await retryKuboBlockPutPinAndProvidePubsubTopic({
33
+ ipfsClient: kuboRpcClient,
34
+ log,
35
+ pubsubTopic: topic
36
+ });
37
+ }
38
+ catch (error) {
39
+ log.error("Failed to reprovide pubsub topic routing block", { topic, error });
40
+ }
41
+ }
42
+ }
43
+ //# sourceMappingURL=pubsub.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pubsub.js","sourceRoot":"","sources":["../../../../../../src/runtime/node/community/local-community/pubsub.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,uBAAuB,CAAC;AAC3C,OAAO,EAAE,yCAAyC,EAAE,MAAM,qBAAqB,CAAC;AAEhF,OAAO,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAC;AAE/D,MAAM,CAAC,KAAK,UAAU,wBAAwB,CAAC,SAAyB;IACpE,MAAM,GAAG,GAAG,MAAM,CAAC,uDAAuD,CAAC,CAAC;IAC5E,8CAA8C;IAC9C,qGAAqG;IACrG,MAAM,YAAY,GAAG,SAAS,CAAC,eAAe,CAAC,0BAA0B,EAAE,CAAC;IAC5E,MAAM,gBAAgB,GAAG,MAAM,YAAY,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;IAChE,MAAM,KAAK,GAAG,uBAAuB,CAAC,SAAS,CAAC,CAAC;IACjD,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QACpC,MAAM,SAAS,CAAC,eAAe,CAAC,iBAAiB,CAAC,KAAK,EAAE,SAAS,CAAC,uBAAuB,CAAC,CAAC,CAAC,6BAA6B;QAC1H,MAAM,SAAS,CAAC,eAAe,CAAC,eAAe,CAAC,KAAK,EAAE,SAAS,CAAC,uBAAuB,CAAC,CAAC;QAC1F,SAAS,CAAC,eAAe,CAAC,wBAAwB,CAAC,4BAA4B,EAAE,YAAY,CAAC,GAAG,CAAC,CAAC;QACnG,GAAG,CAAC,6CAA6C,KAAK,GAAG,CAAC,CAAC;IAC/D,CAAC;AACL,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,qCAAqC,CAAC,SAAyB,EAAE,KAAK,GAAG,KAAK;IAChG,MAAM,GAAG,GAAG,MAAM,CAAC,+DAA+D,CAAC,CAAC;IACpF,MAAM,mBAAmB,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;IAC/C,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACvB,IAAI,CAAC,KAAK,IAAI,SAAS,CAAC,gCAAgC,IAAI,GAAG,GAAG,SAAS,CAAC,gCAAgC,GAAG,mBAAmB;QAC9H,OAAO;IAEX,MAAM,WAAW,GAAG,uBAAuB,CAAC,SAAS,CAAC,CAAC;IACvD,MAAM,MAAM,GAAG,CAAC,WAAW,EAAE,SAAS,CAAC,eAAe,CAAC,CAAC,MAAM,CAAC,CAAC,KAAK,EAAmB,EAAE,CAAC,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC;IACtH,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO;IAEhC,SAAS,CAAC,gCAAgC,GAAG,GAAG,CAAC;IACjD,MAAM,aAAa,GAAG,SAAS,CAAC,eAAe,CAAC,uBAAuB,EAAE,CAAC,OAAO,CAAC;IAClF,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QACzB,IAAI,CAAC;YACD,MAAM,yCAAyC,CAAC;gBAC5C,UAAU,EAAE,aAAa;gBACzB,GAAG;gBACH,WAAW,EAAE,KAAK;aACrB,CAAC,CAAC;QACP,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACb,GAAG,CAAC,KAAK,CAAC,gDAAgD,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;QAClF,CAAC;IACL,CAAC;AACL,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { TrackedInstanceRegistry } from "../../../../pkc/tracked-instance-registry.js";
2
+ import type { LocalCommunity } from "../local-community.js";
3
+ export declare const processStartedCommunities: TrackedInstanceRegistry<LocalCommunity>;
@@ -0,0 +1,4 @@
1
+ import { TrackedInstanceRegistry } from "../../../../pkc/tracked-instance-registry.js";
2
+ // A global registry on process level to track started communities
3
+ export const processStartedCommunities = new TrackedInstanceRegistry();
4
+ //# sourceMappingURL=registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../../../../../src/runtime/node/community/local-community/registry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAAE,MAAM,8CAA8C,CAAC;AAGvF,kEAAkE;AAClE,MAAM,CAAC,MAAM,yBAAyB,GAAG,IAAI,uBAAuB,EAAkB,CAAC"}