@pkcprotocol/pkc-js 0.0.83 → 0.0.85
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 +16 -0
- package/dist/browser/clients/rpc-client/rpc-schema-util.d.ts +1 -0
- package/dist/browser/clients/rpc-client/schema.d.ts +1 -0
- package/dist/browser/community/rpc-remote-community.js +15 -8
- package/dist/browser/community/rpc-remote-community.js.map +1 -1
- package/dist/browser/community/schema.d.ts +106 -2
- package/dist/browser/community/schema.js +28 -7
- package/dist/browser/community/schema.js.map +1 -1
- package/dist/browser/errors.d.ts +9 -1
- package/dist/browser/errors.js +11 -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-with-compile-cache.d.ts +88 -2
- package/dist/browser/index.d.ts +88 -2
- package/dist/browser/pkc/pkc-with-rpc-client.d.ts +5 -3
- package/dist/browser/pkc/pkc-with-rpc-client.js +45 -7
- package/dist/browser/pkc/pkc-with-rpc-client.js.map +1 -1
- package/dist/browser/pkc/pkc.d.ts +6 -3
- package/dist/browser/pkc/pkc.js +71 -9
- 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 +1 -1
- package/dist/browser/publications/comment/schema.js +5 -1
- package/dist/browser/publications/comment/schema.js.map +1 -1
- package/dist/browser/publications/community-edit/schema.d.ts +4 -0
- package/dist/browser/publications/publication-client-manager.js +10 -2
- package/dist/browser/publications/publication-client-manager.js.map +1 -1
- package/dist/browser/publications/publication.d.ts +4 -0
- package/dist/browser/publications/publication.js +36 -2
- package/dist/browser/publications/publication.js.map +1 -1
- package/dist/browser/pubsub-messages/schema.d.ts +2 -0
- package/dist/browser/rpc/src/index.js +4 -1
- package/dist/browser/rpc/src/index.js.map +1 -1
- package/dist/browser/rpc/src/lib/pkc-js/index.d.ts +44 -1
- package/dist/browser/rpc/src/schema.d.ts +265 -7
- package/dist/browser/rpc/src/schema.js +4 -2
- package/dist/browser/rpc/src/schema.js.map +1 -1
- package/dist/browser/runtime/node/community/challenges/exclude/exclude.d.ts +2 -2
- package/dist/browser/runtime/node/community/challenges/exclude/exclude.js +5 -1
- package/dist/browser/runtime/node/community/challenges/exclude/exclude.js.map +1 -1
- package/dist/browser/runtime/node/community/challenges/index.d.ts +7 -3
- package/dist/browser/runtime/node/community/challenges/index.js +29 -6
- package/dist/browser/runtime/node/community/challenges/index.js.map +1 -1
- package/dist/browser/runtime/node/community/challenges/pkc-js-challenges/address-list-validation.d.ts +4 -0
- package/dist/browser/runtime/node/community/challenges/pkc-js-challenges/address-list-validation.js +27 -0
- package/dist/browser/runtime/node/community/challenges/pkc-js-challenges/address-list-validation.js.map +1 -0
- package/dist/browser/runtime/node/community/challenges/pkc-js-challenges/blacklist.js +2 -1
- package/dist/browser/runtime/node/community/challenges/pkc-js-challenges/blacklist.js.map +1 -1
- package/dist/browser/runtime/node/community/challenges/pkc-js-challenges/publication-match.js +34 -1
- package/dist/browser/runtime/node/community/challenges/pkc-js-challenges/publication-match.js.map +1 -1
- package/dist/browser/runtime/node/community/challenges/pkc-js-challenges/question.js +8 -1
- package/dist/browser/runtime/node/community/challenges/pkc-js-challenges/question.js.map +1 -1
- package/dist/browser/runtime/node/community/challenges/pkc-js-challenges/whitelist.js +2 -1
- package/dist/browser/runtime/node/community/challenges/pkc-js-challenges/whitelist.js.map +1 -1
- package/dist/browser/runtime/node/community/challenges/validate-challenge-settings.d.ts +22 -0
- package/dist/browser/runtime/node/community/challenges/validate-challenge-settings.js +92 -0
- package/dist/browser/runtime/node/community/challenges/validate-challenge-settings.js.map +1 -0
- package/dist/browser/runtime/node/community/db-handler.d.ts +1 -0
- package/dist/browser/runtime/node/community/local-community/db-state.js +8 -0
- package/dist/browser/runtime/node/community/local-community/db-state.js.map +1 -1
- package/dist/browser/runtime/node/community/local-community/editing.js +8 -0
- package/dist/browser/runtime/node/community/local-community/editing.js.map +1 -1
- package/dist/browser/runtime/node/community/local-community/lifecycle.js +29 -0
- package/dist/browser/runtime/node/community/local-community/lifecycle.js.map +1 -1
- package/dist/browser/schema/schema-util.d.ts +9 -0
- package/dist/browser/schema.d.ts +352 -8
- package/dist/browser/test/test-util.d.ts +2 -0
- package/dist/browser/types.d.ts +5 -0
- package/dist/browser/util.d.ts +20 -1
- package/dist/browser/util.js +100 -2
- package/dist/browser/util.js.map +1 -1
- package/dist/bundled/bundle-manifest.json +33 -31
- package/dist/bundled/chunks/{helia-for-pkc-BtjQ8rfd.js → helia-for-pkc-C5Oe_ZSx.js} +2 -2
- package/dist/bundled/chunks/{local-community-DJM47U8C.js → local-community-BqxmCg5p.js} +107 -2
- package/dist/bundled/chunks/{local-community-B_Yg8LQH.js → local-community-D4SjlAKS.js} +1 -1
- package/dist/bundled/chunks/{node-lb4SvdBh.js → node-C2DKW30L.js} +110 -22
- package/dist/bundled/chunks/{rpc-local-community-a464veDe.js → rpc-local-community-o0teUvw_.js} +91 -19
- package/dist/bundled/chunks/{schema-mdv9_FG5.js → schema-qhSDu1BU.js} +126 -10
- package/dist/bundled/chunks/{util-y9-A9BnM.js → util-BVGNNIgn.js} +1 -1
- package/dist/bundled/index.js +1 -1
- package/dist/bundled/rpc/src/index.js +5 -5
- package/dist/node/clients/rpc-client/rpc-schema-util.d.ts +1 -0
- package/dist/node/clients/rpc-client/schema.d.ts +1 -0
- package/dist/node/community/rpc-remote-community.js +15 -8
- package/dist/node/community/rpc-remote-community.js.map +1 -1
- package/dist/node/community/schema.d.ts +106 -2
- package/dist/node/community/schema.js +28 -7
- package/dist/node/community/schema.js.map +1 -1
- package/dist/node/errors.d.ts +9 -1
- package/dist/node/errors.js +11 -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-with-compile-cache.d.ts +88 -2
- package/dist/node/index.d.ts +88 -2
- package/dist/node/pkc/pkc-with-rpc-client.d.ts +5 -3
- package/dist/node/pkc/pkc-with-rpc-client.js +45 -7
- package/dist/node/pkc/pkc-with-rpc-client.js.map +1 -1
- package/dist/node/pkc/pkc.d.ts +6 -3
- package/dist/node/pkc/pkc.js +71 -9
- 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 +1 -1
- package/dist/node/publications/comment/schema.js +5 -1
- package/dist/node/publications/comment/schema.js.map +1 -1
- package/dist/node/publications/community-edit/schema.d.ts +4 -0
- package/dist/node/publications/publication-client-manager.js +10 -2
- package/dist/node/publications/publication-client-manager.js.map +1 -1
- package/dist/node/publications/publication.d.ts +4 -0
- package/dist/node/publications/publication.js +36 -2
- package/dist/node/publications/publication.js.map +1 -1
- package/dist/node/pubsub-messages/schema.d.ts +2 -0
- package/dist/node/rpc/src/index.js +4 -1
- package/dist/node/rpc/src/index.js.map +1 -1
- package/dist/node/rpc/src/lib/pkc-js/index.d.ts +44 -1
- package/dist/node/rpc/src/schema.d.ts +265 -7
- package/dist/node/rpc/src/schema.js +4 -2
- package/dist/node/rpc/src/schema.js.map +1 -1
- package/dist/node/runtime/node/community/challenges/exclude/exclude.d.ts +2 -2
- package/dist/node/runtime/node/community/challenges/exclude/exclude.js +5 -1
- package/dist/node/runtime/node/community/challenges/exclude/exclude.js.map +1 -1
- package/dist/node/runtime/node/community/challenges/index.d.ts +7 -3
- package/dist/node/runtime/node/community/challenges/index.js +29 -6
- package/dist/node/runtime/node/community/challenges/index.js.map +1 -1
- package/dist/node/runtime/node/community/challenges/pkc-js-challenges/address-list-validation.d.ts +4 -0
- package/dist/node/runtime/node/community/challenges/pkc-js-challenges/address-list-validation.js +27 -0
- package/dist/node/runtime/node/community/challenges/pkc-js-challenges/address-list-validation.js.map +1 -0
- package/dist/node/runtime/node/community/challenges/pkc-js-challenges/blacklist.js +2 -1
- package/dist/node/runtime/node/community/challenges/pkc-js-challenges/blacklist.js.map +1 -1
- package/dist/node/runtime/node/community/challenges/pkc-js-challenges/publication-match.js +34 -1
- package/dist/node/runtime/node/community/challenges/pkc-js-challenges/publication-match.js.map +1 -1
- package/dist/node/runtime/node/community/challenges/pkc-js-challenges/question.js +8 -1
- package/dist/node/runtime/node/community/challenges/pkc-js-challenges/question.js.map +1 -1
- package/dist/node/runtime/node/community/challenges/pkc-js-challenges/whitelist.js +2 -1
- package/dist/node/runtime/node/community/challenges/pkc-js-challenges/whitelist.js.map +1 -1
- package/dist/node/runtime/node/community/challenges/validate-challenge-settings.d.ts +22 -0
- package/dist/node/runtime/node/community/challenges/validate-challenge-settings.js +92 -0
- package/dist/node/runtime/node/community/challenges/validate-challenge-settings.js.map +1 -0
- package/dist/node/runtime/node/community/db-handler.d.ts +1 -0
- package/dist/node/runtime/node/community/local-community/db-state.js +8 -0
- package/dist/node/runtime/node/community/local-community/db-state.js.map +1 -1
- package/dist/node/runtime/node/community/local-community/editing.js +8 -0
- package/dist/node/runtime/node/community/local-community/editing.js.map +1 -1
- package/dist/node/runtime/node/community/local-community/lifecycle.js +29 -0
- package/dist/node/runtime/node/community/local-community/lifecycle.js.map +1 -1
- package/dist/node/schema/schema-util.d.ts +9 -0
- package/dist/node/schema.d.ts +352 -8
- package/dist/node/test/test-util.d.ts +2 -0
- package/dist/node/types.d.ts +5 -0
- package/dist/node/util.d.ts +20 -1
- package/dist/node/util.js +100 -2
- package/dist/node/util.js.map +1 -1
- package/package.json +3 -3
|
@@ -12,6 +12,7 @@ declare const _default: {
|
|
|
12
12
|
path: import("zod").ZodOptional<import("zod").ZodString>;
|
|
13
13
|
name: import("zod").ZodOptional<import("zod").ZodString>;
|
|
14
14
|
options: import("zod").ZodOptional<import("zod").ZodRecord<import("zod").ZodString, import("zod").ZodString>>;
|
|
15
|
+
publicOptions: import("zod").ZodOptional<import("zod").ZodArray<import("zod").ZodString>>;
|
|
15
16
|
exclude: import("zod").ZodOptional<import("zod").ZodArray<import("zod").ZodObject<{
|
|
16
17
|
community: import("zod").ZodOptional<import("zod").ZodObject<{
|
|
17
18
|
addresses: import("zod").ZodArray<import("zod").ZodString>;
|
|
@@ -64,6 +65,7 @@ declare const _default: {
|
|
|
64
65
|
path: import("zod").ZodOptional<import("zod").ZodString>;
|
|
65
66
|
name: import("zod").ZodOptional<import("zod").ZodString>;
|
|
66
67
|
options: import("zod").ZodOptional<import("zod").ZodRecord<import("zod").ZodString, import("zod").ZodString>>;
|
|
68
|
+
publicOptions: import("zod").ZodOptional<import("zod").ZodArray<import("zod").ZodString>>;
|
|
67
69
|
exclude: import("zod").ZodOptional<import("zod").ZodArray<import("zod").ZodObject<{
|
|
68
70
|
community: import("zod").ZodOptional<import("zod").ZodObject<{
|
|
69
71
|
addresses: import("zod").ZodArray<import("zod").ZodString>;
|
|
@@ -123,7 +125,48 @@ declare const _default: {
|
|
|
123
125
|
error: import("zod").ZodString;
|
|
124
126
|
reason: import("zod").ZodOptional<import("zod").ZodString>;
|
|
125
127
|
}, import("zod/v4/core").$strip>]>]>>>;
|
|
126
|
-
|
|
128
|
+
validateChallengeSettings: import("zod").ZodOptional<import("zod").ZodFunction<import("zod").ZodTuple<readonly [import("zod").ZodObject<{
|
|
129
|
+
challengeSettings: import("zod").ZodObject<{
|
|
130
|
+
path: import("zod").ZodOptional<import("zod").ZodString>;
|
|
131
|
+
name: import("zod").ZodOptional<import("zod").ZodString>;
|
|
132
|
+
options: import("zod").ZodOptional<import("zod").ZodRecord<import("zod").ZodString, import("zod").ZodString>>;
|
|
133
|
+
publicOptions: import("zod").ZodOptional<import("zod").ZodArray<import("zod").ZodString>>;
|
|
134
|
+
exclude: import("zod").ZodOptional<import("zod").ZodArray<import("zod").ZodObject<{
|
|
135
|
+
community: import("zod").ZodOptional<import("zod").ZodObject<{
|
|
136
|
+
addresses: import("zod").ZodArray<import("zod").ZodString>;
|
|
137
|
+
maxCommentCids: import("zod").ZodNumber;
|
|
138
|
+
postScore: import("zod").ZodOptional<import("zod").ZodNumber>;
|
|
139
|
+
replyScore: import("zod").ZodOptional<import("zod").ZodNumber>;
|
|
140
|
+
firstCommentTimestamp: import("zod").ZodOptional<import("zod").ZodNumber>;
|
|
141
|
+
}, import("zod/v4/core").$strict>>;
|
|
142
|
+
postScore: import("zod").ZodOptional<import("zod").ZodNumber>;
|
|
143
|
+
replyScore: import("zod").ZodOptional<import("zod").ZodNumber>;
|
|
144
|
+
postCount: import("zod").ZodOptional<import("zod").ZodNumber>;
|
|
145
|
+
replyCount: import("zod").ZodOptional<import("zod").ZodNumber>;
|
|
146
|
+
firstCommentTimestamp: import("zod").ZodOptional<import("zod").ZodNumber>;
|
|
147
|
+
challenges: import("zod").ZodOptional<import("zod").ZodArray<import("zod").ZodNumber>>;
|
|
148
|
+
role: import("zod").ZodOptional<import("zod").ZodArray<import("zod").ZodUnion<[import("zod").ZodEnum<{
|
|
149
|
+
owner: "owner";
|
|
150
|
+
admin: "admin";
|
|
151
|
+
moderator: "moderator";
|
|
152
|
+
}>, import("zod").ZodString]>>>;
|
|
153
|
+
address: import("zod").ZodOptional<import("zod").ZodArray<import("zod").ZodString>>;
|
|
154
|
+
rateLimit: import("zod").ZodOptional<import("zod").ZodNumber>;
|
|
155
|
+
rateLimitChallengeSuccess: import("zod").ZodOptional<import("zod").ZodBoolean>;
|
|
156
|
+
publicationType: import("zod").ZodOptional<import("zod").ZodObject<{
|
|
157
|
+
post: import("zod").ZodOptional<import("zod").ZodBoolean>;
|
|
158
|
+
reply: import("zod").ZodOptional<import("zod").ZodBoolean>;
|
|
159
|
+
vote: import("zod").ZodOptional<import("zod").ZodBoolean>;
|
|
160
|
+
commentEdit: import("zod").ZodOptional<import("zod").ZodBoolean>;
|
|
161
|
+
commentModeration: import("zod").ZodOptional<import("zod").ZodBoolean>;
|
|
162
|
+
communityEdit: import("zod").ZodOptional<import("zod").ZodBoolean>;
|
|
163
|
+
}, import("zod/v4/core").$loose>>;
|
|
164
|
+
}, import("zod/v4/core").$loose>>>;
|
|
165
|
+
description: import("zod").ZodOptional<import("zod").ZodString>;
|
|
166
|
+
pendingApproval: import("zod").ZodOptional<import("zod").ZodBoolean>;
|
|
167
|
+
}, import("zod/v4/core").$strict>;
|
|
168
|
+
}, import("zod/v4/core").$strip>], null>, import("zod").ZodVoid>>;
|
|
169
|
+
}, import("zod/v4/core").$loose>>>;
|
|
127
170
|
createAnchorIpnsRecord: typeof import("./signer/ipns-record.js").createAnchorIpnsRecord;
|
|
128
171
|
};
|
|
129
172
|
export default _default;
|
|
@@ -139,6 +182,7 @@ export declare const challenges: Record<string, import("zod/v4/core").$InferInne
|
|
|
139
182
|
path: import("zod").ZodOptional<import("zod").ZodString>;
|
|
140
183
|
name: import("zod").ZodOptional<import("zod").ZodString>;
|
|
141
184
|
options: import("zod").ZodOptional<import("zod").ZodRecord<import("zod").ZodString, import("zod").ZodString>>;
|
|
185
|
+
publicOptions: import("zod").ZodOptional<import("zod").ZodArray<import("zod").ZodString>>;
|
|
142
186
|
exclude: import("zod").ZodOptional<import("zod").ZodArray<import("zod").ZodObject<{
|
|
143
187
|
community: import("zod").ZodOptional<import("zod").ZodObject<{
|
|
144
188
|
addresses: import("zod").ZodArray<import("zod").ZodString>;
|
|
@@ -191,6 +235,7 @@ export declare const challenges: Record<string, import("zod/v4/core").$InferInne
|
|
|
191
235
|
path: import("zod").ZodOptional<import("zod").ZodString>;
|
|
192
236
|
name: import("zod").ZodOptional<import("zod").ZodString>;
|
|
193
237
|
options: import("zod").ZodOptional<import("zod").ZodRecord<import("zod").ZodString, import("zod").ZodString>>;
|
|
238
|
+
publicOptions: import("zod").ZodOptional<import("zod").ZodArray<import("zod").ZodString>>;
|
|
194
239
|
exclude: import("zod").ZodOptional<import("zod").ZodArray<import("zod").ZodObject<{
|
|
195
240
|
community: import("zod").ZodOptional<import("zod").ZodObject<{
|
|
196
241
|
addresses: import("zod").ZodArray<import("zod").ZodString>;
|
|
@@ -250,7 +295,48 @@ export declare const challenges: Record<string, import("zod/v4/core").$InferInne
|
|
|
250
295
|
error: import("zod").ZodString;
|
|
251
296
|
reason: import("zod").ZodOptional<import("zod").ZodString>;
|
|
252
297
|
}, import("zod/v4/core").$strip>]>]>>>;
|
|
253
|
-
|
|
298
|
+
validateChallengeSettings: import("zod").ZodOptional<import("zod").ZodFunction<import("zod").ZodTuple<readonly [import("zod").ZodObject<{
|
|
299
|
+
challengeSettings: import("zod").ZodObject<{
|
|
300
|
+
path: import("zod").ZodOptional<import("zod").ZodString>;
|
|
301
|
+
name: import("zod").ZodOptional<import("zod").ZodString>;
|
|
302
|
+
options: import("zod").ZodOptional<import("zod").ZodRecord<import("zod").ZodString, import("zod").ZodString>>;
|
|
303
|
+
publicOptions: import("zod").ZodOptional<import("zod").ZodArray<import("zod").ZodString>>;
|
|
304
|
+
exclude: import("zod").ZodOptional<import("zod").ZodArray<import("zod").ZodObject<{
|
|
305
|
+
community: import("zod").ZodOptional<import("zod").ZodObject<{
|
|
306
|
+
addresses: import("zod").ZodArray<import("zod").ZodString>;
|
|
307
|
+
maxCommentCids: import("zod").ZodNumber;
|
|
308
|
+
postScore: import("zod").ZodOptional<import("zod").ZodNumber>;
|
|
309
|
+
replyScore: import("zod").ZodOptional<import("zod").ZodNumber>;
|
|
310
|
+
firstCommentTimestamp: import("zod").ZodOptional<import("zod").ZodNumber>;
|
|
311
|
+
}, import("zod/v4/core").$strict>>;
|
|
312
|
+
postScore: import("zod").ZodOptional<import("zod").ZodNumber>;
|
|
313
|
+
replyScore: import("zod").ZodOptional<import("zod").ZodNumber>;
|
|
314
|
+
postCount: import("zod").ZodOptional<import("zod").ZodNumber>;
|
|
315
|
+
replyCount: import("zod").ZodOptional<import("zod").ZodNumber>;
|
|
316
|
+
firstCommentTimestamp: import("zod").ZodOptional<import("zod").ZodNumber>;
|
|
317
|
+
challenges: import("zod").ZodOptional<import("zod").ZodArray<import("zod").ZodNumber>>;
|
|
318
|
+
role: import("zod").ZodOptional<import("zod").ZodArray<import("zod").ZodUnion<[import("zod").ZodEnum<{
|
|
319
|
+
owner: "owner";
|
|
320
|
+
admin: "admin";
|
|
321
|
+
moderator: "moderator";
|
|
322
|
+
}>, import("zod").ZodString]>>>;
|
|
323
|
+
address: import("zod").ZodOptional<import("zod").ZodArray<import("zod").ZodString>>;
|
|
324
|
+
rateLimit: import("zod").ZodOptional<import("zod").ZodNumber>;
|
|
325
|
+
rateLimitChallengeSuccess: import("zod").ZodOptional<import("zod").ZodBoolean>;
|
|
326
|
+
publicationType: import("zod").ZodOptional<import("zod").ZodObject<{
|
|
327
|
+
post: import("zod").ZodOptional<import("zod").ZodBoolean>;
|
|
328
|
+
reply: import("zod").ZodOptional<import("zod").ZodBoolean>;
|
|
329
|
+
vote: import("zod").ZodOptional<import("zod").ZodBoolean>;
|
|
330
|
+
commentEdit: import("zod").ZodOptional<import("zod").ZodBoolean>;
|
|
331
|
+
commentModeration: import("zod").ZodOptional<import("zod").ZodBoolean>;
|
|
332
|
+
communityEdit: import("zod").ZodOptional<import("zod").ZodBoolean>;
|
|
333
|
+
}, import("zod/v4/core").$loose>>;
|
|
334
|
+
}, import("zod/v4/core").$loose>>>;
|
|
335
|
+
description: import("zod").ZodOptional<import("zod").ZodString>;
|
|
336
|
+
pendingApproval: import("zod").ZodOptional<import("zod").ZodBoolean>;
|
|
337
|
+
}, import("zod/v4/core").$strict>;
|
|
338
|
+
}, import("zod/v4/core").$strip>], null>, import("zod").ZodVoid>>;
|
|
339
|
+
}, import("zod/v4/core").$loose>>>;
|
|
254
340
|
export declare const createAnchorIpnsRecord: typeof import("./signer/ipns-record.js").createAnchorIpnsRecord;
|
|
255
341
|
export type { NameResolverInterface } from "./schema.js";
|
|
256
342
|
export type { NameResolver } from "./types.js";
|
package/dist/node/index.d.ts
CHANGED
|
@@ -17,6 +17,7 @@ declare const PKC: {
|
|
|
17
17
|
path: import("zod").ZodOptional<import("zod").ZodString>;
|
|
18
18
|
name: import("zod").ZodOptional<import("zod").ZodString>;
|
|
19
19
|
options: import("zod").ZodOptional<import("zod").ZodRecord<import("zod").ZodString, import("zod").ZodString>>;
|
|
20
|
+
publicOptions: import("zod").ZodOptional<import("zod").ZodArray<import("zod").ZodString>>;
|
|
20
21
|
exclude: import("zod").ZodOptional<import("zod").ZodArray<import("zod").ZodObject<{
|
|
21
22
|
community: import("zod").ZodOptional<import("zod").ZodObject<{
|
|
22
23
|
addresses: import("zod").ZodArray<import("zod").ZodString>;
|
|
@@ -69,6 +70,7 @@ declare const PKC: {
|
|
|
69
70
|
path: import("zod").ZodOptional<import("zod").ZodString>;
|
|
70
71
|
name: import("zod").ZodOptional<import("zod").ZodString>;
|
|
71
72
|
options: import("zod").ZodOptional<import("zod").ZodRecord<import("zod").ZodString, import("zod").ZodString>>;
|
|
73
|
+
publicOptions: import("zod").ZodOptional<import("zod").ZodArray<import("zod").ZodString>>;
|
|
72
74
|
exclude: import("zod").ZodOptional<import("zod").ZodArray<import("zod").ZodObject<{
|
|
73
75
|
community: import("zod").ZodOptional<import("zod").ZodObject<{
|
|
74
76
|
addresses: import("zod").ZodArray<import("zod").ZodString>;
|
|
@@ -128,7 +130,48 @@ declare const PKC: {
|
|
|
128
130
|
error: import("zod").ZodString;
|
|
129
131
|
reason: import("zod").ZodOptional<import("zod").ZodString>;
|
|
130
132
|
}, import("zod/v4/core").$strip>]>]>>>;
|
|
131
|
-
|
|
133
|
+
validateChallengeSettings: import("zod").ZodOptional<import("zod").ZodFunction<import("zod").ZodTuple<readonly [import("zod").ZodObject<{
|
|
134
|
+
challengeSettings: import("zod").ZodObject<{
|
|
135
|
+
path: import("zod").ZodOptional<import("zod").ZodString>;
|
|
136
|
+
name: import("zod").ZodOptional<import("zod").ZodString>;
|
|
137
|
+
options: import("zod").ZodOptional<import("zod").ZodRecord<import("zod").ZodString, import("zod").ZodString>>;
|
|
138
|
+
publicOptions: import("zod").ZodOptional<import("zod").ZodArray<import("zod").ZodString>>;
|
|
139
|
+
exclude: import("zod").ZodOptional<import("zod").ZodArray<import("zod").ZodObject<{
|
|
140
|
+
community: import("zod").ZodOptional<import("zod").ZodObject<{
|
|
141
|
+
addresses: import("zod").ZodArray<import("zod").ZodString>;
|
|
142
|
+
maxCommentCids: import("zod").ZodNumber;
|
|
143
|
+
postScore: import("zod").ZodOptional<import("zod").ZodNumber>;
|
|
144
|
+
replyScore: import("zod").ZodOptional<import("zod").ZodNumber>;
|
|
145
|
+
firstCommentTimestamp: import("zod").ZodOptional<import("zod").ZodNumber>;
|
|
146
|
+
}, import("zod/v4/core").$strict>>;
|
|
147
|
+
postScore: import("zod").ZodOptional<import("zod").ZodNumber>;
|
|
148
|
+
replyScore: import("zod").ZodOptional<import("zod").ZodNumber>;
|
|
149
|
+
postCount: import("zod").ZodOptional<import("zod").ZodNumber>;
|
|
150
|
+
replyCount: import("zod").ZodOptional<import("zod").ZodNumber>;
|
|
151
|
+
firstCommentTimestamp: import("zod").ZodOptional<import("zod").ZodNumber>;
|
|
152
|
+
challenges: import("zod").ZodOptional<import("zod").ZodArray<import("zod").ZodNumber>>;
|
|
153
|
+
role: import("zod").ZodOptional<import("zod").ZodArray<import("zod").ZodUnion<[import("zod").ZodEnum<{
|
|
154
|
+
owner: "owner";
|
|
155
|
+
admin: "admin";
|
|
156
|
+
moderator: "moderator";
|
|
157
|
+
}>, import("zod").ZodString]>>>;
|
|
158
|
+
address: import("zod").ZodOptional<import("zod").ZodArray<import("zod").ZodString>>;
|
|
159
|
+
rateLimit: import("zod").ZodOptional<import("zod").ZodNumber>;
|
|
160
|
+
rateLimitChallengeSuccess: import("zod").ZodOptional<import("zod").ZodBoolean>;
|
|
161
|
+
publicationType: import("zod").ZodOptional<import("zod").ZodObject<{
|
|
162
|
+
post: import("zod").ZodOptional<import("zod").ZodBoolean>;
|
|
163
|
+
reply: import("zod").ZodOptional<import("zod").ZodBoolean>;
|
|
164
|
+
vote: import("zod").ZodOptional<import("zod").ZodBoolean>;
|
|
165
|
+
commentEdit: import("zod").ZodOptional<import("zod").ZodBoolean>;
|
|
166
|
+
commentModeration: import("zod").ZodOptional<import("zod").ZodBoolean>;
|
|
167
|
+
communityEdit: import("zod").ZodOptional<import("zod").ZodBoolean>;
|
|
168
|
+
}, import("zod/v4/core").$loose>>;
|
|
169
|
+
}, import("zod/v4/core").$loose>>>;
|
|
170
|
+
description: import("zod").ZodOptional<import("zod").ZodString>;
|
|
171
|
+
pendingApproval: import("zod").ZodOptional<import("zod").ZodBoolean>;
|
|
172
|
+
}, import("zod/v4/core").$strict>;
|
|
173
|
+
}, import("zod/v4/core").$strip>], null>, import("zod").ZodVoid>>;
|
|
174
|
+
}, import("zod/v4/core").$loose>>>;
|
|
132
175
|
createAnchorIpnsRecord: typeof signerCreateAnchorIpnsRecord;
|
|
133
176
|
};
|
|
134
177
|
export default PKC;
|
|
@@ -144,6 +187,7 @@ export declare const challenges: Record<string, import("zod/v4/core").$InferInne
|
|
|
144
187
|
path: import("zod").ZodOptional<import("zod").ZodString>;
|
|
145
188
|
name: import("zod").ZodOptional<import("zod").ZodString>;
|
|
146
189
|
options: import("zod").ZodOptional<import("zod").ZodRecord<import("zod").ZodString, import("zod").ZodString>>;
|
|
190
|
+
publicOptions: import("zod").ZodOptional<import("zod").ZodArray<import("zod").ZodString>>;
|
|
147
191
|
exclude: import("zod").ZodOptional<import("zod").ZodArray<import("zod").ZodObject<{
|
|
148
192
|
community: import("zod").ZodOptional<import("zod").ZodObject<{
|
|
149
193
|
addresses: import("zod").ZodArray<import("zod").ZodString>;
|
|
@@ -196,6 +240,7 @@ export declare const challenges: Record<string, import("zod/v4/core").$InferInne
|
|
|
196
240
|
path: import("zod").ZodOptional<import("zod").ZodString>;
|
|
197
241
|
name: import("zod").ZodOptional<import("zod").ZodString>;
|
|
198
242
|
options: import("zod").ZodOptional<import("zod").ZodRecord<import("zod").ZodString, import("zod").ZodString>>;
|
|
243
|
+
publicOptions: import("zod").ZodOptional<import("zod").ZodArray<import("zod").ZodString>>;
|
|
199
244
|
exclude: import("zod").ZodOptional<import("zod").ZodArray<import("zod").ZodObject<{
|
|
200
245
|
community: import("zod").ZodOptional<import("zod").ZodObject<{
|
|
201
246
|
addresses: import("zod").ZodArray<import("zod").ZodString>;
|
|
@@ -255,7 +300,48 @@ export declare const challenges: Record<string, import("zod/v4/core").$InferInne
|
|
|
255
300
|
error: import("zod").ZodString;
|
|
256
301
|
reason: import("zod").ZodOptional<import("zod").ZodString>;
|
|
257
302
|
}, import("zod/v4/core").$strip>]>]>>>;
|
|
258
|
-
|
|
303
|
+
validateChallengeSettings: import("zod").ZodOptional<import("zod").ZodFunction<import("zod").ZodTuple<readonly [import("zod").ZodObject<{
|
|
304
|
+
challengeSettings: import("zod").ZodObject<{
|
|
305
|
+
path: import("zod").ZodOptional<import("zod").ZodString>;
|
|
306
|
+
name: import("zod").ZodOptional<import("zod").ZodString>;
|
|
307
|
+
options: import("zod").ZodOptional<import("zod").ZodRecord<import("zod").ZodString, import("zod").ZodString>>;
|
|
308
|
+
publicOptions: import("zod").ZodOptional<import("zod").ZodArray<import("zod").ZodString>>;
|
|
309
|
+
exclude: import("zod").ZodOptional<import("zod").ZodArray<import("zod").ZodObject<{
|
|
310
|
+
community: import("zod").ZodOptional<import("zod").ZodObject<{
|
|
311
|
+
addresses: import("zod").ZodArray<import("zod").ZodString>;
|
|
312
|
+
maxCommentCids: import("zod").ZodNumber;
|
|
313
|
+
postScore: import("zod").ZodOptional<import("zod").ZodNumber>;
|
|
314
|
+
replyScore: import("zod").ZodOptional<import("zod").ZodNumber>;
|
|
315
|
+
firstCommentTimestamp: import("zod").ZodOptional<import("zod").ZodNumber>;
|
|
316
|
+
}, import("zod/v4/core").$strict>>;
|
|
317
|
+
postScore: import("zod").ZodOptional<import("zod").ZodNumber>;
|
|
318
|
+
replyScore: import("zod").ZodOptional<import("zod").ZodNumber>;
|
|
319
|
+
postCount: import("zod").ZodOptional<import("zod").ZodNumber>;
|
|
320
|
+
replyCount: import("zod").ZodOptional<import("zod").ZodNumber>;
|
|
321
|
+
firstCommentTimestamp: import("zod").ZodOptional<import("zod").ZodNumber>;
|
|
322
|
+
challenges: import("zod").ZodOptional<import("zod").ZodArray<import("zod").ZodNumber>>;
|
|
323
|
+
role: import("zod").ZodOptional<import("zod").ZodArray<import("zod").ZodUnion<[import("zod").ZodEnum<{
|
|
324
|
+
owner: "owner";
|
|
325
|
+
admin: "admin";
|
|
326
|
+
moderator: "moderator";
|
|
327
|
+
}>, import("zod").ZodString]>>>;
|
|
328
|
+
address: import("zod").ZodOptional<import("zod").ZodArray<import("zod").ZodString>>;
|
|
329
|
+
rateLimit: import("zod").ZodOptional<import("zod").ZodNumber>;
|
|
330
|
+
rateLimitChallengeSuccess: import("zod").ZodOptional<import("zod").ZodBoolean>;
|
|
331
|
+
publicationType: import("zod").ZodOptional<import("zod").ZodObject<{
|
|
332
|
+
post: import("zod").ZodOptional<import("zod").ZodBoolean>;
|
|
333
|
+
reply: import("zod").ZodOptional<import("zod").ZodBoolean>;
|
|
334
|
+
vote: import("zod").ZodOptional<import("zod").ZodBoolean>;
|
|
335
|
+
commentEdit: import("zod").ZodOptional<import("zod").ZodBoolean>;
|
|
336
|
+
commentModeration: import("zod").ZodOptional<import("zod").ZodBoolean>;
|
|
337
|
+
communityEdit: import("zod").ZodOptional<import("zod").ZodBoolean>;
|
|
338
|
+
}, import("zod/v4/core").$loose>>;
|
|
339
|
+
}, import("zod/v4/core").$loose>>>;
|
|
340
|
+
description: import("zod").ZodOptional<import("zod").ZodString>;
|
|
341
|
+
pendingApproval: import("zod").ZodOptional<import("zod").ZodBoolean>;
|
|
342
|
+
}, import("zod/v4/core").$strict>;
|
|
343
|
+
}, import("zod/v4/core").$strip>], null>, import("zod").ZodVoid>>;
|
|
344
|
+
}, import("zod/v4/core").$loose>>>;
|
|
259
345
|
export declare const createAnchorIpnsRecord: typeof signerCreateAnchorIpnsRecord;
|
|
260
346
|
export type { NameResolverInterface } from "./schema.js";
|
|
261
347
|
export type { NameResolver } from "./types.js";
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { PKC } from "./pkc.js";
|
|
2
|
-
import type { InputPKCOptions, GetCommunityArgs } from "../types.js";
|
|
2
|
+
import type { InputPKCOptions, GetCommunityArgs, GetCommentArgs } from "../types.js";
|
|
3
3
|
import { CreateRpcCommunityFunctionArgumentSchema } from "../community/schema.js";
|
|
4
4
|
import { RpcLocalCommunity } from "../community/rpc-local-community.js";
|
|
5
5
|
import { RpcRemoteCommunity } from "../community/rpc-remote-community.js";
|
|
@@ -18,7 +18,9 @@ export declare class PKCWithRpcClient extends PKC {
|
|
|
18
18
|
resolvedAuthorName: string | null;
|
|
19
19
|
}>;
|
|
20
20
|
destroy(): Promise<void>;
|
|
21
|
-
getComment(
|
|
21
|
+
getComment(getCommentArgs: GetCommentArgs): Promise<import("../publications/comment/comment.js").Comment>;
|
|
22
22
|
getCommunity(getCommunityArgs: GetCommunityArgs): Promise<import("../community/remote-community.js").RemoteCommunity>;
|
|
23
|
-
createCommunity(options?: z.infer<typeof CreateRpcCommunityFunctionArgumentSchema> | RpcRemoteCommunityJson | RpcLocalCommunityJson
|
|
23
|
+
createCommunity(options?: z.infer<typeof CreateRpcCommunityFunctionArgumentSchema> | RpcRemoteCommunityJson | RpcLocalCommunityJson, opts?: {
|
|
24
|
+
abortSignal?: AbortSignal;
|
|
25
|
+
}): Promise<RpcLocalCommunity | RpcRemoteCommunity>;
|
|
24
26
|
}
|
|
@@ -3,6 +3,8 @@ import { PKC } from "./pkc.js";
|
|
|
3
3
|
import { parseCreateRpcCommunityFunctionArgumentSchemaWithPKCErrorIfItFails } from "../schema/schema-util.js";
|
|
4
4
|
import { RpcLocalCommunity } from "../community/rpc-local-community.js";
|
|
5
5
|
import { RpcRemoteCommunity } from "../community/rpc-remote-community.js";
|
|
6
|
+
import { PKCError } from "../pkc-error.js";
|
|
7
|
+
import { rejectWhenAbortSignalFires, rejectWhenCommunityStopsOrAborts, throwIfAbortSignalAborted } from "../util.js";
|
|
6
8
|
import { parseRpcAuthorNameParam, parseRpcCidParam, parseRpcFetchCidParam } from "../clients/rpc-client/rpc-schema-util.js";
|
|
7
9
|
import { listStartedCommunities } from "./tracked-instance-registry-util.js";
|
|
8
10
|
// This is a helper class for separating RPC-client logic from main PKC
|
|
@@ -47,9 +49,23 @@ export class PKCWithRpcClient extends PKC {
|
|
|
47
49
|
await super.destroy();
|
|
48
50
|
await this._pkcRpcClient.destroy();
|
|
49
51
|
}
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
52
|
+
// The RPC call below has no cancellation of its own, so an aborting caller (and pkc.destroy(),
|
|
53
|
+
// which cannot reach into this function) would be left waiting on it. Racing the combined signal
|
|
54
|
+
// gives them a way out, matching the direct path in PKC.getComment (issue #278).
|
|
55
|
+
async getComment(getCommentArgs) {
|
|
56
|
+
const { abortSignal, ...cidArgs } = getCommentArgs;
|
|
57
|
+
const parsedArgs = parseRpcCidParam(cidArgs);
|
|
58
|
+
const cancellation = rejectWhenAbortSignalFires({
|
|
59
|
+
abortSignal: this._combineWithDestroyAbortSignal(abortSignal),
|
|
60
|
+
error: () => new PKCError("ERR_GET_COMMENT_ABORTED", { getCommentArgs: parsedArgs, abortReason: abortSignal?.reason })
|
|
61
|
+
});
|
|
62
|
+
let commentIpfs;
|
|
63
|
+
try {
|
|
64
|
+
commentIpfs = await Promise.race([this._pkcRpcClient.getComment(parsedArgs), cancellation.promise]);
|
|
65
|
+
}
|
|
66
|
+
finally {
|
|
67
|
+
cancellation.cleanup();
|
|
68
|
+
}
|
|
53
69
|
return this.createComment({ ...parsedArgs, raw: { ...parsedArgs?.raw, comment: commentIpfs } });
|
|
54
70
|
}
|
|
55
71
|
async getCommunity(getCommunityArgs) {
|
|
@@ -58,8 +74,9 @@ export class PKCWithRpcClient extends PKC {
|
|
|
58
74
|
}
|
|
59
75
|
return super.getCommunity(getCommunityArgs);
|
|
60
76
|
}
|
|
61
|
-
async createCommunity(options = {}) {
|
|
77
|
+
async createCommunity(options = {}, opts) {
|
|
62
78
|
const log = Logger("pkc-js:pkc-with-rpc-client:createCommunity");
|
|
79
|
+
throwIfAbortSignalAborted(opts?.abortSignal);
|
|
63
80
|
// No need to parse if it's a jsonified instance
|
|
64
81
|
const parsedRpcOptions = "clients" in options ? options : parseCreateRpcCommunityFunctionArgumentSchemaWithPKCErrorIfItFails(options);
|
|
65
82
|
log.trace("Received community options to create a community instance over RPC:", options);
|
|
@@ -97,9 +114,30 @@ export class PKCWithRpcClient extends PKC {
|
|
|
97
114
|
const updatePromise = new Promise((resolve) => community.once("update", resolve));
|
|
98
115
|
let error;
|
|
99
116
|
const errorPromise = new Promise((resolve) => community.once("error", (err) => resolve((error = err))));
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
117
|
+
// Every wait below is unbounded: the subscribe call may never be answered, and the
|
|
118
|
+
// server may never push an update for a community it hosts. Without something to
|
|
119
|
+
// lose to, an aborting caller (and pkc.destroy(), which cannot reach into this
|
|
120
|
+
// function) is left with a promise that never settles — issue #277. The instance is
|
|
121
|
+
// tracked in _updatingCommunities before the first wait, so a third-party stop()
|
|
122
|
+
// reaches it too, and that is the second way out.
|
|
123
|
+
const cancellation = rejectWhenCommunityStopsOrAborts({
|
|
124
|
+
community,
|
|
125
|
+
abortSignal: this._combineWithDestroyAbortSignal(opts?.abortSignal)
|
|
126
|
+
});
|
|
127
|
+
try {
|
|
128
|
+
await Promise.race([community._createAndSubscribeToNewUpdatingCommunity(community), cancellation.promise]);
|
|
129
|
+
await Promise.race([community.update(), cancellation.promise]);
|
|
130
|
+
await Promise.race([updatePromise, errorPromise, cancellation.promise]);
|
|
131
|
+
}
|
|
132
|
+
catch (e) {
|
|
133
|
+
// stop() is a no-op on an instance that is already stopped, which is exactly the
|
|
134
|
+
// case when we lost to a stop rather than to an abort.
|
|
135
|
+
await community.stop().catch((stopErr) => log.error("Failed to stop a cancelled community instance", stopErr));
|
|
136
|
+
throw e;
|
|
137
|
+
}
|
|
138
|
+
finally {
|
|
139
|
+
cancellation.cleanup();
|
|
140
|
+
}
|
|
103
141
|
await community.stop();
|
|
104
142
|
if (error)
|
|
105
143
|
throw error;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pkc-with-rpc-client.js","sourceRoot":"","sources":["../../../src/pkc/pkc-with-rpc-client.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,cAAc,CAAC;AAClC,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AAE/B,OAAO,EAAE,kEAAkE,EAAE,MAAM,0BAA0B,CAAC;AAE9G,OAAO,EAAE,iBAAiB,EAAE,MAAM,qCAAqC,CAAC;AACxE,OAAO,EAAE,kBAAkB,EAAE,MAAM,sCAAsC,CAAC;
|
|
1
|
+
{"version":3,"file":"pkc-with-rpc-client.js","sourceRoot":"","sources":["../../../src/pkc/pkc-with-rpc-client.ts"],"names":[],"mappings":"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"}
|
package/dist/node/pkc/pkc.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { StorageInterface, GatewayClient, KuboRpcClient, PKCEvents, PubsubClient, ParsedPKCOptions, LRUStorageInterface, LRUStorageConstructor, InputPKCOptions, PKCMemCaches, GetCommunityArgs } from "../types.js";
|
|
1
|
+
import type { StorageInterface, GatewayClient, KuboRpcClient, PKCEvents, PubsubClient, ParsedPKCOptions, LRUStorageInterface, LRUStorageConstructor, InputPKCOptions, PKCMemCaches, GetCommunityArgs, GetCommentArgs } from "../types.js";
|
|
2
2
|
import { Comment } from "../publications/comment/comment.js";
|
|
3
3
|
import Vote from "../publications/vote/vote.js";
|
|
4
4
|
import { CommentEdit } from "../publications/comment-edit/comment-edit.js";
|
|
@@ -102,7 +102,7 @@ export declare class PKC extends PKCTypedEmitter<PKCEvents> implements ParsedPKC
|
|
|
102
102
|
_waitForHttpRoutersSetupToSettle(): Promise<void>;
|
|
103
103
|
_init(): Promise<void>;
|
|
104
104
|
getCommunity(getCommunityArgs: GetCommunityArgs): Promise<RemoteCommunity>;
|
|
105
|
-
getComment(
|
|
105
|
+
getComment(getCommentArgs: GetCommentArgs): Promise<Comment>;
|
|
106
106
|
private _initMissingFieldsOfPublicationBeforeSigning;
|
|
107
107
|
private _createCommentInstanceFromAnotherCommentInstance;
|
|
108
108
|
createComment(options: CommentIpfsType | CommentPubsubMessagePublication | {
|
|
@@ -119,7 +119,9 @@ export declare class PKC extends PKCTypedEmitter<PKCEvents> implements ParsedPKC
|
|
|
119
119
|
private _createRemoteCommunityInstance;
|
|
120
120
|
private _createLocalCommunity;
|
|
121
121
|
private _createCommunityInstanceFromJsonifiedCommunity;
|
|
122
|
-
createCommunity(options?: z.infer<typeof CreateCommunityFunctionArgumentsSchema> | CommunityJson
|
|
122
|
+
createCommunity(options?: z.infer<typeof CreateCommunityFunctionArgumentsSchema> | CommunityJson, opts?: {
|
|
123
|
+
abortSignal?: AbortSignal;
|
|
124
|
+
}): Promise<RemoteCommunity | RpcRemoteCommunity | RpcLocalCommunity | LocalCommunity>;
|
|
123
125
|
_createVoteInstanceFromJsonfiedVote(jsonfied: VoteJson): Promise<Vote>;
|
|
124
126
|
createVote(options: CreateVoteOptions | VotePubsubMessagePublication | VoteJson): Promise<Vote>;
|
|
125
127
|
_createCommentEditInstanceFromJsonfiedCommentEdit(jsonfied: CommentEditTypeJson): Promise<CommentEdit>;
|
|
@@ -140,5 +142,6 @@ export declare class PKC extends PKCTypedEmitter<PKCEvents> implements ParsedPKC
|
|
|
140
142
|
}): Promise<void>;
|
|
141
143
|
_createStorageLRU(opts: Omit<LRUStorageConstructor, "pkc">): Promise<LRUStorageInterface>;
|
|
142
144
|
_getDestroyAbortSignal(): AbortSignal;
|
|
145
|
+
_combineWithDestroyAbortSignal(abortSignal?: AbortSignal): AbortSignal;
|
|
143
146
|
destroy(): Promise<void>;
|
|
144
147
|
}
|
package/dist/node/pkc/pkc.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { getDefaultDataPath, listCommunitiesSync as nodeListCommunities, createKuboRpcClient, monitorCommunitiesDirectory, tryToDeleteCommunitiesThatFailedToBeDeletedBefore } from "../runtime/node/util.js";
|
|
2
2
|
import { Comment } from "../publications/comment/comment.js";
|
|
3
|
-
import { waitForUpdateInCommunityInstanceWithErrorAndTimeout, areEquivalentCommunityAddresses, deepMergeRuntimeFields, doesDomainAddressHaveCapitalLetter, hideClassPrivateProps, isStringDomain, removeUndefinedValuesRecursively, timestamp, resolveWhenPredicateIsTrue } from "../util.js";
|
|
3
|
+
import { waitForUpdateInCommunityInstanceWithErrorAndTimeout, areEquivalentCommunityAddresses, deepMergeRuntimeFields, doesDomainAddressHaveCapitalLetter, hideClassPrivateProps, isStringDomain, removeUndefinedValuesRecursively, timestamp, resolveWhenPredicateIsTrue, throwIfAbortSignalAborted } from "../util.js";
|
|
4
4
|
import Vote from "../publications/vote/vote.js";
|
|
5
5
|
import { createSigner } from "../signer/index.js";
|
|
6
6
|
import { CommentEdit } from "../publications/comment-edit/comment-edit.js";
|
|
@@ -277,28 +277,67 @@ export class PKC extends PKCTypedEmitter {
|
|
|
277
277
|
this._clientsManager = new PKCClientsManager(this);
|
|
278
278
|
hideClassPrivateProps(this);
|
|
279
279
|
}
|
|
280
|
+
// `abortSignal` unwinds the IPNS wait below immediately instead of blocking for
|
|
281
|
+
// `_timeouts["community-ipns"]`, and rejects with ERR_GET_COMMUNITY_ABORTED (issue #275). It has
|
|
282
|
+
// to be split off before the rest reaches createCommunity(), whose schemas are `.strict()`.
|
|
280
283
|
async getCommunity(getCommunityArgs) {
|
|
281
|
-
|
|
284
|
+
const { abortSignal, ...communityIdentifier } = getCommunityArgs;
|
|
285
|
+
if (!communityIdentifier.address && !communityIdentifier.name && !communityIdentifier.publicKey) {
|
|
282
286
|
throw new Error("At least one of address, name, or publicKey must be provided");
|
|
283
287
|
}
|
|
284
|
-
|
|
288
|
+
// Same code as an abort mid-fetch, so callers have one thing to check regardless of when the
|
|
289
|
+
// signal fired, and we skip creating an instance we would only stop again.
|
|
290
|
+
if (abortSignal?.aborted)
|
|
291
|
+
throw new PKCError("ERR_GET_COMMUNITY_ABORTED", { communityIdentifier, abortReason: abortSignal.reason });
|
|
292
|
+
const community = await this.createCommunity(communityIdentifier, { abortSignal });
|
|
285
293
|
if (typeof community.createdAt === "number")
|
|
286
294
|
return community; // It's a local community, and already has been loaded, no need to wait
|
|
287
295
|
const timeoutMs = this._timeouts["community-ipns"];
|
|
288
|
-
await waitForUpdateInCommunityInstanceWithErrorAndTimeout(community, timeoutMs);
|
|
296
|
+
await waitForUpdateInCommunityInstanceWithErrorAndTimeout({ community, timeoutMs, abortSignal });
|
|
289
297
|
return community;
|
|
290
298
|
}
|
|
291
|
-
|
|
299
|
+
// `abortSignal` unwinds the CommentIpfs wait below immediately instead of blocking for
|
|
300
|
+
// `_timeouts["comment-ipfs"]`, and rejects with ERR_GET_COMMENT_ABORTED (issue #278). It has to
|
|
301
|
+
// be split off before the rest reaches createComment(), which would otherwise carry the signal
|
|
302
|
+
// onto the instance — the same reason `abortSignal` is a reserved comment field.
|
|
303
|
+
async getComment(getCommentArgs) {
|
|
292
304
|
const log = Logger("pkc-js:pkc:getComment");
|
|
293
|
-
const
|
|
305
|
+
const { abortSignal, ...cidArgs } = getCommentArgs;
|
|
306
|
+
const parsedGetCommentArgs = parseRpcCidParam(cidArgs);
|
|
307
|
+
// Same code as an abort mid-fetch, so callers have one thing to check regardless of when the
|
|
308
|
+
// signal fired, and we skip creating an instance we would only stop again.
|
|
309
|
+
if (abortSignal?.aborted)
|
|
310
|
+
throw new PKCError("ERR_GET_COMMENT_ABORTED", { getCommentArgs: parsedGetCommentArgs, abortReason: abortSignal.reason });
|
|
294
311
|
// getComment is interested in loading CommentIpfs only
|
|
295
312
|
const comment = await this.createComment(parsedGetCommentArgs);
|
|
296
313
|
let lastUpdateError;
|
|
297
314
|
const errorListener = (err) => (lastUpdateError = err);
|
|
298
315
|
comment.on("error", errorListener);
|
|
316
|
+
// Rejects the race below on abort. Reported as ERR_GET_COMMENT_ABORTED rather than as the
|
|
317
|
+
// timeout, so callers can tell a slow network from a cancellation.
|
|
318
|
+
let abortError;
|
|
319
|
+
let abortReject;
|
|
320
|
+
const abortListener = () => {
|
|
321
|
+
abortError = new PKCError("ERR_GET_COMMENT_ABORTED", {
|
|
322
|
+
getCommentArgs: parsedGetCommentArgs,
|
|
323
|
+
abortReason: abortSignal?.reason,
|
|
324
|
+
lastUpdateError
|
|
325
|
+
});
|
|
326
|
+
abortReject?.(abortError);
|
|
327
|
+
};
|
|
328
|
+
const abortPromise = new Promise((_, reject) => {
|
|
329
|
+
abortReject = reject;
|
|
330
|
+
});
|
|
331
|
+
// pTimeout attaches its own handler, but only once we hand it the race below. Give it one up
|
|
332
|
+
// front so an abort landing before that never surfaces as an unhandled rejection.
|
|
333
|
+
void abortPromise.catch(() => { });
|
|
334
|
+
// The signal outlives this call (a caller's long-lived stop signal), so the listener is
|
|
335
|
+
// removed in the `finally` on every outcome. `{ once: true }` alone only detaches it when
|
|
336
|
+
// abort fires, which leaks one listener per call (issues #145, #146).
|
|
337
|
+
abortSignal?.addEventListener("abort", abortListener);
|
|
299
338
|
const commentTimeout = this._timeouts["comment-ipfs"];
|
|
300
339
|
try {
|
|
301
|
-
await pTimeout(comment._attemptInfintelyToLoadCommentIpfs(), {
|
|
340
|
+
await pTimeout(Promise.race([comment._attemptInfintelyToLoadCommentIpfs(), abortPromise]), {
|
|
302
341
|
milliseconds: commentTimeout,
|
|
303
342
|
message: lastUpdateError ||
|
|
304
343
|
new TimeoutError(`pkc.getComment({cid: ${parsedGetCommentArgs}}) timed out after ${commentTimeout}ms`)
|
|
@@ -308,11 +347,16 @@ export class PKC extends PKCTypedEmitter {
|
|
|
308
347
|
return comment;
|
|
309
348
|
}
|
|
310
349
|
catch (e) {
|
|
350
|
+
// Abort wins over whatever else the comment happened to emit: the caller cancelled on
|
|
351
|
+
// purpose, so reporting a stale retriable error instead would be misleading.
|
|
352
|
+
if (abortError)
|
|
353
|
+
throw abortError;
|
|
311
354
|
if (lastUpdateError)
|
|
312
355
|
throw lastUpdateError;
|
|
313
356
|
throw e;
|
|
314
357
|
}
|
|
315
358
|
finally {
|
|
359
|
+
abortSignal?.removeEventListener("abort", abortListener);
|
|
316
360
|
comment.removeListener("error", errorListener);
|
|
317
361
|
await comment.stop();
|
|
318
362
|
}
|
|
@@ -589,8 +633,13 @@ export class PKC extends PKCTypedEmitter {
|
|
|
589
633
|
else
|
|
590
634
|
return this._createRemoteCommunityInstance(jsonfied);
|
|
591
635
|
}
|
|
592
|
-
|
|
636
|
+
// `opts.abortSignal` is a second parameter rather than a key on `options`, because `options` is
|
|
637
|
+
// zod-parsed by `.strict()` schemas that would reject the extra key. It only has teeth on the
|
|
638
|
+
// RPC path, whose local-community branch parks on waits with no timeout (issue #277); here it
|
|
639
|
+
// just refuses to start work the caller has already given up on.
|
|
640
|
+
async createCommunity(options = {}, opts) {
|
|
593
641
|
const log = Logger("pkc-js:pkc:createCommunity");
|
|
642
|
+
throwIfAbortSignalAborted(opts?.abortSignal);
|
|
594
643
|
if ("clients" in options)
|
|
595
644
|
return this._createCommunityInstanceFromJsonifiedCommunity(options);
|
|
596
645
|
const parsedOptions = options;
|
|
@@ -937,10 +986,23 @@ export class PKC extends PKCTypedEmitter {
|
|
|
937
986
|
return this._storageLRUs[opts.cacheName];
|
|
938
987
|
}
|
|
939
988
|
_getDestroyAbortSignal() {
|
|
940
|
-
if (!this._destroyAbortController)
|
|
989
|
+
if (!this._destroyAbortController) {
|
|
941
990
|
this._destroyAbortController = new AbortController();
|
|
991
|
+
// destroy() aborts with `?.`, so nothing happens there if no caller had asked for the
|
|
992
|
+
// signal yet. Without this, the first caller to ask afterwards is handed a live signal
|
|
993
|
+
// for a pkc that is already torn down, and waits on it forever (issue #277).
|
|
994
|
+
if (this.destroyed)
|
|
995
|
+
this._destroyAbortController.abort(new PKCError("ERR_PKC_IS_DESTROYED"));
|
|
996
|
+
}
|
|
942
997
|
return this._destroyAbortController.signal;
|
|
943
998
|
}
|
|
999
|
+
// Folds teardown into a caller's signal, so work nobody explicitly cancelled still stops when the
|
|
1000
|
+
// pkc is destroyed. Returns the destroy signal untouched when there is nothing to combine, which
|
|
1001
|
+
// keeps AbortSignal.any() (and the listener it registers on both sources) off the common path.
|
|
1002
|
+
_combineWithDestroyAbortSignal(abortSignal) {
|
|
1003
|
+
const destroySignal = this._getDestroyAbortSignal();
|
|
1004
|
+
return abortSignal ? AbortSignal.any([abortSignal, destroySignal]) : destroySignal;
|
|
1005
|
+
}
|
|
944
1006
|
async destroy() {
|
|
945
1007
|
const log = Logger("pkc-js:pkc:destroy");
|
|
946
1008
|
if (this.destroyed)
|